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