| ... | @@ -4204,6 +4204,7 @@ fn airRet(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -4204,6 +4204,7 @@ fn airRet(self: *Self, inst: Air.Inst.Index) !void { |
| 4204 | }, | 4204 | }, |
| 4205 | .stack_offset => { | 4205 | .stack_offset => { |
| 4206 | const reg = try self.copyToTmpRegister(Type.usize, self.ret_mcv); | 4206 | const reg = try self.copyToTmpRegister(Type.usize, self.ret_mcv); |
| | 4207 | log.warn("REG = {}", .{reg}); |
| 4207 | const reg_lock = self.register_manager.lockRegAssumeUnused(reg); | 4208 | const reg_lock = self.register_manager.lockRegAssumeUnused(reg); |
| 4208 | defer self.register_manager.unlockReg(reg_lock); | 4209 | defer self.register_manager.unlockReg(reg_lock); |
| 4209 | | 4210 | |
| ... | @@ -5854,7 +5855,11 @@ fn genInlineMemcpy( | ... | @@ -5854,7 +5855,11 @@ fn genInlineMemcpy( |
| 5854 | len: MCValue, | 5855 | len: MCValue, |
| 5855 | opts: InlineMemcpyOpts, | 5856 | opts: InlineMemcpyOpts, |
| 5856 | ) InnerError!void { | 5857 | ) InnerError!void { |
| 5857 | // TODO preserve contents of .rax and .rcx if not free, and then restore | 5858 | // TODO: Preserve contents of .rax and .rcx if not free and locked, and then restore |
| | 5859 | // How can we do this without context if the value inside .rax or .rcx we preserve contains |
| | 5860 | // value needed to perform the memcpy in the first place? |
| | 5861 | // I think we should have an accumulator-based context that we pass with each subsequent helper |
| | 5862 | // call until we resolve the entire instruction. |
| 5858 | try self.register_manager.getReg(.rax, null); | 5863 | try self.register_manager.getReg(.rax, null); |
| 5859 | try self.register_manager.getReg(.rcx, null); | 5864 | try self.register_manager.getReg(.rcx, null); |
| 5860 | | 5865 | |