authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-02-21 00:56:47+01:00
committergravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-02-21 23:05:16+01:00
log25f73224f7f9921633e67d4b5ef12c6ec10406eb
treeecdaa6426a045247fa17e591edb7af7700be147d
parent2ba1ef165aa3fb5da40d05fed9a120630b2529d2
signaturelock-open Commit is signed but in an unrecognized format.

stage2 AArch64: pass a few more behavior tests


7 files changed, 59 insertions(+), 32 deletions(-)

src/arch/aarch64/CodeGen.zig+52-23
......@@ -2079,7 +2079,8 @@ fn airStructFieldPtrIndex(self: *Self, inst: Air.Inst.Index, index: u8) !void {
20792079fn structFieldPtr(self: *Self, inst: Air.Inst.Index, operand: Air.Inst.Ref, index: u32) !MCValue {
20802080 return if (self.liveness.isUnused(inst)) .dead else result: {
20812081 const mcv = try self.resolveInst(operand);
2082 const struct_ty = self.air.typeOf(operand).childType();
2082 const ptr_ty = self.air.typeOf(operand);
2083 const struct_ty = ptr_ty.childType();
20832084 const struct_size = @intCast(u32, struct_ty.abiSize(self.target.*));
20842085 const struct_field_offset = @intCast(u32, struct_ty.structFieldOffset(index, self.target.*));
20852086 const struct_field_ty = struct_ty.structFieldType(index);
......@@ -2088,7 +2089,28 @@ fn structFieldPtr(self: *Self, inst: Air.Inst.Index, operand: Air.Inst.Ref, inde
20882089 .ptr_stack_offset => |off| {
20892090 break :result MCValue{ .ptr_stack_offset = off + struct_size - struct_field_offset - struct_field_size };
20902091 },
2091 else => return self.fail("TODO implement codegen struct_field_ptr for {}", .{mcv}),
2092 else => {
2093 const offset_reg = try self.copyToTmpRegister(ptr_ty, .{
2094 .immediate = struct_field_offset,
2095 });
2096 self.register_manager.freezeRegs(&.{offset_reg});
2097 defer self.register_manager.unfreezeRegs(&.{offset_reg});
2098
2099 const addr_reg = try self.copyToTmpRegister(ptr_ty, mcv);
2100 self.register_manager.freezeRegs(&.{addr_reg});
2101 defer self.register_manager.unfreezeRegs(&.{addr_reg});
2102
2103 const dest = try self.binOp(
2104 .add,
2105 null,
2106 .{ .register = addr_reg },
2107 .{ .register = offset_reg },
2108 Type.usize,
2109 Type.usize,
2110 );
2111
2112 break :result dest;
2113 },
20922114 }
20932115 };
20942116}
......@@ -3117,17 +3139,18 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
31173139 _ = sym_index;
31183140 return self.fail("TODO implement set stack variable from {}", .{mcv});
31193141 },
3120 .memory => |vaddr| {
3121 _ = vaddr;
3122 return self.fail("TODO implement set stack variable from memory vaddr", .{});
3123 },
3124 .stack_offset => |off| {
3125 if (stack_offset == off)
3126 return; // Copy stack variable to itself; nothing to do.
3142 .memory,
3143 .stack_offset,
3144 => {
3145 switch (mcv) {
3146 .stack_offset => |off| {
3147 if (stack_offset == off)
3148 return; // Copy stack variable to itself; nothing to do.
3149 },
3150 else => {},
3151 }
31273152
3128 const ptr_bits = self.target.cpu.arch.ptrBitWidth();
3129 const ptr_bytes: u64 = @divExact(ptr_bits, 8);
3130 if (abi_size <= ptr_bytes) {
3153 if (abi_size <= 8) {
31313154 const reg = try self.copyToTmpRegister(ty, mcv);
31323155 return self.genSetStack(ty, stack_offset, MCValue{ .register = reg });
31333156 } else {
......@@ -3142,17 +3165,23 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
31423165 const count_reg = regs[3];
31433166 const tmp_reg = regs[4];
31443167
3145 // sub src_reg, fp, #off
3146 const adj_src_offset = off + abi_size;
3147 const src_offset = math.cast(u12, adj_src_offset) catch return self.fail("TODO load: larger stack offsets", .{});
3148 _ = try self.addInst(.{
3149 .tag = .sub_immediate,
3150 .data = .{ .rr_imm12_sh = .{
3151 .rd = src_reg,
3152 .rn = .x29,
3153 .imm12 = src_offset,
3154 } },
3155 });
3168 switch (mcv) {
3169 .stack_offset => |off| {
3170 // sub src_reg, fp, #off
3171 const adj_src_offset = off + abi_size;
3172 const src_offset = math.cast(u12, adj_src_offset) catch return self.fail("TODO load: larger stack offsets", .{});
3173 _ = try self.addInst(.{
3174 .tag = .sub_immediate,
3175 .data = .{ .rr_imm12_sh = .{
3176 .rd = src_reg,
3177 .rn = .x29,
3178 .imm12 = src_offset,
3179 } },
3180 });
3181 },
3182 .memory => |addr| try self.genSetReg(Type.usize, src_reg, .{ .immediate = addr }),
3183 else => unreachable,
3184 }
31563185
31573186 // sub dst_reg, fp, #stack_offset
31583187 const adj_dst_off = stack_offset + abi_size;
test/behavior/align.zig+1-1
......@@ -311,7 +311,7 @@ fn testIndex2(ptr: [*]align(4) u8, index: usize, comptime T: type) !void {
311311}
312312
313313test "alignment of function with c calling convention" {
314 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
314 if (builtin.zig_backend == .stage2_aarch64 and builtin.os.tag == .macos) return error.SkipZigTest;
315315 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
316316
317317 var runtime_nothing = &nothing;
test/behavior/basic.zig+2-2
......@@ -610,7 +610,7 @@ test "comptime cast fn to ptr" {
610610}
611611
612612test "equality compare fn ptrs" {
613 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
613 if (builtin.zig_backend == .stage2_aarch64 and builtin.os.tag == .macos) return error.SkipZigTest;
614614 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
615615
616616 var a = &emptyFn;
......@@ -618,7 +618,7 @@ test "equality compare fn ptrs" {
618618}
619619
620620test "self reference through fn ptr field" {
621 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
621 if (builtin.zig_backend == .stage2_aarch64 and builtin.os.tag == .macos) return error.SkipZigTest;
622622 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
623623 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
624624
test/behavior/bugs/2006.zig+1-1
......@@ -6,7 +6,7 @@ const S = struct {
66 p: *S,
77};
88test "bug 2006" {
9 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
9 if (builtin.zig_backend == .stage2_aarch64 and builtin.os.tag == .macos) return error.SkipZigTest;
1010 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
1111 var a: S = undefined;
1212 a = S{ .p = undefined };
test/behavior/cast.zig+1-1
......@@ -1013,7 +1013,7 @@ test "cast from array reference to fn: comptime fn ptr" {
10131013 try expect(@ptrToInt(f) == @ptrToInt(&global_array));
10141014}
10151015test "cast from array reference to fn: runtime fn ptr" {
1016 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1016 if (builtin.zig_backend == .stage2_aarch64 and builtin.os.tag == .macos) return error.SkipZigTest;
10171017 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
10181018 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
10191019 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
test/behavior/slice.zig+1-1
......@@ -81,7 +81,7 @@ fn assertLenIsZero(msg: []const u8) !void {
8181}
8282
8383test "access len index of sentinel-terminated slice" {
84 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
84 if (builtin.zig_backend == .stage2_aarch64 and builtin.os.tag == .macos) return error.SkipZigTest;
8585 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
8686
8787 const S = struct {
test/behavior/struct.zig+1-3
......@@ -43,7 +43,6 @@ const StructWithFields = struct {
4343};
4444
4545test "non-packed struct has fields padded out to the required alignment" {
46 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
4746 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
4847
4948 const foo = StructWithFields{ .a = 5, .b = 1, .c = 10, .d = 2 };
......@@ -67,7 +66,7 @@ const SmallStruct = struct {
6766};
6867
6968test "lower unnamed constants" {
70 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
69 if (builtin.zig_backend == .stage2_aarch64 and builtin.os.tag == .macos) return error.SkipZigTest;
7170 var foo = SmallStruct{ .a = 1, .b = 255 };
7271 try expect(foo.first() == 1);
7372 try expect(foo.second() == 255);
......@@ -186,7 +185,6 @@ test "store member function in variable" {
186185}
187186
188187test "member functions" {
189 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
190188 const r = MemberFnRand{ .seed = 1234 };
191189 try expect(r.getSeed() == 1234);
192190}