diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-12-13 14:11:22 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-12-13 14:11:22 -0500 |
| commit | 2e66b3be6ea6a5be758f8bc855807b4af1020ec8 (patch) | |
| tree | 01b67ba0e122b53cfbb66d864355303b3722fe31 /src/codegen.zig | |
| parent | 3318611618665e6d09ddad866efdabf54eb498ce (diff) | |
| parent | 37561a920b6dad1231f0b9e5a69eb0978af6f5d0 (diff) | |
| download | zig-2e66b3be6ea6a5be758f8bc855807b4af1020ec8.tar.gz zig-2e66b3be6ea6a5be758f8bc855807b4af1020ec8.zip | |
Merge pull request #13910 from Luukdegram/wasm-simd
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 985fa8d6c5..bc50f36041 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -808,6 +808,54 @@ pub fn generateSymbol( } return Result{ .appended = {} }; }, + .Vector => switch (typed_value.val.tag()) { + .bytes => { + const bytes = typed_value.val.castTag(.bytes).?.data; + const len = @intCast(usize, typed_value.ty.arrayLen()); + try code.ensureUnusedCapacity(len); + code.appendSliceAssumeCapacity(bytes[0..len]); + return Result{ .appended = {} }; + }, + .aggregate => { + const elem_vals = typed_value.val.castTag(.aggregate).?.data; + const elem_ty = typed_value.ty.elemType(); + const len = @intCast(usize, typed_value.ty.arrayLen()); + for (elem_vals[0..len]) |elem_val| { + switch (try generateSymbol(bin_file, src_loc, .{ + .ty = elem_ty, + .val = elem_val, + }, code, debug_output, reloc_info)) { + .appended => {}, + .externally_managed => |slice| { + code.appendSliceAssumeCapacity(slice); + }, + .fail => |em| return Result{ .fail = em }, + } + } + return Result{ .appended = {} }; + }, + .repeated => { + const array = typed_value.val.castTag(.repeated).?.data; + const elem_ty = typed_value.ty.childType(); + const len = typed_value.ty.arrayLen(); + + var index: u64 = 0; + while (index < len) : (index += 1) { + switch (try generateSymbol(bin_file, src_loc, .{ + .ty = elem_ty, + .val = array, + }, code, debug_output, reloc_info)) { + .appended => {}, + .externally_managed => |slice| { + code.appendSliceAssumeCapacity(slice); + }, + .fail => |em| return Result{ .fail = em }, + } + } + return Result{ .appended = {} }; + }, + else => unreachable, + }, else => |t| { return Result{ .fail = try ErrorMsg.create( |
