diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-01-21 19:17:02 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-01-21 19:17:02 +0000 |
| commit | d6d1411a6f836a5d72bb3ef3c27619569f8b5131 (patch) | |
| tree | e7c603b909f9aa9f63be4d56d5bf6f70d277658b /src/main/java | |
| parent | 36124bbfe721aedf17089b82fcc433592366ae4e (diff) | |
Implement Patio byte-size-of instruction
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java | 55 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java | 14 |
2 files changed, 52 insertions, 17 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 9ce9ad36..2809c16b 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 @@ -309,11 +309,7 @@ public class PatioToLlvm { ) { return switch (patioInstruction) { case PatioAllocHeap patioAllocHeap -> { - var llvmType = patioDataLayoutToLlvmType( - patioAllocHeap.layout(), - context.target() - ); - var sizeResult = sizeOf(llvmType, context); + var sizeResult = sizeOf(patioAllocHeap.layout(), context); var size = sizeResult.value(); context = sizeResult.context(); @@ -383,8 +379,17 @@ public class PatioToLlvm { ); } - case PatioByteSizeOf patioByteSizeOf -> - throw new UnsupportedOperationException("TODO"); + case PatioByteSizeOf patioByteSizeOf -> { + var destinationResult = context.addPatioLocalToLlvmLocal(patioByteSizeOf.destination()); + var destination = destinationResult.value(); + context = destinationResult.context(); + + yield sizeOf( + destination, + patioByteSizeOf.layout(), + context + ); + } case PatioCall patioCall -> { var destination = Optional.<LlvmVariable>empty(); @@ -1355,7 +1360,32 @@ public class PatioToLlvm { }; } - static PatioToLlvmFunctionContext.Result<LlvmOperand> sizeOf( + private static PatioToLlvmFunctionContext.Result<LlvmOperand> sizeOf( + PatioDataLayout layout, + PatioToLlvmFunctionContext context + ) { + var sizeResult = context.allocateLocalName(LlvmCodeGenLocalVariableSpace.SIZE); + var size = sizeResult.value(); + context = sizeResult.context(); + + return sizeOf(size, layout, context).toResult(size); + } + + private static PatioToLlvmFunctionContext sizeOf( + LlvmVariable destination, + PatioDataLayout layout, + PatioToLlvmFunctionContext context + ) { + var llvmType = patioDataLayoutToLlvmType( + layout, + context.target() + ); + + return sizeOf(destination, llvmType, context); + } + + private static PatioToLlvmFunctionContext sizeOf( + LlvmVariable destination, LlvmType type, PatioToLlvmFunctionContext context ) { @@ -1363,10 +1393,6 @@ public class PatioToLlvm { var sizePtr = sizePtrResult.value(); context = sizePtrResult.context(); - var sizeResult = context.allocateLocalName(LlvmCodeGenLocalVariableSpace.SIZE); - var size = sizeResult.value(); - context = sizeResult.context(); - return context .addInstruction( new LlvmGetElementPtr( @@ -1378,12 +1404,11 @@ public class PatioToLlvm { ) .addInstruction( new LlvmPtrToInt( - size, + destination, sizePtr, context.target().patioIntType() ) - ) - .toResult(size); + ); } private static PatioToLlvmFunctionContext.Result<LlvmOperand> offsetOf( 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 3bbbd41c..03cbeee9 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java @@ -230,10 +230,20 @@ public class PatioToWasm { yield context; } + case PatioByteSizeOf patioByteSizeOf -> { + context = context.addInstruction(wasmIntConst( + target.patioIntType(), + sizeOf( + patioByteSizeOf.layout(), + target + ) + )); + var destinationIndex = context.wasmLocalIndex(patioByteSizeOf.destination()); + context = context.addInstruction(new WasmLocalSet(destinationIndex)); - case PatioByteSizeOf patioByteSizeOf -> - throw new UnsupportedOperationException("TODO"); + yield context; + } case PatioCall patioCall -> { for (var patioArg : patioCall.args()) { |
