diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-01-21 19:10:39 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-01-21 19:10:39 +0000 |
| commit | 36124bbfe721aedf17089b82fcc433592366ae4e (patch) | |
| tree | 640b197864343caa03d5e5de75da3f1071032de1 /src/main/java | |
| parent | 8147341b40ea563e8bdabfab1a71dd9c39d72a7c (diff) | |
Implement Patio byte-offset-of instruction
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java | 41 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java | 19 |
2 files changed, 49 insertions, 11 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 fbeaa039..9ce9ad36 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 @@ -370,8 +370,18 @@ public class PatioToLlvm { )); } - case PatioByteOffsetOf patioByteOffsetOf -> - throw new UnsupportedOperationException("TODO"); + case PatioByteOffsetOf patioByteOffsetOf -> { + var destinationResult = context.addPatioLocalToLlvmLocal(patioByteOffsetOf.destination()); + var destination = destinationResult.value(); + context = destinationResult.context(); + + yield offsetOf( + destination, + patioByteOffsetOf.layout(), + patioByteOffsetOf.offset(), + context + ); + } case PatioByteSizeOf patioByteSizeOf -> throw new UnsupportedOperationException("TODO"); @@ -1381,14 +1391,28 @@ public class PatioToLlvm { List<Integer> patioOffset, PatioToLlvmFunctionContext context ) { - var offsetPtrResult = context.allocateLocalName(LlvmCodeGenLocalVariableSpace.OFFSET_PTR); - var offsetPtr = offsetPtrResult.value(); - context = offsetPtrResult.context(); - var offsetResult = context.allocateLocalName(LlvmCodeGenLocalVariableSpace.OFFSET); var offset = offsetResult.value(); context = offsetResult.context(); + return offsetOf( + offset, + patioDataLayout, + patioOffset, + context + ).toResult(offset); + } + + private static PatioToLlvmFunctionContext offsetOf( + LlvmVariable destination, + PatioDataLayout patioDataLayout, + List<Integer> patioOffset, + PatioToLlvmFunctionContext context + ) { + var offsetPtrResult = context.allocateLocalName(LlvmCodeGenLocalVariableSpace.OFFSET_PTR); + var offsetPtr = offsetPtrResult.value(); + context = offsetPtrResult.context(); + return context .addInstruction( new LlvmGetElementPtr( @@ -1403,11 +1427,10 @@ public class PatioToLlvm { ) .addInstruction( new LlvmPtrToInt( - offset, + destination, offsetPtr, context.target().patioIntType() ) - ) - .toResult(offset); + ); } } 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 c140bf92..3bbbd41c 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java @@ -214,8 +214,23 @@ public class PatioToWasm { yield context; } - case PatioByteOffsetOf patioByteOffsetOf -> - throw new UnsupportedOperationException("TODO"); + case PatioByteOffsetOf patioByteOffsetOf -> { + context = context.addInstruction(wasmIntConst( + target.patioIntType(), + offsetOf( + patioByteOffsetOf.layout(), + patioByteOffsetOf.offset(), + target + ) + )); + + var destinationIndex = context.wasmLocalIndex(patioByteOffsetOf.destination()); + context = context.addInstruction(new WasmLocalSet(destinationIndex)); + + yield context; + } + + case PatioByteSizeOf patioByteSizeOf -> throw new UnsupportedOperationException("TODO"); |
