aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorJacob G-W <jacoblevgw@gmail.com>2021-08-16 23:11:55 -0400
committerAndrew Kelley <andrew@ziglang.org>2021-08-21 23:52:55 -0400
commit4ac37eb484737e98269e198b31b81ee8e929b4f1 (patch)
tree2d5e66fcd1a2f6c9f129583d2ea8f671fff4832b /src/codegen.zig
parentf378b0adce80aa6f85d9bf6bf97172426de2c719 (diff)
downloadzig-4ac37eb484737e98269e198b31b81ee8e929b4f1.tar.gz
zig-4ac37eb484737e98269e198b31b81ee8e929b4f1.zip
stage2 Air: add struct_field_ptr_index_{0..3}
Since these are very common, it will save memory.
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index ca7a04a4a0..9103c7ad17 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -855,6 +855,12 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
.store => try self.airStore(inst),
.struct_field_ptr=> try self.airStructFieldPtr(inst),
.struct_field_val=> try self.airStructFieldVal(inst),
+
+ .struct_field_ptr_index_0 => try self.airStructFieldPtrIndex(inst, 0),
+ .struct_field_ptr_index_1 => try self.airStructFieldPtrIndex(inst, 1),
+ .struct_field_ptr_index_2 => try self.airStructFieldPtrIndex(inst, 2),
+ .struct_field_ptr_index_3 => try self.airStructFieldPtrIndex(inst, 3),
+
.switch_br => try self.airSwitch(inst),
.slice_ptr => try self.airSlicePtr(inst),
.slice_len => try self.airSliceLen(inst),
@@ -1592,7 +1598,18 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
fn airStructFieldPtr(self: *Self, inst: Air.Inst.Index) !void {
const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
const extra = self.air.extraData(Air.StructField, ty_pl.payload).data;
- _ = extra;
+ return self.structFieldPtr(extra.struct_operand, ty_pl.ty, extra.field_index);
+ }
+
+ fn airStructFieldPtrIndex(self: *Self, inst: Air.Inst.Index, index: u8) !void {
+ const ty_op = self.air.instructions.items(.data)[inst].ty_op;
+ return self.structFieldPtr(ty_op.operand, ty_op.ty, index);
+ }
+ fn structFieldPtr(self: *Self, operand: Air.Inst.Ref, ty: Air.Inst.Ref, index: u32) !void {
+ _ = self;
+ _ = operand;
+ _ = ty;
+ _ = index;
return self.fail("TODO implement codegen struct_field_ptr", .{});
//return self.finishAir(inst, result, .{ extra.struct_ptr, .none, .none });
}