aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-23 21:49:59 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-23 21:49:59 +0100
commit008989950b12ce8e1eb649c44d84fad83e5cc4dc (patch)
treeef585bff79eff87b3d513f1ad7920c8ac16893cc /src/main/java
parent4eafe23fb726d231ead6a535f9e97f278c4114e0 (diff)
Add int-sub 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.java8
-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/PatioIntAdd.java5
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntSub.java17
6 files changed, 45 insertions, 4 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 95d19776..a9944363 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
@@ -325,7 +325,6 @@ public class LlvmPatioCodeGen {
yield context;
}
-
case PatioIntAdd patioIntAdd -> {
var targetResult = context.addPatioLocalToLlvmLocal(patioIntAdd.target());
var target = targetResult.value;
@@ -353,6 +352,19 @@ public class LlvmPatioCodeGen {
));
}
+ case PatioIntSub patioIntSub -> {
+ var targetResult = context.addPatioLocalToLlvmLocal(patioIntSub.target());
+ var target = targetResult.value;
+ context = targetResult.context;
+
+ yield context.addInstruction(new LlvmSub(
+ target,
+ LlvmTypes.INT_64,
+ patioOperandToLlvmOperand(patioIntSub.left(), context),
+ patioOperandToLlvmOperand(patioIntSub.right(), context)
+ ));
+ }
+
case PatioIntToBool patioIntToBool -> {
var targetResult = context.addPatioLocalToLlvmLocal(patioIntToBool.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 143ed791..3c2bf7f0 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 PatioIntSub patioIntSub ->
+ generateBinaryOperation(patioIntSub, new WasmI32Sub(), context);
+
case PatioIntToBool patioIntToBool ->
generateOperandToPatioLocal(
patioIntToBool.target(),
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 0154d11b..0d7d4369 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,14 @@ public class PatioSerializer {
operandToTree(intEquals.right())
);
+ case PatioIntSub intSub ->
+ treeList(
+ treeIdentifier("int-sub"),
+ operandToTree(intSub.target()),
+ operandToTree(intSub.left()),
+ operandToTree(intSub.right())
+ );
+
case PatioIntToBool intToBool ->
treeList(
treeIdentifier("int-to-bool"),
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 18c93134..7de62e97 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, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioMemoryLoad, PatioMemoryStore, PatioReturn {
+public sealed interface PatioInstruction permits PatioAlloc, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntEquals, PatioIntSub, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioMemoryLoad, PatioMemoryStore, PatioReturn {
Source source();
}
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 23ce8736..55abf764 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
@@ -1,12 +1,13 @@
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;
public record PatioIntAdd(
PatioLocalRef target,
- PatioLocalRef left,
- PatioLocalRef right,
+ PatioOperand left,
+ PatioOperand right,
Source source
) implements PatioInstructionBinaryOperation, PatioInstruction {
}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntSub.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntSub.java
new file mode 100644
index 00000000..e5e3eaa2
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntSub.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;
+
+/**
+ * Calculate the left operand minus the right operand, and store the result in
+ * the target.
+ */
+public record PatioIntSub(
+ PatioLocalRef target,
+ PatioOperand left,
+ PatioOperand right,
+ Source source
+) implements PatioInstructionBinaryOperation, PatioInstruction {
+}