authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-16 20:39:52-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-18 20:42:38-04:00
log28c445addde840eec49ed0fd19cc19384a040085
treee9d9186fc2f945ec3ce03be65c5c614e5cf16de4
parent01b63cd081b21954acb10b36f780c30f390e7245

x86_64: fix 128-bit atomics on non-linux


1 files changed, 20 insertions(+), 4 deletions(-)

src/arch/x86_64/CodeGen.zig+20-4
......@@ -10214,14 +10214,30 @@ fn airCmpxchg(self: *Self, inst: Air.Inst.Index) !void {
1021410214
1021510215 const exp_mcv = try self.resolveInst(extra.expected_value);
1021610216 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());
1021910227 } else try self.genSetReg(.rax, val_ty, exp_mcv);
1022010228
1022110229 const new_mcv = try self.resolveInst(extra.new_value);
1022210230 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());
1022510241 break :new null;
1022610242 } else try self.copyToTmpRegister(val_ty, new_mcv);
1022710243 const new_lock = if (new_reg) |reg| self.register_manager.lockRegAssumeUnused(reg) else null;