| ... | @@ -7728,7 +7728,7 @@ fn airAtomicLoad(func: *Func, inst: Air.Inst.Index) !void { | ... | @@ -7728,7 +7728,7 @@ fn airAtomicLoad(func: *Func, inst: Air.Inst.Index) !void { |
| 7728 | const ptr_mcv = try func.resolveInst(atomic_load.ptr); | 7728 | const ptr_mcv = try func.resolveInst(atomic_load.ptr); |
| 7729 | | 7729 | |
| 7730 | const bit_size = elem_ty.bitSize(zcu); | 7730 | 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", .{}); |
| 7732 | | 7732 | |
| 7733 | const result_mcv = try func.allocRegOrMem(elem_ty, inst, true); | 7733 | const result_mcv = try func.allocRegOrMem(elem_ty, inst, true); |
| 7734 | assert(result_mcv == .register); // should be less than 8 bytes | 7734 | 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 | ... | @@ -7792,6 +7792,17 @@ fn airAtomicStore(func: *Func, inst: Air.Inst.Index, order: std.builtin.AtomicOr |
| 7792 | } | 7792 | } |
| 7793 | | 7793 | |
| 7794 | try func.store(ptr_mcv, val_mcv, ptr_ty); | 7794 | 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 | |
| 7795 | return func.finishAir(inst, .unreach, .{ bin_op.lhs, bin_op.rhs, .none }); | 7806 | return func.finishAir(inst, .unreach, .{ bin_op.lhs, bin_op.rhs, .none }); |
| 7796 | } | 7807 | } |
| 7797 | | 7808 | |