authorgravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2023-11-01 19:43:03+01:00
committergravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2023-11-01 19:47:15+01:00
log2c2bc9c8df3d8205caf4e49f0fcf7496b3d71444
tree618084087433ce062167ccd20e9603c963022c91
parent7c5d01b95e3cb47187726c52dae4abb2e5b4faaf
signaturelock-open Commit is signed but in an unrecognized format.

wasm: fix bitcasting to -and from arrays

Arrays are currently always passed by reference, this means that we always keep the value in linear memory and never load it to Wasm's stack. Scalar values however do get lowered to Wasm's stack. This means when bitcasting from an array to a scalar value, we must load the memory of the array as such scalar type. To bitcast a scalar type to an array, we allocate a new temporary in the linear data segment, and then store the scalar value there.

1 files changed, 10 insertions(+), 0 deletions(-)

src/arch/wasm/CodeGen.zig+10
...@@ -3814,6 +3814,16 @@ fn airBitcast(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {...@@ -3814,6 +3814,16 @@ fn airBitcast(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
3814 const bitcast_result = try func.bitcast(wanted_ty, given_ty, operand);3814 const bitcast_result = try func.bitcast(wanted_ty, given_ty, operand);
3815 break :result try bitcast_result.toLocal(func, wanted_ty);3815 break :result try bitcast_result.toLocal(func, wanted_ty);
3816 }3816 }
3817 const mod = func.bin_file.base.options.module.?;
3818 if (isByRef(given_ty, mod) and !isByRef(wanted_ty, mod)) {
3819 const loaded_memory = try func.load(operand, wanted_ty, 0);
3820 break :result try loaded_memory.toLocal(func, wanted_ty);
3821 }
3822 if (!isByRef(given_ty, mod) and isByRef(wanted_ty, mod)) {
3823 const stack_memory = try func.allocStack(wanted_ty);
3824 try func.store(stack_memory, operand, given_ty, 0);
3825 break :result stack_memory;
3826 }
3817 break :result func.reuseOperand(ty_op.operand, operand);3827 break :result func.reuseOperand(ty_op.operand, operand);
3818 };3828 };
3819 func.finishAir(inst, result, &.{ty_op.operand});3829 func.finishAir(inst, result, &.{ty_op.operand});