diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2024-02-14 06:05:01 +0100 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2024-02-25 11:22:10 +0100 |
| commit | 2fdc9e6ae8b6f1ec86050011e1170d639d8c9c2c (patch) | |
| tree | 29ae1289a64ff0568e06da19a4ecaff1dad562ba /src/codegen.zig | |
| parent | defef3f1a15be3b8f4e2074d581d43deb8296349 (diff) | |
| download | zig-2fdc9e6ae8b6f1ec86050011e1170d639d8c9c2c.tar.gz zig-2fdc9e6ae8b6f1ec86050011e1170d639d8c9c2c.zip | |
x86_64: implement `@shuffle`
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 57 |
1 files changed, 27 insertions, 30 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 118bab4be9..7bcba80065 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -405,7 +405,7 @@ pub fn generateSymbol( .vector_type => |vector_type| { const abi_size = math.cast(usize, typed_value.ty.abiSize(mod)) orelse return error.Overflow; - if (Type.fromInterned(vector_type.child).bitSize(mod) == 1) { + if (vector_type.child == .bool_type) { const bytes = try code.addManyAsSlice(abi_size); @memset(bytes, 0xaa); var index: usize = 0; @@ -443,37 +443,34 @@ pub fn generateSymbol( }, }) byte.* |= mask else byte.* &= ~mask; } - } else switch (aggregate.storage) { - .bytes => |bytes| try code.appendSlice(bytes), - .elems, .repeated_elem => { - var index: u64 = 0; - while (index < vector_type.len) : (index += 1) { - switch (try generateSymbol(bin_file, src_loc, .{ - .ty = Type.fromInterned(vector_type.child), - .val = Value.fromInterned(switch (aggregate.storage) { - .bytes => unreachable, - .elems => |elems| elems[ - math.cast(usize, index) orelse return error.Overflow - ], - .repeated_elem => |elem| elem, - }), - }, code, debug_output, reloc_info)) { - .ok => {}, - .fail => |em| return .{ .fail = em }, + } else { + switch (aggregate.storage) { + .bytes => |bytes| try code.appendSlice(bytes), + .elems, .repeated_elem => { + var index: u64 = 0; + while (index < vector_type.len) : (index += 1) { + switch (try generateSymbol(bin_file, src_loc, .{ + .ty = Type.fromInterned(vector_type.child), + .val = Value.fromInterned(switch (aggregate.storage) { + .bytes => unreachable, + .elems => |elems| elems[ + math.cast(usize, index) orelse return error.Overflow + ], + .repeated_elem => |elem| elem, + }), + }, code, debug_output, reloc_info)) { + .ok => {}, + .fail => |em| return .{ .fail = em }, + } } - } - }, - } + }, + } - const padding = abi_size - (math.cast(usize, math.divCeil( - u64, - Type.fromInterned(vector_type.child).bitSize(mod) * vector_type.len, - 8, - ) catch |err| switch (err) { - error.DivisionByZero => unreachable, - else => |e| return e, - }) orelse return error.Overflow); - if (padding > 0) try code.appendNTimes(0, padding); + const padding = abi_size - + (math.cast(usize, Type.fromInterned(vector_type.child).abiSize(mod) * vector_type.len) orelse + return error.Overflow); + if (padding > 0) try code.appendNTimes(0, padding); + } }, .anon_struct_type => |tuple| { const struct_begin = code.items.len; |
