| ... | @@ -1965,7 +1965,6 @@ fn genInst(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { | ... | @@ -1965,7 +1965,6 @@ fn genInst(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 1965 | .is_non_err_ptr, | 1965 | .is_non_err_ptr, |
| 1966 | | 1966 | |
| 1967 | .fence, | 1967 | .fence, |
| 1968 | .atomic_load, | | |
| 1969 | .atomic_store_unordered, | 1968 | .atomic_store_unordered, |
| 1970 | .atomic_store_monotonic, | 1969 | .atomic_store_monotonic, |
| 1971 | .atomic_store_release, | 1970 | .atomic_store_release, |
| ... | @@ -1983,6 +1982,7 @@ fn genInst(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { | ... | @@ -1983,6 +1982,7 @@ fn genInst(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 1983 | .c_va_start, | 1982 | .c_va_start, |
| 1984 | => |tag| return func.fail("TODO: Implement wasm inst: {s}", .{@tagName(tag)}), | 1983 | => |tag| return func.fail("TODO: Implement wasm inst: {s}", .{@tagName(tag)}), |
| 1985 | | 1984 | |
| | 1985 | .atomic_load => func.airAtomicLoad(inst), |
| 1986 | .cmpxchg_weak => func.airCmpxchg(inst), | 1986 | .cmpxchg_weak => func.airCmpxchg(inst), |
| 1987 | .cmpxchg_strong => func.airCmpxchg(inst), | 1987 | .cmpxchg_strong => func.airCmpxchg(inst), |
| 1988 | | 1988 | |
| ... | @@ -6664,3 +6664,29 @@ fn airCmpxchg(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { | ... | @@ -6664,3 +6664,29 @@ fn airCmpxchg(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 6664 | | 6664 | |
| 6665 | return func.finishAir(inst, result_ptr, &.{ extra.ptr, extra.new_value, extra.expected_value }); | 6665 | return func.finishAir(inst, result_ptr, &.{ extra.ptr, extra.new_value, extra.expected_value }); |
| 6666 | } | 6666 | } |
| | 6667 | |
| | 6668 | fn airAtomicLoad(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| | 6669 | const atomic_load = func.air.instructions.items(.data)[inst].atomic_load; |
| | 6670 | const ptr = try func.resolveInst(atomic_load.ptr); |
| | 6671 | const ty = func.air.typeOfIndex(inst); |
| | 6672 | |
| | 6673 | if (func.useAtomicFeature()) { |
| | 6674 | const tag: wasm.AtomicsOpcode = switch (ty.abiSize(func.target)) { |
| | 6675 | 1 => .i32_atomic_load8_u, |
| | 6676 | 2 => .i32_atomic_load16_u, |
| | 6677 | 4 => .i32_atomic_load, |
| | 6678 | 8 => .i64_atomic_load, |
| | 6679 | else => |size| return func.fail("TODO: @atomicLoad for integers with abi size {d}", .{size}), |
| | 6680 | }; |
| | 6681 | try func.emitWValue(ptr); |
| | 6682 | try func.addAtomicMemArg(tag, .{ |
| | 6683 | .offset = ptr.offset(), |
| | 6684 | .alignment = ty.abiAlignment(func.target), |
| | 6685 | }); |
| | 6686 | } else { |
| | 6687 | _ = try func.load(ptr, ty, 0); |
| | 6688 | } |
| | 6689 | |
| | 6690 | const result = try WValue.toLocal(.stack, func, ty); |
| | 6691 | return func.finishAir(inst, result, &.{atomic_load.ptr}); |
| | 6692 | } |