authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-08-26 22:19:27+02:00
committergravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-09-09 19:17:17+02:00
loge2b029e2c8ad761c32886d27aa0227655a60eb9e
treeab421b1e5222e7c887d2abcda490f7b3a5673293
parent481bd4761ac9826336d13553e249989f509ba172
signaturelock-open Commit is signed but in an unrecognized format.

stage2 ARM: implement field_parent_ptr


2 files changed, 18 insertions(+), 5 deletions(-)

src/arch/arm/CodeGen.zig+18-3
......@@ -2681,9 +2681,24 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
26812681
26822682fn airFieldParentPtr(self: *Self, inst: Air.Inst.Index) !void {
26832683 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
2684 const bin_op = self.air.extraData(Air.Bin, ty_pl.payload).data;
2685 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement airFieldParentPtr", .{});
2686 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });
2684 const extra = self.air.extraData(Air.FieldParentPtr, ty_pl.payload).data;
2685 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else result: {
2686 const field_ptr = try self.resolveInst(extra.field_ptr);
2687 const struct_ty = self.air.getRefType(ty_pl.ty).childType();
2688 const struct_field_offset = @intCast(u32, struct_ty.structFieldOffset(extra.field_index, self.target.*));
2689 switch (field_ptr) {
2690 .ptr_stack_offset => |off| {
2691 break :result MCValue{ .ptr_stack_offset = off + struct_field_offset };
2692 },
2693 else => {
2694 const lhs_bind: ReadArg.Bind = .{ .mcv = field_ptr };
2695 const rhs_bind: ReadArg.Bind = .{ .mcv = .{ .immediate = struct_field_offset } };
2696
2697 break :result try self.addSub(.sub, lhs_bind, rhs_bind, Type.usize, Type.usize, null);
2698 },
2699 }
2700 };
2701 return self.finishAir(inst, result, .{ extra.field_ptr, .none, .none });
26872702}
26882703
26892704/// An argument to a Mir instruction which is read (and possibly also
test/behavior/field_parent_ptr.zig-2
......@@ -2,7 +2,6 @@ const expect = @import("std").testing.expect;
22const builtin = @import("builtin");
33
44test "@fieldParentPtr non-first field" {
5 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
65 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
76 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
87 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
......@@ -11,7 +10,6 @@ test "@fieldParentPtr non-first field" {
1110}
1211
1312test "@fieldParentPtr first field" {
14 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1513 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1614 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
1715 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;