| ... | @@ -10214,14 +10214,30 @@ fn airCmpxchg(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -10214,14 +10214,30 @@ fn airCmpxchg(self: *Self, inst: Air.Inst.Index) !void { |
| 10214 | | 10214 | |
| 10215 | const exp_mcv = try self.resolveInst(extra.expected_value); | 10215 | const exp_mcv = try self.resolveInst(extra.expected_value); |
| 10216 | if (val_abi_size > 8) { | 10216 | if (val_abi_size > 8) { |
| 10217 | try self.genSetReg(.rax, Type.usize, exp_mcv); | 10217 | const exp_addr_mcv: MCValue = switch (exp_mcv) { |
| 10218 | try self.genSetReg(.rdx, Type.usize, exp_mcv.address().offset(8).deref()); | 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 | } else try self.genSetReg(.rax, val_ty, exp_mcv); | 10227 | } else try self.genSetReg(.rax, val_ty, exp_mcv); |
| 10220 | | 10228 | |
| 10221 | const new_mcv = try self.resolveInst(extra.new_value); | 10229 | const new_mcv = try self.resolveInst(extra.new_value); |
| 10222 | const new_reg = if (val_abi_size > 8) new: { | 10230 | const new_reg = if (val_abi_size > 8) new: { |
| 10223 | try self.genSetReg(.rbx, Type.usize, new_mcv); | 10231 | const new_addr_mcv: MCValue = switch (new_mcv) { |
| 10224 | try self.genSetReg(.rcx, Type.usize, new_mcv.address().offset(8).deref()); | 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 | break :new null; | 10241 | break :new null; |
| 10226 | } else try self.copyToTmpRegister(val_ty, new_mcv); | 10242 | } else try self.copyToTmpRegister(val_ty, new_mcv); |
| 10227 | const new_lock = if (new_reg) |reg| self.register_manager.lockRegAssumeUnused(reg) else null; | 10243 | const new_lock = if (new_reg) |reg| self.register_manager.lockRegAssumeUnused(reg) else null; |