From e4b51902a72b08a9feddbcd527550ddde08ecc9b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 26 Jan 2024 18:48:56 +0000 Subject: Add Patio int32-const --- .../shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java | 6 ++++++ .../java/org/shedlang/compiler/backends/wasm/PatioToWasm.java | 7 +++++++ src/main/java/org/shedlang/compiler/patio/PatioSerializer.java | 3 +++ .../org/shedlang/compiler/patio/operands/PatioInt32Const.java | 10 ++++++++++ .../org/shedlang/compiler/patio/operands/PatioOperand.java | 2 +- .../java/org/shedlang/compiler/patio/PatioSerializerTests.java | 9 +++++++++ .../java/org/shedlang/compiler/patio/instructions/Patio.java | 4 ++++ 7 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/shedlang/compiler/patio/operands/PatioInt32Const.java (limited to 'src') diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java index 5325a156..01b9ca18 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java @@ -1109,6 +1109,9 @@ public class PatioToLlvm { case PatioIntConst patioIntConst -> context.target().patioIntType(); + case PatioInt32Const patioInt32Const -> + LlvmTypes.INT_32; + case PatioLocalRef patioLocalRef -> context.patioLocalToType(patioLocalRef); }; @@ -1131,6 +1134,9 @@ public class PatioToLlvm { case PatioIntConst patioIntConst -> patioIntValueToLlvmOperand(patioIntConst.value(), context.target()); + case PatioInt32Const patioInt32Const -> + patioIntValueToLlvmOperand(patioInt32Const.value(), context.target()); + case PatioLocalRef patioLocalRef -> context.patioLocalToOperand(patioLocalRef); }; diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java index f6b9d5c7..e15cdc23 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java @@ -556,6 +556,11 @@ public class PatioToWasm { generateIntValue(patioIntConst.value(), context.target) )); + case PatioInt32Const patioInt32Const -> + context.addInstruction(new WasmI32Const( + generateIntValue(patioInt32Const.value(), context.target) + )); + case PatioLocalRef patioLocalRef -> { var wasmLocalIndex = context.wasmLocalIndex(patioLocalRef); yield context.addInstruction(new WasmLocalGet(wasmLocalIndex)); @@ -754,6 +759,8 @@ public class PatioToWasm { patioTypeToWasmValueType(PatioTypes.FUNCTION_POINTER, context.target); case PatioIntConst patioIntConst -> patioTypeToWasmValueType(PatioTypes.INT, context.target); + case PatioInt32Const patioInt32Const -> + patioTypeToWasmValueType(PatioTypes.INT32, context.target); case PatioLocalRef patioLocalRef -> context.wasmLocalType(patioLocalRef); }; diff --git a/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java b/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java index 75425069..9e208b2c 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java @@ -427,6 +427,9 @@ public class PatioSerializer { case PatioIntConst int_ -> treeList(treeIdentifier("int-const"), intValueToTree(int_.value())); + case PatioInt32Const int32 -> + treeList(treeIdentifier("int32-const"), intValueToTree(int32.value())); + case PatioLocalRef localRef -> treeList(treeIdentifier("local"), treeString(localRef.name())); }; diff --git a/src/main/java/org/shedlang/compiler/patio/operands/PatioInt32Const.java b/src/main/java/org/shedlang/compiler/patio/operands/PatioInt32Const.java new file mode 100644 index 00000000..ffc2e94f --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/operands/PatioInt32Const.java @@ -0,0 +1,10 @@ +package org.shedlang.compiler.patio.operands; + +import org.shedlang.compiler.patio.values.PatioIntValue; +import org.shedlang.compiler.patio.values.PatioIntValueLiteral; + +public record PatioInt32Const(PatioIntValue value) implements PatioOperand { + public static PatioInt32Const of(int value) { + return new PatioInt32Const(new PatioIntValueLiteral(value)); + } +} diff --git a/src/main/java/org/shedlang/compiler/patio/operands/PatioOperand.java b/src/main/java/org/shedlang/compiler/patio/operands/PatioOperand.java index 17ffb0e4..cc7db6c5 100644 --- a/src/main/java/org/shedlang/compiler/patio/operands/PatioOperand.java +++ b/src/main/java/org/shedlang/compiler/patio/operands/PatioOperand.java @@ -1,5 +1,5 @@ package org.shedlang.compiler.patio.operands; -public sealed interface PatioOperand permits PatioBoolConst, PatioDataPtrConst, PatioFunctionPtrConst, PatioIntConst, PatioLocalRef { +public sealed interface PatioOperand permits PatioBoolConst, PatioDataPtrConst, PatioFunctionPtrConst, PatioIntConst, PatioInt32Const, PatioLocalRef { } diff --git a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java index fe2de985..f5bb33f6 100644 --- a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java +++ b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java @@ -748,6 +748,15 @@ public class PatioSerializerTests { assertThat(string, equalTo("(int-const 42)")); } + @Test + public void canSerializeInt32Const() { + var operand = Patio.int32Const(42); + + var string = PatioTesting.serializeOperand(operand); + + assertThat(string, equalTo("(int32-const 42)")); + } + @Test public void canSerializeLocalRef() { var operand = Patio.localRef("x"); diff --git a/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java b/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java index 532f2d2a..b2d6502d 100644 --- a/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java +++ b/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java @@ -138,6 +138,10 @@ public class Patio { return new PatioIntConst(value); } + public static PatioOperand int32Const(int value) { + return PatioInt32Const.of(value); + } + public static PatioInstruction intAdd( PatioLocalRef destination, PatioOperand left, -- cgit v1.2.3