aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2024-02-14 06:05:01 +0100
committerJacob Young <jacobly0@users.noreply.github.com>2024-02-25 11:22:10 +0100
commit2fdc9e6ae8b6f1ec86050011e1170d639d8c9c2c (patch)
tree29ae1289a64ff0568e06da19a4ecaff1dad562ba /src/codegen.zig
parentdefef3f1a15be3b8f4e2074d581d43deb8296349 (diff)
downloadzig-2fdc9e6ae8b6f1ec86050011e1170d639d8c9c2c.tar.gz
zig-2fdc9e6ae8b6f1ec86050011e1170d639d8c9c2c.zip
x86_64: implement `@shuffle`
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig57
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;