aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-01-21 19:17:02 +0000
committerMichael Williamson <mike@zwobble.org>2024-01-21 19:17:02 +0000
commitd6d1411a6f836a5d72bb3ef3c27619569f8b5131 (patch)
treee7c603b909f9aa9f63be4d56d5bf6f70d277658b /src/main/java
parent36124bbfe721aedf17089b82fcc433592366ae4e (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.java55
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java14
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()) {