Commit 2192d404d5

Andrew Kelley <andrew@ziglang.org>
2021-10-20 04:20:31
stage2: wasm: implement struct_field_val
1 parent e4c437f
Changed files (1)
src
codegen
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;