diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-10-19 19:20:31 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-10-19 19:20:31 -0700 |
| commit | 2192d404d58a3e95d8fbb26e7fd73a95756172a6 (patch) | |
| tree | 37c9fa5177924bb955b9a7b50fa81c7ef6bf4852 /src/codegen/wasm.zig | |
| parent | e4c437f23baecf9d170f3f058cde78f34dedd5d0 (diff) | |
| download | zig-2192d404d58a3e95d8fbb26e7fd73a95756172a6.tar.gz zig-2192d404d58a3e95d8fbb26e7fd73a95756172a6.zip | |
stage2: wasm: implement struct_field_val
Diffstat (limited to 'src/codegen/wasm.zig')
| -rw-r--r-- | src/codegen/wasm.zig | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/codegen/wasm.zig b/src/codegen/wasm.zig index 6902553257..f0d9e43439 100644 --- a/src/codegen/wasm.zig +++ b/src/codegen/wasm.zig @@ -866,6 +866,7 @@ pub const Context = struct { .struct_field_ptr_index_1 => self.airStructFieldPtrIndex(inst, 1), .struct_field_ptr_index_2 => self.airStructFieldPtrIndex(inst, 2), .struct_field_ptr_index_3 => self.airStructFieldPtrIndex(inst, 3), + .struct_field_val => self.airStructFieldVal(inst), .switch_br => self.airSwitchBr(inst), .unreach => self.airUnreachable(inst), .wrap_optional => self.airWrapOptional(inst), @@ -1456,6 +1457,15 @@ pub const Context = struct { return WValue{ .local = struct_ptr.multi_value.index + index }; } + fn airStructFieldVal(self: *Context, inst: Air.Inst.Index) InnerError!WValue { + if (self.liveness.isUnused(inst)) return WValue.none; + + const ty_pl = self.air.instructions.items(.data)[inst].ty_pl; + const extra = self.air.extraData(Air.StructField, ty_pl.payload).data; + const struct_multivalue = self.resolveInst(extra.struct_operand).multi_value; + return WValue{ .local = struct_multivalue.index + extra.field_index }; + } + fn airSwitchBr(self: *Context, inst: Air.Inst.Index) InnerError!WValue { // result type is always 'noreturn' const blocktype = wasm.block_empty; |
