diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-23 16:27:45 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-23 16:27:45 +0100 |
| commit | 805abe0ba33875a0278c4a0c6e8fa76853fbd703 (patch) | |
| tree | cc1957adfe4b3e4168747b8536a321a379bf712c /src/main/java | |
| parent | 121bb5c7e3d141d6baade166e42b58fef7c59c1c (diff) | |
Extract Patio code gen for tuples
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java | 73 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/patio/PatioCodeGenTuples.java | 109 |
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); + } +} |
