From f1251be8fb464674ef0b5ffeb645a9aab872da88 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 28 Jan 2024 17:47:06 +0000 Subject: Add memory-fill instruction to Patio --- .../compiler/backends/llvm/codegen/PatioToLlvm.java | 4 ++++ .../shedlang/compiler/backends/wasm/PatioToWasm.java | 4 ++++ .../org/shedlang/compiler/patio/PatioSerializer.java | 8 ++++++++ .../patio/instructions/PatioInstruction.java | 2 +- .../compiler/patio/instructions/PatioMemoryFill.java | 20 ++++++++++++++++++++ 5 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/shedlang/compiler/patio/instructions/PatioMemoryFill.java (limited to 'src/main/java') 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; + } +} -- cgit v1.2.3