aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-23 11:35:57 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-23 11:35:57 +0100
commita5df38ed41f9554bafb2dbfb88c9f5ecbc7db4e7 (patch)
treeb0006f61847c9e981b0bf77d96c4f78c2358e08b /src/main/java
parentdfea9b1ce0247ae61e590cf91c59f4dd3ae93db5 (diff)
Add LLVM and WASM code gen for new Patio instructions
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java40
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java41
2 files changed, 81 insertions, 0 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 cccd5a32..8d9127f6 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
@@ -198,6 +198,19 @@ public class LlvmPatioCodeGen {
));
}
+ case PatioBoolToInt patioBoolToInt -> {
+ var targetResult = context.addPatioLocalToLlvmLocal(patioBoolToInt.target());
+ var target = targetResult.value;
+ context = targetResult.context;
+
+ yield context.addInstruction(new LlvmZext(
+ target,
+ LlvmTypes.INT_1,
+ patioOperandToLlvmOperand(patioBoolToInt.value(), context),
+ LlvmTypes.INT_64
+ ));
+ }
+
case PatioCall patioCall -> {
var target = Optional.<LlvmVariable>empty();
if (patioCall.target().isPresent()) {
@@ -305,6 +318,33 @@ public class LlvmPatioCodeGen {
));
}
+ case PatioIntEquals patioIntEquals -> {
+ var targetResult = context.addPatioLocalToLlvmLocal(patioIntEquals.target());
+ var target = targetResult.value;
+ context = targetResult.context;
+
+ yield context.addInstruction(new LlvmIcmp(
+ target,
+ LlvmConditionCode.EQ,
+ LlvmTypes.INT_64,
+ patioOperandToLlvmOperand(patioIntEquals.left(), context),
+ patioOperandToLlvmOperand(patioIntEquals.right(), context)
+ ));
+ }
+
+ case PatioIntToBool patioIntToBool -> {
+ var targetResult = context.addPatioLocalToLlvmLocal(patioIntToBool.target());
+ var target = targetResult.value;
+ context = targetResult.context;
+
+ yield context.addInstruction(new LlvmTrunc(
+ target,
+ LlvmTypes.INT_64,
+ patioOperandToLlvmOperand(patioIntToBool.value(), context),
+ LlvmTypes.INT_1
+ ));
+ }
+
case PatioIntToDataPtr patioIntToDataPtr -> {
var targetResult = context.addPatioLocalToLlvmLocal(patioIntToDataPtr.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 829117cc..caf7880d 100644
--- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
@@ -128,6 +128,16 @@ public class WasmPatioCodeGen {
yield context;
}
+
+ case PatioBoolToInt patioBoolToInt -> {
+ context = generateOperand(patioBoolToInt.value(), context);
+
+ var targetWasmLocalIndex = context.wasmLocalIndex(patioBoolToInt.target());
+ context = context.addInstruction(new WasmLocalSet(targetWasmLocalIndex));
+
+ yield context;
+ }
+
case PatioCall patioCall -> {
for (var patioArg : patioCall.args()) {
context = generateOperand(patioArg, context);
@@ -142,6 +152,7 @@ public class WasmPatioCodeGen {
yield context;
}
+
case PatioCallPointer patioCallPointer -> {
for (var patioArg : patioCallPointer.args()) {
context = generateOperand(patioArg, context);
@@ -169,6 +180,7 @@ public class WasmPatioCodeGen {
yield context;
}
+
case PatioDataPtrToInt patioDataPtrToInt -> {
context = generateOperand(patioDataPtrToInt.value(), context);
@@ -177,6 +189,7 @@ public class WasmPatioCodeGen {
yield context;
}
+
case PatioIf patioIf -> {
context = generateOperand(patioIf.condition(), context);
@@ -198,6 +211,7 @@ public class WasmPatioCodeGen {
yield context;
}
+
case PatioIntAdd patioIntAdd -> {
context = generateOperand(patioIntAdd.left(), context);
@@ -210,6 +224,29 @@ public class WasmPatioCodeGen {
yield context;
}
+
+ case PatioIntEquals patioIntEquals -> {
+ context = generateOperand(patioIntEquals.left(), context);
+
+ context = generateOperand(patioIntEquals.right(), context);
+
+ context = context.addInstruction(new WasmI32Eq());
+
+ var targetWasmLocalIndex = context.wasmLocalIndex(patioIntEquals.target());
+ context = context.addInstruction(new WasmLocalSet(targetWasmLocalIndex));
+
+ yield context;
+ }
+
+ case PatioIntToBool patioIntToBool -> {
+ context = generateOperand(patioIntToBool.value(), context);
+
+ var targetWasmLocalIndex = context.wasmLocalIndex(patioIntToBool.target());
+ context = context.addInstruction(new WasmLocalSet(targetWasmLocalIndex));
+
+ yield context;
+ }
+
case PatioIntToDataPtr patioIntToDataPtr -> {
context = generateOperand(patioIntToDataPtr.value(), context);
@@ -218,6 +255,7 @@ public class WasmPatioCodeGen {
yield context;
}
+
case PatioLocalStore patioLocalStore -> {
context = generateOperand(patioLocalStore.value(), context);
@@ -226,6 +264,7 @@ public class WasmPatioCodeGen {
yield context;
}
+
case PatioMemoryLoad patioMemoryLoad -> {
context = generateOperand(patioMemoryLoad.pointer(), context);
@@ -238,6 +277,7 @@ public class WasmPatioCodeGen {
yield context;
}
+
case PatioMemoryStore patioMemoryStore -> {
context = generateOperand(patioMemoryStore.pointer(), context);
@@ -249,6 +289,7 @@ public class WasmPatioCodeGen {
yield context;
}
+
case PatioReturn patioReturn -> {
context = generateOperand(patioReturn.value(), context);