From 6a3d3bdf076847f0606ccb3bc96f3fb87b87c549 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 23 Jul 2023 11:45:25 +0100 Subject: Extract WasmCodeGen::generateBinaryOperation() --- .../compiler/backends/wasm/WasmPatioCodeGen.java | 42 +++++++++++----------- .../PatioInstructionBinaryOperation.java | 10 ++++++ .../patio/ast/instructions/PatioIntAdd.java | 2 +- .../patio/ast/instructions/PatioIntEquals.java | 2 +- 4 files changed, 32 insertions(+), 24 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstructionBinaryOperation.java (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 e6fcbfcb..43a7dadf 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java @@ -206,29 +206,11 @@ public class WasmPatioCodeGen { yield context; } - case PatioIntAdd patioIntAdd -> { - context = generateOperand(patioIntAdd.left(), context); + case PatioIntAdd patioIntAdd -> + generateBinaryOperation(patioIntAdd, new WasmI32Add(), context); - context = generateOperand(patioIntAdd.right(), context); - - context = context.addInstruction(new WasmI32Add()); - - context = popIntoPatioLocal(patioIntAdd.target(), context); - - yield context; - } - - case PatioIntEquals patioIntEquals -> { - context = generateOperand(patioIntEquals.left(), context); - - context = generateOperand(patioIntEquals.right(), context); - - context = context.addInstruction(new WasmI32Eq()); - - context = popIntoPatioLocal(patioIntEquals.target(), context); - - yield context; - } + case PatioIntEquals patioIntEquals -> + generateBinaryOperation(patioIntEquals, new WasmI32Eq(), context); case PatioIntToBool patioIntToBool -> generateOperandToPatioLocal( @@ -285,6 +267,22 @@ public class WasmPatioCodeGen { }; } + private static Context generateBinaryOperation( + PatioInstructionBinaryOperation patioInstruction, + WasmInstruction wasmInstruction, + Context context + ) { + context = generateOperand(patioInstruction.left(), context); + + context = generateOperand(patioInstruction.right(), context); + + context = context.addInstruction(wasmInstruction); + + context = popIntoPatioLocal(patioInstruction.target(), context); + + return context; + } + private static Context generateOperandToPatioLocal( PatioLocalRef target, PatioOperand value, diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstructionBinaryOperation.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstructionBinaryOperation.java new file mode 100644 index 00000000..1737ecf1 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstructionBinaryOperation.java @@ -0,0 +1,10 @@ +package org.shedlang.compiler.patio.ast.instructions; + +import org.shedlang.compiler.patio.ast.operands.PatioLocalRef; +import org.shedlang.compiler.patio.ast.operands.PatioOperand; + +public interface PatioInstructionBinaryOperation { + PatioLocalRef target(); + PatioOperand left(); + PatioOperand right(); +} diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntAdd.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntAdd.java index ae1f67b7..23ce8736 100644 --- a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntAdd.java +++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntAdd.java @@ -8,5 +8,5 @@ public record PatioIntAdd( PatioLocalRef left, PatioLocalRef right, Source source -) implements PatioInstruction { +) implements PatioInstructionBinaryOperation, PatioInstruction { } diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntEquals.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntEquals.java index f746ee6b..5dd0c8a5 100644 --- a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntEquals.java +++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntEquals.java @@ -9,5 +9,5 @@ public record PatioIntEquals( PatioOperand left, PatioOperand right, Source source -) implements PatioInstruction { +) implements PatioInstructionBinaryOperation, PatioInstruction { } -- cgit v1.2.3