aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-08-27 22:45:55 +0100
committerMichael Williamson <mike@zwobble.org>2023-08-27 22:45:55 +0100
commit4f2cf10ed2459a97cddc567a0d454e3857bd54d8 (patch)
tree811d506e270dd596091a9c32fd45c80048b247ad /src/main/java
parent03ade518f7c821cd0b44dfebf5872bd49b77298c (diff)
Support loops in WASM Patio code generator
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java35
1 files changed, 29 insertions, 6 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
index 80940a9e..bbf8298d 100644
--- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
@@ -260,14 +260,37 @@ public class WasmPatioCodeGen {
context
);
- case PatioLoop patioLoop ->
- throw new UnsupportedOperationException("TODO");
+ case PatioLoop patioLoop -> {
+ context = context.enterBlock();
+ context = generateInstructions(patioLoop.body(), context);
+ var bodyInstructions = context.instructions;
+ context = context.exitBlock();
+
+ context = context.addInstruction(new WasmBlock(
+ new WasmBlockType(List.of()),
+ List.of(
+ new WasmLoop(
+ new WasmBlockType(List.of()),
+ bodyInstructions
+ )
+ )
+ ));
+
+ yield context;
+ }
+
+ case PatioLoopBreak patioLoopBreak -> {
+ // TODO: track label indices properly
+ context = context.addInstruction(new WasmBr(2));
- case PatioLoopBreak patioLoopBreak ->
- throw new UnsupportedOperationException("TODO");
+ yield context;
+ }
+
+ case PatioLoopContinue patioLoopContinue -> {
+ context = context.addInstruction(new WasmBr(0));
- case PatioLoopContinue patioLoopContinue ->
- throw new UnsupportedOperationException("TODO");
+ yield context;
+ }
case PatioMemoryLoad patioMemoryLoad -> {
context = generateOperand(patioMemoryLoad.pointer(), context);