authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-01-29 13:01:47+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-01-30 19:41:11-05:00
logb2338de7fde695d755b4c33600fc98c408a09ebe
treeacfca171ccda7b9165b7ca7035cc474bc05b25b2
parentfb7060d3c2e8ce4d7de5560adf8ec4a26fc5f6e8

stage2 AArch64: Move to new regalloc freeze API


1 files changed, 15 insertions(+), 5 deletions(-)

src/arch/aarch64/CodeGen.zig+15-5
...@@ -637,6 +637,9 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {...@@ -637,6 +637,9 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
637 .wrap_errunion_err => try self.airWrapErrUnionErr(inst),637 .wrap_errunion_err => try self.airWrapErrUnionErr(inst),
638 // zig fmt: on638 // zig fmt: on
639 }639 }
640
641 assert(!self.register_manager.frozenRegsExist());
642
640 if (std.debug.runtime_safety) {643 if (std.debug.runtime_safety) {
641 if (self.air_bookkeeping < old_air_bookkeeping + 1) {644 if (self.air_bookkeeping < old_air_bookkeeping + 1) {
642 std.debug.panic("in codegen.zig, handling of AIR instruction %{d} ('{}') did not do proper bookkeeping. Look for a missing call to finishAir.", .{ inst, air_tags[inst] });645 std.debug.panic("in codegen.zig, handling of AIR instruction %{d} ('{}') did not do proper bookkeeping. Look for a missing call to finishAir.", .{ inst, air_tags[inst] });
...@@ -1264,14 +1267,16 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo...@@ -1264,14 +1267,16 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo
1264 .register => {1267 .register => {
1265 return self.fail("TODO implement loading from MCValue.register for {}", .{self.target.cpu.arch});1268 return self.fail("TODO implement loading from MCValue.register for {}", .{self.target.cpu.arch});
1266 },1269 },
1267 .memory => |addr| {1270 .memory,
1271 .stack_offset,
1272 => {
1268 const reg = try self.register_manager.allocReg(null, &.{});1273 const reg = try self.register_manager.allocReg(null, &.{});
1269 try self.genSetReg(ptr_ty, reg, .{ .memory = addr });1274 self.register_manager.freezeRegs(&.{reg});
1275 defer self.register_manager.unfreezeRegs(&.{reg});
1276
1277 try self.genSetReg(ptr_ty, reg, ptr);
1270 try self.load(dst_mcv, .{ .register = reg }, ptr_ty);1278 try self.load(dst_mcv, .{ .register = reg }, ptr_ty);
1271 },1279 },
1272 .stack_offset => {
1273 return self.fail("TODO implement loading from MCValue.stack_offset", .{});
1274 },
1275 }1280 }
1276}1281}
12771282
...@@ -1711,6 +1716,11 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {...@@ -1711,6 +1716,11 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {
1711 else => true,1716 else => true,
1712 };1717 };
17131718
1719 if (lhs_is_register) self.register_manager.freezeRegs(&.{lhs.register});
1720 defer if (lhs_is_register) self.register_manager.unfreezeRegs(&.{lhs.register});
1721 if (rhs_is_register) self.register_manager.freezeRegs(&.{rhs.register});
1722 defer if (rhs_is_register) self.register_manager.unfreezeRegs(&.{rhs.register});
1723
1714 var lhs_mcv = lhs;1724 var lhs_mcv = lhs;
1715 var rhs_mcv = rhs;1725 var rhs_mcv = rhs;
17161726