From df888d6cce6a31e55eac4e21ccd496ce6023dfeb Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 6 Jul 2023 18:24:47 +0100 Subject: Add int-equals instruction --- .../backends/llvm/LlvmCodeGenIntEqualsTests.java | 28 ++++++++++++++++++++ .../llvm/ir/LlvmIrSerializerInstructionTests.java | 30 ++++++++++++++++++++++ .../compiler/backends/llvm/ir/ast/LlvmIr.java | 19 ++++++++++++++ .../backends/wasm/WasmCodeGenIntEqualsTests.java | 24 +++++++++++++++++ .../stackir/InstructionSerializerTests.java | 8 ++++++ .../stackir/instructions/Instructions.java | 4 +++ 6 files changed, 113 insertions(+) create mode 100644 src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntEqualsTests.java create mode 100644 src/test/java/org/shedlang/compiler/backends/wasm/WasmCodeGenIntEqualsTests.java (limited to 'src/test/java') 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; @@ -114,6 +115,21 @@ public class LlvmIrSerializerInstructionTests { assertThat(result, equalTo("%x = getelementptr [0 x {i64, i32}], ptr %y, i64 3, i32 1")); } + @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( @@ -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); + } } -- cgit v1.2.3