aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-01-21 19:10:39 +0000
committerMichael Williamson <mike@zwobble.org>2024-01-21 19:10:39 +0000
commit36124bbfe721aedf17089b82fcc433592366ae4e (patch)
tree640b197864343caa03d5e5de75da3f1071032de1 /src/main/java
parent8147341b40ea563e8bdabfab1a71dd9c39d72a7c (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.java41
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java19
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");