diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-01-28 18:57:23 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-01-28 18:57:23 +0000 |
| commit | efbf3709697f1a94bbbed83563e0d7225e79e0fa (patch) | |
| tree | aacbf5a1e84241cc4dbd448d4c79fe815fac741b /src/main/java/org | |
| parent | 9644ba2686bb84d93cfc1a658505ec095d68b9a3 (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.java | 61 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java | 12 |
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 -> { |
