aboutsummaryrefslogtreecommitdiff
path: root/src/arch/wasm
diff options
context:
space:
mode:
authorLuuk de Gram <luuk@degram.dev>2022-03-03 19:10:58 +0100
committerAndrew Kelley <andrew@ziglang.org>2022-03-03 16:33:46 -0700
commit43cb19ea4da63dcaa8a18a06e3ab23f1c822c1fe (patch)
treecb5cb5fd83ddb948f5d3fddc7819849fb2154006 /src/arch/wasm
parentec4c30ae483e6700a1fd1d5edaadbb042790c52e (diff)
downloadzig-43cb19ea4da63dcaa8a18a06e3ab23f1c822c1fe.tar.gz
zig-43cb19ea4da63dcaa8a18a06e3ab23f1c822c1fe.zip
wasm: Implement `@wasmMemoryGrow` builtin
Similarly to the other wasm builtin, this implements the grow variation where the memory index is a comptime known value. The operand as well as the result are runtime values. This also verifies during semantic analysis the target we're building for is wasm, or else emits a compilation error. This means that other backends do not have to handle this AIR instruction, other than the wasm and LLVM backends.
Diffstat (limited to 'src/arch/wasm')
-rw-r--r--src/arch/wasm/CodeGen.zig13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/arch/wasm/CodeGen.zig b/src/arch/wasm/CodeGen.zig
index 0ea0418d7f..b4917738dd 100644
--- a/src/arch/wasm/CodeGen.zig
+++ b/src/arch/wasm/CodeGen.zig
@@ -1672,6 +1672,7 @@ fn genInst(self: *Self, inst: Air.Inst.Index) !WValue {
.wrap_errunion_err => self.airWrapErrUnionErr(inst),
.wasm_memory_size => self.airWasmMemorySize(inst),
+ .wasm_memory_grow => self.airWasmMemoryGrow(inst),
.add_sat,
.sub_sat,
@@ -3438,6 +3439,18 @@ fn airWasmMemorySize(self: *Self, inst: Air.Inst.Index) !WValue {
return result;
}
+fn airWasmMemoryGrow(self: *Self, inst: Air.Inst.Index) !WValue {
+ const pl_op = self.air.instructions.items(.data)[inst].pl_op;
+ const extra = self.air.extraData(Air.WasmMemoryIndex, pl_op.payload).data;
+ const operand = try self.resolveInst(pl_op.operand);
+
+ const result = try self.allocLocal(Type.usize);
+ try self.emitWValue(operand);
+ try self.addLabel(.memory_grow, extra.index);
+ try self.addLabel(.local_set, result.local);
+ return result;
+}
+
fn cmpOptionals(self: *Self, lhs: WValue, rhs: WValue, operand_ty: Type, op: std.math.CompareOperator) InnerError!WValue {
assert(operand_ty.hasRuntimeBits());
assert(op == .eq or op == .neq);