authorgravatar for koachan@protonmail.comKoakuma <koachan@protonmail.com> 2022-05-14 13:17:44+07:00
committergravatar for koachan@protonmail.comKoakuma <koachan@protonmail.com> 2022-05-16 23:30:54+07:00
logccf438e4de75299a235f1f4f88a7de62779cc19a
tree9824e694661e2a7efe589e48be7a6b865b75a6d0
parent26e3d36d74cb35b7de80f9b7e8499fd695dc6700

stage2: sparc64: Replace freezeRegs with RegisterLock


1 files changed, 26 insertions(+), 16 deletions(-)

src/arch/sparc64/CodeGen.zig+26-16
......@@ -23,6 +23,7 @@ const FnResult = @import("../../codegen.zig").FnResult;
2323const DebugInfoOutput = @import("../../codegen.zig").DebugInfoOutput;
2424const RegisterManagerFn = @import("../../register_manager.zig").RegisterManager;
2525const RegisterManager = RegisterManagerFn(Self, Register, &abi.allocatable_regs);
26const RegisterLock = RegisterManager.RegisterLock;
2627
2728const build_options = @import("build_options");
2829
......@@ -1584,8 +1585,17 @@ fn binOpRegister(
15841585 const lhs_is_register = lhs == .register;
15851586 const rhs_is_register = rhs == .register;
15861587
1587 if (lhs_is_register) self.register_manager.freezeRegs(&.{lhs.register});
1588 if (rhs_is_register) self.register_manager.freezeRegs(&.{rhs.register});
1588 const lhs_lock: ?RegisterLock = if (lhs_is_register)
1589 self.register_manager.lockReg(lhs.register)
1590 else
1591 null;
1592 defer if (lhs_lock) |reg| self.register_manager.unlockReg(reg);
1593
1594 const rhs_lock: ?RegisterLock = if (rhs_is_register)
1595 self.register_manager.lockReg(rhs.register)
1596 else
1597 null;
1598 defer if (rhs_lock) |reg| self.register_manager.unlockReg(reg);
15891599
15901600 const branch = &self.branch_stack.items[self.branch_stack.items.len - 1];
15911601
......@@ -1596,13 +1606,12 @@ fn binOpRegister(
15961606 } else null;
15971607
15981608 const reg = try self.register_manager.allocReg(track_inst);
1599 self.register_manager.freezeRegs(&.{reg});
1600
16011609 if (track_inst) |inst| branch.inst_table.putAssumeCapacity(inst, .{ .register = reg });
16021610
16031611 break :blk reg;
16041612 };
1605 defer self.register_manager.unfreezeRegs(&.{lhs_reg});
1613 const new_lhs_lock = self.register_manager.lockReg(lhs_reg);
1614 defer if (new_lhs_lock) |reg| self.register_manager.unlockReg(reg);
16061615
16071616 const rhs_reg = if (rhs_is_register) rhs.register else blk: {
16081617 const track_inst: ?Air.Inst.Index = if (maybe_inst) |inst| inst: {
......@@ -1611,13 +1620,12 @@ fn binOpRegister(
16111620 } else null;
16121621
16131622 const reg = try self.register_manager.allocReg(track_inst);
1614 self.register_manager.freezeRegs(&.{reg});
1615
16161623 if (track_inst) |inst| branch.inst_table.putAssumeCapacity(inst, .{ .register = reg });
16171624
16181625 break :blk reg;
16191626 };
1620 defer self.register_manager.unfreezeRegs(&.{rhs_reg});
1627 const new_rhs_lock = self.register_manager.lockReg(rhs_reg);
1628 defer if (new_rhs_lock) |reg| self.register_manager.unlockReg(reg);
16211629
16221630 const dest_reg = switch (mir_tag) {
16231631 else => if (maybe_inst) |inst| blk: {
......@@ -2298,8 +2306,8 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo
22982306 .immediate => |imm| try self.setRegOrMem(elem_ty, dst_mcv, .{ .memory = imm }),
22992307 .ptr_stack_offset => |off| try self.setRegOrMem(elem_ty, dst_mcv, .{ .stack_offset = off }),
23002308 .register => |addr_reg| {
2301 self.register_manager.freezeRegs(&.{addr_reg});
2302 defer self.register_manager.unfreezeRegs(&.{addr_reg});
2309 const addr_reg_lock = self.register_manager.lockReg(addr_reg);
2310 defer if (addr_reg_lock) |reg| self.register_manager.unlockReg(reg);
23032311
23042312 switch (dst_mcv) {
23052313 .dead => unreachable,
......@@ -2311,15 +2319,17 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo
23112319 .stack_offset => |off| {
23122320 if (elem_size <= 8) {
23132321 const tmp_reg = try self.register_manager.allocReg(null);
2314 self.register_manager.freezeRegs(&.{tmp_reg});
2315 defer self.register_manager.unfreezeRegs(&.{tmp_reg});
2322 const tmp_reg_lock = self.register_manager.lockRegAssumeUnused(tmp_reg);
2323 defer self.register_manager.unlockReg(tmp_reg_lock);
23162324
23172325 try self.load(.{ .register = tmp_reg }, ptr, ptr_ty);
23182326 try self.genSetStack(elem_ty, off, MCValue{ .register = tmp_reg });
23192327 } else {
23202328 const regs = try self.register_manager.allocRegs(3, .{ null, null, null });
2321 self.register_manager.freezeRegs(&regs);
2322 defer self.register_manager.unfreezeRegs(&regs);
2329 const regs_locks = self.register_manager.lockRegsAssumeUnused(3, regs);
2330 defer for (regs_locks) |reg| {
2331 self.register_manager.unlockReg(reg);
2332 };
23232333
23242334 const src_reg = addr_reg;
23252335 const dst_reg = regs[0];
......@@ -2641,8 +2651,8 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
26412651 try self.genSetStack(value_ty, off, value);
26422652 },
26432653 .register => |addr_reg| {
2644 self.register_manager.freezeRegs(&.{addr_reg});
2645 defer self.register_manager.unfreezeRegs(&.{addr_reg});
2654 const addr_reg_lock = self.register_manager.lockReg(addr_reg);
2655 defer if (addr_reg_lock) |reg| self.register_manager.unlockReg(reg);
26462656
26472657 switch (value) {
26482658 .register => |value_reg| {