From 4f2cf10ed2459a97cddc567a0d454e3857bd54d8 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 27 Aug 2023 22:45:55 +0100 Subject: Support loops in WASM Patio code generator --- .../compiler/backends/wasm/WasmPatioCodeGen.java | 35 ++++++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) (limited to 'src/main/java') 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); -- cgit v1.2.3