aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjoachimschmidt557 <joachim.schmidt557@outlook.com>2022-01-29 13:01:47 +0100
committerAndrew Kelley <andrew@ziglang.org>2022-01-30 19:41:11 -0500
commitb2338de7fde695d755b4c33600fc98c408a09ebe (patch)
treeacfca171ccda7b9165b7ca7035cc474bc05b25b2 /src
parentfb7060d3c2e8ce4d7de5560adf8ec4a26fc5f6e8 (diff)
downloadzig-b2338de7fde695d755b4c33600fc98c408a09ebe.tar.gz
zig-b2338de7fde695d755b4c33600fc98c408a09ebe.zip
stage2 AArch64: Move to new regalloc freeze API
Diffstat (limited to 'src')
-rw-r--r--src/arch/aarch64/CodeGen.zig20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/arch/aarch64/CodeGen.zig b/src/arch/aarch64/CodeGen.zig
index 145fb2e931..b68f214dfa 100644
--- a/src/arch/aarch64/CodeGen.zig
+++ b/src/arch/aarch64/CodeGen.zig
@@ -637,6 +637,9 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
.wrap_errunion_err => try self.airWrapErrUnionErr(inst),
// zig fmt: on
}
+
+ assert(!self.register_manager.frozenRegsExist());
+
if (std.debug.runtime_safety) {
if (self.air_bookkeeping < old_air_bookkeeping + 1) {
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
.register => {
return self.fail("TODO implement loading from MCValue.register for {}", .{self.target.cpu.arch});
},
- .memory => |addr| {
+ .memory,
+ .stack_offset,
+ => {
const reg = try self.register_manager.allocReg(null, &.{});
- try self.genSetReg(ptr_ty, reg, .{ .memory = addr });
+ self.register_manager.freezeRegs(&.{reg});
+ defer self.register_manager.unfreezeRegs(&.{reg});
+
+ try self.genSetReg(ptr_ty, reg, ptr);
try self.load(dst_mcv, .{ .register = reg }, ptr_ty);
},
- .stack_offset => {
- return self.fail("TODO implement loading from MCValue.stack_offset", .{});
- },
}
}
@@ -1711,6 +1716,11 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {
else => true,
};
+ if (lhs_is_register) self.register_manager.freezeRegs(&.{lhs.register});
+ defer if (lhs_is_register) self.register_manager.unfreezeRegs(&.{lhs.register});
+ if (rhs_is_register) self.register_manager.freezeRegs(&.{rhs.register});
+ defer if (rhs_is_register) self.register_manager.unfreezeRegs(&.{rhs.register});
+
var lhs_mcv = lhs;
var rhs_mcv = rhs;