From 096d7c064055337622a8083f30fa717f3132e1bd Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Thu, 9 Apr 2020 22:17:33 +0200 Subject: [PATCH] Cleaned up scope getters. Might have caused a slow-down of compilation. --- .../kickc/model/CallingConventionStack.java | 38 +- .../kickc/model/operators/OperatorTypeId.java | 2 +- .../kickc/model/symbols/Procedure.java | 2 +- .../kickc/model/symbols/ProgramScope.java | 70 +++- .../camelot64/kickc/model/symbols/Scope.java | 256 ++++++------ .../kickc/model/symbols/Variable.java | 2 +- .../model/types/SymbolTypeInference.java | 4 +- .../kickc/model/types/SymbolTypeStruct.java | 2 +- .../kickc/model/values/SymbolRef.java | 18 +- .../Pass0GenerateStatementSequence.java | 18 +- .../kickc/passes/Pass1AssertUsedVars.java | 4 +- .../kickc/passes/Pass1CallPhiParameters.java | 2 +- .../kickc/passes/Pass1CallPhiReturn.java | 2 +- .../passes/Pass1ExtractInlineStrings.java | 2 +- .../kickc/passes/Pass1ProcedureInline.java | 20 +- .../kickc/passes/Pass1Procedures.java | 3 +- .../passes/Pass1ResolveForwardReferences.java | 2 +- .../kickc/passes/Pass2AssertSymbols.java | 2 +- .../Pass2ConstantStringConsolidation.java | 4 +- .../kickc/passes/Pass2SsaOptimization.java | 2 +- .../kickc/passes/Pass4CodeGeneration.java | 2 +- .../kickc/passes/Pass4MemoryCoalesce.java | 2 +- .../passes/Pass4RegisterUpliftStatic.java | 7 +- .../kickc/passes/utils/SizeOfConstants.java | 6 +- .../kickc/passes/utils/Unroller.java | 2 +- src/test/ref/complex/tetris/test-sprites.asm | 8 +- src/test/ref/complex/tetris/test-sprites.cfg | 16 +- src/test/ref/complex/tetris/test-sprites.log | 374 +++++++++--------- src/test/ref/complex/tetris/test-sprites.sym | 16 +- src/test/ref/complex/tetris/tetris.asm | 4 +- src/test/ref/complex/tetris/tetris.cfg | 8 +- src/test/ref/complex/tetris/tetris.log | 196 ++++----- src/test/ref/complex/tetris/tetris.sym | 8 +- 33 files changed, 579 insertions(+), 525 deletions(-) diff --git a/src/main/java/dk/camelot64/kickc/model/CallingConventionStack.java b/src/main/java/dk/camelot64/kickc/model/CallingConventionStack.java index 08871bfd8..f0b76238e 100644 --- a/src/main/java/dk/camelot64/kickc/model/CallingConventionStack.java +++ b/src/main/java/dk/camelot64/kickc/model/CallingConventionStack.java @@ -1,6 +1,9 @@ package dk.camelot64.kickc.model; -import dk.camelot64.kickc.model.symbols.*; +import dk.camelot64.kickc.model.symbols.Procedure; +import dk.camelot64.kickc.model.symbols.ProgramScope; +import dk.camelot64.kickc.model.symbols.Scope; +import dk.camelot64.kickc.model.symbols.Variable; import dk.camelot64.kickc.model.types.SymbolType; import dk.camelot64.kickc.model.values.ConstantInteger; import dk.camelot64.kickc.model.values.ConstantRef; @@ -14,6 +17,22 @@ import java.util.Collections; public class CallingConventionStack { + /** Prefix of the constant holding the stack offset for parameters/return value. */ + public static final String OFFSET_STACK = "OFFSET_STACK_"; + + /** Name of the constant holding the stack offset for the return value. */ + public static final String OFFSET_STACK_RETURN = OFFSET_STACK + "RETURN"; + + /** + * Get the name of the constant variable containing the (byte) offset of a specific parameter on the stack + * + * @param parameterName The name of the struct member + * @return The name of the constant + */ + private static String getParameterOffsetConstantName(String parameterName) { + return OFFSET_STACK + parameterName.toUpperCase(); + } + /** * Get the constant variable containing the (byte) index of the return value on the stack * @@ -21,12 +40,11 @@ public class CallingConventionStack { * @return The return value stack offset constant */ public static ConstantRef getReturnOffsetConstant(Procedure procedure) { - String returnOffsetConstantName = "OFFSET_STACK_RETURN"; - Variable returnOffsetConstant = procedure.getConstant(returnOffsetConstantName); + Variable returnOffsetConstant = procedure.getLocalConstant(OFFSET_STACK_RETURN); if(returnOffsetConstant == null) { // Constant not found - create it long returnByteOffset = getReturnByteOffset(procedure); - returnOffsetConstant = Variable.createConstant(returnOffsetConstantName, SymbolType.BYTE, procedure, null, new ConstantInteger(returnByteOffset & 0xff, SymbolType.BYTE), Scope.SEGMENT_DATA_DEFAULT); + returnOffsetConstant = Variable.createConstant(OFFSET_STACK_RETURN, SymbolType.BYTE, procedure, null, new ConstantInteger(returnByteOffset & 0xff, SymbolType.BYTE), Scope.SEGMENT_DATA_DEFAULT); procedure.add(returnOffsetConstant); } return returnOffsetConstant.getConstantRef(); @@ -41,7 +59,7 @@ public class CallingConventionStack { */ public static ConstantRef getParameterOffsetConstant(Procedure procedure, Variable parameter) { String paramOffsetConstantName = getParameterOffsetConstantName(parameter.getName()); - Variable paramOffsetConstant = procedure.getConstant(paramOffsetConstantName); + Variable paramOffsetConstant = procedure.getLocalConstant(paramOffsetConstantName); if(paramOffsetConstant == null) { // Constant not found - create it long paramByteOffset = getParameterByteOffset(procedure, parameter); @@ -51,15 +69,6 @@ public class CallingConventionStack { return paramOffsetConstant.getConstantRef(); } - /** - * Get the name of the constant variable containing the (byte) offset of a specific parameter on the stack - * - * @param parameterName The name of the struct member - * @return The name of the constant - */ - private static String getParameterOffsetConstantName(String parameterName) { - return "OFFSET_STACK_" + parameterName.toUpperCase(); - } /** * Get the number of bytes that needed on the stack to pass parameters/return value to/from a procedure @@ -78,6 +87,7 @@ public class CallingConventionStack { /** * Get the number of bytes needed on the stack to store the parameters from a procedure + * * @param procedure The procedure * @return The byte size of parameters */ diff --git a/src/main/java/dk/camelot64/kickc/model/operators/OperatorTypeId.java b/src/main/java/dk/camelot64/kickc/model/operators/OperatorTypeId.java index 7eea11d81..19a6ab1e5 100644 --- a/src/main/java/dk/camelot64/kickc/model/operators/OperatorTypeId.java +++ b/src/main/java/dk/camelot64/kickc/model/operators/OperatorTypeId.java @@ -43,7 +43,7 @@ public class OperatorTypeId extends OperatorUnary { */ public static ConstantRef getTypeIdConstantVar(ProgramScope programScope, SymbolType type) { String typeConstName = "TYPEID_" + getTypeIdConstantName(type); - Variable typeIdConstant = programScope.getConstant(typeConstName); + Variable typeIdConstant = programScope.getLocalConstant(typeConstName); if(typeIdConstant == null) { // Constant not found - create it long typeSize = getTypeId(type); diff --git a/src/main/java/dk/camelot64/kickc/model/symbols/Procedure.java b/src/main/java/dk/camelot64/kickc/model/symbols/Procedure.java index 7093bdc55..626c48906 100644 --- a/src/main/java/dk/camelot64/kickc/model/symbols/Procedure.java +++ b/src/main/java/dk/camelot64/kickc/model/symbols/Procedure.java @@ -96,7 +96,7 @@ public class Procedure extends Scope { public List getParameters() { ArrayList parameters = new ArrayList<>(); for(String name : parameterNames) { - parameters.add(this.getVariable(name)); + parameters.add(this.getLocalVariable(name)); } return parameters; } diff --git a/src/main/java/dk/camelot64/kickc/model/symbols/ProgramScope.java b/src/main/java/dk/camelot64/kickc/model/symbols/ProgramScope.java index bf42c15da..ae3b10d95 100644 --- a/src/main/java/dk/camelot64/kickc/model/symbols/ProgramScope.java +++ b/src/main/java/dk/camelot64/kickc/model/symbols/ProgramScope.java @@ -5,7 +5,11 @@ import dk.camelot64.kickc.model.LiveRangeEquivalenceClassSet; import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.types.SymbolType; import dk.camelot64.kickc.model.types.SymbolTypeProgram; -import dk.camelot64.kickc.model.values.ScopeRef; +import dk.camelot64.kickc.model.values.*; + +import java.util.Arrays; +import java.util.Deque; +import java.util.LinkedList; /** The program scope containing the symbols of a program */ public class ProgramScope extends Scope { @@ -21,6 +25,60 @@ public class ProgramScope extends Scope { } + /** + * Get a symbol from it's full name. + * + * @param fullName The full '::'-separated symbol name. + * @return The symbol. Null if not found. + */ + public Symbol getGlobalSymbol(String fullName) { + final Deque names = new LinkedList<>(Arrays.asList(fullName.split("::"))); + Scope scope = this; + while(names.size() > 1) { + final String localName = names.removeFirst(); + scope = scope.getLocalScope(localName); + if(scope == null) + return null; + } + return scope.getLocalSymbol(names.removeFirst()); + } + + public Symbol getSymbol(SymbolRef symbolRef) { + return getProgramScope().getGlobalSymbol(symbolRef.getFullName()); + } + + public Variable getVar(SymbolVariableRef variableRef) { + return (Variable) getSymbol(variableRef); + } + + public Variable getVariable(SymbolVariableRef variableRef) { + return (Variable) getSymbol(variableRef); + } + + public Variable getConstant(ConstantRef constantRef) { + return (Variable) getSymbol(constantRef); + } + + public Label getLabel(LabelRef labelRef) { + return (Label) getSymbol(labelRef); + } + + public Procedure getLocalProcedure(String name) { + return (Procedure) getLocalSymbol(name); + } + + public Procedure getProcedure(ProcedureRef procedureRef) { + return (Procedure) getSymbol(procedureRef); + } + + public Scope getScope(ScopeRef scopeRef) { + if(scopeRef.getFullName().equals("")) { + // Special case for the outer program scope + return this; + } + return (Scope) getSymbol(scopeRef); + } + @Override public String toString(Program program, boolean onlyVars) { LiveRangeEquivalenceClassSet liveRangeEquivalenceClassSet = program.getLiveRangeEquivalenceClassSet(); @@ -50,14 +108,16 @@ public class ProgramScope extends Scope { /** * Get information about the size of the program + * * @return Size information */ public String getSizeInfo() { StringBuilder sizeInfo = new StringBuilder(); - sizeInfo.append("SIZE procedures "+ getAllProcedures(true).size()).append("\n"); - sizeInfo.append("SIZE scopes "+ getAllScopes(true).size()).append("\n"); - sizeInfo.append("SIZE variables "+ getAllVariables(true).size()).append("\n"); - sizeInfo.append("SIZE constants "+ getAllConstants(true).size()).append("\n"); + sizeInfo.append("SIZE procedures " + getAllProcedures(true).size()).append("\n"); + sizeInfo.append("SIZE scopes " + getAllScopes(true).size()).append("\n"); + sizeInfo.append("SIZE variables " + getAllVariables(true).size()).append("\n"); + sizeInfo.append("SIZE constants " + getAllConstants(true).size()).append("\n"); return sizeInfo.toString(); } + } diff --git a/src/main/java/dk/camelot64/kickc/model/symbols/Scope.java b/src/main/java/dk/camelot64/kickc/model/symbols/Scope.java index 60f0242fa..65cd7222d 100644 --- a/src/main/java/dk/camelot64/kickc/model/symbols/Scope.java +++ b/src/main/java/dk/camelot64/kickc/model/symbols/Scope.java @@ -3,7 +3,7 @@ package dk.camelot64.kickc.model.symbols; import dk.camelot64.kickc.model.InternalError; import dk.camelot64.kickc.model.*; import dk.camelot64.kickc.model.types.SymbolType; -import dk.camelot64.kickc.model.values.*; +import dk.camelot64.kickc.model.values.ScopeRef; import java.io.Serializable; import java.util.*; @@ -73,6 +73,18 @@ public abstract class Scope implements Symbol, Serializable { setFullName(); } + /** + * Get the top-level program scope. + * + * @return The top-level scope. Null if not found. + */ + public ProgramScope getProgramScope() { + if(this instanceof ProgramScope) + return (ProgramScope) this; + else + return parentScope.getProgramScope(); + } + @Override public abstract SymbolType getType(); @@ -85,6 +97,11 @@ public abstract class Scope implements Symbol, Serializable { } } + public void remove(Symbol symbol) { + symbols.remove(symbol.getLocalName()); + } + + public T add(T symbol) { if(symbols.get(symbol.getLocalName()) != null) { throw new CompileError("Symbol already declared " + symbol.getLocalName()); @@ -93,15 +110,49 @@ public abstract class Scope implements Symbol, Serializable { return symbol; } - public void remove(Symbol symbol) { - symbols.remove(symbol.getLocalName()); - } - public Variable addVariableIntermediate() { String name = allocateIntermediateVariableName(); return add(Variable.createIntermediate(name, this, getSegmentData())); } + public Label addLabel(String name) { + return add(new Label(name, this, false)); + } + + public Label addLabelIntermediate() { + String name = "@" + intermediateLabelCount++; + return add(new Label(name, this, true)); + } + + + public BlockScope addBlockScope() { + String name = ":" + blockCount++; + return add(new BlockScope(name, this)); + } + + /** + * Add a struct definition. + * The name can be either defined in the program or an intermediate name. + * + * @param name The name of the struct definition + */ + public StructDefinition addStructDefinition(String name) { + return add(new StructDefinition(name, this)); + } + + public String allocateIntermediateVariableName() { + return "$" + intermediateVarCount++; + } + + /** + * Set the value of the counter used to number intermediate labels + * + * @param intermediateLabelCount The new counter value + */ + public void setIntermediateLabelCount(int intermediateLabelCount) { + this.intermediateLabelCount = intermediateLabelCount; + } + /** * Get all versions of a PHI-master variable * @@ -121,73 +172,45 @@ public abstract class Scope implements Symbol, Serializable { return versions; } - public String allocateIntermediateVariableName() { - return "$" + intermediateVarCount++; - } - - public Symbol getSymbol(SymbolRef symbolRef) { - return getSymbol(symbolRef.getFullName()); - } - - public Symbol getSymbol(String name) { - int pos = name.indexOf("::"); - if(pos >= 0) { - String scopeName = name.substring(0, pos); - String rest = name.substring(pos + 2); - Symbol scopeSym = getSymbol(scopeName); - if(scopeSym instanceof Scope) { - return ((Scope) scopeSym).getSymbol(rest); - } else { - return null; - //throw new RuntimeException("Error looking up symbol " + name); - } - } else { - Symbol symbol = symbols.get(name); - if(symbol == null) { - if(parentScope != null) { - symbol = parentScope.getSymbol(name); - } - } - return symbol; - } - } - + /** + * Get a local symbol by name. Does not search parent scopes. + * + * @param name The symbol name to look for + * @return The symbol if found. null otherwise. + */ public Symbol getLocalSymbol(String name) { return symbols.get(name); } - public Variable getVar(String name) { - return (Variable) getSymbol(name); + /** + * Look for a symbol by it's (short) name. Looks through this scope first and then through any parent scope. + * + * @param name The symbol name + * @return The found symbol. Null is not found. + */ + public Symbol findSymbol(String name) { + Symbol symbol = symbols.get(name); + if(symbol == null) { + if(parentScope != null) { + symbol = parentScope.findSymbol(name); + } + } + return symbol; } - public Variable getVar(SymbolVariableRef variableRef) { - return getVar(variableRef.getFullName()); - } - - public Variable getVariable(String name) { - Variable symbol = (Variable) getSymbol(name); - if(symbol != null && !symbol.isVariable()) + public Variable findVariable(String name) { + final Symbol symbol = findSymbol(name); + if(symbol!=null && !(symbol instanceof Variable)) throw new InternalError("Symbol is not a variable! " + symbol.toString()); - return symbol; + return (Variable) symbol; } - public Variable getVariable(SymbolVariableRef variableRef) { - return getVariable(variableRef.getFullName()); - } - - public Variable getConstant(String name) { - Variable symbol = (Variable) getSymbol(name); - if(symbol != null && !symbol.isKindConstant()) - throw new InternalError("Symbol is not a constant! " + symbol.toString()); - return symbol; - } - - public Variable getConstant(ConstantRef constantRef) { - return getConstant(constantRef.getFullName()); + public Collection getAllSymbols() { + return symbols.values(); } /** - * Get all variables/constants + * Get all variables/constants in the scope * * @param includeSubScopes true to include sub-scopes * @return all variables/constants @@ -275,80 +298,60 @@ public abstract class Scope implements Symbol, Serializable { return allSymbols; } - - public Label addLabel(String name) { - return add(new Label(name, this, false)); + public Variable getLocalVar(String name) { + final Symbol symbol = getLocalSymbol(name); + if(symbol!=null && !(symbol instanceof Variable)) + throw new InternalError("Symbol is not a variable! " + symbol.toString()); + return (Variable) symbol; } - public Label addLabelIntermediate() { - String name = "@" + intermediateLabelCount++; - return add(new Label(name, this, true)); + public Variable getLocalVariable(String name) { + final Variable var = getLocalVar(name); + if(var != null && !var.isVariable()) + throw new InternalError("Symbol is not a variable! " + var.toString()); + return var; } - public Label getLabel(String name) { - return (Label) getSymbol(name); + public Variable getLocalConstant(String name) { + final Variable var = getLocalVar(name); + if(var != null && !var.isKindConstant()) + throw new InternalError("Symbol is not a constant! " + var.toString()); + return var; } - public Label getLabel(LabelRef labelRef) { - return (Label) getSymbol(labelRef); + public Label getLocalLabel(String name) { + final Symbol symbol = getLocalSymbol(name); + if(symbol!=null && !(symbol instanceof Label)) + throw new InternalError("Symbol is not a label! " + symbol.toString()); + return (Label) getLocalSymbol(name); } - public BlockScope addBlockScope() { - String name = ":" + blockCount++; - return add(new BlockScope(name, this)); + public BlockScope getLocalBlockScope(String name) { + final Symbol symbol = getLocalSymbol(name); + if(symbol!=null && !(symbol instanceof BlockScope)) + throw new InternalError("Symbol is not a block scope! " + symbol.toString()); + return (BlockScope) symbol; } - public BlockScope getBlockScope(String name) { - return (BlockScope) getSymbol(name); + public StructDefinition getLocalStructDefinition(String name) { + final Symbol symbol = getLocalSymbol(name); + if(symbol!=null && !(symbol instanceof StructDefinition)) + throw new InternalError("Symbol is not a struct definition! " + symbol.toString()); + return (StructDefinition) symbol; } - public Procedure addProcedure(String name, SymbolType type, String codeSegment, String dataSegment, Procedure.CallingConvention callingConvention) { - return add(new Procedure(name, type, this, codeSegment, dataSegment, callingConvention)); + public EnumDefinition getLocalEnumDefinition(String name) { + final Symbol symbol = getLocalSymbol(name); + if(symbol!=null && !(symbol instanceof EnumDefinition)) + throw new InternalError("Symbol is not an enum definition! " + symbol.toString()); + return (EnumDefinition) symbol; } - public Procedure getProcedure(String name) { - Symbol symbol = getSymbol(name); - if(symbol != null && symbol instanceof Procedure) { - return (Procedure) symbol; - } else { - return null; - } - } - - /** - * Add a struct definition. - * The name can be either defined in the program or an intermediate name. - * - * @param name - */ - public StructDefinition addStructDefinition(String name) { - return add(new StructDefinition(name, this)); - } - - public StructDefinition getStructDefinition(String name) { - return (StructDefinition) getSymbol(name); - } - - public EnumDefinition getEnumDefinition(String name) { - return (EnumDefinition) getSymbol(name); - } - - - public Scope getScope(ScopeRef scopeRef) { - if(scopeRef.getFullName().equals("") && this instanceof ProgramScope) { - // Special case for the outer program scope - return this; - } - Symbol symbol = getSymbol(scopeRef); - if(symbol instanceof Scope) { - return (Scope) symbol; - } else { - return null; - } - } - - public Procedure getProcedure(ProcedureRef ref) { - return (Procedure) getSymbol(ref); + public Scope getLocalScope(String name) { + final Symbol symbol = getLocalSymbol(name); + if(symbol!=null && !(symbol instanceof Scope)) + throw new InternalError("Symbol is not a scope! " + symbol.toString()); + return (Scope) symbol; } public String toString(Program program, boolean onlyVars) { @@ -410,19 +413,6 @@ public abstract class Scope implements Symbol, Serializable { return res.toString(); } - public Collection getAllSymbols() { - return symbols.values(); - } - - /** - * Set the value of the counter used to number intermediate labels - * - * @param intermediateLabelCount The new counter value - */ - public void setIntermediateLabelCount(int intermediateLabelCount) { - this.intermediateLabelCount = intermediateLabelCount; - } - @Override public boolean equals(Object o) { if(this == o) { diff --git a/src/main/java/dk/camelot64/kickc/model/symbols/Variable.java b/src/main/java/dk/camelot64/kickc/model/symbols/Variable.java index 041c6a8c9..86cd91663 100644 --- a/src/main/java/dk/camelot64/kickc/model/symbols/Variable.java +++ b/src/main/java/dk/camelot64/kickc/model/symbols/Variable.java @@ -314,7 +314,7 @@ public class Variable implements Symbol { throw new InternalError("Cannot get PHI-master for non-PHI-version variable " + this.toString()); String name = getName(); String versionOfName = name.substring(0, name.indexOf("#")); - return getScope().getVariable(versionOfName); + return getScope().getLocalVariable(versionOfName); } private Kind getKind() { diff --git a/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeInference.java b/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeInference.java index c254ef4b2..b91885986 100644 --- a/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeInference.java +++ b/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeInference.java @@ -103,8 +103,8 @@ public class SymbolTypeInference { SymbolType structType = inferType(symbols, structMemberRef.getStruct()); if(structType instanceof SymbolTypeStruct) { String typeName = ((SymbolTypeStruct) structType).getStructTypeName(); - StructDefinition structDefinition = symbols.getStructDefinition(typeName); - Variable structMember = structDefinition.getVar(structMemberRef.getMemberName()); + StructDefinition structDefinition = symbols.getLocalStructDefinition(typeName); + Variable structMember = structDefinition.getLocalVar(structMemberRef.getMemberName()); return structMember.getType(); } else { throw new CompileError("Dot applied to non-struct "+ structMemberRef.getStruct().toString()); diff --git a/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeStruct.java b/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeStruct.java index 666ee25dc..947465752 100644 --- a/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeStruct.java +++ b/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeStruct.java @@ -33,7 +33,7 @@ public class SymbolTypeStruct implements SymbolType { } public StructDefinition getStructDefinition(ProgramScope programScope) { - return programScope.getStructDefinition(name); + return programScope.getLocalStructDefinition(name); } @Override diff --git a/src/main/java/dk/camelot64/kickc/model/values/SymbolRef.java b/src/main/java/dk/camelot64/kickc/model/values/SymbolRef.java index 65d595985..5a16a2c53 100644 --- a/src/main/java/dk/camelot64/kickc/model/values/SymbolRef.java +++ b/src/main/java/dk/camelot64/kickc/model/values/SymbolRef.java @@ -3,6 +3,8 @@ package dk.camelot64.kickc.model.values; import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.symbols.Symbol; +import java.util.Objects; + /** A reference to a symbol (variable, procedure or label) */ public class SymbolRef implements Value { @@ -34,10 +36,8 @@ public class SymbolRef implements Value { if(o == null || getClass() != o.getClass()) { return false; } - SymbolRef symbolRef = (SymbolRef) o; - - return fullName != null ? fullName.equals(symbolRef.fullName) : symbolRef.fullName == null; + return Objects.equals(fullName, symbolRef.fullName); } @Override @@ -50,15 +50,11 @@ public class SymbolRef implements Value { if(program == null) { return fullName; } else { - try { - Symbol symbol = program.getScope().getSymbol(fullName); - if(symbol==null) { - return fullName+"(null)"; - } - return symbol.toString(program); - } catch(NullPointerException e) { - throw e; + Symbol symbol = program.getScope().getGlobalSymbol(fullName); + if(symbol == null) { + return fullName + "(null)"; } + return symbol.toString(program); } } diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java index 7c5c5e080..87e980065 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java @@ -470,7 +470,7 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor candidateName.length()) { constName = candidateName; } @@ -131,7 +131,7 @@ public class Pass2ConstantStringConsolidation extends Pass2SsaOptimization { int i = 0; do { String candidateName = "string_" + i; - if(getScope().getSymbol(candidateName) == null) { + if(getScope().getLocalSymbol(candidateName) == null) { return candidateName; } } while(true); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass2SsaOptimization.java b/src/main/java/dk/camelot64/kickc/passes/Pass2SsaOptimization.java index 849d6119b..78c55bdcf 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass2SsaOptimization.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass2SsaOptimization.java @@ -122,7 +122,7 @@ public abstract class Pass2SsaOptimization extends Pass1Base implements PassStep public static void deleteSymbols(ProgramScope programScope, Collection symbols) { for(SymbolRef symbolRef : symbols) { - Symbol symbol = programScope.getSymbol(symbolRef.getFullName()); + Symbol symbol = programScope.getSymbol(symbolRef); symbol.getScope().remove(symbol); } } diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java index 88431f6bf..b690f3adc 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java @@ -862,7 +862,7 @@ public class Pass4CodeGeneration { Procedure procedure = null; ScopeRef scope = block.getScope(); if(!scope.equals(ScopeRef.ROOT)) { - procedure = getScope().getProcedure(scope.getFullName()); + procedure = getScope().getProcedure((ProcedureRef) scope); } if(procedure == null || procedure.getInterruptType() == null) { asm.addInstruction("rts", AsmAddressingMode.NON, null, false); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass4MemoryCoalesce.java b/src/main/java/dk/camelot64/kickc/passes/Pass4MemoryCoalesce.java index d0fa2183d..e2d2b3ca1 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass4MemoryCoalesce.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass4MemoryCoalesce.java @@ -112,7 +112,7 @@ public abstract class Pass4MemoryCoalesce extends Pass2Base { Variable variable = program.getScope().getVariable(varRef); ScopeRef scopeRef = variable.getScope().getRef(); if(scopeRef.equals(ScopeRef.ROOT)) { - ProcedureRef mainThreadHead = program.getScope().getProcedure(SymbolRef.MAIN_PROC_NAME).getRef(); + ProcedureRef mainThreadHead = program.getScope().getLocalProcedure(SymbolRef.MAIN_PROC_NAME).getRef(); if(!threads.contains(mainThreadHead)) { threads.add(mainThreadHead); } diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftStatic.java b/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftStatic.java index 2ee3da59c..39e3f5758 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftStatic.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftStatic.java @@ -113,8 +113,7 @@ public class Pass4RegisterUpliftStatic extends Pass2Base { private void setRegister(RegisterCombination combination, String varFullName, Registers.Register register) { LiveRangeEquivalenceClassSet equivalenceClassSet = getProgram().getLiveRangeEquivalenceClassSet(); - ProgramScope scope = getProgram().getScope(); - SymbolVariableRef variableRef = scope.getVariable(varFullName).getRef(); + SymbolVariableRef variableRef = (SymbolVariableRef) getProgram().getScope().getGlobalSymbol(varFullName).getRef(); LiveRangeEquivalenceClass equivalenceClass = equivalenceClassSet.getEquivalenceClass((VariableRef) variableRef); combination.setRegister(equivalenceClass, register); } @@ -122,9 +121,9 @@ public class Pass4RegisterUpliftStatic extends Pass2Base { private void collapseEquivalenceClasses(String varFullName1, String varFullName2) { LiveRangeEquivalenceClassSet equivalenceClassSet = getProgram().getLiveRangeEquivalenceClassSet(); ProgramScope scope = getProgram().getScope(); - SymbolVariableRef variableRef1 = scope.getVariable(varFullName1).getRef(); + SymbolVariableRef variableRef1 = (SymbolVariableRef) scope.getGlobalSymbol(varFullName1).getRef(); LiveRangeEquivalenceClass equivalenceClass1 = equivalenceClassSet.getEquivalenceClass((VariableRef) variableRef1); - SymbolVariableRef variableRef2 = scope.getVariable(varFullName2).getRef(); + SymbolVariableRef variableRef2 = (SymbolVariableRef) scope.getGlobalSymbol(varFullName2).getRef(); LiveRangeEquivalenceClass equivalenceClass2 = equivalenceClassSet.getEquivalenceClass((VariableRef) variableRef2); if(!equivalenceClass1.equals(equivalenceClass2)) { equivalenceClassSet.consolidate(equivalenceClass1, equivalenceClass2); diff --git a/src/main/java/dk/camelot64/kickc/passes/utils/SizeOfConstants.java b/src/main/java/dk/camelot64/kickc/passes/utils/SizeOfConstants.java index 8e9ec0468..14a99ad54 100644 --- a/src/main/java/dk/camelot64/kickc/passes/utils/SizeOfConstants.java +++ b/src/main/java/dk/camelot64/kickc/passes/utils/SizeOfConstants.java @@ -22,7 +22,7 @@ public class SizeOfConstants { */ public static ConstantRef getSizeOfConstantVar(ProgramScope programScope, SymbolType type) { String typeConstName = getSizeofConstantName(type); - Variable typeSizeConstant = programScope.getConstant(typeConstName); + Variable typeSizeConstant = programScope.getLocalConstant(typeConstName); if(typeSizeConstant == null) { // Constant not found - create it long typeSize = type.getSizeBytes(); @@ -40,7 +40,7 @@ public class SizeOfConstants { */ public static void fixSizeOfConstantVar(ProgramScope programScope, SymbolType type) { String typeConstName = getSizeofConstantName(type); - Variable typeSizeConstant = programScope.getConstant(typeConstName); + Variable typeSizeConstant = programScope.getLocalConstant(typeConstName); if(typeSizeConstant != null) { // Constant found - update it long typeSize = type.getSizeBytes(); @@ -72,7 +72,7 @@ public class SizeOfConstants { */ public static ConstantRef getStructMemberOffsetConstant(ProgramScope programScope, StructDefinition structDefinition, String memberName) { String typeConstName = getStructMemberOffsetConstantName(structDefinition, memberName); - Variable memberOffsetConstant = programScope.getConstant(typeConstName); + Variable memberOffsetConstant = programScope.getLocalConstant(typeConstName); if(memberOffsetConstant == null) { // Constant not found - create it Variable memberDef = structDefinition.getMember(memberName); diff --git a/src/main/java/dk/camelot64/kickc/passes/utils/Unroller.java b/src/main/java/dk/camelot64/kickc/passes/utils/Unroller.java index ab85cd545..4a326854a 100644 --- a/src/main/java/dk/camelot64/kickc/passes/utils/Unroller.java +++ b/src/main/java/dk/camelot64/kickc/passes/utils/Unroller.java @@ -267,7 +267,7 @@ public class Unroller { String unrollLabelName; do { unrollLabelName = localName + "_" + unrollSerial++; - } while(blockScope.getLabel(unrollLabelName) != null); + } while(blockScope.getLocalLabel(unrollLabelName) != null); // Create a label Label unrollLabel = blockScope.addLabel(unrollLabelName); blockToNewBlock.put(block.getLabel(), unrollLabel.getRef()); diff --git a/src/test/ref/complex/tetris/test-sprites.asm b/src/test/ref/complex/tetris/test-sprites.asm index 6579bb801..cec2e0065 100644 --- a/src/test/ref/complex/tetris/test-sprites.asm +++ b/src/test/ref/complex/tetris/test-sprites.asm @@ -89,7 +89,7 @@ __bbegin: jsr main rts main: { - .const toSpritePtr2_return = SIN_SPRITE/$40 + .const toSpritePtr1_return = SIN_SPRITE/$40 .const vicSelectGfxBank1_toDd001_return = 3 .const toD0181_return = (>(PLAYFIELD_SCREEN_1&$3fff)*4)|(>PLAYFIELD_CHARSET)/4&$f .label xpos = 3 @@ -131,7 +131,7 @@ main: { // SPRITES_COLS[s] = s-3 sta SPRITES_COLS,y // PLAYFIELD_SPRITE_PTRS_1[s] = toSpritePtr(SIN_SPRITE) - lda #toSpritePtr2_return + lda #toSpritePtr1_return sta PLAYFIELD_SPRITE_PTRS_1,y // xpos += 24 lax.z xpos @@ -271,7 +271,7 @@ sprites_init: { // Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST // Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers sprites_irq: { - .const toSpritePtr2_return = PLAYFIELD_SPRITES/$40 + .const toSpritePtr1_return = PLAYFIELD_SPRITES/$40 .label raster_sprite_gfx_modify = $a sta rega+1 stx regx+1 @@ -384,7 +384,7 @@ sprites_irq: { lda #SPRITES_FIRST_YPOS sta.z irq_sprite_ypos // irq_sprite_ptr = toSpritePtr(PLAYFIELD_SPRITES) - lda #toSpritePtr2_return + lda #toSpritePtr1_return sta.z irq_sprite_ptr jmp __b5 __b1: diff --git a/src/test/ref/complex/tetris/test-sprites.cfg b/src/test/ref/complex/tetris/test-sprites.cfg index 9c71893cf..22b29d60a 100644 --- a/src/test/ref/complex/tetris/test-sprites.cfg +++ b/src/test/ref/complex/tetris/test-sprites.cfg @@ -73,12 +73,12 @@ main::@1: scope:[main] from main::@4 main::@5 [23] *((const nomodify byte*) SPRITES_YPOS + (byte) main::s2#0) ← (byte) main::ypos#2 [24] (byte~) main::$6 ← (byte) main::s#2 - (byte) 3 [25] *((const nomodify byte*) SPRITES_COLS + (byte) main::s#2) ← (byte~) main::$6 - to:main::toSpritePtr2 -main::toSpritePtr2: scope:[main] from main::@1 + to:main::toSpritePtr1 +main::toSpritePtr1: scope:[main] from main::@1 [26] phi() to:main::@4 -main::@4: scope:[main] from main::toSpritePtr2 - [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr2_return#0 +main::@4: scope:[main] from main::toSpritePtr1 + [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr1_return#0 [28] (byte) main::xpos#1 ← (byte) main::xpos#2 + (byte) $18 [29] (byte) main::ypos#1 ← (byte) main::ypos#2 + (byte) $18 [30] (byte) main::s#1 ← ++ (byte) main::s#2 @@ -215,12 +215,12 @@ sprites_irq::@4: scope:[sprites_irq] from sprites_irq::@6 sprites_irq::@3: scope:[sprites_irq] from sprites_irq::@2 [102] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15 [103] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS - to:sprites_irq::toSpritePtr2 -sprites_irq::toSpritePtr2: scope:[sprites_irq] from sprites_irq::@3 + to:sprites_irq::toSpritePtr1 +sprites_irq::toSpritePtr1: scope:[sprites_irq] from sprites_irq::@3 [104] phi() to:sprites_irq::@11 -sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr2 - [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 +sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr1 + [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 to:sprites_irq::@5 sprites_irq::@1: scope:[sprites_irq] from sprites_irq::@9 [106] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1) ← (byte) sprites_irq::ptr#0 diff --git a/src/test/ref/complex/tetris/test-sprites.log b/src/test/ref/complex/tetris/test-sprites.log index 2a82f1215..8b31ed823 100644 --- a/src/test/ref/complex/tetris/test-sprites.log +++ b/src/test/ref/complex/tetris/test-sprites.log @@ -24,14 +24,14 @@ Culled Empty Block (label) sprites_init::@2 Culled Empty Block (label) toSpritePtr1_@1 Culled Empty Block (label) @6 Culled Empty Block (label) sprites_irq::@14 -Culled Empty Block (label) sprites_irq::toSpritePtr2_@1 +Culled Empty Block (label) sprites_irq::toSpritePtr1_@1 Culled Empty Block (label) sprites_irq::@5 Culled Empty Block (label) sprites_irq::@9 Culled Empty Block (label) sprites_irq::@10 Culled Empty Block (label) main::vicSelectGfxBank1_toDd001_@1 Culled Empty Block (label) main::vicSelectGfxBank1_@return Culled Empty Block (label) main::toD0181_@1 -Culled Empty Block (label) main::toSpritePtr2_@1 +Culled Empty Block (label) main::toSpritePtr1_@1 Culled Empty Block (label) @8 Culled Empty Block (label) loop::@2 Culled Empty Block (label) loop::@9 @@ -174,22 +174,22 @@ sprites_irq::@2: scope:[sprites_irq] from sprites_irq::@1 sprites_irq::@13 sprites_irq::@3: scope:[sprites_irq] from sprites_irq::@2 (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (number) $15 (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS - (byte*) sprites_irq::toSpritePtr2_sprite#0 ← (const nomodify byte*) PLAYFIELD_SPRITES - to:sprites_irq::toSpritePtr2 -sprites_irq::toSpritePtr2: scope:[sprites_irq] from sprites_irq::@3 - (byte*) sprites_irq::toSpritePtr2_sprite#1 ← phi( sprites_irq::@3/(byte*) sprites_irq::toSpritePtr2_sprite#0 ) - (word~) sprites_irq::toSpritePtr2_$0 ← ((word)) (byte*) sprites_irq::toSpritePtr2_sprite#1 - (number~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (number) $40 - (byte~) sprites_irq::toSpritePtr2_$2 ← ((byte)) (number~) sprites_irq::toSpritePtr2_$1 - (byte) sprites_irq::toSpritePtr2_return#0 ← (byte~) sprites_irq::toSpritePtr2_$2 - to:sprites_irq::toSpritePtr2_@return -sprites_irq::toSpritePtr2_@return: scope:[sprites_irq] from sprites_irq::toSpritePtr2 - (byte) sprites_irq::toSpritePtr2_return#2 ← phi( sprites_irq::toSpritePtr2/(byte) sprites_irq::toSpritePtr2_return#0 ) - (byte) sprites_irq::toSpritePtr2_return#1 ← (byte) sprites_irq::toSpritePtr2_return#2 + (byte*) sprites_irq::toSpritePtr1_sprite#0 ← (const nomodify byte*) PLAYFIELD_SPRITES + to:sprites_irq::toSpritePtr1 +sprites_irq::toSpritePtr1: scope:[sprites_irq] from sprites_irq::@3 + (byte*) sprites_irq::toSpritePtr1_sprite#1 ← phi( sprites_irq::@3/(byte*) sprites_irq::toSpritePtr1_sprite#0 ) + (word~) sprites_irq::toSpritePtr1_$0 ← ((word)) (byte*) sprites_irq::toSpritePtr1_sprite#1 + (number~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (number) $40 + (byte~) sprites_irq::toSpritePtr1_$2 ← ((byte)) (number~) sprites_irq::toSpritePtr1_$1 + (byte) sprites_irq::toSpritePtr1_return#0 ← (byte~) sprites_irq::toSpritePtr1_$2 + to:sprites_irq::toSpritePtr1_@return +sprites_irq::toSpritePtr1_@return: scope:[sprites_irq] from sprites_irq::toSpritePtr1 + (byte) sprites_irq::toSpritePtr1_return#2 ← phi( sprites_irq::toSpritePtr1/(byte) sprites_irq::toSpritePtr1_return#0 ) + (byte) sprites_irq::toSpritePtr1_return#1 ← (byte) sprites_irq::toSpritePtr1_return#2 to:sprites_irq::@15 -sprites_irq::@15: scope:[sprites_irq] from sprites_irq::toSpritePtr2_@return - (byte) sprites_irq::toSpritePtr2_return#3 ← phi( sprites_irq::toSpritePtr2_@return/(byte) sprites_irq::toSpritePtr2_return#1 ) - (byte~) sprites_irq::$5 ← (byte) sprites_irq::toSpritePtr2_return#3 +sprites_irq::@15: scope:[sprites_irq] from sprites_irq::toSpritePtr1_@return + (byte) sprites_irq::toSpritePtr1_return#3 ← phi( sprites_irq::toSpritePtr1_@return/(byte) sprites_irq::toSpritePtr1_return#1 ) + (byte~) sprites_irq::$5 ← (byte) sprites_irq::toSpritePtr1_return#3 (volatile byte) irq_sprite_ptr ← (byte~) sprites_irq::$5 to:sprites_irq::@6 sprites_irq::@7: scope:[sprites_irq] from sprites_irq::@2 @@ -301,34 +301,34 @@ main::@1: scope:[main] from main::@5 main::@6 *((const nomodify byte*) SPRITES_YPOS + (byte) main::s2#0) ← (byte) main::ypos#2 (number~) main::$6 ← (byte) main::s#2 - (number) 3 *((const nomodify byte*) SPRITES_COLS + (byte) main::s#2) ← (number~) main::$6 - (byte*) main::toSpritePtr2_sprite#0 ← (const byte*) SIN_SPRITE - to:main::toSpritePtr2 -main::toSpritePtr2: scope:[main] from main::@1 + (byte*) main::toSpritePtr1_sprite#0 ← (const byte*) SIN_SPRITE + to:main::toSpritePtr1 +main::toSpritePtr1: scope:[main] from main::@1 (byte) sin_idx#21 ← phi( main::@1/(byte) sin_idx#22 ) (byte) main::ypos#5 ← phi( main::@1/(byte) main::ypos#2 ) (byte) main::xpos#5 ← phi( main::@1/(byte) main::xpos#2 ) (byte) main::s#5 ← phi( main::@1/(byte) main::s#2 ) - (byte*) main::toSpritePtr2_sprite#1 ← phi( main::@1/(byte*) main::toSpritePtr2_sprite#0 ) - (word~) main::toSpritePtr2_$0 ← ((word)) (byte*) main::toSpritePtr2_sprite#1 - (number~) main::toSpritePtr2_$1 ← (word~) main::toSpritePtr2_$0 / (number) $40 - (byte~) main::toSpritePtr2_$2 ← ((byte)) (number~) main::toSpritePtr2_$1 - (byte) main::toSpritePtr2_return#0 ← (byte~) main::toSpritePtr2_$2 - to:main::toSpritePtr2_@return -main::toSpritePtr2_@return: scope:[main] from main::toSpritePtr2 - (byte) sin_idx#20 ← phi( main::toSpritePtr2/(byte) sin_idx#21 ) - (byte) main::ypos#4 ← phi( main::toSpritePtr2/(byte) main::ypos#5 ) - (byte) main::xpos#4 ← phi( main::toSpritePtr2/(byte) main::xpos#5 ) - (byte) main::s#4 ← phi( main::toSpritePtr2/(byte) main::s#5 ) - (byte) main::toSpritePtr2_return#2 ← phi( main::toSpritePtr2/(byte) main::toSpritePtr2_return#0 ) - (byte) main::toSpritePtr2_return#1 ← (byte) main::toSpritePtr2_return#2 + (byte*) main::toSpritePtr1_sprite#1 ← phi( main::@1/(byte*) main::toSpritePtr1_sprite#0 ) + (word~) main::toSpritePtr1_$0 ← ((word)) (byte*) main::toSpritePtr1_sprite#1 + (number~) main::toSpritePtr1_$1 ← (word~) main::toSpritePtr1_$0 / (number) $40 + (byte~) main::toSpritePtr1_$2 ← ((byte)) (number~) main::toSpritePtr1_$1 + (byte) main::toSpritePtr1_return#0 ← (byte~) main::toSpritePtr1_$2 + to:main::toSpritePtr1_@return +main::toSpritePtr1_@return: scope:[main] from main::toSpritePtr1 + (byte) sin_idx#20 ← phi( main::toSpritePtr1/(byte) sin_idx#21 ) + (byte) main::ypos#4 ← phi( main::toSpritePtr1/(byte) main::ypos#5 ) + (byte) main::xpos#4 ← phi( main::toSpritePtr1/(byte) main::xpos#5 ) + (byte) main::s#4 ← phi( main::toSpritePtr1/(byte) main::s#5 ) + (byte) main::toSpritePtr1_return#2 ← phi( main::toSpritePtr1/(byte) main::toSpritePtr1_return#0 ) + (byte) main::toSpritePtr1_return#1 ← (byte) main::toSpritePtr1_return#2 to:main::@5 -main::@5: scope:[main] from main::toSpritePtr2_@return - (byte) sin_idx#19 ← phi( main::toSpritePtr2_@return/(byte) sin_idx#20 ) - (byte) main::ypos#3 ← phi( main::toSpritePtr2_@return/(byte) main::ypos#4 ) - (byte) main::xpos#3 ← phi( main::toSpritePtr2_@return/(byte) main::xpos#4 ) - (byte) main::s#3 ← phi( main::toSpritePtr2_@return/(byte) main::s#4 ) - (byte) main::toSpritePtr2_return#3 ← phi( main::toSpritePtr2_@return/(byte) main::toSpritePtr2_return#1 ) - (byte~) main::$7 ← (byte) main::toSpritePtr2_return#3 +main::@5: scope:[main] from main::toSpritePtr1_@return + (byte) sin_idx#19 ← phi( main::toSpritePtr1_@return/(byte) sin_idx#20 ) + (byte) main::ypos#3 ← phi( main::toSpritePtr1_@return/(byte) main::ypos#4 ) + (byte) main::xpos#3 ← phi( main::toSpritePtr1_@return/(byte) main::xpos#4 ) + (byte) main::s#3 ← phi( main::toSpritePtr1_@return/(byte) main::s#4 ) + (byte) main::toSpritePtr1_return#3 ← phi( main::toSpritePtr1_@return/(byte) main::toSpritePtr1_return#1 ) + (byte~) main::$7 ← (byte) main::toSpritePtr1_return#3 *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#3) ← (byte~) main::$7 (byte) main::xpos#1 ← (byte) main::xpos#3 + (number) $18 (byte) main::ypos#1 ← (byte) main::ypos#3 + (number) $18 @@ -519,19 +519,19 @@ SYMBOL TABLE SSA (byte*) main::toD0181_screen (byte*) main::toD0181_screen#0 (byte*) main::toD0181_screen#1 -(label) main::toSpritePtr2 -(word~) main::toSpritePtr2_$0 -(number~) main::toSpritePtr2_$1 -(byte~) main::toSpritePtr2_$2 -(label) main::toSpritePtr2_@return -(byte) main::toSpritePtr2_return -(byte) main::toSpritePtr2_return#0 -(byte) main::toSpritePtr2_return#1 -(byte) main::toSpritePtr2_return#2 -(byte) main::toSpritePtr2_return#3 -(byte*) main::toSpritePtr2_sprite -(byte*) main::toSpritePtr2_sprite#0 -(byte*) main::toSpritePtr2_sprite#1 +(label) main::toSpritePtr1 +(word~) main::toSpritePtr1_$0 +(number~) main::toSpritePtr1_$1 +(byte~) main::toSpritePtr1_$2 +(label) main::toSpritePtr1_@return +(byte) main::toSpritePtr1_return +(byte) main::toSpritePtr1_return#0 +(byte) main::toSpritePtr1_return#1 +(byte) main::toSpritePtr1_return#2 +(byte) main::toSpritePtr1_return#3 +(byte*) main::toSpritePtr1_sprite +(byte*) main::toSpritePtr1_sprite#0 +(byte*) main::toSpritePtr1_sprite#1 (label) main::vicSelectGfxBank1 (byte~) main::vicSelectGfxBank1_$0 (label) main::vicSelectGfxBank1_@1 @@ -645,19 +645,19 @@ interrupt(HARDWARE_CLOBBER)(void()) sprites_irq() (byte) sprites_irq::ptr#5 (byte) sprites_irq::ptr#6 (volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore -(label) sprites_irq::toSpritePtr2 -(word~) sprites_irq::toSpritePtr2_$0 -(number~) sprites_irq::toSpritePtr2_$1 -(byte~) sprites_irq::toSpritePtr2_$2 -(label) sprites_irq::toSpritePtr2_@return -(byte) sprites_irq::toSpritePtr2_return -(byte) sprites_irq::toSpritePtr2_return#0 -(byte) sprites_irq::toSpritePtr2_return#1 -(byte) sprites_irq::toSpritePtr2_return#2 -(byte) sprites_irq::toSpritePtr2_return#3 -(byte*) sprites_irq::toSpritePtr2_sprite -(byte*) sprites_irq::toSpritePtr2_sprite#0 -(byte*) sprites_irq::toSpritePtr2_sprite#1 +(label) sprites_irq::toSpritePtr1 +(word~) sprites_irq::toSpritePtr1_$0 +(number~) sprites_irq::toSpritePtr1_$1 +(byte~) sprites_irq::toSpritePtr1_$2 +(label) sprites_irq::toSpritePtr1_@return +(byte) sprites_irq::toSpritePtr1_return +(byte) sprites_irq::toSpritePtr1_return#0 +(byte) sprites_irq::toSpritePtr1_return#1 +(byte) sprites_irq::toSpritePtr1_return#2 +(byte) sprites_irq::toSpritePtr1_return#3 +(byte*) sprites_irq::toSpritePtr1_sprite +(byte*) sprites_irq::toSpritePtr1_sprite#0 +(byte*) sprites_irq::toSpritePtr1_sprite#1 (byte) sprites_irq::ypos (byte) sprites_irq::ypos#0 (void()) sprites_irq_init() @@ -706,8 +706,8 @@ Adding number conversion cast (unumber) 2 in *((const nomodify byte*) PLAYFIELD_ Adding number conversion cast (unumber) 3 in *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_2 + (number) 3) ← (byte) sprites_irq::ptr#4 Adding number conversion cast (unumber) 9 in (bool~) sprites_irq::$2 ← (volatile byte) irq_cnt == (number) 9 Adding number conversion cast (unumber) $15 in (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (number) $15 -Adding number conversion cast (unumber) $40 in (number~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (number) $40 -Adding number conversion cast (unumber) sprites_irq::toSpritePtr2_$1 in (number~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (unumber)(number) $40 +Adding number conversion cast (unumber) $40 in (number~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (number) $40 +Adding number conversion cast (unumber) sprites_irq::toSpritePtr1_$1 in (number~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (unumber)(number) $40 Adding number conversion cast (unumber) $a in (bool~) sprites_irq::$3 ← (volatile byte) irq_cnt == (number) $a Adding number conversion cast (unumber) 0 in (volatile byte) irq_cnt ← (number) 0 Adding number conversion cast (unumber) $15 in (volatile byte) irq_sprite_ypos ← (volatile byte) irq_sprite_ypos + (number) $15 @@ -735,8 +735,8 @@ Adding number conversion cast (unumber) 2 in (number~) main::$5 ← (byte) main: Adding number conversion cast (unumber) main::$5 in (number~) main::$5 ← (byte) main::s#2 * (unumber)(number) 2 Adding number conversion cast (unumber) 3 in (number~) main::$6 ← (byte) main::s#2 - (number) 3 Adding number conversion cast (unumber) main::$6 in (number~) main::$6 ← (byte) main::s#2 - (unumber)(number) 3 -Adding number conversion cast (unumber) $40 in (number~) main::toSpritePtr2_$1 ← (word~) main::toSpritePtr2_$0 / (number) $40 -Adding number conversion cast (unumber) main::toSpritePtr2_$1 in (number~) main::toSpritePtr2_$1 ← (word~) main::toSpritePtr2_$0 / (unumber)(number) $40 +Adding number conversion cast (unumber) $40 in (number~) main::toSpritePtr1_$1 ← (word~) main::toSpritePtr1_$0 / (number) $40 +Adding number conversion cast (unumber) main::toSpritePtr1_$1 in (number~) main::toSpritePtr1_$1 ← (word~) main::toSpritePtr1_$0 / (unumber)(number) $40 Adding number conversion cast (unumber) $18 in (byte) main::xpos#1 ← (byte) main::xpos#3 + (number) $18 Adding number conversion cast (unumber) $18 in (byte) main::ypos#1 ← (byte) main::ypos#3 + (number) $18 Adding number conversion cast (unumber) $ff in (bool~) loop::$0 ← *((const nomodify byte*) RASTER) != (number) $ff @@ -748,16 +748,16 @@ Inlining cast *((const nomodify byte*) SPRITES_ENABLE) ← (unumber)(number) $f Inlining cast *((const nomodify byte*) SPRITES_MC) ← (unumber)(number) 0 Inlining cast (word~) toSpritePtr1_$0 ← (word)(byte*) toSpritePtr1_sprite#1 Inlining cast (byte~) toSpritePtr1_$2 ← (byte)(unumber~) toSpritePtr1_$1 -Inlining cast (word~) sprites_irq::toSpritePtr2_$0 ← (word)(byte*) sprites_irq::toSpritePtr2_sprite#1 -Inlining cast (byte~) sprites_irq::toSpritePtr2_$2 ← (byte)(unumber~) sprites_irq::toSpritePtr2_$1 +Inlining cast (word~) sprites_irq::toSpritePtr1_$0 ← (word)(byte*) sprites_irq::toSpritePtr1_sprite#1 +Inlining cast (byte~) sprites_irq::toSpritePtr1_$2 ← (byte)(unumber~) sprites_irq::toSpritePtr1_$1 Inlining cast (volatile byte) irq_cnt ← (unumber)(number) 0 Inlining cast *((const nomodify byte*) CIA2_PORT_A_DDR) ← (unumber)(number) 3 Inlining cast (word~) main::vicSelectGfxBank1_toDd001_$0 ← (word)(byte*) main::vicSelectGfxBank1_toDd001_gfx#1 Inlining cast (word~) main::toD0181_$0 ← (word)(byte*) main::toD0181_screen#1 Inlining cast (word~) main::toD0181_$4 ← (word)(byte*) main::toD0181_gfx#1 Inlining cast *((const nomodify byte*) SPRITES_ENABLE) ← (unumber)(number) $ff -Inlining cast (word~) main::toSpritePtr2_$0 ← (word)(byte*) main::toSpritePtr2_sprite#1 -Inlining cast (byte~) main::toSpritePtr2_$2 ← (byte)(unumber~) main::toSpritePtr2_$1 +Inlining cast (word~) main::toSpritePtr1_$0 ← (word)(byte*) main::toSpritePtr1_sprite#1 +Inlining cast (byte~) main::toSpritePtr1_$2 ← (byte)(unumber~) main::toSpritePtr1_$1 Successful SSA optimization Pass2InlineCast Simplifying constant pointer cast (byte*) 0 Simplifying constant pointer cast (byte*) 1 @@ -887,7 +887,7 @@ Inferred type updated to byte in (unumber~) sprites_init::$1 ← (byte) sprites_ Inferred type updated to word in (unumber~) toSpritePtr1_$1 ← (word~) toSpritePtr1_$0 / (byte) $40 Inferred type updated to byte in (unumber~) $1 ← (byte~) $0 + (byte) 3 Inferred type updated to byte in (unumber~) sprites_irq::$0 ← (volatile byte) irq_raster_next + (byte) 1 -Inferred type updated to word in (unumber~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (byte) $40 +Inferred type updated to word in (unumber~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (byte) $40 Inferred type updated to byte in (unumber~) main::vicSelectGfxBank1_toDd001_$2 ← (byte~) main::vicSelectGfxBank1_toDd001_$1 / (byte) $40 Inferred type updated to byte in (unumber~) main::vicSelectGfxBank1_toDd001_$3 ← (byte) 3 ^ (byte~) main::vicSelectGfxBank1_toDd001_$2 Inferred type updated to word in (unumber~) main::toD0181_$1 ← (word~) main::toD0181_$0 & (word) $3fff @@ -898,16 +898,16 @@ Inferred type updated to byte in (unumber~) main::toD0181_$7 ← (byte~) main::t Inferred type updated to byte in (unumber~) main::toD0181_$8 ← (byte~) main::toD0181_$3 | (byte~) main::toD0181_$7 Inferred type updated to byte in (unumber~) main::$5 ← (byte) main::s#2 * (byte) 2 Inferred type updated to byte in (unumber~) main::$6 ← (byte) main::s#2 - (byte) 3 -Inferred type updated to word in (unumber~) main::toSpritePtr2_$1 ← (word~) main::toSpritePtr2_$0 / (byte) $40 +Inferred type updated to word in (unumber~) main::toSpritePtr1_$1 ← (word~) main::toSpritePtr1_$0 / (byte) $40 Inferred type updated to byte in (unumber~) loop::$1 ← (byte) loop::s#2 * (byte) 2 -Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#2 sprites_irq::toSpritePtr2_return#1 sprites_irq::toSpritePtr2_return#3 sprites_irq::$5 +Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#2 sprites_irq::toSpritePtr1_return#1 sprites_irq::toSpritePtr1_return#3 sprites_irq::$5 Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0 Alias sprites_init::s2#0 = sprites_init::$0 Alias sprites_init::xpos#1 = sprites_init::$1 Alias toSpritePtr1_sprite#0 = toSpritePtr1_sprite#1 Alias toSpritePtr1_return#0 = toSpritePtr1_$2 toSpritePtr1_return#2 toSpritePtr1_return#1 toSpritePtr1_return#3 $0 Alias sprites_irq::ptr#0 = sprites_irq::ptr#5 sprites_irq::ptr#6 -Alias sprites_irq::toSpritePtr2_sprite#0 = sprites_irq::toSpritePtr2_sprite#1 +Alias sprites_irq::toSpritePtr1_sprite#0 = sprites_irq::toSpritePtr1_sprite#1 Alias main::vicSelectGfxBank1_gfx#0 = main::vicSelectGfxBank1_gfx#1 main::vicSelectGfxBank1_toDd001_gfx#0 main::vicSelectGfxBank1_toDd001_gfx#1 Alias sin_idx#23 = sin_idx#31 sin_idx#32 sin_idx#30 sin_idx#29 sin_idx#28 sin_idx#27 sin_idx#26 sin_idx#25 sin_idx#24 Alias main::vicSelectGfxBank1_toDd001_return#0 = main::vicSelectGfxBank1_toDd001_$3 main::vicSelectGfxBank1_toDd001_return#2 main::vicSelectGfxBank1_toDd001_return#1 main::vicSelectGfxBank1_toDd001_return#3 main::vicSelectGfxBank1_$0 @@ -915,12 +915,12 @@ Alias main::toD0181_screen#0 = main::toD0181_screen#1 Alias main::toD0181_gfx#0 = main::toD0181_gfx#1 Alias main::toD0181_return#0 = main::toD0181_$8 main::toD0181_return#2 main::toD0181_return#1 main::toD0181_return#3 main::$1 Alias main::s2#0 = main::$5 -Alias main::toSpritePtr2_sprite#0 = main::toSpritePtr2_sprite#1 +Alias main::toSpritePtr1_sprite#0 = main::toSpritePtr1_sprite#1 Alias main::s#2 = main::s#5 main::s#4 main::s#3 Alias main::xpos#2 = main::xpos#5 main::xpos#4 main::xpos#3 Alias main::ypos#2 = main::ypos#5 main::ypos#4 main::ypos#3 Alias sin_idx#12 = sin_idx#21 sin_idx#22 sin_idx#20 sin_idx#19 sin_idx#17 -Alias main::toSpritePtr2_return#0 = main::toSpritePtr2_$2 main::toSpritePtr2_return#2 main::toSpritePtr2_return#1 main::toSpritePtr2_return#3 main::$7 +Alias main::toSpritePtr1_return#0 = main::toSpritePtr1_$2 main::toSpritePtr1_return#2 main::toSpritePtr1_return#1 main::toSpritePtr1_return#3 main::$7 Alias sin_idx#1 = sin_idx#6 sin_idx#7 sin_idx#2 Alias sin_idx#13 = sin_idx#8 Alias sin_idx#14 = sin_idx#9 @@ -928,10 +928,10 @@ Alias sin_idx#10 = sin_idx#15 sin_idx#4 Alias sin_idx#0 = sin_idx#16 Alias sin_idx#11 = sin_idx#5 Successful SSA optimization Pass2AliasElimination -Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#2 sprites_irq::toSpritePtr2_return#1 sprites_irq::toSpritePtr2_return#3 sprites_irq::$5 +Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#2 sprites_irq::toSpritePtr1_return#1 sprites_irq::toSpritePtr1_return#3 sprites_irq::$5 Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0 -Identical Phi Values (byte) sprites_irq::toSpritePtr2_return#2 (byte) sprites_irq::toSpritePtr2_return#0 -Identical Phi Values (byte) sprites_irq::toSpritePtr2_return#3 (byte) sprites_irq::toSpritePtr2_return#1 +Identical Phi Values (byte) sprites_irq::toSpritePtr1_return#2 (byte) sprites_irq::toSpritePtr1_return#0 +Identical Phi Values (byte) sprites_irq::toSpritePtr1_return#3 (byte) sprites_irq::toSpritePtr1_return#1 Identical Phi Values (byte) sin_idx#23 (byte) sin_idx#0 Identical Phi Values (byte) sin_idx#12 (byte) sin_idx#23 Identical Phi Values (byte) sin_idx#1 (byte) sin_idx#10 @@ -952,7 +952,7 @@ Successful SSA optimization Pass2ConditionalJumpSimplification Constant (const byte) sprites_init::xpos#0 = (byte)$18+$f*8 Constant (const byte) sprites_init::s#0 = 0 Constant (const byte*) toSpritePtr1_sprite#0 = PLAYFIELD_SPRITES -Constant (const byte*) sprites_irq::toSpritePtr2_sprite#0 = PLAYFIELD_SPRITES +Constant (const byte*) sprites_irq::toSpritePtr1_sprite#0 = PLAYFIELD_SPRITES Constant (const byte) sin_idx#0 = 0 Constant (const byte*) main::vicSelectGfxBank1_gfx#0 = PLAYFIELD_SCREEN_1 Constant (const byte*) main::toD0181_screen#0 = PLAYFIELD_SCREEN_1 @@ -960,15 +960,15 @@ Constant (const byte*) main::toD0181_gfx#0 = PLAYFIELD_CHARSET Constant (const byte) main::xpos#0 = $18 Constant (const byte) main::ypos#0 = $32 Constant (const byte) main::s#0 = 4 -Constant (const byte*) main::toSpritePtr2_sprite#0 = SIN_SPRITE +Constant (const byte*) main::toSpritePtr1_sprite#0 = SIN_SPRITE Constant (const byte) loop::s#0 = 4 Successful SSA optimization Pass2ConstantIdentification Constant (const word) toSpritePtr1_$0 = (word)toSpritePtr1_sprite#0 -Constant (const word) sprites_irq::toSpritePtr2_$0 = (word)sprites_irq::toSpritePtr2_sprite#0 +Constant (const word) sprites_irq::toSpritePtr1_$0 = (word)sprites_irq::toSpritePtr1_sprite#0 Constant (const word) main::vicSelectGfxBank1_toDd001_$0 = (word)main::vicSelectGfxBank1_gfx#0 Constant (const word) main::toD0181_$0 = (word)main::toD0181_screen#0 Constant (const word) main::toD0181_$4 = (word)main::toD0181_gfx#0 -Constant (const word) main::toSpritePtr2_$0 = (word)main::toSpritePtr2_sprite#0 +Constant (const word) main::toSpritePtr1_$0 = (word)main::toSpritePtr1_sprite#0 Successful SSA optimization Pass2ConstantIdentification if() condition always true - replacing block destination [139] if(true) goto loop::@4 Successful SSA optimization Pass2ConstantIfs @@ -998,31 +998,31 @@ Finalized unsigned number type (byte) 4 Finalized unsigned number type (byte) 8 Finalized unsigned number type (byte) 8 Successful SSA optimization PassNFinalizeNumberTypeConversions -Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#1 sprites_irq::$5 +Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#1 sprites_irq::$5 Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0 Constant right-side identified [16] (word~) toSpritePtr1_$1 ← (const word) toSpritePtr1_$0 / (byte) $40 -Constant right-side identified [60] (word~) sprites_irq::toSpritePtr2_$1 ← (const word) sprites_irq::toSpritePtr2_$0 / (byte) $40 +Constant right-side identified [60] (word~) sprites_irq::toSpritePtr1_$1 ← (const word) sprites_irq::toSpritePtr1_$0 / (byte) $40 Constant right-side identified [79] (byte~) main::vicSelectGfxBank1_toDd001_$1 ← > (const word) main::vicSelectGfxBank1_toDd001_$0 Constant right-side identified [83] (word~) main::toD0181_$1 ← (const word) main::toD0181_$0 & (word) $3fff Constant right-side identified [86] (byte~) main::toD0181_$5 ← > (const word) main::toD0181_$4 -Constant right-side identified [99] (word~) main::toSpritePtr2_$1 ← (const word) main::toSpritePtr2_$0 / (byte) $40 +Constant right-side identified [99] (word~) main::toSpritePtr1_$1 ← (const word) main::toSpritePtr1_$0 / (byte) $40 Successful SSA optimization Pass2ConstantRValueConsolidation Constant (const word) toSpritePtr1_$1 = toSpritePtr1_$0/$40 -Constant (const word) sprites_irq::toSpritePtr2_$1 = sprites_irq::toSpritePtr2_$0/$40 +Constant (const word) sprites_irq::toSpritePtr1_$1 = sprites_irq::toSpritePtr1_$0/$40 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 word) main::toSpritePtr2_$1 = main::toSpritePtr2_$0/$40 +Constant (const word) main::toSpritePtr1_$1 = main::toSpritePtr1_$0/$40 Successful SSA optimization Pass2ConstantIdentification Constant (const byte) toSpritePtr1_return#0 = (byte)toSpritePtr1_$1 -Constant (const byte) sprites_irq::toSpritePtr2_$2 = (byte)sprites_irq::toSpritePtr2_$1 -Constant (const byte) main::toSpritePtr2_return#0 = (byte)main::toSpritePtr2_$1 +Constant (const byte) sprites_irq::toSpritePtr1_$2 = (byte)sprites_irq::toSpritePtr1_$1 +Constant (const byte) main::toSpritePtr1_return#0 = (byte)main::toSpritePtr1_$1 Successful SSA optimization Pass2ConstantIdentification -Constant (const byte) sprites_irq::toSpritePtr2_return#0 = sprites_irq::toSpritePtr2_$2 +Constant (const byte) sprites_irq::toSpritePtr1_return#0 = sprites_irq::toSpritePtr1_$2 Successful SSA optimization Pass2ConstantIdentification -Constant (const byte) sprites_irq::toSpritePtr2_return#1 = sprites_irq::toSpritePtr2_return#0 +Constant (const byte) sprites_irq::toSpritePtr1_return#1 = sprites_irq::toSpritePtr1_return#0 Successful SSA optimization Pass2ConstantIdentification -Constant (const byte) sprites_irq::$5 = sprites_irq::toSpritePtr2_return#1 +Constant (const byte) sprites_irq::$5 = sprites_irq::toSpritePtr1_return#1 Successful SSA optimization Pass2ConstantIdentification Alias candidate removed (volatile)irq_sprite_ptr = $1 Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0 @@ -1067,7 +1067,7 @@ Rewriting multiplication to use shift [93] (byte~) loop::$1 ← (byte) loop::s#2 Successful SSA optimization Pass2MultiplyToShiftRewriting Inlining constant with var siblings (const byte) sprites_init::xpos#0 Inlining constant with var siblings (const byte) sprites_init::s#0 -Inlining constant with different constant siblings (const byte) sprites_irq::toSpritePtr2_return#1 +Inlining constant with different constant siblings (const byte) sprites_irq::toSpritePtr1_return#1 Inlining constant with var siblings (const byte) main::xpos#0 Inlining constant with var siblings (const byte) main::ypos#0 Inlining constant with var siblings (const byte) main::s#0 @@ -1075,30 +1075,30 @@ Inlining constant with var siblings (const byte) loop::s#0 Inlining constant with var siblings (const byte) sin_idx#0 Constant inlined main::toD0181_screen#0 = (const nomodify byte*) PLAYFIELD_SCREEN_1 Constant inlined main::toD0181_gfx#0 = (const nomodify byte*) PLAYFIELD_CHARSET -Constant inlined sprites_irq::toSpritePtr2_return#1 = (const byte) sprites_irq::toSpritePtr2_return#0 -Constant inlined sprites_irq::toSpritePtr2_$2 = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 -Constant inlined sprites_irq::$5 = (const byte) sprites_irq::toSpritePtr2_return#0 -Constant inlined sprites_irq::toSpritePtr2_$1 = (word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 +Constant inlined main::toSpritePtr1_$0 = (word)(const byte*) SIN_SPRITE +Constant inlined sprites_irq::toSpritePtr1_sprite#0 = (const nomodify byte*) PLAYFIELD_SPRITES +Constant inlined sprites_irq::$5 = (const byte) sprites_irq::toSpritePtr1_return#0 Constant inlined sprites_init::xpos#0 = (byte)(number) $18+(number) $f*(number) 8 -Constant inlined main::toSpritePtr2_sprite#0 = (const byte*) SIN_SPRITE -Constant inlined sprites_irq::toSpritePtr2_$0 = (word)(const nomodify byte*) PLAYFIELD_SPRITES Constant inlined $1 = (const byte) toSpritePtr1_return#0+(byte) 3 Constant inlined toSpritePtr1_$0 = (word)(const nomodify byte*) PLAYFIELD_SPRITES Constant inlined toSpritePtr1_$1 = (word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 +Constant inlined main::toSpritePtr1_$1 = (word)(const byte*) SIN_SPRITE/(byte) $40 Constant inlined sin_idx#0 = (byte) 0 +Constant inlined sprites_irq::toSpritePtr1_return#1 = (const byte) sprites_irq::toSpritePtr1_return#0 +Constant inlined main::toSpritePtr1_sprite#0 = (const byte*) SIN_SPRITE Constant inlined sprites_init::s#0 = (byte) 0 Constant inlined main::xpos#0 = (byte) $18 Constant inlined main::s#0 = (byte) 4 Constant inlined main::toD0181_$7 = >(word)(const nomodify byte*) PLAYFIELD_CHARSET/(byte) 4&(byte) $f -Constant inlined main::toSpritePtr2_$1 = (word)(const byte*) SIN_SPRITE/(byte) $40 -Constant inlined main::toSpritePtr2_$0 = (word)(const byte*) SIN_SPRITE +Constant inlined sprites_irq::toSpritePtr1_$2 = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 Constant inlined main::toD0181_$2 = (word)(const nomodify byte*) PLAYFIELD_SCREEN_1&(word) $3fff*(byte) 4 +Constant inlined sprites_irq::toSpritePtr1_$1 = (word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 Constant inlined main::toD0181_$1 = (word)(const nomodify byte*) PLAYFIELD_SCREEN_1&(word) $3fff +Constant inlined sprites_irq::toSpritePtr1_$0 = (word)(const nomodify byte*) PLAYFIELD_SPRITES Constant inlined main::toD0181_$0 = (word)(const nomodify byte*) PLAYFIELD_SCREEN_1 Constant inlined main::toD0181_$6 = >(word)(const nomodify byte*) PLAYFIELD_CHARSET/(byte) 4 Constant inlined main::toD0181_$5 = >(word)(const nomodify byte*) PLAYFIELD_CHARSET Constant inlined main::toD0181_$4 = (word)(const nomodify byte*) PLAYFIELD_CHARSET -Constant inlined sprites_irq::toSpritePtr2_sprite#0 = (const nomodify byte*) PLAYFIELD_SPRITES Constant inlined main::toD0181_$3 = >(word)(const nomodify byte*) PLAYFIELD_SCREEN_1&(word) $3fff*(byte) 4 Constant inlined main::ypos#0 = (byte) $32 Constant inlined toSpritePtr1_sprite#0 = (const nomodify byte*) PLAYFIELD_SPRITES @@ -1131,14 +1131,14 @@ Adding NOP phi() at start of main::vicSelectGfxBank1_toDd001_@return Adding NOP phi() at start of main::@3 Adding NOP phi() at start of main::toD0181 Adding NOP phi() at start of main::toD0181_@return -Adding NOP phi() at start of main::toSpritePtr2 -Adding NOP phi() at start of main::toSpritePtr2_@return +Adding NOP phi() at start of main::toSpritePtr1 +Adding NOP phi() at start of main::toSpritePtr1_@return Adding NOP phi() at start of main::@2 Adding NOP phi() at start of main::@7 Adding NOP phi() at start of main::@8 Adding NOP phi() at start of loop -Adding NOP phi() at start of sprites_irq::toSpritePtr2 -Adding NOP phi() at start of sprites_irq::toSpritePtr2_@return +Adding NOP phi() at start of sprites_irq::toSpritePtr1 +Adding NOP phi() at start of sprites_irq::toSpritePtr1_@return CALL GRAPH Calls in [] to main:11 Calls in [main] to sprites_init:23 sprites_irq_init:39 loop:41 @@ -1159,12 +1159,12 @@ Culled Empty Block (label) @11 Culled Empty Block (label) main::vicSelectGfxBank1_toDd001_@return Culled Empty Block (label) main::@3 Culled Empty Block (label) main::toD0181_@return -Culled Empty Block (label) main::toSpritePtr2_@return +Culled Empty Block (label) main::toSpritePtr1_@return Culled Empty Block (label) main::@8 Culled Empty Block (label) main::@9 Culled Empty Block (label) loop::@11 Culled Empty Block (label) sprites_init::@3 -Culled Empty Block (label) sprites_irq::toSpritePtr2_@return +Culled Empty Block (label) sprites_irq::toSpritePtr1_@return Renumbering block @4 to @1 Renumbering block @5 to @2 Renumbering block @7 to @3 @@ -1192,11 +1192,11 @@ Adding NOP phi() at start of @end Adding NOP phi() at start of main Adding NOP phi() at start of main::vicSelectGfxBank1_toDd001 Adding NOP phi() at start of main::toD0181 -Adding NOP phi() at start of main::toSpritePtr2 +Adding NOP phi() at start of main::toSpritePtr1 Adding NOP phi() at start of main::@2 Adding NOP phi() at start of main::@6 Adding NOP phi() at start of loop -Adding NOP phi() at start of sprites_irq::toSpritePtr2 +Adding NOP phi() at start of sprites_irq::toSpritePtr1 FINAL CONTROL FLOW GRAPH @begin: scope:[] from @@ -1274,12 +1274,12 @@ main::@1: scope:[main] from main::@4 main::@5 [23] *((const nomodify byte*) SPRITES_YPOS + (byte) main::s2#0) ← (byte) main::ypos#2 [24] (byte~) main::$6 ← (byte) main::s#2 - (byte) 3 [25] *((const nomodify byte*) SPRITES_COLS + (byte) main::s#2) ← (byte~) main::$6 - to:main::toSpritePtr2 -main::toSpritePtr2: scope:[main] from main::@1 + to:main::toSpritePtr1 +main::toSpritePtr1: scope:[main] from main::@1 [26] phi() to:main::@4 -main::@4: scope:[main] from main::toSpritePtr2 - [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr2_return#0 +main::@4: scope:[main] from main::toSpritePtr1 + [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr1_return#0 [28] (byte) main::xpos#1 ← (byte) main::xpos#2 + (byte) $18 [29] (byte) main::ypos#1 ← (byte) main::ypos#2 + (byte) $18 [30] (byte) main::s#1 ← ++ (byte) main::s#2 @@ -1416,12 +1416,12 @@ sprites_irq::@4: scope:[sprites_irq] from sprites_irq::@6 sprites_irq::@3: scope:[sprites_irq] from sprites_irq::@2 [102] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15 [103] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS - to:sprites_irq::toSpritePtr2 -sprites_irq::toSpritePtr2: scope:[sprites_irq] from sprites_irq::@3 + to:sprites_irq::toSpritePtr1 +sprites_irq::toSpritePtr1: scope:[sprites_irq] from sprites_irq::@3 [104] phi() to:sprites_irq::@11 -sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr2 - [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 +sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr1 + [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 to:sprites_irq::@5 sprites_irq::@1: scope:[sprites_irq] from sprites_irq::@9 [106] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1) ← (byte) sprites_irq::ptr#0 @@ -1457,8 +1457,8 @@ VARIABLE REGISTER WEIGHTS (byte*) main::toD0181_gfx (byte) main::toD0181_return (byte*) main::toD0181_screen -(byte) main::toSpritePtr2_return -(byte*) main::toSpritePtr2_sprite +(byte) main::toSpritePtr1_return +(byte*) main::toSpritePtr1_sprite (byte*) main::vicSelectGfxBank1_gfx (byte*) main::vicSelectGfxBank1_toDd001_gfx (byte) main::vicSelectGfxBank1_toDd001_return @@ -1490,8 +1490,8 @@ interrupt(HARDWARE_CLOBBER)(void()) sprites_irq() (byte) sprites_irq::ptr#3 2.6666666666666665 (byte) sprites_irq::ptr#4 4.0 (volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore 6.5 -(byte) sprites_irq::toSpritePtr2_return -(byte*) sprites_irq::toSpritePtr2_sprite +(byte) sprites_irq::toSpritePtr1_return +(byte*) sprites_irq::toSpritePtr1_sprite (byte) sprites_irq::ypos (byte) sprites_irq::ypos#0 2.5 (void()) sprites_irq_init() @@ -1703,7 +1703,7 @@ __bend_from___b4: __bend: // main main: { - .const toSpritePtr2_return = SIN_SPRITE/$40 + .const toSpritePtr1_return = SIN_SPRITE/$40 .const vicSelectGfxBank1_toDd001_return = 3 .const toD0181_return = (>(PLAYFIELD_SCREEN_1&$3fff)*4)|(>PLAYFIELD_CHARSET)/4&$f .label __6 = $10 @@ -1787,16 +1787,16 @@ main: { lda.z __6 ldy.z s sta SPRITES_COLS,y - // [26] phi from main::@1 to main::toSpritePtr2 [phi:main::@1->main::toSpritePtr2] - toSpritePtr2_from___b1: - jmp toSpritePtr2 - // main::toSpritePtr2 - toSpritePtr2: + // [26] phi from main::@1 to main::toSpritePtr1 [phi:main::@1->main::toSpritePtr1] + toSpritePtr1_from___b1: + jmp toSpritePtr1 + // main::toSpritePtr1 + toSpritePtr1: jmp __b4 // main::@4 __b4: - // [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr2_return#0 -- pbuc1_derefidx_vbuz1=vbuc2 - lda #toSpritePtr2_return + // [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr1_return#0 -- pbuc1_derefidx_vbuz1=vbuc2 + lda #toSpritePtr1_return ldy.z s sta PLAYFIELD_SPRITE_PTRS_1,y // [28] (byte) main::xpos#1 ← (byte) main::xpos#2 + (byte) $18 -- vbuz1=vbuz1_plus_vbuc1 @@ -2019,7 +2019,7 @@ sprites_init: { // Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST // Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers sprites_irq: { - .const toSpritePtr2_return = PLAYFIELD_SPRITES/$40 + .const toSpritePtr1_return = PLAYFIELD_SPRITES/$40 .label __0 = $14 .label raster_sprite_gfx_modify = $15 .label ypos = $13 @@ -2179,16 +2179,16 @@ sprites_irq: { // [103] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS -- vbuz1=vbuc1 lda #SPRITES_FIRST_YPOS sta.z irq_sprite_ypos - // [104] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2] - toSpritePtr2_from___b3: - jmp toSpritePtr2 - // sprites_irq::toSpritePtr2 - toSpritePtr2: + // [104] phi from sprites_irq::@3 to sprites_irq::toSpritePtr1 [phi:sprites_irq::@3->sprites_irq::toSpritePtr1] + toSpritePtr1_from___b3: + jmp toSpritePtr1 + // sprites_irq::toSpritePtr1 + toSpritePtr1: jmp __b11 // sprites_irq::@11 __b11: - // [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1 - lda #toSpritePtr2_return + // [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 -- vbuz1=vbuc1 + lda #toSpritePtr1_return sta.z irq_sprite_ptr jmp __b5 // sprites_irq::@1 @@ -2260,7 +2260,7 @@ Statement [22] *((const nomodify byte*) SPRITES_XPOS + (byte) main::s2#0) ← (b Removing always clobbered register reg byte a as potential for zp[1]:15 [ main::s2#0 ] Statement [23] *((const nomodify byte*) SPRITES_YPOS + (byte) main::s2#0) ← (byte) main::ypos#2 [ main::s#2 main::xpos#2 main::ypos#2 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 ] { } ) always clobbers reg byte a Statement [24] (byte~) main::$6 ← (byte) main::s#2 - (byte) 3 [ main::s#2 main::xpos#2 main::ypos#2 main::$6 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 main::$6 ] { } ) always clobbers reg byte a -Statement [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr2_return#0 [ main::s#2 main::xpos#2 main::ypos#2 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 ] { } ) always clobbers reg byte a +Statement [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr1_return#0 [ main::s#2 main::xpos#2 main::ypos#2 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 ] { } ) always clobbers reg byte a Statement [28] (byte) main::xpos#1 ← (byte) main::xpos#2 + (byte) $18 [ main::s#2 main::ypos#2 main::xpos#1 ] ( main:10 [ main::s#2 main::ypos#2 main::xpos#1 ] { } ) always clobbers reg byte a Statement [29] (byte) main::ypos#1 ← (byte) main::ypos#2 + (byte) $18 [ main::s#2 main::xpos#1 main::ypos#1 ] ( main:10 [ main::s#2 main::xpos#1 main::ypos#1 ] { } ) always clobbers reg byte a Statement [39] if(*((const nomodify byte*) RASTER)!=(byte) $ff) goto loop::@2 [ sin_idx#10 ] ( main:10::loop:35 [ sin_idx#10 ] { } ) always clobbers reg byte a @@ -2306,7 +2306,7 @@ Statement [100] (volatile byte) irq_sprite_ypos ← (volatile byte) irq_sprite_y Statement [101] (volatile byte) irq_sprite_ptr ← (volatile byte) irq_sprite_ptr + (byte) 3 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x Statement [102] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x Statement [103] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a -Statement [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a +Statement [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a Statement [1] (volatile byte) render_screen_showing ← (byte) 0 [ ] ( [ ] { } ) always clobbers reg byte a Statement [3] (volatile byte) irq_raster_next ← (const nomodify byte) IRQ_RASTER_FIRST [ ] ( [ ] { } ) always clobbers reg byte a Statement [4] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS+(byte) $15 [ ] ( [ ] { } ) always clobbers reg byte a @@ -2320,7 +2320,7 @@ Statement [21] (byte) main::s2#0 ← (byte) main::s#2 << (byte) 1 [ main::s#2 ma Statement [22] *((const nomodify byte*) SPRITES_XPOS + (byte) main::s2#0) ← (byte) main::xpos#2 [ main::s#2 main::xpos#2 main::ypos#2 main::s2#0 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 main::s2#0 ] { } ) always clobbers reg byte a Statement [23] *((const nomodify byte*) SPRITES_YPOS + (byte) main::s2#0) ← (byte) main::ypos#2 [ main::s#2 main::xpos#2 main::ypos#2 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 ] { } ) always clobbers reg byte a Statement [24] (byte~) main::$6 ← (byte) main::s#2 - (byte) 3 [ main::s#2 main::xpos#2 main::ypos#2 main::$6 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 main::$6 ] { } ) always clobbers reg byte a -Statement [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr2_return#0 [ main::s#2 main::xpos#2 main::ypos#2 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 ] { } ) always clobbers reg byte a +Statement [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr1_return#0 [ main::s#2 main::xpos#2 main::ypos#2 ] ( main:10 [ main::s#2 main::xpos#2 main::ypos#2 ] { } ) always clobbers reg byte a Statement [28] (byte) main::xpos#1 ← (byte) main::xpos#2 + (byte) $18 [ main::s#2 main::ypos#2 main::xpos#1 ] ( main:10 [ main::s#2 main::ypos#2 main::xpos#1 ] { } ) always clobbers reg byte a Statement [29] (byte) main::ypos#1 ← (byte) main::ypos#2 + (byte) $18 [ main::s#2 main::xpos#1 main::ypos#1 ] ( main:10 [ main::s#2 main::xpos#1 main::ypos#1 ] { } ) always clobbers reg byte a Statement [39] if(*((const nomodify byte*) RASTER)!=(byte) $ff) goto loop::@2 [ sin_idx#10 ] ( main:10::loop:35 [ sin_idx#10 ] { } ) always clobbers reg byte a @@ -2360,7 +2360,7 @@ Statement [100] (volatile byte) irq_sprite_ypos ← (volatile byte) irq_sprite_y Statement [101] (volatile byte) irq_sprite_ptr ← (volatile byte) irq_sprite_ptr + (byte) 3 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x Statement [102] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x Statement [103] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a -Statement [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a +Statement [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a Potential registers zp[1]:2 [ main::s#2 main::s#1 ] : zp[1]:2 , reg byte x , reg byte y , Potential registers zp[1]:3 [ main::xpos#2 main::xpos#1 ] : zp[1]:3 , reg byte x , reg byte y , Potential registers zp[1]:4 [ main::ypos#2 main::ypos#1 ] : zp[1]:4 , reg byte x , reg byte y , @@ -2573,7 +2573,7 @@ __bend_from___b4: __bend: // main main: { - .const toSpritePtr2_return = SIN_SPRITE/$40 + .const toSpritePtr1_return = SIN_SPRITE/$40 .const vicSelectGfxBank1_toDd001_return = 3 .const toD0181_return = (>(PLAYFIELD_SCREEN_1&$3fff)*4)|(>PLAYFIELD_CHARSET)/4&$f .label xpos = 3 @@ -2649,16 +2649,16 @@ main: { sbc #3 // [25] *((const nomodify byte*) SPRITES_COLS + (byte) main::s#2) ← (byte~) main::$6 -- pbuc1_derefidx_vbuyy=vbuaa sta SPRITES_COLS,y - // [26] phi from main::@1 to main::toSpritePtr2 [phi:main::@1->main::toSpritePtr2] - toSpritePtr2_from___b1: - jmp toSpritePtr2 - // main::toSpritePtr2 - toSpritePtr2: + // [26] phi from main::@1 to main::toSpritePtr1 [phi:main::@1->main::toSpritePtr1] + toSpritePtr1_from___b1: + jmp toSpritePtr1 + // main::toSpritePtr1 + toSpritePtr1: jmp __b4 // main::@4 __b4: - // [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr2_return#0 -- pbuc1_derefidx_vbuyy=vbuc2 - lda #toSpritePtr2_return + // [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr1_return#0 -- pbuc1_derefidx_vbuyy=vbuc2 + lda #toSpritePtr1_return sta PLAYFIELD_SPRITE_PTRS_1,y // [28] (byte) main::xpos#1 ← (byte) main::xpos#2 + (byte) $18 -- vbuz1=vbuz1_plus_vbuc1 lax.z xpos @@ -2867,7 +2867,7 @@ sprites_init: { // Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST // Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers sprites_irq: { - .const toSpritePtr2_return = PLAYFIELD_SPRITES/$40 + .const toSpritePtr1_return = PLAYFIELD_SPRITES/$40 .label raster_sprite_gfx_modify = $a // entry interrupt(HARDWARE_CLOBBER) sta rega+1 @@ -3003,16 +3003,16 @@ sprites_irq: { // [103] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS -- vbuz1=vbuc1 lda #SPRITES_FIRST_YPOS sta.z irq_sprite_ypos - // [104] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2] - toSpritePtr2_from___b3: - jmp toSpritePtr2 - // sprites_irq::toSpritePtr2 - toSpritePtr2: + // [104] phi from sprites_irq::@3 to sprites_irq::toSpritePtr1 [phi:sprites_irq::@3->sprites_irq::toSpritePtr1] + toSpritePtr1_from___b3: + jmp toSpritePtr1 + // sprites_irq::toSpritePtr1 + toSpritePtr1: jmp __b11 // sprites_irq::@11 __b11: - // [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1 - lda #toSpritePtr2_return + // [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 -- vbuz1=vbuc1 + lda #toSpritePtr1_return sta.z irq_sprite_ptr jmp __b5 // sprites_irq::@1 @@ -3074,7 +3074,7 @@ Removing instruction jmp toD0181 Removing instruction jmp __b3 Removing instruction jmp __b5 Removing instruction jmp __b1 -Removing instruction jmp toSpritePtr2 +Removing instruction jmp toSpritePtr1 Removing instruction jmp __b4 Removing instruction jmp __b2 Removing instruction jmp __b6 @@ -3095,7 +3095,7 @@ Removing instruction jmp __b6 Removing instruction jmp __b7 Removing instruction jmp __b5 Removing instruction jmp __breturn -Removing instruction jmp toSpritePtr2 +Removing instruction jmp toSpritePtr1 Removing instruction jmp __b11 Succesful ASM optimization Pass5NextJumpElimination Removing instruction lda SPRITES_MC @@ -3117,8 +3117,8 @@ Removing instruction vicSelectGfxBank1_toDd001: Removing instruction toD0181_from_vicSelectGfxBank1___b1: Removing instruction toD0181: Removing instruction __b1_from___b4: -Removing instruction toSpritePtr2_from___b1: -Removing instruction toSpritePtr2: +Removing instruction toSpritePtr1_from___b1: +Removing instruction toSpritePtr1: Removing instruction __b2_from___b4: Removing instruction __b6_from___b2: Removing instruction loop_from___b6: @@ -3126,8 +3126,8 @@ Removing instruction __b1: Removing instruction __b4_from___b4: Removing instruction __b1_from___b1: Removing instruction __breturn: -Removing instruction toSpritePtr2_from___b3: -Removing instruction toSpritePtr2: +Removing instruction toSpritePtr1_from___b3: +Removing instruction toSpritePtr1: Succesful ASM optimization Pass5RedundantLabelElimination Removing instruction __b2: Removing instruction __b5: @@ -3246,10 +3246,10 @@ FINAL SYMBOL TABLE (byte) main::toD0181_return (const byte) main::toD0181_return#0 toD0181_return = >(word)(const nomodify byte*) PLAYFIELD_SCREEN_1&(word) $3fff*(byte) 4|>(word)(const nomodify byte*) PLAYFIELD_CHARSET/(byte) 4&(byte) $f (byte*) main::toD0181_screen -(label) main::toSpritePtr2 -(byte) main::toSpritePtr2_return -(const byte) main::toSpritePtr2_return#0 toSpritePtr2_return = (byte)(word)(const byte*) SIN_SPRITE/(byte) $40 -(byte*) main::toSpritePtr2_sprite +(label) main::toSpritePtr1 +(byte) main::toSpritePtr1_return +(const byte) main::toSpritePtr1_return#0 toSpritePtr1_return = (byte)(word)(const byte*) SIN_SPRITE/(byte) $40 +(byte*) main::toSpritePtr1_sprite (label) main::vicSelectGfxBank1 (label) main::vicSelectGfxBank1_@1 (byte*) main::vicSelectGfxBank1_gfx @@ -3299,10 +3299,10 @@ interrupt(HARDWARE_CLOBBER)(void()) sprites_irq() (byte) sprites_irq::ptr#3 reg byte a 2.6666666666666665 (byte) sprites_irq::ptr#4 reg byte a 4.0 (volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore zp[1]:10 6.5 -(label) sprites_irq::toSpritePtr2 -(byte) sprites_irq::toSpritePtr2_return -(const byte) sprites_irq::toSpritePtr2_return#0 toSpritePtr2_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 -(byte*) sprites_irq::toSpritePtr2_sprite +(label) sprites_irq::toSpritePtr1 +(byte) sprites_irq::toSpritePtr1_return +(const byte) sprites_irq::toSpritePtr1_return#0 toSpritePtr1_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 +(byte*) sprites_irq::toSpritePtr1_sprite (byte) sprites_irq::ypos (byte) sprites_irq::ypos#0 reg byte a 2.5 (void()) sprites_irq_init() @@ -3455,7 +3455,7 @@ __bbegin: // @end // main main: { - .const toSpritePtr2_return = SIN_SPRITE/$40 + .const toSpritePtr1_return = SIN_SPRITE/$40 .const vicSelectGfxBank1_toDd001_return = 3 .const toD0181_return = (>(PLAYFIELD_SCREEN_1&$3fff)*4)|(>PLAYFIELD_CHARSET)/4&$f .label xpos = 3 @@ -3523,12 +3523,12 @@ main: { // SPRITES_COLS[s] = s-3 // [25] *((const nomodify byte*) SPRITES_COLS + (byte) main::s#2) ← (byte~) main::$6 -- pbuc1_derefidx_vbuyy=vbuaa sta SPRITES_COLS,y - // [26] phi from main::@1 to main::toSpritePtr2 [phi:main::@1->main::toSpritePtr2] - // main::toSpritePtr2 + // [26] phi from main::@1 to main::toSpritePtr1 [phi:main::@1->main::toSpritePtr1] + // main::toSpritePtr1 // main::@4 // PLAYFIELD_SPRITE_PTRS_1[s] = toSpritePtr(SIN_SPRITE) - // [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr2_return#0 -- pbuc1_derefidx_vbuyy=vbuc2 - lda #toSpritePtr2_return + // [27] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1 + (byte) main::s#2) ← (const byte) main::toSpritePtr1_return#0 -- pbuc1_derefidx_vbuyy=vbuc2 + lda #toSpritePtr1_return sta PLAYFIELD_SPRITE_PTRS_1,y // xpos += 24 // [28] (byte) main::xpos#1 ← (byte) main::xpos#2 + (byte) $18 -- vbuz1=vbuz1_plus_vbuc1 @@ -3740,7 +3740,7 @@ sprites_init: { // Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST // Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers sprites_irq: { - .const toSpritePtr2_return = PLAYFIELD_SPRITES/$40 + .const toSpritePtr1_return = PLAYFIELD_SPRITES/$40 .label raster_sprite_gfx_modify = $a // entry interrupt(HARDWARE_CLOBBER) sta rega+1 @@ -3895,12 +3895,12 @@ sprites_irq: { // [103] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS -- vbuz1=vbuc1 lda #SPRITES_FIRST_YPOS sta.z irq_sprite_ypos - // [104] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2] - // sprites_irq::toSpritePtr2 + // [104] phi from sprites_irq::@3 to sprites_irq::toSpritePtr1 [phi:sprites_irq::@3->sprites_irq::toSpritePtr1] + // sprites_irq::toSpritePtr1 // sprites_irq::@11 // irq_sprite_ptr = toSpritePtr(PLAYFIELD_SPRITES) - // [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1 - lda #toSpritePtr2_return + // [105] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 -- vbuz1=vbuc1 + lda #toSpritePtr1_return sta.z irq_sprite_ptr jmp __b5 // sprites_irq::@1 diff --git a/src/test/ref/complex/tetris/test-sprites.sym b/src/test/ref/complex/tetris/test-sprites.sym index eeeb8a0d2..bb7276032 100644 --- a/src/test/ref/complex/tetris/test-sprites.sym +++ b/src/test/ref/complex/tetris/test-sprites.sym @@ -80,10 +80,10 @@ (byte) main::toD0181_return (const byte) main::toD0181_return#0 toD0181_return = >(word)(const nomodify byte*) PLAYFIELD_SCREEN_1&(word) $3fff*(byte) 4|>(word)(const nomodify byte*) PLAYFIELD_CHARSET/(byte) 4&(byte) $f (byte*) main::toD0181_screen -(label) main::toSpritePtr2 -(byte) main::toSpritePtr2_return -(const byte) main::toSpritePtr2_return#0 toSpritePtr2_return = (byte)(word)(const byte*) SIN_SPRITE/(byte) $40 -(byte*) main::toSpritePtr2_sprite +(label) main::toSpritePtr1 +(byte) main::toSpritePtr1_return +(const byte) main::toSpritePtr1_return#0 toSpritePtr1_return = (byte)(word)(const byte*) SIN_SPRITE/(byte) $40 +(byte*) main::toSpritePtr1_sprite (label) main::vicSelectGfxBank1 (label) main::vicSelectGfxBank1_@1 (byte*) main::vicSelectGfxBank1_gfx @@ -133,10 +133,10 @@ interrupt(HARDWARE_CLOBBER)(void()) sprites_irq() (byte) sprites_irq::ptr#3 reg byte a 2.6666666666666665 (byte) sprites_irq::ptr#4 reg byte a 4.0 (volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore zp[1]:10 6.5 -(label) sprites_irq::toSpritePtr2 -(byte) sprites_irq::toSpritePtr2_return -(const byte) sprites_irq::toSpritePtr2_return#0 toSpritePtr2_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 -(byte*) sprites_irq::toSpritePtr2_sprite +(label) sprites_irq::toSpritePtr1 +(byte) sprites_irq::toSpritePtr1_return +(const byte) sprites_irq::toSpritePtr1_return#0 toSpritePtr1_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 +(byte*) sprites_irq::toSpritePtr1_sprite (byte) sprites_irq::ypos (byte) sprites_irq::ypos#0 reg byte a 2.5 (void()) sprites_irq_init() diff --git a/src/test/ref/complex/tetris/tetris.asm b/src/test/ref/complex/tetris/tetris.asm index a55575fd9..4ac575958 100644 --- a/src/test/ref/complex/tetris/tetris.asm +++ b/src/test/ref/complex/tetris/tetris.asm @@ -1907,7 +1907,7 @@ sid_rnd_init: { // Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST // Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers sprites_irq: { - .const toSpritePtr2_return = PLAYFIELD_SPRITES/$40 + .const toSpritePtr1_return = PLAYFIELD_SPRITES/$40 .label raster_sprite_gfx_modify = $3d sta rega+1 stx regx+1 @@ -2020,7 +2020,7 @@ sprites_irq: { lda #SPRITES_FIRST_YPOS sta.z irq_sprite_ypos // irq_sprite_ptr = toSpritePtr(PLAYFIELD_SPRITES) - lda #toSpritePtr2_return + lda #toSpritePtr1_return sta.z irq_sprite_ptr jmp __b5 __b1: diff --git a/src/test/ref/complex/tetris/tetris.cfg b/src/test/ref/complex/tetris/tetris.cfg index 5ed819dbe..b109cb4c1 100644 --- a/src/test/ref/complex/tetris/tetris.cfg +++ b/src/test/ref/complex/tetris/tetris.cfg @@ -1244,12 +1244,12 @@ sprites_irq::@4: scope:[sprites_irq] from sprites_irq::@6 sprites_irq::@3: scope:[sprites_irq] from sprites_irq::@2 [579] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15 [580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS - to:sprites_irq::toSpritePtr2 -sprites_irq::toSpritePtr2: scope:[sprites_irq] from sprites_irq::@3 + to:sprites_irq::toSpritePtr1 +sprites_irq::toSpritePtr1: scope:[sprites_irq] from sprites_irq::@3 [581] phi() to:sprites_irq::@11 -sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr2 - [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 +sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr1 + [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 to:sprites_irq::@5 sprites_irq::@1: scope:[sprites_irq] from sprites_irq::@9 [583] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1) ← (byte) sprites_irq::ptr#0 diff --git a/src/test/ref/complex/tetris/tetris.log b/src/test/ref/complex/tetris/tetris.log index acbbbe285..f15200920 100644 --- a/src/test/ref/complex/tetris/tetris.log +++ b/src/test/ref/complex/tetris/tetris.log @@ -84,7 +84,7 @@ Culled Empty Block (label) sprites_init::@2 Culled Empty Block (label) toSpritePtr1_@1 Culled Empty Block (label) @24 Culled Empty Block (label) sprites_irq::@14 -Culled Empty Block (label) sprites_irq::toSpritePtr2_@1 +Culled Empty Block (label) sprites_irq::toSpritePtr1_@1 Culled Empty Block (label) sprites_irq::@5 Culled Empty Block (label) sprites_irq::@9 Culled Empty Block (label) sprites_irq::@10 @@ -1255,22 +1255,22 @@ sprites_irq::@2: scope:[sprites_irq] from sprites_irq::@1 sprites_irq::@13 sprites_irq::@3: scope:[sprites_irq] from sprites_irq::@2 (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (number) $15 (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS - (byte*) sprites_irq::toSpritePtr2_sprite#0 ← (const nomodify byte*) PLAYFIELD_SPRITES - to:sprites_irq::toSpritePtr2 -sprites_irq::toSpritePtr2: scope:[sprites_irq] from sprites_irq::@3 - (byte*) sprites_irq::toSpritePtr2_sprite#1 ← phi( sprites_irq::@3/(byte*) sprites_irq::toSpritePtr2_sprite#0 ) - (word~) sprites_irq::toSpritePtr2_$0 ← ((word)) (byte*) sprites_irq::toSpritePtr2_sprite#1 - (number~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (number) $40 - (byte~) sprites_irq::toSpritePtr2_$2 ← ((byte)) (number~) sprites_irq::toSpritePtr2_$1 - (byte) sprites_irq::toSpritePtr2_return#0 ← (byte~) sprites_irq::toSpritePtr2_$2 - to:sprites_irq::toSpritePtr2_@return -sprites_irq::toSpritePtr2_@return: scope:[sprites_irq] from sprites_irq::toSpritePtr2 - (byte) sprites_irq::toSpritePtr2_return#2 ← phi( sprites_irq::toSpritePtr2/(byte) sprites_irq::toSpritePtr2_return#0 ) - (byte) sprites_irq::toSpritePtr2_return#1 ← (byte) sprites_irq::toSpritePtr2_return#2 + (byte*) sprites_irq::toSpritePtr1_sprite#0 ← (const nomodify byte*) PLAYFIELD_SPRITES + to:sprites_irq::toSpritePtr1 +sprites_irq::toSpritePtr1: scope:[sprites_irq] from sprites_irq::@3 + (byte*) sprites_irq::toSpritePtr1_sprite#1 ← phi( sprites_irq::@3/(byte*) sprites_irq::toSpritePtr1_sprite#0 ) + (word~) sprites_irq::toSpritePtr1_$0 ← ((word)) (byte*) sprites_irq::toSpritePtr1_sprite#1 + (number~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (number) $40 + (byte~) sprites_irq::toSpritePtr1_$2 ← ((byte)) (number~) sprites_irq::toSpritePtr1_$1 + (byte) sprites_irq::toSpritePtr1_return#0 ← (byte~) sprites_irq::toSpritePtr1_$2 + to:sprites_irq::toSpritePtr1_@return +sprites_irq::toSpritePtr1_@return: scope:[sprites_irq] from sprites_irq::toSpritePtr1 + (byte) sprites_irq::toSpritePtr1_return#2 ← phi( sprites_irq::toSpritePtr1/(byte) sprites_irq::toSpritePtr1_return#0 ) + (byte) sprites_irq::toSpritePtr1_return#1 ← (byte) sprites_irq::toSpritePtr1_return#2 to:sprites_irq::@15 -sprites_irq::@15: scope:[sprites_irq] from sprites_irq::toSpritePtr2_@return - (byte) sprites_irq::toSpritePtr2_return#3 ← phi( sprites_irq::toSpritePtr2_@return/(byte) sprites_irq::toSpritePtr2_return#1 ) - (byte~) sprites_irq::$5 ← (byte) sprites_irq::toSpritePtr2_return#3 +sprites_irq::@15: scope:[sprites_irq] from sprites_irq::toSpritePtr1_@return + (byte) sprites_irq::toSpritePtr1_return#3 ← phi( sprites_irq::toSpritePtr1_@return/(byte) sprites_irq::toSpritePtr1_return#1 ) + (byte~) sprites_irq::$5 ← (byte) sprites_irq::toSpritePtr1_return#3 (volatile byte) irq_sprite_ptr ← (byte~) sprites_irq::$5 to:sprites_irq::@6 sprites_irq::@7: scope:[sprites_irq] from sprites_irq::@2 @@ -6209,19 +6209,19 @@ interrupt(HARDWARE_CLOBBER)(void()) sprites_irq() (byte) sprites_irq::ptr#5 (byte) sprites_irq::ptr#6 (volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore -(label) sprites_irq::toSpritePtr2 -(word~) sprites_irq::toSpritePtr2_$0 -(number~) sprites_irq::toSpritePtr2_$1 -(byte~) sprites_irq::toSpritePtr2_$2 -(label) sprites_irq::toSpritePtr2_@return -(byte) sprites_irq::toSpritePtr2_return -(byte) sprites_irq::toSpritePtr2_return#0 -(byte) sprites_irq::toSpritePtr2_return#1 -(byte) sprites_irq::toSpritePtr2_return#2 -(byte) sprites_irq::toSpritePtr2_return#3 -(byte*) sprites_irq::toSpritePtr2_sprite -(byte*) sprites_irq::toSpritePtr2_sprite#0 -(byte*) sprites_irq::toSpritePtr2_sprite#1 +(label) sprites_irq::toSpritePtr1 +(word~) sprites_irq::toSpritePtr1_$0 +(number~) sprites_irq::toSpritePtr1_$1 +(byte~) sprites_irq::toSpritePtr1_$2 +(label) sprites_irq::toSpritePtr1_@return +(byte) sprites_irq::toSpritePtr1_return +(byte) sprites_irq::toSpritePtr1_return#0 +(byte) sprites_irq::toSpritePtr1_return#1 +(byte) sprites_irq::toSpritePtr1_return#2 +(byte) sprites_irq::toSpritePtr1_return#3 +(byte*) sprites_irq::toSpritePtr1_sprite +(byte*) sprites_irq::toSpritePtr1_sprite#0 +(byte*) sprites_irq::toSpritePtr1_sprite#1 (byte) sprites_irq::ypos (byte) sprites_irq::ypos#0 (void()) sprites_irq_init() @@ -6366,8 +6366,8 @@ Adding number conversion cast (unumber) 2 in *((const nomodify byte*) PLAYFIELD_ Adding number conversion cast (unumber) 3 in *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_2 + (number) 3) ← (byte) sprites_irq::ptr#4 Adding number conversion cast (unumber) 9 in (bool~) sprites_irq::$2 ← (volatile byte) irq_cnt == (number) 9 Adding number conversion cast (unumber) $15 in (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (number) $15 -Adding number conversion cast (unumber) $40 in (number~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (number) $40 -Adding number conversion cast (unumber) sprites_irq::toSpritePtr2_$1 in (number~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (unumber)(number) $40 +Adding number conversion cast (unumber) $40 in (number~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (number) $40 +Adding number conversion cast (unumber) sprites_irq::toSpritePtr1_$1 in (number~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (unumber)(number) $40 Adding number conversion cast (unumber) $a in (bool~) sprites_irq::$3 ← (volatile byte) irq_cnt == (number) $a Adding number conversion cast (unumber) 0 in (volatile byte) irq_cnt ← (number) 0 Adding number conversion cast (unumber) $15 in (volatile byte) irq_sprite_ypos ← (volatile byte) irq_sprite_ypos + (number) $15 @@ -6461,8 +6461,8 @@ Inlining cast *((const nomodify byte*) SPRITES_ENABLE) ← (unumber)(number) $f Inlining cast *((const nomodify byte*) SPRITES_MC) ← (unumber)(number) 0 Inlining cast (word~) toSpritePtr1_$0 ← (word)(byte*) toSpritePtr1_sprite#1 Inlining cast (byte~) toSpritePtr1_$2 ← (byte)(unumber~) toSpritePtr1_$1 -Inlining cast (word~) sprites_irq::toSpritePtr2_$0 ← (word)(byte*) sprites_irq::toSpritePtr2_sprite#1 -Inlining cast (byte~) sprites_irq::toSpritePtr2_$2 ← (byte)(unumber~) sprites_irq::toSpritePtr2_$1 +Inlining cast (word~) sprites_irq::toSpritePtr1_$0 ← (word)(byte*) sprites_irq::toSpritePtr1_sprite#1 +Inlining cast (byte~) sprites_irq::toSpritePtr1_$2 ← (byte)(unumber~) sprites_irq::toSpritePtr1_$1 Inlining cast (volatile byte) irq_cnt ← (unumber)(number) 0 Inlining cast (byte) play_move_down::return#1 ← (unumber)(number) 0 Inlining cast (byte) current_movedown_counter#4 ← (unumber)(number) 0 @@ -6847,7 +6847,7 @@ Inferred type updated to byte in (unumber~) sprites_init::$1 ← (byte) sprites_ Inferred type updated to word in (unumber~) toSpritePtr1_$1 ← (word~) toSpritePtr1_$0 / (byte) $40 Inferred type updated to byte in (unumber~) $1 ← (byte~) $0 + (byte) 3 Inferred type updated to byte in (unumber~) sprites_irq::$0 ← (volatile byte) irq_raster_next + (byte) 1 -Inferred type updated to word in (unumber~) sprites_irq::toSpritePtr2_$1 ← (word~) sprites_irq::toSpritePtr2_$0 / (byte) $40 +Inferred type updated to word in (unumber~) sprites_irq::toSpritePtr1_$1 ← (word~) sprites_irq::toSpritePtr1_$0 / (byte) $40 Inferred type updated to byte in (unumber~) play_move_down::$11 ← (byte) current_ypos#16 + (byte) 1 Inferred type updated to byte in (unumber~) play_move_leftright::$7 ← (byte) current_xpos#23 - (byte) 1 Inferred type updated to byte in (unumber~) play_move_leftright::$3 ← (byte) current_xpos#24 + (byte) 1 @@ -6893,7 +6893,7 @@ Inversing boolean not [1027] (bool~) play_increase_level::$3 ← (byte~) play_in Inversing boolean not [1135] (bool~) main::$18 ← (byte) main::render#2 == (byte) 0 from [1134] (bool~) main::$17 ← (byte) main::render#2 != (byte) 0 Successful SSA optimization Pass2UnaryNotSimplification Alias candidate removed (volatile)render_screen_show#11 = render_screen_showing -Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#2 sprites_irq::toSpritePtr2_return#1 sprites_irq::toSpritePtr2_return#3 sprites_irq::$5 +Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#2 sprites_irq::toSpritePtr1_return#1 sprites_irq::toSpritePtr1_return#3 sprites_irq::$5 Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0 Alias keyboard_matrix_read::return#0 = keyboard_matrix_read::row_pressed_bits#0 keyboard_matrix_read::$0 keyboard_matrix_read::return#3 keyboard_matrix_read::return#1 Alias keyboard_matrix_read::return#2 = keyboard_matrix_read::return#4 @@ -7014,7 +7014,7 @@ Alias sprites_init::xpos#1 = sprites_init::$1 Alias toSpritePtr1_sprite#0 = toSpritePtr1_sprite#1 Alias toSpritePtr1_return#0 = toSpritePtr1_$2 toSpritePtr1_return#2 toSpritePtr1_return#1 toSpritePtr1_return#3 $0 Alias sprites_irq::ptr#0 = sprites_irq::ptr#5 sprites_irq::ptr#6 -Alias sprites_irq::toSpritePtr2_sprite#0 = sprites_irq::toSpritePtr2_sprite#1 +Alias sprites_irq::toSpritePtr1_sprite#0 = sprites_irq::toSpritePtr1_sprite#1 Alias level#13 = level#28 Alias current_movedown_slow#16 = current_movedown_slow#29 current_movedown_slow#2 Alias play_move_down::return#0 = play_move_down::return#4 @@ -7408,7 +7408,7 @@ Alias level#11 = level#25 Alias level_bcd#12 = level_bcd#25 Successful SSA optimization Pass2AliasElimination Alias candidate removed (volatile)render_screen_show#10 = render_screen_show#11 render_screen_showing -Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#2 sprites_irq::toSpritePtr2_return#1 sprites_irq::toSpritePtr2_return#3 sprites_irq::$5 +Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#2 sprites_irq::toSpritePtr1_return#1 sprites_irq::toSpritePtr1_return#3 sprites_irq::$5 Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0 Alias keyboard_event_scan::keycode#10 = keyboard_event_scan::keycode#4 Alias keyboard_event_scan::col#2 = keyboard_event_scan::col#3 @@ -7498,7 +7498,7 @@ Alias level#21 = level#77 level#65 Alias current_movedown_slow#65 = current_movedown_slow#72 Successful SSA optimization Pass2AliasElimination Alias candidate removed (volatile)render_screen_show#10 = render_screen_show#11 render_screen_showing -Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#2 sprites_irq::toSpritePtr2_return#1 sprites_irq::toSpritePtr2_return#3 sprites_irq::$5 +Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#2 sprites_irq::toSpritePtr1_return#1 sprites_irq::toSpritePtr1_return#3 sprites_irq::$5 Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0 Identical Phi Values (byte) keyboard_matrix_read::rowid#1 (byte) keyboard_matrix_read::rowid#0 Identical Phi Values (byte) keyboard_events_size#53 (byte) keyboard_events_size#26 @@ -7531,8 +7531,8 @@ Identical Phi Values (byte) render_screen_render#41 (byte) render_screen_render# Identical Phi Values (byte) current_xpos#78 (byte) current_xpos#16 Identical Phi Values (byte) render_next::next_piece_char#1 (byte) render_next::next_piece_char#3 Identical Phi Values (byte) render_next::l#2 (byte) render_next::l#7 -Identical Phi Values (byte) sprites_irq::toSpritePtr2_return#2 (byte) sprites_irq::toSpritePtr2_return#0 -Identical Phi Values (byte) sprites_irq::toSpritePtr2_return#3 (byte) sprites_irq::toSpritePtr2_return#1 +Identical Phi Values (byte) sprites_irq::toSpritePtr1_return#2 (byte) sprites_irq::toSpritePtr1_return#0 +Identical Phi Values (byte) sprites_irq::toSpritePtr1_return#3 (byte) sprites_irq::toSpritePtr1_return#1 Identical Phi Values (byte) level#44 (byte) level#100 Identical Phi Values (byte) level#13 (byte) level#44 Identical Phi Values (byte) current_movedown_slow#16 (byte) current_movedown_slow#1 @@ -7924,7 +7924,7 @@ Constant (const byte) render_next::c#0 = 0 Constant (const byte) sprites_init::xpos#0 = (byte)$18+$f*8 Constant (const byte) sprites_init::s#0 = 0 Constant (const byte*) toSpritePtr1_sprite#0 = PLAYFIELD_SPRITES -Constant (const byte*) sprites_irq::toSpritePtr2_sprite#0 = PLAYFIELD_SPRITES +Constant (const byte*) sprites_irq::toSpritePtr1_sprite#0 = PLAYFIELD_SPRITES Constant (const byte) next_piece_idx#0 = 0 Constant (const byte*) current_piece#0 = (byte*) 0 Constant (const byte) current_orientation#0 = 0 @@ -7978,7 +7978,7 @@ Constant (const word) render_show::toD0181_$4 = (word)render_show::toD0181_gfx#0 Constant (const word) render_show::toD0182_$0 = (word)render_show::toD0182_screen#0 Constant (const word) render_show::toD0182_$4 = (word)render_show::toD0182_gfx#0 Constant (const word) toSpritePtr1_$0 = (word)toSpritePtr1_sprite#0 -Constant (const word) sprites_irq::toSpritePtr2_$0 = (word)sprites_irq::toSpritePtr2_sprite#0 +Constant (const word) sprites_irq::toSpritePtr1_$0 = (word)sprites_irq::toSpritePtr1_sprite#0 Constant (const byte) play_collision::orientation#4 = current_orientation#68 Successful SSA optimization Pass2ConstantIdentification if() condition always true - replacing block destination [762] if(true) goto main::@4 @@ -8184,14 +8184,14 @@ Finalized unsigned number type (byte) 1 Finalized unsigned number type (byte) 1 Finalized unsigned number type (byte) 5 Successful SSA optimization PassNFinalizeNumberTypeConversions -Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#1 sprites_irq::$5 +Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#1 sprites_irq::$5 Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0 Alias render_init::$5 = render_init::$4 Alias play_movement::render#1 = play_movement::$0 Alias current_piece_gfx#74 = current_piece#5 Alias main::render#1 = main::render#2 Successful SSA optimization Pass2AliasElimination -Alias candidate removed (volatile)sprites_irq::toSpritePtr2_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr2_$2 sprites_irq::toSpritePtr2_return#1 sprites_irq::$5 +Alias candidate removed (volatile)sprites_irq::toSpritePtr1_return#0 = irq_sprite_ptr $1 sprites_irq::toSpritePtr1_$2 sprites_irq::toSpritePtr1_return#1 sprites_irq::$5 Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0 Identical Phi Values (byte) current_movedown_slow#55 (byte) current_movedown_slow#21 Identical Phi Values (byte*) current_piece#50 (byte*) current_piece#15 @@ -8213,7 +8213,7 @@ Constant right-side identified [90] (byte~) render_show::toD0181_$5 ← > (const Constant right-side identified [94] (word~) render_show::toD0182_$1 ← (const word) render_show::toD0182_$0 & (word) $3fff Constant right-side identified [97] (byte~) render_show::toD0182_$5 ← > (const word) render_show::toD0182_$4 Constant right-side identified [242] (word~) toSpritePtr1_$1 ← (const word) toSpritePtr1_$0 / (byte) $40 -Constant right-side identified [286] (word~) sprites_irq::toSpritePtr2_$1 ← (const word) sprites_irq::toSpritePtr2_$0 / (byte) $40 +Constant right-side identified [286] (word~) sprites_irq::toSpritePtr1_$1 ← (const word) sprites_irq::toSpritePtr1_$0 / (byte) $40 Constant right-side identified [343] (byte) play_move_down::movedown#1 ← ++ (const byte) play_move_down::movedown#0 Successful SSA optimization Pass2ConstantRValueConsolidation Constant (const byte) render_init::vicSelectGfxBank1_toDd001_$1 = >render_init::vicSelectGfxBank1_toDd001_$0 @@ -8222,17 +8222,17 @@ Constant (const byte) render_show::toD0181_$5 = >render_show::toD0181_$4 Constant (const word) render_show::toD0182_$1 = render_show::toD0182_$0&$3fff Constant (const byte) render_show::toD0182_$5 = >render_show::toD0182_$4 Constant (const word) toSpritePtr1_$1 = toSpritePtr1_$0/$40 -Constant (const word) sprites_irq::toSpritePtr2_$1 = sprites_irq::toSpritePtr2_$0/$40 +Constant (const word) sprites_irq::toSpritePtr1_$1 = sprites_irq::toSpritePtr1_$0/$40 Constant (const byte) play_move_down::movedown#1 = ++play_move_down::movedown#0 Successful SSA optimization Pass2ConstantIdentification Constant (const byte) toSpritePtr1_return#0 = (byte)toSpritePtr1_$1 -Constant (const byte) sprites_irq::toSpritePtr2_$2 = (byte)sprites_irq::toSpritePtr2_$1 +Constant (const byte) sprites_irq::toSpritePtr1_$2 = (byte)sprites_irq::toSpritePtr1_$1 Successful SSA optimization Pass2ConstantIdentification -Constant (const byte) sprites_irq::toSpritePtr2_return#0 = sprites_irq::toSpritePtr2_$2 +Constant (const byte) sprites_irq::toSpritePtr1_return#0 = sprites_irq::toSpritePtr1_$2 Successful SSA optimization Pass2ConstantIdentification -Constant (const byte) sprites_irq::toSpritePtr2_return#1 = sprites_irq::toSpritePtr2_return#0 +Constant (const byte) sprites_irq::toSpritePtr1_return#1 = sprites_irq::toSpritePtr1_return#0 Successful SSA optimization Pass2ConstantIdentification -Constant (const byte) sprites_irq::$5 = sprites_irq::toSpritePtr2_return#1 +Constant (const byte) sprites_irq::$5 = sprites_irq::toSpritePtr1_return#1 Successful SSA optimization Pass2ConstantIdentification Alias candidate removed (volatile)irq_sprite_ptr = $1 Alias candidate removed (volatile)sprites_irq::raster_sprite_gfx_modify = sprites_irq::$0 @@ -8342,7 +8342,7 @@ Inlining constant with var siblings (const byte) render_next::l#0 Inlining constant with var siblings (const byte) render_next::c#0 Inlining constant with var siblings (const byte) sprites_init::xpos#0 Inlining constant with var siblings (const byte) sprites_init::s#0 -Inlining constant with different constant siblings (const byte) sprites_irq::toSpritePtr2_return#1 +Inlining constant with different constant siblings (const byte) sprites_irq::toSpritePtr1_return#1 Inlining constant with var siblings (const byte) play_init::idx#0 Inlining constant with var siblings (const byte*) play_init::pli#0 Inlining constant with var siblings (const byte) play_init::j#0 @@ -8397,12 +8397,10 @@ Constant inlined render_show::toD0182_$0 = (word)(const nomodify byte*) PLAYFIEL Constant inlined play_move_rotate::return#1 = (byte) 0 Constant inlined render_show::toD0182_$1 = (word)(const nomodify byte*) PLAYFIELD_SCREEN_2&(word) $3fff Constant inlined play_move_rotate::return#4 = (byte) 1 +Constant inlined sprites_irq::toSpritePtr1_sprite#0 = (const nomodify byte*) PLAYFIELD_SPRITES Constant inlined render_show::toD0182_$2 = (word)(const nomodify byte*) PLAYFIELD_SCREEN_2&(word) $3fff*(byte) 4 Constant inlined play_move_rotate::return#3 = (byte) 0 -Constant inlined sprites_irq::toSpritePtr2_$2 = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 -Constant inlined sprites_irq::toSpritePtr2_$1 = (word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 Constant inlined current_movedown_counter#0 = (byte) 0 -Constant inlined sprites_irq::toSpritePtr2_$0 = (word)(const nomodify byte*) PLAYFIELD_SPRITES Constant inlined current_movedown_counter#4 = (byte) 0 Constant inlined render_screen_original::screen#1 = (const nomodify byte*) PLAYFIELD_SCREEN_2 Constant inlined render_screen_original::screen#0 = (const nomodify byte*) PLAYFIELD_SCREEN_1 @@ -8429,7 +8427,7 @@ Constant inlined render_next::screen_next_area#1 = (const nomodify byte*) PLAYFI Constant inlined render_next::screen_next_area#2 = (const nomodify byte*) PLAYFIELD_SCREEN_2+(const word) render_next::next_area_offset Constant inlined keyboard_event_scan::col#0 = (byte) 0 Constant inlined lines_bcd#0 = (word) 0 -Constant inlined sprites_irq::$5 = (const byte) sprites_irq::toSpritePtr2_return#0 +Constant inlined sprites_irq::$5 = (const byte) sprites_irq::toSpritePtr1_return#0 Constant inlined render_show::toD0181_screen#0 = (const nomodify byte*) PLAYFIELD_SCREEN_1 Constant inlined render_playfield::l#0 = (byte) 2 Constant inlined render_moving::c#0 = (byte) 0 @@ -8469,14 +8467,18 @@ Constant inlined play_spawn_current::piece_idx#0 = (byte) 7 Constant inlined play_remove_lines::removed#0 = (byte) 0 Constant inlined play_remove_lines::full#1 = (byte) 0 Constant inlined play_remove_lines::full#0 = (byte) 1 +Constant inlined sprites_irq::toSpritePtr1_return#1 = (const byte) sprites_irq::toSpritePtr1_return#0 Constant inlined sprites_init::s#0 = (byte) 0 Constant inlined render_moving::l#0 = (byte) 0 Constant inlined play_move_leftright::return#1 = (byte) 1 Constant inlined play_move_leftright::return#4 = (byte) 1 Constant inlined play_move_leftright::return#3 = (byte) 0 Constant inlined next_piece_idx#0 = (byte) 0 +Constant inlined sprites_irq::toSpritePtr1_$2 = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 Constant inlined render_show::toD0181_$1 = (word)(const nomodify byte*) PLAYFIELD_SCREEN_1&(word) $3fff Constant inlined render_show::toD0181_$0 = (word)(const nomodify byte*) PLAYFIELD_SCREEN_1 +Constant inlined sprites_irq::toSpritePtr1_$1 = (word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 +Constant inlined sprites_irq::toSpritePtr1_$0 = (word)(const nomodify byte*) PLAYFIELD_SPRITES Constant inlined keyboard_event_scan::keycode#0 = (byte) 0 Constant inlined play_collision::c#0 = (byte) 0 Constant inlined render_show::toD0181_$7 = >(word)(const nomodify byte*) PLAYFIELD_CHARSET/(byte) 4&(byte) $f @@ -8492,7 +8494,6 @@ Constant inlined play_remove_lines::w#0 = (const nomodify byte) PLAYFIELD_LINES* Constant inlined play_init::j#0 = (byte) 0 Constant inlined render_screen_original::ocols#0 = (const to_nomodify byte*) PLAYFIELD_COLORS_ORIGINAL+(byte)(number) $20*(number) 2 Constant inlined play_lock_current::c#0 = (byte) 0 -Constant inlined sprites_irq::toSpritePtr2_return#1 = (const byte) sprites_irq::toSpritePtr2_return#0 Constant inlined keyboard_event_scan::row#0 = (byte) 0 Constant inlined play_init::b#0 = (byte) 0 Constant inlined render_next::c#0 = (byte) 0 @@ -8509,7 +8510,6 @@ Constant inlined render_score::screen#1 = (const nomodify byte*) PLAYFIELD_SCREE Constant inlined play_increase_level::b#0 = (byte) 0 Constant inlined render_screen_show#1 = (byte) 0 Constant inlined render_score::screen#2 = (const nomodify byte*) PLAYFIELD_SCREEN_2 -Constant inlined sprites_irq::toSpritePtr2_sprite#0 = (const nomodify byte*) PLAYFIELD_SPRITES Constant inlined play_collision::l#0 = (byte) 0 Constant inlined keyboard_event_get::return#0 = (byte) $ff Constant inlined render_init::li_1#0 = (const nomodify byte*) PLAYFIELD_SCREEN_1+(byte)(number) 2*(number) $28+(byte) $10 @@ -8639,8 +8639,8 @@ Adding NOP phi() at start of render_init::vicSelectGfxBank1_toDd001_@return Adding NOP phi() at start of render_init::@4 Adding NOP phi() at start of render_init::@5 Adding NOP phi() at start of render_init::@2 -Adding NOP phi() at start of sprites_irq::toSpritePtr2 -Adding NOP phi() at start of sprites_irq::toSpritePtr2_@return +Adding NOP phi() at start of sprites_irq::toSpritePtr1 +Adding NOP phi() at start of sprites_irq::toSpritePtr1_@return CALL GRAPH Calls in [] to main:14 Calls in [main] to sid_rnd_init:18 render_init:20 sprites_init:22 sprites_irq_init:24 play_init:26 play_spawn_current:28 play_spawn_current:31 render_playfield:33 render_moving:38 render_next:40 render_show:52 keyboard_event_scan:54 keyboard_event_get:56 play_movement:63 render_playfield:68 render_moving:74 render_next:77 render_score:79 render_screen_swap:81 @@ -9020,7 +9020,7 @@ Culled Empty Block (label) render_screen_original::@9 Culled Empty Block (label) render_screen_original::@14 Culled Empty Block (label) render_screen_original::@12 Culled Empty Block (label) render_screen_original::@10 -Culled Empty Block (label) sprites_irq::toSpritePtr2_@return +Culled Empty Block (label) sprites_irq::toSpritePtr1_@return Renumbering block @13 to @1 Renumbering block @22 to @2 Renumbering block @23 to @3 @@ -9188,7 +9188,7 @@ Adding NOP phi() at start of play_init Adding NOP phi() at start of render_init Adding NOP phi() at start of render_init::vicSelectGfxBank1_toDd001 Adding NOP phi() at start of render_init::@3 -Adding NOP phi() at start of sprites_irq::toSpritePtr2 +Adding NOP phi() at start of sprites_irq::toSpritePtr1 FINAL CONTROL FLOW GRAPH @begin: scope:[] from @@ -10437,12 +10437,12 @@ sprites_irq::@4: scope:[sprites_irq] from sprites_irq::@6 sprites_irq::@3: scope:[sprites_irq] from sprites_irq::@2 [579] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15 [580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS - to:sprites_irq::toSpritePtr2 -sprites_irq::toSpritePtr2: scope:[sprites_irq] from sprites_irq::@3 + to:sprites_irq::toSpritePtr1 +sprites_irq::toSpritePtr1: scope:[sprites_irq] from sprites_irq::@3 [581] phi() to:sprites_irq::@11 -sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr2 - [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 +sprites_irq::@11: scope:[sprites_irq] from sprites_irq::toSpritePtr1 + [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 to:sprites_irq::@5 sprites_irq::@1: scope:[sprites_irq] from sprites_irq::@9 [583] *((const nomodify byte*) PLAYFIELD_SPRITE_PTRS_1) ← (byte) sprites_irq::ptr#0 @@ -11022,8 +11022,8 @@ interrupt(HARDWARE_CLOBBER)(void()) sprites_irq() (byte) sprites_irq::ptr#3 2.6666666666666665 (byte) sprites_irq::ptr#4 4.0 (volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore 6.5 -(byte) sprites_irq::toSpritePtr2_return -(byte*) sprites_irq::toSpritePtr2_sprite +(byte) sprites_irq::toSpritePtr1_return +(byte*) sprites_irq::toSpritePtr1_sprite (byte) sprites_irq::ypos (byte) sprites_irq::ypos#0 2.5 (void()) sprites_irq_init() @@ -15295,7 +15295,7 @@ sid_rnd_init: { // Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST // Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers sprites_irq: { - .const toSpritePtr2_return = PLAYFIELD_SPRITES/$40 + .const toSpritePtr1_return = PLAYFIELD_SPRITES/$40 .label __0 = $d9 .label raster_sprite_gfx_modify = $da .label ypos = $d8 @@ -15455,16 +15455,16 @@ sprites_irq: { // [580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS -- vbuz1=vbuc1 lda #SPRITES_FIRST_YPOS sta.z irq_sprite_ypos - // [581] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2] - toSpritePtr2_from___b3: - jmp toSpritePtr2 - // sprites_irq::toSpritePtr2 - toSpritePtr2: + // [581] phi from sprites_irq::@3 to sprites_irq::toSpritePtr1 [phi:sprites_irq::@3->sprites_irq::toSpritePtr1] + toSpritePtr1_from___b3: + jmp toSpritePtr1 + // sprites_irq::toSpritePtr1 + toSpritePtr1: jmp __b11 // sprites_irq::@11 __b11: - // [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1 - lda #toSpritePtr2_return + // [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 -- vbuz1=vbuc1 + lda #toSpritePtr1_return sta.z irq_sprite_ptr jmp __b5 // sprites_irq::@1 @@ -15859,7 +15859,7 @@ Statement [577] (volatile byte) irq_sprite_ypos ← (volatile byte) irq_sprite_y Statement [578] (volatile byte) irq_sprite_ptr ← (volatile byte) irq_sprite_ptr + (byte) 3 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x Statement [579] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x Statement [580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a -Statement [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a +Statement [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a Statement [1] (volatile byte) render_screen_showing ← (byte) 0 [ ] ( [ ] { } ) always clobbers reg byte a Statement [2] (volatile dword) score_bcd ← (dword) 0 [ score_bcd ] ( [ score_bcd ] { } ) always clobbers reg byte a Statement [5] (volatile byte) irq_raster_next ← (const nomodify byte) IRQ_RASTER_FIRST [ score_bcd ] ( [ score_bcd ] { } ) always clobbers reg byte a @@ -16034,7 +16034,7 @@ Statement [577] (volatile byte) irq_sprite_ypos ← (volatile byte) irq_sprite_y Statement [578] (volatile byte) irq_sprite_ptr ← (volatile byte) irq_sprite_ptr + (byte) 3 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x Statement [579] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x Statement [580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a -Statement [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a +Statement [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a Statement [1] (volatile byte) render_screen_showing ← (byte) 0 [ ] ( [ ] { } ) always clobbers reg byte a Statement [2] (volatile dword) score_bcd ← (dword) 0 [ score_bcd ] ( [ score_bcd ] { } ) always clobbers reg byte a Statement [5] (volatile byte) irq_raster_next ← (const nomodify byte) IRQ_RASTER_FIRST [ score_bcd ] ( [ score_bcd ] { } ) always clobbers reg byte a @@ -16205,7 +16205,7 @@ Statement [577] (volatile byte) irq_sprite_ypos ← (volatile byte) irq_sprite_y Statement [578] (volatile byte) irq_sprite_ptr ← (volatile byte) irq_sprite_ptr + (byte) 3 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x Statement [579] (volatile byte) irq_raster_next ← (volatile byte) irq_raster_next + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a reg byte x Statement [580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a -Statement [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a +Statement [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 [ irq_raster_next ] ( [ irq_raster_next ] { } ) always clobbers reg byte a Potential registers zp[1]:2 [ render_screen_show#16 render_screen_show#13 ] : zp[1]:2 , Potential registers zp[1]:3 [ render_screen_render#18 render_screen_render#11 ] : zp[1]:3 , Potential registers zp[1]:4 [ current_movedown_counter#16 current_movedown_counter#14 current_movedown_counter#12 ] : zp[1]:4 , @@ -20061,7 +20061,7 @@ sid_rnd_init: { // Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST // Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers sprites_irq: { - .const toSpritePtr2_return = PLAYFIELD_SPRITES/$40 + .const toSpritePtr1_return = PLAYFIELD_SPRITES/$40 .label raster_sprite_gfx_modify = $3d // entry interrupt(HARDWARE_CLOBBER) sta rega+1 @@ -20197,16 +20197,16 @@ sprites_irq: { // [580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS -- vbuz1=vbuc1 lda #SPRITES_FIRST_YPOS sta.z irq_sprite_ypos - // [581] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2] - toSpritePtr2_from___b3: - jmp toSpritePtr2 - // sprites_irq::toSpritePtr2 - toSpritePtr2: + // [581] phi from sprites_irq::@3 to sprites_irq::toSpritePtr1 [phi:sprites_irq::@3->sprites_irq::toSpritePtr1] + toSpritePtr1_from___b3: + jmp toSpritePtr1 + // sprites_irq::toSpritePtr1 + toSpritePtr1: jmp __b11 // sprites_irq::@11 __b11: - // [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1 - lda #toSpritePtr2_return + // [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 -- vbuz1=vbuc1 + lda #toSpritePtr1_return sta.z irq_sprite_ptr jmp __b5 // sprites_irq::@1 @@ -20518,7 +20518,7 @@ Removing instruction jmp __b6 Removing instruction jmp __b7 Removing instruction jmp __b5 Removing instruction jmp __breturn -Removing instruction jmp toSpritePtr2 +Removing instruction jmp toSpritePtr1 Removing instruction jmp __b11 Succesful ASM optimization Pass5NextJumpElimination Removing instruction lda #<0 @@ -20720,8 +20720,8 @@ Removing instruction __b3_from___b3: Removing instruction __b4_from___b3: Removing instruction __b4_from___b4: Removing instruction __breturn: -Removing instruction toSpritePtr2_from___b3: -Removing instruction toSpritePtr2: +Removing instruction toSpritePtr1_from___b3: +Removing instruction toSpritePtr1: Succesful ASM optimization Pass5RedundantLabelElimination Removing instruction __b3: Removing instruction __b5: @@ -21866,10 +21866,10 @@ interrupt(HARDWARE_CLOBBER)(void()) sprites_irq() (byte) sprites_irq::ptr#3 reg byte a 2.6666666666666665 (byte) sprites_irq::ptr#4 reg byte a 4.0 (volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore zp[1]:61 6.5 -(label) sprites_irq::toSpritePtr2 -(byte) sprites_irq::toSpritePtr2_return -(const byte) sprites_irq::toSpritePtr2_return#0 toSpritePtr2_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 -(byte*) sprites_irq::toSpritePtr2_sprite +(label) sprites_irq::toSpritePtr1 +(byte) sprites_irq::toSpritePtr1_return +(const byte) sprites_irq::toSpritePtr1_return#0 toSpritePtr1_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 +(byte*) sprites_irq::toSpritePtr1_sprite (byte) sprites_irq::ypos (byte) sprites_irq::ypos#0 reg byte a 2.5 (void()) sprites_irq_init() @@ -25128,7 +25128,7 @@ sid_rnd_init: { // Repeats 10 timers every 2 lines from line IRQ_RASTER_FIRST // Utilizes duplicated gfx in the sprites to allow for some leeway in updating the sprite pointers sprites_irq: { - .const toSpritePtr2_return = PLAYFIELD_SPRITES/$40 + .const toSpritePtr1_return = PLAYFIELD_SPRITES/$40 .label raster_sprite_gfx_modify = $3d // entry interrupt(HARDWARE_CLOBBER) sta rega+1 @@ -25283,12 +25283,12 @@ sprites_irq: { // [580] (volatile byte) irq_sprite_ypos ← (const nomodify byte) SPRITES_FIRST_YPOS -- vbuz1=vbuc1 lda #SPRITES_FIRST_YPOS sta.z irq_sprite_ypos - // [581] phi from sprites_irq::@3 to sprites_irq::toSpritePtr2 [phi:sprites_irq::@3->sprites_irq::toSpritePtr2] - // sprites_irq::toSpritePtr2 + // [581] phi from sprites_irq::@3 to sprites_irq::toSpritePtr1 [phi:sprites_irq::@3->sprites_irq::toSpritePtr1] + // sprites_irq::toSpritePtr1 // sprites_irq::@11 // irq_sprite_ptr = toSpritePtr(PLAYFIELD_SPRITES) - // [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr2_return#0 -- vbuz1=vbuc1 - lda #toSpritePtr2_return + // [582] (volatile byte) irq_sprite_ptr ← (const byte) sprites_irq::toSpritePtr1_return#0 -- vbuz1=vbuc1 + lda #toSpritePtr1_return sta.z irq_sprite_ptr jmp __b5 // sprites_irq::@1 diff --git a/src/test/ref/complex/tetris/tetris.sym b/src/test/ref/complex/tetris/tetris.sym index 4a337d30f..775d83d98 100644 --- a/src/test/ref/complex/tetris/tetris.sym +++ b/src/test/ref/complex/tetris/tetris.sym @@ -901,10 +901,10 @@ interrupt(HARDWARE_CLOBBER)(void()) sprites_irq() (byte) sprites_irq::ptr#3 reg byte a 2.6666666666666665 (byte) sprites_irq::ptr#4 reg byte a 4.0 (volatile byte) sprites_irq::raster_sprite_gfx_modify loadstore zp[1]:61 6.5 -(label) sprites_irq::toSpritePtr2 -(byte) sprites_irq::toSpritePtr2_return -(const byte) sprites_irq::toSpritePtr2_return#0 toSpritePtr2_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 -(byte*) sprites_irq::toSpritePtr2_sprite +(label) sprites_irq::toSpritePtr1 +(byte) sprites_irq::toSpritePtr1_return +(const byte) sprites_irq::toSpritePtr1_return#0 toSpritePtr1_return = (byte)(word)(const nomodify byte*) PLAYFIELD_SPRITES/(byte) $40 +(byte*) sprites_irq::toSpritePtr1_sprite (byte) sprites_irq::ypos (byte) sprites_irq::ypos#0 reg byte a 2.5 (void()) sprites_irq_init()