diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-23 21:52:23 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-23 21:53:27 +0100 |
| commit | a55cc3b70005e66b1435907d81f2d0b762e8fbb0 (patch) | |
| tree | e6b156dd1559397815f6c8c014a4e20d0e7b543a /src/main/java | |
| parent | 008989950b12ce8e1eb649c44d84fad83e5cc4dc (diff) | |
Add int-ne instruction to Patio
Diffstat (limited to 'src/main/java')
5 files changed, 44 insertions, 1 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 a9944363..e5a3ac15 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java @@ -352,6 +352,20 @@ public class LlvmPatioCodeGen { )); } + case PatioIntNotEqual patioIntNotEqual -> { + var targetResult = context.addPatioLocalToLlvmLocal(patioIntNotEqual.target()); + var target = targetResult.value; + context = targetResult.context; + + yield context.addInstruction(new LlvmIcmp( + target, + LlvmConditionCode.NE, + LlvmTypes.INT_64, + patioOperandToLlvmOperand(patioIntNotEqual.left(), context), + patioOperandToLlvmOperand(patioIntNotEqual.right(), context) + )); + } + case PatioIntSub patioIntSub -> { var targetResult = context.addPatioLocalToLlvmLocal(patioIntSub.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 3c2bf7f0..529a2198 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 PatioIntNotEqual patioIntNotEqual -> + generateBinaryOperation(patioIntNotEqual, new WasmI32Ne(), context); + case PatioIntSub patioIntSub -> generateBinaryOperation(patioIntSub, new WasmI32Sub(), context); 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 0d7d4369..d0826348 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,15 @@ public class PatioSerializer { operandToTree(intEquals.right()) ); + case PatioIntNotEqual intNotEqual -> + treeList( + treeIdentifier("int-ne"), + operandToTree(intNotEqual.target()), + operandToTree(intNotEqual.left()), + operandToTree(intNotEqual.right()) + ); + + case PatioIntSub intSub -> treeList( treeIdentifier("int-sub"), 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 7de62e97..3dcc516e 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, PatioIntSub, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioMemoryLoad, PatioMemoryStore, PatioReturn { +public sealed interface PatioInstruction permits PatioAlloc, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioMemoryLoad, PatioMemoryStore, PatioReturn { Source source(); } diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntNotEqual.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntNotEqual.java new file mode 100644 index 00000000..28313111 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioIntNotEqual.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; + +/** + * Compare the left and right operands. If they are equal, store false in the + * target, otherwise store true in the target. + */ +public record PatioIntNotEqual( + PatioLocalRef target, + PatioOperand left, + PatioOperand right, + Source source +) implements PatioInstructionBinaryOperation, PatioInstruction { +} |
