diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-08-27 22:45:55 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-08-27 22:45:55 +0100 |
| commit | 4f2cf10ed2459a97cddc567a0d454e3857bd54d8 (patch) | |
| tree | 811d506e270dd596091a9c32fd45c80048b247ad /src/main/java | |
| parent | 03ade518f7c821cd0b44dfebf5872bd49b77298c (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.java | 35 |
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); |
