aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-23 21:52:23 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-23 21:53:27 +0100
commita55cc3b70005e66b1435907d81f2d0b762e8fbb0 (patch)
treee6b156dd1559397815f6c8c014a4e20d0e7b543a /src/main/java
parent008989950b12ce8e1eb649c44d84fad83e5cc4dc (diff)
Add int-ne instruction to Patio
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java14
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java3
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java9
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstruction.java2
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntNotEqual.java17
5 files changed, 44 insertions, 1 deletions
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 {
+}