1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-08-02 09:29:35 +00:00

Refactored ReferenceInfos to use a more abstract model of references to variables/constants.

This commit is contained in:
Jesper Gravgaard 2018-07-23 01:00:25 +09:00
parent 4b4c6f5364
commit 99085f1351
39 changed files with 2766 additions and 4440 deletions

View File

@ -35,7 +35,7 @@ public class CompileLog {
/**
* Should the log be output to System.out while being built
*/
private boolean sysOut = true;
private boolean sysOut = false;
public CompileLog() {
this.log = new StringBuilder();

View File

@ -1,9 +1,6 @@
package dk.camelot64.kickc.model;
import dk.camelot64.kickc.model.values.ConstantRef;
import dk.camelot64.kickc.model.values.LabelRef;
import dk.camelot64.kickc.model.values.RValue;
import dk.camelot64.kickc.model.values.VariableRef;
import dk.camelot64.kickc.model.values.*;
import dk.camelot64.kickc.model.statements.Statement;
import dk.camelot64.kickc.passes.PassNVariableReferenceInfos;
@ -11,12 +8,14 @@ import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Map;
/** Cached information about which variables/constants are defined/referenced/used in which statements / blocks / symbols .
/**
* Cached information about which variables/constants are defined/referenced/used in which statements / blocks / symbols .
* <ul>
* <li><i>Defined</i> means the variable/constant receives its value in a specific statement (or symbol for named constants) </li>
* <li><i>Used</i> means the value of the variable/constant is used in a specific statement (or symbol for named constants) </li>
* <li><i>Referenced</i> means the variable/constant is either defined or referenced in a specific statement (or symbol for named constants) </li>
* </ul>*/
* </ul>
*/
public class VariableReferenceInfos {
/** Variables referenced in each block. */
@ -31,37 +30,113 @@ public class VariableReferenceInfos {
/** Variables defined in each statement. */
private Map<Integer, Collection<VariableRef>> stmtDefinedVars;
/** The statement defining each variable. */
private Map<VariableRef, Integer> varDefineStmt;
/** All references to symbol variables (constants/variables). References can be either statements or symbols in the symbol table */
private Map<SymbolVariableRef, Collection<ReferenceToSymbolVar>> symbolVarReferences;
/** All statements referencing each variable . */
private Map<VariableRef, Collection<Integer>> varRefStmts;
/**
* A reference of a symbol variable (variable or const).
* The reference is either a specific statement or a symbol in the symbol table.
* The reference can either be defining the symbol variable or it can be using it.
*/
public interface ReferenceToSymbolVar {
/** All statements referencing each constant. */
private Map<ConstantRef, Collection<Integer>> constRefStmts;
enum ReferenceType {USE, DEFINE}
/** All constants referencing another constant. (maps from a constant to all constants using it in their value) */
private Map<ConstantRef, Collection<ConstantRef>> constRefConsts;
/**
* Get the type of the reference
*
* @return The type of the reference (define or use)
*/
ReferenceType getReferenceType();
/**
* Get the symbol being referenced
*
* @return The symbol being referenced
*/
SymbolVariableRef getReferenced();
}
/** A reference to a variable/constant inside a statement. */
public static class ReferenceInStatement implements ReferenceToSymbolVar {
/** The index of the statement. */
private Integer statementIdx;
/** The type of reference. */
private ReferenceType referenceType;
/** The symbol being referenced. */
private SymbolVariableRef referencedSymbol;
public ReferenceInStatement(Integer statementIdx, ReferenceType referenceType, SymbolVariableRef referencedSymbol) {
this.statementIdx = statementIdx;
this.referenceType = referenceType;
this.referencedSymbol = referencedSymbol;
}
public Integer getStatementIdx() {
return statementIdx;
}
@Override
public ReferenceType getReferenceType() {
return referenceType;
}
@Override
public SymbolVariableRef getReferenced() {
return referencedSymbol;
}
}
/** A reference to a variable/constant inside a symbol i he symbol table. */
public static class ReferenceInSymbol implements ReferenceToSymbolVar {
/** The symbol in the symbol table that contains the reference. */
private SymbolVariableRef referencingSymbol;
/** The type of reference. */
private ReferenceType referenceType;
/** The symbol being referenced. */
private SymbolVariableRef referencedSymbol;
public ReferenceInSymbol(SymbolVariableRef referencingSymbol, ReferenceType referenceType, SymbolVariableRef referencedSymbol) {
this.referencingSymbol = referencingSymbol;
this.referenceType = referenceType;
this.referencedSymbol = referencedSymbol;
}
public SymbolVariableRef getReferencingSymbol() {
return referencingSymbol;
}
@Override
public ReferenceType getReferenceType() {
return referenceType;
}
@Override
public SymbolVariableRef getReferenced() {
return referencedSymbol;
}
}
public VariableReferenceInfos(
Map<LabelRef, Collection<VariableRef>> blockReferencedVars,
Map<LabelRef, Collection<VariableRef>> blockUsedVars,
Map<Integer, Collection<VariableRef>> stmtReferencedVars,
Map<Integer, Collection<VariableRef>> stmtDefinedVars,
Map<VariableRef, Integer> varDefineStmt,
Map<VariableRef, Collection<Integer>> varRefStmts,
Map<ConstantRef, Collection<Integer>> constRefStmts,
Map<ConstantRef, Collection<ConstantRef>> constRefConsts
Map<SymbolVariableRef, Collection<ReferenceToSymbolVar>> symbolVarReferences
) {
this.blockReferencedVars = blockReferencedVars;
this.blockUsedVars = blockUsedVars;
this.stmtDefinedVars = stmtDefinedVars;
this.stmtReferencedVars = stmtReferencedVars;
this.varDefineStmt = varDefineStmt;
this.varRefStmts = varRefStmts;
this.constRefStmts = constRefStmts;
this.constRefConsts = constRefConsts;
this.symbolVarReferences = symbolVarReferences;
}
/**
@ -132,41 +207,43 @@ public class VariableReferenceInfos {
*
* @return true if the variable is defined but never referenced
*/
public boolean isUnused(VariableRef variableRef) {
Collection<Integer> refs = new LinkedHashSet<>(varRefStmts.get(variableRef));
refs.remove(varDefineStmt.get(variableRef));
return refs.size() == 0;
}
/**
* Determines if a constant is unused
*
* @return true if the constant is never referenced
*/
public boolean isUnused(ConstantRef constRef) {
Collection<Integer> constStmts = this.constRefStmts.get(constRef);
Collection<ConstantRef> constRefs = constRefConsts.get(constRef);
boolean unusedInStmts = constStmts == null || constStmts.size() == 0;
boolean unusedInConsts = constRefs == null || constRefs.size() == 0;
return unusedInStmts && unusedInConsts;
public boolean isUnused(SymbolVariableRef variableRef) {
Collection<ReferenceToSymbolVar> refs = symbolVarReferences.get(variableRef);
if(refs==null) return true;
return !refs.stream()
.anyMatch(referenceToSymbolVar -> ReferenceToSymbolVar.ReferenceType.USE.equals(referenceToSymbolVar.getReferenceType())
);
}
/**
* Get all statements referencing constant
*
* @param constRef The constant to look for
* @return Index of all statements referencing the constant
*/
public Collection<Integer> getConstRefStatements(ConstantRef constRef) {
return constRefStmts.get(constRef);
Collection<ReferenceToSymbolVar> refs = symbolVarReferences.get(constRef);
LinkedHashSet<Integer> stmts = new LinkedHashSet<>();
refs.stream()
.filter(referenceToSymbolVar -> referenceToSymbolVar instanceof ReferenceInStatement)
.forEach(referenceToSymbolVar -> stmts.add(((ReferenceInStatement) referenceToSymbolVar).getStatementIdx()));
return stmts;
}
/**
* Get all constatns referencing another constant
*
* @param constRef The constant to look for
* @return All constants that reference the constant in their value
*/
public Collection<ConstantRef> getConstRefConsts(ConstantRef constRef) {
return constRefConsts.get(constRef);
Collection<ReferenceToSymbolVar> refs = symbolVarReferences.get(constRef);
LinkedHashSet<ConstantRef> constRefs = new LinkedHashSet<>();
refs.stream()
.filter(referenceToSymbolVar -> ReferenceToSymbolVar.ReferenceType.USE.equals(referenceToSymbolVar.getReferenceType()))
.filter(referenceToSymbolVar -> referenceToSymbolVar instanceof ReferenceInSymbol)
.forEach(referenceToSymbolVar -> constRefs.add((ConstantRef) ((ReferenceInSymbol) referenceToSymbolVar).getReferencingSymbol()));
return constRefs;
}
}

View File

@ -51,6 +51,9 @@ public class SymbolRef implements Value {
} else {
try {
Symbol symbol = program.getScope().getSymbol(fullName);
if(symbol==null) {
return fullName+"(null)";
}
return symbol.toString(program);
} catch(NullPointerException e) {
throw e;

View File

@ -39,7 +39,9 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
getLog().append("Eliminating unused variable " + lValue.toString(getProgram()) + " and assignment " + assignment.toString(getProgram(), false));
stmtIt.remove();
Variable variable = getScope().getVariable((VariableRef) lValue);
if(variable!=null) {
variable.getScope().remove(variable);
}
modified = true;
}
} else if(statement instanceof StatementCall) {
@ -48,7 +50,9 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
if(lValue instanceof VariableRef && referenceInfos.isUnused((VariableRef) lValue) && !Pass2ConstantIdentification.isAddressOfUsed((VariableRef) lValue, getProgram())) {
getLog().append("Eliminating unused variable - keeping the call " + lValue.toString(getProgram()));
Variable variable = getScope().getVariable((VariableRef) lValue);
if(variable!=null) {
variable.getScope().remove(variable);
}
call.setlValue(null);
modified = true;
}
@ -61,7 +65,9 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization {
if(referenceInfos.isUnused(variableRef) && !Pass2ConstantIdentification.isAddressOfUsed(variableRef, getProgram())) {
getLog().append("Eliminating unused variable - keeping the phi block " + variableRef.toString(getProgram()));
Variable variable = getScope().getVariable(variableRef);
if(variable!=null) {
variable.getScope().remove(variable);
}
phiVarIt.remove();
modified = true;
}

View File

@ -74,9 +74,7 @@ public class PassNVariableReferenceInfos extends Pass2Base {
LinkedHashMap<LabelRef, Collection<VariableRef>> blockUsedVars = new LinkedHashMap<>();
LinkedHashMap<Integer, Collection<VariableRef>> stmtReferenced = new LinkedHashMap<>();
LinkedHashMap<Integer, Collection<VariableRef>> stmtDefined = new LinkedHashMap<>();
LinkedHashMap<VariableRef, Integer> varDefineStmts = new LinkedHashMap<>();
LinkedHashMap<VariableRef, Collection<Integer>> varRefStmts = new LinkedHashMap<>();
LinkedHashMap<ConstantRef, Collection<Integer>> constStmts = new LinkedHashMap<>();
Map<SymbolVariableRef, Collection<VariableReferenceInfos.ReferenceToSymbolVar>> symbolVarReferences = new LinkedHashMap<>();
for(ControlFlowBlock block : getProgram().getGraph().getAllBlocks()) {
LabelRef blockLabel = block.getLabel();
blockReferencedVars.put(blockLabel, getReferencedVars(blockLabel, new ArrayList<>()));
@ -90,43 +88,37 @@ public class PassNVariableReferenceInfos extends Pass2Base {
stmtReferenced.put(statement.getIndex(), referencedVars);
// Identify statement defining variables
for(VariableRef variableRef : defined) {
varDefineStmts.put(variableRef, statement.getIndex());
symbolVarReferences.putIfAbsent(variableRef, new ArrayList<>());
Collection<VariableReferenceInfos.ReferenceToSymbolVar> references = symbolVarReferences.get(variableRef);
references.add(new VariableReferenceInfos.ReferenceInStatement(statement.getIndex(), VariableReferenceInfos.ReferenceToSymbolVar.ReferenceType.DEFINE, variableRef));
}
// Gather statements referencing variables
for(VariableRef variableRef : referencedVars) {
Collection<Integer> stmts = varRefStmts.get(variableRef);
if(stmts == null) {
stmts = new LinkedHashSet<>();
varRefStmts.put(variableRef, stmts);
if(!defined.contains(variableRef)) {
symbolVarReferences.putIfAbsent(variableRef, new ArrayList<>());
Collection<VariableReferenceInfos.ReferenceToSymbolVar> references = symbolVarReferences.get(variableRef);
references.add(new VariableReferenceInfos.ReferenceInStatement(statement.getIndex(), VariableReferenceInfos.ReferenceToSymbolVar.ReferenceType.USE, variableRef));
}
stmts.add(statement.getIndex());
}
// Gather statements referencing constants
Collection<ConstantRef> referencedConsts = getReferencedConsts(statement);
for(ConstantRef constantRef : referencedConsts) {
Collection<Integer> stmts = constStmts.get(constantRef);
if(stmts == null) {
stmts = new LinkedHashSet<>();
constStmts.put(constantRef, stmts);
}
stmts.add(statement.getIndex());
symbolVarReferences.putIfAbsent(constantRef, new ArrayList<>());
Collection<VariableReferenceInfos.ReferenceToSymbolVar> references = symbolVarReferences.get(constantRef);
references.add(new VariableReferenceInfos.ReferenceInStatement(statement.getIndex(), VariableReferenceInfos.ReferenceToSymbolVar.ReferenceType.USE, constantRef));
}
}
}
// Gather constants referencing other constants
LinkedHashMap<ConstantRef, Collection<ConstantRef>> constRefConsts = new LinkedHashMap<>();
for(ConstantVar constantVar : getSymbols().getAllConstants(true)) {
Collection<ConstantRef> referencedConsts = getReferencedConsts(constantVar.getValue());
for(ConstantRef constantRef : referencedConsts) {
Collection<ConstantRef> consts = constRefConsts.get(constantRef);
if(consts == null) {
consts = new LinkedHashSet<>();
constRefConsts.put(constantRef, consts);
}
consts.add(constantVar.getRef());
symbolVarReferences.putIfAbsent(constantRef, new ArrayList<>());
Collection<VariableReferenceInfos.ReferenceToSymbolVar> references = symbolVarReferences.get(constantRef);
references.add(new VariableReferenceInfos.ReferenceInSymbol(constantVar.getRef(), VariableReferenceInfos.ReferenceToSymbolVar.ReferenceType.USE, constantRef));
}
}
getProgram().setVariableReferenceInfos(new VariableReferenceInfos(blockReferencedVars, blockUsedVars, stmtReferenced, stmtDefined, varDefineStmts, varRefStmts, constStmts, constRefConsts));
getProgram().setVariableReferenceInfos(new VariableReferenceInfos(blockReferencedVars, blockUsedVars, stmtReferenced, stmtDefined, symbolVarReferences));
}
/**

View File

@ -4,7 +4,6 @@
.label B = $1000
jsr main
main: {
lda #0
b2:
jsr menu
jmp b2

View File

@ -9,33 +9,27 @@
[3] phi() [ ] ( )
main: scope:[main] from @3
[4] phi() [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main main::@2
[5] (byte) a#1 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@2/(byte) a#12 ) [ a#1 ] ( main:2 [ a#1 ] )
to:main::@2
main::@2: scope:[main] from main::@1
[6] phi() [ a#1 ] ( main:2 [ a#1 ] )
[7] call menu [ a#12 ] ( main:2 [ a#12 ] )
to:main::@1
main::@2: scope:[main] from main main::@2
[5] phi() [ ] ( main:2 [ ] )
[6] call menu [ ] ( main:2 [ ] )
to:main::@2
menu: scope:[menu] from main::@2
[8] phi() [ a#1 ] ( main:2::menu:7 [ a#1 ] )
[7] phi() [ ] ( main:2::menu:6 [ ] )
to:menu::@2
menu::@2: scope:[menu] from menu
[9] phi() [ a#1 ] ( main:2::menu:7 [ a#1 ] )
[10] call mode [ a#12 ] ( main:2::menu:7 [ a#12 ] )
[8] phi() [ ] ( main:2::menu:6 [ ] )
[9] call mode [ ] ( main:2::menu:6 [ ] )
to:menu::@return
menu::@return: scope:[menu] from menu::@2
[11] return [ a#12 ] ( main:2::menu:7 [ a#12 ] )
[10] return [ ] ( main:2::menu:6 [ ] )
to:@return
mode: scope:[mode] from menu::@2
[12] phi() [ a#1 ] ( main:2::menu:7::mode:10 [ a#1 ] )
to:mode::@1
mode::@1: scope:[mode] from mode mode::@2 mode::@7
[13] (byte) a#12 ← phi( mode/(byte) a#1 mode::@7/(byte) a#5 ) [ ] ( main:2::menu:7::mode:10 [ ] )
[11] phi() [ ] ( main:2::menu:6::mode:9 [ ] )
to:mode::@2
mode::@2: scope:[mode] from mode mode::@2 mode::@4
[12] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4 [ ] ( main:2::menu:6::mode:9 [ ] )
to:mode::@2
mode::@4: scope:[mode] from mode::@2
[13] phi() [ ] ( main:2::menu:6::mode:9 [ ] )
to:mode::@2
mode::@2: scope:[mode] from mode::@1
[14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] )
to:mode::@7
mode::@7: scope:[mode] from mode::@2
[15] (byte) a#5 ← *((const byte*) B#0) [ a#5 ] ( main:2::menu:7::mode:10 [ a#5 ] )
to:mode::@1

View File

@ -150,6 +150,8 @@ mode::@return: scope:[mode] from mode::@3
Eliminating unused variable - keeping the call (void~) main::$0
Eliminating unused variable - keeping the call (void~) menu::$0
Eliminating unused variable (byte) a and assignment [6] (byte) a ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable a(null) and assignment [12] a(null) ← *((byte*) B)
Removing empty block main::@4
Removing empty block main::@3
Removing empty block main::@5
@ -163,11 +165,9 @@ Removing empty block menu::@7
Removing empty block mode::@5
Removing empty block mode::@3
Removing empty block mode::@6
Removing empty block mode::@7
Removing empty block mode::@8
PROCEDURE MODIFY VARIABLE ANALYSIS
main modifies a
menu modifies a
mode modifies a
Completing Phi functions...
Completing Phi functions...
@ -184,93 +184,65 @@ CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN
@begin: scope:[] from
to:@2
main: scope:[main] from @3
(byte*) B#11 ← phi( @3/(byte*) B#13 )
(byte) a#20 ← phi( @3/(byte) a#19 )
(byte*) B#10 ← phi( @3/(byte*) B#12 )
to:main::@1
main::@1: scope:[main] from main main::@7
(byte*) B#10 ← phi( main/(byte*) B#11 main::@7/(byte*) B#12 )
(byte) a#15 ← phi( main/(byte) a#20 main::@7/(byte) a#0 )
(byte*) B#9 ← phi( main/(byte*) B#10 main::@7/(byte*) B#11 )
if(true) goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte*) B#9 ← phi( main::@1/(byte*) B#10 )
(byte) a#14 ← phi( main::@1/(byte) a#15 )
(byte*) B#8 ← phi( main::@1/(byte*) B#9 )
call menu
to:main::@7
main::@7: scope:[main] from main::@2
(byte*) B#12 ← phi( main::@2/(byte*) B#9 )
(byte) a#8 ← phi( main::@2/(byte) a#3 )
(byte) a#0 ← (byte) a#8
(byte*) B#11 ← phi( main::@2/(byte*) B#8 )
to:main::@1
main::@return: scope:[main] from main::@1
(byte) a#9 ← phi( main::@1/(byte) a#15 )
(byte) a#1 ← (byte) a#9
return
to:@return
menu: scope:[menu] from main::@2
(byte*) B#8 ← phi( main::@2/(byte*) B#9 )
(byte) a#21 ← phi( main::@2/(byte) a#14 )
(byte*) B#7 ← phi( main::@2/(byte*) B#8 )
to:menu::@1
menu::@1: scope:[menu] from menu
(byte*) B#7 ← phi( menu/(byte*) B#8 )
(byte) a#17 ← phi( menu/(byte) a#21 )
(byte*) B#6 ← phi( menu/(byte*) B#7 )
if(true) goto menu::@2
to:menu::@return
menu::@2: scope:[menu] from menu::@1
(byte*) B#6 ← phi( menu::@1/(byte*) B#7 )
(byte) a#16 ← phi( menu::@1/(byte) a#17 )
(byte*) B#5 ← phi( menu::@1/(byte*) B#6 )
call mode
to:menu::@8
menu::@8: scope:[menu] from menu::@2
(byte) a#10 ← phi( menu::@2/(byte) a#6 )
(byte) a#2 ← (byte) a#10
to:menu::@return
menu::@return: scope:[menu] from menu::@1 menu::@8
(byte) a#11 ← phi( menu::@1/(byte) a#17 menu::@8/(byte) a#2 )
(byte) a#3 ← (byte) a#11
return
to:@return
@2: scope:[] from @begin
(byte) a#4 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte*) B#0 ← ((byte*)) (word/signed word/dword/signed dword) 4096
to:@3
mode: scope:[mode] from menu::@2
(byte) a#22 ← phi( menu::@2/(byte) a#16 )
(byte*) B#4 ← phi( menu::@2/(byte*) B#6 )
(byte*) B#3 ← phi( menu::@2/(byte*) B#5 )
to:mode::@1
mode::@1: scope:[mode] from mode mode::@4 mode::@7
(byte) a#18 ← phi( mode/(byte) a#22 mode::@4/(byte) a#23 mode::@7/(byte) a#5 )
(byte*) B#3 ← phi( mode/(byte*) B#4 mode::@4/(byte*) B#5 mode::@7/(byte*) B#2 )
mode::@1: scope:[mode] from mode mode::@2 mode::@4
(byte*) B#2 ← phi( mode/(byte*) B#3 mode::@2/(byte*) B#1 mode::@4/(byte*) B#4 )
if(true) goto mode::@2
to:mode::@return
mode::@2: scope:[mode] from mode::@1
(byte) a#24 ← phi( mode::@1/(byte) a#18 )
(byte*) B#1 ← phi( mode::@1/(byte*) B#3 )
(byte*) B#1 ← phi( mode::@1/(byte*) B#2 )
(bool~) mode::$0 ← *((byte*) B#1) == (byte/signed byte/word/signed word/dword/signed dword) 0
(bool~) mode::$1 ← ! (bool~) mode::$0
if((bool~) mode::$1) goto mode::@4
to:mode::@7
mode::@4: scope:[mode] from mode::@2
(byte) a#23 ← phi( mode::@2/(byte) a#24 )
(byte*) B#5 ← phi( mode::@2/(byte*) B#1 )
to:mode::@1
mode::@7: scope:[mode] from mode::@2
(byte*) B#2 ← phi( mode::@2/(byte*) B#1 )
(byte) a#5 ← *((byte*) B#2)
mode::@4: scope:[mode] from mode::@2
(byte*) B#4 ← phi( mode::@2/(byte*) B#1 )
to:mode::@1
mode::@return: scope:[mode] from mode::@1
(byte) a#12 ← phi( mode::@1/(byte) a#18 )
(byte) a#6 ← (byte) a#12
return
to:@return
@3: scope:[] from @2
(byte*) B#13 ← phi( @2/(byte*) B#0 )
(byte) a#19 ← phi( @2/(byte) a#4 )
(byte*) B#12 ← phi( @2/(byte*) B#0 )
call main
to:@4
@4: scope:[] from @3
(byte) a#13 ← phi( @3/(byte) a#1 )
(byte) a#7 ← (byte) a#13
to:@end
@end: scope:[] from @4
@ -286,7 +258,6 @@ SYMBOL TABLE SSA
(byte*) B#10
(byte*) B#11
(byte*) B#12
(byte*) B#13
(byte*) B#2
(byte*) B#3
(byte*) B#4
@ -295,32 +266,6 @@ SYMBOL TABLE SSA
(byte*) B#7
(byte*) B#8
(byte*) B#9
(byte) a
(byte) a#0
(byte) a#1
(byte) a#10
(byte) a#11
(byte) a#12
(byte) a#13
(byte) a#14
(byte) a#15
(byte) a#16
(byte) a#17
(byte) a#18
(byte) a#19
(byte) a#2
(byte) a#20
(byte) a#21
(byte) a#22
(byte) a#23
(byte) a#24
(byte) a#3
(byte) a#4
(byte) a#5
(byte) a#6
(byte) a#7
(byte) a#8
(byte) a#9
(void()) main()
(label) main::@1
(label) main::@2
@ -337,116 +282,58 @@ SYMBOL TABLE SSA
(label) mode::@1
(label) mode::@2
(label) mode::@4
(label) mode::@7
(label) mode::@return
OPTIMIZING CONTROL FLOW GRAPH
Culled Empty Block (label) menu::@8
Culled Empty Block (label) @4
Succesful SSA optimization Pass2CullEmptyBlocks
Inversing boolean not (bool~) mode::$1 ← *((byte*) B#1) != (byte/signed byte/word/signed word/dword/signed dword) 0 from (bool~) mode::$0 ← *((byte*) B#1) == (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2UnaryNotSimplification
Not aliassing across scopes: a#20 a#19
Not aliassing across scopes: B#11 B#13
Not aliassing across scopes: a#8 a#3
Not aliassing across scopes: a#21 a#14
Not aliassing across scopes: B#8 B#9
Not aliassing across scopes: a#10 a#6
Not aliassing across scopes: B#4 B#6
Not aliassing across scopes: a#22 a#16
Not aliassing across scopes: a#13 a#1
Alias (byte) a#1 = (byte) a#14 (byte) a#15 (byte) a#9
Alias (byte*) B#10 = (byte*) B#9 (byte*) B#12
Alias (byte) a#0 = (byte) a#8
Alias (byte) a#16 = (byte) a#17 (byte) a#21
Alias (byte*) B#6 = (byte*) B#7 (byte*) B#8
Alias (byte) a#10 = (byte) a#2
Alias (byte) a#11 = (byte) a#3
Alias (byte*) B#1 = (byte*) B#3 (byte*) B#5 (byte*) B#2
Alias (byte) a#12 = (byte) a#24 (byte) a#18 (byte) a#23 (byte) a#6
Alias (byte) a#19 = (byte) a#4
Alias (byte*) B#0 = (byte*) B#13
Alias (byte) a#13 = (byte) a#7
Not aliassing across scopes: B#10 B#12
Not aliassing across scopes: B#7 B#8
Not aliassing across scopes: B#3 B#5
Alias (byte*) B#11 = (byte*) B#8 (byte*) B#9
Alias (byte*) B#5 = (byte*) B#6 (byte*) B#7
Alias (byte*) B#1 = (byte*) B#2 (byte*) B#4
Alias (byte*) B#0 = (byte*) B#12
Succesful SSA optimization Pass2AliasElimination
Not aliassing across scopes: a#20 a#19
Not aliassing across scopes: B#11 B#0
Not aliassing across scopes: a#0 a#11
Not aliassing across scopes: a#16 a#1
Not aliassing across scopes: B#6 B#10
Not aliassing across scopes: a#10 a#12
Not aliassing across scopes: B#4 B#6
Not aliassing across scopes: a#22 a#16
Not aliassing across scopes: a#13 a#1
Self Phi Eliminated (byte*) B#10
Not aliassing across scopes: B#10 B#0
Not aliassing across scopes: B#5 B#11
Not aliassing across scopes: B#3 B#5
Self Phi Eliminated (byte*) B#11
Self Phi Eliminated (byte*) B#1
Self Phi Eliminated (byte*) B#1
Self Phi Eliminated (byte) a#12
Succesful SSA optimization Pass2SelfPhiElimination
Redundant Phi (byte) a#20 (byte) a#19
Redundant Phi (byte*) B#11 (byte*) B#0
Redundant Phi (byte*) B#10 (byte*) B#11
Redundant Phi (byte) a#0 (byte) a#11
Redundant Phi (byte) a#16 (byte) a#1
Redundant Phi (byte*) B#6 (byte*) B#10
Redundant Phi (byte) a#10 (byte) a#12
Redundant Phi (byte*) B#4 (byte*) B#6
Redundant Phi (byte) a#22 (byte) a#16
Redundant Phi (byte*) B#1 (byte*) B#4
Redundant Phi (byte) a#13 (byte) a#1
Redundant Phi (byte*) B#10 (byte*) B#0
Redundant Phi (byte*) B#11 (byte*) B#10
Redundant Phi (byte*) B#5 (byte*) B#11
Redundant Phi (byte*) B#3 (byte*) B#5
Redundant Phi (byte*) B#1 (byte*) B#3
Succesful SSA optimization Pass2RedundantPhiElimination
Simple Condition (bool~) mode::$1 if(*((byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4
Succesful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte) a#19 = 0
Constant (const byte*) B#0 = ((byte*))4096
Succesful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination if(true) goto main::@2
Removing PHI-reference to removed block (menu::@1) in block menu::@return
if() condition always true - replacing block destination if(true) goto menu::@2
if() condition always true - replacing block destination if(true) goto mode::@2
Succesful SSA optimization Pass2ConstantIfs
Removing unused block main::@return
Removing unused block mode::@return
Succesful SSA optimization Pass2EliminateUnusedBlocks
Culled Empty Block (label) main::@1
Culled Empty Block (label) main::@7
Culled Empty Block (label) menu::@1
Culled Empty Block (label) menu::@8
Culled Empty Block (label) @2
Culled Empty Block (label) mode::@4
Culled Empty Block (label) @4
Culled Empty Block (label) mode::@1
Not culling empty block because it shares successor with its predecessor. (label) mode::@4
Succesful SSA optimization Pass2CullEmptyBlocks
Not aliassing across scopes: a#11 a#12
Not aliassing across scopes: a#12 a#1
Redundant Phi (byte) a#11 (byte) a#12
Succesful SSA optimization Pass2RedundantPhiElimination
Not aliassing across scopes: a#12 a#1
Not culling empty block because it shares successor with its predecessor. (label) mode::@4
Not culling empty block because it shares successor with its predecessor. (label) mode::@4
OPTIMIZING CONTROL FLOW GRAPH
Inlining constant with var siblings (const byte) a#19
Inlining constant with var siblings (const byte) a#19
Inlining constant with var siblings (const byte) a#19
Constant inlined a#19 = (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2ConstantInlining
Block Sequence Planned @begin @3 @end main main::@1 main::@2 menu menu::@2 menu::@return mode mode::@1 mode::@2 mode::@7
Block Sequence Planned @begin @3 @end main main::@1 main::@2 menu menu::@2 menu::@return mode mode::@1 mode::@2 mode::@7
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @3
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of menu
Adding NOP phi() at start of menu::@2
CALL GRAPH
Calls in [] to main:2
Calls in [main] to menu:7
Calls in [menu] to mode:11
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Created 2 initial phi equivalence classes
Coalesced [8] a#25 ← a#12
Coalesced (already) [13] a#26 ← a#1
Coalesced [17] a#27 ← a#5
Coalesced down to 1 phi equivalence classes
Block Sequence Planned @begin @3 @end main main::@1 main::@2 menu menu::@2 menu::@return mode mode::@1 mode::@2 mode::@7
Block Sequence Planned @begin @3 @end main main::@2 menu menu::@2 menu::@return mode mode::@2 mode::@4
Block Sequence Planned @begin @3 @end main main::@2 menu menu::@2 menu::@return mode mode::@2 mode::@4
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @3
Adding NOP phi() at start of @end
@ -455,11 +342,26 @@ Adding NOP phi() at start of main::@2
Adding NOP phi() at start of menu
Adding NOP phi() at start of menu::@2
Adding NOP phi() at start of mode
Adding NOP phi() at start of mode::@4
CALL GRAPH
Calls in [] to main:2
Calls in [main] to menu:6
Calls in [menu] to mode:9
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Created 0 initial phi equivalence classes
Coalesced down to 0 phi equivalence classes
Not culling empty block because it shares successor with its predecessor. (label) mode::@4
Block Sequence Planned @begin @3 @end main main::@2 menu menu::@2 menu::@return mode mode::@2 mode::@4
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @3
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of menu
Adding NOP phi() at start of menu::@2
Adding NOP phi() at start of mode
Adding NOP phi() at start of mode::@4
Propagating live ranges...
FINAL CONTROL FLOW GRAPH
@ -474,91 +376,76 @@ FINAL CONTROL FLOW GRAPH
[3] phi() [ ] ( )
main: scope:[main] from @3
[4] phi() [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main main::@2
[5] (byte) a#1 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@2/(byte) a#12 ) [ a#1 ] ( main:2 [ a#1 ] )
to:main::@2
main::@2: scope:[main] from main::@1
[6] phi() [ a#1 ] ( main:2 [ a#1 ] )
[7] call menu [ a#12 ] ( main:2 [ a#12 ] )
to:main::@1
main::@2: scope:[main] from main main::@2
[5] phi() [ ] ( main:2 [ ] )
[6] call menu [ ] ( main:2 [ ] )
to:main::@2
menu: scope:[menu] from main::@2
[8] phi() [ a#1 ] ( main:2::menu:7 [ a#1 ] )
[7] phi() [ ] ( main:2::menu:6 [ ] )
to:menu::@2
menu::@2: scope:[menu] from menu
[9] phi() [ a#1 ] ( main:2::menu:7 [ a#1 ] )
[10] call mode [ a#12 ] ( main:2::menu:7 [ a#12 ] )
[8] phi() [ ] ( main:2::menu:6 [ ] )
[9] call mode [ ] ( main:2::menu:6 [ ] )
to:menu::@return
menu::@return: scope:[menu] from menu::@2
[11] return [ a#12 ] ( main:2::menu:7 [ a#12 ] )
[10] return [ ] ( main:2::menu:6 [ ] )
to:@return
mode: scope:[mode] from menu::@2
[12] phi() [ a#1 ] ( main:2::menu:7::mode:10 [ a#1 ] )
to:mode::@1
mode::@1: scope:[mode] from mode mode::@2 mode::@7
[13] (byte) a#12 ← phi( mode/(byte) a#1 mode::@7/(byte) a#5 ) [ ] ( main:2::menu:7::mode:10 [ ] )
[11] phi() [ ] ( main:2::menu:6::mode:9 [ ] )
to:mode::@2
mode::@2: scope:[mode] from mode mode::@2 mode::@4
[12] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4 [ ] ( main:2::menu:6::mode:9 [ ] )
to:mode::@2
mode::@4: scope:[mode] from mode::@2
[13] phi() [ ] ( main:2::menu:6::mode:9 [ ] )
to:mode::@2
mode::@2: scope:[mode] from mode::@1
[14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] )
to:mode::@7
mode::@7: scope:[mode] from mode::@2
[15] (byte) a#5 ← *((const byte*) B#0) [ a#5 ] ( main:2::menu:7::mode:10 [ a#5 ] )
to:mode::@1
DOMINATORS
@begin dominated by @begin
@3 dominated by @begin @3
@end dominated by @begin @end @3
main dominated by @begin main @3
main::@1 dominated by @begin main @3 main::@1
main::@2 dominated by @begin main @3 main::@1 main::@2
menu dominated by @begin main menu @3 main::@1 main::@2
menu::@2 dominated by @begin menu::@2 main menu @3 main::@1 main::@2
menu::@return dominated by @begin menu::@return menu::@2 main menu @3 main::@1 main::@2
mode dominated by @begin menu::@2 main menu mode @3 main::@1 main::@2
mode::@1 dominated by @begin menu::@2 main menu mode @3 mode::@1 main::@1 main::@2
mode::@2 dominated by @begin menu::@2 main menu mode @3 mode::@1 mode::@2 main::@1 main::@2
mode::@7 dominated by @begin menu::@2 main menu mode @3 mode::@1 mode::@2 main::@1 mode::@7 main::@2
@end dominated by @begin @3 @end
main dominated by @begin @3 main
main::@2 dominated by @begin @3 main::@2 main
menu dominated by @begin @3 main::@2 main menu
menu::@2 dominated by @begin @3 menu::@2 main::@2 main menu
menu::@return dominated by @begin @3 menu::@return menu::@2 main::@2 main menu
mode dominated by mode @begin @3 menu::@2 main::@2 main menu
mode::@2 dominated by mode @begin @3 menu::@2 mode::@2 main::@2 main menu
mode::@4 dominated by mode @begin @3 mode::@4 menu::@2 mode::@2 main::@2 main menu
NATURAL LOOPS
Found back edge: Loop head: main::@1 tails: main::@2 blocks: null
Found back edge: Loop head: mode::@1 tails: mode::@2 blocks: null
Found back edge: Loop head: mode::@1 tails: mode::@7 blocks: null
Populated: Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1
Populated: Loop head: mode::@1 tails: mode::@2 blocks: mode::@2 mode::@1
Populated: Loop head: mode::@1 tails: mode::@7 blocks: mode::@7 mode::@2 mode::@1
Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1
Loop head: mode::@1 tails: mode::@2 blocks: mode::@2 mode::@1
Loop head: mode::@1 tails: mode::@7 blocks: mode::@7 mode::@2 mode::@1
Found back edge: Loop head: main::@2 tails: main::@2 blocks: null
Found back edge: Loop head: mode::@2 tails: mode::@2 blocks: null
Found back edge: Loop head: mode::@2 tails: mode::@4 blocks: null
Populated: Loop head: main::@2 tails: main::@2 blocks: main::@2
Populated: Loop head: mode::@2 tails: mode::@2 blocks: mode::@2
Populated: Loop head: mode::@2 tails: mode::@4 blocks: mode::@4 mode::@2
Loop head: main::@2 tails: main::@2 blocks: main::@2
Loop head: mode::@2 tails: mode::@2 blocks: mode::@2
Loop head: mode::@2 tails: mode::@4 blocks: mode::@4 mode::@2
NATURAL LOOPS WITH DEPTH
Found 0 loops in scope []
Found 1 loops in scope [main]
Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1
Loop head: main::@2 tails: main::@2 blocks: main::@2
Found 0 loops in scope [menu]
Found 2 loops in scope [mode]
Loop head: mode::@1 tails: mode::@2 blocks: mode::@2 mode::@1
Loop head: mode::@1 tails: mode::@7 blocks: mode::@7 mode::@2 mode::@1
Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1 depth: 1
Loop head: mode::@1 tails: mode::@2 blocks: mode::@2 mode::@1 depth: 3
Loop head: mode::@1 tails: mode::@7 blocks: mode::@7 mode::@2 mode::@1 depth: 2
Loop head: mode::@2 tails: mode::@2 blocks: mode::@2
Loop head: mode::@2 tails: mode::@4 blocks: mode::@4 mode::@2
Loop head: main::@2 tails: main::@2 blocks: main::@2 depth: 1
Loop head: mode::@2 tails: mode::@2 blocks: mode::@2 depth: 3
Loop head: mode::@2 tails: mode::@4 blocks: mode::@4 mode::@2 depth: 2
VARIABLE REGISTER WEIGHTS
(byte*) B
(byte) a
(byte) a#1 2.6
(byte) a#12 38.0
(byte) a#5 202.0
(void()) main()
(void()) menu()
(void()) mode()
Initial phi equivalence classes
[ a#1 a#12 a#5 ]
Complete equivalence classes
[ a#1 a#12 a#5 ]
Allocated zp ZP_BYTE:2 [ a#1 a#12 a#5 ]
INITIAL ASM
//SEG0 Basic Upstart
@ -567,7 +454,6 @@ INITIAL ASM
.pc = $80d "Program"
//SEG1 Global Constants & labels
.label B = $1000
.label a = 2
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @3 [phi:@begin->@3]
@ -586,87 +472,66 @@ bend_from_b3:
bend:
//SEG9 main
main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG11 [5] phi (byte) a#1 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0
sta a
jmp b1
//SEG12 main::@1
b1:
//SEG13 [6] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
//SEG10 [5] phi from main main::@2 to main::@2 [phi:main/main::@2->main::@2]
b2_from_main:
b2_from_b2:
jmp b2
//SEG14 main::@2
//SEG11 main::@2
b2:
//SEG15 [7] call menu [ a#12 ] ( main:2 [ a#12 ] )
//SEG16 [8] phi from main::@2 to menu [phi:main::@2->menu]
//SEG12 [6] call menu [ ] ( main:2 [ ] )
//SEG13 [7] phi from main::@2 to menu [phi:main::@2->menu]
menu_from_b2:
jsr menu
//SEG17 [5] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
b1_from_b2:
//SEG18 [5] phi (byte) a#1 = (byte) a#12 [phi:main::@2->main::@1#0] -- register_copy
jmp b1
jmp b2_from_b2
}
//SEG19 menu
//SEG14 menu
menu: {
//SEG20 [9] phi from menu to menu::@2 [phi:menu->menu::@2]
//SEG15 [8] phi from menu to menu::@2 [phi:menu->menu::@2]
b2_from_menu:
jmp b2
//SEG21 menu::@2
//SEG16 menu::@2
b2:
//SEG22 [10] call mode [ a#12 ] ( main:2::menu:7 [ a#12 ] )
//SEG23 [12] phi from menu::@2 to mode [phi:menu::@2->mode]
//SEG17 [9] call mode [ ] ( main:2::menu:6 [ ] )
//SEG18 [11] phi from menu::@2 to mode [phi:menu::@2->mode]
mode_from_b2:
jsr mode
jmp breturn
//SEG24 menu::@return
//SEG19 menu::@return
breturn:
//SEG25 [11] return [ a#12 ] ( main:2::menu:7 [ a#12 ] )
//SEG20 [10] return [ ] ( main:2::menu:6 [ ] )
rts
}
//SEG26 mode
//SEG21 mode
mode: {
//SEG27 [13] phi from mode mode::@7 to mode::@1 [phi:mode/mode::@7->mode::@1]
b1_from_mode:
b1_from_b7:
//SEG28 [13] phi (byte) a#12 = (byte) a#1 [phi:mode/mode::@7->mode::@1#0] -- register_copy
jmp b1
//SEG29 [13] phi from mode::@2 to mode::@1 [phi:mode::@2->mode::@1]
b1_from_b2:
jmp b1
//SEG30 mode::@1
b1:
jmp b2
//SEG31 mode::@2
//SEG22 mode::@2
b2:
//SEG32 [14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] ) -- _deref_pbuc1_neq_0_then_la1
//SEG23 [12] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4 [ ] ( main:2::menu:6::mode:9 [ ] ) -- _deref_pbuc1_neq_0_then_la1
lda B
cmp #0
bne b1_from_b2
jmp b7
//SEG33 mode::@7
b7:
//SEG34 [15] (byte) a#5 ← *((const byte*) B#0) [ a#5 ] ( main:2::menu:7::mode:10 [ a#5 ] ) -- vbuz1=_deref_pbuc1
lda B
sta a
jmp b1_from_b7
bne b4_from_b2
jmp b2
//SEG24 [13] phi from mode::@2 to mode::@4 [phi:mode::@2->mode::@4]
b4_from_b2:
jmp b4
//SEG25 mode::@4
b4:
jmp b2
}
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ a#1 a#12 a#5 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y ,
Statement [12] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4 [ ] ( main:2::menu:6::mode:9 [ ] ) always clobbers reg byte a
REGISTER UPLIFT SCOPES
Uplift Scope [] 242.6: zp ZP_BYTE:2 [ a#1 a#12 a#5 ]
Uplift Scope [main]
Uplift Scope [menu]
Uplift Scope [mode]
Uplift Scope []
Uplifting [] best 18376 combination reg byte a [ a#1 a#12 a#5 ]
Uplifting [main] best 18376 combination
Uplifting [menu] best 18376 combination
Uplifting [mode] best 18376 combination
Uplifting [main] best 11929 combination
Uplifting [menu] best 11929 combination
Uplifting [mode] best 11929 combination
Uplifting [] best 11929 combination
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart
@ -693,116 +558,86 @@ bend_from_b3:
bend:
//SEG9 main
main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG11 [5] phi (byte) a#1 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuaa=vbuc1
lda #0
jmp b1
//SEG12 main::@1
b1:
//SEG13 [6] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
//SEG10 [5] phi from main main::@2 to main::@2 [phi:main/main::@2->main::@2]
b2_from_main:
b2_from_b2:
jmp b2
//SEG14 main::@2
//SEG11 main::@2
b2:
//SEG15 [7] call menu [ a#12 ] ( main:2 [ a#12 ] )
//SEG16 [8] phi from main::@2 to menu [phi:main::@2->menu]
//SEG12 [6] call menu [ ] ( main:2 [ ] )
//SEG13 [7] phi from main::@2 to menu [phi:main::@2->menu]
menu_from_b2:
jsr menu
//SEG17 [5] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
b1_from_b2:
//SEG18 [5] phi (byte) a#1 = (byte) a#12 [phi:main::@2->main::@1#0] -- register_copy
jmp b1
jmp b2_from_b2
}
//SEG19 menu
//SEG14 menu
menu: {
//SEG20 [9] phi from menu to menu::@2 [phi:menu->menu::@2]
//SEG15 [8] phi from menu to menu::@2 [phi:menu->menu::@2]
b2_from_menu:
jmp b2
//SEG21 menu::@2
//SEG16 menu::@2
b2:
//SEG22 [10] call mode [ a#12 ] ( main:2::menu:7 [ a#12 ] )
//SEG23 [12] phi from menu::@2 to mode [phi:menu::@2->mode]
//SEG17 [9] call mode [ ] ( main:2::menu:6 [ ] )
//SEG18 [11] phi from menu::@2 to mode [phi:menu::@2->mode]
mode_from_b2:
jsr mode
jmp breturn
//SEG24 menu::@return
//SEG19 menu::@return
breturn:
//SEG25 [11] return [ a#12 ] ( main:2::menu:7 [ a#12 ] )
//SEG20 [10] return [ ] ( main:2::menu:6 [ ] )
rts
}
//SEG26 mode
//SEG21 mode
mode: {
//SEG27 [13] phi from mode mode::@7 to mode::@1 [phi:mode/mode::@7->mode::@1]
b1_from_mode:
b1_from_b7:
//SEG28 [13] phi (byte) a#12 = (byte) a#1 [phi:mode/mode::@7->mode::@1#0] -- register_copy
jmp b1
//SEG29 [13] phi from mode::@2 to mode::@1 [phi:mode::@2->mode::@1]
b1_from_b2:
jmp b1
//SEG30 mode::@1
b1:
jmp b2
//SEG31 mode::@2
//SEG22 mode::@2
b2:
//SEG32 [14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] ) -- _deref_pbuc1_neq_0_then_la1
//SEG23 [12] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4 [ ] ( main:2::menu:6::mode:9 [ ] ) -- _deref_pbuc1_neq_0_then_la1
lda B
cmp #0
bne b1_from_b2
jmp b7
//SEG33 mode::@7
b7:
//SEG34 [15] (byte) a#5 ← *((const byte*) B#0) [ a#5 ] ( main:2::menu:7::mode:10 [ a#5 ] ) -- vbuaa=_deref_pbuc1
lda B
jmp b1_from_b7
bne b4_from_b2
jmp b2
//SEG24 [13] phi from mode::@2 to mode::@4 [phi:mode::@2->mode::@4]
b4_from_b2:
jmp b4
//SEG25 mode::@4
b4:
jmp b2
}
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b3
Removing instruction jmp bend
Removing instruction jmp b1
Removing instruction jmp b2
Removing instruction jmp b2
Removing instruction jmp breturn
Removing instruction jmp b1
Removing instruction jmp b2
Removing instruction jmp b7
Removing instruction jmp b4
Succesful ASM optimization Pass5NextJumpElimination
Replacing label b1 with b2
Replacing label b1 with b2
Replacing label b1_from_b2 with b2
Replacing label b2_from_b2 with b2
Replacing label b4_from_b2 with b4
Removing instruction bbegin:
Removing instruction b3_from_bbegin:
Removing instruction main_from_b3:
Removing instruction bend_from_b3:
Removing instruction b1:
Removing instruction b2_from_b1:
Removing instruction b2_from_main:
Removing instruction b2_from_b2:
Removing instruction menu_from_b2:
Removing instruction b2_from_menu:
Removing instruction mode_from_b2:
Removing instruction b1_from_mode:
Removing instruction b1_from_b2:
Removing instruction b1:
Removing instruction b4_from_b2:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b3:
Removing instruction bend:
Removing instruction b1_from_main:
Removing instruction b1_from_b2:
Removing instruction b2:
Removing instruction breturn:
Removing instruction b7:
Succesful ASM optimization Pass5UnusedLabelElimination
Skipping double jump to b2 in jmp b1_from_b7
Skipping double jump to b2 in bne b4
Succesful ASM optimization Pass5DoubleJumpElimination
Relabelling long label b1_from_b7 to b1
Succesful ASM optimization Pass5RelabelLongLabels
Removing instruction jmp b2
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda B
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Removing instruction b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b4:
Succesful ASM optimization Pass5UnusedLabelElimination
Removing unreachable instruction jmp b2
Succesful ASM optimization Pass5UnreachableCodeElimination
FINAL SYMBOL TABLE
(label) @3
@ -810,26 +645,19 @@ FINAL SYMBOL TABLE
(label) @end
(byte*) B
(const byte*) B#0 B = ((byte*))(word/signed word/dword/signed dword) 4096
(byte) a
(byte) a#1 reg byte a 2.6
(byte) a#12 reg byte a 38.0
(byte) a#5 reg byte a 202.0
(void()) main()
(label) main::@1
(label) main::@2
(void()) menu()
(label) menu::@2
(label) menu::@return
(void()) mode()
(label) mode::@1
(label) mode::@2
(label) mode::@7
(label) mode::@4
reg byte a [ a#1 a#12 a#5 ]
FINAL ASSEMBLER
Score: 8874
Score: 11527
//SEG0 Basic Upstart
.pc = $801 "Basic"
@ -847,45 +675,35 @@ Score: 8874
//SEG8 @end
//SEG9 main
main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
//SEG11 [5] phi (byte) a#1 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuaa=vbuc1
lda #0
//SEG12 main::@1
//SEG13 [6] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG14 main::@2
//SEG10 [5] phi from main main::@2 to main::@2 [phi:main/main::@2->main::@2]
//SEG11 main::@2
b2:
//SEG15 [7] call menu [ a#12 ] ( main:2 [ a#12 ] )
//SEG16 [8] phi from main::@2 to menu [phi:main::@2->menu]
//SEG12 [6] call menu [ ] ( main:2 [ ] )
//SEG13 [7] phi from main::@2 to menu [phi:main::@2->menu]
jsr menu
//SEG17 [5] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
//SEG18 [5] phi (byte) a#1 = (byte) a#12 [phi:main::@2->main::@1#0] -- register_copy
jmp b2
}
//SEG19 menu
//SEG14 menu
menu: {
//SEG20 [9] phi from menu to menu::@2 [phi:menu->menu::@2]
//SEG21 menu::@2
//SEG22 [10] call mode [ a#12 ] ( main:2::menu:7 [ a#12 ] )
//SEG23 [12] phi from menu::@2 to mode [phi:menu::@2->mode]
//SEG15 [8] phi from menu to menu::@2 [phi:menu->menu::@2]
//SEG16 menu::@2
//SEG17 [9] call mode [ ] ( main:2::menu:6 [ ] )
//SEG18 [11] phi from menu::@2 to mode [phi:menu::@2->mode]
jsr mode
//SEG24 menu::@return
//SEG25 [11] return [ a#12 ] ( main:2::menu:7 [ a#12 ] )
//SEG19 menu::@return
//SEG20 [10] return [ ] ( main:2::menu:6 [ ] )
rts
}
//SEG26 mode
//SEG21 mode
mode: {
//SEG27 [13] phi from mode mode::@7 to mode::@1 [phi:mode/mode::@7->mode::@1]
//SEG28 [13] phi (byte) a#12 = (byte) a#1 [phi:mode/mode::@7->mode::@1#0] -- register_copy
//SEG29 [13] phi from mode::@2 to mode::@1 [phi:mode::@2->mode::@1]
//SEG30 mode::@1
//SEG31 mode::@2
//SEG22 mode::@2
b2:
//SEG32 [14] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@1 [ ] ( main:2::menu:7::mode:10 [ ] ) -- _deref_pbuc1_neq_0_then_la1
//SEG23 [12] if(*((const byte*) B#0)!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mode::@4 [ ] ( main:2::menu:6::mode:9 [ ] ) -- _deref_pbuc1_neq_0_then_la1
lda B
cmp #0
bne b2
//SEG33 mode::@7
//SEG34 [15] (byte) a#5 ← *((const byte*) B#0) [ a#5 ] ( main:2::menu:7::mode:10 [ a#5 ] ) -- vbuaa=_deref_pbuc1
jmp b2
//SEG24 [13] phi from mode::@2 to mode::@4 [phi:mode::@2->mode::@4]
//SEG25 mode::@4
}

View File

@ -3,19 +3,12 @@
(label) @end
(byte*) B
(const byte*) B#0 B = ((byte*))(word/signed word/dword/signed dword) 4096
(byte) a
(byte) a#1 reg byte a 2.6
(byte) a#12 reg byte a 38.0
(byte) a#5 reg byte a 202.0
(void()) main()
(label) main::@1
(label) main::@2
(void()) menu()
(label) menu::@2
(label) menu::@return
(void()) mode()
(label) mode::@1
(label) mode::@2
(label) mode::@7
(label) mode::@4
reg byte a [ a#1 a#12 a#5 ]

View File

@ -4,10 +4,10 @@
jsr main
main: {
.label w = 2
lda #<0
ldx #0
txa
sta w
sta w+1
tax
b1:
txa
clc

View File

@ -11,11 +11,11 @@ main: scope:[main] from @1
[4] phi() [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (word) main::w#2 ← phi( main/((word))(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(word) main::w#1 ) [ main::i#1 main::w#2 ] ( main:2 [ main::i#1 main::w#2 ] )
[5] (byte) main::i#1 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) main::j#1 ) [ main::i#1 main::w#2 ] ( main:2 [ main::i#1 main::w#2 ] )
[6] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:2 [ main::i#1 main::w#1 ] )
[7] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] )
[8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] )
[5] (byte) main::j#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) main::j#1 ) [ main::w#2 main::j#2 ] ( main:2 [ main::w#2 main::j#2 ] )
[5] (word) main::w#2 ← phi( main/((word))(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(word) main::w#1 ) [ main::w#2 main::j#2 ] ( main:2 [ main::w#2 main::j#2 ] )
[6] (word) main::w#1 ← (word) main::w#2 + (byte) main::j#2 [ main::j#2 main::w#1 ] ( main:2 [ main::j#2 main::w#1 ] )
[7] (byte) main::j#1 ← ++ (byte) main::j#2 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] )
[8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[9] return [ ] ( main:2 [ ] )

View File

@ -50,6 +50,8 @@ main::@return: scope:[main] from main::@2
to:@end
@end: scope:[] from @1
Eliminating unused variable (byte) main::i and assignment [0] (byte) main::i ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable main::i(null) and assignment [4] main::i(null) ← (byte) main::j
Removing empty block main::@2
PROCEDURE MODIFY VARIABLE ANALYSIS
@ -59,15 +61,13 @@ CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN
@begin: scope:[] from
to:@1
main: scope:[main] from @1
(byte) main::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte/signed byte/word/signed word/dword/signed dword~) main::$0 ← ((word)) (byte/signed byte/word/signed word/dword/signed dword) 0
(word) main::w#0 ← (byte/signed byte/word/signed word/dword/signed dword~) main::$0
(byte) main::j#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(word) main::w#2 ← phi( main/(word) main::w#0 main::@1/(word) main::w#1 )
(byte) main::j#2 ← phi( main/(byte) main::j#0 main::@1/(byte) main::j#1 )
(byte) main::i#1 ← (byte) main::j#2
(word) main::w#2 ← phi( main/(word) main::w#0 main::@1/(word) main::w#1 )
(word~) main::$1 ← (word) main::w#2 + (byte) main::j#2
(word) main::w#1 ← (word~) main::$1
(byte) main::j#1 ← (byte) main::j#2 + rangenext(0,10)
@ -95,9 +95,6 @@ SYMBOL TABLE SSA
(bool~) main::$2
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#0
(byte) main::i#1
(byte) main::j
(byte) main::j#0
(byte) main::j#1
@ -111,23 +108,20 @@ OPTIMIZING CONTROL FLOW GRAPH
Culled Empty Block (label) @2
Succesful SSA optimization Pass2CullEmptyBlocks
Alias (word) main::w#0 = (byte/signed byte/word/signed word/dword/signed dword~) main::$0
Alias (byte) main::i#1 = (byte) main::j#2
Alias (word) main::w#1 = (word~) main::$1
Succesful SSA optimization Pass2AliasElimination
Simple Condition (bool~) main::$2 if((byte) main::j#1!=rangelast(0,10)) goto main::@1
Succesful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte) main::i#0 = 0
Constant (const word) main::w#0 = ((word))0
Constant (const byte) main::j#0 = 0
Succesful SSA optimization Pass2ConstantIdentification
Eliminating unused constant (const byte) main::i#0
Succesful SSA optimization PassNEliminateUnusedVars
Resolved ranged next value main::j#1 ← ++ main::i#1 to ++
Resolved ranged next value main::j#1 ← ++ main::j#2 to ++
Resolved ranged comparison value if(main::j#1!=rangelast(0,10)) goto main::@1 to (byte/signed byte/word/signed word/dword/signed dword) 11
OPTIMIZING CONTROL FLOW GRAPH
Inlining constant with var siblings (const word) main::w#0
Inlining constant with var siblings (const word) main::w#0
Inlining constant with var siblings (const byte) main::j#0
Inlining constant with var siblings (const byte) main::j#0
Constant inlined main::w#0 = ((word))(byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined main::j#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2ConstantInlining
@ -145,10 +139,9 @@ Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Created 2 initial phi equivalence classes
Coalesced [10] main::i#2 ← main::j#1
Coalesced [11] main::w#3 ← main::w#1
Coalesced [10] main::w#3 ← main::w#1
Coalesced [11] main::j#3 ← main::j#1
Coalesced down to 2 phi equivalence classes
Culled Empty Block (label) main::@3
Block Sequence Planned @begin @1 @end main main::@1 main::@return
@ -174,11 +167,11 @@ main: scope:[main] from @1
[4] phi() [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (word) main::w#2 ← phi( main/((word))(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(word) main::w#1 ) [ main::i#1 main::w#2 ] ( main:2 [ main::i#1 main::w#2 ] )
[5] (byte) main::i#1 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) main::j#1 ) [ main::i#1 main::w#2 ] ( main:2 [ main::i#1 main::w#2 ] )
[6] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:2 [ main::i#1 main::w#1 ] )
[7] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] )
[8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] )
[5] (byte) main::j#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) main::j#1 ) [ main::w#2 main::j#2 ] ( main:2 [ main::w#2 main::j#2 ] )
[5] (word) main::w#2 ← phi( main/((word))(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(word) main::w#1 ) [ main::w#2 main::j#2 ] ( main:2 [ main::w#2 main::j#2 ] )
[6] (word) main::w#1 ← (word) main::w#2 + (byte) main::j#2 [ main::j#2 main::w#1 ] ( main:2 [ main::j#2 main::w#1 ] )
[7] (byte) main::j#1 ← ++ (byte) main::j#2 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] )
[8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[9] return [ ] ( main:2 [ ] )
@ -206,22 +199,21 @@ Loop head: main::@1 tails: main::@1 blocks: main::@1 depth: 1
VARIABLE REGISTER WEIGHTS
(void()) main()
(byte) main::i
(byte) main::i#1 16.5
(byte) main::j
(byte) main::j#1 16.5
(byte) main::j#2 16.5
(word) main::w
(word) main::w#1 7.333333333333333
(word) main::w#2 22.0
Initial phi equivalence classes
[ main::i#1 main::j#1 ]
[ main::w#2 main::w#1 ]
[ main::j#2 main::j#1 ]
Complete equivalence classes
[ main::i#1 main::j#1 ]
[ main::w#2 main::w#1 ]
Allocated zp ZP_BYTE:2 [ main::i#1 main::j#1 ]
Allocated zp ZP_WORD:3 [ main::w#2 main::w#1 ]
[ main::j#2 main::j#1 ]
Allocated zp ZP_WORD:2 [ main::w#2 main::w#1 ]
Allocated zp ZP_BYTE:4 [ main::j#2 main::j#1 ]
INITIAL ASM
//SEG0 Basic Upstart
@ -247,38 +239,37 @@ bend_from_b1:
bend:
//SEG9 main
main: {
.label i = 2
.label w = 3
.label j = 2
.label w = 2
.label j = 4
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG11 [5] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vwuz1=vbuc1
//SEG11 [5] phi (byte) main::j#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0
sta j
//SEG12 [5] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#1] -- vwuz1=vbuc1
lda #<0
sta w
lda #>0
sta w+1
//SEG12 [5] phi (byte) main::i#1 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#1] -- vbuz1=vbuc1
lda #0
sta i
jmp b1
//SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
b1_from_b1:
//SEG14 [5] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG15 [5] phi (byte) main::i#1 = (byte) main::j#1 [phi:main::@1->main::@1#1] -- register_copy
//SEG14 [5] phi (byte) main::j#2 = (byte) main::j#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG15 [5] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#1] -- register_copy
jmp b1
//SEG16 main::@1
b1:
//SEG17 [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:2 [ main::i#1 main::w#1 ] ) -- vwuz1=vwuz1_plus_vbuz2
lda i
//SEG17 [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::j#2 [ main::j#2 main::w#1 ] ( main:2 [ main::j#2 main::w#1 ] ) -- vwuz1=vwuz1_plus_vbuz2
lda j
clc
adc w
sta w
lda #0
adc w+1
sta w+1
//SEG18 [7] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) -- vbuz1=_inc_vbuz1
//SEG18 [7] (byte) main::j#1 ← ++ (byte) main::j#2 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] ) -- vbuz1=_inc_vbuz1
inc j
//SEG19 [8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) -- vbuz1_neq_vbuc1_then_la1
//SEG19 [8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] ) -- vbuz1_neq_vbuc1_then_la1
lda j
cmp #$b
bne b1_from_b1
@ -290,19 +281,18 @@ main: {
}
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:2 [ main::i#1 main::w#1 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#1 main::j#1 ]
Statement [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:2 [ main::i#1 main::w#1 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ main::i#1 main::j#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
Potential registers zp ZP_WORD:3 [ main::w#2 main::w#1 ] : zp ZP_WORD:3 ,
Statement [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::j#2 [ main::j#2 main::w#1 ] ( main:2 [ main::j#2 main::w#1 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:4 [ main::j#2 main::j#1 ]
Statement [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::j#2 [ main::j#2 main::w#1 ] ( main:2 [ main::j#2 main::w#1 ] ) always clobbers reg byte a
Potential registers zp ZP_WORD:2 [ main::w#2 main::w#1 ] : zp ZP_WORD:2 ,
Potential registers zp ZP_BYTE:4 [ main::j#2 main::j#1 ] : zp ZP_BYTE:4 , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 33: zp ZP_BYTE:2 [ main::i#1 main::j#1 ] 29.33: zp ZP_WORD:3 [ main::w#2 main::w#1 ]
Uplift Scope [main] 33: zp ZP_BYTE:4 [ main::j#2 main::j#1 ] 29.33: zp ZP_WORD:2 [ main::w#2 main::w#1 ]
Uplift Scope []
Uplifting [main] best 473 combination reg byte x [ main::i#1 main::j#1 ] zp ZP_WORD:3 [ main::w#2 main::w#1 ]
Uplifting [main] best 473 combination reg byte x [ main::j#2 main::j#1 ] zp ZP_WORD:2 [ main::w#2 main::w#1 ]
Uplifting [] best 473 combination
Allocated (was zp ZP_WORD:3) zp ZP_WORD:2 [ main::w#2 main::w#1 ]
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart
@ -331,22 +321,22 @@ main: {
.label w = 2
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG11 [5] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vwuz1=vbuc1
//SEG11 [5] phi (byte) main::j#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
ldx #0
//SEG12 [5] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#1] -- vwuz1=vbuc1
lda #<0
sta w
lda #>0
sta w+1
//SEG12 [5] phi (byte) main::i#1 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#1] -- vbuxx=vbuc1
ldx #0
jmp b1
//SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
b1_from_b1:
//SEG14 [5] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG15 [5] phi (byte) main::i#1 = (byte) main::j#1 [phi:main::@1->main::@1#1] -- register_copy
//SEG14 [5] phi (byte) main::j#2 = (byte) main::j#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG15 [5] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#1] -- register_copy
jmp b1
//SEG16 main::@1
b1:
//SEG17 [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:2 [ main::i#1 main::w#1 ] ) -- vwuz1=vwuz1_plus_vbuxx
//SEG17 [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::j#2 [ main::j#2 main::w#1 ] ( main:2 [ main::j#2 main::w#1 ] ) -- vwuz1=vwuz1_plus_vbuxx
txa
clc
adc w
@ -354,9 +344,9 @@ main: {
lda #0
adc w+1
sta w+1
//SEG18 [7] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) -- vbuxx=_inc_vbuxx
//SEG18 [7] (byte) main::j#1 ← ++ (byte) main::j#2 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG19 [8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) -- vbuxx_neq_vbuc1_then_la1
//SEG19 [8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #$b
bne b1_from_b1
jmp breturn
@ -372,8 +362,8 @@ Removing instruction jmp bend
Removing instruction jmp b1
Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination
Replacing instruction lda #<0 with TXA
Removing instruction lda #>0
Replacing instruction ldx #0 with TAX
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Replacing label b1_from_b1 with b1
Removing instruction bbegin:
@ -397,16 +387,15 @@ FINAL SYMBOL TABLE
(void()) main()
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::j
(byte) main::j#1 reg byte x 16.5
(byte) main::j#2 reg byte x 16.5
(word) main::w
(word) main::w#1 w zp ZP_WORD:2 7.333333333333333
(word) main::w#2 w zp ZP_WORD:2 22.0
reg byte x [ main::i#1 main::j#1 ]
zp ZP_WORD:2 [ main::w#2 main::w#1 ]
reg byte x [ main::j#2 main::j#1 ]
FINAL ASSEMBLER
@ -429,18 +418,18 @@ Score: 357
main: {
.label w = 2
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
//SEG11 [5] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vwuz1=vbuc1
lda #<0
//SEG11 [5] phi (byte) main::j#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
ldx #0
//SEG12 [5] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#1] -- vwuz1=vbuc1
txa
sta w
sta w+1
//SEG12 [5] phi (byte) main::i#1 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#1] -- vbuxx=vbuc1
tax
//SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
//SEG14 [5] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG15 [5] phi (byte) main::i#1 = (byte) main::j#1 [phi:main::@1->main::@1#1] -- register_copy
//SEG14 [5] phi (byte) main::j#2 = (byte) main::j#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG15 [5] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#1] -- register_copy
//SEG16 main::@1
b1:
//SEG17 [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:2 [ main::i#1 main::w#1 ] ) -- vwuz1=vwuz1_plus_vbuxx
//SEG17 [6] (word) main::w#1 ← (word) main::w#2 + (byte) main::j#2 [ main::j#2 main::w#1 ] ( main:2 [ main::j#2 main::w#1 ] ) -- vwuz1=vwuz1_plus_vbuxx
txa
clc
adc w
@ -448,9 +437,9 @@ main: {
lda #0
adc w+1
sta w+1
//SEG18 [7] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) -- vbuxx=_inc_vbuxx
//SEG18 [7] (byte) main::j#1 ← ++ (byte) main::j#2 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG19 [8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:2 [ main::j#1 main::w#1 ] ) -- vbuxx_neq_vbuc1_then_la1
//SEG19 [8] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 11) goto main::@1 [ main::w#1 main::j#1 ] ( main:2 [ main::w#1 main::j#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #$b
bne b1
//SEG20 main::@return

View File

@ -4,13 +4,12 @@
(void()) main()
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::j
(byte) main::j#1 reg byte x 16.5
(byte) main::j#2 reg byte x 16.5
(word) main::w
(word) main::w#1 w zp ZP_WORD:2 7.333333333333333
(word) main::w#2 w zp ZP_WORD:2 22.0
reg byte x [ main::i#1 main::j#1 ]
zp ZP_WORD:2 [ main::w#2 main::w#1 ]
reg byte x [ main::j#2 main::j#1 ]

View File

@ -17,8 +17,6 @@
.label BITMAP = $a000
.label SCREEN = $8800
.const DELAY = 8
.label rem16s = 3
.label rem16u = 9
jsr main
main: {
.const vicSelectGfxBank1_toDd001_return = 3^(>SCREEN)>>6
@ -40,11 +38,7 @@ main: {
jsr bitmap_init
jsr bitmap_clear
jsr screen_fill
lda #<0
sta rem16s
sta rem16s+1
sta rem16u
sta rem16u+1
lda #0
sta i
b1:
jsr point_init
@ -72,10 +66,10 @@ main: {
jmp b5
}
bitmap_plot: {
.label _1 = $b
.label x = 5
.label plotter = 7
.label _3 = 7
.label _1 = 7
.label x = 3
.label plotter = 5
.label _3 = 5
lda bitmap_plot_yhi,y
sta _3+1
lda bitmap_plot_ylo,y
@ -102,20 +96,20 @@ bitmap_plot: {
rts
}
point_init: {
.label _4 = $e
.label _5 = 5
.label _16 = 5
.label _17 = 5
.label _18 = 5
.label _4 = 7
.label _5 = 3
.label _16 = 3
.label _17 = 3
.label _18 = 3
.label point_idx = 2
.label point_idx1 = $d
.label y_diff = $e
.label abs16s1__2 = 5
.label abs16s1_return = 5
.label abs16s2__2 = 7
.label abs16s2_return = 7
.label point_idx1 = $b
.label y_diff = 7
.label abs16s1__2 = 3
.label abs16s1_return = 3
.label abs16s2__2 = 5
.label abs16s2_return = 5
.label x_stepf = 5
.label x_diff = $b
.label x_diff = 9
lda point_idx
lsr
sta point_idx1
@ -216,10 +210,6 @@ point_init: {
lda #$10
sta x_add,y
b4:
lda y_diff
sta divr16s.rem
lda y_diff+1
sta divr16s.rem+1
jsr divr16s
lda x_stepf+1
lsr
@ -259,15 +249,15 @@ point_init: {
}
divr16s: {
.const dividend = 0
.label _7 = 9
.label _11 = $b
.label _7 = 7
.label _11 = 9
.label resultu = 5
.label return = 5
.label divisor = $b
.label rem = 9
.label divisor = 9
.label rem = 7
.label dividendu = 3
.label divisoru = $b
.label remu = 9
.label divisoru = 9
.label remu = 7
lda rem+1
bmi b1
lda #<dividend
@ -281,16 +271,7 @@ divr16s: {
b4:
jsr divr16u
cpy #0
beq b19
sec
lda divr16u.rem
eor #$ff
adc #0
sta rem16s
lda divr16u.rem+1
eor #$ff
adc #0
sta rem16s+1
beq breturn
sec
lda return
eor #$ff
@ -302,12 +283,6 @@ divr16s: {
sta return+1
breturn:
rts
b19:
lda divr16u.rem
sta rem16s
lda divr16u.rem+1
sta rem16s+1
jmp breturn
b3:
sec
lda _11
@ -340,11 +315,11 @@ divr16s: {
jmp b2
}
divr16u: {
.label rem = 9
.label rem = 7
.label dividend = 3
.label quotient = 5
.label return = 5
.label divisor = $b
.label divisor = 9
ldx #0
txa
sta quotient

View File

@ -38,21 +38,19 @@ main::@18: scope:[main] from main::@17
[17] call screen_fill [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main::@18 main::@21
[18] (signed word) rem16s#15 ← phi( main::@18/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@21/(signed word) rem16s#13 ) [ main::i#2 rem16u#21 rem16s#15 ] ( main:2 [ main::i#2 rem16u#21 rem16s#15 ] )
[18] (word) rem16u#21 ← phi( main::@18/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@21/(word) rem16u#18 ) [ main::i#2 rem16u#21 rem16s#15 ] ( main:2 [ main::i#2 rem16u#21 rem16s#15 ] )
[18] (byte) main::i#2 ← phi( main::@18/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@21/(byte) main::i#1 ) [ main::i#2 rem16u#21 rem16s#15 ] ( main:2 [ main::i#2 rem16u#21 rem16s#15 ] )
[19] (byte) point_init::point_idx#0 ← (byte) main::i#2 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 ] ( main:2 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 ] )
[20] call point_init [ main::i#2 rem16u#18 rem16s#13 ] ( main:2 [ main::i#2 rem16u#18 rem16s#13 ] )
[18] (byte) main::i#2 ← phi( main::@18/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@21/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[19] (byte) point_init::point_idx#0 ← (byte) main::i#2 [ main::i#2 point_init::point_idx#0 ] ( main:2 [ main::i#2 point_init::point_idx#0 ] )
[20] call point_init [ main::i#2 ] ( main:2 [ main::i#2 ] )
to:main::@20
main::@20: scope:[main] from main::@1
[21] (byte~) main::$9 ← (byte) main::i#2 >> (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 rem16u#18 rem16s#13 main::$9 ] ( main:2 [ main::i#2 rem16u#18 rem16s#13 main::$9 ] )
[22] (word) bitmap_plot::x#0 ← *((const word[4]) x_start#0 + (byte) main::i#2) [ main::i#2 rem16u#18 rem16s#13 main::$9 bitmap_plot::x#0 ] ( main:2 [ main::i#2 rem16u#18 rem16s#13 main::$9 bitmap_plot::x#0 ] )
[23] (byte) bitmap_plot::y#0 ← *((const byte[4]) y_start#0 + (byte~) main::$9) [ main::i#2 rem16u#18 rem16s#13 bitmap_plot::x#0 bitmap_plot::y#0 ] ( main:2 [ main::i#2 rem16u#18 rem16s#13 bitmap_plot::x#0 bitmap_plot::y#0 ] )
[24] call bitmap_plot [ main::i#2 rem16u#18 rem16s#13 ] ( main:2 [ main::i#2 rem16u#18 rem16s#13 ] )
[21] (byte~) main::$9 ← (byte) main::i#2 >> (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 main::$9 ] ( main:2 [ main::i#2 main::$9 ] )
[22] (word) bitmap_plot::x#0 ← *((const word[4]) x_start#0 + (byte) main::i#2) [ main::i#2 main::$9 bitmap_plot::x#0 ] ( main:2 [ main::i#2 main::$9 bitmap_plot::x#0 ] )
[23] (byte) bitmap_plot::y#0 ← *((const byte[4]) y_start#0 + (byte~) main::$9) [ main::i#2 bitmap_plot::x#0 bitmap_plot::y#0 ] ( main:2 [ main::i#2 bitmap_plot::x#0 bitmap_plot::y#0 ] )
[24] call bitmap_plot [ main::i#2 ] ( main:2 [ main::i#2 ] )
to:main::@21
main::@21: scope:[main] from main::@20
[25] (byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 [ main::i#1 rem16u#18 rem16s#13 ] ( main:2 [ main::i#1 rem16u#18 rem16s#13 ] )
[26] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto main::@1 [ main::i#1 rem16u#18 rem16s#13 ] ( main:2 [ main::i#1 rem16u#18 rem16s#13 ] )
[25] (byte) main::i#1 ← (byte) main::i#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[26] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@5
main::@5: scope:[main] from main::@21 main::@5 main::@7
[27] if(*((const byte*) RASTER#0)!=(byte/word/signed word/dword/signed dword) 255) goto main::@5 [ ] ( main:2 [ ] )
@ -61,256 +59,251 @@ main::@7: scope:[main] from main::@5
[28] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0) [ ] ( main:2 [ ] )
to:main::@5
bitmap_plot: scope:[bitmap_plot] from main::@20
[29] (word~) bitmap_plot::$3 ← *((const byte[256]) bitmap_plot_yhi#0 + (byte) bitmap_plot::y#0) w= *((const byte[256]) bitmap_plot_ylo#0 + (byte) bitmap_plot::y#0) [ bitmap_plot::x#0 bitmap_plot::$3 ] ( main:2::bitmap_plot:24 [ main::i#2 rem16u#18 rem16s#13 bitmap_plot::x#0 bitmap_plot::$3 ] )
[30] (word~) bitmap_plot::$1 ← (word) bitmap_plot::x#0 & (word/dword/signed dword) 65528 [ bitmap_plot::x#0 bitmap_plot::$3 bitmap_plot::$1 ] ( main:2::bitmap_plot:24 [ main::i#2 rem16u#18 rem16s#13 bitmap_plot::x#0 bitmap_plot::$3 bitmap_plot::$1 ] )
[31] (byte*) bitmap_plot::plotter#1 ← (byte*)(word~) bitmap_plot::$3 + (word~) bitmap_plot::$1 [ bitmap_plot::x#0 bitmap_plot::plotter#1 ] ( main:2::bitmap_plot:24 [ main::i#2 rem16u#18 rem16s#13 bitmap_plot::x#0 bitmap_plot::plotter#1 ] )
[32] (byte~) bitmap_plot::$2 ← < (word) bitmap_plot::x#0 [ bitmap_plot::plotter#1 bitmap_plot::$2 ] ( main:2::bitmap_plot:24 [ main::i#2 rem16u#18 rem16s#13 bitmap_plot::plotter#1 bitmap_plot::$2 ] )
[33] *((byte*) bitmap_plot::plotter#1) ← *((byte*) bitmap_plot::plotter#1) | *((const byte[256]) bitmap_plot_bit#0 + (byte~) bitmap_plot::$2) [ ] ( main:2::bitmap_plot:24 [ main::i#2 rem16u#18 rem16s#13 ] )
[29] (word~) bitmap_plot::$3 ← *((const byte[256]) bitmap_plot_yhi#0 + (byte) bitmap_plot::y#0) w= *((const byte[256]) bitmap_plot_ylo#0 + (byte) bitmap_plot::y#0) [ bitmap_plot::x#0 bitmap_plot::$3 ] ( main:2::bitmap_plot:24 [ main::i#2 bitmap_plot::x#0 bitmap_plot::$3 ] )
[30] (word~) bitmap_plot::$1 ← (word) bitmap_plot::x#0 & (word/dword/signed dword) 65528 [ bitmap_plot::x#0 bitmap_plot::$3 bitmap_plot::$1 ] ( main:2::bitmap_plot:24 [ main::i#2 bitmap_plot::x#0 bitmap_plot::$3 bitmap_plot::$1 ] )
[31] (byte*) bitmap_plot::plotter#1 ← (byte*)(word~) bitmap_plot::$3 + (word~) bitmap_plot::$1 [ bitmap_plot::x#0 bitmap_plot::plotter#1 ] ( main:2::bitmap_plot:24 [ main::i#2 bitmap_plot::x#0 bitmap_plot::plotter#1 ] )
[32] (byte~) bitmap_plot::$2 ← < (word) bitmap_plot::x#0 [ bitmap_plot::plotter#1 bitmap_plot::$2 ] ( main:2::bitmap_plot:24 [ main::i#2 bitmap_plot::plotter#1 bitmap_plot::$2 ] )
[33] *((byte*) bitmap_plot::plotter#1) ← *((byte*) bitmap_plot::plotter#1) | *((const byte[256]) bitmap_plot_bit#0 + (byte~) bitmap_plot::$2) [ ] ( main:2::bitmap_plot:24 [ main::i#2 ] )
to:bitmap_plot::@return
bitmap_plot::@return: scope:[bitmap_plot] from bitmap_plot
[34] return [ ] ( main:2::bitmap_plot:24 [ main::i#2 rem16u#18 rem16s#13 ] )
[34] return [ ] ( main:2::bitmap_plot:24 [ main::i#2 ] )
to:@return
point_init: scope:[point_init] from main::@1
[35] (byte) point_init::point_idx1#0 ← (byte) point_init::point_idx#0 >> (byte/signed byte/word/signed word/dword/signed dword) 1 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 ] )
[36] (signed word) point_init::x_diff#1 ← (signed word)*((const word[4]) x_end#0 + (byte) point_init::point_idx#0) - (signed word)*((const word[4]) x_start#0 + (byte) point_init::point_idx#0) [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 ] )
[37] (signed word~) point_init::$4 ← ((signed word)) *((const byte[4]) y_end#0 + (byte) point_init::point_idx1#0) [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 ] )
[38] (signed word~) point_init::$5 ← ((signed word)) *((const byte[4]) y_start#0 + (byte) point_init::point_idx1#0) [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 point_init::$5 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 point_init::$5 ] )
[39] (signed word) point_init::y_diff#0 ← (signed word~) point_init::$4 - (signed word~) point_init::$5 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
[35] (byte) point_init::point_idx1#0 ← (byte) point_init::point_idx#0 >> (byte/signed byte/word/signed word/dword/signed dword) 1 [ point_init::point_idx#0 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 ] )
[36] (signed word) point_init::x_diff#1 ← (signed word)*((const word[4]) x_end#0 + (byte) point_init::point_idx#0) - (signed word)*((const word[4]) x_start#0 + (byte) point_init::point_idx#0) [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 ] )
[37] (signed word~) point_init::$4 ← ((signed word)) *((const byte[4]) y_end#0 + (byte) point_init::point_idx1#0) [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 ] )
[38] (signed word~) point_init::$5 ← ((signed word)) *((const byte[4]) y_start#0 + (byte) point_init::point_idx1#0) [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 point_init::$5 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::$4 point_init::$5 ] )
[39] (signed word) point_init::y_diff#0 ← (signed word~) point_init::$4 - (signed word~) point_init::$5 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
to:point_init::abs16s1
point_init::abs16s1: scope:[point_init] from point_init
[40] if((signed word) point_init::x_diff#1<(byte/signed byte/word/signed word/dword/signed dword) 0) goto point_init::abs16s1_@1 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
[40] if((signed word) point_init::x_diff#1<(byte/signed byte/word/signed word/dword/signed dword) 0) goto point_init::abs16s1_@1 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
to:point_init::@12
point_init::@12: scope:[point_init] from point_init::abs16s1
[41] (word~) point_init::abs16s1_return#6 ← (word)(signed word) point_init::x_diff#1 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#6 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#6 ] )
[41] (word~) point_init::abs16s1_return#6 ← (word)(signed word) point_init::x_diff#1 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#6 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#6 ] )
to:point_init::abs16s1_@return
point_init::abs16s1_@return: scope:[point_init] from point_init::@12 point_init::abs16s1_@1
[42] (word) point_init::abs16s1_return#2 ← phi( point_init::abs16s1_@1/(word~) point_init::abs16s1_return#5 point_init::@12/(word~) point_init::abs16s1_return#6 ) [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] )
[42] (word) point_init::abs16s1_return#2 ← phi( point_init::abs16s1_@1/(word~) point_init::abs16s1_return#5 point_init::@12/(word~) point_init::abs16s1_return#6 ) [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] )
to:point_init::abs16s2
point_init::abs16s2: scope:[point_init] from point_init::abs16s1_@return
[43] if((signed word) point_init::y_diff#0<(byte/signed byte/word/signed word/dword/signed dword) 0) goto point_init::abs16s2_@1 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] )
[43] if((signed word) point_init::y_diff#0<(byte/signed byte/word/signed word/dword/signed dword) 0) goto point_init::abs16s2_@1 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 ] )
to:point_init::@13
point_init::@13: scope:[point_init] from point_init::abs16s2
[44] (word~) point_init::abs16s2_return#6 ← (word)(signed word) point_init::y_diff#0 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#6 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#6 ] )
[44] (word~) point_init::abs16s2_return#6 ← (word)(signed word) point_init::y_diff#0 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#6 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#6 ] )
to:point_init::abs16s2_@return
point_init::abs16s2_@return: scope:[point_init] from point_init::@13 point_init::abs16s2_@1
[45] (word) point_init::abs16s2_return#2 ← phi( point_init::abs16s2_@1/(word~) point_init::abs16s2_return#5 point_init::@13/(word~) point_init::abs16s2_return#6 ) [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#2 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#2 ] )
[45] (word) point_init::abs16s2_return#2 ← phi( point_init::abs16s2_@1/(word~) point_init::abs16s2_return#5 point_init::@13/(word~) point_init::abs16s2_return#6 ) [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#2 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#2 ] )
to:point_init::@10
point_init::@10: scope:[point_init] from point_init::abs16s2_@return
[46] if((word) point_init::abs16s1_return#2>(word) point_init::abs16s2_return#2) goto point_init::@1 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
[46] if((word) point_init::abs16s1_return#2>(word) point_init::abs16s2_return#2) goto point_init::@1 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
to:point_init::@2
point_init::@2: scope:[point_init] from point_init::@10 point_init::@11
[47] (signed word) rem16s#13 ← phi( point_init::@10/(signed word) rem16s#15 point_init::@11/(signed word) rem16s#3 ) [ rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 ] )
[47] (word) rem16u#18 ← phi( point_init::@10/(word) rem16u#21 point_init::@11/(word) divr16u::rem#10 ) [ rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 ] )
[48] (word~) point_init::$16 ← *((const word[4]) x_start#0 + (byte) point_init::point_idx#0) << (byte/signed byte/word/signed word/dword/signed dword) 4 [ rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 point_init::$16 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 point_init::$16 ] )
[49] *((const word[4]) x_cur#0 + (byte) point_init::point_idx#0) ← (word~) point_init::$16 [ rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 ] )
[50] (word~) point_init::$17 ← ((word)) *((const byte[4]) y_start#0 + (byte) point_init::point_idx1#0) [ rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 point_init::$17 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 point_init::$17 ] )
[51] (word~) point_init::$18 ← (word~) point_init::$17 << (byte/signed byte/word/signed word/dword/signed dword) 4 [ rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 point_init::$18 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 point_init::point_idx#0 point_init::point_idx1#0 point_init::$18 ] )
[52] *((const word[4]) y_cur#0 + (byte) point_init::point_idx#0) ← (word~) point_init::$18 [ rem16u#18 rem16s#13 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 point_init::point_idx1#0 ] )
[53] *((const byte[4]) delay#0 + (byte) point_init::point_idx1#0) ← (const byte) DELAY#0 [ rem16u#18 rem16s#13 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 ] )
[47] (word~) point_init::$16 ← *((const word[4]) x_start#0 + (byte) point_init::point_idx#0) << (byte/signed byte/word/signed word/dword/signed dword) 4 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::$16 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::$16 ] )
[48] *((const word[4]) x_cur#0 + (byte) point_init::point_idx#0) ← (word~) point_init::$16 [ point_init::point_idx#0 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 ] )
[49] (word~) point_init::$17 ← ((word)) *((const byte[4]) y_start#0 + (byte) point_init::point_idx1#0) [ point_init::point_idx#0 point_init::point_idx1#0 point_init::$17 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::$17 ] )
[50] (word~) point_init::$18 ← (word~) point_init::$17 << (byte/signed byte/word/signed word/dword/signed dword) 4 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::$18 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::$18 ] )
[51] *((const word[4]) y_cur#0 + (byte) point_init::point_idx#0) ← (word~) point_init::$18 [ point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx1#0 ] )
[52] *((const byte[4]) delay#0 + (byte) point_init::point_idx1#0) ← (const byte) DELAY#0 [ ] ( main:2::point_init:20 [ main::i#2 ] )
to:point_init::@return
point_init::@return: scope:[point_init] from point_init::@2
[54] return [ rem16u#18 rem16s#13 ] ( main:2::point_init:20 [ main::i#2 rem16u#18 rem16s#13 ] )
[53] return [ ] ( main:2::point_init:20 [ main::i#2 ] )
to:@return
point_init::@1: scope:[point_init] from point_init point_init::@10
[55] if((signed word) point_init::x_diff#1<(byte/signed byte/word/signed word/dword/signed dword) 0) goto point_init::@3 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
[54] if((signed word) point_init::x_diff#1<(byte/signed byte/word/signed word/dword/signed dword) 0) goto point_init::@3 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
to:point_init::@7
point_init::@7: scope:[point_init] from point_init::@1
[56] *((const signed byte[4]) x_add#0 + (byte) point_init::point_idx#0) ← (byte/signed byte/word/signed word/dword/signed dword) 16 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
[55] *((const signed byte[4]) x_add#0 + (byte) point_init::point_idx#0) ← (byte/signed byte/word/signed word/dword/signed dword) 16 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
to:point_init::@4
point_init::@4: scope:[point_init] from point_init::@3 point_init::@7
[57] (signed word) divr16s::divisor#0 ← (signed word) point_init::x_diff#1 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::y_diff#0 divr16s::divisor#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::y_diff#0 divr16s::divisor#0 ] )
[58] (signed word) divr16s::rem#0 ← (signed word) point_init::y_diff#0 [ point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] )
[59] call divr16s [ point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 divr16s::return#2 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 divr16s::return#2 ] )
[60] (signed word) divr16s::return#3 ← (signed word) divr16s::return#2 [ point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 divr16s::return#3 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 divr16s::return#3 ] )
[56] (signed word) divr16s::divisor#0 ← (signed word) point_init::x_diff#1 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::y_diff#0 divr16s::divisor#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::y_diff#0 divr16s::divisor#0 ] )
[57] (signed word) divr16s::rem#0 ← (signed word) point_init::y_diff#0 [ point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] )
[58] call divr16s [ point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#2 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#2 ] )
[59] (signed word) divr16s::return#3 ← (signed word) divr16s::return#2 [ point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#3 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#3 ] )
to:point_init::@11
point_init::@11: scope:[point_init] from point_init::@4
[61] (signed word) point_init::x_stepf#0 ← (signed word) divr16s::return#3 [ point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 point_init::x_stepf#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 point_init::x_stepf#0 ] )
[62] (byte~) point_init::$13 ← > (signed word) point_init::x_stepf#0 [ point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 point_init::$13 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 point_init::$13 ] )
[63] (byte~) point_init::$14 ← (byte~) point_init::$13 >> (byte/signed byte/word/signed word/dword/signed dword) 4 [ point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 point_init::$14 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 point_init::$14 ] )
[64] *((const signed byte[4]) y_add#0 + (byte) point_init::point_idx1#0) ← (signed byte)(byte~) point_init::$14 [ point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 ] )
[60] (signed word) point_init::x_stepf#0 ← (signed word) divr16s::return#3 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_stepf#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_stepf#0 ] )
[61] (byte~) point_init::$13 ← > (signed word) point_init::x_stepf#0 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::$13 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::$13 ] )
[62] (byte~) point_init::$14 ← (byte~) point_init::$13 >> (byte/signed byte/word/signed word/dword/signed dword) 4 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::$14 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::$14 ] )
[63] *((const signed byte[4]) y_add#0 + (byte) point_init::point_idx1#0) ← (signed byte)(byte~) point_init::$14 [ point_init::point_idx#0 point_init::point_idx1#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 ] )
to:point_init::@2
point_init::@3: scope:[point_init] from point_init::@1
[65] *((const signed byte[4]) x_add#0 + (byte) point_init::point_idx#0) ← -(byte/signed byte/word/signed word/dword/signed dword) 16 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
[64] *((const signed byte[4]) x_add#0 + (byte) point_init::point_idx#0) ← -(byte/signed byte/word/signed word/dword/signed dword) 16 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 ] )
to:point_init::@4
point_init::abs16s2_@1: scope:[point_init] from point_init::abs16s2
[66] (signed word) point_init::abs16s2_$2#0 ← - (signed word) point_init::y_diff#0 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_$2#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_$2#0 ] )
[67] (word~) point_init::abs16s2_return#5 ← (word)(signed word) point_init::abs16s2_$2#0 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#5 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#5 ] )
[65] (signed word) point_init::abs16s2_$2#0 ← - (signed word) point_init::y_diff#0 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_$2#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_$2#0 ] )
[66] (word~) point_init::abs16s2_return#5 ← (word)(signed word) point_init::abs16s2_$2#0 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#5 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#2 point_init::abs16s2_return#5 ] )
to:point_init::abs16s2_@return
point_init::abs16s1_@1: scope:[point_init] from point_init::abs16s1
[68] (signed word) point_init::abs16s1_$2#0 ← - (signed word) point_init::x_diff#1 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_$2#0 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_$2#0 ] )
[69] (word~) point_init::abs16s1_return#5 ← (word)(signed word) point_init::abs16s1_$2#0 [ rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#5 ] ( main:2::point_init:20 [ main::i#2 rem16u#21 rem16s#15 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#5 ] )
[67] (signed word) point_init::abs16s1_$2#0 ← - (signed word) point_init::x_diff#1 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_$2#0 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_$2#0 ] )
[68] (word~) point_init::abs16s1_return#5 ← (word)(signed word) point_init::abs16s1_$2#0 [ point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#5 ] ( main:2::point_init:20 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 point_init::x_diff#1 point_init::y_diff#0 point_init::abs16s1_return#5 ] )
to:point_init::abs16s1_@return
divr16s: scope:[divr16s] from point_init::@4
[70] phi() [ divr16s::divisor#0 divr16s::rem#0 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] )
[69] phi() [ divr16s::divisor#0 divr16s::rem#0 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] )
to:divr16s::@16
divr16s::@16: scope:[divr16s] from divr16s
[71] if((signed word) divr16s::rem#0<(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16s::@1 [ divr16s::divisor#0 divr16s::rem#0 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] )
[70] if((signed word) divr16s::rem#0<(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16s::@1 [ divr16s::divisor#0 divr16s::rem#0 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::rem#0 ] )
to:divr16s::@17
divr16s::@17: scope:[divr16s] from divr16s::@16
[72] (word~) divr16s::remu#8 ← (word)(signed word) divr16s::rem#0 [ divr16s::divisor#0 divr16s::remu#8 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::remu#8 ] )
[71] (word~) divr16s::remu#8 ← (word)(signed word) divr16s::rem#0 [ divr16s::divisor#0 divr16s::remu#8 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::remu#8 ] )
to:divr16s::@2
divr16s::@2: scope:[divr16s] from divr16s::@1 divr16s::@17
[73] (word) divr16s::remu#3 ← phi( divr16s::@1/(word~) divr16s::remu#7 divr16s::@17/(word~) divr16s::remu#8 ) [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] )
[73] (word) divr16s::dividendu#3 ← phi( divr16s::@1/((word))-(const signed word) divr16s::dividend#0 divr16s::@17/((word))(const signed word) divr16s::dividend#0 ) [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] )
[73] (byte) divr16s::neg#3 ← phi( divr16s::@1/(byte/signed byte/word/signed word/dword/signed dword) 1 divr16s::@17/(byte/signed byte/word/signed word/dword/signed dword) 0 ) [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] )
[74] if((signed word) divr16s::divisor#0<(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16s::@3 [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] )
[72] (word) divr16s::remu#3 ← phi( divr16s::@1/(word~) divr16s::remu#7 divr16s::@17/(word~) divr16s::remu#8 ) [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] )
[72] (word) divr16s::dividendu#3 ← phi( divr16s::@1/((word))-(const signed word) divr16s::dividend#0 divr16s::@17/((word))(const signed word) divr16s::dividend#0 ) [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] )
[72] (byte) divr16s::neg#3 ← phi( divr16s::@1/(byte/signed byte/word/signed word/dword/signed dword) 1 divr16s::@17/(byte/signed byte/word/signed word/dword/signed dword) 0 ) [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] )
[73] if((signed word) divr16s::divisor#0<(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16s::@3 [ divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 ] )
to:divr16s::@18
divr16s::@18: scope:[divr16s] from divr16s::@2
[75] (word~) divr16s::divisoru#5 ← (word)(signed word) divr16s::divisor#0 [ divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#5 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#5 ] )
[74] (word~) divr16s::divisoru#5 ← (word)(signed word) divr16s::divisor#0 [ divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#5 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#5 ] )
to:divr16s::@4
divr16s::@4: scope:[divr16s] from divr16s::@18 divr16s::@3
[76] (byte) divr16s::neg#4 ← phi( divr16s::@3/(byte) divr16s::neg#2 divr16s::@18/(byte) divr16s::neg#3 ) [ divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] )
[76] (word) divr16s::divisoru#3 ← phi( divr16s::@3/(word~) divr16s::divisoru#4 divr16s::@18/(word~) divr16s::divisoru#5 ) [ divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] )
[77] (word) divr16u::dividend#1 ← (word) divr16s::dividendu#3 [ divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 divr16u::dividend#1 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 divr16u::dividend#1 ] )
[78] (word) divr16u::divisor#0 ← (word) divr16s::divisoru#3 [ divr16s::remu#3 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::remu#3 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 ] )
[79] (word) divr16u::rem#3 ← (word) divr16s::remu#3 [ divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] )
[80] call divr16u [ divr16u::rem#10 divr16s::neg#4 divr16u::return#0 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 divr16s::neg#4 divr16u::return#0 ] )
[81] (word) divr16u::return#2 ← (word) divr16u::return#0 [ divr16u::rem#10 divr16s::neg#4 divr16u::return#2 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 divr16s::neg#4 divr16u::return#2 ] )
[75] (byte) divr16s::neg#4 ← phi( divr16s::@3/(byte) divr16s::neg#2 divr16s::@18/(byte) divr16s::neg#3 ) [ divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] )
[75] (word) divr16s::divisoru#3 ← phi( divr16s::@3/(word~) divr16s::divisoru#4 divr16s::@18/(word~) divr16s::divisoru#5 ) [ divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 ] )
[76] (word) divr16u::dividend#1 ← (word) divr16s::dividendu#3 [ divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 divr16u::dividend#1 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::remu#3 divr16s::divisoru#3 divr16s::neg#4 divr16u::dividend#1 ] )
[77] (word) divr16u::divisor#0 ← (word) divr16s::divisoru#3 [ divr16s::remu#3 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::remu#3 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 ] )
[78] (word) divr16u::rem#3 ← (word) divr16s::remu#3 [ divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] )
[79] call divr16u [ divr16s::neg#4 divr16u::return#0 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::return#0 ] )
[80] (word) divr16u::return#2 ← (word) divr16u::return#0 [ divr16s::neg#4 divr16u::return#2 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::return#2 ] )
to:divr16s::@15
divr16s::@15: scope:[divr16s] from divr16s::@4
[82] (word) divr16s::resultu#0 ← (word) divr16u::return#2 [ divr16u::rem#10 divr16s::neg#4 divr16s::resultu#0 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 divr16s::neg#4 divr16s::resultu#0 ] )
[83] if((byte) divr16s::neg#4==(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16s::@19 [ divr16u::rem#10 divr16s::resultu#0 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 divr16s::resultu#0 ] )
[81] (word) divr16s::resultu#0 ← (word) divr16u::return#2 [ divr16s::neg#4 divr16s::resultu#0 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16s::resultu#0 ] )
[82] if((byte) divr16s::neg#4==(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16s::@19 [ divr16s::resultu#0 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::resultu#0 ] )
to:divr16s::@11
divr16s::@11: scope:[divr16s] from divr16s::@15
[84] (signed word) rem16s#2 ← - (signed word)(word) divr16u::rem#10 [ divr16u::rem#10 divr16s::resultu#0 rem16s#2 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 divr16s::resultu#0 rem16s#2 ] )
[85] (signed word) divr16s::return#1 ← - (signed word)(word) divr16s::resultu#0 [ divr16u::rem#10 rem16s#2 divr16s::return#1 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#2 divr16s::return#1 ] )
[83] (signed word) divr16s::return#1 ← - (signed word)(word) divr16s::resultu#0 [ divr16s::return#1 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#1 ] )
to:divr16s::@return
divr16s::@return: scope:[divr16s] from divr16s::@11 divr16s::@19
[86] (signed word) rem16s#3 ← phi( divr16s::@11/(signed word) rem16s#2 divr16s::@19/(signed word~) rem16s#57 ) [ divr16u::rem#10 rem16s#3 divr16s::return#2 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 divr16s::return#2 ] )
[86] (signed word) divr16s::return#2 ← phi( divr16s::@11/(signed word) divr16s::return#1 divr16s::@19/(signed word~) divr16s::return#7 ) [ divr16u::rem#10 rem16s#3 divr16s::return#2 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 divr16s::return#2 ] )
[87] return [ divr16u::rem#10 rem16s#3 divr16s::return#2 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 rem16s#3 divr16s::return#2 ] )
[84] (signed word) divr16s::return#2 ← phi( divr16s::@11/(signed word) divr16s::return#1 divr16s::@19/(signed word~) divr16s::return#7 ) [ divr16s::return#2 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#2 ] )
[85] return [ divr16s::return#2 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#2 ] )
to:@return
divr16s::@19: scope:[divr16s] from divr16s::@15
[88] (signed word~) divr16s::return#7 ← (signed word)(word) divr16s::resultu#0 [ divr16u::rem#10 divr16s::return#7 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 divr16s::return#7 ] )
[89] (signed word~) rem16s#57 ← (signed word)(word) divr16u::rem#10 [ divr16u::rem#10 divr16s::return#7 rem16s#57 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16u::rem#10 divr16s::return#7 rem16s#57 ] )
[86] (signed word~) divr16s::return#7 ← (signed word)(word) divr16s::resultu#0 [ divr16s::return#7 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::return#7 ] )
to:divr16s::@return
divr16s::@3: scope:[divr16s] from divr16s::@2
[90] (signed word~) divr16s::$11 ← - (signed word) divr16s::divisor#0 [ divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::$11 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::$11 ] )
[91] (byte) divr16s::neg#2 ← (byte) divr16s::neg#3 ^ (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16s::dividendu#3 divr16s::remu#3 divr16s::neg#2 divr16s::$11 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::neg#2 divr16s::$11 ] )
[92] (word~) divr16s::divisoru#4 ← (word)(signed word~) divr16s::$11 [ divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#4 divr16s::neg#2 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#4 divr16s::neg#2 ] )
[87] (signed word~) divr16s::$11 ← - (signed word) divr16s::divisor#0 [ divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::$11 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#3 divr16s::dividendu#3 divr16s::remu#3 divr16s::$11 ] )
[88] (byte) divr16s::neg#2 ← (byte) divr16s::neg#3 ^ (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16s::dividendu#3 divr16s::remu#3 divr16s::neg#2 divr16s::$11 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::neg#2 divr16s::$11 ] )
[89] (word~) divr16s::divisoru#4 ← (word)(signed word~) divr16s::$11 [ divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#4 divr16s::neg#2 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::dividendu#3 divr16s::remu#3 divr16s::divisoru#4 divr16s::neg#2 ] )
to:divr16s::@4
divr16s::@1: scope:[divr16s] from divr16s::@16
[93] (signed word~) divr16s::$7 ← - (signed word) divr16s::rem#0 [ divr16s::divisor#0 divr16s::$7 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::$7 ] )
[94] (word~) divr16s::remu#7 ← (word)(signed word~) divr16s::$7 [ divr16s::divisor#0 divr16s::remu#7 ] ( main:2::point_init:20::divr16s:59 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::remu#7 ] )
[90] (signed word~) divr16s::$7 ← - (signed word) divr16s::rem#0 [ divr16s::divisor#0 divr16s::$7 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::$7 ] )
[91] (word~) divr16s::remu#7 ← (word)(signed word~) divr16s::$7 [ divr16s::divisor#0 divr16s::remu#7 ] ( main:2::point_init:20::divr16s:58 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::divisor#0 divr16s::remu#7 ] )
to:divr16s::@2
divr16u: scope:[divr16u] from divr16s::@4
[95] phi() [ divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] )
[92] phi() [ divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::dividend#1 divr16u::divisor#0 divr16u::rem#3 ] )
to:divr16u::@1
divr16u::@1: scope:[divr16u] from divr16u divr16u::@3
[96] (byte) divr16u::i#2 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(byte) divr16u::i#1 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[96] (word) divr16u::quotient#3 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::return#0 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[96] (word) divr16u::dividend#2 ← phi( divr16u/(word) divr16u::dividend#1 divr16u::@3/(word) divr16u::dividend#0 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[96] (word) divr16u::rem#4 ← phi( divr16u/(word) divr16u::rem#3 divr16u::@3/(word) divr16u::rem#10 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[97] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] )
[98] (byte~) divr16u::$1 ← > (word) divr16u::dividend#2 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] )
[99] (byte~) divr16u::$2 ← (byte~) divr16u::$1 & (byte/word/signed word/dword/signed dword) 128 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] )
[100] if((byte~) divr16u::$2==(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16u::@2 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] )
[93] (byte) divr16u::i#2 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(byte) divr16u::i#1 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[93] (word) divr16u::quotient#3 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::return#0 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[93] (word) divr16u::dividend#2 ← phi( divr16u/(word) divr16u::dividend#1 divr16u::@3/(word) divr16u::dividend#0 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[93] (word) divr16u::rem#4 ← phi( divr16u/(word) divr16u::rem#3 divr16u::@3/(word) divr16u::rem#9 ) [ divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[94] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] )
[95] (byte~) divr16u::$1 ← > (word) divr16u::dividend#2 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] )
[96] (byte~) divr16u::$2 ← (byte~) divr16u::$1 & (byte/word/signed word/dword/signed dword) 128 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] )
[97] if((byte~) divr16u::$2==(byte/signed byte/word/signed word/dword/signed dword) 0) goto divr16u::@2 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] )
to:divr16u::@4
divr16u::@4: scope:[divr16u] from divr16u::@1
[101] (word) divr16u::rem#1 ← (word) divr16u::rem#0 | (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#1 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#1 ] )
[98] (word) divr16u::rem#1 ← (word) divr16u::rem#0 | (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#1 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#1 ] )
to:divr16u::@2
divr16u::@2: scope:[divr16u] from divr16u::@1 divr16u::@4
[102] (word) divr16u::rem#5 ← phi( divr16u::@1/(word) divr16u::rem#0 divr16u::@4/(word) divr16u::rem#1 ) [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#5 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#5 ] )
[103] (word) divr16u::dividend#0 ← (word) divr16u::dividend#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::quotient#3 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::quotient#3 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 ] )
[104] (word) divr16u::quotient#1 ← (word) divr16u::quotient#3 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] )
[105] if((word) divr16u::rem#5<(word) divr16u::divisor#0) goto divr16u::@3 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] )
[99] (word) divr16u::rem#5 ← phi( divr16u::@1/(word) divr16u::rem#0 divr16u::@4/(word) divr16u::rem#1 ) [ divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#5 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#5 ] )
[100] (word) divr16u::dividend#0 ← (word) divr16u::dividend#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::quotient#3 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::quotient#3 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 ] )
[101] (word) divr16u::quotient#1 ← (word) divr16u::quotient#3 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] )
[102] if((word) divr16u::rem#5<(word) divr16u::divisor#0) goto divr16u::@3 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#1 ] )
to:divr16u::@5
divr16u::@5: scope:[divr16u] from divr16u::@2
[106] (word) divr16u::quotient#2 ← ++ (word) divr16u::quotient#1 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#2 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#2 ] )
[107] (word) divr16u::rem#2 ← (word) divr16u::rem#5 - (word) divr16u::divisor#0 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] )
[103] (word) divr16u::quotient#2 ← ++ (word) divr16u::quotient#1 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#2 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::rem#5 divr16u::quotient#2 ] )
[104] (word) divr16u::rem#2 ← (word) divr16u::rem#5 - (word) divr16u::divisor#0 [ divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] )
to:divr16u::@3
divr16u::@3: scope:[divr16u] from divr16u::@2 divr16u::@5
[108] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::dividend#0 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::dividend#0 ] )
[108] (word) divr16u::rem#10 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::dividend#0 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::dividend#0 ] )
[109] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::dividend#0 divr16u::i#1 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::dividend#0 divr16u::i#1 ] )
[110] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::dividend#0 divr16u::i#1 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::rem#10 divr16u::divisor#0 divr16u::return#0 divr16u::dividend#0 divr16u::i#1 ] )
[105] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[105] (word) divr16u::rem#9 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[106] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::divisor#0 divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
[107] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::divisor#0 divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::divisor#0 divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
to:divr16u::@return
divr16u::@return: scope:[divr16u] from divr16u::@3
[111] return [ divr16u::rem#10 divr16u::return#0 ] ( main:2::point_init:20::divr16s:59::divr16u:80 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::rem#10 divr16u::return#0 ] )
[108] return [ divr16u::return#0 ] ( main:2::point_init:20::divr16s:58::divr16u:79 [ main::i#2 point_init::point_idx#0 point_init::point_idx1#0 divr16s::neg#4 divr16u::return#0 ] )
to:@return
screen_fill: scope:[screen_fill] from main::@18
[112] phi() [ ] ( main:2::screen_fill:17 [ ] )
[109] phi() [ ] ( main:2::screen_fill:17 [ ] )
to:screen_fill::@1
screen_fill::@1: scope:[screen_fill] from screen_fill screen_fill::@3
[113] (byte) screen_fill::y#4 ← phi( screen_fill/(byte/signed byte/word/signed word/dword/signed dword) 0 screen_fill::@3/(byte) screen_fill::y#1 ) [ screen_fill::screen#3 screen_fill::y#4 ] ( main:2::screen_fill:17 [ screen_fill::screen#3 screen_fill::y#4 ] )
[113] (byte*) screen_fill::screen#3 ← phi( screen_fill/(const byte*) SCREEN#0 screen_fill::@3/(byte*) screen_fill::screen#1 ) [ screen_fill::screen#3 screen_fill::y#4 ] ( main:2::screen_fill:17 [ screen_fill::screen#3 screen_fill::y#4 ] )
[110] (byte) screen_fill::y#4 ← phi( screen_fill/(byte/signed byte/word/signed word/dword/signed dword) 0 screen_fill::@3/(byte) screen_fill::y#1 ) [ screen_fill::screen#3 screen_fill::y#4 ] ( main:2::screen_fill:17 [ screen_fill::screen#3 screen_fill::y#4 ] )
[110] (byte*) screen_fill::screen#3 ← phi( screen_fill/(const byte*) SCREEN#0 screen_fill::@3/(byte*) screen_fill::screen#1 ) [ screen_fill::screen#3 screen_fill::y#4 ] ( main:2::screen_fill:17 [ screen_fill::screen#3 screen_fill::y#4 ] )
to:screen_fill::@2
screen_fill::@2: scope:[screen_fill] from screen_fill::@1 screen_fill::@2
[114] (byte) screen_fill::x#2 ← phi( screen_fill::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 screen_fill::@2/(byte) screen_fill::x#1 ) [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] )
[114] (byte*) screen_fill::screen#2 ← phi( screen_fill::@1/(byte*) screen_fill::screen#3 screen_fill::@2/(byte*) screen_fill::screen#1 ) [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] )
[115] *((byte*) screen_fill::screen#2) ← (const byte) screen_fill::ch#0 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] )
[116] (byte*) screen_fill::screen#1 ← ++ (byte*) screen_fill::screen#2 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#2 ] )
[117] (byte) screen_fill::x#1 ← ++ (byte) screen_fill::x#2 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] )
[118] if((byte) screen_fill::x#1!=(byte/signed byte/word/signed word/dword/signed dword) 40) goto screen_fill::@2 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] )
[111] (byte) screen_fill::x#2 ← phi( screen_fill::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 screen_fill::@2/(byte) screen_fill::x#1 ) [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] )
[111] (byte*) screen_fill::screen#2 ← phi( screen_fill::@1/(byte*) screen_fill::screen#3 screen_fill::@2/(byte*) screen_fill::screen#1 ) [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] )
[112] *((byte*) screen_fill::screen#2) ← (const byte) screen_fill::ch#0 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#2 screen_fill::x#2 ] )
[113] (byte*) screen_fill::screen#1 ← ++ (byte*) screen_fill::screen#2 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#2 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#2 ] )
[114] (byte) screen_fill::x#1 ← ++ (byte) screen_fill::x#2 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] )
[115] if((byte) screen_fill::x#1!=(byte/signed byte/word/signed word/dword/signed dword) 40) goto screen_fill::@2 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] ( main:2::screen_fill:17 [ screen_fill::y#4 screen_fill::screen#1 screen_fill::x#1 ] )
to:screen_fill::@3
screen_fill::@3: scope:[screen_fill] from screen_fill::@2
[119] (byte) screen_fill::y#1 ← ++ (byte) screen_fill::y#4 [ screen_fill::screen#1 screen_fill::y#1 ] ( main:2::screen_fill:17 [ screen_fill::screen#1 screen_fill::y#1 ] )
[120] if((byte) screen_fill::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 25) goto screen_fill::@1 [ screen_fill::screen#1 screen_fill::y#1 ] ( main:2::screen_fill:17 [ screen_fill::screen#1 screen_fill::y#1 ] )
[116] (byte) screen_fill::y#1 ← ++ (byte) screen_fill::y#4 [ screen_fill::screen#1 screen_fill::y#1 ] ( main:2::screen_fill:17 [ screen_fill::screen#1 screen_fill::y#1 ] )
[117] if((byte) screen_fill::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 25) goto screen_fill::@1 [ screen_fill::screen#1 screen_fill::y#1 ] ( main:2::screen_fill:17 [ screen_fill::screen#1 screen_fill::y#1 ] )
to:screen_fill::@return
screen_fill::@return: scope:[screen_fill] from screen_fill::@3
[121] return [ ] ( main:2::screen_fill:17 [ ] )
[118] return [ ] ( main:2::screen_fill:17 [ ] )
to:@return
bitmap_clear: scope:[bitmap_clear] from main::@17
[122] (word~) bitmap_clear::$3 ← *((const byte[256]) bitmap_plot_yhi#0+(byte/signed byte/word/signed word/dword/signed dword) 0) w= *((const byte[256]) bitmap_plot_ylo#0+(byte/signed byte/word/signed word/dword/signed dword) 0) [ bitmap_clear::$3 ] ( main:2::bitmap_clear:15 [ bitmap_clear::$3 ] )
[123] (byte*~) bitmap_clear::bitmap#5 ← (byte*)(word~) bitmap_clear::$3 [ bitmap_clear::bitmap#5 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#5 ] )
[119] (word~) bitmap_clear::$3 ← *((const byte[256]) bitmap_plot_yhi#0+(byte/signed byte/word/signed word/dword/signed dword) 0) w= *((const byte[256]) bitmap_plot_ylo#0+(byte/signed byte/word/signed word/dword/signed dword) 0) [ bitmap_clear::$3 ] ( main:2::bitmap_clear:15 [ bitmap_clear::$3 ] )
[120] (byte*~) bitmap_clear::bitmap#5 ← (byte*)(word~) bitmap_clear::$3 [ bitmap_clear::bitmap#5 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#5 ] )
to:bitmap_clear::@1
bitmap_clear::@1: scope:[bitmap_clear] from bitmap_clear bitmap_clear::@3
[124] (byte) bitmap_clear::y#4 ← phi( bitmap_clear/(byte/signed byte/word/signed word/dword/signed dword) 0 bitmap_clear::@3/(byte) bitmap_clear::y#1 ) [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] )
[124] (byte*) bitmap_clear::bitmap#3 ← phi( bitmap_clear/(byte*~) bitmap_clear::bitmap#5 bitmap_clear::@3/(byte*) bitmap_clear::bitmap#1 ) [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] )
[121] (byte) bitmap_clear::y#4 ← phi( bitmap_clear/(byte/signed byte/word/signed word/dword/signed dword) 0 bitmap_clear::@3/(byte) bitmap_clear::y#1 ) [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] )
[121] (byte*) bitmap_clear::bitmap#3 ← phi( bitmap_clear/(byte*~) bitmap_clear::bitmap#5 bitmap_clear::@3/(byte*) bitmap_clear::bitmap#1 ) [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#3 bitmap_clear::y#4 ] )
to:bitmap_clear::@2
bitmap_clear::@2: scope:[bitmap_clear] from bitmap_clear::@1 bitmap_clear::@2
[125] (byte) bitmap_clear::x#2 ← phi( bitmap_clear::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 bitmap_clear::@2/(byte) bitmap_clear::x#1 ) [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] )
[125] (byte*) bitmap_clear::bitmap#2 ← phi( bitmap_clear::@1/(byte*) bitmap_clear::bitmap#3 bitmap_clear::@2/(byte*) bitmap_clear::bitmap#1 ) [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] )
[126] *((byte*) bitmap_clear::bitmap#2) ← (byte/signed byte/word/signed word/dword/signed dword) 0 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] )
[127] (byte*) bitmap_clear::bitmap#1 ← ++ (byte*) bitmap_clear::bitmap#2 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#2 ] )
[128] (byte) bitmap_clear::x#1 ← ++ (byte) bitmap_clear::x#2 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] )
[129] if((byte) bitmap_clear::x#1!=(byte/word/signed word/dword/signed dword) 200) goto bitmap_clear::@2 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] )
[122] (byte) bitmap_clear::x#2 ← phi( bitmap_clear::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 bitmap_clear::@2/(byte) bitmap_clear::x#1 ) [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] )
[122] (byte*) bitmap_clear::bitmap#2 ← phi( bitmap_clear::@1/(byte*) bitmap_clear::bitmap#3 bitmap_clear::@2/(byte*) bitmap_clear::bitmap#1 ) [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] )
[123] *((byte*) bitmap_clear::bitmap#2) ← (byte/signed byte/word/signed word/dword/signed dword) 0 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#2 bitmap_clear::x#2 ] )
[124] (byte*) bitmap_clear::bitmap#1 ← ++ (byte*) bitmap_clear::bitmap#2 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#2 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#2 ] )
[125] (byte) bitmap_clear::x#1 ← ++ (byte) bitmap_clear::x#2 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] )
[126] if((byte) bitmap_clear::x#1!=(byte/word/signed word/dword/signed dword) 200) goto bitmap_clear::@2 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::y#4 bitmap_clear::bitmap#1 bitmap_clear::x#1 ] )
to:bitmap_clear::@3
bitmap_clear::@3: scope:[bitmap_clear] from bitmap_clear::@2
[130] (byte) bitmap_clear::y#1 ← ++ (byte) bitmap_clear::y#4 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] )
[131] if((byte) bitmap_clear::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 40) goto bitmap_clear::@1 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] )
[127] (byte) bitmap_clear::y#1 ← ++ (byte) bitmap_clear::y#4 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] )
[128] if((byte) bitmap_clear::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 40) goto bitmap_clear::@1 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] ( main:2::bitmap_clear:15 [ bitmap_clear::bitmap#1 bitmap_clear::y#1 ] )
to:bitmap_clear::@return
bitmap_clear::@return: scope:[bitmap_clear] from bitmap_clear::@3
[132] return [ ] ( main:2::bitmap_clear:15 [ ] )
[129] return [ ] ( main:2::bitmap_clear:15 [ ] )
to:@return
bitmap_init: scope:[bitmap_init] from main::@16
[133] phi() [ ] ( main:2::bitmap_init:13 [ ] )
[130] phi() [ ] ( main:2::bitmap_init:13 [ ] )
to:bitmap_init::@1
bitmap_init::@1: scope:[bitmap_init] from bitmap_init bitmap_init::@2
[134] (byte) bitmap_init::x#2 ← phi( bitmap_init/(byte/signed byte/word/signed word/dword/signed dword) 0 bitmap_init::@2/(byte) bitmap_init::x#1 ) [ bitmap_init::bits#3 bitmap_init::x#2 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#3 bitmap_init::x#2 ] )
[134] (byte) bitmap_init::bits#3 ← phi( bitmap_init/(byte/word/signed word/dword/signed dword) 128 bitmap_init::@2/(byte) bitmap_init::bits#4 ) [ bitmap_init::bits#3 bitmap_init::x#2 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#3 bitmap_init::x#2 ] )
[135] *((const byte[256]) bitmap_plot_bit#0 + (byte) bitmap_init::x#2) ← (byte) bitmap_init::bits#3 [ bitmap_init::bits#3 bitmap_init::x#2 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#3 bitmap_init::x#2 ] )
[136] (byte) bitmap_init::bits#1 ← (byte) bitmap_init::bits#3 >> (byte/signed byte/word/signed word/dword/signed dword) 1 [ bitmap_init::x#2 bitmap_init::bits#1 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#1 ] )
[137] if((byte) bitmap_init::bits#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto bitmap_init::@10 [ bitmap_init::x#2 bitmap_init::bits#1 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#1 ] )
[131] (byte) bitmap_init::x#2 ← phi( bitmap_init/(byte/signed byte/word/signed word/dword/signed dword) 0 bitmap_init::@2/(byte) bitmap_init::x#1 ) [ bitmap_init::bits#3 bitmap_init::x#2 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#3 bitmap_init::x#2 ] )
[131] (byte) bitmap_init::bits#3 ← phi( bitmap_init/(byte/word/signed word/dword/signed dword) 128 bitmap_init::@2/(byte) bitmap_init::bits#4 ) [ bitmap_init::bits#3 bitmap_init::x#2 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#3 bitmap_init::x#2 ] )
[132] *((const byte[256]) bitmap_plot_bit#0 + (byte) bitmap_init::x#2) ← (byte) bitmap_init::bits#3 [ bitmap_init::bits#3 bitmap_init::x#2 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#3 bitmap_init::x#2 ] )
[133] (byte) bitmap_init::bits#1 ← (byte) bitmap_init::bits#3 >> (byte/signed byte/word/signed word/dword/signed dword) 1 [ bitmap_init::x#2 bitmap_init::bits#1 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#1 ] )
[134] if((byte) bitmap_init::bits#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto bitmap_init::@10 [ bitmap_init::x#2 bitmap_init::bits#1 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#1 ] )
to:bitmap_init::@2
bitmap_init::@2: scope:[bitmap_init] from bitmap_init::@1 bitmap_init::@10
[138] (byte) bitmap_init::bits#4 ← phi( bitmap_init::@10/(byte) bitmap_init::bits#1 bitmap_init::@1/(byte/word/signed word/dword/signed dword) 128 ) [ bitmap_init::x#2 bitmap_init::bits#4 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#4 ] )
[139] (byte) bitmap_init::x#1 ← ++ (byte) bitmap_init::x#2 [ bitmap_init::bits#4 bitmap_init::x#1 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#4 bitmap_init::x#1 ] )
[140] if((byte) bitmap_init::x#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto bitmap_init::@1 [ bitmap_init::bits#4 bitmap_init::x#1 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#4 bitmap_init::x#1 ] )
[135] (byte) bitmap_init::bits#4 ← phi( bitmap_init::@10/(byte) bitmap_init::bits#1 bitmap_init::@1/(byte/word/signed word/dword/signed dword) 128 ) [ bitmap_init::x#2 bitmap_init::bits#4 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#4 ] )
[136] (byte) bitmap_init::x#1 ← ++ (byte) bitmap_init::x#2 [ bitmap_init::bits#4 bitmap_init::x#1 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#4 bitmap_init::x#1 ] )
[137] if((byte) bitmap_init::x#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto bitmap_init::@1 [ bitmap_init::bits#4 bitmap_init::x#1 ] ( main:2::bitmap_init:13 [ bitmap_init::bits#4 bitmap_init::x#1 ] )
to:bitmap_init::@3
bitmap_init::@3: scope:[bitmap_init] from bitmap_init::@2 bitmap_init::@4
[141] (byte*) bitmap_init::yoffs#2 ← phi( bitmap_init::@4/(byte*) bitmap_init::yoffs#4 bitmap_init::@2/(const byte*) BITMAP#0 ) [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] )
[141] (byte) bitmap_init::y#2 ← phi( bitmap_init::@4/(byte) bitmap_init::y#1 bitmap_init::@2/(byte/signed byte/word/signed word/dword/signed dword) 0 ) [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] )
[142] (byte~) bitmap_init::$3 ← (byte) bitmap_init::y#2 & (byte/signed byte/word/signed word/dword/signed dword) 7 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 ] )
[143] (byte~) bitmap_init::$4 ← < (byte*) bitmap_init::yoffs#2 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 bitmap_init::$4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 bitmap_init::$4 ] )
[144] (byte~) bitmap_init::$5 ← (byte~) bitmap_init::$3 | (byte~) bitmap_init::$4 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$5 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$5 ] )
[145] *((const byte[256]) bitmap_plot_ylo#0 + (byte) bitmap_init::y#2) ← (byte~) bitmap_init::$5 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] )
[146] (byte~) bitmap_init::$6 ← > (byte*) bitmap_init::yoffs#2 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$6 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$6 ] )
[147] *((const byte[256]) bitmap_plot_yhi#0 + (byte) bitmap_init::y#2) ← (byte~) bitmap_init::$6 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] )
[148] (byte~) bitmap_init::$7 ← (byte) bitmap_init::y#2 & (byte/signed byte/word/signed word/dword/signed dword) 7 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$7 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$7 ] )
[149] if((byte~) bitmap_init::$7!=(byte/signed byte/word/signed word/dword/signed dword) 7) goto bitmap_init::@4 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] )
[138] (byte*) bitmap_init::yoffs#2 ← phi( bitmap_init::@4/(byte*) bitmap_init::yoffs#4 bitmap_init::@2/(const byte*) BITMAP#0 ) [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] )
[138] (byte) bitmap_init::y#2 ← phi( bitmap_init::@4/(byte) bitmap_init::y#1 bitmap_init::@2/(byte/signed byte/word/signed word/dword/signed dword) 0 ) [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] )
[139] (byte~) bitmap_init::$3 ← (byte) bitmap_init::y#2 & (byte/signed byte/word/signed word/dword/signed dword) 7 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 ] )
[140] (byte~) bitmap_init::$4 ← < (byte*) bitmap_init::yoffs#2 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 bitmap_init::$4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$3 bitmap_init::$4 ] )
[141] (byte~) bitmap_init::$5 ← (byte~) bitmap_init::$3 | (byte~) bitmap_init::$4 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$5 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$5 ] )
[142] *((const byte[256]) bitmap_plot_ylo#0 + (byte) bitmap_init::y#2) ← (byte~) bitmap_init::$5 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] )
[143] (byte~) bitmap_init::$6 ← > (byte*) bitmap_init::yoffs#2 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$6 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$6 ] )
[144] *((const byte[256]) bitmap_plot_yhi#0 + (byte) bitmap_init::y#2) ← (byte~) bitmap_init::$6 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] )
[145] (byte~) bitmap_init::$7 ← (byte) bitmap_init::y#2 & (byte/signed byte/word/signed word/dword/signed dword) 7 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$7 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$7 ] )
[146] if((byte~) bitmap_init::$7!=(byte/signed byte/word/signed word/dword/signed dword) 7) goto bitmap_init::@4 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#2 ] )
to:bitmap_init::@7
bitmap_init::@7: scope:[bitmap_init] from bitmap_init::@3
[150] (byte*) bitmap_init::yoffs#1 ← (byte*) bitmap_init::yoffs#2 + (byte/signed byte/word/signed word/dword/signed dword) 40*(byte/signed byte/word/signed word/dword/signed dword) 8 [ bitmap_init::y#2 bitmap_init::yoffs#1 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#1 ] )
[147] (byte*) bitmap_init::yoffs#1 ← (byte*) bitmap_init::yoffs#2 + (byte/signed byte/word/signed word/dword/signed dword) 40*(byte/signed byte/word/signed word/dword/signed dword) 8 [ bitmap_init::y#2 bitmap_init::yoffs#1 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#1 ] )
to:bitmap_init::@4
bitmap_init::@4: scope:[bitmap_init] from bitmap_init::@3 bitmap_init::@7
[151] (byte*) bitmap_init::yoffs#4 ← phi( bitmap_init::@3/(byte*) bitmap_init::yoffs#2 bitmap_init::@7/(byte*) bitmap_init::yoffs#1 ) [ bitmap_init::y#2 bitmap_init::yoffs#4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#4 ] )
[152] (byte) bitmap_init::y#1 ← ++ (byte) bitmap_init::y#2 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] )
[153] if((byte) bitmap_init::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto bitmap_init::@3 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] )
[148] (byte*) bitmap_init::yoffs#4 ← phi( bitmap_init::@3/(byte*) bitmap_init::yoffs#2 bitmap_init::@7/(byte*) bitmap_init::yoffs#1 ) [ bitmap_init::y#2 bitmap_init::yoffs#4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#2 bitmap_init::yoffs#4 ] )
[149] (byte) bitmap_init::y#1 ← ++ (byte) bitmap_init::y#2 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] )
[150] if((byte) bitmap_init::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto bitmap_init::@3 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] ( main:2::bitmap_init:13 [ bitmap_init::y#1 bitmap_init::yoffs#4 ] )
to:bitmap_init::@return
bitmap_init::@return: scope:[bitmap_init] from bitmap_init::@4
[154] return [ ] ( main:2::bitmap_init:13 [ ] )
[151] return [ ] ( main:2::bitmap_init:13 [ ] )
to:@return
bitmap_init::@10: scope:[bitmap_init] from bitmap_init::@1
[155] phi() [ bitmap_init::x#2 bitmap_init::bits#1 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#1 ] )
[152] phi() [ bitmap_init::x#2 bitmap_init::bits#1 ] ( main:2::bitmap_init:13 [ bitmap_init::x#2 bitmap_init::bits#1 ] )
to:bitmap_init::@2

File diff suppressed because it is too large Load Diff

View File

@ -79,14 +79,14 @@
(byte*) bitmap_init::yoffs#2 yoffs zp ZP_WORD:3 6.111111111111112
(byte*) bitmap_init::yoffs#4 yoffs zp ZP_WORD:3 11.0
(void()) bitmap_plot((word) bitmap_plot::x , (byte) bitmap_plot::y)
(word~) bitmap_plot::$1 $1 zp ZP_WORD:11 4.0
(word~) bitmap_plot::$1 $1 zp ZP_WORD:7 4.0
(byte~) bitmap_plot::$2 reg byte a 4.0
(word~) bitmap_plot::$3 $3 zp ZP_WORD:7 1.0
(word~) bitmap_plot::$3 $3 zp ZP_WORD:5 1.0
(label) bitmap_plot::@return
(byte*) bitmap_plot::plotter
(byte*) bitmap_plot::plotter#1 plotter zp ZP_WORD:7 3.0
(byte*) bitmap_plot::plotter#1 plotter zp ZP_WORD:5 3.0
(word) bitmap_plot::x
(word) bitmap_plot::x#0 x zp ZP_WORD:5 3.0
(word) bitmap_plot::x#0 x zp ZP_WORD:3 3.0
(byte) bitmap_plot::y
(byte) bitmap_plot::y#0 reg byte y 15.0
(byte[256]) bitmap_plot_bit
@ -98,8 +98,8 @@
(byte[4]) delay
(const byte[4]) delay#0 delay = { fill( 4, 0) }
(signed word()) divr16s((signed word) divr16s::dividend , (signed word) divr16s::divisor , (signed word) divr16s::rem)
(signed word~) divr16s::$11 $11 zp ZP_WORD:11 1.0
(signed word~) divr16s::$7 $7 zp ZP_WORD:9 2.0
(signed word~) divr16s::$11 $11 zp ZP_WORD:9 1.0
(signed word~) divr16s::$7 $7 zp ZP_WORD:7 2.0
(label) divr16s::@1
(label) divr16s::@11
(label) divr16s::@15
@ -116,28 +116,28 @@
(word) divr16s::dividendu
(word) divr16s::dividendu#3 dividendu zp ZP_WORD:3 0.2857142857142857
(signed word) divr16s::divisor
(signed word) divr16s::divisor#0 divisor zp ZP_WORD:11 0.6666666666666666
(signed word) divr16s::divisor#0 divisor zp ZP_WORD:9 0.6666666666666666
(word) divr16s::divisoru
(word) divr16s::divisoru#3 divisoru zp ZP_WORD:11 3.0
(word~) divr16s::divisoru#4 divisoru zp ZP_WORD:11 4.0
(word~) divr16s::divisoru#5 divisoru zp ZP_WORD:11 4.0
(word) divr16s::divisoru#3 divisoru zp ZP_WORD:9 3.0
(word~) divr16s::divisoru#4 divisoru zp ZP_WORD:9 4.0
(word~) divr16s::divisoru#5 divisoru zp ZP_WORD:9 4.0
(byte) divr16s::neg
(byte) divr16s::neg#2 reg byte y 2.0
(byte) divr16s::neg#3 reg byte y 1.0
(byte) divr16s::neg#4 reg byte y 0.8571428571428571
(signed word) divr16s::rem
(signed word) divr16s::rem#0 rem zp ZP_WORD:9 2.0
(signed word) divr16s::rem#0 rem zp ZP_WORD:7 2.0
(word) divr16s::remu
(word) divr16s::remu#3 remu zp ZP_WORD:9 0.6666666666666666
(word~) divr16s::remu#7 remu zp ZP_WORD:9 4.0
(word~) divr16s::remu#8 remu zp ZP_WORD:9 4.0
(word) divr16s::remu#3 remu zp ZP_WORD:7 0.6666666666666666
(word~) divr16s::remu#7 remu zp ZP_WORD:7 4.0
(word~) divr16s::remu#8 remu zp ZP_WORD:7 4.0
(word) divr16s::resultu
(word) divr16s::resultu#0 resultu zp ZP_WORD:5 0.6666666666666666
(word) divr16s::resultu#0 resultu zp ZP_WORD:5 1.0
(signed word) divr16s::return
(signed word) divr16s::return#1 return zp ZP_WORD:5 4.0
(signed word) divr16s::return#2 return zp ZP_WORD:5 2.0
(signed word) divr16s::return#3 return zp ZP_WORD:5 4.0
(signed word~) divr16s::return#7 return zp ZP_WORD:5 2.0
(signed word~) divr16s::return#7 return zp ZP_WORD:5 4.0
(word()) divr16u((word) divr16u::dividend , (word) divr16u::divisor , (word) divr16u::rem)
(byte~) divr16u::$1 reg byte a 202.0
(byte~) divr16u::$2 reg byte a 202.0
@ -152,7 +152,7 @@
(word) divr16u::dividend#1 dividend zp ZP_WORD:3 1.0
(word) divr16u::dividend#2 dividend zp ZP_WORD:3 43.57142857142858
(word) divr16u::divisor
(word) divr16u::divisor#0 divisor zp ZP_WORD:11 11.333333333333332
(word) divr16u::divisor#0 divisor zp ZP_WORD:9 11.333333333333332
(byte) divr16u::i
(byte) divr16u::i#1 reg byte x 151.5
(byte) divr16u::i#2 reg byte x 15.538461538461538
@ -161,13 +161,13 @@
(word) divr16u::quotient#2 quotient zp ZP_WORD:5 101.0
(word) divr16u::quotient#3 quotient zp ZP_WORD:5 25.25
(word) divr16u::rem
(word) divr16u::rem#0 rem zp ZP_WORD:9 75.75
(word) divr16u::rem#1 rem zp ZP_WORD:9 202.0
(word) divr16u::rem#10 rem zp ZP_WORD:9 15.25
(word) divr16u::rem#2 rem zp ZP_WORD:9 202.0
(word) divr16u::rem#3 rem zp ZP_WORD:9 2.0
(word) divr16u::rem#4 rem zp ZP_WORD:9 204.0
(word) divr16u::rem#5 rem zp ZP_WORD:9 101.0
(word) divr16u::rem#0 rem zp ZP_WORD:7 75.75
(word) divr16u::rem#1 rem zp ZP_WORD:7 202.0
(word) divr16u::rem#2 rem zp ZP_WORD:7 202.0
(word) divr16u::rem#3 rem zp ZP_WORD:7 2.0
(word) divr16u::rem#4 rem zp ZP_WORD:7 204.0
(word) divr16u::rem#5 rem zp ZP_WORD:7 101.0
(word) divr16u::rem#9 rem zp ZP_WORD:7 101.0
(word) divr16u::return
(word) divr16u::return#0 return zp ZP_WORD:5 61.0
(word) divr16u::return#2 return zp ZP_WORD:5 4.0
@ -213,11 +213,11 @@
(void()) point_init((byte) point_init::point_idx)
(byte~) point_init::$13 reg byte a 4.0
(byte~) point_init::$14 reg byte a 2.0
(word~) point_init::$16 $16 zp ZP_WORD:5 4.0
(word~) point_init::$17 $17 zp ZP_WORD:5 4.0
(word~) point_init::$18 $18 zp ZP_WORD:5 4.0
(signed word~) point_init::$4 $4 zp ZP_WORD:14 2.0
(signed word~) point_init::$5 $5 zp ZP_WORD:5 4.0
(word~) point_init::$16 $16 zp ZP_WORD:3 4.0
(word~) point_init::$17 $17 zp ZP_WORD:3 4.0
(word~) point_init::$18 $18 zp ZP_WORD:3 4.0
(signed word~) point_init::$4 $4 zp ZP_WORD:7 2.0
(signed word~) point_init::$5 $5 zp ZP_WORD:3 4.0
(label) point_init::@1
(label) point_init::@10
(label) point_init::@11
@ -232,47 +232,38 @@
(bool~) point_init::abs16s1_$0
(word~) point_init::abs16s1_$1
(signed word~) point_init::abs16s1_$2
(signed word) point_init::abs16s1_$2#0 abs16s1_$2 zp ZP_WORD:5 2.0
(signed word) point_init::abs16s1_$2#0 abs16s1_$2 zp ZP_WORD:3 2.0
(word~) point_init::abs16s1_$3
(label) point_init::abs16s1_@1
(label) point_init::abs16s1_@return
(word) point_init::abs16s1_return
(word) point_init::abs16s1_return#2 abs16s1_return zp ZP_WORD:5 1.0
(word~) point_init::abs16s1_return#5 abs16s1_return zp ZP_WORD:5 4.0
(word~) point_init::abs16s1_return#6 abs16s1_return zp ZP_WORD:5 4.0
(word) point_init::abs16s1_return#2 abs16s1_return zp ZP_WORD:3 1.0
(word~) point_init::abs16s1_return#5 abs16s1_return zp ZP_WORD:3 4.0
(word~) point_init::abs16s1_return#6 abs16s1_return zp ZP_WORD:3 4.0
(signed word) point_init::abs16s1_w
(label) point_init::abs16s2
(bool~) point_init::abs16s2_$0
(word~) point_init::abs16s2_$1
(signed word~) point_init::abs16s2_$2
(signed word) point_init::abs16s2_$2#0 abs16s2_$2 zp ZP_WORD:7 2.0
(signed word) point_init::abs16s2_$2#0 abs16s2_$2 zp ZP_WORD:5 2.0
(word~) point_init::abs16s2_$3
(label) point_init::abs16s2_@1
(label) point_init::abs16s2_@return
(word) point_init::abs16s2_return
(word) point_init::abs16s2_return#2 abs16s2_return zp ZP_WORD:7 6.0
(word~) point_init::abs16s2_return#5 abs16s2_return zp ZP_WORD:7 4.0
(word~) point_init::abs16s2_return#6 abs16s2_return zp ZP_WORD:7 4.0
(word) point_init::abs16s2_return#2 abs16s2_return zp ZP_WORD:5 6.0
(word~) point_init::abs16s2_return#5 abs16s2_return zp ZP_WORD:5 4.0
(word~) point_init::abs16s2_return#6 abs16s2_return zp ZP_WORD:5 4.0
(signed word) point_init::abs16s2_w
(byte) point_init::point_idx
(byte) point_init::point_idx#0 point_idx zp ZP_BYTE:2 0.6969696969696968
(byte) point_init::point_idx#0 point_idx zp ZP_BYTE:2 0.71875
(byte) point_init::point_idx1
(byte) point_init::point_idx1#0 point_idx1 zp ZP_BYTE:13 0.36363636363636365
(byte) point_init::point_idx1#0 point_idx1 zp ZP_BYTE:11 0.375
(signed word) point_init::x_diff
(signed word) point_init::x_diff#1 x_diff zp ZP_WORD:11 0.5555555555555556
(signed word) point_init::x_diff#1 x_diff zp ZP_WORD:9 0.5555555555555556
(signed word) point_init::x_stepf
(signed word) point_init::x_stepf#0 x_stepf zp ZP_WORD:5 4.0
(signed word) point_init::y_diff
(signed word) point_init::y_diff#0 y_diff zp ZP_WORD:14 0.5
(signed word) rem16s
(signed word) rem16s#13 rem16s zp ZP_WORD:3 0.9999999999999999
(signed word) rem16s#15 rem16s zp ZP_WORD:3 0.7222222222222223
(signed word) rem16s#2 rem16s zp ZP_WORD:3 2.0
(signed word) rem16s#3 rem16s zp ZP_WORD:3 0.75
(signed word~) rem16s#57 rem16s zp ZP_WORD:3 4.0
(word) rem16u
(word) rem16u#18 rem16u zp ZP_WORD:9 0.9999999999999999
(word) rem16u#21 rem16u zp ZP_WORD:9 0.7222222222222223
(signed word) point_init::y_diff#0 y_diff zp ZP_WORD:7 0.5
(void()) screen_fill((byte*) screen_fill::screen , (byte) screen_fill::ch)
(label) screen_fill::@1
(label) screen_fill::@2
@ -308,11 +299,10 @@
(const byte[4]) y_start#0 y_start = { (byte/signed byte/word/signed word/dword/signed dword) 10, (byte/signed byte/word/signed word/dword/signed dword) 10, (byte/signed byte/word/signed word/dword/signed dword) 10, (byte/signed byte/word/signed word/dword/signed dword) 20 }
zp ZP_BYTE:2 [ main::i#2 main::i#1 point_init::point_idx#0 screen_fill::y#4 screen_fill::y#1 bitmap_clear::y#4 bitmap_clear::y#1 bitmap_init::$3 ]
zp ZP_WORD:3 [ rem16s#15 rem16s#13 rem16s#3 rem16s#2 rem16s#57 divr16s::dividendu#3 divr16u::dividend#2 divr16u::dividend#1 divr16u::dividend#0 screen_fill::screen#2 screen_fill::screen#3 screen_fill::screen#1 bitmap_clear::bitmap#2 bitmap_clear::bitmap#3 bitmap_clear::bitmap#5 bitmap_clear::bitmap#1 bitmap_clear::$3 bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 ]
zp ZP_WORD:5 [ point_init::abs16s1_return#2 point_init::abs16s1_return#5 point_init::abs16s1_return#6 point_init::abs16s1_$2#0 divr16s::return#2 divr16s::return#1 divr16s::return#7 divr16s::resultu#0 divr16s::return#3 divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 divr16u::return#2 point_init::x_stepf#0 bitmap_plot::x#0 point_init::$5 point_init::$16 point_init::$17 point_init::$18 ]
zp ZP_WORD:7 [ point_init::abs16s2_return#2 point_init::abs16s2_return#5 point_init::abs16s2_return#6 point_init::abs16s2_$2#0 bitmap_plot::$3 bitmap_plot::plotter#1 ]
zp ZP_WORD:9 [ divr16s::remu#3 divr16s::remu#7 divr16s::remu#8 divr16u::rem#4 divr16u::rem#3 rem16u#21 rem16u#18 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 divr16s::rem#0 divr16s::$7 ]
zp ZP_WORD:11 [ divr16s::divisoru#3 divr16s::divisoru#4 divr16s::divisoru#5 divr16s::divisor#0 divr16u::divisor#0 divr16s::$11 point_init::x_diff#1 bitmap_plot::$1 ]
zp ZP_WORD:3 [ point_init::abs16s1_return#2 point_init::abs16s1_return#5 point_init::abs16s1_return#6 point_init::abs16s1_$2#0 divr16s::dividendu#3 divr16u::dividend#2 divr16u::dividend#1 divr16u::dividend#0 screen_fill::screen#2 screen_fill::screen#3 screen_fill::screen#1 bitmap_clear::bitmap#2 bitmap_clear::bitmap#3 bitmap_clear::bitmap#5 bitmap_clear::bitmap#1 bitmap_clear::$3 bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 bitmap_plot::x#0 point_init::$5 point_init::$16 point_init::$17 point_init::$18 ]
zp ZP_WORD:5 [ point_init::abs16s2_return#2 point_init::abs16s2_return#5 point_init::abs16s2_return#6 point_init::abs16s2_$2#0 divr16s::return#2 divr16s::return#1 divr16s::return#7 divr16s::resultu#0 divr16s::return#3 divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 divr16u::return#2 point_init::x_stepf#0 bitmap_plot::$3 bitmap_plot::plotter#1 ]
zp ZP_WORD:7 [ divr16s::remu#3 divr16s::remu#7 divr16s::remu#8 divr16u::rem#4 divr16u::rem#3 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 divr16s::rem#0 divr16s::$7 point_init::$4 point_init::y_diff#0 bitmap_plot::$1 ]
zp ZP_WORD:9 [ divr16s::divisoru#3 divr16s::divisoru#4 divr16s::divisoru#5 divr16s::divisor#0 divr16u::divisor#0 divr16s::$11 point_init::x_diff#1 ]
reg byte y [ divr16s::neg#4 divr16s::neg#2 divr16s::neg#3 ]
reg byte x [ divr16u::i#2 divr16u::i#1 ]
reg byte x [ screen_fill::x#2 screen_fill::x#1 ]
@ -323,8 +313,7 @@ reg byte x [ bitmap_init::y#2 bitmap_init::y#1 ]
reg byte x [ main::$9 ]
reg byte y [ bitmap_plot::y#0 ]
reg byte a [ bitmap_plot::$2 ]
zp ZP_BYTE:13 [ point_init::point_idx1#0 ]
zp ZP_WORD:14 [ point_init::$4 point_init::y_diff#0 ]
zp ZP_BYTE:11 [ point_init::point_idx1#0 ]
reg byte a [ point_init::$13 ]
reg byte a [ point_init::$14 ]
reg byte a [ divr16u::$1 ]

View File

@ -1,33 +1,17 @@
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
.label w1 = 4
.label w2 = 2
jsr main
main: {
lda #<0
sta w1
sta w1+1
jsr incw1
lda #<0
sta w2
sta w2+1
jsr incw2
jsr incw1
jsr incw2
rts
}
incw2: {
inc w2
bne !+
inc w2+1
!:
rts
}
incw1: {
inc w1
bne !+
inc w1+1
!:
rts
}

View File

@ -9,34 +9,32 @@
[3] phi() [ ] ( )
main: scope:[main] from @3
[4] phi() [ ] ( main:2 [ ] )
[5] call incw1 [ w1#11 ] ( main:2 [ w1#11 ] )
[5] call incw1 [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main
[6] phi() [ w1#11 ] ( main:2 [ w1#11 ] )
[7] call incw2 [ w2#11 w1#11 ] ( main:2 [ w2#11 w1#11 ] )
[6] phi() [ ] ( main:2 [ ] )
[7] call incw2 [ ] ( main:2 [ ] )
to:main::@2
main::@2: scope:[main] from main::@1
[8] phi() [ w2#11 w1#11 ] ( main:2 [ w2#11 w1#11 ] )
[9] call incw1 [ w2#11 ] ( main:2 [ w2#11 ] )
[8] phi() [ ] ( main:2 [ ] )
[9] call incw1 [ ] ( main:2 [ ] )
to:main::@3
main::@3: scope:[main] from main::@2
[10] phi() [ w2#11 ] ( main:2 [ w2#11 ] )
[10] phi() [ ] ( main:2 [ ] )
[11] call incw2 [ ] ( main:2 [ ] )
to:main::@return
main::@return: scope:[main] from main::@3
[12] return [ ] ( main:2 [ ] )
to:@return
incw2: scope:[incw2] from main::@1 main::@3
[13] (word) w2#10 ← phi( main::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@3/(word) w2#11 ) [ w2#10 ] ( main:2::incw2:7 [ w1#11 w2#10 ] main:2::incw2:11 [ w2#10 ] )
[14] (word) w2#11 ← ++ (word) w2#10 [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] )
[13] phi() [ ] ( main:2::incw2:7 [ ] main:2::incw2:11 [ ] )
to:incw2::@return
incw2::@return: scope:[incw2] from incw2
[15] return [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] )
[14] return [ ] ( main:2::incw2:7 [ ] main:2::incw2:11 [ ] )
to:@return
incw1: scope:[incw1] from main main::@2
[16] (word) w1#10 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@2/(word) w1#11 ) [ w1#10 ] ( main:2::incw1:5 [ w1#10 ] main:2::incw1:9 [ w2#11 w1#10 ] )
[17] (word) w1#11 ← ++ (word) w1#10 [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] )
[15] phi() [ ] ( main:2::incw1:5 [ ] main:2::incw1:9 [ ] )
to:incw1::@return
incw1::@return: scope:[incw1] from incw1
[18] return [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] )
[16] return [ ] ( main:2::incw1:5 [ ] main:2::incw1:9 [ ] )
to:@return

View File

@ -76,90 +76,54 @@ incw2::@return: scope:[incw2] from incw2
to:@end
@end: scope:[] from @3
Eliminating unused variable (word) w1 and assignment [0] (word) w1 ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable (word) w2 and assignment [1] (word) w2 ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable - keeping the call (void~) main::$0
Eliminating unused variable - keeping the call (void~) main::$1
Eliminating unused variable - keeping the call (void~) main::$2
Eliminating unused variable - keeping the call (void~) main::$3
Eliminating unused variable w1(null) and assignment [7] w1(null) ← ++ w1(null)
Eliminating unused variable w2(null) and assignment [9] w2(null) ← ++ w2(null)
Removing empty block @1
Removing empty block @2
PROCEDURE MODIFY VARIABLE ANALYSIS
main modifies w1
main modifies w2
incw1 modifies w1
incw2 modifies w2
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN
@begin: scope:[] from
(word) w1#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(word) w2#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:@3
main: scope:[main] from @3
(word) w2#16 ← phi( @3/(word) w2#15 )
(word) w1#13 ← phi( @3/(word) w1#16 )
call incw1
to:main::@1
main::@1: scope:[main] from main
(word) w2#13 ← phi( main/(word) w2#16 )
(word) w1#7 ← phi( main/(word) w1#5 )
(word) w1#1 ← (word) w1#7
call incw2
to:main::@2
main::@2: scope:[main] from main::@1
(word) w1#14 ← phi( main::@1/(word) w1#1 )
(word) w2#7 ← phi( main::@1/(word) w2#5 )
(word) w2#1 ← (word) w2#7
call incw1
to:main::@3
main::@3: scope:[main] from main::@2
(word) w2#14 ← phi( main::@2/(word) w2#1 )
(word) w1#8 ← phi( main::@2/(word) w1#5 )
(word) w1#2 ← (word) w1#8
call incw2
to:main::@4
main::@4: scope:[main] from main::@3
(word) w1#15 ← phi( main::@3/(word) w1#2 )
(word) w2#8 ← phi( main::@3/(word) w2#5 )
(word) w2#2 ← (word) w2#8
to:main::@return
main::@return: scope:[main] from main::@4
(word) w2#9 ← phi( main::@4/(word) w2#2 )
(word) w1#9 ← phi( main::@4/(word) w1#15 )
(word) w1#3 ← (word) w1#9
(word) w2#3 ← (word) w2#9
return
to:@return
incw1: scope:[incw1] from main main::@2
(word) w1#10 ← phi( main/(word) w1#13 main::@2/(word) w1#14 )
(word) w1#4 ← ++ (word) w1#10
to:incw1::@return
incw1::@return: scope:[incw1] from incw1
(word) w1#11 ← phi( incw1/(word) w1#4 )
(word) w1#5 ← (word) w1#11
return
to:@return
incw2: scope:[incw2] from main::@1 main::@3
(word) w2#10 ← phi( main::@1/(word) w2#13 main::@3/(word) w2#14 )
(word) w2#4 ← ++ (word) w2#10
to:incw2::@return
incw2::@return: scope:[incw2] from incw2
(word) w2#11 ← phi( incw2/(word) w2#4 )
(word) w2#5 ← (word) w2#11
return
to:@return
@3: scope:[] from @begin
(word) w2#15 ← phi( @begin/(word) w2#0 )
(word) w1#16 ← phi( @begin/(word) w1#0 )
call main
to:@4
@4: scope:[] from @3
(word) w2#12 ← phi( @3/(word) w2#3 )
(word) w1#12 ← phi( @3/(word) w1#3 )
(word) w1#6 ← (word) w1#12
(word) w2#6 ← (word) w2#12
to:@end
@end: scope:[] from @4
@ -178,99 +142,12 @@ SYMBOL TABLE SSA
(label) main::@3
(label) main::@4
(label) main::@return
(word) w1
(word) w1#0
(word) w1#1
(word) w1#10
(word) w1#11
(word) w1#12
(word) w1#13
(word) w1#14
(word) w1#15
(word) w1#16
(word) w1#2
(word) w1#3
(word) w1#4
(word) w1#5
(word) w1#6
(word) w1#7
(word) w1#8
(word) w1#9
(word) w2
(word) w2#0
(word) w2#1
(word) w2#10
(word) w2#11
(word) w2#12
(word) w2#13
(word) w2#14
(word) w2#15
(word) w2#16
(word) w2#2
(word) w2#3
(word) w2#4
(word) w2#5
(word) w2#6
(word) w2#7
(word) w2#8
(word) w2#9
OPTIMIZING CONTROL FLOW GRAPH
Not aliassing across scopes: w1#13 w1#16
Not aliassing across scopes: w2#16 w2#15
Not aliassing across scopes: w1#7 w1#5
Not aliassing across scopes: w2#7 w2#5
Not aliassing across scopes: w1#8 w1#5
Not aliassing across scopes: w2#8 w2#5
Not aliassing across scopes: w1#10 w1#13
Not aliassing across scopes: w2#10 w2#13
Not aliassing across scopes: w1#12 w1#3
Not aliassing across scopes: w2#12 w2#3
Alias (word) w2#13 = (word) w2#16
Alias (word) w1#1 = (word) w1#7 (word) w1#14
Alias (word) w2#1 = (word) w2#7 (word) w2#14
Alias (word) w1#15 = (word) w1#2 (word) w1#8 (word) w1#9 (word) w1#3
Alias (word) w2#2 = (word) w2#8 (word) w2#9 (word) w2#3
Alias (word) w1#11 = (word) w1#4 (word) w1#5
Alias (word) w2#11 = (word) w2#4 (word) w2#5
Alias (word) w1#0 = (word) w1#16
Alias (word) w2#0 = (word) w2#15
Alias (word) w1#12 = (word) w1#6
Alias (word) w2#12 = (word) w2#6
Succesful SSA optimization Pass2AliasElimination
Not aliassing across scopes: w1#13 w1#0
Not aliassing across scopes: w2#13 w2#0
Not aliassing across scopes: w1#1 w1#11
Not aliassing across scopes: w2#1 w2#11
Not aliassing across scopes: w1#15 w1#11
Not aliassing across scopes: w2#2 w2#11
Not aliassing across scopes: w1#10 w1#13
Not aliassing across scopes: w2#10 w2#13
Not aliassing across scopes: w1#12 w1#15
Not aliassing across scopes: w2#12 w2#2
Redundant Phi (word) w1#13 (word) w1#0
Redundant Phi (word) w2#13 (word) w2#0
Redundant Phi (word) w1#1 (word) w1#11
Redundant Phi (word) w2#1 (word) w2#11
Redundant Phi (word) w1#15 (word) w1#11
Redundant Phi (word) w2#2 (word) w2#11
Redundant Phi (word) w1#12 (word) w1#15
Redundant Phi (word) w2#12 (word) w2#2
Succesful SSA optimization Pass2RedundantPhiElimination
Constant (const word) w1#0 = 0
Constant (const word) w2#0 = 0
Succesful SSA optimization Pass2ConstantIdentification
Culled Empty Block (label) main::@4
Culled Empty Block (label) @4
Succesful SSA optimization Pass2CullEmptyBlocks
OPTIMIZING CONTROL FLOW GRAPH
Inlining constant with var siblings (const word) w1#0
Inlining constant with var siblings (const word) w1#0
Inlining constant with var siblings (const word) w2#0
Inlining constant with var siblings (const word) w2#0
Constant inlined w1#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined w2#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2ConstantInlining
Block Sequence Planned @begin @3 @end main main::@1 main::@2 main::@3 main::@return incw2 incw2::@return incw1 incw1::@return
Block Sequence Planned @begin @3 @end main main::@1 main::@2 main::@3 main::@return incw2 incw2::@return incw1 incw1::@return
Adding NOP phi() at start of @begin
@ -278,32 +155,27 @@ Adding NOP phi() at start of @3
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
Calls in [main] to incw1:5 incw2:7 incw1:9 incw2:11
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Created 2 initial phi equivalence classes
Coalesced [8] w1#17 ← w1#11
Coalesced [10] w2#17 ← w2#11
Coalesced down to 2 phi equivalence classes
Block Sequence Planned @begin @3 @end main main::@1 main::@2 main::@3 main::@return incw2 incw2::@return incw1 incw1::@return
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @3
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@1
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of main::@3
Adding NOP phi() at start of incw2
Adding NOP phi() at start of incw1
CALL GRAPH
Calls in [] to main:2
Calls in [main] to incw1:5 incw2:7 incw1:9 incw2:11
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Created 0 initial phi equivalence classes
Coalesced down to 0 phi equivalence classes
Block Sequence Planned @begin @3 @end main main::@1 main::@2 main::@3 main::@return incw2 incw2::@return incw1 incw1::@return
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @3
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@1
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of main::@3
Adding NOP phi() at start of incw2
Adding NOP phi() at start of incw1
Propagating live ranges...
FINAL CONTROL FLOW GRAPH
@ -318,36 +190,34 @@ FINAL CONTROL FLOW GRAPH
[3] phi() [ ] ( )
main: scope:[main] from @3
[4] phi() [ ] ( main:2 [ ] )
[5] call incw1 [ w1#11 ] ( main:2 [ w1#11 ] )
[5] call incw1 [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main
[6] phi() [ w1#11 ] ( main:2 [ w1#11 ] )
[7] call incw2 [ w2#11 w1#11 ] ( main:2 [ w2#11 w1#11 ] )
[6] phi() [ ] ( main:2 [ ] )
[7] call incw2 [ ] ( main:2 [ ] )
to:main::@2
main::@2: scope:[main] from main::@1
[8] phi() [ w2#11 w1#11 ] ( main:2 [ w2#11 w1#11 ] )
[9] call incw1 [ w2#11 ] ( main:2 [ w2#11 ] )
[8] phi() [ ] ( main:2 [ ] )
[9] call incw1 [ ] ( main:2 [ ] )
to:main::@3
main::@3: scope:[main] from main::@2
[10] phi() [ w2#11 ] ( main:2 [ w2#11 ] )
[10] phi() [ ] ( main:2 [ ] )
[11] call incw2 [ ] ( main:2 [ ] )
to:main::@return
main::@return: scope:[main] from main::@3
[12] return [ ] ( main:2 [ ] )
to:@return
incw2: scope:[incw2] from main::@1 main::@3
[13] (word) w2#10 ← phi( main::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@3/(word) w2#11 ) [ w2#10 ] ( main:2::incw2:7 [ w1#11 w2#10 ] main:2::incw2:11 [ w2#10 ] )
[14] (word) w2#11 ← ++ (word) w2#10 [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] )
[13] phi() [ ] ( main:2::incw2:7 [ ] main:2::incw2:11 [ ] )
to:incw2::@return
incw2::@return: scope:[incw2] from incw2
[15] return [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] )
[14] return [ ] ( main:2::incw2:7 [ ] main:2::incw2:11 [ ] )
to:@return
incw1: scope:[incw1] from main main::@2
[16] (word) w1#10 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@2/(word) w1#11 ) [ w1#10 ] ( main:2::incw1:5 [ w1#10 ] main:2::incw1:9 [ w2#11 w1#10 ] )
[17] (word) w1#11 ← ++ (word) w1#10 [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] )
[15] phi() [ ] ( main:2::incw1:5 [ ] main:2::incw1:9 [ ] )
to:incw1::@return
incw1::@return: scope:[incw1] from incw1
[18] return [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] )
[16] return [ ] ( main:2::incw1:5 [ ] main:2::incw1:9 [ ] )
to:@return
DOMINATORS
@ -377,21 +247,9 @@ VARIABLE REGISTER WEIGHTS
(void()) incw1()
(void()) incw2()
(void()) main()
(word) w1
(word) w1#10 4.0
(word) w1#11 0.6666666666666666
(word) w2
(word) w2#10 4.0
(word) w2#11 0.6666666666666666
Initial phi equivalence classes
[ w2#10 w2#11 ]
[ w1#10 w1#11 ]
Complete equivalence classes
[ w2#10 w2#11 ]
[ w1#10 w1#11 ]
Allocated zp ZP_WORD:2 [ w2#10 w2#11 ]
Allocated zp ZP_WORD:4 [ w1#10 w1#11 ]
INITIAL ASM
//SEG0 Basic Upstart
@ -399,8 +257,6 @@ INITIAL ASM
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.label w1 = 4
.label w2 = 2
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @3 [phi:@begin->@3]
@ -419,96 +275,72 @@ bend_from_b3:
bend:
//SEG9 main
main: {
//SEG10 [5] call incw1 [ w1#11 ] ( main:2 [ w1#11 ] )
//SEG11 [16] phi from main to incw1 [phi:main->incw1]
//SEG10 [5] call incw1 [ ] ( main:2 [ ] )
//SEG11 [15] phi from main to incw1 [phi:main->incw1]
incw1_from_main:
//SEG12 [16] phi (word) w1#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->incw1#0] -- vwuz1=vbuc1
lda #<0
sta w1
lda #>0
sta w1+1
jsr incw1
//SEG13 [6] phi from main to main::@1 [phi:main->main::@1]
//SEG12 [6] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
jmp b1
//SEG14 main::@1
//SEG13 main::@1
b1:
//SEG15 [7] call incw2 [ w2#11 w1#11 ] ( main:2 [ w2#11 w1#11 ] )
//SEG16 [13] phi from main::@1 to incw2 [phi:main::@1->incw2]
//SEG14 [7] call incw2 [ ] ( main:2 [ ] )
//SEG15 [13] phi from main::@1 to incw2 [phi:main::@1->incw2]
incw2_from_b1:
//SEG17 [13] phi (word) w2#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@1->incw2#0] -- vwuz1=vbuc1
lda #<0
sta w2
lda #>0
sta w2+1
jsr incw2
//SEG18 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG16 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
jmp b2
//SEG19 main::@2
//SEG17 main::@2
b2:
//SEG20 [9] call incw1 [ w2#11 ] ( main:2 [ w2#11 ] )
//SEG21 [16] phi from main::@2 to incw1 [phi:main::@2->incw1]
//SEG18 [9] call incw1 [ ] ( main:2 [ ] )
//SEG19 [15] phi from main::@2 to incw1 [phi:main::@2->incw1]
incw1_from_b2:
//SEG22 [16] phi (word) w1#10 = (word) w1#11 [phi:main::@2->incw1#0] -- register_copy
jsr incw1
//SEG23 [10] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
//SEG20 [10] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
b3_from_b2:
jmp b3
//SEG24 main::@3
//SEG21 main::@3
b3:
//SEG25 [11] call incw2 [ ] ( main:2 [ ] )
//SEG26 [13] phi from main::@3 to incw2 [phi:main::@3->incw2]
//SEG22 [11] call incw2 [ ] ( main:2 [ ] )
//SEG23 [13] phi from main::@3 to incw2 [phi:main::@3->incw2]
incw2_from_b3:
//SEG27 [13] phi (word) w2#10 = (word) w2#11 [phi:main::@3->incw2#0] -- register_copy
jsr incw2
jmp breturn
//SEG28 main::@return
//SEG24 main::@return
breturn:
//SEG29 [12] return [ ] ( main:2 [ ] )
//SEG25 [12] return [ ] ( main:2 [ ] )
rts
}
//SEG30 incw2
//SEG26 incw2
incw2: {
//SEG31 [14] (word) w2#11 ← ++ (word) w2#10 [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] ) -- vwuz1=_inc_vwuz1
inc w2
bne !+
inc w2+1
!:
jmp breturn
//SEG32 incw2::@return
//SEG27 incw2::@return
breturn:
//SEG33 [15] return [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] )
//SEG28 [14] return [ ] ( main:2::incw2:7 [ ] main:2::incw2:11 [ ] )
rts
}
//SEG34 incw1
//SEG29 incw1
incw1: {
//SEG35 [17] (word) w1#11 ← ++ (word) w1#10 [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] ) -- vwuz1=_inc_vwuz1
inc w1
bne !+
inc w1+1
!:
jmp breturn
//SEG36 incw1::@return
//SEG30 incw1::@return
breturn:
//SEG37 [18] return [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] )
//SEG31 [16] return [ ] ( main:2::incw1:5 [ ] main:2::incw1:9 [ ] )
rts
}
REGISTER UPLIFT POTENTIAL REGISTERS
Potential registers zp ZP_WORD:2 [ w2#10 w2#11 ] : zp ZP_WORD:2 ,
Potential registers zp ZP_WORD:4 [ w1#10 w1#11 ] : zp ZP_WORD:4 ,
REGISTER UPLIFT SCOPES
Uplift Scope [] 4.67: zp ZP_WORD:2 [ w2#10 w2#11 ] 4.67: zp ZP_WORD:4 [ w1#10 w1#11 ]
Uplift Scope [main]
Uplift Scope [incw1]
Uplift Scope [incw2]
Uplift Scope []
Uplifting [] best 116 combination zp ZP_WORD:2 [ w2#10 w2#11 ] zp ZP_WORD:4 [ w1#10 w1#11 ]
Uplifting [main] best 116 combination
Uplifting [incw1] best 116 combination
Uplifting [incw2] best 116 combination
Uplifting [main] best 126 combination
Uplifting [incw1] best 126 combination
Uplifting [incw2] best 126 combination
Uplifting [] best 126 combination
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart
@ -516,8 +348,6 @@ ASSEMBLER BEFORE OPTIMIZATION
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.label w1 = 4
.label w2 = 2
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @3 [phi:@begin->@3]
@ -536,79 +366,57 @@ bend_from_b3:
bend:
//SEG9 main
main: {
//SEG10 [5] call incw1 [ w1#11 ] ( main:2 [ w1#11 ] )
//SEG11 [16] phi from main to incw1 [phi:main->incw1]
//SEG10 [5] call incw1 [ ] ( main:2 [ ] )
//SEG11 [15] phi from main to incw1 [phi:main->incw1]
incw1_from_main:
//SEG12 [16] phi (word) w1#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->incw1#0] -- vwuz1=vbuc1
lda #<0
sta w1
lda #>0
sta w1+1
jsr incw1
//SEG13 [6] phi from main to main::@1 [phi:main->main::@1]
//SEG12 [6] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
jmp b1
//SEG14 main::@1
//SEG13 main::@1
b1:
//SEG15 [7] call incw2 [ w2#11 w1#11 ] ( main:2 [ w2#11 w1#11 ] )
//SEG16 [13] phi from main::@1 to incw2 [phi:main::@1->incw2]
//SEG14 [7] call incw2 [ ] ( main:2 [ ] )
//SEG15 [13] phi from main::@1 to incw2 [phi:main::@1->incw2]
incw2_from_b1:
//SEG17 [13] phi (word) w2#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@1->incw2#0] -- vwuz1=vbuc1
lda #<0
sta w2
lda #>0
sta w2+1
jsr incw2
//SEG18 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG16 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
jmp b2
//SEG19 main::@2
//SEG17 main::@2
b2:
//SEG20 [9] call incw1 [ w2#11 ] ( main:2 [ w2#11 ] )
//SEG21 [16] phi from main::@2 to incw1 [phi:main::@2->incw1]
//SEG18 [9] call incw1 [ ] ( main:2 [ ] )
//SEG19 [15] phi from main::@2 to incw1 [phi:main::@2->incw1]
incw1_from_b2:
//SEG22 [16] phi (word) w1#10 = (word) w1#11 [phi:main::@2->incw1#0] -- register_copy
jsr incw1
//SEG23 [10] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
//SEG20 [10] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
b3_from_b2:
jmp b3
//SEG24 main::@3
//SEG21 main::@3
b3:
//SEG25 [11] call incw2 [ ] ( main:2 [ ] )
//SEG26 [13] phi from main::@3 to incw2 [phi:main::@3->incw2]
//SEG22 [11] call incw2 [ ] ( main:2 [ ] )
//SEG23 [13] phi from main::@3 to incw2 [phi:main::@3->incw2]
incw2_from_b3:
//SEG27 [13] phi (word) w2#10 = (word) w2#11 [phi:main::@3->incw2#0] -- register_copy
jsr incw2
jmp breturn
//SEG28 main::@return
//SEG24 main::@return
breturn:
//SEG29 [12] return [ ] ( main:2 [ ] )
//SEG25 [12] return [ ] ( main:2 [ ] )
rts
}
//SEG30 incw2
//SEG26 incw2
incw2: {
//SEG31 [14] (word) w2#11 ← ++ (word) w2#10 [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] ) -- vwuz1=_inc_vwuz1
inc w2
bne !+
inc w2+1
!:
jmp breturn
//SEG32 incw2::@return
//SEG27 incw2::@return
breturn:
//SEG33 [15] return [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] )
//SEG28 [14] return [ ] ( main:2::incw2:7 [ ] main:2::incw2:11 [ ] )
rts
}
//SEG34 incw1
//SEG29 incw1
incw1: {
//SEG35 [17] (word) w1#11 ← ++ (word) w1#10 [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] ) -- vwuz1=_inc_vwuz1
inc w1
bne !+
inc w1+1
!:
jmp breturn
//SEG36 incw1::@return
//SEG30 incw1::@return
breturn:
//SEG37 [18] return [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] )
//SEG31 [16] return [ ] ( main:2::incw1:5 [ ] main:2::incw1:9 [ ] )
rts
}
@ -622,9 +430,6 @@ Removing instruction jmp breturn
Removing instruction jmp breturn
Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda #>0
Removing instruction lda #>0
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Removing instruction bbegin:
Removing instruction b3_from_bbegin:
Removing instruction main_from_b3:
@ -660,27 +465,17 @@ FINAL SYMBOL TABLE
(label) main::@2
(label) main::@3
(label) main::@return
(word) w1
(word) w1#10 w1 zp ZP_WORD:4 4.0
(word) w1#11 w1 zp ZP_WORD:4 0.6666666666666666
(word) w2
(word) w2#10 w2 zp ZP_WORD:2 4.0
(word) w2#11 w2 zp ZP_WORD:2 0.6666666666666666
zp ZP_WORD:2 [ w2#10 w2#11 ]
zp ZP_WORD:4 [ w1#10 w1#11 ]
FINAL ASSEMBLER
Score: 88
Score: 48
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.label w1 = 4
.label w2 = 2
//SEG2 @begin
//SEG3 [1] phi from @begin to @3 [phi:@begin->@3]
//SEG4 @3
@ -691,58 +486,38 @@ Score: 88
//SEG8 @end
//SEG9 main
main: {
//SEG10 [5] call incw1 [ w1#11 ] ( main:2 [ w1#11 ] )
//SEG11 [16] phi from main to incw1 [phi:main->incw1]
//SEG12 [16] phi (word) w1#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->incw1#0] -- vwuz1=vbuc1
lda #<0
sta w1
sta w1+1
//SEG10 [5] call incw1 [ ] ( main:2 [ ] )
//SEG11 [15] phi from main to incw1 [phi:main->incw1]
jsr incw1
//SEG13 [6] phi from main to main::@1 [phi:main->main::@1]
//SEG14 main::@1
//SEG15 [7] call incw2 [ w2#11 w1#11 ] ( main:2 [ w2#11 w1#11 ] )
//SEG16 [13] phi from main::@1 to incw2 [phi:main::@1->incw2]
//SEG17 [13] phi (word) w2#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@1->incw2#0] -- vwuz1=vbuc1
lda #<0
sta w2
sta w2+1
//SEG12 [6] phi from main to main::@1 [phi:main->main::@1]
//SEG13 main::@1
//SEG14 [7] call incw2 [ ] ( main:2 [ ] )
//SEG15 [13] phi from main::@1 to incw2 [phi:main::@1->incw2]
jsr incw2
//SEG18 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG19 main::@2
//SEG20 [9] call incw1 [ w2#11 ] ( main:2 [ w2#11 ] )
//SEG21 [16] phi from main::@2 to incw1 [phi:main::@2->incw1]
//SEG22 [16] phi (word) w1#10 = (word) w1#11 [phi:main::@2->incw1#0] -- register_copy
//SEG16 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG17 main::@2
//SEG18 [9] call incw1 [ ] ( main:2 [ ] )
//SEG19 [15] phi from main::@2 to incw1 [phi:main::@2->incw1]
jsr incw1
//SEG23 [10] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
//SEG24 main::@3
//SEG25 [11] call incw2 [ ] ( main:2 [ ] )
//SEG26 [13] phi from main::@3 to incw2 [phi:main::@3->incw2]
//SEG27 [13] phi (word) w2#10 = (word) w2#11 [phi:main::@3->incw2#0] -- register_copy
//SEG20 [10] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
//SEG21 main::@3
//SEG22 [11] call incw2 [ ] ( main:2 [ ] )
//SEG23 [13] phi from main::@3 to incw2 [phi:main::@3->incw2]
jsr incw2
//SEG28 main::@return
//SEG29 [12] return [ ] ( main:2 [ ] )
//SEG24 main::@return
//SEG25 [12] return [ ] ( main:2 [ ] )
rts
}
//SEG30 incw2
//SEG26 incw2
incw2: {
//SEG31 [14] (word) w2#11 ← ++ (word) w2#10 [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] ) -- vwuz1=_inc_vwuz1
inc w2
bne !+
inc w2+1
!:
//SEG32 incw2::@return
//SEG33 [15] return [ w2#11 ] ( main:2::incw2:7 [ w1#11 w2#11 ] main:2::incw2:11 [ w2#11 ] )
//SEG27 incw2::@return
//SEG28 [14] return [ ] ( main:2::incw2:7 [ ] main:2::incw2:11 [ ] )
rts
}
//SEG34 incw1
//SEG29 incw1
incw1: {
//SEG35 [17] (word) w1#11 ← ++ (word) w1#10 [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] ) -- vwuz1=_inc_vwuz1
inc w1
bne !+
inc w1+1
!:
//SEG36 incw1::@return
//SEG37 [18] return [ w1#11 ] ( main:2::incw1:5 [ w1#11 ] main:2::incw1:9 [ w2#11 w1#11 ] )
//SEG30 incw1::@return
//SEG31 [16] return [ ] ( main:2::incw1:5 [ ] main:2::incw1:9 [ ] )
rts
}

View File

@ -10,12 +10,4 @@
(label) main::@2
(label) main::@3
(label) main::@return
(word) w1
(word) w1#10 w1 zp ZP_WORD:4 4.0
(word) w1#11 w1 zp ZP_WORD:4 0.6666666666666666
(word) w2
(word) w2#10 w2 zp ZP_WORD:2 4.0
(word) w2#11 w2 zp ZP_WORD:2 0.6666666666666666
zp ZP_WORD:2 [ w2#10 w2#11 ]
zp ZP_WORD:4 [ w1#10 w1#11 ]

View File

@ -3,7 +3,6 @@
.pc = $80d "Program"
jsr main
main: {
ldx #0
lda #$64
b1:
sec
@ -14,11 +13,6 @@ main: {
b2:
cmp #$32
beq !+
bcs b4
!:
dex
jmp b1
b4:
inx
jmp b1
}

View File

@ -10,21 +10,17 @@
main: scope:[main] from @1
[4] phi() [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main main::@4 main::@8
[5] (byte) main::s#3 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@4/(byte) main::s#1 main::@8/(byte) main::s#2 ) [ main::i#2 main::s#3 ] ( main:2 [ main::i#2 main::s#3 ] )
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 100 main::@4/(byte) main::i#1 main::@8/(byte) main::i#1 ) [ main::i#2 main::s#3 ] ( main:2 [ main::i#2 main::s#3 ] )
[6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] )
[7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] )
main::@1: scope:[main] from main main::@2 main::@4
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 100 main::@2/(byte) main::i#1 main::@4/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[8] return [ ] ( main:2 [ ] )
to:@return
main::@2: scope:[main] from main::@1
[9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] )
to:main::@8
main::@8: scope:[main] from main::@2
[10] (byte) main::s#2 ← -- (byte) main::s#3 [ main::i#1 main::s#2 ] ( main:2 [ main::i#1 main::s#2 ] )
[9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@1
main::@4: scope:[main] from main::@2
[11] (byte) main::s#1 ← ++ (byte) main::s#3 [ main::i#1 main::s#1 ] ( main:2 [ main::i#1 main::s#1 ] )
[10] phi() [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@1

View File

@ -77,15 +77,18 @@ main::@return: scope:[main] from main::@3
to:@end
@end: scope:[] from @1
Eliminating unused variable (byte) main::s and assignment [1] (byte) main::s ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable main::s(null) and assignment [7] main::s(null) ← ++ main::s(null)
Eliminating unused variable main::s(null) and assignment [8] main::s(null) ← -- main::s(null)
Removing empty block main::@6
Removing empty block main::@3
Removing empty block main::@7
Removing empty block main::@8
Removing empty block main::@5
Removing empty block main::@9
Removing empty block main::@10
PROCEDURE MODIFY VARIABLE ANALYSIS
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
@ -94,30 +97,20 @@ CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN
to:@1
main: scope:[main] from @1
(byte) main::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 100
(byte) main::s#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@1
main::@1: scope:[main] from main main::@4 main::@8
(byte) main::s#6 ← phi( main/(byte) main::s#0 main::@4/(byte) main::s#1 main::@8/(byte) main::s#2 )
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@4/(byte) main::i#4 main::@8/(byte) main::i#5 )
main::@1: scope:[main] from main main::@2 main::@4
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@2/(byte) main::i#3 main::@4/(byte) main::i#4 )
(byte) main::i#1 ← -- (byte) main::i#2
(bool~) main::$0 ← (byte) main::i#1 > (byte/signed byte/word/signed word/dword/signed dword) 0
if((bool~) main::$0) goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte) main::s#5 ← phi( main::@1/(byte) main::s#6 )
(byte) main::i#3 ← phi( main::@1/(byte) main::i#1 )
(bool~) main::$1 ← (byte) main::i#3 > (byte/signed byte/word/signed word/dword/signed dword) 50
if((bool~) main::$1) goto main::@4
to:main::@8
to:main::@1
main::@4: scope:[main] from main::@2
(byte) main::i#4 ← phi( main::@2/(byte) main::i#3 )
(byte) main::s#3 ← phi( main::@2/(byte) main::s#5 )
(byte) main::s#1 ← ++ (byte) main::s#3
to:main::@1
main::@8: scope:[main] from main::@2
(byte) main::i#5 ← phi( main::@2/(byte) main::i#3 )
(byte) main::s#4 ← phi( main::@2/(byte) main::s#5 )
(byte) main::s#2 ← -- (byte) main::s#4
to:main::@1
main::@return: scope:[main] from main::@1
return
@ -140,7 +133,6 @@ SYMBOL TABLE SSA
(label) main::@1
(label) main::@2
(label) main::@4
(label) main::@8
(label) main::@return
(byte) main::i
(byte) main::i#0
@ -148,39 +140,26 @@ SYMBOL TABLE SSA
(byte) main::i#2
(byte) main::i#3
(byte) main::i#4
(byte) main::i#5
(byte) main::s
(byte) main::s#0
(byte) main::s#1
(byte) main::s#2
(byte) main::s#3
(byte) main::s#4
(byte) main::s#5
(byte) main::s#6
OPTIMIZING CONTROL FLOW GRAPH
Culled Empty Block (label) @2
Succesful SSA optimization Pass2CullEmptyBlocks
Alias (byte) main::i#1 = (byte) main::i#3 (byte) main::i#4 (byte) main::i#5
Alias (byte) main::s#3 = (byte) main::s#5 (byte) main::s#6 (byte) main::s#4
Alias (byte) main::i#1 = (byte) main::i#3 (byte) main::i#4
Succesful SSA optimization Pass2AliasElimination
Simple Condition (bool~) main::$0 if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2
Simple Condition (bool~) main::$1 if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4
Succesful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte) main::i#0 = 100
Constant (const byte) main::s#0 = 0
Succesful SSA optimization Pass2ConstantIdentification
Not culling empty block because it shares successor with its predecessor. (label) main::@4
OPTIMIZING CONTROL FLOW GRAPH
Inlining constant with var siblings (const byte) main::i#0
Inlining constant with var siblings (const byte) main::i#0
Inlining constant with var siblings (const byte) main::s#0
Inlining constant with var siblings (const byte) main::s#0
Inlining constant with var siblings (const byte) main::s#0
Constant inlined main::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 100
Constant inlined main::s#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2ConstantInlining
Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@2 main::@8 main::@4
Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@2 main::@8 main::@4
Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@2 main::@4
Added new block during phi lifting main::@11(between main::@2 and main::@1)
Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@2 main::@11 main::@4
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
@ -190,23 +169,18 @@ Calls in [] to main:2
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Created 2 initial phi equivalence classes
Coalesced [11] main::i#7 ← main::i#1
Coalesced [12] main::s#8 ← main::s#2
Coalesced (already) [14] main::i#6 ← main::i#1
Coalesced [15] main::s#7 ← main::s#1
Coalesced down to 2 phi equivalence classes
Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@2 main::@8 main::@4
Created 1 initial phi equivalence classes
Coalesced [10] main::i#5 ← main::i#1
Coalesced (already) [11] main::i#6 ← main::i#1
Coalesced down to 1 phi equivalence classes
Culled Empty Block (label) main::@11
Not culling empty block because it shares successor with its predecessor. (label) main::@4
Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@2 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
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Adding NOP phi() at start of main::@4
Propagating live ranges...
Propagating live ranges...
@ -223,23 +197,19 @@ FINAL CONTROL FLOW GRAPH
main: scope:[main] from @1
[4] phi() [ ] ( main:2 [ ] )
to:main::@1
main::@1: scope:[main] from main main::@4 main::@8
[5] (byte) main::s#3 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@4/(byte) main::s#1 main::@8/(byte) main::s#2 ) [ main::i#2 main::s#3 ] ( main:2 [ main::i#2 main::s#3 ] )
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 100 main::@4/(byte) main::i#1 main::@8/(byte) main::i#1 ) [ main::i#2 main::s#3 ] ( main:2 [ main::i#2 main::s#3 ] )
[6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] )
[7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] )
main::@1: scope:[main] from main main::@2 main::@4
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 100 main::@2/(byte) main::i#1 main::@4/(byte) main::i#1 ) [ main::i#2 ] ( main:2 [ main::i#2 ] )
[6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
[7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@return
main::@return: scope:[main] from main::@1
[8] return [ ] ( main:2 [ ] )
to:@return
main::@2: scope:[main] from main::@1
[9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] )
to:main::@8
main::@8: scope:[main] from main::@2
[10] (byte) main::s#2 ← -- (byte) main::s#3 [ main::i#1 main::s#2 ] ( main:2 [ main::i#1 main::s#2 ] )
[9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@1
main::@4: scope:[main] from main::@2
[11] (byte) main::s#1 ← ++ (byte) main::s#3 [ main::i#1 main::s#1 ] ( main:2 [ main::i#1 main::s#1 ] )
[10] phi() [ main::i#1 ] ( main:2 [ main::i#1 ] )
to:main::@1
DOMINATORS
@ -250,42 +220,36 @@ main dominated by @1 @begin main
main::@1 dominated by @1 @begin main::@1 main
main::@return dominated by main::@return @1 @begin main::@1 main
main::@2 dominated by @1 @begin main::@1 main::@2 main
main::@8 dominated by @1 @begin main::@8 main::@1 main::@2 main
main::@4 dominated by @1 @begin main::@1 main::@2 main main::@4
NATURAL LOOPS
Found back edge: Loop head: main::@1 tails: main::@8 blocks: null
Found back edge: Loop head: main::@1 tails: main::@2 blocks: null
Found back edge: Loop head: main::@1 tails: main::@4 blocks: null
Populated: Loop head: main::@1 tails: main::@8 blocks: main::@8 main::@2 main::@1
Populated: Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1
Populated: Loop head: main::@1 tails: main::@4 blocks: main::@4 main::@2 main::@1
Coalesced: Loop head: main::@1 tails: main::@8 main::@4 blocks: main::@8 main::@2 main::@1 main::@4
Loop head: main::@1 tails: main::@8 main::@4 blocks: main::@8 main::@2 main::@1 main::@4
Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1
Loop head: main::@1 tails: main::@4 blocks: main::@4 main::@2 main::@1
NATURAL LOOPS WITH DEPTH
Found 0 loops in scope []
Found 1 loops in scope [main]
Loop head: main::@1 tails: main::@8 main::@4 blocks: main::@8 main::@2 main::@1 main::@4
Loop head: main::@1 tails: main::@8 main::@4 blocks: main::@8 main::@2 main::@1 main::@4 depth: 1
Found 2 loops in scope [main]
Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1
Loop head: main::@1 tails: main::@4 blocks: main::@4 main::@2 main::@1
Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1 depth: 2
Loop head: main::@1 tails: main::@4 blocks: main::@4 main::@2 main::@1 depth: 1
VARIABLE REGISTER WEIGHTS
(void()) main()
(byte) main::i
(byte) main::i#1 11.0
(byte) main::i#2 33.0
(byte) main::s
(byte) main::s#1 22.0
(byte) main::s#2 22.0
(byte) main::s#3 11.0
(byte) main::i#1 103.75
(byte) main::i#2 213.0
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
[ main::s#3 main::s#1 main::s#2 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
[ main::s#3 main::s#1 main::s#2 ]
Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Allocated zp ZP_BYTE:3 [ main::s#3 main::s#1 main::s#2 ]
INITIAL ASM
//SEG0 Basic Upstart
@ -312,64 +276,54 @@ bend:
//SEG9 main
main: {
.label i = 2
.label s = 3
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG11 [5] phi (byte) main::s#3 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0
sta s
//SEG12 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 100 [phi:main->main::@1#1] -- vbuz1=vbuc1
//SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 100 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #$64
sta i
jmp b1
//SEG13 main::@1
//SEG12 main::@1
b1:
//SEG14 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuz1=_dec_vbuz1
//SEG13 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1=_dec_vbuz1
dec i
//SEG15 [7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuz1_gt_0_then_la1
//SEG14 [7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1_gt_0_then_la1
lda i
bne b2
jmp breturn
//SEG16 main::@return
//SEG15 main::@return
breturn:
//SEG17 [8] return [ ] ( main:2 [ ] )
//SEG16 [8] return [ ] ( main:2 [ ] )
rts
//SEG18 main::@2
//SEG17 main::@2
b2:
//SEG19 [9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuz1_gt_vbuc1_then_la1
//SEG18 [9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuz1_gt_vbuc1_then_la1
lda i
cmp #$32
beq !+
bcs b4
bcs b4_from_b2
!:
jmp b8
//SEG20 main::@8
b8:
//SEG21 [10] (byte) main::s#2 ← -- (byte) main::s#3 [ main::i#1 main::s#2 ] ( main:2 [ main::i#1 main::s#2 ] ) -- vbuz1=_dec_vbuz1
dec s
//SEG22 [5] phi from main::@4 main::@8 to main::@1 [phi:main::@4/main::@8->main::@1]
//SEG19 [5] phi from main::@2 main::@4 to main::@1 [phi:main::@2/main::@4->main::@1]
b1_from_b2:
b1_from_b4:
b1_from_b8:
//SEG23 [5] phi (byte) main::s#3 = (byte) main::s#1 [phi:main::@4/main::@8->main::@1#0] -- register_copy
//SEG24 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@4/main::@8->main::@1#1] -- register_copy
//SEG20 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@2/main::@4->main::@1#0] -- register_copy
jmp b1
//SEG25 main::@4
//SEG21 [10] phi from main::@2 to main::@4 [phi:main::@2->main::@4]
b4_from_b2:
jmp b4
//SEG22 main::@4
b4:
//SEG26 [11] (byte) main::s#1 ← ++ (byte) main::s#3 [ main::i#1 main::s#1 ] ( main:2 [ main::i#1 main::s#1 ] ) -- vbuz1=_inc_vbuz1
inc s
jmp b1_from_b4
}
REGISTER UPLIFT POTENTIAL REGISTERS
Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ main::s#3 main::s#1 main::s#2 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 55: zp ZP_BYTE:3 [ main::s#3 main::s#1 main::s#2 ] 44: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope [main] 316.75: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope []
Uplifting [main] best 403 combination reg byte x [ main::s#3 main::s#1 main::s#2 ] reg byte a [ main::i#2 main::i#1 ]
Uplifting [] best 403 combination
Uplifting [main] best 2728 combination reg byte a [ main::i#2 main::i#1 ]
Uplifting [] best 2728 combination
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart
@ -397,46 +351,39 @@ bend:
main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG11 [5] phi (byte) main::s#3 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
ldx #0
//SEG12 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 100 [phi:main->main::@1#1] -- vbuaa=vbuc1
//SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 100 [phi:main->main::@1#0] -- vbuaa=vbuc1
lda #$64
jmp b1
//SEG13 main::@1
//SEG12 main::@1
b1:
//SEG14 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuaa=_dec_vbuaa
//SEG13 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa=_dec_vbuaa
sec
sbc #1
//SEG15 [7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuaa_gt_0_then_la1
//SEG14 [7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa_gt_0_then_la1
cmp #0
bne b2
jmp breturn
//SEG16 main::@return
//SEG15 main::@return
breturn:
//SEG17 [8] return [ ] ( main:2 [ ] )
//SEG16 [8] return [ ] ( main:2 [ ] )
rts
//SEG18 main::@2
//SEG17 main::@2
b2:
//SEG19 [9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuaa_gt_vbuc1_then_la1
//SEG18 [9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa_gt_vbuc1_then_la1
cmp #$32
beq !+
bcs b4
bcs b4_from_b2
!:
jmp b8
//SEG20 main::@8
b8:
//SEG21 [10] (byte) main::s#2 ← -- (byte) main::s#3 [ main::i#1 main::s#2 ] ( main:2 [ main::i#1 main::s#2 ] ) -- vbuxx=_dec_vbuxx
dex
//SEG22 [5] phi from main::@4 main::@8 to main::@1 [phi:main::@4/main::@8->main::@1]
//SEG19 [5] phi from main::@2 main::@4 to main::@1 [phi:main::@2/main::@4->main::@1]
b1_from_b2:
b1_from_b4:
b1_from_b8:
//SEG23 [5] phi (byte) main::s#3 = (byte) main::s#1 [phi:main::@4/main::@8->main::@1#0] -- register_copy
//SEG24 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@4/main::@8->main::@1#1] -- register_copy
//SEG20 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@2/main::@4->main::@1#0] -- register_copy
jmp b1
//SEG25 main::@4
//SEG21 [10] phi from main::@2 to main::@4 [phi:main::@2->main::@4]
b4_from_b2:
jmp b4
//SEG22 main::@4
b4:
//SEG26 [11] (byte) main::s#1 ← ++ (byte) main::s#3 [ main::i#1 main::s#1 ] ( main:2 [ main::i#1 main::s#1 ] ) -- vbuxx=_inc_vbuxx
inx
jmp b1_from_b4
}
@ -445,27 +392,33 @@ Removing instruction jmp b1
Removing instruction jmp bend
Removing instruction jmp b1
Removing instruction jmp breturn
Removing instruction jmp b8
Removing instruction jmp b4
Succesful ASM optimization Pass5NextJumpElimination
Replacing label b1_from_b4 with b1_from_b8
Replacing label b4_from_b2 with b4
Removing instruction bbegin:
Removing instruction b1_from_bbegin:
Removing instruction main_from_b1:
Removing instruction bend_from_b1:
Removing instruction b1_from_b4:
Removing instruction b1_from_b2:
Removing instruction b4_from_b2:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b1:
Removing instruction bend:
Removing instruction b1_from_main:
Removing instruction breturn:
Removing instruction b8:
Succesful ASM optimization Pass5UnusedLabelElimination
Skipping double jump to b1 in jmp b1_from_b8
Skipping double jump to b1_from_b4 in bcs b4
Skipping double jump to b1 in jmp b1_from_b4
Succesful ASM optimization Pass5DoubleJumpElimination
Relabelling long label b1_from_b8 to b3
Relabelling long label b1_from_b4 to b3
Succesful ASM optimization Pass5RelabelLongLabels
Removing instruction bcs b3
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction b3:
Removing instruction b4:
Succesful ASM optimization Pass5UnusedLabelElimination
Removing unreachable instruction jmp b1
Succesful ASM optimization Pass5UnreachableCodeElimination
FINAL SYMBOL TABLE
(label) @1
@ -475,22 +428,16 @@ FINAL SYMBOL TABLE
(label) main::@1
(label) main::@2
(label) main::@4
(label) main::@8
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte a 11.0
(byte) main::i#2 reg byte a 33.0
(byte) main::s
(byte) main::s#1 reg byte x 22.0
(byte) main::s#2 reg byte x 22.0
(byte) main::s#3 reg byte x 11.0
(byte) main::i#1 reg byte a 103.75
(byte) main::i#2 reg byte a 213.0
reg byte a [ main::i#2 main::i#1 ]
reg byte x [ main::s#3 main::s#1 main::s#2 ]
FINAL ASSEMBLER
Score: 307
Score: 1812
//SEG0 Basic Upstart
.pc = $801 "Basic"
@ -508,39 +455,29 @@ Score: 307
//SEG9 main
main: {
//SEG10 [5] phi from main to main::@1 [phi:main->main::@1]
//SEG11 [5] phi (byte) main::s#3 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1
ldx #0
//SEG12 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 100 [phi:main->main::@1#1] -- vbuaa=vbuc1
//SEG11 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 100 [phi:main->main::@1#0] -- vbuaa=vbuc1
lda #$64
//SEG13 main::@1
//SEG12 main::@1
b1:
//SEG14 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuaa=_dec_vbuaa
//SEG13 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa=_dec_vbuaa
sec
sbc #1
//SEG15 [7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuaa_gt_0_then_la1
//SEG14 [7] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@2 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa_gt_0_then_la1
cmp #0
bne b2
//SEG16 main::@return
//SEG17 [8] return [ ] ( main:2 [ ] )
//SEG15 main::@return
//SEG16 [8] return [ ] ( main:2 [ ] )
rts
//SEG18 main::@2
//SEG17 main::@2
b2:
//SEG19 [9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::s#3 main::i#1 ] ( main:2 [ main::s#3 main::i#1 ] ) -- vbuaa_gt_vbuc1_then_la1
//SEG18 [9] if((byte) main::i#1>(byte/signed byte/word/signed word/dword/signed dword) 50) goto main::@4 [ main::i#1 ] ( main:2 [ main::i#1 ] ) -- vbuaa_gt_vbuc1_then_la1
cmp #$32
beq !+
bcs b4
!:
//SEG20 main::@8
//SEG21 [10] (byte) main::s#2 ← -- (byte) main::s#3 [ main::i#1 main::s#2 ] ( main:2 [ main::i#1 main::s#2 ] ) -- vbuxx=_dec_vbuxx
dex
//SEG22 [5] phi from main::@4 main::@8 to main::@1 [phi:main::@4/main::@8->main::@1]
//SEG23 [5] phi (byte) main::s#3 = (byte) main::s#1 [phi:main::@4/main::@8->main::@1#0] -- register_copy
//SEG24 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@4/main::@8->main::@1#1] -- register_copy
jmp b1
//SEG25 main::@4
b4:
//SEG26 [11] (byte) main::s#1 ← ++ (byte) main::s#3 [ main::i#1 main::s#1 ] ( main:2 [ main::i#1 main::s#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG19 [5] phi from main::@2 main::@4 to main::@1 [phi:main::@2/main::@4->main::@1]
//SEG20 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@2/main::@4->main::@1#0] -- register_copy
jmp b1
//SEG21 [10] phi from main::@2 to main::@4 [phi:main::@2->main::@4]
//SEG22 main::@4
}

View File

@ -5,15 +5,9 @@
(label) main::@1
(label) main::@2
(label) main::@4
(label) main::@8
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte a 11.0
(byte) main::i#2 reg byte a 33.0
(byte) main::s
(byte) main::s#1 reg byte x 22.0
(byte) main::s#2 reg byte x 22.0
(byte) main::s#3 reg byte x 11.0
(byte) main::i#1 reg byte a 103.75
(byte) main::i#2 reg byte a 213.0
reg byte a [ main::i#2 main::i#1 ]
reg byte x [ main::s#3 main::s#1 main::s#2 ]

View File

@ -2,26 +2,18 @@
:BasicUpstart(main)
.pc = $80d "Program"
.label SCREEN = $400
.label cnt = 2
jsr main
main: {
ldx #0
ldy #0
txa
jsr inccnt
sta SCREEN+0
lda cnt
clc
adc #1
inx
jsr inccnt
sta SCREEN+1
rts
}
inccnt: {
clc
adc #1
sta cnt
iny
inx
txa
rts
}

View File

@ -9,13 +9,13 @@
[3] phi() [ ] ( )
main: scope:[main] from @2
[4] phi() [ ] ( main:2 [ ] )
[5] call inccnt [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] )
[6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] )
[5] call inccnt [ inccnt::return#2 cnt#12 ] ( main:2 [ inccnt::return#2 cnt#12 ] )
[6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 ] ( main:2 [ inccnt::return#0 cnt#12 ] )
to:main::@1
main::@1: scope:[main] from main
[7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] )
[8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ cnt#12 cnt2#11 cnt3#11 ] )
[9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 cnt2#11 cnt3#11 ] ( main:2 [ cnt#2 cnt2#11 cnt3#11 ] )
[7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 ] ( main:2 [ main::$0 cnt#12 ] )
[8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 ] ( main:2 [ cnt#12 ] )
[9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 ] ( main:2 [ cnt#2 ] )
[10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] )
[11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] )
to:main::@2
@ -27,14 +27,10 @@ main::@return: scope:[main] from main::@2
[14] return [ ] ( main:2 [ ] )
to:@return
inccnt: scope:[inccnt] from main main::@1
[15] (byte) cnt3#10 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt3#11 ) [ cnt#11 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#11 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#11 cnt2#10 cnt3#10 ] )
[15] (byte) cnt2#10 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt2#11 ) [ cnt#11 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#11 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#11 cnt2#10 cnt3#10 ] )
[15] (byte) cnt#11 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt#2 ) [ cnt#11 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#11 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#11 cnt2#10 cnt3#10 ] )
[16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#12 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#12 cnt2#10 cnt3#10 ] )
[17] (byte) cnt2#11 ← ++ (byte) cnt2#10 [ cnt#12 cnt3#10 cnt2#11 ] ( main:2::inccnt:5 [ cnt#12 cnt3#10 cnt2#11 ] main:2::inccnt:10 [ cnt#12 cnt3#10 cnt2#11 ] )
[18] (byte) cnt3#11 ← ++ (byte) cnt3#10 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ cnt#12 cnt2#11 cnt3#11 ] )
[19] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] )
[15] (byte) cnt#11 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt#2 ) [ cnt#11 ] ( main:2::inccnt:5 [ cnt#11 ] main:2::inccnt:10 [ cnt#11 ] )
[16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 ] ( main:2::inccnt:5 [ cnt#12 ] main:2::inccnt:10 [ cnt#12 ] )
[17] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] )
to:inccnt::@return
inccnt::@return: scope:[inccnt] from inccnt
[20] return [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] )
[18] return [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] )
to:@return

View File

@ -79,15 +79,15 @@ inccnt::@1: scope:[inccnt] from
to:@end
@end: scope:[] from @2
Eliminating unused variable (byte) cnt2 and assignment [1] (byte) cnt2 ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable (byte) cnt3 and assignment [2] (byte) cnt3 ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable cnt2(null) and assignment [11] cnt2(null) ← ++ cnt2(null)
Eliminating unused variable cnt3(null) and assignment [12] cnt3(null) ← ++ cnt3(null)
Removing empty block @1
Removing empty block inccnt::@1
PROCEDURE MODIFY VARIABLE ANALYSIS
main modifies cnt
main modifies cnt2
main modifies cnt3
inccnt modifies cnt
inccnt modifies cnt2
inccnt modifies cnt3
Completing Phi functions...
Completing Phi functions...
@ -95,84 +95,54 @@ Completing Phi functions...
CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN
@begin: scope:[] from
(byte) cnt#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte) cnt2#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte) cnt3#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte[256]) SCREEN#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024
to:@2
main: scope:[main] from @2
(byte) cnt3#13 ← phi( @2/(byte) cnt3#14 )
(byte) cnt2#13 ← phi( @2/(byte) cnt2#14 )
(byte) cnt#14 ← phi( @2/(byte) cnt#15 )
call inccnt
(byte) inccnt::return#0 ← (byte) inccnt::return#3
to:main::@1
main::@1: scope:[main] from main
(byte) cnt3#7 ← phi( main/(byte) cnt3#5 )
(byte) cnt2#7 ← phi( main/(byte) cnt2#5 )
(byte) cnt#8 ← phi( main/(byte) cnt#6 )
(byte) inccnt::return#4 ← phi( main/(byte) inccnt::return#0 )
(byte~) main::$0 ← (byte) inccnt::return#4
(byte) cnt#1 ← (byte) cnt#8
(byte) cnt2#1 ← (byte) cnt2#7
(byte) cnt3#1 ← (byte) cnt3#7
*((byte[256]) SCREEN#0 + (byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0
(byte) cnt#2 ← ++ (byte) cnt#1
call inccnt
(byte) inccnt::return#1 ← (byte) inccnt::return#3
to:main::@2
main::@2: scope:[main] from main::@1
(byte) cnt3#8 ← phi( main::@1/(byte) cnt3#5 )
(byte) cnt2#8 ← phi( main::@1/(byte) cnt2#5 )
(byte) cnt#9 ← phi( main::@1/(byte) cnt#6 )
(byte) inccnt::return#5 ← phi( main::@1/(byte) inccnt::return#1 )
(byte~) main::$1 ← (byte) inccnt::return#5
(byte) cnt#3 ← (byte) cnt#9
(byte) cnt2#2 ← (byte) cnt2#8
(byte) cnt3#2 ← (byte) cnt3#8
*((byte[256]) SCREEN#0 + (byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte~) main::$1
to:main::@return
main::@return: scope:[main] from main::@2
(byte) cnt3#9 ← phi( main::@2/(byte) cnt3#2 )
(byte) cnt2#9 ← phi( main::@2/(byte) cnt2#2 )
(byte) cnt#10 ← phi( main::@2/(byte) cnt#3 )
(byte) cnt#4 ← (byte) cnt#10
(byte) cnt2#3 ← (byte) cnt2#9
(byte) cnt3#3 ← (byte) cnt3#9
return
to:@return
inccnt: scope:[inccnt] from main main::@1
(byte) cnt3#10 ← phi( main/(byte) cnt3#13 main::@1/(byte) cnt3#1 )
(byte) cnt2#10 ← phi( main/(byte) cnt2#13 main::@1/(byte) cnt2#1 )
(byte) cnt#11 ← phi( main/(byte) cnt#14 main::@1/(byte) cnt#2 )
(byte) cnt#5 ← ++ (byte) cnt#11
(byte) cnt2#4 ← ++ (byte) cnt2#10
(byte) cnt3#4 ← ++ (byte) cnt3#10
(byte) inccnt::return#2 ← (byte) cnt#5
to:inccnt::@return
inccnt::@return: scope:[inccnt] from inccnt
(byte) cnt3#11 ← phi( inccnt/(byte) cnt3#4 )
(byte) cnt2#11 ← phi( inccnt/(byte) cnt2#4 )
(byte) cnt#12 ← phi( inccnt/(byte) cnt#5 )
(byte) inccnt::return#6 ← phi( inccnt/(byte) inccnt::return#2 )
(byte) inccnt::return#3 ← (byte) inccnt::return#6
(byte) cnt#6 ← (byte) cnt#12
(byte) cnt2#5 ← (byte) cnt2#11
(byte) cnt3#5 ← (byte) cnt3#11
return
to:@return
@2: scope:[] from @begin
(byte) cnt3#14 ← phi( @begin/(byte) cnt3#0 )
(byte) cnt2#14 ← phi( @begin/(byte) cnt2#0 )
(byte) cnt#15 ← phi( @begin/(byte) cnt#0 )
call main
to:@3
@3: scope:[] from @2
(byte) cnt3#12 ← phi( @2/(byte) cnt3#3 )
(byte) cnt2#12 ← phi( @2/(byte) cnt2#3 )
(byte) cnt#13 ← phi( @2/(byte) cnt#4 )
(byte) cnt#7 ← (byte) cnt#13
(byte) cnt2#6 ← (byte) cnt2#12
(byte) cnt3#6 ← (byte) cnt3#12
to:@end
@end: scope:[] from @3
@ -200,38 +170,6 @@ SYMBOL TABLE SSA
(byte) cnt#7
(byte) cnt#8
(byte) cnt#9
(byte) cnt2
(byte) cnt2#0
(byte) cnt2#1
(byte) cnt2#10
(byte) cnt2#11
(byte) cnt2#12
(byte) cnt2#13
(byte) cnt2#14
(byte) cnt2#2
(byte) cnt2#3
(byte) cnt2#4
(byte) cnt2#5
(byte) cnt2#6
(byte) cnt2#7
(byte) cnt2#8
(byte) cnt2#9
(byte) cnt3
(byte) cnt3#0
(byte) cnt3#1
(byte) cnt3#10
(byte) cnt3#11
(byte) cnt3#12
(byte) cnt3#13
(byte) cnt3#14
(byte) cnt3#2
(byte) cnt3#3
(byte) cnt3#4
(byte) cnt3#5
(byte) cnt3#6
(byte) cnt3#7
(byte) cnt3#8
(byte) cnt3#9
(byte()) inccnt()
(label) inccnt::@return
(byte) inccnt::return
@ -251,80 +189,40 @@ SYMBOL TABLE SSA
OPTIMIZING CONTROL FLOW GRAPH
Not aliassing across scopes: cnt#14 cnt#15
Not aliassing across scopes: cnt2#13 cnt2#14
Not aliassing across scopes: cnt3#13 cnt3#14
Not aliassing across scopes: inccnt::return#0 inccnt::return#3
Not aliassing across scopes: cnt#8 cnt#6
Not aliassing across scopes: cnt2#7 cnt2#5
Not aliassing across scopes: cnt3#7 cnt3#5
Not aliassing across scopes: main::$0 inccnt::return#4
Not aliassing across scopes: inccnt::return#1 inccnt::return#3
Not aliassing across scopes: cnt#9 cnt#6
Not aliassing across scopes: cnt2#8 cnt2#5
Not aliassing across scopes: cnt3#8 cnt3#5
Not aliassing across scopes: main::$1 inccnt::return#5
Not aliassing across scopes: cnt#11 cnt#14
Not aliassing across scopes: cnt2#10 cnt2#13
Not aliassing across scopes: cnt3#10 cnt3#13
Not aliassing across scopes: inccnt::return#2 cnt#5
Not aliassing across scopes: cnt#13 cnt#4
Not aliassing across scopes: cnt2#12 cnt2#3
Not aliassing across scopes: cnt3#12 cnt3#3
Alias (byte) inccnt::return#0 = (byte) inccnt::return#4
Alias (byte) cnt#1 = (byte) cnt#8
Alias (byte) cnt2#1 = (byte) cnt2#7
Alias (byte) cnt3#1 = (byte) cnt3#7
Alias (byte) inccnt::return#1 = (byte) inccnt::return#5
Alias (byte) cnt#10 = (byte) cnt#3 (byte) cnt#9 (byte) cnt#4
Alias (byte) cnt2#2 = (byte) cnt2#8 (byte) cnt2#9 (byte) cnt2#3
Alias (byte) cnt3#2 = (byte) cnt3#8 (byte) cnt3#9 (byte) cnt3#3
Alias (byte) inccnt::return#2 = (byte) inccnt::return#6 (byte) inccnt::return#3
Alias (byte) cnt#12 = (byte) cnt#5 (byte) cnt#6
Alias (byte) cnt2#11 = (byte) cnt2#4 (byte) cnt2#5
Alias (byte) cnt3#11 = (byte) cnt3#4 (byte) cnt3#5
Alias (byte) cnt#0 = (byte) cnt#15
Alias (byte) cnt2#0 = (byte) cnt2#14
Alias (byte) cnt3#0 = (byte) cnt3#14
Alias (byte) cnt#13 = (byte) cnt#7
Alias (byte) cnt2#12 = (byte) cnt2#6
Alias (byte) cnt3#12 = (byte) cnt3#6
Succesful SSA optimization Pass2AliasElimination
Not aliassing across scopes: cnt#14 cnt#0
Not aliassing across scopes: cnt2#13 cnt2#0
Not aliassing across scopes: cnt3#13 cnt3#0
Not aliassing across scopes: inccnt::return#0 inccnt::return#2
Not aliassing across scopes: cnt#1 cnt#12
Not aliassing across scopes: cnt2#1 cnt2#11
Not aliassing across scopes: cnt3#1 cnt3#11
Not aliassing across scopes: main::$0 inccnt::return#0
Not aliassing across scopes: inccnt::return#1 inccnt::return#2
Not aliassing across scopes: cnt#10 cnt#12
Not aliassing across scopes: cnt2#2 cnt2#11
Not aliassing across scopes: cnt3#2 cnt3#11
Not aliassing across scopes: main::$1 inccnt::return#1
Not aliassing across scopes: cnt#11 cnt#14
Not aliassing across scopes: cnt2#10 cnt2#13
Not aliassing across scopes: cnt3#10 cnt3#13
Not aliassing across scopes: inccnt::return#2 cnt#12
Not aliassing across scopes: cnt#13 cnt#10
Not aliassing across scopes: cnt2#12 cnt2#2
Not aliassing across scopes: cnt3#12 cnt3#2
Redundant Phi (byte) cnt#14 (byte) cnt#0
Redundant Phi (byte) cnt2#13 (byte) cnt2#0
Redundant Phi (byte) cnt3#13 (byte) cnt3#0
Redundant Phi (byte) cnt#1 (byte) cnt#12
Redundant Phi (byte) cnt2#1 (byte) cnt2#11
Redundant Phi (byte) cnt3#1 (byte) cnt3#11
Redundant Phi (byte) cnt#10 (byte) cnt#12
Redundant Phi (byte) cnt2#2 (byte) cnt2#11
Redundant Phi (byte) cnt3#2 (byte) cnt3#11
Redundant Phi (byte) cnt#13 (byte) cnt#10
Redundant Phi (byte) cnt2#12 (byte) cnt2#2
Redundant Phi (byte) cnt3#12 (byte) cnt3#2
Succesful SSA optimization Pass2RedundantPhiElimination
Constant (const byte) cnt#0 = 0
Constant (const byte) cnt2#0 = 0
Constant (const byte) cnt3#0 = 0
Constant (const byte[256]) SCREEN#0 = ((byte*))1024
Succesful SSA optimization Pass2ConstantIdentification
Consolidated array index constant in *(SCREEN#0+0)
@ -346,13 +244,7 @@ OPTIMIZING CONTROL FLOW GRAPH
Inlining constant with var siblings (const byte) cnt#0
Inlining constant with var siblings (const byte) cnt#0
Inlining constant with var siblings (const byte) cnt#0
Inlining constant with var siblings (const byte) cnt2#0
Inlining constant with var siblings (const byte) cnt2#0
Inlining constant with var siblings (const byte) cnt3#0
Inlining constant with var siblings (const byte) cnt3#0
Constant inlined cnt#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined cnt3#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined cnt2#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2ConstantInlining
Block Sequence Planned @begin @2 @end main main::@1 main::@2 main::@return inccnt inccnt::@return
Block Sequence Planned @begin @2 @end main main::@1 main::@2 main::@return inccnt inccnt::@return
@ -362,7 +254,7 @@ Adding NOP phi() at start of @end
Adding NOP phi() at start of main
CALL GRAPH
Calls in [] to main:2
Calls in [main] to inccnt:5 inccnt:13
Calls in [main] to inccnt:5 inccnt:11
Propagating live ranges...
Propagating live ranges...
@ -370,15 +262,9 @@ Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Created 3 initial phi equivalence classes
Created 1 initial phi equivalence classes
Coalesced [10] cnt#16 ← cnt#2
Coalesced [11] cnt2#15 ← cnt2#11
Coalesced [12] cnt3#15 ← cnt3#11
Coalesced down to 3 phi equivalence classes
Coalesced down to 1 phi equivalence classes
Block Sequence Planned @begin @2 @end main main::@1 main::@2 main::@return inccnt inccnt::@return
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @2
@ -390,9 +276,6 @@ Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
@ -406,13 +289,13 @@ FINAL CONTROL FLOW GRAPH
[3] phi() [ ] ( )
main: scope:[main] from @2
[4] phi() [ ] ( main:2 [ ] )
[5] call inccnt [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] )
[6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] )
[5] call inccnt [ inccnt::return#2 cnt#12 ] ( main:2 [ inccnt::return#2 cnt#12 ] )
[6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 ] ( main:2 [ inccnt::return#0 cnt#12 ] )
to:main::@1
main::@1: scope:[main] from main
[7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] )
[8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ cnt#12 cnt2#11 cnt3#11 ] )
[9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 cnt2#11 cnt3#11 ] ( main:2 [ cnt#2 cnt2#11 cnt3#11 ] )
[7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 ] ( main:2 [ main::$0 cnt#12 ] )
[8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 ] ( main:2 [ cnt#12 ] )
[9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 ] ( main:2 [ cnt#2 ] )
[10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] )
[11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] )
to:main::@2
@ -424,16 +307,12 @@ main::@return: scope:[main] from main::@2
[14] return [ ] ( main:2 [ ] )
to:@return
inccnt: scope:[inccnt] from main main::@1
[15] (byte) cnt3#10 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt3#11 ) [ cnt#11 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#11 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#11 cnt2#10 cnt3#10 ] )
[15] (byte) cnt2#10 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt2#11 ) [ cnt#11 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#11 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#11 cnt2#10 cnt3#10 ] )
[15] (byte) cnt#11 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt#2 ) [ cnt#11 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#11 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#11 cnt2#10 cnt3#10 ] )
[16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#12 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#12 cnt2#10 cnt3#10 ] )
[17] (byte) cnt2#11 ← ++ (byte) cnt2#10 [ cnt#12 cnt3#10 cnt2#11 ] ( main:2::inccnt:5 [ cnt#12 cnt3#10 cnt2#11 ] main:2::inccnt:10 [ cnt#12 cnt3#10 cnt2#11 ] )
[18] (byte) cnt3#11 ← ++ (byte) cnt3#10 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ cnt#12 cnt2#11 cnt3#11 ] )
[19] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] )
[15] (byte) cnt#11 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) cnt#2 ) [ cnt#11 ] ( main:2::inccnt:5 [ cnt#11 ] main:2::inccnt:10 [ cnt#11 ] )
[16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 ] ( main:2::inccnt:5 [ cnt#12 ] main:2::inccnt:10 [ cnt#12 ] )
[17] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] )
to:inccnt::@return
inccnt::@return: scope:[inccnt] from inccnt
[20] return [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] )
[18] return [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] )
to:@return
DOMINATORS
@ -459,14 +338,8 @@ VARIABLE REGISTER WEIGHTS
(byte[256]) SCREEN
(byte) cnt
(byte) cnt#11 4.0
(byte) cnt#12 0.6666666666666666
(byte) cnt#12 0.8571428571428571
(byte) cnt#2 4.0
(byte) cnt2
(byte) cnt2#10 2.0
(byte) cnt2#11 0.4444444444444444
(byte) cnt3
(byte) cnt3#10 1.3333333333333333
(byte) cnt3#11 0.5
(byte()) inccnt()
(byte) inccnt::return
(byte) inccnt::return#0 4.0
@ -478,8 +351,6 @@ VARIABLE REGISTER WEIGHTS
Initial phi equivalence classes
[ cnt#11 cnt#2 ]
[ cnt2#10 cnt2#11 ]
[ cnt3#10 cnt3#11 ]
Added variable inccnt::return#0 to zero page equivalence class [ inccnt::return#0 ]
Added variable main::$0 to zero page equivalence class [ main::$0 ]
Added variable inccnt::return#1 to zero page equivalence class [ inccnt::return#1 ]
@ -488,8 +359,6 @@ Added variable cnt#12 to zero page equivalence class [ cnt#12 ]
Added variable inccnt::return#2 to zero page equivalence class [ inccnt::return#2 ]
Complete equivalence classes
[ cnt#11 cnt#2 ]
[ cnt2#10 cnt2#11 ]
[ cnt3#10 cnt3#11 ]
[ inccnt::return#0 ]
[ main::$0 ]
[ inccnt::return#1 ]
@ -497,14 +366,12 @@ Complete equivalence classes
[ cnt#12 ]
[ inccnt::return#2 ]
Allocated zp ZP_BYTE:2 [ cnt#11 cnt#2 ]
Allocated zp ZP_BYTE:3 [ cnt2#10 cnt2#11 ]
Allocated zp ZP_BYTE:4 [ cnt3#10 cnt3#11 ]
Allocated zp ZP_BYTE:5 [ inccnt::return#0 ]
Allocated zp ZP_BYTE:6 [ main::$0 ]
Allocated zp ZP_BYTE:7 [ inccnt::return#1 ]
Allocated zp ZP_BYTE:8 [ main::$1 ]
Allocated zp ZP_BYTE:9 [ cnt#12 ]
Allocated zp ZP_BYTE:10 [ inccnt::return#2 ]
Allocated zp ZP_BYTE:3 [ inccnt::return#0 ]
Allocated zp ZP_BYTE:4 [ main::$0 ]
Allocated zp ZP_BYTE:5 [ inccnt::return#1 ]
Allocated zp ZP_BYTE:6 [ main::$1 ]
Allocated zp ZP_BYTE:7 [ cnt#12 ]
Allocated zp ZP_BYTE:8 [ inccnt::return#2 ]
INITIAL ASM
//SEG0 Basic Upstart
@ -514,9 +381,7 @@ INITIAL ASM
//SEG1 Global Constants & labels
.label SCREEN = $400
.label cnt = 2
.label cnt2 = 3
.label cnt3 = 4
.label cnt_12 = 9
.label cnt_12 = 7
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @2 [phi:@begin->@2]
@ -535,108 +400,90 @@ bend_from_b2:
bend:
//SEG9 main
main: {
.label _0 = 6
.label _1 = 8
//SEG10 [5] call inccnt [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] )
.label _0 = 4
.label _1 = 6
//SEG10 [5] call inccnt [ inccnt::return#2 cnt#12 ] ( main:2 [ inccnt::return#2 cnt#12 ] )
//SEG11 [15] phi from main to inccnt [phi:main->inccnt]
inccnt_from_main:
//SEG12 [15] phi (byte) cnt3#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#0] -- vbuz1=vbuc1
lda #0
sta cnt3
//SEG13 [15] phi (byte) cnt2#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#1] -- vbuz1=vbuc1
lda #0
sta cnt2
//SEG14 [15] phi (byte) cnt#11 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#2] -- vbuz1=vbuc1
//SEG12 [15] phi (byte) cnt#11 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#0] -- vbuz1=vbuc1
lda #0
sta cnt
jsr inccnt
//SEG15 [6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ) -- vbuz1=vbuz2
//SEG13 [6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 ] ( main:2 [ inccnt::return#0 cnt#12 ] ) -- vbuz1=vbuz2
lda inccnt.return_2
sta inccnt.return
jmp b1
//SEG16 main::@1
//SEG14 main::@1
b1:
//SEG17 [7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ) -- vbuz1=vbuz2
//SEG15 [7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 ] ( main:2 [ main::$0 cnt#12 ] ) -- vbuz1=vbuz2
lda inccnt.return
sta _0
//SEG18 [8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ cnt#12 cnt2#11 cnt3#11 ] ) -- _deref_pbuc1=vbuz1
//SEG16 [8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 ] ( main:2 [ cnt#12 ] ) -- _deref_pbuc1=vbuz1
lda _0
sta SCREEN+0
//SEG19 [9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 cnt2#11 cnt3#11 ] ( main:2 [ cnt#2 cnt2#11 cnt3#11 ] ) -- vbuz1=_inc_vbuz2
//SEG17 [9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 ] ( main:2 [ cnt#2 ] ) -- vbuz1=_inc_vbuz2
ldy cnt_12
iny
sty cnt
//SEG20 [10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] )
//SEG21 [15] phi from main::@1 to inccnt [phi:main::@1->inccnt]
//SEG18 [10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] )
//SEG19 [15] phi from main::@1 to inccnt [phi:main::@1->inccnt]
inccnt_from_b1:
//SEG22 [15] phi (byte) cnt3#10 = (byte) cnt3#11 [phi:main::@1->inccnt#0] -- register_copy
//SEG23 [15] phi (byte) cnt2#10 = (byte) cnt2#11 [phi:main::@1->inccnt#1] -- register_copy
//SEG24 [15] phi (byte) cnt#11 = (byte) cnt#2 [phi:main::@1->inccnt#2] -- register_copy
//SEG20 [15] phi (byte) cnt#11 = (byte) cnt#2 [phi:main::@1->inccnt#0] -- register_copy
jsr inccnt
//SEG25 [11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] ) -- vbuz1=vbuz2
//SEG21 [11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] ) -- vbuz1=vbuz2
lda inccnt.return_2
sta inccnt.return_1
jmp b2
//SEG26 main::@2
//SEG22 main::@2
b2:
//SEG27 [12] (byte~) main::$1 ← (byte) inccnt::return#1 [ main::$1 ] ( main:2 [ main::$1 ] ) -- vbuz1=vbuz2
//SEG23 [12] (byte~) main::$1 ← (byte) inccnt::return#1 [ main::$1 ] ( main:2 [ main::$1 ] ) -- vbuz1=vbuz2
lda inccnt.return_1
sta _1
//SEG28 [13] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte~) main::$1 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuz1
//SEG24 [13] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte~) main::$1 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuz1
lda _1
sta SCREEN+1
jmp breturn
//SEG29 main::@return
//SEG25 main::@return
breturn:
//SEG30 [14] return [ ] ( main:2 [ ] )
//SEG26 [14] return [ ] ( main:2 [ ] )
rts
}
//SEG31 inccnt
//SEG27 inccnt
inccnt: {
.label return = 5
.label return_1 = 7
.label return_2 = $a
//SEG32 [16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#12 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#12 cnt2#10 cnt3#10 ] ) -- vbuz1=_inc_vbuz2
.label return = 3
.label return_1 = 5
.label return_2 = 8
//SEG28 [16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 ] ( main:2::inccnt:5 [ cnt#12 ] main:2::inccnt:10 [ cnt#12 ] ) -- vbuz1=_inc_vbuz2
ldy cnt
iny
sty cnt_12
//SEG33 [17] (byte) cnt2#11 ← ++ (byte) cnt2#10 [ cnt#12 cnt3#10 cnt2#11 ] ( main:2::inccnt:5 [ cnt#12 cnt3#10 cnt2#11 ] main:2::inccnt:10 [ cnt#12 cnt3#10 cnt2#11 ] ) -- vbuz1=_inc_vbuz1
inc cnt2
//SEG34 [18] (byte) cnt3#11 ← ++ (byte) cnt3#10 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ cnt#12 cnt2#11 cnt3#11 ] ) -- vbuz1=_inc_vbuz1
inc cnt3
//SEG35 [19] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) -- vbuz1=vbuz2
//SEG29 [17] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] ) -- vbuz1=vbuz2
lda cnt_12
sta return_2
jmp breturn
//SEG36 inccnt::@return
//SEG30 inccnt::@return
breturn:
//SEG37 [20] return [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] )
//SEG31 [18] return [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] )
rts
}
REGISTER UPLIFT POTENTIAL REGISTERS
Potential registers zp ZP_BYTE:2 [ cnt#11 cnt#2 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ cnt2#10 cnt2#11 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:4 [ cnt3#10 cnt3#11 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:5 [ inccnt::return#0 ] : zp ZP_BYTE:5 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:6 [ main::$0 ] : zp ZP_BYTE:6 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:7 [ inccnt::return#1 ] : zp ZP_BYTE:7 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:8 [ main::$1 ] : zp ZP_BYTE:8 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:9 [ cnt#12 ] : zp ZP_BYTE:9 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:10 [ inccnt::return#2 ] : zp ZP_BYTE:10 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ inccnt::return#0 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:4 [ main::$0 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:5 [ inccnt::return#1 ] : zp ZP_BYTE:5 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:6 [ main::$1 ] : zp ZP_BYTE:6 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:7 [ cnt#12 ] : zp ZP_BYTE:7 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:8 [ inccnt::return#2 ] : zp ZP_BYTE:8 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [] 8: zp ZP_BYTE:2 [ cnt#11 cnt#2 ] 2.44: zp ZP_BYTE:3 [ cnt2#10 cnt2#11 ] 1.83: zp ZP_BYTE:4 [ cnt3#10 cnt3#11 ] 0.67: zp ZP_BYTE:9 [ cnt#12 ]
Uplift Scope [inccnt] 4: zp ZP_BYTE:5 [ inccnt::return#0 ] 4: zp ZP_BYTE:7 [ inccnt::return#1 ] 1.5: zp ZP_BYTE:10 [ inccnt::return#2 ]
Uplift Scope [main] 4: zp ZP_BYTE:6 [ main::$0 ] 4: zp ZP_BYTE:8 [ main::$1 ]
Uplift Scope [inccnt] 4: zp ZP_BYTE:3 [ inccnt::return#0 ] 4: zp ZP_BYTE:5 [ inccnt::return#1 ] 1.5: zp ZP_BYTE:8 [ inccnt::return#2 ]
Uplift Scope [] 8: zp ZP_BYTE:2 [ cnt#11 cnt#2 ] 0.86: zp ZP_BYTE:7 [ cnt#12 ]
Uplift Scope [main] 4: zp ZP_BYTE:4 [ main::$0 ] 4: zp ZP_BYTE:6 [ main::$1 ]
Uplifting [] best 116 combination reg byte a [ cnt#11 cnt#2 ] reg byte y [ cnt2#10 cnt2#11 ] reg byte x [ cnt3#10 cnt3#11 ] zp ZP_BYTE:9 [ cnt#12 ]
Limited combination testing to 100 combinations of 256 possible.
Uplifting [inccnt] best 95 combination reg byte a [ inccnt::return#0 ] reg byte a [ inccnt::return#1 ] reg byte a [ inccnt::return#2 ]
Uplifting [main] best 83 combination reg byte a [ main::$0 ] reg byte a [ main::$1 ]
Attempting to uplift remaining variables inzp ZP_BYTE:9 [ cnt#12 ]
Uplifting [] best 83 combination zp ZP_BYTE:9 [ cnt#12 ]
Allocated (was zp ZP_BYTE:9) zp ZP_BYTE:2 [ cnt#12 ]
Uplifting [inccnt] best 92 combination reg byte a [ inccnt::return#0 ] reg byte a [ inccnt::return#1 ] reg byte a [ inccnt::return#2 ]
Uplifting [] best 76 combination reg byte x [ cnt#11 cnt#2 ] reg byte x [ cnt#12 ]
Uplifting [main] best 64 combination reg byte a [ main::$0 ] reg byte a [ main::$1 ]
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart
@ -645,7 +492,6 @@ ASSEMBLER BEFORE OPTIMIZATION
.pc = $80d "Program"
//SEG1 Global Constants & labels
.label SCREEN = $400
.label cnt = 2
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @2 [phi:@begin->@2]
@ -664,67 +510,53 @@ bend_from_b2:
bend:
//SEG9 main
main: {
//SEG10 [5] call inccnt [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] )
//SEG10 [5] call inccnt [ inccnt::return#2 cnt#12 ] ( main:2 [ inccnt::return#2 cnt#12 ] )
//SEG11 [15] phi from main to inccnt [phi:main->inccnt]
inccnt_from_main:
//SEG12 [15] phi (byte) cnt3#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#0] -- vbuxx=vbuc1
//SEG12 [15] phi (byte) cnt#11 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#0] -- vbuxx=vbuc1
ldx #0
//SEG13 [15] phi (byte) cnt2#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#1] -- vbuyy=vbuc1
ldy #0
//SEG14 [15] phi (byte) cnt#11 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#2] -- vbuaa=vbuc1
lda #0
jsr inccnt
//SEG15 [6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] )
//SEG13 [6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 ] ( main:2 [ inccnt::return#0 cnt#12 ] )
// (byte) inccnt::return#0 = (byte) inccnt::return#2 // register copy reg byte a
jmp b1
//SEG16 main::@1
//SEG14 main::@1
b1:
//SEG17 [7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] )
//SEG15 [7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 ] ( main:2 [ main::$0 cnt#12 ] )
// (byte~) main::$0 = (byte) inccnt::return#0 // register copy reg byte a
//SEG18 [8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ cnt#12 cnt2#11 cnt3#11 ] ) -- _deref_pbuc1=vbuaa
//SEG16 [8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 ] ( main:2 [ cnt#12 ] ) -- _deref_pbuc1=vbuaa
sta SCREEN+0
//SEG19 [9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 cnt2#11 cnt3#11 ] ( main:2 [ cnt#2 cnt2#11 cnt3#11 ] ) -- vbuaa=_inc_vbuz1
lda cnt
clc
adc #1
//SEG20 [10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] )
//SEG21 [15] phi from main::@1 to inccnt [phi:main::@1->inccnt]
//SEG17 [9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 ] ( main:2 [ cnt#2 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG18 [10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] )
//SEG19 [15] phi from main::@1 to inccnt [phi:main::@1->inccnt]
inccnt_from_b1:
//SEG22 [15] phi (byte) cnt3#10 = (byte) cnt3#11 [phi:main::@1->inccnt#0] -- register_copy
//SEG23 [15] phi (byte) cnt2#10 = (byte) cnt2#11 [phi:main::@1->inccnt#1] -- register_copy
//SEG24 [15] phi (byte) cnt#11 = (byte) cnt#2 [phi:main::@1->inccnt#2] -- register_copy
//SEG20 [15] phi (byte) cnt#11 = (byte) cnt#2 [phi:main::@1->inccnt#0] -- register_copy
jsr inccnt
//SEG25 [11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] )
//SEG21 [11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] )
// (byte) inccnt::return#1 = (byte) inccnt::return#2 // register copy reg byte a
jmp b2
//SEG26 main::@2
//SEG22 main::@2
b2:
//SEG27 [12] (byte~) main::$1 ← (byte) inccnt::return#1 [ main::$1 ] ( main:2 [ main::$1 ] )
//SEG23 [12] (byte~) main::$1 ← (byte) inccnt::return#1 [ main::$1 ] ( main:2 [ main::$1 ] )
// (byte~) main::$1 = (byte) inccnt::return#1 // register copy reg byte a
//SEG28 [13] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte~) main::$1 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuaa
//SEG24 [13] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte~) main::$1 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuaa
sta SCREEN+1
jmp breturn
//SEG29 main::@return
//SEG25 main::@return
breturn:
//SEG30 [14] return [ ] ( main:2 [ ] )
//SEG26 [14] return [ ] ( main:2 [ ] )
rts
}
//SEG31 inccnt
//SEG27 inccnt
inccnt: {
//SEG32 [16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#12 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#12 cnt2#10 cnt3#10 ] ) -- vbuz1=_inc_vbuaa
clc
adc #1
sta cnt
//SEG33 [17] (byte) cnt2#11 ← ++ (byte) cnt2#10 [ cnt#12 cnt3#10 cnt2#11 ] ( main:2::inccnt:5 [ cnt#12 cnt3#10 cnt2#11 ] main:2::inccnt:10 [ cnt#12 cnt3#10 cnt2#11 ] ) -- vbuyy=_inc_vbuyy
iny
//SEG34 [18] (byte) cnt3#11 ← ++ (byte) cnt3#10 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ cnt#12 cnt2#11 cnt3#11 ] ) -- vbuxx=_inc_vbuxx
//SEG28 [16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 ] ( main:2::inccnt:5 [ cnt#12 ] main:2::inccnt:10 [ cnt#12 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG35 [19] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) -- vbuaa=vbuz1
lda cnt
//SEG29 [17] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] ) -- vbuaa=vbuxx
txa
jmp breturn
//SEG36 inccnt::@return
//SEG30 inccnt::@return
breturn:
//SEG37 [20] return [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] )
//SEG31 [18] return [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] )
rts
}
@ -736,9 +568,6 @@ Removing instruction jmp b2
Removing instruction jmp breturn
Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination
Replacing instruction lda #0 with TXA
Removing instruction lda cnt
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Removing instruction bbegin:
Removing instruction b2_from_bbegin:
Removing instruction main_from_b2:
@ -761,15 +590,9 @@ FINAL SYMBOL TABLE
(byte[256]) SCREEN
(const byte[256]) SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) 1024
(byte) cnt
(byte) cnt#11 reg byte a 4.0
(byte) cnt#12 cnt zp ZP_BYTE:2 0.6666666666666666
(byte) cnt#2 reg byte a 4.0
(byte) cnt2
(byte) cnt2#10 reg byte y 2.0
(byte) cnt2#11 reg byte y 0.4444444444444444
(byte) cnt3
(byte) cnt3#10 reg byte x 1.3333333333333333
(byte) cnt3#11 reg byte x 0.5
(byte) cnt#11 reg byte x 4.0
(byte) cnt#12 reg byte x 0.8571428571428571
(byte) cnt#2 reg byte x 4.0
(byte()) inccnt()
(label) inccnt::@return
(byte) inccnt::return
@ -783,19 +606,17 @@ FINAL SYMBOL TABLE
(label) main::@2
(label) main::@return
reg byte a [ cnt#11 cnt#2 ]
reg byte y [ cnt2#10 cnt2#11 ]
reg byte x [ cnt3#10 cnt3#11 ]
reg byte x [ cnt#11 cnt#2 ]
reg byte a [ inccnt::return#0 ]
reg byte a [ main::$0 ]
reg byte a [ inccnt::return#1 ]
reg byte a [ main::$1 ]
zp ZP_BYTE:2 [ cnt#12 ]
reg byte x [ cnt#12 ]
reg byte a [ inccnt::return#2 ]
FINAL ASSEMBLER
Score: 62
Score: 46
//SEG0 Basic Upstart
.pc = $801 "Basic"
@ -803,7 +624,6 @@ Score: 62
.pc = $80d "Program"
//SEG1 Global Constants & labels
.label SCREEN = $400
.label cnt = 2
//SEG2 @begin
//SEG3 [1] phi from @begin to @2 [phi:@begin->@2]
//SEG4 @2
@ -814,56 +634,43 @@ Score: 62
//SEG8 @end
//SEG9 main
main: {
//SEG10 [5] call inccnt [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] )
//SEG10 [5] call inccnt [ inccnt::return#2 cnt#12 ] ( main:2 [ inccnt::return#2 cnt#12 ] )
//SEG11 [15] phi from main to inccnt [phi:main->inccnt]
//SEG12 [15] phi (byte) cnt3#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#0] -- vbuxx=vbuc1
//SEG12 [15] phi (byte) cnt#11 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#0] -- vbuxx=vbuc1
ldx #0
//SEG13 [15] phi (byte) cnt2#10 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#1] -- vbuyy=vbuc1
ldy #0
//SEG14 [15] phi (byte) cnt#11 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->inccnt#2] -- vbuaa=vbuc1
txa
jsr inccnt
//SEG15 [6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ inccnt::return#0 cnt#12 cnt2#11 cnt3#11 ] )
//SEG13 [6] (byte) inccnt::return#0 ← (byte) inccnt::return#2 [ inccnt::return#0 cnt#12 ] ( main:2 [ inccnt::return#0 cnt#12 ] )
// (byte) inccnt::return#0 = (byte) inccnt::return#2 // register copy reg byte a
//SEG16 main::@1
//SEG17 [7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ main::$0 cnt#12 cnt2#11 cnt3#11 ] )
//SEG14 main::@1
//SEG15 [7] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#12 ] ( main:2 [ main::$0 cnt#12 ] )
// (byte~) main::$0 = (byte) inccnt::return#0 // register copy reg byte a
//SEG18 [8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2 [ cnt#12 cnt2#11 cnt3#11 ] ) -- _deref_pbuc1=vbuaa
//SEG16 [8] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte~) main::$0 [ cnt#12 ] ( main:2 [ cnt#12 ] ) -- _deref_pbuc1=vbuaa
sta SCREEN+0
//SEG19 [9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 cnt2#11 cnt3#11 ] ( main:2 [ cnt#2 cnt2#11 cnt3#11 ] ) -- vbuaa=_inc_vbuz1
lda cnt
clc
adc #1
//SEG20 [10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] )
//SEG21 [15] phi from main::@1 to inccnt [phi:main::@1->inccnt]
//SEG22 [15] phi (byte) cnt3#10 = (byte) cnt3#11 [phi:main::@1->inccnt#0] -- register_copy
//SEG23 [15] phi (byte) cnt2#10 = (byte) cnt2#11 [phi:main::@1->inccnt#1] -- register_copy
//SEG24 [15] phi (byte) cnt#11 = (byte) cnt#2 [phi:main::@1->inccnt#2] -- register_copy
//SEG17 [9] (byte) cnt#2 ← ++ (byte) cnt#12 [ cnt#2 ] ( main:2 [ cnt#2 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG18 [10] call inccnt [ inccnt::return#2 ] ( main:2 [ inccnt::return#2 ] )
//SEG19 [15] phi from main::@1 to inccnt [phi:main::@1->inccnt]
//SEG20 [15] phi (byte) cnt#11 = (byte) cnt#2 [phi:main::@1->inccnt#0] -- register_copy
jsr inccnt
//SEG25 [11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] )
//SEG21 [11] (byte) inccnt::return#1 ← (byte) inccnt::return#2 [ inccnt::return#1 ] ( main:2 [ inccnt::return#1 ] )
// (byte) inccnt::return#1 = (byte) inccnt::return#2 // register copy reg byte a
//SEG26 main::@2
//SEG27 [12] (byte~) main::$1 ← (byte) inccnt::return#1 [ main::$1 ] ( main:2 [ main::$1 ] )
//SEG22 main::@2
//SEG23 [12] (byte~) main::$1 ← (byte) inccnt::return#1 [ main::$1 ] ( main:2 [ main::$1 ] )
// (byte~) main::$1 = (byte) inccnt::return#1 // register copy reg byte a
//SEG28 [13] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte~) main::$1 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuaa
//SEG24 [13] *((const byte[256]) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte~) main::$1 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuaa
sta SCREEN+1
//SEG29 main::@return
//SEG30 [14] return [ ] ( main:2 [ ] )
//SEG25 main::@return
//SEG26 [14] return [ ] ( main:2 [ ] )
rts
}
//SEG31 inccnt
//SEG27 inccnt
inccnt: {
//SEG32 [16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 cnt2#10 cnt3#10 ] ( main:2::inccnt:5 [ cnt#12 cnt2#10 cnt3#10 ] main:2::inccnt:10 [ cnt#12 cnt2#10 cnt3#10 ] ) -- vbuz1=_inc_vbuaa
clc
adc #1
sta cnt
//SEG33 [17] (byte) cnt2#11 ← ++ (byte) cnt2#10 [ cnt#12 cnt3#10 cnt2#11 ] ( main:2::inccnt:5 [ cnt#12 cnt3#10 cnt2#11 ] main:2::inccnt:10 [ cnt#12 cnt3#10 cnt2#11 ] ) -- vbuyy=_inc_vbuyy
iny
//SEG34 [18] (byte) cnt3#11 ← ++ (byte) cnt3#10 [ cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ cnt#12 cnt2#11 cnt3#11 ] ) -- vbuxx=_inc_vbuxx
//SEG28 [16] (byte) cnt#12 ← ++ (byte) cnt#11 [ cnt#12 ] ( main:2::inccnt:5 [ cnt#12 ] main:2::inccnt:10 [ cnt#12 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG35 [19] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ) -- vbuaa=vbuz1
//SEG36 inccnt::@return
//SEG37 [20] return [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 cnt2#11 cnt3#11 ] )
//SEG29 [17] (byte) inccnt::return#2 ← (byte) cnt#12 [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] ) -- vbuaa=vbuxx
txa
//SEG30 inccnt::@return
//SEG31 [18] return [ inccnt::return#2 cnt#12 ] ( main:2::inccnt:5 [ inccnt::return#2 cnt#12 ] main:2::inccnt:10 [ inccnt::return#2 cnt#12 ] )
rts
}

View File

@ -4,15 +4,9 @@
(byte[256]) SCREEN
(const byte[256]) SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) 1024
(byte) cnt
(byte) cnt#11 reg byte a 4.0
(byte) cnt#12 cnt zp ZP_BYTE:2 0.6666666666666666
(byte) cnt#2 reg byte a 4.0
(byte) cnt2
(byte) cnt2#10 reg byte y 2.0
(byte) cnt2#11 reg byte y 0.4444444444444444
(byte) cnt3
(byte) cnt3#10 reg byte x 1.3333333333333333
(byte) cnt3#11 reg byte x 0.5
(byte) cnt#11 reg byte x 4.0
(byte) cnt#12 reg byte x 0.8571428571428571
(byte) cnt#2 reg byte x 4.0
(byte()) inccnt()
(label) inccnt::@return
(byte) inccnt::return
@ -26,12 +20,10 @@
(label) main::@2
(label) main::@return
reg byte a [ cnt#11 cnt#2 ]
reg byte y [ cnt2#10 cnt2#11 ]
reg byte x [ cnt3#10 cnt3#11 ]
reg byte x [ cnt#11 cnt#2 ]
reg byte a [ inccnt::return#0 ]
reg byte a [ main::$0 ]
reg byte a [ inccnt::return#1 ]
reg byte a [ main::$1 ]
zp ZP_BYTE:2 [ cnt#12 ]
reg byte x [ cnt#12 ]
reg byte a [ inccnt::return#2 ]

View File

@ -33,21 +33,12 @@ lvaluevar: {
jmp b1
}
rvaluevar: {
.label screen = 2
lda #<$400
sta screen
lda #>$400
sta screen+1
ldx #2
b1:
cpx #$a
bcc b2
rts
b2:
inc screen
bne !+
inc screen+1
!:
inx
jmp b1
}

View File

@ -46,42 +46,40 @@ rvaluevar: scope:[rvaluevar] from main::@2
[20] phi() [ ] ( main:2::rvaluevar:9 [ ] )
to:rvaluevar::@1
rvaluevar::@1: scope:[rvaluevar] from rvaluevar rvaluevar::@2
[21] (byte*) rvaluevar::screen#2 ← phi( rvaluevar/((byte*))(word/signed word/dword/signed dword) 1024 rvaluevar::@2/(byte*) rvaluevar::screen#1 ) [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] )
[21] (byte) rvaluevar::i#2 ← phi( rvaluevar/(byte/signed byte/word/signed word/dword/signed dword) 2 rvaluevar::@2/(byte) rvaluevar::i#1 ) [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] )
[22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] )
[21] (byte) rvaluevar::i#2 ← phi( rvaluevar/(byte/signed byte/word/signed word/dword/signed dword) 2 rvaluevar::@2/(byte) rvaluevar::i#1 ) [ rvaluevar::i#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 ] )
[22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 ] )
to:rvaluevar::@return
rvaluevar::@return: scope:[rvaluevar] from rvaluevar::@1
[23] return [ ] ( main:2::rvaluevar:9 [ ] )
to:@return
rvaluevar::@2: scope:[rvaluevar] from rvaluevar::@1
[24] (byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#1 ] )
[25] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 rvaluevar::screen#1 ] )
[24] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 ] )
to:rvaluevar::@1
rvalue: scope:[rvalue] from main::@1
[26] phi() [ ] ( main:2::rvalue:7 [ ] )
[25] phi() [ ] ( main:2::rvalue:7 [ ] )
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
[27] (byte) rvalue::i#2 ← phi( rvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 rvalue::@2/(byte) rvalue::i#1 ) [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
[28] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
[26] (byte) rvalue::i#2 ← phi( rvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 rvalue::@2/(byte) rvalue::i#1 ) [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
[27] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
to:rvalue::@return
rvalue::@return: scope:[rvalue] from rvalue::@1
[29] return [ ] ( main:2::rvalue:7 [ ] )
[28] return [ ] ( main:2::rvalue:7 [ ] )
to:@return
rvalue::@2: scope:[rvalue] from rvalue::@1
[30] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] )
[29] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] )
to:rvalue::@1
lvalue: scope:[lvalue] from main
[31] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] )
[32] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] )
[30] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] )
[31] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] )
to:lvalue::@1
lvalue::@1: scope:[lvalue] from lvalue lvalue::@2
[33] (byte) lvalue::i#2 ← phi( lvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 lvalue::@2/(byte) lvalue::i#1 ) [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
[34] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
[32] (byte) lvalue::i#2 ← phi( lvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 lvalue::@2/(byte) lvalue::i#1 ) [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
[33] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
to:lvalue::@return
lvalue::@return: scope:[lvalue] from lvalue::@1
[35] return [ ] ( main:2::lvalue:5 [ ] )
[34] return [ ] ( main:2::lvalue:5 [ ] )
to:@return
lvalue::@2: scope:[lvalue] from lvalue::@1
[36] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
[37] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] )
[35] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
[36] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] )
to:lvalue::@1

View File

@ -273,7 +273,13 @@ Eliminating unused variable - keeping the call (void~) main::$0
Eliminating unused variable - keeping the call (void~) main::$1
Eliminating unused variable - keeping the call (void~) main::$2
Eliminating unused variable - keeping the call (void~) main::$3
Eliminating unused variable (byte) rvalue::b and assignment [15] (byte) rvalue::b ← *((byte[1024]) rvalue::SCREEN)
Eliminating unused variable rvalue::b(null) and assignment [16] rvalue::b(null) ← *((byte[1024]) rvalue::SCREEN + (byte/signed byte/word/signed word/dword/signed dword) 1)
Eliminating unused variable rvalue::b(null) and assignment [20] rvalue::b(null) ← *((byte[1024]) rvalue::SCREEN + (byte) rvalue::i)
Eliminating unused variable (byte) rvaluevar::b and assignment [36] (byte) rvaluevar::b ← *((byte*) rvaluevar::screen)
Eliminating unused variable (byte[1024]) rvalue::SCREEN and assignment [14] (byte[1024]) rvalue::SCREEN ← ((byte*)) (word/signed word/dword/signed dword) 1024
Eliminating unused variable (byte*) rvaluevar::screen and assignment [29] (byte*) rvaluevar::screen ← ((byte*)) (word/signed word/dword/signed dword) 1024
Eliminating unused variable rvaluevar::screen(null) and assignment [33] rvaluevar::screen(null) ← ++ rvaluevar::screen(null)
Removing empty block @1
Removing empty block lvalue::@4
Removing empty block lvalue::@3
@ -339,9 +345,6 @@ lvalue::@return: scope:[lvalue] from lvalue::@1
return
to:@return
rvalue: scope:[rvalue] from main::@1
(byte[1024]) rvalue::SCREEN#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024
(byte) rvalue::b#0 ← *((byte[1024]) rvalue::SCREEN#0)
(byte) rvalue::b#1 ← *((byte[1024]) rvalue::SCREEN#0 + (byte/signed byte/word/signed word/dword/signed dword) 1)
(byte) rvalue::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 2
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
@ -351,7 +354,6 @@ rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
to:rvalue::@return
rvalue::@2: scope:[rvalue] from rvalue::@1
(byte) rvalue::i#3 ← phi( rvalue::@1/(byte) rvalue::i#2 )
(byte) rvalue::b#2 ← *((byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#3)
(byte) rvalue::i#1 ← ++ (byte) rvalue::i#3
to:rvalue::@1
rvalue::@return: scope:[rvalue] from rvalue::@1
@ -381,19 +383,15 @@ lvaluevar::@return: scope:[lvaluevar] from lvaluevar::@1
return
to:@return
rvaluevar: scope:[rvaluevar] from main::@2
(byte*) rvaluevar::screen#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024
(byte) rvaluevar::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 2
to:rvaluevar::@1
rvaluevar::@1: scope:[rvaluevar] from rvaluevar rvaluevar::@2
(byte*) rvaluevar::screen#3 ← phi( rvaluevar/(byte*) rvaluevar::screen#0 rvaluevar::@2/(byte*) rvaluevar::screen#1 )
(byte) rvaluevar::i#2 ← phi( rvaluevar/(byte) rvaluevar::i#0 rvaluevar::@2/(byte) rvaluevar::i#1 )
(bool~) rvaluevar::$0 ← (byte) rvaluevar::i#2 < (byte/signed byte/word/signed word/dword/signed dword) 10
if((bool~) rvaluevar::$0) goto rvaluevar::@2
to:rvaluevar::@return
rvaluevar::@2: scope:[rvaluevar] from rvaluevar::@1
(byte) rvaluevar::i#3 ← phi( rvaluevar::@1/(byte) rvaluevar::i#2 )
(byte*) rvaluevar::screen#2 ← phi( rvaluevar::@1/(byte*) rvaluevar::screen#3 )
(byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2
(byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#3
to:rvaluevar::@1
rvaluevar::@return: scope:[rvaluevar] from rvaluevar::@1
@ -453,12 +451,6 @@ SYMBOL TABLE SSA
(label) rvalue::@1
(label) rvalue::@2
(label) rvalue::@return
(byte[1024]) rvalue::SCREEN
(byte[1024]) rvalue::SCREEN#0
(byte) rvalue::b
(byte) rvalue::b#0
(byte) rvalue::b#1
(byte) rvalue::b#2
(byte) rvalue::i
(byte) rvalue::i#0
(byte) rvalue::i#1
@ -474,11 +466,6 @@ SYMBOL TABLE SSA
(byte) rvaluevar::i#1
(byte) rvaluevar::i#2
(byte) rvaluevar::i#3
(byte*) rvaluevar::screen
(byte*) rvaluevar::screen#0
(byte*) rvaluevar::screen#1
(byte*) rvaluevar::screen#2
(byte*) rvaluevar::screen#3
OPTIMIZING CONTROL FLOW GRAPH
Culled Empty Block (label) main::@4
@ -489,7 +476,6 @@ Alias (byte) rvalue::i#2 = (byte) rvalue::i#3
Alias (byte) lvaluevar::b#1 = (byte) lvaluevar::b#2
Alias (byte*) lvaluevar::screen#2 = (byte*) lvaluevar::screen#3
Alias (byte) lvaluevar::i#2 = (byte) lvaluevar::i#3
Alias (byte*) rvaluevar::screen#2 = (byte*) rvaluevar::screen#3
Alias (byte) rvaluevar::i#2 = (byte) rvaluevar::i#3
Succesful SSA optimization Pass2AliasElimination
Self Phi Eliminated (byte) lvaluevar::b#1
@ -503,23 +489,14 @@ Simple Condition (bool~) rvaluevar::$0 if((byte) rvaluevar::i#2<(byte/signed byt
Succesful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte[1024]) lvalue::SCREEN#0 = ((byte*))1024
Constant (const byte) lvalue::i#0 = 2
Constant (const byte[1024]) rvalue::SCREEN#0 = ((byte*))1024
Constant (const byte) rvalue::i#0 = 2
Constant (const byte*) lvaluevar::screen#0 = ((byte*))1024
Constant (const byte) lvaluevar::b#0 = 4
Constant (const byte) lvaluevar::i#0 = 2
Constant (const byte*) rvaluevar::screen#0 = ((byte*))1024
Constant (const byte) rvaluevar::i#0 = 2
Succesful SSA optimization Pass2ConstantIdentification
Consolidated array index constant in *(lvalue::SCREEN#0+1)
Consolidated array index constant in *(rvalue::SCREEN#0+1)
Succesful SSA optimization Pass2ConstantAdditionElimination
Eliminating unused variable (byte) rvalue::b#0 and assignment [12] (byte) rvalue::b#0 ← *((const byte[1024]) rvalue::SCREEN#0)
Eliminating unused variable (byte) rvalue::b#1 and assignment [13] (byte) rvalue::b#1 ← *((const byte[1024]) rvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1)
Eliminating unused variable (byte) rvalue::b#2 and assignment [16] (byte) rvalue::b#2 ← *((const byte[1024]) rvalue::SCREEN#0 + (byte) rvalue::i#2)
Succesful SSA optimization PassNEliminateUnusedVars
Eliminating unused constant (const byte[1024]) rvalue::SCREEN#0
Succesful SSA optimization PassNEliminateUnusedVars
OPTIMIZING CONTROL FLOW GRAPH
Inlining constant with var siblings (const byte) lvalue::i#0
Inlining constant with var siblings (const byte) lvalue::i#0
@ -529,14 +506,11 @@ Inlining constant with var siblings (const byte*) lvaluevar::screen#0
Inlining constant with var siblings (const byte*) lvaluevar::screen#0
Inlining constant with var siblings (const byte) lvaluevar::i#0
Inlining constant with var siblings (const byte) lvaluevar::i#0
Inlining constant with var siblings (const byte*) rvaluevar::screen#0
Inlining constant with var siblings (const byte*) rvaluevar::screen#0
Inlining constant with var siblings (const byte) rvaluevar::i#0
Inlining constant with var siblings (const byte) rvaluevar::i#0
Constant inlined lvalue::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 2
Constant inlined rvaluevar::screen#0 = ((byte*))(word/signed word/dword/signed dword) 1024
Constant inlined rvalue::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 2
Constant inlined lvaluevar::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 2
Constant inlined lvalue::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 2
Constant inlined lvaluevar::screen#0 = ((byte*))(word/signed word/dword/signed dword) 1024
Constant inlined rvaluevar::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 2
Succesful SSA optimization Pass2ConstantInlining
@ -560,14 +534,13 @@ Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Created 6 initial phi equivalence classes
Created 5 initial phi equivalence classes
Coalesced [20] lvaluevar::i#4 ← lvaluevar::i#1
Coalesced [21] lvaluevar::screen#4 ← lvaluevar::screen#1
Coalesced [28] rvaluevar::i#4 ← rvaluevar::i#1
Coalesced [29] rvaluevar::screen#4 ← rvaluevar::screen#1
Coalesced [35] rvalue::i#4 ← rvalue::i#1
Coalesced [43] lvalue::i#4 ← lvalue::i#1
Coalesced down to 6 phi equivalence classes
Coalesced [27] rvaluevar::i#4 ← rvaluevar::i#1
Coalesced [33] rvalue::i#4 ← rvalue::i#1
Coalesced [41] lvalue::i#4 ← lvalue::i#1
Coalesced down to 5 phi equivalence classes
Block Sequence Planned @begin @5 @end main main::@1 main::@2 main::@3 main::@return lvaluevar lvaluevar::@1 lvaluevar::@return lvaluevar::@2 rvaluevar rvaluevar::@1 rvaluevar::@return rvaluevar::@2 rvalue rvalue::@1 rvalue::@return rvalue::@2 lvalue lvalue::@1 lvalue::@return lvalue::@2
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @5
@ -633,44 +606,42 @@ rvaluevar: scope:[rvaluevar] from main::@2
[20] phi() [ ] ( main:2::rvaluevar:9 [ ] )
to:rvaluevar::@1
rvaluevar::@1: scope:[rvaluevar] from rvaluevar rvaluevar::@2
[21] (byte*) rvaluevar::screen#2 ← phi( rvaluevar/((byte*))(word/signed word/dword/signed dword) 1024 rvaluevar::@2/(byte*) rvaluevar::screen#1 ) [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] )
[21] (byte) rvaluevar::i#2 ← phi( rvaluevar/(byte/signed byte/word/signed word/dword/signed dword) 2 rvaluevar::@2/(byte) rvaluevar::i#1 ) [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] )
[22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] )
[21] (byte) rvaluevar::i#2 ← phi( rvaluevar/(byte/signed byte/word/signed word/dword/signed dword) 2 rvaluevar::@2/(byte) rvaluevar::i#1 ) [ rvaluevar::i#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 ] )
[22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 ] )
to:rvaluevar::@return
rvaluevar::@return: scope:[rvaluevar] from rvaluevar::@1
[23] return [ ] ( main:2::rvaluevar:9 [ ] )
to:@return
rvaluevar::@2: scope:[rvaluevar] from rvaluevar::@1
[24] (byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#1 ] )
[25] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 rvaluevar::screen#1 ] )
[24] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 ] )
to:rvaluevar::@1
rvalue: scope:[rvalue] from main::@1
[26] phi() [ ] ( main:2::rvalue:7 [ ] )
[25] phi() [ ] ( main:2::rvalue:7 [ ] )
to:rvalue::@1
rvalue::@1: scope:[rvalue] from rvalue rvalue::@2
[27] (byte) rvalue::i#2 ← phi( rvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 rvalue::@2/(byte) rvalue::i#1 ) [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
[28] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
[26] (byte) rvalue::i#2 ← phi( rvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 rvalue::@2/(byte) rvalue::i#1 ) [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
[27] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] )
to:rvalue::@return
rvalue::@return: scope:[rvalue] from rvalue::@1
[29] return [ ] ( main:2::rvalue:7 [ ] )
[28] return [ ] ( main:2::rvalue:7 [ ] )
to:@return
rvalue::@2: scope:[rvalue] from rvalue::@1
[30] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] )
[29] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] )
to:rvalue::@1
lvalue: scope:[lvalue] from main
[31] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] )
[32] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] )
[30] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] )
[31] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] )
to:lvalue::@1
lvalue::@1: scope:[lvalue] from lvalue lvalue::@2
[33] (byte) lvalue::i#2 ← phi( lvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 lvalue::@2/(byte) lvalue::i#1 ) [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
[34] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
[32] (byte) lvalue::i#2 ← phi( lvalue/(byte/signed byte/word/signed word/dword/signed dword) 2 lvalue::@2/(byte) lvalue::i#1 ) [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
[33] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
to:lvalue::@return
lvalue::@return: scope:[lvalue] from lvalue::@1
[35] return [ ] ( main:2::lvalue:5 [ ] )
[34] return [ ] ( main:2::lvalue:5 [ ] )
to:@return
lvalue::@2: scope:[lvalue] from lvalue::@1
[36] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
[37] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] )
[35] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] )
[36] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] )
to:lvalue::@1
DOMINATORS
@ -746,39 +717,31 @@ VARIABLE REGISTER WEIGHTS
(byte*) lvaluevar::screen#2 11.0
(void()) main()
(void()) rvalue()
(byte[1024]) rvalue::SCREEN
(byte) rvalue::b
(byte) rvalue::i
(byte) rvalue::i#1 22.0
(byte) rvalue::i#2 16.5
(void()) rvaluevar()
(byte) rvaluevar::i
(byte) rvaluevar::i#1 22.0
(byte) rvaluevar::i#2 11.0
(byte*) rvaluevar::screen
(byte*) rvaluevar::screen#1 11.0
(byte*) rvaluevar::screen#2 11.0
(byte) rvaluevar::i#2 16.5
Initial phi equivalence classes
[ lvaluevar::i#2 lvaluevar::i#1 ]
[ lvaluevar::screen#2 lvaluevar::screen#1 ]
[ rvaluevar::i#2 rvaluevar::i#1 ]
[ rvaluevar::screen#2 rvaluevar::screen#1 ]
[ rvalue::i#2 rvalue::i#1 ]
[ lvalue::i#2 lvalue::i#1 ]
Complete equivalence classes
[ lvaluevar::i#2 lvaluevar::i#1 ]
[ lvaluevar::screen#2 lvaluevar::screen#1 ]
[ rvaluevar::i#2 rvaluevar::i#1 ]
[ rvaluevar::screen#2 rvaluevar::screen#1 ]
[ rvalue::i#2 rvalue::i#1 ]
[ lvalue::i#2 lvalue::i#1 ]
Allocated zp ZP_BYTE:2 [ lvaluevar::i#2 lvaluevar::i#1 ]
Allocated zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
Allocated zp ZP_BYTE:5 [ rvaluevar::i#2 rvaluevar::i#1 ]
Allocated zp ZP_WORD:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ]
Allocated zp ZP_BYTE:8 [ rvalue::i#2 rvalue::i#1 ]
Allocated zp ZP_BYTE:9 [ lvalue::i#2 lvalue::i#1 ]
Allocated zp ZP_BYTE:6 [ rvalue::i#2 rvalue::i#1 ]
Allocated zp ZP_BYTE:7 [ lvalue::i#2 lvalue::i#1 ]
INITIAL ASM
//SEG0 Basic Upstart
@ -812,7 +775,7 @@ main: {
//SEG12 main::@1
b1:
//SEG13 [7] call rvalue [ ] ( main:2 [ ] )
//SEG14 [26] phi from main::@1 to rvalue [phi:main::@1->rvalue]
//SEG14 [25] phi from main::@1 to rvalue [phi:main::@1->rvalue]
rvalue_from_b1:
jsr rvalue
//SEG15 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
@ -887,112 +850,100 @@ lvaluevar: {
}
//SEG40 rvaluevar
rvaluevar: {
.label screen = 6
.label i = 5
//SEG41 [21] phi from rvaluevar to rvaluevar::@1 [phi:rvaluevar->rvaluevar::@1]
b1_from_rvaluevar:
//SEG42 [21] phi (byte*) rvaluevar::screen#2 = ((byte*))(word/signed word/dword/signed dword) 1024 [phi:rvaluevar->rvaluevar::@1#0] -- pbuz1=pbuc1
lda #<$400
sta screen
lda #>$400
sta screen+1
//SEG43 [21] phi (byte) rvaluevar::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvaluevar->rvaluevar::@1#1] -- vbuz1=vbuc1
//SEG42 [21] phi (byte) rvaluevar::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvaluevar->rvaluevar::@1#0] -- vbuz1=vbuc1
lda #2
sta i
jmp b1
//SEG44 rvaluevar::@1
//SEG43 rvaluevar::@1
b1:
//SEG45 [22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] ) -- vbuz1_lt_vbuc1_then_la1
//SEG44 [22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 ] ) -- vbuz1_lt_vbuc1_then_la1
lda i
cmp #$a
bcc b2
jmp breturn
//SEG46 rvaluevar::@return
//SEG45 rvaluevar::@return
breturn:
//SEG47 [23] return [ ] ( main:2::rvaluevar:9 [ ] )
//SEG46 [23] return [ ] ( main:2::rvaluevar:9 [ ] )
rts
//SEG48 rvaluevar::@2
//SEG47 rvaluevar::@2
b2:
//SEG49 [24] (byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#1 ] ) -- pbuz1=_inc_pbuz1
inc screen
bne !+
inc screen+1
!:
//SEG50 [25] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 rvaluevar::screen#1 ] ) -- vbuz1=_inc_vbuz1
//SEG48 [24] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 ] ) -- vbuz1=_inc_vbuz1
inc i
//SEG51 [21] phi from rvaluevar::@2 to rvaluevar::@1 [phi:rvaluevar::@2->rvaluevar::@1]
//SEG49 [21] phi from rvaluevar::@2 to rvaluevar::@1 [phi:rvaluevar::@2->rvaluevar::@1]
b1_from_b2:
//SEG52 [21] phi (byte*) rvaluevar::screen#2 = (byte*) rvaluevar::screen#1 [phi:rvaluevar::@2->rvaluevar::@1#0] -- register_copy
//SEG53 [21] phi (byte) rvaluevar::i#2 = (byte) rvaluevar::i#1 [phi:rvaluevar::@2->rvaluevar::@1#1] -- register_copy
//SEG50 [21] phi (byte) rvaluevar::i#2 = (byte) rvaluevar::i#1 [phi:rvaluevar::@2->rvaluevar::@1#0] -- register_copy
jmp b1
}
//SEG54 rvalue
//SEG51 rvalue
rvalue: {
.label i = 8
//SEG55 [27] phi from rvalue to rvalue::@1 [phi:rvalue->rvalue::@1]
.label i = 6
//SEG52 [26] phi from rvalue to rvalue::@1 [phi:rvalue->rvalue::@1]
b1_from_rvalue:
//SEG56 [27] phi (byte) rvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvalue->rvalue::@1#0] -- vbuz1=vbuc1
//SEG53 [26] phi (byte) rvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvalue->rvalue::@1#0] -- vbuz1=vbuc1
lda #2
sta i
jmp b1
//SEG57 rvalue::@1
//SEG54 rvalue::@1
b1:
//SEG58 [28] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuz1_lt_vbuc1_then_la1
//SEG55 [27] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuz1_lt_vbuc1_then_la1
lda i
cmp #$a
bcc b2
jmp breturn
//SEG59 rvalue::@return
//SEG56 rvalue::@return
breturn:
//SEG60 [29] return [ ] ( main:2::rvalue:7 [ ] )
//SEG57 [28] return [ ] ( main:2::rvalue:7 [ ] )
rts
//SEG61 rvalue::@2
//SEG58 rvalue::@2
b2:
//SEG62 [30] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) -- vbuz1=_inc_vbuz1
//SEG59 [29] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) -- vbuz1=_inc_vbuz1
inc i
//SEG63 [27] phi from rvalue::@2 to rvalue::@1 [phi:rvalue::@2->rvalue::@1]
//SEG60 [26] phi from rvalue::@2 to rvalue::@1 [phi:rvalue::@2->rvalue::@1]
b1_from_b2:
//SEG64 [27] phi (byte) rvalue::i#2 = (byte) rvalue::i#1 [phi:rvalue::@2->rvalue::@1#0] -- register_copy
//SEG61 [26] phi (byte) rvalue::i#2 = (byte) rvalue::i#1 [phi:rvalue::@2->rvalue::@1#0] -- register_copy
jmp b1
}
//SEG65 lvalue
//SEG62 lvalue
lvalue: {
.label SCREEN = $400
.label i = 9
//SEG66 [31] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
.label i = 7
//SEG63 [30] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
lda #1
sta SCREEN
//SEG67 [32] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
//SEG64 [31] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
lda #2
sta SCREEN+1
//SEG68 [33] phi from lvalue to lvalue::@1 [phi:lvalue->lvalue::@1]
//SEG65 [32] phi from lvalue to lvalue::@1 [phi:lvalue->lvalue::@1]
b1_from_lvalue:
//SEG69 [33] phi (byte) lvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:lvalue->lvalue::@1#0] -- vbuz1=vbuc1
//SEG66 [32] phi (byte) lvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:lvalue->lvalue::@1#0] -- vbuz1=vbuc1
lda #2
sta i
jmp b1
//SEG70 lvalue::@1
//SEG67 lvalue::@1
b1:
//SEG71 [34] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- vbuz1_lt_vbuc1_then_la1
//SEG68 [33] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- vbuz1_lt_vbuc1_then_la1
lda i
cmp #$a
bcc b2
jmp breturn
//SEG72 lvalue::@return
//SEG69 lvalue::@return
breturn:
//SEG73 [35] return [ ] ( main:2::lvalue:5 [ ] )
//SEG70 [34] return [ ] ( main:2::lvalue:5 [ ] )
rts
//SEG74 lvalue::@2
//SEG71 lvalue::@2
b2:
//SEG75 [36] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuc2
//SEG72 [35] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- pbuc1_derefidx_vbuz1=vbuc2
ldy i
lda #3
sta SCREEN,y
//SEG76 [37] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] ) -- vbuz1=_inc_vbuz1
//SEG73 [36] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] ) -- vbuz1=_inc_vbuz1
inc i
//SEG77 [33] phi from lvalue::@2 to lvalue::@1 [phi:lvalue::@2->lvalue::@1]
//SEG74 [32] phi from lvalue::@2 to lvalue::@1 [phi:lvalue::@2->lvalue::@1]
b1_from_b2:
//SEG78 [33] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 [phi:lvalue::@2->lvalue::@1#0] -- register_copy
//SEG75 [32] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 [phi:lvalue::@2->lvalue::@1#0] -- register_copy
jmp b1
}
@ -1000,37 +951,35 @@ REGISTER UPLIFT POTENTIAL REGISTERS
Statement [17] *((byte*) lvaluevar::screen#2) ← (const byte) lvaluevar::b#0 [ lvaluevar::i#2 lvaluevar::screen#2 ] ( main:2::lvaluevar:11 [ lvaluevar::i#2 lvaluevar::screen#2 ] ) always clobbers reg byte a reg byte y
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ lvaluevar::i#2 lvaluevar::i#1 ]
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:2 [ lvaluevar::i#2 lvaluevar::i#1 ]
Statement [31] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a
Statement [32] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a
Statement [36] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:9 [ lvalue::i#2 lvalue::i#1 ]
Statement [30] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a
Statement [31] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a
Statement [35] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:7 [ lvalue::i#2 lvalue::i#1 ]
Statement [17] *((byte*) lvaluevar::screen#2) ← (const byte) lvaluevar::b#0 [ lvaluevar::i#2 lvaluevar::screen#2 ] ( main:2::lvaluevar:11 [ lvaluevar::i#2 lvaluevar::screen#2 ] ) always clobbers reg byte a reg byte y
Statement [31] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a
Statement [32] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a
Statement [36] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) always clobbers reg byte a
Statement [30] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a
Statement [31] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) always clobbers reg byte a
Statement [35] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ lvaluevar::i#2 lvaluevar::i#1 ] : zp ZP_BYTE:2 , reg byte x ,
Potential registers zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ] : zp ZP_WORD:3 ,
Potential registers zp ZP_BYTE:5 [ rvaluevar::i#2 rvaluevar::i#1 ] : zp ZP_BYTE:5 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_WORD:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ] : zp ZP_WORD:6 ,
Potential registers zp ZP_BYTE:8 [ rvalue::i#2 rvalue::i#1 ] : zp ZP_BYTE:8 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:9 [ lvalue::i#2 lvalue::i#1 ] : zp ZP_BYTE:9 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:6 [ rvalue::i#2 rvalue::i#1 ] : zp ZP_BYTE:6 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:7 [ lvalue::i#2 lvalue::i#1 ] : zp ZP_BYTE:7 , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [rvaluevar] 33: zp ZP_BYTE:5 [ rvaluevar::i#2 rvaluevar::i#1 ] 22: zp ZP_WORD:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ]
Uplift Scope [lvaluevar] 30.25: zp ZP_BYTE:2 [ lvaluevar::i#2 lvaluevar::i#1 ] 22: zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
Uplift Scope [rvalue] 38.5: zp ZP_BYTE:8 [ rvalue::i#2 rvalue::i#1 ]
Uplift Scope [lvalue] 36.67: zp ZP_BYTE:9 [ lvalue::i#2 lvalue::i#1 ]
Uplift Scope [rvalue] 38.5: zp ZP_BYTE:6 [ rvalue::i#2 rvalue::i#1 ]
Uplift Scope [rvaluevar] 38.5: zp ZP_BYTE:5 [ rvaluevar::i#2 rvaluevar::i#1 ]
Uplift Scope [lvalue] 36.67: zp ZP_BYTE:7 [ lvalue::i#2 lvalue::i#1 ]
Uplift Scope [main]
Uplift Scope []
Uplifting [rvaluevar] best 1710 combination reg byte x [ rvaluevar::i#2 rvaluevar::i#1 ] zp ZP_WORD:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ]
Uplifting [lvaluevar] best 1620 combination reg byte x [ lvaluevar::i#2 lvaluevar::i#1 ] zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
Uplifting [rvalue] best 1530 combination reg byte x [ rvalue::i#2 rvalue::i#1 ]
Uplifting [lvalue] best 1410 combination reg byte x [ lvalue::i#2 lvalue::i#1 ]
Uplifting [main] best 1410 combination
Uplifting [] best 1410 combination
Coalescing zero page register [ zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ] ] with [ zp ZP_WORD:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ] ]
Allocated (was zp ZP_WORD:3) zp ZP_WORD:2 [ lvaluevar::screen#2 lvaluevar::screen#1 rvaluevar::screen#2 rvaluevar::screen#1 ]
Uplifting [lvaluevar] best 1485 combination reg byte x [ lvaluevar::i#2 lvaluevar::i#1 ] zp ZP_WORD:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
Uplifting [rvalue] best 1395 combination reg byte x [ rvalue::i#2 rvalue::i#1 ]
Uplifting [rvaluevar] best 1305 combination reg byte x [ rvaluevar::i#2 rvaluevar::i#1 ]
Uplifting [lvalue] best 1185 combination reg byte x [ lvalue::i#2 lvalue::i#1 ]
Uplifting [main] best 1185 combination
Uplifting [] best 1185 combination
Allocated (was zp ZP_WORD:3) zp ZP_WORD:2 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart
@ -1064,7 +1013,7 @@ main: {
//SEG12 main::@1
b1:
//SEG13 [7] call rvalue [ ] ( main:2 [ ] )
//SEG14 [26] phi from main::@1 to rvalue [phi:main::@1->rvalue]
//SEG14 [25] phi from main::@1 to rvalue [phi:main::@1->rvalue]
rvalue_from_b1:
jsr rvalue
//SEG15 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
@ -1136,102 +1085,90 @@ lvaluevar: {
}
//SEG40 rvaluevar
rvaluevar: {
.label screen = 2
//SEG41 [21] phi from rvaluevar to rvaluevar::@1 [phi:rvaluevar->rvaluevar::@1]
b1_from_rvaluevar:
//SEG42 [21] phi (byte*) rvaluevar::screen#2 = ((byte*))(word/signed word/dword/signed dword) 1024 [phi:rvaluevar->rvaluevar::@1#0] -- pbuz1=pbuc1
lda #<$400
sta screen
lda #>$400
sta screen+1
//SEG43 [21] phi (byte) rvaluevar::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvaluevar->rvaluevar::@1#1] -- vbuxx=vbuc1
//SEG42 [21] phi (byte) rvaluevar::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvaluevar->rvaluevar::@1#0] -- vbuxx=vbuc1
ldx #2
jmp b1
//SEG44 rvaluevar::@1
//SEG43 rvaluevar::@1
b1:
//SEG45 [22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] ) -- vbuxx_lt_vbuc1_then_la1
//SEG44 [22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
cpx #$a
bcc b2
jmp breturn
//SEG46 rvaluevar::@return
//SEG45 rvaluevar::@return
breturn:
//SEG47 [23] return [ ] ( main:2::rvaluevar:9 [ ] )
//SEG46 [23] return [ ] ( main:2::rvaluevar:9 [ ] )
rts
//SEG48 rvaluevar::@2
//SEG47 rvaluevar::@2
b2:
//SEG49 [24] (byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#1 ] ) -- pbuz1=_inc_pbuz1
inc screen
bne !+
inc screen+1
!:
//SEG50 [25] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 rvaluevar::screen#1 ] ) -- vbuxx=_inc_vbuxx
//SEG48 [24] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG51 [21] phi from rvaluevar::@2 to rvaluevar::@1 [phi:rvaluevar::@2->rvaluevar::@1]
//SEG49 [21] phi from rvaluevar::@2 to rvaluevar::@1 [phi:rvaluevar::@2->rvaluevar::@1]
b1_from_b2:
//SEG52 [21] phi (byte*) rvaluevar::screen#2 = (byte*) rvaluevar::screen#1 [phi:rvaluevar::@2->rvaluevar::@1#0] -- register_copy
//SEG53 [21] phi (byte) rvaluevar::i#2 = (byte) rvaluevar::i#1 [phi:rvaluevar::@2->rvaluevar::@1#1] -- register_copy
//SEG50 [21] phi (byte) rvaluevar::i#2 = (byte) rvaluevar::i#1 [phi:rvaluevar::@2->rvaluevar::@1#0] -- register_copy
jmp b1
}
//SEG54 rvalue
//SEG51 rvalue
rvalue: {
//SEG55 [27] phi from rvalue to rvalue::@1 [phi:rvalue->rvalue::@1]
//SEG52 [26] phi from rvalue to rvalue::@1 [phi:rvalue->rvalue::@1]
b1_from_rvalue:
//SEG56 [27] phi (byte) rvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvalue->rvalue::@1#0] -- vbuxx=vbuc1
//SEG53 [26] phi (byte) rvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvalue->rvalue::@1#0] -- vbuxx=vbuc1
ldx #2
jmp b1
//SEG57 rvalue::@1
//SEG54 rvalue::@1
b1:
//SEG58 [28] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
//SEG55 [27] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
cpx #$a
bcc b2
jmp breturn
//SEG59 rvalue::@return
//SEG56 rvalue::@return
breturn:
//SEG60 [29] return [ ] ( main:2::rvalue:7 [ ] )
//SEG57 [28] return [ ] ( main:2::rvalue:7 [ ] )
rts
//SEG61 rvalue::@2
//SEG58 rvalue::@2
b2:
//SEG62 [30] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG59 [29] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG63 [27] phi from rvalue::@2 to rvalue::@1 [phi:rvalue::@2->rvalue::@1]
//SEG60 [26] phi from rvalue::@2 to rvalue::@1 [phi:rvalue::@2->rvalue::@1]
b1_from_b2:
//SEG64 [27] phi (byte) rvalue::i#2 = (byte) rvalue::i#1 [phi:rvalue::@2->rvalue::@1#0] -- register_copy
//SEG61 [26] phi (byte) rvalue::i#2 = (byte) rvalue::i#1 [phi:rvalue::@2->rvalue::@1#0] -- register_copy
jmp b1
}
//SEG65 lvalue
//SEG62 lvalue
lvalue: {
.label SCREEN = $400
//SEG66 [31] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
//SEG63 [30] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
lda #1
sta SCREEN
//SEG67 [32] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
//SEG64 [31] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
lda #2
sta SCREEN+1
//SEG68 [33] phi from lvalue to lvalue::@1 [phi:lvalue->lvalue::@1]
//SEG65 [32] phi from lvalue to lvalue::@1 [phi:lvalue->lvalue::@1]
b1_from_lvalue:
//SEG69 [33] phi (byte) lvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:lvalue->lvalue::@1#0] -- vbuxx=vbuc1
//SEG66 [32] phi (byte) lvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:lvalue->lvalue::@1#0] -- vbuxx=vbuc1
ldx #2
jmp b1
//SEG70 lvalue::@1
//SEG67 lvalue::@1
b1:
//SEG71 [34] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
//SEG68 [33] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
cpx #$a
bcc b2
jmp breturn
//SEG72 lvalue::@return
//SEG69 lvalue::@return
breturn:
//SEG73 [35] return [ ] ( main:2::lvalue:5 [ ] )
//SEG70 [34] return [ ] ( main:2::lvalue:5 [ ] )
rts
//SEG74 lvalue::@2
//SEG71 lvalue::@2
b2:
//SEG75 [36] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuc2
//SEG72 [35] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuc2
lda #3
sta SCREEN,x
//SEG76 [37] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG73 [36] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG77 [33] phi from lvalue::@2 to lvalue::@1 [phi:lvalue::@2->lvalue::@1]
//SEG74 [32] phi from lvalue::@2 to lvalue::@1 [phi:lvalue::@2->lvalue::@1]
b1_from_b2:
//SEG78 [33] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 [phi:lvalue::@2->lvalue::@1#0] -- register_copy
//SEG75 [32] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 [phi:lvalue::@2->lvalue::@1#0] -- register_copy
jmp b1
}
@ -1317,8 +1254,6 @@ FINAL SYMBOL TABLE
(label) rvalue::@1
(label) rvalue::@2
(label) rvalue::@return
(byte[1024]) rvalue::SCREEN
(byte) rvalue::b
(byte) rvalue::i
(byte) rvalue::i#1 reg byte x 22.0
(byte) rvalue::i#2 reg byte x 16.5
@ -1328,20 +1263,17 @@ FINAL SYMBOL TABLE
(label) rvaluevar::@return
(byte) rvaluevar::i
(byte) rvaluevar::i#1 reg byte x 22.0
(byte) rvaluevar::i#2 reg byte x 11.0
(byte*) rvaluevar::screen
(byte*) rvaluevar::screen#1 screen zp ZP_WORD:2 11.0
(byte*) rvaluevar::screen#2 screen zp ZP_WORD:2 11.0
(byte) rvaluevar::i#2 reg byte x 16.5
reg byte x [ lvaluevar::i#2 lvaluevar::i#1 ]
zp ZP_WORD:2 [ lvaluevar::screen#2 lvaluevar::screen#1 rvaluevar::screen#2 rvaluevar::screen#1 ]
zp ZP_WORD:2 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
reg byte x [ rvaluevar::i#2 rvaluevar::i#1 ]
reg byte x [ rvalue::i#2 rvalue::i#1 ]
reg byte x [ lvalue::i#2 lvalue::i#1 ]
FINAL ASSEMBLER
Score: 1152
Score: 927
//SEG0 Basic Upstart
.pc = $801 "Basic"
@ -1363,7 +1295,7 @@ main: {
//SEG11 [6] phi from main to main::@1 [phi:main->main::@1]
//SEG12 main::@1
//SEG13 [7] call rvalue [ ] ( main:2 [ ] )
//SEG14 [26] phi from main::@1 to rvalue [phi:main::@1->rvalue]
//SEG14 [25] phi from main::@1 to rvalue [phi:main::@1->rvalue]
jsr rvalue
//SEG15 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG16 main::@2
@ -1419,87 +1351,75 @@ lvaluevar: {
}
//SEG40 rvaluevar
rvaluevar: {
.label screen = 2
//SEG41 [21] phi from rvaluevar to rvaluevar::@1 [phi:rvaluevar->rvaluevar::@1]
//SEG42 [21] phi (byte*) rvaluevar::screen#2 = ((byte*))(word/signed word/dword/signed dword) 1024 [phi:rvaluevar->rvaluevar::@1#0] -- pbuz1=pbuc1
lda #<$400
sta screen
lda #>$400
sta screen+1
//SEG43 [21] phi (byte) rvaluevar::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvaluevar->rvaluevar::@1#1] -- vbuxx=vbuc1
//SEG42 [21] phi (byte) rvaluevar::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvaluevar->rvaluevar::@1#0] -- vbuxx=vbuc1
ldx #2
//SEG44 rvaluevar::@1
//SEG43 rvaluevar::@1
b1:
//SEG45 [22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#2 ] ) -- vbuxx_lt_vbuc1_then_la1
//SEG44 [22] if((byte) rvaluevar::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvaluevar::@2 [ rvaluevar::i#2 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
cpx #$a
bcc b2
//SEG46 rvaluevar::@return
//SEG47 [23] return [ ] ( main:2::rvaluevar:9 [ ] )
//SEG45 rvaluevar::@return
//SEG46 [23] return [ ] ( main:2::rvaluevar:9 [ ] )
rts
//SEG48 rvaluevar::@2
//SEG47 rvaluevar::@2
b2:
//SEG49 [24] (byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#2 rvaluevar::screen#1 ] ) -- pbuz1=_inc_pbuz1
inc screen
bne !+
inc screen+1
!:
//SEG50 [25] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 rvaluevar::screen#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 rvaluevar::screen#1 ] ) -- vbuxx=_inc_vbuxx
//SEG48 [24] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 ] ( main:2::rvaluevar:9 [ rvaluevar::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG51 [21] phi from rvaluevar::@2 to rvaluevar::@1 [phi:rvaluevar::@2->rvaluevar::@1]
//SEG52 [21] phi (byte*) rvaluevar::screen#2 = (byte*) rvaluevar::screen#1 [phi:rvaluevar::@2->rvaluevar::@1#0] -- register_copy
//SEG53 [21] phi (byte) rvaluevar::i#2 = (byte) rvaluevar::i#1 [phi:rvaluevar::@2->rvaluevar::@1#1] -- register_copy
//SEG49 [21] phi from rvaluevar::@2 to rvaluevar::@1 [phi:rvaluevar::@2->rvaluevar::@1]
//SEG50 [21] phi (byte) rvaluevar::i#2 = (byte) rvaluevar::i#1 [phi:rvaluevar::@2->rvaluevar::@1#0] -- register_copy
jmp b1
}
//SEG54 rvalue
//SEG51 rvalue
rvalue: {
//SEG55 [27] phi from rvalue to rvalue::@1 [phi:rvalue->rvalue::@1]
//SEG56 [27] phi (byte) rvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvalue->rvalue::@1#0] -- vbuxx=vbuc1
//SEG52 [26] phi from rvalue to rvalue::@1 [phi:rvalue->rvalue::@1]
//SEG53 [26] phi (byte) rvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:rvalue->rvalue::@1#0] -- vbuxx=vbuc1
ldx #2
//SEG57 rvalue::@1
//SEG54 rvalue::@1
b1:
//SEG58 [28] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
//SEG55 [27] if((byte) rvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto rvalue::@2 [ rvalue::i#2 ] ( main:2::rvalue:7 [ rvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
cpx #$a
bcc b2
//SEG59 rvalue::@return
//SEG60 [29] return [ ] ( main:2::rvalue:7 [ ] )
//SEG56 rvalue::@return
//SEG57 [28] return [ ] ( main:2::rvalue:7 [ ] )
rts
//SEG61 rvalue::@2
//SEG58 rvalue::@2
b2:
//SEG62 [30] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG59 [29] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] ( main:2::rvalue:7 [ rvalue::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG63 [27] phi from rvalue::@2 to rvalue::@1 [phi:rvalue::@2->rvalue::@1]
//SEG64 [27] phi (byte) rvalue::i#2 = (byte) rvalue::i#1 [phi:rvalue::@2->rvalue::@1#0] -- register_copy
//SEG60 [26] phi from rvalue::@2 to rvalue::@1 [phi:rvalue::@2->rvalue::@1]
//SEG61 [26] phi (byte) rvalue::i#2 = (byte) rvalue::i#1 [phi:rvalue::@2->rvalue::@1#0] -- register_copy
jmp b1
}
//SEG65 lvalue
//SEG62 lvalue
lvalue: {
.label SCREEN = $400
//SEG66 [31] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
//SEG63 [30] *((const byte[1024]) lvalue::SCREEN#0) ← (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
lda #1
sta SCREEN
//SEG67 [32] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
//SEG64 [31] *((const byte[1024]) lvalue::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte/signed byte/word/signed word/dword/signed dword) 2 [ ] ( main:2::lvalue:5 [ ] ) -- _deref_pbuc1=vbuc2
lda #2
sta SCREEN+1
//SEG68 [33] phi from lvalue to lvalue::@1 [phi:lvalue->lvalue::@1]
//SEG69 [33] phi (byte) lvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:lvalue->lvalue::@1#0] -- vbuxx=vbuc1
//SEG65 [32] phi from lvalue to lvalue::@1 [phi:lvalue->lvalue::@1]
//SEG66 [32] phi (byte) lvalue::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:lvalue->lvalue::@1#0] -- vbuxx=vbuc1
tax
//SEG70 lvalue::@1
//SEG67 lvalue::@1
b1:
//SEG71 [34] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
//SEG68 [33] if((byte) lvalue::i#2<(byte/signed byte/word/signed word/dword/signed dword) 10) goto lvalue::@2 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- vbuxx_lt_vbuc1_then_la1
cpx #$a
bcc b2
//SEG72 lvalue::@return
//SEG73 [35] return [ ] ( main:2::lvalue:5 [ ] )
//SEG69 lvalue::@return
//SEG70 [34] return [ ] ( main:2::lvalue:5 [ ] )
rts
//SEG74 lvalue::@2
//SEG71 lvalue::@2
b2:
//SEG75 [36] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuc2
//SEG72 [35] *((const byte[1024]) lvalue::SCREEN#0 + (byte) lvalue::i#2) ← (byte/signed byte/word/signed word/dword/signed dword) 3 [ lvalue::i#2 ] ( main:2::lvalue:5 [ lvalue::i#2 ] ) -- pbuc1_derefidx_vbuxx=vbuc2
lda #3
sta SCREEN,x
//SEG76 [37] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG73 [36] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] ( main:2::lvalue:5 [ lvalue::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG77 [33] phi from lvalue::@2 to lvalue::@1 [phi:lvalue::@2->lvalue::@1]
//SEG78 [33] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 [phi:lvalue::@2->lvalue::@1#0] -- register_copy
//SEG74 [32] phi from lvalue::@2 to lvalue::@1 [phi:lvalue::@2->lvalue::@1]
//SEG75 [32] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 [phi:lvalue::@2->lvalue::@1#0] -- register_copy
jmp b1
}

View File

@ -31,8 +31,6 @@
(label) rvalue::@1
(label) rvalue::@2
(label) rvalue::@return
(byte[1024]) rvalue::SCREEN
(byte) rvalue::b
(byte) rvalue::i
(byte) rvalue::i#1 reg byte x 22.0
(byte) rvalue::i#2 reg byte x 16.5
@ -42,13 +40,10 @@
(label) rvaluevar::@return
(byte) rvaluevar::i
(byte) rvaluevar::i#1 reg byte x 22.0
(byte) rvaluevar::i#2 reg byte x 11.0
(byte*) rvaluevar::screen
(byte*) rvaluevar::screen#1 screen zp ZP_WORD:2 11.0
(byte*) rvaluevar::screen#2 screen zp ZP_WORD:2 11.0
(byte) rvaluevar::i#2 reg byte x 16.5
reg byte x [ lvaluevar::i#2 lvaluevar::i#1 ]
zp ZP_WORD:2 [ lvaluevar::screen#2 lvaluevar::screen#1 rvaluevar::screen#2 rvaluevar::screen#1 ]
zp ZP_WORD:2 [ lvaluevar::screen#2 lvaluevar::screen#1 ]
reg byte x [ rvaluevar::i#2 rvaluevar::i#1 ]
reg byte x [ rvalue::i#2 rvalue::i#1 ]
reg byte x [ lvalue::i#2 lvalue::i#1 ]

View File

@ -272,7 +272,7 @@ divr16u::@1: scope:[divr16u] from divr16u divr16u::@3
[135] (byte) divr16u::i#2 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(byte) divr16u::i#1 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[135] (word) divr16u::quotient#3 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::return#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[135] (word) divr16u::dividend#2 ← phi( divr16u/(const word) PI2_u4f12#0 divr16u::@3/(word) divr16u::dividend#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[135] (word) divr16u::rem#4 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::rem#10 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[135] (word) divr16u::rem#4 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::rem#9 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[136] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] )
[137] (byte~) divr16u::$1 ← > (word) divr16u::dividend#2 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] )
[138] (byte~) divr16u::$2 ← (byte~) divr16u::$1 & (byte/word/signed word/dword/signed dword) 128 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] )
@ -292,10 +292,10 @@ divr16u::@5: scope:[divr16u] from divr16u::@2
[146] (word) divr16u::rem#2 ← (word) divr16u::rem#5 - (const word) main::wavelength#0 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] )
to:divr16u::@3
divr16u::@3: scope:[divr16u] from divr16u::@2 divr16u::@5
[147] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] )
[147] (word) divr16u::rem#10 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] )
[148] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] )
[149] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] )
[147] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[147] (word) divr16u::rem#9 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[148] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
[149] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
to:divr16u::@return
divr16u::@return: scope:[divr16u] from divr16u::@3
[150] return [ divr16u::return#0 ] ( main:2::sin8s_gen:5::div16u:53::divr16u:130 [ divr16u::return#0 ] )

File diff suppressed because one or more lines are too long

View File

@ -38,10 +38,10 @@
(word) divr16u::rem
(word) divr16u::rem#0 rem zp ZP_WORD:2 8.25
(word) divr16u::rem#1 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#10 rem zp ZP_WORD:2 11.0
(word) divr16u::rem#2 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#4 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#5 rem zp ZP_WORD:2 11.0
(word) divr16u::rem#9 rem zp ZP_WORD:2 11.0
(word) divr16u::return
(word) divr16u::return#0 return zp ZP_WORD:14 7.000000000000001
(word) divr16u::return#2 return zp ZP_WORD:14 4.0
@ -165,7 +165,6 @@
(byte*) print_str::str#0 str zp ZP_WORD:2 202.0
(byte*) print_str::str#3 str zp ZP_WORD:2 101.5
(byte*) print_str::str#5 str zp ZP_WORD:2 2.0
(word) rem16u
(signed byte()) sin8s((word) sin8s::x)
(word~) sin8s::$6 $6 zp ZP_WORD:9 4.0
(label) sin8s::@1
@ -238,7 +237,7 @@
(word) sin8s_gen::x#2 x zp ZP_WORD:2 4.714285714285714
reg byte x [ main::i#2 main::i#1 ]
zp ZP_WORD:2 [ print_str::str#3 print_str::str#5 print_str::str#0 print_cls::sc#2 print_cls::sc#1 sin8s_gen::x#2 sin8s_gen::x#1 divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ]
zp ZP_WORD:2 [ print_str::str#3 print_str::str#5 print_str::str#0 print_cls::sc#2 print_cls::sc#1 sin8s_gen::x#2 sin8s_gen::x#1 divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ]
zp ZP_BYTE:4 [ print_sbyte::b#3 print_sbyte::b#1 print_sbyte::b#0 main::sb#0 sin8s::isUpper#10 ]
reg byte a [ print_char::ch#3 print_char::ch#1 print_char::ch#2 ]
zp ZP_WORD:5 [ print_char_cursor#27 print_char_cursor#37 print_char_cursor#44 print_char_cursor#41 print_char_cursor#42 print_char_cursor#19 print_char_cursor#10 print_char_cursor#1 sin8s_gen::sintab#2 sin8s_gen::sintab#0 divr16u::dividend#2 divr16u::dividend#0 ]

View File

@ -390,7 +390,7 @@ divr16u::@1: scope:[divr16u] from divr16u divr16u::@3
[194] (byte) divr16u::i#2 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(byte) divr16u::i#1 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[194] (word) divr16u::quotient#3 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::return#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[194] (word) divr16u::dividend#2 ← phi( divr16u/(const word) PI2_u4f12#0 divr16u::@3/(word) divr16u::dividend#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[194] (word) divr16u::rem#4 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::rem#10 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[194] (word) divr16u::rem#4 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::rem#9 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[195] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] )
[196] (byte~) divr16u::$1 ← > (word) divr16u::dividend#2 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] )
[197] (byte~) divr16u::$2 ← (byte~) divr16u::$1 & (byte/word/signed word/dword/signed dword) 128 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] )
@ -410,10 +410,10 @@ divr16u::@5: scope:[divr16u] from divr16u::@2
[205] (word) divr16u::rem#2 ← (word) divr16u::rem#5 - (const word) main::tabsize#0 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] )
to:divr16u::@3
divr16u::@3: scope:[divr16u] from divr16u::@2 divr16u::@5
[206] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] )
[206] (word) divr16u::rem#10 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] )
[207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] )
[208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] )
[206] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[206] (word) divr16u::rem#9 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
[208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
to:divr16u::@return
divr16u::@return: scope:[divr16u] from divr16u::@3
[209] return [ divr16u::return#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 ] )

View File

@ -2354,6 +2354,8 @@ Removing unused procedure divr8u
Removing unused procedure mulu16_sel
Removing unused procedure mul16u
Eliminating unused variable (byte) rem8u and assignment [0] (byte) rem8u ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable (word) rem16u and assignment [1] (word) rem16u ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable rem16u(null) and assignment [26] rem16u(null) ← (word) divr16u::rem
Eliminating unused variable (signed byte) rem8s and assignment [34] (signed byte) rem8s ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable (signed word) rem16s and assignment [35] (signed word) rem16s ← (byte/signed byte/word/signed word/dword/signed dword) 0
Eliminating unused variable (byte~) mul8su::$5 and assignment [62] (byte~) mul8su::$5 ← > (word) mul8su::m
@ -2401,6 +2403,7 @@ Creating constant string variable for inline (const string) sin8u_table::str6 "
Creating constant string variable for inline (const string) sin8u_table::str7 " scaled: @"
Creating constant string variable for inline (const string) sin8u_table::str8 " trans: @"
Removing empty block @1
Removing empty block @2
Removing empty block divr16u::@7
Removing empty block @3
Removing empty block div16u::@1
@ -2446,8 +2449,6 @@ Removing empty block @34
Removing empty block @35
Removing empty block sin8u_table::@2
PROCEDURE MODIFY VARIABLE ANALYSIS
divr16u modifies rem16u
div16u modifies rem16u
print_str modifies print_char_cursor
print_ln modifies print_line_cursor
print_ln modifies print_char_cursor
@ -2460,8 +2461,6 @@ print_cls modifies print_line_cursor
print_cls modifies print_char_cursor
main modifies print_line_cursor
main modifies print_char_cursor
main modifies rem16u
sin8u_table modifies rem16u
sin8u_table modifies print_char_cursor
sin8u_table modifies print_line_cursor
@ -2492,14 +2491,11 @@ Completing Phi functions...
CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN
@begin: scope:[] from
to:@2
@2: scope:[] from @begin
(word) rem16u#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:@13
divr16u: scope:[divr16u] from div16u
(word) divr16u::divisor#5 ← phi( div16u/(word) divr16u::divisor#0 )
(word) divr16u::dividend#4 ← phi( div16u/(word) divr16u::dividend#1 )
(word) divr16u::rem#9 ← phi( div16u/(word) divr16u::rem#3 )
(word) divr16u::rem#8 ← phi( div16u/(word) divr16u::rem#3 )
(word) divr16u::quotient#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte) divr16u::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:divr16u::@1
@ -2508,7 +2504,7 @@ divr16u::@1: scope:[divr16u] from divr16u divr16u::@3
(word) divr16u::divisor#3 ← phi( divr16u/(word) divr16u::divisor#5 divr16u::@3/(word) divr16u::divisor#6 )
(word) divr16u::quotient#6 ← phi( divr16u/(word) divr16u::quotient#0 divr16u::@3/(word) divr16u::quotient#8 )
(word) divr16u::dividend#2 ← phi( divr16u/(word) divr16u::dividend#4 divr16u::@3/(word) divr16u::dividend#5 )
(word) divr16u::rem#4 ← phi( divr16u/(word) divr16u::rem#9 divr16u::@3/(word) divr16u::rem#10 )
(word) divr16u::rem#4 ← phi( divr16u/(word) divr16u::rem#8 divr16u::@3/(word) divr16u::rem#9 )
(word~) divr16u::$0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1
(word) divr16u::rem#0 ← (word~) divr16u::$0
(byte~) divr16u::$1 ← > (word) divr16u::dividend#2
@ -2544,7 +2540,7 @@ divr16u::@3: scope:[divr16u] from divr16u::@2 divr16u::@5
(word) divr16u::divisor#6 ← phi( divr16u::@2/(word) divr16u::divisor#1 divr16u::@5/(word) divr16u::divisor#2 )
(word) divr16u::quotient#8 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 )
(word) divr16u::dividend#5 ← phi( divr16u::@2/(word) divr16u::dividend#0 divr16u::@5/(word) divr16u::dividend#7 )
(word) divr16u::rem#10 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 )
(word) divr16u::rem#9 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 )
(byte) divr16u::i#2 ← phi( divr16u::@2/(byte) divr16u::i#3 divr16u::@5/(byte) divr16u::i#4 )
(byte) divr16u::i#1 ← (byte) divr16u::i#2 + rangenext(0,15)
(bool~) divr16u::$11 ← (byte) divr16u::i#1 != rangelast(0,15)
@ -2562,19 +2558,14 @@ divr16u::@5: scope:[divr16u] from divr16u::@2
to:divr16u::@3
divr16u::@6: scope:[divr16u] from divr16u::@3
(word) divr16u::quotient#5 ← phi( divr16u::@3/(word) divr16u::quotient#8 )
(word) divr16u::rem#8 ← phi( divr16u::@3/(word) divr16u::rem#10 )
(word) rem16u#1 ← (word) divr16u::rem#8
(word) divr16u::return#0 ← (word) divr16u::quotient#5
to:divr16u::@return
divr16u::@return: scope:[divr16u] from divr16u::@6
(word) rem16u#10 ← phi( divr16u::@6/(word) rem16u#1 )
(word) divr16u::return#3 ← phi( divr16u::@6/(word) divr16u::return#0 )
(word) divr16u::return#1 ← (word) divr16u::return#3
(word) rem16u#2 ← (word) rem16u#10
return
to:@return
div16u: scope:[div16u] from sin8u_table
(word) rem16u#18 ← phi( sin8u_table/(word) rem16u#20 )
(word) div16u::divisor#1 ← phi( sin8u_table/(word) div16u::divisor#0 )
(word) div16u::dividend#1 ← phi( sin8u_table/(word) div16u::dividend#0 )
(word) divr16u::dividend#1 ← (word) div16u::dividend#1
@ -2584,17 +2575,13 @@ div16u: scope:[div16u] from sin8u_table
(word) divr16u::return#2 ← (word) divr16u::return#1
to:div16u::@2
div16u::@2: scope:[div16u] from div16u
(word) rem16u#11 ← phi( div16u/(word) rem16u#2 )
(word) divr16u::return#4 ← phi( div16u/(word) divr16u::return#2 )
(word~) div16u::$0 ← (word) divr16u::return#4
(word) rem16u#3 ← (word) rem16u#11
(word) div16u::return#0 ← (word~) div16u::$0
to:div16u::@return
div16u::@return: scope:[div16u] from div16u::@2
(word) rem16u#12 ← phi( div16u::@2/(word) rem16u#3 )
(word) div16u::return#3 ← phi( div16u::@2/(word) div16u::return#0 )
(word) div16u::return#1 ← (word) div16u::return#3
(word) rem16u#4 ← (word) rem16u#12
return
to:@return
mul8u: scope:[mul8u] from mul8su mulu8_sel
@ -2683,8 +2670,7 @@ mul8su::@return: scope:[mul8su] from mul8su::@1
(signed word) mul8su::return#1 ← (signed word) mul8su::return#3
return
to:@return
@13: scope:[] from @2
(word) rem16u#28 ← phi( @2/(word) rem16u#0 )
@13: scope:[] from @begin
(word) PI2_u4f12#0 ← (word/signed word/dword/signed dword) 25736
(word) PI_u4f12#0 ← (word/signed word/dword/signed dword) 12868
(word) PI_HALF_u4f12#0 ← (word/signed word/dword/signed dword) 6434
@ -2846,7 +2832,6 @@ mulu8_sel::@return: scope:[mulu8_sel] from mulu8_sel::@2
return
to:@return
@20: scope:[] from @13
(word) rem16u#26 ← phi( @13/(word) rem16u#28 )
(byte*) print_screen#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024
(byte*) print_line_cursor#0 ← (byte*) print_screen#0
(byte*) print_char_cursor#0 ← (byte*) print_line_cursor#0
@ -2994,7 +2979,6 @@ print_word::@return: scope:[print_word] from print_word::@2
to:@return
@30: scope:[] from @20
(byte*) print_screen#6 ← phi( @20/(byte*) print_screen#0 )
(word) rem16u#25 ← phi( @20/(word) rem16u#26 )
(byte*) print_char_cursor#107 ← phi( @20/(byte*) print_char_cursor#0 )
(byte*) print_line_cursor#30 ← phi( @20/(byte*) print_line_cursor#0 )
(byte[]) print_hextab#0 ← (const string) $0
@ -3060,7 +3044,6 @@ print_cls::@return: scope:[print_cls] from print_cls::@2
return
to:@return
main: scope:[main] from @36
(word) rem16u#23 ← phi( @36/(word) rem16u#22 )
(byte*) print_char_cursor#98 ← phi( @36/(byte*) print_char_cursor#101 )
(byte*) print_line_cursor#24 ← phi( @36/(byte*) print_line_cursor#27 )
(byte*) print_screen#4 ← phi( @36/(byte*) print_screen#5 )
@ -3069,7 +3052,6 @@ main: scope:[main] from @36
call print_cls
to:main::@1
main::@1: scope:[main] from main
(word) rem16u#19 ← phi( main/(word) rem16u#23 )
(word) main::tabsize#1 ← phi( main/(word) main::tabsize#0 )
(byte*) print_char_cursor#65 ← phi( main/(byte*) print_char_cursor#20 )
(byte*) print_line_cursor#16 ← phi( main/(byte*) print_line_cursor#4 )
@ -3084,25 +3066,20 @@ main::@1: scope:[main] from main
main::@2: scope:[main] from main::@1
(byte*) print_line_cursor#17 ← phi( main::@1/(byte*) print_line_cursor#10 )
(byte*) print_char_cursor#66 ← phi( main::@1/(byte*) print_char_cursor#44 )
(word) rem16u#13 ← phi( main::@1/(word) rem16u#8 )
(word) rem16u#5 ← (word) rem16u#13
(byte*) print_char_cursor#22 ← (byte*) print_char_cursor#66
(byte*) print_line_cursor#6 ← (byte*) print_line_cursor#17
to:main::@return
main::@return: scope:[main] from main::@2
(word) rem16u#14 ← phi( main::@2/(word) rem16u#5 )
(byte*) print_char_cursor#67 ← phi( main::@2/(byte*) print_char_cursor#22 )
(byte*) print_line_cursor#18 ← phi( main::@2/(byte*) print_line_cursor#6 )
(byte*) print_line_cursor#7 ← (byte*) print_line_cursor#18
(byte*) print_char_cursor#23 ← (byte*) print_char_cursor#67
(word) rem16u#6 ← (word) rem16u#14
return
to:@return
sin8u_table: scope:[sin8u_table] from main::@1
(byte*) sin8u_table::sintab#26 ← phi( main::@1/(byte*) sin8u_table::sintab#0 )
(byte*) print_line_cursor#49 ← phi( main::@1/(byte*) print_line_cursor#5 )
(byte*) print_char_cursor#105 ← phi( main::@1/(byte*) print_char_cursor#21 )
(word) rem16u#20 ← phi( main::@1/(word) rem16u#19 )
(word) sin8u_table::tabsize#1 ← phi( main::@1/(word) sin8u_table::tabsize#0 )
(byte) sin8u_table::min#1 ← phi( main::@1/(byte) sin8u_table::min#0 )
(byte) sin8u_table::max#1 ← phi( main::@1/(byte) sin8u_table::max#0 )
@ -3129,16 +3106,13 @@ sin8u_table::@3: scope:[sin8u_table] from sin8u_table
(byte) sin8u_table::max#7 ← phi( sin8u_table/(byte) sin8u_table::max#1 )
(byte) sin8u_table::min#5 ← phi( sin8u_table/(byte) sin8u_table::min#1 )
(byte*) print_char_cursor#99 ← phi( sin8u_table/(byte*) print_char_cursor#105 )
(word) rem16u#15 ← phi( sin8u_table/(word) rem16u#4 )
(word) div16u::return#4 ← phi( sin8u_table/(word) div16u::return#2 )
(word~) sin8u_table::$6 ← (word) div16u::return#4
(word) rem16u#7 ← (word) rem16u#15
(word) sin8u_table::step#0 ← (word~) sin8u_table::$6
(byte*) print_str::str#1 ← (const string) sin8u_table::str
call print_str
to:sin8u_table::@4
sin8u_table::@4: scope:[sin8u_table] from sin8u_table::@3
(word) rem16u#48 ← phi( sin8u_table::@3/(word) rem16u#7 )
(word) sin8u_table::tabsize#24 ← phi( sin8u_table::@3/(word) sin8u_table::tabsize#25 )
(byte*) sin8u_table::sintab#24 ← phi( sin8u_table::@3/(byte*) sin8u_table::sintab#25 )
(byte*) print_line_cursor#45 ← phi( sin8u_table::@3/(byte*) print_line_cursor#47 )
@ -3153,7 +3127,6 @@ sin8u_table::@4: scope:[sin8u_table] from sin8u_table::@3
call print_word
to:sin8u_table::@5
sin8u_table::@5: scope:[sin8u_table] from sin8u_table::@4
(word) rem16u#47 ← phi( sin8u_table::@4/(word) rem16u#48 )
(word) sin8u_table::tabsize#23 ← phi( sin8u_table::@4/(word) sin8u_table::tabsize#24 )
(word) sin8u_table::step#23 ← phi( sin8u_table::@4/(word) sin8u_table::step#1 )
(byte*) sin8u_table::sintab#23 ← phi( sin8u_table::@4/(byte*) sin8u_table::sintab#24 )
@ -3168,7 +3141,6 @@ sin8u_table::@5: scope:[sin8u_table] from sin8u_table::@4
call print_str
to:sin8u_table::@6
sin8u_table::@6: scope:[sin8u_table] from sin8u_table::@5
(word) rem16u#46 ← phi( sin8u_table::@5/(word) rem16u#47 )
(word) sin8u_table::tabsize#22 ← phi( sin8u_table::@5/(word) sin8u_table::tabsize#23 )
(word) sin8u_table::step#22 ← phi( sin8u_table::@5/(word) sin8u_table::step#23 )
(byte*) sin8u_table::sintab#21 ← phi( sin8u_table::@5/(byte*) sin8u_table::sintab#23 )
@ -3183,7 +3155,6 @@ sin8u_table::@6: scope:[sin8u_table] from sin8u_table::@5
call print_byte
to:sin8u_table::@7
sin8u_table::@7: scope:[sin8u_table] from sin8u_table::@6
(word) rem16u#45 ← phi( sin8u_table::@6/(word) rem16u#46 )
(word) sin8u_table::tabsize#21 ← phi( sin8u_table::@6/(word) sin8u_table::tabsize#22 )
(word) sin8u_table::step#21 ← phi( sin8u_table::@6/(word) sin8u_table::step#22 )
(byte*) sin8u_table::sintab#19 ← phi( sin8u_table::@6/(byte*) sin8u_table::sintab#21 )
@ -3197,7 +3168,6 @@ sin8u_table::@7: scope:[sin8u_table] from sin8u_table::@6
call print_str
to:sin8u_table::@8
sin8u_table::@8: scope:[sin8u_table] from sin8u_table::@7
(word) rem16u#44 ← phi( sin8u_table::@7/(word) rem16u#45 )
(word) sin8u_table::tabsize#20 ← phi( sin8u_table::@7/(word) sin8u_table::tabsize#21 )
(word) sin8u_table::step#20 ← phi( sin8u_table::@7/(word) sin8u_table::step#21 )
(byte*) sin8u_table::sintab#17 ← phi( sin8u_table::@7/(byte*) sin8u_table::sintab#19 )
@ -3211,7 +3181,6 @@ sin8u_table::@8: scope:[sin8u_table] from sin8u_table::@7
call print_byte
to:sin8u_table::@9
sin8u_table::@9: scope:[sin8u_table] from sin8u_table::@8
(word) rem16u#43 ← phi( sin8u_table::@8/(word) rem16u#44 )
(word) sin8u_table::tabsize#19 ← phi( sin8u_table::@8/(word) sin8u_table::tabsize#20 )
(word) sin8u_table::step#19 ← phi( sin8u_table::@8/(word) sin8u_table::step#20 )
(byte*) sin8u_table::sintab#15 ← phi( sin8u_table::@8/(byte*) sin8u_table::sintab#17 )
@ -3224,7 +3193,6 @@ sin8u_table::@9: scope:[sin8u_table] from sin8u_table::@8
call print_str
to:sin8u_table::@10
sin8u_table::@10: scope:[sin8u_table] from sin8u_table::@9
(word) rem16u#42 ← phi( sin8u_table::@9/(word) rem16u#43 )
(word) sin8u_table::tabsize#18 ← phi( sin8u_table::@9/(word) sin8u_table::tabsize#19 )
(word) sin8u_table::step#18 ← phi( sin8u_table::@9/(word) sin8u_table::step#19 )
(byte*) sin8u_table::sintab#13 ← phi( sin8u_table::@9/(byte*) sin8u_table::sintab#15 )
@ -3237,7 +3205,6 @@ sin8u_table::@10: scope:[sin8u_table] from sin8u_table::@9
call print_byte
to:sin8u_table::@11
sin8u_table::@11: scope:[sin8u_table] from sin8u_table::@10
(word) rem16u#41 ← phi( sin8u_table::@10/(word) rem16u#42 )
(word) sin8u_table::tabsize#17 ← phi( sin8u_table::@10/(word) sin8u_table::tabsize#18 )
(word) sin8u_table::step#17 ← phi( sin8u_table::@10/(word) sin8u_table::step#18 )
(byte*) sin8u_table::sintab#11 ← phi( sin8u_table::@10/(byte*) sin8u_table::sintab#13 )
@ -3250,7 +3217,6 @@ sin8u_table::@11: scope:[sin8u_table] from sin8u_table::@10
call print_str
to:sin8u_table::@12
sin8u_table::@12: scope:[sin8u_table] from sin8u_table::@11
(word) rem16u#40 ← phi( sin8u_table::@11/(word) rem16u#41 )
(word) sin8u_table::tabsize#16 ← phi( sin8u_table::@11/(word) sin8u_table::tabsize#17 )
(word) sin8u_table::step#16 ← phi( sin8u_table::@11/(word) sin8u_table::step#17 )
(byte*) sin8u_table::sintab#9 ← phi( sin8u_table::@11/(byte*) sin8u_table::sintab#11 )
@ -3263,7 +3229,6 @@ sin8u_table::@12: scope:[sin8u_table] from sin8u_table::@11
call print_byte
to:sin8u_table::@13
sin8u_table::@13: scope:[sin8u_table] from sin8u_table::@12
(word) rem16u#39 ← phi( sin8u_table::@12/(word) rem16u#40 )
(word) sin8u_table::tabsize#15 ← phi( sin8u_table::@12/(word) sin8u_table::tabsize#16 )
(word) sin8u_table::step#15 ← phi( sin8u_table::@12/(word) sin8u_table::step#16 )
(byte*) sin8u_table::sintab#7 ← phi( sin8u_table::@12/(byte*) sin8u_table::sintab#9 )
@ -3275,7 +3240,6 @@ sin8u_table::@13: scope:[sin8u_table] from sin8u_table::@12
call print_ln
to:sin8u_table::@14
sin8u_table::@14: scope:[sin8u_table] from sin8u_table::@13
(word) rem16u#38 ← phi( sin8u_table::@13/(word) rem16u#39 )
(word) sin8u_table::tabsize#14 ← phi( sin8u_table::@13/(word) sin8u_table::tabsize#15 )
(word) sin8u_table::step#14 ← phi( sin8u_table::@13/(word) sin8u_table::step#15 )
(byte*) sin8u_table::sintab#5 ← phi( sin8u_table::@13/(byte*) sin8u_table::sintab#7 )
@ -3289,7 +3253,6 @@ sin8u_table::@14: scope:[sin8u_table] from sin8u_table::@13
(word) sin8u_table::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:sin8u_table::@1
sin8u_table::@1: scope:[sin8u_table] from sin8u_table::@14 sin8u_table::@25
(word) rem16u#37 ← phi( sin8u_table::@14/(word) rem16u#38 sin8u_table::@25/(word) rem16u#21 )
(word) sin8u_table::tabsize#13 ← phi( sin8u_table::@14/(word) sin8u_table::tabsize#14 sin8u_table::@25/(word) sin8u_table::tabsize#2 )
(word) sin8u_table::i#13 ← phi( sin8u_table::@14/(word) sin8u_table::i#0 sin8u_table::@25/(word) sin8u_table::i#1 )
(word) sin8u_table::step#13 ← phi( sin8u_table::@14/(word) sin8u_table::step#14 sin8u_table::@25/(word) sin8u_table::step#2 )
@ -3304,7 +3267,6 @@ sin8u_table::@1: scope:[sin8u_table] from sin8u_table::@14 sin8u_table::@25
(signed byte) sin8s::return#2 ← (signed byte) sin8s::return#1
to:sin8u_table::@15
sin8u_table::@15: scope:[sin8u_table] from sin8u_table::@1
(word) rem16u#36 ← phi( sin8u_table::@1/(word) rem16u#37 )
(word) sin8u_table::tabsize#12 ← phi( sin8u_table::@1/(word) sin8u_table::tabsize#13 )
(word) sin8u_table::i#12 ← phi( sin8u_table::@1/(word) sin8u_table::i#13 )
(word) sin8u_table::step#12 ← phi( sin8u_table::@1/(word) sin8u_table::step#13 )
@ -3325,7 +3287,6 @@ sin8u_table::@15: scope:[sin8u_table] from sin8u_table::@1
to:sin8u_table::@16
sin8u_table::@16: scope:[sin8u_table] from sin8u_table::@15
(byte) sin8u_table::amplitude#24 ← phi( sin8u_table::@15/(byte) sin8u_table::amplitude#2 )
(word) rem16u#35 ← phi( sin8u_table::@15/(word) rem16u#36 )
(word) sin8u_table::tabsize#11 ← phi( sin8u_table::@15/(word) sin8u_table::tabsize#12 )
(word) sin8u_table::i#11 ← phi( sin8u_table::@15/(word) sin8u_table::i#12 )
(word) sin8u_table::step#11 ← phi( sin8u_table::@15/(word) sin8u_table::step#12 )
@ -3350,7 +3311,6 @@ sin8u_table::@17: scope:[sin8u_table] from sin8u_table::@16
(byte*) sin8u_table::sintab#22 ← phi( sin8u_table::@16/(byte*) sin8u_table::sintab#1 )
(byte) sin8u_table::mid#24 ← phi( sin8u_table::@16/(byte) sin8u_table::mid#2 )
(byte) sin8u_table::amplitude#23 ← phi( sin8u_table::@16/(byte) sin8u_table::amplitude#24 )
(word) rem16u#34 ← phi( sin8u_table::@16/(word) rem16u#35 )
(word) sin8u_table::tabsize#10 ← phi( sin8u_table::@16/(word) sin8u_table::tabsize#11 )
(word) sin8u_table::i#10 ← phi( sin8u_table::@16/(word) sin8u_table::i#11 )
(word) sin8u_table::step#10 ← phi( sin8u_table::@16/(word) sin8u_table::step#11 )
@ -3368,7 +3328,6 @@ sin8u_table::@18: scope:[sin8u_table] from sin8u_table::@17
(byte*) sin8u_table::sintab#20 ← phi( sin8u_table::@17/(byte*) sin8u_table::sintab#22 )
(byte) sin8u_table::mid#23 ← phi( sin8u_table::@17/(byte) sin8u_table::mid#24 )
(byte) sin8u_table::amplitude#22 ← phi( sin8u_table::@17/(byte) sin8u_table::amplitude#23 )
(word) rem16u#33 ← phi( sin8u_table::@17/(word) rem16u#34 )
(word) sin8u_table::tabsize#9 ← phi( sin8u_table::@17/(word) sin8u_table::tabsize#10 )
(word) sin8u_table::i#9 ← phi( sin8u_table::@17/(word) sin8u_table::i#10 )
(word) sin8u_table::step#9 ← phi( sin8u_table::@17/(word) sin8u_table::step#10 )
@ -3386,7 +3345,6 @@ sin8u_table::@19: scope:[sin8u_table] from sin8u_table::@18
(byte*) sin8u_table::sintab#18 ← phi( sin8u_table::@18/(byte*) sin8u_table::sintab#20 )
(byte) sin8u_table::mid#22 ← phi( sin8u_table::@18/(byte) sin8u_table::mid#23 )
(byte) sin8u_table::amplitude#21 ← phi( sin8u_table::@18/(byte) sin8u_table::amplitude#22 )
(word) rem16u#32 ← phi( sin8u_table::@18/(word) rem16u#33 )
(word) sin8u_table::tabsize#8 ← phi( sin8u_table::@18/(word) sin8u_table::tabsize#9 )
(word) sin8u_table::i#8 ← phi( sin8u_table::@18/(word) sin8u_table::i#9 )
(word) sin8u_table::step#8 ← phi( sin8u_table::@18/(word) sin8u_table::step#9 )
@ -3404,7 +3362,6 @@ sin8u_table::@20: scope:[sin8u_table] from sin8u_table::@19
(byte*) sin8u_table::sintab#16 ← phi( sin8u_table::@19/(byte*) sin8u_table::sintab#18 )
(byte) sin8u_table::mid#20 ← phi( sin8u_table::@19/(byte) sin8u_table::mid#22 )
(byte) sin8u_table::amplitude#20 ← phi( sin8u_table::@19/(byte) sin8u_table::amplitude#21 )
(word) rem16u#31 ← phi( sin8u_table::@19/(word) rem16u#32 )
(word) sin8u_table::tabsize#7 ← phi( sin8u_table::@19/(word) sin8u_table::tabsize#8 )
(word) sin8u_table::i#7 ← phi( sin8u_table::@19/(word) sin8u_table::i#8 )
(word) sin8u_table::step#7 ← phi( sin8u_table::@19/(word) sin8u_table::step#8 )
@ -3421,7 +3378,6 @@ sin8u_table::@21: scope:[sin8u_table] from sin8u_table::@20
(byte*) sin8u_table::sintab#14 ← phi( sin8u_table::@20/(byte*) sin8u_table::sintab#16 )
(byte) sin8u_table::mid#18 ← phi( sin8u_table::@20/(byte) sin8u_table::mid#20 )
(byte) sin8u_table::amplitude#18 ← phi( sin8u_table::@20/(byte) sin8u_table::amplitude#20 )
(word) rem16u#30 ← phi( sin8u_table::@20/(word) rem16u#31 )
(word) sin8u_table::tabsize#6 ← phi( sin8u_table::@20/(word) sin8u_table::tabsize#7 )
(word) sin8u_table::i#6 ← phi( sin8u_table::@20/(word) sin8u_table::i#7 )
(word) sin8u_table::step#6 ← phi( sin8u_table::@20/(word) sin8u_table::step#7 )
@ -3438,7 +3394,6 @@ sin8u_table::@22: scope:[sin8u_table] from sin8u_table::@21
(byte*) sin8u_table::sintab#12 ← phi( sin8u_table::@21/(byte*) sin8u_table::sintab#14 )
(byte) sin8u_table::mid#16 ← phi( sin8u_table::@21/(byte) sin8u_table::mid#18 )
(byte) sin8u_table::amplitude#16 ← phi( sin8u_table::@21/(byte) sin8u_table::amplitude#18 )
(word) rem16u#29 ← phi( sin8u_table::@21/(word) rem16u#30 )
(word) sin8u_table::tabsize#5 ← phi( sin8u_table::@21/(word) sin8u_table::tabsize#6 )
(word) sin8u_table::i#5 ← phi( sin8u_table::@21/(word) sin8u_table::i#6 )
(word) sin8u_table::step#5 ← phi( sin8u_table::@21/(word) sin8u_table::step#6 )
@ -3454,7 +3409,6 @@ sin8u_table::@23: scope:[sin8u_table] from sin8u_table::@22
(byte*) sin8u_table::sintab#10 ← phi( sin8u_table::@22/(byte*) sin8u_table::sintab#12 )
(byte) sin8u_table::mid#14 ← phi( sin8u_table::@22/(byte) sin8u_table::mid#16 )
(byte) sin8u_table::amplitude#13 ← phi( sin8u_table::@22/(byte) sin8u_table::amplitude#16 )
(word) rem16u#27 ← phi( sin8u_table::@22/(word) rem16u#29 )
(word) sin8u_table::tabsize#4 ← phi( sin8u_table::@22/(word) sin8u_table::tabsize#5 )
(word) sin8u_table::i#4 ← phi( sin8u_table::@22/(word) sin8u_table::i#5 )
(word) sin8u_table::step#4 ← phi( sin8u_table::@22/(word) sin8u_table::step#5 )
@ -3470,7 +3424,6 @@ sin8u_table::@24: scope:[sin8u_table] from sin8u_table::@23
(byte*) sin8u_table::sintab#8 ← phi( sin8u_table::@23/(byte*) sin8u_table::sintab#10 )
(byte) sin8u_table::mid#12 ← phi( sin8u_table::@23/(byte) sin8u_table::mid#14 )
(byte) sin8u_table::amplitude#10 ← phi( sin8u_table::@23/(byte) sin8u_table::amplitude#13 )
(word) rem16u#24 ← phi( sin8u_table::@23/(word) rem16u#27 )
(word) sin8u_table::tabsize#3 ← phi( sin8u_table::@23/(word) sin8u_table::tabsize#4 )
(word) sin8u_table::i#3 ← phi( sin8u_table::@23/(word) sin8u_table::i#4 )
(word) sin8u_table::step#3 ← phi( sin8u_table::@23/(word) sin8u_table::step#4 )
@ -3484,7 +3437,6 @@ sin8u_table::@25: scope:[sin8u_table] from sin8u_table::@24
(byte*) sin8u_table::sintab#6 ← phi( sin8u_table::@24/(byte*) sin8u_table::sintab#8 )
(byte) sin8u_table::mid#9 ← phi( sin8u_table::@24/(byte) sin8u_table::mid#12 )
(byte) sin8u_table::amplitude#7 ← phi( sin8u_table::@24/(byte) sin8u_table::amplitude#10 )
(word) rem16u#21 ← phi( sin8u_table::@24/(word) rem16u#24 )
(word) sin8u_table::tabsize#2 ← phi( sin8u_table::@24/(word) sin8u_table::tabsize#3 )
(word) sin8u_table::i#2 ← phi( sin8u_table::@24/(word) sin8u_table::i#3 )
(word) sin8u_table::step#2 ← phi( sin8u_table::@24/(word) sin8u_table::step#3 )
@ -3502,33 +3454,27 @@ sin8u_table::@25: scope:[sin8u_table] from sin8u_table::@24
sin8u_table::@return: scope:[sin8u_table] from sin8u_table::@25
(byte*) print_line_cursor#21 ← phi( sin8u_table::@25/(byte*) print_line_cursor#9 )
(byte*) print_char_cursor#88 ← phi( sin8u_table::@25/(byte*) print_char_cursor#43 )
(word) rem16u#16 ← phi( sin8u_table::@25/(word) rem16u#21 )
(word) rem16u#8 ← (word) rem16u#16
(byte*) print_char_cursor#44 ← (byte*) print_char_cursor#88
(byte*) print_line_cursor#10 ← (byte*) print_line_cursor#21
return
to:@return
@36: scope:[] from @30
(byte*) print_screen#5 ← phi( @30/(byte*) print_screen#6 )
(word) rem16u#22 ← phi( @30/(word) rem16u#25 )
(byte*) print_char_cursor#101 ← phi( @30/(byte*) print_char_cursor#107 )
(byte*) print_line_cursor#27 ← phi( @30/(byte*) print_line_cursor#30 )
call main
to:@37
@37: scope:[] from @36
(word) rem16u#17 ← phi( @36/(word) rem16u#6 )
(byte*) print_char_cursor#89 ← phi( @36/(byte*) print_char_cursor#23 )
(byte*) print_line_cursor#22 ← phi( @36/(byte*) print_line_cursor#7 )
(byte*) print_line_cursor#11 ← (byte*) print_line_cursor#22
(byte*) print_char_cursor#45 ← (byte*) print_char_cursor#89
(word) rem16u#9 ← (word) rem16u#17
to:@end
@end: scope:[] from @37
SYMBOL TABLE SSA
(const string) $0 = (string) "0123456789abcdef"
(label) @13
(label) @2
(label) @20
(label) @30
(label) @36
@ -3615,7 +3561,6 @@ SYMBOL TABLE SSA
(word) divr16u::rem
(word) divr16u::rem#0
(word) divr16u::rem#1
(word) divr16u::rem#10
(word) divr16u::rem#2
(word) divr16u::rem#3
(word) divr16u::rem#4
@ -4043,56 +3988,6 @@ SYMBOL TABLE SSA
(word) print_word::w#2
(word) print_word::w#3
(word) print_word::w#4
(word) rem16u
(word) rem16u#0
(word) rem16u#1
(word) rem16u#10
(word) rem16u#11
(word) rem16u#12
(word) rem16u#13
(word) rem16u#14
(word) rem16u#15
(word) rem16u#16
(word) rem16u#17
(word) rem16u#18
(word) rem16u#19
(word) rem16u#2
(word) rem16u#20
(word) rem16u#21
(word) rem16u#22
(word) rem16u#23
(word) rem16u#24
(word) rem16u#25
(word) rem16u#26
(word) rem16u#27
(word) rem16u#28
(word) rem16u#29
(word) rem16u#3
(word) rem16u#30
(word) rem16u#31
(word) rem16u#32
(word) rem16u#33
(word) rem16u#34
(word) rem16u#35
(word) rem16u#36
(word) rem16u#37
(word) rem16u#38
(word) rem16u#39
(word) rem16u#4
(word) rem16u#40
(word) rem16u#41
(word) rem16u#42
(word) rem16u#43
(word) rem16u#44
(word) rem16u#45
(word) rem16u#46
(word) rem16u#47
(word) rem16u#48
(word) rem16u#5
(word) rem16u#6
(word) rem16u#7
(word) rem16u#8
(word) rem16u#9
(signed byte()) sin8s((word) sin8s::x)
(bool~) sin8s::$0
(bool~) sin8s::$1
@ -4457,17 +4352,14 @@ Inversing boolean not (bool~) sin8s::$20 ← (byte) sin8s::isUpper#2 == (byte/si
Inversing boolean not (bool~) print_sword::$1 ← (signed word) print_sword::w#2 >= (byte/signed byte/word/signed word/dword/signed dword) 0 from (bool~) print_sword::$0 ← (signed word) print_sword::w#2 < (byte/signed byte/word/signed word/dword/signed dword) 0
Inversing boolean not (bool~) print_sbyte::$1 ← (signed byte) print_sbyte::b#2 >= (byte/signed byte/word/signed word/dword/signed dword) 0 from (bool~) print_sbyte::$0 ← (signed byte) print_sbyte::b#2 < (byte/signed byte/word/signed word/dword/signed dword) 0
Succesful SSA optimization Pass2UnaryNotSimplification
Not aliassing across scopes: divr16u::rem#9 divr16u::rem#3
Not aliassing across scopes: divr16u::rem#8 divr16u::rem#3
Not aliassing across scopes: divr16u::dividend#4 divr16u::dividend#1
Not aliassing across scopes: divr16u::divisor#5 divr16u::divisor#0
Not aliassing across scopes: rem16u#1 divr16u::rem#8
Not aliassing across scopes: div16u::dividend#1 div16u::dividend#0
Not aliassing across scopes: div16u::divisor#1 div16u::divisor#0
Not aliassing across scopes: rem16u#18 rem16u#20
Not aliassing across scopes: divr16u::dividend#1 div16u::dividend#1
Not aliassing across scopes: divr16u::divisor#0 div16u::divisor#1
Not aliassing across scopes: divr16u::return#2 divr16u::return#1
Not aliassing across scopes: rem16u#11 rem16u#2
Not aliassing across scopes: div16u::$0 divr16u::return#4
Not aliassing across scopes: mul8u::b#2 mul8u::b#0
Not aliassing across scopes: mul8u::a#6 mul8u::a#1
@ -4530,25 +4422,21 @@ Not aliassing across scopes: print_cls::sc#0 print_screen#1
Not aliassing across scopes: print_screen#4 print_screen#5
Not aliassing across scopes: print_line_cursor#24 print_line_cursor#27
Not aliassing across scopes: print_char_cursor#98 print_char_cursor#101
Not aliassing across scopes: rem16u#23 rem16u#22
Not aliassing across scopes: print_line_cursor#16 print_line_cursor#4
Not aliassing across scopes: print_char_cursor#65 print_char_cursor#20
Not aliassing across scopes: sin8u_table::sintab#0 main::sintab#0
Not aliassing across scopes: sin8u_table::tabsize#0 main::tabsize#1
Not aliassing across scopes: rem16u#13 rem16u#8
Not aliassing across scopes: print_char_cursor#66 print_char_cursor#44
Not aliassing across scopes: print_line_cursor#17 print_line_cursor#10
Not aliassing across scopes: sin8u_table::max#1 sin8u_table::max#0
Not aliassing across scopes: sin8u_table::min#1 sin8u_table::min#0
Not aliassing across scopes: sin8u_table::tabsize#1 sin8u_table::tabsize#0
Not aliassing across scopes: rem16u#20 rem16u#19
Not aliassing across scopes: print_char_cursor#105 print_char_cursor#21
Not aliassing across scopes: print_line_cursor#49 print_line_cursor#5
Not aliassing across scopes: sin8u_table::sintab#26 sin8u_table::sintab#0
Not aliassing across scopes: div16u::dividend#0 PI2_u4f12#0
Not aliassing across scopes: div16u::divisor#0 sin8u_table::tabsize#1
Not aliassing across scopes: div16u::return#2 div16u::return#1
Not aliassing across scopes: rem16u#15 rem16u#4
Not aliassing across scopes: sin8u_table::$6 div16u::return#4
Not aliassing across scopes: print_char_cursor#68 print_char_cursor#2
Not aliassing across scopes: print_word::w#1 sin8u_table::step#1
@ -4589,7 +4477,6 @@ Not aliassing across scopes: print_line_cursor#20 print_line_cursor#2
Not aliassing across scopes: print_char_cursor#87 print_char_cursor#4
Not aliassing across scopes: print_line_cursor#22 print_line_cursor#7
Not aliassing across scopes: print_char_cursor#89 print_char_cursor#23
Not aliassing across scopes: rem16u#17 rem16u#6
Alias (word) divr16u::rem#0 = (word~) divr16u::$0 (word) divr16u::rem#6
Alias (word) divr16u::dividend#0 = (word~) divr16u::$6 (word) divr16u::dividend#7
Alias (word) divr16u::quotient#1 = (word~) divr16u::$7 (word) divr16u::quotient#4
@ -4602,11 +4489,8 @@ Alias (word) divr16u::rem#5 = (word) divr16u::rem#7
Alias (word) divr16u::divisor#1 = (word) divr16u::divisor#2
Alias (byte) divr16u::i#3 = (byte) divr16u::i#4
Alias (word) divr16u::rem#2 = (word~) divr16u::$10
Alias (word) divr16u::rem#10 = (word) divr16u::rem#8
Alias (word) divr16u::return#0 = (word) divr16u::quotient#5 (word) divr16u::quotient#8 (word) divr16u::return#3 (word) divr16u::return#1
Alias (word) rem16u#1 = (word) rem16u#10 (word) rem16u#2
Alias (word) divr16u::return#2 = (word) divr16u::return#4
Alias (word) rem16u#11 = (word) rem16u#3 (word) rem16u#12 (word) rem16u#4
Alias (word) div16u::return#0 = (word~) div16u::$0 (word) div16u::return#3 (word) div16u::return#1
Alias (byte) mul8u::a#3 = (byte) mul8u::a#4 (byte) mul8u::a#7
Alias (word) mul8u::mb#3 = (word) mul8u::mb#4 (word) mul8u::mb#5
@ -4622,7 +4506,6 @@ Alias (byte) mul8su::b#1 = (byte) mul8su::b#3 (byte) mul8su::b#2
Alias (word) mul8su::m#0 = (word~) mul8su::$2 (word) mul8su::m#3
Alias (signed word) mul8su::return#0 = (signed word~) mul8su::$9 (signed word) mul8su::return#3 (signed word) mul8su::return#1
Alias (byte~) mul8su::$10 = (byte~) mul8su::$8
Alias (word) rem16u#0 = (word) rem16u#28 (word) rem16u#26 (word) rem16u#25 (word) rem16u#22
Alias (word) sin8s::x#3 = (word) sin8s::x#5
Alias (word) sin8s::x#0 = (word~) sin8s::$2
Alias (byte) sin8s::x1#0 = (byte~) sin8s::$7 (byte) sin8s::x1#1 (byte) sin8s::x1#4 (byte) sin8s::x1#2 (byte) sin8s::x1#3
@ -4677,10 +4560,8 @@ Alias (byte*) print_char_cursor#15 = (byte*) print_char_cursor#60 (byte*) print_
Alias (byte*) print_char_cursor#17 = (byte*) print_char_cursor#63 (byte*) print_char_cursor#18
Alias (byte*) print_line_cursor#15 = (byte*) print_screen#3 (byte*) print_screen#2 (byte*) print_line_cursor#3 (byte*) print_char_cursor#19 (byte*) print_char_cursor#64 (byte*) print_line_cursor#4 (byte*) print_char_cursor#20
Alias (word) main::tabsize#0 = (word) main::tabsize#1
Alias (word) rem16u#19 = (word) rem16u#23
Alias (byte*) print_line_cursor#16 = (byte*) print_line_cursor#5
Alias (byte*) print_char_cursor#21 = (byte*) print_char_cursor#65
Alias (word) rem16u#13 = (word) rem16u#5 (word) rem16u#14 (word) rem16u#6
Alias (byte*) print_char_cursor#22 = (byte*) print_char_cursor#66 (byte*) print_char_cursor#67 (byte*) print_char_cursor#23
Alias (byte*) print_line_cursor#17 = (byte*) print_line_cursor#6 (byte*) print_line_cursor#18 (byte*) print_line_cursor#7
Alias (byte) sin8u_table::amplitude#0 = (byte~) sin8u_table::$0 (byte) sin8u_table::amplitude#19 (byte) sin8u_table::amplitude#17 (byte) sin8u_table::amplitude#14 (byte) sin8u_table::amplitude#11 (byte) sin8u_table::amplitude#8 (byte) sin8u_table::amplitude#5 (byte) sin8u_table::amplitude#3 (byte) sin8u_table::amplitude#1 (byte) sin8u_table::amplitude#15 (byte) sin8u_table::amplitude#12 (byte) sin8u_table::amplitude#9 (byte) sin8u_table::amplitude#6
@ -4693,7 +4574,6 @@ Alias (byte) sin8u_table::max#1 = (byte) sin8u_table::max#7 (byte) sin8u_table::
Alias (byte*) print_line_cursor#25 = (byte*) print_line_cursor#47 (byte*) print_line_cursor#49 (byte*) print_line_cursor#45 (byte*) print_line_cursor#43 (byte*) print_line_cursor#41 (byte*) print_line_cursor#39 (byte*) print_line_cursor#37 (byte*) print_line_cursor#35 (byte*) print_line_cursor#33 (byte*) print_line_cursor#31 (byte*) print_line_cursor#28
Alias (byte*) sin8u_table::sintab#11 = (byte*) sin8u_table::sintab#25 (byte*) sin8u_table::sintab#26 (byte*) sin8u_table::sintab#24 (byte*) sin8u_table::sintab#23 (byte*) sin8u_table::sintab#21 (byte*) sin8u_table::sintab#19 (byte*) sin8u_table::sintab#17 (byte*) sin8u_table::sintab#15 (byte*) sin8u_table::sintab#13 (byte*) sin8u_table::sintab#9 (byte*) sin8u_table::sintab#7 (byte*) sin8u_table::sintab#5
Alias (word) sin8u_table::tabsize#1 = (word) sin8u_table::tabsize#25 (word) sin8u_table::tabsize#24 (word) sin8u_table::tabsize#23 (word) sin8u_table::tabsize#22 (word) sin8u_table::tabsize#21 (word) sin8u_table::tabsize#20 (word) sin8u_table::tabsize#19 (word) sin8u_table::tabsize#18 (word) sin8u_table::tabsize#17 (word) sin8u_table::tabsize#16 (word) sin8u_table::tabsize#15 (word) sin8u_table::tabsize#14
Alias (word) rem16u#15 = (word) rem16u#7 (word) rem16u#48 (word) rem16u#47 (word) rem16u#46 (word) rem16u#45 (word) rem16u#44 (word) rem16u#43 (word) rem16u#42 (word) rem16u#41 (word) rem16u#40 (word) rem16u#39 (word) rem16u#38
Alias (word) sin8u_table::step#0 = (word~) sin8u_table::$6 (word) sin8u_table::step#1 (word) sin8u_table::step#23 (word) sin8u_table::step#22 (word) sin8u_table::step#21 (word) sin8u_table::step#20 (word) sin8u_table::step#19 (word) sin8u_table::step#18 (word) sin8u_table::step#17 (word) sin8u_table::step#16 (word) sin8u_table::step#15 (word) sin8u_table::step#14
Alias (byte*) print_char_cursor#24 = (byte*) print_char_cursor#68
Alias (byte*) print_char_cursor#25 = (byte*) print_char_cursor#69
@ -4717,7 +4597,6 @@ Alias (byte*) print_line_cursor#26 = (byte*) print_line_cursor#46 (byte*) print_
Alias (word) sin8u_table::step#10 = (word) sin8u_table::step#12 (word) sin8u_table::step#13 (word) sin8u_table::step#11 (word) sin8u_table::step#9 (word) sin8u_table::step#8 (word) sin8u_table::step#7 (word) sin8u_table::step#6 (word) sin8u_table::step#5 (word) sin8u_table::step#4 (word) sin8u_table::step#3 (word) sin8u_table::step#2
Alias (word) sin8u_table::i#10 = (word) sin8u_table::i#12 (word) sin8u_table::i#13 (word) sin8u_table::i#11 (word) sin8u_table::i#9 (word) sin8u_table::i#8 (word) sin8u_table::i#7 (word) sin8u_table::i#6 (word) sin8u_table::i#5 (word) sin8u_table::i#4 (word) sin8u_table::i#3 (word) sin8u_table::i#2
Alias (word) sin8u_table::tabsize#10 = (word) sin8u_table::tabsize#12 (word) sin8u_table::tabsize#13 (word) sin8u_table::tabsize#11 (word) sin8u_table::tabsize#9 (word) sin8u_table::tabsize#8 (word) sin8u_table::tabsize#7 (word) sin8u_table::tabsize#6 (word) sin8u_table::tabsize#5 (word) sin8u_table::tabsize#4 (word) sin8u_table::tabsize#3 (word) sin8u_table::tabsize#2
Alias (word) rem16u#16 = (word) rem16u#36 (word) rem16u#37 (word) rem16u#35 (word) rem16u#34 (word) rem16u#33 (word) rem16u#32 (word) rem16u#31 (word) rem16u#30 (word) rem16u#29 (word) rem16u#27 (word) rem16u#24 (word) rem16u#21 (word) rem16u#8
Alias (signed byte) sin8u_table::sinx#0 = (signed byte~) sin8u_table::$18 (signed byte) sin8u_table::sinx#4 (signed byte) sin8u_table::sinx#3 (signed byte) sin8u_table::sinx#2 (signed byte) sin8u_table::sinx#1
Alias (byte) mul8su::b#0 = (byte/signed word/word/dword/signed dword~) sin8u_table::$19
Alias (signed word) mul8su::return#2 = (signed word) mul8su::return#4
@ -4737,19 +4616,15 @@ Alias (byte*) print_char_cursor#43 = (byte*) print_char_cursor#87 (byte*) print_
Alias (word) sin8u_table::x#1 = (word~) sin8u_table::$32
Alias (byte*) print_line_cursor#11 = (byte*) print_line_cursor#22
Alias (byte*) print_char_cursor#45 = (byte*) print_char_cursor#89
Alias (word) rem16u#17 = (word) rem16u#9
Succesful SSA optimization Pass2AliasElimination
Not aliassing across scopes: divr16u::rem#9 divr16u::rem#3
Not aliassing across scopes: divr16u::rem#8 divr16u::rem#3
Not aliassing across scopes: divr16u::dividend#4 divr16u::dividend#1
Not aliassing across scopes: divr16u::divisor#5 divr16u::divisor#0
Not aliassing across scopes: rem16u#1 divr16u::rem#10
Not aliassing across scopes: div16u::dividend#1 div16u::dividend#0
Not aliassing across scopes: div16u::divisor#1 div16u::divisor#0
Not aliassing across scopes: rem16u#18 rem16u#20
Not aliassing across scopes: divr16u::dividend#1 div16u::dividend#1
Not aliassing across scopes: divr16u::divisor#0 div16u::divisor#1
Not aliassing across scopes: divr16u::return#2 divr16u::return#0
Not aliassing across scopes: rem16u#11 rem16u#1
Not aliassing across scopes: div16u::return#0 divr16u::return#2
Not aliassing across scopes: mul8u::b#2 mul8u::b#0
Not aliassing across scopes: mul8u::a#6 mul8u::a#1
@ -4812,25 +4687,21 @@ Not aliassing across scopes: print_cls::sc#0 print_screen#1
Not aliassing across scopes: print_screen#4 print_line_cursor#0
Not aliassing across scopes: print_line_cursor#24 print_line_cursor#0
Not aliassing across scopes: print_char_cursor#98 print_line_cursor#0
Not aliassing across scopes: rem16u#19 rem16u#0
Not aliassing across scopes: print_line_cursor#16 print_line_cursor#15
Not aliassing across scopes: print_char_cursor#21 print_line_cursor#15
Not aliassing across scopes: sin8u_table::sintab#0 main::sintab#0
Not aliassing across scopes: sin8u_table::tabsize#0 main::tabsize#0
Not aliassing across scopes: rem16u#13 rem16u#16
Not aliassing across scopes: print_char_cursor#22 print_char_cursor#43
Not aliassing across scopes: print_line_cursor#17 print_line_cursor#10
Not aliassing across scopes: sin8u_table::max#1 sin8u_table::max#0
Not aliassing across scopes: sin8u_table::min#1 sin8u_table::min#0
Not aliassing across scopes: sin8u_table::tabsize#1 sin8u_table::tabsize#0
Not aliassing across scopes: rem16u#20 rem16u#19
Not aliassing across scopes: print_char_cursor#105 print_char_cursor#21
Not aliassing across scopes: print_line_cursor#25 print_line_cursor#16
Not aliassing across scopes: sin8u_table::sintab#11 sin8u_table::sintab#0
Not aliassing across scopes: div16u::dividend#0 PI2_u4f12#0
Not aliassing across scopes: div16u::divisor#0 sin8u_table::tabsize#1
Not aliassing across scopes: div16u::return#2 div16u::return#0
Not aliassing across scopes: rem16u#15 rem16u#11
Not aliassing across scopes: sin8u_table::step#0 div16u::return#2
Not aliassing across scopes: print_char_cursor#24 print_char_cursor#2
Not aliassing across scopes: print_word::w#1 sin8u_table::step#0
@ -4871,7 +4742,6 @@ Not aliassing across scopes: print_line_cursor#10 print_line_cursor#1
Not aliassing across scopes: print_char_cursor#43 print_line_cursor#1
Not aliassing across scopes: print_line_cursor#11 print_line_cursor#17
Not aliassing across scopes: print_char_cursor#45 print_char_cursor#22
Not aliassing across scopes: rem16u#17 rem16u#13
Alias (word) divr16u::dividend#2 = (word) divr16u::dividend#3
Alias (word) divr16u::quotient#3 = (word) divr16u::quotient#6
Alias (word) divr16u::divisor#1 = (word) divr16u::divisor#3 (word) divr16u::divisor#6
@ -4881,17 +4751,14 @@ Alias (byte) mul8u::a#3 = (byte) mul8u::a#5
Alias (word) mul8u::mb#2 = (word) mul8u::mb#3
Alias (byte) sin8s::isUpper#10 = (byte) sin8s::isUpper#3 (byte) sin8s::isUpper#2
Succesful SSA optimization Pass2AliasElimination
Not aliassing across scopes: divr16u::rem#9 divr16u::rem#3
Not aliassing across scopes: divr16u::rem#8 divr16u::rem#3
Not aliassing across scopes: divr16u::dividend#4 divr16u::dividend#1
Not aliassing across scopes: divr16u::divisor#5 divr16u::divisor#0
Not aliassing across scopes: rem16u#1 divr16u::rem#10
Not aliassing across scopes: div16u::dividend#1 div16u::dividend#0
Not aliassing across scopes: div16u::divisor#1 div16u::divisor#0
Not aliassing across scopes: rem16u#18 rem16u#20
Not aliassing across scopes: divr16u::dividend#1 div16u::dividend#1
Not aliassing across scopes: divr16u::divisor#0 div16u::divisor#1
Not aliassing across scopes: divr16u::return#2 divr16u::return#0
Not aliassing across scopes: rem16u#11 rem16u#1
Not aliassing across scopes: div16u::return#0 divr16u::return#2
Not aliassing across scopes: mul8u::b#2 mul8u::b#0
Not aliassing across scopes: mul8u::a#6 mul8u::a#1
@ -4954,25 +4821,21 @@ Not aliassing across scopes: print_cls::sc#0 print_screen#1
Not aliassing across scopes: print_screen#4 print_line_cursor#0
Not aliassing across scopes: print_line_cursor#24 print_line_cursor#0
Not aliassing across scopes: print_char_cursor#98 print_line_cursor#0
Not aliassing across scopes: rem16u#19 rem16u#0
Not aliassing across scopes: print_line_cursor#16 print_line_cursor#15
Not aliassing across scopes: print_char_cursor#21 print_line_cursor#15
Not aliassing across scopes: sin8u_table::sintab#0 main::sintab#0
Not aliassing across scopes: sin8u_table::tabsize#0 main::tabsize#0
Not aliassing across scopes: rem16u#13 rem16u#16
Not aliassing across scopes: print_char_cursor#22 print_char_cursor#43
Not aliassing across scopes: print_line_cursor#17 print_line_cursor#10
Not aliassing across scopes: sin8u_table::max#1 sin8u_table::max#0
Not aliassing across scopes: sin8u_table::min#1 sin8u_table::min#0
Not aliassing across scopes: sin8u_table::tabsize#1 sin8u_table::tabsize#0
Not aliassing across scopes: rem16u#20 rem16u#19
Not aliassing across scopes: print_char_cursor#105 print_char_cursor#21
Not aliassing across scopes: print_line_cursor#25 print_line_cursor#16
Not aliassing across scopes: sin8u_table::sintab#11 sin8u_table::sintab#0
Not aliassing across scopes: div16u::dividend#0 PI2_u4f12#0
Not aliassing across scopes: div16u::divisor#0 sin8u_table::tabsize#1
Not aliassing across scopes: div16u::return#2 div16u::return#0
Not aliassing across scopes: rem16u#15 rem16u#11
Not aliassing across scopes: sin8u_table::step#0 div16u::return#2
Not aliassing across scopes: print_char_cursor#24 print_char_cursor#2
Not aliassing across scopes: print_word::w#1 sin8u_table::step#0
@ -5013,7 +4876,6 @@ Not aliassing across scopes: print_line_cursor#10 print_line_cursor#1
Not aliassing across scopes: print_char_cursor#43 print_line_cursor#1
Not aliassing across scopes: print_line_cursor#11 print_line_cursor#17
Not aliassing across scopes: print_char_cursor#45 print_char_cursor#22
Not aliassing across scopes: rem16u#17 rem16u#13
Self Phi Eliminated (word) divr16u::divisor#1
Self Phi Eliminated (byte*) print_char_cursor#48
Self Phi Eliminated (byte*) print_line_cursor#15
@ -5021,16 +4883,13 @@ Self Phi Eliminated (byte) sin8u_table::amplitude#10
Self Phi Eliminated (byte) sin8u_table::mid#12
Self Phi Eliminated (word) sin8u_table::step#10
Self Phi Eliminated (word) sin8u_table::tabsize#10
Self Phi Eliminated (word) rem16u#16
Succesful SSA optimization Pass2SelfPhiElimination
Redundant Phi (word) divr16u::rem#9 (word) divr16u::rem#3
Redundant Phi (word) divr16u::rem#8 (word) divr16u::rem#3
Redundant Phi (word) divr16u::dividend#4 (word) divr16u::dividend#1
Redundant Phi (word) divr16u::divisor#5 (word) divr16u::divisor#0
Redundant Phi (word) divr16u::divisor#1 (word) divr16u::divisor#5
Redundant Phi (word) div16u::dividend#1 (word) div16u::dividend#0
Redundant Phi (word) div16u::divisor#1 (word) div16u::divisor#0
Redundant Phi (word) rem16u#18 (word) rem16u#20
Redundant Phi (word) rem16u#11 (word) rem16u#1
Redundant Phi (signed byte) mul8su::a#1 (signed byte) mul8su::a#0
Redundant Phi (byte) mul8su::b#1 (byte) mul8su::b#0
Redundant Phi (word) sin8s::x#3 (word) sin8s::x#2
@ -5052,20 +4911,16 @@ Redundant Phi (byte*) print_line_cursor#15 (byte*) print_screen#1
Redundant Phi (byte*) print_screen#4 (byte*) print_line_cursor#0
Redundant Phi (byte*) print_line_cursor#24 (byte*) print_line_cursor#0
Redundant Phi (byte*) print_char_cursor#98 (byte*) print_line_cursor#0
Redundant Phi (word) rem16u#19 (word) rem16u#0
Redundant Phi (byte*) print_line_cursor#16 (byte*) print_line_cursor#15
Redundant Phi (byte*) print_char_cursor#21 (byte*) print_line_cursor#15
Redundant Phi (word) rem16u#13 (word) rem16u#16
Redundant Phi (byte*) print_char_cursor#22 (byte*) print_char_cursor#43
Redundant Phi (byte*) print_line_cursor#17 (byte*) print_line_cursor#10
Redundant Phi (byte) sin8u_table::max#1 (byte) sin8u_table::max#0
Redundant Phi (byte) sin8u_table::min#1 (byte) sin8u_table::min#0
Redundant Phi (word) sin8u_table::tabsize#1 (word) sin8u_table::tabsize#0
Redundant Phi (word) rem16u#20 (word) rem16u#19
Redundant Phi (byte*) print_char_cursor#105 (byte*) print_char_cursor#21
Redundant Phi (byte*) print_line_cursor#25 (byte*) print_line_cursor#16
Redundant Phi (byte*) sin8u_table::sintab#11 (byte*) sin8u_table::sintab#0
Redundant Phi (word) rem16u#15 (word) rem16u#11
Redundant Phi (byte*) print_char_cursor#24 (byte*) print_char_cursor#2
Redundant Phi (byte*) print_char_cursor#25 (byte*) print_char_cursor#12
Redundant Phi (byte*) print_char_cursor#26 (byte*) print_char_cursor#2
@ -5082,7 +4937,6 @@ Redundant Phi (byte) sin8u_table::amplitude#10 (byte) sin8u_table::amplitude#0
Redundant Phi (byte) sin8u_table::mid#12 (byte) sin8u_table::mid#0
Redundant Phi (word) sin8u_table::step#10 (word) sin8u_table::step#0
Redundant Phi (word) sin8u_table::tabsize#10 (word) sin8u_table::tabsize#1
Redundant Phi (word) rem16u#16 (word) rem16u#15
Redundant Phi (byte*) print_char_cursor#35 (byte*) print_char_cursor#2
Redundant Phi (byte*) print_char_cursor#36 (byte*) print_char_cursor#12
Redundant Phi (byte*) print_char_cursor#37 (byte*) print_char_cursor#2
@ -5095,7 +4949,6 @@ Redundant Phi (byte*) print_line_cursor#10 (byte*) print_line_cursor#1
Redundant Phi (byte*) print_char_cursor#43 (byte*) print_line_cursor#1
Redundant Phi (byte*) print_line_cursor#11 (byte*) print_line_cursor#17
Redundant Phi (byte*) print_char_cursor#45 (byte*) print_char_cursor#22
Redundant Phi (word) rem16u#17 (word) rem16u#13
Succesful SSA optimization Pass2RedundantPhiElimination
Redundant Phi (byte*) print_char_cursor#91 (byte*) print_char_cursor#17
Redundant Phi (byte*) print_char_cursor#100 (byte*) print_line_cursor#1
@ -5118,7 +4971,6 @@ Simple Condition (bool~) print_sbyte::$1 if((signed byte) print_sbyte::b#1>=(byt
Simple Condition (bool~) print_cls::$1 if((byte*) print_cls::sc#1!=(byte*~) print_cls::$0) goto print_cls::@1
Simple Condition (bool~) sin8u_table::$33 if((word) sin8u_table::i#1<(word) sin8u_table::tabsize#0) goto sin8u_table::@1
Succesful SSA optimization Pass2ConditionalJumpSimplification
Constant (const word) rem16u#0 = 0
Constant (const word) divr16u::quotient#0 = 0
Constant (const byte) divr16u::i#0 = 0
Constant (const word) divr16u::rem#3 = 0
@ -5182,9 +5034,6 @@ Constant (const byte) sin8u_table::mid#0 = ((byte))sin8u_table::$4
Succesful SSA optimization Pass2ConstantIdentification
Constant (const byte) print_byte::b#6 = sin8u_table::mid#0
Succesful SSA optimization Pass2ConstantIdentification
Eliminating unused variable (word) rem16u#1 and assignment [15] (word) rem16u#1 ← (word) divr16u::rem#10
Eliminating unused constant (const word) rem16u#0
Succesful SSA optimization PassNEliminateUnusedVars
Eliminating Noop Cast (byte) mul8u::a#1 ← ((byte)) (signed byte) mul8su::a#0
Eliminating Noop Cast (signed word) mul8su::return#0 ← ((signed word)) (word) mul8su::m#2
Eliminating Noop Cast (signed byte) sin8s::sinx#0 ← ((signed byte)) (byte) sin8s::usinx#4
@ -5194,7 +5043,6 @@ Eliminating Noop Cast (byte) print_byte::b#0 ← ((byte)) (signed byte) print_sb
Succesful SSA optimization Pass2NopCastElimination
Resolved ranged next value divr16u::i#1 ← ++ divr16u::i#2 to ++
Resolved ranged comparison value if(divr16u::i#1!=rangelast(0,15)) goto divr16u::@1 to (byte/signed byte/word/signed word/dword/signed dword) 16
Culled Empty Block (label) @2
Culled Empty Block (label) divr16u::@6
Culled Empty Block (label) mul8u::@3
Culled Empty Block (label) @13
@ -5638,16 +5486,16 @@ Coalesced [235] sin8s::x#10 ← sin8s::x#4
Coalesced [236] sin8s::x#8 ← sin8s::x#2
Coalesced [240] mul8u::b#3 ← mul8u::b#1
Coalesced [241] mul8u::a#9 ← mul8u::a#2
Coalesced [260] divr16u::rem#13 ← divr16u::rem#1
Coalesced [267] divr16u::rem#15 ← divr16u::rem#2
Coalesced [260] divr16u::rem#12 ← divr16u::rem#1
Coalesced [267] divr16u::rem#14 ← divr16u::rem#2
Coalesced [268] divr16u::return#6 ← divr16u::quotient#2
Coalesced [273] divr16u::rem#11 ← divr16u::rem#10
Coalesced [273] divr16u::rem#10 ← divr16u::rem#9
Coalesced [274] divr16u::dividend#8 ← divr16u::dividend#0
Coalesced [275] divr16u::quotient#9 ← divr16u::return#0
Coalesced [276] divr16u::i#7 ← divr16u::i#1
Coalesced [277] divr16u::rem#14 ← divr16u::rem#5
Coalesced [277] divr16u::rem#13 ← divr16u::rem#5
Coalesced [278] divr16u::return#5 ← divr16u::quotient#1
Coalesced [279] divr16u::rem#12 ← divr16u::rem#0
Coalesced [279] divr16u::rem#11 ← divr16u::rem#0
Coalesced [286] print_cls::sc#3 ← print_cls::sc#1
Coalesced down to 28 phi equivalence classes
Culled Empty Block (label) sin8u_table::@26
@ -6134,7 +5982,7 @@ divr16u::@1: scope:[divr16u] from divr16u divr16u::@3
[194] (byte) divr16u::i#2 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(byte) divr16u::i#1 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[194] (word) divr16u::quotient#3 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::return#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[194] (word) divr16u::dividend#2 ← phi( divr16u/(const word) PI2_u4f12#0 divr16u::@3/(word) divr16u::dividend#0 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[194] (word) divr16u::rem#4 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::rem#10 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[194] (word) divr16u::rem#4 ← phi( divr16u/(byte/signed byte/word/signed word/dword/signed dword) 0 divr16u::@3/(word) divr16u::rem#9 ) [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::rem#4 divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 ] )
[195] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] )
[196] (byte~) divr16u::$1 ← > (word) divr16u::dividend#2 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$1 ] )
[197] (byte~) divr16u::$2 ← (byte~) divr16u::$1 & (byte/word/signed word/dword/signed dword) 128 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 divr16u::$2 ] )
@ -6154,10 +6002,10 @@ divr16u::@5: scope:[divr16u] from divr16u::@2
[205] (word) divr16u::rem#2 ← (word) divr16u::rem#5 - (const word) main::tabsize#0 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::i#2 divr16u::dividend#0 divr16u::quotient#2 divr16u::rem#2 ] )
to:divr16u::@3
divr16u::@3: scope:[divr16u] from divr16u::@2 divr16u::@5
[206] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] )
[206] (word) divr16u::rem#10 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#10 divr16u::dividend#0 ] )
[207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] )
[208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] )
[206] (word) divr16u::return#0 ← phi( divr16u::@2/(word) divr16u::quotient#1 divr16u::@5/(word) divr16u::quotient#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[206] (word) divr16u::rem#9 ← phi( divr16u::@2/(word) divr16u::rem#5 divr16u::@5/(word) divr16u::rem#2 ) [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::i#2 divr16u::rem#9 divr16u::dividend#0 ] )
[207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
[208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] )
to:divr16u::@return
divr16u::@return: scope:[divr16u] from divr16u::@3
[209] return [ divr16u::return#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 ] )
@ -6355,10 +6203,10 @@ VARIABLE REGISTER WEIGHTS
(word) divr16u::rem
(word) divr16u::rem#0 8.25
(word) divr16u::rem#1 22.0
(word) divr16u::rem#10 11.0
(word) divr16u::rem#2 22.0
(word) divr16u::rem#4 22.0
(word) divr16u::rem#5 11.0
(word) divr16u::rem#9 11.0
(word) divr16u::return
(word) divr16u::return#0 7.000000000000001
(word) divr16u::return#2 4.0
@ -6481,7 +6329,6 @@ VARIABLE REGISTER WEIGHTS
(word) print_word::w#2 22.0
(word) print_word::w#3 6.333333333333334
(word~) print_word::w#5 4.0
(word) rem16u
(signed byte()) sin8s((word) sin8s::x)
(word~) sin8s::$6 4.0
(byte) sin8s::DIV_6
@ -6568,7 +6415,7 @@ Initial phi equivalence classes
[ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ]
[ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ]
[ mulu8_sel::select#5 ]
[ divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ]
[ divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ]
[ divr16u::dividend#2 divr16u::dividend#0 ]
[ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ]
[ divr16u::i#2 divr16u::i#1 ]
@ -6634,7 +6481,7 @@ Complete equivalence classes
[ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ]
[ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ]
[ mulu8_sel::select#5 ]
[ divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ]
[ divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ]
[ divr16u::dividend#2 divr16u::dividend#0 ]
[ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ]
[ divr16u::i#2 divr16u::i#1 ]
@ -6699,7 +6546,7 @@ Allocated zp ZP_BYTE:33 [ sin8s::return#0 sin8s::return#5 sin8s::sinx#1 ]
Allocated zp ZP_BYTE:34 [ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ]
Allocated zp ZP_BYTE:35 [ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ]
Allocated zp ZP_BYTE:36 [ mulu8_sel::select#5 ]
Allocated zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ]
Allocated zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ]
Allocated zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ]
Allocated zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ]
Allocated zp ZP_BYTE:43 [ divr16u::i#2 divr16u::i#1 ]
@ -8022,7 +7869,7 @@ divr16u: {
//SEG418 [194] phi (byte) divr16u::i#2 = (byte) divr16u::i#1 [phi:divr16u::@3->divr16u::@1#0] -- register_copy
//SEG419 [194] phi (word) divr16u::quotient#3 = (word) divr16u::return#0 [phi:divr16u::@3->divr16u::@1#1] -- register_copy
//SEG420 [194] phi (word) divr16u::dividend#2 = (word) divr16u::dividend#0 [phi:divr16u::@3->divr16u::@1#2] -- register_copy
//SEG421 [194] phi (word) divr16u::rem#4 = (word) divr16u::rem#10 [phi:divr16u::@3->divr16u::@1#3] -- register_copy
//SEG421 [194] phi (word) divr16u::rem#4 = (word) divr16u::rem#9 [phi:divr16u::@3->divr16u::@1#3] -- register_copy
jmp b1
//SEG422 divr16u::@1
b1:
@ -8088,13 +7935,13 @@ divr16u: {
b3_from_b2:
b3_from_b5:
//SEG439 [206] phi (word) divr16u::return#0 = (word) divr16u::quotient#1 [phi:divr16u::@2/divr16u::@5->divr16u::@3#0] -- register_copy
//SEG440 [206] phi (word) divr16u::rem#10 = (word) divr16u::rem#5 [phi:divr16u::@2/divr16u::@5->divr16u::@3#1] -- register_copy
//SEG440 [206] phi (word) divr16u::rem#9 = (word) divr16u::rem#5 [phi:divr16u::@2/divr16u::@5->divr16u::@3#1] -- register_copy
jmp b3
//SEG441 divr16u::@3
b3:
//SEG442 [207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuz1=_inc_vbuz1
//SEG442 [207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuz1=_inc_vbuz1
inc i
//SEG443 [208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuz1_neq_vbuc1_then_la1
//SEG443 [208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuz1_neq_vbuc1_then_la1
lda i
cmp #$10
bne b1_from_b3
@ -8297,7 +8144,7 @@ Potential registers zp ZP_BYTE:33 [ sin8s::return#0 sin8s::return#5 sin8s::sinx#
Potential registers zp ZP_BYTE:34 [ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ] : zp ZP_BYTE:34 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:35 [ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ] : zp ZP_BYTE:35 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:36 [ mulu8_sel::select#5 ] : zp ZP_BYTE:36 , reg byte x , reg byte y ,
Potential registers zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] : zp ZP_WORD:37 ,
Potential registers zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] : zp ZP_WORD:37 ,
Potential registers zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ] : zp ZP_WORD:39 ,
Potential registers zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ] : zp ZP_WORD:41 ,
Potential registers zp ZP_BYTE:43 [ divr16u::i#2 divr16u::i#1 ] : zp ZP_BYTE:43 , reg byte x , reg byte y ,
@ -8344,7 +8191,7 @@ REGISTER UPLIFT SCOPES
Uplift Scope [mul8u] 346.86: zp ZP_WORD:25 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] 249.57: zp ZP_WORD:27 [ mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 ] 202: zp ZP_BYTE:65 [ mul8u::$1 ] 177.67: zp ZP_BYTE:24 [ mul8u::a#3 mul8u::a#6 mul8u::a#8 mul8u::a#2 mul8u::a#0 ] 8: zp ZP_BYTE:23 [ mul8u::b#2 mul8u::b#1 ] 4: zp ZP_WORD:61 [ mul8u::return#2 ] 4: zp ZP_WORD:81 [ mul8u::return#3 ]
Uplift Scope [] 225.55: zp ZP_WORD:8 [ print_line_cursor#12 print_line_cursor#23 print_line_cursor#1 ] 223.48: zp ZP_WORD:16 [ print_char_cursor#92 print_char_cursor#102 print_char_cursor#62 print_char_cursor#97 print_char_cursor#94 print_char_cursor#96 print_char_cursor#17 print_char_cursor#2 print_char_cursor#122 print_char_cursor#1 ]
Uplift Scope [print_str] 305.5: zp ZP_WORD:12 [ print_str::str#10 print_str::str#12 print_str::str#0 ]
Uplift Scope [divr16u] 96.25: zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] 37.25: zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ] 22: zp ZP_BYTE:92 [ divr16u::$1 ] 22: zp ZP_BYTE:93 [ divr16u::$2 ] 18.19: zp ZP_BYTE:43 [ divr16u::i#2 divr16u::i#1 ] 7.46: zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ] 4: zp ZP_WORD:88 [ divr16u::return#2 ]
Uplift Scope [divr16u] 96.25: zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] 37.25: zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ] 22: zp ZP_BYTE:92 [ divr16u::$1 ] 22: zp ZP_BYTE:93 [ divr16u::$2 ] 18.19: zp ZP_BYTE:43 [ divr16u::i#2 divr16u::i#1 ] 7.46: zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ] 4: zp ZP_WORD:88 [ divr16u::return#2 ]
Uplift Scope [sin8s] 27.5: zp ZP_WORD:30 [ sin8s::x#6 sin8s::x#4 sin8s::x#2 sin8s::x#0 sin8s::x#1 ] 22: zp ZP_BYTE:50 [ sin8s::return#2 ] 13: zp ZP_BYTE:33 [ sin8s::return#0 sin8s::return#5 sin8s::sinx#1 ] 10: zp ZP_BYTE:32 [ sin8s::usinx#4 sin8s::usinx#1 sin8s::usinx#2 ] 4: zp ZP_WORD:66 [ sin8s::$6 ] 4: zp ZP_BYTE:70 [ sin8s::x2#0 ] 4: zp ZP_BYTE:74 [ sin8s::x3_6#0 ] 4: zp ZP_BYTE:77 [ sin8s::x4#0 ] 4: zp ZP_BYTE:79 [ sin8s::x5#0 ] 4: zp ZP_BYTE:80 [ sin8s::x5_128#0 ] 1: zp ZP_BYTE:72 [ sin8s::x3#0 ] 0.64: zp ZP_BYTE:68 [ sin8s::x1#0 ] 0.33: zp ZP_BYTE:75 [ sin8s::usinx#0 ] 0.06: zp ZP_BYTE:29 [ sin8s::isUpper#10 ]
Uplift Scope [mulu8_sel] 24: zp ZP_BYTE:34 [ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ] 21: zp ZP_BYTE:35 [ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ] 4: zp ZP_BYTE:69 [ mulu8_sel::return#0 ] 4: zp ZP_BYTE:71 [ mulu8_sel::return#1 ] 4: zp ZP_BYTE:73 [ mulu8_sel::return#2 ] 4: zp ZP_BYTE:76 [ mulu8_sel::return#10 ] 4: zp ZP_BYTE:78 [ mulu8_sel::return#11 ] 4: zp ZP_WORD:83 [ mulu8_sel::$0 ] 4: zp ZP_WORD:85 [ mulu8_sel::$1 ] 1.71: zp ZP_BYTE:87 [ mulu8_sel::return#12 ] 0.33: zp ZP_BYTE:36 [ mulu8_sel::select#5 ]
Uplift Scope [sin8u_table] 22: zp ZP_BYTE:57 [ sin8u_table::$21 ] 17.19: zp ZP_WORD:6 [ sin8u_table::i#10 sin8u_table::i#1 ] 8.75: zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 ] 3.75: zp ZP_WORD:4 [ sin8u_table::sintab#2 sin8u_table::sintab#1 ] 2.2: zp ZP_BYTE:51 [ sin8u_table::sinx#0 ] 2.2: zp ZP_WORD:55 [ sin8u_table::sinx_sc#0 ] 1.94: zp ZP_BYTE:58 [ sin8u_table::sinx_tr#0 ] 0.27: zp ZP_WORD:48 [ sin8u_table::step#0 ]
@ -8362,7 +8209,7 @@ Uplift Scope [main]
Uplifting [mul8u] best 24241 combination zp ZP_WORD:25 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] zp ZP_WORD:27 [ mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 ] reg byte a [ mul8u::$1 ] reg byte x [ mul8u::a#3 mul8u::a#6 mul8u::a#8 mul8u::a#2 mul8u::a#0 ] reg byte a [ mul8u::b#2 mul8u::b#1 ] zp ZP_WORD:61 [ mul8u::return#2 ] zp ZP_WORD:81 [ mul8u::return#3 ]
Uplifting [] best 24241 combination zp ZP_WORD:8 [ print_line_cursor#12 print_line_cursor#23 print_line_cursor#1 ] zp ZP_WORD:16 [ print_char_cursor#92 print_char_cursor#102 print_char_cursor#62 print_char_cursor#97 print_char_cursor#94 print_char_cursor#96 print_char_cursor#17 print_char_cursor#2 print_char_cursor#122 print_char_cursor#1 ]
Uplifting [print_str] best 24241 combination zp ZP_WORD:12 [ print_str::str#10 print_str::str#12 print_str::str#0 ]
Uplifting [divr16u] best 24051 combination zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ] reg byte a [ divr16u::$1 ] reg byte a [ divr16u::$2 ] reg byte x [ divr16u::i#2 divr16u::i#1 ] zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ] zp ZP_WORD:88 [ divr16u::return#2 ]
Uplifting [divr16u] best 24051 combination zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 ] reg byte a [ divr16u::$1 ] reg byte a [ divr16u::$2 ] reg byte x [ divr16u::i#2 divr16u::i#1 ] zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ] zp ZP_WORD:88 [ divr16u::return#2 ]
Uplifting [sin8s] best 23946 combination zp ZP_WORD:30 [ sin8s::x#6 sin8s::x#4 sin8s::x#2 sin8s::x#0 sin8s::x#1 ] reg byte a [ sin8s::return#2 ] reg byte a [ sin8s::return#0 sin8s::return#5 sin8s::sinx#1 ] reg byte x [ sin8s::usinx#4 sin8s::usinx#1 sin8s::usinx#2 ] zp ZP_WORD:66 [ sin8s::$6 ] zp ZP_BYTE:70 [ sin8s::x2#0 ] zp ZP_BYTE:74 [ sin8s::x3_6#0 ] zp ZP_BYTE:77 [ sin8s::x4#0 ] zp ZP_BYTE:79 [ sin8s::x5#0 ] zp ZP_BYTE:80 [ sin8s::x5_128#0 ] zp ZP_BYTE:72 [ sin8s::x3#0 ] zp ZP_BYTE:68 [ sin8s::x1#0 ] zp ZP_BYTE:75 [ sin8s::usinx#0 ] zp ZP_BYTE:29 [ sin8s::isUpper#10 ]
Limited combination testing to 100 combinations of 5308416 possible.
Uplifting [mulu8_sel] best 23900 combination reg byte x [ mulu8_sel::v1#5 mulu8_sel::v1#1 mulu8_sel::v1#2 mulu8_sel::v1#3 mulu8_sel::v1#4 mulu8_sel::v1#0 ] reg byte y [ mulu8_sel::v2#5 mulu8_sel::v2#1 mulu8_sel::v2#3 mulu8_sel::v2#4 mulu8_sel::v2#0 ] reg byte a [ mulu8_sel::return#0 ] reg byte a [ mulu8_sel::return#1 ] zp ZP_BYTE:73 [ mulu8_sel::return#2 ] zp ZP_BYTE:76 [ mulu8_sel::return#10 ] zp ZP_BYTE:78 [ mulu8_sel::return#11 ] zp ZP_WORD:83 [ mulu8_sel::$0 ] zp ZP_WORD:85 [ mulu8_sel::$1 ] zp ZP_BYTE:87 [ mulu8_sel::return#12 ] zp ZP_BYTE:36 [ mulu8_sel::select#5 ]
@ -8426,8 +8273,8 @@ Coalescing zero page register with common assignment [ zp ZP_WORD:21 [ mul8su::m
Coalescing zero page register with common assignment [ zp ZP_WORD:21 [ mul8su::m#2 mul8su::m#1 mul8su::m#0 mul8su::return#2 mul8u::return#2 mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#3 ] ] with [ zp ZP_WORD:55 [ sin8u_table::sinx_sc#0 ] ] - score: 1
Coalescing zero page register with common assignment [ zp ZP_WORD:41 [ divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 divr16u::return#2 ] ] with [ zp ZP_WORD:46 [ div16u::return#2 sin8u_table::step#0 div16u::return#0 ] ] - score: 1
Coalescing zero page register with common assignment [ zp ZP_WORD:21 [ mul8su::m#2 mul8su::m#1 mul8su::m#0 mul8su::return#2 mul8u::return#2 mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#3 sin8u_table::sinx_sc#0 ] ] with [ zp ZP_WORD:83 [ mulu8_sel::$0 mulu8_sel::$1 ] ] - score: 1
Coalescing zero page register [ zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 ] ] with [ zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] ]
Coalescing zero page register [ zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] ] with [ zp ZP_WORD:44 [ print_cls::sc#2 print_cls::sc#1 ] ]
Coalescing zero page register [ zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 ] ] with [ zp ZP_WORD:37 [ divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] ]
Coalescing zero page register [ zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 ] ] with [ zp ZP_WORD:44 [ print_cls::sc#2 print_cls::sc#1 ] ]
Coalescing zero page register [ zp ZP_WORD:4 [ sin8u_table::sintab#2 sin8u_table::sintab#1 ] ] with [ zp ZP_WORD:39 [ divr16u::dividend#2 divr16u::dividend#0 ] ]
Coalescing zero page register [ zp ZP_BYTE:10 [ print_byte::b#8 print_byte::b#10 print_byte::b#1 print_byte::b#2 print_byte::b#7 print_sbyte::b#3 print_sbyte::b#1 print_sbyte::b#0 ] ] with [ zp ZP_BYTE:29 [ sin8s::isUpper#10 ] ]
Coalescing zero page register [ zp ZP_WORD:12 [ print_str::str#10 print_str::str#12 print_str::str#0 ] ] with [ zp ZP_WORD:14 [ print_sword::w#3 print_sword::w#1 print_sword::w#0 print_word::w#3 print_word::w#5 print_word::w#2 print_word::w#1 ] ]
@ -9596,7 +9443,7 @@ divr16u: {
//SEG418 [194] phi (byte) divr16u::i#2 = (byte) divr16u::i#1 [phi:divr16u::@3->divr16u::@1#0] -- register_copy
//SEG419 [194] phi (word) divr16u::quotient#3 = (word) divr16u::return#0 [phi:divr16u::@3->divr16u::@1#1] -- register_copy
//SEG420 [194] phi (word) divr16u::dividend#2 = (word) divr16u::dividend#0 [phi:divr16u::@3->divr16u::@1#2] -- register_copy
//SEG421 [194] phi (word) divr16u::rem#4 = (word) divr16u::rem#10 [phi:divr16u::@3->divr16u::@1#3] -- register_copy
//SEG421 [194] phi (word) divr16u::rem#4 = (word) divr16u::rem#9 [phi:divr16u::@3->divr16u::@1#3] -- register_copy
jmp b1
//SEG422 divr16u::@1
b1:
@ -9659,13 +9506,13 @@ divr16u: {
b3_from_b2:
b3_from_b5:
//SEG439 [206] phi (word) divr16u::return#0 = (word) divr16u::quotient#1 [phi:divr16u::@2/divr16u::@5->divr16u::@3#0] -- register_copy
//SEG440 [206] phi (word) divr16u::rem#10 = (word) divr16u::rem#5 [phi:divr16u::@2/divr16u::@5->divr16u::@3#1] -- register_copy
//SEG440 [206] phi (word) divr16u::rem#9 = (word) divr16u::rem#5 [phi:divr16u::@2/divr16u::@5->divr16u::@3#1] -- register_copy
jmp b3
//SEG441 divr16u::@3
b3:
//SEG442 [207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG442 [207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG443 [208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
//SEG443 [208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #$10
bne b1_from_b3
jmp breturn
@ -10033,10 +9880,10 @@ FINAL SYMBOL TABLE
(word) divr16u::rem
(word) divr16u::rem#0 rem zp ZP_WORD:2 8.25
(word) divr16u::rem#1 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#10 rem zp ZP_WORD:2 11.0
(word) divr16u::rem#2 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#4 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#5 rem zp ZP_WORD:2 11.0
(word) divr16u::rem#9 rem zp ZP_WORD:2 11.0
(word) divr16u::return
(word) divr16u::return#0 return zp ZP_WORD:18 7.000000000000001
(word) divr16u::return#2 return zp ZP_WORD:18 4.0
@ -10196,7 +10043,6 @@ FINAL SYMBOL TABLE
(word) print_word::w#2 w zp ZP_WORD:11 22.0
(word) print_word::w#3 w zp ZP_WORD:11 6.333333333333334
(word~) print_word::w#5 w zp ZP_WORD:11 4.0
(word) rem16u
(signed byte()) sin8s((word) sin8s::x)
(word~) sin8s::$6 $6 zp ZP_WORD:11 4.0
(label) sin8s::@1
@ -10313,7 +10159,7 @@ FINAL SYMBOL TABLE
(word) sin8u_table::x#1 x zp ZP_WORD:2 7.333333333333333
(word) sin8u_table::x#10 x zp ZP_WORD:2 1.4193548387096775
zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 print_cls::sc#2 print_cls::sc#1 ]
zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 print_cls::sc#2 print_cls::sc#1 ]
zp ZP_WORD:4 [ sin8u_table::sintab#2 sin8u_table::sintab#1 divr16u::dividend#2 divr16u::dividend#0 ]
zp ZP_WORD:6 [ sin8u_table::i#10 sin8u_table::i#1 ]
zp ZP_WORD:8 [ print_line_cursor#12 print_line_cursor#23 print_line_cursor#1 ]
@ -11296,7 +11142,7 @@ divr16u: {
//SEG418 [194] phi (byte) divr16u::i#2 = (byte) divr16u::i#1 [phi:divr16u::@3->divr16u::@1#0] -- register_copy
//SEG419 [194] phi (word) divr16u::quotient#3 = (word) divr16u::return#0 [phi:divr16u::@3->divr16u::@1#1] -- register_copy
//SEG420 [194] phi (word) divr16u::dividend#2 = (word) divr16u::dividend#0 [phi:divr16u::@3->divr16u::@1#2] -- register_copy
//SEG421 [194] phi (word) divr16u::rem#4 = (word) divr16u::rem#10 [phi:divr16u::@3->divr16u::@1#3] -- register_copy
//SEG421 [194] phi (word) divr16u::rem#4 = (word) divr16u::rem#9 [phi:divr16u::@3->divr16u::@1#3] -- register_copy
//SEG422 divr16u::@1
b1:
//SEG423 [195] (word) divr16u::rem#0 ← (word) divr16u::rem#4 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::dividend#2 divr16u::quotient#3 divr16u::i#2 divr16u::rem#0 ] ) -- vwuz1=vwuz1_rol_1
@ -11349,12 +11195,12 @@ divr16u: {
sta rem+1
//SEG438 [206] phi from divr16u::@2 divr16u::@5 to divr16u::@3 [phi:divr16u::@2/divr16u::@5->divr16u::@3]
//SEG439 [206] phi (word) divr16u::return#0 = (word) divr16u::quotient#1 [phi:divr16u::@2/divr16u::@5->divr16u::@3#0] -- register_copy
//SEG440 [206] phi (word) divr16u::rem#10 = (word) divr16u::rem#5 [phi:divr16u::@2/divr16u::@5->divr16u::@3#1] -- register_copy
//SEG440 [206] phi (word) divr16u::rem#9 = (word) divr16u::rem#5 [phi:divr16u::@2/divr16u::@5->divr16u::@3#1] -- register_copy
//SEG441 divr16u::@3
b3:
//SEG442 [207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx=_inc_vbuxx
//SEG442 [207] (byte) divr16u::i#1 ← ++ (byte) divr16u::i#2 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx=_inc_vbuxx
inx
//SEG443 [208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#10 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
//SEG443 [208] if((byte) divr16u::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 16) goto divr16u::@1 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ( main:2::sin8u_table:7::div16u:10::divr16u:189 [ divr16u::return#0 divr16u::rem#9 divr16u::dividend#0 divr16u::i#1 ] ) -- vbuxx_neq_vbuc1_then_la1
cpx #$10
bne b1
//SEG444 divr16u::@return

View File

@ -38,10 +38,10 @@
(word) divr16u::rem
(word) divr16u::rem#0 rem zp ZP_WORD:2 8.25
(word) divr16u::rem#1 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#10 rem zp ZP_WORD:2 11.0
(word) divr16u::rem#2 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#4 rem zp ZP_WORD:2 22.0
(word) divr16u::rem#5 rem zp ZP_WORD:2 11.0
(word) divr16u::rem#9 rem zp ZP_WORD:2 11.0
(word) divr16u::return
(word) divr16u::return#0 return zp ZP_WORD:18 7.000000000000001
(word) divr16u::return#2 return zp ZP_WORD:18 4.0
@ -201,7 +201,6 @@
(word) print_word::w#2 w zp ZP_WORD:11 22.0
(word) print_word::w#3 w zp ZP_WORD:11 6.333333333333334
(word~) print_word::w#5 w zp ZP_WORD:11 4.0
(word) rem16u
(signed byte()) sin8s((word) sin8s::x)
(word~) sin8s::$6 $6 zp ZP_WORD:11 4.0
(label) sin8s::@1
@ -318,7 +317,7 @@
(word) sin8u_table::x#1 x zp ZP_WORD:2 7.333333333333333
(word) sin8u_table::x#10 x zp ZP_WORD:2 1.4193548387096775
zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 divr16u::rem#4 divr16u::rem#10 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 print_cls::sc#2 print_cls::sc#1 ]
zp ZP_WORD:2 [ sin8u_table::x#10 sin8u_table::x#1 divr16u::rem#4 divr16u::rem#9 divr16u::rem#5 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 print_cls::sc#2 print_cls::sc#1 ]
zp ZP_WORD:4 [ sin8u_table::sintab#2 sin8u_table::sintab#1 divr16u::dividend#2 divr16u::dividend#0 ]
zp ZP_WORD:6 [ sin8u_table::i#10 sin8u_table::i#1 ]
zp ZP_WORD:8 [ print_line_cursor#12 print_line_cursor#23 print_line_cursor#1 ]