| ... | ... | @@ -1965,7 +1965,6 @@ fn genInst(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 1965 | 1965 | .is_non_err_ptr, |
| 1966 | 1966 | |
| 1967 | 1967 | .fence, |
| 1968 | | .atomic_load, |
| 1969 | 1968 | .atomic_store_unordered, |
| 1970 | 1969 | .atomic_store_monotonic, |
| 1971 | 1970 | .atomic_store_release, |
| ... | ... | @@ -1983,6 +1982,7 @@ fn genInst(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 1983 | 1982 | .c_va_start, |
| 1984 | 1983 | => |tag| return func.fail("TODO: Implement wasm inst: {s}", .{@tagName(tag)}), |
| 1985 | 1984 | |
| 1985 | .atomic_load => func.airAtomicLoad(inst), |
| 1986 | 1986 | .cmpxchg_weak => func.airCmpxchg(inst), |
| 1987 | 1987 | .cmpxchg_strong => func.airCmpxchg(inst), |
| 1988 | 1988 | |
| ... | ... | @@ -6664,3 +6664,29 @@ fn airCmpxchg(func: *CodeGen, inst: Air.Inst.Index) InnerError!void { |
| 6664 | 6664 | |
| 6665 | 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 | } |