aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Rønne Petersen <alex@alexrp.com>2024-11-01 04:04:31 +0100
committerAlex Rønne Petersen <alex@alexrp.com>2025-05-12 17:07:49 +0200
commit61ae9a2f4547ec2fd0024e79addfa2d38b4c1239 (patch)
tree46045337b2d5ba51e45b2280bfaf05dfb97c23a9
parente40de8608273d50afe4c2d278c34be142af57562 (diff)
downloadzig-61ae9a2f4547ec2fd0024e79addfa2d38b4c1239.tar.gz
zig-61ae9a2f4547ec2fd0024e79addfa2d38b4c1239.zip
riscv64: Add missing fence for seq_cst atomic_store.
-rw-r--r--src/arch/riscv64/CodeGen.zig13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/arch/riscv64/CodeGen.zig b/src/arch/riscv64/CodeGen.zig
index 6c2befb98a..9c96b2c19f 100644
--- a/src/arch/riscv64/CodeGen.zig
+++ b/src/arch/riscv64/CodeGen.zig
@@ -7729,7 +7729,7 @@ fn airAtomicLoad(func: *Func, inst: Air.Inst.Index) !void {
const ptr_mcv = try func.resolveInst(atomic_load.ptr);
const bit_size = elem_ty.bitSize(zcu);
- if (bit_size > 64) return func.fail("TODO: airAtomicStore > 64 bits", .{});
+ if (bit_size > 64) return func.fail("TODO: airAtomicLoad > 64 bits", .{});
const result_mcv = try func.allocRegOrMem(elem_ty, inst, true);
assert(result_mcv == .register); // should be less than 8 bytes
@@ -7793,6 +7793,17 @@ fn airAtomicStore(func: *Func, inst: Air.Inst.Index, order: std.builtin.AtomicOr
}
try func.store(ptr_mcv, val_mcv, ptr_ty);
+
+ if (order == .seq_cst) {
+ _ = try func.addInst(.{
+ .tag = .fence,
+ .data = .{ .fence = .{
+ .pred = .rw,
+ .succ = .rw,
+ } },
+ });
+ }
+
return func.finishAir(inst, .unreach, .{ bin_op.lhs, bin_op.rhs, .none });
}