1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-04-11 04:37:29 +00:00

Refactored live ranges to work for multiple-assign variables. The price is that a few unused variables are no longer optimized away since they depend only on them selves. See duplace-loop-problem.kc.

This commit is contained in:
jespergravgaard 2020-02-14 00:32:19 +01:00
parent a5d14105d8
commit 0beeab9be2
118 changed files with 4075 additions and 2115 deletions

View File

@ -79,6 +79,7 @@ public class VariableBuilder {
variable.setNoModify(this.isNoModify());
variable.setVolatile(this.isVolatile());
variable.setExport(this.isExport());
variable.setPermanent(this.isPermanent());
variable.setOptimize(this.isOptimize());
variable.setRegister(this.getRegister());
if(variable.getRegister() instanceof Registers.RegisterMainMem) {

View File

@ -68,6 +68,10 @@ public class Pass2NopCastInlining extends Pass2SsaOptimization {
}
if(isNopCast && assignment.getlValue() instanceof VariableRef) {
final Variable assignmentVar = getScope().getVariable((VariableRef) assignment.getlValue());
if(assignmentVar.isKindLoadStore())
continue;
boolean isIntermediateVar = false;
if(castValue.getValue() instanceof VariableRef && ((VariableRef) castValue.getValue()).isIntermediate()) {
isIntermediateVar = true;
@ -86,7 +90,6 @@ public class Pass2NopCastInlining extends Pass2SsaOptimization {
// 3. Delete the cast variable
delete.add((SymbolRef) castValue.getValue());
// Change the type of the assignment variable
Variable assignmentVar = getScope().getVariable((VariableRef) assignment.getlValue());
Variable castVar = getScope().getVariable((VariableRef) castValue.getValue());
assignmentVar.setType(castVar.getType());
// Remove the assignment

View File

@ -89,8 +89,6 @@ public class PassNCalcLiveRangeVariables extends PassNCalcBase<LiveRangeVariable
Collection<PreviousStatement> previousStmts = getPreviousStatements(nextStmt);
for(PreviousStatement previousStmt : previousStmts) {
if(PreviousStatement.Type.NORMAL.equals(previousStmt.getType())) {
// Add all used variables to the previous statement (taking into account phi from blocks)
modified |= initUsedVars(liveRanges, nextStmt, previousStmt);
// Add all vars alive in the next statement
for(VariableRef aliveVar : aliveNextStmt) {
if(!definedNextStmt.contains(aliveVar)) {
@ -101,6 +99,8 @@ public class PassNCalcLiveRangeVariables extends PassNCalcBase<LiveRangeVariable
}
}
}
// Add all used variables to the previous statement (taking into account phi from blocks)
modified |= initUsedVars(liveRanges, nextStmt, previousStmt);
} else if(PreviousStatement.Type.LAST_IN_METHOD.equals(previousStmt.getType())) {
// Add all vars that are referenced in the method
StatementCalling call = (StatementCalling) nextStmt;
@ -134,8 +134,6 @@ public class PassNCalcLiveRangeVariables extends PassNCalcBase<LiveRangeVariable
}
}
} else if(PreviousStatement.Type.BEFORE_METHOD.equals(previousStmt.getType())) {
// Add all used variables to the previous statement (taking into account phi from blocks)
modified |= initUsedVars(liveRanges, nextStmt, previousStmt);
// Add all alive variables to previous that are used inside the method
ControlFlowBlock procBlock = getProgram().getStatementInfos().getBlock(nextStmt);
Procedure procedure = (Procedure) getProgram().getScope().getSymbol(procBlock.getLabel());
@ -156,6 +154,8 @@ public class PassNCalcLiveRangeVariables extends PassNCalcBase<LiveRangeVariable
// getLog().append("Not propagating "+aliveVar.toString(getProgram()) +" in BEFORE_METHOD case from "+nextStmt.toString(getProgram(), false)+ " to "+previousStmt.getStatement().toString(getProgram(), false));
}
}
// Add all used variables to the previous statement (taking into account phi from blocks)
modified |= initUsedVars(liveRanges, nextStmt, previousStmt);
}
}
}
@ -167,20 +167,20 @@ public class PassNCalcLiveRangeVariables extends PassNCalcBase<LiveRangeVariable
* Adds variables used in the next statement to the alive vars of the previous statement
*
* @param liveRanges The live ranges to be updated
* @param stmt The next statement
* @param nextStmt The next statement
* @param previousStmt The previous statement
* @return true if any live range modification was made
*/
private boolean initUsedVars(
LiveRangeVariables liveRanges,
Statement stmt,
Statement nextStmt,
PreviousStatement previousStmt) {
boolean modified = false;
VariableReferenceInfos referenceInfo = getProgram().getVariableReferenceInfos();
Collection<VariableRef> usedNextStmt = referenceInfo.getUsedVars(stmt);
if(stmt instanceof StatementPhiBlock) {
// If current statement is a phi add the used variables to previous based on the phi entries
StatementPhiBlock phi = (StatementPhiBlock) stmt;
Collection<VariableRef> usedNextStmt = referenceInfo.getUsedVars(nextStmt);
if(nextStmt instanceof StatementPhiBlock) {
// If next statement is a phi add the used variables to previous based on the phi entries
StatementPhiBlock phi = (StatementPhiBlock) nextStmt;
ControlFlowBlock previousBlock =
getProgram().getStatementInfos().getBlock(previousStmt.getStatementIdx());
for(StatementPhiBlock.PhiVariable phiVariable : phi.getPhiVariables()) {

View File

@ -5,9 +5,7 @@ import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.VariableReferenceInfos;
import dk.camelot64.kickc.model.iterator.ProgramValue;
import dk.camelot64.kickc.model.iterator.ProgramValueIterator;
import dk.camelot64.kickc.model.statements.Statement;
import dk.camelot64.kickc.model.statements.StatementLValue;
import dk.camelot64.kickc.model.statements.StatementPhiBlock;
import dk.camelot64.kickc.model.statements.*;
import dk.camelot64.kickc.model.symbols.Variable;
import dk.camelot64.kickc.model.values.*;
@ -34,13 +32,7 @@ public class PassNCalcVariableReferenceInfos extends PassNCalcBase<VariableRefer
blockVarReferences.putIfAbsent(block.getLabel(), new ArrayList<>());
Collection<VariableReferenceInfos.ReferenceToSymbolVar> blockSymbols = blockVarReferences.get(block.getLabel());
for(Statement statement : block.getStatements()) {
LinkedHashSet<SymbolVariableRef> stmtSymbolVarRefs = new LinkedHashSet<>();
ProgramValueIterator.execute(statement,
(programValue, currentStmt, stmtIt, currentBlock) -> {
if(programValue.get() instanceof SymbolVariableRef)
stmtSymbolVarRefs.add((SymbolVariableRef) programValue.get());
}
, null, null);
Collection<SymbolVariableRef> stmtUsedVars = getUsedVars(statement);
Collection<VariableRef> stmtDefinedVars = getDefinedVars(statement);
// Add variable definitions to the statement
statementVarReferences.putIfAbsent(statement.getIndex(), new ArrayList<>());
@ -55,15 +47,13 @@ public class PassNCalcVariableReferenceInfos extends PassNCalcBase<VariableRefer
if(!blockSymbols.contains(referenceInStmt)) blockSymbols.add(referenceInStmt);
}
// Gather statements referencing variables/constants
for(SymbolVariableRef referencedVarRef : stmtSymbolVarRefs) {
if(!stmtDefinedVars.contains(referencedVarRef)) {
symbolVarReferences.putIfAbsent(referencedVarRef, new ArrayList<>());
Collection<VariableReferenceInfos.ReferenceToSymbolVar> references = symbolVarReferences.get(referencedVarRef);
VariableReferenceInfos.ReferenceInStatement referenceInStmt = new VariableReferenceInfos.ReferenceInStatement(statement.getIndex(), VariableReferenceInfos.ReferenceToSymbolVar.ReferenceType.USE, referencedVarRef);
references.add(referenceInStmt);
stmtSymbols.add(referenceInStmt);
if(!blockSymbols.contains(referenceInStmt)) blockSymbols.add(referenceInStmt);
}
for(SymbolVariableRef referencedVarRef : stmtUsedVars) {
symbolVarReferences.putIfAbsent(referencedVarRef, new ArrayList<>());
Collection<VariableReferenceInfos.ReferenceToSymbolVar> references = symbolVarReferences.get(referencedVarRef);
VariableReferenceInfos.ReferenceInStatement referenceInStmt = new VariableReferenceInfos.ReferenceInStatement(statement.getIndex(), VariableReferenceInfos.ReferenceToSymbolVar.ReferenceType.USE, referencedVarRef);
references.add(referenceInStmt);
stmtSymbols.add(referenceInStmt);
if(!blockSymbols.contains(referenceInStmt)) blockSymbols.add(referenceInStmt);
}
}
}
@ -90,6 +80,58 @@ public class PassNCalcVariableReferenceInfos extends PassNCalcBase<VariableRefer
return new VariableReferenceInfos(blockSuccessors, symbolVarReferences, blockVarReferences, statementVarReferences);
}
/**
* Get all used vars in a statement.
* This is all referenced vars - but not the variable that is assigned (unless it is also referenced elsewhere in the statement).
*
* @param statement The statement
* @return All used vars
*/
public static Collection<SymbolVariableRef> getUsedVars(Statement statement) {
LinkedHashSet<SymbolVariableRef> usedVars = new LinkedHashSet<>();
if(statement instanceof StatementLValue) {
final StatementLValue statementLValue = (StatementLValue) statement;
if(!((statementLValue).getlValue() instanceof VariableRef)) {
// No assignments - find all vars referenced
usedVars.addAll(getReferenced((statementLValue).getlValue()));
}
if(statementLValue instanceof StatementAssignment) {
usedVars.addAll(getReferenced(((StatementAssignment) statementLValue).getrValue1()));
usedVars.addAll(getReferenced(((StatementAssignment) statementLValue).getrValue2()));
} else if(statementLValue instanceof StatementCall) {
if(((StatementCall) statement).getParameters() != null)
for(RValue parameter : ((StatementCall) statementLValue).getParameters()) {
usedVars.addAll(getReferenced(parameter));
}
} else if(statementLValue instanceof StatementCallPointer) {
usedVars.addAll(getReferenced(((StatementCallPointer) statementLValue).getProcedure()));
if(((StatementCallPointer) statement).getParameters() != null)
for(RValue parameter : ((StatementCallPointer) statementLValue).getParameters()) {
usedVars.addAll(getReferenced(parameter));
}
} else if(statementLValue instanceof StatementCallFinalize) {
// No vars
} else {
throw new InternalError("Statement type not handled " + statementLValue);
}
} else if(statement instanceof StatementPhiBlock) {
for(StatementPhiBlock.PhiVariable phiVariable : ((StatementPhiBlock) statement).getPhiVariables()) {
for(StatementPhiBlock.PhiRValue value : phiVariable.getValues()) {
usedVars.addAll(getReferenced(value.getrValue()));
}
}
} else {
// No assignments - find all vars referenced
ProgramValueIterator.execute(statement,
(programValue, currentStmt, stmtIt, currentBlock) -> {
if(programValue.get() instanceof SymbolVariableRef)
usedVars.add((SymbolVariableRef) programValue.get());
}
, null, null);
}
return usedVars;
}
/**
* Get all variables referenced in an rValue
*

View File

@ -37,6 +37,12 @@ public class TestPrograms {
public TestPrograms() {
}
@Test
public void testMaCoalesceProblem() throws IOException, URISyntaxException {
compileAndCompare("ma_coalesce_problem");
}
@Test
public void testVarModelMaMem3() throws IOException, URISyntaxException {
compileAndCompare("varmodel-ma_mem-3");

View File

@ -0,0 +1,26 @@
// Demonstrates problem with __ma coalescing
// c1a is erroneously zp-coalesced with c1A
#pragma var_model(ma_mem, pointer_ma_zp, parameter_ssa_mem)
const char* SCREEN = 0x0400;
// Plasma state variables
char c1A = 0;
void main() {
while(true) {
char c1a = c1A;
for (char i = 0; i < 40; ++i) {
SCREEN[i] = SINTABLE[c1a];
c1a += 4;
}
c1A += 3;
}
}
const char[0x100] align(0x100) SINTABLE = kickasm {{
.for(var i=0;i<$100;i++)
.byte round(127.5+127.5*sin(2*PI*i/256))
}};

View File

@ -93,7 +93,7 @@ main::@2: scope:[main] from main::@1
VARIABLE REGISTER WEIGHTS
(byte) i loadstore !zp[-1]:2 11.400000000000002
(byte) i loadstore !zp[-1]:2 9.5
(void()) main()
Initial phi equivalence classes
@ -161,11 +161,11 @@ main: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [0] (byte) i ← (byte) 3 [ i ] ( [ i ] ) always clobbers reg byte a
Statement [5] if((byte) i<(byte) 7) goto main::@2 [ i ] ( main:2 [ i ] ) always clobbers reg byte a
Statement [7] *((const byte*) SCREEN + (byte) i) ← (byte) i [ ] ( main:2 [ ] ) always clobbers reg byte a reg byte y
Statement [7] *((const byte*) SCREEN + (byte) i) ← (byte) i [ i ] ( main:2 [ i ] ) always clobbers reg byte a reg byte y
Potential registers zp[1]:2 [ i ] : zp[1]:2 ,
REGISTER UPLIFT SCOPES
Uplift Scope [] 11.4: zp[1]:2 [ i ]
Uplift Scope [] 9.5: zp[1]:2 [ i ]
Uplift Scope [main]
Uplifting [] best 338 combination zp[1]:2 [ i ]
@ -251,7 +251,7 @@ FINAL SYMBOL TABLE
(label) @begin
(label) @end
(const byte*) SCREEN = (byte*) 1024
(byte) i loadstore !zp[-1]:2 zp[1]:2 11.400000000000002
(byte) i loadstore !zp[-1]:2 zp[1]:2 9.5
(void()) main()
(label) main::@1
(label) main::@2

View File

@ -2,7 +2,7 @@
(label) @begin
(label) @end
(const byte*) SCREEN = (byte*) 1024
(byte) i loadstore !zp[-1]:2 zp[1]:2 11.400000000000002
(byte) i loadstore !zp[-1]:2 zp[1]:2 9.5
(void()) main()
(label) main::@1
(label) main::@2

View File

@ -94,7 +94,7 @@ main::@2: scope:[main] from main::@1
VARIABLE REGISTER WEIGHTS
(void()) main()
(byte) main::i loadstore !zp[-1]:2 19.0
(byte) main::i loadstore !zp[-1]:2 14.25
Initial phi equivalence classes
Added variable main::i to live range equivalence class [ main::i ]
@ -159,11 +159,11 @@ main: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [4] (byte) main::i ← (byte) 3 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Statement [5] if((byte) main::i<(byte) 7) goto main::@2 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Statement [7] *((const byte*) SCREEN + (byte) main::i) ← (byte) main::i [ ] ( main:2 [ ] ) always clobbers reg byte a reg byte y
Statement [7] *((const byte*) SCREEN + (byte) main::i) ← (byte) main::i [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a reg byte y
Potential registers zp[1]:2 [ main::i ] : zp[1]:2 ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 19: zp[1]:2 [ main::i ]
Uplift Scope [main] 14.25: zp[1]:2 [ main::i ]
Uplift Scope []
Uplifting [main] best 311 combination zp[1]:2 [ main::i ]
@ -254,7 +254,7 @@ FINAL SYMBOL TABLE
(label) main::@1
(label) main::@2
(label) main::@return
(byte) main::i loadstore !zp[-1]:2 zp[1]:2 19.0
(byte) main::i loadstore !zp[-1]:2 zp[1]:2 14.25
zp[1]:2 [ main::i ]

View File

@ -6,6 +6,6 @@
(label) main::@1
(label) main::@2
(label) main::@return
(byte) main::i loadstore !zp[-1]:2 zp[1]:2 19.0
(byte) main::i loadstore !zp[-1]:2 zp[1]:2 14.25
zp[1]:2 [ main::i ]

View File

@ -93,7 +93,7 @@ main::@2: scope:[main] from main::@1
VARIABLE REGISTER WEIGHTS
(byte) i loadstore !mem[-1]:8192 11.400000000000002
(byte) i loadstore !mem[-1]:8192 9.5
(void()) main()
Initial phi equivalence classes
@ -161,11 +161,11 @@ main: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [0] (byte) i ← (byte) 3 [ i ] ( [ i ] ) always clobbers reg byte a
Statement [5] if((byte) i<(byte) 7) goto main::@2 [ i ] ( main:2 [ i ] ) always clobbers reg byte a
Statement [7] *((const byte*) SCREEN + (byte) i) ← (byte) i [ ] ( main:2 [ ] ) always clobbers reg byte a reg byte y
Statement [7] *((const byte*) SCREEN + (byte) i) ← (byte) i [ i ] ( main:2 [ i ] ) always clobbers reg byte a reg byte y
Potential registers mem[1]:8192 [ i ] : mem[1]:8192 ,
REGISTER UPLIFT SCOPES
Uplift Scope [] 11.4: mem[1]:8192 [ i ]
Uplift Scope [] 9.5: mem[1]:8192 [ i ]
Uplift Scope [main]
Uplifting [] best 369 combination mem[1]:8192 [ i ]
@ -251,7 +251,7 @@ FINAL SYMBOL TABLE
(label) @begin
(label) @end
(const byte*) SCREEN = (byte*) 1024
(byte) i loadstore !mem[-1]:8192 mem[1]:8192 11.400000000000002
(byte) i loadstore !mem[-1]:8192 mem[1]:8192 9.5
(void()) main()
(label) main::@1
(label) main::@2

View File

@ -2,7 +2,7 @@
(label) @begin
(label) @end
(const byte*) SCREEN = (byte*) 1024
(byte) i loadstore !mem[-1]:8192 mem[1]:8192 11.400000000000002
(byte) i loadstore !mem[-1]:8192 mem[1]:8192 9.5
(void()) main()
(label) main::@1
(label) main::@2

View File

@ -94,7 +94,7 @@ main::@2: scope:[main] from main::@1
VARIABLE REGISTER WEIGHTS
(void()) main()
(byte) main::i loadstore !mem[-1]:8192 19.0
(byte) main::i loadstore !mem[-1]:8192 14.25
Initial phi equivalence classes
Added variable main::i to live range equivalence class [ main::i ]
@ -159,11 +159,11 @@ main: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [4] (byte) main::i ← (byte) 3 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Statement [5] if((byte) main::i<(byte) 7) goto main::@2 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Statement [7] *((const byte*) SCREEN + (byte) main::i) ← (byte) main::i [ ] ( main:2 [ ] ) always clobbers reg byte a reg byte y
Statement [7] *((const byte*) SCREEN + (byte) main::i) ← (byte) main::i [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a reg byte y
Potential registers mem[1]:8192 [ main::i ] : mem[1]:8192 ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 19: mem[1]:8192 [ main::i ]
Uplift Scope [main] 14.25: mem[1]:8192 [ main::i ]
Uplift Scope []
Uplifting [main] best 342 combination mem[1]:8192 [ main::i ]
@ -254,7 +254,7 @@ FINAL SYMBOL TABLE
(label) main::@1
(label) main::@2
(label) main::@return
(byte) main::i loadstore !mem[-1]:8192 mem[1]:8192 19.0
(byte) main::i loadstore !mem[-1]:8192 mem[1]:8192 14.25
mem[1]:8192 [ main::i ]

View File

@ -6,6 +6,6 @@
(label) main::@1
(label) main::@2
(label) main::@return
(byte) main::i loadstore !mem[-1]:8192 mem[1]:8192 19.0
(byte) main::i loadstore !mem[-1]:8192 mem[1]:8192 14.25
mem[1]:8192 [ main::i ]

View File

@ -116,7 +116,7 @@ VARIABLE REGISTER WEIGHTS
(void()) main()
(byte~) main::$1 22.0
(byte~) main::$2 22.0
(byte) main::i loadstore !zp[-1]:2 19.75
(byte) main::i loadstore !zp[-1]:2 9.875
Initial phi equivalence classes
Added variable main::i to live range equivalence class [ main::i ]
@ -208,16 +208,16 @@ main: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [4] (byte) main::i ← (byte) 0 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Statement [5] if((byte) main::i<(byte) 8) goto main::@2 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Statement [7] (byte~) main::$1 ← (byte) main::i << (byte) 1 [ main::$1 ] ( main:2 [ main::$1 ] ) always clobbers reg byte a
Statement [8] *((const word*) SCREEN + (byte~) main::$1) ← (const word) main::ch [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [10] (byte~) main::$2 ← (byte) main::i << (byte) 1 [ main::$2 ] ( main:2 [ main::$2 ] ) always clobbers reg byte a
Statement [11] *((const word*) SCREEN + (byte~) main::$2) ← (const word) main::ch [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [7] (byte~) main::$1 ← (byte) main::i << (byte) 1 [ main::i main::$1 ] ( main:2 [ main::i main::$1 ] ) always clobbers reg byte a
Statement [8] *((const word*) SCREEN + (byte~) main::$1) ← (const word) main::ch [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Statement [10] (byte~) main::$2 ← (byte) main::i << (byte) 1 [ main::i main::$2 ] ( main:2 [ main::i main::$2 ] ) always clobbers reg byte a
Statement [11] *((const word*) SCREEN + (byte~) main::$2) ← (const word) main::ch [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Potential registers zp[1]:2 [ main::i ] : zp[1]:2 ,
Potential registers zp[1]:3 [ main::$1 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:4 [ main::$2 ] : zp[1]:4 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 22: zp[1]:3 [ main::$1 ] 22: zp[1]:4 [ main::$2 ] 19.75: zp[1]:2 [ main::i ]
Uplift Scope [main] 22: zp[1]:3 [ main::$1 ] 22: zp[1]:4 [ main::$2 ] 9.88: zp[1]:2 [ main::i ]
Uplift Scope []
Uplifting [main] best 681 combination reg byte a [ main::$1 ] reg byte a [ main::$2 ] zp[1]:2 [ main::i ]
@ -328,7 +328,7 @@ FINAL SYMBOL TABLE
(label) main::@2
(label) main::@return
(const word) main::ch = (word) $102
(byte) main::i loadstore !zp[-1]:2 zp[1]:2 19.75
(byte) main::i loadstore !zp[-1]:2 zp[1]:2 9.875
zp[1]:2 [ main::i ]
reg byte a [ main::$1 ]

View File

@ -9,7 +9,7 @@
(label) main::@2
(label) main::@return
(const word) main::ch = (word) $102
(byte) main::i loadstore !zp[-1]:2 zp[1]:2 19.75
(byte) main::i loadstore !zp[-1]:2 zp[1]:2 9.875
zp[1]:2 [ main::i ]
reg byte a [ main::$1 ]

View File

@ -108,7 +108,7 @@ main::@return: scope:[main] from main::@1
VARIABLE REGISTER WEIGHTS
(void()) main()
(byte) main::b loadstore 11.5
(byte) main::b loadstore 9.200000000000001
(byte) main::c
(byte) main::c#0 22.0
@ -180,13 +180,13 @@ main: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [4] (byte) main::b ← (byte) 0 [ main::b ] ( main:2 [ main::b ] ) always clobbers reg byte a
Statement [6] *((const byte*) main::SCREEN + (byte) main::b) ← (byte) main::c#0 [ ] ( main:2 [ ] ) always clobbers reg byte y
Statement [6] *((const byte*) main::SCREEN + (byte) main::b) ← (byte) main::c#0 [ main::b ] ( main:2 [ main::b ] ) always clobbers reg byte y
Statement [8] if((byte) main::b!=(byte) $b) goto main::@1 [ main::b ] ( main:2 [ main::b ] ) always clobbers reg byte a
Potential registers zp[1]:2 [ main::b ] : zp[1]:2 ,
Potential registers zp[1]:3 [ main::c#0 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 22: zp[1]:3 [ main::c#0 ] 11.5: zp[1]:2 [ main::b ]
Uplift Scope [main] 22: zp[1]:3 [ main::c#0 ] 9.2: zp[1]:2 [ main::b ]
Uplift Scope []
Uplifting [main] best 331 combination reg byte a [ main::c#0 ] zp[1]:2 [ main::b ]
@ -276,7 +276,7 @@ FINAL SYMBOL TABLE
(label) main::@1
(label) main::@return
(const byte*) main::SCREEN = (byte*) 1024
(byte) main::b loadstore zp[1]:2 11.5
(byte) main::b loadstore zp[1]:2 9.200000000000001
(const byte*) main::bp = &(byte) main::b
(byte) main::c
(byte) main::c#0 reg byte a 22.0

View File

@ -5,7 +5,7 @@
(label) main::@1
(label) main::@return
(const byte*) main::SCREEN = (byte*) 1024
(byte) main::b loadstore zp[1]:2 11.5
(byte) main::b loadstore zp[1]:2 9.200000000000001
(const byte*) main::bp = &(byte) main::b
(byte) main::c
(byte) main::c#0 reg byte a 22.0

View File

@ -1443,7 +1443,7 @@ VARIABLE REGISTER WEIGHTS
(byte) bitmap_plot::y
(byte) bitmap_plot::y#0 15.0
(byte*) bitmap_screen
(byte) frame_cnt loadstore 1.1538461538461537
(byte) frame_cnt loadstore 1.1111111111111112
(void()) init_irq()
interrupt(HARDWARE_CLOBBER)(void()) irq()
(void()) main()
@ -2208,7 +2208,7 @@ Removing always clobbered register reg byte y as potential for zp[1]:12 [ memset
Statement [75] (byte*) bitmap_init::yoffs#1 ← (byte*) bitmap_init::yoffs#2 + (word)(number) $28*(number) 8 [ bitmap_init::y#2 bitmap_init::yoffs#1 ] ( main:3::bitmap_init:6 [ frame_cnt bitmap_init::y#2 bitmap_init::yoffs#1 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:17 [ bitmap_init::y#2 bitmap_init::y#1 ]
Statement [80] *((const byte*) BGCOL) ← (const byte) WHITE [ frame_cnt ] ( [ frame_cnt ] ) always clobbers reg byte a
Statement [81] if((byte) 0==(byte) frame_cnt) goto irq::@1 [ ] ( [ ] ) always clobbers reg byte a
Statement [81] if((byte) 0==(byte) frame_cnt) goto irq::@1 [ frame_cnt ] ( [ frame_cnt ] ) always clobbers reg byte a
Statement [83] *((const byte*) BGCOL) ← (const byte) BLACK [ ] ( [ ] ) always clobbers reg byte a
Statement [84] *((const byte*) IRQ_STATUS) ← (const byte) IRQ_RASTER [ ] ( [ ] ) always clobbers reg byte a
Statement [85] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y
@ -2245,7 +2245,7 @@ Statement [56] *((byte*) memset::dst#2) ← (byte) memset::c#4 [ memset::c#4 mem
Statement [68] (byte~) bitmap_init::$7 ← (byte) bitmap_init::y#2 & (byte) 7 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$7 ] ( main:3::bitmap_init:6 [ frame_cnt bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$7 ] ) always clobbers reg byte a
Statement [75] (byte*) bitmap_init::yoffs#1 ← (byte*) bitmap_init::yoffs#2 + (word)(number) $28*(number) 8 [ bitmap_init::y#2 bitmap_init::yoffs#1 ] ( main:3::bitmap_init:6 [ frame_cnt bitmap_init::y#2 bitmap_init::yoffs#1 ] ) always clobbers reg byte a
Statement [80] *((const byte*) BGCOL) ← (const byte) WHITE [ frame_cnt ] ( [ frame_cnt ] ) always clobbers reg byte a
Statement [81] if((byte) 0==(byte) frame_cnt) goto irq::@1 [ ] ( [ ] ) always clobbers reg byte a
Statement [81] if((byte) 0==(byte) frame_cnt) goto irq::@1 [ frame_cnt ] ( [ frame_cnt ] ) always clobbers reg byte a
Statement [83] *((const byte*) BGCOL) ← (const byte) BLACK [ ] ( [ ] ) always clobbers reg byte a
Statement [84] *((const byte*) IRQ_STATUS) ← (const byte) IRQ_RASTER [ ] ( [ ] ) always clobbers reg byte a
Statement [85] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y
@ -2279,7 +2279,7 @@ Uplift Scope [bitmap_init] 39.88: zp[2]:18 [ bitmap_init::yoffs#2 bitmap_init::y
Uplift Scope [main] 42.17: zp[1]:7 [ main::vy#2 main::vy#8 main::vy#1 ] 33: zp[2]:5 [ main::vx#2 main::vx#6 main::vx#1 ] 12.25: zp[2]:2 [ main::x#2 main::x#1 ] 11: zp[1]:4 [ main::y#2 main::y#1 ]
Uplift Scope [memset] 41.33: zp[2]:13 [ memset::dst#2 memset::dst#4 memset::dst#1 ] 2.17: zp[2]:31 [ memset::end#0 ] 2: zp[2]:8 [ memset::num#2 ] 1.38: zp[1]:12 [ memset::c#4 ] 0: zp[2]:10 [ memset::str#3 ]
Uplift Scope [bitmap_plot] 15: zp[1]:23 [ bitmap_plot::y#0 ] 4: zp[2]:26 [ bitmap_plot::$1 ] 4: zp[1]:30 [ bitmap_plot::$2 ] 3: zp[2]:21 [ bitmap_plot::x#0 ] 3: zp[2]:28 [ bitmap_plot::plotter#1 ] 1: zp[2]:24 [ bitmap_plot::plotter#0 ]
Uplift Scope [] 1.15: zp[1]:20 [ frame_cnt ]
Uplift Scope [] 1.11: zp[1]:20 [ frame_cnt ]
Uplift Scope [bitmap_clear]
Uplift Scope [init_irq]
Uplift Scope [irq]
@ -3079,7 +3079,7 @@ FINAL SYMBOL TABLE
(const byte*) bitmap_plot_yhi[(number) $100] = { fill( $100, 0) }
(const byte*) bitmap_plot_ylo[(number) $100] = { fill( $100, 0) }
(byte*) bitmap_screen
(byte) frame_cnt loadstore zp[1]:7 1.1538461538461537
(byte) frame_cnt loadstore zp[1]:7 1.1111111111111112
(void()) init_irq()
(label) init_irq::@return
interrupt(HARDWARE_CLOBBER)(void()) irq()

View File

@ -75,7 +75,7 @@
(const byte*) bitmap_plot_yhi[(number) $100] = { fill( $100, 0) }
(const byte*) bitmap_plot_ylo[(number) $100] = { fill( $100, 0) }
(byte*) bitmap_screen
(byte) frame_cnt loadstore zp[1]:7 1.1538461538461537
(byte) frame_cnt loadstore zp[1]:7 1.1111111111111112
(void()) init_irq()
(label) init_irq::@return
interrupt(HARDWARE_CLOBBER)(void()) irq()

View File

@ -3292,7 +3292,7 @@ VARIABLE REGISTER WEIGHTS
(word) divr16u::return#0 5.285714285714286
(word) divr16u::return#2 4.0
(word) divr16u::return#3 4.0
(byte) frame_cnt loadstore 0.6521739130434783
(byte) frame_cnt loadstore 0.6382978723404255
(void()) init_irq()
interrupt(HARDWARE_CLOBBER)(void()) irq()
(void()) main()
@ -5769,7 +5769,7 @@ Statement [217] if((word) divr16u::rem#6<(const word) sin16s_gen2::wavelength#0)
Statement [219] (word) divr16u::rem#2 ← (word) divr16u::rem#6 - (const word) sin16s_gen2::wavelength#0 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:3::sin16s_gen2:6::div32u16u:130::divr16u:198 [ frame_cnt divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] main:3::sin16s_gen2:6::div32u16u:130::divr16u:202 [ frame_cnt div32u16u::quotient_hi#0 divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ) always clobbers reg byte a
Statement [223] (word) rem16u#1 ← (word) divr16u::rem#11 [ divr16u::return#0 rem16u#1 ] ( main:3::sin16s_gen2:6::div32u16u:130::divr16u:198 [ frame_cnt divr16u::return#0 rem16u#1 ] main:3::sin16s_gen2:6::div32u16u:130::divr16u:202 [ frame_cnt div32u16u::quotient_hi#0 divr16u::return#0 rem16u#1 ] ) always clobbers reg byte a
Statement [225] *((const byte*) BGCOL) ← (const byte) WHITE [ frame_cnt ] ( [ frame_cnt ] ) always clobbers reg byte a
Statement [226] if((byte) 0==(byte) frame_cnt) goto irq::@1 [ ] ( [ ] ) always clobbers reg byte a
Statement [226] if((byte) 0==(byte) frame_cnt) goto irq::@1 [ frame_cnt ] ( [ frame_cnt ] ) always clobbers reg byte a
Statement [228] *((const byte*) BGCOL) ← (const byte) BLACK [ ] ( [ ] ) always clobbers reg byte a
Statement [229] *((const byte*) IRQ_STATUS) ← (const byte) IRQ_RASTER [ ] ( [ ] ) always clobbers reg byte a
Statement [230] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y
@ -5893,7 +5893,7 @@ Statement [217] if((word) divr16u::rem#6<(const word) sin16s_gen2::wavelength#0)
Statement [219] (word) divr16u::rem#2 ← (word) divr16u::rem#6 - (const word) sin16s_gen2::wavelength#0 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:3::sin16s_gen2:6::div32u16u:130::divr16u:198 [ frame_cnt divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] main:3::sin16s_gen2:6::div32u16u:130::divr16u:202 [ frame_cnt div32u16u::quotient_hi#0 divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ) always clobbers reg byte a
Statement [223] (word) rem16u#1 ← (word) divr16u::rem#11 [ divr16u::return#0 rem16u#1 ] ( main:3::sin16s_gen2:6::div32u16u:130::divr16u:198 [ frame_cnt divr16u::return#0 rem16u#1 ] main:3::sin16s_gen2:6::div32u16u:130::divr16u:202 [ frame_cnt div32u16u::quotient_hi#0 divr16u::return#0 rem16u#1 ] ) always clobbers reg byte a
Statement [225] *((const byte*) BGCOL) ← (const byte) WHITE [ frame_cnt ] ( [ frame_cnt ] ) always clobbers reg byte a
Statement [226] if((byte) 0==(byte) frame_cnt) goto irq::@1 [ ] ( [ ] ) always clobbers reg byte a
Statement [226] if((byte) 0==(byte) frame_cnt) goto irq::@1 [ frame_cnt ] ( [ frame_cnt ] ) always clobbers reg byte a
Statement [228] *((const byte*) BGCOL) ← (const byte) BLACK [ ] ( [ ] ) always clobbers reg byte a
Statement [229] *((const byte*) IRQ_STATUS) ← (const byte) IRQ_RASTER [ ] ( [ ] ) always clobbers reg byte a
Statement [230] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y
@ -6008,7 +6008,7 @@ Uplift Scope [mulu16_sel] 24: zp[2]:53 [ mulu16_sel::v1#5 mulu16_sel::v1#3 mulu1
Uplift Scope [memset] 41.33: zp[2]:31 [ memset::dst#2 memset::dst#4 memset::dst#1 ] 2.17: zp[2]:137 [ memset::end#0 ] 2: zp[2]:26 [ memset::num#2 ] 1.38: zp[1]:30 [ memset::c#4 ] 0: zp[2]:28 [ memset::str#3 ]
Uplift Scope [bitmap_plot] 7.5: zp[1]:110 [ bitmap_plot::y#0 ] 4: zp[2]:115 [ bitmap_plot::$1 ] 4: zp[1]:119 [ bitmap_plot::$2 ] 3.75: zp[2]:111 [ bitmap_plot::x#0 ] 3: zp[2]:117 [ bitmap_plot::plotter#1 ] 1: zp[2]:113 [ bitmap_plot::plotter#0 ]
Uplift Scope [div32u16u] 4: zp[4]:143 [ div32u16u::return#2 ] 4: zp[2]:215 [ div32u16u::quotient_lo#0 ] 1.33: zp[4]:217 [ div32u16u::return#0 ] 0.8: zp[2]:211 [ div32u16u::quotient_hi#0 ]
Uplift Scope [] 0.8: zp[2]:223 [ rem16u#1 ] 0.65: zp[1]:65 [ frame_cnt ]
Uplift Scope [] 0.8: zp[2]:223 [ rem16u#1 ] 0.64: zp[1]:65 [ frame_cnt ]
Uplift Scope [bitmap_clear]
Uplift Scope [init_irq]
Uplift Scope [irq]
@ -8073,7 +8073,7 @@ FINAL SYMBOL TABLE
(word) divr16u::return#0 return zp[2]:12 5.285714285714286
(word) divr16u::return#2 return zp[2]:12 4.0
(word) divr16u::return#3 return zp[2]:12 4.0
(byte) frame_cnt loadstore zp[1]:14 0.6521739130434783
(byte) frame_cnt loadstore zp[1]:14 0.6382978723404255
(void()) init_irq()
(label) init_irq::@return
interrupt(HARDWARE_CLOBBER)(void()) irq()

View File

@ -129,7 +129,7 @@
(word) divr16u::return#0 return zp[2]:12 5.285714285714286
(word) divr16u::return#2 return zp[2]:12 4.0
(word) divr16u::return#3 return zp[2]:12 4.0
(byte) frame_cnt loadstore zp[1]:14 0.6521739130434783
(byte) frame_cnt loadstore zp[1]:14 0.6382978723404255
(void()) init_irq()
(label) init_irq::@return
interrupt(HARDWARE_CLOBBER)(void()) irq()

View File

@ -3494,7 +3494,7 @@ VARIABLE REGISTER WEIGHTS
(word) divr16u::return#0 5.285714285714286
(word) divr16u::return#2 4.0
(word) divr16u::return#3 4.0
(byte) frame_cnt loadstore 0.5555555555555556
(byte) frame_cnt loadstore 0.5454545454545455
(void()) init_irq()
interrupt(HARDWARE_CLOBBER)(void()) irq()
(void()) main()
@ -6045,7 +6045,7 @@ Statement [226] if((word) divr16u::rem#6<(const word) sin16s_gen2::wavelength#0)
Statement [228] (word) divr16u::rem#2 ← (word) divr16u::rem#6 - (const word) sin16s_gen2::wavelength#0 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:3::sin16s_gen2:6::div32u16u:139::divr16u:207 [ frame_cnt divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] main:3::sin16s_gen2:6::div32u16u:139::divr16u:211 [ frame_cnt div32u16u::quotient_hi#0 divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ) always clobbers reg byte a
Statement [232] (word) rem16u#1 ← (word) divr16u::rem#11 [ divr16u::return#0 rem16u#1 ] ( main:3::sin16s_gen2:6::div32u16u:139::divr16u:207 [ frame_cnt divr16u::return#0 rem16u#1 ] main:3::sin16s_gen2:6::div32u16u:139::divr16u:211 [ frame_cnt div32u16u::quotient_hi#0 divr16u::return#0 rem16u#1 ] ) always clobbers reg byte a
Statement [234] *((const byte*) BGCOL) ← (const byte) WHITE [ frame_cnt ] ( [ frame_cnt ] ) always clobbers reg byte a
Statement [235] if((byte) 0==(byte) frame_cnt) goto irq::@1 [ ] ( [ ] ) always clobbers reg byte a
Statement [235] if((byte) 0==(byte) frame_cnt) goto irq::@1 [ frame_cnt ] ( [ frame_cnt ] ) always clobbers reg byte a
Statement [237] *((const byte*) BGCOL) ← (const byte) BLACK [ ] ( [ ] ) always clobbers reg byte a
Statement [238] *((const byte*) IRQ_STATUS) ← (const byte) IRQ_RASTER [ ] ( [ ] ) always clobbers reg byte a
Statement [239] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y
@ -6179,7 +6179,7 @@ Statement [226] if((word) divr16u::rem#6<(const word) sin16s_gen2::wavelength#0)
Statement [228] (word) divr16u::rem#2 ← (word) divr16u::rem#6 - (const word) sin16s_gen2::wavelength#0 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:3::sin16s_gen2:6::div32u16u:139::divr16u:207 [ frame_cnt divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] main:3::sin16s_gen2:6::div32u16u:139::divr16u:211 [ frame_cnt div32u16u::quotient_hi#0 divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ) always clobbers reg byte a
Statement [232] (word) rem16u#1 ← (word) divr16u::rem#11 [ divr16u::return#0 rem16u#1 ] ( main:3::sin16s_gen2:6::div32u16u:139::divr16u:207 [ frame_cnt divr16u::return#0 rem16u#1 ] main:3::sin16s_gen2:6::div32u16u:139::divr16u:211 [ frame_cnt div32u16u::quotient_hi#0 divr16u::return#0 rem16u#1 ] ) always clobbers reg byte a
Statement [234] *((const byte*) BGCOL) ← (const byte) WHITE [ frame_cnt ] ( [ frame_cnt ] ) always clobbers reg byte a
Statement [235] if((byte) 0==(byte) frame_cnt) goto irq::@1 [ ] ( [ ] ) always clobbers reg byte a
Statement [235] if((byte) 0==(byte) frame_cnt) goto irq::@1 [ frame_cnt ] ( [ frame_cnt ] ) always clobbers reg byte a
Statement [237] *((const byte*) BGCOL) ← (const byte) BLACK [ ] ( [ ] ) always clobbers reg byte a
Statement [238] *((const byte*) IRQ_STATUS) ← (const byte) IRQ_RASTER [ ] ( [ ] ) always clobbers reg byte a
Statement [239] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y
@ -6296,7 +6296,7 @@ Uplift Scope [mulu16_sel] 24: zp[2]:56 [ mulu16_sel::v1#5 mulu16_sel::v1#3 mulu1
Uplift Scope [memset] 41.33: zp[2]:34 [ memset::dst#2 memset::dst#4 memset::dst#1 ] 2.17: zp[2]:136 [ memset::end#0 ] 2: zp[2]:29 [ memset::num#2 ] 1.38: zp[1]:33 [ memset::c#4 ] 0: zp[2]:31 [ memset::str#3 ]
Uplift Scope [bitmap_plot] 7.5: zp[1]:109 [ bitmap_plot::y#0 ] 4: zp[2]:114 [ bitmap_plot::$1 ] 4: zp[1]:118 [ bitmap_plot::$2 ] 3.75: zp[2]:110 [ bitmap_plot::x#0 ] 3: zp[2]:116 [ bitmap_plot::plotter#1 ] 1: zp[2]:112 [ bitmap_plot::plotter#0 ]
Uplift Scope [div32u16u] 4: zp[4]:142 [ div32u16u::return#2 ] 4: zp[2]:214 [ div32u16u::quotient_lo#0 ] 1.33: zp[4]:216 [ div32u16u::return#0 ] 0.8: zp[2]:210 [ div32u16u::quotient_hi#0 ]
Uplift Scope [] 0.8: zp[2]:222 [ rem16u#1 ] 0.56: zp[1]:68 [ frame_cnt ]
Uplift Scope [] 0.8: zp[2]:222 [ rem16u#1 ] 0.55: zp[1]:68 [ frame_cnt ]
Uplift Scope [bitmap_clear]
Uplift Scope [init_irq]
Uplift Scope [irq]
@ -8449,7 +8449,7 @@ FINAL SYMBOL TABLE
(word) divr16u::return#0 return zp[2]:14 5.285714285714286
(word) divr16u::return#2 return zp[2]:14 4.0
(word) divr16u::return#3 return zp[2]:14 4.0
(byte) frame_cnt loadstore zp[1]:16 0.5555555555555556
(byte) frame_cnt loadstore zp[1]:16 0.5454545454545455
(void()) init_irq()
(label) init_irq::@return
interrupt(HARDWARE_CLOBBER)(void()) irq()

View File

@ -130,7 +130,7 @@
(word) divr16u::return#0 return zp[2]:14 5.285714285714286
(word) divr16u::return#2 return zp[2]:14 4.0
(word) divr16u::return#3 return zp[2]:14 4.0
(byte) frame_cnt loadstore zp[1]:16 0.5555555555555556
(byte) frame_cnt loadstore zp[1]:16 0.5454545454545455
(void()) init_irq()
(label) init_irq::@return
interrupt(HARDWARE_CLOBBER)(void()) irq()

View File

@ -169,7 +169,7 @@ interrupt(HARDWARE_CLOBBER)(void()) irq()
(byte) irq::raster_next#0 2.6666666666666665
(byte) irq::raster_next#1 4.0
(byte) irq::raster_next#2 6.0
(byte) irq_raster_next loadstore 8.0
(byte) irq_raster_next loadstore 4.0
(void()) main()
Initial phi equivalence classes
@ -293,7 +293,7 @@ irq: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [1] (byte) irq_raster_next ← (byte) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [5] *((const void()**) KERNEL_IRQ) ← &interrupt(HARDWARE_CLOBBER)(void()) irq() [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [7] *((const byte*) BORDERCOL) ← (const byte) DARK_GREY [ ] ( [ ] ) always clobbers reg byte a
Statement [7] *((const byte*) BORDERCOL) ← (const byte) DARK_GREY [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a
Statement [8] (byte) irq_raster_next ← (byte) irq_raster_next + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a reg byte x
Statement [15] *((const byte*) BORDERCOL) ← (const byte) BLACK [ ] ( [ ] ) always clobbers reg byte a
Statement [16] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y
@ -303,7 +303,7 @@ Potential registers zp[1]:4 [ irq::$0 ] : zp[1]:4 , reg byte a , reg byte x , re
REGISTER UPLIFT SCOPES
Uplift Scope [irq] 12.67: zp[1]:2 [ irq::raster_next#2 irq::raster_next#0 irq::raster_next#1 ] 4: zp[1]:4 [ irq::$0 ]
Uplift Scope [] 8: zp[1]:3 [ irq_raster_next ]
Uplift Scope [] 4: zp[1]:3 [ irq_raster_next ]
Uplift Scope [main]
Uplifting [irq] best 246 combination reg byte x [ irq::raster_next#2 irq::raster_next#0 irq::raster_next#1 ] reg byte a [ irq::$0 ]
@ -460,7 +460,7 @@ interrupt(HARDWARE_CLOBBER)(void()) irq()
(byte) irq::raster_next#0 reg byte x 2.6666666666666665
(byte) irq::raster_next#1 reg byte x 4.0
(byte) irq::raster_next#2 reg byte x 6.0
(byte) irq_raster_next loadstore zp[1]:2 8.0
(byte) irq_raster_next loadstore zp[1]:2 4.0
(void()) main()
(label) main::@return

View File

@ -16,7 +16,7 @@ interrupt(HARDWARE_CLOBBER)(void()) irq()
(byte) irq::raster_next#0 reg byte x 2.6666666666666665
(byte) irq::raster_next#1 reg byte x 4.0
(byte) irq::raster_next#2 reg byte x 6.0
(byte) irq_raster_next loadstore zp[1]:2 8.0
(byte) irq_raster_next loadstore zp[1]:2 4.0
(void()) main()
(label) main::@return

View File

@ -3,11 +3,12 @@
:BasicUpstart(main)
.pc = $80d "Program"
main: {
.label SCREEN = $400
.label sc = 2
.label screen = 4
lda #<$400
lda #<SCREEN
sta.z sc
lda #>$400
lda #>SCREEN
sta.z sc+1
__b1:
lda #' '
@ -18,19 +19,19 @@ main: {
inc.z sc+1
!:
lda.z sc+1
cmp #>$400+$3e8+1
cmp #>SCREEN+$3e8+1
bne __b1
lda.z sc
cmp #<$400+$3e8+1
cmp #<SCREEN+$3e8+1
bne __b1
ldx #0
__b2:
lda header,x
cmp #0
bne __b3
lda #<$400
lda #<SCREEN
sta.z screen
lda #>$400
lda #>SCREEN
sta.z screen+1
ldx #0
__b4:
@ -84,7 +85,7 @@ main: {
jmp __b4
__b3:
lda header,x
sta $400,x
sta SCREEN,x
inx
jmp __b2
header: .text " < <= == >= >"

View File

@ -13,17 +13,17 @@ main: scope:[main] from @1
[4] phi()
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte*) main::sc#2 ← phi( main/(byte*) 1024 main::@1/(byte*) main::sc#1 )
[5] (byte*) main::sc#2 ← phi( main/(const byte*) main::SCREEN main::@1/(byte*) main::sc#1 )
[6] *((byte*) main::sc#2) ← (byte) ' '
[7] (byte*) main::sc#1 ← ++ (byte*) main::sc#2
[8] if((byte*) main::sc#1!=(byte*) 1024+(word) $3e8+(byte) 1) goto main::@1
[8] if((byte*) main::sc#1!=(const byte*) main::SCREEN+(word) $3e8+(byte) 1) goto main::@1
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
[9] (byte) main::i#2 ← phi( main::@1/(byte) 0 main::@3/(byte) main::i#1 )
[10] if(*((const byte*) main::header + (byte) main::i#2)!=(byte) 0) goto main::@3
to:main::@4
main::@4: scope:[main] from main::@10 main::@2
[11] (byte*) main::screen#11 ← phi( main::@10/(byte*) main::screen#1 main::@2/(byte*) 1024 )
[11] (byte*) main::screen#2 ← phi( main::@10/(byte*) main::screen#1 main::@2/(const byte*) main::SCREEN )
[11] (byte) main::i1#10 ← phi( main::@10/(byte) main::i1#1 main::@2/(byte) 0 )
[12] if((byte) main::i1#10<(byte) 9+(byte) 1) goto main::@5
to:main::@return
@ -31,9 +31,9 @@ main::@return: scope:[main] from main::@4
[13] return
to:@return
main::@5: scope:[main] from main::@4
[14] (byte*) main::screen#1 ← (byte*) main::screen#11 + (byte) $28
[15] (byte~) main::$4 ← (byte) '0' + (byte) main::i1#10
[16] *((byte*) main::screen#1) ← (byte~) main::$4
[14] (byte*) main::screen#1 ← (byte*) main::screen#2 + (byte) $28
[15] (byte~) main::$3 ← (byte) '0' + (byte) main::i1#10
[16] *((byte*) main::screen#1) ← (byte~) main::$3
[17] if((byte) main::i1#10>=(byte) 5) goto main::@6
to:main::@11
main::@11: scope:[main] from main::@5
@ -67,6 +67,6 @@ main::@10: scope:[main] from main::@15 main::@9
[27] (byte) main::i1#1 ← ++ (byte) main::i1#10
to:main::@4
main::@3: scope:[main] from main::@2
[28] *((byte*) 1024 + (byte) main::i#2) ← *((const byte*) main::header + (byte) main::i#2)
[28] *((const byte*) main::SCREEN + (byte) main::i#2) ← *((const byte*) main::header + (byte) main::i#2)
[29] (byte) main::i#1 ← ++ (byte) main::i#2
to:main::@2

View File

@ -12,111 +12,105 @@ CONTROL FLOW GRAPH SSA
(void()) main()
main: scope:[main] from @1
(byte*) main::screen#0 ← (byte*)(number) $400
(byte*~) main::$0 ← (byte*) main::screen#0 + (number) $3e8
(byte*) main::sc#0 ← (byte*) main::screen#0
(byte*) main::sc#0 ← (const byte*) main::SCREEN
to:main::@1
main::@1: scope:[main] from main main::@1
(byte*) main::screen#2 ← phi( main/(byte*) main::screen#0 main::@1/(byte*) main::screen#2 )
(byte*) main::sc#2 ← phi( main/(byte*) main::sc#0 main::@1/(byte*) main::sc#1 )
*((byte*) main::sc#2) ← (byte) ' '
(byte*) main::sc#1 ← (byte*) main::sc#2 + rangenext(main::screen#2,main::$0)
(bool~) main::$1 ← (byte*) main::sc#1 != rangelast(main::screen#2,main::$0)
if((bool~) main::$1) goto main::@1
(byte*) main::sc#1 ← (byte*) main::sc#2 + rangenext(main::SCREEN,main::SCREEN+$3e8)
(bool~) main::$0 ← (byte*) main::sc#1 != rangelast(main::SCREEN,main::SCREEN+$3e8)
if((bool~) main::$0) goto main::@1
to:main::@2
main::@2: scope:[main] from main::@1
(byte*) main::screen#16 ← phi( main::@1/(byte*) main::screen#2 )
(byte) main::i#0 ← (byte) 0
to:main::@3
main::@3: scope:[main] from main::@2 main::@4
(byte*) main::screen#10 ← phi( main::@2/(byte*) main::screen#16 main::@4/(byte*) main::screen#3 )
(byte) main::i#2 ← phi( main::@2/(byte) main::i#0 main::@4/(byte) main::i#1 )
(bool~) main::$2 ← *((const byte*) main::header + (byte) main::i#2) != (number) 0
if((bool~) main::$2) goto main::@4
(bool~) main::$1 ← *((const byte*) main::header + (byte) main::i#2) != (number) 0
if((bool~) main::$1) goto main::@4
to:main::@5
main::@4: scope:[main] from main::@3
(byte*) main::screen#3 ← phi( main::@3/(byte*) main::screen#10 )
(byte) main::i#3 ← phi( main::@3/(byte) main::i#2 )
*((byte*) main::screen#3 + (byte) main::i#3) ← *((const byte*) main::header + (byte) main::i#3)
*((const byte*) main::SCREEN + (byte) main::i#3) ← *((const byte*) main::header + (byte) main::i#3)
(byte) main::i#1 ← ++ (byte) main::i#3
to:main::@3
main::@5: scope:[main] from main::@3
(byte*) main::screen#18 ← phi( main::@3/(byte*) main::screen#10 )
(byte*) main::screen#0 ← (const byte*) main::SCREEN
(byte) main::i1#0 ← (byte) 0
to:main::@9
main::@9: scope:[main] from main::@16 main::@5
(byte*) main::screen#11 ← phi( main::@16/(byte*) main::screen#17 main::@5/(byte*) main::screen#18 )
(byte*) main::screen#8 ← phi( main::@16/(byte*) main::screen#13 main::@5/(byte*) main::screen#0 )
(byte) main::i1#2 ← phi( main::@16/(byte) main::i1#1 main::@5/(byte) main::i1#0 )
(bool~) main::$3 ← (byte) main::i1#2 <= (number) 9
if((bool~) main::$3) goto main::@10
(bool~) main::$2 ← (byte) main::i1#2 <= (number) 9
if((bool~) main::$2) goto main::@10
to:main::@return
main::@10: scope:[main] from main::@9
(byte) main::i1#3 ← phi( main::@9/(byte) main::i1#2 )
(byte*) main::screen#4 ← phi( main::@9/(byte*) main::screen#11 )
(byte*) main::screen#1 ← (byte*) main::screen#4 + (number) $28
(byte~) main::$4 ← (byte) '0' + (byte) main::i1#3
*((byte*) main::screen#1 + (number) 0) ← (byte~) main::$4
(bool~) main::$5 ← (byte) main::i1#3 < (number) 5
(bool~) main::$6 ← ! (bool~) main::$5
if((bool~) main::$6) goto main::@12
(byte*) main::screen#2 ← phi( main::@9/(byte*) main::screen#8 )
(byte*) main::screen#1 ← (byte*) main::screen#2 + (number) $28
(byte~) main::$3 ← (byte) '0' + (byte) main::i1#3
*((byte*) main::screen#1 + (number) 0) ← (byte~) main::$3
(bool~) main::$4 ← (byte) main::i1#3 < (number) 5
(bool~) main::$5 ← ! (bool~) main::$4
if((bool~) main::$5) goto main::@12
to:main::@19
main::@12: scope:[main] from main::@10 main::@19
(byte*) main::screen#12 ← phi( main::@10/(byte*) main::screen#1 main::@19/(byte*) main::screen#5 )
(byte*) main::screen#9 ← phi( main::@10/(byte*) main::screen#1 main::@19/(byte*) main::screen#3 )
(byte) main::i1#4 ← phi( main::@10/(byte) main::i1#3 main::@19/(byte) main::i1#9 )
(bool~) main::$7 ← (byte) main::i1#4 <= (number) 5
(bool~) main::$8 ← ! (bool~) main::$7
if((bool~) main::$8) goto main::@13
(bool~) main::$6 ← (byte) main::i1#4 <= (number) 5
(bool~) main::$7 ← ! (bool~) main::$6
if((bool~) main::$7) goto main::@13
to:main::@20
main::@19: scope:[main] from main::@10
(byte) main::i1#9 ← phi( main::@10/(byte) main::i1#3 )
(byte*) main::screen#5 ← phi( main::@10/(byte*) main::screen#1 )
*((byte*) main::screen#5 + (number) 2) ← (byte) '+'
(byte*) main::screen#3 ← phi( main::@10/(byte*) main::screen#1 )
*((byte*) main::screen#3 + (number) 2) ← (byte) '+'
to:main::@12
main::@13: scope:[main] from main::@12 main::@20
(byte*) main::screen#13 ← phi( main::@12/(byte*) main::screen#12 main::@20/(byte*) main::screen#6 )
(byte*) main::screen#10 ← phi( main::@12/(byte*) main::screen#9 main::@20/(byte*) main::screen#4 )
(byte) main::i1#5 ← phi( main::@12/(byte) main::i1#4 main::@20/(byte) main::i1#10 )
(bool~) main::$9 ← (byte) main::i1#5 == (number) 5
(bool~) main::$10 ← ! (bool~) main::$9
if((bool~) main::$10) goto main::@14
(bool~) main::$8 ← (byte) main::i1#5 == (number) 5
(bool~) main::$9 ← ! (bool~) main::$8
if((bool~) main::$9) goto main::@14
to:main::@21
main::@20: scope:[main] from main::@12
(byte) main::i1#10 ← phi( main::@12/(byte) main::i1#4 )
(byte*) main::screen#6 ← phi( main::@12/(byte*) main::screen#12 )
*((byte*) main::screen#6 + (number) 5) ← (byte) '+'
(byte*) main::screen#4 ← phi( main::@12/(byte*) main::screen#9 )
*((byte*) main::screen#4 + (number) 5) ← (byte) '+'
to:main::@13
main::@14: scope:[main] from main::@13 main::@21
(byte*) main::screen#14 ← phi( main::@13/(byte*) main::screen#13 main::@21/(byte*) main::screen#7 )
(byte*) main::screen#11 ← phi( main::@13/(byte*) main::screen#10 main::@21/(byte*) main::screen#5 )
(byte) main::i1#6 ← phi( main::@13/(byte) main::i1#5 main::@21/(byte) main::i1#11 )
(bool~) main::$11 ← (byte) main::i1#6 >= (number) 5
(bool~) main::$12 ← ! (bool~) main::$11
if((bool~) main::$12) goto main::@15
(bool~) main::$10 ← (byte) main::i1#6 >= (number) 5
(bool~) main::$11 ← ! (bool~) main::$10
if((bool~) main::$11) goto main::@15
to:main::@22
main::@21: scope:[main] from main::@13
(byte) main::i1#11 ← phi( main::@13/(byte) main::i1#5 )
(byte*) main::screen#7 ← phi( main::@13/(byte*) main::screen#13 )
*((byte*) main::screen#7 + (number) 8) ← (byte) '+'
(byte*) main::screen#5 ← phi( main::@13/(byte*) main::screen#10 )
*((byte*) main::screen#5 + (number) 8) ← (byte) '+'
to:main::@14
main::@15: scope:[main] from main::@14 main::@22
(byte*) main::screen#15 ← phi( main::@14/(byte*) main::screen#14 main::@22/(byte*) main::screen#8 )
(byte*) main::screen#12 ← phi( main::@14/(byte*) main::screen#11 main::@22/(byte*) main::screen#6 )
(byte) main::i1#7 ← phi( main::@14/(byte) main::i1#6 main::@22/(byte) main::i1#12 )
(bool~) main::$13 ← (byte) main::i1#7 > (number) 5
(bool~) main::$14 ← ! (bool~) main::$13
if((bool~) main::$14) goto main::@16
(bool~) main::$12 ← (byte) main::i1#7 > (number) 5
(bool~) main::$13 ← ! (bool~) main::$12
if((bool~) main::$13) goto main::@16
to:main::@23
main::@22: scope:[main] from main::@14
(byte) main::i1#12 ← phi( main::@14/(byte) main::i1#6 )
(byte*) main::screen#8 ← phi( main::@14/(byte*) main::screen#14 )
*((byte*) main::screen#8 + (number) $b) ← (byte) '+'
(byte*) main::screen#6 ← phi( main::@14/(byte*) main::screen#11 )
*((byte*) main::screen#6 + (number) $b) ← (byte) '+'
to:main::@15
main::@16: scope:[main] from main::@15 main::@23
(byte*) main::screen#17 ← phi( main::@15/(byte*) main::screen#15 main::@23/(byte*) main::screen#9 )
(byte*) main::screen#13 ← phi( main::@15/(byte*) main::screen#12 main::@23/(byte*) main::screen#7 )
(byte) main::i1#8 ← phi( main::@15/(byte) main::i1#7 main::@23/(byte) main::i1#13 )
(byte) main::i1#1 ← ++ (byte) main::i1#8
to:main::@9
main::@23: scope:[main] from main::@15
(byte) main::i1#13 ← phi( main::@15/(byte) main::i1#7 )
(byte*) main::screen#9 ← phi( main::@15/(byte*) main::screen#15 )
*((byte*) main::screen#9 + (number) $e) ← (byte) '+'
(byte*) main::screen#7 ← phi( main::@15/(byte*) main::screen#12 )
*((byte*) main::screen#7 + (number) $e) ← (byte) '+'
to:main::@16
main::@return: scope:[main] from main::@9
return
@ -134,16 +128,15 @@ SYMBOL TABLE SSA
(label) @begin
(label) @end
(void()) main()
(byte*~) main::$0
(bool~) main::$0
(bool~) main::$1
(bool~) main::$10
(bool~) main::$11
(bool~) main::$12
(bool~) main::$13
(bool~) main::$14
(bool~) main::$2
(bool~) main::$3
(byte~) main::$4
(byte~) main::$3
(bool~) main::$4
(bool~) main::$5
(bool~) main::$6
(bool~) main::$7
@ -167,6 +160,7 @@ SYMBOL TABLE SSA
(label) main::@5
(label) main::@9
(label) main::@return
(const byte*) main::SCREEN = (byte*)(number) $400
(const byte*) main::header[] = (byte*) " < <= == >= >"
(byte) main::i
(byte) main::i#0
@ -199,11 +193,6 @@ SYMBOL TABLE SSA
(byte*) main::screen#11
(byte*) main::screen#12
(byte*) main::screen#13
(byte*) main::screen#14
(byte*) main::screen#15
(byte*) main::screen#16
(byte*) main::screen#17
(byte*) main::screen#18
(byte*) main::screen#2
(byte*) main::screen#3
(byte*) main::screen#4
@ -213,21 +202,21 @@ SYMBOL TABLE SSA
(byte*) main::screen#8
(byte*) main::screen#9
Adding number conversion cast (unumber) $3e8 in (byte*~) main::$0 ← (byte*) main::screen#0 + (number) $3e8
Adding number conversion cast (unumber) 0 in (bool~) main::$2 ← *((const byte*) main::header + (byte) main::i#2) != (number) 0
Adding number conversion cast (unumber) 9 in (bool~) main::$3 ← (byte) main::i1#2 <= (number) 9
Adding number conversion cast (unumber) $28 in (byte*) main::screen#1 ← (byte*) main::screen#4 + (number) $28
Adding number conversion cast (unumber) 0 in *((byte*) main::screen#1 + (number) 0) ← (byte~) main::$4
Adding number conversion cast (unumber) 5 in (bool~) main::$5 ← (byte) main::i1#3 < (number) 5
Adding number conversion cast (unumber) 5 in (bool~) main::$7 ← (byte) main::i1#4 <= (number) 5
Adding number conversion cast (unumber) 2 in *((byte*) main::screen#5 + (number) 2) ← (byte) '+'
Adding number conversion cast (unumber) 5 in (bool~) main::$9 ← (byte) main::i1#5 == (number) 5
Adding number conversion cast (unumber) 5 in *((byte*) main::screen#6 + (number) 5) ← (byte) '+'
Adding number conversion cast (unumber) 5 in (bool~) main::$11 ← (byte) main::i1#6 >= (number) 5
Adding number conversion cast (unumber) 8 in *((byte*) main::screen#7 + (number) 8) ← (byte) '+'
Adding number conversion cast (unumber) 5 in (bool~) main::$13 ← (byte) main::i1#7 > (number) 5
Adding number conversion cast (unumber) $b in *((byte*) main::screen#8 + (number) $b) ← (byte) '+'
Adding number conversion cast (unumber) $e in *((byte*) main::screen#9 + (number) $e) ← (byte) '+'
Adding number conversion cast (unumber) $3e8 in (byte*) main::sc#1 ← (byte*) main::sc#2 + rangenext(main::SCREEN,main::SCREEN+$3e8)
Adding number conversion cast (unumber) 0 in (bool~) main::$1 ← *((const byte*) main::header + (byte) main::i#2) != (number) 0
Adding number conversion cast (unumber) 9 in (bool~) main::$2 ← (byte) main::i1#2 <= (number) 9
Adding number conversion cast (unumber) $28 in (byte*) main::screen#1 ← (byte*) main::screen#2 + (number) $28
Adding number conversion cast (unumber) 0 in *((byte*) main::screen#1 + (number) 0) ← (byte~) main::$3
Adding number conversion cast (unumber) 5 in (bool~) main::$4 ← (byte) main::i1#3 < (number) 5
Adding number conversion cast (unumber) 5 in (bool~) main::$6 ← (byte) main::i1#4 <= (number) 5
Adding number conversion cast (unumber) 2 in *((byte*) main::screen#3 + (number) 2) ← (byte) '+'
Adding number conversion cast (unumber) 5 in (bool~) main::$8 ← (byte) main::i1#5 == (number) 5
Adding number conversion cast (unumber) 5 in *((byte*) main::screen#4 + (number) 5) ← (byte) '+'
Adding number conversion cast (unumber) 5 in (bool~) main::$10 ← (byte) main::i1#6 >= (number) 5
Adding number conversion cast (unumber) 8 in *((byte*) main::screen#5 + (number) 8) ← (byte) '+'
Adding number conversion cast (unumber) 5 in (bool~) main::$12 ← (byte) main::i1#7 > (number) 5
Adding number conversion cast (unumber) $b in *((byte*) main::screen#6 + (number) $b) ← (byte) '+'
Adding number conversion cast (unumber) $e in *((byte*) main::screen#7 + (number) $e) ← (byte) '+'
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant pointer cast (byte*) 1024
Simplifying constant integer cast $3e8
@ -262,52 +251,50 @@ Finalized unsigned number type (byte) 5
Finalized unsigned number type (byte) $b
Finalized unsigned number type (byte) $e
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inversing boolean not [26] (bool~) main::$6 ← (byte) main::i1#3 >= (byte) 5 from [25] (bool~) main::$5 ← (byte) main::i1#3 < (byte) 5
Inversing boolean not [30] (bool~) main::$8 ← (byte) main::i1#4 > (byte) 5 from [29] (bool~) main::$7 ← (byte) main::i1#4 <= (byte) 5
Inversing boolean not [36] (bool~) main::$10 ← (byte) main::i1#5 != (byte) 5 from [35] (bool~) main::$9 ← (byte) main::i1#5 == (byte) 5
Inversing boolean not [42] (bool~) main::$12 ← (byte) main::i1#6 < (byte) 5 from [41] (bool~) main::$11 ← (byte) main::i1#6 >= (byte) 5
Inversing boolean not [48] (bool~) main::$14 ← (byte) main::i1#7 <= (byte) 5 from [47] (bool~) main::$13 ← (byte) main::i1#7 > (byte) 5
Inversing boolean not [23] (bool~) main::$5 ← (byte) main::i1#3 >= (byte) 5 from [22] (bool~) main::$4 ← (byte) main::i1#3 < (byte) 5
Inversing boolean not [27] (bool~) main::$7 ← (byte) main::i1#4 > (byte) 5 from [26] (bool~) main::$6 ← (byte) main::i1#4 <= (byte) 5
Inversing boolean not [33] (bool~) main::$9 ← (byte) main::i1#5 != (byte) 5 from [32] (bool~) main::$8 ← (byte) main::i1#5 == (byte) 5
Inversing boolean not [39] (bool~) main::$11 ← (byte) main::i1#6 < (byte) 5 from [38] (bool~) main::$10 ← (byte) main::i1#6 >= (byte) 5
Inversing boolean not [45] (bool~) main::$13 ← (byte) main::i1#7 <= (byte) 5 from [44] (bool~) main::$12 ← (byte) main::i1#7 > (byte) 5
Successful SSA optimization Pass2UnaryNotSimplification
Alias (byte*) main::sc#0 = (byte*) main::screen#0
Alias (byte*) main::screen#16 = (byte*) main::screen#2
Alias (byte) main::i#2 = (byte) main::i#3
Alias (byte*) main::screen#10 = (byte*) main::screen#3 (byte*) main::screen#18
Alias (byte*) main::screen#11 = (byte*) main::screen#4
Alias (byte*) main::screen#2 = (byte*) main::screen#8
Alias (byte) main::i1#2 = (byte) main::i1#3 (byte) main::i1#9
Alias (byte*) main::screen#1 = (byte*) main::screen#5
Alias (byte*) main::screen#12 = (byte*) main::screen#6
Alias (byte*) main::screen#1 = (byte*) main::screen#3
Alias (byte*) main::screen#4 = (byte*) main::screen#9
Alias (byte) main::i1#10 = (byte) main::i1#4
Alias (byte*) main::screen#13 = (byte*) main::screen#7
Alias (byte*) main::screen#10 = (byte*) main::screen#5
Alias (byte) main::i1#11 = (byte) main::i1#5
Alias (byte*) main::screen#14 = (byte*) main::screen#8
Alias (byte*) main::screen#11 = (byte*) main::screen#6
Alias (byte) main::i1#12 = (byte) main::i1#6
Alias (byte*) main::screen#15 = (byte*) main::screen#9
Alias (byte*) main::screen#12 = (byte*) main::screen#7
Alias (byte) main::i1#13 = (byte) main::i1#7
Successful SSA optimization Pass2AliasElimination
Alias (byte) main::i1#10 = (byte) main::i1#2 (byte) main::i1#11 (byte) main::i1#12 (byte) main::i1#13 (byte) main::i1#8
Alias (byte*) main::screen#1 = (byte*) main::screen#12 (byte*) main::screen#13 (byte*) main::screen#14 (byte*) main::screen#15 (byte*) main::screen#17
Alias (byte*) main::screen#1 = (byte*) main::screen#4 (byte*) main::screen#10 (byte*) main::screen#11 (byte*) main::screen#12 (byte*) main::screen#13
Successful SSA optimization Pass2AliasElimination
Identical Phi Values (byte*) main::screen#16 (byte*) main::sc#0
Identical Phi Values (byte*) main::screen#10 (byte*) main::screen#16
Successful SSA optimization Pass2IdenticalPhiElimination
Simple Condition (bool~) main::$1 [7] if((byte*) main::sc#1!=rangelast(main::sc#0,main::$0)) goto main::@1
Simple Condition (bool~) main::$2 [12] if(*((const byte*) main::header + (byte) main::i#2)!=(byte) 0) goto main::@4
Simple Condition (bool~) main::$3 [20] if((byte) main::i1#10<=(byte) 9) goto main::@10
Simple Condition (bool~) main::$6 [27] if((byte) main::i1#10>=(byte) 5) goto main::@12
Simple Condition (bool~) main::$8 [31] if((byte) main::i1#10>(byte) 5) goto main::@13
Simple Condition (bool~) main::$10 [37] if((byte) main::i1#10!=(byte) 5) goto main::@14
Simple Condition (bool~) main::$12 [43] if((byte) main::i1#10<(byte) 5) goto main::@15
Simple Condition (bool~) main::$14 [49] if((byte) main::i1#10<=(byte) 5) goto main::@16
Simple Condition (bool~) main::$0 [5] if((byte*) main::sc#1!=rangelast(main::SCREEN,main::SCREEN+$3e8)) goto main::@1
Simple Condition (bool~) main::$1 [9] if(*((const byte*) main::header + (byte) main::i#2)!=(byte) 0) goto main::@4
Simple Condition (bool~) main::$2 [17] if((byte) main::i1#10<=(byte) 9) goto main::@10
Simple Condition (bool~) main::$5 [24] if((byte) main::i1#10>=(byte) 5) goto main::@12
Simple Condition (bool~) main::$7 [28] if((byte) main::i1#10>(byte) 5) goto main::@13
Simple Condition (bool~) main::$9 [34] if((byte) main::i1#10!=(byte) 5) goto main::@14
Simple Condition (bool~) main::$11 [40] if((byte) main::i1#10<(byte) 5) goto main::@15
Simple Condition (bool~) main::$13 [46] if((byte) main::i1#10<=(byte) 5) goto main::@16
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte*) main::sc#0 = (byte*) 1024
Constant (const byte*) main::sc#0 = main::SCREEN
Constant (const byte) main::i#0 = 0
Constant (const byte*) main::screen#0 = main::SCREEN
Constant (const byte) main::i1#0 = 0
Successful SSA optimization Pass2ConstantIdentification
Rewriting conditional comparison [20] if((byte) main::i1#10<=(byte) 9) goto main::@10
Rewriting conditional comparison [31] if((byte) main::i1#10>(byte) 5) goto main::@13
Rewriting conditional comparison [49] if((byte) main::i1#10<=(byte) 5) goto main::@16
Simplifying expression containing zero main::screen#1 in [24] *((byte*) main::screen#1 + (byte) 0) ← (byte~) main::$4
Resolved ranged next value [3] main::sc#1 ← ++ main::sc#2 to ++
Resolved ranged comparison value [5] if(main::sc#1!=rangelast(main::SCREEN,main::SCREEN+$3e8)) goto main::@1 to (byte*)(const byte*) main::SCREEN+(word) $3e8+(number) 1
Rewriting conditional comparison [17] if((byte) main::i1#10<=(byte) 9) goto main::@10
Rewriting conditional comparison [28] if((byte) main::i1#10>(byte) 5) goto main::@13
Rewriting conditional comparison [46] if((byte) main::i1#10<=(byte) 5) goto main::@16
Simplifying expression containing zero main::screen#1 in [21] *((byte*) main::screen#1 + (byte) 0) ← (byte~) main::$3
Successful SSA optimization PassNSimplifyExpressionWithZero
Adding number conversion cast (unumber) 1 in if((byte*) main::sc#1!=(byte*)(const byte*) main::SCREEN+(word) $3e8+(number) 1) goto main::@1
Adding number conversion cast (unumber) 9+1 in if((byte) main::i1#10<(byte) 9+(number) 1) goto main::@10
Adding number conversion cast (unumber) 1 in if((byte) main::i1#10<(unumber)(byte) 9+(number) 1) goto main::@10
Adding number conversion cast (unumber) 5+1 in if((byte) main::i1#10>=(byte) 5+(number) 1) goto main::@13
@ -315,6 +302,8 @@ Adding number conversion cast (unumber) 1 in if((byte) main::i1#10>=(unumber)(by
Adding number conversion cast (unumber) 5+1 in if((byte) main::i1#10<(byte) 5+(number) 1) goto main::@16
Adding number conversion cast (unumber) 1 in if((byte) main::i1#10<(unumber)(byte) 5+(number) 1) goto main::@16
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant integer cast (const byte*) main::SCREEN+(word) $3e8+(unumber)(number) 1
Simplifying constant integer cast 1
Simplifying constant integer cast (byte) 9+(unumber)(number) 1
Simplifying constant integer cast 1
Simplifying constant integer cast (byte) 5+(unumber)(number) 1
@ -325,27 +314,16 @@ Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) 1
Successful SSA optimization PassNFinalizeNumberTypeConversions
Constant right-side identified [0] (byte*~) main::$0 ← (const byte*) main::sc#0 + (word) $3e8
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant (const byte*) main::$0 = main::sc#0+$3e8
Successful SSA optimization Pass2ConstantIdentification
Resolved ranged next value [3] main::sc#1 ← ++ main::sc#2 to ++
Resolved ranged comparison value [4] if(main::sc#1!=rangelast(main::sc#0,main::$0)) goto main::@1 to (byte*)(const byte*) main::$0+(number) 1
Adding number conversion cast (unumber) 1 in if((byte*) main::sc#1!=(byte*)(const byte*) main::$0+(number) 1) goto main::@1
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant integer cast (const byte*) main::$0+(unumber)(number) 1
Simplifying constant integer cast 1
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (byte) 1
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inlining constant with var siblings (const byte*) main::sc#0
Inlining constant with var siblings (const byte) main::i#0
Inlining constant with var siblings (const byte*) main::screen#0
Inlining constant with var siblings (const byte) main::i1#0
Constant inlined main::screen#0 = (const byte*) main::SCREEN
Constant inlined main::i#0 = (byte) 0
Constant inlined main::i1#0 = (byte) 0
Constant inlined main::sc#0 = (byte*) 1024
Constant inlined main::$0 = (byte*) 1024+(word) $3e8
Constant inlined main::sc#0 = (const byte*) main::SCREEN
Successful SSA optimization Pass2ConstantInlining
Added new block during phi lifting main::@25(between main::@1 and main::@1)
Adding NOP phi() at start of @begin
@ -360,7 +338,7 @@ Calls in [] to main:2
Created 4 initial phi equivalence classes
Coalesced [31] main::i1#14 ← main::i1#1
Coalesced [32] main::screen#19 ← main::screen#1
Coalesced [32] main::screen#14 ← main::screen#1
Coalesced [35] main::i#4 ← main::i#1
Coalesced [36] main::sc#3 ← main::sc#1
Coalesced down to 4 phi equivalence classes
@ -403,17 +381,17 @@ main: scope:[main] from @1
[4] phi()
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte*) main::sc#2 ← phi( main/(byte*) 1024 main::@1/(byte*) main::sc#1 )
[5] (byte*) main::sc#2 ← phi( main/(const byte*) main::SCREEN main::@1/(byte*) main::sc#1 )
[6] *((byte*) main::sc#2) ← (byte) ' '
[7] (byte*) main::sc#1 ← ++ (byte*) main::sc#2
[8] if((byte*) main::sc#1!=(byte*) 1024+(word) $3e8+(byte) 1) goto main::@1
[8] if((byte*) main::sc#1!=(const byte*) main::SCREEN+(word) $3e8+(byte) 1) goto main::@1
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
[9] (byte) main::i#2 ← phi( main::@1/(byte) 0 main::@3/(byte) main::i#1 )
[10] if(*((const byte*) main::header + (byte) main::i#2)!=(byte) 0) goto main::@3
to:main::@4
main::@4: scope:[main] from main::@10 main::@2
[11] (byte*) main::screen#11 ← phi( main::@10/(byte*) main::screen#1 main::@2/(byte*) 1024 )
[11] (byte*) main::screen#2 ← phi( main::@10/(byte*) main::screen#1 main::@2/(const byte*) main::SCREEN )
[11] (byte) main::i1#10 ← phi( main::@10/(byte) main::i1#1 main::@2/(byte) 0 )
[12] if((byte) main::i1#10<(byte) 9+(byte) 1) goto main::@5
to:main::@return
@ -421,9 +399,9 @@ main::@return: scope:[main] from main::@4
[13] return
to:@return
main::@5: scope:[main] from main::@4
[14] (byte*) main::screen#1 ← (byte*) main::screen#11 + (byte) $28
[15] (byte~) main::$4 ← (byte) '0' + (byte) main::i1#10
[16] *((byte*) main::screen#1) ← (byte~) main::$4
[14] (byte*) main::screen#1 ← (byte*) main::screen#2 + (byte) $28
[15] (byte~) main::$3 ← (byte) '0' + (byte) main::i1#10
[16] *((byte*) main::screen#1) ← (byte~) main::$3
[17] if((byte) main::i1#10>=(byte) 5) goto main::@6
to:main::@11
main::@11: scope:[main] from main::@5
@ -457,14 +435,14 @@ main::@10: scope:[main] from main::@15 main::@9
[27] (byte) main::i1#1 ← ++ (byte) main::i1#10
to:main::@4
main::@3: scope:[main] from main::@2
[28] *((byte*) 1024 + (byte) main::i#2) ← *((const byte*) main::header + (byte) main::i#2)
[28] *((const byte*) main::SCREEN + (byte) main::i#2) ← *((const byte*) main::header + (byte) main::i#2)
[29] (byte) main::i#1 ← ++ (byte) main::i#2
to:main::@2
VARIABLE REGISTER WEIGHTS
(void()) main()
(byte~) main::$4 22.0
(byte~) main::$3 22.0
(byte) main::i
(byte) main::i#1 22.0
(byte) main::i#2 18.333333333333332
@ -476,25 +454,25 @@ VARIABLE REGISTER WEIGHTS
(byte*) main::sc#2 16.5
(byte*) main::screen
(byte*) main::screen#1 6.285714285714286
(byte*) main::screen#11 11.0
(byte*) main::screen#2 11.0
Initial phi equivalence classes
[ main::sc#2 main::sc#1 ]
[ main::i#2 main::i#1 ]
[ main::i1#10 main::i1#1 ]
[ main::screen#11 main::screen#1 ]
Added variable main::$4 to live range equivalence class [ main::$4 ]
[ main::screen#2 main::screen#1 ]
Added variable main::$3 to live range equivalence class [ main::$3 ]
Complete equivalence classes
[ main::sc#2 main::sc#1 ]
[ main::i#2 main::i#1 ]
[ main::i1#10 main::i1#1 ]
[ main::screen#11 main::screen#1 ]
[ main::$4 ]
[ main::screen#2 main::screen#1 ]
[ main::$3 ]
Allocated zp[2]:2 [ main::sc#2 main::sc#1 ]
Allocated zp[1]:4 [ main::i#2 main::i#1 ]
Allocated zp[1]:5 [ main::i1#10 main::i1#1 ]
Allocated zp[2]:6 [ main::screen#11 main::screen#1 ]
Allocated zp[1]:8 [ main::$4 ]
Allocated zp[2]:6 [ main::screen#2 main::screen#1 ]
Allocated zp[1]:8 [ main::$3 ]
INITIAL ASM
Target platform is c64basic / MOS6502X
@ -523,17 +501,18 @@ __bend_from___b1:
__bend:
// main
main: {
.label __4 = 8
.label SCREEN = $400
.label __3 = 8
.label sc = 2
.label i = 4
.label screen = 6
.label i1 = 5
// [5] phi from main to main::@1 [phi:main->main::@1]
__b1_from_main:
// [5] phi (byte*) main::sc#2 = (byte*) 1024 [phi:main->main::@1#0] -- pbuz1=pbuc1
lda #<$400
// [5] phi (byte*) main::sc#2 = (const byte*) main::SCREEN [phi:main->main::@1#0] -- pbuz1=pbuc1
lda #<SCREEN
sta.z sc
lda #>$400
lda #>SCREEN
sta.z sc+1
jmp __b1
// [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
@ -551,12 +530,12 @@ main: {
bne !+
inc.z sc+1
!:
// [8] if((byte*) main::sc#1!=(byte*) 1024+(word) $3e8+(byte) 1) goto main::@1 -- pbuz1_neq_pbuc1_then_la1
// [8] if((byte*) main::sc#1!=(const byte*) main::SCREEN+(word) $3e8+(byte) 1) goto main::@1 -- pbuz1_neq_pbuc1_then_la1
lda.z sc+1
cmp #>$400+$3e8+1
cmp #>SCREEN+$3e8+1
bne __b1_from___b1
lda.z sc
cmp #<$400+$3e8+1
cmp #<SCREEN+$3e8+1
bne __b1_from___b1
// [9] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
__b2_from___b1:
@ -573,10 +552,10 @@ main: {
bne __b3
// [11] phi from main::@2 to main::@4 [phi:main::@2->main::@4]
__b4_from___b2:
// [11] phi (byte*) main::screen#11 = (byte*) 1024 [phi:main::@2->main::@4#0] -- pbuz1=pbuc1
lda #<$400
// [11] phi (byte*) main::screen#2 = (const byte*) main::SCREEN [phi:main::@2->main::@4#0] -- pbuz1=pbuc1
lda #<SCREEN
sta.z screen
lda #>$400
lda #>SCREEN
sta.z screen+1
// [11] phi (byte) main::i1#10 = (byte) 0 [phi:main::@2->main::@4#1] -- vbuz1=vbuc1
lda #0
@ -595,7 +574,7 @@ main: {
rts
// main::@5
__b5:
// [14] (byte*) main::screen#1 ← (byte*) main::screen#11 + (byte) $28 -- pbuz1=pbuz1_plus_vbuc1
// [14] (byte*) main::screen#1 ← (byte*) main::screen#2 + (byte) $28 -- pbuz1=pbuz1_plus_vbuc1
lda #$28
clc
adc.z screen
@ -603,12 +582,12 @@ main: {
bcc !+
inc.z screen+1
!:
// [15] (byte~) main::$4 ← (byte) '0' + (byte) main::i1#10 -- vbuz1=vbuc1_plus_vbuz2
// [15] (byte~) main::$3 ← (byte) '0' + (byte) main::i1#10 -- vbuz1=vbuc1_plus_vbuz2
lax.z i1
axs #-['0']
stx.z __4
// [16] *((byte*) main::screen#1) ← (byte~) main::$4 -- _deref_pbuz1=vbuz2
lda.z __4
stx.z __3
// [16] *((byte*) main::screen#1) ← (byte~) main::$3 -- _deref_pbuz1=vbuz2
lda.z __3
ldy #0
sta (screen),y
// [17] if((byte) main::i1#10>=(byte) 5) goto main::@6 -- vbuz1_ge_vbuc1_then_la1
@ -685,15 +664,15 @@ main: {
inc.z i1
// [11] phi from main::@10 to main::@4 [phi:main::@10->main::@4]
__b4_from___b10:
// [11] phi (byte*) main::screen#11 = (byte*) main::screen#1 [phi:main::@10->main::@4#0] -- register_copy
// [11] phi (byte*) main::screen#2 = (byte*) main::screen#1 [phi:main::@10->main::@4#0] -- register_copy
// [11] phi (byte) main::i1#10 = (byte) main::i1#1 [phi:main::@10->main::@4#1] -- register_copy
jmp __b4
// main::@3
__b3:
// [28] *((byte*) 1024 + (byte) main::i#2) ← *((const byte*) main::header + (byte) main::i#2) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz1
// [28] *((const byte*) main::SCREEN + (byte) main::i#2) ← *((const byte*) main::header + (byte) main::i#2) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz1
ldy.z i
lda header,y
sta $400,y
sta SCREEN,y
// [29] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1
inc.z i
// [9] phi from main::@3 to main::@2 [phi:main::@3->main::@2]
@ -707,45 +686,45 @@ main: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [6] *((byte*) main::sc#2) ← (byte) ' ' [ main::sc#2 ] ( main:2 [ main::sc#2 ] ) always clobbers reg byte a reg byte y
Statement [8] if((byte*) main::sc#1!=(byte*) 1024+(word) $3e8+(byte) 1) goto main::@1 [ main::sc#1 ] ( main:2 [ main::sc#1 ] ) always clobbers reg byte a
Statement [8] if((byte*) main::sc#1!=(const byte*) main::SCREEN+(word) $3e8+(byte) 1) goto main::@1 [ main::sc#1 ] ( main:2 [ main::sc#1 ] ) always clobbers reg byte a
Statement [10] if(*((const byte*) main::header + (byte) main::i#2)!=(byte) 0) goto main::@3 [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:4 [ main::i#2 main::i#1 ]
Statement [14] (byte*) main::screen#1 ← (byte*) main::screen#11 + (byte) $28 [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte a
Statement [14] (byte*) main::screen#1 ← (byte*) main::screen#2 + (byte) $28 [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:5 [ main::i1#10 main::i1#1 ]
Statement [15] (byte~) main::$4 ← (byte) '0' + (byte) main::i1#10 [ main::i1#10 main::screen#1 main::$4 ] ( main:2 [ main::i1#10 main::screen#1 main::$4 ] ) always clobbers reg byte a
Statement [16] *((byte*) main::screen#1) ← (byte~) main::$4 [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte y
Statement [15] (byte~) main::$3 ← (byte) '0' + (byte) main::i1#10 [ main::i1#10 main::screen#1 main::$3 ] ( main:2 [ main::i1#10 main::screen#1 main::$3 ] ) always clobbers reg byte a
Statement [16] *((byte*) main::screen#1) ← (byte~) main::$3 [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:5 [ main::i1#10 main::i1#1 ]
Statement [18] *((byte*) main::screen#1 + (byte) 2) ← (byte) '+' [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte a reg byte y
Statement [20] *((byte*) main::screen#1 + (byte) 5) ← (byte) '+' [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte a reg byte y
Statement [22] *((byte*) main::screen#1 + (byte) 8) ← (byte) '+' [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte a reg byte y
Statement [24] *((byte*) main::screen#1 + (byte) $b) ← (byte) '+' [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte a reg byte y
Statement [26] *((byte*) main::screen#1 + (byte) $e) ← (byte) '+' [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte a reg byte y
Statement [28] *((byte*) 1024 + (byte) main::i#2) ← *((const byte*) main::header + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [28] *((const byte*) main::SCREEN + (byte) main::i#2) ← *((const byte*) main::header + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [6] *((byte*) main::sc#2) ← (byte) ' ' [ main::sc#2 ] ( main:2 [ main::sc#2 ] ) always clobbers reg byte a reg byte y
Statement [8] if((byte*) main::sc#1!=(byte*) 1024+(word) $3e8+(byte) 1) goto main::@1 [ main::sc#1 ] ( main:2 [ main::sc#1 ] ) always clobbers reg byte a
Statement [8] if((byte*) main::sc#1!=(const byte*) main::SCREEN+(word) $3e8+(byte) 1) goto main::@1 [ main::sc#1 ] ( main:2 [ main::sc#1 ] ) always clobbers reg byte a
Statement [10] if(*((const byte*) main::header + (byte) main::i#2)!=(byte) 0) goto main::@3 [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [14] (byte*) main::screen#1 ← (byte*) main::screen#11 + (byte) $28 [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte a
Statement [15] (byte~) main::$4 ← (byte) '0' + (byte) main::i1#10 [ main::i1#10 main::screen#1 main::$4 ] ( main:2 [ main::i1#10 main::screen#1 main::$4 ] ) always clobbers reg byte a
Statement [16] *((byte*) main::screen#1) ← (byte~) main::$4 [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte y
Statement [14] (byte*) main::screen#1 ← (byte*) main::screen#2 + (byte) $28 [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte a
Statement [15] (byte~) main::$3 ← (byte) '0' + (byte) main::i1#10 [ main::i1#10 main::screen#1 main::$3 ] ( main:2 [ main::i1#10 main::screen#1 main::$3 ] ) always clobbers reg byte a
Statement [16] *((byte*) main::screen#1) ← (byte~) main::$3 [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte y
Statement [18] *((byte*) main::screen#1 + (byte) 2) ← (byte) '+' [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte a reg byte y
Statement [20] *((byte*) main::screen#1 + (byte) 5) ← (byte) '+' [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte a reg byte y
Statement [22] *((byte*) main::screen#1 + (byte) 8) ← (byte) '+' [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte a reg byte y
Statement [24] *((byte*) main::screen#1 + (byte) $b) ← (byte) '+' [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte a reg byte y
Statement [26] *((byte*) main::screen#1 + (byte) $e) ← (byte) '+' [ main::i1#10 main::screen#1 ] ( main:2 [ main::i1#10 main::screen#1 ] ) always clobbers reg byte a reg byte y
Statement [28] *((byte*) 1024 + (byte) main::i#2) ← *((const byte*) main::header + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [28] *((const byte*) main::SCREEN + (byte) main::i#2) ← *((const byte*) main::header + (byte) main::i#2) [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Potential registers zp[2]:2 [ main::sc#2 main::sc#1 ] : zp[2]:2 ,
Potential registers zp[1]:4 [ main::i#2 main::i#1 ] : zp[1]:4 , reg byte x , reg byte y ,
Potential registers zp[1]:5 [ main::i1#10 main::i1#1 ] : zp[1]:5 , reg byte x ,
Potential registers zp[2]:6 [ main::screen#11 main::screen#1 ] : zp[2]:6 ,
Potential registers zp[1]:8 [ main::$4 ] : zp[1]:8 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[2]:6 [ main::screen#2 main::screen#1 ] : zp[2]:6 ,
Potential registers zp[1]:8 [ main::$3 ] : zp[1]:8 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 40.33: zp[1]:4 [ main::i#2 main::i#1 ] 33: zp[2]:2 [ main::sc#2 main::sc#1 ] 28.6: zp[1]:5 [ main::i1#10 main::i1#1 ] 22: zp[1]:8 [ main::$4 ] 17.29: zp[2]:6 [ main::screen#11 main::screen#1 ]
Uplift Scope [main] 40.33: zp[1]:4 [ main::i#2 main::i#1 ] 33: zp[2]:2 [ main::sc#2 main::sc#1 ] 28.6: zp[1]:5 [ main::i1#10 main::i1#1 ] 22: zp[1]:8 [ main::$3 ] 17.29: zp[2]:6 [ main::screen#2 main::screen#1 ]
Uplift Scope []
Uplifting [main] best 2453 combination reg byte x [ main::i#2 main::i#1 ] zp[2]:2 [ main::sc#2 main::sc#1 ] reg byte x [ main::i1#10 main::i1#1 ] reg byte a [ main::$4 ] zp[2]:6 [ main::screen#11 main::screen#1 ]
Uplifting [main] best 2453 combination reg byte x [ main::i#2 main::i#1 ] zp[2]:2 [ main::sc#2 main::sc#1 ] reg byte x [ main::i1#10 main::i1#1 ] reg byte a [ main::$3 ] zp[2]:6 [ main::screen#2 main::screen#1 ]
Uplifting [] best 2453 combination
Allocated (was zp[2]:6) zp[2]:4 [ main::screen#11 main::screen#1 ]
Allocated (was zp[2]:6) zp[2]:4 [ main::screen#2 main::screen#1 ]
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
@ -773,14 +752,15 @@ __bend_from___b1:
__bend:
// main
main: {
.label SCREEN = $400
.label sc = 2
.label screen = 4
// [5] phi from main to main::@1 [phi:main->main::@1]
__b1_from_main:
// [5] phi (byte*) main::sc#2 = (byte*) 1024 [phi:main->main::@1#0] -- pbuz1=pbuc1
lda #<$400
// [5] phi (byte*) main::sc#2 = (const byte*) main::SCREEN [phi:main->main::@1#0] -- pbuz1=pbuc1
lda #<SCREEN
sta.z sc
lda #>$400
lda #>SCREEN
sta.z sc+1
jmp __b1
// [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
@ -798,12 +778,12 @@ main: {
bne !+
inc.z sc+1
!:
// [8] if((byte*) main::sc#1!=(byte*) 1024+(word) $3e8+(byte) 1) goto main::@1 -- pbuz1_neq_pbuc1_then_la1
// [8] if((byte*) main::sc#1!=(const byte*) main::SCREEN+(word) $3e8+(byte) 1) goto main::@1 -- pbuz1_neq_pbuc1_then_la1
lda.z sc+1
cmp #>$400+$3e8+1
cmp #>SCREEN+$3e8+1
bne __b1_from___b1
lda.z sc
cmp #<$400+$3e8+1
cmp #<SCREEN+$3e8+1
bne __b1_from___b1
// [9] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
__b2_from___b1:
@ -818,10 +798,10 @@ main: {
bne __b3
// [11] phi from main::@2 to main::@4 [phi:main::@2->main::@4]
__b4_from___b2:
// [11] phi (byte*) main::screen#11 = (byte*) 1024 [phi:main::@2->main::@4#0] -- pbuz1=pbuc1
lda #<$400
// [11] phi (byte*) main::screen#2 = (const byte*) main::SCREEN [phi:main::@2->main::@4#0] -- pbuz1=pbuc1
lda #<SCREEN
sta.z screen
lda #>$400
lda #>SCREEN
sta.z screen+1
// [11] phi (byte) main::i1#10 = (byte) 0 [phi:main::@2->main::@4#1] -- vbuxx=vbuc1
ldx #0
@ -838,7 +818,7 @@ main: {
rts
// main::@5
__b5:
// [14] (byte*) main::screen#1 ← (byte*) main::screen#11 + (byte) $28 -- pbuz1=pbuz1_plus_vbuc1
// [14] (byte*) main::screen#1 ← (byte*) main::screen#2 + (byte) $28 -- pbuz1=pbuz1_plus_vbuc1
lda #$28
clc
adc.z screen
@ -846,11 +826,11 @@ main: {
bcc !+
inc.z screen+1
!:
// [15] (byte~) main::$4 ← (byte) '0' + (byte) main::i1#10 -- vbuaa=vbuc1_plus_vbuxx
// [15] (byte~) main::$3 ← (byte) '0' + (byte) main::i1#10 -- vbuaa=vbuc1_plus_vbuxx
txa
clc
adc #'0'
// [16] *((byte*) main::screen#1) ← (byte~) main::$4 -- _deref_pbuz1=vbuaa
// [16] *((byte*) main::screen#1) ← (byte~) main::$3 -- _deref_pbuz1=vbuaa
ldy #0
sta (screen),y
// [17] if((byte) main::i1#10>=(byte) 5) goto main::@6 -- vbuxx_ge_vbuc1_then_la1
@ -922,14 +902,14 @@ main: {
inx
// [11] phi from main::@10 to main::@4 [phi:main::@10->main::@4]
__b4_from___b10:
// [11] phi (byte*) main::screen#11 = (byte*) main::screen#1 [phi:main::@10->main::@4#0] -- register_copy
// [11] phi (byte*) main::screen#2 = (byte*) main::screen#1 [phi:main::@10->main::@4#0] -- register_copy
// [11] phi (byte) main::i1#10 = (byte) main::i1#1 [phi:main::@10->main::@4#1] -- register_copy
jmp __b4
// main::@3
__b3:
// [28] *((byte*) 1024 + (byte) main::i#2) ← *((const byte*) main::header + (byte) main::i#2) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
// [28] *((const byte*) main::SCREEN + (byte) main::i#2) ← *((const byte*) main::header + (byte) main::i#2) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda header,x
sta $400,x
sta SCREEN,x
// [29] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuxx=_inc_vbuxx
inx
// [9] phi from main::@3 to main::@2 [phi:main::@3->main::@2]
@ -994,7 +974,7 @@ FINAL SYMBOL TABLE
(label) @begin
(label) @end
(void()) main()
(byte~) main::$4 reg byte a 22.0
(byte~) main::$3 reg byte a 22.0
(label) main::@1
(label) main::@10
(label) main::@11
@ -1011,6 +991,7 @@ FINAL SYMBOL TABLE
(label) main::@8
(label) main::@9
(label) main::@return
(const byte*) main::SCREEN = (byte*) 1024
(const byte*) main::header[] = (byte*) " < <= == >= >"
(byte) main::i
(byte) main::i#1 reg byte x 22.0
@ -1023,13 +1004,13 @@ FINAL SYMBOL TABLE
(byte*) main::sc#2 sc zp[2]:2 16.5
(byte*) main::screen
(byte*) main::screen#1 screen zp[2]:4 6.285714285714286
(byte*) main::screen#11 screen zp[2]:4 11.0
(byte*) main::screen#2 screen zp[2]:4 11.0
zp[2]:2 [ main::sc#2 main::sc#1 ]
reg byte x [ main::i#2 main::i#1 ]
reg byte x [ main::i1#10 main::i1#1 ]
zp[2]:4 [ main::screen#11 main::screen#1 ]
reg byte a [ main::$4 ]
zp[2]:4 [ main::screen#2 main::screen#1 ]
reg byte a [ main::$3 ]
FINAL ASSEMBLER
@ -1051,13 +1032,14 @@ Score: 1991
// @end
// main
main: {
.label SCREEN = $400
.label sc = 2
.label screen = 4
// [5] phi from main to main::@1 [phi:main->main::@1]
// [5] phi (byte*) main::sc#2 = (byte*) 1024 [phi:main->main::@1#0] -- pbuz1=pbuc1
lda #<$400
// [5] phi (byte*) main::sc#2 = (const byte*) main::SCREEN [phi:main->main::@1#0] -- pbuz1=pbuc1
lda #<SCREEN
sta.z sc
lda #>$400
lda #>SCREEN
sta.z sc+1
// [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
// [5] phi (byte*) main::sc#2 = (byte*) main::sc#1 [phi:main::@1->main::@1#0] -- register_copy
@ -1068,18 +1050,18 @@ main: {
lda #' '
ldy #0
sta (sc),y
// for(byte* sc : screen..screen+1000)
// for(byte* sc : SCREEN..SCREEN+1000)
// [7] (byte*) main::sc#1 ← ++ (byte*) main::sc#2 -- pbuz1=_inc_pbuz1
inc.z sc
bne !+
inc.z sc+1
!:
// [8] if((byte*) main::sc#1!=(byte*) 1024+(word) $3e8+(byte) 1) goto main::@1 -- pbuz1_neq_pbuc1_then_la1
// [8] if((byte*) main::sc#1!=(const byte*) main::SCREEN+(word) $3e8+(byte) 1) goto main::@1 -- pbuz1_neq_pbuc1_then_la1
lda.z sc+1
cmp #>$400+$3e8+1
cmp #>SCREEN+$3e8+1
bne __b1
lda.z sc
cmp #<$400+$3e8+1
cmp #<SCREEN+$3e8+1
bne __b1
// [9] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
// [9] phi (byte) main::i#2 = (byte) 0 [phi:main::@1->main::@2#0] -- vbuxx=vbuc1
@ -1092,10 +1074,10 @@ main: {
cmp #0
bne __b3
// [11] phi from main::@2 to main::@4 [phi:main::@2->main::@4]
// [11] phi (byte*) main::screen#11 = (byte*) 1024 [phi:main::@2->main::@4#0] -- pbuz1=pbuc1
lda #<$400
// [11] phi (byte*) main::screen#2 = (const byte*) main::SCREEN [phi:main::@2->main::@4#0] -- pbuz1=pbuc1
lda #<SCREEN
sta.z screen
lda #>$400
lda #>SCREEN
sta.z screen+1
// [11] phi (byte) main::i1#10 = (byte) 0 [phi:main::@2->main::@4#1] -- vbuxx=vbuc1
ldx #0
@ -1112,7 +1094,7 @@ main: {
// main::@5
__b5:
// screen +=40
// [14] (byte*) main::screen#1 ← (byte*) main::screen#11 + (byte) $28 -- pbuz1=pbuz1_plus_vbuc1
// [14] (byte*) main::screen#1 ← (byte*) main::screen#2 + (byte) $28 -- pbuz1=pbuz1_plus_vbuc1
lda #$28
clc
adc.z screen
@ -1121,12 +1103,12 @@ main: {
inc.z screen+1
!:
// '0'+i
// [15] (byte~) main::$4 ← (byte) '0' + (byte) main::i1#10 -- vbuaa=vbuc1_plus_vbuxx
// [15] (byte~) main::$3 ← (byte) '0' + (byte) main::i1#10 -- vbuaa=vbuc1_plus_vbuxx
txa
clc
adc #'0'
// screen[0] = '0'+i
// [16] *((byte*) main::screen#1) ← (byte~) main::$4 -- _deref_pbuz1=vbuaa
// [16] *((byte*) main::screen#1) ← (byte~) main::$3 -- _deref_pbuz1=vbuaa
ldy #0
sta (screen),y
// if(i<5)
@ -1193,15 +1175,15 @@ main: {
// [27] (byte) main::i1#1 ← ++ (byte) main::i1#10 -- vbuxx=_inc_vbuxx
inx
// [11] phi from main::@10 to main::@4 [phi:main::@10->main::@4]
// [11] phi (byte*) main::screen#11 = (byte*) main::screen#1 [phi:main::@10->main::@4#0] -- register_copy
// [11] phi (byte*) main::screen#2 = (byte*) main::screen#1 [phi:main::@10->main::@4#0] -- register_copy
// [11] phi (byte) main::i1#10 = (byte) main::i1#1 [phi:main::@10->main::@4#1] -- register_copy
jmp __b4
// main::@3
__b3:
// screen[i] = header[i]
// [28] *((byte*) 1024 + (byte) main::i#2) ← *((const byte*) main::header + (byte) main::i#2) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
// SCREEN[i] = header[i]
// [28] *((const byte*) main::SCREEN + (byte) main::i#2) ← *((const byte*) main::header + (byte) main::i#2) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda header,x
sta $400,x
sta SCREEN,x
// for( byte i=0; header[i]!=0; i++)
// [29] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuxx=_inc_vbuxx
inx

View File

@ -2,7 +2,7 @@
(label) @begin
(label) @end
(void()) main()
(byte~) main::$4 reg byte a 22.0
(byte~) main::$3 reg byte a 22.0
(label) main::@1
(label) main::@10
(label) main::@11
@ -19,6 +19,7 @@
(label) main::@8
(label) main::@9
(label) main::@return
(const byte*) main::SCREEN = (byte*) 1024
(const byte*) main::header[] = (byte*) " < <= == >= >"
(byte) main::i
(byte) main::i#1 reg byte x 22.0
@ -31,10 +32,10 @@
(byte*) main::sc#2 sc zp[2]:2 16.5
(byte*) main::screen
(byte*) main::screen#1 screen zp[2]:4 6.285714285714286
(byte*) main::screen#11 screen zp[2]:4 11.0
(byte*) main::screen#2 screen zp[2]:4 11.0
zp[2]:2 [ main::sc#2 main::sc#1 ]
reg byte x [ main::i#2 main::i#1 ]
reg byte x [ main::i1#10 main::i1#1 ]
zp[2]:4 [ main::screen#11 main::screen#1 ]
reg byte a [ main::$4 ]
zp[2]:4 [ main::screen#2 main::screen#1 ]
reg byte a [ main::$3 ]

View File

@ -3121,7 +3121,6 @@ Simplifying expression containing zero renderBobCleanup::screen#0 in [294] *((by
Simplifying expression containing zero PROTO_BOB in [411] *((const byte*) PROTO_BOB + (byte) 0) ← (byte) 0
Successful SSA optimization PassNSimplifyExpressionWithZero
Eliminating unused variable - keeping the phi block (byte**) renderBobCleanupNext#24
Eliminating unused variable - keeping the phi block (byte**) renderBobCleanupNext#11
Eliminating unused variable (byte) charsetFindOrAddGlyph::return#0 and assignment [159] (byte) charsetFindOrAddGlyph::return#0 ← (byte) charsetFindOrAddGlyph::glyph_id#11
Eliminating unused constant (const void*) memset::return#2
Eliminating unused constant (const byte) bob_charset_next_id#27
@ -3152,6 +3151,8 @@ Finalized unsigned number type (byte) $20
Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) 1
Successful SSA optimization PassNFinalizeNumberTypeConversions
Identical Phi Values (byte**) renderBobCleanupNext#11 (byte**) renderBobCleanupNext#13
Successful SSA optimization Pass2IdenticalPhiElimination
Constant right-side identified [0] (byte*) memset::end#0 ← (const byte*) memset::$2 + (const word) memset::num#0
Constant right-side identified [49] (byte~) main::vicSelectGfxBank1_toDd001_$1 ← > (const word) main::vicSelectGfxBank1_toDd001_$0
Constant right-side identified [53] (word~) main::toD0181_$1 ← (const word) main::toD0181_$0 & (word) $3fff

View File

@ -3329,7 +3329,6 @@ Simplifying expression containing zero renderBobCleanup::screen#0 in [361] *((by
Simplifying expression containing zero PROTO_BOB in [476] *((const byte*) PROTO_BOB + (byte) 0) ← (byte) 0
Successful SSA optimization PassNSimplifyExpressionWithZero
Eliminating unused variable - keeping the phi block (byte**) renderBobCleanupNext#24
Eliminating unused variable - keeping the phi block (byte**) renderBobCleanupNext#11
Eliminating unused variable (byte) bobCharsetFindOrAddGlyph::return#0 and assignment [199] (byte) bobCharsetFindOrAddGlyph::return#0 ← (byte) bobCharsetFindOrAddGlyph::glyph_id#11
Eliminating unused constant (const void*) memset::return#2
Eliminating unused constant (const byte) bob_charset_next_id#27
@ -3359,6 +3358,8 @@ Finalized unsigned number type (byte) $20
Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) 1
Successful SSA optimization PassNFinalizeNumberTypeConversions
Identical Phi Values (byte**) renderBobCleanupNext#11 (byte**) renderBobCleanupNext#13
Successful SSA optimization Pass2IdenticalPhiElimination
Constant right-side identified [0] (byte*) memset::end#0 ← (const byte*) memset::$2 + (const word) memset::num#0
Constant right-side identified [82] (byte~) main::vicSelectGfxBank1_toDd001_$1 ← > (const word) main::vicSelectGfxBank1_toDd001_$0
Constant right-side identified [86] (word~) main::toD0181_$1 ← (const word) main::toD0181_$0 & (word) $3fff

View File

@ -1434,10 +1434,10 @@ sprites_irq::@1: scope:[sprites_irq] from sprites_irq::@9
VARIABLE REGISTER WEIGHTS
(byte) irq_cnt loadstore 6.0
(byte) irq_raster_next loadstore 1.0
(byte) irq_sprite_ptr loadstore 1.5555555555555558
(byte) irq_sprite_ypos loadstore 14.0
(byte) irq_cnt loadstore 0.48000000000000004
(byte) irq_raster_next loadstore 0.44444444444444453
(byte) irq_sprite_ptr loadstore 0.45161290322580644
(byte) irq_sprite_ypos loadstore 0.48275862068965525
(void()) loop()
(byte~) loop::$1 202.0
(byte) loop::idx
@ -2289,20 +2289,20 @@ Removing always clobbered register reg byte a as potential for zp[1]:9 [ sprites
Statement [66] *((const byte*) SPRITES_XPOS + (byte) sprites_init::s2#0) ← (byte) sprites_init::xpos#2 [ sprites_init::s#2 sprites_init::xpos#2 ] ( main:10::sprites_init:18 [ sprites_init::s#2 sprites_init::xpos#2 ] ) always clobbers reg byte a
Statement [67] *((const byte*) SPRITES_COLS + (byte) sprites_init::s#2) ← (const byte) BLACK [ sprites_init::s#2 sprites_init::xpos#2 ] ( main:10::sprites_init:18 [ sprites_init::s#2 sprites_init::xpos#2 ] ) always clobbers reg byte a
Statement [68] (byte) sprites_init::xpos#1 ← (byte) sprites_init::xpos#2 + (byte) $18 [ sprites_init::s#2 sprites_init::xpos#1 ] ( main:10::sprites_init:18 [ sprites_init::s#2 sprites_init::xpos#1 ] ) always clobbers reg byte a
Statement [80] if(*((const byte*) RASTER)<(byte) sprites_irq::raster_sprite_gfx_modify) goto sprites_irq::@8 [ render_screen_showing irq_sprite_ptr sprites_irq::raster_sprite_gfx_modify ] ( [ render_screen_showing irq_sprite_ptr sprites_irq::raster_sprite_gfx_modify ] ) always clobbers reg byte a
Statement [82] if((byte) render_screen_showing==(byte) 0) goto sprites_irq::@1 [ sprites_irq::ptr#0 ] ( [ sprites_irq::ptr#0 ] ) always clobbers reg byte a
Statement [80] if(*((const byte*) RASTER)<(byte) sprites_irq::raster_sprite_gfx_modify) goto sprites_irq::@8 [ render_screen_showing irq_raster_next irq_sprite_ypos irq_sprite_ptr irq_cnt sprites_irq::raster_sprite_gfx_modify ] ( [ render_screen_showing irq_raster_next irq_sprite_ypos irq_sprite_ptr irq_cnt sprites_irq::raster_sprite_gfx_modify ] ) always clobbers reg byte a
Statement [82] if((byte) render_screen_showing==(byte) 0) goto sprites_irq::@1 [ irq_raster_next irq_sprite_ypos irq_sprite_ptr irq_cnt sprites_irq::ptr#0 ] ( [ irq_raster_next irq_sprite_ypos irq_sprite_ptr irq_cnt sprites_irq::ptr#0 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:22 [ sprites_irq::ptr#0 ]
Statement [90] if((byte) irq_cnt==(byte) 9) goto sprites_irq::@3 [ irq_cnt ] ( [ irq_cnt ] ) always clobbers reg byte a
Statement [91] if((byte) irq_cnt==(byte) $a) goto sprites_irq::@4 [ ] ( [ ] ) always clobbers reg byte a
Statement [92] (byte) irq_raster_next ← (byte) irq_raster_next + (byte) $14 [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a reg byte x
Statement [93] (byte) irq_sprite_ypos ← (byte) irq_sprite_ypos + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a reg byte x
Statement [90] if((byte) irq_cnt==(byte) 9) goto sprites_irq::@3 [ irq_raster_next irq_sprite_ypos irq_sprite_ptr irq_cnt ] ( [ irq_raster_next irq_sprite_ypos irq_sprite_ptr irq_cnt ] ) always clobbers reg byte a
Statement [91] if((byte) irq_cnt==(byte) $a) goto sprites_irq::@4 [ irq_raster_next irq_sprite_ypos irq_sprite_ptr ] ( [ irq_raster_next irq_sprite_ypos irq_sprite_ptr ] ) always clobbers reg byte a
Statement [92] (byte) irq_raster_next ← (byte) irq_raster_next + (byte) $14 [ irq_raster_next irq_sprite_ypos irq_sprite_ptr ] ( [ irq_raster_next irq_sprite_ypos irq_sprite_ptr ] ) always clobbers reg byte a reg byte x
Statement [93] (byte) irq_sprite_ypos ← (byte) irq_sprite_ypos + (byte) $15 [ irq_raster_next irq_sprite_ptr ] ( [ irq_raster_next irq_sprite_ptr ] ) always clobbers reg byte a reg byte x
Statement [94] (byte) irq_sprite_ptr ← (byte) irq_sprite_ptr + (byte) 3 [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a reg byte x
Statement [95] *((const byte*) RASTER) ← (byte) irq_raster_next [ ] ( [ ] ) always clobbers reg byte a
Statement [96] *((const byte*) IRQ_STATUS) ← (const byte) IRQ_RASTER [ ] ( [ ] ) always clobbers reg byte a
Statement [97] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y
Statement [98] (byte) irq_cnt ← (byte) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [99] (byte) irq_raster_next ← (const byte) IRQ_RASTER_FIRST [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a
Statement [100] (byte) irq_sprite_ypos ← (byte) irq_sprite_ypos + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a reg byte x
Statement [98] (byte) irq_cnt ← (byte) 0 [ irq_sprite_ypos irq_sprite_ptr ] ( [ irq_sprite_ypos irq_sprite_ptr ] ) always clobbers reg byte a
Statement [99] (byte) irq_raster_next ← (const byte) IRQ_RASTER_FIRST [ irq_raster_next irq_sprite_ypos irq_sprite_ptr ] ( [ irq_raster_next irq_sprite_ypos irq_sprite_ptr ] ) always clobbers reg byte a
Statement [100] (byte) irq_sprite_ypos ← (byte) irq_sprite_ypos + (byte) $15 [ irq_raster_next irq_sprite_ptr ] ( [ irq_raster_next irq_sprite_ptr ] ) always clobbers reg byte a reg byte x
Statement [101] (byte) irq_sprite_ptr ← (byte) irq_sprite_ptr + (byte) 3 [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a reg byte x
Statement [102] (byte) irq_raster_next ← (byte) irq_raster_next + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a reg byte x
Statement [103] (byte) irq_sprite_ypos ← (const byte) SPRITES_FIRST_YPOS [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a
@ -2344,19 +2344,19 @@ Statement [65] (byte) sprites_init::s2#0 ← (byte) sprites_init::s#2 << (byte)
Statement [66] *((const byte*) SPRITES_XPOS + (byte) sprites_init::s2#0) ← (byte) sprites_init::xpos#2 [ sprites_init::s#2 sprites_init::xpos#2 ] ( main:10::sprites_init:18 [ sprites_init::s#2 sprites_init::xpos#2 ] ) always clobbers reg byte a
Statement [67] *((const byte*) SPRITES_COLS + (byte) sprites_init::s#2) ← (const byte) BLACK [ sprites_init::s#2 sprites_init::xpos#2 ] ( main:10::sprites_init:18 [ sprites_init::s#2 sprites_init::xpos#2 ] ) always clobbers reg byte a
Statement [68] (byte) sprites_init::xpos#1 ← (byte) sprites_init::xpos#2 + (byte) $18 [ sprites_init::s#2 sprites_init::xpos#1 ] ( main:10::sprites_init:18 [ sprites_init::s#2 sprites_init::xpos#1 ] ) always clobbers reg byte a
Statement [80] if(*((const byte*) RASTER)<(byte) sprites_irq::raster_sprite_gfx_modify) goto sprites_irq::@8 [ render_screen_showing irq_sprite_ptr sprites_irq::raster_sprite_gfx_modify ] ( [ render_screen_showing irq_sprite_ptr sprites_irq::raster_sprite_gfx_modify ] ) always clobbers reg byte a
Statement [82] if((byte) render_screen_showing==(byte) 0) goto sprites_irq::@1 [ sprites_irq::ptr#0 ] ( [ sprites_irq::ptr#0 ] ) always clobbers reg byte a
Statement [90] if((byte) irq_cnt==(byte) 9) goto sprites_irq::@3 [ irq_cnt ] ( [ irq_cnt ] ) always clobbers reg byte a
Statement [91] if((byte) irq_cnt==(byte) $a) goto sprites_irq::@4 [ ] ( [ ] ) always clobbers reg byte a
Statement [92] (byte) irq_raster_next ← (byte) irq_raster_next + (byte) $14 [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a reg byte x
Statement [93] (byte) irq_sprite_ypos ← (byte) irq_sprite_ypos + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a reg byte x
Statement [80] if(*((const byte*) RASTER)<(byte) sprites_irq::raster_sprite_gfx_modify) goto sprites_irq::@8 [ render_screen_showing irq_raster_next irq_sprite_ypos irq_sprite_ptr irq_cnt sprites_irq::raster_sprite_gfx_modify ] ( [ render_screen_showing irq_raster_next irq_sprite_ypos irq_sprite_ptr irq_cnt sprites_irq::raster_sprite_gfx_modify ] ) always clobbers reg byte a
Statement [82] if((byte) render_screen_showing==(byte) 0) goto sprites_irq::@1 [ irq_raster_next irq_sprite_ypos irq_sprite_ptr irq_cnt sprites_irq::ptr#0 ] ( [ irq_raster_next irq_sprite_ypos irq_sprite_ptr irq_cnt sprites_irq::ptr#0 ] ) always clobbers reg byte a
Statement [90] if((byte) irq_cnt==(byte) 9) goto sprites_irq::@3 [ irq_raster_next irq_sprite_ypos irq_sprite_ptr irq_cnt ] ( [ irq_raster_next irq_sprite_ypos irq_sprite_ptr irq_cnt ] ) always clobbers reg byte a
Statement [91] if((byte) irq_cnt==(byte) $a) goto sprites_irq::@4 [ irq_raster_next irq_sprite_ypos irq_sprite_ptr ] ( [ irq_raster_next irq_sprite_ypos irq_sprite_ptr ] ) always clobbers reg byte a
Statement [92] (byte) irq_raster_next ← (byte) irq_raster_next + (byte) $14 [ irq_raster_next irq_sprite_ypos irq_sprite_ptr ] ( [ irq_raster_next irq_sprite_ypos irq_sprite_ptr ] ) always clobbers reg byte a reg byte x
Statement [93] (byte) irq_sprite_ypos ← (byte) irq_sprite_ypos + (byte) $15 [ irq_raster_next irq_sprite_ptr ] ( [ irq_raster_next irq_sprite_ptr ] ) always clobbers reg byte a reg byte x
Statement [94] (byte) irq_sprite_ptr ← (byte) irq_sprite_ptr + (byte) 3 [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a reg byte x
Statement [95] *((const byte*) RASTER) ← (byte) irq_raster_next [ ] ( [ ] ) always clobbers reg byte a
Statement [96] *((const byte*) IRQ_STATUS) ← (const byte) IRQ_RASTER [ ] ( [ ] ) always clobbers reg byte a
Statement [97] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y
Statement [98] (byte) irq_cnt ← (byte) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [99] (byte) irq_raster_next ← (const byte) IRQ_RASTER_FIRST [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a
Statement [100] (byte) irq_sprite_ypos ← (byte) irq_sprite_ypos + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a reg byte x
Statement [98] (byte) irq_cnt ← (byte) 0 [ irq_sprite_ypos irq_sprite_ptr ] ( [ irq_sprite_ypos irq_sprite_ptr ] ) always clobbers reg byte a
Statement [99] (byte) irq_raster_next ← (const byte) IRQ_RASTER_FIRST [ irq_raster_next irq_sprite_ypos irq_sprite_ptr ] ( [ irq_raster_next irq_sprite_ypos irq_sprite_ptr ] ) always clobbers reg byte a
Statement [100] (byte) irq_sprite_ypos ← (byte) irq_sprite_ypos + (byte) $15 [ irq_raster_next irq_sprite_ptr ] ( [ irq_raster_next irq_sprite_ptr ] ) always clobbers reg byte a reg byte x
Statement [101] (byte) irq_sprite_ptr ← (byte) irq_sprite_ptr + (byte) 3 [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a reg byte x
Statement [102] (byte) irq_raster_next ← (byte) irq_raster_next + (byte) $15 [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a reg byte x
Statement [103] (byte) irq_sprite_ypos ← (const byte) SPRITES_FIRST_YPOS [ irq_raster_next ] ( [ irq_raster_next ] ) always clobbers reg byte a
@ -2391,17 +2391,17 @@ REGISTER UPLIFT SCOPES
Uplift Scope [loop] 227.25: zp[1]:6 [ loop::s#2 loop::s#1 ] 202: zp[1]:17 [ loop::$1 ] 194: zp[1]:7 [ loop::idx#2 loop::idx#0 loop::idx#1 ]
Uplift Scope [main] 23.1: zp[1]:2 [ main::s#2 main::s#1 ] 22: zp[1]:16 [ main::$6 ] 16.5: zp[1]:15 [ main::s2#0 ] 11: zp[1]:4 [ main::ypos#2 main::ypos#1 ] 9.62: zp[1]:3 [ main::xpos#2 main::xpos#1 ]
Uplift Scope [sprites_init] 25.3: zp[1]:8 [ sprites_init::s#2 sprites_init::s#1 ] 22: zp[1]:18 [ sprites_init::s2#0 ] 15.58: zp[1]:9 [ sprites_init::xpos#2 sprites_init::xpos#1 ]
Uplift Scope [] 25.67: zp[1]:5 [ sin_idx#10 sin_idx#3 ] 14: zp[1]:12 [ irq_sprite_ypos ] 6: zp[1]:14 [ irq_cnt ] 1.56: zp[1]:13 [ irq_sprite_ptr ] 1: zp[1]:11 [ irq_raster_next ] 0.4: zp[1]:10 [ render_screen_showing ]
Uplift Scope [sprites_irq] 6.5: zp[1]:21 [ sprites_irq::raster_sprite_gfx_modify ] 4: zp[1]:20 [ sprites_irq::$0 ] 4: zp[1]:24 [ sprites_irq::ptr#4 ] 4: zp[1]:26 [ sprites_irq::ptr#2 ] 2.67: zp[1]:23 [ sprites_irq::ptr#3 ] 2.67: zp[1]:25 [ sprites_irq::ptr#1 ] 2.5: zp[1]:19 [ sprites_irq::ypos#0 ] 2.5: zp[1]:22 [ sprites_irq::ptr#0 ]
Uplift Scope [] 25.67: zp[1]:5 [ sin_idx#10 sin_idx#3 ] 0.48: zp[1]:12 [ irq_sprite_ypos ] 0.48: zp[1]:14 [ irq_cnt ] 0.45: zp[1]:13 [ irq_sprite_ptr ] 0.44: zp[1]:11 [ irq_raster_next ] 0.4: zp[1]:10 [ render_screen_showing ]
Uplift Scope [sprites_irq_init]
Uplifting [loop] best 13962 combination zp[1]:6 [ loop::s#2 loop::s#1 ] reg byte a [ loop::$1 ] reg byte x [ loop::idx#2 loop::idx#0 loop::idx#1 ]
Uplifting [main] best 13682 combination reg byte y [ main::s#2 main::s#1 ] reg byte a [ main::$6 ] reg byte x [ main::s2#0 ] zp[1]:4 [ main::ypos#2 main::ypos#1 ] zp[1]:3 [ main::xpos#2 main::xpos#1 ]
Limited combination testing to 100 combinations of 324 possible.
Uplifting [sprites_init] best 13512 combination reg byte y [ sprites_init::s#2 sprites_init::s#1 ] reg byte x [ sprites_init::s2#0 ] zp[1]:9 [ sprites_init::xpos#2 sprites_init::xpos#1 ]
Uplifting [] best 13512 combination zp[1]:5 [ sin_idx#10 sin_idx#3 ] zp[1]:12 [ irq_sprite_ypos ] zp[1]:14 [ irq_cnt ] zp[1]:13 [ irq_sprite_ptr ] zp[1]:11 [ irq_raster_next ] zp[1]:10 [ render_screen_showing ]
Uplifting [sprites_irq] best 13488 combination zp[1]:21 [ sprites_irq::raster_sprite_gfx_modify ] reg byte x [ sprites_irq::$0 ] reg byte a [ sprites_irq::ptr#4 ] reg byte a [ sprites_irq::ptr#2 ] reg byte a [ sprites_irq::ptr#3 ] zp[1]:25 [ sprites_irq::ptr#1 ] zp[1]:19 [ sprites_irq::ypos#0 ] zp[1]:22 [ sprites_irq::ptr#0 ]
Limited combination testing to 100 combinations of 12288 possible.
Uplifting [] best 13488 combination zp[1]:5 [ sin_idx#10 sin_idx#3 ] zp[1]:12 [ irq_sprite_ypos ] zp[1]:14 [ irq_cnt ] zp[1]:13 [ irq_sprite_ptr ] zp[1]:11 [ irq_raster_next ] zp[1]:10 [ render_screen_showing ]
Uplifting [sprites_irq_init] best 13488 combination
Attempting to uplift remaining variables inzp[1]:6 [ loop::s#2 loop::s#1 ]
Uplifting [loop] best 13488 combination zp[1]:6 [ loop::s#2 loop::s#1 ]
@ -2409,22 +2409,22 @@ Attempting to uplift remaining variables inzp[1]:5 [ sin_idx#10 sin_idx#3 ]
Uplifting [] best 13488 combination zp[1]:5 [ sin_idx#10 sin_idx#3 ]
Attempting to uplift remaining variables inzp[1]:9 [ sprites_init::xpos#2 sprites_init::xpos#1 ]
Uplifting [sprites_init] best 13488 combination zp[1]:9 [ sprites_init::xpos#2 sprites_init::xpos#1 ]
Attempting to uplift remaining variables inzp[1]:12 [ irq_sprite_ypos ]
Uplifting [] best 13488 combination zp[1]:12 [ irq_sprite_ypos ]
Attempting to uplift remaining variables inzp[1]:4 [ main::ypos#2 main::ypos#1 ]
Uplifting [main] best 13488 combination zp[1]:4 [ main::ypos#2 main::ypos#1 ]
Attempting to uplift remaining variables inzp[1]:3 [ main::xpos#2 main::xpos#1 ]
Uplifting [main] best 13488 combination zp[1]:3 [ main::xpos#2 main::xpos#1 ]
Attempting to uplift remaining variables inzp[1]:21 [ sprites_irq::raster_sprite_gfx_modify ]
Uplifting [sprites_irq] best 13488 combination zp[1]:21 [ sprites_irq::raster_sprite_gfx_modify ]
Attempting to uplift remaining variables inzp[1]:14 [ irq_cnt ]
Uplifting [] best 13488 combination zp[1]:14 [ irq_cnt ]
Attempting to uplift remaining variables inzp[1]:25 [ sprites_irq::ptr#1 ]
Uplifting [sprites_irq] best 13476 combination reg byte x [ sprites_irq::ptr#1 ]
Attempting to uplift remaining variables inzp[1]:19 [ sprites_irq::ypos#0 ]
Uplifting [sprites_irq] best 13461 combination reg byte a [ sprites_irq::ypos#0 ]
Attempting to uplift remaining variables inzp[1]:22 [ sprites_irq::ptr#0 ]
Uplifting [sprites_irq] best 13446 combination reg byte x [ sprites_irq::ptr#0 ]
Attempting to uplift remaining variables inzp[1]:12 [ irq_sprite_ypos ]
Uplifting [] best 13446 combination zp[1]:12 [ irq_sprite_ypos ]
Attempting to uplift remaining variables inzp[1]:14 [ irq_cnt ]
Uplifting [] best 13446 combination zp[1]:14 [ irq_cnt ]
Attempting to uplift remaining variables inzp[1]:13 [ irq_sprite_ptr ]
Uplifting [] best 13446 combination zp[1]:13 [ irq_sprite_ptr ]
Attempting to uplift remaining variables inzp[1]:11 [ irq_raster_next ]
@ -3210,10 +3210,10 @@ FINAL SYMBOL TABLE
(const byte*) SPRITES_YPOS = (byte*) 53249
(const word) SPRITE_PTRS = (word) $3f8
(const byte*) VIC_CONTROL = (byte*) 53265
(byte) irq_cnt loadstore zp[1]:8 6.0
(byte) irq_raster_next loadstore zp[1]:5 1.0
(byte) irq_sprite_ptr loadstore zp[1]:7 1.5555555555555558
(byte) irq_sprite_ypos loadstore zp[1]:6 14.0
(byte) irq_cnt loadstore zp[1]:8 0.48000000000000004
(byte) irq_raster_next loadstore zp[1]:5 0.44444444444444453
(byte) irq_sprite_ptr loadstore zp[1]:7 0.45161290322580644
(byte) irq_sprite_ypos loadstore zp[1]:6 0.48275862068965525
(void()) loop()
(byte~) loop::$1 reg byte a 202.0
(label) loop::@1

View File

@ -43,10 +43,10 @@
(const byte*) SPRITES_YPOS = (byte*) 53249
(const word) SPRITE_PTRS = (word) $3f8
(const byte*) VIC_CONTROL = (byte*) 53265
(byte) irq_cnt loadstore zp[1]:8 6.0
(byte) irq_raster_next loadstore zp[1]:5 1.0
(byte) irq_sprite_ptr loadstore zp[1]:7 1.5555555555555558
(byte) irq_sprite_ypos loadstore zp[1]:6 14.0
(byte) irq_cnt loadstore zp[1]:8 0.48000000000000004
(byte) irq_raster_next loadstore zp[1]:5 0.44444444444444453
(byte) irq_sprite_ptr loadstore zp[1]:7 0.45161290322580644
(byte) irq_sprite_ypos loadstore zp[1]:6 0.48275862068965525
(void()) loop()
(byte~) loop::$1 reg byte a 202.0
(label) loop::@1

File diff suppressed because it is too large Load Diff

View File

@ -177,10 +177,10 @@
(byte) game_over#27 game_over zp[1]:6 6.0
(byte) game_over#52 game_over zp[1]:6 0.34782608695652173
(byte) game_over#65 game_over zp[1]:6 0.42857142857142855
(byte) irq_cnt loadstore zp[1]:30 6.0
(byte) irq_raster_next loadstore zp[1]:27 1.0
(byte) irq_sprite_ptr loadstore zp[1]:29 1.5555555555555558
(byte) irq_sprite_ypos loadstore zp[1]:28 14.0
(byte) irq_cnt loadstore zp[1]:30 0.48000000000000004
(byte) irq_raster_next loadstore zp[1]:27 0.44444444444444453
(byte) irq_sprite_ptr loadstore zp[1]:29 0.45161290322580644
(byte) irq_sprite_ypos loadstore zp[1]:28 0.48275862068965525
(byte()) keyboard_event_get()
(label) keyboard_event_get::@1
(label) keyboard_event_get::@return
@ -855,7 +855,7 @@
(const byte) render_show::toD0182_return#0 toD0182_return = >(word)(const byte*) PLAYFIELD_SCREEN_2&(word) $3fff*(byte) 4|>(word)(const byte*) PLAYFIELD_CHARSET/(byte) 4&(byte) $f
(byte*) render_show::toD0182_screen
(const dword*) score_add_bcd[(number) 5] = { fill( 5, 0) }
(dword) score_bcd loadstore zp[4]:23 60.0
(dword) score_bcd loadstore zp[4]:23 0.04316546762589928
(const byte**) screen_lines_1[(const byte) PLAYFIELD_LINES] = { fill( PLAYFIELD_LINES, 0) }
(const byte**) screen_lines_2[(const byte) PLAYFIELD_LINES] = { fill( PLAYFIELD_LINES, 0) }
(void()) sid_rnd_init()

View File

@ -106,7 +106,7 @@ main::@return: scope:[main] from main::@1
VARIABLE REGISTER WEIGHTS
(byte) idx loadstore 4.714285714285714 = (byte) 0
(byte) idx loadstore 4.125 = (byte) 0
(void()) main()
(byte) main::i
(byte) main::i#1 16.5
@ -187,17 +187,17 @@ main: {
idx: .byte 0
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [6] *((const byte*) SCREEN + (byte) main::i#2) ← (byte) idx [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [6] *((const byte*) SCREEN + (byte) main::i#2) ← (byte) idx [ main::i#2 idx ] ( main:2 [ main::i#2 idx ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::i#2 main::i#1 ]
Statement [7] (byte) idx ← (byte) idx + (byte) main::i#2 [ main::i#2 idx ] ( main:2 [ main::i#2 idx ] ) always clobbers reg byte a
Statement [6] *((const byte*) SCREEN + (byte) main::i#2) ← (byte) idx [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [6] *((const byte*) SCREEN + (byte) main::i#2) ← (byte) idx [ main::i#2 idx ] ( main:2 [ main::i#2 idx ] ) always clobbers reg byte a
Statement [7] (byte) idx ← (byte) idx + (byte) main::i#2 [ main::i#2 idx ] ( main:2 [ main::i#2 idx ] ) always clobbers reg byte a
Potential registers zp[1]:2 [ main::i#2 main::i#1 ] : zp[1]:2 , reg byte x , reg byte y ,
Potential registers mem[1] [ idx ] : mem[1] ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 31.17: zp[1]:2 [ main::i#2 main::i#1 ]
Uplift Scope [] 4.71: mem[1] [ idx ]
Uplift Scope [] 4.12: mem[1] [ idx ]
Uplifting [main] best 403 combination reg byte x [ main::i#2 main::i#1 ]
Uplifting [] best 403 combination mem[1] [ idx ]
@ -295,7 +295,7 @@ FINAL SYMBOL TABLE
(label) @begin
(label) @end
(const byte*) SCREEN = (byte*) 1024
(byte) idx loadstore mem[1] 4.714285714285714 = (byte) 0
(byte) idx loadstore mem[1] 4.125 = (byte) 0
(void()) main()
(label) main::@1
(label) main::@return

View File

@ -2,7 +2,7 @@
(label) @begin
(label) @end
(const byte*) SCREEN = (byte*) 1024
(byte) idx loadstore mem[1] 4.714285714285714 = (byte) 0
(byte) idx loadstore mem[1] 4.125 = (byte) 0
(void()) main()
(label) main::@1
(label) main::@return

View File

@ -111,7 +111,7 @@ main::@return: scope:[main] from main::@1
VARIABLE REGISTER WEIGHTS
(byte*) cursor loadstore 4.714285714285714 = (const byte*) SCREEN
(byte*) cursor loadstore 4.125 = (const byte*) SCREEN
(void()) main()
(byte) main::i
(byte) main::i#1 16.5
@ -200,18 +200,18 @@ main: {
cursor: .word SCREEN
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [6] *((byte*) cursor) ← (byte) '*' [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a reg byte y
Statement [6] *((byte*) cursor) ← (byte) '*' [ main::i#2 cursor ] ( main:2 [ main::i#2 cursor ] ) always clobbers reg byte a reg byte y
Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::i#2 main::i#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:2 [ main::i#2 main::i#1 ]
Statement [7] (byte*) cursor ← (byte*) cursor + (byte) $29 [ main::i#2 cursor ] ( main:2 [ main::i#2 cursor ] ) always clobbers reg byte a
Statement [6] *((byte*) cursor) ← (byte) '*' [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a reg byte y
Statement [6] *((byte*) cursor) ← (byte) '*' [ main::i#2 cursor ] ( main:2 [ main::i#2 cursor ] ) always clobbers reg byte a reg byte y
Statement [7] (byte*) cursor ← (byte*) cursor + (byte) $29 [ main::i#2 cursor ] ( main:2 [ main::i#2 cursor ] ) always clobbers reg byte a
Potential registers zp[1]:2 [ main::i#2 main::i#1 ] : zp[1]:2 , reg byte x ,
Potential registers mem[2] [ cursor ] : mem[2] ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 23.83: zp[1]:2 [ main::i#2 main::i#1 ]
Uplift Scope [] 4.71: mem[2] [ cursor ]
Uplift Scope [] 4.12: mem[2] [ cursor ]
Uplifting [main] best 638 combination reg byte x [ main::i#2 main::i#1 ]
Uplifting [] best 638 combination mem[2] [ cursor ]
@ -316,7 +316,7 @@ FINAL SYMBOL TABLE
(label) @begin
(label) @end
(const byte*) SCREEN = (byte*) 1024
(byte*) cursor loadstore mem[2] 4.714285714285714 = (const byte*) SCREEN
(byte*) cursor loadstore mem[2] 4.125 = (const byte*) SCREEN
(void()) main()
(label) main::@1
(label) main::@return

View File

@ -2,7 +2,7 @@
(label) @begin
(label) @end
(const byte*) SCREEN = (byte*) 1024
(byte*) cursor loadstore mem[2] 4.714285714285714 = (const byte*) SCREEN
(byte*) cursor loadstore mem[2] 4.125 = (const byte*) SCREEN
(void()) main()
(label) main::@1
(label) main::@return

View File

@ -105,7 +105,7 @@ main::@return: scope:[main] from main::@1
VARIABLE REGISTER WEIGHTS
(byte) idx loadstore 5.0
(byte) idx loadstore 4.375
(void()) main()
(byte) main::i
(byte) main::i#1 16.5
@ -191,18 +191,18 @@ main: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [0] (byte) idx ← (byte) 0 [ idx ] ( [ idx ] ) always clobbers reg byte a
Statement [6] *((const byte*) SCREEN + (byte) main::i#2) ← (byte) idx [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [6] *((const byte*) SCREEN + (byte) main::i#2) ← (byte) idx [ idx main::i#2 ] ( main:2 [ idx main::i#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::i#2 main::i#1 ]
Statement [7] (byte) idx ← (byte) idx + (byte) main::i#2 [ idx main::i#2 ] ( main:2 [ idx main::i#2 ] ) always clobbers reg byte a
Statement [0] (byte) idx ← (byte) 0 [ idx ] ( [ idx ] ) always clobbers reg byte a
Statement [6] *((const byte*) SCREEN + (byte) main::i#2) ← (byte) idx [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [6] *((const byte*) SCREEN + (byte) main::i#2) ← (byte) idx [ idx main::i#2 ] ( main:2 [ idx main::i#2 ] ) always clobbers reg byte a
Statement [7] (byte) idx ← (byte) idx + (byte) main::i#2 [ idx main::i#2 ] ( main:2 [ idx main::i#2 ] ) always clobbers reg byte a
Potential registers zp[1]:2 [ main::i#2 main::i#1 ] : zp[1]:2 , reg byte x , reg byte y ,
Potential registers zp[1]:3 [ idx ] : zp[1]:3 ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 31.17: zp[1]:2 [ main::i#2 main::i#1 ]
Uplift Scope [] 5: zp[1]:3 [ idx ]
Uplift Scope [] 4.38: zp[1]:3 [ idx ]
Uplifting [main] best 378 combination reg byte x [ main::i#2 main::i#1 ]
Uplifting [] best 378 combination zp[1]:3 [ idx ]
@ -301,7 +301,7 @@ FINAL SYMBOL TABLE
(label) @begin
(label) @end
(const byte*) SCREEN = (byte*) 1024
(byte) idx loadstore zp[1]:2 5.0
(byte) idx loadstore zp[1]:2 4.375
(void()) main()
(label) main::@1
(label) main::@return

View File

@ -2,7 +2,7 @@
(label) @begin
(label) @end
(const byte*) SCREEN = (byte*) 1024
(byte) idx loadstore zp[1]:2 5.0
(byte) idx loadstore zp[1]:2 4.375
(void()) main()
(label) main::@1
(label) main::@return

View File

@ -105,7 +105,7 @@ main::@return: scope:[main] from main::@1
VARIABLE REGISTER WEIGHTS
(byte) idx loadstore !mem[-1]:4096 5.0
(byte) idx loadstore !mem[-1]:4096 4.375
(void()) main()
(byte) main::i
(byte) main::i#1 16.5
@ -190,18 +190,18 @@ main: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [0] (byte) idx ← (byte) 0 [ idx ] ( [ idx ] ) always clobbers reg byte a
Statement [6] *((const byte*) SCREEN + (byte) main::i#2) ← (byte) idx [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [6] *((const byte*) SCREEN + (byte) main::i#2) ← (byte) idx [ idx main::i#2 ] ( main:2 [ idx main::i#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::i#2 main::i#1 ]
Statement [7] (byte) idx ← (byte) idx + (byte) main::i#2 [ idx main::i#2 ] ( main:2 [ idx main::i#2 ] ) always clobbers reg byte a
Statement [0] (byte) idx ← (byte) 0 [ idx ] ( [ idx ] ) always clobbers reg byte a
Statement [6] *((const byte*) SCREEN + (byte) main::i#2) ← (byte) idx [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a
Statement [6] *((const byte*) SCREEN + (byte) main::i#2) ← (byte) idx [ idx main::i#2 ] ( main:2 [ idx main::i#2 ] ) always clobbers reg byte a
Statement [7] (byte) idx ← (byte) idx + (byte) main::i#2 [ idx main::i#2 ] ( main:2 [ idx main::i#2 ] ) always clobbers reg byte a
Potential registers zp[1]:2 [ main::i#2 main::i#1 ] : zp[1]:2 , reg byte x , reg byte y ,
Potential registers mem[1]:4096 [ idx ] : mem[1]:4096 ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 31.17: zp[1]:2 [ main::i#2 main::i#1 ]
Uplift Scope [] 5: mem[1]:4096 [ idx ]
Uplift Scope [] 4.38: mem[1]:4096 [ idx ]
Uplifting [main] best 409 combination reg byte x [ main::i#2 main::i#1 ]
Uplifting [] best 409 combination mem[1]:4096 [ idx ]
@ -299,7 +299,7 @@ FINAL SYMBOL TABLE
(label) @begin
(label) @end
(const byte*) SCREEN = (byte*) 1024
(byte) idx loadstore !mem[-1]:4096 mem[1]:4096 5.0
(byte) idx loadstore !mem[-1]:4096 mem[1]:4096 4.375
(void()) main()
(label) main::@1
(label) main::@return

View File

@ -2,7 +2,7 @@
(label) @begin
(label) @end
(const byte*) SCREEN = (byte*) 1024
(byte) idx loadstore !mem[-1]:4096 mem[1]:4096 5.0
(byte) idx loadstore !mem[-1]:4096 mem[1]:4096 4.375
(void()) main()
(label) main::@1
(label) main::@return

View File

@ -364,7 +364,7 @@ main::@return: scope:[main] from main::@8
VARIABLE REGISTER WEIGHTS
(byte) idx_nssa_g loadstore 3.1333333333333333
(byte) idx_nssa_g loadstore 2.611111111111111
(byte) idx_ssa_g
(byte) idx_ssa_g#2 8.0
(byte) idx_ssa_g#7 16.5
@ -381,7 +381,7 @@ VARIABLE REGISTER WEIGHTS
(byte) main::i3
(byte) main::i3#1 16.5
(byte) main::i3#2 11.0
(byte) main::idx_nssa_l loadstore 1.6206896551724135
(byte) main::idx_nssa_l loadstore 1.46875
(byte) main::idx_ssa_l
(byte) main::idx_ssa_l#2 8.0
(byte) main::idx_ssa_l#5 16.5
@ -623,28 +623,28 @@ Statement [0] (byte) idx_nssa_g ← (byte) 0 [ idx_nssa_g ] ( [ idx_nssa_g ] )
Statement [4] (byte) main::idx_nssa_l ← (byte) 0 [ idx_nssa_g main::idx_nssa_l ] ( main:2 [ idx_nssa_g main::idx_nssa_l ] ) always clobbers reg byte a
Statement [5] *((const byte*) SCREEN1) ← (byte) 'C' [ idx_nssa_g main::idx_nssa_l ] ( main:2 [ idx_nssa_g main::idx_nssa_l ] ) always clobbers reg byte a
Statement [11] *((const byte*) SCREEN1 + (byte) idx_ssa_g#2) ← (byte) '!' [ idx_nssa_g main::idx_nssa_l ] ( main:2 [ idx_nssa_g main::idx_nssa_l ] ) always clobbers reg byte a
Statement [12] *((const byte*) SCREEN2 + (byte) idx_nssa_g) ← (byte) 'C' [ main::idx_nssa_l ] ( main:2 [ main::idx_nssa_l ] ) always clobbers reg byte a reg byte y
Statement [15] *((const byte*) SCREEN2 + (byte) idx_nssa_g) ← (byte) main::i1#2 [ main::idx_nssa_l main::i1#2 ] ( main:2 [ main::idx_nssa_l main::i1#2 ] ) always clobbers reg byte y
Statement [12] *((const byte*) SCREEN2 + (byte) idx_nssa_g) ← (byte) 'C' [ idx_nssa_g main::idx_nssa_l ] ( main:2 [ idx_nssa_g main::idx_nssa_l ] ) always clobbers reg byte a reg byte y
Statement [15] *((const byte*) SCREEN2 + (byte) idx_nssa_g) ← (byte) main::i1#2 [ idx_nssa_g main::idx_nssa_l main::i1#2 ] ( main:2 [ idx_nssa_g main::idx_nssa_l main::i1#2 ] ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:4 [ main::i1#2 main::i1#1 ]
Statement [19] *((const byte*) SCREEN2 + (byte) idx_nssa_g) ← (byte) '!' [ main::idx_nssa_l ] ( main:2 [ main::idx_nssa_l ] ) always clobbers reg byte a reg byte y
Statement [19] *((const byte*) SCREEN2 + (byte) idx_nssa_g) ← (byte) '!' [ idx_nssa_g main::idx_nssa_l ] ( main:2 [ idx_nssa_g main::idx_nssa_l ] ) always clobbers reg byte a reg byte y
Statement [21] *((const byte*) SCREEN3) ← (byte) 'C' [ main::idx_nssa_l ] ( main:2 [ main::idx_nssa_l ] ) always clobbers reg byte a
Statement [27] *((const byte*) SCREEN3 + (byte) main::idx_ssa_l#2) ← (byte) '!' [ main::idx_nssa_l ] ( main:2 [ main::idx_nssa_l ] ) always clobbers reg byte a
Statement [28] *((const byte*) SCREEN4 + (byte) main::idx_nssa_l) ← (byte) 'C' [ ] ( main:2 [ ] ) always clobbers reg byte a reg byte y
Statement [31] *((const byte*) SCREEN4 + (byte) main::idx_nssa_l) ← (byte) main::i3#2 [ main::i3#2 ] ( main:2 [ main::i3#2 ] ) always clobbers reg byte y
Statement [28] *((const byte*) SCREEN4 + (byte) main::idx_nssa_l) ← (byte) 'C' [ main::idx_nssa_l ] ( main:2 [ main::idx_nssa_l ] ) always clobbers reg byte a reg byte y
Statement [31] *((const byte*) SCREEN4 + (byte) main::idx_nssa_l) ← (byte) main::i3#2 [ main::idx_nssa_l main::i3#2 ] ( main:2 [ main::idx_nssa_l main::i3#2 ] ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:7 [ main::i3#2 main::i3#1 ]
Statement [35] *((const byte*) SCREEN4 + (byte) main::idx_nssa_l) ← (byte) '!' [ ] ( main:2 [ ] ) always clobbers reg byte a reg byte y
Statement [35] *((const byte*) SCREEN4 + (byte) main::idx_nssa_l) ← (byte) '!' [ main::idx_nssa_l ] ( main:2 [ main::idx_nssa_l ] ) always clobbers reg byte a reg byte y
Statement [0] (byte) idx_nssa_g ← (byte) 0 [ idx_nssa_g ] ( [ idx_nssa_g ] ) always clobbers reg byte a
Statement [4] (byte) main::idx_nssa_l ← (byte) 0 [ idx_nssa_g main::idx_nssa_l ] ( main:2 [ idx_nssa_g main::idx_nssa_l ] ) always clobbers reg byte a
Statement [5] *((const byte*) SCREEN1) ← (byte) 'C' [ idx_nssa_g main::idx_nssa_l ] ( main:2 [ idx_nssa_g main::idx_nssa_l ] ) always clobbers reg byte a
Statement [11] *((const byte*) SCREEN1 + (byte) idx_ssa_g#2) ← (byte) '!' [ idx_nssa_g main::idx_nssa_l ] ( main:2 [ idx_nssa_g main::idx_nssa_l ] ) always clobbers reg byte a
Statement [12] *((const byte*) SCREEN2 + (byte) idx_nssa_g) ← (byte) 'C' [ main::idx_nssa_l ] ( main:2 [ main::idx_nssa_l ] ) always clobbers reg byte a reg byte y
Statement [15] *((const byte*) SCREEN2 + (byte) idx_nssa_g) ← (byte) main::i1#2 [ main::idx_nssa_l main::i1#2 ] ( main:2 [ main::idx_nssa_l main::i1#2 ] ) always clobbers reg byte y
Statement [19] *((const byte*) SCREEN2 + (byte) idx_nssa_g) ← (byte) '!' [ main::idx_nssa_l ] ( main:2 [ main::idx_nssa_l ] ) always clobbers reg byte a reg byte y
Statement [12] *((const byte*) SCREEN2 + (byte) idx_nssa_g) ← (byte) 'C' [ idx_nssa_g main::idx_nssa_l ] ( main:2 [ idx_nssa_g main::idx_nssa_l ] ) always clobbers reg byte a reg byte y
Statement [15] *((const byte*) SCREEN2 + (byte) idx_nssa_g) ← (byte) main::i1#2 [ idx_nssa_g main::idx_nssa_l main::i1#2 ] ( main:2 [ idx_nssa_g main::idx_nssa_l main::i1#2 ] ) always clobbers reg byte y
Statement [19] *((const byte*) SCREEN2 + (byte) idx_nssa_g) ← (byte) '!' [ idx_nssa_g main::idx_nssa_l ] ( main:2 [ idx_nssa_g main::idx_nssa_l ] ) always clobbers reg byte a reg byte y
Statement [21] *((const byte*) SCREEN3) ← (byte) 'C' [ main::idx_nssa_l ] ( main:2 [ main::idx_nssa_l ] ) always clobbers reg byte a
Statement [27] *((const byte*) SCREEN3 + (byte) main::idx_ssa_l#2) ← (byte) '!' [ main::idx_nssa_l ] ( main:2 [ main::idx_nssa_l ] ) always clobbers reg byte a
Statement [28] *((const byte*) SCREEN4 + (byte) main::idx_nssa_l) ← (byte) 'C' [ ] ( main:2 [ ] ) always clobbers reg byte a reg byte y
Statement [31] *((const byte*) SCREEN4 + (byte) main::idx_nssa_l) ← (byte) main::i3#2 [ main::i3#2 ] ( main:2 [ main::i3#2 ] ) always clobbers reg byte y
Statement [35] *((const byte*) SCREEN4 + (byte) main::idx_nssa_l) ← (byte) '!' [ ] ( main:2 [ ] ) always clobbers reg byte a reg byte y
Statement [28] *((const byte*) SCREEN4 + (byte) main::idx_nssa_l) ← (byte) 'C' [ main::idx_nssa_l ] ( main:2 [ main::idx_nssa_l ] ) always clobbers reg byte a reg byte y
Statement [31] *((const byte*) SCREEN4 + (byte) main::idx_nssa_l) ← (byte) main::i3#2 [ main::idx_nssa_l main::i3#2 ] ( main:2 [ main::idx_nssa_l main::i3#2 ] ) always clobbers reg byte y
Statement [35] *((const byte*) SCREEN4 + (byte) main::idx_nssa_l) ← (byte) '!' [ main::idx_nssa_l ] ( main:2 [ main::idx_nssa_l ] ) always clobbers reg byte a reg byte y
Potential registers zp[1]:2 [ main::i#2 main::i#1 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:3 [ idx_ssa_g#7 idx_ssa_g#2 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:4 [ main::i1#2 main::i1#1 ] : zp[1]:4 , reg byte a , reg byte x ,
@ -655,8 +655,8 @@ Potential registers zp[1]:8 [ idx_nssa_g ] : zp[1]:8 ,
Potential registers zp[1]:9 [ main::idx_nssa_l ] : zp[1]:9 ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 27.5: zp[1]:2 [ main::i#2 main::i#1 ] 27.5: zp[1]:4 [ main::i1#2 main::i1#1 ] 27.5: zp[1]:5 [ main::i2#2 main::i2#1 ] 27.5: zp[1]:7 [ main::i3#2 main::i3#1 ] 24.5: zp[1]:6 [ main::idx_ssa_l#5 main::idx_ssa_l#2 ] 1.62: zp[1]:9 [ main::idx_nssa_l ]
Uplift Scope [] 24.5: zp[1]:3 [ idx_ssa_g#7 idx_ssa_g#2 ] 3.13: zp[1]:8 [ idx_nssa_g ]
Uplift Scope [main] 27.5: zp[1]:2 [ main::i#2 main::i#1 ] 27.5: zp[1]:4 [ main::i1#2 main::i1#1 ] 27.5: zp[1]:5 [ main::i2#2 main::i2#1 ] 27.5: zp[1]:7 [ main::i3#2 main::i3#1 ] 24.5: zp[1]:6 [ main::idx_ssa_l#5 main::idx_ssa_l#2 ] 1.47: zp[1]:9 [ main::idx_nssa_l ]
Uplift Scope [] 24.5: zp[1]:3 [ idx_ssa_g#7 idx_ssa_g#2 ] 2.61: zp[1]:8 [ idx_nssa_g ]
Uplifting [main] best 1523 combination reg byte x [ main::i#2 main::i#1 ] reg byte a [ main::i1#2 main::i1#1 ] reg byte x [ main::i2#2 main::i2#1 ] reg byte a [ main::i3#2 main::i3#1 ] zp[1]:6 [ main::idx_ssa_l#5 main::idx_ssa_l#2 ] zp[1]:9 [ main::idx_nssa_l ]
Limited combination testing to 100 combinations of 576 possible.
@ -906,7 +906,7 @@ FINAL SYMBOL TABLE
(const byte*) SCREEN2 = (byte*)(number) $400+(number) $28
(const byte*) SCREEN3 = (byte*)(number) $400+(number) $50
(const byte*) SCREEN4 = (byte*)(number) $400+(number) $78
(byte) idx_nssa_g loadstore zp[1]:2 3.1333333333333333
(byte) idx_nssa_g loadstore zp[1]:2 2.611111111111111
(byte) idx_ssa_g
(byte) idx_ssa_g#2 reg byte y 8.0
(byte) idx_ssa_g#7 reg byte y 16.5
@ -932,7 +932,7 @@ FINAL SYMBOL TABLE
(byte) main::i3
(byte) main::i3#1 reg byte a 16.5
(byte) main::i3#2 reg byte a 11.0
(byte) main::idx_nssa_l loadstore zp[1]:3 1.6206896551724135
(byte) main::idx_nssa_l loadstore zp[1]:3 1.46875
(byte) main::idx_ssa_l
(byte) main::idx_ssa_l#2 reg byte y 8.0
(byte) main::idx_ssa_l#5 reg byte y 16.5

View File

@ -5,7 +5,7 @@
(const byte*) SCREEN2 = (byte*)(number) $400+(number) $28
(const byte*) SCREEN3 = (byte*)(number) $400+(number) $50
(const byte*) SCREEN4 = (byte*)(number) $400+(number) $78
(byte) idx_nssa_g loadstore zp[1]:2 3.1333333333333333
(byte) idx_nssa_g loadstore zp[1]:2 2.611111111111111
(byte) idx_ssa_g
(byte) idx_ssa_g#2 reg byte y 8.0
(byte) idx_ssa_g#7 reg byte y 16.5
@ -31,7 +31,7 @@
(byte) main::i3
(byte) main::i3#1 reg byte a 16.5
(byte) main::i3#2 reg byte a 11.0
(byte) main::idx_nssa_l loadstore zp[1]:3 1.6206896551724135
(byte) main::idx_nssa_l loadstore zp[1]:3 1.46875
(byte) main::idx_ssa_l
(byte) main::idx_ssa_l#2 reg byte y 8.0
(byte) main::idx_ssa_l#5 reg byte y 16.5

View File

@ -5,13 +5,16 @@
.pc = $80d "Program"
.label DC00 = $dc00
main: {
ldy #0
__b1:
iny
__b2:
ldx DC00
txa
and #$1f
cpx #0
bne __b1
cmp #$1f
beq __b1
beq __b2
jmp __b1
}

View File

@ -13,13 +13,14 @@ main: scope:[main] from @1
[4] phi()
to:main::@1
main::@1: scope:[main] from main main::@2 main::@3
[5] (byte) key#1 ← *((const byte*) DC00)
[6] (byte~) main::$1 ← (byte) key#1 & (byte) $1f
[7] if((byte) key#1!=(byte) 0) goto main::@2
to:main::@3
main::@3: scope:[main] from main::@1
[8] if((byte~) main::$1==(byte) $1f) goto main::@1
[5] (byte) rpc#4 ← phi( main/(byte) 0 main::@2/(byte) rpc#1 main::@3/(byte) rpc#1 )
[6] (byte) rpc#1 ← ++ (byte) rpc#4
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
[9] phi()
[7] (byte) key#1 ← *((const byte*) DC00)
[8] (byte~) main::$1 ← (byte) key#1 & (byte) $1f
[9] if((byte) key#1!=(byte) 0) goto main::@1
to:main::@3
main::@3: scope:[main] from main::@2
[10] if((byte~) main::$1==(byte) $1f) goto main::@2
to:main::@1

View File

@ -1,15 +1,21 @@
Culled Empty Block (label) main::@1
Culled Empty Block (label) main::@4
CONTROL FLOW GRAPH SSA
@begin: scope:[] from
(byte) rpc#0 ← (byte) 0
(byte) key#0 ← (byte) 0
to:@1
(void()) main()
main: scope:[main] from @1
(byte) rpc#7 ← phi( @1/(byte) rpc#9 )
to:main::@1
main::@1: scope:[main] from main main::@3
(byte) rpc#4 ← phi( main/(byte) rpc#7 main::@3/(byte) rpc#8 )
(byte) rpc#1 ← ++ (byte) rpc#4
to:main::@2
main::@2: scope:[main] from main main::@2 main::@3
main::@2: scope:[main] from main::@1 main::@2
(byte) rpc#10 ← phi( main::@1/(byte) rpc#1 main::@2/(byte) rpc#10 )
(byte) key#1 ← *((const byte*) DC00)
(bool~) main::$0 ← (byte) key#1 == (number) 0
(number~) main::$1 ← (byte) key#1 & (number) $1f
@ -19,19 +25,25 @@ main::@2: scope:[main] from main main::@2 main::@3
to:main::@3
main::@3: scope:[main] from main::@2
(byte) key#6 ← phi( main::@2/(byte) key#1 )
if(true) goto main::@2
(byte) rpc#8 ← phi( main::@2/(byte) rpc#10 )
if(true) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@3
(byte) key#4 ← phi( main::@3/(byte) key#6 )
(byte) rpc#5 ← phi( main::@3/(byte) rpc#8 )
(byte) rpc#2 ← (byte) rpc#5
(byte) key#2 ← (byte) key#4
return
to:@return
@1: scope:[] from @begin
(byte) key#7 ← phi( @begin/(byte) key#0 )
(byte) rpc#9 ← phi( @begin/(byte) rpc#0 )
call main
to:@2
@2: scope:[] from @1
(byte) key#5 ← phi( @1/(byte) key#2 )
(byte) rpc#6 ← phi( @1/(byte) rpc#2 )
(byte) rpc#3 ← (byte) rpc#6
(byte) key#3 ← (byte) key#5
to:@end
@end: scope:[] from @2
@ -56,9 +68,22 @@ SYMBOL TABLE SSA
(number~) main::$1
(bool~) main::$2
(bool~) main::$3
(label) main::@1
(label) main::@2
(label) main::@3
(label) main::@return
(byte) rpc
(byte) rpc#0
(byte) rpc#1
(byte) rpc#10
(byte) rpc#2
(byte) rpc#3
(byte) rpc#4
(byte) rpc#5
(byte) rpc#6
(byte) rpc#7
(byte) rpc#8
(byte) rpc#9
Adding number conversion cast (unumber) 0 in (bool~) main::$0 ← (byte) key#1 == (number) 0
Adding number conversion cast (unumber) $1f in (number~) main::$1 ← (byte) key#1 & (number) $1f
@ -75,47 +100,55 @@ Finalized unsigned number type (byte) $1f
Finalized unsigned number type (byte) $1f
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inferred type updated to byte in (unumber~) main::$1 ← (byte) key#1 & (byte) $1f
Alias (byte) rpc#10 = (byte) rpc#8 (byte) rpc#5 (byte) rpc#2
Alias (byte) key#1 = (byte) key#6 (byte) key#4 (byte) key#2
Alias (byte) rpc#0 = (byte) rpc#9
Alias (byte) key#0 = (byte) key#7
Alias (byte) rpc#3 = (byte) rpc#6
Alias (byte) key#3 = (byte) key#5
Successful SSA optimization Pass2AliasElimination
Identical Phi Values (byte) rpc#7 (byte) rpc#0
Identical Phi Values (byte) rpc#10 (byte) rpc#1
Identical Phi Values (byte) rpc#3 (byte) rpc#10
Identical Phi Values (byte) key#3 (byte) key#1
Successful SSA optimization Pass2IdenticalPhiElimination
Rewriting && if()-condition to two if()s [5] (bool~) main::$3 ← (bool~) main::$0 && (bool~) main::$2
Rewriting && if()-condition to two if()s [10] (bool~) main::$3 ← (bool~) main::$0 && (bool~) main::$2
Successful SSA optimization Pass2ConditionalAndOrRewriting
Constant (const byte) rpc#0 = 0
Constant (const byte) key#0 = 0
Successful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination [8] if(true) goto main::@2
if() condition always true - replacing block destination [13] if(true) goto main::@1
Successful SSA optimization Pass2ConstantIfs
Eliminating unused constant (const byte) key#0
Successful SSA optimization PassNEliminateUnusedVars
Removing unused block main::@return
Successful SSA optimization Pass2EliminateUnusedBlocks
Simple Condition (bool~) main::$0 [4] if((byte) key#1==(byte) 0) goto main::@5
Simple Condition (bool~) main::$2 [6] if((byte~) main::$1==(byte) $1f) goto main::@2
Simple Condition (bool~) main::$0 [6] if((byte) key#1==(byte) 0) goto main::@5
Simple Condition (bool~) main::$2 [8] if((byte~) main::$1==(byte) $1f) goto main::@2
Successful SSA optimization Pass2ConditionalJumpSimplification
Negating conditional jump and destination [4] if((byte) key#1!=(byte) 0) goto main::@3
Negating conditional jump and destination [6] if((byte) key#1!=(byte) 0) goto main::@3
Successful SSA optimization Pass2ConditionalJumpSequenceImprovement
Inlining constant with var siblings (const byte) rpc#0
Constant inlined rpc#0 = (byte) 0
Successful SSA optimization Pass2ConstantInlining
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @2
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@3
CALL GRAPH
Calls in [] to main:2
Created 0 initial phi equivalence classes
Coalesced down to 0 phi equivalence classes
Created 1 initial phi equivalence classes
Coalesced [12] rpc#11 ← rpc#1
Coalesced down to 1 phi equivalence classes
Culled Empty Block (label) @2
Renumbering block main::@2 to main::@1
Renumbering block main::@3 to main::@2
Culled Empty Block (label) main::@3
Renumbering block main::@5 to main::@3
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@2
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
@ -133,15 +166,16 @@ main: scope:[main] from @1
[4] phi()
to:main::@1
main::@1: scope:[main] from main main::@2 main::@3
[5] (byte) key#1 ← *((const byte*) DC00)
[6] (byte~) main::$1 ← (byte) key#1 & (byte) $1f
[7] if((byte) key#1!=(byte) 0) goto main::@2
to:main::@3
main::@3: scope:[main] from main::@1
[8] if((byte~) main::$1==(byte) $1f) goto main::@1
[5] (byte) rpc#4 ← phi( main/(byte) 0 main::@2/(byte) rpc#1 main::@3/(byte) rpc#1 )
[6] (byte) rpc#1 ← ++ (byte) rpc#4
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
[9] phi()
[7] (byte) key#1 ← *((const byte*) DC00)
[8] (byte~) main::$1 ← (byte) key#1 & (byte) $1f
[9] if((byte) key#1!=(byte) 0) goto main::@1
to:main::@3
main::@3: scope:[main] from main::@2
[10] if((byte~) main::$1==(byte) $1f) goto main::@2
to:main::@1
@ -150,15 +184,21 @@ VARIABLE REGISTER WEIGHTS
(byte) key#1 151.5
(void()) main()
(byte~) main::$1 101.0
(byte) rpc
(byte) rpc#1 42.6
(byte) rpc#4 213.0
Initial phi equivalence classes
[ rpc#4 rpc#1 ]
Added variable key#1 to live range equivalence class [ key#1 ]
Added variable main::$1 to live range equivalence class [ main::$1 ]
Complete equivalence classes
[ rpc#4 rpc#1 ]
[ key#1 ]
[ main::$1 ]
Allocated zp[1]:2 [ key#1 ]
Allocated zp[1]:3 [ main::$1 ]
Allocated zp[1]:2 [ rpc#4 rpc#1 ]
Allocated zp[1]:3 [ key#1 ]
Allocated zp[1]:4 [ main::$1 ]
INITIAL ASM
Target platform is c64basic / MOS6502X
@ -171,7 +211,8 @@ Target platform is c64basic / MOS6502X
.pc = $80d "Program"
// Global Constants & labels
.label DC00 = $dc00
.label key = 2
.label rpc = 2
.label key = 3
// @begin
__bbegin:
// [1] phi from @begin to @1 [phi:@begin->@1]
@ -190,48 +231,58 @@ __bend_from___b1:
__bend:
// main
main: {
.label __1 = 3
.label __1 = 4
// [5] phi from main to main::@1 [phi:main->main::@1]
__b1_from_main:
// [5] phi (byte) rpc#4 = (byte) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0
sta.z rpc
jmp __b1
// [5] phi from main::@2 main::@3 to main::@1 [phi:main::@2/main::@3->main::@1]
__b1_from___b2:
__b1_from___b3:
// [5] phi (byte) rpc#4 = (byte) rpc#1 [phi:main::@2/main::@3->main::@1#0] -- register_copy
jmp __b1
// main::@1
__b1:
// [5] (byte) key#1 ← *((const byte*) DC00) -- vbuz1=_deref_pbuc1
lda DC00
sta.z key
// [6] (byte~) main::$1 ← (byte) key#1 & (byte) $1f -- vbuz1=vbuz2_band_vbuc1
lda #$1f
and.z key
sta.z __1
// [7] if((byte) key#1!=(byte) 0) goto main::@2 -- vbuz1_neq_0_then_la1
lda.z key
cmp #0
bne __b2_from___b1
jmp __b3
// main::@3
__b3:
// [8] if((byte~) main::$1==(byte) $1f) goto main::@1 -- vbuz1_eq_vbuc1_then_la1
lda #$1f
cmp.z __1
beq __b1
// [9] phi from main::@1 main::@3 to main::@2 [phi:main::@1/main::@3->main::@2]
__b2_from___b1:
__b2_from___b3:
// [6] (byte) rpc#1 ← ++ (byte) rpc#4 -- vbuz1=_inc_vbuz1
inc.z rpc
jmp __b2
// main::@2
__b2:
jmp __b1
// [7] (byte) key#1 ← *((const byte*) DC00) -- vbuz1=_deref_pbuc1
lda DC00
sta.z key
// [8] (byte~) main::$1 ← (byte) key#1 & (byte) $1f -- vbuz1=vbuz2_band_vbuc1
lda #$1f
and.z key
sta.z __1
// [9] if((byte) key#1!=(byte) 0) goto main::@1 -- vbuz1_neq_0_then_la1
lda.z key
cmp #0
bne __b1_from___b2
jmp __b3
// main::@3
__b3:
// [10] if((byte~) main::$1==(byte) $1f) goto main::@2 -- vbuz1_eq_vbuc1_then_la1
lda #$1f
cmp.z __1
beq __b2
jmp __b1_from___b3
}
// File Data
REGISTER UPLIFT POTENTIAL REGISTERS
Potential registers zp[1]:2 [ key#1 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:3 [ main::$1 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:2 [ rpc#4 rpc#1 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:3 [ key#1 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:4 [ main::$1 ] : zp[1]:4 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [] 151.5: zp[1]:2 [ key#1 ]
Uplift Scope [main] 101: zp[1]:3 [ main::$1 ]
Uplift Scope [] 255.6: zp[1]:2 [ rpc#4 rpc#1 ] 151.5: zp[1]:3 [ key#1 ]
Uplift Scope [main] 101: zp[1]:4 [ main::$1 ]
Uplifting [] best 2502 combination reg byte x [ key#1 ]
Uplifting [main] best 2102 combination reg byte a [ main::$1 ]
Uplifting [] best 2842 combination reg byte y [ rpc#4 rpc#1 ] reg byte x [ key#1 ]
Uplifting [main] best 2442 combination reg byte a [ main::$1 ]
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
@ -261,30 +312,38 @@ __bend_from___b1:
__bend:
// main
main: {
// [5] phi from main to main::@1 [phi:main->main::@1]
__b1_from_main:
// [5] phi (byte) rpc#4 = (byte) 0 [phi:main->main::@1#0] -- vbuyy=vbuc1
ldy #0
jmp __b1
// [5] phi from main::@2 main::@3 to main::@1 [phi:main::@2/main::@3->main::@1]
__b1_from___b2:
__b1_from___b3:
// [5] phi (byte) rpc#4 = (byte) rpc#1 [phi:main::@2/main::@3->main::@1#0] -- register_copy
jmp __b1
// main::@1
__b1:
// [5] (byte) key#1 ← *((const byte*) DC00) -- vbuxx=_deref_pbuc1
ldx DC00
// [6] (byte~) main::$1 ← (byte) key#1 & (byte) $1f -- vbuaa=vbuxx_band_vbuc1
txa
and #$1f
// [7] if((byte) key#1!=(byte) 0) goto main::@2 -- vbuxx_neq_0_then_la1
cpx #0
bne __b2_from___b1
jmp __b3
// main::@3
__b3:
// [8] if((byte~) main::$1==(byte) $1f) goto main::@1 -- vbuaa_eq_vbuc1_then_la1
cmp #$1f
beq __b1
// [9] phi from main::@1 main::@3 to main::@2 [phi:main::@1/main::@3->main::@2]
__b2_from___b1:
__b2_from___b3:
// [6] (byte) rpc#1 ← ++ (byte) rpc#4 -- vbuyy=_inc_vbuyy
iny
jmp __b2
// main::@2
__b2:
jmp __b1
// [7] (byte) key#1 ← *((const byte*) DC00) -- vbuxx=_deref_pbuc1
ldx DC00
// [8] (byte~) main::$1 ← (byte) key#1 & (byte) $1f -- vbuaa=vbuxx_band_vbuc1
txa
and #$1f
// [9] if((byte) key#1!=(byte) 0) goto main::@1 -- vbuxx_neq_0_then_la1
cpx #0
bne __b1_from___b2
jmp __b3
// main::@3
__b3:
// [10] if((byte~) main::$1==(byte) $1f) goto main::@2 -- vbuaa_eq_vbuc1_then_la1
cmp #$1f
beq __b2
jmp __b1_from___b3
}
// File Data
@ -292,28 +351,29 @@ ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __b1
Removing instruction jmp __bend
Removing instruction jmp __b1
Removing instruction jmp __b3
Removing instruction jmp __b2
Removing instruction jmp __b3
Succesful ASM optimization Pass5NextJumpElimination
Replacing label __bbegin with __b1
Replacing label __b2_from___b1 with __b2
Replacing label __b1_from___b2 with __b1
Replacing label __b1_from___b3 with __b1
Removing instruction __bbegin:
Removing instruction __b1_from___bbegin:
Removing instruction main_from___b1:
Removing instruction __bend_from___b1:
Removing instruction __b2_from___b1:
Removing instruction __b2_from___b3:
Removing instruction __b1_from___b2:
Removing instruction __b1_from___b3:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction __bend:
Removing instruction __b1_from_main:
Removing instruction __b3:
Succesful ASM optimization Pass5UnusedLabelElimination
Updating BasicUpstart to call main directly
Removing instruction jsr main
Succesful ASM optimization Pass5SkipBegin
Skipping double jump to __b1 in bne __b2
Succesful ASM optimization Pass5DoubleJumpElimination
Removing instruction jmp __b1
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction __b1:
Removing instruction __b2:
Succesful ASM optimization Pass5UnusedLabelElimination
FINAL SYMBOL TABLE
@ -328,13 +388,17 @@ FINAL SYMBOL TABLE
(label) main::@1
(label) main::@2
(label) main::@3
(byte) rpc
(byte) rpc#1 reg byte y 42.6
(byte) rpc#4 reg byte y 213.0
reg byte y [ rpc#4 rpc#1 ]
reg byte x [ key#1 ]
reg byte a [ main::$1 ]
FINAL ASSEMBLER
Score: 1730
Score: 2040
// File Comments
// Duplicate Loop Problem from Richard-William Loerakker
@ -354,25 +418,33 @@ Score: 1730
// @end
// main
main: {
// [5] phi from main to main::@1 [phi:main->main::@1]
// [5] phi (byte) rpc#4 = (byte) 0 [phi:main->main::@1#0] -- vbuyy=vbuc1
ldy #0
// [5] phi from main::@2 main::@3 to main::@1 [phi:main::@2/main::@3->main::@1]
// [5] phi (byte) rpc#4 = (byte) rpc#1 [phi:main::@2/main::@3->main::@1#0] -- register_copy
// main::@1
__b1:
// rpc++;
// [6] (byte) rpc#1 ← ++ (byte) rpc#4 -- vbuyy=_inc_vbuyy
iny
// main::@2
__b2:
// key = *DC00
// [5] (byte) key#1 ← *((const byte*) DC00) -- vbuxx=_deref_pbuc1
// [7] (byte) key#1 ← *((const byte*) DC00) -- vbuxx=_deref_pbuc1
ldx DC00
// key & %00011111
// [6] (byte~) main::$1 ← (byte) key#1 & (byte) $1f -- vbuaa=vbuxx_band_vbuc1
// [8] (byte~) main::$1 ← (byte) key#1 & (byte) $1f -- vbuaa=vbuxx_band_vbuc1
txa
and #$1f
// while(key == 0 && ((key & %00011111) == %00011111))
// [7] if((byte) key#1!=(byte) 0) goto main::@2 -- vbuxx_neq_0_then_la1
// [9] if((byte) key#1!=(byte) 0) goto main::@1 -- vbuxx_neq_0_then_la1
cpx #0
bne __b1
// main::@3
// [8] if((byte~) main::$1==(byte) $1f) goto main::@1 -- vbuaa_eq_vbuc1_then_la1
// [10] if((byte~) main::$1==(byte) $1f) goto main::@2 -- vbuaa_eq_vbuc1_then_la1
cmp #$1f
beq __b1
// [9] phi from main::@1 main::@3 to main::@2 [phi:main::@1/main::@3->main::@2]
// main::@2
beq __b2
jmp __b1
}
// File Data

View File

@ -9,6 +9,10 @@
(label) main::@1
(label) main::@2
(label) main::@3
(byte) rpc
(byte) rpc#1 reg byte y 42.6
(byte) rpc#4 reg byte y 213.0
reg byte y [ rpc#4 rpc#1 ]
reg byte x [ key#1 ]
reg byte a [ main::$1 ]

View File

@ -225,7 +225,7 @@ interrupt(HARDWARE_ALL)(void()) nmi()
interrupt(HARDWARE_ALL)(void()) nmi2()
(byte~) nmi2::$1 4.0
(byte~) nmi2::$2 4.0
(byte*) sample loadstore 2.8
(byte*) sample loadstore 1.9999999999999996
Initial phi equivalence classes
Added variable sample to live range equivalence class [ sample ]
@ -449,7 +449,7 @@ Statement [9] *((const word*) CIA2_TIMER_A) ← (byte) $88 [ ] ( main:3 [ ] ) al
Statement [10] *((const byte*) CIA2_INTERRUPT) ← (byte) $81 [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [11] *((const byte*) CIA2_TIMER_A_CONTROL) ← (byte) 1 [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement asm { ldaCIA2_INTERRUPT } always clobbers reg byte a
Statement [16] (byte~) nmi2::$1 ← *((byte*) sample) >> (byte) 4 [ nmi2::$1 ] ( [ nmi2::$1 ] ) always clobbers reg byte a reg byte y
Statement [16] (byte~) nmi2::$1 ← *((byte*) sample) >> (byte) 4 [ sample nmi2::$1 ] ( [ sample nmi2::$1 ] ) always clobbers reg byte a reg byte y
Statement [21] (byte*) sample ← (const byte*) SAMPLE [ ] ( [ ] ) always clobbers reg byte a
Statement [22] *((const void()**) KERNEL_NMI) ← &interrupt(HARDWARE_ALL)(void()) nmi() [ ] ( [ ] ) always clobbers reg byte a
Statement [24] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y
@ -465,7 +465,7 @@ Potential registers zp[1]:6 [ nmi::$1 ] : zp[1]:6 , reg byte a , reg byte x , re
REGISTER UPLIFT SCOPES
Uplift Scope [nmi2] 4: zp[1]:4 [ nmi2::$1 ] 4: zp[1]:5 [ nmi2::$2 ]
Uplift Scope [nmi] 4: zp[1]:6 [ nmi::$1 ]
Uplift Scope [] 2.8: zp[2]:2 [ sample ]
Uplift Scope [] 2: zp[2]:2 [ sample ]
Uplift Scope [main]
Uplifting [nmi2] best 534 combination reg byte a [ nmi2::$1 ] reg byte a [ nmi2::$2 ]
@ -711,7 +711,7 @@ interrupt(HARDWARE_ALL)(void()) nmi2()
(label) nmi2::@1
(label) nmi2::@2
(label) nmi2::@return
(byte*) sample loadstore zp[2]:2 2.8
(byte*) sample loadstore zp[2]:2 1.9999999999999996
zp[2]:2 [ sample ]
reg byte a [ nmi2::$1 ]

View File

@ -22,7 +22,7 @@ interrupt(HARDWARE_ALL)(void()) nmi2()
(label) nmi2::@1
(label) nmi2::@2
(label) nmi2::@return
(byte*) sample loadstore zp[2]:2 2.8
(byte*) sample loadstore zp[2]:2 1.9999999999999996
zp[2]:2 [ sample ]
reg byte a [ nmi2::$1 ]

View File

@ -300,7 +300,7 @@ VARIABLE REGISTER WEIGHTS
(byte) do10::i#1 16.5
(byte) do10::i#2 11.0
(void()) hello()
(byte) idx loadstore 5.0
(byte) idx loadstore 4.375
(void()) main()
(void()) print((byte*) print::msg)
(byte) print::i
@ -509,14 +509,14 @@ Removing always clobbered register reg byte a as potential for zp[1]:4 [ do10::i
Removing always clobbered register reg byte x as potential for zp[1]:4 [ do10::i#2 do10::i#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:4 [ do10::i#2 do10::i#1 ]
Statement [14] if((byte) do10::i#1!=(byte) $a) goto do10::@1 [ do10::fn#3 do10::i#1 ] ( main:3::do10:6 [ do10::fn#3 do10::i#1 ] main:3::do10:8 [ do10::fn#3 do10::i#1 ] ) always clobbers reg byte a
Statement [21] *((const byte*) SCREEN + (byte) idx) ← *((byte*) print::msg#3 + (byte) print::i#2) [ print::msg#3 print::i#2 ] ( print:17 [ print::msg#3 print::i#2 ] print:27 [ print::msg#3 print::i#2 ] ) always clobbers reg byte a reg byte x
Statement [21] *((const byte*) SCREEN + (byte) idx) ← *((byte*) print::msg#3 + (byte) print::i#2) [ idx print::msg#3 print::i#2 ] ( print:17 [ idx print::msg#3 print::i#2 ] print:27 [ idx print::msg#3 print::i#2 ] ) always clobbers reg byte a reg byte x
Removing always clobbered register reg byte a as potential for zp[1]:7 [ print::i#2 print::i#1 ]
Removing always clobbered register reg byte x as potential for zp[1]:7 [ print::i#2 print::i#1 ]
Statement [24] if((byte) 0!=*((byte*) print::msg#3 + (byte) print::i#1)) goto print::@1 [ idx print::msg#3 print::i#1 ] ( print:17 [ idx print::msg#3 print::i#1 ] print:27 [ idx print::msg#3 print::i#1 ] ) always clobbers reg byte a
Statement [1] (byte) idx ← (byte) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [12] call *((void()*) do10::fn#3) [ do10::fn#3 do10::i#2 ] ( main:3::do10:6 [ do10::fn#3 do10::i#2 ] main:3::do10:8 [ do10::fn#3 do10::i#2 ] ) always clobbers reg byte a reg byte x reg byte y
Statement [14] if((byte) do10::i#1!=(byte) $a) goto do10::@1 [ do10::fn#3 do10::i#1 ] ( main:3::do10:6 [ do10::fn#3 do10::i#1 ] main:3::do10:8 [ do10::fn#3 do10::i#1 ] ) always clobbers reg byte a
Statement [21] *((const byte*) SCREEN + (byte) idx) ← *((byte*) print::msg#3 + (byte) print::i#2) [ print::msg#3 print::i#2 ] ( print:17 [ print::msg#3 print::i#2 ] print:27 [ print::msg#3 print::i#2 ] ) always clobbers reg byte a reg byte x
Statement [21] *((const byte*) SCREEN + (byte) idx) ← *((byte*) print::msg#3 + (byte) print::i#2) [ idx print::msg#3 print::i#2 ] ( print:17 [ idx print::msg#3 print::i#2 ] print:27 [ idx print::msg#3 print::i#2 ] ) always clobbers reg byte a reg byte x
Statement [24] if((byte) 0!=*((byte*) print::msg#3 + (byte) print::i#1)) goto print::@1 [ idx print::msg#3 print::i#1 ] ( print:17 [ idx print::msg#3 print::i#1 ] print:27 [ idx print::msg#3 print::i#1 ] ) always clobbers reg byte a
Potential registers zp[2]:2 [ do10::fn#3 ] : zp[2]:2 ,
Potential registers zp[1]:4 [ do10::i#2 do10::i#1 ] : zp[1]:4 ,
@ -527,7 +527,7 @@ Potential registers zp[1]:8 [ idx ] : zp[1]:8 ,
REGISTER UPLIFT SCOPES
Uplift Scope [print] 27.5: zp[1]:7 [ print::i#2 print::i#1 ] 3.67: zp[2]:5 [ print::msg#3 ]
Uplift Scope [do10] 27.5: zp[1]:4 [ do10::i#2 do10::i#1 ] 0: zp[2]:2 [ do10::fn#3 ]
Uplift Scope [] 5: zp[1]:8 [ idx ]
Uplift Scope [] 4.38: zp[1]:8 [ idx ]
Uplift Scope [hello]
Uplift Scope [world]
Uplift Scope [main]
@ -775,7 +775,7 @@ FINAL SYMBOL TABLE
(void()) hello()
(label) hello::@return
(const byte*) hello::msg[(byte) 7] = (byte*) "hello "
(byte) idx loadstore zp[1]:7 5.0
(byte) idx loadstore zp[1]:7 4.375
(void()) main()
(label) main::@1
(label) main::@return

View File

@ -14,7 +14,7 @@
(void()) hello()
(label) hello::@return
(const byte*) hello::msg[(byte) 7] = (byte*) "hello "
(byte) idx loadstore zp[1]:7 5.0
(byte) idx loadstore zp[1]:7 4.375
(void()) main()
(label) main::@1
(label) main::@return

View File

@ -225,7 +225,7 @@ VARIABLE REGISTER WEIGHTS
(byte) hello::i
(byte) hello::i#1 151.5
(byte) hello::i#2 101.0
(byte) idx loadstore 21.78571428571429
(byte) idx loadstore 20.333333333333336
(void()) main()
Initial phi equivalence classes
@ -357,14 +357,14 @@ hello: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [1] (byte) idx ← (byte) 0 [ idx ] ( [ idx ] ) always clobbers reg byte a
Statement [16] *((const byte*) SCREEN + (byte) idx) ← *((const byte*) msg + (byte) hello::i#2) [ hello::i#2 ] ( main:3::do10:6::hello:10 [ do10::i#2 hello::i#2 ] ) always clobbers reg byte a reg byte y
Statement [16] *((const byte*) SCREEN + (byte) idx) ← *((const byte*) msg + (byte) hello::i#2) [ idx hello::i#2 ] ( main:3::do10:6::hello:10 [ do10::i#2 idx hello::i#2 ] ) always clobbers reg byte a reg byte y
Removing always clobbered register reg byte a as potential for zp[1]:2 [ do10::i#2 do10::i#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:2 [ do10::i#2 do10::i#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:3 [ hello::i#2 hello::i#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:3 [ hello::i#2 hello::i#1 ]
Statement [19] if((byte) 0!=*((const byte*) msg + (byte) hello::i#1)) goto hello::@1 [ idx hello::i#1 ] ( main:3::do10:6::hello:10 [ do10::i#2 idx hello::i#1 ] ) always clobbers reg byte a
Statement [1] (byte) idx ← (byte) 0 [ idx ] ( [ idx ] ) always clobbers reg byte a
Statement [16] *((const byte*) SCREEN + (byte) idx) ← *((const byte*) msg + (byte) hello::i#2) [ hello::i#2 ] ( main:3::do10:6::hello:10 [ do10::i#2 hello::i#2 ] ) always clobbers reg byte a reg byte y
Statement [16] *((const byte*) SCREEN + (byte) idx) ← *((const byte*) msg + (byte) hello::i#2) [ idx hello::i#2 ] ( main:3::do10:6::hello:10 [ do10::i#2 idx hello::i#2 ] ) always clobbers reg byte a reg byte y
Statement [19] if((byte) 0!=*((const byte*) msg + (byte) hello::i#1)) goto hello::@1 [ idx hello::i#1 ] ( main:3::do10:6::hello:10 [ do10::i#2 idx hello::i#1 ] ) always clobbers reg byte a
Potential registers zp[1]:2 [ do10::i#2 do10::i#1 ] : zp[1]:2 , reg byte x ,
Potential registers zp[1]:3 [ hello::i#2 hello::i#1 ] : zp[1]:3 , reg byte x ,
@ -373,7 +373,7 @@ Potential registers zp[1]:4 [ idx ] : zp[1]:4 ,
REGISTER UPLIFT SCOPES
Uplift Scope [hello] 252.5: zp[1]:3 [ hello::i#2 hello::i#1 ]
Uplift Scope [do10] 27.5: zp[1]:2 [ do10::i#2 do10::i#1 ]
Uplift Scope [] 21.79: zp[1]:4 [ idx ]
Uplift Scope [] 20.33: zp[1]:4 [ idx ]
Uplift Scope [main]
Uplifting [hello] best 4295 combination reg byte x [ hello::i#2 hello::i#1 ]
@ -551,7 +551,7 @@ FINAL SYMBOL TABLE
(byte) hello::i
(byte) hello::i#1 reg byte x 151.5
(byte) hello::i#2 reg byte x 101.0
(byte) idx loadstore zp[1]:3 21.78571428571429
(byte) idx loadstore zp[1]:3 20.333333333333336
(void()) main()
(label) main::@return
(const byte*) msg[] = (byte*) "hello "

View File

@ -16,7 +16,7 @@
(byte) hello::i
(byte) hello::i#1 reg byte x 151.5
(byte) hello::i#2 reg byte x 101.0
(byte) idx loadstore zp[1]:3 21.78571428571429
(byte) idx loadstore zp[1]:3 20.333333333333336
(void()) main()
(label) main::@return
(const byte*) msg[] = (byte*) "hello "

View File

@ -243,7 +243,7 @@ VARIABLE REGISTER WEIGHTS
(byte) hello::i
(byte) hello::i#1 151.5
(byte) hello::i#2 101.0
(byte) idx loadstore 17.941176470588236
(byte) idx loadstore 16.944444444444443
(void()) main()
(byte*) msg loadstore 14.857142857142858
@ -405,7 +405,7 @@ Statement [1] (byte*) msg ← (byte*) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [2] (byte) idx ← (byte) 0 [ idx ] ( [ idx ] ) always clobbers reg byte a
Statement [6] (byte*) msg ← (const byte*) msg1 [ msg idx ] ( main:4 [ msg idx ] ) always clobbers reg byte a
Statement [8] (byte*) msg ← (const byte*) msg2 [ msg idx ] ( main:4 [ msg idx ] ) always clobbers reg byte a
Statement [19] *((const byte*) SCREEN + (byte) idx) ← *((byte*) msg + (byte) hello::i#2) [ msg hello::i#2 ] ( main:4::do10:7::hello:13 [ do10::i#2 msg hello::i#2 ] main:4::do10:9::hello:13 [ do10::i#2 msg hello::i#2 ] ) always clobbers reg byte a reg byte x
Statement [19] *((const byte*) SCREEN + (byte) idx) ← *((byte*) msg + (byte) hello::i#2) [ msg idx hello::i#2 ] ( main:4::do10:7::hello:13 [ do10::i#2 msg idx hello::i#2 ] main:4::do10:9::hello:13 [ do10::i#2 msg idx hello::i#2 ] ) always clobbers reg byte a reg byte x
Removing always clobbered register reg byte a as potential for zp[1]:2 [ do10::i#2 do10::i#1 ]
Removing always clobbered register reg byte x as potential for zp[1]:2 [ do10::i#2 do10::i#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:3 [ hello::i#2 hello::i#1 ]
@ -415,7 +415,7 @@ Statement [1] (byte*) msg ← (byte*) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [2] (byte) idx ← (byte) 0 [ idx ] ( [ idx ] ) always clobbers reg byte a
Statement [6] (byte*) msg ← (const byte*) msg1 [ msg idx ] ( main:4 [ msg idx ] ) always clobbers reg byte a
Statement [8] (byte*) msg ← (const byte*) msg2 [ msg idx ] ( main:4 [ msg idx ] ) always clobbers reg byte a
Statement [19] *((const byte*) SCREEN + (byte) idx) ← *((byte*) msg + (byte) hello::i#2) [ msg hello::i#2 ] ( main:4::do10:7::hello:13 [ do10::i#2 msg hello::i#2 ] main:4::do10:9::hello:13 [ do10::i#2 msg hello::i#2 ] ) always clobbers reg byte a reg byte x
Statement [19] *((const byte*) SCREEN + (byte) idx) ← *((byte*) msg + (byte) hello::i#2) [ msg idx hello::i#2 ] ( main:4::do10:7::hello:13 [ do10::i#2 msg idx hello::i#2 ] main:4::do10:9::hello:13 [ do10::i#2 msg idx hello::i#2 ] ) always clobbers reg byte a reg byte x
Statement [22] if((byte) 0!=*((byte*) msg + (byte) hello::i#1)) goto hello::@1 [ msg idx hello::i#1 ] ( main:4::do10:7::hello:13 [ do10::i#2 msg idx hello::i#1 ] main:4::do10:9::hello:13 [ do10::i#2 msg idx hello::i#1 ] ) always clobbers reg byte a
Potential registers zp[1]:2 [ do10::i#2 do10::i#1 ] : zp[1]:2 , reg byte y ,
Potential registers zp[1]:3 [ hello::i#2 hello::i#1 ] : zp[1]:3 , reg byte y ,
@ -424,7 +424,7 @@ Potential registers zp[1]:6 [ idx ] : zp[1]:6 ,
REGISTER UPLIFT SCOPES
Uplift Scope [hello] 252.5: zp[1]:3 [ hello::i#2 hello::i#1 ]
Uplift Scope [] 17.94: zp[1]:6 [ idx ] 14.86: zp[2]:4 [ msg ]
Uplift Scope [] 16.94: zp[1]:6 [ idx ] 14.86: zp[2]:4 [ msg ]
Uplift Scope [do10] 27.5: zp[1]:2 [ do10::i#2 do10::i#1 ]
Uplift Scope [main]
@ -632,7 +632,7 @@ FINAL SYMBOL TABLE
(byte) hello::i
(byte) hello::i#1 reg byte y 151.5
(byte) hello::i#2 reg byte y 101.0
(byte) idx loadstore zp[1]:5 17.941176470588236
(byte) idx loadstore zp[1]:5 16.944444444444443
(void()) main()
(label) main::@1
(label) main::@return

View File

@ -16,7 +16,7 @@
(byte) hello::i
(byte) hello::i#1 reg byte y 151.5
(byte) hello::i#2 reg byte y 101.0
(byte) idx loadstore zp[1]:5 17.941176470588236
(byte) idx loadstore zp[1]:5 16.944444444444443
(void()) main()
(label) main::@1
(label) main::@return

View File

@ -101,7 +101,7 @@ fn1::@return: scope:[fn1] from fn1
VARIABLE REGISTER WEIGHTS
(void()) fn1()
(byte) idx loadstore 2.5
(byte) idx loadstore 1.25
(void()) main()
Initial phi equivalence classes
@ -173,13 +173,13 @@ fn1: {
// File Data
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [0] (byte) idx ← (byte) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [6] *((const byte*) SCREEN + (byte) idx) ← (byte) 'a' [ ] ( main:2 [ ] ) always clobbers reg byte a reg byte y
Statement [0] (byte) idx ← (byte) 0 [ idx ] ( [ idx ] ) always clobbers reg byte a
Statement [6] *((const byte*) SCREEN + (byte) idx) ← (byte) 'a' [ idx ] ( main:2 [ idx ] ) always clobbers reg byte a reg byte y
Statement [8] *((const byte*) SCREEN + (byte) idx) ← (byte) 'a' [ ] ( main:2 [ ] ) always clobbers reg byte a reg byte y
Potential registers zp[1]:2 [ idx ] : zp[1]:2 ,
REGISTER UPLIFT SCOPES
Uplift Scope [] 2.5: zp[1]:2 [ idx ]
Uplift Scope [] 1.25: zp[1]:2 [ idx ]
Uplift Scope [fn1]
Uplift Scope [main]
@ -275,7 +275,7 @@ FINAL SYMBOL TABLE
(const byte*) SCREEN = (byte*) 1024
(void()) fn1()
(label) fn1::@return
(byte) idx loadstore zp[1]:2 2.5
(byte) idx loadstore zp[1]:2 1.25
(void()) main()
(label) main::@return

View File

@ -4,7 +4,7 @@
(const byte*) SCREEN = (byte*) 1024
(void()) fn1()
(label) fn1::@return
(byte) idx loadstore zp[1]:2 2.5
(byte) idx loadstore zp[1]:2 1.25
(void()) main()
(label) main::@return

View File

@ -98,7 +98,7 @@ main::@return: scope:[main] from main::@2
VARIABLE REGISTER WEIGHTS
(void()) main()
(byte) x loadstore 37.0
(byte) x loadstore 7.400000000000001
Initial phi equivalence classes
Added variable x to live range equivalence class [ x ]
@ -161,13 +161,13 @@ main: {
// File Data
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [0] (byte) x ← (byte) $c [ ] ( [ ] ) always clobbers reg byte a
Statement [6] if((byte) x<(byte) $32) goto main::@1 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [0] (byte) x ← (byte) $c [ x ] ( [ x ] ) always clobbers reg byte a
Statement [6] if((byte) x<(byte) $32) goto main::@1 [ x ] ( main:2 [ x ] ) always clobbers reg byte a
Statement [7] (byte) x ← (byte) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a
Potential registers zp[1]:2 [ x ] : zp[1]:2 ,
REGISTER UPLIFT SCOPES
Uplift Scope [] 37: zp[1]:2 [ x ]
Uplift Scope [] 7.4: zp[1]:2 [ x ]
Uplift Scope [main]
Uplifting [] best 216 combination zp[1]:2 [ x ]
@ -255,7 +255,7 @@ FINAL SYMBOL TABLE
(label) main::@1
(label) main::@2
(label) main::@return
(byte) x loadstore zp[1]:2 37.0
(byte) x loadstore zp[1]:2 7.400000000000001
zp[1]:2 [ x ]

View File

@ -5,6 +5,6 @@
(label) main::@1
(label) main::@2
(label) main::@return
(byte) x loadstore zp[1]:2 37.0
(byte) x loadstore zp[1]:2 7.400000000000001
zp[1]:2 [ x ]

View File

@ -3,12 +3,14 @@
.pc = $80d "Program"
.label SCREEN = $400
main: {
ldx #0
ldy #0
ldx #'a'
__b1:
lda #'a'
sta SCREEN
inx
cpx #4
iny
cpy #4
bne __b1
rts
}

View File

@ -14,10 +14,12 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 )
[5] (byte) main::a#2 ← phi( main/(byte) 'a' main::@1/(byte) main::a#1 )
asm { lda#'a' staSCREEN }
[7] (byte) main::i#1 ← ++ (byte) main::i#2
[8] if((byte) main::i#1!=(byte) 4) goto main::@1
[7] (byte) main::a#1 ← ++ (byte) main::a#2
[8] (byte) main::i#1 ← ++ (byte) main::i#2
[9] if((byte) main::i#1!=(byte) 4) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
[9] return
[10] return
to:@return

View File

@ -7,11 +7,14 @@ CONTROL FLOW GRAPH SSA
(void()) main()
main: scope:[main] from @1
(byte) main::a#0 ← (byte) 'a'
(byte) main::i#0 ← (byte) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
(byte) main::a#2 ← phi( main/(byte) main::a#0 main::@1/(byte) main::a#1 )
asm { lda#'a' staSCREEN }
(byte) main::a#1 ← ++ (byte) main::a#2
(byte) main::i#1 ← (byte) main::i#2 + rangenext(0,3)
(bool~) main::$0 ← (byte) main::i#1 != rangelast(0,3)
if((bool~) main::$0) goto main::@1
@ -36,6 +39,10 @@ SYMBOL TABLE SSA
(bool~) main::$0
(label) main::@1
(label) main::@return
(byte) main::a
(byte) main::a#0
(byte) main::a#1
(byte) main::a#2
(byte) main::i
(byte) main::i#0
(byte) main::i#1
@ -43,19 +50,22 @@ SYMBOL TABLE SSA
Simplifying constant pointer cast (byte*) 1024
Successful SSA optimization PassNCastSimplification
Simple Condition (bool~) main::$0 [5] if((byte) main::i#1!=rangelast(0,3)) goto main::@1
Simple Condition (bool~) main::$0 [7] if((byte) main::i#1!=rangelast(0,3)) goto main::@1
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte) main::a#0 = 'a'
Constant (const byte) main::i#0 = 0
Successful SSA optimization Pass2ConstantIdentification
Resolved ranged next value [3] main::i#1 ← ++ main::i#2 to ++
Resolved ranged comparison value [5] if(main::i#1!=rangelast(0,3)) goto main::@1 to (number) 4
Resolved ranged next value [5] main::i#1 ← ++ main::i#2 to ++
Resolved ranged comparison value [7] if(main::i#1!=rangelast(0,3)) goto main::@1 to (number) 4
Adding number conversion cast (unumber) 4 in if((byte) main::i#1!=(number) 4) goto main::@1
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant integer cast 4
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (byte) 4
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inlining constant with var siblings (const byte) main::a#0
Inlining constant with var siblings (const byte) main::i#0
Constant inlined main::a#0 = (byte) 'a'
Constant inlined main::i#0 = (byte) 0
Successful SSA optimization Pass2ConstantInlining
Added new block during phi lifting main::@3(between main::@1 and main::@1)
@ -67,9 +77,10 @@ Adding NOP phi() at start of main
CALL GRAPH
Calls in [] to main:2
Created 1 initial phi equivalence classes
Coalesced [11] main::i#3 ← main::i#1
Coalesced down to 1 phi equivalence classes
Created 2 initial phi equivalence classes
Coalesced [12] main::a#3 ← main::a#1
Coalesced [13] main::i#3 ← main::i#1
Coalesced down to 2 phi equivalence classes
Culled Empty Block (label) @2
Culled Empty Block (label) main::@3
Adding NOP phi() at start of @begin
@ -94,26 +105,34 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 )
[5] (byte) main::a#2 ← phi( main/(byte) 'a' main::@1/(byte) main::a#1 )
asm { lda#'a' staSCREEN }
[7] (byte) main::i#1 ← ++ (byte) main::i#2
[8] if((byte) main::i#1!=(byte) 4) goto main::@1
[7] (byte) main::a#1 ← ++ (byte) main::a#2
[8] (byte) main::i#1 ← ++ (byte) main::i#2
[9] if((byte) main::i#1!=(byte) 4) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
[9] return
[10] return
to:@return
VARIABLE REGISTER WEIGHTS
(void()) main()
(byte) main::a
(byte) main::a#1 7.333333333333333
(byte) main::a#2 11.0
(byte) main::i
(byte) main::i#1 16.5
(byte) main::i#2 11.0
(byte) main::i#2 7.333333333333333
Initial phi equivalence classes
[ main::a#2 main::a#1 ]
[ main::i#2 main::i#1 ]
Complete equivalence classes
[ main::a#2 main::a#1 ]
[ main::i#2 main::i#1 ]
Allocated zp[1]:2 [ main::i#2 main::i#1 ]
Allocated zp[1]:2 [ main::a#2 main::a#1 ]
Allocated zp[1]:3 [ main::i#2 main::i#1 ]
INITIAL ASM
Target platform is c64basic / MOS6502X
@ -142,48 +161,57 @@ __bend_from___b1:
__bend:
// main
main: {
.label i = 2
.label a = 2
.label i = 3
// [5] phi from main to main::@1 [phi:main->main::@1]
__b1_from_main:
// [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0
sta.z i
// [5] phi (byte) main::a#2 = (byte) 'a' [phi:main->main::@1#1] -- vbuz1=vbuc1
lda #'a'
sta.z a
jmp __b1
// [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
__b1_from___b1:
// [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
// [5] phi (byte) main::a#2 = (byte) main::a#1 [phi:main::@1->main::@1#1] -- register_copy
jmp __b1
// main::@1
__b1:
// asm { lda#'a' staSCREEN }
lda #'a'
sta SCREEN
// [7] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1
// [7] (byte) main::a#1 ← ++ (byte) main::a#2 -- vbuz1=_inc_vbuz1
inc.z a
// [8] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1
inc.z i
// [8] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuz1_neq_vbuc1_then_la1
// [9] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuz1_neq_vbuc1_then_la1
lda #4
cmp.z i
bne __b1_from___b1
jmp __breturn
// main::@return
__breturn:
// [9] return
// [10] return
rts
}
// File Data
REGISTER UPLIFT POTENTIAL REGISTERS
Statement asm { lda#'a' staSCREEN } always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::i#2 main::i#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::a#2 main::a#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::i#2 main::i#1 ]
Statement asm { lda#'a' staSCREEN } always clobbers reg byte a
Potential registers zp[1]:2 [ main::i#2 main::i#1 ] : zp[1]:2 , reg byte x , reg byte y ,
Potential registers zp[1]:2 [ main::a#2 main::a#1 ] : zp[1]:2 , reg byte x , reg byte y ,
Potential registers zp[1]:3 [ main::i#2 main::i#1 ] : zp[1]:3 , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 27.5: zp[1]:2 [ main::i#2 main::i#1 ]
Uplift Scope [main] 23.83: zp[1]:3 [ main::i#2 main::i#1 ] 18.33: zp[1]:2 [ main::a#2 main::a#1 ]
Uplift Scope []
Uplifting [main] best 253 combination reg byte x [ main::i#2 main::i#1 ]
Uplifting [] best 253 combination
Uplifting [main] best 293 combination reg byte y [ main::i#2 main::i#1 ] reg byte x [ main::a#2 main::a#1 ]
Uplifting [] best 293 combination
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
@ -213,27 +241,32 @@ __bend:
main: {
// [5] phi from main to main::@1 [phi:main->main::@1]
__b1_from_main:
// [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
ldx #0
// [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuyy=vbuc1
ldy #0
// [5] phi (byte) main::a#2 = (byte) 'a' [phi:main->main::@1#1] -- vbuxx=vbuc1
ldx #'a'
jmp __b1
// [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
__b1_from___b1:
// [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
// [5] phi (byte) main::a#2 = (byte) main::a#1 [phi:main::@1->main::@1#1] -- register_copy
jmp __b1
// main::@1
__b1:
// asm { lda#'a' staSCREEN }
lda #'a'
sta SCREEN
// [7] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuxx=_inc_vbuxx
// [7] (byte) main::a#1 ← ++ (byte) main::a#2 -- vbuxx=_inc_vbuxx
inx
// [8] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #4
// [8] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuyy=_inc_vbuyy
iny
// [9] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuyy_neq_vbuc1_then_la1
cpy #4
bne __b1_from___b1
jmp __breturn
// main::@return
__breturn:
// [9] return
// [10] return
rts
}
// File Data
@ -272,15 +305,19 @@ FINAL SYMBOL TABLE
(void()) main()
(label) main::@1
(label) main::@return
(byte) main::a
(byte) main::a#1 reg byte x 7.333333333333333
(byte) main::a#2 reg byte x 11.0
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 11.0
(byte) main::i#1 reg byte y 16.5
(byte) main::i#2 reg byte y 7.333333333333333
reg byte x [ main::i#2 main::i#1 ]
reg byte x [ main::a#2 main::a#1 ]
reg byte y [ main::i#2 main::i#1 ]
FINAL ASSEMBLER
Score: 151
Score: 191
// File Comments
// Upstart
@ -299,25 +336,31 @@ Score: 151
// main
main: {
// [5] phi from main to main::@1 [phi:main->main::@1]
// [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
ldx #0
// [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuyy=vbuc1
ldy #0
// [5] phi (byte) main::a#2 = (byte) 'a' [phi:main->main::@1#1] -- vbuxx=vbuc1
ldx #'a'
// [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
// [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
// [5] phi (byte) main::a#2 = (byte) main::a#1 [phi:main::@1->main::@1#1] -- register_copy
// main::@1
__b1:
// asm
// asm { lda#'a' staSCREEN }
lda #'a'
sta SCREEN
// for( byte i:0..3)
// [7] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuxx=_inc_vbuxx
// a++;
// [7] (byte) main::a#1 ← ++ (byte) main::a#2 -- vbuxx=_inc_vbuxx
inx
// [8] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #4
// for( byte i:0..3)
// [8] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuyy=_inc_vbuyy
iny
// [9] if((byte) main::i#1!=(byte) 4) goto main::@1 -- vbuyy_neq_vbuc1_then_la1
cpy #4
bne __b1
// main::@return
// }
// [9] return
// [10] return
rts
}
// File Data

View File

@ -5,8 +5,12 @@
(void()) main()
(label) main::@1
(label) main::@return
(byte) main::a
(byte) main::a#1 reg byte x 7.333333333333333
(byte) main::a#2 reg byte x 11.0
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 11.0
(byte) main::i#1 reg byte y 16.5
(byte) main::i#2 reg byte y 7.333333333333333
reg byte x [ main::i#2 main::i#1 ]
reg byte x [ main::a#2 main::a#1 ]
reg byte y [ main::i#2 main::i#1 ]

View File

@ -106,8 +106,8 @@ irq::@return: scope:[irq] from irq
VARIABLE REGISTER WEIGHTS
(byte) col1 loadstore 80.0
(byte) col2 loadstore 4.0
(byte) col1 loadstore 8.0
(byte) col2 loadstore 2.6666666666666665
interrupt(KERNEL_MIN)(void()) irq()
(void()) main()
@ -191,13 +191,13 @@ REGISTER UPLIFT POTENTIAL REGISTERS
Statement [0] (byte) col1 ← (byte) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [1] (byte) col2 ← (byte) 8 [ ] ( [ ] ) always clobbers reg byte a
Statement [5] *((const void()**) KERNEL_IRQ) ← &interrupt(KERNEL_MIN)(void()) irq() [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [7] *((const byte*) SCREEN+(byte) $28) ← (byte) col1 [ col2 ] ( [ col2 ] ) always clobbers reg byte a
Statement [9] *((const byte*) SCREEN+(byte) $29) ← (byte) col2 [ ] ( [ ] ) always clobbers reg byte a
Statement [7] *((const byte*) SCREEN+(byte) $28) ← (byte) col1 [ col1 col2 ] ( [ col1 col2 ] ) always clobbers reg byte a
Statement [9] *((const byte*) SCREEN+(byte) $29) ← (byte) col2 [ col2 ] ( [ col2 ] ) always clobbers reg byte a
Potential registers zp[1]:2 [ col1 ] : zp[1]:2 ,
Potential registers zp[1]:3 [ col2 ] : zp[1]:3 ,
REGISTER UPLIFT SCOPES
Uplift Scope [] 80: zp[1]:2 [ col1 ] 4: zp[1]:3 [ col2 ]
Uplift Scope [] 8: zp[1]:2 [ col1 ] 2.67: zp[1]:3 [ col2 ]
Uplift Scope [main]
Uplift Scope [irq]
@ -298,8 +298,8 @@ FINAL SYMBOL TABLE
(label) @end
(const void()**) KERNEL_IRQ = (void()**) 788
(const byte*) SCREEN = (byte*) 1024
(byte) col1 loadstore zp[1]:2 80.0
(byte) col2 loadstore zp[1]:3 4.0
(byte) col1 loadstore zp[1]:2 8.0
(byte) col2 loadstore zp[1]:3 2.6666666666666665
interrupt(KERNEL_MIN)(void()) irq()
(label) irq::@return
(void()) main()

View File

@ -3,8 +3,8 @@
(label) @end
(const void()**) KERNEL_IRQ = (void()**) 788
(const byte*) SCREEN = (byte*) 1024
(byte) col1 loadstore zp[1]:2 80.0
(byte) col2 loadstore zp[1]:3 4.0
(byte) col1 loadstore zp[1]:2 8.0
(byte) col2 loadstore zp[1]:3 2.6666666666666665
interrupt(KERNEL_MIN)(void()) irq()
(label) irq::@return
(void()) main()

View File

@ -263,7 +263,7 @@ irq::@return: scope:[irq] from irq
VARIABLE REGISTER WEIGHTS
(byte) col1 loadstore 4.0
(byte) col1 loadstore 2.6666666666666665
interrupt(KERNEL_MIN)(void()) irq()
(void()) main()
(byte~) main::$0 20002.0
@ -444,13 +444,13 @@ Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::y
Removing always clobbered register reg byte a as potential for zp[1]:4 [ main::a#2 main::a#1 ]
Statement [17] *((const byte*) IRQ_STATUS) ← (byte) 1 [ col1 ] ( [ col1 ] ) always clobbers reg byte a
Statement asm { lda$dc0d } always clobbers reg byte a
Statement [19] *((const byte*) SCREEN+(byte) $28) ← (byte) col1 [ ] ( [ ] ) always clobbers reg byte a
Statement [19] *((const byte*) SCREEN+(byte) $28) ← (byte) col1 [ col1 ] ( [ col1 ] ) always clobbers reg byte a
Statement [0] (byte) col1 ← (byte) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [4] *((const void()**) KERNEL_IRQ) ← &interrupt(KERNEL_MIN)(void()) irq() [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [8] (byte~) main::$0 ← (byte) main::a#2 + (byte) main::y#4 [ main::x#6 main::y#4 main::a#2 main::$0 ] ( main:2 [ main::x#6 main::y#4 main::a#2 main::$0 ] ) always clobbers reg byte a
Statement [17] *((const byte*) IRQ_STATUS) ← (byte) 1 [ col1 ] ( [ col1 ] ) always clobbers reg byte a
Statement asm { lda$dc0d } always clobbers reg byte a
Statement [19] *((const byte*) SCREEN+(byte) $28) ← (byte) col1 [ ] ( [ ] ) always clobbers reg byte a
Statement [19] *((const byte*) SCREEN+(byte) $28) ← (byte) col1 [ col1 ] ( [ col1 ] ) always clobbers reg byte a
Potential registers zp[1]:2 [ main::x#6 main::x#1 ] : zp[1]:2 , reg byte x , reg byte y ,
Potential registers zp[1]:3 [ main::y#4 main::y#1 ] : zp[1]:3 , reg byte x , reg byte y ,
Potential registers zp[1]:4 [ main::a#2 main::a#1 ] : zp[1]:4 , reg byte x , reg byte y ,
@ -459,7 +459,7 @@ Potential registers zp[1]:6 [ main::$0 ] : zp[1]:6 , reg byte a , reg byte x , r
REGISTER UPLIFT SCOPES
Uplift Scope [main] 25,002.5: zp[1]:4 [ main::a#2 main::a#1 ] 20,002: zp[1]:6 [ main::$0 ] 3,502: zp[1]:3 [ main::y#4 main::y#1 ] 1,194.67: zp[1]:2 [ main::x#6 main::x#1 ]
Uplift Scope [] 4: zp[1]:5 [ col1 ]
Uplift Scope [] 2.67: zp[1]:5 [ col1 ]
Uplift Scope [irq]
Uplifting [main] best 323337 combination reg byte y [ main::a#2 main::a#1 ] reg byte a [ main::$0 ] zp[1]:3 [ main::y#4 main::y#1 ] reg byte x [ main::x#6 main::x#1 ]
@ -653,7 +653,7 @@ FINAL SYMBOL TABLE
(const byte*) IRQ_STATUS = (byte*) 53273
(const void()**) KERNEL_IRQ = (void()**) 788
(const byte*) SCREEN = (byte*) 1024
(byte) col1 loadstore zp[1]:3 4.0
(byte) col1 loadstore zp[1]:3 2.6666666666666665
interrupt(KERNEL_MIN)(void()) irq()
(label) irq::@return
(void()) main()

View File

@ -4,7 +4,7 @@
(const byte*) IRQ_STATUS = (byte*) 53273
(const void()**) KERNEL_IRQ = (void()**) 788
(const byte*) SCREEN = (byte*) 1024
(byte) col1 loadstore zp[1]:3 4.0
(byte) col1 loadstore zp[1]:3 2.6666666666666665
interrupt(KERNEL_MIN)(void()) irq()
(label) irq::@return
(void()) main()

View File

@ -280,7 +280,7 @@ table_driven_irq::@2: scope:[table_driven_irq] from table_driven_irq::@1
VARIABLE REGISTER WEIGHTS
(byte) irq_idx loadstore 6.857142857142857
(byte) irq_idx loadstore 6.0
(void()) main()
interrupt(KERNEL_MIN)(void()) table_driven_irq()
(byte) table_driven_irq::idx
@ -469,7 +469,7 @@ Statement [9] *((const byte*) IRQ_ENABLE) ← (const byte) IRQ_RASTER [ ] ( main
Statement [10] *((const byte*) IRQ_STATUS) ← (const byte) IRQ_RASTER [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [11] *((const void()**) KERNEL_IRQ) ← &interrupt(KERNEL_MIN)(void()) table_driven_irq() [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [15] (byte) table_driven_irq::idx#0 ← *((const byte*) IRQ_CHANGE_IDX + (byte) irq_idx) [ irq_idx table_driven_irq::idx#0 ] ( [ irq_idx table_driven_irq::idx#0 ] ) always clobbers reg byte y
Statement [16] (byte) table_driven_irq::val#0 ← *((const byte*) IRQ_CHANGE_VAL + (byte) irq_idx) [ table_driven_irq::idx#0 table_driven_irq::val#0 ] ( [ table_driven_irq::idx#0 table_driven_irq::val#0 ] ) always clobbers reg byte y
Statement [16] (byte) table_driven_irq::val#0 ← *((const byte*) IRQ_CHANGE_VAL + (byte) irq_idx) [ irq_idx table_driven_irq::idx#0 table_driven_irq::val#0 ] ( [ irq_idx table_driven_irq::idx#0 table_driven_irq::val#0 ] ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:3 [ table_driven_irq::idx#0 ]
Statement [20] *((const byte*) IRQ_STATUS) ← (const byte) IRQ_RASTER [ table_driven_irq::val#0 ] ( [ table_driven_irq::val#0 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:4 [ table_driven_irq::val#0 ]
@ -484,7 +484,7 @@ Statement [9] *((const byte*) IRQ_ENABLE) ← (const byte) IRQ_RASTER [ ] ( main
Statement [10] *((const byte*) IRQ_STATUS) ← (const byte) IRQ_RASTER [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [11] *((const void()**) KERNEL_IRQ) ← &interrupt(KERNEL_MIN)(void()) table_driven_irq() [ ] ( main:3 [ ] ) always clobbers reg byte a
Statement [15] (byte) table_driven_irq::idx#0 ← *((const byte*) IRQ_CHANGE_IDX + (byte) irq_idx) [ irq_idx table_driven_irq::idx#0 ] ( [ irq_idx table_driven_irq::idx#0 ] ) always clobbers reg byte y
Statement [16] (byte) table_driven_irq::val#0 ← *((const byte*) IRQ_CHANGE_VAL + (byte) irq_idx) [ table_driven_irq::idx#0 table_driven_irq::val#0 ] ( [ table_driven_irq::idx#0 table_driven_irq::val#0 ] ) always clobbers reg byte y
Statement [16] (byte) table_driven_irq::val#0 ← *((const byte*) IRQ_CHANGE_VAL + (byte) irq_idx) [ irq_idx table_driven_irq::idx#0 table_driven_irq::val#0 ] ( [ irq_idx table_driven_irq::idx#0 table_driven_irq::val#0 ] ) always clobbers reg byte y
Statement [20] *((const byte*) IRQ_STATUS) ← (const byte) IRQ_RASTER [ table_driven_irq::val#0 ] ( [ table_driven_irq::val#0 ] ) always clobbers reg byte a
Statement [23] (byte) irq_idx ← (byte) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [25] *((const byte*) SCREEN+-(const byte) VIC_SIZE+(word) $3f8 + (byte) table_driven_irq::idx#0) ← (byte) table_driven_irq::val#0 [ irq_idx ] ( [ irq_idx ] ) always clobbers reg byte a
@ -495,7 +495,7 @@ Potential registers zp[1]:4 [ table_driven_irq::val#0 ] : zp[1]:4 , reg byte x ,
REGISTER UPLIFT SCOPES
Uplift Scope [table_driven_irq] 11: zp[1]:3 [ table_driven_irq::idx#0 ] 6.17: zp[1]:4 [ table_driven_irq::val#0 ]
Uplift Scope [] 6.86: zp[1]:2 [ irq_idx ]
Uplift Scope [] 6: zp[1]:2 [ irq_idx ]
Uplift Scope [main]
Uplifting [table_driven_irq] best 762 combination reg byte a [ table_driven_irq::idx#0 ] reg byte x [ table_driven_irq::val#0 ]
@ -708,7 +708,7 @@ FINAL SYMBOL TABLE
(const byte*) VIC_BASE = (byte*) 53248
(const byte*) VIC_CONTROL = (byte*) 53265
(const byte) VIC_SIZE = (byte) $30
(byte) irq_idx loadstore zp[1]:2 6.857142857142857
(byte) irq_idx loadstore zp[1]:2 6.0
(void()) main()
(label) main::@return
interrupt(KERNEL_MIN)(void()) table_driven_irq()

View File

@ -16,7 +16,7 @@
(const byte*) VIC_BASE = (byte*) 53248
(const byte*) VIC_CONTROL = (byte*) 53265
(const byte) VIC_SIZE = (byte) $30
(byte) irq_idx loadstore zp[1]:2 6.857142857142857
(byte) irq_idx loadstore zp[1]:2 6.0
(void()) main()
(label) main::@return
interrupt(KERNEL_MIN)(void()) table_driven_irq()

View File

@ -163,7 +163,7 @@ irq::@return: scope:[irq] from irq irq::@1
VARIABLE REGISTER WEIGHTS
(byte) col loadstore 17.428571428571427
(byte) col loadstore 15.25
interrupt(KERNEL_MIN)(void()) irq()
(void()) main()
@ -256,11 +256,11 @@ Statement [5] if((byte) col<(byte) $a+(byte) 1) goto main::@1 [ col ] ( main:2 [
Statement [6] (byte) col ← (byte) 0 [ col ] ( main:2 [ col ] ) always clobbers reg byte a
Statement asm { lda$dc0d } always clobbers reg byte a
Statement [8] *((const byte*) BGCOL) ← (byte) col [ col ] ( [ col ] ) always clobbers reg byte a
Statement [9] if((byte) col==(byte) 0) goto irq::@return [ ] ( [ ] ) always clobbers reg byte a
Statement [9] if((byte) col==(byte) 0) goto irq::@return [ col ] ( [ col ] ) always clobbers reg byte a
Potential registers zp[1]:2 [ col ] : zp[1]:2 ,
REGISTER UPLIFT SCOPES
Uplift Scope [] 17.43: zp[1]:2 [ col ]
Uplift Scope [] 15.25: zp[1]:2 [ col ]
Uplift Scope [main]
Uplift Scope [irq]
@ -375,7 +375,7 @@ FINAL SYMBOL TABLE
(label) @end
(const byte*) BGCOL = (byte*) 53280
(const void()**) KERNEL_IRQ = (void()**) 788
(byte) col loadstore zp[1]:2 17.428571428571427
(byte) col loadstore zp[1]:2 15.25
interrupt(KERNEL_MIN)(void()) irq()
(label) irq::@1
(label) irq::@return

View File

@ -3,7 +3,7 @@
(label) @end
(const byte*) BGCOL = (byte*) 53280
(const void()**) KERNEL_IRQ = (void()**) 788
(byte) col loadstore zp[1]:2 17.428571428571427
(byte) col loadstore zp[1]:2 15.25
interrupt(KERNEL_MIN)(void()) irq()
(label) irq::@1
(label) irq::@return

View File

@ -0,0 +1,40 @@
// Demonstrates problem with __ma coalescing
// c1a is erroneously zp-coalesced with c1A
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
.label SCREEN = $400
main: {
__b1:
lda c1A
sta c1a
lda #0
sta i
__b2:
lda i
cmp #$28
bcc __b3
lax c1A
axs #-[3]
stx c1A
jmp __b1
__b3:
ldy c1a
lda SINTABLE,y
ldy i
sta SCREEN,y
lax c1a
axs #-[4]
stx c1a
inc i
jmp __b2
c1a: .byte 0
i: .byte 0
}
.align $100
SINTABLE:
.for(var i=0;i<$100;i++)
.byte round(127.5+127.5*sin(2*PI*i/256))
// Plasma state variables
c1A: .byte 0

View File

@ -0,0 +1,29 @@
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
[1] phi()
[2] call main
to:@end
@end: scope:[] from @1
[3] phi()
(void()) main()
main: scope:[main] from @1
[4] phi()
to:main::@1
main::@1: scope:[main] from main main::@4
[5] (byte) main::c1a ← (byte) c1A
[6] (byte) main::i ← (byte) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
[7] if((byte) main::i<(byte) $28) goto main::@3
to:main::@4
main::@4: scope:[main] from main::@2
[8] (byte) c1A ← (byte) c1A + (byte) 3
to:main::@1
main::@3: scope:[main] from main::@2
[9] *((const byte*) SCREEN + (byte) main::i) ← *((const byte*) SINTABLE + (byte) main::c1a)
[10] (byte) main::c1a ← (byte) main::c1a + (byte) 4
[11] (byte) main::i ← ++ (byte) main::i
to:main::@2

View File

@ -0,0 +1,456 @@
Resolved forward reference SINTABLE to (const byte*) SINTABLE
Culled Empty Block (label) main::@11
Culled Empty Block (label) main::@3
Culled Empty Block (label) main::@12
Culled Empty Block (label) main::@7
Culled Empty Block (label) main::@8
Culled Empty Block (label) main::@9
Culled Empty Block (label) main::@10
CONTROL FLOW GRAPH SSA
@begin: scope:[] from
to:@1
(void()) main()
main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@6
if(true) goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte) main::c1a ← (byte) c1A
(byte) main::i ← (byte) 0
to:main::@4
main::@4: scope:[main] from main::@2 main::@5
(bool~) main::$0 ← (byte) main::i < (number) $28
if((bool~) main::$0) goto main::@5
to:main::@6
main::@5: scope:[main] from main::@4
*((const byte*) SCREEN + (byte) main::i) ← *((const byte*) SINTABLE + (byte) main::c1a)
(byte) main::c1a ← (byte) main::c1a + (number) 4
(byte) main::i ← ++ (byte) main::i
to:main::@4
main::@6: scope:[main] from main::@4
(byte) c1A ← (byte) c1A + (number) 3
to:main::@1
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main
to:@2
@2: scope:[] from @1
to:@end
@end: scope:[] from @2
SYMBOL TABLE SSA
(label) @1
(label) @2
(label) @begin
(label) @end
(const byte*) SCREEN = (byte*)(number) $400
(const byte*) SINTABLE[(number) $100] = kickasm {{ .for(var i=0;i<$100;i++)
.byte round(127.5+127.5*sin(2*PI*i/256))
}}
(byte) c1A loadstore = (byte) 0
(void()) main()
(bool~) main::$0
(label) main::@1
(label) main::@2
(label) main::@4
(label) main::@5
(label) main::@6
(label) main::@return
(byte) main::c1a loadstore
(byte) main::i loadstore
Adding number conversion cast (unumber) $28 in (bool~) main::$0 ← (byte) main::i < (number) $28
Adding number conversion cast (unumber) 4 in (byte) main::c1a ← (byte) main::c1a + (number) 4
Adding number conversion cast (unumber) 3 in (byte) c1A ← (byte) c1A + (number) 3
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant pointer cast (byte*) 1024
Simplifying constant integer cast $28
Simplifying constant integer cast 4
Simplifying constant integer cast 3
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (byte) $28
Finalized unsigned number type (byte) 4
Finalized unsigned number type (byte) 3
Successful SSA optimization PassNFinalizeNumberTypeConversions
Simple Condition (bool~) main::$0 [4] if((byte) main::i<(byte) $28) goto main::@5
Successful SSA optimization Pass2ConditionalJumpSimplification
if() condition always true - replacing block destination [0] if(true) goto main::@2
Successful SSA optimization Pass2ConstantIfs
Removing unused block main::@return
Successful SSA optimization Pass2EliminateUnusedBlocks
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @2
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@1
CALL GRAPH
Calls in [] to main:2
Created 0 initial phi equivalence classes
Coalesced down to 0 phi equivalence classes
Culled Empty Block (label) @2
Culled Empty Block (label) main::@1
Renumbering block main::@2 to main::@1
Renumbering block main::@4 to main::@2
Renumbering block main::@5 to main::@3
Renumbering block main::@6 to main::@4
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
[1] phi()
[2] call main
to:@end
@end: scope:[] from @1
[3] phi()
(void()) main()
main: scope:[main] from @1
[4] phi()
to:main::@1
main::@1: scope:[main] from main main::@4
[5] (byte) main::c1a ← (byte) c1A
[6] (byte) main::i ← (byte) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@3
[7] if((byte) main::i<(byte) $28) goto main::@3
to:main::@4
main::@4: scope:[main] from main::@2
[8] (byte) c1A ← (byte) c1A + (byte) 3
to:main::@1
main::@3: scope:[main] from main::@2
[9] *((const byte*) SCREEN + (byte) main::i) ← *((const byte*) SINTABLE + (byte) main::c1a)
[10] (byte) main::c1a ← (byte) main::c1a + (byte) 4
[11] (byte) main::i ← ++ (byte) main::i
to:main::@2
VARIABLE REGISTER WEIGHTS
(byte) c1A loadstore 3.3000000000000003 = (byte) 0
(void()) main()
(byte) main::c1a loadstore 52.33333333333333
(byte) main::i loadstore 83.0
Initial phi equivalence classes
Added variable main::c1a to live range equivalence class [ main::c1a ]
Added variable main::i to live range equivalence class [ main::i ]
Added variable c1A to live range equivalence class [ c1A ]
Complete equivalence classes
[ main::c1a ]
[ main::i ]
[ c1A ]
Allocated mem[1] [ main::c1a ]
Allocated mem[1] [ main::i ]
Allocated mem[1] [ c1A ]
INITIAL ASM
Target platform is c64basic / MOS6502X
// File Comments
// Demonstrates problem with __ma coalescing
// c1a is erroneously zp-coalesced with c1A
// Upstart
.pc = $801 "Basic"
:BasicUpstart(__bbegin)
.pc = $80d "Program"
// Global Constants & labels
.label SCREEN = $400
// @begin
__bbegin:
// [1] phi from @begin to @1 [phi:@begin->@1]
__b1_from___bbegin:
jmp __b1
// @1
__b1:
// [2] call main
// [4] phi from @1 to main [phi:@1->main]
main_from___b1:
jsr main
// [3] phi from @1 to @end [phi:@1->@end]
__bend_from___b1:
jmp __bend
// @end
__bend:
// main
main: {
jmp __b1
// main::@1
__b1:
// [5] (byte) main::c1a ← (byte) c1A -- vbum1=vbum2
lda c1A
sta c1a
// [6] (byte) main::i ← (byte) 0 -- vbum1=vbuc1
lda #0
sta i
jmp __b2
// main::@2
__b2:
// [7] if((byte) main::i<(byte) $28) goto main::@3 -- vbum1_lt_vbuc1_then_la1
lda i
cmp #$28
bcc __b3
jmp __b4
// main::@4
__b4:
// [8] (byte) c1A ← (byte) c1A + (byte) 3 -- vbum1=vbum1_plus_vbuc1
lax c1A
axs #-[3]
stx c1A
jmp __b1
// main::@3
__b3:
// [9] *((const byte*) SCREEN + (byte) main::i) ← *((const byte*) SINTABLE + (byte) main::c1a) -- pbuc1_derefidx_vbum1=pbuc2_derefidx_vbum2
ldy c1a
lda SINTABLE,y
ldy i
sta SCREEN,y
// [10] (byte) main::c1a ← (byte) main::c1a + (byte) 4 -- vbum1=vbum1_plus_vbuc1
lax c1a
axs #-[4]
stx c1a
// [11] (byte) main::i ← ++ (byte) main::i -- vbum1=_inc_vbum1
inc i
jmp __b2
c1a: .byte 0
i: .byte 0
}
// File Data
.align $100
SINTABLE:
.for(var i=0;i<$100;i++)
.byte round(127.5+127.5*sin(2*PI*i/256))
// Plasma state variables
c1A: .byte 0
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [5] (byte) main::c1a ← (byte) c1A [ main::c1a c1A ] ( main:2 [ main::c1a c1A ] ) always clobbers reg byte a
Statement [6] (byte) main::i ← (byte) 0 [ main::c1a c1A main::i ] ( main:2 [ main::c1a c1A main::i ] ) always clobbers reg byte a
Statement [7] if((byte) main::i<(byte) $28) goto main::@3 [ main::c1a c1A main::i ] ( main:2 [ main::c1a c1A main::i ] ) always clobbers reg byte a
Statement [8] (byte) c1A ← (byte) c1A + (byte) 3 [ c1A ] ( main:2 [ c1A ] ) always clobbers reg byte a reg byte x
Statement [9] *((const byte*) SCREEN + (byte) main::i) ← *((const byte*) SINTABLE + (byte) main::c1a) [ main::c1a c1A main::i ] ( main:2 [ main::c1a c1A main::i ] ) always clobbers reg byte a reg byte y
Statement [10] (byte) main::c1a ← (byte) main::c1a + (byte) 4 [ main::c1a c1A main::i ] ( main:2 [ main::c1a c1A main::i ] ) always clobbers reg byte a reg byte x
Potential registers mem[1] [ main::c1a ] : mem[1] ,
Potential registers mem[1] [ main::i ] : mem[1] ,
Potential registers mem[1] [ c1A ] : mem[1] ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 83: mem[1] [ main::i ] 52.33: mem[1] [ main::c1a ]
Uplift Scope [] 3.3: mem[1] [ c1A ]
Uplifting [main] best 5142 combination mem[1] [ main::i ] mem[1] [ main::c1a ]
Uplifting [] best 5142 combination mem[1] [ c1A ]
Attempting to uplift remaining variables inmem[1] [ main::i ]
Uplifting [main] best 5142 combination mem[1] [ main::i ]
Attempting to uplift remaining variables inmem[1] [ main::c1a ]
Uplifting [main] best 5142 combination mem[1] [ main::c1a ]
Attempting to uplift remaining variables inmem[1] [ c1A ]
Uplifting [] best 5142 combination mem[1] [ c1A ]
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
// Demonstrates problem with __ma coalescing
// c1a is erroneously zp-coalesced with c1A
// Upstart
.pc = $801 "Basic"
:BasicUpstart(__bbegin)
.pc = $80d "Program"
// Global Constants & labels
.label SCREEN = $400
// @begin
__bbegin:
// [1] phi from @begin to @1 [phi:@begin->@1]
__b1_from___bbegin:
jmp __b1
// @1
__b1:
// [2] call main
// [4] phi from @1 to main [phi:@1->main]
main_from___b1:
jsr main
// [3] phi from @1 to @end [phi:@1->@end]
__bend_from___b1:
jmp __bend
// @end
__bend:
// main
main: {
jmp __b1
// main::@1
__b1:
// [5] (byte) main::c1a ← (byte) c1A -- vbum1=vbum2
lda c1A
sta c1a
// [6] (byte) main::i ← (byte) 0 -- vbum1=vbuc1
lda #0
sta i
jmp __b2
// main::@2
__b2:
// [7] if((byte) main::i<(byte) $28) goto main::@3 -- vbum1_lt_vbuc1_then_la1
lda i
cmp #$28
bcc __b3
jmp __b4
// main::@4
__b4:
// [8] (byte) c1A ← (byte) c1A + (byte) 3 -- vbum1=vbum1_plus_vbuc1
lax c1A
axs #-[3]
stx c1A
jmp __b1
// main::@3
__b3:
// [9] *((const byte*) SCREEN + (byte) main::i) ← *((const byte*) SINTABLE + (byte) main::c1a) -- pbuc1_derefidx_vbum1=pbuc2_derefidx_vbum2
ldy c1a
lda SINTABLE,y
ldy i
sta SCREEN,y
// [10] (byte) main::c1a ← (byte) main::c1a + (byte) 4 -- vbum1=vbum1_plus_vbuc1
lax c1a
axs #-[4]
stx c1a
// [11] (byte) main::i ← ++ (byte) main::i -- vbum1=_inc_vbum1
inc i
jmp __b2
c1a: .byte 0
i: .byte 0
}
// File Data
.align $100
SINTABLE:
.for(var i=0;i<$100;i++)
.byte round(127.5+127.5*sin(2*PI*i/256))
// Plasma state variables
c1A: .byte 0
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __b1
Removing instruction jmp __bend
Removing instruction jmp __b1
Removing instruction jmp __b2
Removing instruction jmp __b4
Succesful ASM optimization Pass5NextJumpElimination
Replacing label __bbegin with __b1
Removing instruction __bbegin:
Removing instruction __b1_from___bbegin:
Removing instruction main_from___b1:
Removing instruction __bend_from___b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction __bend:
Removing instruction __b4:
Succesful ASM optimization Pass5UnusedLabelElimination
Updating BasicUpstart to call main directly
Removing instruction jsr main
Succesful ASM optimization Pass5SkipBegin
Removing instruction __b1:
Succesful ASM optimization Pass5UnusedLabelElimination
FINAL SYMBOL TABLE
(label) @1
(label) @begin
(label) @end
(const byte*) SCREEN = (byte*) 1024
(const byte*) SINTABLE[(number) $100] = kickasm {{ .for(var i=0;i<$100;i++)
.byte round(127.5+127.5*sin(2*PI*i/256))
}}
(byte) c1A loadstore mem[1] 3.3000000000000003 = (byte) 0
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@3
(label) main::@4
(byte) main::c1a loadstore mem[1] 52.33333333333333
(byte) main::i loadstore mem[1] 83.0
mem[1] [ main::c1a ]
mem[1] [ main::i ]
mem[1] [ c1A ]
FINAL ASSEMBLER
Score: 4770
// File Comments
// Demonstrates problem with __ma coalescing
// c1a is erroneously zp-coalesced with c1A
// Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
// Global Constants & labels
.label SCREEN = $400
// @begin
// [1] phi from @begin to @1 [phi:@begin->@1]
// @1
// [2] call main
// [4] phi from @1 to main [phi:@1->main]
// [3] phi from @1 to @end [phi:@1->@end]
// @end
// main
main: {
// main::@1
__b1:
// c1a = c1A
// [5] (byte) main::c1a ← (byte) c1A -- vbum1=vbum2
lda c1A
sta c1a
// i = 0
// [6] (byte) main::i ← (byte) 0 -- vbum1=vbuc1
lda #0
sta i
// main::@2
__b2:
// for (char i = 0; i < 40; ++i)
// [7] if((byte) main::i<(byte) $28) goto main::@3 -- vbum1_lt_vbuc1_then_la1
lda i
cmp #$28
bcc __b3
// main::@4
// c1A += 3
// [8] (byte) c1A ← (byte) c1A + (byte) 3 -- vbum1=vbum1_plus_vbuc1
lax c1A
axs #-[3]
stx c1A
jmp __b1
// main::@3
__b3:
// SCREEN[i] = SINTABLE[c1a]
// [9] *((const byte*) SCREEN + (byte) main::i) ← *((const byte*) SINTABLE + (byte) main::c1a) -- pbuc1_derefidx_vbum1=pbuc2_derefidx_vbum2
ldy c1a
lda SINTABLE,y
ldy i
sta SCREEN,y
// c1a += 4
// [10] (byte) main::c1a ← (byte) main::c1a + (byte) 4 -- vbum1=vbum1_plus_vbuc1
lax c1a
axs #-[4]
stx c1a
// for (char i = 0; i < 40; ++i)
// [11] (byte) main::i ← ++ (byte) main::i -- vbum1=_inc_vbum1
inc i
jmp __b2
c1a: .byte 0
i: .byte 0
}
// File Data
.align $100
SINTABLE:
.for(var i=0;i<$100;i++)
.byte round(127.5+127.5*sin(2*PI*i/256))
// Plasma state variables
c1A: .byte 0

View File

@ -0,0 +1,19 @@
(label) @1
(label) @begin
(label) @end
(const byte*) SCREEN = (byte*) 1024
(const byte*) SINTABLE[(number) $100] = kickasm {{ .for(var i=0;i<$100;i++)
.byte round(127.5+127.5*sin(2*PI*i/256))
}}
(byte) c1A loadstore mem[1] 3.3000000000000003 = (byte) 0
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@3
(label) main::@4
(byte) main::c1a loadstore mem[1] 52.33333333333333
(byte) main::i loadstore mem[1] 83.0
mem[1] [ main::c1a ]
mem[1] [ main::i ]
mem[1] [ c1A ]

View File

@ -1319,7 +1319,7 @@ VARIABLE REGISTER WEIGHTS
(word) free_#13 8.583333333333332
(word) free_#22 20.999999999999996
(void()) init()
(word) last_time loadstore 0.47619047619047616
(word) last_time loadstore 0.43478260869565216
(void()) main()
(word~) main::$5 11.0
(byte) main::c
@ -1972,7 +1972,7 @@ Statement [13] if((word) main::i#2!=(word) $bb8) goto main::@2 [ last_time print
Statement [16] (word) sum::return#2 ← (word) sum::s#3 [ last_time print_char_cursor#48 main::c#8 sum::return#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 sum::return#2 ] ) always clobbers reg byte a
Statement [17] (word~) main::$5 ← (word) sum::return#2 [ last_time print_char_cursor#48 main::c#8 main::$5 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 main::$5 ] ) always clobbers reg byte a
Statement [18] (byte) print_char::ch#2 ← (byte)(word~) main::$5 [ last_time print_char_cursor#48 main::c#8 print_char::ch#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 print_char::ch#2 ] ) always clobbers reg byte a
Statement [25] (word) Ticks#1 ← (word) last_time [ print_char_cursor#10 Ticks#1 ] ( main:3::end:23 [ print_char_cursor#10 Ticks#1 ] ) always clobbers reg byte a
Statement [25] (word) Ticks#1 ← (word) last_time [ last_time print_char_cursor#10 Ticks#1 ] ( main:3::end:23 [ last_time print_char_cursor#10 Ticks#1 ] ) always clobbers reg byte a
Statement [27] (word) last_time ← (word) last_time - (word) Ticks#1 [ last_time print_char_cursor#10 ] ( main:3::end:23 [ last_time print_char_cursor#10 ] ) always clobbers reg byte a
Statement [28] (word) Ticks#12 ← (word) last_time [ print_char_cursor#10 Ticks#12 ] ( main:3::end:23 [ print_char_cursor#10 Ticks#12 ] ) always clobbers reg byte a
Statement [29] (word) print_word::w#0 ← (word) Ticks#12 [ print_char_cursor#10 print_word::w#0 ] ( main:3::end:23 [ print_char_cursor#10 print_word::w#0 ] ) always clobbers reg byte a
@ -2004,7 +2004,7 @@ Statement [13] if((word) main::i#2!=(word) $bb8) goto main::@2 [ last_time print
Statement [16] (word) sum::return#2 ← (word) sum::s#3 [ last_time print_char_cursor#48 main::c#8 sum::return#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 sum::return#2 ] ) always clobbers reg byte a
Statement [17] (word~) main::$5 ← (word) sum::return#2 [ last_time print_char_cursor#48 main::c#8 main::$5 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 main::$5 ] ) always clobbers reg byte a
Statement [18] (byte) print_char::ch#2 ← (byte)(word~) main::$5 [ last_time print_char_cursor#48 main::c#8 print_char::ch#2 ] ( main:3 [ last_time print_char_cursor#48 main::c#8 print_char::ch#2 ] ) always clobbers reg byte a
Statement [25] (word) Ticks#1 ← (word) last_time [ print_char_cursor#10 Ticks#1 ] ( main:3::end:23 [ print_char_cursor#10 Ticks#1 ] ) always clobbers reg byte a
Statement [25] (word) Ticks#1 ← (word) last_time [ last_time print_char_cursor#10 Ticks#1 ] ( main:3::end:23 [ last_time print_char_cursor#10 Ticks#1 ] ) always clobbers reg byte a
Statement [27] (word) last_time ← (word) last_time - (word) Ticks#1 [ last_time print_char_cursor#10 ] ( main:3::end:23 [ last_time print_char_cursor#10 ] ) always clobbers reg byte a
Statement [28] (word) Ticks#12 ← (word) last_time [ print_char_cursor#10 Ticks#12 ] ( main:3::end:23 [ print_char_cursor#10 Ticks#12 ] ) always clobbers reg byte a
Statement [29] (word) print_word::w#0 ← (word) Ticks#12 [ print_char_cursor#10 print_word::w#0 ] ( main:3::end:23 [ print_char_cursor#10 print_word::w#0 ] ) always clobbers reg byte a
@ -2054,7 +2054,7 @@ Potential registers zp[2]:41 [ alloc::return#0 ] : zp[2]:41 ,
REGISTER UPLIFT SCOPES
Uplift Scope [sum] 274: zp[2]:15 [ sum::current#3 sum::current#1 sum::current#2 ] 154.25: zp[2]:17 [ sum::s#3 sum::s#2 ] 22: zp[2]:23 [ sum::return#2 ]
Uplift Scope [main] 252.5: zp[2]:3 [ main::i#3 main::i#2 ] 18.19: zp[1]:2 [ main::c#8 main::c#2 ] 11: zp[2]:25 [ main::$5 ]
Uplift Scope [] 38.5: zp[2]:9 [ print_line_cursor#8 print_line_cursor#1 ] 34.67: zp[2]:7 [ root#20 root#11 ] 29.58: zp[2]:5 [ free_#22 free_#13 ] 12.27: zp[2]:13 [ print_char_cursor#26 print_char_cursor#48 print_char_cursor#10 ] 4: zp[2]:29 [ Ticks#12 ] 2: zp[2]:27 [ Ticks#1 ] 0.48: zp[2]:19 [ last_time ]
Uplift Scope [] 38.5: zp[2]:9 [ print_line_cursor#8 print_line_cursor#1 ] 34.67: zp[2]:7 [ root#20 root#11 ] 29.58: zp[2]:5 [ free_#22 free_#13 ] 12.27: zp[2]:13 [ print_char_cursor#26 print_char_cursor#48 print_char_cursor#10 ] 4: zp[2]:29 [ Ticks#12 ] 2: zp[2]:27 [ Ticks#1 ] 0.43: zp[2]:19 [ last_time ]
Uplift Scope [print_char] 47: zp[1]:12 [ print_char::ch#3 print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
Uplift Scope [prepend] 17.17: zp[2]:21 [ prepend::x#0 ] 1.33: zp[2]:37 [ prepend::new#1 ]
Uplift Scope [print_byte] 10: zp[1]:11 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] 4: zp[1]:33 [ print_byte::$0 ] 4: zp[1]:34 [ print_byte::$2 ]
@ -2702,7 +2702,7 @@ FINAL SYMBOL TABLE
(const struct node*) heap[(number) $fa0] = { fill( $fa0, 0) }
(void()) init()
(label) init::@return
(word) last_time loadstore zp[2]:10 0.47619047619047616
(word) last_time loadstore zp[2]:10 0.43478260869565216
(void()) main()
(word~) main::$5 zp[2]:8 11.0
(label) main::@1

View File

@ -27,7 +27,7 @@
(const struct node*) heap[(number) $fa0] = { fill( $fa0, 0) }
(void()) init()
(label) init::@return
(word) last_time loadstore zp[2]:10 0.47619047619047616
(word) last_time loadstore zp[2]:10 0.43478260869565216
(void()) main()
(word~) main::$5 zp[2]:8 11.0
(label) main::@1

View File

@ -1832,7 +1832,7 @@ VARIABLE REGISTER WEIGHTS
(byte*) doplasma::scrn#13 6.733333333333333
(byte*) doplasma::scrn#6 186.28571428571428
(void()) end()
(word) last_time loadstore 0.4545454545454546
(word) last_time loadstore 0.41666666666666663
(signed word()) main()
(byte) main::block
(byte) main::block#1 0.46153846153846156
@ -2809,7 +2809,7 @@ Removing always clobbered register reg byte a as potential for zp[1]:5 [ doplasm
Removing always clobbered register reg byte a as potential for zp[1]:6 [ doplasma::c1b#3 doplasma::c1b#2 ]
Statement [48] (byte) doplasma::c1a#2 ← (byte) doplasma::c1a#3 + (byte) 4 [ doplasma::scrn#13 doplasma::ii#3 doplasma::c1b#3 doplasma::c1a#2 ] ( main:4::doplasma:21 [ last_time main::block#1 main::v#1 main::count#2 doplasma::scrn#13 doplasma::ii#3 doplasma::c1b#3 doplasma::c1a#2 ] main:4::doplasma:23 [ last_time main::block#1 main::v#1 main::count#2 doplasma::scrn#13 doplasma::ii#3 doplasma::c1b#3 doplasma::c1a#2 ] ) always clobbers reg byte a
Statement [49] (byte) doplasma::c1b#2 ← (byte) doplasma::c1b#3 + (byte) 9 [ doplasma::scrn#13 doplasma::ii#3 doplasma::c1a#2 doplasma::c1b#2 ] ( main:4::doplasma:21 [ last_time main::block#1 main::v#1 main::count#2 doplasma::scrn#13 doplasma::ii#3 doplasma::c1a#2 doplasma::c1b#2 ] main:4::doplasma:23 [ last_time main::block#1 main::v#1 main::count#2 doplasma::scrn#13 doplasma::ii#3 doplasma::c1a#2 doplasma::c1b#2 ] ) always clobbers reg byte a
Statement [51] (word) Ticks#1 ← (word) last_time [ Ticks#1 ] ( main:4::end:18 [ Ticks#1 ] ) always clobbers reg byte a
Statement [51] (word) Ticks#1 ← (word) last_time [ last_time Ticks#1 ] ( main:4::end:18 [ last_time Ticks#1 ] ) always clobbers reg byte a
Statement [53] (word) last_time ← (word) last_time - (word) Ticks#1 [ last_time ] ( main:4::end:18 [ last_time ] ) always clobbers reg byte a
Statement [54] (word) Ticks#12 ← (word) last_time [ Ticks#12 ] ( main:4::end:18 [ Ticks#12 ] ) always clobbers reg byte a
Statement [55] (word) print_word::w#0 ← (word) Ticks#12 [ print_word::w#0 ] ( main:4::end:18 [ print_word::w#0 ] ) always clobbers reg byte a
@ -2823,7 +2823,7 @@ Statement [74] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte) $f [ p
Statement [79] *((byte*) print_char_cursor#25) ← (byte) print_char::ch#2 [ print_char_cursor#25 ] ( main:4::end:18::print_word:56::print_byte:66::print_char:73 [ print_word::w#0 print_byte::b#2 print_char_cursor#25 ] main:4::end:18::print_word:56::print_byte:68::print_char:73 [ print_byte::b#2 print_char_cursor#25 ] main:4::end:18::print_word:56::print_byte:66::print_char:76 [ print_word::w#0 print_char_cursor#25 ] main:4::end:18::print_word:56::print_byte:68::print_char:76 [ print_char_cursor#25 ] ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:16 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
Statement asm { jsr$FFDE staLAST_TIME stxLAST_TIME+1 } always clobbers reg byte a reg byte x reg byte y
Statement [83] (word) rand_seed ← (word) $194a [ ] ( main:4::start:9 [ last_time ] main:4::end:18::start:52 [ Ticks#1 ] ) always clobbers reg byte a
Statement [83] (word) rand_seed ← (word) $194a [ ] ( main:4::start:9 [ last_time ] main:4::end:18::start:52 [ last_time Ticks#1 ] ) always clobbers reg byte a
Statement [87] if((word) makechar::c#3<(word) $100) goto makechar::@2 [ rand_seed makechar::c#3 ] ( main:4::makechar:7 [ last_time rand_seed makechar::c#3 ] ) always clobbers reg byte a
Statement [89] (byte~) makechar::$1 ← (byte)(word) makechar::c#3 [ rand_seed makechar::c#3 makechar::$1 ] ( main:4::makechar:7 [ last_time rand_seed makechar::c#3 makechar::$1 ] ) always clobbers reg byte a
Statement [96] (word~) makechar::$8 ← (word) makechar::c#3 << (byte) 3 [ rand_seed makechar::c#3 makechar::s#1 makechar::i#3 makechar::b#3 makechar::$8 ] ( main:4::makechar:7 [ last_time rand_seed makechar::c#3 makechar::s#1 makechar::i#3 makechar::b#3 makechar::$8 ] ) always clobbers reg byte a
@ -2859,7 +2859,7 @@ Statement [44] (byte) doplasma::c2b#2 ← (byte) doplasma::c2b#3 + (byte) 7 [ do
Statement [46] (byte~) doplasma::$1 ← *((const byte*) sinustable + (byte) doplasma::c1a#3) + *((const byte*) sinustable + (byte) doplasma::c1b#3) [ doplasma::scrn#13 doplasma::ii#3 doplasma::c1a#3 doplasma::c1b#3 doplasma::$1 ] ( main:4::doplasma:21 [ last_time main::block#1 main::v#1 main::count#2 doplasma::scrn#13 doplasma::ii#3 doplasma::c1a#3 doplasma::c1b#3 doplasma::$1 ] main:4::doplasma:23 [ last_time main::block#1 main::v#1 main::count#2 doplasma::scrn#13 doplasma::ii#3 doplasma::c1a#3 doplasma::c1b#3 doplasma::$1 ] ) always clobbers reg byte a
Statement [48] (byte) doplasma::c1a#2 ← (byte) doplasma::c1a#3 + (byte) 4 [ doplasma::scrn#13 doplasma::ii#3 doplasma::c1b#3 doplasma::c1a#2 ] ( main:4::doplasma:21 [ last_time main::block#1 main::v#1 main::count#2 doplasma::scrn#13 doplasma::ii#3 doplasma::c1b#3 doplasma::c1a#2 ] main:4::doplasma:23 [ last_time main::block#1 main::v#1 main::count#2 doplasma::scrn#13 doplasma::ii#3 doplasma::c1b#3 doplasma::c1a#2 ] ) always clobbers reg byte a
Statement [49] (byte) doplasma::c1b#2 ← (byte) doplasma::c1b#3 + (byte) 9 [ doplasma::scrn#13 doplasma::ii#3 doplasma::c1a#2 doplasma::c1b#2 ] ( main:4::doplasma:21 [ last_time main::block#1 main::v#1 main::count#2 doplasma::scrn#13 doplasma::ii#3 doplasma::c1a#2 doplasma::c1b#2 ] main:4::doplasma:23 [ last_time main::block#1 main::v#1 main::count#2 doplasma::scrn#13 doplasma::ii#3 doplasma::c1a#2 doplasma::c1b#2 ] ) always clobbers reg byte a
Statement [51] (word) Ticks#1 ← (word) last_time [ Ticks#1 ] ( main:4::end:18 [ Ticks#1 ] ) always clobbers reg byte a
Statement [51] (word) Ticks#1 ← (word) last_time [ last_time Ticks#1 ] ( main:4::end:18 [ last_time Ticks#1 ] ) always clobbers reg byte a
Statement [53] (word) last_time ← (word) last_time - (word) Ticks#1 [ last_time ] ( main:4::end:18 [ last_time ] ) always clobbers reg byte a
Statement [54] (word) Ticks#12 ← (word) last_time [ Ticks#12 ] ( main:4::end:18 [ Ticks#12 ] ) always clobbers reg byte a
Statement [55] (word) print_word::w#0 ← (word) Ticks#12 [ print_word::w#0 ] ( main:4::end:18 [ print_word::w#0 ] ) always clobbers reg byte a
@ -2871,7 +2871,7 @@ Statement [71] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte) 4 [ p
Statement [74] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte) $f [ print_char_cursor#10 print_byte::$2 ] ( main:4::end:18::print_word:56::print_byte:66 [ print_word::w#0 print_char_cursor#10 print_byte::$2 ] main:4::end:18::print_word:56::print_byte:68 [ print_char_cursor#10 print_byte::$2 ] ) always clobbers reg byte a
Statement [79] *((byte*) print_char_cursor#25) ← (byte) print_char::ch#2 [ print_char_cursor#25 ] ( main:4::end:18::print_word:56::print_byte:66::print_char:73 [ print_word::w#0 print_byte::b#2 print_char_cursor#25 ] main:4::end:18::print_word:56::print_byte:68::print_char:73 [ print_byte::b#2 print_char_cursor#25 ] main:4::end:18::print_word:56::print_byte:66::print_char:76 [ print_word::w#0 print_char_cursor#25 ] main:4::end:18::print_word:56::print_byte:68::print_char:76 [ print_char_cursor#25 ] ) always clobbers reg byte y
Statement asm { jsr$FFDE staLAST_TIME stxLAST_TIME+1 } always clobbers reg byte a reg byte x reg byte y
Statement [83] (word) rand_seed ← (word) $194a [ ] ( main:4::start:9 [ last_time ] main:4::end:18::start:52 [ Ticks#1 ] ) always clobbers reg byte a
Statement [83] (word) rand_seed ← (word) $194a [ ] ( main:4::start:9 [ last_time ] main:4::end:18::start:52 [ last_time Ticks#1 ] ) always clobbers reg byte a
Statement [87] if((word) makechar::c#3<(word) $100) goto makechar::@2 [ rand_seed makechar::c#3 ] ( main:4::makechar:7 [ last_time rand_seed makechar::c#3 ] ) always clobbers reg byte a
Statement [89] (byte~) makechar::$1 ← (byte)(word) makechar::c#3 [ rand_seed makechar::c#3 makechar::$1 ] ( main:4::makechar:7 [ last_time rand_seed makechar::c#3 makechar::$1 ] ) always clobbers reg byte a
Statement [90] (byte) makechar::s#1 ← *((const byte*) sinustable + (byte~) makechar::$1) [ rand_seed makechar::c#3 makechar::s#1 ] ( main:4::makechar:7 [ last_time rand_seed makechar::c#3 makechar::s#1 ] ) always clobbers reg byte a
@ -2928,7 +2928,7 @@ REGISTER UPLIFT SCOPES
Uplift Scope [makechar] 3,785.68: zp[1]:24 [ makechar::b#3 makechar::b#7 makechar::b#2 ] 2,402.4: zp[1]:23 [ makechar::ii#3 makechar::ii#2 ] 2,002: zp[1]:52 [ makechar::$4 ] 2,002: zp[1]:53 [ makechar::$5 ] 225.76: zp[1]:22 [ makechar::i#3 makechar::i#2 ] 202: zp[2]:45 [ makechar::$8 ] 202: zp[2]:47 [ makechar::$9 ] 202: zp[2]:49 [ makechar::$10 ] 53.26: zp[1]:44 [ makechar::s#1 ] 28.09: zp[2]:20 [ makechar::c#3 makechar::c#2 ] 22: zp[1]:43 [ makechar::$1 ]
Uplift Scope [doplasma] 3,253.25: zp[1]:13 [ doplasma::j#3 doplasma::j#2 ] 2,002: zp[1]:32 [ doplasma::$6 ] 365: zp[1]:10 [ doplasma::jj#3 doplasma::jj#2 ] 294.02: zp[2]:11 [ doplasma::scrn#6 doplasma::scrn#0 doplasma::scrn#13 ] 269.33: zp[1]:4 [ doplasma::ii#3 doplasma::ii#2 ] 269.33: zp[1]:7 [ doplasma::i#3 doplasma::i#2 ] 202: zp[1]:33 [ doplasma::$3 ] 202: zp[1]:34 [ doplasma::$1 ] 161.6: zp[1]:6 [ doplasma::c1b#3 doplasma::c1b#2 ] 161.6: zp[1]:9 [ doplasma::c2b#3 doplasma::c2b#2 ] 143.08: zp[1]:5 [ doplasma::c1a#3 doplasma::c1a#2 ] 143.08: zp[1]:8 [ doplasma::c2a#3 doplasma::c2a#2 ]
Uplift Scope [rand] 2,002: zp[1]:51 [ rand::return#2 ] 334.33: zp[1]:54 [ rand::return#0 ]
Uplift Scope [] 38.5: zp[2]:14 [ print_line_cursor#8 print_line_cursor#1 ] 6.33: zp[2]:18 [ print_char_cursor#25 print_char_cursor#35 print_char_cursor#10 ] 4: zp[2]:37 [ Ticks#12 ] 2: zp[2]:35 [ Ticks#1 ] 0.45: zp[2]:25 [ last_time ] 0.21: zp[2]:27 [ rand_seed ]
Uplift Scope [] 38.5: zp[2]:14 [ print_line_cursor#8 print_line_cursor#1 ] 6.33: zp[2]:18 [ print_char_cursor#25 print_char_cursor#35 print_char_cursor#10 ] 4: zp[2]:37 [ Ticks#12 ] 2: zp[2]:35 [ Ticks#1 ] 0.42: zp[2]:25 [ last_time ] 0.21: zp[2]:27 [ rand_seed ]
Uplift Scope [main] 26.71: zp[2]:2 [ main::count#2 main::count#1 ] 4: zp[1]:30 [ main::tmp#1 ] 0.46: zp[1]:29 [ main::block#1 ] 0.44: zp[1]:31 [ main::v#1 ]
Uplift Scope [print_byte] 10: zp[1]:16 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] 4: zp[1]:41 [ print_byte::$0 ] 4: zp[1]:42 [ print_byte::$2 ]
Uplift Scope [print_char] 14: zp[1]:17 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
@ -3918,7 +3918,7 @@ FINAL SYMBOL TABLE
(label) end::@1
(label) end::@2
(label) end::@return
(word) last_time loadstore zp[2]:10 0.4545454545454546
(word) last_time loadstore zp[2]:10 0.41666666666666663
(signed word()) main()
(label) main::@1
(label) main::@2

View File

@ -69,7 +69,7 @@
(label) end::@1
(label) end::@2
(label) end::@return
(word) last_time loadstore zp[2]:10 0.4545454545454546
(word) last_time loadstore zp[2]:10 0.41666666666666663
(signed word()) main()
(label) main::@1
(label) main::@2

View File

@ -1781,7 +1781,7 @@ VARIABLE REGISTER WEIGHTS
(word) Ticks#1 2.0
(word) Ticks#12 4.0
(void()) end()
(word) last_time loadstore 0.5882352941176471
(word) last_time loadstore 0.5263157894736842
(signed word()) main()
(word) main::i
(word) main::i#2 11.0
@ -2745,7 +2745,7 @@ Removing always clobbered register reg byte a as potential for zp[1]:17 [ sum::p
Removing always clobbered register reg byte a as potential for zp[1]:20 [ sum::i#3 sum::i#2 ]
Statement [72] (word) sum::s#2 ← (word) sum::s#4 + (byte) sum::tmp#1 [ sum::page#3 sum::p#5 sum::s#2 sum::i#3 ] ( main:3::sum:13 [ last_time main::i#3 print_char_cursor#51 print_line_cursor#20 sum::page#3 sum::p#5 sum::s#2 sum::i#3 ] ) always clobbers reg byte a
Statement [75] (byte*) sum::p#2 ← (byte*) sum::p#5 + (word) $100 [ sum::page#3 sum::s#2 sum::p#2 ] ( main:3::sum:13 [ last_time main::i#3 print_char_cursor#51 print_line_cursor#20 sum::page#3 sum::s#2 sum::p#2 ] ) always clobbers reg byte a
Statement [77] (word) Ticks#1 ← (word) last_time [ print_char_cursor#51 print_line_cursor#20 Ticks#1 ] ( main:3::end:10 [ print_char_cursor#51 print_line_cursor#20 Ticks#1 ] ) always clobbers reg byte a
Statement [77] (word) Ticks#1 ← (word) last_time [ last_time print_char_cursor#51 print_line_cursor#20 Ticks#1 ] ( main:3::end:10 [ last_time print_char_cursor#51 print_line_cursor#20 Ticks#1 ] ) always clobbers reg byte a
Statement [79] (word) last_time ← (word) last_time - (word) Ticks#1 [ last_time print_char_cursor#51 print_line_cursor#20 ] ( main:3::end:10 [ last_time print_char_cursor#51 print_line_cursor#20 ] ) always clobbers reg byte a
Statement [80] (word) Ticks#12 ← (word) last_time [ print_char_cursor#51 print_line_cursor#20 Ticks#12 ] ( main:3::end:10 [ print_char_cursor#51 print_line_cursor#20 Ticks#12 ] ) always clobbers reg byte a
Statement [81] (word) print_word::w#0 ← (word) Ticks#12 [ print_char_cursor#51 print_line_cursor#20 print_word::w#0 ] ( main:3::end:10 [ print_char_cursor#51 print_line_cursor#20 print_word::w#0 ] ) always clobbers reg byte a
@ -2785,7 +2785,7 @@ Statement [65] (word) utoa_append::value#1 ← (word) utoa_append::value#2 - (wo
Statement [71] (byte) sum::tmp#1 ← *((byte*) sum::p#5 + (byte) sum::i#3) [ sum::page#3 sum::p#5 sum::i#3 sum::s#4 sum::tmp#1 ] ( main:3::sum:13 [ last_time main::i#3 print_char_cursor#51 print_line_cursor#20 sum::page#3 sum::p#5 sum::i#3 sum::s#4 sum::tmp#1 ] ) always clobbers reg byte a
Statement [72] (word) sum::s#2 ← (word) sum::s#4 + (byte) sum::tmp#1 [ sum::page#3 sum::p#5 sum::s#2 sum::i#3 ] ( main:3::sum:13 [ last_time main::i#3 print_char_cursor#51 print_line_cursor#20 sum::page#3 sum::p#5 sum::s#2 sum::i#3 ] ) always clobbers reg byte a
Statement [75] (byte*) sum::p#2 ← (byte*) sum::p#5 + (word) $100 [ sum::page#3 sum::s#2 sum::p#2 ] ( main:3::sum:13 [ last_time main::i#3 print_char_cursor#51 print_line_cursor#20 sum::page#3 sum::s#2 sum::p#2 ] ) always clobbers reg byte a
Statement [77] (word) Ticks#1 ← (word) last_time [ print_char_cursor#51 print_line_cursor#20 Ticks#1 ] ( main:3::end:10 [ print_char_cursor#51 print_line_cursor#20 Ticks#1 ] ) always clobbers reg byte a
Statement [77] (word) Ticks#1 ← (word) last_time [ last_time print_char_cursor#51 print_line_cursor#20 Ticks#1 ] ( main:3::end:10 [ last_time print_char_cursor#51 print_line_cursor#20 Ticks#1 ] ) always clobbers reg byte a
Statement [79] (word) last_time ← (word) last_time - (word) Ticks#1 [ last_time print_char_cursor#51 print_line_cursor#20 ] ( main:3::end:10 [ last_time print_char_cursor#51 print_line_cursor#20 ] ) always clobbers reg byte a
Statement [80] (word) Ticks#12 ← (word) last_time [ print_char_cursor#51 print_line_cursor#20 Ticks#12 ] ( main:3::end:10 [ print_char_cursor#51 print_line_cursor#20 Ticks#12 ] ) always clobbers reg byte a
Statement [81] (word) print_word::w#0 ← (word) Ticks#12 [ print_char_cursor#51 print_line_cursor#20 print_word::w#0 ] ( main:3::end:10 [ print_char_cursor#51 print_line_cursor#20 print_word::w#0 ] ) always clobbers reg byte a
@ -2832,7 +2832,7 @@ REGISTER UPLIFT SCOPES
Uplift Scope [sum] 2,502.5: zp[1]:20 [ sum::i#3 sum::i#2 ] 2,002: zp[1]:45 [ sum::tmp#1 ] 1,525.35: zp[2]:21 [ sum::s#4 sum::s#3 sum::s#2 ] 272.86: zp[2]:18 [ sum::p#5 sum::p#2 ] 239.88: zp[1]:17 [ sum::page#3 sum::page#2 ] 22: zp[2]:29 [ sum::return#2 ]
Uplift Scope [utoa_append] 2,554: zp[2]:14 [ utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 ] 2,003: zp[1]:16 [ utoa_append::digit#2 utoa_append::digit#1 ] 350.5: zp[2]:41 [ utoa_append::sub#0 ] 202: zp[2]:43 [ utoa_append::return#0 ] 12.88: zp[2]:39 [ utoa_append::buffer#0 ]
Uplift Scope [utoa] 382.64: zp[2]:12 [ utoa::buffer#11 utoa::buffer#14 utoa::buffer#4 ] 312.5: zp[2]:9 [ utoa::value#2 utoa::value#6 utoa::value#1 utoa::value#0 ] 230.86: zp[1]:8 [ utoa::digit#2 utoa::digit#1 ] 202: zp[1]:36 [ utoa::$11 ] 151.5: zp[1]:11 [ utoa::started#2 utoa::started#4 ] 60.6: zp[2]:37 [ utoa::digit_value#0 ] 4: zp[1]:33 [ utoa::$4 ] 4: zp[2]:34 [ utoa::buffer#3 ]
Uplift Scope [] 258.93: zp[2]:4 [ print_line_cursor#9 print_line_cursor#20 print_line_cursor#1 ] 198.5: zp[2]:25 [ print_char_cursor#35 print_char_cursor#49 print_char_cursor#46 print_char_cursor#13 print_char_cursor#2 print_char_cursor#51 print_char_cursor#70 print_char_cursor#1 ] 4: zp[2]:48 [ Ticks#12 ] 2: zp[2]:46 [ Ticks#1 ] 0.59: zp[2]:27 [ last_time ]
Uplift Scope [] 258.93: zp[2]:4 [ print_line_cursor#9 print_line_cursor#20 print_line_cursor#1 ] 198.5: zp[2]:25 [ print_char_cursor#35 print_char_cursor#49 print_char_cursor#46 print_char_cursor#13 print_char_cursor#2 print_char_cursor#51 print_char_cursor#70 print_char_cursor#1 ] 4: zp[2]:48 [ Ticks#12 ] 2: zp[2]:46 [ Ticks#1 ] 0.53: zp[2]:27 [ last_time ]
Uplift Scope [print_str] 303: zp[2]:6 [ print_str::str#2 print_str::str#0 ]
Uplift Scope [print_byte] 10: zp[1]:23 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] 4: zp[1]:52 [ print_byte::$0 ] 4: zp[1]:53 [ print_byte::$2 ]
Uplift Scope [main] 14.67: zp[2]:2 [ main::i#3 main::i#2 ]
@ -3685,7 +3685,7 @@ FINAL SYMBOL TABLE
(label) end::@1
(label) end::@2
(label) end::@return
(word) last_time loadstore zp[2]:11 0.5882352941176471
(word) last_time loadstore zp[2]:11 0.5263157894736842
(signed word()) main()
(label) main::@1
(label) main::@2

View File

@ -16,7 +16,7 @@
(label) end::@1
(label) end::@2
(label) end::@return
(word) last_time loadstore zp[2]:11 0.5882352941176471
(word) last_time loadstore zp[2]:11 0.5263157894736842
(signed word()) main()
(label) main::@1
(label) main::@2

View File

@ -1045,7 +1045,7 @@ VARIABLE REGISTER WEIGHTS
(word) Ticks#1 2.0
(word) Ticks#12 4.0
(void()) end()
(word) last_time loadstore 0.38461538461538464
(word) last_time loadstore 0.3571428571428571
(signed word()) main()
(signed word) main::return
(void()) print_byte((byte) print_byte::b)
@ -1607,7 +1607,7 @@ round: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [1] (word) last_time ← (word) 0 [ last_time ] ( [ last_time ] ) always clobbers reg byte a
Statement [30] (word) Ticks#1 ← (word) last_time [ Ticks#1 ] ( main:3::end:28 [ Ticks#1 ] ) always clobbers reg byte a
Statement [30] (word) Ticks#1 ← (word) last_time [ last_time Ticks#1 ] ( main:3::end:28 [ last_time Ticks#1 ] ) always clobbers reg byte a
Statement [32] (word) last_time ← (word) last_time - (word) Ticks#1 [ last_time ] ( main:3::end:28 [ last_time ] ) always clobbers reg byte a
Statement [33] (word) Ticks#12 ← (word) last_time [ Ticks#12 ] ( main:3::end:28 [ Ticks#12 ] ) always clobbers reg byte a
Statement [34] (word) print_word::w#0 ← (word) Ticks#12 [ print_word::w#0 ] ( main:3::end:28 [ print_word::w#0 ] ) always clobbers reg byte a
@ -1632,7 +1632,7 @@ Removing always clobbered register reg byte y as potential for zp[1]:10 [ round:
Statement [76] (byte*) round::S#2 ← (byte*) round::S#3 + (byte) round::I#3 [ round::I#3 round::S#2 ] ( main:3::round:8 [ last_time round::I#3 round::S#2 ] main:3::round:10 [ last_time round::I#3 round::S#2 ] main:3::round:12 [ last_time round::I#3 round::S#2 ] main:3::round:14 [ last_time round::I#3 round::S#2 ] main:3::round:16 [ last_time round::I#3 round::S#2 ] main:3::round:18 [ last_time round::I#3 round::S#2 ] main:3::round:20 [ last_time round::I#3 round::S#2 ] main:3::round:22 [ last_time round::I#3 round::S#2 ] main:3::round:24 [ last_time round::I#3 round::S#2 ] main:3::round:26 [ last_time round::I#3 round::S#2 ] ) always clobbers reg byte a
Statement [77] *((byte*) round::p#2) ← (byte) 0 [ round::p#2 ] ( main:3::round:8 [ last_time round::p#2 ] main:3::round:10 [ last_time round::p#2 ] main:3::round:12 [ last_time round::p#2 ] main:3::round:14 [ last_time round::p#2 ] main:3::round:16 [ last_time round::p#2 ] main:3::round:18 [ last_time round::p#2 ] main:3::round:20 [ last_time round::p#2 ] main:3::round:22 [ last_time round::p#2 ] main:3::round:24 [ last_time round::p#2 ] main:3::round:26 [ last_time round::p#2 ] ) always clobbers reg byte a reg byte y
Statement [1] (word) last_time ← (word) 0 [ last_time ] ( [ last_time ] ) always clobbers reg byte a
Statement [30] (word) Ticks#1 ← (word) last_time [ Ticks#1 ] ( main:3::end:28 [ Ticks#1 ] ) always clobbers reg byte a
Statement [30] (word) Ticks#1 ← (word) last_time [ last_time Ticks#1 ] ( main:3::end:28 [ last_time Ticks#1 ] ) always clobbers reg byte a
Statement [32] (word) last_time ← (word) last_time - (word) Ticks#1 [ last_time ] ( main:3::end:28 [ last_time ] ) always clobbers reg byte a
Statement [33] (word) Ticks#12 ← (word) last_time [ Ticks#12 ] ( main:3::end:28 [ Ticks#12 ] ) always clobbers reg byte a
Statement [34] (word) print_word::w#0 ← (word) Ticks#12 [ print_word::w#0 ] ( main:3::end:28 [ print_word::w#0 ] ) always clobbers reg byte a
@ -1669,7 +1669,7 @@ Potential registers zp[1]:23 [ round::$4 ] : zp[1]:23 , reg byte a , reg byte x
REGISTER UPLIFT SCOPES
Uplift Scope [round] 362.33: zp[2]:11 [ round::S#3 round::S#2 round::S#1 ] 39.33: zp[1]:10 [ round::I#3 round::I#2 ] 36.67: zp[2]:8 [ round::p#2 round::p#1 ] 22: zp[1]:23 [ round::$4 ]
Uplift Scope [] 38.5: zp[2]:2 [ print_line_cursor#8 print_line_cursor#1 ] 6.33: zp[2]:6 [ print_char_cursor#25 print_char_cursor#35 print_char_cursor#10 ] 4: zp[2]:17 [ Ticks#12 ] 2: zp[2]:15 [ Ticks#1 ] 0.38: zp[2]:13 [ last_time ]
Uplift Scope [] 38.5: zp[2]:2 [ print_line_cursor#8 print_line_cursor#1 ] 6.33: zp[2]:6 [ print_char_cursor#25 print_char_cursor#35 print_char_cursor#10 ] 4: zp[2]:17 [ Ticks#12 ] 2: zp[2]:15 [ Ticks#1 ] 0.36: zp[2]:13 [ last_time ]
Uplift Scope [print_byte] 10: zp[1]:4 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] 4: zp[1]:21 [ print_byte::$0 ] 4: zp[1]:22 [ print_byte::$2 ]
Uplift Scope [print_char] 14: zp[1]:5 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
Uplift Scope [print_word] 2: zp[2]:19 [ print_word::w#0 ]
@ -2282,7 +2282,7 @@ FINAL SYMBOL TABLE
(label) end::@1
(label) end::@2
(label) end::@return
(word) last_time loadstore zp[2]:6 0.38461538461538464
(word) last_time loadstore zp[2]:6 0.3571428571428571
(signed word()) main()
(label) main::@1
(label) main::@10

View File

@ -16,7 +16,7 @@
(label) end::@1
(label) end::@2
(label) end::@return
(word) last_time loadstore zp[2]:6 0.38461538461538464
(word) last_time loadstore zp[2]:6 0.3571428571428571
(signed word()) main()
(label) main::@1
(label) main::@10

View File

@ -1393,9 +1393,9 @@ interrupt(KERNEL_MIN)(void()) plex_irq()
(byte) plex_irq::plexFreeNextYpos1_return
(byte) plex_irq::plexFreeNextYpos1_return#0 4.0
(byte) plex_irq::rasterY
(byte) plex_show_idx loadstore 1.2272727272727273
(byte) plex_show_idx loadstore 0.7941176470588236
(byte) plex_sprite_idx loadstore 0.3870967741935484
(byte) plex_sprite_msb loadstore 0.6153846153846154
(byte) plex_sprite_msb loadstore 0.48484848484848486
Initial phi equivalence classes
[ loop::sin_idx#6 loop::sin_idx#1 ]
@ -2294,18 +2294,18 @@ Removing always clobbered register reg byte y as potential for zp[1]:24 [ plexSh
Statement [101] *((const byte*) PLEX_FREE_YPOS + (byte) plex_free_next) ← (byte~) plexShowSprite::plexFreeAdd1_$0 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ) always clobbers reg byte y
Statement [105] *((const byte*) PLEX_SCREEN_PTR#0 + (byte) plex_sprite_idx) ← *((const byte*) PLEX_PTR + *((const byte*) PLEX_SORTED_IDX + (byte) plex_show_idx)) [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ) always clobbers reg byte a reg byte x reg byte y
Removing always clobbered register reg byte a as potential for zp[1]:24 [ plexShowSprite::plex_sprite_idx2#0 ]
Statement [106] (byte) plexShowSprite::xpos_idx#0 ← *((const byte*) PLEX_SORTED_IDX + (byte) plex_show_idx) [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] ( plexShowSprite:86 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] ) always clobbers reg byte y
Statement [107] (byte~) plexShowSprite::$11 ← (byte) plexShowSprite::xpos_idx#0 << (byte) 1 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 ] ( plexShowSprite:86 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 ] ) always clobbers reg byte a
Statement [108] (byte~) plexShowSprite::$2 ← < *((const word*) PLEX_XPOS + (byte~) plexShowSprite::$11) [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 plexShowSprite::$2 ] ( plexShowSprite:86 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 plexShowSprite::$2 ] ) always clobbers reg byte a
Statement [106] (byte) plexShowSprite::xpos_idx#0 ← *((const byte*) PLEX_SORTED_IDX + (byte) plex_show_idx) [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] ) always clobbers reg byte y
Statement [107] (byte~) plexShowSprite::$11 ← (byte) plexShowSprite::xpos_idx#0 << (byte) 1 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 ] ) always clobbers reg byte a
Statement [108] (byte~) plexShowSprite::$2 ← < *((const word*) PLEX_XPOS + (byte~) plexShowSprite::$11) [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 plexShowSprite::$2 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 plexShowSprite::$2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:30 [ plexShowSprite::$11 ]
Statement [109] *((const byte*) SPRITES_XPOS + (byte) plexShowSprite::plex_sprite_idx2#0) ← (byte~) plexShowSprite::$2 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$11 ] ( plexShowSprite:86 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$11 ] ) always clobbers reg byte y
Statement [109] *((const byte*) SPRITES_XPOS + (byte) plexShowSprite::plex_sprite_idx2#0) ← (byte~) plexShowSprite::$2 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$11 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$11 ] ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:30 [ plexShowSprite::$11 ]
Statement [110] (byte~) plexShowSprite::$3 ← > *((const word*) PLEX_XPOS + (byte~) plexShowSprite::$11) [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$3 ] ( plexShowSprite:86 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$3 ] ) always clobbers reg byte a
Statement [112] (byte~) plexShowSprite::$9 ← (byte) $ff ^ (byte) plex_sprite_msb [ plex_sprite_idx plex_free_next plexShowSprite::$9 ] ( plexShowSprite:86 [ plex_sprite_idx plex_free_next plexShowSprite::$9 ] ) always clobbers reg byte a
Statement [113] *((const byte*) SPRITES_XMSB) ← *((const byte*) SPRITES_XMSB) & (byte~) plexShowSprite::$9 [ plex_sprite_idx plex_free_next ] ( plexShowSprite:86 [ plex_sprite_idx plex_free_next ] ) always clobbers reg byte a
Statement [110] (byte~) plexShowSprite::$3 ← > *((const word*) PLEX_XPOS + (byte~) plexShowSprite::$11) [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$3 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$3 ] ) always clobbers reg byte a
Statement [112] (byte~) plexShowSprite::$9 ← (byte) $ff ^ (byte) plex_sprite_msb [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$9 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$9 ] ) always clobbers reg byte a
Statement [113] *((const byte*) SPRITES_XMSB) ← *((const byte*) SPRITES_XMSB) & (byte~) plexShowSprite::$9 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ) always clobbers reg byte a
Statement [119] if((byte) plex_sprite_msb!=(byte) 0) goto plexShowSprite::@return [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ) always clobbers reg byte a
Statement [120] (byte) plex_sprite_msb ← (byte) 1 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ) always clobbers reg byte a
Statement [122] *((const byte*) SPRITES_XMSB) ← *((const byte*) SPRITES_XMSB) | (byte) plex_sprite_msb [ plex_sprite_idx plex_free_next ] ( plexShowSprite:86 [ plex_sprite_idx plex_free_next ] ) always clobbers reg byte a
Statement [122] *((const byte*) SPRITES_XMSB) ← *((const byte*) SPRITES_XMSB) | (byte) plex_sprite_msb [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ) always clobbers reg byte a
Statement [1] (byte) plex_show_idx ← (byte) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [2] (byte) plex_sprite_idx ← (byte) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [3] (byte) plex_sprite_msb ← (byte) 1 [ ] ( [ ] ) always clobbers reg byte a
@ -2352,16 +2352,16 @@ Statement [99] *((const byte*) SPRITES_YPOS + (byte) plexShowSprite::plex_sprite
Removing always clobbered register reg byte y as potential for zp[1]:25 [ plexShowSprite::plexFreeAdd1_ypos#0 ]
Statement [101] *((const byte*) PLEX_FREE_YPOS + (byte) plex_free_next) ← (byte~) plexShowSprite::plexFreeAdd1_$0 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ) always clobbers reg byte y
Statement [105] *((const byte*) PLEX_SCREEN_PTR#0 + (byte) plex_sprite_idx) ← *((const byte*) PLEX_PTR + *((const byte*) PLEX_SORTED_IDX + (byte) plex_show_idx)) [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ) always clobbers reg byte a reg byte x reg byte y
Statement [106] (byte) plexShowSprite::xpos_idx#0 ← *((const byte*) PLEX_SORTED_IDX + (byte) plex_show_idx) [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] ( plexShowSprite:86 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] ) always clobbers reg byte y
Statement [107] (byte~) plexShowSprite::$11 ← (byte) plexShowSprite::xpos_idx#0 << (byte) 1 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 ] ( plexShowSprite:86 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 ] ) always clobbers reg byte a
Statement [108] (byte~) plexShowSprite::$2 ← < *((const word*) PLEX_XPOS + (byte~) plexShowSprite::$11) [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 plexShowSprite::$2 ] ( plexShowSprite:86 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 plexShowSprite::$2 ] ) always clobbers reg byte a
Statement [109] *((const byte*) SPRITES_XPOS + (byte) plexShowSprite::plex_sprite_idx2#0) ← (byte~) plexShowSprite::$2 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$11 ] ( plexShowSprite:86 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$11 ] ) always clobbers reg byte y
Statement [110] (byte~) plexShowSprite::$3 ← > *((const word*) PLEX_XPOS + (byte~) plexShowSprite::$11) [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$3 ] ( plexShowSprite:86 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$3 ] ) always clobbers reg byte a
Statement [112] (byte~) plexShowSprite::$9 ← (byte) $ff ^ (byte) plex_sprite_msb [ plex_sprite_idx plex_free_next plexShowSprite::$9 ] ( plexShowSprite:86 [ plex_sprite_idx plex_free_next plexShowSprite::$9 ] ) always clobbers reg byte a
Statement [113] *((const byte*) SPRITES_XMSB) ← *((const byte*) SPRITES_XMSB) & (byte~) plexShowSprite::$9 [ plex_sprite_idx plex_free_next ] ( plexShowSprite:86 [ plex_sprite_idx plex_free_next ] ) always clobbers reg byte a
Statement [106] (byte) plexShowSprite::xpos_idx#0 ← *((const byte*) PLEX_SORTED_IDX + (byte) plex_show_idx) [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] ) always clobbers reg byte y
Statement [107] (byte~) plexShowSprite::$11 ← (byte) plexShowSprite::xpos_idx#0 << (byte) 1 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 ] ) always clobbers reg byte a
Statement [108] (byte~) plexShowSprite::$2 ← < *((const word*) PLEX_XPOS + (byte~) plexShowSprite::$11) [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 plexShowSprite::$2 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 plexShowSprite::$2 ] ) always clobbers reg byte a
Statement [109] *((const byte*) SPRITES_XPOS + (byte) plexShowSprite::plex_sprite_idx2#0) ← (byte~) plexShowSprite::$2 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$11 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$11 ] ) always clobbers reg byte y
Statement [110] (byte~) plexShowSprite::$3 ← > *((const word*) PLEX_XPOS + (byte~) plexShowSprite::$11) [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$3 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$3 ] ) always clobbers reg byte a
Statement [112] (byte~) plexShowSprite::$9 ← (byte) $ff ^ (byte) plex_sprite_msb [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$9 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$9 ] ) always clobbers reg byte a
Statement [113] *((const byte*) SPRITES_XMSB) ← *((const byte*) SPRITES_XMSB) & (byte~) plexShowSprite::$9 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ) always clobbers reg byte a
Statement [119] if((byte) plex_sprite_msb!=(byte) 0) goto plexShowSprite::@return [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ) always clobbers reg byte a
Statement [120] (byte) plex_sprite_msb ← (byte) 1 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ) always clobbers reg byte a
Statement [122] *((const byte*) SPRITES_XMSB) ← *((const byte*) SPRITES_XMSB) | (byte) plex_sprite_msb [ plex_sprite_idx plex_free_next ] ( plexShowSprite:86 [ plex_sprite_idx plex_free_next ] ) always clobbers reg byte a
Statement [122] *((const byte*) SPRITES_XMSB) ← *((const byte*) SPRITES_XMSB) | (byte) plex_sprite_msb [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ) always clobbers reg byte a
Statement [1] (byte) plex_show_idx ← (byte) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [2] (byte) plex_sprite_idx ← (byte) 0 [ ] ( [ ] ) always clobbers reg byte a
Statement [3] (byte) plex_sprite_msb ← (byte) 1 [ ] ( [ ] ) always clobbers reg byte a
@ -2407,16 +2407,16 @@ Statement [98] (byte) plexShowSprite::plexFreeAdd1_ypos#0 ← *((const byte*) PL
Statement [99] *((const byte*) SPRITES_YPOS + (byte) plexShowSprite::plex_sprite_idx2#0) ← (byte) plexShowSprite::plexFreeAdd1_ypos#0 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::plexFreeAdd1_ypos#0 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::plexFreeAdd1_ypos#0 ] ) always clobbers reg byte y
Statement [101] *((const byte*) PLEX_FREE_YPOS + (byte) plex_free_next) ← (byte~) plexShowSprite::plexFreeAdd1_$0 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ) always clobbers reg byte y
Statement [105] *((const byte*) PLEX_SCREEN_PTR#0 + (byte) plex_sprite_idx) ← *((const byte*) PLEX_PTR + *((const byte*) PLEX_SORTED_IDX + (byte) plex_show_idx)) [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ) always clobbers reg byte a reg byte x reg byte y
Statement [106] (byte) plexShowSprite::xpos_idx#0 ← *((const byte*) PLEX_SORTED_IDX + (byte) plex_show_idx) [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] ( plexShowSprite:86 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] ) always clobbers reg byte y
Statement [107] (byte~) plexShowSprite::$11 ← (byte) plexShowSprite::xpos_idx#0 << (byte) 1 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 ] ( plexShowSprite:86 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 ] ) always clobbers reg byte a
Statement [108] (byte~) plexShowSprite::$2 ← < *((const word*) PLEX_XPOS + (byte~) plexShowSprite::$11) [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 plexShowSprite::$2 ] ( plexShowSprite:86 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 plexShowSprite::$2 ] ) always clobbers reg byte a
Statement [109] *((const byte*) SPRITES_XPOS + (byte) plexShowSprite::plex_sprite_idx2#0) ← (byte~) plexShowSprite::$2 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$11 ] ( plexShowSprite:86 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$11 ] ) always clobbers reg byte y
Statement [110] (byte~) plexShowSprite::$3 ← > *((const word*) PLEX_XPOS + (byte~) plexShowSprite::$11) [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$3 ] ( plexShowSprite:86 [ plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$3 ] ) always clobbers reg byte a
Statement [112] (byte~) plexShowSprite::$9 ← (byte) $ff ^ (byte) plex_sprite_msb [ plex_sprite_idx plex_free_next plexShowSprite::$9 ] ( plexShowSprite:86 [ plex_sprite_idx plex_free_next plexShowSprite::$9 ] ) always clobbers reg byte a
Statement [113] *((const byte*) SPRITES_XMSB) ← *((const byte*) SPRITES_XMSB) & (byte~) plexShowSprite::$9 [ plex_sprite_idx plex_free_next ] ( plexShowSprite:86 [ plex_sprite_idx plex_free_next ] ) always clobbers reg byte a
Statement [106] (byte) plexShowSprite::xpos_idx#0 ← *((const byte*) PLEX_SORTED_IDX + (byte) plex_show_idx) [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] ) always clobbers reg byte y
Statement [107] (byte~) plexShowSprite::$11 ← (byte) plexShowSprite::xpos_idx#0 << (byte) 1 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 ] ) always clobbers reg byte a
Statement [108] (byte~) plexShowSprite::$2 ← < *((const word*) PLEX_XPOS + (byte~) plexShowSprite::$11) [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 plexShowSprite::$2 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$11 plexShowSprite::$2 ] ) always clobbers reg byte a
Statement [109] *((const byte*) SPRITES_XPOS + (byte) plexShowSprite::plex_sprite_idx2#0) ← (byte~) plexShowSprite::$2 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$11 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$11 ] ) always clobbers reg byte y
Statement [110] (byte~) plexShowSprite::$3 ← > *((const word*) PLEX_XPOS + (byte~) plexShowSprite::$11) [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$3 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$3 ] ) always clobbers reg byte a
Statement [112] (byte~) plexShowSprite::$9 ← (byte) $ff ^ (byte) plex_sprite_msb [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$9 ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$9 ] ) always clobbers reg byte a
Statement [113] *((const byte*) SPRITES_XMSB) ← *((const byte*) SPRITES_XMSB) & (byte~) plexShowSprite::$9 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ) always clobbers reg byte a
Statement [119] if((byte) plex_sprite_msb!=(byte) 0) goto plexShowSprite::@return [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ) always clobbers reg byte a
Statement [120] (byte) plex_sprite_msb ← (byte) 1 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ) always clobbers reg byte a
Statement [122] *((const byte*) SPRITES_XMSB) ← *((const byte*) SPRITES_XMSB) | (byte) plex_sprite_msb [ plex_sprite_idx plex_free_next ] ( plexShowSprite:86 [ plex_sprite_idx plex_free_next ] ) always clobbers reg byte a
Statement [122] *((const byte*) SPRITES_XMSB) ← *((const byte*) SPRITES_XMSB) | (byte) plex_sprite_msb [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:86 [ plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ) always clobbers reg byte a
Potential registers zp[1]:2 [ loop::sin_idx#6 loop::sin_idx#1 ] : zp[1]:2 , reg byte x , reg byte y ,
Potential registers zp[1]:3 [ loop::y_idx#2 loop::y_idx#1 loop::y_idx#4 ] : zp[1]:3 , reg byte x , reg byte y ,
Potential registers zp[1]:4 [ loop::sy#2 loop::sy#1 ] : zp[1]:4 , reg byte x , reg byte y ,
@ -2458,7 +2458,7 @@ Uplift Scope [init] 33: zp[1]:11 [ init::ss#2 init::ss#1 ] 25.3: zp[1]:8 [ init:
Uplift Scope [plexShowSprite] 4: zp[1]:26 [ plexShowSprite::plexFreeAdd1_$0 ] 4: zp[1]:27 [ plexShowSprite::plexFreeAdd1_$1 ] 4: zp[1]:28 [ plexShowSprite::plexFreeAdd1_$2 ] 4: zp[1]:29 [ plexShowSprite::xpos_idx#0 ] 4: zp[1]:31 [ plexShowSprite::$2 ] 4: zp[1]:32 [ plexShowSprite::$3 ] 4: zp[1]:33 [ plexShowSprite::$9 ] 4: zp[1]:34 [ plexShowSprite::$5 ] 4: zp[1]:35 [ plexShowSprite::$6 ] 3: zp[1]:25 [ plexShowSprite::plexFreeAdd1_ypos#0 ] 2: zp[1]:30 [ plexShowSprite::$11 ] 0.5: zp[1]:24 [ plexShowSprite::plex_sprite_idx2#0 ]
Uplift Scope [plexInit] 38.5: zp[1]:12 [ plexInit::i#2 plexInit::i#1 ]
Uplift Scope [plex_irq] 11: zp[1]:23 [ plex_irq::$4 ] 4: zp[1]:22 [ plex_irq::plexFreeNextYpos1_return#0 ]
Uplift Scope [] 10.55: zp[1]:17 [ framedone ] 1.23: zp[1]:13 [ plex_show_idx ] 0.68: zp[1]:16 [ plex_free_next ] 0.62: zp[1]:15 [ plex_sprite_msb ] 0.39: zp[1]:14 [ plex_sprite_idx ]
Uplift Scope [] 10.55: zp[1]:17 [ framedone ] 0.79: zp[1]:13 [ plex_show_idx ] 0.68: zp[1]:16 [ plex_free_next ] 0.48: zp[1]:15 [ plex_sprite_msb ] 0.39: zp[1]:14 [ plex_sprite_idx ]
Uplift Scope [main]
Uplifting [plexSort] best 60379 combination reg byte x [ plexSort::s#3 plexSort::s#1 plexSort::s#6 ] reg byte x [ plexSort::plexFreePrepare1_s#2 plexSort::plexFreePrepare1_s#1 ] zp[1]:20 [ plexSort::s#2 ] zp[1]:5 [ plexSort::m#2 plexSort::m#1 ] zp[1]:19 [ plexSort::nxt_y#0 ] zp[1]:18 [ plexSort::nxt_idx#0 ]
@ -2511,10 +2511,10 @@ Attempting to uplift remaining variables inzp[1]:13 [ plex_show_idx ]
Uplifting [] best 57312 combination zp[1]:13 [ plex_show_idx ]
Attempting to uplift remaining variables inzp[1]:16 [ plex_free_next ]
Uplifting [] best 57312 combination zp[1]:16 [ plex_free_next ]
Attempting to uplift remaining variables inzp[1]:15 [ plex_sprite_msb ]
Uplifting [] best 57312 combination zp[1]:15 [ plex_sprite_msb ]
Attempting to uplift remaining variables inzp[1]:24 [ plexShowSprite::plex_sprite_idx2#0 ]
Uplifting [plexShowSprite] best 57312 combination zp[1]:24 [ plexShowSprite::plex_sprite_idx2#0 ]
Attempting to uplift remaining variables inzp[1]:15 [ plex_sprite_msb ]
Uplifting [] best 57312 combination zp[1]:15 [ plex_sprite_msb ]
Attempting to uplift remaining variables inzp[1]:14 [ plex_sprite_idx ]
Uplifting [] best 57312 combination zp[1]:14 [ plex_sprite_idx ]
Coalescing zero page register [ zp[1]:24 [ plexShowSprite::plex_sprite_idx2#0 ] ] with [ zp[1]:23 [ plex_irq::$4 ] ]
@ -3482,9 +3482,9 @@ interrupt(KERNEL_MIN)(void()) plex_irq()
(byte) plex_irq::plexFreeNextYpos1_return
(byte) plex_irq::plexFreeNextYpos1_return#0 reg byte x 4.0
(byte) plex_irq::rasterY
(byte) plex_show_idx loadstore zp[1]:6 1.2272727272727273
(byte) plex_show_idx loadstore zp[1]:6 0.7941176470588236
(byte) plex_sprite_idx loadstore zp[1]:7 0.3870967741935484
(byte) plex_sprite_msb loadstore zp[1]:8 0.6153846153846154
(byte) plex_sprite_msb loadstore zp[1]:8 0.48484848484848486
zp[1]:2 [ loop::sin_idx#6 loop::sin_idx#1 ]
reg byte x [ loop::y_idx#2 loop::y_idx#1 loop::y_idx#4 ]

View File

@ -151,9 +151,9 @@ interrupt(KERNEL_MIN)(void()) plex_irq()
(byte) plex_irq::plexFreeNextYpos1_return
(byte) plex_irq::plexFreeNextYpos1_return#0 reg byte x 4.0
(byte) plex_irq::rasterY
(byte) plex_show_idx loadstore zp[1]:6 1.2272727272727273
(byte) plex_show_idx loadstore zp[1]:6 0.7941176470588236
(byte) plex_sprite_idx loadstore zp[1]:7 0.3870967741935484
(byte) plex_sprite_msb loadstore zp[1]:8 0.6153846153846154
(byte) plex_sprite_msb loadstore zp[1]:8 0.48484848484848486
zp[1]:2 [ loop::sin_idx#6 loop::sin_idx#1 ]
reg byte x [ loop::y_idx#2 loop::y_idx#1 loop::y_idx#4 ]

View File

@ -2,12 +2,14 @@
:BasicUpstart(main)
.pc = $80d "Program"
.label ba = 2
.label be = 6
.label bb = 3
.label bb_1 = 4
.label bc = 5
main: {
lda #0
sta.z ba
sta.z be
tay
tax
sta.z bb
@ -252,14 +254,46 @@ fb: {
}
fc: {
cmp #0
bne __b1
inc.z be
__b1:
cmp #1
bne __b2
inc.z be
__b2:
cmp #2
bne __b3
inc.z be
__b3:
cmp #3
bne __b4
inc.z be
__b4:
cmp #4
bne __b5
inc.z be
__b5:
cmp #5
bne __b6
inc.z be
__b6:
cmp #6
bne __b7
inc.z be
__b7:
cmp #7
bne __b8
inc.z be
__b8:
cmp #8
bne __b9
inc.z be
__b9:
cmp #9
bne __b19
lda #0
sta.z be
rts
__b19:
rts
}

View File

@ -14,6 +14,7 @@ main: scope:[main] from @1
to:main::@1
main::@1: scope:[main] from main main::@3
[5] (byte) ba#17 ← phi( main/(byte) 0 main::@3/(byte) ba#1 )
[5] (byte) be#2 ← phi( main/(byte) 0 main::@3/(byte) be#13 )
[5] (byte) bd#2 ← phi( main/(byte) 0 main::@3/(byte) bd#13 )
[5] (byte) bc#2 ← phi( main/(byte) 0 main::@3/(byte) bc#13 )
[5] (byte) bb#16 ← phi( main/(byte) 0 main::@3/(byte) bb#13 )
@ -36,6 +37,7 @@ f0::@10: scope:[f0] from f0
[12] call fa
to:f0::@1
f0::@1: scope:[f0] from f0 f0::@10
[13] (byte) be#142 ← phi( f0/(byte) be#2 f0::@10/(byte) be#24 )
[13] (byte) bd#129 ← phi( f0/(byte) bd#2 f0::@10/(byte) bd#24 )
[13] (byte) bc#63 ← phi( f0/(byte) bc#2 f0::@10/(byte) bc#24 )
[13] (byte) bb#18 ← phi( f0/(byte) bb#16 f0::@10/(byte) bb#3 )
@ -47,6 +49,7 @@ f0::@11: scope:[f0] from f0::@1
[17] call fa
to:f0::@2
f0::@2: scope:[f0] from f0::@1 f0::@11
[18] (byte) be#143 ← phi( f0::@1/(byte) be#142 f0::@11/(byte) be#24 )
[18] (byte) bd#130 ← phi( f0::@1/(byte) bd#129 f0::@11/(byte) bd#24 )
[18] (byte) bc#64 ← phi( f0::@1/(byte) bc#63 f0::@11/(byte) bc#24 )
[18] (byte) bb#19 ← phi( f0::@1/(byte) bb#18 f0::@11/(byte) bb#4 )
@ -58,6 +61,7 @@ f0::@12: scope:[f0] from f0::@2
[22] call fa
to:f0::@3
f0::@3: scope:[f0] from f0::@12 f0::@2
[23] (byte) be#144 ← phi( f0::@2/(byte) be#143 f0::@12/(byte) be#24 )
[23] (byte) bd#131 ← phi( f0::@2/(byte) bd#130 f0::@12/(byte) bd#24 )
[23] (byte) bc#65 ← phi( f0::@2/(byte) bc#64 f0::@12/(byte) bc#24 )
[23] (byte) bb#20 ← phi( f0::@2/(byte) bb#19 f0::@12/(byte) bb#5 )
@ -69,6 +73,7 @@ f0::@13: scope:[f0] from f0::@3
[27] call fa
to:f0::@4
f0::@4: scope:[f0] from f0::@13 f0::@3
[28] (byte) be#100 ← phi( f0::@13/(byte) be#24 f0::@3/(byte) be#144 )
[28] (byte) bd#132 ← phi( f0::@13/(byte) bd#24 f0::@3/(byte) bd#131 )
[28] (byte) bc#66 ← phi( f0::@13/(byte) bc#24 f0::@3/(byte) bc#65 )
[28] (byte) bb#21 ← phi( f0::@13/(byte) bb#6 f0::@3/(byte) bb#20 )
@ -80,6 +85,7 @@ f0::@14: scope:[f0] from f0::@4
[32] call fa
to:f0::@5
f0::@5: scope:[f0] from f0::@14 f0::@4
[33] (byte) be#101 ← phi( f0::@14/(byte) be#24 f0::@4/(byte) be#100 )
[33] (byte) bd#133 ← phi( f0::@14/(byte) bd#24 f0::@4/(byte) bd#132 )
[33] (byte) bc#100 ← phi( f0::@14/(byte) bc#24 f0::@4/(byte) bc#66 )
[33] (byte) bb#22 ← phi( f0::@14/(byte) bb#66 f0::@4/(byte) bb#21 )
@ -91,6 +97,7 @@ f0::@15: scope:[f0] from f0::@5
[37] call fa
to:f0::@6
f0::@6: scope:[f0] from f0::@15 f0::@5
[38] (byte) be#102 ← phi( f0::@15/(byte) be#24 f0::@5/(byte) be#101 )
[38] (byte) bd#134 ← phi( f0::@15/(byte) bd#24 f0::@5/(byte) bd#133 )
[38] (byte) bc#101 ← phi( f0::@15/(byte) bc#24 f0::@5/(byte) bc#100 )
[38] (byte) bb#23 ← phi( f0::@15/(byte) bb#67 f0::@5/(byte) bb#22 )
@ -102,6 +109,7 @@ f0::@16: scope:[f0] from f0::@6
[42] call fa
to:f0::@7
f0::@7: scope:[f0] from f0::@16 f0::@6
[43] (byte) be#103 ← phi( f0::@16/(byte) be#24 f0::@6/(byte) be#102 )
[43] (byte) bd#135 ← phi( f0::@16/(byte) bd#24 f0::@6/(byte) bd#134 )
[43] (byte) bc#102 ← phi( f0::@16/(byte) bc#24 f0::@6/(byte) bc#101 )
[43] (byte) bb#24 ← phi( f0::@16/(byte) bb#68 f0::@6/(byte) bb#23 )
@ -113,6 +121,7 @@ f0::@17: scope:[f0] from f0::@7
[47] call fa
to:f0::@8
f0::@8: scope:[f0] from f0::@17 f0::@7
[48] (byte) be#104 ← phi( f0::@17/(byte) be#24 f0::@7/(byte) be#103 )
[48] (byte) bd#136 ← phi( f0::@17/(byte) bd#24 f0::@7/(byte) bd#135 )
[48] (byte) bc#103 ← phi( f0::@17/(byte) bc#24 f0::@7/(byte) bc#102 )
[48] (byte) bb#25 ← phi( f0::@17/(byte) bb#10 f0::@7/(byte) bb#24 )
@ -124,6 +133,7 @@ f0::@18: scope:[f0] from f0::@8
[52] call fa
to:f0::@9
f0::@9: scope:[f0] from f0::@18 f0::@8
[53] (byte) be#105 ← phi( f0::@18/(byte) be#24 f0::@8/(byte) be#104 )
[53] (byte) bd#93 ← phi( f0::@18/(byte) bd#24 f0::@8/(byte) bd#136 )
[53] (byte) bc#71 ← phi( f0::@18/(byte) bc#24 f0::@8/(byte) bc#103 )
[53] (byte) bb#50 ← phi( f0::@18/(byte) bb#11 f0::@8/(byte) bb#25 )
@ -134,6 +144,7 @@ f0::@19: scope:[f0] from f0::@9
[56] call fa
to:f0::@return
f0::@return: scope:[f0] from f0::@19 f0::@9
[57] (byte) be#13 ← phi( f0::@19/(byte) be#24 f0::@9/(byte) be#105 )
[57] (byte) bd#13 ← phi( f0::@19/(byte) bd#24 f0::@9/(byte) bd#93 )
[57] (byte) bc#13 ← phi( f0::@19/(byte) bc#24 f0::@9/(byte) bc#71 )
[57] (byte) bb#13 ← phi( f0::@19/(byte) 0 f0::@9/(byte) bb#50 )
@ -142,6 +153,7 @@ f0::@return: scope:[f0] from f0::@19 f0::@9
(void()) fa()
fa: scope:[fa] from f0::@10 f0::@11 f0::@12 f0::@13 f0::@14 f0::@15 f0::@16 f0::@17 f0::@18 f0::@19
[59] (byte) be#107 ← phi( f0::@10/(byte) be#2 f0::@11/(byte) be#142 f0::@12/(byte) be#143 f0::@13/(byte) be#144 f0::@14/(byte) be#100 f0::@15/(byte) be#101 f0::@16/(byte) be#102 f0::@17/(byte) be#103 f0::@18/(byte) be#104 f0::@19/(byte) be#105 )
[59] (byte) bd#137 ← phi( f0::@10/(byte) bd#2 f0::@11/(byte) bd#129 f0::@12/(byte) bd#130 f0::@13/(byte) bd#131 f0::@14/(byte) bd#132 f0::@15/(byte) bd#133 f0::@16/(byte) bd#134 f0::@17/(byte) bd#135 f0::@18/(byte) bd#136 f0::@19/(byte) bd#93 )
[59] (byte) bc#39 ← phi( f0::@10/(byte) bc#2 f0::@11/(byte) bc#63 f0::@12/(byte) bc#64 f0::@13/(byte) bc#65 f0::@14/(byte) bc#66 f0::@15/(byte) bc#100 f0::@16/(byte) bc#101 f0::@17/(byte) bc#102 f0::@18/(byte) bc#103 f0::@19/(byte) bc#71 )
[59] (byte) bb#27 ← phi( f0::@10/(byte) bb#100 f0::@11/(byte) bb#101 f0::@12/(byte) bb#102 f0::@13/(byte) bb#103 f0::@14/(byte) bb#104 f0::@15/(byte) bb#105 f0::@16/(byte) bb#106 f0::@17/(byte) bb#107 f0::@18/(byte) bb#108 f0::@19/(byte) 0 )
@ -153,6 +165,7 @@ fa::@10: scope:[fa] from fa
[63] call fb
to:fa::@1
fa::@1: scope:[fa] from fa fa::@10
[64] (byte) be#108 ← phi( fa/(byte) be#107 fa::@10/(byte) be#35 )
[64] (byte) bd#138 ← phi( fa/(byte) bd#137 fa::@10/(byte) bd#35 )
[64] (byte) bc#40 ← phi( fa/(byte) bc#39 fa::@10/(byte) bc#104 )
[65] if((byte) bb#27!=(byte) 1) goto fa::@2
@ -163,6 +176,7 @@ fa::@11: scope:[fa] from fa::@1
[68] call fb
to:fa::@2
fa::@2: scope:[fa] from fa::@1 fa::@11
[69] (byte) be#109 ← phi( fa::@1/(byte) be#108 fa::@11/(byte) be#35 )
[69] (byte) bd#139 ← phi( fa::@1/(byte) bd#138 fa::@11/(byte) bd#35 )
[69] (byte) bc#41 ← phi( fa::@1/(byte) bc#40 fa::@11/(byte) bc#105 )
[70] if((byte) bb#27!=(byte) 2) goto fa::@3
@ -173,6 +187,7 @@ fa::@12: scope:[fa] from fa::@2
[73] call fb
to:fa::@3
fa::@3: scope:[fa] from fa::@12 fa::@2
[74] (byte) be#110 ← phi( fa::@2/(byte) be#109 fa::@12/(byte) be#35 )
[74] (byte) bd#140 ← phi( fa::@2/(byte) bd#139 fa::@12/(byte) bd#35 )
[74] (byte) bc#42 ← phi( fa::@2/(byte) bc#41 fa::@12/(byte) bc#106 )
[75] if((byte) bb#27!=(byte) 3) goto fa::@4
@ -183,6 +198,7 @@ fa::@13: scope:[fa] from fa::@3
[78] call fb
to:fa::@4
fa::@4: scope:[fa] from fa::@13 fa::@3
[79] (byte) be#111 ← phi( fa::@13/(byte) be#35 fa::@3/(byte) be#110 )
[79] (byte) bd#141 ← phi( fa::@13/(byte) bd#35 fa::@3/(byte) bd#140 )
[79] (byte) bc#43 ← phi( fa::@13/(byte) bc#107 fa::@3/(byte) bc#42 )
[80] if((byte) bb#27!=(byte) 4) goto fa::@5
@ -193,6 +209,7 @@ fa::@14: scope:[fa] from fa::@4
[83] call fb
to:fa::@5
fa::@5: scope:[fa] from fa::@14 fa::@4
[84] (byte) be#112 ← phi( fa::@14/(byte) be#35 fa::@4/(byte) be#111 )
[84] (byte) bd#100 ← phi( fa::@14/(byte) bd#35 fa::@4/(byte) bd#141 )
[84] (byte) bc#44 ← phi( fa::@14/(byte) bc#108 fa::@4/(byte) bc#43 )
[85] if((byte) bb#27!=(byte) 5) goto fa::@6
@ -203,6 +220,7 @@ fa::@15: scope:[fa] from fa::@5
[88] call fb
to:fa::@6
fa::@6: scope:[fa] from fa::@15 fa::@5
[89] (byte) be#113 ← phi( fa::@15/(byte) be#35 fa::@5/(byte) be#112 )
[89] (byte) bd#101 ← phi( fa::@15/(byte) bd#35 fa::@5/(byte) bd#100 )
[89] (byte) bc#45 ← phi( fa::@15/(byte) bc#109 fa::@5/(byte) bc#44 )
[90] if((byte) bb#27!=(byte) 6) goto fa::@7
@ -213,6 +231,7 @@ fa::@16: scope:[fa] from fa::@6
[93] call fb
to:fa::@7
fa::@7: scope:[fa] from fa::@16 fa::@6
[94] (byte) be#114 ← phi( fa::@16/(byte) be#35 fa::@6/(byte) be#113 )
[94] (byte) bd#102 ← phi( fa::@16/(byte) bd#35 fa::@6/(byte) bd#101 )
[94] (byte) bc#46 ← phi( fa::@16/(byte) bc#110 fa::@6/(byte) bc#45 )
[95] if((byte) bb#27!=(byte) 7) goto fa::@8
@ -223,6 +242,7 @@ fa::@17: scope:[fa] from fa::@7
[98] call fb
to:fa::@8
fa::@8: scope:[fa] from fa::@17 fa::@7
[99] (byte) be#115 ← phi( fa::@17/(byte) be#35 fa::@7/(byte) be#114 )
[99] (byte) bd#103 ← phi( fa::@17/(byte) bd#35 fa::@7/(byte) bd#102 )
[99] (byte) bc#47 ← phi( fa::@17/(byte) bc#111 fa::@7/(byte) bc#46 )
[100] if((byte) bb#27!=(byte) 8) goto fa::@9
@ -233,6 +253,7 @@ fa::@18: scope:[fa] from fa::@8
[103] call fb
to:fa::@9
fa::@9: scope:[fa] from fa::@18 fa::@8
[104] (byte) be#116 ← phi( fa::@18/(byte) be#35 fa::@8/(byte) be#115 )
[104] (byte) bd#104 ← phi( fa::@18/(byte) bd#35 fa::@8/(byte) bd#103 )
[104] (byte) bc#83 ← phi( fa::@18/(byte) bc#112 fa::@8/(byte) bc#47 )
[105] if((byte) bb#27!=(byte) 9) goto fa::@return
@ -242,6 +263,7 @@ fa::@19: scope:[fa] from fa::@9
[107] call fb
to:fa::@return
fa::@return: scope:[fa] from fa::@19 fa::@9
[108] (byte) be#24 ← phi( fa::@19/(byte) be#35 fa::@9/(byte) be#116 )
[108] (byte) bd#24 ← phi( fa::@19/(byte) bd#35 fa::@9/(byte) bd#104 )
[108] (byte) bc#24 ← phi( fa::@19/(byte) 0 fa::@9/(byte) bc#83 )
[109] return
@ -249,6 +271,7 @@ fa::@return: scope:[fa] from fa::@19 fa::@9
(void()) fb()
fb: scope:[fb] from fa::@10 fa::@11 fa::@12 fa::@13 fa::@14 fa::@15 fa::@16 fa::@17 fa::@18 fa::@19
[110] (byte) be#118 ← phi( fa::@10/(byte) be#107 fa::@11/(byte) be#108 fa::@12/(byte) be#109 fa::@13/(byte) be#110 fa::@14/(byte) be#111 fa::@15/(byte) be#112 fa::@16/(byte) be#113 fa::@17/(byte) be#114 fa::@18/(byte) be#115 fa::@19/(byte) be#116 )
[110] (byte) bd#106 ← phi( fa::@10/(byte) bd#137 fa::@11/(byte) bd#138 fa::@12/(byte) bd#139 fa::@13/(byte) bd#140 fa::@14/(byte) bd#141 fa::@15/(byte) bd#100 fa::@16/(byte) bd#101 fa::@17/(byte) bd#102 fa::@18/(byte) bd#103 fa::@19/(byte) bd#104 )
[110] (byte) bc#113 ← phi( fa::@10/(byte) bc#172 fa::@11/(byte) bc#173 fa::@12/(byte) bc#174 fa::@13/(byte) bc#175 fa::@14/(byte) bc#176 fa::@15/(byte) bc#177 fa::@16/(byte) bc#178 fa::@17/(byte) bc#179 fa::@18/(byte) bc#180 fa::@19/(byte) 0 )
[111] if((byte) bc#113!=(byte) 0) goto fb::@1
@ -259,6 +282,7 @@ fb::@10: scope:[fb] from fb
[114] call fc
to:fb::@1
fb::@1: scope:[fb] from fb fb::@10
[115] (byte) be#119 ← phi( fb/(byte) be#118 fb::@10/(byte) be#46 )
[115] (byte) bd#107 ← phi( fb/(byte) bd#106 fb::@10/(byte) bd#146 )
[116] if((byte) bc#113!=(byte) 1) goto fb::@2
to:fb::@11
@ -268,6 +292,7 @@ fb::@11: scope:[fb] from fb::@1
[119] call fc
to:fb::@2
fb::@2: scope:[fb] from fb::@1 fb::@11
[120] (byte) be#120 ← phi( fb::@1/(byte) be#119 fb::@11/(byte) be#46 )
[120] (byte) bd#108 ← phi( fb::@1/(byte) bd#107 fb::@11/(byte) bd#147 )
[121] if((byte) bc#113!=(byte) 2) goto fb::@3
to:fb::@12
@ -277,6 +302,7 @@ fb::@12: scope:[fb] from fb::@2
[124] call fc
to:fb::@3
fb::@3: scope:[fb] from fb::@12 fb::@2
[125] (byte) be#121 ← phi( fb::@2/(byte) be#120 fb::@12/(byte) be#46 )
[125] (byte) bd#109 ← phi( fb::@2/(byte) bd#108 fb::@12/(byte) bd#148 )
[126] if((byte) bc#113!=(byte) 3) goto fb::@4
to:fb::@13
@ -286,6 +312,7 @@ fb::@13: scope:[fb] from fb::@3
[129] call fc
to:fb::@4
fb::@4: scope:[fb] from fb::@13 fb::@3
[130] (byte) be#122 ← phi( fb::@13/(byte) be#46 fb::@3/(byte) be#121 )
[130] (byte) bd#110 ← phi( fb::@13/(byte) bd#149 fb::@3/(byte) bd#109 )
[131] if((byte) bc#113!=(byte) 4) goto fb::@5
to:fb::@14
@ -295,6 +322,7 @@ fb::@14: scope:[fb] from fb::@4
[134] call fc
to:fb::@5
fb::@5: scope:[fb] from fb::@14 fb::@4
[135] (byte) be#123 ← phi( fb::@14/(byte) be#46 fb::@4/(byte) be#122 )
[135] (byte) bd#111 ← phi( fb::@14/(byte) bd#150 fb::@4/(byte) bd#110 )
[136] if((byte) bc#113!=(byte) 5) goto fb::@6
to:fb::@15
@ -304,6 +332,7 @@ fb::@15: scope:[fb] from fb::@5
[139] call fc
to:fb::@6
fb::@6: scope:[fb] from fb::@15 fb::@5
[140] (byte) be#124 ← phi( fb::@15/(byte) be#46 fb::@5/(byte) be#123 )
[140] (byte) bd#112 ← phi( fb::@15/(byte) bd#151 fb::@5/(byte) bd#111 )
[141] if((byte) bc#113!=(byte) 6) goto fb::@7
to:fb::@16
@ -313,6 +342,7 @@ fb::@16: scope:[fb] from fb::@6
[144] call fc
to:fb::@7
fb::@7: scope:[fb] from fb::@16 fb::@6
[145] (byte) be#125 ← phi( fb::@16/(byte) be#46 fb::@6/(byte) be#124 )
[145] (byte) bd#113 ← phi( fb::@16/(byte) bd#152 fb::@6/(byte) bd#112 )
[146] if((byte) bc#113!=(byte) 7) goto fb::@8
to:fb::@17
@ -322,6 +352,7 @@ fb::@17: scope:[fb] from fb::@7
[149] call fc
to:fb::@8
fb::@8: scope:[fb] from fb::@17 fb::@7
[150] (byte) be#126 ← phi( fb::@17/(byte) be#46 fb::@7/(byte) be#125 )
[150] (byte) bd#114 ← phi( fb::@17/(byte) bd#153 fb::@7/(byte) bd#113 )
[151] if((byte) bc#113!=(byte) 8) goto fb::@9
to:fb::@18
@ -331,6 +362,7 @@ fb::@18: scope:[fb] from fb::@8
[154] call fc
to:fb::@9
fb::@9: scope:[fb] from fb::@18 fb::@8
[155] (byte) be#127 ← phi( fb::@18/(byte) be#46 fb::@8/(byte) be#126 )
[155] (byte) bd#116 ← phi( fb::@18/(byte) bd#154 fb::@8/(byte) bd#114 )
[156] if((byte) bc#113!=(byte) 9) goto fb::@return
to:fb::@19
@ -339,72 +371,84 @@ fb::@19: scope:[fb] from fb::@9
[158] call fc
to:fb::@return
fb::@return: scope:[fb] from fb::@19 fb::@9
[159] (byte) be#35 ← phi( fb::@19/(byte) be#46 fb::@9/(byte) be#127 )
[159] (byte) bd#35 ← phi( fb::@19/(byte) 0 fb::@9/(byte) bd#116 )
[160] return
to:@return
(void()) fc()
fc: scope:[fc] from fb::@10 fb::@11 fb::@12 fb::@13 fb::@14 fb::@15 fb::@16 fb::@17 fb::@18 fb::@19
[161] (byte) be#129 ← phi( fb::@10/(byte) be#118 fb::@11/(byte) be#119 fb::@12/(byte) be#120 fb::@13/(byte) be#121 fb::@14/(byte) be#122 fb::@15/(byte) be#123 fb::@16/(byte) be#124 fb::@17/(byte) be#125 fb::@18/(byte) be#126 fb::@19/(byte) be#127 )
[161] (byte) bd#117 ← phi( fb::@10/(byte) bd#235 fb::@11/(byte) bd#236 fb::@12/(byte) bd#237 fb::@13/(byte) bd#238 fb::@14/(byte) bd#239 fb::@15/(byte) bd#240 fb::@16/(byte) bd#241 fb::@17/(byte) bd#242 fb::@18/(byte) bd#243 fb::@19/(byte) 0 )
[162] if((byte) bd#117!=(byte) 0) goto fc::@1
to:fc::@10
fc::@10: scope:[fc] from fc
[163] phi()
[163] (byte) be#36 ← ++ (byte) be#129
to:fc::@1
fc::@1: scope:[fc] from fc fc::@10
[164] if((byte) bd#117!=(byte) 1) goto fc::@2
[164] (byte) be#130 ← phi( fc/(byte) be#129 fc::@10/(byte) be#36 )
[165] if((byte) bd#117!=(byte) 1) goto fc::@2
to:fc::@11
fc::@11: scope:[fc] from fc::@1
[165] phi()
[166] (byte) be#37 ← ++ (byte) be#130
to:fc::@2
fc::@2: scope:[fc] from fc::@1 fc::@11
[166] if((byte) bd#117!=(byte) 2) goto fc::@3
[167] (byte) be#131 ← phi( fc::@1/(byte) be#130 fc::@11/(byte) be#37 )
[168] if((byte) bd#117!=(byte) 2) goto fc::@3
to:fc::@12
fc::@12: scope:[fc] from fc::@2
[167] phi()
[169] (byte) be#38 ← ++ (byte) be#131
to:fc::@3
fc::@3: scope:[fc] from fc::@12 fc::@2
[168] if((byte) bd#117!=(byte) 3) goto fc::@4
[170] (byte) be#132 ← phi( fc::@12/(byte) be#38 fc::@2/(byte) be#131 )
[171] if((byte) bd#117!=(byte) 3) goto fc::@4
to:fc::@13
fc::@13: scope:[fc] from fc::@3
[169] phi()
[172] (byte) be#39 ← ++ (byte) be#132
to:fc::@4
fc::@4: scope:[fc] from fc::@13 fc::@3
[170] if((byte) bd#117!=(byte) 4) goto fc::@5
[173] (byte) be#133 ← phi( fc::@13/(byte) be#39 fc::@3/(byte) be#132 )
[174] if((byte) bd#117!=(byte) 4) goto fc::@5
to:fc::@14
fc::@14: scope:[fc] from fc::@4
[171] phi()
[175] (byte) be#40 ← ++ (byte) be#133
to:fc::@5
fc::@5: scope:[fc] from fc::@14 fc::@4
[172] if((byte) bd#117!=(byte) 5) goto fc::@6
[176] (byte) be#134 ← phi( fc::@14/(byte) be#40 fc::@4/(byte) be#133 )
[177] if((byte) bd#117!=(byte) 5) goto fc::@6
to:fc::@15
fc::@15: scope:[fc] from fc::@5
[173] phi()
[178] (byte) be#41 ← ++ (byte) be#134
to:fc::@6
fc::@6: scope:[fc] from fc::@15 fc::@5
[174] if((byte) bd#117!=(byte) 6) goto fc::@7
[179] (byte) be#135 ← phi( fc::@15/(byte) be#41 fc::@5/(byte) be#134 )
[180] if((byte) bd#117!=(byte) 6) goto fc::@7
to:fc::@16
fc::@16: scope:[fc] from fc::@6
[175] phi()
[181] (byte) be#42 ← ++ (byte) be#135
to:fc::@7
fc::@7: scope:[fc] from fc::@16 fc::@6
[176] if((byte) bd#117!=(byte) 7) goto fc::@8
[182] (byte) be#136 ← phi( fc::@16/(byte) be#42 fc::@6/(byte) be#135 )
[183] if((byte) bd#117!=(byte) 7) goto fc::@8
to:fc::@17
fc::@17: scope:[fc] from fc::@7
[177] phi()
[184] (byte) be#43 ← ++ (byte) be#136
to:fc::@8
fc::@8: scope:[fc] from fc::@17 fc::@7
[178] if((byte) bd#117!=(byte) 8) goto fc::@9
[185] (byte) be#137 ← phi( fc::@17/(byte) be#43 fc::@7/(byte) be#136 )
[186] if((byte) bd#117!=(byte) 8) goto fc::@9
to:fc::@18
fc::@18: scope:[fc] from fc::@8
[179] phi()
[187] (byte) be#44 ← ++ (byte) be#137
to:fc::@9
fc::@9: scope:[fc] from fc::@18 fc::@8
[180] if((byte) bd#117!=(byte) 9) goto fc::@return
to:fc::@19
[188] (byte) be#138 ← phi( fc::@18/(byte) be#44 fc::@8/(byte) be#137 )
[189] if((byte) bd#117!=(byte) 9) goto fc::@19
to:fc::@return
fc::@19: scope:[fc] from fc::@9
[181] phi()
[190] phi()
to:fc::@return
fc::@return: scope:[fc] from fc::@19 fc::@9
[182] return
[191] (byte) be#46 ← phi( fc::@9/(byte) 0 fc::@19/(byte) be#138 )
[192] return
to:@return

File diff suppressed because it is too large Load Diff

View File

@ -93,7 +93,7 @@
(byte) bd#113 reg byte y 4.0
(byte) bd#114 reg byte y 4.0
(byte) bd#116 reg byte y 3.0
(byte) bd#117 reg byte a 1.9999999999999991
(byte) bd#117 reg byte a 1.3571428571428568
(byte) bd#129 reg byte y 2.0
(byte) bd#13 reg byte y 3.75
(byte) bd#130 reg byte y 2.0
@ -130,6 +130,60 @@
(byte) bd#243 reg byte a 4.0
(byte) bd#35 reg byte y 1.8333333333333335
(byte) bd#93 reg byte y 2.6666666666666665
(byte) be
(byte) be#100 be zp[1]:6 2.0
(byte) be#101 be zp[1]:6 2.0
(byte) be#102 be zp[1]:6 2.0
(byte) be#103 be zp[1]:6 2.0
(byte) be#104 be zp[1]:6 2.0
(byte) be#105 be zp[1]:6 2.6666666666666665
(byte) be#107 be zp[1]:6 6.0
(byte) be#108 be zp[1]:6 2.0
(byte) be#109 be zp[1]:6 2.0
(byte) be#110 be zp[1]:6 2.0
(byte) be#111 be zp[1]:6 2.0
(byte) be#112 be zp[1]:6 2.0
(byte) be#113 be zp[1]:6 2.0
(byte) be#114 be zp[1]:6 2.0
(byte) be#115 be zp[1]:6 2.0
(byte) be#116 be zp[1]:6 2.6666666666666665
(byte) be#118 be zp[1]:6 6.0
(byte) be#119 be zp[1]:6 2.0
(byte) be#120 be zp[1]:6 2.0
(byte) be#121 be zp[1]:6 2.0
(byte) be#122 be zp[1]:6 2.0
(byte) be#123 be zp[1]:6 2.0
(byte) be#124 be zp[1]:6 2.0
(byte) be#125 be zp[1]:6 2.0
(byte) be#126 be zp[1]:6 2.0
(byte) be#127 be zp[1]:6 2.6666666666666665
(byte) be#129 be zp[1]:6 12.0
(byte) be#13 be zp[1]:6 3.75
(byte) be#130 be zp[1]:6 4.0
(byte) be#131 be zp[1]:6 4.0
(byte) be#132 be zp[1]:6 4.0
(byte) be#133 be zp[1]:6 4.0
(byte) be#134 be zp[1]:6 4.0
(byte) be#135 be zp[1]:6 4.0
(byte) be#136 be zp[1]:6 4.0
(byte) be#137 be zp[1]:6 4.0
(byte) be#138 be zp[1]:6 2.0
(byte) be#142 be zp[1]:6 2.0
(byte) be#143 be zp[1]:6 2.0
(byte) be#144 be zp[1]:6 2.0
(byte) be#2 be zp[1]:6 3.0
(byte) be#24 be zp[1]:6 2.0
(byte) be#35 be zp[1]:6 2.0
(byte) be#36 be zp[1]:6 4.0
(byte) be#37 be zp[1]:6 4.0
(byte) be#38 be zp[1]:6 4.0
(byte) be#39 be zp[1]:6 4.0
(byte) be#40 be zp[1]:6 4.0
(byte) be#41 be zp[1]:6 4.0
(byte) be#42 be zp[1]:6 4.0
(byte) be#43 be zp[1]:6 4.0
(byte) be#44 be zp[1]:6 4.0
(byte) be#46 be zp[1]:6 1.8333333333333335
(void()) f0()
(label) f0::@1
(label) f0::@10
@ -226,3 +280,4 @@ reg byte x [ bc#83 bc#112 bc#47 bc#111 bc#46 bc#110 bc#45 bc#109 bc#44 bc#108 bc
zp[1]:5 [ bc#113 bc#172 bc#173 bc#174 bc#175 bc#176 bc#177 bc#178 bc#179 bc#180 ]
reg byte y [ bd#116 bd#154 bd#114 bd#153 bd#113 bd#152 bd#112 bd#151 bd#111 bd#150 bd#110 bd#149 bd#109 bd#108 bd#107 bd#106 bd#104 bd#103 bd#102 bd#101 bd#100 bd#141 bd#140 bd#139 bd#138 bd#137 bd#93 bd#136 bd#135 bd#134 bd#133 bd#132 bd#131 bd#130 bd#129 bd#2 bd#13 bd#24 bd#35 bd#146 bd#147 bd#148 ]
reg byte a [ bd#117 bd#235 bd#236 bd#237 bd#238 bd#239 bd#240 bd#241 bd#242 bd#243 ]
zp[1]:6 [ be#138 be#44 be#137 be#43 be#136 be#42 be#135 be#41 be#134 be#40 be#133 be#39 be#132 be#38 be#131 be#130 be#129 be#127 be#126 be#125 be#124 be#123 be#122 be#121 be#120 be#119 be#118 be#116 be#115 be#114 be#113 be#112 be#111 be#110 be#109 be#108 be#107 be#105 be#104 be#103 be#102 be#101 be#100 be#144 be#143 be#142 be#2 be#13 be#24 be#35 be#46 be#36 be#37 ]

View File

@ -315,7 +315,7 @@ VARIABLE REGISTER WEIGHTS
(byte*) main::screen#1 101.0
(byte*) main::screen#2 65.0
(byte*) main::screen#4 11.0
(byte*) main::text loadstore 50.75
(byte*) main::text loadstore 40.6
(void()) nexttext((byte**) nexttext::textp)
(byte~) nexttext::$0 2.0
(byte**) nexttext::textp
@ -494,13 +494,13 @@ Removing always clobbered register reg byte a as potential for zp[1]:5 [ main::i
Removing always clobbered register reg byte y as potential for zp[1]:5 [ main::i#5 main::i#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:2 [ textid#11 textid#13 ]
Removing always clobbered register reg byte y as potential for zp[1]:2 [ textid#11 textid#13 ]
Statement [12] *((byte*) main::screen#2) ← *((byte*) main::text) [ main::i#5 textid#13 main::screen#2 ] ( main:2 [ main::i#5 textid#13 main::screen#2 ] ) always clobbers reg byte a reg byte y
Statement [12] *((byte*) main::screen#2) ← *((byte*) main::text) [ main::text main::i#5 textid#13 main::screen#2 ] ( main:2 [ main::text main::i#5 textid#13 main::screen#2 ] ) always clobbers reg byte a reg byte y
Statement [15] (byte~) nexttext::$0 ← (byte) textid#11 & (byte) 1 [ textid#11 nexttext::$0 ] ( main:2::nexttext:6 [ main::text main::screen#4 main::i#5 textid#11 nexttext::$0 ] ) always clobbers reg byte a
Statement [18] *((const byte**) nexttext::textp#0) ← (const byte*) text2 [ textid#13 ] ( main:2::nexttext:6 [ main::text main::screen#4 main::i#5 textid#13 ] ) always clobbers reg byte a
Statement [20] *((const byte**) nexttext::textp#0) ← (const byte*) text1 [ textid#13 ] ( main:2::nexttext:6 [ main::text main::screen#4 main::i#5 textid#13 ] ) always clobbers reg byte a
Statement [4] (byte*) main::text ← (byte*) 0 [ main::text ] ( main:2 [ main::text ] ) always clobbers reg byte a
Statement [8] if((byte) 0!=*((byte*) main::text)) goto main::@3 [ main::text main::i#5 textid#13 main::screen#2 ] ( main:2 [ main::text main::i#5 textid#13 main::screen#2 ] ) always clobbers reg byte a reg byte y
Statement [12] *((byte*) main::screen#2) ← *((byte*) main::text) [ main::i#5 textid#13 main::screen#2 ] ( main:2 [ main::i#5 textid#13 main::screen#2 ] ) always clobbers reg byte a reg byte y
Statement [12] *((byte*) main::screen#2) ← *((byte*) main::text) [ main::text main::i#5 textid#13 main::screen#2 ] ( main:2 [ main::text main::i#5 textid#13 main::screen#2 ] ) always clobbers reg byte a reg byte y
Statement [15] (byte~) nexttext::$0 ← (byte) textid#11 & (byte) 1 [ textid#11 nexttext::$0 ] ( main:2::nexttext:6 [ main::text main::screen#4 main::i#5 textid#11 nexttext::$0 ] ) always clobbers reg byte a
Statement [18] *((const byte**) nexttext::textp#0) ← (const byte*) text2 [ textid#13 ] ( main:2::nexttext:6 [ main::text main::screen#4 main::i#5 textid#13 ] ) always clobbers reg byte a
Statement [20] *((const byte**) nexttext::textp#0) ← (const byte*) text1 [ textid#13 ] ( main:2::nexttext:6 [ main::text main::screen#4 main::i#5 textid#13 ] ) always clobbers reg byte a
@ -511,7 +511,7 @@ Potential registers zp[2]:6 [ main::text ] : zp[2]:6 ,
Potential registers zp[1]:8 [ nexttext::$0 ] : zp[1]:8 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 177: zp[2]:3 [ main::screen#4 main::screen#2 main::screen#1 ] 50.75: zp[2]:6 [ main::text ] 19.64: zp[1]:5 [ main::i#5 main::i#1 ]
Uplift Scope [main] 177: zp[2]:3 [ main::screen#4 main::screen#2 main::screen#1 ] 40.6: zp[2]:6 [ main::text ] 19.64: zp[1]:5 [ main::i#5 main::i#1 ]
Uplift Scope [] 8.5: zp[1]:2 [ textid#11 textid#13 ]
Uplift Scope [nexttext] 2: zp[1]:8 [ nexttext::$0 ]
@ -720,7 +720,7 @@ FINAL SYMBOL TABLE
(byte*) main::screen#1 screen zp[2]:3 101.0
(byte*) main::screen#2 screen zp[2]:3 65.0
(byte*) main::screen#4 screen zp[2]:3 11.0
(byte*) main::text loadstore zp[2]:5 50.75
(byte*) main::text loadstore zp[2]:5 40.6
(void()) nexttext((byte**) nexttext::textp)
(byte~) nexttext::$0 reg byte a 2.0
(label) nexttext::@1

View File

@ -14,7 +14,7 @@
(byte*) main::screen#1 screen zp[2]:3 101.0
(byte*) main::screen#2 screen zp[2]:3 65.0
(byte*) main::screen#4 screen zp[2]:3 11.0
(byte*) main::text loadstore zp[2]:5 50.75
(byte*) main::text loadstore zp[2]:5 40.6
(void()) nexttext((byte**) nexttext::textp)
(byte~) nexttext::$0 reg byte a 2.0
(label) nexttext::@1

View File

@ -147,7 +147,7 @@ sub1::@return: scope:[sub1] from sub1
VARIABLE REGISTER WEIGHTS
(void()) main()
(byte~) main::$0 22.0
(byte) main::i loadstore 8.142857142857142
(byte) main::i loadstore 7.125
(byte()) sub1((byte) sub1::i)
(byte) sub1::i
(byte) sub1::i#0 15.0
@ -257,7 +257,7 @@ sub1: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [4] (byte) main::i ← (byte) 0 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Statement [9] *((const byte*) main::SCREEN + (byte) main::i) ← (byte~) main::$0 [ ] ( main:2 [ ] ) always clobbers reg byte y
Statement [9] *((const byte*) main::SCREEN + (byte) main::i) ← (byte~) main::$0 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte y
Statement [11] if((byte) main::i!=(byte) 3) goto main::@1 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Statement [13] (byte) sub1::return#1 ← (byte) sub1::i#0 + (byte) sub1::i#0 [ sub1::return#1 ] ( main:2::sub1:6 [ main::i sub1::return#1 ] ) always clobbers reg byte a
Potential registers zp[1]:4 [ main::i ] : zp[1]:4 ,
@ -268,7 +268,7 @@ Potential registers zp[1]:9 [ sub1::return#1 ] : zp[1]:9 , reg byte a , reg byte
REGISTER UPLIFT SCOPES
Uplift Scope [sub1] 22: zp[1]:7 [ sub1::return#0 ] 15: zp[1]:6 [ sub1::i#0 ] 4.33: zp[1]:9 [ sub1::return#1 ]
Uplift Scope [main] 22: zp[1]:8 [ main::$0 ] 8.14: zp[1]:4 [ main::i ]
Uplift Scope [main] 22: zp[1]:8 [ main::$0 ] 7.12: zp[1]:4 [ main::i ]
Uplift Scope []
Uplifting [sub1] best 452 combination reg byte a [ sub1::return#0 ] reg byte a [ sub1::i#0 ] reg byte a [ sub1::return#1 ]
@ -380,7 +380,7 @@ FINAL SYMBOL TABLE
(label) main::@2
(label) main::@return
(const byte*) main::SCREEN = (byte*) 1024
(byte) main::i loadstore zp[1]:4 8.142857142857142
(byte) main::i loadstore zp[1]:4 7.125
(byte()) sub1((byte) sub1::i)
(label) sub1::@return
(byte) sub1::i

View File

@ -7,7 +7,7 @@
(label) main::@2
(label) main::@return
(const byte*) main::SCREEN = (byte*) 1024
(byte) main::i loadstore zp[1]:4 8.142857142857142
(byte) main::i loadstore zp[1]:4 7.125
(byte()) sub1((byte) sub1::i)
(label) sub1::@return
(byte) sub1::i

View File

@ -147,7 +147,7 @@ sub1::@return: scope:[sub1] from sub1
VARIABLE REGISTER WEIGHTS
(void()) main()
(byte~) main::$0 22.0
(byte) main::i loadstore 8.142857142857142
(byte) main::i loadstore 7.125
(byte()) sub1((byte) sub1::i)
(byte) sub1::i
(byte) sub1::i#0 15.0
@ -257,7 +257,7 @@ sub1: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [4] (byte) main::i ← (byte) 0 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Statement [9] *((const byte*) main::SCREEN + (byte) main::i) ← (byte~) main::$0 [ ] ( main:2 [ ] ) always clobbers reg byte y
Statement [9] *((const byte*) main::SCREEN + (byte) main::i) ← (byte~) main::$0 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte y
Statement [11] if((byte) main::i!=(byte) 3) goto main::@1 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Statement [13] (byte) sub1::return#1 ← (byte) sub1::i#0 + (byte) sub1::i#0 [ sub1::return#1 ] ( main:2::sub1:6 [ main::i sub1::return#1 ] ) always clobbers reg byte a
Potential registers zp[1]:5 [ main::i ] : zp[1]:5 ,
@ -268,7 +268,7 @@ Potential registers zp[1]:9 [ sub1::return#1 ] : zp[1]:9 , reg byte a , reg byte
REGISTER UPLIFT SCOPES
Uplift Scope [sub1] 22: zp[1]:7 [ sub1::return#0 ] 15: zp[1]:6 [ sub1::i#0 ] 4.33: zp[1]:9 [ sub1::return#1 ]
Uplift Scope [main] 22: zp[1]:8 [ main::$0 ] 8.14: zp[1]:5 [ main::i ]
Uplift Scope [main] 22: zp[1]:8 [ main::$0 ] 7.12: zp[1]:5 [ main::i ]
Uplift Scope []
Uplifting [sub1] best 452 combination reg byte a [ sub1::return#0 ] reg byte a [ sub1::i#0 ] reg byte a [ sub1::return#1 ]
@ -380,7 +380,7 @@ FINAL SYMBOL TABLE
(label) main::@2
(label) main::@return
(const byte*) main::SCREEN = (byte*) 1024
(byte) main::i loadstore zp[1]:5 8.142857142857142
(byte) main::i loadstore zp[1]:5 7.125
(byte()) sub1((byte) sub1::i)
(label) sub1::@return
(byte) sub1::i

View File

@ -7,7 +7,7 @@
(label) main::@2
(label) main::@return
(const byte*) main::SCREEN = (byte*) 1024
(byte) main::i loadstore zp[1]:5 8.142857142857142
(byte) main::i loadstore zp[1]:5 7.125
(byte()) sub1((byte) sub1::i)
(label) sub1::@return
(byte) sub1::i

View File

@ -211,7 +211,7 @@ VARIABLE REGISTER WEIGHTS
(void()) main()
(byte~) main::$0 22.0
(byte~) main::$1 22.0
(byte) main::i loadstore 6.583333333333334
(byte) main::i loadstore 6.076923076923077
(byte()) sub1((byte) sub1::i)
(byte) sub1::i
(byte) sub1::i#0 15.0
@ -385,7 +385,7 @@ sub1: {
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [4] (byte) main::i ← (byte) 0 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Statement [9] *((const byte*) main::SCREEN + (byte) main::i) ← (byte~) main::$0 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte y
Statement [14] *((const byte*) main::SCREEN+(byte) $28 + (byte) main::i) ← (byte~) main::$1 [ ] ( main:2 [ ] ) always clobbers reg byte y
Statement [14] *((const byte*) main::SCREEN+(byte) $28 + (byte) main::i) ← (byte~) main::$1 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte y
Statement [16] if((byte) main::i!=(byte) 3) goto main::@1 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Statement [18] (byte~) sub2::$0 ← (byte) sub2::i#0 + (byte) sub2::i#0 [ sub2::i#0 sub2::$0 ] ( main:2::sub2:11 [ main::i sub2::i#0 sub2::$0 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:12 [ sub2::i#0 ]
@ -393,7 +393,7 @@ Statement [19] (byte) sub2::return#1 ← (byte~) sub2::$0 + (byte) sub2::i#0 [ s
Statement [21] (byte) sub1::return#1 ← (byte) sub1::i#0 + (byte) sub1::i#0 [ sub1::return#1 ] ( main:2::sub1:6 [ main::i sub1::return#1 ] ) always clobbers reg byte a
Statement [4] (byte) main::i ← (byte) 0 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Statement [9] *((const byte*) main::SCREEN + (byte) main::i) ← (byte~) main::$0 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte y
Statement [14] *((const byte*) main::SCREEN+(byte) $28 + (byte) main::i) ← (byte~) main::$1 [ ] ( main:2 [ ] ) always clobbers reg byte y
Statement [14] *((const byte*) main::SCREEN+(byte) $28 + (byte) main::i) ← (byte~) main::$1 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte y
Statement [16] if((byte) main::i!=(byte) 3) goto main::@1 [ main::i ] ( main:2 [ main::i ] ) always clobbers reg byte a
Statement [18] (byte~) sub2::$0 ← (byte) sub2::i#0 + (byte) sub2::i#0 [ sub2::i#0 sub2::$0 ] ( main:2::sub2:11 [ main::i sub2::i#0 sub2::$0 ] ) always clobbers reg byte a
Statement [19] (byte) sub2::return#1 ← (byte~) sub2::$0 + (byte) sub2::i#0 [ sub2::return#1 ] ( main:2::sub2:11 [ main::i sub2::return#1 ] ) always clobbers reg byte a
@ -410,7 +410,7 @@ Potential registers zp[1]:16 [ sub2::return#1 ] : zp[1]:16 , reg byte a , reg by
Potential registers zp[1]:17 [ sub1::return#1 ] : zp[1]:17 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 22: zp[1]:11 [ main::$0 ] 22: zp[1]:14 [ main::$1 ] 6.58: zp[1]:8 [ main::i ]
Uplift Scope [main] 22: zp[1]:11 [ main::$0 ] 22: zp[1]:14 [ main::$1 ] 6.08: zp[1]:8 [ main::i ]
Uplift Scope [sub1] 22: zp[1]:10 [ sub1::return#0 ] 15: zp[1]:9 [ sub1::i#0 ] 4.33: zp[1]:17 [ sub1::return#1 ]
Uplift Scope [sub2] 22: zp[1]:13 [ sub2::return#0 ] 8.5: zp[1]:12 [ sub2::i#0 ] 4.33: zp[1]:16 [ sub2::return#1 ] 4: zp[1]:15 [ sub2::$0 ]
Uplift Scope []
@ -560,7 +560,7 @@ FINAL SYMBOL TABLE
(label) main::@3
(label) main::@return
(const byte*) main::SCREEN = (byte*) 1024
(byte) main::i loadstore zp[1]:8 6.583333333333334
(byte) main::i loadstore zp[1]:8 6.076923076923077
(byte()) sub1((byte) sub1::i)
(label) sub1::@return
(byte) sub1::i

View File

@ -9,7 +9,7 @@
(label) main::@3
(label) main::@return
(const byte*) main::SCREEN = (byte*) 1024
(byte) main::i loadstore zp[1]:8 6.583333333333334
(byte) main::i loadstore zp[1]:8 6.076923076923077
(byte()) sub1((byte) sub1::i)
(label) sub1::@return
(byte) sub1::i

Some files were not shown because too many files have changed in this diff Show More