| ... | ... | @@ -10214,14 +10214,30 @@ fn airCmpxchg(self: *Self, inst: Air.Inst.Index) !void { |
| 10214 | 10214 | |
| 10215 | 10215 | const exp_mcv = try self.resolveInst(extra.expected_value); |
| 10216 | 10216 | if (val_abi_size > 8) { |
| 10217 | | try self.genSetReg(.rax, Type.usize, exp_mcv); |
| 10218 | | try self.genSetReg(.rdx, Type.usize, exp_mcv.address().offset(8).deref()); |
| 10217 | const exp_addr_mcv: MCValue = switch (exp_mcv) { |
| 10218 | .memory, .indirect, .load_frame => exp_mcv.address(), |
| 10219 | else => .{ .register = try self.copyToTmpRegister(Type.usize, exp_mcv.address()) }, |
| 10220 | }; |
| 10221 | const exp_addr_lock = |
| 10222 | if (exp_addr_mcv.getReg()) |reg| self.register_manager.lockReg(reg) else null; |
| 10223 | defer if (exp_addr_lock) |lock| self.register_manager.unlockReg(lock); |
| 10224 | |
| 10225 | try self.genSetReg(.rax, Type.usize, exp_addr_mcv.deref()); |
| 10226 | try self.genSetReg(.rdx, Type.usize, exp_addr_mcv.offset(8).deref()); |
| 10219 | 10227 | } else try self.genSetReg(.rax, val_ty, exp_mcv); |
| 10220 | 10228 | |
| 10221 | 10229 | const new_mcv = try self.resolveInst(extra.new_value); |
| 10222 | 10230 | const new_reg = if (val_abi_size > 8) new: { |
| 10223 | | try self.genSetReg(.rbx, Type.usize, new_mcv); |
| 10224 | | try self.genSetReg(.rcx, Type.usize, new_mcv.address().offset(8).deref()); |
| 10231 | const new_addr_mcv: MCValue = switch (new_mcv) { |
| 10232 | .memory, .indirect, .load_frame => new_mcv.address(), |
| 10233 | else => .{ .register = try self.copyToTmpRegister(Type.usize, new_mcv.address()) }, |
| 10234 | }; |
| 10235 | const new_addr_lock = |
| 10236 | if (new_addr_mcv.getReg()) |reg| self.register_manager.lockReg(reg) else null; |
| 10237 | defer if (new_addr_lock) |lock| self.register_manager.unlockReg(lock); |
| 10238 | |
| 10239 | try self.genSetReg(.rbx, Type.usize, new_addr_mcv.deref()); |
| 10240 | try self.genSetReg(.rcx, Type.usize, new_addr_mcv.offset(8).deref()); |
| 10225 | 10241 | break :new null; |
| 10226 | 10242 | } else try self.copyToTmpRegister(val_ty, new_mcv); |
| 10227 | 10243 | const new_lock = if (new_reg) |reg| self.register_manager.lockRegAssumeUnused(reg) else null; |