aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-14 23:11:00 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-14 23:11:00 +0100
commit261e8a27cc465058748ec231090bfaef519488f2 (patch)
tree340112d0890681b22f9792dbef4a62c43783eac7 /src
parent3ceb2ecab5d2f8d091df271c959a89437175af3f (diff)
Add LLVM trunc instruction
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java9
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java2
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmTrunc.java13
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerInstructionTests.java14
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java9
5 files changed, 46 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java
index 6e2577b6..1c53beac 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java
@@ -129,6 +129,15 @@ public class LlvmIrSerializer {
writer.append(", ");
serializeOperand(sub.right(), writer);
}
+ case LlvmTrunc trunc -> {
+ serializeVariable(trunc.target(), writer);
+ writer.append(" = trunc ");
+ serializeType(trunc.sourceType(), writer);
+ writer.append(" ");
+ serializeOperand(trunc.value(), writer);
+ writer.append(" to ");
+ serializeType(trunc.targetType(), writer);
+ }
case LlvmZext zext -> {
serializeVariable(zext.target(), writer);
writer.append(" = zext ");
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java
index 89614e8a..2d49464d 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java
@@ -1,4 +1,4 @@
package org.shedlang.compiler.backends.llvm.ir.ast.instructions;
-public sealed interface LlvmInstruction permits LlvmAdd, LlvmCall, LlvmGetElementPtr, LlvmIcmp, LlvmIntToPtr, LlvmLoad, LlvmPtrToInt, LlvmStore, LlvmSub, LlvmZext {
+public sealed interface LlvmInstruction permits LlvmAdd, LlvmCall, LlvmGetElementPtr, LlvmIcmp, LlvmIntToPtr, LlvmLoad, LlvmPtrToInt, LlvmStore, LlvmSub, LlvmTrunc, LlvmZext {
}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmTrunc.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmTrunc.java
new file mode 100644
index 00000000..665b8d67
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmTrunc.java
@@ -0,0 +1,13 @@
+package org.shedlang.compiler.backends.llvm.ir.ast.instructions;
+
+import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperand;
+import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmVariable;
+import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType;
+
+public record LlvmTrunc(
+ LlvmVariable target,
+ LlvmType sourceType,
+ LlvmOperand value,
+ LlvmType targetType
+) implements LlvmInstruction {
+}
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 99eda802..eb55a95c 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
@@ -196,6 +196,20 @@ public class LlvmIrSerializerInstructionTests {
}
@Test
+ public void truncIsSerialized() throws IOException {
+ var instruction = LlvmIr.trunc(
+ LlvmIr.variableLocal("target"),
+ LlvmTypes.INT_64,
+ LlvmIr.variableLocal("source"),
+ LlvmTypes.INT_32
+ );
+
+ var result = serializeToString(instruction, LlvmIrSerializer::serializeInstruction);
+
+ assertThat(result, equalTo("%target = trunc i64 %source to i32"));
+ }
+
+ @Test
public void zextIsSerialized() throws IOException {
var instruction = LlvmIr.zext(
LlvmIr.variableLocal("target"),
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 78685315..5d957365 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
@@ -167,6 +167,15 @@ public class LlvmIr {
return new LlvmSub(target, type, left, right);
}
+ public static LlvmTrunc trunc(
+ LlvmVariable target,
+ LlvmType sourceType,
+ LlvmOperand value,
+ LlvmType targetType
+ ) {
+ return new LlvmTrunc(target, sourceType, value, targetType);
+ }
+
public static LlvmTypedOperand typedOperand(LlvmType type, LlvmOperand value) {
return new LlvmTypedOperand(type, value);
}