diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-23 21:49:59 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-23 21:49:59 +0100 |
| commit | 008989950b12ce8e1eb649c44d84fad83e5cc4dc (patch) | |
| tree | ef585bff79eff87b3d513f1ad7920c8ac16893cc /src/main/java | |
| parent | 4eafe23fb726d231ead6a535f9e97f278c4114e0 (diff) | |
Add int-sub instruction to Patio
Diffstat (limited to 'src/main/java')
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 { +} |
