aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-01-28 18:57:23 +0000
committerMichael Williamson <mike@zwobble.org>2024-01-28 18:57:23 +0000
commitefbf3709697f1a94bbbed83563e0d7225e79e0fa (patch)
treeaacbf5a1e84241cc4dbd448d4c79fe815fac741b /src/main/java/org
parent9644ba2686bb84d93cfc1a658505ec095d68b9a3 (diff)
Implement Patio memory-fill using LLVM
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/codegen/LlvmMemset.java61
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java12
2 files changed, 71 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/LlvmMemset.java b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/LlvmMemset.java
new file mode 100644
index 00000000..24739116
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/LlvmMemset.java
@@ -0,0 +1,61 @@
+package org.shedlang.compiler.backends.llvm.codegen;
+
+import org.shedlang.compiler.backends.llvm.LlvmTarget;
+import org.shedlang.compiler.backends.llvm.ir.ast.LlvmFunctionDeclaration;
+import org.shedlang.compiler.backends.llvm.ir.ast.LlvmParam;
+import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmInstruction;
+import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperand;
+import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperandInt;
+import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes;
+
+import java.util.List;
+import java.util.Optional;
+
+public class LlvmMemset {
+ private LlvmMemset() {
+ }
+
+ private static final LlvmFunctionDeclaration MEMSET_32 = new LlvmFunctionDeclaration(
+ "llvm.memset.p0.i32",
+ LlvmTypes.VOID,
+ List.of(
+ new LlvmParam(LlvmTypes.pointer(LlvmTypes.VOID), "dest"),
+ new LlvmParam(LlvmTypes.INT_8, "val"),
+ new LlvmParam(LlvmTypes.INT_32, "len"),
+ new LlvmParam(LlvmTypes.INT_1, "isvolatile")
+ )
+ );
+
+ private static final LlvmFunctionDeclaration MEMSET_64 = new LlvmFunctionDeclaration(
+ "llvm.memset.p0.i64",
+ LlvmTypes.VOID,
+ List.of(
+ new LlvmParam(LlvmTypes.pointer(LlvmTypes.VOID), "dest"),
+ new LlvmParam(LlvmTypes.INT_8, "val"),
+ new LlvmParam(LlvmTypes.INT_64, "len"),
+ new LlvmParam(LlvmTypes.INT_1, "isvolatile")
+ )
+ );
+
+ public static LlvmFunctionDeclaration declaration(LlvmTarget target) {
+ return switch (target) {
+ case AMD64 ->
+ MEMSET_64;
+
+ case I686 ->
+ MEMSET_32;
+ };
+ }
+
+ public static LlvmInstruction instruction(
+ LlvmTarget target,
+ LlvmOperand dest,
+ LlvmOperand val,
+ LlvmOperand len
+ ) {
+ return declaration(target).call(
+ Optional.empty(),
+ List.of(dest, val, len, new LlvmOperandInt(0))
+ );
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java
index d11f1279..962fb62e 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java
@@ -113,7 +113,8 @@ public class PatioToLlvm {
.addTopLevelEntity(EXCEPTION_HANDLER_DECLARATION)
.addTopLevelEntity(exceptionValueDeclaration(globalContext.target()))
.addTopLevelEntity(throwDeclaration(globalContext.target()))
- .addTopLevelEntity(RETHROW_DECLARATION);
+ .addTopLevelEntity(RETHROW_DECLARATION)
+ .addTopLevelEntity(LlvmMemset.declaration(globalContext.target()));
for (var patioCompilationUnitElement : patioCompilationUnit.elements()) {
switch (patioCompilationUnitElement) {
@@ -544,7 +545,14 @@ public class PatioToLlvm {
context.addTerminatorInstruction(new LlvmBrUnconditional(context.loopStartLabel()));
case PatioMemoryFill patioMemoryFill -> {
- throw new UnsupportedOperationException("TODO");
+ context = context.addInstruction(LlvmMemset.instruction(
+ context.target(),
+ patioOperandToLlvmOperand(patioMemoryFill.pointer(), context),
+ patioOperandToLlvmOperand(patioMemoryFill.value(), context),
+ patioOperandToLlvmOperand(patioMemoryFill.length(), context)
+ ));
+
+ yield context;
}
case PatioMemoryLoad patioMemoryLoad -> {