| ... | @@ -9731,7 +9731,7 @@ fn computeFrameLayout(self: *CodeGen, cc: std.builtin.CallingConvention) !FrameL | ... | @@ -9731,7 +9731,7 @@ fn computeFrameLayout(self: *CodeGen, cc: std.builtin.CallingConvention) !FrameL |
| 9731 | | 9731 | |
| 9732 | // Create list of registers to save in the prologue. | 9732 | // Create list of registers to save in the prologue. |
| 9733 | // TODO handle register classes | 9733 | // TODO handle register classes |
| 9734 | var save_reg_list = Mir.RegisterList{}; | 9734 | var save_reg_list: Mir.RegisterList = .empty; |
| 9735 | const callee_preserved_regs = | 9735 | const callee_preserved_regs = |
| 9736 | abi.getCalleePreservedRegs(abi.resolveCallingConvention(cc, self.target.*)); | 9736 | abi.getCalleePreservedRegs(abi.resolveCallingConvention(cc, self.target.*)); |
| 9737 | for (callee_preserved_regs) |reg| { | 9737 | for (callee_preserved_regs) |reg| { |
| ... | @@ -9972,43 +9972,34 @@ fn restoreState(self: *CodeGen, state: State, deaths: []const Air.Inst.Index, co | ... | @@ -9972,43 +9972,34 @@ fn restoreState(self: *CodeGen, state: State, deaths: []const Air.Inst.Index, co |
| 9972 | reg_locks.deinit(); | 9972 | reg_locks.deinit(); |
| 9973 | }; | 9973 | }; |
| 9974 | | 9974 | |
| 9975 | for (0..state.registers.len) |index| { | 9975 | for ( |
| 9976 | const current_maybe_inst = if (self.register_manager.free_registers.isSet(index)) | 9976 | 0.., |
| 9977 | null | 9977 | self.register_manager.registers, |
| 9978 | else | 9978 | state.registers, |
| 9979 | self.register_manager.registers[index]; | 9979 | state.reg_tracking, |
| 9980 | const target_maybe_inst = if (state.free_registers.isSet(index)) | 9980 | ) |reg_i, current_slot, target_slot, reg_tracking| { |
| 9981 | null | 9981 | const reg_index: RegisterManager.TrackedIndex = @intCast(reg_i); |
| 9982 | else | 9982 | const current_maybe_inst = if (self.register_manager.isRegIndexFree(reg_index)) null else current_slot; |
| 9983 | state.registers[index]; | 9983 | const target_maybe_inst = if (state.free_registers.isSet(reg_index)) null else target_slot; |
| 9984 | if (std.debug.runtime_safety) if (target_maybe_inst) |target_inst| | 9984 | if (std.debug.runtime_safety) if (target_maybe_inst) |target_inst| |
| 9985 | assert(self.inst_tracking.getIndex(target_inst).? < state.inst_tracking_len); | 9985 | assert(self.inst_tracking.getIndex(target_inst).? < state.inst_tracking_len); |
| 9986 | if (opts.emit_instructions) { | 9986 | if (opts.emit_instructions) { |
| 9987 | if (current_maybe_inst) |current_inst| { | 9987 | if (current_maybe_inst) |current_inst| |
| 9988 | try self.inst_tracking.getPtr(current_inst).?.spill(self, current_inst); | 9988 | try self.inst_tracking.getPtr(current_inst).?.spill(self, current_inst); |
| 9989 | } | 9989 | if (target_maybe_inst) |target_inst| |
| 9990 | if (target_maybe_inst) |target_inst| { | 9990 | try self.inst_tracking.getPtr(target_inst).?.materialize(self, target_inst, reg_tracking); |
| 9991 | const target_tracking = self.inst_tracking.getPtr(target_inst).?; | | |
| 9992 | try target_tracking.materialize(self, target_inst, state.reg_tracking[index]); | | |
| 9993 | } | | |
| 9994 | } | 9991 | } |
| 9995 | if (opts.update_tracking) { | 9992 | if (opts.update_tracking) { |
| 9996 | if (current_maybe_inst) |current_inst| { | 9993 | if (current_maybe_inst) |current_inst| { |
| 9997 | try self.inst_tracking.getPtr(current_inst).?.trackSpill(self, current_inst); | 9994 | try self.inst_tracking.getPtr(current_inst).?.trackSpill(self, current_inst); |
| 9998 | } | 9995 | self.register_manager.freeRegIndex(reg_index); |
| 9999 | { | | |
| 10000 | const reg = RegisterManager.regAtTrackedIndex(@intCast(index)); | | |
| 10001 | self.register_manager.freeReg(reg); | | |
| 10002 | self.register_manager.getRegAssumeFree(reg, target_maybe_inst); | | |
| 10003 | } | 9996 | } |
| 10004 | if (target_maybe_inst) |target_inst| { | 9997 | if (target_maybe_inst) |target_inst| { |
| 10005 | self.inst_tracking.getPtr(target_inst).?.trackMaterialize( | 9998 | self.register_manager.getRegIndexAssumeFree(reg_index, target_maybe_inst); |
| 10006 | target_inst, | 9999 | self.inst_tracking.getPtr(target_inst).?.trackMaterialize(target_inst, reg_tracking); |
| 10007 | state.reg_tracking[index], | | |
| 10008 | ); | | |
| 10009 | } | 10000 | } |
| 10010 | } else if (target_maybe_inst) |_| | 10001 | } else if (target_maybe_inst) |_| |
| 10011 | try reg_locks.append(self.register_manager.lockRegIndexAssumeUnused(@intCast(index))); | 10002 | try reg_locks.append(self.register_manager.lockRegIndexAssumeUnused(reg_index)); |
| 10012 | } | 10003 | } |
| 10013 | if (opts.emit_instructions) if (self.eflags_inst) |inst| | 10004 | if (opts.emit_instructions) if (self.eflags_inst) |inst| |
| 10014 | try self.inst_tracking.getPtr(inst).?.spill(self, inst); | 10005 | try self.inst_tracking.getPtr(inst).?.spill(self, inst); |