From 0336b18a626eb621b7da79deb09f05c8dbc4156c Mon Sep 17 00:00:00 2001 From: jespergravgaard <jesper@balmangravgaard.dk> Date: Wed, 5 Feb 2020 00:45:08 +0100 Subject: [PATCH] Working on new ValueSource based unwinding! A few __ptr__ problems in test outputs remain. --- .../model/StructVariableMemberUnwinding.java | 8 +- .../kickc/passes/Pass1UnwindStructValues.java | 38 +- .../kickc/passes/unwinding/ValueSource.java | 4 +- .../passes/unwinding/ValueSourceConstant.java | 4 +- .../ValueSourcePointerDereferenceIndexed.java | 101 +++++ .../ValueSourcePointerDereferenceSimple.java | 123 ++---- ...Variable.java => ValueSourceVariable.java} | 27 +- .../passes/unwinding/ValueSourceZero.java | 9 +- .../ref/complex/clearscreen/clearscreen.log | 2 +- .../ref/complex/splines/truetype-splines.cfg | 20 +- .../ref/complex/splines/truetype-splines.log | 414 ++++++++---------- .../ref/complex/splines/truetype-splines.sym | 12 +- src/test/ref/struct-19.log | 8 +- src/test/ref/struct-20.log | 4 +- src/test/ref/struct-35.log | 2 +- src/test/ref/struct-39.asm | 2 +- src/test/ref/struct-39.cfg | 4 +- src/test/ref/struct-39.log | 69 ++- src/test/ref/struct-39.sym | 4 +- src/test/ref/struct-41.log | 4 +- src/test/ref/struct-42.log | 2 +- src/test/ref/struct-8.log | 17 +- src/test/ref/struct-9.log | 24 +- src/test/ref/struct-9.sym | 1 + src/test/ref/struct-ptr-10.log | 2 +- src/test/ref/struct-ptr-11.log | 2 +- src/test/ref/struct-ptr-18.log | 4 +- src/test/ref/struct-ptr-9.log | 2 +- 28 files changed, 468 insertions(+), 445 deletions(-) create mode 100644 src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceIndexed.java rename src/main/java/dk/camelot64/kickc/passes/unwinding/{ValueSourceStructVariable.java => ValueSourceVariable.java} (72%) diff --git a/src/main/java/dk/camelot64/kickc/model/StructVariableMemberUnwinding.java b/src/main/java/dk/camelot64/kickc/model/StructVariableMemberUnwinding.java index 9e65ec547..e8d591200 100644 --- a/src/main/java/dk/camelot64/kickc/model/StructVariableMemberUnwinding.java +++ b/src/main/java/dk/camelot64/kickc/model/StructVariableMemberUnwinding.java @@ -52,7 +52,7 @@ public class StructVariableMemberUnwinding { StructDefinition structDefinition; /** Maps member names to the unwound variables. */ - Map<String, RValue> memberUnwinding; + Map<String, SymbolVariableRef> memberUnwinding; public VariableUnwinding(StructDefinition structDefinition) { this.structDefinition = structDefinition; @@ -60,7 +60,7 @@ public class StructVariableMemberUnwinding { } /** Set how a member variable was unwound to a specific (new) variable. */ - public void setMemberUnwinding(String memberName, RValue memberVariableUnwound) { + public void setMemberUnwinding(String memberName, SymbolVariableRef memberVariableUnwound) { this.memberUnwinding.put(memberName, memberVariableUnwound); } @@ -68,6 +68,10 @@ public class StructVariableMemberUnwinding { return new ArrayList<>(memberUnwinding.keySet()); } + public SymbolVariableRef getMemberUnwound(String memberName) { + return memberUnwinding.get(memberName); + } + @Override public RValueUnwinding getMemberUnwinding(String memberName, ProgramScope programScope) { return new RValueUnwinding() { diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java index 813fb7f40..0e6bb347b 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java @@ -225,11 +225,12 @@ public class Pass1UnwindStructValues extends Pass1Base { // Check for bulk assignable values if(isBulkAssignable(lValue) && isBulkAssignable(rValue)) { - RValueUnwinding lValueUnwinding = getValueUnwinding(lValue, assignment, stmtIt, currentBlock); - RValueUnwinding rValueUnwinding = getValueUnwinding(rValue, assignment, stmtIt, currentBlock); - unwindAssignment(lValueUnwinding, rValueUnwinding, null, stmtIt, initialAssignment, source); - stmtIt.remove(); - return true; + throw new InternalError("E!"); + //RValueUnwinding lValueUnwinding = getValueUnwinding(lValue, assignment, stmtIt, currentBlock); + //RValueUnwinding rValueUnwinding = getValueUnwinding(rValue, assignment, stmtIt, currentBlock); + //unwindAssignment(lValueUnwinding, rValueUnwinding, null, stmtIt, initialAssignment, source); + //stmtIt.remove(); + //return true; } // Check for struct unwinding @@ -268,7 +269,7 @@ public class Pass1UnwindStructValues extends Pass1Base { } private boolean copyValues(ValueSource lValueSource, ValueSource rValueSource, List<RValue> lValueUnwoundList, boolean initialAssignment, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) { - if(lValueSource==null || rValueSource==null) + if(lValueSource == null || rValueSource == null) return false; if(lValueSource.isSimple() && rValueSource.isSimple()) { stmtIt.previous(); @@ -299,8 +300,8 @@ public class Pass1UnwindStructValues extends Pass1Base { } else if(lValueSource.isUnwindable() && rValueSource.isUnwindable()) { getLog().append("Unwinding value copy " + currentStmt.toString(getProgram(), false)); for(String memberName : lValueSource.getMemberNames(getScope())) { - ValueSource lValueSubSource = lValueSource.getMemberUnwinding(memberName, getScope(), currentStmt, currentBlock, stmtIt); - ValueSource rValueSubSource = rValueSource.getMemberUnwinding(memberName, getScope(), currentStmt, currentBlock, stmtIt); + ValueSource lValueSubSource = lValueSource.getMemberUnwinding(memberName, getProgram(), getScope(), currentStmt, currentBlock, stmtIt); + ValueSource rValueSubSource = rValueSource.getMemberUnwinding(memberName, getProgram(), getScope(), currentStmt, currentBlock, stmtIt); boolean success = copyValues(lValueSubSource, rValueSubSource, lValueUnwoundList, initialAssignment, currentStmt, currentBlock, stmtIt); if(!success) throw new InternalError("Error during value unwinding copy! ", currentStmt); @@ -312,6 +313,7 @@ public class Pass1UnwindStructValues extends Pass1Base { /** * Get a value source for copying a value + * * @param value The value being copied * @param currentStmt The current statement * @param stmtIt The statement iterator @@ -321,14 +323,24 @@ public class Pass1UnwindStructValues extends Pass1Base { private ValueSource getValueSource(Value value, Statement currentStmt, ListIterator<Statement> stmtIt, ControlFlowBlock currentBlock) { if(value instanceof VariableRef) { Variable variable = getScope().getVariable((VariableRef) value); - if(variable.isStructClassic()) { - return new ValueSourceStructVariable(variable); + if(variable.getType() instanceof SymbolTypeStruct) { + return new ValueSourceVariable(variable); } } if(value instanceof StructZero) return new ValueSourceZero(((StructZero) value).getTypeStruct(), null); if(value instanceof ConstantStructValue) return new ValueSourceConstant(((ConstantStructValue) value).getType(getScope()), null, (ConstantStructValue) value); + if(value instanceof PointerDereferenceSimple) + return new ValueSourcePointerDereferenceSimple((PointerDereferenceSimple) value, SymbolTypeInference.inferType(getScope(), (RValue) value), null); + if(value instanceof PointerDereferenceIndexed) + return new ValueSourcePointerDereferenceIndexed((PointerDereferenceIndexed) value, SymbolTypeInference.inferType(getScope(), (RValue) value), null); + if(value instanceof StructMemberRef) { + final RValue structValue = ((StructMemberRef) value).getStruct(); + final ValueSource structValueSource = getValueSource(structValue, currentStmt, stmtIt, currentBlock); + final ValueSource structMemberSource = structValueSource.getMemberUnwinding(((StructMemberRef) value).getMemberName(), getProgram(), getScope(), currentStmt, currentBlock, stmtIt); + return structMemberSource; + } return null; } @@ -431,7 +443,7 @@ public class Pass1UnwindStructValues extends Pass1Base { final PointerDereferenceIndexed structPointerDerefIdx = (PointerDereferenceIndexed) structMemberRef.getStruct(); final SymbolType structPointerType = SymbolTypeInference.inferType(getScope(), structPointerDerefIdx); if(!(structPointerType instanceof SymbolTypeStruct)) - throw new CompileError("Value is not a struct"+structPointerDerefIdx.toString(getProgram()), currentStmt); + throw new CompileError("Value is not a struct" + structPointerDerefIdx.toString(getProgram()), currentStmt); final StructDefinition structDefinition = ((SymbolTypeStruct) structPointerType).getStructDefinition(getScope()); final String memberName = structMemberRef.getMemberName(); @@ -483,7 +495,7 @@ public class Pass1UnwindStructValues extends Pass1Base { return new StructUnwindingVariable(variable, structDefinition); } } else if(value instanceof StructMemberRef && ((StructMemberRef) value).getStruct() instanceof VariableRef) { - getLog().append("Postponing unwinding for "+currentStmt.toString(getProgram(), false)); + getLog().append("Postponing unwinding for " + currentStmt.toString(getProgram(), false)); return POSTPONE_UNWINDING; } else if(value instanceof PointerDereferenceSimple) { return new StructUnwindingPointerDerefSimple((PointerDereferenceSimple) value, structDefinition, stmtIt, currentBlock, currentStmt); @@ -491,7 +503,7 @@ public class Pass1UnwindStructValues extends Pass1Base { return new StructUnwindingPointerDerefIndexed((PointerDereferenceIndexed) value, structDefinition, stmtIt, currentBlock, currentStmt); } else if(value instanceof StructMemberRef && ((StructMemberRef) value).getStruct() instanceof PointerDereferenceIndexed) { final StructMemberRef structMemberRef = (StructMemberRef) value; - return new StructUnwindingMemberOfPointerDerefIndexed((PointerDereferenceIndexed) structMemberRef.getStruct(),structMemberRef.getMemberName(), structDefinition, stmtIt, currentBlock, currentStmt); + return new StructUnwindingMemberOfPointerDerefIndexed((PointerDereferenceIndexed) structMemberRef.getStruct(), structMemberRef.getMemberName(), structDefinition, stmtIt, currentBlock, currentStmt); } else if(value instanceof ConstantStructValue) { return new StructUnwindingConstant((ConstantStructValue) value, structDefinition); } else if(value instanceof StructZero) { diff --git a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSource.java b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSource.java index c8bb5e233..40c27afa8 100644 --- a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSource.java +++ b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSource.java @@ -1,6 +1,7 @@ package dk.camelot64.kickc.passes.unwinding; import dk.camelot64.kickc.model.ControlFlowBlock; +import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.statements.Statement; import dk.camelot64.kickc.model.symbols.ArraySpec; import dk.camelot64.kickc.model.symbols.ProgramScope; @@ -80,12 +81,13 @@ public interface ValueSource { * Get a sub value source for one member to use for copying that member. * * @param memberName The member name + * @param program * @param programScope The program scope * @param currentStmt * @param currentBlock * @param stmtIt * @return The unwinding of the member */ - ValueSource getMemberUnwinding(String memberName, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt); + ValueSource getMemberUnwinding(String memberName, Program program, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt); } diff --git a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceConstant.java b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceConstant.java index 3f31d20b2..b684a79de 100644 --- a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceConstant.java +++ b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceConstant.java @@ -1,7 +1,7 @@ package dk.camelot64.kickc.passes.unwinding; import dk.camelot64.kickc.model.ControlFlowBlock; -import dk.camelot64.kickc.model.operators.OperatorSizeOf; +import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.statements.Statement; import dk.camelot64.kickc.model.symbols.*; import dk.camelot64.kickc.model.types.SymbolType; @@ -44,7 +44,7 @@ public class ValueSourceConstant extends ValueSourceBase { } @Override - public ValueSource getMemberUnwinding(String memberName, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) { + public ValueSource getMemberUnwinding(String memberName, Program program, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) { StructDefinition structDefinition = ((SymbolTypeStruct) getSymbolType()).getStructDefinition(programScope); ConstantStructValue constantStructValue = (ConstantStructValue) value; final Variable member = structDefinition.getMember(memberName); diff --git a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceIndexed.java b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceIndexed.java new file mode 100644 index 000000000..23721c08f --- /dev/null +++ b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceIndexed.java @@ -0,0 +1,101 @@ +package dk.camelot64.kickc.passes.unwinding; + +import dk.camelot64.kickc.model.ControlFlowBlock; +import dk.camelot64.kickc.model.InternalError; +import dk.camelot64.kickc.model.Program; +import dk.camelot64.kickc.model.operators.Operators; +import dk.camelot64.kickc.model.statements.Statement; +import dk.camelot64.kickc.model.statements.StatementAssignment; +import dk.camelot64.kickc.model.symbols.*; +import dk.camelot64.kickc.model.types.SymbolType; +import dk.camelot64.kickc.model.types.SymbolTypePointer; +import dk.camelot64.kickc.model.types.SymbolTypeStruct; +import dk.camelot64.kickc.model.values.*; +import dk.camelot64.kickc.passes.PassNStructPointerRewriting; + +import java.util.ListIterator; + +/** Unwinding for a indexed pointer deref. */ +public class ValueSourcePointerDereferenceIndexed extends ValueSourceBase { + + private final PointerDereferenceIndexed pointerDereferenceIndexed; + /** The type of the value. */ + private SymbolType valueType; + /** The array spec of the value. */ + private final ArraySpec valueArraySpec; + + public ValueSourcePointerDereferenceIndexed(PointerDereferenceIndexed pointerDereferenceIndexed, SymbolType valueType, ArraySpec valueArraySpec) { + this.pointerDereferenceIndexed = pointerDereferenceIndexed; + this.valueType = valueType; + this.valueArraySpec = valueArraySpec; + } + + @Override + public SymbolType getSymbolType() { + return valueType; + } + + @Override + public ArraySpec getArraySpec() { + return valueArraySpec; + } + + @Override + protected boolean isStructClassic() { + return getSymbolType() instanceof SymbolTypeStruct; + } + + @Override + public RValue getSimpleValue(ProgramScope programScope) { + if(getArraySpec() != null) { + // For arrays return the pointer to the array - not the deref + //return pointerDereferenceIndexed.getPointer(); + // Maybe return pointer + index ? + throw new InternalError("Not implemented! "); + } else { + return pointerDereferenceIndexed; + } + } + + @Override + public LValue getBulkLValue(ProgramScope scope) { + return pointerDereferenceIndexed; + } + + @Override + public RValue getBulkRValue(ProgramScope scope) { + return new MemcpyValue(pointerDereferenceIndexed, getByteSize(scope), getSymbolType()); + } + + @Override + public ValueSource getMemberUnwinding(String memberName, Program program, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) { + StructDefinition structDefinition = ((SymbolTypeStruct) getSymbolType()).getStructDefinition(programScope); + final SymbolType memberType = structDefinition.getMember(memberName).getType(); + final ArraySpec memberArraySpec = structDefinition.getMember(memberName).getArraySpec(); + ConstantRef memberOffsetConstant = PassNStructPointerRewriting.getMemberOffsetConstant(programScope, structDefinition, memberName); + // Simple member value - unwind to value of member *((type*)&struct + OFFSET_MEMBER) + final RValue structPointer = pointerDereferenceIndexed.getPointer(); + if(structPointer instanceof ConstantValue) { + // Pointer to member type + ConstantCastValue structTypedPointer = new ConstantCastValue(new SymbolTypePointer(memberType), (ConstantValue) structPointer); + // Calculate member address (type*)&struct + OFFSET_MEMBER + ConstantBinary memberPointer = new ConstantBinary(structTypedPointer, Operators.PLUS, memberOffsetConstant); + // Unwind to *((type*)&struct + OFFSET_MEMBER) + PointerDereferenceIndexed memberDeref = new PointerDereferenceIndexed(memberPointer, pointerDereferenceIndexed.getIndex()); + return new ValueSourcePointerDereferenceIndexed(memberDeref, memberType, memberArraySpec); + } else { + Scope scope = programScope.getScope(currentBlock.getScope()); + Variable memberAddress = scope.addVariableIntermediate(); + memberAddress.setType(new SymbolTypePointer(memberType)); + CastValue structTypedPointer = new CastValue(new SymbolTypePointer(memberType), structPointer); + // Add statement $1 = (memberType*)ptr_struct + OFFSET_MEMBER + stmtIt.previous(); + stmtIt.add(new StatementAssignment((LValue) memberAddress.getRef(), structTypedPointer, Operators.PLUS, memberOffsetConstant, true, currentStmt.getSource(), currentStmt.getComments())); + stmtIt.next(); + // Unwind to *((memberType*)ptr_struct+OFFSET_MEMBER) + PointerDereferenceIndexed memberDeref = new PointerDereferenceIndexed(memberAddress.getRef(), pointerDereferenceIndexed.getIndex()); + return new ValueSourcePointerDereferenceIndexed(memberDeref, memberType, memberArraySpec); + } + } + +} diff --git a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceSimple.java b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceSimple.java index e3591b29f..1011ce31f 100644 --- a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceSimple.java +++ b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourcePointerDereferenceSimple.java @@ -1,7 +1,7 @@ package dk.camelot64.kickc.passes.unwinding; import dk.camelot64.kickc.model.ControlFlowBlock; -import dk.camelot64.kickc.model.operators.OperatorSizeOf; +import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.operators.Operators; import dk.camelot64.kickc.model.statements.Statement; import dk.camelot64.kickc.model.statements.StatementAssignment; @@ -12,13 +12,10 @@ import dk.camelot64.kickc.model.types.SymbolTypeStruct; import dk.camelot64.kickc.model.values.*; import dk.camelot64.kickc.passes.PassNStructPointerRewriting; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; import java.util.ListIterator; /** Value Source for a pointer dereference. */ -public class ValueSourcePointerDereferenceSimple implements ValueSource { +public class ValueSourcePointerDereferenceSimple extends ValueSourceBase { /** The pointer dereference. */ private final PointerDereferenceSimple pointerDereference; @@ -44,91 +41,53 @@ public class ValueSourcePointerDereferenceSimple implements ValueSource { } @Override - public boolean isSimple() { - return getArraySpec() == null && !(getSymbolType() instanceof SymbolTypeStruct); - } - - @Override - public RValue getSimpleValue(ProgramScope programScope) { - if(getArraySpec() != null) { - // For arrays return the pointer to the array - not the deref - return pointerDereference.getPointer(); - } else { - return pointerDereference; - } - } - - @Override - public boolean isBulkCopyable() { - return getArraySpec() != null || getSymbolType() instanceof SymbolTypeStruct; - } - - @Override - public LValue getBulkLValue(ProgramScope scope) { - RValue memberArrayPointer = pointerDereference.getPointer(); - return new PointerDereferenceSimple(memberArrayPointer); - } - - private ConstantValue getByteSize(ProgramScope scope) { - return getArraySpec() != null ? getArraySpec().getArraySize() : OperatorSizeOf.getSizeOfConstantVar(scope, getSymbolType()); - } - - @Override - public RValue getBulkRValue(ProgramScope scope) { - RValue memberArrayPointer = pointerDereference.getPointer(); - return new MemcpyValue(new PointerDereferenceSimple(memberArrayPointer), getByteSize(scope), getSymbolType()); - } - - @Override - public boolean isUnwindable() { + protected boolean isStructClassic() { return getSymbolType() instanceof SymbolTypeStruct; } @Override - public List<String> getMemberNames(ProgramScope scope) { - if(getSymbolType() instanceof SymbolTypeStruct) { - StructDefinition structDefinition = ((SymbolTypeStruct) getSymbolType()).getStructDefinition(scope); - Collection<Variable> structMemberVars = structDefinition.getAllVars(false); - ArrayList<String> memberNames = new ArrayList<>(); - for(Variable structMemberVar : structMemberVars) { - memberNames.add(structMemberVar.getLocalName()); - } - return memberNames; - } else { - return null; - } + public RValue getSimpleValue(ProgramScope programScope) { + return pointerDereference; } @Override - public ValueSource getMemberUnwinding(String memberName, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) { - if(getSymbolType() instanceof SymbolTypeStruct) { - StructDefinition structDefinition = ((SymbolTypeStruct) getSymbolType()).getStructDefinition(programScope); - final SymbolType memberType = structDefinition.getMember(memberName).getType(); - final ArraySpec memberArraySpec = structDefinition.getMember(memberName).getArraySpec(); - ConstantRef memberOffsetConstant = PassNStructPointerRewriting.getMemberOffsetConstant(programScope, structDefinition, memberName); - // Simple member value - unwind to value of member *((type*)&struct + OFFSET_MEMBER) - final RValue structPointer = pointerDereference.getPointer(); - if(structPointer instanceof ConstantValue) { - // Pointer to member type - ConstantCastValue structTypedPointer = new ConstantCastValue(new SymbolTypePointer(memberType), (ConstantValue) structPointer); - // Calculate member address (type*)&struct + OFFSET_MEMBER - ConstantBinary memberPointer = new ConstantBinary(structTypedPointer, Operators.PLUS, memberOffsetConstant); - // Unwind to *((type*)&struct + OFFSET_MEMBER) - PointerDereferenceSimple memberDeref = new PointerDereferenceSimple(memberPointer); - return new ValueSourcePointerDereferenceSimple(memberDeref, memberType, memberArraySpec); - } else { - Scope scope = programScope.getScope(currentBlock.getScope()); - Variable memberAddress = scope.addVariableIntermediate(); - memberAddress.setType(new SymbolTypePointer(memberType)); - CastValue structTypedPointer = new CastValue(new SymbolTypePointer(memberType), structPointer); - // Add statement $1 = (memberType*)ptr_struct + OFFSET_MEMBER - stmtIt.add(new StatementAssignment((LValue) memberAddress.getRef(), structTypedPointer, Operators.PLUS, memberOffsetConstant, true, currentStmt.getSource(), currentStmt.getComments())); - // Unwind to *((memberType*)ptr_struct+OFFSET_MEMBER) - PointerDereferenceSimple memberDeref = new PointerDereferenceSimple(memberAddress.getRef()); - return new ValueSourcePointerDereferenceSimple(memberDeref, memberType, memberArraySpec); - } + public LValue getBulkLValue(ProgramScope scope) { + return pointerDereference; + } + + @Override + public RValue getBulkRValue(ProgramScope scope) { + return new MemcpyValue(pointerDereference, getByteSize(scope), getSymbolType()); + } + + @Override + public ValueSource getMemberUnwinding(String memberName, Program program, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) { + StructDefinition structDefinition = ((SymbolTypeStruct) getSymbolType()).getStructDefinition(programScope); + final SymbolType memberType = structDefinition.getMember(memberName).getType(); + final ArraySpec memberArraySpec = structDefinition.getMember(memberName).getArraySpec(); + ConstantRef memberOffsetConstant = PassNStructPointerRewriting.getMemberOffsetConstant(programScope, structDefinition, memberName); + // Simple member value - unwind to value of member *((type*)&struct + OFFSET_MEMBER) + final RValue structPointer = pointerDereference.getPointer(); + if(structPointer instanceof ConstantValue) { + // Pointer to member type + ConstantCastValue structTypedPointer = new ConstantCastValue(new SymbolTypePointer(memberType), (ConstantValue) structPointer); + // Calculate member address (type*)&struct + OFFSET_MEMBER + ConstantBinary memberPointer = new ConstantBinary(structTypedPointer, Operators.PLUS, memberOffsetConstant); + // Unwind to *((type*)&struct + OFFSET_MEMBER) + PointerDereferenceSimple memberDeref = new PointerDereferenceSimple(memberPointer); + return new ValueSourcePointerDereferenceSimple(memberDeref, memberType, memberArraySpec); } else { - return null; + Scope scope = programScope.getScope(currentBlock.getScope()); + Variable memberAddress = scope.addVariableIntermediate(); + memberAddress.setType(new SymbolTypePointer(memberType)); + CastValue structTypedPointer = new CastValue(new SymbolTypePointer(memberType), structPointer); + // Add statement $1 = (memberType*)ptr_struct + OFFSET_MEMBER + stmtIt.previous(); + stmtIt.add(new StatementAssignment((LValue) memberAddress.getRef(), structTypedPointer, Operators.PLUS, memberOffsetConstant, true, currentStmt.getSource(), currentStmt.getComments())); + stmtIt.next(); + // Unwind to *((memberType*)ptr_struct+OFFSET_MEMBER) + PointerDereferenceSimple memberDeref = new PointerDereferenceSimple(memberAddress.getRef()); + return new ValueSourcePointerDereferenceSimple(memberDeref, memberType, memberArraySpec); } } } diff --git a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceStructVariable.java b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceVariable.java similarity index 72% rename from src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceStructVariable.java rename to src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceVariable.java index d0f4d60bd..7fc09b705 100644 --- a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceStructVariable.java +++ b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceVariable.java @@ -1,7 +1,9 @@ package dk.camelot64.kickc.passes.unwinding; import dk.camelot64.kickc.model.ControlFlowBlock; -import dk.camelot64.kickc.model.operators.OperatorSizeOf; +import dk.camelot64.kickc.model.InternalError; +import dk.camelot64.kickc.model.Program; +import dk.camelot64.kickc.model.StructVariableMemberUnwinding; import dk.camelot64.kickc.model.operators.Operators; import dk.camelot64.kickc.model.statements.Statement; import dk.camelot64.kickc.model.symbols.ArraySpec; @@ -14,18 +16,15 @@ import dk.camelot64.kickc.model.types.SymbolTypeStruct; import dk.camelot64.kickc.model.values.*; import dk.camelot64.kickc.passes.PassNStructPointerRewriting; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; import java.util.ListIterator; /** Value Source for a variable */ -public class ValueSourceStructVariable extends ValueSourceBase { +public class ValueSourceVariable extends ValueSourceBase { /** The variable. */ private final Variable variable; - public ValueSourceStructVariable(Variable variable) { + public ValueSourceVariable(Variable variable) { this.variable = variable; } @@ -46,7 +45,9 @@ public class ValueSourceStructVariable extends ValueSourceBase { @Override public RValue getSimpleValue(ProgramScope programScope) { - return new ConstantSymbolPointer(variable.getRef()); + // Historically this returned a pointer - why? + //return new ConstantSymbolPointer(variable.getRef()); + return variable.getRef(); } @Override @@ -63,8 +64,8 @@ public class ValueSourceStructVariable extends ValueSourceBase { } @Override - public ValueSource getMemberUnwinding(String memberName, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) { - if(getSymbolType() instanceof SymbolTypeStruct) { + public ValueSource getMemberUnwinding(String memberName, Program program, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) { + if(variable.isStructClassic()) { StructDefinition structDefinition = ((SymbolTypeStruct) getSymbolType()).getStructDefinition(programScope); final SymbolType memberType = structDefinition.getMember(memberName).getType(); final ArraySpec memberArraySpec = structDefinition.getMember(memberName).getArraySpec(); @@ -78,8 +79,14 @@ public class ValueSourceStructVariable extends ValueSourceBase { // Unwind to *((type*)&struct + OFFSET_MEMBER) PointerDereferenceSimple memberDeref = new PointerDereferenceSimple(memberPointer); return new ValueSourcePointerDereferenceSimple(memberDeref, memberType, memberArraySpec); + } else if(variable.isStructUnwind()) { + StructVariableMemberUnwinding structVariableMemberUnwinding = program.getStructVariableMemberUnwinding(); + final StructVariableMemberUnwinding.VariableUnwinding variableUnwinding = structVariableMemberUnwinding.getVariableUnwinding(variable.getRef()); + final SymbolVariableRef memberUnwound = variableUnwinding.getMemberUnwound(memberName); + final Variable memberVariable = programScope.getVar(memberUnwound); + return new ValueSourceVariable(memberVariable); } else { - return null; + throw new InternalError("Not implemented!"); } } diff --git a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceZero.java b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceZero.java index d22b8637a..c85cf9de4 100644 --- a/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceZero.java +++ b/src/main/java/dk/camelot64/kickc/passes/unwinding/ValueSourceZero.java @@ -3,22 +3,17 @@ package dk.camelot64.kickc.passes.unwinding; import dk.camelot64.kickc.model.ControlFlowBlock; import dk.camelot64.kickc.model.Initializers; import dk.camelot64.kickc.model.InternalError; -import dk.camelot64.kickc.model.operators.OperatorSizeOf; +import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.statements.Statement; import dk.camelot64.kickc.model.symbols.ArraySpec; import dk.camelot64.kickc.model.symbols.ProgramScope; import dk.camelot64.kickc.model.symbols.StructDefinition; -import dk.camelot64.kickc.model.symbols.Variable; import dk.camelot64.kickc.model.types.SymbolType; import dk.camelot64.kickc.model.types.SymbolTypeStruct; -import dk.camelot64.kickc.model.values.ConstantValue; import dk.camelot64.kickc.model.values.LValue; import dk.camelot64.kickc.model.values.MemsetValue; import dk.camelot64.kickc.model.values.RValue; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; import java.util.ListIterator; /** Value Source for a zero value. */ @@ -53,7 +48,7 @@ public class ValueSourceZero extends ValueSourceBase { } @Override - public ValueSource getMemberUnwinding(String memberName, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) { + public ValueSource getMemberUnwinding(String memberName, Program program, ProgramScope programScope, Statement currentStmt, ControlFlowBlock currentBlock, ListIterator<Statement> stmtIt) { StructDefinition structDefinition = ((SymbolTypeStruct) getSymbolType()).getStructDefinition(programScope); final SymbolType memberType = structDefinition.getMember(memberName).getType(); final ArraySpec memberArraySpec = structDefinition.getMember(memberName).getArraySpec(); diff --git a/src/test/ref/complex/clearscreen/clearscreen.log b/src/test/ref/complex/clearscreen/clearscreen.log index 2c0609aaa..8237159b5 100644 --- a/src/test/ref/complex/clearscreen/clearscreen.log +++ b/src/test/ref/complex/clearscreen/clearscreen.log @@ -42,7 +42,7 @@ Created struct value member variable (byte) startProcessing::center_y Created struct value member variable (byte) startProcessing::center_dist Converted struct value to member variables (struct ProcessingChar) startProcessing::center Converted procedure struct value parameter to member unwinding (void()) startProcessing((byte) startProcessing::center_x , (byte) startProcessing::center_y , (byte) startProcessing::center_dist) -Adding struct value member variable copy *((const struct ProcessingSprite*) PROCESSING + (byte~) main::$10) ← memcpy(*(&(const struct ProcessingSprite) $2), struct ProcessingSprite, (const byte) SIZEOF_STRUCT_PROCESSINGSPRITE) +Adding value bulk copy *((const struct ProcessingSprite*) PROCESSING + (byte~) main::$10) ← memcpy(*(&(const struct ProcessingSprite) $2), struct ProcessingSprite, (const byte) SIZEOF_STRUCT_PROCESSINGSPRITE) Converted procedure call LValue to member unwinding { (byte~) main::$5_x, (byte~) main::$5_y, (byte~) main::$5_dist } ← call getCharToProcess Adding struct value member variable copy (byte) main::center_x ← (byte~) main::$5_x Adding struct value member variable copy (byte) main::center_y ← (byte~) main::$5_y diff --git a/src/test/ref/complex/splines/truetype-splines.cfg b/src/test/ref/complex/splines/truetype-splines.cfg index eec98ee67..e6ff0b4d1 100644 --- a/src/test/ref/complex/splines/truetype-splines.cfg +++ b/src/test/ref/complex/splines/truetype-splines.cfg @@ -71,10 +71,10 @@ show_letter::@1: scope:[show_letter] from show_letter show_letter::@9 [28] (signed word) show_letter::current_y#4 ← phi( show_letter/(signed word) 0 show_letter::@9/(signed word) show_letter::current_y#11 ) [28] (signed word) show_letter::current_x#4 ← phi( show_letter/(signed word) 0 show_letter::@9/(signed word) show_letter::current_x#11 ) [28] (byte) show_letter::i#10 ← phi( show_letter/(byte) 0 show_letter::@9/(byte) show_letter::i#1 ) - [29] (byte~) show_letter::$32 ← (byte) show_letter::i#10 << (byte) 3 - [30] (byte~) show_letter::$20 ← (byte~) show_letter::$32 + (byte) show_letter::i#10 - [31] (signed word) show_letter::to_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) - [32] (signed word) show_letter::to_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) + [29] (byte~) show_letter::$24 ← (byte) show_letter::i#10 << (byte) 3 + [30] (byte~) show_letter::$20 ← (byte~) show_letter::$24 + (byte) show_letter::i#10 + [31] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) + [32] (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) [33] (signed word) show_letter::to_x#1 ← (signed word) show_letter::to_x#0 - (signed byte) $32 [34] (signed word) show_letter::to_y#1 ← (signed word) show_letter::to_y#0 - (signed word) $96 [35] (signed word) rotate::vector_x#0 ← (signed word) show_letter::to_x#1 @@ -89,10 +89,10 @@ show_letter::@6: scope:[show_letter] from show_letter::@1 [42] (signed word) show_letter::to_y#2 ← (signed word) rotate::return_y#0 [43] (signed word) show_letter::current_x#10 ← (signed word) show_letter::to_x#2 + (signed byte) $64 [44] (signed word) show_letter::current_y#10 ← (signed word) show_letter::to_y#2 + (signed byte) $64 - [45] (byte~) show_letter::$34 ← (byte) show_letter::i#10 << (byte) 3 - [46] (byte~) show_letter::$21 ← (byte~) show_letter::$34 + (byte) show_letter::i#10 - [47] (signed word) show_letter::via_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) - [48] (signed word) show_letter::via_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) + [45] (byte~) show_letter::$26 ← (byte) show_letter::i#10 << (byte) 3 + [46] (byte~) show_letter::$21 ← (byte~) show_letter::$26 + (byte) show_letter::i#10 + [47] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) + [48] (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) [49] (signed word) show_letter::via_x#1 ← (signed word) show_letter::via_x#0 - (signed byte) $32 [50] (signed word) show_letter::via_y#1 ← (signed word) show_letter::via_y#0 - (signed word) $96 [51] (signed word) rotate::vector_x#1 ← (signed word) show_letter::via_x#1 @@ -107,8 +107,8 @@ show_letter::@7: scope:[show_letter] from show_letter::@6 [58] (signed word) show_letter::via_y#2 ← (signed word) rotate::return_y#1 [59] (signed word) show_letter::segment_via_x#0 ← (signed word) show_letter::via_x#2 + (signed byte) $64 [60] (signed word) show_letter::segment_via_y#0 ← (signed word) show_letter::via_y#2 + (signed byte) $64 - [61] (byte~) show_letter::$36 ← (byte) show_letter::i#10 << (byte) 3 - [62] (byte~) show_letter::$22 ← (byte~) show_letter::$36 + (byte) show_letter::i#10 + [61] (byte~) show_letter::$28 ← (byte) show_letter::i#10 << (byte) 3 + [62] (byte~) show_letter::$22 ← (byte~) show_letter::$28 + (byte) show_letter::i#10 [63] (byte) show_letter::segment_type#0 ← *((byte*)(const struct Segment*) letter_c + (byte~) show_letter::$22) [64] if((byte) show_letter::segment_type#0==(const byte) MOVE_TO) goto show_letter::@3 to:show_letter::@4 diff --git a/src/test/ref/complex/splines/truetype-splines.log b/src/test/ref/complex/splines/truetype-splines.log index 2f028990d..23124a10e 100644 --- a/src/test/ref/complex/splines/truetype-splines.log +++ b/src/test/ref/complex/splines/truetype-splines.log @@ -199,47 +199,62 @@ Adding struct value member variable copy (signed word) spline_8segB::i_x ← (si Adding struct value member variable copy (signed word) spline_8segB::i_y ← (signed word~) spline_8segB::$29 Adding struct value member variable copy *((signed word*~) spline_8segB::$35 + (number~) spline_8segB::$32) ← (signed word)(number~) spline_8segB::$19 Adding struct value member variable copy *((signed word*~) spline_8segB::$36 + (number~) spline_8segB::$32) ← (signed word)(number~) spline_8segB::$21 -Adding struct value member variable copy (signed word) show_letter::current_x ← (signed word) 0 -Adding struct value member variable copy (signed word) show_letter::current_y ← (signed word) 0 -Adding struct value member variable copy (signed word) show_letter::to_x ← *((signed word*~) show_letter::$24 + (byte~) show_letter::$20) -Adding struct value member variable copy (signed word) show_letter::to_y ← *((signed word*~) show_letter::$26 + (byte~) show_letter::$20) +Unwinding value copy (struct SplineVector16) show_letter::current ← { x: (signed word) 0, y: (signed word) 0 } +Adding value simple copy (signed word) show_letter::current_x ← (signed word) 0 +Adding value simple copy (signed word) show_letter::current_y ← (signed word) 0 +Unwinding value copy (struct SplineVector16) show_letter::to ← *((const struct Segment*) letter_c + (byte~) show_letter::$20).to +Adding value simple copy (signed word) show_letter::to_x ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) show_letter::$20) +Adding value simple copy (signed word) show_letter::to_y ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) Adding struct value member variable copy (signed word) show_letter::to_x ← (signed word)(number~) show_letter::$0 Adding struct value member variable copy (signed word) show_letter::to_y ← (signed word)(number~) show_letter::$1 Converted procedure call LValue to member unwinding { (signed word~) show_letter::$2_x, (signed word~) show_letter::$2_y } ← call rotate (struct SplineVector16) show_letter::to (byte) show_letter::angle Converted procedure struct value parameter to member unwinding in call { (signed word~) show_letter::$2_x, (signed word~) show_letter::$2_y } ← call rotate (signed word) show_letter::to_x (signed word) show_letter::to_y (byte) show_letter::angle -Adding struct value member variable copy (signed word) show_letter::to_x ← (signed word~) show_letter::$2_x -Adding struct value member variable copy (signed word) show_letter::to_y ← (signed word~) show_letter::$2_y +Unwinding value copy (struct SplineVector16) show_letter::to ← (struct SplineVector16~) show_letter::$2 +Adding value simple copy (signed word) show_letter::to_x ← (signed word~) show_letter::$2_x +Adding value simple copy (signed word) show_letter::to_y ← (signed word~) show_letter::$2_y Adding struct value member variable copy (signed word) show_letter::to_x ← (signed word)(number~) show_letter::$3 Adding struct value member variable copy (signed word) show_letter::to_y ← (signed word)(number~) show_letter::$4 -Adding struct value member variable copy (signed word) show_letter::via_x ← *((signed word*~) show_letter::$28 + (byte~) show_letter::$21) -Adding struct value member variable copy (signed word) show_letter::via_y ← *((signed word*~) show_letter::$30 + (byte~) show_letter::$21) +Unwinding value copy (struct SplineVector16) show_letter::via ← *((const struct Segment*) letter_c + (byte~) show_letter::$21).via +Adding value simple copy (signed word) show_letter::via_x ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) show_letter::$21) +Adding value simple copy (signed word) show_letter::via_y ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) Adding struct value member variable copy (signed word) show_letter::via_x ← (signed word)(number~) show_letter::$5 Adding struct value member variable copy (signed word) show_letter::via_y ← (signed word)(number~) show_letter::$6 Converted procedure call LValue to member unwinding { (signed word~) show_letter::$7_x, (signed word~) show_letter::$7_y } ← call rotate (struct SplineVector16) show_letter::via (byte) show_letter::angle Converted procedure struct value parameter to member unwinding in call { (signed word~) show_letter::$7_x, (signed word~) show_letter::$7_y } ← call rotate (signed word) show_letter::via_x (signed word) show_letter::via_y (byte) show_letter::angle -Adding struct value member variable copy (signed word) show_letter::via_x ← (signed word~) show_letter::$7_x -Adding struct value member variable copy (signed word) show_letter::via_y ← (signed word~) show_letter::$7_y +Unwinding value copy (struct SplineVector16) show_letter::via ← (struct SplineVector16~) show_letter::$7 +Adding value simple copy (signed word) show_letter::via_x ← (signed word~) show_letter::$7_x +Adding value simple copy (signed word) show_letter::via_y ← (signed word~) show_letter::$7_y Adding struct value member variable copy (signed word) show_letter::via_x ← (signed word)(number~) show_letter::$8 Adding struct value member variable copy (signed word) show_letter::via_y ← (signed word)(number~) show_letter::$9 Adding struct value member variable copy (byte) show_letter::segment_type ← *((const struct Segment*) letter_c + (byte~) show_letter::$22).type Adding struct value member variable copy (struct SplineVector16) show_letter::segment_to ← (struct SplineVector16) show_letter::to Adding struct value member variable copy (struct SplineVector16) show_letter::segment_via ← (struct SplineVector16) show_letter::via -Postponing unwinding for (struct SplineVector16) show_letter::current ← (struct Segment) show_letter::segment.to +Unwinding value copy (struct SplineVector16) show_letter::current ← (struct Segment) show_letter::segment.to +Adding value simple copy (signed word) show_letter::current_x ← (signed word) show_letter::segment_to_x +Adding value simple copy (signed word) show_letter::current_y ← (signed word) show_letter::segment_to_y Postponing unwinding for (void~) show_letter::$17 ← call spline_8segB (struct SplineVector16) show_letter::current (struct Segment) show_letter::segment.via (struct Segment) show_letter::segment.to Postponing unwinding for (void~) show_letter::$17 ← call spline_8segB (struct SplineVector16) show_letter::current (struct Segment) show_letter::segment.via (struct Segment) show_letter::segment.to Converted procedure struct value parameter to member unwinding in call (void~) show_letter::$17 ← call spline_8segB (signed word) show_letter::current_x (signed word) show_letter::current_y (struct Segment) show_letter::segment.via (struct Segment) show_letter::segment.to -Postponing unwinding for (struct SplineVector16) show_letter::current ← (struct Segment) show_letter::segment.to -Postponing unwinding for (struct SplineVector16) show_letter::current ← (struct Segment) show_letter::segment.to -Adding struct value member variable copy (signed word) bitmap_plot_spline_8seg::current_x ← *((signed word*~) bitmap_plot_spline_8seg::$10 + (number~) bitmap_plot_spline_8seg::$6) -Adding struct value member variable copy (signed word) bitmap_plot_spline_8seg::current_y ← *((signed word*~) bitmap_plot_spline_8seg::$11 + (number~) bitmap_plot_spline_8seg::$6) -Adding struct value member variable copy (signed word) bitmap_plot_spline_8seg::current_x ← *((signed word*~) bitmap_plot_spline_8seg::$12 + (byte~) bitmap_plot_spline_8seg::$9) -Adding struct value member variable copy (signed word) bitmap_plot_spline_8seg::current_y ← *((signed word*~) bitmap_plot_spline_8seg::$13 + (byte~) bitmap_plot_spline_8seg::$9) +Unwinding value copy (struct SplineVector16) show_letter::current ← (struct Segment) show_letter::segment.to +Adding value simple copy (signed word) show_letter::current_x ← (signed word) show_letter::segment_to_x +Adding value simple copy (signed word) show_letter::current_y ← (signed word) show_letter::segment_to_y +Unwinding value copy (struct SplineVector16) show_letter::current ← (struct Segment) show_letter::segment.to +Adding value simple copy (signed word) show_letter::current_x ← (signed word) show_letter::segment_to_x +Adding value simple copy (signed word) show_letter::current_y ← (signed word) show_letter::segment_to_y +Unwinding value copy (struct SplineVector16) bitmap_plot_spline_8seg::current ← *((const struct SplineVector16*) SPLINE_8SEG + (number~) bitmap_plot_spline_8seg::$6) +Adding value simple copy (signed word) bitmap_plot_spline_8seg::current_x ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (number~) bitmap_plot_spline_8seg::$6) +Adding value simple copy (signed word) bitmap_plot_spline_8seg::current_y ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (number~) bitmap_plot_spline_8seg::$6) +Unwinding value copy (struct SplineVector16) bitmap_plot_spline_8seg::current ← *((const struct SplineVector16*) SPLINE_8SEG + (byte~) bitmap_plot_spline_8seg::$9) +Adding value simple copy (signed word) bitmap_plot_spline_8seg::current_x ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) bitmap_plot_spline_8seg::$9) +Adding value simple copy (signed word) bitmap_plot_spline_8seg::current_y ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) bitmap_plot_spline_8seg::$9) Adding struct value member variable copy (signed word) rotate::rotated_x ← (signed word~) rotate::$16 Adding struct value member variable copy (signed word) rotate::rotated_y ← (signed word~) rotate::$19 -Adding struct value member variable copy (signed word) rotate::return_x ← (signed word) rotate::rotated_x -Adding struct value member variable copy (signed word) rotate::return_y ← (signed word) rotate::rotated_y -Adding struct value member variable copy (signed word) rotate::return_x ← (signed word) rotate::return_x -Adding struct value member variable copy (signed word) rotate::return_y ← (signed word) rotate::return_y +Unwinding value copy (struct SplineVector16) rotate::return ← (struct SplineVector16) rotate::rotated +Adding value simple copy (signed word) rotate::return_x ← (signed word) rotate::rotated_x +Adding value simple copy (signed word) rotate::return_y ← (signed word) rotate::rotated_y +Unwinding value copy (struct SplineVector16) rotate::return ← (struct SplineVector16) rotate::return +Adding value simple copy (signed word) rotate::return_x ← (signed word) rotate::return_x +Adding value simple copy (signed word) rotate::return_y ← (signed word) rotate::return_y Converted procedure struct return value to member unwinding return { (signed word) rotate::return_x, (signed word) rotate::return_y } Replacing struct member reference (struct SplineVector16) spline_16seg::p1.x with member unwinding reference (signed word) spline_16seg::p1_x Replacing struct member reference (struct SplineVector16) spline_16seg::p2.x with member unwinding reference (signed word) spline_16seg::p2_x @@ -340,33 +355,26 @@ Replacing struct member reference (struct SplineVector16) show_letter::via.y wit Replacing struct member reference (struct SplineVector16) show_letter::via.x with member unwinding reference (signed word) show_letter::via_x Replacing struct member reference (struct SplineVector16) show_letter::via.y with member unwinding reference (signed word) show_letter::via_y Replacing struct member reference (struct Segment) show_letter::segment.type with member unwinding reference (byte) show_letter::segment_type -Replacing struct member reference (struct Segment) show_letter::segment.to with member unwinding reference (struct SplineVector16) show_letter::segment_to Replacing struct member reference (struct Segment) show_letter::segment.type with member unwinding reference (byte) show_letter::segment_type Replacing struct member reference (struct Segment) show_letter::segment.via with member unwinding reference (struct SplineVector16) show_letter::segment_via Replacing struct member reference (struct Segment) show_letter::segment.to with member unwinding reference (struct SplineVector16) show_letter::segment_to -Replacing struct member reference (struct Segment) show_letter::segment.to with member unwinding reference (struct SplineVector16) show_letter::segment_to Replacing struct member reference (struct SplineVector16) show_letter::current.x with member unwinding reference (signed word) show_letter::current_x Replacing struct member reference (struct SplineVector16) show_letter::current.y with member unwinding reference (signed word) show_letter::current_y Replacing struct member reference (struct Segment) show_letter::segment.to with member unwinding reference (struct SplineVector16) show_letter::segment_to Replacing struct member reference (struct Segment) show_letter::segment.to with member unwinding reference (struct SplineVector16) show_letter::segment_to -Replacing struct member reference (struct Segment) show_letter::segment.to with member unwinding reference (struct SplineVector16) show_letter::segment_to Replacing struct member reference (struct SplineVector16) bitmap_plot_spline_8seg::current.x with member unwinding reference (signed word) bitmap_plot_spline_8seg::current_x Replacing struct member reference (struct SplineVector16) bitmap_plot_spline_8seg::current.y with member unwinding reference (signed word) bitmap_plot_spline_8seg::current_y Replacing struct member reference (struct SplineVector16) rotate::vector.x with member unwinding reference (signed word) rotate::vector_x Replacing struct member reference (struct SplineVector16) rotate::vector.y with member unwinding reference (signed word) rotate::vector_y Replacing struct member reference (struct SplineVector16) rotate::vector.y with member unwinding reference (signed word) rotate::vector_y Replacing struct member reference (struct SplineVector16) rotate::vector.x with member unwinding reference (signed word) rotate::vector_x -Adding struct value member variable copy (signed word) show_letter::segment_to_x ← (signed word) show_letter::to_x -Adding struct value member variable copy (signed word) show_letter::segment_to_y ← (signed word) show_letter::to_y -Adding struct value member variable copy (signed word) show_letter::segment_via_x ← (signed word) show_letter::via_x -Adding struct value member variable copy (signed word) show_letter::segment_via_y ← (signed word) show_letter::via_y -Adding struct value member variable copy (signed word) show_letter::current_x ← (signed word) show_letter::segment_to_x -Adding struct value member variable copy (signed word) show_letter::current_y ← (signed word) show_letter::segment_to_y +Unwinding value copy (struct SplineVector16) show_letter::segment_to ← (struct SplineVector16) show_letter::to +Adding value simple copy (signed word) show_letter::segment_to_x ← (signed word) show_letter::to_x +Adding value simple copy (signed word) show_letter::segment_to_y ← (signed word) show_letter::to_y +Unwinding value copy (struct SplineVector16) show_letter::segment_via ← (struct SplineVector16) show_letter::via +Adding value simple copy (signed word) show_letter::segment_via_x ← (signed word) show_letter::via_x +Adding value simple copy (signed word) show_letter::segment_via_y ← (signed word) show_letter::via_y Converted procedure struct value parameter to member unwinding in call (void~) show_letter::$17 ← call spline_8segB (signed word) show_letter::current_x (signed word) show_letter::current_y (signed word) show_letter::segment_via_x (signed word) show_letter::segment_via_y (signed word) show_letter::segment_to_x (signed word) show_letter::segment_to_y -Adding struct value member variable copy (signed word) show_letter::current_x ← (signed word) show_letter::segment_to_x -Adding struct value member variable copy (signed word) show_letter::current_y ← (signed word) show_letter::segment_to_y -Adding struct value member variable copy (signed word) show_letter::current_x ← (signed word) show_letter::segment_to_x -Adding struct value member variable copy (signed word) show_letter::current_y ← (signed word) show_letter::segment_to_y Replacing struct member reference (struct SplineVector16) show_letter::segment_to.x with member unwinding reference (signed word) show_letter::segment_to_x Replacing struct member reference (struct SplineVector16) show_letter::segment_to.y with member unwinding reference (signed word) show_letter::segment_to_y Rewriting struct pointer member access *((const struct Segment*) letter_c + (byte~) show_letter::$22).type @@ -1409,12 +1417,8 @@ show_letter::@1: scope:[show_letter] from show_letter show_letter::@5 (byte) show_letter::angle#1 ← phi( show_letter/(byte) show_letter::angle#3 show_letter::@5/(byte) show_letter::angle#4 ) (byte) show_letter::i#2 ← phi( show_letter/(byte) show_letter::i#0 show_letter::@5/(byte) show_letter::i#1 ) (byte~) show_letter::$20 ← (byte) show_letter::i#2 * (const byte) SIZEOF_STRUCT_SEGMENT - (signed word*~) show_letter::$24 ← (signed word*)(signed word*~) show_letter::$23 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X - (signed word) show_letter::to_x#0 ← *((signed word*~) show_letter::$24 + (byte~) show_letter::$20) - (signed word*~) show_letter::$23 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TO - (signed word*~) show_letter::$26 ← (signed word*)(signed word*~) show_letter::$25 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y - (signed word) show_letter::to_y#0 ← *((signed word*~) show_letter::$26 + (byte~) show_letter::$20) - (signed word*~) show_letter::$25 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TO + (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) show_letter::$20) + (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) (number~) show_letter::$0 ← (signed word) show_letter::to_x#0 - (number) $32 (number~) show_letter::$1 ← (signed word) show_letter::to_y#0 - (number) $96 (signed word) show_letter::to_x#1 ← (signed word)(number~) show_letter::$0 @@ -1442,12 +1446,8 @@ show_letter::@11: scope:[show_letter] from show_letter::@1 (signed word) show_letter::to_x#3 ← (signed word)(number~) show_letter::$3 (signed word) show_letter::to_y#3 ← (signed word)(number~) show_letter::$4 (byte~) show_letter::$21 ← (byte) show_letter::i#3 * (const byte) SIZEOF_STRUCT_SEGMENT - (signed word*~) show_letter::$28 ← (signed word*)(signed word*~) show_letter::$27 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X - (signed word) show_letter::via_x#0 ← *((signed word*~) show_letter::$28 + (byte~) show_letter::$21) - (signed word*~) show_letter::$27 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_VIA - (signed word*~) show_letter::$30 ← (signed word*)(signed word*~) show_letter::$29 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y - (signed word) show_letter::via_y#0 ← *((signed word*~) show_letter::$30 + (byte~) show_letter::$21) - (signed word*~) show_letter::$29 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_VIA + (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) show_letter::$21) + (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) (number~) show_letter::$5 ← (signed word) show_letter::via_x#0 - (number) $32 (number~) show_letter::$6 ← (signed word) show_letter::via_y#0 - (number) $96 (signed word) show_letter::via_x#1 ← (signed word)(number~) show_letter::$5 @@ -1477,8 +1477,8 @@ show_letter::@12: scope:[show_letter] from show_letter::@11 (signed word) show_letter::via_x#3 ← (signed word)(number~) show_letter::$8 (signed word) show_letter::via_y#3 ← (signed word)(number~) show_letter::$9 (byte~) show_letter::$22 ← (byte) show_letter::i#4 * (const byte) SIZEOF_STRUCT_SEGMENT - (byte*~) show_letter::$31 ← (byte*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TYPE - (byte) show_letter::segment_type#0 ← *((byte*~) show_letter::$31 + (byte~) show_letter::$22) + (byte*~) show_letter::$23 ← (byte*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TYPE + (byte) show_letter::segment_type#0 ← *((byte*~) show_letter::$23 + (byte~) show_letter::$22) (signed word) show_letter::segment_to_x#0 ← (signed word) show_letter::to_x#4 (signed word) show_letter::segment_to_y#0 ← (signed word) show_letter::to_y#4 (signed word) show_letter::segment_via_x#0 ← (signed word) show_letter::via_x#3 @@ -1580,10 +1580,8 @@ show_letter::@return: scope:[show_letter] from show_letter::@5 (void()) bitmap_plot_spline_8seg() bitmap_plot_spline_8seg: scope:[bitmap_plot_spline_8seg] from show_letter::@13 (number~) bitmap_plot_spline_8seg::$6 ← (number) 0 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16 - (signed word*~) bitmap_plot_spline_8seg::$10 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X - (signed word) bitmap_plot_spline_8seg::current_x#0 ← *((signed word*~) bitmap_plot_spline_8seg::$10 + (number~) bitmap_plot_spline_8seg::$6) - (signed word*~) bitmap_plot_spline_8seg::$11 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y - (signed word) bitmap_plot_spline_8seg::current_y#0 ← *((signed word*~) bitmap_plot_spline_8seg::$11 + (number~) bitmap_plot_spline_8seg::$6) + (signed word) bitmap_plot_spline_8seg::current_x#0 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (number~) bitmap_plot_spline_8seg::$6) + (signed word) bitmap_plot_spline_8seg::current_y#0 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (number~) bitmap_plot_spline_8seg::$6) (byte) bitmap_plot_spline_8seg::n#0 ← (byte) 1 to:bitmap_plot_spline_8seg::@1 bitmap_plot_spline_8seg::@1: scope:[bitmap_plot_spline_8seg] from bitmap_plot_spline_8seg bitmap_plot_spline_8seg::@3 @@ -1593,11 +1591,11 @@ bitmap_plot_spline_8seg::@1: scope:[bitmap_plot_spline_8seg] from bitmap_plot_s (word~) bitmap_plot_spline_8seg::$0 ← ((word)) (signed word) bitmap_plot_spline_8seg::current_x#2 (word~) bitmap_plot_spline_8seg::$1 ← ((word)) (signed word) bitmap_plot_spline_8seg::current_y#2 (byte~) bitmap_plot_spline_8seg::$7 ← (byte) bitmap_plot_spline_8seg::n#2 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16 - (signed word*~) bitmap_plot_spline_8seg::$14 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X - (word~) bitmap_plot_spline_8seg::$2 ← ((word)) *((signed word*~) bitmap_plot_spline_8seg::$14 + (byte~) bitmap_plot_spline_8seg::$7) + (signed word*~) bitmap_plot_spline_8seg::$10 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (word~) bitmap_plot_spline_8seg::$2 ← ((word)) *((signed word*~) bitmap_plot_spline_8seg::$10 + (byte~) bitmap_plot_spline_8seg::$7) (byte~) bitmap_plot_spline_8seg::$8 ← (byte) bitmap_plot_spline_8seg::n#2 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16 - (signed word*~) bitmap_plot_spline_8seg::$15 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y - (word~) bitmap_plot_spline_8seg::$3 ← ((word)) *((signed word*~) bitmap_plot_spline_8seg::$15 + (byte~) bitmap_plot_spline_8seg::$8) + (signed word*~) bitmap_plot_spline_8seg::$11 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (word~) bitmap_plot_spline_8seg::$3 ← ((word)) *((signed word*~) bitmap_plot_spline_8seg::$11 + (byte~) bitmap_plot_spline_8seg::$8) (word) bitmap_line::x1#1 ← (word~) bitmap_plot_spline_8seg::$0 (word) bitmap_line::y1#1 ← (word~) bitmap_plot_spline_8seg::$1 (word) bitmap_line::x2#1 ← (word~) bitmap_plot_spline_8seg::$2 @@ -1607,10 +1605,8 @@ bitmap_plot_spline_8seg::@1: scope:[bitmap_plot_spline_8seg] from bitmap_plot_s bitmap_plot_spline_8seg::@3: scope:[bitmap_plot_spline_8seg] from bitmap_plot_spline_8seg::@1 (byte) bitmap_plot_spline_8seg::n#3 ← phi( bitmap_plot_spline_8seg::@1/(byte) bitmap_plot_spline_8seg::n#2 ) (byte~) bitmap_plot_spline_8seg::$9 ← (byte) bitmap_plot_spline_8seg::n#3 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16 - (signed word*~) bitmap_plot_spline_8seg::$12 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X - (signed word) bitmap_plot_spline_8seg::current_x#1 ← *((signed word*~) bitmap_plot_spline_8seg::$12 + (byte~) bitmap_plot_spline_8seg::$9) - (signed word*~) bitmap_plot_spline_8seg::$13 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y - (signed word) bitmap_plot_spline_8seg::current_y#1 ← *((signed word*~) bitmap_plot_spline_8seg::$13 + (byte~) bitmap_plot_spline_8seg::$9) + (signed word) bitmap_plot_spline_8seg::current_x#1 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) bitmap_plot_spline_8seg::$9) + (signed word) bitmap_plot_spline_8seg::current_y#1 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) bitmap_plot_spline_8seg::$9) (byte) bitmap_plot_spline_8seg::n#1 ← (byte) bitmap_plot_spline_8seg::n#3 + rangenext(1,8) (bool~) bitmap_plot_spline_8seg::$5 ← (byte) bitmap_plot_spline_8seg::n#1 != rangelast(1,8) if((bool~) bitmap_plot_spline_8seg::$5) goto bitmap_plot_spline_8seg::@1 @@ -2132,10 +2128,6 @@ SYMBOL TABLE SSA (word~) bitmap_plot_spline_8seg::$1 (signed word*~) bitmap_plot_spline_8seg::$10 (signed word*~) bitmap_plot_spline_8seg::$11 -(signed word*~) bitmap_plot_spline_8seg::$12 -(signed word*~) bitmap_plot_spline_8seg::$13 -(signed word*~) bitmap_plot_spline_8seg::$14 -(signed word*~) bitmap_plot_spline_8seg::$15 (word~) bitmap_plot_spline_8seg::$2 (word~) bitmap_plot_spline_8seg::$3 (bool~) bitmap_plot_spline_8seg::$5 @@ -2618,18 +2610,10 @@ SYMBOL TABLE SSA (byte~) show_letter::$20 (byte~) show_letter::$21 (byte~) show_letter::$22 -(signed word*~) show_letter::$23 -(signed word*~) show_letter::$24 -(signed word*~) show_letter::$25 -(signed word*~) show_letter::$26 -(signed word*~) show_letter::$27 -(signed word*~) show_letter::$28 -(signed word*~) show_letter::$29 +(byte*~) show_letter::$23 (signed word~) show_letter::$2_x (signed word~) show_letter::$2_y (number~) show_letter::$3 -(signed word*~) show_letter::$30 -(byte*~) show_letter::$31 (number~) show_letter::$4 (number~) show_letter::$5 (number~) show_letter::$6 @@ -3020,8 +3004,8 @@ Inlining cast (word~) show_letter::$14 ← (word)(signed word) show_letter::segm Inlining cast (word~) show_letter::$15 ← (word)(signed word) show_letter::segment_to_y#4 Inlining cast (word~) bitmap_plot_spline_8seg::$0 ← (word)(signed word) bitmap_plot_spline_8seg::current_x#2 Inlining cast (word~) bitmap_plot_spline_8seg::$1 ← (word)(signed word) bitmap_plot_spline_8seg::current_y#2 -Inlining cast (word~) bitmap_plot_spline_8seg::$2 ← (word)*((signed word*~) bitmap_plot_spline_8seg::$14 + (byte~) bitmap_plot_spline_8seg::$7) -Inlining cast (word~) bitmap_plot_spline_8seg::$3 ← (word)*((signed word*~) bitmap_plot_spline_8seg::$15 + (byte~) bitmap_plot_spline_8seg::$8) +Inlining cast (word~) bitmap_plot_spline_8seg::$2 ← (word)*((signed word*~) bitmap_plot_spline_8seg::$10 + (byte~) bitmap_plot_spline_8seg::$7) +Inlining cast (word~) bitmap_plot_spline_8seg::$3 ← (word)*((signed word*~) bitmap_plot_spline_8seg::$11 + (byte~) bitmap_plot_spline_8seg::$8) Inlining cast (signed word~) rotate::$0 ← (signed word)*((const signed byte*) COS + (byte) rotate::angle#2) Inlining cast (signed word~) rotate::$2 ← (signed word)(signed dword~) rotate::$1 Inlining cast (signed word~) rotate::$5 ← (signed word)(signed dword~) rotate::$4 @@ -3114,14 +3098,10 @@ Simplifying constant integer cast $fe Simplifying constant integer cast $ff Simplifying constant integer cast 9 Simplifying constant integer cast $3e7 -Simplifying constant integer cast (signed word*~) show_letter::$23 -Simplifying constant integer cast (signed word*~) show_letter::$25 Simplifying constant integer cast $32 Simplifying constant integer cast $96 Simplifying constant integer cast $64 Simplifying constant integer cast $64 -Simplifying constant integer cast (signed word*~) show_letter::$27 -Simplifying constant integer cast (signed word*~) show_letter::$29 Simplifying constant integer cast $32 Simplifying constant integer cast $96 Simplifying constant integer cast $64 @@ -3544,7 +3524,7 @@ Identical Phi Values (byte*) bitmap_screen#7 (byte*) bitmap_screen#1 Identical Phi Values (byte*) bitmap_gfx#12 (byte*) bitmap_gfx#1 Successful SSA optimization Pass2IdenticalPhiElimination Identified duplicate assignment right side [111] (byte~) bitmap_init::$7 ← (byte) bitmap_init::y#2 & (byte) 7 -Identified duplicate assignment right side [551] (byte~) bitmap_plot_spline_8seg::$8 ← (byte) bitmap_plot_spline_8seg::n#2 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16 +Identified duplicate assignment right side [541] (byte~) bitmap_plot_spline_8seg::$8 ← (byte) bitmap_plot_spline_8seg::n#2 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16 Successful SSA optimization Pass2DuplicateRValueIdentification Simple Condition (bool~) spline_8segB::$30 [50] if((byte) spline_8segB::n#1!=rangelast(0,7)) goto spline_8segB::@1 Simple Condition (bool~) memset::$1 [65] if((word) memset::num#2<=(byte) 0) goto memset::@1 @@ -3569,10 +3549,10 @@ Simple Condition (bool~) mulf16s::$6 [337] if((signed word) mulf16s::b#4>=(signe Simple Condition (bool~) main::$7 [418] if(*((const byte*) RASTER)!=(byte) $fe) goto main::@5 Simple Condition (bool~) main::$8 [421] if(*((const byte*) RASTER)!=(byte) $ff) goto main::@7 Simple Condition (bool~) main::$9 [425] if((byte) main::w#1!=rangelast(0,$3c)) goto main::@5 -Simple Condition (bool~) show_letter::$10 [501] if((byte) show_letter::segment_type#0==(const byte) MOVE_TO) goto show_letter::@2 -Simple Condition (bool~) show_letter::$11 [507] if((byte) show_letter::segment_type#0==(const byte) SPLINE_TO) goto show_letter::@3 -Simple Condition (bool~) show_letter::$19 [537] if((byte) show_letter::i#1!=rangelast(0,$15)) goto show_letter::@1 -Simple Condition (bool~) bitmap_plot_spline_8seg::$5 [567] if((byte) bitmap_plot_spline_8seg::n#1!=rangelast(1,8)) goto bitmap_plot_spline_8seg::@1 +Simple Condition (bool~) show_letter::$10 [493] if((byte) show_letter::segment_type#0==(const byte) MOVE_TO) goto show_letter::@2 +Simple Condition (bool~) show_letter::$11 [499] if((byte) show_letter::segment_type#0==(const byte) SPLINE_TO) goto show_letter::@3 +Simple Condition (bool~) show_letter::$19 [529] if((byte) show_letter::i#1!=rangelast(0,$15)) goto show_letter::@1 +Simple Condition (bool~) bitmap_plot_spline_8seg::$5 [555] if((byte) bitmap_plot_spline_8seg::n#1!=rangelast(1,8)) goto bitmap_plot_spline_8seg::@1 Successful SSA optimization Pass2ConditionalJumpSimplification Rewriting ! if()-condition to reversed if() [171] (bool~) bitmap_line::$7 ← ! (bool~) bitmap_line::$6 Rewriting && if()-condition to two if()s [170] (bool~) bitmap_line::$6 ← (bool~) bitmap_line::$4 && (bool~) bitmap_line::$5 @@ -3582,18 +3562,10 @@ Constant right-side identified [38] (signed word*~) spline_8segB::$34 ← (signe Constant right-side identified [56] (byte~) spline_8segB::$32 ← (byte) 8 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16 Constant right-side identified [57] (signed word*~) spline_8segB::$35 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X Constant right-side identified [59] (signed word*~) spline_8segB::$36 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y -Constant right-side identified [444] (signed word*~) show_letter::$23 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TO -Constant right-side identified [447] (signed word*~) show_letter::$25 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TO -Constant right-side identified [470] (signed word*~) show_letter::$27 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_VIA -Constant right-side identified [473] (signed word*~) show_letter::$29 ← (signed word*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_VIA -Constant right-side identified [494] (byte*~) show_letter::$31 ← (byte*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TYPE -Constant right-side identified [539] (byte~) bitmap_plot_spline_8seg::$6 ← (byte) 0 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16 -Constant right-side identified [540] (signed word*~) bitmap_plot_spline_8seg::$10 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X +Constant right-side identified [486] (byte*~) show_letter::$23 ← (byte*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TYPE +Constant right-side identified [531] (byte~) bitmap_plot_spline_8seg::$6 ← (byte) 0 * (const byte) SIZEOF_STRUCT_SPLINEVECTOR16 +Constant right-side identified [539] (signed word*~) bitmap_plot_spline_8seg::$10 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X Constant right-side identified [542] (signed word*~) bitmap_plot_spline_8seg::$11 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y -Constant right-side identified [549] (signed word*~) bitmap_plot_spline_8seg::$14 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X -Constant right-side identified [552] (signed word*~) bitmap_plot_spline_8seg::$15 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y -Constant right-side identified [561] (signed word*~) bitmap_plot_spline_8seg::$12 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X -Constant right-side identified [563] (signed word*~) bitmap_plot_spline_8seg::$13 ← (signed word*)(const struct SplineVector16*) SPLINE_8SEG + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y Successful SSA optimization Pass2ConstantRValueConsolidation Constant (const byte) spline_8segB::n#0 = 0 Constant (const signed word*) spline_8segB::$33 = (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_X @@ -3636,19 +3608,11 @@ Constant (const byte) main::w#0 = 0 Constant (const signed word) show_letter::current_x#0 = 0 Constant (const signed word) show_letter::current_y#0 = 0 Constant (const byte) show_letter::i#0 = 0 -Constant (const signed word*) show_letter::$23 = (signed word*)letter_c+OFFSET_STRUCT_SEGMENT_TO -Constant (const signed word*) show_letter::$25 = (signed word*)letter_c+OFFSET_STRUCT_SEGMENT_TO -Constant (const signed word*) show_letter::$27 = (signed word*)letter_c+OFFSET_STRUCT_SEGMENT_VIA -Constant (const signed word*) show_letter::$29 = (signed word*)letter_c+OFFSET_STRUCT_SEGMENT_VIA -Constant (const byte*) show_letter::$31 = (byte*)letter_c+OFFSET_STRUCT_SEGMENT_TYPE +Constant (const byte*) show_letter::$23 = (byte*)letter_c+OFFSET_STRUCT_SEGMENT_TYPE Constant (const byte) bitmap_plot_spline_8seg::$6 = 0*SIZEOF_STRUCT_SPLINEVECTOR16 +Constant (const byte) bitmap_plot_spline_8seg::n#0 = 1 Constant (const signed word*) bitmap_plot_spline_8seg::$10 = (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_X Constant (const signed word*) bitmap_plot_spline_8seg::$11 = (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_Y -Constant (const byte) bitmap_plot_spline_8seg::n#0 = 1 -Constant (const signed word*) bitmap_plot_spline_8seg::$14 = (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_X -Constant (const signed word*) bitmap_plot_spline_8seg::$15 = (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_Y -Constant (const signed word*) bitmap_plot_spline_8seg::$12 = (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_X -Constant (const signed word*) bitmap_plot_spline_8seg::$13 = (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_Y Successful SSA optimization Pass2ConstantIdentification Constant (const byte*) bitmap_gfx#1 = bitmap_init::gfx#0 Constant (const byte*) bitmap_screen#1 = bitmap_init::screen#0 @@ -3670,27 +3634,27 @@ Resolved ranged next value [116] bitmap_init::y#1 ← ++ bitmap_init::y#2 to ++ Resolved ranged comparison value [118] if(bitmap_init::y#1!=rangelast(0,$ff)) goto bitmap_init::@5 to (number) 0 Resolved ranged next value [423] main::w#1 ← ++ main::w#4 to ++ Resolved ranged comparison value [425] if(main::w#1!=rangelast(0,$3c)) goto main::@5 to (number) $3d -Resolved ranged next value [535] show_letter::i#1 ← ++ show_letter::i#10 to ++ -Resolved ranged comparison value [537] if(show_letter::i#1!=rangelast(0,$15)) goto show_letter::@1 to (number) $16 -Resolved ranged next value [565] bitmap_plot_spline_8seg::n#1 ← ++ bitmap_plot_spline_8seg::n#2 to ++ -Resolved ranged comparison value [567] if(bitmap_plot_spline_8seg::n#1!=rangelast(1,8)) goto bitmap_plot_spline_8seg::@1 to (number) 9 +Resolved ranged next value [527] show_letter::i#1 ← ++ show_letter::i#10 to ++ +Resolved ranged comparison value [529] if(show_letter::i#1!=rangelast(0,$15)) goto show_letter::@1 to (number) $16 +Resolved ranged next value [553] bitmap_plot_spline_8seg::n#1 ← ++ bitmap_plot_spline_8seg::n#2 to ++ +Resolved ranged comparison value [555] if(bitmap_plot_spline_8seg::n#1!=rangelast(1,8)) goto bitmap_plot_spline_8seg::@1 to (number) 9 Simplifying constant evaluating to zero (byte) 0*(const byte) SIZEOF_STRUCT_SPLINEVECTOR16 in Successful SSA optimization PassNSimplifyConstantZero Simplifying expression containing zero (signed word*)SPLINE_8SEG in Simplifying expression containing zero (signed word*)SPLINE_8SEG in Simplifying expression containing zero (byte*)letter_c in Simplifying expression containing zero (signed word*)SPLINE_8SEG in -Simplifying expression containing zero (signed word*)SPLINE_8SEG in -Simplifying expression containing zero (signed word*)SPLINE_8SEG in -Simplifying expression containing zero show_letter::$23 in [442] (signed word*~) show_letter::$24 ← (const signed word*) show_letter::$23 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X -Simplifying expression containing zero show_letter::$27 in [468] (signed word*~) show_letter::$28 ← (const signed word*) show_letter::$27 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X -Simplifying expression containing zero bitmap_plot_spline_8seg::$10 in [541] (signed word) bitmap_plot_spline_8seg::current_x#0 ← *((const signed word*) bitmap_plot_spline_8seg::$10 + (const byte) bitmap_plot_spline_8seg::$6) -Simplifying expression containing zero bitmap_plot_spline_8seg::$11 in [543] (signed word) bitmap_plot_spline_8seg::current_y#0 ← *((const signed word*) bitmap_plot_spline_8seg::$11 + (const byte) bitmap_plot_spline_8seg::$6) +Simplifying expression containing zero (signed word*)(struct SplineVector16*)letter_c+OFFSET_STRUCT_SEGMENT_TO in [442] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) show_letter::$20) +Simplifying expression containing zero (signed word*)(struct SplineVector16*)letter_c+OFFSET_STRUCT_SEGMENT_VIA in [464] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) show_letter::$21) +Simplifying expression containing zero (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_X in [532] (signed word) bitmap_plot_spline_8seg::current_x#0 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (const byte) bitmap_plot_spline_8seg::$6) +Simplifying expression containing zero (signed word*)SPLINE_8SEG in [532] (signed word) bitmap_plot_spline_8seg::current_x#0 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X) +Simplifying expression containing zero (signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_Y in [533] (signed word) bitmap_plot_spline_8seg::current_y#0 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (const byte) bitmap_plot_spline_8seg::$6) +Simplifying expression containing zero (signed word*)SPLINE_8SEG in [551] (signed word) bitmap_plot_spline_8seg::current_x#1 ← *((signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_X + (byte~) bitmap_plot_spline_8seg::$9) Successful SSA optimization PassNSimplifyExpressionWithZero Eliminating unused variable (void*) memset::return#2 and assignment [75] (void*) memset::return#2 ← (void*) memset::str#3 Eliminating unused variable (void*) memset::return#3 and assignment [77] (void*) memset::return#3 ← (void*) memset::str#3 -Eliminating unused variable (struct SplineVector16) rotate::return#0 and assignment [352] (struct SplineVector16) rotate::return#0 ← struct-unwound {(signed word) rotate::return_x#2, (signed word) rotate::return_y#2} -Eliminating unused variable (struct SplineVector16) rotate::return#1 and assignment [353] (struct SplineVector16) rotate::return#1 ← struct-unwound {(signed word) rotate::return_x#2, (signed word) rotate::return_y#2} +Eliminating unused variable (struct SplineVector16) rotate::return#0 and assignment [348] (struct SplineVector16) rotate::return#0 ← struct-unwound {(signed word) rotate::return_x#2, (signed word) rotate::return_y#2} +Eliminating unused variable (struct SplineVector16) rotate::return#1 and assignment [349] (struct SplineVector16) rotate::return#1 ← struct-unwound {(signed word) rotate::return_x#2, (signed word) rotate::return_y#2} Eliminating unused constant (const byte) bitmap_plot_spline_8seg::$6 Eliminating unused constant (const byte) OFFSET_STRUCT_SPLINEVECTOR16_X Eliminating unused constant (const byte) OFFSET_STRUCT_SEGMENT_TYPE @@ -3748,23 +3712,17 @@ Alias (signed word) show_letter::segment_via_y#0 = (signed word~) show_letter::$ Alias (byte~) bitmap_plot_spline_8seg::$8 = (byte~) bitmap_plot_spline_8seg::$7 Successful SSA optimization Pass2AliasElimination Simple Condition (bool~) bitmap_line::$4 [96] if((word) bitmap_line::dx#0==(byte) 0) goto bitmap_line::@24 -Simple Condition (bool~) bitmap_line::$5 [350] if((word) bitmap_line::dy#0==(byte) 0) goto bitmap_line::@4 +Simple Condition (bool~) bitmap_line::$5 [346] if((word) bitmap_line::dy#0==(byte) 0) goto bitmap_line::@4 Successful SSA optimization Pass2ConditionalJumpSimplification Negating conditional jump and destination [96] if((word) bitmap_line::dx#0!=(byte) 0) goto bitmap_line::@1 Successful SSA optimization Pass2ConditionalJumpSequenceImprovement Constant right-side identified [207] (byte~) main::vicSelectGfxBank1_toDd001_$1 ← > (const word) main::vicSelectGfxBank1_toDd001_$0 Constant right-side identified [211] (word~) main::toD0181_$1 ← (const word) main::toD0181_$0 & (word) $3fff Constant right-side identified [214] (byte~) main::toD0181_$5 ← > (const word) main::toD0181_$4 -Constant right-side identified [234] (signed word*~) show_letter::$26 ← (const signed word*) show_letter::$25 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y -Constant right-side identified [255] (signed word*~) show_letter::$30 ← (const signed word*) show_letter::$29 + (const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y Successful SSA optimization Pass2ConstantRValueConsolidation Constant (const byte) main::vicSelectGfxBank1_toDd001_$1 = >main::vicSelectGfxBank1_toDd001_$0 Constant (const word) main::toD0181_$1 = main::toD0181_$0&$3fff Constant (const byte) main::toD0181_$5 = >main::toD0181_$4 -Constant (const signed word*) show_letter::$24 = show_letter::$23 -Constant (const signed word*) show_letter::$26 = show_letter::$25+OFFSET_STRUCT_SPLINEVECTOR16_Y -Constant (const signed word*) show_letter::$28 = show_letter::$27 -Constant (const signed word*) show_letter::$30 = show_letter::$29+OFFSET_STRUCT_SPLINEVECTOR16_Y Successful SSA optimization Pass2ConstantIdentification Eliminating unused constant (const byte*) PRINT_SCREEN Successful SSA optimization PassNEliminateUnusedVars @@ -3792,8 +3750,8 @@ Inlining Noop Cast [41] (byte*~) memset::$2 ← (byte*)(void*) memset::str#3 kee Inlining Noop Cast [43] (byte*) memset::dst#0 ← (byte*)(void*) memset::str#3 keeping memset::str#3 Inlining Noop Cast [190] (word~) mulf16s::$10 ← (word)(signed word) mulf16s::b#4 keeping mulf16s::b#4 Inlining Noop Cast [196] (word~) mulf16s::$14 ← (word)(signed word) mulf16s::a#4 keeping mulf16s::a#4 -Inlining Noop Cast [274] (word) bitmap_line::x2#1 ← (word)*((const signed word*) bitmap_plot_spline_8seg::$14 + (byte~) bitmap_plot_spline_8seg::$8) keeping *(bitmap_plot_spline_8seg::$14 + bitmap_plot_spline_8seg::$8) -Inlining Noop Cast [275] (word) bitmap_line::y2#1 ← (word)*((const signed word*) bitmap_plot_spline_8seg::$15 + (byte~) bitmap_plot_spline_8seg::$8) keeping *(bitmap_plot_spline_8seg::$15 + bitmap_plot_spline_8seg::$8) +Inlining Noop Cast [274] (word) bitmap_line::x2#1 ← (word)*((const signed word*) bitmap_plot_spline_8seg::$10 + (byte~) bitmap_plot_spline_8seg::$8) keeping *(bitmap_plot_spline_8seg::$10 + bitmap_plot_spline_8seg::$8) +Inlining Noop Cast [275] (word) bitmap_line::y2#1 ← (word)*((const signed word*) bitmap_plot_spline_8seg::$11 + (byte~) bitmap_plot_spline_8seg::$8) keeping *(bitmap_plot_spline_8seg::$11 + bitmap_plot_spline_8seg::$8) Successful SSA optimization Pass2NopCastInlining Inlining Noop Cast [78] (byte*) bitmap_plot::plotter#0 ← (byte*)(word~) bitmap_plot::$3 keeping bitmap_plot::plotter#0 Inlining Noop Cast [317] (signed byte~) rotate::$15 ← (signed byte)(byte~) rotate::$14 keeping rotate::$15 @@ -3879,17 +3837,11 @@ Constant inlined bitmap_gfx#1 = (const byte*) BITMAP_GRAPHICS Constant inlined main::toD0181_$0 = (word)(const byte*) BITMAP_SCREEN Constant inlined show_letter::current_x#0 = (signed word) 0 Constant inlined main::toD0181_$6 = >(word)(const byte*) BITMAP_GRAPHICS/(byte) 4 -Constant inlined show_letter::$24 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO Constant inlined main::toD0181_$5 = >(word)(const byte*) BITMAP_GRAPHICS -Constant inlined show_letter::$25 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO Constant inlined main::w#0 = (byte) 0 Constant inlined main::toD0181_$4 = (word)(const byte*) BITMAP_GRAPHICS -Constant inlined show_letter::$23 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO Constant inlined main::toD0181_$3 = >(word)(const byte*) BITMAP_SCREEN&(word) $3fff*(byte) 4 -Constant inlined bitmap_plot_spline_8seg::$12 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG -Constant inlined bitmap_plot_spline_8seg::$13 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y -Constant inlined bitmap_plot_spline_8seg::$14 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG -Constant inlined bitmap_plot_spline_8seg::$15 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y +Constant inlined show_letter::$23 = (byte*)(const struct Segment*) letter_c Constant inlined mulf_init::sqr1_hi#0 = (const byte*) mulf_sqr1_hi+(byte) 1 Constant inlined mulf_init::sqr1_lo#0 = (const byte*) mulf_sqr1_lo+(byte) 1 Constant inlined spline_8segB::n#0 = (byte) 0 @@ -3900,18 +3852,12 @@ Constant inlined bitmap_plot_spline_8seg::$11 = (signed word*)(const struct Spli Constant inlined mulf_init::c#0 = (byte) 0 Constant inlined main::toD0181_screen#0 = (const byte*) BITMAP_SCREEN Constant inlined main::toD0181_gfx#0 = (const byte*) BITMAP_GRAPHICS -Constant inlined show_letter::$31 = (byte*)(const struct Segment*) letter_c -Constant inlined show_letter::$30 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y Constant inlined bitmap_init::bits#0 = (byte) $80 Constant inlined spline_8segB::$36 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y Constant inlined bitmap_init::bits#2 = (byte) $80 Constant inlined spline_8segB::$32 = (byte) 8*(const byte) SIZEOF_STRUCT_SPLINEVECTOR16 -Constant inlined show_letter::$28 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA Constant inlined spline_8segB::$33 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG -Constant inlined show_letter::$29 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA Constant inlined spline_8segB::$34 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y -Constant inlined show_letter::$26 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y -Constant inlined show_letter::$27 = (signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA Constant inlined spline_8segB::$35 = (signed word*)(const struct SplineVector16*) SPLINE_8SEG Constant inlined sgn_u16::return#3 = (byte) 1 Constant inlined sgn_u16::return#2 = (byte) -1 @@ -3933,9 +3879,9 @@ Successful SSA optimization Pass2ConstantInlining Consolidated array index constant in *((signed word*)SPLINE_8SEG+8*SIZEOF_STRUCT_SPLINEVECTOR16) Consolidated array index constant in *((signed word*)SPLINE_8SEG+OFFSET_STRUCT_SPLINEVECTOR16_Y+8*SIZEOF_STRUCT_SPLINEVECTOR16) Successful SSA optimization Pass2ConstantAdditionElimination -Alias (byte~) show_letter::$20 = (byte~) show_letter::$33 -Alias (byte~) show_letter::$21 = (byte~) show_letter::$35 -Alias (byte~) show_letter::$22 = (byte~) show_letter::$37 +Alias (byte~) show_letter::$20 = (byte~) show_letter::$25 +Alias (byte~) show_letter::$21 = (byte~) show_letter::$27 +Alias (byte~) show_letter::$22 = (byte~) show_letter::$29 Successful SSA optimization Pass2AliasElimination Identical Phi Values (byte) bitmap_clear::fgcol#2 (const byte) WHITE Identical Phi Values (byte) bitmap_clear::bgcol#2 (const byte) BLACK @@ -4308,10 +4254,10 @@ show_letter::@1: scope:[show_letter] from show_letter show_letter::@9 [28] (signed word) show_letter::current_y#4 ← phi( show_letter/(signed word) 0 show_letter::@9/(signed word) show_letter::current_y#11 ) [28] (signed word) show_letter::current_x#4 ← phi( show_letter/(signed word) 0 show_letter::@9/(signed word) show_letter::current_x#11 ) [28] (byte) show_letter::i#10 ← phi( show_letter/(byte) 0 show_letter::@9/(byte) show_letter::i#1 ) - [29] (byte~) show_letter::$32 ← (byte) show_letter::i#10 << (byte) 3 - [30] (byte~) show_letter::$20 ← (byte~) show_letter::$32 + (byte) show_letter::i#10 - [31] (signed word) show_letter::to_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) - [32] (signed word) show_letter::to_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) + [29] (byte~) show_letter::$24 ← (byte) show_letter::i#10 << (byte) 3 + [30] (byte~) show_letter::$20 ← (byte~) show_letter::$24 + (byte) show_letter::i#10 + [31] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) + [32] (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) [33] (signed word) show_letter::to_x#1 ← (signed word) show_letter::to_x#0 - (signed byte) $32 [34] (signed word) show_letter::to_y#1 ← (signed word) show_letter::to_y#0 - (signed word) $96 [35] (signed word) rotate::vector_x#0 ← (signed word) show_letter::to_x#1 @@ -4326,10 +4272,10 @@ show_letter::@6: scope:[show_letter] from show_letter::@1 [42] (signed word) show_letter::to_y#2 ← (signed word) rotate::return_y#0 [43] (signed word) show_letter::current_x#10 ← (signed word) show_letter::to_x#2 + (signed byte) $64 [44] (signed word) show_letter::current_y#10 ← (signed word) show_letter::to_y#2 + (signed byte) $64 - [45] (byte~) show_letter::$34 ← (byte) show_letter::i#10 << (byte) 3 - [46] (byte~) show_letter::$21 ← (byte~) show_letter::$34 + (byte) show_letter::i#10 - [47] (signed word) show_letter::via_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) - [48] (signed word) show_letter::via_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) + [45] (byte~) show_letter::$26 ← (byte) show_letter::i#10 << (byte) 3 + [46] (byte~) show_letter::$21 ← (byte~) show_letter::$26 + (byte) show_letter::i#10 + [47] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) + [48] (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) [49] (signed word) show_letter::via_x#1 ← (signed word) show_letter::via_x#0 - (signed byte) $32 [50] (signed word) show_letter::via_y#1 ← (signed word) show_letter::via_y#0 - (signed word) $96 [51] (signed word) rotate::vector_x#1 ← (signed word) show_letter::via_x#1 @@ -4344,8 +4290,8 @@ show_letter::@7: scope:[show_letter] from show_letter::@6 [58] (signed word) show_letter::via_y#2 ← (signed word) rotate::return_y#1 [59] (signed word) show_letter::segment_via_x#0 ← (signed word) show_letter::via_x#2 + (signed byte) $64 [60] (signed word) show_letter::segment_via_y#0 ← (signed word) show_letter::via_y#2 + (signed byte) $64 - [61] (byte~) show_letter::$36 ← (byte) show_letter::i#10 << (byte) 3 - [62] (byte~) show_letter::$22 ← (byte~) show_letter::$36 + (byte) show_letter::i#10 + [61] (byte~) show_letter::$28 ← (byte) show_letter::i#10 << (byte) 3 + [62] (byte~) show_letter::$22 ← (byte~) show_letter::$28 + (byte) show_letter::i#10 [63] (byte) show_letter::segment_type#0 ← *((byte*)(const struct Segment*) letter_c + (byte~) show_letter::$22) [64] if((byte) show_letter::segment_type#0==(const byte) MOVE_TO) goto show_letter::@3 to:show_letter::@4 @@ -5144,9 +5090,9 @@ VARIABLE REGISTER WEIGHTS (byte~) show_letter::$20 151.5 (byte~) show_letter::$21 151.5 (byte~) show_letter::$22 202.0 -(byte~) show_letter::$32 202.0 -(byte~) show_letter::$34 202.0 -(byte~) show_letter::$36 202.0 +(byte~) show_letter::$24 202.0 +(byte~) show_letter::$26 202.0 +(byte~) show_letter::$28 202.0 (struct SplineVector16~) show_letter::$7 (byte) show_letter::angle (byte) show_letter::angle#0 3.6724137931034484 @@ -5299,7 +5245,7 @@ Initial phi equivalence classes [ mulf_init::dir#2 mulf_init::dir#4 ] [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] Added variable show_letter::angle#0 to live range equivalence class [ show_letter::angle#0 ] -Added variable show_letter::$32 to live range equivalence class [ show_letter::$32 ] +Added variable show_letter::$24 to live range equivalence class [ show_letter::$24 ] Added variable show_letter::$20 to live range equivalence class [ show_letter::$20 ] Added variable show_letter::to_x#0 to live range equivalence class [ show_letter::to_x#0 ] Added variable show_letter::to_y#0 to live range equivalence class [ show_letter::to_y#0 ] @@ -5311,7 +5257,7 @@ Added variable show_letter::to_x#2 to live range equivalence class [ show_letter Added variable show_letter::to_y#2 to live range equivalence class [ show_letter::to_y#2 ] Added variable show_letter::current_x#10 to live range equivalence class [ show_letter::current_x#10 ] Added variable show_letter::current_y#10 to live range equivalence class [ show_letter::current_y#10 ] -Added variable show_letter::$34 to live range equivalence class [ show_letter::$34 ] +Added variable show_letter::$26 to live range equivalence class [ show_letter::$26 ] Added variable show_letter::$21 to live range equivalence class [ show_letter::$21 ] Added variable show_letter::via_x#0 to live range equivalence class [ show_letter::via_x#0 ] Added variable show_letter::via_y#0 to live range equivalence class [ show_letter::via_y#0 ] @@ -5323,7 +5269,7 @@ Added variable show_letter::via_x#2 to live range equivalence class [ show_lette Added variable show_letter::via_y#2 to live range equivalence class [ show_letter::via_y#2 ] Added variable show_letter::segment_via_x#0 to live range equivalence class [ show_letter::segment_via_x#0 ] Added variable show_letter::segment_via_y#0 to live range equivalence class [ show_letter::segment_via_y#0 ] -Added variable show_letter::$36 to live range equivalence class [ show_letter::$36 ] +Added variable show_letter::$28 to live range equivalence class [ show_letter::$28 ] Added variable show_letter::$22 to live range equivalence class [ show_letter::$22 ] Added variable show_letter::segment_type#0 to live range equivalence class [ show_letter::segment_type#0 ] Added variable spline_8segB::p0_x#0 to live range equivalence class [ spline_8segB::p0_x#0 ] @@ -5463,7 +5409,7 @@ Complete equivalence classes [ mulf_init::dir#2 mulf_init::dir#4 ] [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] [ show_letter::angle#0 ] -[ show_letter::$32 ] +[ show_letter::$24 ] [ show_letter::$20 ] [ show_letter::to_x#0 ] [ show_letter::to_y#0 ] @@ -5475,7 +5421,7 @@ Complete equivalence classes [ show_letter::to_y#2 ] [ show_letter::current_x#10 ] [ show_letter::current_y#10 ] -[ show_letter::$34 ] +[ show_letter::$26 ] [ show_letter::$21 ] [ show_letter::via_x#0 ] [ show_letter::via_y#0 ] @@ -5487,7 +5433,7 @@ Complete equivalence classes [ show_letter::via_y#2 ] [ show_letter::segment_via_x#0 ] [ show_letter::segment_via_y#0 ] -[ show_letter::$36 ] +[ show_letter::$28 ] [ show_letter::$22 ] [ show_letter::segment_type#0 ] [ spline_8segB::p0_x#0 ] @@ -5626,7 +5572,7 @@ Allocated zp[2]:78 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] Allocated zp[1]:80 [ mulf_init::dir#2 mulf_init::dir#4 ] Allocated zp[2]:81 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] Allocated zp[1]:83 [ show_letter::angle#0 ] -Allocated zp[1]:84 [ show_letter::$32 ] +Allocated zp[1]:84 [ show_letter::$24 ] Allocated zp[1]:85 [ show_letter::$20 ] Allocated zp[2]:86 [ show_letter::to_x#0 ] Allocated zp[2]:88 [ show_letter::to_y#0 ] @@ -5638,7 +5584,7 @@ Allocated zp[2]:98 [ show_letter::to_x#2 ] Allocated zp[2]:100 [ show_letter::to_y#2 ] Allocated zp[2]:102 [ show_letter::current_x#10 ] Allocated zp[2]:104 [ show_letter::current_y#10 ] -Allocated zp[1]:106 [ show_letter::$34 ] +Allocated zp[1]:106 [ show_letter::$26 ] Allocated zp[1]:107 [ show_letter::$21 ] Allocated zp[2]:108 [ show_letter::via_x#0 ] Allocated zp[2]:110 [ show_letter::via_y#0 ] @@ -5650,7 +5596,7 @@ Allocated zp[2]:120 [ show_letter::via_x#2 ] Allocated zp[2]:122 [ show_letter::via_y#2 ] Allocated zp[2]:124 [ show_letter::segment_via_x#0 ] Allocated zp[2]:126 [ show_letter::segment_via_y#0 ] -Allocated zp[1]:128 [ show_letter::$36 ] +Allocated zp[1]:128 [ show_letter::$28 ] Allocated zp[1]:129 [ show_letter::$22 ] Allocated zp[1]:130 [ show_letter::segment_type#0 ] Allocated zp[2]:131 [ spline_8segB::p0_x#0 ] @@ -5946,9 +5892,9 @@ show_letter: { .label current_y = 7 .label current_x_1 = $66 .label current_y_1 = $68 - .label __32 = $54 - .label __34 = $6a - .label __36 = $80 + .label __24 = $54 + .label __26 = $6a + .label __28 = $80 // [28] phi from show_letter to show_letter::@1 [phi:show_letter->show_letter::@1] __b1_from_show_letter: // [28] phi (signed word) show_letter::current_y#4 = (signed word) 0 [phi:show_letter->show_letter::@1#0] -- vwsz1=vwsc1 @@ -5967,24 +5913,24 @@ show_letter: { jmp __b1 // show_letter::@1 __b1: - // [29] (byte~) show_letter::$32 ← (byte) show_letter::i#10 << (byte) 3 -- vbuz1=vbuz2_rol_3 + // [29] (byte~) show_letter::$24 ← (byte) show_letter::i#10 << (byte) 3 -- vbuz1=vbuz2_rol_3 lda.z i asl asl asl - sta.z __32 - // [30] (byte~) show_letter::$20 ← (byte~) show_letter::$32 + (byte) show_letter::i#10 -- vbuz1=vbuz2_plus_vbuz3 - lda.z __32 + sta.z __24 + // [30] (byte~) show_letter::$20 ← (byte~) show_letter::$24 + (byte) show_letter::i#10 -- vbuz1=vbuz2_plus_vbuz3 + lda.z __24 clc adc.z i sta.z __20 - // [31] (signed word) show_letter::to_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuz2 + // [31] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuz2 ldy.z __20 lda letter_c+OFFSET_STRUCT_SEGMENT_TO,y sta.z to_x lda letter_c+OFFSET_STRUCT_SEGMENT_TO+1,y sta.z to_x+1 - // [32] (signed word) show_letter::to_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuz2 + // [32] (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuz2 ldy.z __20 lda letter_c+OFFSET_STRUCT_SEGMENT_TO+OFFSET_STRUCT_SPLINEVECTOR16_Y,y sta.z to_y @@ -6065,24 +6011,24 @@ show_letter: { lda.z to_y_2+1 adc #>$64 sta.z current_y_1+1 - // [45] (byte~) show_letter::$34 ← (byte) show_letter::i#10 << (byte) 3 -- vbuz1=vbuz2_rol_3 + // [45] (byte~) show_letter::$26 ← (byte) show_letter::i#10 << (byte) 3 -- vbuz1=vbuz2_rol_3 lda.z i asl asl asl - sta.z __34 - // [46] (byte~) show_letter::$21 ← (byte~) show_letter::$34 + (byte) show_letter::i#10 -- vbuz1=vbuz2_plus_vbuz3 - lda.z __34 + sta.z __26 + // [46] (byte~) show_letter::$21 ← (byte~) show_letter::$26 + (byte) show_letter::i#10 -- vbuz1=vbuz2_plus_vbuz3 + lda.z __26 clc adc.z i sta.z __21 - // [47] (signed word) show_letter::via_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuz2 + // [47] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuz2 ldy.z __21 lda letter_c+OFFSET_STRUCT_SEGMENT_VIA,y sta.z via_x lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+1,y sta.z via_x+1 - // [48] (signed word) show_letter::via_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuz2 + // [48] (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuz2 ldy.z __21 lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+OFFSET_STRUCT_SPLINEVECTOR16_Y,y sta.z via_y @@ -6163,14 +6109,14 @@ show_letter: { lda.z via_y_2+1 adc #>$64 sta.z segment_via_y+1 - // [61] (byte~) show_letter::$36 ← (byte) show_letter::i#10 << (byte) 3 -- vbuz1=vbuz2_rol_3 + // [61] (byte~) show_letter::$28 ← (byte) show_letter::i#10 << (byte) 3 -- vbuz1=vbuz2_rol_3 lda.z i asl asl asl - sta.z __36 - // [62] (byte~) show_letter::$22 ← (byte~) show_letter::$36 + (byte) show_letter::i#10 -- vbuz1=vbuz2_plus_vbuz3 - lda.z __36 + sta.z __28 + // [62] (byte~) show_letter::$22 ← (byte~) show_letter::$28 + (byte) show_letter::i#10 -- vbuz1=vbuz2_plus_vbuz3 + lda.z __28 clc adc.z i sta.z __22 @@ -8418,13 +8364,13 @@ Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::a Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::w#4 main::w#1 ] Statement [23] if(*((const byte*) RASTER)!=(byte) $ff) goto main::@4 [ main::angle#2 main::w#4 ] ( main:2 [ main::angle#2 main::w#4 ] ) always clobbers reg byte a Statement [26] (byte) main::angle#1 ← (byte) main::angle#2 + (byte) 9 [ main::angle#1 ] ( main:2 [ main::angle#1 ] ) always clobbers reg byte a -Statement [29] (byte~) show_letter::$32 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$32 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$32 ] ) always clobbers reg byte a +Statement [29] (byte~) show_letter::$24 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$24 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$24 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:83 [ show_letter::angle#0 ] Removing always clobbered register reg byte a as potential for zp[1]:4 [ show_letter::i#10 show_letter::i#1 ] -Statement [30] (byte~) show_letter::$20 ← (byte~) show_letter::$32 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ) always clobbers reg byte a -Statement [31] (signed word) show_letter::to_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ) always clobbers reg byte a +Statement [30] (byte~) show_letter::$20 ← (byte~) show_letter::$24 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ) always clobbers reg byte a +Statement [31] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:85 [ show_letter::$20 ] -Statement [32] (signed word) show_letter::to_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ) always clobbers reg byte a +Statement [32] (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ) always clobbers reg byte a Statement [33] (signed word) show_letter::to_x#1 ← (signed word) show_letter::to_x#0 - (signed byte) $32 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#0 show_letter::to_x#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#0 show_letter::to_x#1 ] ) always clobbers reg byte a Statement [34] (signed word) show_letter::to_y#1 ← (signed word) show_letter::to_y#0 - (signed word) $96 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#1 show_letter::to_y#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#1 show_letter::to_y#1 ] ) always clobbers reg byte a Statement [35] (signed word) rotate::vector_x#0 ← (signed word) show_letter::to_x#1 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#1 rotate::vector_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#1 rotate::vector_x#0 ] ) always clobbers reg byte a @@ -8435,11 +8381,11 @@ Statement [41] (signed word) show_letter::to_x#2 ← (signed word) rotate::retur Statement [42] (signed word) show_letter::to_y#2 ← (signed word) rotate::return_y#0 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#2 show_letter::to_y#2 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#2 show_letter::to_y#2 ] ) always clobbers reg byte a Statement [43] (signed word) show_letter::current_x#10 ← (signed word) show_letter::to_x#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#2 show_letter::current_x#10 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#2 show_letter::current_x#10 ] ) always clobbers reg byte a Statement [44] (signed word) show_letter::current_y#10 ← (signed word) show_letter::to_y#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 ] ) always clobbers reg byte a -Statement [45] (byte~) show_letter::$34 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$34 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$34 ] ) always clobbers reg byte a -Statement [46] (byte~) show_letter::$21 ← (byte~) show_letter::$34 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ) always clobbers reg byte a -Statement [47] (signed word) show_letter::via_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ) always clobbers reg byte a +Statement [45] (byte~) show_letter::$26 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$26 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$26 ] ) always clobbers reg byte a +Statement [46] (byte~) show_letter::$21 ← (byte~) show_letter::$26 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ) always clobbers reg byte a +Statement [47] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:107 [ show_letter::$21 ] -Statement [48] (signed word) show_letter::via_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ) always clobbers reg byte a +Statement [48] (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ) always clobbers reg byte a Statement [49] (signed word) show_letter::via_x#1 ← (signed word) show_letter::via_x#0 - (signed byte) $32 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#0 show_letter::via_x#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#0 show_letter::via_x#1 ] ) always clobbers reg byte a Statement [50] (signed word) show_letter::via_y#1 ← (signed word) show_letter::via_y#0 - (signed word) $96 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#1 show_letter::via_y#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#1 show_letter::via_y#1 ] ) always clobbers reg byte a Statement [51] (signed word) rotate::vector_x#1 ← (signed word) show_letter::via_x#1 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#1 rotate::vector_x#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#1 rotate::vector_x#1 ] ) always clobbers reg byte a @@ -8450,8 +8396,8 @@ Statement [57] (signed word) show_letter::via_x#2 ← (signed word) rotate::retu Statement [58] (signed word) show_letter::via_y#2 ← (signed word) rotate::return_y#1 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#2 show_letter::via_y#2 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#2 show_letter::via_y#2 ] ) always clobbers reg byte a Statement [59] (signed word) show_letter::segment_via_x#0 ← (signed word) show_letter::via_x#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#2 show_letter::segment_via_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#2 show_letter::segment_via_x#0 ] ) always clobbers reg byte a Statement [60] (signed word) show_letter::segment_via_y#0 ← (signed word) show_letter::via_y#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 ] ) always clobbers reg byte a -Statement [61] (byte~) show_letter::$36 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$36 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$36 ] ) always clobbers reg byte a -Statement [62] (byte~) show_letter::$22 ← (byte~) show_letter::$36 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ) always clobbers reg byte a +Statement [61] (byte~) show_letter::$28 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$28 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$28 ] ) always clobbers reg byte a +Statement [62] (byte~) show_letter::$22 ← (byte~) show_letter::$28 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ) always clobbers reg byte a Statement [66] (word) bitmap_line::x1#0 ← (word)(signed word) show_letter::current_x#4 [ show_letter::angle#0 show_letter::i#10 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 ] ) always clobbers reg byte a Statement [67] (word) bitmap_line::y1#0 ← (word)(signed word) show_letter::current_y#4 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 ] ) always clobbers reg byte a Statement [68] (word) bitmap_line::x2#0 ← (word)(signed word) show_letter::current_x#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 bitmap_line::x2#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 bitmap_line::x2#0 ] ) always clobbers reg byte a @@ -8656,10 +8602,10 @@ Statement [19] (byte) show_letter::angle#0 ← (byte) main::angle#2 [ main::angl Statement [22] if(*((const byte*) RASTER)!=(byte) $fe) goto main::@3 [ main::angle#2 main::w#4 ] ( main:2 [ main::angle#2 main::w#4 ] ) always clobbers reg byte a Statement [23] if(*((const byte*) RASTER)!=(byte) $ff) goto main::@4 [ main::angle#2 main::w#4 ] ( main:2 [ main::angle#2 main::w#4 ] ) always clobbers reg byte a Statement [26] (byte) main::angle#1 ← (byte) main::angle#2 + (byte) 9 [ main::angle#1 ] ( main:2 [ main::angle#1 ] ) always clobbers reg byte a reg byte x -Statement [29] (byte~) show_letter::$32 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$32 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$32 ] ) always clobbers reg byte a -Statement [30] (byte~) show_letter::$20 ← (byte~) show_letter::$32 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ) always clobbers reg byte a -Statement [31] (signed word) show_letter::to_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ) always clobbers reg byte a -Statement [32] (signed word) show_letter::to_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ) always clobbers reg byte a +Statement [29] (byte~) show_letter::$24 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$24 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$24 ] ) always clobbers reg byte a +Statement [30] (byte~) show_letter::$20 ← (byte~) show_letter::$24 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 ] ) always clobbers reg byte a +Statement [31] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::$20 show_letter::to_x#0 ] ) always clobbers reg byte a +Statement [32] (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#0 show_letter::to_y#0 ] ) always clobbers reg byte a Statement [33] (signed word) show_letter::to_x#1 ← (signed word) show_letter::to_x#0 - (signed byte) $32 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#0 show_letter::to_x#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#0 show_letter::to_x#1 ] ) always clobbers reg byte a Statement [34] (signed word) show_letter::to_y#1 ← (signed word) show_letter::to_y#0 - (signed word) $96 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#1 show_letter::to_y#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#1 show_letter::to_y#1 ] ) always clobbers reg byte a Statement [35] (signed word) rotate::vector_x#0 ← (signed word) show_letter::to_x#1 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#1 rotate::vector_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#1 rotate::vector_x#0 ] ) always clobbers reg byte a @@ -8670,10 +8616,10 @@ Statement [41] (signed word) show_letter::to_x#2 ← (signed word) rotate::retur Statement [42] (signed word) show_letter::to_y#2 ← (signed word) rotate::return_y#0 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#2 show_letter::to_y#2 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_x#2 show_letter::to_y#2 ] ) always clobbers reg byte a Statement [43] (signed word) show_letter::current_x#10 ← (signed word) show_letter::to_x#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#2 show_letter::current_x#10 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::to_y#2 show_letter::current_x#10 ] ) always clobbers reg byte a Statement [44] (signed word) show_letter::current_y#10 ← (signed word) show_letter::to_y#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 ] ) always clobbers reg byte a -Statement [45] (byte~) show_letter::$34 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$34 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$34 ] ) always clobbers reg byte a -Statement [46] (byte~) show_letter::$21 ← (byte~) show_letter::$34 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ) always clobbers reg byte a -Statement [47] (signed word) show_letter::via_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ) always clobbers reg byte a -Statement [48] (signed word) show_letter::via_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ) always clobbers reg byte a +Statement [45] (byte~) show_letter::$26 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$26 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$26 ] ) always clobbers reg byte a +Statement [46] (byte~) show_letter::$21 ← (byte~) show_letter::$26 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 ] ) always clobbers reg byte a +Statement [47] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::$21 show_letter::via_x#0 ] ) always clobbers reg byte a +Statement [48] (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#0 show_letter::via_y#0 ] ) always clobbers reg byte a Statement [49] (signed word) show_letter::via_x#1 ← (signed word) show_letter::via_x#0 - (signed byte) $32 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#0 show_letter::via_x#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#0 show_letter::via_x#1 ] ) always clobbers reg byte a Statement [50] (signed word) show_letter::via_y#1 ← (signed word) show_letter::via_y#0 - (signed word) $96 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#1 show_letter::via_y#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#1 show_letter::via_y#1 ] ) always clobbers reg byte a Statement [51] (signed word) rotate::vector_x#1 ← (signed word) show_letter::via_x#1 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#1 rotate::vector_x#1 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#1 rotate::vector_x#1 ] ) always clobbers reg byte a @@ -8684,8 +8630,8 @@ Statement [57] (signed word) show_letter::via_x#2 ← (signed word) rotate::retu Statement [58] (signed word) show_letter::via_y#2 ← (signed word) rotate::return_y#1 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#2 show_letter::via_y#2 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_x#2 show_letter::via_y#2 ] ) always clobbers reg byte a Statement [59] (signed word) show_letter::segment_via_x#0 ← (signed word) show_letter::via_x#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#2 show_letter::segment_via_x#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::via_y#2 show_letter::segment_via_x#0 ] ) always clobbers reg byte a Statement [60] (signed word) show_letter::segment_via_y#0 ← (signed word) show_letter::via_y#2 + (signed byte) $64 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 ] ) always clobbers reg byte a -Statement [61] (byte~) show_letter::$36 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$36 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$36 ] ) always clobbers reg byte a -Statement [62] (byte~) show_letter::$22 ← (byte~) show_letter::$36 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ) always clobbers reg byte a +Statement [61] (byte~) show_letter::$28 ← (byte) show_letter::i#10 << (byte) 3 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$28 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$28 ] ) always clobbers reg byte a +Statement [62] (byte~) show_letter::$22 ← (byte~) show_letter::$28 + (byte) show_letter::i#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#4 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 show_letter::segment_via_x#0 show_letter::segment_via_y#0 show_letter::$22 ] ) always clobbers reg byte a Statement [66] (word) bitmap_line::x1#0 ← (word)(signed word) show_letter::current_x#4 [ show_letter::angle#0 show_letter::i#10 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_y#4 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 ] ) always clobbers reg byte a Statement [67] (word) bitmap_line::y1#0 ← (word)(signed word) show_letter::current_y#4 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 ] ) always clobbers reg byte a Statement [68] (word) bitmap_line::x2#0 ← (word)(signed word) show_letter::current_x#10 [ show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 bitmap_line::x2#0 ] ( main:2::show_letter:20 [ main::angle#2 show_letter::angle#0 show_letter::i#10 show_letter::current_x#10 show_letter::current_y#10 bitmap_line::x1#0 bitmap_line::y1#0 bitmap_line::x2#0 ] ) always clobbers reg byte a @@ -8906,7 +8852,7 @@ Potential registers zp[2]:78 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] : zp[ Potential registers zp[1]:80 [ mulf_init::dir#2 mulf_init::dir#4 ] : zp[1]:80 , reg byte x , Potential registers zp[2]:81 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] : zp[2]:81 , Potential registers zp[1]:83 [ show_letter::angle#0 ] : zp[1]:83 , -Potential registers zp[1]:84 [ show_letter::$32 ] : zp[1]:84 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:84 [ show_letter::$24 ] : zp[1]:84 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:85 [ show_letter::$20 ] : zp[1]:85 , reg byte x , reg byte y , Potential registers zp[2]:86 [ show_letter::to_x#0 ] : zp[2]:86 , Potential registers zp[2]:88 [ show_letter::to_y#0 ] : zp[2]:88 , @@ -8918,7 +8864,7 @@ Potential registers zp[2]:98 [ show_letter::to_x#2 ] : zp[2]:98 , Potential registers zp[2]:100 [ show_letter::to_y#2 ] : zp[2]:100 , Potential registers zp[2]:102 [ show_letter::current_x#10 ] : zp[2]:102 , Potential registers zp[2]:104 [ show_letter::current_y#10 ] : zp[2]:104 , -Potential registers zp[1]:106 [ show_letter::$34 ] : zp[1]:106 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:106 [ show_letter::$26 ] : zp[1]:106 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:107 [ show_letter::$21 ] : zp[1]:107 , reg byte x , reg byte y , Potential registers zp[2]:108 [ show_letter::via_x#0 ] : zp[2]:108 , Potential registers zp[2]:110 [ show_letter::via_y#0 ] : zp[2]:110 , @@ -8930,7 +8876,7 @@ Potential registers zp[2]:120 [ show_letter::via_x#2 ] : zp[2]:120 , Potential registers zp[2]:122 [ show_letter::via_y#2 ] : zp[2]:122 , Potential registers zp[2]:124 [ show_letter::segment_via_x#0 ] : zp[2]:124 , Potential registers zp[2]:126 [ show_letter::segment_via_y#0 ] : zp[2]:126 , -Potential registers zp[1]:128 [ show_letter::$36 ] : zp[1]:128 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:128 [ show_letter::$28 ] : zp[1]:128 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:129 [ show_letter::$22 ] : zp[1]:129 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:130 [ show_letter::segment_type#0 ] : zp[1]:130 , reg byte a , reg byte x , reg byte y , Potential registers zp[2]:131 [ spline_8segB::p0_x#0 ] : zp[2]:131 , @@ -9027,7 +8973,7 @@ Uplift Scope [bitmap_line] 7,125.57: zp[2]:20 [ bitmap_line::y#15 bitmap_line::y Uplift Scope [spline_8segB] 2,002: zp[2]:200 [ spline_8segB::$22 ] 2,002: zp[2]:204 [ spline_8segB::$24 ] 1,751.75: zp[1]:39 [ spline_8segB::n#2 spline_8segB::n#1 ] 1,501.5: zp[1]:208 [ spline_8segB::$31 ] 941.32: zp[2]:42 [ spline_8segB::i_y#2 spline_8segB::i_y#0 spline_8segB::i_y#1 ] 801.57: zp[2]:40 [ spline_8segB::i_x#2 spline_8segB::i_x#0 spline_8segB::i_x#1 ] 711.62: zp[2]:35 [ spline_8segB::p_x#2 spline_8segB::p_x#0 spline_8segB::p_x#1 ] 667.33: zp[2]:206 [ spline_8segB::$25 ] 624.17: zp[2]:37 [ spline_8segB::p_y#2 spline_8segB::p_y#0 spline_8segB::p_y#1 ] 500.5: zp[2]:202 [ spline_8segB::$23 ] 59: zp[2]:198 [ spline_8segB::j_y#0 ] 55.72: zp[2]:196 [ spline_8segB::j_x#0 ] 34.33: zp[2]:139 [ spline_8segB::p2_x#0 ] 20.6: zp[2]:141 [ spline_8segB::p2_y#0 ] 10.5: zp[2]:135 [ spline_8segB::p1_x#0 ] 9.55: zp[2]:137 [ spline_8segB::p1_y#0 ] 4.86: zp[2]:131 [ spline_8segB::p0_x#0 ] 4.86: zp[2]:133 [ spline_8segB::p0_y#0 ] 4: zp[2]:172 [ spline_8segB::$0 ] 4: zp[2]:174 [ spline_8segB::$1 ] 4: zp[2]:178 [ spline_8segB::$3 ] 4: zp[2]:180 [ spline_8segB::$4 ] 4: zp[2]:184 [ spline_8segB::$6 ] 4: zp[2]:188 [ spline_8segB::$8 ] 4: zp[2]:192 [ spline_8segB::$10 ] 4: zp[2]:194 [ spline_8segB::$12 ] 4: zp[2]:209 [ spline_8segB::$18 ] 4: zp[2]:213 [ spline_8segB::$20 ] 2: zp[2]:215 [ spline_8segB::$21 ] 1.33: zp[2]:186 [ spline_8segB::b_x#0 ] 1.33: zp[2]:190 [ spline_8segB::b_y#0 ] 1.33: zp[2]:211 [ spline_8segB::$19 ] 0.6: zp[2]:182 [ spline_8segB::a_y#0 ] 0.5: zp[2]:176 [ spline_8segB::a_x#0 ] Uplift Scope [bitmap_plot] 4,514.5: zp[2]:27 [ bitmap_plot::x#4 bitmap_plot::x#3 bitmap_plot::x#2 bitmap_plot::x#0 bitmap_plot::x#1 ] 4,016: zp[1]:26 [ bitmap_plot::y#4 bitmap_plot::y#3 bitmap_plot::y#2 bitmap_plot::y#0 bitmap_plot::y#1 ] 4: zp[2]:163 [ bitmap_plot::$1 ] 4: zp[1]:167 [ bitmap_plot::$2 ] 3: zp[2]:165 [ bitmap_plot::plotter#1 ] 1: zp[2]:161 [ bitmap_plot::plotter#0 ] Uplift Scope [bitmap_plot_spline_8seg] 1,901.9: zp[1]:13 [ bitmap_plot_spline_8seg::n#2 bitmap_plot_spline_8seg::n#1 ] 1,505.5: zp[2]:9 [ bitmap_plot_spline_8seg::current_x#2 bitmap_plot_spline_8seg::current_x#0 bitmap_plot_spline_8seg::current_x#1 ] 1,501.5: zp[1]:144 [ bitmap_plot_spline_8seg::$9 ] 1,172.83: zp[2]:11 [ bitmap_plot_spline_8seg::current_y#2 bitmap_plot_spline_8seg::current_y#0 bitmap_plot_spline_8seg::current_y#1 ] 500.5: zp[1]:143 [ bitmap_plot_spline_8seg::$8 ] -Uplift Scope [show_letter] 207.05: zp[2]:7 [ show_letter::current_y#4 show_letter::current_y#11 ] 202: zp[1]:84 [ show_letter::$32 ] 202: zp[1]:106 [ show_letter::$34 ] 202: zp[1]:128 [ show_letter::$36 ] 202: zp[1]:129 [ show_letter::$22 ] 151.5: zp[1]:85 [ show_letter::$20 ] 151.5: zp[1]:107 [ show_letter::$21 ] 151.5: zp[1]:130 [ show_letter::segment_type#0 ] 106.32: zp[2]:5 [ show_letter::current_x#4 show_letter::current_x#11 ] 101: zp[2]:86 [ show_letter::to_x#0 ] 101: zp[2]:88 [ show_letter::to_y#0 ] 101: zp[2]:90 [ show_letter::to_x#1 ] 101: zp[2]:92 [ show_letter::to_y#1 ] 101: zp[2]:98 [ show_letter::to_x#2 ] 101: zp[2]:100 [ show_letter::to_y#2 ] 101: zp[2]:108 [ show_letter::via_x#0 ] 101: zp[2]:110 [ show_letter::via_y#0 ] 101: zp[2]:112 [ show_letter::via_x#1 ] 101: zp[2]:114 [ show_letter::via_y#1 ] 101: zp[2]:120 [ show_letter::via_x#2 ] 101: zp[2]:122 [ show_letter::via_y#2 ] 91.29: zp[1]:4 [ show_letter::i#10 show_letter::i#1 ] 22.44: zp[2]:124 [ show_letter::segment_via_x#0 ] 22.44: zp[2]:126 [ show_letter::segment_via_y#0 ] 7.77: zp[2]:102 [ show_letter::current_x#10 ] 7.77: zp[2]:104 [ show_letter::current_y#10 ] 3.67: zp[1]:83 [ show_letter::angle#0 ] +Uplift Scope [show_letter] 207.05: zp[2]:7 [ show_letter::current_y#4 show_letter::current_y#11 ] 202: zp[1]:84 [ show_letter::$24 ] 202: zp[1]:106 [ show_letter::$26 ] 202: zp[1]:128 [ show_letter::$28 ] 202: zp[1]:129 [ show_letter::$22 ] 151.5: zp[1]:85 [ show_letter::$20 ] 151.5: zp[1]:107 [ show_letter::$21 ] 151.5: zp[1]:130 [ show_letter::segment_type#0 ] 106.32: zp[2]:5 [ show_letter::current_x#4 show_letter::current_x#11 ] 101: zp[2]:86 [ show_letter::to_x#0 ] 101: zp[2]:88 [ show_letter::to_y#0 ] 101: zp[2]:90 [ show_letter::to_x#1 ] 101: zp[2]:92 [ show_letter::to_y#1 ] 101: zp[2]:98 [ show_letter::to_x#2 ] 101: zp[2]:100 [ show_letter::to_y#2 ] 101: zp[2]:108 [ show_letter::via_x#0 ] 101: zp[2]:110 [ show_letter::via_y#0 ] 101: zp[2]:112 [ show_letter::via_x#1 ] 101: zp[2]:114 [ show_letter::via_y#1 ] 101: zp[2]:120 [ show_letter::via_x#2 ] 101: zp[2]:122 [ show_letter::via_y#2 ] 91.29: zp[1]:4 [ show_letter::i#10 show_letter::i#1 ] 22.44: zp[2]:124 [ show_letter::segment_via_x#0 ] 22.44: zp[2]:126 [ show_letter::segment_via_y#0 ] 7.77: zp[2]:102 [ show_letter::current_x#10 ] 7.77: zp[2]:104 [ show_letter::current_y#10 ] 3.67: zp[1]:83 [ show_letter::angle#0 ] Uplift Scope [rotate] 416.62: zp[1]:44 [ rotate::angle#2 rotate::angle#0 rotate::angle#1 ] 213.44: zp[2]:47 [ rotate::vector_y#2 rotate::vector_y#0 rotate::vector_y#1 ] 142.59: zp[2]:45 [ rotate::vector_x#2 rotate::vector_x#0 rotate::vector_x#1 ] 101: zp[2]:94 [ rotate::return_x#0 ] 101: zp[2]:96 [ rotate::return_y#0 ] 101: zp[2]:116 [ rotate::return_x#1 ] 101: zp[2]:118 [ rotate::return_y#1 ] 34: zp[2]:274 [ rotate::return_x#2 ] 34: zp[2]:277 [ rotate::return_y#2 ] 4: zp[2]:227 [ rotate::$2 ] 4: zp[2]:239 [ rotate::$5 ] 4: zp[2]:253 [ rotate::$9 ] 4: zp[2]:255 [ rotate::$10 ] 4: zp[2]:267 [ rotate::$12 ] 4: zp[2]:269 [ rotate::$13 ] 2: zp[4]:223 [ rotate::$1 ] 2: zp[4]:235 [ rotate::$4 ] 2: zp[4]:249 [ rotate::$8 ] 2: zp[4]:263 [ rotate::$11 ] 2: zp[1]:273 [ rotate::$15 ] 2: zp[1]:276 [ rotate::$18 ] 1.33: zp[2]:271 [ rotate::yr#1 ] 0.75: zp[2]:217 [ rotate::cos_a#0 ] 0.67: zp[2]:243 [ rotate::sin_a#0 ] 0.44: zp[2]:257 [ rotate::xr#1 ] 0.25: zp[2]:229 [ rotate::xr#0 ] 0.24: zp[2]:241 [ rotate::yr#0 ] Uplift Scope [main] 886.17: zp[1]:3 [ main::w#4 main::w#1 ] 25.3: zp[1]:2 [ main::angle#2 main::angle#1 ] Uplift Scope [memset] 341.33: zp[2]:62 [ memset::dst#2 memset::dst#4 memset::dst#1 ] 17.17: zp[2]:303 [ memset::end#0 ] 12.62: zp[1]:61 [ memset::c#4 ] 2: zp[2]:57 [ memset::num#2 ] 0: zp[2]:59 [ memset::str#3 ] @@ -9049,7 +8995,7 @@ Uplifting [bitmap_line] best 849275 combination zp[2]:20 [ bitmap_line::y#15 bit Uplifting [spline_8segB] best 832275 combination zp[2]:200 [ spline_8segB::$22 ] zp[2]:204 [ spline_8segB::$24 ] reg byte y [ spline_8segB::n#2 spline_8segB::n#1 ] reg byte x [ spline_8segB::$31 ] zp[2]:42 [ spline_8segB::i_y#2 spline_8segB::i_y#0 spline_8segB::i_y#1 ] zp[2]:40 [ spline_8segB::i_x#2 spline_8segB::i_x#0 spline_8segB::i_x#1 ] zp[2]:35 [ spline_8segB::p_x#2 spline_8segB::p_x#0 spline_8segB::p_x#1 ] zp[2]:206 [ spline_8segB::$25 ] zp[2]:37 [ spline_8segB::p_y#2 spline_8segB::p_y#0 spline_8segB::p_y#1 ] zp[2]:202 [ spline_8segB::$23 ] zp[2]:198 [ spline_8segB::j_y#0 ] zp[2]:196 [ spline_8segB::j_x#0 ] zp[2]:139 [ spline_8segB::p2_x#0 ] zp[2]:141 [ spline_8segB::p2_y#0 ] zp[2]:135 [ spline_8segB::p1_x#0 ] zp[2]:137 [ spline_8segB::p1_y#0 ] zp[2]:131 [ spline_8segB::p0_x#0 ] zp[2]:133 [ spline_8segB::p0_y#0 ] zp[2]:172 [ spline_8segB::$0 ] zp[2]:174 [ spline_8segB::$1 ] zp[2]:178 [ spline_8segB::$3 ] zp[2]:180 [ spline_8segB::$4 ] zp[2]:184 [ spline_8segB::$6 ] zp[2]:188 [ spline_8segB::$8 ] zp[2]:192 [ spline_8segB::$10 ] zp[2]:194 [ spline_8segB::$12 ] zp[2]:209 [ spline_8segB::$18 ] zp[2]:213 [ spline_8segB::$20 ] zp[2]:215 [ spline_8segB::$21 ] zp[2]:186 [ spline_8segB::b_x#0 ] zp[2]:190 [ spline_8segB::b_y#0 ] zp[2]:211 [ spline_8segB::$19 ] zp[2]:182 [ spline_8segB::a_y#0 ] zp[2]:176 [ spline_8segB::a_x#0 ] Uplifting [bitmap_plot] best 830266 combination zp[2]:27 [ bitmap_plot::x#4 bitmap_plot::x#3 bitmap_plot::x#2 bitmap_plot::x#0 bitmap_plot::x#1 ] reg byte x [ bitmap_plot::y#4 bitmap_plot::y#3 bitmap_plot::y#2 bitmap_plot::y#0 bitmap_plot::y#1 ] zp[2]:163 [ bitmap_plot::$1 ] reg byte a [ bitmap_plot::$2 ] zp[2]:165 [ bitmap_plot::plotter#1 ] zp[2]:161 [ bitmap_plot::plotter#0 ] Uplifting [bitmap_plot_spline_8seg] best 816266 combination zp[1]:13 [ bitmap_plot_spline_8seg::n#2 bitmap_plot_spline_8seg::n#1 ] zp[2]:9 [ bitmap_plot_spline_8seg::current_x#2 bitmap_plot_spline_8seg::current_x#0 bitmap_plot_spline_8seg::current_x#1 ] reg byte x [ bitmap_plot_spline_8seg::$9 ] zp[2]:11 [ bitmap_plot_spline_8seg::current_y#2 bitmap_plot_spline_8seg::current_y#0 bitmap_plot_spline_8seg::current_y#1 ] reg byte x [ bitmap_plot_spline_8seg::$8 ] -Uplifting [show_letter] best 814066 combination zp[2]:7 [ show_letter::current_y#4 show_letter::current_y#11 ] reg byte a [ show_letter::$32 ] reg byte a [ show_letter::$34 ] reg byte a [ show_letter::$36 ] reg byte a [ show_letter::$22 ] zp[1]:85 [ show_letter::$20 ] zp[1]:107 [ show_letter::$21 ] zp[1]:130 [ show_letter::segment_type#0 ] zp[2]:5 [ show_letter::current_x#4 show_letter::current_x#11 ] zp[2]:86 [ show_letter::to_x#0 ] zp[2]:88 [ show_letter::to_y#0 ] zp[2]:90 [ show_letter::to_x#1 ] zp[2]:92 [ show_letter::to_y#1 ] zp[2]:98 [ show_letter::to_x#2 ] zp[2]:100 [ show_letter::to_y#2 ] zp[2]:108 [ show_letter::via_x#0 ] zp[2]:110 [ show_letter::via_y#0 ] zp[2]:112 [ show_letter::via_x#1 ] zp[2]:114 [ show_letter::via_y#1 ] zp[2]:120 [ show_letter::via_x#2 ] zp[2]:122 [ show_letter::via_y#2 ] zp[1]:4 [ show_letter::i#10 show_letter::i#1 ] zp[2]:124 [ show_letter::segment_via_x#0 ] zp[2]:126 [ show_letter::segment_via_y#0 ] zp[2]:102 [ show_letter::current_x#10 ] zp[2]:104 [ show_letter::current_y#10 ] zp[1]:83 [ show_letter::angle#0 ] +Uplifting [show_letter] best 814066 combination zp[2]:7 [ show_letter::current_y#4 show_letter::current_y#11 ] reg byte a [ show_letter::$24 ] reg byte a [ show_letter::$26 ] reg byte a [ show_letter::$28 ] reg byte a [ show_letter::$22 ] zp[1]:85 [ show_letter::$20 ] zp[1]:107 [ show_letter::$21 ] zp[1]:130 [ show_letter::segment_type#0 ] zp[2]:5 [ show_letter::current_x#4 show_letter::current_x#11 ] zp[2]:86 [ show_letter::to_x#0 ] zp[2]:88 [ show_letter::to_y#0 ] zp[2]:90 [ show_letter::to_x#1 ] zp[2]:92 [ show_letter::to_y#1 ] zp[2]:98 [ show_letter::to_x#2 ] zp[2]:100 [ show_letter::to_y#2 ] zp[2]:108 [ show_letter::via_x#0 ] zp[2]:110 [ show_letter::via_y#0 ] zp[2]:112 [ show_letter::via_x#1 ] zp[2]:114 [ show_letter::via_y#1 ] zp[2]:120 [ show_letter::via_x#2 ] zp[2]:122 [ show_letter::via_y#2 ] zp[1]:4 [ show_letter::i#10 show_letter::i#1 ] zp[2]:124 [ show_letter::segment_via_x#0 ] zp[2]:126 [ show_letter::segment_via_y#0 ] zp[2]:102 [ show_letter::current_x#10 ] zp[2]:104 [ show_letter::current_y#10 ] zp[1]:83 [ show_letter::angle#0 ] Limited combination testing to 100 combinations of 9216 possible. Uplifting [rotate] best 813448 combination reg byte y [ rotate::angle#2 rotate::angle#0 rotate::angle#1 ] zp[2]:47 [ rotate::vector_y#2 rotate::vector_y#0 rotate::vector_y#1 ] zp[2]:45 [ rotate::vector_x#2 rotate::vector_x#0 rotate::vector_x#1 ] zp[2]:94 [ rotate::return_x#0 ] zp[2]:96 [ rotate::return_y#0 ] zp[2]:116 [ rotate::return_x#1 ] zp[2]:118 [ rotate::return_y#1 ] zp[2]:274 [ rotate::return_x#2 ] zp[2]:277 [ rotate::return_y#2 ] zp[2]:227 [ rotate::$2 ] zp[2]:239 [ rotate::$5 ] zp[2]:253 [ rotate::$9 ] zp[2]:255 [ rotate::$10 ] zp[2]:267 [ rotate::$12 ] zp[2]:269 [ rotate::$13 ] zp[4]:223 [ rotate::$1 ] zp[4]:235 [ rotate::$4 ] zp[4]:249 [ rotate::$8 ] zp[4]:263 [ rotate::$11 ] reg byte a [ rotate::$15 ] reg byte a [ rotate::$18 ] zp[2]:271 [ rotate::yr#1 ] zp[2]:217 [ rotate::cos_a#0 ] zp[2]:243 [ rotate::sin_a#0 ] zp[2]:257 [ rotate::xr#1 ] zp[2]:229 [ rotate::xr#0 ] zp[2]:241 [ rotate::yr#0 ] Uplifting [main] best 809848 combination reg byte x [ main::w#4 main::w#1 ] zp[1]:2 [ main::angle#2 main::angle#1 ] @@ -9434,21 +9380,21 @@ show_letter: { jmp __b1 // show_letter::@1 __b1: - // [29] (byte~) show_letter::$32 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 + // [29] (byte~) show_letter::$24 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 lda.z i asl asl asl - // [30] (byte~) show_letter::$20 ← (byte~) show_letter::$32 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 + // [30] (byte~) show_letter::$20 ← (byte~) show_letter::$24 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 clc adc.z i tax - // [31] (signed word) show_letter::to_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx + // [31] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx lda letter_c+OFFSET_STRUCT_SEGMENT_TO,x sta.z to_x lda letter_c+OFFSET_STRUCT_SEGMENT_TO+1,x sta.z to_x+1 - // [32] (signed word) show_letter::to_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx + // [32] (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx lda letter_c+OFFSET_STRUCT_SEGMENT_TO+OFFSET_STRUCT_SPLINEVECTOR16_Y,x sta.z to_y lda letter_c+OFFSET_STRUCT_SEGMENT_TO+OFFSET_STRUCT_SPLINEVECTOR16_Y+1,x @@ -9503,21 +9449,21 @@ show_letter: { lda.z to_y_1+1 adc #>$64 sta.z current_y_1+1 - // [45] (byte~) show_letter::$34 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 + // [45] (byte~) show_letter::$26 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 lda.z i asl asl asl - // [46] (byte~) show_letter::$21 ← (byte~) show_letter::$34 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 + // [46] (byte~) show_letter::$21 ← (byte~) show_letter::$26 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 clc adc.z i tax - // [47] (signed word) show_letter::via_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx + // [47] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx lda letter_c+OFFSET_STRUCT_SEGMENT_VIA,x sta.z via_x lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+1,x sta.z via_x+1 - // [48] (signed word) show_letter::via_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx + // [48] (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+OFFSET_STRUCT_SPLINEVECTOR16_Y,x sta.z via_y lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+OFFSET_STRUCT_SPLINEVECTOR16_Y+1,x @@ -9572,12 +9518,12 @@ show_letter: { lda.z segment_via_y+1 adc #>$64 sta.z segment_via_y+1 - // [61] (byte~) show_letter::$36 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 + // [61] (byte~) show_letter::$28 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 lda.z i asl asl asl - // [62] (byte~) show_letter::$22 ← (byte~) show_letter::$36 + (byte) show_letter::i#10 -- vbuaa=vbuaa_plus_vbuz1 + // [62] (byte~) show_letter::$22 ← (byte~) show_letter::$28 + (byte) show_letter::i#10 -- vbuaa=vbuaa_plus_vbuz1 clc adc.z i // [63] (byte) show_letter::segment_type#0 ← *((byte*)(const struct Segment*) letter_c + (byte~) show_letter::$22) -- vbuaa=pbuc1_derefidx_vbuaa @@ -12179,9 +12125,9 @@ FINAL SYMBOL TABLE (byte~) show_letter::$20 reg byte x 151.5 (byte~) show_letter::$21 reg byte x 151.5 (byte~) show_letter::$22 reg byte a 202.0 -(byte~) show_letter::$32 reg byte a 202.0 -(byte~) show_letter::$34 reg byte a 202.0 -(byte~) show_letter::$36 reg byte a 202.0 +(byte~) show_letter::$24 reg byte a 202.0 +(byte~) show_letter::$26 reg byte a 202.0 +(byte~) show_letter::$28 reg byte a 202.0 (struct SplineVector16~) show_letter::$7 (label) show_letter::@1 (label) show_letter::@2 @@ -12317,13 +12263,13 @@ zp[1]:18 [ mulf_init::c#2 mulf_init::c#1 main::angle#2 main::angle#1 show_letter reg byte x [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ] zp[1]:19 [ mulf_init::dir#2 mulf_init::dir#4 show_letter::i#10 show_letter::i#1 ] -reg byte a [ show_letter::$32 ] +reg byte a [ show_letter::$24 ] reg byte x [ show_letter::$20 ] zp[2]:20 [ show_letter::current_x#10 spline_8segB::p2_x#0 mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] zp[2]:22 [ show_letter::current_y#10 spline_8segB::p2_y#0 mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] -reg byte a [ show_letter::$34 ] +reg byte a [ show_letter::$26 ] reg byte x [ show_letter::$21 ] -reg byte a [ show_letter::$36 ] +reg byte a [ show_letter::$28 ] reg byte a [ show_letter::$22 ] reg byte a [ show_letter::segment_type#0 ] reg byte x [ bitmap_plot_spline_8seg::$8 ] @@ -12519,21 +12465,21 @@ show_letter: { // show_letter::@1 __b1: // to = letter_c[i].to - // [29] (byte~) show_letter::$32 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 + // [29] (byte~) show_letter::$24 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 lda.z i asl asl asl - // [30] (byte~) show_letter::$20 ← (byte~) show_letter::$32 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 + // [30] (byte~) show_letter::$20 ← (byte~) show_letter::$24 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 clc adc.z i tax - // [31] (signed word) show_letter::to_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx + // [31] (signed word) show_letter::to_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx lda letter_c+OFFSET_STRUCT_SEGMENT_TO,x sta.z to_x lda letter_c+OFFSET_STRUCT_SEGMENT_TO+1,x sta.z to_x+1 - // [32] (signed word) show_letter::to_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx + // [32] (signed word) show_letter::to_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$20) -- vwsz1=pwsc1_derefidx_vbuxx lda letter_c+OFFSET_STRUCT_SEGMENT_TO+OFFSET_STRUCT_SPLINEVECTOR16_Y,x sta.z to_y lda letter_c+OFFSET_STRUCT_SEGMENT_TO+OFFSET_STRUCT_SPLINEVECTOR16_Y+1,x @@ -12591,21 +12537,21 @@ show_letter: { adc #>$64 sta.z current_y_1+1 // via = letter_c[i].via - // [45] (byte~) show_letter::$34 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 + // [45] (byte~) show_letter::$26 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 lda.z i asl asl asl - // [46] (byte~) show_letter::$21 ← (byte~) show_letter::$34 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 + // [46] (byte~) show_letter::$21 ← (byte~) show_letter::$26 + (byte) show_letter::i#10 -- vbuxx=vbuaa_plus_vbuz1 clc adc.z i tax - // [47] (signed word) show_letter::via_x#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx + // [47] (signed word) show_letter::via_x#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx lda letter_c+OFFSET_STRUCT_SEGMENT_VIA,x sta.z via_x lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+1,x sta.z via_x+1 - // [48] (signed word) show_letter::via_y#0 ← *((signed word*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx + // [48] (signed word) show_letter::via_y#0 ← *((signed word*)(struct SplineVector16*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_VIA+(const byte) OFFSET_STRUCT_SPLINEVECTOR16_Y + (byte~) show_letter::$21) -- vwsz1=pwsc1_derefidx_vbuxx lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+OFFSET_STRUCT_SPLINEVECTOR16_Y,x sta.z via_y lda letter_c+OFFSET_STRUCT_SEGMENT_VIA+OFFSET_STRUCT_SPLINEVECTOR16_Y+1,x @@ -12663,12 +12609,12 @@ show_letter: { adc #>$64 sta.z segment_via_y+1 // segment = { letter_c[i].type, to, via} - // [61] (byte~) show_letter::$36 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 + // [61] (byte~) show_letter::$28 ← (byte) show_letter::i#10 << (byte) 3 -- vbuaa=vbuz1_rol_3 lda.z i asl asl asl - // [62] (byte~) show_letter::$22 ← (byte~) show_letter::$36 + (byte) show_letter::i#10 -- vbuaa=vbuaa_plus_vbuz1 + // [62] (byte~) show_letter::$22 ← (byte~) show_letter::$28 + (byte) show_letter::i#10 -- vbuaa=vbuaa_plus_vbuz1 clc adc.z i // [63] (byte) show_letter::segment_type#0 ← *((byte*)(const struct Segment*) letter_c + (byte~) show_letter::$22) -- vbuaa=pbuc1_derefidx_vbuaa diff --git a/src/test/ref/complex/splines/truetype-splines.sym b/src/test/ref/complex/splines/truetype-splines.sym index c8c58a08d..fb5f33da8 100644 --- a/src/test/ref/complex/splines/truetype-splines.sym +++ b/src/test/ref/complex/splines/truetype-splines.sym @@ -411,9 +411,9 @@ (byte~) show_letter::$20 reg byte x 151.5 (byte~) show_letter::$21 reg byte x 151.5 (byte~) show_letter::$22 reg byte a 202.0 -(byte~) show_letter::$32 reg byte a 202.0 -(byte~) show_letter::$34 reg byte a 202.0 -(byte~) show_letter::$36 reg byte a 202.0 +(byte~) show_letter::$24 reg byte a 202.0 +(byte~) show_letter::$26 reg byte a 202.0 +(byte~) show_letter::$28 reg byte a 202.0 (struct SplineVector16~) show_letter::$7 (label) show_letter::@1 (label) show_letter::@2 @@ -549,13 +549,13 @@ zp[1]:18 [ mulf_init::c#2 mulf_init::c#1 main::angle#2 main::angle#1 show_letter reg byte x [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ] zp[1]:19 [ mulf_init::dir#2 mulf_init::dir#4 show_letter::i#10 show_letter::i#1 ] -reg byte a [ show_letter::$32 ] +reg byte a [ show_letter::$24 ] reg byte x [ show_letter::$20 ] zp[2]:20 [ show_letter::current_x#10 spline_8segB::p2_x#0 mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] zp[2]:22 [ show_letter::current_y#10 spline_8segB::p2_y#0 mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] -reg byte a [ show_letter::$34 ] +reg byte a [ show_letter::$26 ] reg byte x [ show_letter::$21 ] -reg byte a [ show_letter::$36 ] +reg byte a [ show_letter::$28 ] reg byte a [ show_letter::$22 ] reg byte a [ show_letter::segment_type#0 ] reg byte x [ bitmap_plot_spline_8seg::$8 ] diff --git a/src/test/ref/struct-19.log b/src/test/ref/struct-19.log index ce5e531aa..9c8cba783 100644 --- a/src/test/ref/struct-19.log +++ b/src/test/ref/struct-19.log @@ -1,16 +1,12 @@ Adding value bulk copy *(&(struct Vector) main::v) ← memset(struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) Adding value bulk copy *(&(struct Point) main::p1) ← memcpy(*(&(const struct Point) $0), struct Point, (const byte) SIZEOF_STRUCT_POINT) Adding value bulk copy *(&(struct Point) main::p2) ← memcpy(*(&(const struct Point) $1), struct Point, (const byte) SIZEOF_STRUCT_POINT) -Postponing unwinding for (struct Vector) main::v.p ← (struct Point) main::p1 -Postponing unwinding for (struct Vector) main::v.q ← (struct Point) main::p2 -Replacing struct member reference (struct Vector) main::v.p with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P) -Replacing struct member reference (struct Vector) main::v.q with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q) +Adding value bulk copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P) ← memcpy(*(&(struct Point) main::p1), struct Point, (const byte) SIZEOF_STRUCT_POINT) +Adding value bulk copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q) ← memcpy(*(&(struct Point) main::p2), struct Point, (const byte) SIZEOF_STRUCT_POINT) Replacing struct member reference (struct Vector) main::v.p with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P) Replacing struct member reference (struct Vector) main::v.p with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P) Replacing struct member reference (struct Vector) main::v.q with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q) Replacing struct member reference (struct Vector) main::v.q with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q) -Adding struct value member variable copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P) ← memcpy(*(&(struct Point) main::p1), struct Point, (const byte) SIZEOF_STRUCT_POINT) -Adding struct value member variable copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q) ← memcpy(*(&(struct Point) main::p2), struct Point, (const byte) SIZEOF_STRUCT_POINT) Rewriting struct pointer member access *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P).x Rewriting struct pointer member access *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P).y Rewriting struct pointer member access *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q).x diff --git a/src/test/ref/struct-20.log b/src/test/ref/struct-20.log index 4b179c265..b9db19fbb 100644 --- a/src/test/ref/struct-20.log +++ b/src/test/ref/struct-20.log @@ -6,8 +6,8 @@ Replacing struct member reference (struct Vector) main::v.p with member unwindin Replacing struct member reference (struct Vector) main::v.p with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P) Replacing struct member reference (struct Vector) main::v.q with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q) Replacing struct member reference (struct Vector) main::v.q with member unwinding reference *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q) -Adding struct value member variable copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P) ← memcpy(*(&(struct Point) main::p1), struct Point, (const byte) SIZEOF_STRUCT_POINT) -Adding struct value member variable copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q) ← memcpy(*(&(struct Point) main::p2), struct Point, (const byte) SIZEOF_STRUCT_POINT) +Adding value bulk copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P) ← memcpy(*(&(struct Point) main::p1), struct Point, (const byte) SIZEOF_STRUCT_POINT) +Adding value bulk copy *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q) ← memcpy(*(&(struct Point) main::p2), struct Point, (const byte) SIZEOF_STRUCT_POINT) Rewriting struct pointer member access *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P).x Rewriting struct pointer member access *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_P).y Rewriting struct pointer member access *((struct Point*)&(struct Vector) main::v+(const byte) OFFSET_STRUCT_VECTOR_Q).x diff --git a/src/test/ref/struct-35.log b/src/test/ref/struct-35.log index 122418a83..5d785abb3 100644 --- a/src/test/ref/struct-35.log +++ b/src/test/ref/struct-35.log @@ -1,5 +1,5 @@ Setting inferred volatile on symbol affected by address-of (struct Point*) main::p2 ← &(struct Point) point2 -Adding struct value member variable copy *((struct Point*) main::p2) ← memcpy(*(&(struct Point) point1), struct Point, (const byte) SIZEOF_STRUCT_POINT) +Adding value bulk copy *((struct Point*) main::p2) ← memcpy(*(&(struct Point) point1), struct Point, (const byte) SIZEOF_STRUCT_POINT) Replacing struct member reference (struct Point) point2.x with member unwinding reference *((byte*)&(struct Point) point2+(const byte) OFFSET_STRUCT_POINT_X) Replacing struct member reference (struct Point) point2.y with member unwinding reference *((byte*)&(struct Point) point2+(const byte) OFFSET_STRUCT_POINT_Y) Identified constant variable (struct Point*) main::p2 diff --git a/src/test/ref/struct-39.asm b/src/test/ref/struct-39.asm index dbcfbce8d..41a5b1e1e 100644 --- a/src/test/ref/struct-39.asm +++ b/src/test/ref/struct-39.asm @@ -6,8 +6,8 @@ .const SPLINE_TO = 1 .label SCREEN = $400 .const OFFSET_STRUCT_SEGMENT_TO = 1 - .const OFFSET_STRUCT_VECTOR_Y = 2 .const SIZEOF_STRUCT_VECTOR = 4 + .const OFFSET_STRUCT_VECTOR_Y = 2 main: { .label to = 4 .label j = 3 diff --git a/src/test/ref/struct-39.cfg b/src/test/ref/struct-39.cfg index 64b3a5a09..831fe2c59 100644 --- a/src/test/ref/struct-39.cfg +++ b/src/test/ref/struct-39.cfg @@ -15,8 +15,8 @@ main: scope:[main] from @1 main::@1: scope:[main] from main main::@1 [5] (byte) main::j#3 ← phi( main/(byte) 0 main::@1/(byte) main::j#2 ) [5] (byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 ) - [6] (byte~) main::$5 ← (byte) main::i#2 << (byte) 3 - [7] (byte~) main::$1 ← (byte~) main::$5 + (byte) main::i#2 + [6] (byte~) main::$4 ← (byte) main::i#2 << (byte) 3 + [7] (byte~) main::$1 ← (byte~) main::$4 + (byte) main::i#2 [8] *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) [9] (byte~) main::$2 ← (byte) main::j#3 << (byte) 1 [10] *((const signed word*) SCREEN + (byte~) main::$2) ← *((signed word*)&(struct Vector) main::to) diff --git a/src/test/ref/struct-39.log b/src/test/ref/struct-39.log index 33a7f6795..e0d027528 100644 --- a/src/test/ref/struct-39.log +++ b/src/test/ref/struct-39.log @@ -1,10 +1,9 @@ Fixing pointer array-indexing *((const struct Segment*) letter_c + (byte) main::i) Fixing pointer array-indexing *((const signed word*) SCREEN + (byte) main::j) Fixing pointer array-indexing *((const signed word*) SCREEN + (byte) main::j) -Adding struct value member variable copy *(&(struct Vector) main::to) ← *((struct Vector*~) main::$4 + (byte~) main::$1) +Adding value bulk copy *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) Replacing struct member reference (struct Vector) main::to.x with member unwinding reference *((signed word*)&(struct Vector) main::to+(const byte) OFFSET_STRUCT_VECTOR_X) Replacing struct member reference (struct Vector) main::to.y with member unwinding reference *((signed word*)&(struct Vector) main::to+(const byte) OFFSET_STRUCT_VECTOR_Y) -Adding struct value member variable copy *(&(struct Vector) main::to) ← memcpy(*((struct Vector*~) main::$4 + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) Culled Empty Block (label) main::@2 CONTROL FLOW GRAPH SSA @@ -20,8 +19,8 @@ main::@1: scope:[main] from main main::@1 (byte) main::j#3 ← phi( main/(byte) main::j#0 main::@1/(byte) main::j#2 ) (byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 ) (byte~) main::$1 ← (byte) main::i#2 * (const byte) SIZEOF_STRUCT_SEGMENT - (struct Vector*~) main::$4 ← (struct Vector*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TO - *(&(struct Vector) main::to) ← memcpy(*((struct Vector*~) main::$4 + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) + *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) + (struct Vector) main::to ← struct-unwound {*(&(struct Vector) main::to)} (byte~) main::$2 ← (byte) main::j#3 * (const byte) SIZEOF_SIGNED_WORD *((const signed word*) SCREEN + (byte~) main::$2) ← *((signed word*)&(struct Vector) main::to+(const byte) OFFSET_STRUCT_VECTOR_X) (byte) main::j#1 ← ++ (byte) main::j#3 @@ -70,7 +69,6 @@ SYMBOL TABLE SSA (byte~) main::$1 (byte~) main::$2 (byte~) main::$3 -(struct Vector*~) main::$4 (label) main::@1 (label) main::@return (byte) main::i @@ -88,11 +86,9 @@ Simplifying constant pointer cast (signed word*) 1024 Successful SSA optimization PassNCastSimplification Simple Condition (bool~) main::$0 [14] if((byte) main::i#1!=rangelast(0,2)) goto main::@1 Successful SSA optimization Pass2ConditionalJumpSimplification -Constant right-side identified [4] (struct Vector*~) main::$4 ← (struct Vector*)(const struct Segment*) letter_c + (const byte) OFFSET_STRUCT_SEGMENT_TO -Successful SSA optimization Pass2ConstantRValueConsolidation +Removing C-classic struct-unwound assignment [5] (struct Vector) main::to ← struct-unwound {*(&(struct Vector) main::to)} Constant (const byte) main::j#0 = 0 Constant (const byte) main::i#0 = 0 -Constant (const struct Vector*) main::$4 = (struct Vector*)letter_c+OFFSET_STRUCT_SEGMENT_TO Successful SSA optimization Pass2ConstantIdentification Resolved ranged next value [12] main::i#1 ← ++ main::i#2 to ++ Resolved ranged comparison value [14] if(main::i#1!=rangelast(0,2)) goto main::@1 to (number) 3 @@ -113,10 +109,9 @@ Successful SSA optimization Pass2MultiplyToShiftRewriting Inlining constant with var siblings (const byte) main::j#0 Inlining constant with var siblings (const byte) main::i#0 Constant inlined main::i#0 = (byte) 0 -Constant inlined main::$4 = (struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO Constant inlined main::j#0 = (byte) 0 Successful SSA optimization Pass2ConstantInlining -Alias (byte~) main::$1 = (byte~) main::$6 +Alias (byte~) main::$1 = (byte~) main::$5 Successful SSA optimization Pass2AliasElimination Eliminating unused constant (const byte) SIZEOF_STRUCT_SEGMENT Eliminating unused constant (const byte) SIZEOF_SIGNED_WORD @@ -159,8 +154,8 @@ main: scope:[main] from @1 main::@1: scope:[main] from main main::@1 [5] (byte) main::j#3 ← phi( main/(byte) 0 main::@1/(byte) main::j#2 ) [5] (byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 ) - [6] (byte~) main::$5 ← (byte) main::i#2 << (byte) 3 - [7] (byte~) main::$1 ← (byte~) main::$5 + (byte) main::i#2 + [6] (byte~) main::$4 ← (byte) main::i#2 << (byte) 3 + [7] (byte~) main::$1 ← (byte~) main::$4 + (byte) main::i#2 [8] *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) [9] (byte~) main::$2 ← (byte) main::j#3 << (byte) 1 [10] *((const signed word*) SCREEN + (byte~) main::$2) ← *((signed word*)&(struct Vector) main::to) @@ -186,7 +181,7 @@ VARIABLE REGISTER WEIGHTS (byte~) main::$1 11.0 (byte~) main::$2 22.0 (byte~) main::$3 22.0 -(byte~) main::$5 22.0 +(byte~) main::$4 22.0 (byte) main::i (byte) main::i#1 16.5 (byte) main::i#2 4.4 @@ -199,7 +194,7 @@ VARIABLE REGISTER WEIGHTS Initial phi equivalence classes [ main::i#2 main::i#1 ] [ main::j#3 main::j#2 ] -Added variable main::$5 to live range equivalence class [ main::$5 ] +Added variable main::$4 to live range equivalence class [ main::$4 ] Added variable main::$1 to live range equivalence class [ main::$1 ] Added variable main::$2 to live range equivalence class [ main::$2 ] Added variable main::j#1 to live range equivalence class [ main::j#1 ] @@ -208,7 +203,7 @@ Added variable main::to to live range equivalence class [ main::to ] Complete equivalence classes [ main::i#2 main::i#1 ] [ main::j#3 main::j#2 ] -[ main::$5 ] +[ main::$4 ] [ main::$1 ] [ main::$2 ] [ main::j#1 ] @@ -216,7 +211,7 @@ Complete equivalence classes [ main::to ] Allocated zp[1]:2 [ main::i#2 main::i#1 ] Allocated zp[1]:3 [ main::j#3 main::j#2 ] -Allocated zp[1]:4 [ main::$5 ] +Allocated zp[1]:4 [ main::$4 ] Allocated zp[1]:5 [ main::$1 ] Allocated zp[1]:6 [ main::$2 ] Allocated zp[1]:7 [ main::j#1 ] @@ -236,8 +231,8 @@ Target platform is c64basic / MOS6502X .const SPLINE_TO = 1 .label SCREEN = $400 .const OFFSET_STRUCT_SEGMENT_TO = 1 - .const OFFSET_STRUCT_VECTOR_Y = 2 .const SIZEOF_STRUCT_VECTOR = 4 + .const OFFSET_STRUCT_VECTOR_Y = 2 // @begin __bbegin: // [1] phi from @begin to @1 [phi:@begin->@1] @@ -263,7 +258,7 @@ main: { .label j = 7 .label j_1 = 3 .label i = 2 - .label __5 = 4 + .label __4 = 4 // [5] phi from main to main::@1 [phi:main->main::@1] __b1_from_main: // [5] phi (byte) main::j#3 = (byte) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1 @@ -280,14 +275,14 @@ main: { jmp __b1 // main::@1 __b1: - // [6] (byte~) main::$5 ← (byte) main::i#2 << (byte) 3 -- vbuz1=vbuz2_rol_3 + // [6] (byte~) main::$4 ← (byte) main::i#2 << (byte) 3 -- vbuz1=vbuz2_rol_3 lda.z i asl asl asl - sta.z __5 - // [7] (byte~) main::$1 ← (byte~) main::$5 + (byte) main::i#2 -- vbuz1=vbuz2_plus_vbuz3 - lda.z __5 + sta.z __4 + // [7] (byte~) main::$1 ← (byte~) main::$4 + (byte) main::i#2 -- vbuz1=vbuz2_plus_vbuz3 + lda.z __4 clc adc.z i sta.z __1 @@ -351,10 +346,10 @@ main: { .word 'e', 'f', $4b, $c3 REGISTER UPLIFT POTENTIAL REGISTERS -Statement [6] (byte~) main::$5 ← (byte) main::i#2 << (byte) 3 [ main::i#2 main::j#3 main::$5 main::to ] ( main:2 [ main::i#2 main::j#3 main::$5 main::to ] ) always clobbers reg byte a +Statement [6] (byte~) main::$4 ← (byte) main::i#2 << (byte) 3 [ main::i#2 main::j#3 main::$4 main::to ] ( main:2 [ main::i#2 main::j#3 main::$4 main::to ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::i#2 main::i#1 ] Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::j#3 main::j#2 ] -Statement [7] (byte~) main::$1 ← (byte~) main::$5 + (byte) main::i#2 [ main::i#2 main::j#3 main::$1 main::to ] ( main:2 [ main::i#2 main::j#3 main::$1 main::to ] ) always clobbers reg byte a +Statement [7] (byte~) main::$1 ← (byte~) main::$4 + (byte) main::i#2 [ main::i#2 main::j#3 main::$1 main::to ] ( main:2 [ main::i#2 main::j#3 main::$1 main::to ] ) always clobbers reg byte a Statement [8] *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) [ main::i#2 main::j#3 main::to ] ( main:2 [ main::i#2 main::j#3 main::to ] ) always clobbers reg byte a reg byte x reg byte y Removing always clobbered register reg byte x as potential for zp[1]:2 [ main::i#2 main::i#1 ] Removing always clobbered register reg byte y as potential for zp[1]:2 [ main::i#2 main::i#1 ] @@ -366,8 +361,8 @@ Statement [12] (byte~) main::$3 ← (byte) main::j#1 << (byte) 1 [ main::i#2 mai Removing always clobbered register reg byte a as potential for zp[1]:7 [ main::j#1 ] Statement [13] *((const signed word*) SCREEN + (byte~) main::$3) ← *((signed word*)&(struct Vector) main::to+(const byte) OFFSET_STRUCT_VECTOR_Y) [ main::i#2 main::to main::j#1 ] ( main:2 [ main::i#2 main::to main::j#1 ] ) always clobbers reg byte a Statement [16] if((byte) main::i#1!=(byte) 3) goto main::@1 [ main::i#1 main::j#2 main::to ] ( main:2 [ main::i#1 main::j#2 main::to ] ) always clobbers reg byte a -Statement [6] (byte~) main::$5 ← (byte) main::i#2 << (byte) 3 [ main::i#2 main::j#3 main::$5 main::to ] ( main:2 [ main::i#2 main::j#3 main::$5 main::to ] ) always clobbers reg byte a -Statement [7] (byte~) main::$1 ← (byte~) main::$5 + (byte) main::i#2 [ main::i#2 main::j#3 main::$1 main::to ] ( main:2 [ main::i#2 main::j#3 main::$1 main::to ] ) always clobbers reg byte a +Statement [6] (byte~) main::$4 ← (byte) main::i#2 << (byte) 3 [ main::i#2 main::j#3 main::$4 main::to ] ( main:2 [ main::i#2 main::j#3 main::$4 main::to ] ) always clobbers reg byte a +Statement [7] (byte~) main::$1 ← (byte~) main::$4 + (byte) main::i#2 [ main::i#2 main::j#3 main::$1 main::to ] ( main:2 [ main::i#2 main::j#3 main::$1 main::to ] ) always clobbers reg byte a Statement [8] *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) [ main::i#2 main::j#3 main::to ] ( main:2 [ main::i#2 main::j#3 main::to ] ) always clobbers reg byte a reg byte x reg byte y Statement [9] (byte~) main::$2 ← (byte) main::j#3 << (byte) 1 [ main::i#2 main::j#3 main::to main::$2 ] ( main:2 [ main::i#2 main::j#3 main::to main::$2 ] ) always clobbers reg byte a Statement [10] *((const signed word*) SCREEN + (byte~) main::$2) ← *((signed word*)&(struct Vector) main::to) [ main::i#2 main::j#3 main::to ] ( main:2 [ main::i#2 main::j#3 main::to ] ) always clobbers reg byte a @@ -376,7 +371,7 @@ Statement [13] *((const signed word*) SCREEN + (byte~) main::$3) ← *((signed w Statement [16] if((byte) main::i#1!=(byte) 3) goto main::@1 [ main::i#1 main::j#2 main::to ] ( main:2 [ main::i#1 main::j#2 main::to ] ) always clobbers reg byte a Potential registers zp[1]:2 [ main::i#2 main::i#1 ] : zp[1]:2 , Potential registers zp[1]:3 [ main::j#3 main::j#2 ] : zp[1]:3 , -Potential registers zp[1]:4 [ main::$5 ] : zp[1]:4 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:4 [ main::$4 ] : zp[1]:4 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:5 [ main::$1 ] : zp[1]:5 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:6 [ main::$2 ] : zp[1]:6 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:7 [ main::j#1 ] : zp[1]:7 , reg byte x , reg byte y , @@ -384,13 +379,13 @@ Potential registers zp[1]:8 [ main::$3 ] : zp[1]:8 , reg byte a , reg byte x , r Potential registers zp[4]:9 [ main::to ] : zp[4]:9 , REGISTER UPLIFT SCOPES -Uplift Scope [main] 22: zp[1]:4 [ main::$5 ] 22: zp[1]:6 [ main::$2 ] 22: zp[1]:8 [ main::$3 ] 20.9: zp[1]:2 [ main::i#2 main::i#1 ] 12.83: zp[1]:3 [ main::j#3 main::j#2 ] 11: zp[1]:5 [ main::$1 ] 11: zp[1]:7 [ main::j#1 ] 0: zp[4]:9 [ main::to ] +Uplift Scope [main] 22: zp[1]:4 [ main::$4 ] 22: zp[1]:6 [ main::$2 ] 22: zp[1]:8 [ main::$3 ] 20.9: zp[1]:2 [ main::i#2 main::i#1 ] 12.83: zp[1]:3 [ main::j#3 main::j#2 ] 11: zp[1]:5 [ main::$1 ] 11: zp[1]:7 [ main::j#1 ] 0: zp[4]:9 [ main::to ] Uplift Scope [Vector] Uplift Scope [Segment] Uplift Scope [Segment::SegmentType] Uplift Scope [] -Uplifting [main] best 1333 combination reg byte a [ main::$5 ] reg byte a [ main::$2 ] reg byte a [ main::$3 ] zp[1]:2 [ main::i#2 main::i#1 ] zp[1]:3 [ main::j#3 main::j#2 ] reg byte a [ main::$1 ] zp[1]:7 [ main::j#1 ] zp[4]:9 [ main::to ] +Uplifting [main] best 1333 combination reg byte a [ main::$4 ] reg byte a [ main::$2 ] reg byte a [ main::$3 ] zp[1]:2 [ main::i#2 main::i#1 ] zp[1]:3 [ main::j#3 main::j#2 ] reg byte a [ main::$1 ] zp[1]:7 [ main::j#1 ] zp[4]:9 [ main::to ] Limited combination testing to 100 combinations of 768 possible. Uplifting [Vector] best 1333 combination Uplifting [Segment] best 1333 combination @@ -416,8 +411,8 @@ ASSEMBLER BEFORE OPTIMIZATION .const SPLINE_TO = 1 .label SCREEN = $400 .const OFFSET_STRUCT_SEGMENT_TO = 1 - .const OFFSET_STRUCT_VECTOR_Y = 2 .const SIZEOF_STRUCT_VECTOR = 4 + .const OFFSET_STRUCT_VECTOR_Y = 2 // @begin __bbegin: // [1] phi from @begin to @1 [phi:@begin->@1] @@ -455,12 +450,12 @@ main: { jmp __b1 // main::@1 __b1: - // [6] (byte~) main::$5 ← (byte) main::i#2 << (byte) 3 -- vbuaa=vbuz1_rol_3 + // [6] (byte~) main::$4 ← (byte) main::i#2 << (byte) 3 -- vbuaa=vbuz1_rol_3 lda.z i asl asl asl - // [7] (byte~) main::$1 ← (byte~) main::$5 + (byte) main::i#2 -- vbuaa=vbuaa_plus_vbuz1 + // [7] (byte~) main::$1 ← (byte~) main::$4 + (byte) main::i#2 -- vbuaa=vbuaa_plus_vbuz1 clc adc.z i // [8] *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) -- _deref_pssc1=pssc2_derefidx_vbuaa_memcpy_vbuc3 @@ -569,7 +564,7 @@ FINAL SYMBOL TABLE (byte~) main::$1 reg byte a 11.0 (byte~) main::$2 reg byte a 22.0 (byte~) main::$3 reg byte a 22.0 -(byte~) main::$5 reg byte a 22.0 +(byte~) main::$4 reg byte a 22.0 (label) main::@1 (label) main::@return (byte) main::i @@ -583,7 +578,7 @@ FINAL SYMBOL TABLE zp[1]:2 [ main::i#2 main::i#1 ] zp[1]:3 [ main::j#3 main::j#2 ] -reg byte a [ main::$5 ] +reg byte a [ main::$4 ] reg byte a [ main::$1 ] reg byte a [ main::$2 ] reg byte x [ main::j#1 ] @@ -605,8 +600,8 @@ Score: 1141 .const SPLINE_TO = 1 .label SCREEN = $400 .const OFFSET_STRUCT_SEGMENT_TO = 1 - .const OFFSET_STRUCT_VECTOR_Y = 2 .const SIZEOF_STRUCT_VECTOR = 4 + .const OFFSET_STRUCT_VECTOR_Y = 2 // @begin // [1] phi from @begin to @1 [phi:@begin->@1] // @1 @@ -631,12 +626,12 @@ main: { // main::@1 __b1: // to = letter_c[i].to - // [6] (byte~) main::$5 ← (byte) main::i#2 << (byte) 3 -- vbuaa=vbuz1_rol_3 + // [6] (byte~) main::$4 ← (byte) main::i#2 << (byte) 3 -- vbuaa=vbuz1_rol_3 lda.z i asl asl asl - // [7] (byte~) main::$1 ← (byte~) main::$5 + (byte) main::i#2 -- vbuaa=vbuaa_plus_vbuz1 + // [7] (byte~) main::$1 ← (byte~) main::$4 + (byte) main::i#2 -- vbuaa=vbuaa_plus_vbuz1 clc adc.z i // [8] *(&(struct Vector) main::to) ← memcpy(*((struct Vector*)(const struct Segment*) letter_c+(const byte) OFFSET_STRUCT_SEGMENT_TO + (byte~) main::$1), struct Vector, (const byte) SIZEOF_STRUCT_VECTOR) -- _deref_pssc1=pssc2_derefidx_vbuaa_memcpy_vbuc3 diff --git a/src/test/ref/struct-39.sym b/src/test/ref/struct-39.sym index 522bdb6f1..4868ebc35 100644 --- a/src/test/ref/struct-39.sym +++ b/src/test/ref/struct-39.sym @@ -20,7 +20,7 @@ (byte~) main::$1 reg byte a 11.0 (byte~) main::$2 reg byte a 22.0 (byte~) main::$3 reg byte a 22.0 -(byte~) main::$5 reg byte a 22.0 +(byte~) main::$4 reg byte a 22.0 (label) main::@1 (label) main::@return (byte) main::i @@ -34,7 +34,7 @@ zp[1]:2 [ main::i#2 main::i#1 ] zp[1]:3 [ main::j#3 main::j#2 ] -reg byte a [ main::$5 ] +reg byte a [ main::$4 ] reg byte a [ main::$1 ] reg byte a [ main::$2 ] reg byte x [ main::j#1 ] diff --git a/src/test/ref/struct-41.log b/src/test/ref/struct-41.log index 60f711135..e8f5a9981 100644 --- a/src/test/ref/struct-41.log +++ b/src/test/ref/struct-41.log @@ -56,8 +56,8 @@ Adding struct value member variable copy *((byte*~) main::$0) ← (byte) main::v Adding struct value member variable copy *((byte*~) main::$1) ← (byte) main::v1_p_y Adding struct value member variable copy *((byte*~) main::$2) ← (byte) main::v1_q_x Adding struct value member variable copy *((byte*~) main::$3) ← (byte) main::v1_q_y -Adding struct value member variable copy *((struct Point*)&(struct Vector) main::v3+(const byte) OFFSET_STRUCT_VECTOR_P) ← memcpy(*((struct Point*)&(struct Vector) main::v2+(const byte) OFFSET_STRUCT_VECTOR_P), struct Point, (const byte) SIZEOF_STRUCT_POINT) -Adding struct value member variable copy *((struct Point*)&(struct Vector) main::v3+(const byte) OFFSET_STRUCT_VECTOR_Q) ← memcpy(*(&(const struct Point) $0), struct Point, (const byte) SIZEOF_STRUCT_POINT) +Adding value bulk copy *((struct Point*)&(struct Vector) main::v3+(const byte) OFFSET_STRUCT_VECTOR_P) ← memcpy(*((struct Point*)&(struct Vector) main::v2+(const byte) OFFSET_STRUCT_VECTOR_P), struct Point, (const byte) SIZEOF_STRUCT_POINT) +Adding value bulk copy *((struct Point*)&(struct Vector) main::v3+(const byte) OFFSET_STRUCT_VECTOR_Q) ← memcpy(*(&(const struct Point) $0), struct Point, (const byte) SIZEOF_STRUCT_POINT) Adding struct value member variable copy (byte) main::v5_p_x ← *((struct Point*)&(struct Vector) main::v4+(const byte) OFFSET_STRUCT_VECTOR_P).x Adding struct value member variable copy (byte) main::v5_p_y ← *((struct Point*)&(struct Vector) main::v4+(const byte) OFFSET_STRUCT_VECTOR_P).y Adding struct value member variable copy (byte) main::v5_q_x ← (byte) 8 diff --git a/src/test/ref/struct-42.log b/src/test/ref/struct-42.log index 456176356..2dbeba13d 100644 --- a/src/test/ref/struct-42.log +++ b/src/test/ref/struct-42.log @@ -2,7 +2,7 @@ Fixing pointer array-indexing *((const struct Point*) points + (byte) main::i) Fixing pointer array-indexing *((const struct Point*) points + (number) 2) Fixing pointer array-indexing *((const struct Point*) points + (number) 2) Constantified RValue *((const struct Point*) points + (byte~) main::$1) ← { x: (byte) 2, y: (byte) 3 } -Adding struct value member variable copy *((const struct Point*) points + (byte~) main::$1) ← memcpy(*(&(const struct Point) $0), struct Point, (const byte) SIZEOF_STRUCT_POINT) +Adding value bulk copy *((const struct Point*) points + (byte~) main::$1) ← memcpy(*(&(const struct Point) $0), struct Point, (const byte) SIZEOF_STRUCT_POINT) Rewriting struct pointer member access *((const struct Point*) points + (number~) main::$2).x Rewriting struct pointer member access *((const struct Point*) points + (number~) main::$3).y diff --git a/src/test/ref/struct-8.log b/src/test/ref/struct-8.log index 5ef1cf44e..2f0768acf 100644 --- a/src/test/ref/struct-8.log +++ b/src/test/ref/struct-8.log @@ -10,19 +10,20 @@ Converted struct value to member variables (struct Point) main::point Created struct value member variable (byte) main::c_center_x Created struct value member variable (byte) main::c_center_y Converted struct value to member variables (struct Point) main::c_center -Adding struct value member variable copy (byte) main::p_x ← (byte) $a -Adding struct value member variable copy (byte) main::p_y ← (byte) $a +Unwinding value copy (struct Point) main::p ← { x: (byte) $a, y: (byte) $a } +Adding value simple copy (byte) main::p_x ← (byte) $a +Adding value simple copy (byte) main::p_y ← (byte) $a Adding struct value member variable copy (struct Point) main::c_center ← (struct Point) main::p Adding struct value member variable copy (byte) main::c_radius ← (byte) 5 -Postponing unwinding for (struct Point) main::point ← (struct Circle) main::c.center -Replacing struct member reference (struct Circle) main::c.center with member unwinding reference (struct Point) main::c_center +Unwinding value copy (struct Point) main::point ← (struct Circle) main::c.center +Adding value simple copy (byte) main::point_x ← (byte) main::c_center_x +Adding value simple copy (byte) main::point_y ← (byte) main::c_center_y Replacing struct member reference (struct Point) main::point.x with member unwinding reference (byte) main::point_x Replacing struct member reference (struct Point) main::point.y with member unwinding reference (byte) main::point_y Replacing struct member reference (struct Circle) main::c.radius with member unwinding reference (byte) main::c_radius -Adding struct value member variable copy (byte) main::c_center_x ← (byte) main::p_x -Adding struct value member variable copy (byte) main::c_center_y ← (byte) main::p_y -Adding struct value member variable copy (byte) main::point_x ← (byte) main::c_center_x -Adding struct value member variable copy (byte) main::point_y ← (byte) main::c_center_y +Unwinding value copy (struct Point) main::c_center ← (struct Point) main::p +Adding value simple copy (byte) main::c_center_x ← (byte) main::p_x +Adding value simple copy (byte) main::c_center_y ← (byte) main::p_y Identified constant variable (byte) main::p_x Identified constant variable (byte) main::p_y Identified constant variable (byte) main::c_radius diff --git a/src/test/ref/struct-9.log b/src/test/ref/struct-9.log index a5be9a635..980ad89d7 100644 --- a/src/test/ref/struct-9.log +++ b/src/test/ref/struct-9.log @@ -7,20 +7,21 @@ Converted struct value to member variables (struct Circle) main::c Created struct value member variable (byte) main::c_center_x Created struct value member variable (byte) main::c_center_y Converted struct value to member variables (struct Point) main::c_center -Adding struct value member variable copy (byte) main::p_x ← (byte) $a -Adding struct value member variable copy (byte) main::p_y ← (byte) $a -Adding struct value member variable copy (struct Point) main::c_center ← {} -Adding struct value member variable copy (byte) main::c_radius ← (byte) 0 -Postponing unwinding for (struct Circle) main::c.center ← (struct Point) main::p -Replacing struct member reference (struct Circle) main::c.center with member unwinding reference (struct Point) main::c_center +Unwinding value copy (struct Point) main::p ← { x: (byte) $a, y: (byte) $a } +Adding value simple copy (byte) main::p_x ← (byte) $a +Adding value simple copy (byte) main::p_y ← (byte) $a +Unwinding value copy (struct Circle) main::c ← {} +Unwinding value copy (struct Circle) main::c ← {} +Adding value simple copy (byte) main::c_center_x ← (byte) 0 +Adding value simple copy (byte) main::c_center_y ← (byte) 0 +Adding value simple copy (byte) main::c_radius ← (byte) 0 +Unwinding value copy (struct Circle) main::c.center ← (struct Point) main::p +Adding value simple copy (byte) main::c_center_x ← (byte) main::p_x +Adding value simple copy (byte) main::c_center_y ← (byte) main::p_y Replacing struct member reference (struct Circle) main::c.radius with member unwinding reference (byte) main::c_radius Replacing struct member reference (struct Circle) main::c.center with member unwinding reference (struct Point) main::c_center Replacing struct member reference (struct Circle) main::c.center with member unwinding reference (struct Point) main::c_center Replacing struct member reference (struct Circle) main::c.radius with member unwinding reference (byte) main::c_radius -Adding struct value member variable copy (byte) main::c_center_x ← (byte) 0 -Adding struct value member variable copy (byte) main::c_center_y ← (byte) 0 -Adding struct value member variable copy (byte) main::c_center_x ← (byte) main::p_x -Adding struct value member variable copy (byte) main::c_center_y ← (byte) main::p_y Replacing struct member reference (struct Point) main::c_center.x with member unwinding reference (byte) main::c_center_x Replacing struct member reference (struct Point) main::c_center.y with member unwinding reference (byte) main::c_center_y Identified constant variable (byte) main::p_x @@ -64,6 +65,7 @@ SYMBOL TABLE SSA (void()) main() (label) main::@return (const byte*) main::SCREEN = (byte*)(number) $400 +(struct Point) main::c_center (byte) main::c_center_x (byte) main::c_center_x#0 (byte) main::c_center_x#1 @@ -155,6 +157,7 @@ VARIABLE REGISTER WEIGHTS (byte) Point::x (byte) Point::y (void()) main() +(struct Point) main::c_center (byte) main::c_center_x (byte) main::c_center_y (byte) main::c_radius @@ -299,6 +302,7 @@ FINAL SYMBOL TABLE (void()) main() (label) main::@return (const byte*) main::SCREEN = (byte*) 1024 +(struct Point) main::c_center (byte) main::c_center_x (byte) main::c_center_y (byte) main::c_radius diff --git a/src/test/ref/struct-9.sym b/src/test/ref/struct-9.sym index 31be6c1da..efc45ec5e 100644 --- a/src/test/ref/struct-9.sym +++ b/src/test/ref/struct-9.sym @@ -8,6 +8,7 @@ (void()) main() (label) main::@return (const byte*) main::SCREEN = (byte*) 1024 +(struct Point) main::c_center (byte) main::c_center_x (byte) main::c_center_y (byte) main::c_radius diff --git a/src/test/ref/struct-ptr-10.log b/src/test/ref/struct-ptr-10.log index 643db2e44..c286de018 100644 --- a/src/test/ref/struct-ptr-10.log +++ b/src/test/ref/struct-ptr-10.log @@ -4,7 +4,7 @@ Fixing pointer array-indexing *((const struct Point*) main::SCREEN + (word) main Constantified RValue *((const struct Point*) points + (word~) main::$3) ← (struct Point){ (byte) 2, (byte~) main::$0 } Adding struct value member variable copy *((byte*~) main::$5 + (word~) main::$3) ← (byte) 2 Adding struct value member variable copy *((byte*~) main::$6 + (word~) main::$3) ← (byte~) main::$0 -Adding struct value member variable copy *((const struct Point*) main::SCREEN + (word~) main::$4) ← memcpy(*((const struct Point*) points + (word~) main::$4), struct Point, (const byte) SIZEOF_STRUCT_POINT) +Adding value bulk copy *((const struct Point*) main::SCREEN + (word~) main::$4) ← memcpy(*((const struct Point*) points + (word~) main::$4), struct Point, (const byte) SIZEOF_STRUCT_POINT) Culled Empty Block (label) main::@4 CONTROL FLOW GRAPH SSA diff --git a/src/test/ref/struct-ptr-11.log b/src/test/ref/struct-ptr-11.log index 6ff09c182..1eb06ee5a 100644 --- a/src/test/ref/struct-ptr-11.log +++ b/src/test/ref/struct-ptr-11.log @@ -5,7 +5,7 @@ Constantified RValue *((const struct Point*) points + (byte~) main::$6) ← (str Adding struct value member variable copy *((signed byte*~) main::$8 + (byte~) main::$6) ← (signed byte~) main::$0 Adding struct value member variable copy *((signed byte*~) main::$9 + (byte~) main::$6) ← (signed byte~) main::$2 Adding struct value member variable copy *((signed byte*~) main::$10 + (byte~) main::$6) ← (signed byte~) main::$3 -Adding struct value member variable copy *((const struct Point*) main::SCREEN + (byte~) main::$7) ← memcpy(*((const struct Point*) points + (byte~) main::$7), struct Point, (const byte) SIZEOF_STRUCT_POINT) +Adding value bulk copy *((const struct Point*) main::SCREEN + (byte~) main::$7) ← memcpy(*((const struct Point*) points + (byte~) main::$7), struct Point, (const byte) SIZEOF_STRUCT_POINT) Culled Empty Block (label) main::@4 CONTROL FLOW GRAPH SSA diff --git a/src/test/ref/struct-ptr-18.log b/src/test/ref/struct-ptr-18.log index 62a27ca9e..09e52b8f0 100644 --- a/src/test/ref/struct-ptr-18.log +++ b/src/test/ref/struct-ptr-18.log @@ -7,8 +7,8 @@ Created struct value member variable (byte) print::p_x Created struct value member variable (byte) print::p_y Converted struct value to member variables (struct Point) print::p Converted procedure struct value parameter to member unwinding (void()) print((byte) print::p_x , (byte) print::p_y) -Adding struct value member variable copy *((const struct Point*) points + (number~) main::$2) ← memcpy(*(&(const struct Point) $0), struct Point, (const byte) SIZEOF_STRUCT_POINT) -Adding struct value member variable copy *((const struct Point*) points + (number~) main::$3) ← memcpy(*(&(const struct Point) $1), struct Point, (const byte) SIZEOF_STRUCT_POINT) +Adding value bulk copy *((const struct Point*) points + (number~) main::$2) ← memcpy(*(&(const struct Point) $0), struct Point, (const byte) SIZEOF_STRUCT_POINT) +Adding value bulk copy *((const struct Point*) points + (number~) main::$3) ← memcpy(*(&(const struct Point) $1), struct Point, (const byte) SIZEOF_STRUCT_POINT) Converted procedure struct value parameter to member unwinding in call (void~) main::$0 ← call print *((byte*~) main::$5 + (byte~) main::$4) *((byte*~) main::$6 + (byte~) main::$4) Replacing struct member reference (struct Point) print::p.x with member unwinding reference (byte) print::p_x Replacing struct member reference (struct Point) print::p.y with member unwinding reference (byte) print::p_y diff --git a/src/test/ref/struct-ptr-9.log b/src/test/ref/struct-ptr-9.log index b7cd90eb5..bb7aec055 100644 --- a/src/test/ref/struct-ptr-9.log +++ b/src/test/ref/struct-ptr-9.log @@ -4,7 +4,7 @@ Fixing pointer array-indexing *((const struct Point*) main::SCREEN + (byte) main Constantified RValue *((const struct Point*) points + (byte~) main::$2) ← (struct Point){ (byte) 2, (byte) main::i } Adding struct value member variable copy *((byte*~) main::$4 + (byte~) main::$2) ← (byte) 2 Adding struct value member variable copy *((byte*~) main::$5 + (byte~) main::$2) ← (byte) main::i -Adding struct value member variable copy *((const struct Point*) main::SCREEN + (byte~) main::$3) ← memcpy(*((const struct Point*) points + (byte~) main::$3), struct Point, (const byte) SIZEOF_STRUCT_POINT) +Adding value bulk copy *((const struct Point*) main::SCREEN + (byte~) main::$3) ← memcpy(*((const struct Point*) points + (byte~) main::$3), struct Point, (const byte) SIZEOF_STRUCT_POINT) Culled Empty Block (label) main::@4 CONTROL FLOW GRAPH SSA