From b8b4814b92c4d808da5a79d1d7311c27b325853f Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 8 Oct 2023 20:48:18 +0100 Subject: Support Patio switch in WASM code gen --- .../compiler/backends/wasm/WasmPatioCodeGen.java | 38 ++++++++++++++++++---- 1 file changed, 32 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 fe01d9c5..16d4b520 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java @@ -198,11 +198,7 @@ public class WasmPatioCodeGen { case PatioIf patioIf -> { context = generateOperand(patioIf.condition(), context); - var wasmBlockType = new WasmBlockType( - patioIf.targets().stream() - .map(patioTarget -> patioOperandToWasmValueType(patioTarget)) - .toList() - ); + var wasmBlockType = generateBlockType(patioIf.targets()); context = context.enterIfInstruction(wasmBlockType); context = generateBlockBody(patioIf.trueBody(), context); @@ -307,7 +303,29 @@ public class WasmPatioCodeGen { } case PatioSwitch patioSwitch -> { - throw new UnsupportedOperationException("TODO"); + // TODO: use br_table? + var wasmBlockType = generateBlockType(patioSwitch.targets()); + + for (var patioSwitchCase : patioSwitch.cases()) { + context = generateOperand(patioSwitch.value(), context); + context = context.addInstruction(new WasmI32Const(patioSwitchCase.value())); + context = context.addInstruction(new WasmI32Eq()); + context = context.enterIfInstruction(wasmBlockType); + context = generateBlockBody(patioSwitchCase.body(), context); + context = context.enterElse(); + } + + context = generateBlockBody(patioSwitch.defaultBody(), context); + + for (var patioSwitchCase : patioSwitch.cases()) { + context = context.exitIfInstruction(); + } + + for (var patioTarget : Lists.reversed(patioSwitch.targets())) { + context = popIntoPatioLocal(patioTarget, context); + } + + yield context; } case PatioUnreachable patioUnreachable -> @@ -331,6 +349,14 @@ public class WasmPatioCodeGen { }; } + private static WasmBlockType generateBlockType(List targets) { + return new WasmBlockType( + targets.stream() + .map(patioTarget -> patioOperandToWasmValueType(patioTarget)) + .toList() + ); + } + private static Context generateBlockBody( PatioBlock block, Context context -- cgit v1.2.3