diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-23 11:35:57 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-23 11:35:57 +0100 |
| commit | a5df38ed41f9554bafb2dbfb88c9f5ecbc7db4e7 (patch) | |
| tree | b0006f61847c9e981b0bf77d96c4f78c2358e08b /src/main/java | |
| parent | dfea9b1ce0247ae61e590cf91c59f4dd3ae93db5 (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.java | 40 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java | 41 |
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); |
