diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-06 18:24:47 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-06 18:24:47 +0100 |
| commit | df888d6cce6a31e55eac4e21ccd496ce6023dfeb (patch) | |
| tree | c8c62f9307aa737c8d2289449422e4e31314b916 /src/test/java | |
| parent | 163460c063814f659713ceed417e5f0be4a800d0 (diff) | |
Add int-equals instruction
Diffstat (limited to 'src/test/java')
6 files changed, 113 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntEqualsTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntEqualsTests.java new file mode 100644 index 00000000..be97752d --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntEqualsTests.java @@ -0,0 +1,28 @@ +package org.shedlang.compiler.backends.llvm; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr; +import org.shedlang.compiler.stackir.instructions.Instructions; +import org.shedlang.compiler.testing.snapshots.SnapshotResolver; +import org.shedlang.compiler.testing.snapshots.Snapshotter; + +import java.io.IOException; + +import static org.shedlang.compiler.backends.llvm.LlvmCodeGenTesting.serializeContext; + +@ExtendWith({SnapshotResolver.class}) +public class LlvmCodeGenIntEqualsTests { + @Test + public void intEqualsIsCompiledToComparison(Snapshotter snapshotter) throws IOException { + var instruction = Instructions.intEquals(); + var context = LlvmCodeGenContext.EMPTY + .push(LlvmIr.variableLocal("a")) + .push(LlvmIr.variableLocal("b")) + .push(LlvmIr.variableLocal("c")); + + var result = LlvmCodeGen.generateInstruction(instruction, context); + + snapshotter.assertSnapshot(serializeContext(result)); + } +} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerInstructionTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerInstructionTests.java index ee2be2d4..86a5b0d7 100644 --- a/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerInstructionTests.java +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerInstructionTests.java @@ -2,6 +2,7 @@ package org.shedlang.compiler.backends.llvm.ir; import org.junit.jupiter.api.Test; import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr; +import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmConditionCode; import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes; import java.io.IOException; @@ -115,6 +116,21 @@ public class LlvmIrSerializerInstructionTests { } @Test + public void icmpIsSerialized() throws IOException { + var instruction = LlvmIr.icmp( + LlvmIr.variableLocal("target"), + LlvmConditionCode.EQ, + LlvmTypes.INT_32, + LlvmIr.variableLocal("left"), + LlvmIr.variableLocal("right") + ); + + var result = serializeToString(instruction, LlvmIrSerializer::serializeInstruction); + + assertThat(result, equalTo("%target = icmp eq i32 %left, %right")); + } + + @Test public void intToPtrIsSerialized() throws IOException { var instruction = LlvmIr.intToPtr( LlvmIr.variableLocal("x"), @@ -165,4 +181,18 @@ public class LlvmIrSerializerInstructionTests { assertThat(result, equalTo("store i64 42, ptr %target")); } + + @Test + public void zextIsSerialized() throws IOException { + var instruction = LlvmIr.zext( + LlvmIr.variableLocal("target"), + LlvmTypes.INT_32, + LlvmIr.variableLocal("source"), + LlvmTypes.INT_64 + ); + + var result = serializeToString(instruction, LlvmIrSerializer::serializeInstruction); + + assertThat(result, equalTo("%target = zext i32 %source to i64")); + } } diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java index a8023c35..59c16bb6 100644 --- a/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java @@ -71,6 +71,16 @@ public class LlvmIr { return new LlvmGetElementPtr(target, pointerType, pointer, indexes); } + public static LlvmIcmp icmp( + LlvmVariable target, + LlvmConditionCode conditionCode, + LlvmType type, + LlvmOperand left, + LlvmOperand right + ) { + return new LlvmIcmp(target, conditionCode, type, left, right); + } + public static LlvmIntToPtr intToPtr( LlvmVariable target, LlvmTypeScalar sourceType, @@ -159,4 +169,13 @@ public class LlvmIr { public static LlvmVariableLocal variableLocal(String name) { return new LlvmVariableLocal(name); } + + public static LlvmZext zext( + LlvmVariable target, + LlvmType sourceType, + LlvmOperand value, + LlvmType targetType + ) { + return new LlvmZext(target, sourceType, value, targetType); + } } diff --git a/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenIntEqualsTests.java b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenIntEqualsTests.java new file mode 100644 index 00000000..4e6eb0ff --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenIntEqualsTests.java @@ -0,0 +1,24 @@ +package org.shedlang.compiler.backends.wasm; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.shedlang.compiler.stackir.instructions.Instructions; +import org.shedlang.compiler.testing.snapshots.SnapshotResolver; +import org.shedlang.compiler.testing.snapshots.Snapshotter; + +import java.io.IOException; + +import static org.shedlang.compiler.backends.wasm.WasmCodeGenTesting.objdumpContext; + +@ExtendWith({SnapshotResolver.class}) +public class WasmCodeGenIntEqualsTests { + @Test + public void intEqualsIsCompiledToI32Eq(Snapshotter snapshotter) throws IOException, InterruptedException { + var instruction = Instructions.intEquals(); + var context = WasmCodeGenContext.EMPTY; + + var result = WasmCodeGen.generateInstruction(instruction, context); + + snapshotter.assertSnapshot(objdumpContext(result)); + } +} diff --git a/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java b/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java index 74e018f3..10588ec1 100644 --- a/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java +++ b/src/test/java/org/shedlang/compiler/stackir/InstructionSerializerTests.java @@ -74,6 +74,14 @@ public class InstructionSerializerTests { assertThat(string, equalTo("(field-load \"Example/Lib\" \"x\")")); } + @Test + public void canSerializeIntEquals() { + var instruction = Instructions.intEquals(); + + var string = serialize(instruction); + + assertThat(string, equalTo("(int-equals)")); + } @Test public void canSerializeLocalLoad() { diff --git a/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java b/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java index adc0731b..a1630727 100644 --- a/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java +++ b/src/test/java/org/shedlang/compiler/stackir/instructions/Instructions.java @@ -61,4 +61,8 @@ public class Instructions { public static Instruction return_() { return new ReturnInstruction(Sources.NULL); } + + public static Instruction intEquals() { + return new IntEqualsInstruction(Sources.NULL); + } } |
