aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-23 16:27:45 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-23 16:27:45 +0100
commit805abe0ba33875a0278c4a0c6e8fa76853fbd703 (patch)
treecc1957adfe4b3e4168747b8536a321a379bf712c /src/main/java
parent121bb5c7e3d141d6baade166e42b58fef7c59c1c (diff)
Extract Patio code gen for tuples
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java73
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenTuples.java109
2 files changed, 119 insertions, 63 deletions
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
index da11f1be..684ed468 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java
@@ -6,14 +6,12 @@ import org.shedlang.compiler.patio.ast.instructions.*;
import org.shedlang.compiler.patio.ast.operands.PatioInt;
import org.shedlang.compiler.patio.ast.operands.PatioLocalRef;
import org.shedlang.compiler.patio.ast.operands.PatioOperand;
-import org.shedlang.compiler.patio.ast.types.PatioDataLayouts;
import org.shedlang.compiler.patio.ast.types.PatioTypes;
import org.shedlang.compiler.sources.Source;
import org.shedlang.compiler.sources.Sources;
import org.shedlang.compiler.stackir.StackIrNamespace;
import org.shedlang.compiler.stackir.instructions.*;
import org.shedlang.compiler.types.NamespaceName;
-import org.shedlang.compiler.util.Lists;
import java.util.ArrayList;
import java.util.Collections;
@@ -478,23 +476,7 @@ public class PatioCodeGen {
);
case TupleCreateInstruction tupleCreate -> {
- var tuplePointerResult = context.allocateVal(
- PatioCodeGenLocalSpace.TUPLE_POINTER,
- PatioTypes.DATA_POINTER
- );
- var tuplePointer = tuplePointerResult.value();
- context = tuplePointerResult.context();
-
- var tupleLayout = PatioDataLayouts.struct(Lists.repeat(
- PatioDataLayouts.INT,
- tupleCreate.elementCount()
- ));
-
- context = context.addInstruction(new PatioAllocHeap(
- tuplePointer,
- tupleLayout,
- tupleCreate.source()
- ));
+ var elements = new ArrayList<PatioOperand>();
for (var elementIndex = tupleCreate.elementCount(); elementIndex --> 0;) {
var tupleElementResult = context.allocateVal(
@@ -507,28 +489,15 @@ public class PatioCodeGen {
context = context.temporaryPopIntoLocal(tupleElement, tupleCreate.source());
- context = context.addInstruction(new PatioMemoryStore(
- tuplePointer,
- tupleLayout,
- List.of(elementIndex),
- tupleElement,
- tupleCreate.source()
- ));
+ elements.add(tupleElement);
}
- var tupleResult = context.allocateVal(
- PatioCodeGenLocalSpace.TUPLE,
- PatioCodeGenTypes.VALUE_TYPE
- );
+ Collections.reverse(elements);
+
+ var tupleResult = PatioCodeGenTuples.create(elements, tupleCreate.source(), context);
var tuple = tupleResult.value();
context = tupleResult.context();
- context = context.addInstruction(new PatioDataPtrToInt(
- tuple,
- tuplePointer,
- tupleCreate.source()
- ));
-
yield context.temporaryPush(tuple);
}
@@ -537,38 +506,16 @@ public class PatioCodeGen {
var tuple = tupleResult.value();
context = tupleResult.context();
- var tuplePointerResult = context.allocateVal(
- PatioCodeGenLocalSpace.TUPLE,
- PatioTypes.DATA_POINTER
- );
- var tuplePointer = tuplePointerResult.value();
- context = tuplePointerResult.context();
-
- context = context.addInstruction(new PatioIntToDataPtr(
- tuplePointer,
+ var targetResult = PatioCodeGenTuples.get(
tuple,
- tupleGet.source()
- ));
-
- var targetResult = context.allocateVal(
- PatioCodeGenLocalSpace.TUPLE_ELEMENT,
- Integer.toString(tupleGet.elementIndex()),
- PatioCodeGenTypes.VALUE_TYPE
+ tupleGet.elementIndex(),
+ tupleGet.elementCount(),
+ tupleGet.source(),
+ context
);
var target = targetResult.value();
context = targetResult.context();
- context = context.addInstruction(new PatioMemoryLoad(
- target,
- tuplePointer,
- PatioDataLayouts.struct(Lists.repeat(
- PatioDataLayouts.INT,
- tupleGet.elementCount()
- )),
- List.of(tupleGet.elementIndex()),
- tupleGet.source()
- ));
-
yield context.temporaryPush(target);
}
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenTuples.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenTuples.java
new file mode 100644
index 00000000..5cf08c98
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenTuples.java
@@ -0,0 +1,109 @@
+package org.shedlang.compiler.patio;
+
+import org.shedlang.compiler.patio.ast.instructions.*;
+import org.shedlang.compiler.patio.ast.operands.PatioLocalRef;
+import org.shedlang.compiler.patio.ast.operands.PatioOperand;
+import org.shedlang.compiler.patio.ast.types.PatioDataLayouts;
+import org.shedlang.compiler.patio.ast.types.PatioTypes;
+import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.util.Lists;
+
+import java.util.List;
+
+public class PatioCodeGenTuples {
+ private PatioCodeGenTuples() {
+ }
+
+ public static PatioCodeGenResult<PatioLocalRef> create(
+ List<PatioOperand> elements,
+ Source source,
+ PatioCodeGenContext context
+ ) {
+ var tuplePointerResult = context.allocateVal(
+ PatioCodeGenLocalSpace.TUPLE_POINTER,
+ PatioTypes.DATA_POINTER
+ );
+ var tuplePointer = tuplePointerResult.value();
+ context = tuplePointerResult.context();
+
+ var tupleLayout = PatioDataLayouts.struct(Lists.repeat(
+ PatioDataLayouts.INT,
+ elements.size()
+ ));
+
+ context = context.addInstruction(new PatioAllocHeap(
+ tuplePointer,
+ tupleLayout,
+ source
+ ));
+
+ for (var elementIndex = 0; elementIndex < elements.size(); elementIndex++) {
+ var element = elements.get(elementIndex);
+
+ context = context.addInstruction(new PatioMemoryStore(
+ tuplePointer,
+ tupleLayout,
+ List.of(elementIndex),
+ element,
+ source
+ ));
+ }
+
+ var tupleResult = context.allocateVal(
+ PatioCodeGenLocalSpace.TUPLE,
+ PatioCodeGenTypes.VALUE_TYPE
+ );
+ var tuple = tupleResult.value();
+ context = tupleResult.context();
+
+ context = context.addInstruction(new PatioDataPtrToInt(
+ tuple,
+ tuplePointer,
+ source
+ ));
+
+ return context.toResult(tuple);
+ }
+
+ public static PatioCodeGenResult<PatioLocalRef> get(
+ PatioOperand tuple,
+ int elementIndex,
+ int elementCount,
+ Source source,
+ PatioCodeGenContext context
+ ) {
+ var tuplePointerResult = context.allocateVal(
+ PatioCodeGenLocalSpace.TUPLE,
+ PatioTypes.DATA_POINTER
+ );
+ var tuplePointer = tuplePointerResult.value();
+ context = tuplePointerResult.context();
+
+ context = context.addInstruction(new PatioIntToDataPtr(
+ tuplePointer,
+ tuple,
+ source
+ ));
+
+ var targetResult = context.allocateVal(
+ PatioCodeGenLocalSpace.TUPLE_ELEMENT,
+ Integer.toString(elementIndex),
+ PatioCodeGenTypes.VALUE_TYPE
+ );
+ var target = targetResult.value();
+ context = targetResult.context();
+
+ context = context.addInstruction(new PatioMemoryLoad(
+ target,
+ tuplePointer,
+ PatioDataLayouts.struct(Lists.repeat(
+ PatioDataLayouts.INT,
+ elementCount
+ )),
+ List.of(elementIndex),
+ source
+ ));
+
+ return context.toResult(target);
+ }
+}