From a55cc3b70005e66b1435907d81f2d0b762e8fbb0 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 23 Jul 2023 21:52:23 +0100 Subject: Add int-ne instruction to Patio --- .../compiler/backends/llvm/LlvmPatioCodeGen.java | 14 ++++++++++++++ .../compiler/backends/wasm/WasmPatioCodeGen.java | 3 +++ .../shedlang/compiler/patio/ast/PatioSerializer.java | 9 +++++++++ .../patio/ast/instructions/PatioInstruction.java | 2 +- .../patio/ast/instructions/PatioIntNotEqual.java | 17 +++++++++++++++++ 5 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntNotEqual.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java index a9944363..e5a3ac15 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java @@ -352,6 +352,20 @@ public class LlvmPatioCodeGen { )); } + case PatioIntNotEqual patioIntNotEqual -> { + var targetResult = context.addPatioLocalToLlvmLocal(patioIntNotEqual.target()); + var target = targetResult.value; + context = targetResult.context; + + yield context.addInstruction(new LlvmIcmp( + target, + LlvmConditionCode.NE, + LlvmTypes.INT_64, + patioOperandToLlvmOperand(patioIntNotEqual.left(), context), + patioOperandToLlvmOperand(patioIntNotEqual.right(), context) + )); + } + case PatioIntSub patioIntSub -> { var targetResult = context.addPatioLocalToLlvmLocal(patioIntSub.target()); var target = targetResult.value; 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 3c2bf7f0..529a2198 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java @@ -218,6 +218,9 @@ public class WasmPatioCodeGen { case PatioIntEquals patioIntEquals -> generateBinaryOperation(patioIntEquals, new WasmI32Eq(), context); + case PatioIntNotEqual patioIntNotEqual -> + generateBinaryOperation(patioIntNotEqual, new WasmI32Ne(), context); + case PatioIntSub patioIntSub -> generateBinaryOperation(patioIntSub, new WasmI32Sub(), context); diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java index 0d7d4369..d0826348 100644 --- a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java +++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java @@ -212,6 +212,15 @@ public class PatioSerializer { operandToTree(intEquals.right()) ); + case PatioIntNotEqual intNotEqual -> + treeList( + treeIdentifier("int-ne"), + operandToTree(intNotEqual.target()), + operandToTree(intNotEqual.left()), + operandToTree(intNotEqual.right()) + ); + + case PatioIntSub intSub -> treeList( treeIdentifier("int-sub"), diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstruction.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstruction.java index 7de62e97..3dcc516e 100644 --- a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstruction.java +++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstruction.java @@ -2,6 +2,6 @@ package org.shedlang.compiler.patio.ast.instructions; import org.shedlang.compiler.sources.Source; -public sealed interface PatioInstruction permits PatioAlloc, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntEquals, PatioIntSub, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioMemoryLoad, PatioMemoryStore, PatioReturn { +public sealed interface PatioInstruction permits PatioAlloc, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioMemoryLoad, PatioMemoryStore, PatioReturn { Source source(); } diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntNotEqual.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntNotEqual.java new file mode 100644 index 00000000..28313111 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntNotEqual.java @@ -0,0 +1,17 @@ +package org.shedlang.compiler.patio.ast.instructions; + +import org.shedlang.compiler.patio.ast.operands.PatioLocalRef; +import org.shedlang.compiler.patio.ast.operands.PatioOperand; +import org.shedlang.compiler.sources.Source; + +/** + * Compare the left and right operands. If they are equal, store false in the + * target, otherwise store true in the target. + */ +public record PatioIntNotEqual( + PatioLocalRef target, + PatioOperand left, + PatioOperand right, + Source source +) implements PatioInstructionBinaryOperation, PatioInstruction { +} -- cgit v1.2.3