diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-01-28 17:47:06 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-01-28 17:47:06 +0000 |
| commit | f1251be8fb464674ef0b5ffeb645a9aab872da88 (patch) | |
| tree | 28d659bd9ce18886a31504cd34272b52ec31b12f /src/main/java | |
| parent | 60cf1b347241855b2741949443fc7008554a482c (diff) | |
Add memory-fill instruction to Patio
Diffstat (limited to 'src/main/java')
5 files changed, 37 insertions, 1 deletions
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 c3cc1a60..d11f1279 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 @@ -543,6 +543,10 @@ public class PatioToLlvm { case PatioLoopContinue patioLoopContinue -> context.addTerminatorInstruction(new LlvmBrUnconditional(context.loopStartLabel())); + case PatioMemoryFill patioMemoryFill -> { + throw new UnsupportedOperationException("TODO"); + } + case PatioMemoryLoad patioMemoryLoad -> { var destinationResult = context.addPatioLocalToLlvmLocal(patioMemoryLoad.destination()); var destination = destinationResult.value(); diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java index 70319ff3..b6d4f7ef 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java @@ -324,6 +324,10 @@ public class PatioToWasm { yield context; } + case PatioMemoryFill patioMemoryFill -> { + throw new UnsupportedOperationException("TODO"); + } + case PatioMemoryLoad patioMemoryLoad -> { context = generateOperand(patioMemoryLoad.pointer(), context); diff --git a/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java b/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java index 06185778..1dd4de1a 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java @@ -268,6 +268,14 @@ public class PatioSerializer { treeIdentifier("continue") ); + case PatioMemoryFill memoryFill -> + treeListIndented( + treeIdentifier("memory-fill"), + operandToTree(memoryFill.pointer()), + operandToTree(memoryFill.value()), + operandToTree(memoryFill.length()) + ); + case PatioMemoryLoad memoryLoad -> treeListIndented( treeIdentifier("memory-load"), diff --git a/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java b/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java index 92119bfb..be12070d 100644 --- a/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java +++ b/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java @@ -2,7 +2,7 @@ package org.shedlang.compiler.patio.instructions; import org.shedlang.compiler.sources.Source; -public sealed interface PatioInstruction permits PatioAllocStack, PatioBlock, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioLoop, PatioLoopBreak, PatioLoopContinue, PatioMemoryLoad, PatioMemoryStore, PatioResume, PatioReturn, PatioReturnVoid, PatioSwitch, PatioThrow, PatioTry, PatioUnreachable, PatioVarLoad, PatioVarStore { +public sealed interface PatioInstruction permits PatioAllocStack, PatioBlock, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioLoop, PatioLoopBreak, PatioLoopContinue, PatioMemoryFill, PatioMemoryLoad, PatioMemoryStore, PatioResume, PatioReturn, PatioReturnVoid, PatioSwitch, PatioThrow, PatioTry, PatioUnreachable, PatioVarLoad, PatioVarStore { boolean isBlockTerminator(); Source source(); } diff --git a/src/main/java/org/shedlang/compiler/patio/instructions/PatioMemoryFill.java b/src/main/java/org/shedlang/compiler/patio/instructions/PatioMemoryFill.java new file mode 100644 index 00000000..3acd9dd7 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/instructions/PatioMemoryFill.java @@ -0,0 +1,20 @@ +package org.shedlang.compiler.patio.instructions; + +import org.shedlang.compiler.patio.operands.PatioOperand; +import org.shedlang.compiler.sources.Source; + +/** + * Fill the {@code length} bytes starting at the address pointed to by + * {@code pointer} with the byte {@code value}. + */ +public record PatioMemoryFill( + PatioOperand pointer, + PatioOperand value, + PatioOperand length, + Source source +) implements PatioInstruction { + @Override + public boolean isBlockTerminator() { + return false; + } +} |
