authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-11-01 04:04:31+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-05-14 05:43:04+02:00
logbf21e4f72528e0cf5bfcbc95172f641b9d5b53e8
treef36acef93981360fce6d471b8398f59831febb61
parentc4237e890945468c4efc4fdb0f5f3f17fac25046
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

riscv64: Add missing fence for seq_cst atomic_store.


1 files changed, 12 insertions(+), 1 deletions(-)

src/arch/riscv64/CodeGen.zig+12-1
......@@ -7728,7 +7728,7 @@ fn airAtomicLoad(func: *Func, inst: Air.Inst.Index) !void {
77287728 const ptr_mcv = try func.resolveInst(atomic_load.ptr);
77297729
77307730 const bit_size = elem_ty.bitSize(zcu);
7731 if (bit_size > 64) return func.fail("TODO: airAtomicStore > 64 bits", .{});
7731 if (bit_size > 64) return func.fail("TODO: airAtomicLoad > 64 bits", .{});
77327732
77337733 const result_mcv = try func.allocRegOrMem(elem_ty, inst, true);
77347734 assert(result_mcv == .register); // should be less than 8 bytes
......@@ -7792,6 +7792,17 @@ fn airAtomicStore(func: *Func, inst: Air.Inst.Index, order: std.builtin.AtomicOr
77927792 }
77937793
77947794 try func.store(ptr_mcv, val_mcv, ptr_ty);
7795
7796 if (order == .seq_cst) {
7797 _ = try func.addInst(.{
7798 .tag = .fence,
7799 .data = .{ .fence = .{
7800 .pred = .rw,
7801 .succ = .rw,
7802 } },
7803 });
7804 }
7805
77957806 return func.finishAir(inst, .unreach, .{ bin_op.lhs, bin_op.rhs, .none });
77967807}
77977808