From 6aa1d4c0dd57790b65f90b2c69b484ad64ce74bc Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 25 Jun 2023 15:55:14 +0100 Subject: Add WASM code gen for return instruction --- .../java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java | 6 +++--- .../wasm/structure/ast/instructions/WasmInstruction.java | 2 +- .../backends/wasm/structure/ast/instructions/WasmReturn.java | 4 ++++ .../wasm/structure/binary/WasmBinaryFormatInstructions.java | 11 +++++++---- 4 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/instructions/WasmReturn.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java index e71d1f15..b572f77e 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java @@ -1,6 +1,7 @@ package org.shedlang.compiler.backends.wasm; import org.shedlang.compiler.backends.wasm.structure.ast.instructions.WasmI32Const; +import org.shedlang.compiler.backends.wasm.structure.ast.instructions.WasmReturn; import org.shedlang.compiler.stackir.instructions.*; public class WasmCodeGen { @@ -39,9 +40,8 @@ public class WasmCodeGen { case PushUnitInstruction pushUnit -> context.addInstruction(new WasmI32Const(0)); - case ReturnInstruction returnInstruction -> { - throw new UnsupportedOperationException("TODO"); - } + case ReturnInstruction returnInstruction -> + context.addInstruction(new WasmReturn()); }; } } diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/instructions/WasmInstruction.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/instructions/WasmInstruction.java index 4f33a003..b9cbd672 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/instructions/WasmInstruction.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/instructions/WasmInstruction.java @@ -1,4 +1,4 @@ package org.shedlang.compiler.backends.wasm.structure.ast.instructions; -public sealed interface WasmInstruction permits WasmI32Const, WasmI64Const { +public sealed interface WasmInstruction permits WasmI32Const, WasmI64Const, WasmReturn { } diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/instructions/WasmReturn.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/instructions/WasmReturn.java new file mode 100644 index 00000000..6566468e --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/ast/instructions/WasmReturn.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.backends.wasm.structure.ast.instructions; + +public record WasmReturn() implements WasmInstruction { +} diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatInstructions.java b/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatInstructions.java index 3ed6b618..4bd9bb9a 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatInstructions.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/structure/binary/WasmBinaryFormatInstructions.java @@ -1,10 +1,7 @@ package org.shedlang.compiler.backends.wasm.structure.binary; import org.shedlang.compiler.backends.wasm.structure.BinaryWriter; -import org.shedlang.compiler.backends.wasm.structure.ast.instructions.WasmExpression; -import org.shedlang.compiler.backends.wasm.structure.ast.instructions.WasmI32Const; -import org.shedlang.compiler.backends.wasm.structure.ast.instructions.WasmI64Const; -import org.shedlang.compiler.backends.wasm.structure.ast.instructions.WasmInstruction; +import org.shedlang.compiler.backends.wasm.structure.ast.instructions.*; import java.io.IOException; @@ -17,6 +14,12 @@ public class WasmBinaryFormatInstructions { private static void writeInstruction(WasmInstruction instruction, BinaryWriter writer) { switch (instruction) { + // == Control Instructions == + + case WasmReturn ignored -> { + writer.writeByte(0x0f); + } + // == Numeric Instructions == case WasmI32Const i32Const -> { -- cgit v1.2.3