From 15a9415d632ee7fb1dd710ce4137f34b13a2ec6d Mon Sep 17 00:00:00 2001 From: Jesper Gravgaard <jg@ramboll.com> Date: Sat, 12 Aug 2017 18:30:21 +0200 Subject: [PATCH] Improved ASM readability --- src/main/java/dk/camelot64/kickc/TODO.txt | 4 +- .../dk/camelot64/kickc/asm/AsmFragment.java | 4 +- .../dk/camelot64/kickc/asm/AsmProcBegin.java | 48 + .../dk/camelot64/kickc/asm/AsmProcEnd.java | 41 + .../dk/camelot64/kickc/asm/AsmProgram.java | 43 +- .../asm/AsmProgramStaticRegisterValues.java | 4 + .../dk/camelot64/kickc/asm/AsmSegment.java | 20 +- .../camelot64/kickc/icl/ControlFlowBlock.java | 46 +- .../dk/camelot64/kickc/icl/SymbolRef.java | 11 +- .../passes/Pass1EliminateEmptyBlocks.java | 2 +- .../passes/Pass1GenerateControlFlowGraph.java | 6 +- .../kickc/passes/Pass2AssertBlocks.java | 2 +- .../kickc/passes/Pass2AssertSymbols.java | 2 +- .../kickc/passes/Pass3CodeGeneration.java | 15 +- .../dk/camelot64/kickc/test/ref/bresenham.asm | 24 +- .../dk/camelot64/kickc/test/ref/bresenham.cfg | 16 +- .../dk/camelot64/kickc/test/ref/bresenham.log | 506 +- .../dk/camelot64/kickc/test/ref/bresenham.sym | 4 +- .../dk/camelot64/kickc/test/ref/fibmem.asm | 41 +- .../dk/camelot64/kickc/test/ref/fibmem.cfg | 10 +- .../dk/camelot64/kickc/test/ref/fibmem.log | 538 +-- .../dk/camelot64/kickc/test/ref/fibmem.sym | 4 +- .../camelot64/kickc/test/ref/flipper-rex2.asm | 236 +- .../camelot64/kickc/test/ref/flipper-rex2.cfg | 16 +- .../camelot64/kickc/test/ref/flipper-rex2.log | 2898 ++++++------ .../camelot64/kickc/test/ref/flipper-rex2.sym | 4 +- .../dk/camelot64/kickc/test/ref/loopmin.asm | 24 +- .../dk/camelot64/kickc/test/ref/loopmin.cfg | 12 +- .../dk/camelot64/kickc/test/ref/loopmin.log | 290 +- .../dk/camelot64/kickc/test/ref/loopmin.sym | 4 +- .../dk/camelot64/kickc/test/ref/loopnest.asm | 52 +- .../dk/camelot64/kickc/test/ref/loopnest.cfg | 12 +- .../dk/camelot64/kickc/test/ref/loopnest.log | 668 +-- .../dk/camelot64/kickc/test/ref/loopnest.sym | 4 +- .../dk/camelot64/kickc/test/ref/loopnest2.asm | 133 +- .../dk/camelot64/kickc/test/ref/loopnest2.cfg | 14 +- .../dk/camelot64/kickc/test/ref/loopnest2.log | 1426 +++--- .../dk/camelot64/kickc/test/ref/loopnest2.sym | 4 +- .../dk/camelot64/kickc/test/ref/loopsplit.asm | 41 +- .../dk/camelot64/kickc/test/ref/loopsplit.cfg | 10 +- .../dk/camelot64/kickc/test/ref/loopsplit.log | 353 +- .../dk/camelot64/kickc/test/ref/loopsplit.sym | 4 +- .../dk/camelot64/kickc/test/ref/minus.asm | 12 +- .../dk/camelot64/kickc/test/ref/minus.cfg | 10 +- .../dk/camelot64/kickc/test/ref/minus.log | 250 +- .../dk/camelot64/kickc/test/ref/minus.sym | 4 +- .../dk/camelot64/kickc/test/ref/modglobal.asm | 46 +- .../dk/camelot64/kickc/test/ref/modglobal.cfg | 12 +- .../dk/camelot64/kickc/test/ref/modglobal.log | 564 +-- .../dk/camelot64/kickc/test/ref/modglobal.sym | 4 +- .../camelot64/kickc/test/ref/modglobalmin.asm | 42 +- .../camelot64/kickc/test/ref/modglobalmin.cfg | 12 +- .../camelot64/kickc/test/ref/modglobalmin.log | 492 +- .../camelot64/kickc/test/ref/modglobalmin.sym | 4 +- .../dk/camelot64/kickc/test/ref/ptrtest.asm | 145 +- .../dk/camelot64/kickc/test/ref/ptrtest.cfg | 18 +- .../dk/camelot64/kickc/test/ref/ptrtest.log | 1083 ++--- .../dk/camelot64/kickc/test/ref/ptrtest.sym | 4 +- .../camelot64/kickc/test/ref/ptrtestmin.asm | 27 +- .../camelot64/kickc/test/ref/ptrtestmin.cfg | 10 +- .../camelot64/kickc/test/ref/ptrtestmin.log | 311 +- .../camelot64/kickc/test/ref/ptrtestmin.sym | 4 +- .../dk/camelot64/kickc/test/ref/summin.asm | 29 +- .../dk/camelot64/kickc/test/ref/summin.cfg | 16 +- .../dk/camelot64/kickc/test/ref/summin.log | 317 +- .../dk/camelot64/kickc/test/ref/summin.sym | 4 +- .../dk/camelot64/kickc/test/ref/useglobal.asm | 15 +- .../dk/camelot64/kickc/test/ref/useglobal.cfg | 10 +- .../dk/camelot64/kickc/test/ref/useglobal.log | 223 +- .../dk/camelot64/kickc/test/ref/useglobal.sym | 4 +- .../dk/camelot64/kickc/test/ref/voronoi.asm | 506 +- .../dk/camelot64/kickc/test/ref/voronoi.cfg | 20 +- .../dk/camelot64/kickc/test/ref/voronoi.log | 4194 +++++++++-------- .../dk/camelot64/kickc/test/ref/voronoi.sym | 4 +- 74 files changed, 8154 insertions(+), 7838 deletions(-) create mode 100644 src/main/java/dk/camelot64/kickc/asm/AsmProcBegin.java create mode 100644 src/main/java/dk/camelot64/kickc/asm/AsmProcEnd.java diff --git a/src/main/java/dk/camelot64/kickc/TODO.txt b/src/main/java/dk/camelot64/kickc/TODO.txt index 04ddf4e4a..d223358d6 100644 --- a/src/main/java/dk/camelot64/kickc/TODO.txt +++ b/src/main/java/dk/camelot64/kickc/TODO.txt @@ -23,7 +23,9 @@ Features + Add ++/-- incrementing/decrementing operators. Assembler Improvements -- Make generated ASM human readable. Use hex-numbers, add labels for constants and zp-variables. +- Make generated ASM human readable. + + Use hex-numbers + - add labels for constants and zp-variables. - Eliminate unnecessary labels in ASM - Eliminate CPX from DEX, CPX #0, BNE la1 - Eliminate LDA from DEC $2, LDA $2, BNE la1 diff --git a/src/main/java/dk/camelot64/kickc/asm/AsmFragment.java b/src/main/java/dk/camelot64/kickc/asm/AsmFragment.java index ecf7e4710..bdb59841f 100644 --- a/src/main/java/dk/camelot64/kickc/asm/AsmFragment.java +++ b/src/main/java/dk/camelot64/kickc/asm/AsmFragment.java @@ -137,7 +137,7 @@ public class AsmFragment { ControlFlowBlock destinationBlock = graph.getBlock(destination); String destinationLabel; if (destinationBlock.hasPhiBlock()) { - destinationLabel = (destinationBlock.getLabel().getLocalName() + "_from_" + block.getLabel().getLocalName()).replace('@', 'B').replace(':', '_'); + destinationLabel = (destinationBlock.getLabel().getLocalName() + "_from_" + block.getLabel().getLocalName()).replace('@', 'b').replace(':', '_'); } else { destinationLabel = destination.getLocalName(); } @@ -332,7 +332,7 @@ public class AsmFragment { bound = String.format("$%x", boundInt.getNumber()); } } else if (boundValue instanceof Label) { - bound = ((Label) boundValue).getFullName().replace('@', 'B').replace(':', '_'); + bound = ((Label) boundValue).getLocalName().replace('@', 'b').replace(':', '_'); } else { throw new RuntimeException("Bound Value Type not implemented " + boundValue); } diff --git a/src/main/java/dk/camelot64/kickc/asm/AsmProcBegin.java b/src/main/java/dk/camelot64/kickc/asm/AsmProcBegin.java new file mode 100644 index 000000000..6d41bc4c5 --- /dev/null +++ b/src/main/java/dk/camelot64/kickc/asm/AsmProcBegin.java @@ -0,0 +1,48 @@ +package dk.camelot64.kickc.asm; + +/** A procedure - representing a label and a scope beginning*/ +public class AsmProcBegin implements AsmLine { + + private String label; + + private int index; + + public AsmProcBegin(String label) { + this.label = label; + } + + public String getLabel() { + return label; + } + + @Override + public int getLineBytes() { + return 0; + } + + @Override + public double getLineCycles() { + return 0; + } + + @Override + public String getAsm() { + return label+":"+" {"; + } + + @Override + public int getIndex() { + return index; + } + + @Override + public void setIndex(int index) { + this.index = index; + } + + @Override + public String toString() { + return getAsm(); + } + +} diff --git a/src/main/java/dk/camelot64/kickc/asm/AsmProcEnd.java b/src/main/java/dk/camelot64/kickc/asm/AsmProcEnd.java new file mode 100644 index 000000000..396ef98eb --- /dev/null +++ b/src/main/java/dk/camelot64/kickc/asm/AsmProcEnd.java @@ -0,0 +1,41 @@ +package dk.camelot64.kickc.asm; + +/** The end of a procedure (scope) */ +public class AsmProcEnd implements AsmLine { + + private int index; + + public AsmProcEnd() { + } + + @Override + public int getLineBytes() { + return 0; + } + + @Override + public double getLineCycles() { + return 0; + } + + @Override + public String getAsm() { + return "}"; + } + + @Override + public int getIndex() { + return index; + } + + @Override + public void setIndex(int index) { + this.index = index; + } + + @Override + public String toString() { + return getAsm(); + } + +} diff --git a/src/main/java/dk/camelot64/kickc/asm/AsmProgram.java b/src/main/java/dk/camelot64/kickc/asm/AsmProgram.java index b8b1866c9..1224cb248 100644 --- a/src/main/java/dk/camelot64/kickc/asm/AsmProgram.java +++ b/src/main/java/dk/camelot64/kickc/asm/AsmProgram.java @@ -59,6 +59,14 @@ public class AsmProgram { addLine(new AsmLabel(label)); } + public void addProcBegin(String label) { + addLine(new AsmProcBegin(label)); + } + + public void addProcEnd() { + addLine(new AsmProcEnd()); + } + public void addInstruction(String mnemonic, AsmAddressingMode addressingMode, String parameter) { AsmInstructionType instructionType = AsmInstructionSet.getInstructionType(mnemonic, addressingMode, parameter); addLine(new AsmInstruction(instructionType, parameter)); @@ -108,13 +116,45 @@ public class AsmProgram { } public String toString(boolean comments) { + return toString(new AsmPrintState(comments)); + } + + public String toString(AsmPrintState printState) { StringBuilder out = new StringBuilder(); for (AsmSegment segment : segments) { - out.append(segment.toString(comments)); + out.append(segment.toString(printState)); } return out.toString(); } + static class AsmPrintState { + boolean comments; + String indent; + + public AsmPrintState(boolean comments) { + this.comments = comments; + this.indent = ""; + } + + public boolean isComments() { + return comments; + } + + public void incIndent() { + this.indent = this.indent + " "; + } + + public void decIndent() { + this.indent = this.indent.substring(0, this.indent.length()-2); + } + + public String getIndent() { + return indent; + } + + } + + @Override public String toString() { return toString(true); @@ -135,4 +175,5 @@ public class AsmProgram { } return statementSegments; } + } diff --git a/src/main/java/dk/camelot64/kickc/asm/AsmProgramStaticRegisterValues.java b/src/main/java/dk/camelot64/kickc/asm/AsmProgramStaticRegisterValues.java index a530886b6..ac9ce1027 100644 --- a/src/main/java/dk/camelot64/kickc/asm/AsmProgramStaticRegisterValues.java +++ b/src/main/java/dk/camelot64/kickc/asm/AsmProgramStaticRegisterValues.java @@ -38,6 +38,10 @@ public class AsmProgramStaticRegisterValues { private AsmRegisterValues updateStaticRegisterValues(AsmRegisterValues current, AsmLine line) { if (line instanceof AsmLabel) { current = new AsmRegisterValues(); + } else if (line instanceof AsmProcBegin) { + current = new AsmRegisterValues(); + } else if (line instanceof AsmProcEnd) { + current = new AsmRegisterValues(); } else if (line instanceof AsmInstruction) { AsmInstruction instruction = (AsmInstruction) line; values.put(instruction, current); diff --git a/src/main/java/dk/camelot64/kickc/asm/AsmSegment.java b/src/main/java/dk/camelot64/kickc/asm/AsmSegment.java index 64d139995..d7de8e98b 100644 --- a/src/main/java/dk/camelot64/kickc/asm/AsmSegment.java +++ b/src/main/java/dk/camelot64/kickc/asm/AsmSegment.java @@ -115,10 +115,10 @@ public class AsmSegment { return clobber; } - public String toString(boolean comments) { + public String toString(AsmProgram.AsmPrintState printState) { StringBuffer out = new StringBuffer(); - if (comments) { - out.append("//SEG").append(getIndex()); + if (printState.isComments()) { + out.append(printState.getIndent()).append("//SEG").append(getIndex()); if (source != null) { out.append(" ").append(source); } @@ -129,22 +129,30 @@ public class AsmSegment { out.append("\n"); } for (AsmLine line : lines) { - if (line instanceof AsmComment && !comments) { + if (line instanceof AsmComment && !printState.isComments()) { if (!((AsmComment) line).getComment().contains("Fragment")) { continue; } } - if (line instanceof AsmComment || line instanceof AsmInstruction) { + if(line instanceof AsmProcEnd) { + printState.decIndent(); + } + out.append(printState.getIndent()); + if (line instanceof AsmComment || line instanceof AsmInstruction ) { out.append(" "); } out.append(line.getAsm() + "\n"); + if(line instanceof AsmProcBegin) { + printState.incIndent(); + } + } return out.toString(); } @Override public String toString() { - return toString(true); + return toString(new AsmProgram.AsmPrintState(true)); } } diff --git a/src/main/java/dk/camelot64/kickc/icl/ControlFlowBlock.java b/src/main/java/dk/camelot64/kickc/icl/ControlFlowBlock.java index 5b7683bd7..2cffdc2c5 100644 --- a/src/main/java/dk/camelot64/kickc/icl/ControlFlowBlock.java +++ b/src/main/java/dk/camelot64/kickc/icl/ControlFlowBlock.java @@ -53,7 +53,7 @@ public class ControlFlowBlock { } public void addStatementBeforeLast(Statement statement) { - this.statements.add(statements.size()-1, statement); + this.statements.add(statements.size() - 1, statement); } public void setDefaultSuccessor(LabelRef defaultSuccessor) { @@ -84,14 +84,34 @@ public class ControlFlowBlock { return statements; } + + /** + * Is the block the entry of a procedure, ie. the first block of the code of the procedure. + * @return true if this is the entry of a procedure + */ + public boolean isProcedureEntry(Program program) { + Symbol symbol = program.getScope().getSymbol(getLabel()); + return (symbol instanceof Procedure); + } + + /** + * Is the block the exit of a procedure, ie. the last block of code of the the procedure + * @param program + * @return true if this is the exit of a procedure + */ + public boolean isProcedureExit(Program program) { + return getLabel().isProcExit(); + } + + public String toString(Program program) { ControlFlowGraph graph = program.getGraph(); StringBuffer out = new StringBuffer(); - out.append(label.getFullName() + ":" ); + out.append(label.getFullName() + ":"); out.append(" from"); - if(graph!=null) { + if (graph != null) { List<ControlFlowBlock> predecessors = graph.getPredecessors(this); - if(predecessors.size()>0) { + if (predecessors.size() > 0) { for (ControlFlowBlock predecessor : predecessors) { out.append(" " + predecessor.getLabel().getFullName()); } @@ -101,9 +121,9 @@ public class ControlFlowBlock { } out.append("\n"); for (Statement statement : statements) { - out.append(" "+statement.toString(program)+"\n"); + out.append(" " + statement.toString(program) + "\n"); } - if(defaultSuccessor!=null) { + if (defaultSuccessor != null) { out.append(" to:"); out.append(defaultSuccessor.getFullName()); out.append("\n"); @@ -144,10 +164,10 @@ public class ControlFlowBlock { @JsonIgnore public StatementPhiBlock getPhiBlock() { StatementPhiBlock phiBlock = null; - if(statements.size()>0 && statements.get(0) instanceof StatementPhiBlock) { + if (statements.size() > 0 && statements.get(0) instanceof StatementPhiBlock) { phiBlock = (StatementPhiBlock) statements.get(0); } - if(phiBlock==null) { + if (phiBlock == null) { phiBlock = new StatementPhiBlock(); statements.add(0, phiBlock); } @@ -155,8 +175,8 @@ public class ControlFlowBlock { } public boolean hasPhiBlock() { - if(statements.size()>0) { - if(statements.get(0) instanceof StatementPhiBlock) { + if (statements.size() > 0) { + if (statements.get(0) instanceof StatementPhiBlock) { return true; } } @@ -171,13 +191,13 @@ public class ControlFlowBlock { @JsonIgnore public Collection<LabelRef> getSuccessors() { List<LabelRef> successors = new ArrayList<>(); - if(defaultSuccessor!=null) { + if (defaultSuccessor != null) { successors.add(defaultSuccessor); } - if(conditionalSuccessor!=null) { + if (conditionalSuccessor != null) { successors.add(conditionalSuccessor); } - if(callSuccessor!=null) { + if (callSuccessor != null) { successors.add(callSuccessor); } return successors; diff --git a/src/main/java/dk/camelot64/kickc/icl/SymbolRef.java b/src/main/java/dk/camelot64/kickc/icl/SymbolRef.java index ecbda7d99..4c782a05c 100644 --- a/src/main/java/dk/camelot64/kickc/icl/SymbolRef.java +++ b/src/main/java/dk/camelot64/kickc/icl/SymbolRef.java @@ -1,6 +1,7 @@ package dk.camelot64.kickc.icl; import com.fasterxml.jackson.annotation.JsonIgnore; +import dk.camelot64.kickc.passes.Pass1GenerateControlFlowGraph; /** A reference to a symbol (variable, procedure or label) */ public class SymbolRef implements Value { @@ -65,10 +66,17 @@ public class SymbolRef implements Value { @JsonIgnore public boolean isIntermediate() { - if(fullName.contains("@BEGIN") || fullName.contains("@END") ) return false; + if( + fullName.contains(Pass1GenerateControlFlowGraph.BEGIN_BLOCK_NAME) || + fullName.contains(Pass1GenerateControlFlowGraph.END_BLOCK_NAME) ) return false; return fullName.contains("$") || fullName.contains("@"); } + @JsonIgnore + public boolean isProcExit() { + return fullName.endsWith("@return"); + } + @JsonIgnore public String getLocalName() { int lastScopeIdx = fullName.lastIndexOf("::"); @@ -102,4 +110,5 @@ public class SymbolRef implements Value { } } + } diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1EliminateEmptyBlocks.java b/src/main/java/dk/camelot64/kickc/passes/Pass1EliminateEmptyBlocks.java index e4642372c..2fd7bd311 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass1EliminateEmptyBlocks.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass1EliminateEmptyBlocks.java @@ -24,7 +24,7 @@ public class Pass1EliminateEmptyBlocks { Collection<ControlFlowBlock> blocks = graph.getAllBlocks(); List<LabelRef> removeList = new ArrayList<>(); for (ControlFlowBlock block : blocks) { - if(block.getLabel().getFullName().equals("@END")) { + if(block.getLabel().getFullName().equals(Pass1GenerateControlFlowGraph.END_BLOCK_NAME)) { continue; } if (block.getStatements().isEmpty()) { diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateControlFlowGraph.java b/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateControlFlowGraph.java index 57042ee76..515b17e70 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateControlFlowGraph.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateControlFlowGraph.java @@ -9,8 +9,8 @@ import java.util.Stack; /** Pass that generates a control flow graph for the program */ public class Pass1GenerateControlFlowGraph { - public static final String BEGIN_BLOCK_NAME = "@BEGIN"; - public static final String END_BLOCK_NAME = "@END"; + public static final String BEGIN_BLOCK_NAME = "@begin"; + public static final String END_BLOCK_NAME = "@end"; private Scope scope; private Map<LabelRef, ControlFlowBlock> blocks; private ControlFlowBlock firstBlock; @@ -66,7 +66,7 @@ public class Pass1GenerateControlFlowGraph { blockStack.push(procBlock); } else if(statement instanceof StatementProcedureEnd) { // Procedure strategy implemented is currently variable-based transfer of parameters/return values - currentBlock.setDefaultSuccessor(new Label("@RETURN", scope, false).getRef()); + currentBlock.setDefaultSuccessor(new Label("@return", scope, false).getRef()); ControlFlowBlock nextBlock = getOrCreateBlock(scope.addLabelIntermediate().getRef()); blockStack.pop(); ControlFlowBlock prevBlock = blockStack.pop(); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass2AssertBlocks.java b/src/main/java/dk/camelot64/kickc/passes/Pass2AssertBlocks.java index 3fe22a329..a2700fab7 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass2AssertBlocks.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass2AssertBlocks.java @@ -45,7 +45,7 @@ public class Pass2AssertBlocks extends Pass2SsaAssertion { if (blockLabel == null) { return; } - if (blockLabel.getFullName().equals("@RETURN")) { + if (blockLabel.getFullName().equals("@return")) { return; } seenBlocks.add(blockLabel); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass2AssertSymbols.java b/src/main/java/dk/camelot64/kickc/passes/Pass2AssertSymbols.java index fcbb9c964..26adecd6b 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass2AssertSymbols.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass2AssertSymbols.java @@ -18,7 +18,7 @@ public class Pass2AssertSymbols extends Pass2SsaAssertion { HashSet<Symbol> codeSymbols = symbolFinder.getSymbols(); // Check that all symbols found in the code is also oin the symbol tabel for (Symbol codeSymbol : codeSymbols) { - if(codeSymbol.getFullName().equals("@RETURN")) continue; + if(codeSymbol.getFullName().equals("@return")) continue; Symbol tableSymbol = getSymbols().getSymbol(codeSymbol.getFullName()); if(tableSymbol==null) { throw new AssertionFailed("Compile process error. Symbol found in code, but not in symbol table. "+codeSymbol.getFullName()); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass3CodeGeneration.java b/src/main/java/dk/camelot64/kickc/passes/Pass3CodeGeneration.java index 0fe6c9fd3..87316b15f 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass3CodeGeneration.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass3CodeGeneration.java @@ -32,7 +32,11 @@ public class Pass3CodeGeneration { genBlockEntryPoints(asm, block); // Generate label asm.startSegment(null, block.getLabel().getFullName()); - asm.addLabel(block.getLabel().getFullName().replace('@', 'B').replace(':', '_')); + if(block.isProcedureEntry(program)) { + asm.addProcBegin(block.getLabel().getFullName().replace('@', 'b').replace(':', '_')); + }else { + asm.addLabel(block.getLabel().getLocalName().replace('@', 'b').replace(':', '_')); + } // Generate statements genStatements(asm, block); // Generate exit @@ -41,7 +45,10 @@ public class Pass3CodeGeneration { if (defaultSuccessor.hasPhiBlock()) { genBlockPhiTransition(asm, block, defaultSuccessor); } - asm.addInstruction("JMP", AsmAddressingMode.ABS, defaultSuccessor.getLabel().getFullName().replace('@', 'B').replace(':', '_')); + asm.addInstruction("JMP", AsmAddressingMode.ABS, defaultSuccessor.getLabel().getLocalName().replace('@', 'b').replace(':', '_')); + } + if(block.isProcedureExit(program)) { + asm.addProcEnd(); } } program.setAsm(asm); @@ -168,7 +175,7 @@ public class Pass3CodeGeneration { for (ControlFlowBlock predecessor : predecessors) { if (block.getLabel().equals(predecessor.getConditionalSuccessor())) { genBlockPhiTransition(asm, predecessor, block); - asm.addInstruction("JMP", AsmAddressingMode.ABS, block.getLabel().getFullName().replace('@', 'B').replace(':', '_')); + asm.addInstruction("JMP", AsmAddressingMode.ABS, block.getLabel().getLocalName().replace('@', 'b').replace(':', '_')); } } } @@ -177,7 +184,7 @@ public class Pass3CodeGeneration { private void genBlockPhiTransition(AsmProgram asm, ControlFlowBlock fromBlock, ControlFlowBlock toBlock) { Statement toFirstStatement = toBlock.getStatements().get(0); asm.startSegment(toFirstStatement.getIndex(), "["+toFirstStatement.getIndex()+"]"+" phi from " + fromBlock.getLabel().getFullName()+" to "+toBlock.getLabel().getFullName()); - asm.addLabel((toBlock.getLabel().getFullName() + "_from_" + fromBlock.getLabel().getLocalName()).replace('@', 'B').replace(':', '_')); + asm.addLabel((toBlock.getLabel().getLocalName() + "_from_" + fromBlock.getLabel().getLocalName()).replace('@', 'b').replace(':', '_')); if (toBlock.hasPhiBlock()) { StatementPhiBlock phiBlock = toBlock.getPhiBlock(); List<StatementPhiBlock.PhiVariable> phiVariables = new ArrayList<>(phiBlock.getPhiVariables()); diff --git a/src/main/java/dk/camelot64/kickc/test/ref/bresenham.asm b/src/main/java/dk/camelot64/kickc/test/ref/bresenham.asm index 4a6596701..cab6ec4ab 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/bresenham.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/bresenham.asm @@ -1,5 +1,5 @@ -BBEGIN: -B1_from_BBEGIN: +bbegin: +b1_from_bbegin: lda #$0 sta $5 ldx #$c @@ -9,8 +9,8 @@ B1_from_BBEGIN: sta $2 lda #>$400 sta $2+$1 -B1_from_B3: -B1: +b1_from_b3: +b1: ldy #$0 lda #$51 sta ($2),y @@ -24,14 +24,14 @@ B1: adc #$18 tax cpx #$27 - bcs B2 -B3_from_B1: -B3: + bcs b2 +b3_from_b1: +b3: lda $4 cmp #$28 - bcc B1_from_B3 -BEND: -B2: + bcc b1_from_b3 +bend: +b2: inc $5 lda $2 clc @@ -44,5 +44,5 @@ B2: sec sbc #$27 tax -B3_from_B2: - jmp B3 +b3_from_b2: + jmp b3 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/bresenham.cfg b/src/main/java/dk/camelot64/kickc/test/ref/bresenham.cfg index 248f2b457..361b6bda4 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/bresenham.cfg +++ b/src/main/java/dk/camelot64/kickc/test/ref/bresenham.cfg @@ -1,10 +1,10 @@ -@BEGIN: from +@begin: from to:@1 -@1: from @3 @BEGIN - [0] (byte) y#2 ← phi( @3/(byte) y#4 @BEGIN/(byte) 0 ) [ cursor#3 x#2 e#3 y#2 ] - [0] (byte) e#3 ← phi( @3/(byte) e#5 @BEGIN/(byte) 12 ) [ cursor#3 x#2 e#3 y#2 ] - [0] (byte) x#2 ← phi( @3/(byte) x#1 @BEGIN/(byte) 0 ) [ cursor#3 x#2 e#3 y#2 ] - [0] (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @BEGIN/(word) 1024 ) [ cursor#3 x#2 e#3 y#2 ] +@1: from @3 @begin + [0] (byte) y#2 ← phi( @3/(byte) y#4 @begin/(byte) 0 ) [ cursor#3 x#2 e#3 y#2 ] + [0] (byte) e#3 ← phi( @3/(byte) e#5 @begin/(byte) 12 ) [ cursor#3 x#2 e#3 y#2 ] + [0] (byte) x#2 ← phi( @3/(byte) x#1 @begin/(byte) 0 ) [ cursor#3 x#2 e#3 y#2 ] + [0] (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @begin/(word) 1024 ) [ cursor#3 x#2 e#3 y#2 ] [1] *((byte*) cursor#3) ← (byte) 81 [ cursor#3 x#2 e#3 y#2 ] [2] (byte) x#1 ← (byte) x#2 + (byte) 1 [ x#1 cursor#3 e#3 y#2 ] [3] (byte*) cursor#1 ← (byte*) cursor#3 + (byte) 1 [ x#1 e#3 cursor#1 y#2 ] @@ -16,8 +16,8 @@ [6] (byte) e#5 ← phi( @1/(byte) e#1 @2/(byte) e#2 ) [ cursor#5 x#1 e#5 y#4 ] [6] (byte*) cursor#5 ← phi( @1/(byte*) cursor#1 @2/(byte*) cursor#2 ) [ cursor#5 x#1 e#5 y#4 ] [7] if((byte) x#1<(byte) 40) goto @1 [ cursor#5 x#1 e#5 y#4 ] - to:@END -@END: from @3 + to:@end +@end: from @3 @2: from @1 [8] (byte) y#1 ← (byte) y#2 + (byte) 1 [ x#1 e#1 cursor#1 y#1 ] [9] (byte*) cursor#2 ← (byte*) cursor#1 + (byte) 40 [ x#1 e#1 cursor#2 y#1 ] diff --git a/src/main/java/dk/camelot64/kickc/test/ref/bresenham.log b/src/main/java/dk/camelot64/kickc/test/ref/bresenham.log index 97db86192..08f20a858 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/bresenham.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/bresenham.log @@ -97,7 +97,7 @@ SYMBOLS (byte) yd INITIAL CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) STAR ← (byte) 81 (byte[1000]) SCREEN ← (word) 1024 (byte) x0 ← (byte) 0 @@ -117,7 +117,7 @@ INITIAL CONTROL FLOW GRAPH (byte*~) $5 ← (byte*~) $4 + (byte) x (byte*) cursor ← (byte*~) $5 to:@1 -@1: from @3 @BEGIN +@1: from @3 @begin *((byte*) cursor) ← (byte) STAR (byte~) $6 ← (byte) x + (byte) 1 (byte) x ← (byte~) $6 @@ -146,14 +146,14 @@ INITIAL CONTROL FLOW GRAPH @5: from to:@2 @6: from @3 - to:@END -@END: from @6 + to:@end +@end: from @6 Removing empty block @4 Removing empty block @5 Removing empty block @6 CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) STAR ← (byte) 81 (byte[1000]) SCREEN ← (word) 1024 (byte) x0 ← (byte) 0 @@ -173,7 +173,7 @@ CONTROL FLOW GRAPH (byte*~) $5 ← (byte*~) $4 + (byte) x (byte*) cursor ← (byte*~) $5 to:@1 -@1: from @3 @BEGIN +@1: from @3 @begin *((byte*) cursor) ← (byte) STAR (byte~) $6 ← (byte) x + (byte) 1 (byte) x ← (byte~) $6 @@ -196,13 +196,13 @@ CONTROL FLOW GRAPH (byte~) $13 ← (byte) x1 + (byte) 1 (boolean~) $14 ← (byte) x < (byte~) $13 if((boolean~) $14) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 PROCEDURE MODIFY VARIABLE ANALYSIS CONTROL FLOW GRAPH WITH ASSIGNMENT CALL -@BEGIN: from +@begin: from (byte) STAR ← (byte) 81 (byte[1000]) SCREEN ← (word) 1024 (byte) x0 ← (byte) 0 @@ -222,7 +222,7 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL (byte*~) $5 ← (byte*~) $4 + (byte) x (byte*) cursor ← (byte*~) $5 to:@1 -@1: from @3 @BEGIN +@1: from @3 @begin *((byte*) cursor) ← (byte) STAR (byte~) $6 ← (byte) x + (byte) 1 (byte) x ← (byte~) $6 @@ -245,14 +245,14 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL (byte~) $13 ← (byte) x1 + (byte) 1 (boolean~) $14 ← (byte) x < (byte~) $13 if((boolean~) $14) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Completing Phi functions... Completing Phi functions... Completing Phi functions... CONTROL FLOW GRAPH SSA -@BEGIN: from +@begin: from (byte) STAR#0 ← (byte) 81 (byte[1000]) SCREEN#0 ← (word) 1024 (byte) x0#0 ← (byte) 0 @@ -272,15 +272,15 @@ CONTROL FLOW GRAPH SSA (byte*~) $5 ← (byte*~) $4 + (byte) x#0 (byte*) cursor#0 ← (byte*~) $5 to:@1 -@1: from @3 @BEGIN - (byte) x1#2 ← phi( @3/(byte) x1#1 @BEGIN/(byte) x1#0 ) - (byte) y#3 ← phi( @3/(byte) y#4 @BEGIN/(byte) y#0 ) - (byte) xd#1 ← phi( @3/(byte) xd#3 @BEGIN/(byte) xd#0 ) - (byte) yd#1 ← phi( @3/(byte) yd#2 @BEGIN/(byte) yd#0 ) - (byte) e#3 ← phi( @3/(byte) e#5 @BEGIN/(byte) e#0 ) - (byte) x#2 ← phi( @3/(byte) x#3 @BEGIN/(byte) x#0 ) - (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @BEGIN/(byte*) cursor#0 ) - (byte) STAR#1 ← phi( @3/(byte) STAR#2 @BEGIN/(byte) STAR#0 ) +@1: from @3 @begin + (byte) x1#2 ← phi( @3/(byte) x1#1 @begin/(byte) x1#0 ) + (byte) y#3 ← phi( @3/(byte) y#4 @begin/(byte) y#0 ) + (byte) xd#1 ← phi( @3/(byte) xd#3 @begin/(byte) xd#0 ) + (byte) yd#1 ← phi( @3/(byte) yd#2 @begin/(byte) yd#0 ) + (byte) e#3 ← phi( @3/(byte) e#5 @begin/(byte) e#0 ) + (byte) x#2 ← phi( @3/(byte) x#3 @begin/(byte) x#0 ) + (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @begin/(byte*) cursor#0 ) + (byte) STAR#1 ← phi( @3/(byte) STAR#2 @begin/(byte) STAR#0 ) *((byte*) cursor#3) ← (byte) STAR#1 (byte~) $6 ← (byte) x#2 + (byte) 1 (byte) x#1 ← (byte~) $6 @@ -319,11 +319,11 @@ CONTROL FLOW GRAPH SSA (byte~) $13 ← (byte) x1#1 + (byte) 1 (boolean~) $14 ← (byte) x#3 < (byte~) $13 if((boolean~) $14) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN -@BEGIN: from +@begin: from (byte) STAR#0 ← (byte) 81 (byte[1000]) SCREEN#0 ← (word) 1024 (byte) x0#0 ← (byte) 0 @@ -343,15 +343,15 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN (byte*~) $5 ← (byte*~) $4 + (byte) x#0 (byte*) cursor#0 ← (byte*~) $5 to:@1 -@1: from @3 @BEGIN - (byte) x1#2 ← phi( @3/(byte) x1#1 @BEGIN/(byte) x1#0 ) - (byte) y#3 ← phi( @3/(byte) y#4 @BEGIN/(byte) y#0 ) - (byte) xd#1 ← phi( @3/(byte) xd#3 @BEGIN/(byte) xd#0 ) - (byte) yd#1 ← phi( @3/(byte) yd#2 @BEGIN/(byte) yd#0 ) - (byte) e#3 ← phi( @3/(byte) e#5 @BEGIN/(byte) e#0 ) - (byte) x#2 ← phi( @3/(byte) x#3 @BEGIN/(byte) x#0 ) - (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @BEGIN/(byte*) cursor#0 ) - (byte) STAR#1 ← phi( @3/(byte) STAR#2 @BEGIN/(byte) STAR#0 ) +@1: from @3 @begin + (byte) x1#2 ← phi( @3/(byte) x1#1 @begin/(byte) x1#0 ) + (byte) y#3 ← phi( @3/(byte) y#4 @begin/(byte) y#0 ) + (byte) xd#1 ← phi( @3/(byte) xd#3 @begin/(byte) xd#0 ) + (byte) yd#1 ← phi( @3/(byte) yd#2 @begin/(byte) yd#0 ) + (byte) e#3 ← phi( @3/(byte) e#5 @begin/(byte) e#0 ) + (byte) x#2 ← phi( @3/(byte) x#3 @begin/(byte) x#0 ) + (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @begin/(byte*) cursor#0 ) + (byte) STAR#1 ← phi( @3/(byte) STAR#2 @begin/(byte) STAR#0 ) *((byte*) cursor#3) ← (byte) STAR#1 (byte~) $6 ← (byte) x#2 + (byte) 1 (byte) x#1 ← (byte~) $6 @@ -390,8 +390,8 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN (byte~) $13 ← (byte) x1#1 + (byte) 1 (boolean~) $14 ← (byte) x#3 < (byte~) $13 if((boolean~) $14) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Constant (byte) STAR#0 (byte) 81 Constant (byte[1000]) SCREEN#0 (word) 1024 @@ -401,7 +401,7 @@ Constant (byte) x1#0 (byte) 39 Constant (byte) y1#0 (byte) 24 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte~) $0 ← (byte) 39 - (byte) 0 (byte) xd#0 ← (byte~) $0 (byte~) $1 ← (byte) 24 - (byte) 0 @@ -415,15 +415,15 @@ CONTROL FLOW GRAPH (byte*~) $5 ← (byte*~) $4 + (byte) x#0 (byte*) cursor#0 ← (byte*~) $5 to:@1 -@1: from @3 @BEGIN - (byte) x1#2 ← phi( @3/(byte) x1#1 @BEGIN/(byte) 39 ) - (byte) y#3 ← phi( @3/(byte) y#4 @BEGIN/(byte) y#0 ) - (byte) xd#1 ← phi( @3/(byte) xd#3 @BEGIN/(byte) xd#0 ) - (byte) yd#1 ← phi( @3/(byte) yd#2 @BEGIN/(byte) yd#0 ) - (byte) e#3 ← phi( @3/(byte) e#5 @BEGIN/(byte) e#0 ) - (byte) x#2 ← phi( @3/(byte) x#3 @BEGIN/(byte) x#0 ) - (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @BEGIN/(byte*) cursor#0 ) - (byte) STAR#1 ← phi( @3/(byte) STAR#2 @BEGIN/(byte) 81 ) +@1: from @3 @begin + (byte) x1#2 ← phi( @3/(byte) x1#1 @begin/(byte) 39 ) + (byte) y#3 ← phi( @3/(byte) y#4 @begin/(byte) y#0 ) + (byte) xd#1 ← phi( @3/(byte) xd#3 @begin/(byte) xd#0 ) + (byte) yd#1 ← phi( @3/(byte) yd#2 @begin/(byte) yd#0 ) + (byte) e#3 ← phi( @3/(byte) e#5 @begin/(byte) e#0 ) + (byte) x#2 ← phi( @3/(byte) x#3 @begin/(byte) x#0 ) + (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @begin/(byte*) cursor#0 ) + (byte) STAR#1 ← phi( @3/(byte) STAR#2 @begin/(byte) 81 ) *((byte*) cursor#3) ← (byte) STAR#1 (byte~) $6 ← (byte) x#2 + (byte) 1 (byte) x#1 ← (byte~) $6 @@ -462,8 +462,8 @@ CONTROL FLOW GRAPH (byte~) $13 ← (byte) x1#1 + (byte) 1 (boolean~) $14 ← (byte) x#3 < (byte~) $13 if((boolean~) $14) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Multiple usages for variable. Not optimizing sub-constant (byte) x1#1 Alias (byte) xd#0 = (byte~) $0 @@ -483,7 +483,7 @@ Alias (byte*) cursor#2 = (byte*~) $11 Alias (byte) e#2 = (byte~) $12 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) xd#0 ← (byte) 39 - (byte) 0 (byte) yd#0 ← (byte) 24 - (byte) 0 (byte) x#0 ← (byte) 0 @@ -493,15 +493,15 @@ CONTROL FLOW GRAPH (byte*~) $4 ← (word) 1024 + (byte~) $3 (byte*) cursor#0 ← (byte*~) $4 + (byte) x#0 to:@1 -@1: from @3 @BEGIN - (byte) x1#2 ← phi( @3/(byte) x1#1 @BEGIN/(byte) 39 ) - (byte) y#2 ← phi( @3/(byte) y#4 @BEGIN/(byte) y#0 ) - (byte) xd#1 ← phi( @3/(byte) xd#3 @BEGIN/(byte) xd#0 ) - (byte) yd#1 ← phi( @3/(byte) yd#2 @BEGIN/(byte) yd#0 ) - (byte) e#3 ← phi( @3/(byte) e#5 @BEGIN/(byte) e#0 ) - (byte) x#2 ← phi( @3/(byte) x#3 @BEGIN/(byte) x#0 ) - (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @BEGIN/(byte*) cursor#0 ) - (byte) STAR#1 ← phi( @3/(byte) STAR#2 @BEGIN/(byte) 81 ) +@1: from @3 @begin + (byte) x1#2 ← phi( @3/(byte) x1#1 @begin/(byte) 39 ) + (byte) y#2 ← phi( @3/(byte) y#4 @begin/(byte) y#0 ) + (byte) xd#1 ← phi( @3/(byte) xd#3 @begin/(byte) xd#0 ) + (byte) yd#1 ← phi( @3/(byte) yd#2 @begin/(byte) yd#0 ) + (byte) e#3 ← phi( @3/(byte) e#5 @begin/(byte) e#0 ) + (byte) x#2 ← phi( @3/(byte) x#3 @begin/(byte) x#0 ) + (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @begin/(byte*) cursor#0 ) + (byte) STAR#1 ← phi( @3/(byte) STAR#2 @begin/(byte) 81 ) *((byte*) cursor#3) ← (byte) STAR#1 (byte) x#1 ← (byte) x#2 + (byte) 1 (byte*) cursor#1 ← (byte*) cursor#3 + (byte) 1 @@ -526,8 +526,8 @@ CONTROL FLOW GRAPH (byte~) $13 ← (byte) x1#1 + (byte) 1 (boolean~) $14 ← (byte) x#3 < (byte~) $13 if((boolean~) $14) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Redundant Phi (byte) x1#1 (byte) x1#2 Redundant Phi (byte) x#3 (byte) x#1 @@ -536,7 +536,7 @@ Redundant Phi (byte) yd#2 (byte) yd#1 Redundant Phi (byte) xd#3 (byte) xd#1 Succesful SSA optimization Pass2RedundantPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) xd#0 ← (byte) 39 - (byte) 0 (byte) yd#0 ← (byte) 24 - (byte) 0 (byte) x#0 ← (byte) 0 @@ -546,15 +546,15 @@ CONTROL FLOW GRAPH (byte*~) $4 ← (word) 1024 + (byte~) $3 (byte*) cursor#0 ← (byte*~) $4 + (byte) x#0 to:@1 -@1: from @3 @BEGIN - (byte) x1#2 ← phi( @3/(byte) x1#2 @BEGIN/(byte) 39 ) - (byte) y#2 ← phi( @3/(byte) y#4 @BEGIN/(byte) y#0 ) - (byte) xd#1 ← phi( @3/(byte) xd#1 @BEGIN/(byte) xd#0 ) - (byte) yd#1 ← phi( @3/(byte) yd#1 @BEGIN/(byte) yd#0 ) - (byte) e#3 ← phi( @3/(byte) e#5 @BEGIN/(byte) e#0 ) - (byte) x#2 ← phi( @3/(byte) x#1 @BEGIN/(byte) x#0 ) - (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @BEGIN/(byte*) cursor#0 ) - (byte) STAR#1 ← phi( @3/(byte) STAR#1 @BEGIN/(byte) 81 ) +@1: from @3 @begin + (byte) x1#2 ← phi( @3/(byte) x1#2 @begin/(byte) 39 ) + (byte) y#2 ← phi( @3/(byte) y#4 @begin/(byte) y#0 ) + (byte) xd#1 ← phi( @3/(byte) xd#1 @begin/(byte) xd#0 ) + (byte) yd#1 ← phi( @3/(byte) yd#1 @begin/(byte) yd#0 ) + (byte) e#3 ← phi( @3/(byte) e#5 @begin/(byte) e#0 ) + (byte) x#2 ← phi( @3/(byte) x#1 @begin/(byte) x#0 ) + (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @begin/(byte*) cursor#0 ) + (byte) STAR#1 ← phi( @3/(byte) STAR#1 @begin/(byte) 81 ) *((byte*) cursor#3) ← (byte) STAR#1 (byte) x#1 ← (byte) x#2 + (byte) 1 (byte*) cursor#1 ← (byte*) cursor#3 + (byte) 1 @@ -574,8 +574,8 @@ CONTROL FLOW GRAPH (byte~) $13 ← (byte) x1#2 + (byte) 1 (boolean~) $14 ← (byte) x#1 < (byte~) $13 if((boolean~) $14) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Self Phi Eliminated (byte) STAR#1 Self Phi Eliminated (byte) yd#1 @@ -583,7 +583,7 @@ Self Phi Eliminated (byte) xd#1 Self Phi Eliminated (byte) x1#2 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) xd#0 ← (byte) 39 - (byte) 0 (byte) yd#0 ← (byte) 24 - (byte) 0 (byte) x#0 ← (byte) 0 @@ -593,15 +593,15 @@ CONTROL FLOW GRAPH (byte*~) $4 ← (word) 1024 + (byte~) $3 (byte*) cursor#0 ← (byte*~) $4 + (byte) x#0 to:@1 -@1: from @3 @BEGIN - (byte) x1#2 ← phi( @BEGIN/(byte) 39 ) - (byte) y#2 ← phi( @3/(byte) y#4 @BEGIN/(byte) y#0 ) - (byte) xd#1 ← phi( @BEGIN/(byte) xd#0 ) - (byte) yd#1 ← phi( @BEGIN/(byte) yd#0 ) - (byte) e#3 ← phi( @3/(byte) e#5 @BEGIN/(byte) e#0 ) - (byte) x#2 ← phi( @3/(byte) x#1 @BEGIN/(byte) x#0 ) - (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @BEGIN/(byte*) cursor#0 ) - (byte) STAR#1 ← phi( @BEGIN/(byte) 81 ) +@1: from @3 @begin + (byte) x1#2 ← phi( @begin/(byte) 39 ) + (byte) y#2 ← phi( @3/(byte) y#4 @begin/(byte) y#0 ) + (byte) xd#1 ← phi( @begin/(byte) xd#0 ) + (byte) yd#1 ← phi( @begin/(byte) yd#0 ) + (byte) e#3 ← phi( @3/(byte) e#5 @begin/(byte) e#0 ) + (byte) x#2 ← phi( @3/(byte) x#1 @begin/(byte) x#0 ) + (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @begin/(byte*) cursor#0 ) + (byte) STAR#1 ← phi( @begin/(byte) 81 ) *((byte*) cursor#3) ← (byte) STAR#1 (byte) x#1 ← (byte) x#2 + (byte) 1 (byte*) cursor#1 ← (byte*) cursor#3 + (byte) 1 @@ -621,14 +621,14 @@ CONTROL FLOW GRAPH (byte~) $13 ← (byte) x1#2 + (byte) 1 (boolean~) $14 ← (byte) x#1 < (byte~) $13 if((boolean~) $14) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Simple Condition (boolean~) $9 if((byte) xd#1<(byte) e#1) goto @2 Simple Condition (boolean~) $14 if((byte) x#1<(byte~) $13) goto @1 Succesful SSA optimization Pass2ConditionalJumpSimplification CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) xd#0 ← (byte) 39 - (byte) 0 (byte) yd#0 ← (byte) 24 - (byte) 0 (byte) x#0 ← (byte) 0 @@ -638,15 +638,15 @@ CONTROL FLOW GRAPH (byte*~) $4 ← (word) 1024 + (byte~) $3 (byte*) cursor#0 ← (byte*~) $4 + (byte) x#0 to:@1 -@1: from @3 @BEGIN - (byte) x1#2 ← phi( @BEGIN/(byte) 39 ) - (byte) y#2 ← phi( @3/(byte) y#4 @BEGIN/(byte) y#0 ) - (byte) xd#1 ← phi( @BEGIN/(byte) xd#0 ) - (byte) yd#1 ← phi( @BEGIN/(byte) yd#0 ) - (byte) e#3 ← phi( @3/(byte) e#5 @BEGIN/(byte) e#0 ) - (byte) x#2 ← phi( @3/(byte) x#1 @BEGIN/(byte) x#0 ) - (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @BEGIN/(byte*) cursor#0 ) - (byte) STAR#1 ← phi( @BEGIN/(byte) 81 ) +@1: from @3 @begin + (byte) x1#2 ← phi( @begin/(byte) 39 ) + (byte) y#2 ← phi( @3/(byte) y#4 @begin/(byte) y#0 ) + (byte) xd#1 ← phi( @begin/(byte) xd#0 ) + (byte) yd#1 ← phi( @begin/(byte) yd#0 ) + (byte) e#3 ← phi( @3/(byte) e#5 @begin/(byte) e#0 ) + (byte) x#2 ← phi( @3/(byte) x#1 @begin/(byte) x#0 ) + (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @begin/(byte*) cursor#0 ) + (byte) STAR#1 ← phi( @begin/(byte) 81 ) *((byte*) cursor#3) ← (byte) STAR#1 (byte) x#1 ← (byte) x#2 + (byte) 1 (byte*) cursor#1 ← (byte*) cursor#3 + (byte) 1 @@ -664,8 +664,8 @@ CONTROL FLOW GRAPH (byte*) cursor#5 ← phi( @1/(byte*) cursor#1 @2/(byte*) cursor#2 ) (byte~) $13 ← (byte) x1#2 + (byte) 1 if((byte) x#1<(byte~) $13) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Constant (byte) xd#0 (byte) 39 Constant (byte) yd#0 (byte) 24 @@ -675,19 +675,19 @@ Constant (byte) STAR#1 (byte) 81 Constant (byte) x1#2 (byte) 39 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) e#0 ← (byte) 24 / (byte) 2 (byte~) $3 ← (byte) 0 * (byte) 40 (byte*~) $4 ← (word) 1024 + (byte~) $3 (byte*) cursor#0 ← (byte*~) $4 + (byte) 0 to:@1 -@1: from @3 @BEGIN - (byte) y#2 ← phi( @3/(byte) y#4 @BEGIN/(byte) 0 ) - (byte) xd#1 ← phi( @BEGIN/(byte) 39 ) - (byte) yd#1 ← phi( @BEGIN/(byte) 24 ) - (byte) e#3 ← phi( @3/(byte) e#5 @BEGIN/(byte) e#0 ) - (byte) x#2 ← phi( @3/(byte) x#1 @BEGIN/(byte) 0 ) - (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @BEGIN/(byte*) cursor#0 ) +@1: from @3 @begin + (byte) y#2 ← phi( @3/(byte) y#4 @begin/(byte) 0 ) + (byte) xd#1 ← phi( @begin/(byte) 39 ) + (byte) yd#1 ← phi( @begin/(byte) 24 ) + (byte) e#3 ← phi( @3/(byte) e#5 @begin/(byte) e#0 ) + (byte) x#2 ← phi( @3/(byte) x#1 @begin/(byte) 0 ) + (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @begin/(byte*) cursor#0 ) *((byte*) cursor#3) ← (byte) 81 (byte) x#1 ← (byte) x#2 + (byte) 1 (byte*) cursor#1 ← (byte*) cursor#3 + (byte) 1 @@ -705,27 +705,27 @@ CONTROL FLOW GRAPH (byte*) cursor#5 ← phi( @1/(byte*) cursor#1 @2/(byte*) cursor#2 ) (byte~) $13 ← (byte) 39 + (byte) 1 if((byte) x#1<(byte~) $13) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Consolidated constant in assignment cursor#0 Multiple usages for variable. Not optimizing sub-constant (byte) y#2 Multiple usages for variable. Not optimizing sub-constant (byte*) cursor#1 Succesful SSA optimization Pass2ConstantAdditionElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) e#0 ← (byte) 24 / (byte) 2 (byte~) $3 ← (byte) 0 * (byte) 40 (byte*~) $4 ← (byte~) $3 (byte*) cursor#0 ← (byte*~) $4 + (word) 1024 to:@1 -@1: from @3 @BEGIN - (byte) y#2 ← phi( @3/(byte) y#4 @BEGIN/(byte) 0 ) - (byte) xd#1 ← phi( @BEGIN/(byte) 39 ) - (byte) yd#1 ← phi( @BEGIN/(byte) 24 ) - (byte) e#3 ← phi( @3/(byte) e#5 @BEGIN/(byte) e#0 ) - (byte) x#2 ← phi( @3/(byte) x#1 @BEGIN/(byte) 0 ) - (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @BEGIN/(byte*) cursor#0 ) +@1: from @3 @begin + (byte) y#2 ← phi( @3/(byte) y#4 @begin/(byte) 0 ) + (byte) xd#1 ← phi( @begin/(byte) 39 ) + (byte) yd#1 ← phi( @begin/(byte) 24 ) + (byte) e#3 ← phi( @3/(byte) e#5 @begin/(byte) e#0 ) + (byte) x#2 ← phi( @3/(byte) x#1 @begin/(byte) 0 ) + (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @begin/(byte*) cursor#0 ) *((byte*) cursor#3) ← (byte) 81 (byte) x#1 ← (byte) x#2 + (byte) 1 (byte*) cursor#1 ← (byte*) cursor#3 + (byte) 1 @@ -743,24 +743,24 @@ CONTROL FLOW GRAPH (byte*) cursor#5 ← phi( @1/(byte*) cursor#1 @2/(byte*) cursor#2 ) (byte~) $13 ← (byte) 39 + (byte) 1 if((byte) x#1<(byte~) $13) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Alias (byte~) $3 = (byte*~) $4 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) e#0 ← (byte) 24 / (byte) 2 (byte~) $3 ← (byte) 0 * (byte) 40 (byte*) cursor#0 ← (byte~) $3 + (word) 1024 to:@1 -@1: from @3 @BEGIN - (byte) y#2 ← phi( @3/(byte) y#4 @BEGIN/(byte) 0 ) - (byte) xd#1 ← phi( @BEGIN/(byte) 39 ) - (byte) yd#1 ← phi( @BEGIN/(byte) 24 ) - (byte) e#3 ← phi( @3/(byte) e#5 @BEGIN/(byte) e#0 ) - (byte) x#2 ← phi( @3/(byte) x#1 @BEGIN/(byte) 0 ) - (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @BEGIN/(byte*) cursor#0 ) +@1: from @3 @begin + (byte) y#2 ← phi( @3/(byte) y#4 @begin/(byte) 0 ) + (byte) xd#1 ← phi( @begin/(byte) 39 ) + (byte) yd#1 ← phi( @begin/(byte) 24 ) + (byte) e#3 ← phi( @3/(byte) e#5 @begin/(byte) e#0 ) + (byte) x#2 ← phi( @3/(byte) x#1 @begin/(byte) 0 ) + (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @begin/(byte*) cursor#0 ) *((byte*) cursor#3) ← (byte) 81 (byte) x#1 ← (byte) x#2 + (byte) 1 (byte*) cursor#1 ← (byte*) cursor#3 + (byte) 1 @@ -778,23 +778,23 @@ CONTROL FLOW GRAPH (byte*) cursor#5 ← phi( @1/(byte*) cursor#1 @2/(byte*) cursor#2 ) (byte~) $13 ← (byte) 39 + (byte) 1 if((byte) x#1<(byte~) $13) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Redundant Phi (byte) yd#1 (byte) 24 Redundant Phi (byte) xd#1 (byte) 39 Succesful SSA optimization Pass2RedundantPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) e#0 ← (byte) 24 / (byte) 2 (byte~) $3 ← (byte) 0 * (byte) 40 (byte*) cursor#0 ← (byte~) $3 + (word) 1024 to:@1 -@1: from @3 @BEGIN - (byte) y#2 ← phi( @3/(byte) y#4 @BEGIN/(byte) 0 ) - (byte) e#3 ← phi( @3/(byte) e#5 @BEGIN/(byte) e#0 ) - (byte) x#2 ← phi( @3/(byte) x#1 @BEGIN/(byte) 0 ) - (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @BEGIN/(byte*) cursor#0 ) +@1: from @3 @begin + (byte) y#2 ← phi( @3/(byte) y#4 @begin/(byte) 0 ) + (byte) e#3 ← phi( @3/(byte) e#5 @begin/(byte) e#0 ) + (byte) x#2 ← phi( @3/(byte) x#1 @begin/(byte) 0 ) + (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @begin/(byte*) cursor#0 ) *((byte*) cursor#3) ← (byte) 81 (byte) x#1 ← (byte) x#2 + (byte) 1 (byte*) cursor#1 ← (byte*) cursor#3 + (byte) 1 @@ -812,22 +812,22 @@ CONTROL FLOW GRAPH (byte*) cursor#5 ← phi( @1/(byte*) cursor#1 @2/(byte*) cursor#2 ) (byte~) $13 ← (byte) 39 + (byte) 1 if((byte) x#1<(byte~) $13) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Constant (byte) e#0 (byte) 12 Constant (byte~) $3 (byte) 0 Constant (byte~) $13 (byte) 40 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte*) cursor#0 ← (byte) 0 + (word) 1024 to:@1 -@1: from @3 @BEGIN - (byte) y#2 ← phi( @3/(byte) y#4 @BEGIN/(byte) 0 ) - (byte) e#3 ← phi( @3/(byte) e#5 @BEGIN/(byte) 12 ) - (byte) x#2 ← phi( @3/(byte) x#1 @BEGIN/(byte) 0 ) - (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @BEGIN/(byte*) cursor#0 ) +@1: from @3 @begin + (byte) y#2 ← phi( @3/(byte) y#4 @begin/(byte) 0 ) + (byte) e#3 ← phi( @3/(byte) e#5 @begin/(byte) 12 ) + (byte) x#2 ← phi( @3/(byte) x#1 @begin/(byte) 0 ) + (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @begin/(byte*) cursor#0 ) *((byte*) cursor#3) ← (byte) 81 (byte) x#1 ← (byte) x#2 + (byte) 1 (byte*) cursor#1 ← (byte*) cursor#3 + (byte) 1 @@ -844,21 +844,21 @@ CONTROL FLOW GRAPH (byte) e#5 ← phi( @1/(byte) e#1 @2/(byte) e#2 ) (byte*) cursor#5 ← phi( @1/(byte*) cursor#1 @2/(byte*) cursor#2 ) if((byte) x#1<(byte) 40) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Multiple usages for variable. Not optimizing sub-constant (byte) y#2 Multiple usages for variable. Not optimizing sub-constant (byte*) cursor#1 Constant (byte*) cursor#0 (word) 1024 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from to:@1 -@1: from @3 @BEGIN - (byte) y#2 ← phi( @3/(byte) y#4 @BEGIN/(byte) 0 ) - (byte) e#3 ← phi( @3/(byte) e#5 @BEGIN/(byte) 12 ) - (byte) x#2 ← phi( @3/(byte) x#1 @BEGIN/(byte) 0 ) - (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @BEGIN/(word) 1024 ) +@1: from @3 @begin + (byte) y#2 ← phi( @3/(byte) y#4 @begin/(byte) 0 ) + (byte) e#3 ← phi( @3/(byte) e#5 @begin/(byte) 12 ) + (byte) x#2 ← phi( @3/(byte) x#1 @begin/(byte) 0 ) + (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @begin/(word) 1024 ) *((byte*) cursor#3) ← (byte) 81 (byte) x#1 ← (byte) x#2 + (byte) 1 (byte*) cursor#1 ← (byte*) cursor#3 + (byte) 1 @@ -875,25 +875,25 @@ CONTROL FLOW GRAPH (byte) e#5 ← phi( @1/(byte) e#1 @2/(byte) e#2 ) (byte*) cursor#5 ← phi( @1/(byte*) cursor#1 @2/(byte*) cursor#2 ) if((byte) x#1<(byte) 40) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Multiple usages for variable. Not optimizing sub-constant (byte) y#2 Multiple usages for variable. Not optimizing sub-constant (byte*) cursor#1 Multiple usages for variable. Not optimizing sub-constant (byte) y#2 Multiple usages for variable. Not optimizing sub-constant (byte*) cursor#1 -Block Sequence Planned @BEGIN @1 @3 @END @2 +Block Sequence Planned @begin @1 @3 @end @2 Added new block during phi lifting @7(between @3 and @1) Added new block during phi lifting @8(between @1 and @3) -Block Sequence Planned @BEGIN @1 @8 @3 @END @7 @2 +Block Sequence Planned @begin @1 @8 @3 @end @7 @2 CONTROL FLOW GRAPH - PHI LIFTED -@BEGIN: from +@begin: from to:@1 -@1: from @7 @BEGIN - (byte) y#2 ← phi( @7/(byte~) y#5 @BEGIN/(byte) 0 ) - (byte) e#3 ← phi( @7/(byte~) e#6 @BEGIN/(byte) 12 ) - (byte) x#2 ← phi( @7/(byte~) x#5 @BEGIN/(byte) 0 ) - (byte*) cursor#3 ← phi( @7/(byte*~) cursor#6 @BEGIN/(word) 1024 ) +@1: from @7 @begin + (byte) y#2 ← phi( @7/(byte~) y#5 @begin/(byte) 0 ) + (byte) e#3 ← phi( @7/(byte~) e#6 @begin/(byte) 12 ) + (byte) x#2 ← phi( @7/(byte~) x#5 @begin/(byte) 0 ) + (byte*) cursor#3 ← phi( @7/(byte*~) cursor#6 @begin/(word) 1024 ) *((byte*) cursor#3) ← (byte) 81 (byte) x#1 ← (byte) x#2 + (byte) 1 (byte*) cursor#1 ← (byte*) cursor#3 + (byte) 1 @@ -910,8 +910,8 @@ CONTROL FLOW GRAPH - PHI LIFTED (byte) e#5 ← phi( @8/(byte~) e#7 @2/(byte~) e#8 ) (byte*) cursor#5 ← phi( @8/(byte*~) cursor#7 @2/(byte*~) cursor#8 ) if((byte) x#1<(byte) 40) goto @7 - to:@END -@END: from @3 + to:@end +@end: from @3 @7: from @3 (byte*~) cursor#6 ← (byte*) cursor#5 (byte~) x#5 ← (byte) x#1 @@ -936,13 +936,13 @@ Propagating live ranges... Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES -@BEGIN: from +@begin: from to:@1 -@1: from @7 @BEGIN - [0] (byte) y#2 ← phi( @7/(byte~) y#5 @BEGIN/(byte) 0 ) [ cursor#3 x#2 e#3 y#2 ] - [0] (byte) e#3 ← phi( @7/(byte~) e#6 @BEGIN/(byte) 12 ) [ cursor#3 x#2 e#3 y#2 ] - [0] (byte) x#2 ← phi( @7/(byte~) x#5 @BEGIN/(byte) 0 ) [ cursor#3 x#2 e#3 y#2 ] - [0] (byte*) cursor#3 ← phi( @7/(byte*~) cursor#6 @BEGIN/(word) 1024 ) [ cursor#3 x#2 e#3 y#2 ] +@1: from @7 @begin + [0] (byte) y#2 ← phi( @7/(byte~) y#5 @begin/(byte) 0 ) [ cursor#3 x#2 e#3 y#2 ] + [0] (byte) e#3 ← phi( @7/(byte~) e#6 @begin/(byte) 12 ) [ cursor#3 x#2 e#3 y#2 ] + [0] (byte) x#2 ← phi( @7/(byte~) x#5 @begin/(byte) 0 ) [ cursor#3 x#2 e#3 y#2 ] + [0] (byte*) cursor#3 ← phi( @7/(byte*~) cursor#6 @begin/(word) 1024 ) [ cursor#3 x#2 e#3 y#2 ] [1] *((byte*) cursor#3) ← (byte) 81 [ cursor#3 x#2 e#3 y#2 ] [2] (byte) x#1 ← (byte) x#2 + (byte) 1 [ cursor#3 e#3 y#2 x#1 ] [3] (byte*) cursor#1 ← (byte*) cursor#3 + (byte) 1 [ e#3 cursor#1 y#2 x#1 ] @@ -959,8 +959,8 @@ CONTROL FLOW GRAPH - LIVE RANGES [9] (byte) e#5 ← phi( @8/(byte~) e#7 @2/(byte~) e#8 ) [ x#1 cursor#5 e#5 y#4 ] [9] (byte*) cursor#5 ← phi( @8/(byte*~) cursor#7 @2/(byte*~) cursor#8 ) [ x#1 cursor#5 e#5 y#4 ] [10] if((byte) x#1<(byte) 40) goto @7 [ x#1 cursor#5 e#5 y#4 ] - to:@END -@END: from @3 + to:@end +@end: from @3 @7: from @3 [11] (byte*~) cursor#6 ← (byte*) cursor#5 [ cursor#6 x#1 e#5 y#4 ] [12] (byte~) x#5 ← (byte) x#1 [ cursor#6 x#5 e#5 y#4 ] @@ -990,7 +990,7 @@ Coalesced [20] y#7 ← y#1 Coalesced down to 4 phi equivalence classes Culled Empty Block (label) @8 Culled Empty Block (label) @7 -Block Sequence Planned @BEGIN @1 @3 @END @2 +Block Sequence Planned @begin @1 @3 @end @2 Propagating live ranges... Propagating live ranges... Propagating live ranges... @@ -998,13 +998,13 @@ Propagating live ranges... Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED -@BEGIN: from +@begin: from to:@1 -@1: from @3 @BEGIN - [0] (byte) y#2 ← phi( @3/(byte) y#4 @BEGIN/(byte) 0 ) [ cursor#3 x#2 e#3 y#2 ] - [0] (byte) e#3 ← phi( @3/(byte) e#5 @BEGIN/(byte) 12 ) [ cursor#3 x#2 e#3 y#2 ] - [0] (byte) x#2 ← phi( @3/(byte) x#1 @BEGIN/(byte) 0 ) [ cursor#3 x#2 e#3 y#2 ] - [0] (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @BEGIN/(word) 1024 ) [ cursor#3 x#2 e#3 y#2 ] +@1: from @3 @begin + [0] (byte) y#2 ← phi( @3/(byte) y#4 @begin/(byte) 0 ) [ cursor#3 x#2 e#3 y#2 ] + [0] (byte) e#3 ← phi( @3/(byte) e#5 @begin/(byte) 12 ) [ cursor#3 x#2 e#3 y#2 ] + [0] (byte) x#2 ← phi( @3/(byte) x#1 @begin/(byte) 0 ) [ cursor#3 x#2 e#3 y#2 ] + [0] (byte*) cursor#3 ← phi( @3/(byte*) cursor#5 @begin/(word) 1024 ) [ cursor#3 x#2 e#3 y#2 ] [1] *((byte*) cursor#3) ← (byte) 81 [ cursor#3 x#2 e#3 y#2 ] [2] (byte) x#1 ← (byte) x#2 + (byte) 1 [ x#1 cursor#3 e#3 y#2 ] [3] (byte*) cursor#1 ← (byte*) cursor#3 + (byte) 1 [ x#1 e#3 cursor#1 y#2 ] @@ -1016,8 +1016,8 @@ CONTROL FLOW GRAPH - PHI MEM COALESCED [6] (byte) e#5 ← phi( @1/(byte) e#1 @2/(byte) e#2 ) [ cursor#5 x#1 e#5 y#4 ] [6] (byte*) cursor#5 ← phi( @1/(byte*) cursor#1 @2/(byte*) cursor#2 ) [ cursor#5 x#1 e#5 y#4 ] [7] if((byte) x#1<(byte) 40) goto @1 [ cursor#5 x#1 e#5 y#4 ] - to:@END -@END: from @3 + to:@end +@end: from @3 @2: from @1 [8] (byte) y#1 ← (byte) y#2 + (byte) 1 [ x#1 e#1 cursor#1 y#1 ] [9] (byte*) cursor#2 ← (byte*) cursor#1 + (byte) 40 [ x#1 e#1 cursor#2 y#1 ] @@ -1027,11 +1027,11 @@ CONTROL FLOW GRAPH - PHI MEM COALESCED CALL GRAPH DOMINATORS -@BEGIN dominated by @BEGIN -@1 dominated by @1 @BEGIN -@3 dominated by @1 @BEGIN @3 -@END dominated by @1 @BEGIN @3 @END -@2 dominated by @1 @BEGIN @2 +@begin dominated by @begin +@1 dominated by @1 @begin +@3 dominated by @1 @3 @begin +@end dominated by @1 @3 @end @begin +@2 dominated by @1 @2 @begin Found back edge: Loop head: @1 tails: @3 blocks: null Populated: Loop head: @1 tails: @3 blocks: @3 @1 @2 @@ -1086,10 +1086,10 @@ Allocated zp byte:4 to zp byte:4 [ x#2 x#1 ] Allocated zp byte:5 to zp byte:5 [ e#3 e#5 e#1 e#2 ] Allocated zp byte:6 to zp byte:6 [ y#2 y#4 y#1 ] INITIAL ASM -//SEG0 @BEGIN -BBEGIN: -//SEG1 [0] phi from @BEGIN to @1 -B1_from_BBEGIN: +//SEG0 @begin +bbegin: +//SEG1 [0] phi from @begin to @1 +b1_from_bbegin: //SEG2 [0] phi (byte) y#2 = (byte) 0 -- zpby1=coby1 lda #$0 sta $6 @@ -1104,16 +1104,16 @@ B1_from_BBEGIN: sta $2 lda #>$400 sta $2+$1 - jmp B1 + jmp b1 //SEG6 [0] phi from @3 to @1 -B1_from_B3: +b1_from_b3: //SEG7 [0] phi (byte) y#2 = (byte) y#4 -- register_copy //SEG8 [0] phi (byte) e#3 = (byte) e#5 -- register_copy //SEG9 [0] phi (byte) x#2 = (byte) x#1 -- register_copy //SEG10 [0] phi (byte*) cursor#3 = (byte*) cursor#5 -- register_copy - jmp B1 + jmp b1 //SEG11 @1 -B1: +b1: //SEG12 [1] *((byte*) cursor#3) ← (byte) 81 [ cursor#3 x#2 e#3 y#2 ] -- _star_zpptrby1=coby1 ldy #$0 lda #$51 @@ -1133,24 +1133,24 @@ B1: //SEG16 [5] if((byte) 39<(byte) e#1) goto @2 [ x#1 e#1 cursor#1 y#2 ] -- coby1_lt_zpby1_then_la1 lda #$27 cmp $5 - bcc B2 + bcc b2 //SEG17 [6] phi from @1 to @3 -B3_from_B1: +b3_from_b1: //SEG18 [6] phi (byte) y#4 = (byte) y#2 -- register_copy //SEG19 [6] phi (byte) e#5 = (byte) e#1 -- register_copy //SEG20 [6] phi (byte*) cursor#5 = (byte*) cursor#1 -- register_copy - jmp B3 + jmp b3 //SEG21 @3 -B3: +b3: //SEG22 [7] if((byte) x#1<(byte) 40) goto @1 [ cursor#5 x#1 e#5 y#4 ] -- zpby1_lt_coby1_then_la1 lda $4 cmp #$28 - bcc B1_from_B3 - jmp BEND -//SEG23 @END -BEND: + bcc b1_from_b3 + jmp bend +//SEG23 @end +bend: //SEG24 @2 -B2: +b2: //SEG25 [8] (byte) y#1 ← (byte) y#2 + (byte) 1 [ x#1 e#1 cursor#1 y#1 ] -- zpby1=zpby1_plus_1 inc $6 //SEG26 [9] (byte*) cursor#2 ← (byte*) cursor#1 + (byte) 40 [ x#1 e#1 cursor#2 y#1 ] -- zpptrby1=zpptrby1_plus_coby1 @@ -1167,11 +1167,11 @@ B2: sbc #$27 sta $5 //SEG28 [6] phi from @2 to @3 -B3_from_B2: +b3_from_b2: //SEG29 [6] phi (byte) y#4 = (byte) y#1 -- register_copy //SEG30 [6] phi (byte) e#5 = (byte) e#2 -- register_copy //SEG31 [6] phi (byte*) cursor#5 = (byte*) cursor#2 -- register_copy - jmp B3 + jmp b3 Statement [1] *((byte*) cursor#3) ← (byte) 81 [ cursor#3 x#2 e#3 y#2 ] always clobbers reg byte a reg byte y Removing always clobbered register reg byte a as potential for zp byte:4 [ x#2 x#1 ] @@ -1198,15 +1198,15 @@ Uplift Scope [] 55: zp byte:5 [ e#3 e#5 e#1 e#2 ] 46.75: zp ptr byte:2 [ cursor# Uplifting [] best 1180 combination reg byte x [ e#3 e#5 e#1 e#2 ] zp ptr byte:2 [ cursor#3 cursor#5 cursor#1 cursor#2 ] zp byte:6 [ y#2 y#4 y#1 ] zp byte:4 [ x#2 x#1 ] Re-allocated ZP register from zp byte:6 to zp byte:5 -Removing instruction jmp B1 -Removing instruction jmp B3 -Removing instruction jmp BEND +Removing instruction jmp b1 +Removing instruction jmp b3 +Removing instruction jmp bend Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: -//SEG1 [0] phi from @BEGIN to @1 -B1_from_BBEGIN: +//SEG0 @begin +bbegin: +//SEG1 [0] phi from @begin to @1 +b1_from_bbegin: //SEG2 [0] phi (byte) y#2 = (byte) 0 -- zpby1=coby1 lda #$0 sta $5 @@ -1220,15 +1220,15 @@ B1_from_BBEGIN: sta $2 lda #>$400 sta $2+$1 - jmp B1 + jmp b1 //SEG6 [0] phi from @3 to @1 -B1_from_B3: +b1_from_b3: //SEG7 [0] phi (byte) y#2 = (byte) y#4 -- register_copy //SEG8 [0] phi (byte) e#3 = (byte) e#5 -- register_copy //SEG9 [0] phi (byte) x#2 = (byte) x#1 -- register_copy //SEG10 [0] phi (byte*) cursor#3 = (byte*) cursor#5 -- register_copy //SEG11 @1 -B1: +b1: //SEG12 [1] *((byte*) cursor#3) ← (byte) 81 [ cursor#3 x#2 e#3 y#2 ] -- _star_zpptrby1=coby1 ldy #$0 lda #$51 @@ -1247,22 +1247,22 @@ B1: tax //SEG16 [5] if((byte) 39<(byte) e#1) goto @2 [ x#1 e#1 cursor#1 y#2 ] -- coby1_lt_xby_then_la1 cpx #$27 - bcs B2 + bcs b2 //SEG17 [6] phi from @1 to @3 -B3_from_B1: +b3_from_b1: //SEG18 [6] phi (byte) y#4 = (byte) y#2 -- register_copy //SEG19 [6] phi (byte) e#5 = (byte) e#1 -- register_copy //SEG20 [6] phi (byte*) cursor#5 = (byte*) cursor#1 -- register_copy //SEG21 @3 -B3: +b3: //SEG22 [7] if((byte) x#1<(byte) 40) goto @1 [ cursor#5 x#1 e#5 y#4 ] -- zpby1_lt_coby1_then_la1 lda $4 cmp #$28 - bcc B1_from_B3 -//SEG23 @END -BEND: + bcc b1_from_b3 +//SEG23 @end +bend: //SEG24 @2 -B2: +b2: //SEG25 [8] (byte) y#1 ← (byte) y#2 + (byte) 1 [ x#1 e#1 cursor#1 y#1 ] -- zpby1=zpby1_plus_1 inc $5 //SEG26 [9] (byte*) cursor#2 ← (byte*) cursor#1 + (byte) 40 [ x#1 e#1 cursor#2 y#1 ] -- zpptrby1=zpptrby1_plus_coby1 @@ -1279,19 +1279,19 @@ B2: sbc #$27 tax //SEG28 [6] phi from @2 to @3 -B3_from_B2: +b3_from_b2: //SEG29 [6] phi (byte) y#4 = (byte) y#1 -- register_copy //SEG30 [6] phi (byte) e#5 = (byte) e#2 -- register_copy //SEG31 [6] phi (byte*) cursor#5 = (byte*) cursor#2 -- register_copy - jmp B3 + jmp b3 -Removing instruction jmp B1 +Removing instruction jmp b1 Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: -//SEG1 [0] phi from @BEGIN to @1 -B1_from_BBEGIN: +//SEG0 @begin +bbegin: +//SEG1 [0] phi from @begin to @1 +b1_from_bbegin: //SEG2 [0] phi (byte) y#2 = (byte) 0 -- zpby1=coby1 lda #$0 sta $5 @@ -1306,13 +1306,13 @@ B1_from_BBEGIN: lda #>$400 sta $2+$1 //SEG6 [0] phi from @3 to @1 -B1_from_B3: +b1_from_b3: //SEG7 [0] phi (byte) y#2 = (byte) y#4 -- register_copy //SEG8 [0] phi (byte) e#3 = (byte) e#5 -- register_copy //SEG9 [0] phi (byte) x#2 = (byte) x#1 -- register_copy //SEG10 [0] phi (byte*) cursor#3 = (byte*) cursor#5 -- register_copy //SEG11 @1 -B1: +b1: //SEG12 [1] *((byte*) cursor#3) ← (byte) 81 [ cursor#3 x#2 e#3 y#2 ] -- _star_zpptrby1=coby1 ldy #$0 lda #$51 @@ -1331,22 +1331,22 @@ B1: tax //SEG16 [5] if((byte) 39<(byte) e#1) goto @2 [ x#1 e#1 cursor#1 y#2 ] -- coby1_lt_xby_then_la1 cpx #$27 - bcs B2 + bcs b2 //SEG17 [6] phi from @1 to @3 -B3_from_B1: +b3_from_b1: //SEG18 [6] phi (byte) y#4 = (byte) y#2 -- register_copy //SEG19 [6] phi (byte) e#5 = (byte) e#1 -- register_copy //SEG20 [6] phi (byte*) cursor#5 = (byte*) cursor#1 -- register_copy //SEG21 @3 -B3: +b3: //SEG22 [7] if((byte) x#1<(byte) 40) goto @1 [ cursor#5 x#1 e#5 y#4 ] -- zpby1_lt_coby1_then_la1 lda $4 cmp #$28 - bcc B1_from_B3 -//SEG23 @END -BEND: + bcc b1_from_b3 +//SEG23 @end +bend: //SEG24 @2 -B2: +b2: //SEG25 [8] (byte) y#1 ← (byte) y#2 + (byte) 1 [ x#1 e#1 cursor#1 y#1 ] -- zpby1=zpby1_plus_1 inc $5 //SEG26 [9] (byte*) cursor#2 ← (byte*) cursor#1 + (byte) 40 [ x#1 e#1 cursor#2 y#1 ] -- zpptrby1=zpptrby1_plus_coby1 @@ -1363,18 +1363,18 @@ B2: sbc #$27 tax //SEG28 [6] phi from @2 to @3 -B3_from_B2: +b3_from_b2: //SEG29 [6] phi (byte) y#4 = (byte) y#1 -- register_copy //SEG30 [6] phi (byte) e#5 = (byte) e#2 -- register_copy //SEG31 [6] phi (byte*) cursor#5 = (byte*) cursor#2 -- register_copy - jmp B3 + jmp b3 FINAL SYMBOL TABLE (label) @1 (label) @2 (label) @3 -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte[1000]) SCREEN (byte) STAR (byte*) cursor @@ -1407,10 +1407,10 @@ reg byte x [ e#3 e#5 e#1 e#2 ] zp byte:5 [ y#2 y#4 y#1 ] FINAL CODE -//SEG0 @BEGIN -BBEGIN: -//SEG1 [0] phi from @BEGIN to @1 -B1_from_BBEGIN: +//SEG0 @begin +bbegin: +//SEG1 [0] phi from @begin to @1 +b1_from_bbegin: //SEG2 [0] phi (byte) y#2 = (byte) 0 -- zpby1=coby1 lda #$0 sta $5 @@ -1425,13 +1425,13 @@ B1_from_BBEGIN: lda #>$400 sta $2+$1 //SEG6 [0] phi from @3 to @1 -B1_from_B3: +b1_from_b3: //SEG7 [0] phi (byte) y#2 = (byte) y#4 -- register_copy //SEG8 [0] phi (byte) e#3 = (byte) e#5 -- register_copy //SEG9 [0] phi (byte) x#2 = (byte) x#1 -- register_copy //SEG10 [0] phi (byte*) cursor#3 = (byte*) cursor#5 -- register_copy //SEG11 @1 -B1: +b1: //SEG12 [1] *((byte*) cursor#3) ← (byte) 81 [ cursor#3 x#2 e#3 y#2 ] -- _star_zpptrby1=coby1 ldy #$0 lda #$51 @@ -1450,22 +1450,22 @@ B1: tax //SEG16 [5] if((byte) 39<(byte) e#1) goto @2 [ x#1 e#1 cursor#1 y#2 ] -- coby1_lt_xby_then_la1 cpx #$27 - bcs B2 + bcs b2 //SEG17 [6] phi from @1 to @3 -B3_from_B1: +b3_from_b1: //SEG18 [6] phi (byte) y#4 = (byte) y#2 -- register_copy //SEG19 [6] phi (byte) e#5 = (byte) e#1 -- register_copy //SEG20 [6] phi (byte*) cursor#5 = (byte*) cursor#1 -- register_copy //SEG21 @3 -B3: +b3: //SEG22 [7] if((byte) x#1<(byte) 40) goto @1 [ cursor#5 x#1 e#5 y#4 ] -- zpby1_lt_coby1_then_la1 lda $4 cmp #$28 - bcc B1_from_B3 -//SEG23 @END -BEND: + bcc b1_from_b3 +//SEG23 @end +bend: //SEG24 @2 -B2: +b2: //SEG25 [8] (byte) y#1 ← (byte) y#2 + (byte) 1 [ x#1 e#1 cursor#1 y#1 ] -- zpby1=zpby1_plus_1 inc $5 //SEG26 [9] (byte*) cursor#2 ← (byte*) cursor#1 + (byte) 40 [ x#1 e#1 cursor#2 y#1 ] -- zpptrby1=zpptrby1_plus_coby1 @@ -1482,9 +1482,9 @@ B2: sbc #$27 tax //SEG28 [6] phi from @2 to @3 -B3_from_B2: +b3_from_b2: //SEG29 [6] phi (byte) y#4 = (byte) y#1 -- register_copy //SEG30 [6] phi (byte) e#5 = (byte) e#2 -- register_copy //SEG31 [6] phi (byte*) cursor#5 = (byte*) cursor#2 -- register_copy - jmp B3 + jmp b3 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/bresenham.sym b/src/main/java/dk/camelot64/kickc/test/ref/bresenham.sym index b5f5b07ad..d64ba7378 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/bresenham.sym +++ b/src/main/java/dk/camelot64/kickc/test/ref/bresenham.sym @@ -1,8 +1,8 @@ (label) @1 (label) @2 (label) @3 -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte[1000]) SCREEN (byte) STAR (byte*) cursor diff --git a/src/main/java/dk/camelot64/kickc/test/ref/fibmem.asm b/src/main/java/dk/camelot64/kickc/test/ref/fibmem.asm index f16dc0a71..26a3bb87d 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/fibmem.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/fibmem.asm @@ -1,21 +1,22 @@ -BBEGIN: +bbegin: jsr main -BEND: -main: - lda #$0 - sta $1100 - lda #$1 - sta $1101 -main__B1_from_main: - ldx #$0 -main__B1_from_B1: -main__B1: - lda $1100,x - clc - adc $1101,x - sta $1102,x - inx - cpx #$f - bcc main__B1_from_B1 -main__Breturn: - rts +bend: +main: { + lda #$0 + sta $1100 + lda #$1 + sta $1101 + b1_from_main: + ldx #$0 + b1_from_b1: + b1: + lda $1100,x + clc + adc $1101,x + sta $1102,x + inx + cpx #$f + bcc b1_from_b1 + breturn: + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/fibmem.cfg b/src/main/java/dk/camelot64/kickc/test/ref/fibmem.cfg index f6dd4edec..8d6a68e2a 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/fibmem.cfg +++ b/src/main/java/dk/camelot64/kickc/test/ref/fibmem.cfg @@ -1,8 +1,8 @@ -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] *((word) 4352) ← (byte) 0 [ ] [2] *((word) 4353) ← (byte) 1 [ ] to:main::@1 @@ -17,4 +17,4 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 [10] return [ ] - to:@RETURN + to:@return diff --git a/src/main/java/dk/camelot64/kickc/test/ref/fibmem.log b/src/main/java/dk/camelot64/kickc/test/ref/fibmem.log index 9c61d9a53..7671a36af 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/fibmem.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/fibmem.log @@ -47,7 +47,7 @@ SYMBOLS (byte) main::i INITIAL CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte[15]) fibs ← (word) 4352 (void~) $0 ← call main to:@1 @@ -71,18 +71,18 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 return - to:@RETURN -@1: from @BEGIN - to:@END -@END: from @1 + to:@return +@1: from @begin + to:@end +@end: from @1 Removing empty block main::@2 Removing empty block @1 CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte[15]) fibs ← (word) 4352 (void~) $0 ← call main - to:@END + to:@end main: from *((byte[15]) fibs + (byte) 0) ← (byte) 0 *((byte[15]) fibs + (byte) 1) ← (byte) 1 @@ -101,19 +101,19 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin PROCEDURE MODIFY VARIABLE ANALYSIS CONTROL FLOW GRAPH WITH ASSIGNMENT CALL -@BEGIN: from +@begin: from (byte[15]) fibs ← (word) 4352 call main param-assignment to:@2 -@2: from @BEGIN - to:@END -main: from @BEGIN +@2: from @begin + to:@end +main: from @begin *((byte[15]) fibs + (byte) 0) ← (byte) 0 *((byte[15]) fibs + (byte) 1) ← (byte) 1 (byte) main::i ← (byte) 0 @@ -131,19 +131,19 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 return - to:@RETURN -@END: from @2 + to:@return +@end: from @2 Completing Phi functions... CONTROL FLOW GRAPH SSA -@BEGIN: from +@begin: from (byte[15]) fibs#0 ← (word) 4352 call main param-assignment to:@2 -@2: from @BEGIN - to:@END -main: from @BEGIN - (byte[15]) fibs#1 ← phi( @BEGIN/(byte[15]) fibs#0 ) +@2: from @begin + to:@end +main: from @begin + (byte[15]) fibs#1 ← phi( @begin/(byte[15]) fibs#0 ) *((byte[15]) fibs#1 + (byte) 0) ← (byte) 0 *((byte[15]) fibs#1 + (byte) 1) ← (byte) 1 (byte) main::i#0 ← (byte) 0 @@ -163,18 +163,18 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 return - to:@RETURN -@END: from @2 + to:@return +@end: from @2 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN -@BEGIN: from +@begin: from (byte[15]) fibs#0 ← (word) 4352 call main param-assignment to:@2 -@2: from @BEGIN - to:@END -main: from @BEGIN - (byte[15]) fibs#1 ← phi( @BEGIN/(byte[15]) fibs#0 ) +@2: from @begin + to:@end +main: from @begin + (byte[15]) fibs#1 ← phi( @begin/(byte[15]) fibs#0 ) *((byte[15]) fibs#1 + (byte) 0) ← (byte) 0 *((byte[15]) fibs#1 + (byte) 1) ← (byte) 1 (byte) main::i#0 ← (byte) 0 @@ -194,18 +194,18 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 return - to:@RETURN -@END: from @2 + to:@return +@end: from @2 Culled Empty Block (label) @2 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte[15]) fibs#0 ← (word) 4352 call main param-assignment - to:@END -main: from @BEGIN - (byte[15]) fibs#1 ← phi( @BEGIN/(byte[15]) fibs#0 ) + to:@end +main: from @begin + (byte[15]) fibs#1 ← phi( @begin/(byte[15]) fibs#0 ) *((byte[15]) fibs#1 + (byte) 0) ← (byte) 0 *((byte[15]) fibs#1 + (byte) 1) ← (byte) 1 (byte) main::i#0 ← (byte) 0 @@ -225,18 +225,18 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte[15]) fibs#0 (word) 4352 Constant (byte) main::i#0 (byte) 0 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN - (byte[15]) fibs#1 ← phi( @BEGIN/(word) 4352 ) + to:@end +main: from @begin + (byte[15]) fibs#1 ← phi( @begin/(word) 4352 ) *((byte[15]) fibs#1 + (byte) 0) ← (byte) 0 *((byte[15]) fibs#1 + (byte) 1) ← (byte) 1 to:main::@1 @@ -255,18 +255,18 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2 Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2 Redundant Phi (byte[15]) fibs#1 (word) 4352 Succesful SSA optimization Pass2RedundantPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin *((word) 4352 + (byte) 0) ← (byte) 0 *((word) 4352 + (byte) 1) ← (byte) 1 to:main::@1 @@ -285,16 +285,16 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Self Phi Eliminated (byte[15]) fibs#2 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin *((word) 4352 + (byte) 0) ← (byte) 0 *((word) 4352 + (byte) 1) ← (byte) 1 to:main::@1 @@ -313,16 +313,16 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Simple Condition (boolean~) main::$5 if((byte) main::i#1<(byte) 15) goto main::@1 Succesful SSA optimization Pass2ConditionalJumpSimplification CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin *((word) 4352 + (byte) 0) ← (byte) 0 *((word) 4352 + (byte) 1) ← (byte) 1 to:main::@1 @@ -340,16 +340,16 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte[15]) fibs#2 (word) 4352 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin *((word) 4352 + (byte) 0) ← (byte) 0 *((word) 4352 + (byte) 1) ← (byte) 1 to:main::@1 @@ -366,8 +366,8 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Consolidated assigned array index constant in assignment *(4352) Consolidated assigned array index constant in assignment *(4353) @@ -378,10 +378,10 @@ Consolidated referenced array index constant in assignment main::$3 Consolidated assigned array index constant in assignment *(4354 + main::$0) Succesful SSA optimization Pass2ConstantAdditionElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin *((word) 4352) ← (byte) 0 *((word) 4353) ← (byte) 1 to:main::@1 @@ -398,16 +398,16 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Alias (byte) main::i#2 = (byte~) main::$0 (byte~) main::$2 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin *((word) 4352) ← (byte) 0 *((word) 4353) ← (byte) 1 to:main::@1 @@ -422,21 +422,21 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2 Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2 Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2 -Block Sequence Planned @BEGIN @END main main::@1 main::@return +Block Sequence Planned @begin @end main main::@1 main::@return Added new block during phi lifting main::@3(between main::@1 and main::@1) -Block Sequence Planned @BEGIN @END main main::@1 main::@return main::@3 +Block Sequence Planned @begin @end main main::@1 main::@return main::@3 CONTROL FLOW GRAPH - PHI LIFTED -@BEGIN: from +@begin: from call main param-assignment - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin *((word) 4352) ← (byte) 0 *((word) 4353) ← (byte) 1 to:main::@1 @@ -451,7 +451,7 @@ main::@1: from main main::@3 to:main::@return main::@return: from main::@1 return - to:@RETURN + to:@return main::@3: from main::@1 (byte~) main::i#3 ← (byte) main::i#1 to:main::@1 @@ -459,11 +459,11 @@ main::@3: from main::@1 Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] *((word) 4352) ← (byte) 0 [ ] [2] *((word) 4353) ← (byte) 1 [ ] to:main::@1 @@ -478,7 +478,7 @@ main::@1: from main main::@3 to:main::@return main::@return: from main::@1 [10] return [ ] - to:@RETURN + to:@return main::@3: from main::@1 [11] (byte~) main::i#3 ← (byte) main::i#1 [ main::i#3 ] to:main::@1 @@ -487,15 +487,15 @@ Created 1 initial phi equivalence classes Coalesced [11] main::i#3 ← main::i#1 Coalesced down to 1 phi equivalence classes Culled Empty Block (label) main::@3 -Block Sequence Planned @BEGIN @END main main::@1 main::@return +Block Sequence Planned @begin @end main main::@1 main::@return Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] *((word) 4352) ← (byte) 0 [ ] [2] *((word) 4353) ← (byte) 1 [ ] to:main::@1 @@ -510,17 +510,17 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 [10] return [ ] - to:@RETURN + to:@return CALL GRAPH Calls in [] to 0:main DOMINATORS -@BEGIN dominated by @BEGIN -@END dominated by @BEGIN @END -main dominated by @BEGIN main -main::@1 dominated by @BEGIN main::@1 main -main::@return dominated by @BEGIN main::@return main::@1 main +@begin dominated by @begin +@end dominated by @end @begin +main dominated by @begin main +main::@1 dominated by @begin main::@1 main +main::@return dominated by main::@return @begin main::@1 main Found back edge: Loop head: main::@1 tails: main::@1 blocks: null Populated: Loop head: main::@1 tails: main::@1 blocks: main::@1 @@ -559,61 +559,62 @@ Allocated zp byte:3 to zp byte:3 [ main::$1 ] Allocated zp byte:4 to zp byte:4 [ main::$3 ] Allocated zp byte:5 to zp byte:5 [ main::$4 ] INITIAL ASM -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main - jmp BEND -//SEG2 @END -BEND: + jmp bend +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2 - lda #$0 - sta $1100 -//SEG5 [2] *((word) 4353) ← (byte) 1 [ ] -- _star_cowo1=coby2 - lda #$1 - sta $1101 -//SEG6 [3] phi from main to main::@1 -main__B1_from_main: -//SEG7 [3] phi (byte) main::i#2 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $2 - jmp main__B1 -//SEG8 [3] phi from main::@1 to main::@1 -main__B1_from_B1: -//SEG9 [3] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy - jmp main__B1 -//SEG10 main::@1 -main__B1: -//SEG11 [4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- zpby1=cowo1_staridx_zpby2 - ldx $2 - lda $1100,x - sta $3 -//SEG12 [5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ] -- zpby1=cowo1_staridx_zpby2 - ldx $2 - lda $1101,x - sta $4 -//SEG13 [6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] -- zpby1=zpby2_plus_zpby3 - lda $3 - clc - adc $4 - sta $5 -//SEG14 [7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_zpby1=zpby2 - lda $5 - ldx $2 - sta $1102,x -//SEG15 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- zpby1=_inc_zpby1 - inc $2 -//SEG16 [9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ] -- zpby1_lt_coby1_then_la1 - lda $2 - cmp #$f - bcc main__B1_from_B1 - jmp main__Breturn -//SEG17 main::@return -main__Breturn: -//SEG18 [10] return [ ] - rts +main: { + //SEG4 [1] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2 + lda #$0 + sta $1100 + //SEG5 [2] *((word) 4353) ← (byte) 1 [ ] -- _star_cowo1=coby2 + lda #$1 + sta $1101 + //SEG6 [3] phi from main to main::@1 + b1_from_main: + //SEG7 [3] phi (byte) main::i#2 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $2 + jmp b1 + //SEG8 [3] phi from main::@1 to main::@1 + b1_from_b1: + //SEG9 [3] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy + jmp b1 + //SEG10 main::@1 + b1: + //SEG11 [4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- zpby1=cowo1_staridx_zpby2 + ldx $2 + lda $1100,x + sta $3 + //SEG12 [5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ] -- zpby1=cowo1_staridx_zpby2 + ldx $2 + lda $1101,x + sta $4 + //SEG13 [6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] -- zpby1=zpby2_plus_zpby3 + lda $3 + clc + adc $4 + sta $5 + //SEG14 [7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_zpby1=zpby2 + lda $5 + ldx $2 + sta $1102,x + //SEG15 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- zpby1=_inc_zpby1 + inc $2 + //SEG16 [9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ] -- zpby1_lt_coby1_then_la1 + lda $2 + cmp #$f + bcc b1_from_b1 + jmp breturn + //SEG17 main::@return + breturn: + //SEG18 [10] return [ ] + rts +} Statement [1] *((word) 4352) ← (byte) 0 [ ] always clobbers reg byte a Statement [2] *((word) 4353) ← (byte) 1 [ ] always clobbers reg byte a @@ -689,102 +690,104 @@ MISSING FRAGMENTS yby=yby_plus_cowo1_staridx_aby yby=yby_plus_cowo1_staridx_xby yby=yby_plus_cowo1_staridx_yby -Removing instruction jmp BEND -Removing instruction jmp main__B1 -Removing instruction jmp main__Breturn +Removing instruction jmp bend +Removing instruction jmp b1 +Removing instruction jmp breturn Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2 - lda #$0 - sta $1100 -//SEG5 [2] *((word) 4353) ← (byte) 1 [ ] -- _star_cowo1=coby2 - lda #$1 - sta $1101 -//SEG6 [3] phi from main to main::@1 -main__B1_from_main: -//SEG7 [3] phi (byte) main::i#2 = (byte) 0 -- xby=coby1 - ldx #$0 - jmp main__B1 -//SEG8 [3] phi from main::@1 to main::@1 -main__B1_from_B1: -//SEG9 [3] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy -//SEG10 main::@1 -main__B1: -//SEG11 [4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby - lda $1100,x -//SEG12 [5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ] - // [5] main::$3 ← 4353 *idx main::i#2 // ALU -//SEG13 [6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] -- aby=aby_plus_cowo1_staridx_xby - clc - adc $1101,x -//SEG14 [7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby - sta $1102,x -//SEG15 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- xby=_inc_xby - inx -//SEG16 [9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ] -- xby_lt_coby1_then_la1 - cpx #$f - bcc main__B1_from_B1 -//SEG17 main::@return -main__Breturn: -//SEG18 [10] return [ ] - rts +main: { + //SEG4 [1] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2 + lda #$0 + sta $1100 + //SEG5 [2] *((word) 4353) ← (byte) 1 [ ] -- _star_cowo1=coby2 + lda #$1 + sta $1101 + //SEG6 [3] phi from main to main::@1 + b1_from_main: + //SEG7 [3] phi (byte) main::i#2 = (byte) 0 -- xby=coby1 + ldx #$0 + jmp b1 + //SEG8 [3] phi from main::@1 to main::@1 + b1_from_b1: + //SEG9 [3] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy + //SEG10 main::@1 + b1: + //SEG11 [4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby + lda $1100,x + //SEG12 [5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ] + // [5] main::$3 ← 4353 *idx main::i#2 // ALU + //SEG13 [6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] -- aby=aby_plus_cowo1_staridx_xby + clc + adc $1101,x + //SEG14 [7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby + sta $1102,x + //SEG15 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- xby=_inc_xby + inx + //SEG16 [9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ] -- xby_lt_coby1_then_la1 + cpx #$f + bcc b1_from_b1 + //SEG17 main::@return + breturn: + //SEG18 [10] return [ ] + rts +} -Removing instruction jmp main__B1 +Removing instruction jmp b1 Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2 - lda #$0 - sta $1100 -//SEG5 [2] *((word) 4353) ← (byte) 1 [ ] -- _star_cowo1=coby2 - lda #$1 - sta $1101 -//SEG6 [3] phi from main to main::@1 -main__B1_from_main: -//SEG7 [3] phi (byte) main::i#2 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG8 [3] phi from main::@1 to main::@1 -main__B1_from_B1: -//SEG9 [3] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy -//SEG10 main::@1 -main__B1: -//SEG11 [4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby - lda $1100,x -//SEG12 [5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ] - // [5] main::$3 ← 4353 *idx main::i#2 // ALU -//SEG13 [6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] -- aby=aby_plus_cowo1_staridx_xby - clc - adc $1101,x -//SEG14 [7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby - sta $1102,x -//SEG15 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- xby=_inc_xby - inx -//SEG16 [9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ] -- xby_lt_coby1_then_la1 - cpx #$f - bcc main__B1_from_B1 -//SEG17 main::@return -main__Breturn: -//SEG18 [10] return [ ] - rts +main: { + //SEG4 [1] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2 + lda #$0 + sta $1100 + //SEG5 [2] *((word) 4353) ← (byte) 1 [ ] -- _star_cowo1=coby2 + lda #$1 + sta $1101 + //SEG6 [3] phi from main to main::@1 + b1_from_main: + //SEG7 [3] phi (byte) main::i#2 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG8 [3] phi from main::@1 to main::@1 + b1_from_b1: + //SEG9 [3] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy + //SEG10 main::@1 + b1: + //SEG11 [4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby + lda $1100,x + //SEG12 [5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ] + // [5] main::$3 ← 4353 *idx main::i#2 // ALU + //SEG13 [6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] -- aby=aby_plus_cowo1_staridx_xby + clc + adc $1101,x + //SEG14 [7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby + sta $1102,x + //SEG15 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- xby=_inc_xby + inx + //SEG16 [9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ] -- xby_lt_coby1_then_la1 + cpx #$f + bcc b1_from_b1 + //SEG17 main::@return + breturn: + //SEG18 [10] return [ ] + rts +} FINAL SYMBOL TABLE -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte[15]) fibs (void()) main() (byte~) main::$1 reg byte a 11.0 @@ -802,45 +805,46 @@ reg byte alu [ main::$3 ] reg byte a [ main::$4 ] FINAL CODE -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2 - lda #$0 - sta $1100 -//SEG5 [2] *((word) 4353) ← (byte) 1 [ ] -- _star_cowo1=coby2 - lda #$1 - sta $1101 -//SEG6 [3] phi from main to main::@1 -main__B1_from_main: -//SEG7 [3] phi (byte) main::i#2 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG8 [3] phi from main::@1 to main::@1 -main__B1_from_B1: -//SEG9 [3] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy -//SEG10 main::@1 -main__B1: -//SEG11 [4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby - lda $1100,x -//SEG12 [5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ] - // [5] main::$3 ← 4353 *idx main::i#2 // ALU -//SEG13 [6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] -- aby=aby_plus_cowo1_staridx_xby - clc - adc $1101,x -//SEG14 [7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby - sta $1102,x -//SEG15 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- xby=_inc_xby - inx -//SEG16 [9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ] -- xby_lt_coby1_then_la1 - cpx #$f - bcc main__B1_from_B1 -//SEG17 main::@return -main__Breturn: -//SEG18 [10] return [ ] - rts +main: { + //SEG4 [1] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2 + lda #$0 + sta $1100 + //SEG5 [2] *((word) 4353) ← (byte) 1 [ ] -- _star_cowo1=coby2 + lda #$1 + sta $1101 + //SEG6 [3] phi from main to main::@1 + b1_from_main: + //SEG7 [3] phi (byte) main::i#2 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG8 [3] phi from main::@1 to main::@1 + b1_from_b1: + //SEG9 [3] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy + //SEG10 main::@1 + b1: + //SEG11 [4] (byte~) main::$1 ← (word) 4352 *idx (byte) main::i#2 [ main::i#2 main::$1 ] -- aby=cowo1_staridx_xby + lda $1100,x + //SEG12 [5] (byte~) main::$3 ← (word) 4353 *idx (byte) main::i#2 [ main::i#2 main::$1 main::$3 ] + // [5] main::$3 ← 4353 *idx main::i#2 // ALU + //SEG13 [6] (byte~) main::$4 ← (byte~) main::$1 + (byte~) main::$3 [ main::i#2 main::$4 ] -- aby=aby_plus_cowo1_staridx_xby + clc + adc $1101,x + //SEG14 [7] *((word) 4354 + (byte) main::i#2) ← (byte~) main::$4 [ main::i#2 ] -- cowo1_staridx_xby=aby + sta $1102,x + //SEG15 [8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- xby=_inc_xby + inx + //SEG16 [9] if((byte) main::i#1<(byte) 15) goto main::@1 [ main::i#1 ] -- xby_lt_coby1_then_la1 + cpx #$f + bcc b1_from_b1 + //SEG17 main::@return + breturn: + //SEG18 [10] return [ ] + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/fibmem.sym b/src/main/java/dk/camelot64/kickc/test/ref/fibmem.sym index 84f982d7d..b88180fce 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/fibmem.sym +++ b/src/main/java/dk/camelot64/kickc/test/ref/fibmem.sym @@ -1,5 +1,5 @@ -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte[15]) fibs (void()) main() (byte~) main::$1 reg byte a 11.0 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.asm b/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.asm index 5c26379a2..adf0f6156 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.asm @@ -1,117 +1,121 @@ -BBEGIN: +bbegin: jsr main -BEND: -main: - jsr prepare -main__B3_from_main: - ldx #$19 - jmp main__B3 -main__B3_from_B11: - ldx #$19 -main__B3_from_B3: -main__B3_from_B6: -main__B3: - lda $d012 - cmp #$fe - bne main__B3_from_B3 -main__B4: - lda $d012 - cmp #$ff - bne main__B4 -main__B6: - dex - cpx #$0 - bne main__B3_from_B6 -main__B7: - jsr flip -main__B10: - jsr plot -main__B11: - jmp main__B3_from_B11 -main__Breturn: - rts -plot: -plot__B1_from_plot: - lda #$10 - sta $4 - lda #<$4d4 - sta $2 - lda #>$4d4 - sta $2+$1 - ldx #$0 -plot__B1_from_B3: -plot__B1: -plot__B2_from_B1: - ldy #$0 -plot__B2_from_B2: -plot__B2: - lda $1000,x - sta ($2),y - inx - iny - cpy #$10 - bcc plot__B2_from_B2 -plot__B3: - lda $2 - clc - adc #$28 - sta $2 - bcc !+ - inc $2+$1 -!: - dec $4 - lda $4 - bne plot__B1_from_B3 -plot__Breturn: - rts -flip: -flip__B1_from_flip: - lda #$10 - sta $4 - ldy #$f - ldx #$0 -flip__B1_from_B4: -flip__B1: -flip__B2_from_B1: - lda #$10 - sta $5 -flip__B2_from_B2: -flip__B2: - lda $1000,x - sta $1100,y - inx - tya - clc - adc #$10 - tay - dec $5 - lda $5 - bne flip__B2_from_B2 -flip__B4: - dey - dec $4 - lda $4 - bne flip__B1_from_B4 -flip__B3_from_B4: - ldx #$0 -flip__B3_from_B3: -flip__B3: - lda $1100,x - sta $1000,x - inx - cpx #$0 - bne flip__B3_from_B3 -flip__Breturn: - rts -prepare: -prepare__B1_from_prepare: - ldx #$0 -prepare__B1_from_B1: -prepare__B1: - txa - sta $1000,x - inx - cpx #$0 - bne prepare__B1_from_B1 -prepare__Breturn: - rts +bend: +main: { + jsr prepare + b3_from_main: + ldx #$19 + jmp b3 + b3_from_b11: + ldx #$19 + b3_from_b3: + b3_from_b6: + b3: + lda $d012 + cmp #$fe + bne b3_from_b3 + b4: + lda $d012 + cmp #$ff + bne b4 + b6: + dex + cpx #$0 + bne b3_from_b6 + b7: + jsr flip + b10: + jsr plot + b11: + jmp b3_from_b11 + breturn: + rts +} +plot: { + b1_from_plot: + lda #$10 + sta $4 + lda #<$4d4 + sta $2 + lda #>$4d4 + sta $2+$1 + ldx #$0 + b1_from_b3: + b1: + b2_from_b1: + ldy #$0 + b2_from_b2: + b2: + lda $1000,x + sta ($2),y + inx + iny + cpy #$10 + bcc b2_from_b2 + b3: + lda $2 + clc + adc #$28 + sta $2 + bcc !+ + inc $2+$1 + !: + dec $4 + lda $4 + bne b1_from_b3 + breturn: + rts +} +flip: { + b1_from_flip: + lda #$10 + sta $4 + ldy #$f + ldx #$0 + b1_from_b4: + b1: + b2_from_b1: + lda #$10 + sta $5 + b2_from_b2: + b2: + lda $1000,x + sta $1100,y + inx + tya + clc + adc #$10 + tay + dec $5 + lda $5 + bne b2_from_b2 + b4: + dey + dec $4 + lda $4 + bne b1_from_b4 + b3_from_b4: + ldx #$0 + b3_from_b3: + b3: + lda $1100,x + sta $1000,x + inx + cpx #$0 + bne b3_from_b3 + breturn: + rts +} +prepare: { + b1_from_prepare: + ldx #$0 + b1_from_b1: + b1: + txa + sta $1000,x + inx + cpx #$0 + bne b1_from_b1 + breturn: + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.cfg b/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.cfg index 0c747e813..121685115 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.cfg +++ b/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.cfg @@ -1,8 +1,8 @@ -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] call prepare param-assignment [ ] to:main::@3 main::@3: from main main::@11 main::@3 main::@6 @@ -29,7 +29,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 [12] return [ ] - to:@RETURN + to:@return plot: from main::@10 to:plot::@1 plot::@1: from plot plot::@3 @@ -53,7 +53,7 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 [23] return [ ] - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -86,7 +86,7 @@ flip::@3: from flip::@3 flip::@4 to:flip::@return flip::@return: from flip::@3 [40] return [ ] - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -97,4 +97,4 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 [45] return [ ] - to:@RETURN + to:@return diff --git a/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.log b/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.log index 7976729e7..6d21d0d2d 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.log @@ -220,7 +220,7 @@ SYMBOLS (byte) prepare::i INITIAL CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte[1000]) SCREEN ← (word) 1024 (byte[256]) buffer1 ← (word) 4096 (byte[256]) buffer2 ← (word) 4352 @@ -261,8 +261,8 @@ main::@8: from main::@7 to:main::@return main::@return: from main::@8 return - to:@RETURN -@1: from @BEGIN + to:@return +@1: from @begin to:@2 prepare: from (byte) prepare::i ← (byte) 0 @@ -277,7 +277,7 @@ prepare::@2: from prepare::@1 to:prepare::@return prepare::@return: from prepare::@2 return - to:@RETURN + to:@return @2: from @1 to:@3 flip: from @@ -318,7 +318,7 @@ flip::@6: from flip::@3 to:flip::@return flip::@return: from flip::@6 return - to:@RETURN + to:@return @3: from @2 to:@4 plot: from @@ -351,10 +351,10 @@ plot::@4: from plot::@3 to:plot::@return plot::@return: from plot::@4 return - to:@RETURN + to:@return @4: from @3 - to:@END -@END: from @4 + to:@end +@end: from @4 Removing empty block main::@5 Removing empty block main::@8 @@ -366,13 +366,13 @@ Removing empty block @3 Removing empty block plot::@4 Removing empty block @4 CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte[1000]) SCREEN ← (word) 1024 (byte[256]) buffer1 ← (word) 4096 (byte[256]) buffer2 ← (word) 4352 (byte*) RASTER ← (word) 53266 (void~) $0 ← call main - to:@END + to:@end main: from (void~) main::$0 ← call prepare to:main::@1 @@ -403,7 +403,7 @@ main::@7: from main::@6 to:main::@return main::@return: from main::@7 return - to:@RETURN + to:@return prepare: from (byte) prepare::i ← (byte) 0 to:prepare::@1 @@ -415,7 +415,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from (byte) flip::srcIdx ← (byte) 0 (byte) flip::dstIdx ← (byte) 15 @@ -452,7 +452,7 @@ flip::@3: from flip::@3 flip::@5 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from (byte~) plot::$0 ← (byte) 5 * (byte) 40 (byte*~) plot::$1 ← (byte[1000]) SCREEN + (byte~) plot::$0 @@ -481,22 +481,22 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin PROCEDURE MODIFY VARIABLE ANALYSIS CONTROL FLOW GRAPH WITH ASSIGNMENT CALL -@BEGIN: from +@begin: from (byte[1000]) SCREEN ← (word) 1024 (byte[256]) buffer1 ← (word) 4096 (byte[256]) buffer2 ← (word) 4352 (byte*) RASTER ← (word) 53266 call main param-assignment to:@5 -@5: from @BEGIN - to:@END -main: from @BEGIN +@5: from @begin + to:@end +main: from @begin call prepare param-assignment to:main::@9 main::@9: from main @@ -532,7 +532,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main (byte) prepare::i ← (byte) 0 to:prepare::@1 @@ -544,7 +544,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 (byte) flip::srcIdx ← (byte) 0 (byte) flip::dstIdx ← (byte) 15 @@ -581,7 +581,7 @@ flip::@3: from flip::@3 flip::@5 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte~) plot::$0 ← (byte) 5 * (byte) 40 (byte*~) plot::$1 ← (byte[1000]) SCREEN + (byte~) plot::$0 @@ -610,8 +610,8 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @5 + to:@return +@end: from @5 Completing Phi functions... Completing Phi functions... @@ -624,20 +624,20 @@ Completing Phi functions... Completing Phi functions... Completing Phi functions... CONTROL FLOW GRAPH SSA -@BEGIN: from +@begin: from (byte[1000]) SCREEN#0 ← (word) 1024 (byte[256]) buffer1#0 ← (word) 4096 (byte[256]) buffer2#0 ← (word) 4352 (byte*) RASTER#0 ← (word) 53266 call main param-assignment to:@5 -@5: from @BEGIN - to:@END -main: from @BEGIN - (byte[256]) buffer2#15 ← phi( @BEGIN/(byte[256]) buffer2#0 ) - (byte[1000]) SCREEN#11 ← phi( @BEGIN/(byte[1000]) SCREEN#0 ) - (byte*) RASTER#8 ← phi( @BEGIN/(byte*) RASTER#0 ) - (byte[256]) buffer1#9 ← phi( @BEGIN/(byte[256]) buffer1#0 ) +@5: from @begin + to:@end +main: from @begin + (byte[256]) buffer2#15 ← phi( @begin/(byte[256]) buffer2#0 ) + (byte[1000]) SCREEN#11 ← phi( @begin/(byte[1000]) SCREEN#0 ) + (byte*) RASTER#8 ← phi( @begin/(byte*) RASTER#0 ) + (byte[256]) buffer1#9 ← phi( @begin/(byte[256]) buffer1#0 ) call prepare param-assignment to:main::@9 main::@9: from main @@ -713,7 +713,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main (byte[256]) buffer1#5 ← phi( main/(byte[256]) buffer1#9 ) (byte) prepare::i#0 ← (byte) 0 @@ -728,7 +728,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 (byte[256]) buffer2#5 ← phi( main::@7/(byte[256]) buffer2#7 ) (byte[256]) buffer1#10 ← phi( main::@7/(byte[256]) buffer1#14 ) @@ -788,7 +788,7 @@ flip::@3: from flip::@3 flip::@5 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte[256]) buffer1#12 ← phi( main::@10/(byte[256]) buffer1#15 ) (byte[1000]) SCREEN#1 ← phi( main::@10/(byte[1000]) SCREEN#2 ) @@ -832,24 +832,24 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @5 + to:@return +@end: from @5 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN -@BEGIN: from +@begin: from (byte[1000]) SCREEN#0 ← (word) 1024 (byte[256]) buffer1#0 ← (word) 4096 (byte[256]) buffer2#0 ← (word) 4352 (byte*) RASTER#0 ← (word) 53266 call main param-assignment to:@5 -@5: from @BEGIN - to:@END -main: from @BEGIN - (byte[256]) buffer2#15 ← phi( @BEGIN/(byte[256]) buffer2#0 ) - (byte[1000]) SCREEN#11 ← phi( @BEGIN/(byte[1000]) SCREEN#0 ) - (byte*) RASTER#8 ← phi( @BEGIN/(byte*) RASTER#0 ) - (byte[256]) buffer1#9 ← phi( @BEGIN/(byte[256]) buffer1#0 ) +@5: from @begin + to:@end +main: from @begin + (byte[256]) buffer2#15 ← phi( @begin/(byte[256]) buffer2#0 ) + (byte[1000]) SCREEN#11 ← phi( @begin/(byte[1000]) SCREEN#0 ) + (byte*) RASTER#8 ← phi( @begin/(byte*) RASTER#0 ) + (byte[256]) buffer1#9 ← phi( @begin/(byte[256]) buffer1#0 ) call prepare param-assignment to:main::@9 main::@9: from main @@ -925,7 +925,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main (byte[256]) buffer1#5 ← phi( main/(byte[256]) buffer1#9 ) (byte) prepare::i#0 ← (byte) 0 @@ -940,7 +940,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 (byte[256]) buffer2#5 ← phi( main::@7/(byte[256]) buffer2#7 ) (byte[256]) buffer1#10 ← phi( main::@7/(byte[256]) buffer1#14 ) @@ -1000,7 +1000,7 @@ flip::@3: from flip::@3 flip::@5 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte[256]) buffer1#12 ← phi( main::@10/(byte[256]) buffer1#15 ) (byte[1000]) SCREEN#1 ← phi( main::@10/(byte[1000]) SCREEN#2 ) @@ -1044,24 +1044,24 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @5 + to:@return +@end: from @5 Culled Empty Block (label) @5 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte[1000]) SCREEN#0 ← (word) 1024 (byte[256]) buffer1#0 ← (word) 4096 (byte[256]) buffer2#0 ← (word) 4352 (byte*) RASTER#0 ← (word) 53266 call main param-assignment - to:@END -main: from @BEGIN - (byte[256]) buffer2#15 ← phi( @BEGIN/(byte[256]) buffer2#0 ) - (byte[1000]) SCREEN#11 ← phi( @BEGIN/(byte[1000]) SCREEN#0 ) - (byte*) RASTER#8 ← phi( @BEGIN/(byte*) RASTER#0 ) - (byte[256]) buffer1#9 ← phi( @BEGIN/(byte[256]) buffer1#0 ) + to:@end +main: from @begin + (byte[256]) buffer2#15 ← phi( @begin/(byte[256]) buffer2#0 ) + (byte[1000]) SCREEN#11 ← phi( @begin/(byte[1000]) SCREEN#0 ) + (byte*) RASTER#8 ← phi( @begin/(byte*) RASTER#0 ) + (byte[256]) buffer1#9 ← phi( @begin/(byte[256]) buffer1#0 ) call prepare param-assignment to:main::@9 main::@9: from main @@ -1137,7 +1137,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main (byte[256]) buffer1#5 ← phi( main/(byte[256]) buffer1#9 ) (byte) prepare::i#0 ← (byte) 0 @@ -1152,7 +1152,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 (byte[256]) buffer2#5 ← phi( main::@7/(byte[256]) buffer2#7 ) (byte[256]) buffer1#10 ← phi( main::@7/(byte[256]) buffer1#14 ) @@ -1212,7 +1212,7 @@ flip::@3: from flip::@3 flip::@5 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte[256]) buffer1#12 ← phi( main::@10/(byte[256]) buffer1#15 ) (byte[1000]) SCREEN#1 ← phi( main::@10/(byte[1000]) SCREEN#2 ) @@ -1256,8 +1256,8 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte[1000]) SCREEN#0 (word) 1024 Constant (byte[256]) buffer1#0 (word) 4096 @@ -1276,14 +1276,14 @@ Constant (byte) plot::i#0 (byte) 0 Constant (byte) plot::x#0 (byte) 0 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN - (byte[256]) buffer2#15 ← phi( @BEGIN/(word) 4352 ) - (byte[1000]) SCREEN#11 ← phi( @BEGIN/(word) 1024 ) - (byte*) RASTER#8 ← phi( @BEGIN/(word) 53266 ) - (byte[256]) buffer1#9 ← phi( @BEGIN/(word) 4096 ) + to:@end +main: from @begin + (byte[256]) buffer2#15 ← phi( @begin/(word) 4352 ) + (byte[1000]) SCREEN#11 ← phi( @begin/(word) 1024 ) + (byte*) RASTER#8 ← phi( @begin/(word) 53266 ) + (byte[256]) buffer1#9 ← phi( @begin/(word) 4096 ) call prepare param-assignment to:main::@9 main::@9: from main @@ -1358,7 +1358,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main (byte[256]) buffer1#5 ← phi( main/(byte[256]) buffer1#9 ) to:prepare::@1 @@ -1372,7 +1372,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 (byte[256]) buffer2#5 ← phi( main::@7/(byte[256]) buffer2#7 ) (byte[256]) buffer1#10 ← phi( main::@7/(byte[256]) buffer1#14 ) @@ -1427,7 +1427,7 @@ flip::@3: from flip::@3 flip::@5 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte[256]) buffer1#12 ← phi( main::@10/(byte[256]) buffer1#15 ) (byte[1000]) SCREEN#1 ← phi( main::@10/(byte[1000]) SCREEN#2 ) @@ -1467,20 +1467,20 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Consolidated constant in assignment plot::$2 Succesful SSA optimization Pass2ConstantAdditionElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN - (byte[256]) buffer2#15 ← phi( @BEGIN/(word) 4352 ) - (byte[1000]) SCREEN#11 ← phi( @BEGIN/(word) 1024 ) - (byte*) RASTER#8 ← phi( @BEGIN/(word) 53266 ) - (byte[256]) buffer1#9 ← phi( @BEGIN/(word) 4096 ) + to:@end +main: from @begin + (byte[256]) buffer2#15 ← phi( @begin/(word) 4352 ) + (byte[1000]) SCREEN#11 ← phi( @begin/(word) 1024 ) + (byte*) RASTER#8 ← phi( @begin/(word) 53266 ) + (byte[256]) buffer1#9 ← phi( @begin/(word) 4096 ) call prepare param-assignment to:main::@9 main::@9: from main @@ -1555,7 +1555,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main (byte[256]) buffer1#5 ← phi( main/(byte[256]) buffer1#9 ) to:prepare::@1 @@ -1569,7 +1569,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 (byte[256]) buffer2#5 ← phi( main::@7/(byte[256]) buffer2#7 ) (byte[256]) buffer1#10 ← phi( main::@7/(byte[256]) buffer1#14 ) @@ -1624,7 +1624,7 @@ flip::@3: from flip::@3 flip::@5 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte[256]) buffer1#12 ← phi( main::@10/(byte[256]) buffer1#15 ) (byte[1000]) SCREEN#1 ← phi( main::@10/(byte[1000]) SCREEN#2 ) @@ -1664,8 +1664,8 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Not aliassing across scopes: plot::$1 SCREEN#1 Alias (byte*) RASTER#6 = (byte*) RASTER#8 @@ -1691,14 +1691,14 @@ Alias (byte) plot::i#1 = (byte) plot::i#4 Alias (byte*) plot::line#1 = (byte*~) plot::$5 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN - (byte[256]) buffer2#14 ← phi( @BEGIN/(word) 4352 ) - (byte[1000]) SCREEN#10 ← phi( @BEGIN/(word) 1024 ) - (byte*) RASTER#6 ← phi( @BEGIN/(word) 53266 ) - (byte[256]) buffer1#22 ← phi( @BEGIN/(word) 4096 ) + to:@end +main: from @begin + (byte[256]) buffer2#14 ← phi( @begin/(word) 4352 ) + (byte[1000]) SCREEN#10 ← phi( @begin/(word) 1024 ) + (byte*) RASTER#6 ← phi( @begin/(word) 53266 ) + (byte[256]) buffer1#22 ← phi( @begin/(word) 4096 ) call prepare param-assignment to:main::@9 main::@9: from main @@ -1747,7 +1747,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -1760,7 +1760,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -1805,7 +1805,7 @@ flip::@3: from flip::@3 flip::@5 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte*~) plot::$1 ← (byte[1000]) SCREEN#1 (byte*) plot::line#0 ← (byte*~) plot::$1 + (byte) 212 @@ -1837,8 +1837,8 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Redundant Phi (byte[256]) buffer1#22 (word) 4096 Redundant Phi (byte*) RASTER#6 (word) 53266 @@ -1846,10 +1846,10 @@ Redundant Phi (byte[1000]) SCREEN#10 (word) 1024 Redundant Phi (byte[256]) buffer2#14 (word) 4352 Succesful SSA optimization Pass2RedundantPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call prepare param-assignment to:main::@9 main::@9: from main @@ -1898,7 +1898,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -1911,7 +1911,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -1956,7 +1956,7 @@ flip::@3: from flip::@3 flip::@5 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte*~) plot::$1 ← (byte[1000]) SCREEN#1 (byte*) plot::line#0 ← (byte*~) plot::$1 + (byte) 212 @@ -1988,8 +1988,8 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Self Phi Eliminated (byte*) RASTER#1 Self Phi Eliminated (byte) main::c#4 @@ -2012,10 +2012,10 @@ Self Phi Eliminated (byte*) plot::line#2 Self Phi Eliminated (byte) plot::y#2 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call prepare param-assignment to:main::@9 main::@9: from main @@ -2064,7 +2064,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -2077,7 +2077,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -2122,7 +2122,7 @@ flip::@3: from flip::@3 flip::@5 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte*~) plot::$1 ← (byte[1000]) SCREEN#1 (byte*) plot::line#0 ← (byte*~) plot::$1 + (byte) 212 @@ -2154,8 +2154,8 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Simple Condition (boolean~) main::$2 if((byte~) main::$1!=(byte) 254) goto main::@3 Simple Condition (boolean~) main::$4 if((byte~) main::$3!=(byte) 255) goto main::@4 @@ -2168,10 +2168,10 @@ Simple Condition (boolean~) plot::$4 if((byte) plot::x#1<(byte) 16) goto plot::@ Simple Condition (boolean~) plot::$6 if((byte) plot::y#1!=(byte) 0) goto plot::@1 Succesful SSA optimization Pass2ConditionalJumpSimplification CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call prepare param-assignment to:main::@9 main::@9: from main @@ -2217,7 +2217,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -2229,7 +2229,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -2271,7 +2271,7 @@ flip::@3: from flip::@3 flip::@5 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte*~) plot::$1 ← (byte[1000]) SCREEN#1 (byte*) plot::line#0 ← (byte*~) plot::$1 + (byte) 212 @@ -2301,18 +2301,18 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Culled Empty Block (label) main::@9 Culled Empty Block (label) main::@2 Culled Empty Block (label) flip::@5 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call prepare param-assignment to:main::@1 main::@1: from main main::@11 @@ -2354,7 +2354,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -2366,7 +2366,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -2406,7 +2406,7 @@ flip::@3: from flip::@3 flip::@4 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte*~) plot::$1 ← (byte[1000]) SCREEN#1 (byte*) plot::line#0 ← (byte*~) plot::$1 + (byte) 212 @@ -2436,16 +2436,16 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte[256]) buffer1#1 (word) 4096 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call prepare param-assignment to:main::@1 main::@1: from main main::@11 @@ -2487,7 +2487,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -2498,7 +2498,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -2538,7 +2538,7 @@ flip::@3: from flip::@3 flip::@4 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte*~) plot::$1 ← (byte[1000]) SCREEN#1 (byte*) plot::line#0 ← (byte*~) plot::$1 + (byte) 212 @@ -2568,8 +2568,8 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Multiple usages for variable. Not optimizing sub-constant (byte) prepare::i#2 Not aliassing across scopes: plot::$1 SCREEN#1 @@ -2586,10 +2586,10 @@ Alias (byte*) plot::line#2 = (byte*) plot::line#4 Alias (byte) plot::y#2 = (byte) plot::y#4 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call prepare param-assignment to:main::@1 main::@1: from main main::@11 @@ -2626,7 +2626,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -2637,7 +2637,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -2672,7 +2672,7 @@ flip::@3: from flip::@3 flip::@4 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte*~) plot::$1 ← (byte[1000]) SCREEN#1 (byte*) plot::line#0 ← (byte*~) plot::$1 + (byte) 212 @@ -2699,8 +2699,8 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Self Phi Eliminated (byte*) RASTER#1 Self Phi Eliminated (byte[1000]) SCREEN#1 @@ -2711,10 +2711,10 @@ Self Phi Eliminated (byte[256]) buffer2#1 Self Phi Eliminated (byte[256]) buffer1#13 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call prepare param-assignment to:main::@1 main::@1: from main main::@11 @@ -2751,7 +2751,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -2762,7 +2762,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -2797,7 +2797,7 @@ flip::@3: from flip::@3 flip::@4 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte*~) plot::$1 ← (byte[1000]) SCREEN#1 (byte*) plot::line#0 ← (byte*~) plot::$1 + (byte) 212 @@ -2824,8 +2824,8 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Multiple usages for variable. Not optimizing sub-constant (byte) prepare::i#2 Not aliassing across scopes: plot::$1 SCREEN#1 @@ -2835,10 +2835,10 @@ Alias (byte[256]) buffer1#10 = (byte[256]) buffer1#19 (byte[256]) buffer1#11 (by Alias (byte[256]) buffer2#1 = (byte[256]) buffer2#10 (byte[256]) buffer2#11 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call prepare param-assignment to:main::@1 main::@1: from main main::@11 @@ -2871,7 +2871,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -2882,7 +2882,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -2915,7 +2915,7 @@ flip::@3: from flip::@3 flip::@4 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte*~) plot::$1 ← (byte[1000]) SCREEN#1 (byte*) plot::line#0 ← (byte*~) plot::$1 + (byte) 212 @@ -2941,8 +2941,8 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Self Phi Eliminated (byte*) RASTER#1 Self Phi Eliminated (byte[1000]) SCREEN#1 @@ -2950,10 +2950,10 @@ Self Phi Eliminated (byte[256]) buffer1#10 Self Phi Eliminated (byte[256]) buffer2#1 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call prepare param-assignment to:main::@1 main::@1: from main main::@11 @@ -2986,7 +2986,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -2997,7 +2997,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -3030,7 +3030,7 @@ flip::@3: from flip::@3 flip::@4 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte*~) plot::$1 ← (byte[1000]) SCREEN#1 (byte*) plot::line#0 ← (byte*~) plot::$1 + (byte) 212 @@ -3056,8 +3056,8 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte*) RASTER#1 (word) 53266 Constant (byte[1000]) SCREEN#1 (word) 1024 @@ -3065,10 +3065,10 @@ Constant (byte[256]) buffer1#10 (word) 4096 Constant (byte[256]) buffer2#1 (word) 4352 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call prepare param-assignment to:main::@1 main::@1: from main main::@11 @@ -3097,7 +3097,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -3108,7 +3108,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -3141,7 +3141,7 @@ flip::@3: from flip::@3 flip::@4 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte*~) plot::$1 ← (word) 1024 (byte*) plot::line#0 ← (byte*~) plot::$1 + (byte) 212 @@ -3167,8 +3167,8 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Multiple usages for variable. Not optimizing sub-constant (byte) prepare::i#2 Multiple usages for variable. Not optimizing sub-constant (byte) flip::srcIdx#2 @@ -3178,10 +3178,10 @@ Multiple usages for variable. Not optimizing sub-constant (byte) plot::i#2 Culled Empty Block (label) main::@1 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call prepare param-assignment to:main::@3 main::@3: from main main::@11 main::@3 main::@6 @@ -3208,7 +3208,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -3219,7 +3219,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -3252,7 +3252,7 @@ flip::@3: from flip::@3 flip::@4 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte*~) plot::$1 ← (word) 1024 (byte*) plot::line#0 ← (byte*~) plot::$1 + (byte) 212 @@ -3278,16 +3278,16 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte*~) plot::$1 (word) 1024 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call prepare param-assignment to:main::@3 main::@3: from main main::@11 main::@3 main::@6 @@ -3314,7 +3314,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -3325,7 +3325,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -3358,7 +3358,7 @@ flip::@3: from flip::@3 flip::@4 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 (byte*) plot::line#0 ← (word) 1024 + (byte) 212 to:plot::@1 @@ -3383,8 +3383,8 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Multiple usages for variable. Not optimizing sub-constant (byte) prepare::i#2 Multiple usages for variable. Not optimizing sub-constant (byte) flip::srcIdx#2 @@ -3394,10 +3394,10 @@ Multiple usages for variable. Not optimizing sub-constant (byte) plot::i#2 Constant (byte*) plot::line#0 (word) 1236 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call prepare param-assignment to:main::@3 main::@3: from main main::@11 main::@3 main::@6 @@ -3424,7 +3424,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -3435,7 +3435,7 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -3468,7 +3468,7 @@ flip::@3: from flip::@3 flip::@4 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return plot: from main::@10 to:plot::@1 plot::@1: from plot plot::@3 @@ -3492,8 +3492,8 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Multiple usages for variable. Not optimizing sub-constant (byte) prepare::i#2 Multiple usages for variable. Not optimizing sub-constant (byte) flip::srcIdx#2 @@ -3505,7 +3505,7 @@ Multiple usages for variable. Not optimizing sub-constant (byte) flip::srcIdx#2 Multiple usages for variable. Not optimizing sub-constant (byte) flip::i#2 Multiple usages for variable. Not optimizing sub-constant (byte) flip::i#2 Multiple usages for variable. Not optimizing sub-constant (byte) plot::i#2 -Block Sequence Planned @BEGIN @END main main::@3 main::@4 main::@6 main::@7 main::@10 main::@11 main::@return plot plot::@1 plot::@2 plot::@3 plot::@return flip flip::@1 flip::@2 flip::@4 flip::@3 flip::@return prepare prepare::@1 prepare::@return +Block Sequence Planned @begin @end main main::@3 main::@4 main::@6 main::@7 main::@10 main::@11 main::@return plot plot::@1 plot::@2 plot::@3 plot::@return flip flip::@1 flip::@2 flip::@4 flip::@3 flip::@return prepare prepare::@1 prepare::@return Added new block during phi lifting main::@12(between main::@6 and main::@3) Added new block during phi lifting plot::@5(between plot::@3 and plot::@1) Added new block during phi lifting plot::@6(between plot::@2 and plot::@2) @@ -3513,13 +3513,13 @@ Added new block during phi lifting flip::@7(between flip::@4 and flip::@1) Added new block during phi lifting flip::@8(between flip::@2 and flip::@2) Added new block during phi lifting flip::@9(between flip::@3 and flip::@3) Added new block during phi lifting prepare::@3(between prepare::@1 and prepare::@1) -Block Sequence Planned @BEGIN @END main main::@3 main::@4 main::@6 main::@7 main::@10 main::@11 main::@return main::@12 plot plot::@1 plot::@2 plot::@3 plot::@return plot::@5 plot::@6 flip flip::@1 flip::@2 flip::@4 flip::@3 flip::@return flip::@9 flip::@7 flip::@8 prepare prepare::@1 prepare::@return prepare::@3 +Block Sequence Planned @begin @end main main::@3 main::@4 main::@6 main::@7 main::@10 main::@11 main::@return main::@12 plot plot::@1 plot::@2 plot::@3 plot::@return plot::@5 plot::@6 flip flip::@1 flip::@2 flip::@4 flip::@3 flip::@return flip::@9 flip::@7 flip::@8 prepare prepare::@1 prepare::@return prepare::@3 CONTROL FLOW GRAPH - PHI LIFTED -@BEGIN: from +@begin: from call main param-assignment - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin call prepare param-assignment to:main::@3 main::@3: from main main::@11 main::@12 main::@3 @@ -3546,7 +3546,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return main::@12: from main::@6 (byte~) main::c#6 ← (byte) main::c#1 to:main::@3 @@ -3574,7 +3574,7 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 return - to:@RETURN + to:@return plot::@5: from plot::@3 (byte~) plot::i#5 ← (byte) plot::i#1 (byte*~) plot::line#5 ← (byte*) plot::line#1 @@ -3618,7 +3618,7 @@ flip::@3: from flip::@4 flip::@9 to:flip::@return flip::@return: from flip::@3 return - to:@RETURN + to:@return flip::@9: from flip::@3 (byte~) flip::i#3 ← (byte) flip::i#1 to:flip::@3 @@ -3642,7 +3642,7 @@ prepare::@1: from prepare prepare::@3 to:prepare::@return prepare::@return: from prepare::@1 return - to:@RETURN + to:@return prepare::@3: from prepare::@1 (byte~) prepare::i#3 ← (byte) prepare::i#1 to:prepare::@1 @@ -3659,11 +3659,11 @@ Propagating live ranges... Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] call prepare param-assignment [ ] to:main::@3 main::@3: from main main::@11 main::@12 main::@3 @@ -3690,7 +3690,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 [12] return [ ] - to:@RETURN + to:@return main::@12: from main::@6 [13] (byte~) main::c#6 ← (byte) main::c#1 [ main::c#6 ] to:main::@3 @@ -3718,7 +3718,7 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 [25] return [ ] - to:@RETURN + to:@return plot::@5: from plot::@3 [26] (byte~) plot::i#5 ← (byte) plot::i#1 [ plot::i#5 plot::y#1 plot::line#1 ] [27] (byte*~) plot::line#5 ← (byte*) plot::line#1 [ plot::i#5 plot::line#5 plot::y#1 ] @@ -3762,7 +3762,7 @@ flip::@3: from flip::@4 flip::@9 to:flip::@return flip::@return: from flip::@3 [49] return [ ] - to:@RETURN + to:@return flip::@9: from flip::@3 [50] (byte~) flip::i#3 ← (byte) flip::i#1 [ flip::i#3 ] to:flip::@3 @@ -3786,7 +3786,7 @@ prepare::@1: from prepare prepare::@3 to:prepare::@return prepare::@return: from prepare::@1 [61] return [ ] - to:@RETURN + to:@return prepare::@3: from prepare::@1 [62] (byte~) prepare::i#3 ← (byte) prepare::i#1 [ prepare::i#3 ] to:prepare::@1 @@ -3817,7 +3817,7 @@ Culled Empty Block (label) flip::@9 Culled Empty Block (label) flip::@7 Culled Empty Block (label) flip::@8 Culled Empty Block (label) prepare::@3 -Block Sequence Planned @BEGIN @END main main::@3 main::@4 main::@6 main::@7 main::@10 main::@11 main::@return plot plot::@1 plot::@2 plot::@3 plot::@return flip flip::@1 flip::@2 flip::@4 flip::@3 flip::@return prepare prepare::@1 prepare::@return +Block Sequence Planned @begin @end main main::@3 main::@4 main::@6 main::@7 main::@10 main::@11 main::@return plot plot::@1 plot::@2 plot::@3 plot::@return flip flip::@1 flip::@2 flip::@4 flip::@3 flip::@return prepare prepare::@1 prepare::@return Propagating live ranges... Propagating live ranges... Propagating live ranges... @@ -3828,11 +3828,11 @@ Propagating live ranges... Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] call prepare param-assignment [ ] to:main::@3 main::@3: from main main::@11 main::@3 main::@6 @@ -3859,7 +3859,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 [12] return [ ] - to:@RETURN + to:@return plot: from main::@10 to:plot::@1 plot::@1: from plot plot::@3 @@ -3883,7 +3883,7 @@ plot::@3: from plot::@2 to:plot::@return plot::@return: from plot::@3 [23] return [ ] - to:@RETURN + to:@return flip: from main::@7 to:flip::@1 flip::@1: from flip flip::@4 @@ -3916,7 +3916,7 @@ flip::@3: from flip::@3 flip::@4 to:flip::@return flip::@return: from flip::@3 [40] return [ ] - to:@RETURN + to:@return prepare: from main to:prepare::@1 prepare::@1: from prepare prepare::@1 @@ -3927,37 +3927,37 @@ prepare::@1: from prepare prepare::@1 to:prepare::@return prepare::@return: from prepare::@1 [45] return [ ] - to:@RETURN + to:@return CALL GRAPH Calls in [] to 0:main Calls in [main] to 1:prepare 9:flip 10:plot DOMINATORS -@BEGIN dominated by @BEGIN -@END dominated by @BEGIN @END -main dominated by @BEGIN main -main::@3 dominated by @BEGIN main::@3 main -main::@4 dominated by @BEGIN main::@4 main::@3 main -main::@6 dominated by @BEGIN main::@4 main::@3 main::@6 main -main::@7 dominated by @BEGIN main::@4 main::@3 main::@6 main main::@7 -main::@10 dominated by @BEGIN main::@4 main::@3 main::@6 main main::@7 main::@10 -main::@11 dominated by @BEGIN main::@4 main::@3 main::@6 main main::@7 main::@10 main::@11 -main::@return dominated by @BEGIN main::@4 main::@3 main::@6 main main::@7 main::@return main::@10 main::@11 -plot dominated by @BEGIN main::@4 main::@3 main::@6 plot main main::@7 main::@10 -plot::@1 dominated by @BEGIN main::@4 main::@3 main::@6 main plot main::@7 plot::@1 main::@10 -plot::@2 dominated by @BEGIN main::@4 main::@3 main::@6 main plot main::@7 plot::@2 plot::@1 main::@10 -plot::@3 dominated by @BEGIN main::@4 main::@3 main::@6 main plot main::@7 plot::@2 plot::@1 main::@10 plot::@3 -plot::@return dominated by @BEGIN main::@4 main::@3 plot::@return main::@6 main plot main::@7 plot::@2 plot::@1 main::@10 plot::@3 -flip dominated by @BEGIN main::@4 main::@3 main::@6 main main::@7 flip -flip::@1 dominated by @BEGIN main::@4 main::@3 main::@6 main main::@7 flip::@1 flip -flip::@2 dominated by @BEGIN main::@4 main::@3 main::@6 main main::@7 flip::@1 flip::@2 flip -flip::@4 dominated by flip::@4 @BEGIN main::@4 main::@3 main::@6 main main::@7 flip::@1 flip::@2 flip -flip::@3 dominated by flip::@4 flip::@3 @BEGIN main::@4 main::@3 main::@6 main main::@7 flip::@1 flip::@2 flip -flip::@return dominated by flip::@4 flip::@3 @BEGIN main::@4 main::@3 main::@6 main main::@7 flip::@return flip::@1 flip::@2 flip -prepare dominated by @BEGIN prepare main -prepare::@1 dominated by @BEGIN prepare main prepare::@1 -prepare::@return dominated by @BEGIN prepare::@return prepare main prepare::@1 +@begin dominated by @begin +@end dominated by @end @begin +main dominated by @begin main +main::@3 dominated by @begin main::@3 main +main::@4 dominated by @begin main::@4 main::@3 main +main::@6 dominated by @begin main::@4 main::@3 main::@6 main +main::@7 dominated by @begin main::@4 main::@3 main::@6 main main::@7 +main::@10 dominated by @begin main::@4 main::@3 main::@6 main main::@7 main::@10 +main::@11 dominated by @begin main::@4 main::@3 main::@6 main main::@7 main::@10 main::@11 +main::@return dominated by @begin main::@4 main::@3 main::@6 main main::@7 main::@return main::@10 main::@11 +plot dominated by @begin main::@4 main::@3 main::@6 plot main main::@7 main::@10 +plot::@1 dominated by @begin main::@4 main::@3 main::@6 main plot main::@7 plot::@1 main::@10 +plot::@2 dominated by @begin main::@4 main::@3 main::@6 main plot main::@7 plot::@2 plot::@1 main::@10 +plot::@3 dominated by @begin main::@4 main::@3 main::@6 main plot main::@7 plot::@2 plot::@1 main::@10 plot::@3 +plot::@return dominated by @begin main::@4 main::@3 plot::@return main::@6 main plot main::@7 plot::@2 plot::@1 main::@10 plot::@3 +flip dominated by @begin main::@4 main::@3 main::@6 main main::@7 flip +flip::@1 dominated by @begin main::@4 main::@3 main::@6 main main::@7 flip::@1 flip +flip::@2 dominated by @begin main::@4 main::@3 main::@6 main main::@7 flip::@1 flip::@2 flip +flip::@4 dominated by flip::@4 @begin main::@4 main::@3 main::@6 main main::@7 flip::@1 flip::@2 flip +flip::@3 dominated by flip::@4 flip::@3 @begin main::@4 main::@3 main::@6 main main::@7 flip::@1 flip::@2 flip +flip::@return dominated by flip::@4 flip::@3 @begin main::@4 main::@3 main::@6 main main::@7 flip::@return flip::@1 flip::@2 flip +prepare dominated by @begin prepare main +prepare::@1 dominated by @begin prepare main prepare::@1 +prepare::@return dominated by @begin prepare::@return prepare main prepare::@1 Found back edge: Loop head: main::@3 tails: main::@3 blocks: null Found back edge: Loop head: main::@4 tails: main::@4 blocks: null @@ -4122,284 +4122,288 @@ Allocated zp byte:16 to zp byte:16 [ plot::$3 ] Allocated zp byte:17 to zp byte:17 [ flip::$0 ] Allocated zp byte:18 to zp byte:18 [ flip::$4 ] INITIAL ASM -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main - jmp BEND -//SEG2 @END -BEND: + jmp bend +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call prepare param-assignment [ ] - jsr prepare -//SEG5 [2] phi from main to main::@3 -main__B3_from_main: -//SEG6 [2] phi (byte) main::c#2 = (byte) 25 -- zpby1=coby1 - lda #$19 - sta $2 - jmp main__B3 -//SEG7 [2] phi from main::@11 to main::@3 -main__B3_from_B11: -//SEG8 [2] phi (byte) main::c#2 = (byte) 25 -- zpby1=coby1 - lda #$19 - sta $2 - jmp main__B3 -//SEG9 [2] phi from main::@3 to main::@3 -main__B3_from_B3: - jmp main__B3 -//SEG10 [2] phi from main::@6 to main::@3 -main__B3_from_B6: -//SEG11 [2] phi (byte) main::c#2 = (byte) main::c#1 -- register_copy - jmp main__B3 -//SEG12 main::@3 -main__B3: -//SEG13 [3] (byte~) main::$1 ← * (word) 53266 [ main::$1 main::c#2 ] -- zpby1=_star_cowo1 - lda $d012 - sta $e -//SEG14 [4] if((byte~) main::$1!=(byte) 254) goto main::@3 [ main::c#2 ] -- zpby1_neq_coby1_then_la1 - lda $e - cmp #$fe - bne main__B3_from_B3 - jmp main__B4 -//SEG15 main::@4 -main__B4: -//SEG16 [5] (byte~) main::$3 ← * (word) 53266 [ main::$3 main::c#2 ] -- zpby1=_star_cowo1 - lda $d012 - sta $f -//SEG17 [6] if((byte~) main::$3!=(byte) 255) goto main::@4 [ main::c#2 ] -- zpby1_neq_coby1_then_la1 - lda $f - cmp #$ff - bne main__B4 - jmp main__B6 -//SEG18 main::@6 -main__B6: -//SEG19 [7] (byte) main::c#1 ← -- (byte) main::c#2 [ main::c#1 ] -- zpby1=_dec_zpby1 - dec $2 -//SEG20 [8] if((byte) main::c#1!=(byte) 0) goto main::@3 [ main::c#1 ] -- zpby1_neq_0_then_la1 - lda $2 - bne main__B3_from_B6 - jmp main__B7 -//SEG21 main::@7 -main__B7: -//SEG22 [9] call flip param-assignment [ ] - jsr flip - jmp main__B10 -//SEG23 main::@10 -main__B10: -//SEG24 [10] call plot param-assignment [ ] - jsr plot - jmp main__B11 -//SEG25 main::@11 -main__B11: -//SEG26 [11] if(true) goto main::@3 [ ] -- true_then_la1 - jmp main__B3_from_B11 - jmp main__Breturn -//SEG27 main::@return -main__Breturn: -//SEG28 [12] return [ ] - rts +main: { + //SEG4 [1] call prepare param-assignment [ ] + jsr prepare + //SEG5 [2] phi from main to main::@3 + b3_from_main: + //SEG6 [2] phi (byte) main::c#2 = (byte) 25 -- zpby1=coby1 + lda #$19 + sta $2 + jmp b3 + //SEG7 [2] phi from main::@11 to main::@3 + b3_from_b11: + //SEG8 [2] phi (byte) main::c#2 = (byte) 25 -- zpby1=coby1 + lda #$19 + sta $2 + jmp b3 + //SEG9 [2] phi from main::@3 to main::@3 + b3_from_b3: + jmp b3 + //SEG10 [2] phi from main::@6 to main::@3 + b3_from_b6: + //SEG11 [2] phi (byte) main::c#2 = (byte) main::c#1 -- register_copy + jmp b3 + //SEG12 main::@3 + b3: + //SEG13 [3] (byte~) main::$1 ← * (word) 53266 [ main::$1 main::c#2 ] -- zpby1=_star_cowo1 + lda $d012 + sta $e + //SEG14 [4] if((byte~) main::$1!=(byte) 254) goto main::@3 [ main::c#2 ] -- zpby1_neq_coby1_then_la1 + lda $e + cmp #$fe + bne b3_from_b3 + jmp b4 + //SEG15 main::@4 + b4: + //SEG16 [5] (byte~) main::$3 ← * (word) 53266 [ main::$3 main::c#2 ] -- zpby1=_star_cowo1 + lda $d012 + sta $f + //SEG17 [6] if((byte~) main::$3!=(byte) 255) goto main::@4 [ main::c#2 ] -- zpby1_neq_coby1_then_la1 + lda $f + cmp #$ff + bne b4 + jmp b6 + //SEG18 main::@6 + b6: + //SEG19 [7] (byte) main::c#1 ← -- (byte) main::c#2 [ main::c#1 ] -- zpby1=_dec_zpby1 + dec $2 + //SEG20 [8] if((byte) main::c#1!=(byte) 0) goto main::@3 [ main::c#1 ] -- zpby1_neq_0_then_la1 + lda $2 + bne b3_from_b6 + jmp b7 + //SEG21 main::@7 + b7: + //SEG22 [9] call flip param-assignment [ ] + jsr flip + jmp b10 + //SEG23 main::@10 + b10: + //SEG24 [10] call plot param-assignment [ ] + jsr plot + jmp b11 + //SEG25 main::@11 + b11: + //SEG26 [11] if(true) goto main::@3 [ ] -- true_then_la1 + jmp b3_from_b11 + jmp breturn + //SEG27 main::@return + breturn: + //SEG28 [12] return [ ] + rts +} //SEG29 plot -plot: -//SEG30 [13] phi from plot to plot::@1 -plot__B1_from_plot: -//SEG31 [13] phi (byte) plot::y#2 = (byte) 16 -- zpby1=coby1 - lda #$10 - sta $5 -//SEG32 [13] phi (byte*) plot::line#2 = (word) 1236 -- zpptrby1=cowo1 - lda #<$4d4 - sta $3 - lda #>$4d4 - sta $3+$1 -//SEG33 [13] phi (byte) plot::i#3 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $6 - jmp plot__B1 -//SEG34 [13] phi from plot::@3 to plot::@1 -plot__B1_from_B3: -//SEG35 [13] phi (byte) plot::y#2 = (byte) plot::y#1 -- register_copy -//SEG36 [13] phi (byte*) plot::line#2 = (byte*) plot::line#1 -- register_copy -//SEG37 [13] phi (byte) plot::i#3 = (byte) plot::i#1 -- register_copy - jmp plot__B1 -//SEG38 plot::@1 -plot__B1: -//SEG39 [14] phi from plot::@1 to plot::@2 -plot__B2_from_B1: -//SEG40 [14] phi (byte) plot::x#2 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $7 -//SEG41 [14] phi (byte) plot::i#2 = (byte) plot::i#3 -- register_copy - jmp plot__B2 -//SEG42 [14] phi from plot::@2 to plot::@2 -plot__B2_from_B2: -//SEG43 [14] phi (byte) plot::x#2 = (byte) plot::x#1 -- register_copy -//SEG44 [14] phi (byte) plot::i#2 = (byte) plot::i#1 -- register_copy - jmp plot__B2 -//SEG45 plot::@2 -plot__B2: -//SEG46 [15] (byte~) plot::$3 ← (word) 4096 *idx (byte) plot::i#2 [ plot::i#2 plot::line#2 plot::x#2 plot::$3 plot::y#2 ] -- zpby1=cowo1_staridx_zpby2 - ldx $6 - lda $1000,x - sta $10 -//SEG47 [16] *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 [ plot::i#2 plot::line#2 plot::x#2 plot::y#2 ] -- zpptrby1_staridx_zpby1=zpby2 - lda $10 - ldy $7 - sta ($3),y -//SEG48 [17] (byte) plot::i#1 ← ++ (byte) plot::i#2 [ plot::i#1 plot::line#2 plot::x#2 plot::y#2 ] -- zpby1=_inc_zpby1 - inc $6 -//SEG49 [18] (byte) plot::x#1 ← ++ (byte) plot::x#2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- zpby1=_inc_zpby1 - inc $7 -//SEG50 [19] if((byte) plot::x#1<(byte) 16) goto plot::@2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- zpby1_lt_coby1_then_la1 - lda $7 - cmp #$10 - bcc plot__B2_from_B2 - jmp plot__B3 -//SEG51 plot::@3 -plot__B3: -//SEG52 [20] (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 [ plot::i#1 plot::line#1 plot::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 - lda $3 - clc - adc #$28 - sta $3 - bcc !+ - inc $3+$1 -!: -//SEG53 [21] (byte) plot::y#1 ← -- (byte) plot::y#2 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1=_dec_zpby1 - dec $5 -//SEG54 [22] if((byte) plot::y#1!=(byte) 0) goto plot::@1 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1_neq_0_then_la1 - lda $5 - bne plot__B1_from_B3 - jmp plot__Breturn -//SEG55 plot::@return -plot__Breturn: -//SEG56 [23] return [ ] - rts +plot: { + //SEG30 [13] phi from plot to plot::@1 + b1_from_plot: + //SEG31 [13] phi (byte) plot::y#2 = (byte) 16 -- zpby1=coby1 + lda #$10 + sta $5 + //SEG32 [13] phi (byte*) plot::line#2 = (word) 1236 -- zpptrby1=cowo1 + lda #<$4d4 + sta $3 + lda #>$4d4 + sta $3+$1 + //SEG33 [13] phi (byte) plot::i#3 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $6 + jmp b1 + //SEG34 [13] phi from plot::@3 to plot::@1 + b1_from_b3: + //SEG35 [13] phi (byte) plot::y#2 = (byte) plot::y#1 -- register_copy + //SEG36 [13] phi (byte*) plot::line#2 = (byte*) plot::line#1 -- register_copy + //SEG37 [13] phi (byte) plot::i#3 = (byte) plot::i#1 -- register_copy + jmp b1 + //SEG38 plot::@1 + b1: + //SEG39 [14] phi from plot::@1 to plot::@2 + b2_from_b1: + //SEG40 [14] phi (byte) plot::x#2 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $7 + //SEG41 [14] phi (byte) plot::i#2 = (byte) plot::i#3 -- register_copy + jmp b2 + //SEG42 [14] phi from plot::@2 to plot::@2 + b2_from_b2: + //SEG43 [14] phi (byte) plot::x#2 = (byte) plot::x#1 -- register_copy + //SEG44 [14] phi (byte) plot::i#2 = (byte) plot::i#1 -- register_copy + jmp b2 + //SEG45 plot::@2 + b2: + //SEG46 [15] (byte~) plot::$3 ← (word) 4096 *idx (byte) plot::i#2 [ plot::i#2 plot::line#2 plot::x#2 plot::$3 plot::y#2 ] -- zpby1=cowo1_staridx_zpby2 + ldx $6 + lda $1000,x + sta $10 + //SEG47 [16] *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 [ plot::i#2 plot::line#2 plot::x#2 plot::y#2 ] -- zpptrby1_staridx_zpby1=zpby2 + lda $10 + ldy $7 + sta ($3),y + //SEG48 [17] (byte) plot::i#1 ← ++ (byte) plot::i#2 [ plot::i#1 plot::line#2 plot::x#2 plot::y#2 ] -- zpby1=_inc_zpby1 + inc $6 + //SEG49 [18] (byte) plot::x#1 ← ++ (byte) plot::x#2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- zpby1=_inc_zpby1 + inc $7 + //SEG50 [19] if((byte) plot::x#1<(byte) 16) goto plot::@2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- zpby1_lt_coby1_then_la1 + lda $7 + cmp #$10 + bcc b2_from_b2 + jmp b3 + //SEG51 plot::@3 + b3: + //SEG52 [20] (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 [ plot::i#1 plot::line#1 plot::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 + lda $3 + clc + adc #$28 + sta $3 + bcc !+ + inc $3+$1 + !: + //SEG53 [21] (byte) plot::y#1 ← -- (byte) plot::y#2 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1=_dec_zpby1 + dec $5 + //SEG54 [22] if((byte) plot::y#1!=(byte) 0) goto plot::@1 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1_neq_0_then_la1 + lda $5 + bne b1_from_b3 + jmp breturn + //SEG55 plot::@return + breturn: + //SEG56 [23] return [ ] + rts +} //SEG57 flip -flip: -//SEG58 [24] phi from flip to flip::@1 -flip__B1_from_flip: -//SEG59 [24] phi (byte) flip::r#2 = (byte) 16 -- zpby1=coby1 - lda #$10 - sta $8 -//SEG60 [24] phi (byte) flip::dstIdx#5 = (byte) 15 -- zpby1=coby1 - lda #$f - sta $a -//SEG61 [24] phi (byte) flip::srcIdx#3 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $9 - jmp flip__B1 -//SEG62 [24] phi from flip::@4 to flip::@1 -flip__B1_from_B4: -//SEG63 [24] phi (byte) flip::r#2 = (byte) flip::r#1 -- register_copy -//SEG64 [24] phi (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 -- register_copy -//SEG65 [24] phi (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 -- register_copy - jmp flip__B1 -//SEG66 flip::@1 -flip__B1: -//SEG67 [25] phi from flip::@1 to flip::@2 -flip__B2_from_B1: -//SEG68 [25] phi (byte) flip::c#2 = (byte) 16 -- zpby1=coby1 - lda #$10 - sta $b -//SEG69 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 -- register_copy -//SEG70 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 -- register_copy - jmp flip__B2 -//SEG71 [25] phi from flip::@2 to flip::@2 -flip__B2_from_B2: -//SEG72 [25] phi (byte) flip::c#2 = (byte) flip::c#1 -- register_copy -//SEG73 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 -- register_copy -//SEG74 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 -- register_copy - jmp flip__B2 -//SEG75 flip::@2 -flip__B2: -//SEG76 [26] (byte~) flip::$0 ← (word) 4096 *idx (byte) flip::srcIdx#2 [ flip::srcIdx#2 flip::dstIdx#3 flip::$0 flip::c#2 flip::r#2 ] -- zpby1=cowo1_staridx_zpby2 - ldx $9 - lda $1000,x - sta $11 -//SEG77 [27] *((word) 4352 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 [ flip::srcIdx#2 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- cowo1_staridx_zpby1=zpby2 - lda $11 - ldx $a - sta $1100,x -//SEG78 [28] (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 [ flip::srcIdx#1 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- zpby1=_inc_zpby1 - inc $9 -//SEG79 [29] (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#2 flip::r#2 ] -- zpby1=zpby1_plus_coby1 - lda $a - clc - adc #$10 - sta $a -//SEG80 [30] (byte) flip::c#1 ← -- (byte) flip::c#2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1=_dec_zpby1 - dec $b -//SEG81 [31] if((byte) flip::c#1!=(byte) 0) goto flip::@2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1_neq_0_then_la1 - lda $b - bne flip__B2_from_B2 - jmp flip__B4 -//SEG82 flip::@4 -flip__B4: -//SEG83 [32] (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#2 ] -- zpby1=_dec_zpby1 - dec $a -//SEG84 [33] (byte) flip::r#1 ← -- (byte) flip::r#2 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1=_dec_zpby1 - dec $8 -//SEG85 [34] if((byte) flip::r#1!=(byte) 0) goto flip::@1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1_neq_0_then_la1 - lda $8 - bne flip__B1_from_B4 -//SEG86 [35] phi from flip::@4 to flip::@3 -flip__B3_from_B4: -//SEG87 [35] phi (byte) flip::i#2 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $c - jmp flip__B3 -//SEG88 [35] phi from flip::@3 to flip::@3 -flip__B3_from_B3: -//SEG89 [35] phi (byte) flip::i#2 = (byte) flip::i#1 -- register_copy - jmp flip__B3 -//SEG90 flip::@3 -flip__B3: -//SEG91 [36] (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] -- zpby1=cowo1_staridx_zpby2 - ldx $c - lda $1100,x - sta $12 -//SEG92 [37] *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 [ flip::i#2 ] -- cowo1_staridx_zpby1=zpby2 - lda $12 - ldx $c - sta $1000,x -//SEG93 [38] (byte) flip::i#1 ← ++ (byte) flip::i#2 [ flip::i#1 ] -- zpby1=_inc_zpby1 - inc $c -//SEG94 [39] if((byte) flip::i#1!=(byte) 0) goto flip::@3 [ flip::i#1 ] -- zpby1_neq_0_then_la1 - lda $c - bne flip__B3_from_B3 - jmp flip__Breturn -//SEG95 flip::@return -flip__Breturn: -//SEG96 [40] return [ ] - rts +flip: { + //SEG58 [24] phi from flip to flip::@1 + b1_from_flip: + //SEG59 [24] phi (byte) flip::r#2 = (byte) 16 -- zpby1=coby1 + lda #$10 + sta $8 + //SEG60 [24] phi (byte) flip::dstIdx#5 = (byte) 15 -- zpby1=coby1 + lda #$f + sta $a + //SEG61 [24] phi (byte) flip::srcIdx#3 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $9 + jmp b1 + //SEG62 [24] phi from flip::@4 to flip::@1 + b1_from_b4: + //SEG63 [24] phi (byte) flip::r#2 = (byte) flip::r#1 -- register_copy + //SEG64 [24] phi (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 -- register_copy + //SEG65 [24] phi (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 -- register_copy + jmp b1 + //SEG66 flip::@1 + b1: + //SEG67 [25] phi from flip::@1 to flip::@2 + b2_from_b1: + //SEG68 [25] phi (byte) flip::c#2 = (byte) 16 -- zpby1=coby1 + lda #$10 + sta $b + //SEG69 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 -- register_copy + //SEG70 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 -- register_copy + jmp b2 + //SEG71 [25] phi from flip::@2 to flip::@2 + b2_from_b2: + //SEG72 [25] phi (byte) flip::c#2 = (byte) flip::c#1 -- register_copy + //SEG73 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 -- register_copy + //SEG74 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 -- register_copy + jmp b2 + //SEG75 flip::@2 + b2: + //SEG76 [26] (byte~) flip::$0 ← (word) 4096 *idx (byte) flip::srcIdx#2 [ flip::srcIdx#2 flip::dstIdx#3 flip::$0 flip::c#2 flip::r#2 ] -- zpby1=cowo1_staridx_zpby2 + ldx $9 + lda $1000,x + sta $11 + //SEG77 [27] *((word) 4352 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 [ flip::srcIdx#2 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- cowo1_staridx_zpby1=zpby2 + lda $11 + ldx $a + sta $1100,x + //SEG78 [28] (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 [ flip::srcIdx#1 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- zpby1=_inc_zpby1 + inc $9 + //SEG79 [29] (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#2 flip::r#2 ] -- zpby1=zpby1_plus_coby1 + lda $a + clc + adc #$10 + sta $a + //SEG80 [30] (byte) flip::c#1 ← -- (byte) flip::c#2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1=_dec_zpby1 + dec $b + //SEG81 [31] if((byte) flip::c#1!=(byte) 0) goto flip::@2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1_neq_0_then_la1 + lda $b + bne b2_from_b2 + jmp b4 + //SEG82 flip::@4 + b4: + //SEG83 [32] (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#2 ] -- zpby1=_dec_zpby1 + dec $a + //SEG84 [33] (byte) flip::r#1 ← -- (byte) flip::r#2 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1=_dec_zpby1 + dec $8 + //SEG85 [34] if((byte) flip::r#1!=(byte) 0) goto flip::@1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1_neq_0_then_la1 + lda $8 + bne b1_from_b4 + //SEG86 [35] phi from flip::@4 to flip::@3 + b3_from_b4: + //SEG87 [35] phi (byte) flip::i#2 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $c + jmp b3 + //SEG88 [35] phi from flip::@3 to flip::@3 + b3_from_b3: + //SEG89 [35] phi (byte) flip::i#2 = (byte) flip::i#1 -- register_copy + jmp b3 + //SEG90 flip::@3 + b3: + //SEG91 [36] (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] -- zpby1=cowo1_staridx_zpby2 + ldx $c + lda $1100,x + sta $12 + //SEG92 [37] *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 [ flip::i#2 ] -- cowo1_staridx_zpby1=zpby2 + lda $12 + ldx $c + sta $1000,x + //SEG93 [38] (byte) flip::i#1 ← ++ (byte) flip::i#2 [ flip::i#1 ] -- zpby1=_inc_zpby1 + inc $c + //SEG94 [39] if((byte) flip::i#1!=(byte) 0) goto flip::@3 [ flip::i#1 ] -- zpby1_neq_0_then_la1 + lda $c + bne b3_from_b3 + jmp breturn + //SEG95 flip::@return + breturn: + //SEG96 [40] return [ ] + rts +} //SEG97 prepare -prepare: -//SEG98 [41] phi from prepare to prepare::@1 -prepare__B1_from_prepare: -//SEG99 [41] phi (byte) prepare::i#2 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $d - jmp prepare__B1 -//SEG100 [41] phi from prepare::@1 to prepare::@1 -prepare__B1_from_B1: -//SEG101 [41] phi (byte) prepare::i#2 = (byte) prepare::i#1 -- register_copy - jmp prepare__B1 -//SEG102 prepare::@1 -prepare__B1: -//SEG103 [42] *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] -- cowo1_staridx_zpby1=zpby1 - ldx $d - txa - sta $1000,x -//SEG104 [43] (byte) prepare::i#1 ← ++ (byte) prepare::i#2 [ prepare::i#1 ] -- zpby1=_inc_zpby1 - inc $d -//SEG105 [44] if((byte) prepare::i#1!=(byte) 0) goto prepare::@1 [ prepare::i#1 ] -- zpby1_neq_0_then_la1 - lda $d - bne prepare__B1_from_B1 - jmp prepare__Breturn -//SEG106 prepare::@return -prepare__Breturn: -//SEG107 [45] return [ ] - rts +prepare: { + //SEG98 [41] phi from prepare to prepare::@1 + b1_from_prepare: + //SEG99 [41] phi (byte) prepare::i#2 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $d + jmp b1 + //SEG100 [41] phi from prepare::@1 to prepare::@1 + b1_from_b1: + //SEG101 [41] phi (byte) prepare::i#2 = (byte) prepare::i#1 -- register_copy + jmp b1 + //SEG102 prepare::@1 + b1: + //SEG103 [42] *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] -- cowo1_staridx_zpby1=zpby1 + ldx $d + txa + sta $1000,x + //SEG104 [43] (byte) prepare::i#1 ← ++ (byte) prepare::i#2 [ prepare::i#1 ] -- zpby1=_inc_zpby1 + inc $d + //SEG105 [44] if((byte) prepare::i#1!=(byte) 0) goto prepare::@1 [ prepare::i#1 ] -- zpby1_neq_0_then_la1 + lda $d + bne b1_from_b1 + jmp breturn + //SEG106 prepare::@return + breturn: + //SEG107 [45] return [ ] + rts +} Statement [20] (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 [ plot::i#1 plot::line#1 plot::y#2 ] always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp byte:6 [ plot::i#2 plot::i#3 plot::i#1 ] @@ -4444,729 +4448,741 @@ Coalescing zero page register [ zp byte:5 [ plot::y#2 plot::y#1 ] ] with [ zp by Re-allocated ZP register from zp ptr byte:3 to zp ptr byte:2 Re-allocated ZP register from zp byte:5 to zp byte:4 Re-allocated ZP register from zp byte:11 to zp byte:5 -Removing instruction jmp BEND -Removing instruction jmp main__B3 -Removing instruction jmp main__B4 -Removing instruction jmp main__B6 -Removing instruction jmp main__B7 -Removing instruction jmp main__B10 -Removing instruction jmp main__B11 -Removing instruction jmp main__Breturn -Removing instruction jmp plot__B1 -Removing instruction jmp plot__B2 -Removing instruction jmp plot__B3 -Removing instruction jmp plot__Breturn -Removing instruction jmp flip__B1 -Removing instruction jmp flip__B2 -Removing instruction jmp flip__B4 -Removing instruction jmp flip__B3 -Removing instruction jmp flip__Breturn -Removing instruction jmp prepare__B1 -Removing instruction jmp prepare__Breturn +Removing instruction jmp bend +Removing instruction jmp b3 +Removing instruction jmp b4 +Removing instruction jmp b6 +Removing instruction jmp b7 +Removing instruction jmp b10 +Removing instruction jmp b11 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b3 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b4 +Removing instruction jmp b3 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp breturn Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call prepare param-assignment [ ] - jsr prepare -//SEG5 [2] phi from main to main::@3 -main__B3_from_main: -//SEG6 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 - ldx #$19 - jmp main__B3 -//SEG7 [2] phi from main::@11 to main::@3 -main__B3_from_B11: -//SEG8 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 - ldx #$19 - jmp main__B3 -//SEG9 [2] phi from main::@3 to main::@3 -main__B3_from_B3: - jmp main__B3 -//SEG10 [2] phi from main::@6 to main::@3 -main__B3_from_B6: -//SEG11 [2] phi (byte) main::c#2 = (byte) main::c#1 -- register_copy -//SEG12 main::@3 -main__B3: -//SEG13 [3] (byte~) main::$1 ← * (word) 53266 [ main::$1 main::c#2 ] -- aby=_star_cowo1 - lda $d012 -//SEG14 [4] if((byte~) main::$1!=(byte) 254) goto main::@3 [ main::c#2 ] -- aby_neq_coby1_then_la1 - cmp #$fe - bne main__B3_from_B3 -//SEG15 main::@4 -main__B4: -//SEG16 [5] (byte~) main::$3 ← * (word) 53266 [ main::$3 main::c#2 ] -- aby=_star_cowo1 - lda $d012 -//SEG17 [6] if((byte~) main::$3!=(byte) 255) goto main::@4 [ main::c#2 ] -- aby_neq_coby1_then_la1 - cmp #$ff - bne main__B4 -//SEG18 main::@6 -main__B6: -//SEG19 [7] (byte) main::c#1 ← -- (byte) main::c#2 [ main::c#1 ] -- xby=_dec_xby - dex -//SEG20 [8] if((byte) main::c#1!=(byte) 0) goto main::@3 [ main::c#1 ] -- xby_neq_0_then_la1 - cpx #$0 - bne main__B3_from_B6 -//SEG21 main::@7 -main__B7: -//SEG22 [9] call flip param-assignment [ ] - jsr flip -//SEG23 main::@10 -main__B10: -//SEG24 [10] call plot param-assignment [ ] - jsr plot -//SEG25 main::@11 -main__B11: -//SEG26 [11] if(true) goto main::@3 [ ] -- true_then_la1 - jmp main__B3_from_B11 -//SEG27 main::@return -main__Breturn: -//SEG28 [12] return [ ] - rts +main: { + //SEG4 [1] call prepare param-assignment [ ] + jsr prepare + //SEG5 [2] phi from main to main::@3 + b3_from_main: + //SEG6 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 + ldx #$19 + jmp b3 + //SEG7 [2] phi from main::@11 to main::@3 + b3_from_b11: + //SEG8 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 + ldx #$19 + jmp b3 + //SEG9 [2] phi from main::@3 to main::@3 + b3_from_b3: + jmp b3 + //SEG10 [2] phi from main::@6 to main::@3 + b3_from_b6: + //SEG11 [2] phi (byte) main::c#2 = (byte) main::c#1 -- register_copy + //SEG12 main::@3 + b3: + //SEG13 [3] (byte~) main::$1 ← * (word) 53266 [ main::$1 main::c#2 ] -- aby=_star_cowo1 + lda $d012 + //SEG14 [4] if((byte~) main::$1!=(byte) 254) goto main::@3 [ main::c#2 ] -- aby_neq_coby1_then_la1 + cmp #$fe + bne b3_from_b3 + //SEG15 main::@4 + b4: + //SEG16 [5] (byte~) main::$3 ← * (word) 53266 [ main::$3 main::c#2 ] -- aby=_star_cowo1 + lda $d012 + //SEG17 [6] if((byte~) main::$3!=(byte) 255) goto main::@4 [ main::c#2 ] -- aby_neq_coby1_then_la1 + cmp #$ff + bne b4 + //SEG18 main::@6 + b6: + //SEG19 [7] (byte) main::c#1 ← -- (byte) main::c#2 [ main::c#1 ] -- xby=_dec_xby + dex + //SEG20 [8] if((byte) main::c#1!=(byte) 0) goto main::@3 [ main::c#1 ] -- xby_neq_0_then_la1 + cpx #$0 + bne b3_from_b6 + //SEG21 main::@7 + b7: + //SEG22 [9] call flip param-assignment [ ] + jsr flip + //SEG23 main::@10 + b10: + //SEG24 [10] call plot param-assignment [ ] + jsr plot + //SEG25 main::@11 + b11: + //SEG26 [11] if(true) goto main::@3 [ ] -- true_then_la1 + jmp b3_from_b11 + //SEG27 main::@return + breturn: + //SEG28 [12] return [ ] + rts +} //SEG29 plot -plot: -//SEG30 [13] phi from plot to plot::@1 -plot__B1_from_plot: -//SEG31 [13] phi (byte) plot::y#2 = (byte) 16 -- zpby1=coby1 - lda #$10 - sta $4 -//SEG32 [13] phi (byte*) plot::line#2 = (word) 1236 -- zpptrby1=cowo1 - lda #<$4d4 - sta $2 - lda #>$4d4 - sta $2+$1 -//SEG33 [13] phi (byte) plot::i#3 = (byte) 0 -- xby=coby1 - ldx #$0 - jmp plot__B1 -//SEG34 [13] phi from plot::@3 to plot::@1 -plot__B1_from_B3: -//SEG35 [13] phi (byte) plot::y#2 = (byte) plot::y#1 -- register_copy -//SEG36 [13] phi (byte*) plot::line#2 = (byte*) plot::line#1 -- register_copy -//SEG37 [13] phi (byte) plot::i#3 = (byte) plot::i#1 -- register_copy -//SEG38 plot::@1 -plot__B1: -//SEG39 [14] phi from plot::@1 to plot::@2 -plot__B2_from_B1: -//SEG40 [14] phi (byte) plot::x#2 = (byte) 0 -- yby=coby1 - ldy #$0 -//SEG41 [14] phi (byte) plot::i#2 = (byte) plot::i#3 -- register_copy - jmp plot__B2 -//SEG42 [14] phi from plot::@2 to plot::@2 -plot__B2_from_B2: -//SEG43 [14] phi (byte) plot::x#2 = (byte) plot::x#1 -- register_copy -//SEG44 [14] phi (byte) plot::i#2 = (byte) plot::i#1 -- register_copy -//SEG45 plot::@2 -plot__B2: -//SEG46 [15] (byte~) plot::$3 ← (word) 4096 *idx (byte) plot::i#2 [ plot::i#2 plot::line#2 plot::x#2 plot::$3 plot::y#2 ] -- aby=cowo1_staridx_xby - lda $1000,x -//SEG47 [16] *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 [ plot::i#2 plot::line#2 plot::x#2 plot::y#2 ] -- zpptrby1_staridx_yby=aby - sta ($2),y -//SEG48 [17] (byte) plot::i#1 ← ++ (byte) plot::i#2 [ plot::i#1 plot::line#2 plot::x#2 plot::y#2 ] -- xby=_inc_xby - inx -//SEG49 [18] (byte) plot::x#1 ← ++ (byte) plot::x#2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby=_inc_yby - iny -//SEG50 [19] if((byte) plot::x#1<(byte) 16) goto plot::@2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby_lt_coby1_then_la1 - cpy #$10 - bcc plot__B2_from_B2 -//SEG51 plot::@3 -plot__B3: -//SEG52 [20] (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 [ plot::i#1 plot::line#1 plot::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 - lda $2 - clc - adc #$28 - sta $2 - bcc !+ - inc $2+$1 -!: -//SEG53 [21] (byte) plot::y#1 ← -- (byte) plot::y#2 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1=_dec_zpby1 - dec $4 -//SEG54 [22] if((byte) plot::y#1!=(byte) 0) goto plot::@1 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1_neq_0_then_la1 - lda $4 - bne plot__B1_from_B3 -//SEG55 plot::@return -plot__Breturn: -//SEG56 [23] return [ ] - rts +plot: { + //SEG30 [13] phi from plot to plot::@1 + b1_from_plot: + //SEG31 [13] phi (byte) plot::y#2 = (byte) 16 -- zpby1=coby1 + lda #$10 + sta $4 + //SEG32 [13] phi (byte*) plot::line#2 = (word) 1236 -- zpptrby1=cowo1 + lda #<$4d4 + sta $2 + lda #>$4d4 + sta $2+$1 + //SEG33 [13] phi (byte) plot::i#3 = (byte) 0 -- xby=coby1 + ldx #$0 + jmp b1 + //SEG34 [13] phi from plot::@3 to plot::@1 + b1_from_b3: + //SEG35 [13] phi (byte) plot::y#2 = (byte) plot::y#1 -- register_copy + //SEG36 [13] phi (byte*) plot::line#2 = (byte*) plot::line#1 -- register_copy + //SEG37 [13] phi (byte) plot::i#3 = (byte) plot::i#1 -- register_copy + //SEG38 plot::@1 + b1: + //SEG39 [14] phi from plot::@1 to plot::@2 + b2_from_b1: + //SEG40 [14] phi (byte) plot::x#2 = (byte) 0 -- yby=coby1 + ldy #$0 + //SEG41 [14] phi (byte) plot::i#2 = (byte) plot::i#3 -- register_copy + jmp b2 + //SEG42 [14] phi from plot::@2 to plot::@2 + b2_from_b2: + //SEG43 [14] phi (byte) plot::x#2 = (byte) plot::x#1 -- register_copy + //SEG44 [14] phi (byte) plot::i#2 = (byte) plot::i#1 -- register_copy + //SEG45 plot::@2 + b2: + //SEG46 [15] (byte~) plot::$3 ← (word) 4096 *idx (byte) plot::i#2 [ plot::i#2 plot::line#2 plot::x#2 plot::$3 plot::y#2 ] -- aby=cowo1_staridx_xby + lda $1000,x + //SEG47 [16] *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 [ plot::i#2 plot::line#2 plot::x#2 plot::y#2 ] -- zpptrby1_staridx_yby=aby + sta ($2),y + //SEG48 [17] (byte) plot::i#1 ← ++ (byte) plot::i#2 [ plot::i#1 plot::line#2 plot::x#2 plot::y#2 ] -- xby=_inc_xby + inx + //SEG49 [18] (byte) plot::x#1 ← ++ (byte) plot::x#2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby=_inc_yby + iny + //SEG50 [19] if((byte) plot::x#1<(byte) 16) goto plot::@2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby_lt_coby1_then_la1 + cpy #$10 + bcc b2_from_b2 + //SEG51 plot::@3 + b3: + //SEG52 [20] (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 [ plot::i#1 plot::line#1 plot::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 + lda $2 + clc + adc #$28 + sta $2 + bcc !+ + inc $2+$1 + !: + //SEG53 [21] (byte) plot::y#1 ← -- (byte) plot::y#2 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1=_dec_zpby1 + dec $4 + //SEG54 [22] if((byte) plot::y#1!=(byte) 0) goto plot::@1 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1_neq_0_then_la1 + lda $4 + bne b1_from_b3 + //SEG55 plot::@return + breturn: + //SEG56 [23] return [ ] + rts +} //SEG57 flip -flip: -//SEG58 [24] phi from flip to flip::@1 -flip__B1_from_flip: -//SEG59 [24] phi (byte) flip::r#2 = (byte) 16 -- zpby1=coby1 - lda #$10 - sta $4 -//SEG60 [24] phi (byte) flip::dstIdx#5 = (byte) 15 -- yby=coby1 - ldy #$f -//SEG61 [24] phi (byte) flip::srcIdx#3 = (byte) 0 -- xby=coby1 - ldx #$0 - jmp flip__B1 -//SEG62 [24] phi from flip::@4 to flip::@1 -flip__B1_from_B4: -//SEG63 [24] phi (byte) flip::r#2 = (byte) flip::r#1 -- register_copy -//SEG64 [24] phi (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 -- register_copy -//SEG65 [24] phi (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 -- register_copy -//SEG66 flip::@1 -flip__B1: -//SEG67 [25] phi from flip::@1 to flip::@2 -flip__B2_from_B1: -//SEG68 [25] phi (byte) flip::c#2 = (byte) 16 -- zpby1=coby1 - lda #$10 - sta $5 -//SEG69 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 -- register_copy -//SEG70 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 -- register_copy - jmp flip__B2 -//SEG71 [25] phi from flip::@2 to flip::@2 -flip__B2_from_B2: -//SEG72 [25] phi (byte) flip::c#2 = (byte) flip::c#1 -- register_copy -//SEG73 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 -- register_copy -//SEG74 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 -- register_copy -//SEG75 flip::@2 -flip__B2: -//SEG76 [26] (byte~) flip::$0 ← (word) 4096 *idx (byte) flip::srcIdx#2 [ flip::srcIdx#2 flip::dstIdx#3 flip::$0 flip::c#2 flip::r#2 ] -- aby=cowo1_staridx_xby - lda $1000,x -//SEG77 [27] *((word) 4352 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 [ flip::srcIdx#2 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- cowo1_staridx_yby=aby - sta $1100,y -//SEG78 [28] (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 [ flip::srcIdx#1 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- xby=_inc_xby - inx -//SEG79 [29] (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#2 flip::r#2 ] -- yby=yby_plus_coby1 - tya - clc - adc #$10 - tay -//SEG80 [30] (byte) flip::c#1 ← -- (byte) flip::c#2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1=_dec_zpby1 - dec $5 -//SEG81 [31] if((byte) flip::c#1!=(byte) 0) goto flip::@2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1_neq_0_then_la1 - lda $5 - bne flip__B2_from_B2 -//SEG82 flip::@4 -flip__B4: -//SEG83 [32] (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#2 ] -- yby=_dec_yby - dey -//SEG84 [33] (byte) flip::r#1 ← -- (byte) flip::r#2 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1=_dec_zpby1 - dec $4 -//SEG85 [34] if((byte) flip::r#1!=(byte) 0) goto flip::@1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1_neq_0_then_la1 - lda $4 - bne flip__B1_from_B4 -//SEG86 [35] phi from flip::@4 to flip::@3 -flip__B3_from_B4: -//SEG87 [35] phi (byte) flip::i#2 = (byte) 0 -- xby=coby1 - ldx #$0 - jmp flip__B3 -//SEG88 [35] phi from flip::@3 to flip::@3 -flip__B3_from_B3: -//SEG89 [35] phi (byte) flip::i#2 = (byte) flip::i#1 -- register_copy -//SEG90 flip::@3 -flip__B3: -//SEG91 [36] (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] -- aby=cowo1_staridx_xby - lda $1100,x -//SEG92 [37] *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 [ flip::i#2 ] -- cowo1_staridx_xby=aby - sta $1000,x -//SEG93 [38] (byte) flip::i#1 ← ++ (byte) flip::i#2 [ flip::i#1 ] -- xby=_inc_xby - inx -//SEG94 [39] if((byte) flip::i#1!=(byte) 0) goto flip::@3 [ flip::i#1 ] -- xby_neq_0_then_la1 - cpx #$0 - bne flip__B3_from_B3 -//SEG95 flip::@return -flip__Breturn: -//SEG96 [40] return [ ] - rts +flip: { + //SEG58 [24] phi from flip to flip::@1 + b1_from_flip: + //SEG59 [24] phi (byte) flip::r#2 = (byte) 16 -- zpby1=coby1 + lda #$10 + sta $4 + //SEG60 [24] phi (byte) flip::dstIdx#5 = (byte) 15 -- yby=coby1 + ldy #$f + //SEG61 [24] phi (byte) flip::srcIdx#3 = (byte) 0 -- xby=coby1 + ldx #$0 + jmp b1 + //SEG62 [24] phi from flip::@4 to flip::@1 + b1_from_b4: + //SEG63 [24] phi (byte) flip::r#2 = (byte) flip::r#1 -- register_copy + //SEG64 [24] phi (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 -- register_copy + //SEG65 [24] phi (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 -- register_copy + //SEG66 flip::@1 + b1: + //SEG67 [25] phi from flip::@1 to flip::@2 + b2_from_b1: + //SEG68 [25] phi (byte) flip::c#2 = (byte) 16 -- zpby1=coby1 + lda #$10 + sta $5 + //SEG69 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 -- register_copy + //SEG70 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 -- register_copy + jmp b2 + //SEG71 [25] phi from flip::@2 to flip::@2 + b2_from_b2: + //SEG72 [25] phi (byte) flip::c#2 = (byte) flip::c#1 -- register_copy + //SEG73 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 -- register_copy + //SEG74 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 -- register_copy + //SEG75 flip::@2 + b2: + //SEG76 [26] (byte~) flip::$0 ← (word) 4096 *idx (byte) flip::srcIdx#2 [ flip::srcIdx#2 flip::dstIdx#3 flip::$0 flip::c#2 flip::r#2 ] -- aby=cowo1_staridx_xby + lda $1000,x + //SEG77 [27] *((word) 4352 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 [ flip::srcIdx#2 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- cowo1_staridx_yby=aby + sta $1100,y + //SEG78 [28] (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 [ flip::srcIdx#1 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- xby=_inc_xby + inx + //SEG79 [29] (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#2 flip::r#2 ] -- yby=yby_plus_coby1 + tya + clc + adc #$10 + tay + //SEG80 [30] (byte) flip::c#1 ← -- (byte) flip::c#2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1=_dec_zpby1 + dec $5 + //SEG81 [31] if((byte) flip::c#1!=(byte) 0) goto flip::@2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1_neq_0_then_la1 + lda $5 + bne b2_from_b2 + //SEG82 flip::@4 + b4: + //SEG83 [32] (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#2 ] -- yby=_dec_yby + dey + //SEG84 [33] (byte) flip::r#1 ← -- (byte) flip::r#2 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1=_dec_zpby1 + dec $4 + //SEG85 [34] if((byte) flip::r#1!=(byte) 0) goto flip::@1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1_neq_0_then_la1 + lda $4 + bne b1_from_b4 + //SEG86 [35] phi from flip::@4 to flip::@3 + b3_from_b4: + //SEG87 [35] phi (byte) flip::i#2 = (byte) 0 -- xby=coby1 + ldx #$0 + jmp b3 + //SEG88 [35] phi from flip::@3 to flip::@3 + b3_from_b3: + //SEG89 [35] phi (byte) flip::i#2 = (byte) flip::i#1 -- register_copy + //SEG90 flip::@3 + b3: + //SEG91 [36] (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] -- aby=cowo1_staridx_xby + lda $1100,x + //SEG92 [37] *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 [ flip::i#2 ] -- cowo1_staridx_xby=aby + sta $1000,x + //SEG93 [38] (byte) flip::i#1 ← ++ (byte) flip::i#2 [ flip::i#1 ] -- xby=_inc_xby + inx + //SEG94 [39] if((byte) flip::i#1!=(byte) 0) goto flip::@3 [ flip::i#1 ] -- xby_neq_0_then_la1 + cpx #$0 + bne b3_from_b3 + //SEG95 flip::@return + breturn: + //SEG96 [40] return [ ] + rts +} //SEG97 prepare -prepare: -//SEG98 [41] phi from prepare to prepare::@1 -prepare__B1_from_prepare: -//SEG99 [41] phi (byte) prepare::i#2 = (byte) 0 -- xby=coby1 - ldx #$0 - jmp prepare__B1 -//SEG100 [41] phi from prepare::@1 to prepare::@1 -prepare__B1_from_B1: -//SEG101 [41] phi (byte) prepare::i#2 = (byte) prepare::i#1 -- register_copy -//SEG102 prepare::@1 -prepare__B1: -//SEG103 [42] *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] -- cowo1_staridx_xby=xby - txa - sta $1000,x -//SEG104 [43] (byte) prepare::i#1 ← ++ (byte) prepare::i#2 [ prepare::i#1 ] -- xby=_inc_xby - inx -//SEG105 [44] if((byte) prepare::i#1!=(byte) 0) goto prepare::@1 [ prepare::i#1 ] -- xby_neq_0_then_la1 - cpx #$0 - bne prepare__B1_from_B1 -//SEG106 prepare::@return -prepare__Breturn: -//SEG107 [45] return [ ] - rts +prepare: { + //SEG98 [41] phi from prepare to prepare::@1 + b1_from_prepare: + //SEG99 [41] phi (byte) prepare::i#2 = (byte) 0 -- xby=coby1 + ldx #$0 + jmp b1 + //SEG100 [41] phi from prepare::@1 to prepare::@1 + b1_from_b1: + //SEG101 [41] phi (byte) prepare::i#2 = (byte) prepare::i#1 -- register_copy + //SEG102 prepare::@1 + b1: + //SEG103 [42] *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] -- cowo1_staridx_xby=xby + txa + sta $1000,x + //SEG104 [43] (byte) prepare::i#1 ← ++ (byte) prepare::i#2 [ prepare::i#1 ] -- xby=_inc_xby + inx + //SEG105 [44] if((byte) prepare::i#1!=(byte) 0) goto prepare::@1 [ prepare::i#1 ] -- xby_neq_0_then_la1 + cpx #$0 + bne b1_from_b1 + //SEG106 prepare::@return + breturn: + //SEG107 [45] return [ ] + rts +} -Removing instruction jmp main__B3 -Removing instruction jmp plot__B1 -Removing instruction jmp plot__B2 -Removing instruction jmp flip__B1 -Removing instruction jmp flip__B2 -Removing instruction jmp flip__B3 -Removing instruction jmp prepare__B1 +Removing instruction jmp b3 +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b3 +Removing instruction jmp b1 Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call prepare param-assignment [ ] - jsr prepare -//SEG5 [2] phi from main to main::@3 -main__B3_from_main: -//SEG6 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 - ldx #$19 - jmp main__B3 -//SEG7 [2] phi from main::@11 to main::@3 -main__B3_from_B11: -//SEG8 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 - ldx #$19 - jmp main__B3 -//SEG9 [2] phi from main::@3 to main::@3 -main__B3_from_B3: -//SEG10 [2] phi from main::@6 to main::@3 -main__B3_from_B6: -//SEG11 [2] phi (byte) main::c#2 = (byte) main::c#1 -- register_copy -//SEG12 main::@3 -main__B3: -//SEG13 [3] (byte~) main::$1 ← * (word) 53266 [ main::$1 main::c#2 ] -- aby=_star_cowo1 - lda $d012 -//SEG14 [4] if((byte~) main::$1!=(byte) 254) goto main::@3 [ main::c#2 ] -- aby_neq_coby1_then_la1 - cmp #$fe - bne main__B3_from_B3 -//SEG15 main::@4 -main__B4: -//SEG16 [5] (byte~) main::$3 ← * (word) 53266 [ main::$3 main::c#2 ] -- aby=_star_cowo1 - lda $d012 -//SEG17 [6] if((byte~) main::$3!=(byte) 255) goto main::@4 [ main::c#2 ] -- aby_neq_coby1_then_la1 - cmp #$ff - bne main__B4 -//SEG18 main::@6 -main__B6: -//SEG19 [7] (byte) main::c#1 ← -- (byte) main::c#2 [ main::c#1 ] -- xby=_dec_xby - dex -//SEG20 [8] if((byte) main::c#1!=(byte) 0) goto main::@3 [ main::c#1 ] -- xby_neq_0_then_la1 - cpx #$0 - bne main__B3_from_B6 -//SEG21 main::@7 -main__B7: -//SEG22 [9] call flip param-assignment [ ] - jsr flip -//SEG23 main::@10 -main__B10: -//SEG24 [10] call plot param-assignment [ ] - jsr plot -//SEG25 main::@11 -main__B11: -//SEG26 [11] if(true) goto main::@3 [ ] -- true_then_la1 - jmp main__B3_from_B11 -//SEG27 main::@return -main__Breturn: -//SEG28 [12] return [ ] - rts +main: { + //SEG4 [1] call prepare param-assignment [ ] + jsr prepare + //SEG5 [2] phi from main to main::@3 + b3_from_main: + //SEG6 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 + ldx #$19 + jmp b3 + //SEG7 [2] phi from main::@11 to main::@3 + b3_from_b11: + //SEG8 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 + ldx #$19 + jmp b3 + //SEG9 [2] phi from main::@3 to main::@3 + b3_from_b3: + //SEG10 [2] phi from main::@6 to main::@3 + b3_from_b6: + //SEG11 [2] phi (byte) main::c#2 = (byte) main::c#1 -- register_copy + //SEG12 main::@3 + b3: + //SEG13 [3] (byte~) main::$1 ← * (word) 53266 [ main::$1 main::c#2 ] -- aby=_star_cowo1 + lda $d012 + //SEG14 [4] if((byte~) main::$1!=(byte) 254) goto main::@3 [ main::c#2 ] -- aby_neq_coby1_then_la1 + cmp #$fe + bne b3_from_b3 + //SEG15 main::@4 + b4: + //SEG16 [5] (byte~) main::$3 ← * (word) 53266 [ main::$3 main::c#2 ] -- aby=_star_cowo1 + lda $d012 + //SEG17 [6] if((byte~) main::$3!=(byte) 255) goto main::@4 [ main::c#2 ] -- aby_neq_coby1_then_la1 + cmp #$ff + bne b4 + //SEG18 main::@6 + b6: + //SEG19 [7] (byte) main::c#1 ← -- (byte) main::c#2 [ main::c#1 ] -- xby=_dec_xby + dex + //SEG20 [8] if((byte) main::c#1!=(byte) 0) goto main::@3 [ main::c#1 ] -- xby_neq_0_then_la1 + cpx #$0 + bne b3_from_b6 + //SEG21 main::@7 + b7: + //SEG22 [9] call flip param-assignment [ ] + jsr flip + //SEG23 main::@10 + b10: + //SEG24 [10] call plot param-assignment [ ] + jsr plot + //SEG25 main::@11 + b11: + //SEG26 [11] if(true) goto main::@3 [ ] -- true_then_la1 + jmp b3_from_b11 + //SEG27 main::@return + breturn: + //SEG28 [12] return [ ] + rts +} //SEG29 plot -plot: -//SEG30 [13] phi from plot to plot::@1 -plot__B1_from_plot: -//SEG31 [13] phi (byte) plot::y#2 = (byte) 16 -- zpby1=coby1 - lda #$10 - sta $4 -//SEG32 [13] phi (byte*) plot::line#2 = (word) 1236 -- zpptrby1=cowo1 - lda #<$4d4 - sta $2 - lda #>$4d4 - sta $2+$1 -//SEG33 [13] phi (byte) plot::i#3 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG34 [13] phi from plot::@3 to plot::@1 -plot__B1_from_B3: -//SEG35 [13] phi (byte) plot::y#2 = (byte) plot::y#1 -- register_copy -//SEG36 [13] phi (byte*) plot::line#2 = (byte*) plot::line#1 -- register_copy -//SEG37 [13] phi (byte) plot::i#3 = (byte) plot::i#1 -- register_copy -//SEG38 plot::@1 -plot__B1: -//SEG39 [14] phi from plot::@1 to plot::@2 -plot__B2_from_B1: -//SEG40 [14] phi (byte) plot::x#2 = (byte) 0 -- yby=coby1 - ldy #$0 -//SEG41 [14] phi (byte) plot::i#2 = (byte) plot::i#3 -- register_copy -//SEG42 [14] phi from plot::@2 to plot::@2 -plot__B2_from_B2: -//SEG43 [14] phi (byte) plot::x#2 = (byte) plot::x#1 -- register_copy -//SEG44 [14] phi (byte) plot::i#2 = (byte) plot::i#1 -- register_copy -//SEG45 plot::@2 -plot__B2: -//SEG46 [15] (byte~) plot::$3 ← (word) 4096 *idx (byte) plot::i#2 [ plot::i#2 plot::line#2 plot::x#2 plot::$3 plot::y#2 ] -- aby=cowo1_staridx_xby - lda $1000,x -//SEG47 [16] *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 [ plot::i#2 plot::line#2 plot::x#2 plot::y#2 ] -- zpptrby1_staridx_yby=aby - sta ($2),y -//SEG48 [17] (byte) plot::i#1 ← ++ (byte) plot::i#2 [ plot::i#1 plot::line#2 plot::x#2 plot::y#2 ] -- xby=_inc_xby - inx -//SEG49 [18] (byte) plot::x#1 ← ++ (byte) plot::x#2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby=_inc_yby - iny -//SEG50 [19] if((byte) plot::x#1<(byte) 16) goto plot::@2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby_lt_coby1_then_la1 - cpy #$10 - bcc plot__B2_from_B2 -//SEG51 plot::@3 -plot__B3: -//SEG52 [20] (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 [ plot::i#1 plot::line#1 plot::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 - lda $2 - clc - adc #$28 - sta $2 - bcc !+ - inc $2+$1 -!: -//SEG53 [21] (byte) plot::y#1 ← -- (byte) plot::y#2 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1=_dec_zpby1 - dec $4 -//SEG54 [22] if((byte) plot::y#1!=(byte) 0) goto plot::@1 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1_neq_0_then_la1 - lda $4 - bne plot__B1_from_B3 -//SEG55 plot::@return -plot__Breturn: -//SEG56 [23] return [ ] - rts +plot: { + //SEG30 [13] phi from plot to plot::@1 + b1_from_plot: + //SEG31 [13] phi (byte) plot::y#2 = (byte) 16 -- zpby1=coby1 + lda #$10 + sta $4 + //SEG32 [13] phi (byte*) plot::line#2 = (word) 1236 -- zpptrby1=cowo1 + lda #<$4d4 + sta $2 + lda #>$4d4 + sta $2+$1 + //SEG33 [13] phi (byte) plot::i#3 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG34 [13] phi from plot::@3 to plot::@1 + b1_from_b3: + //SEG35 [13] phi (byte) plot::y#2 = (byte) plot::y#1 -- register_copy + //SEG36 [13] phi (byte*) plot::line#2 = (byte*) plot::line#1 -- register_copy + //SEG37 [13] phi (byte) plot::i#3 = (byte) plot::i#1 -- register_copy + //SEG38 plot::@1 + b1: + //SEG39 [14] phi from plot::@1 to plot::@2 + b2_from_b1: + //SEG40 [14] phi (byte) plot::x#2 = (byte) 0 -- yby=coby1 + ldy #$0 + //SEG41 [14] phi (byte) plot::i#2 = (byte) plot::i#3 -- register_copy + //SEG42 [14] phi from plot::@2 to plot::@2 + b2_from_b2: + //SEG43 [14] phi (byte) plot::x#2 = (byte) plot::x#1 -- register_copy + //SEG44 [14] phi (byte) plot::i#2 = (byte) plot::i#1 -- register_copy + //SEG45 plot::@2 + b2: + //SEG46 [15] (byte~) plot::$3 ← (word) 4096 *idx (byte) plot::i#2 [ plot::i#2 plot::line#2 plot::x#2 plot::$3 plot::y#2 ] -- aby=cowo1_staridx_xby + lda $1000,x + //SEG47 [16] *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 [ plot::i#2 plot::line#2 plot::x#2 plot::y#2 ] -- zpptrby1_staridx_yby=aby + sta ($2),y + //SEG48 [17] (byte) plot::i#1 ← ++ (byte) plot::i#2 [ plot::i#1 plot::line#2 plot::x#2 plot::y#2 ] -- xby=_inc_xby + inx + //SEG49 [18] (byte) plot::x#1 ← ++ (byte) plot::x#2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby=_inc_yby + iny + //SEG50 [19] if((byte) plot::x#1<(byte) 16) goto plot::@2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby_lt_coby1_then_la1 + cpy #$10 + bcc b2_from_b2 + //SEG51 plot::@3 + b3: + //SEG52 [20] (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 [ plot::i#1 plot::line#1 plot::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 + lda $2 + clc + adc #$28 + sta $2 + bcc !+ + inc $2+$1 + !: + //SEG53 [21] (byte) plot::y#1 ← -- (byte) plot::y#2 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1=_dec_zpby1 + dec $4 + //SEG54 [22] if((byte) plot::y#1!=(byte) 0) goto plot::@1 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1_neq_0_then_la1 + lda $4 + bne b1_from_b3 + //SEG55 plot::@return + breturn: + //SEG56 [23] return [ ] + rts +} //SEG57 flip -flip: -//SEG58 [24] phi from flip to flip::@1 -flip__B1_from_flip: -//SEG59 [24] phi (byte) flip::r#2 = (byte) 16 -- zpby1=coby1 - lda #$10 - sta $4 -//SEG60 [24] phi (byte) flip::dstIdx#5 = (byte) 15 -- yby=coby1 - ldy #$f -//SEG61 [24] phi (byte) flip::srcIdx#3 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG62 [24] phi from flip::@4 to flip::@1 -flip__B1_from_B4: -//SEG63 [24] phi (byte) flip::r#2 = (byte) flip::r#1 -- register_copy -//SEG64 [24] phi (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 -- register_copy -//SEG65 [24] phi (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 -- register_copy -//SEG66 flip::@1 -flip__B1: -//SEG67 [25] phi from flip::@1 to flip::@2 -flip__B2_from_B1: -//SEG68 [25] phi (byte) flip::c#2 = (byte) 16 -- zpby1=coby1 - lda #$10 - sta $5 -//SEG69 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 -- register_copy -//SEG70 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 -- register_copy -//SEG71 [25] phi from flip::@2 to flip::@2 -flip__B2_from_B2: -//SEG72 [25] phi (byte) flip::c#2 = (byte) flip::c#1 -- register_copy -//SEG73 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 -- register_copy -//SEG74 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 -- register_copy -//SEG75 flip::@2 -flip__B2: -//SEG76 [26] (byte~) flip::$0 ← (word) 4096 *idx (byte) flip::srcIdx#2 [ flip::srcIdx#2 flip::dstIdx#3 flip::$0 flip::c#2 flip::r#2 ] -- aby=cowo1_staridx_xby - lda $1000,x -//SEG77 [27] *((word) 4352 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 [ flip::srcIdx#2 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- cowo1_staridx_yby=aby - sta $1100,y -//SEG78 [28] (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 [ flip::srcIdx#1 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- xby=_inc_xby - inx -//SEG79 [29] (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#2 flip::r#2 ] -- yby=yby_plus_coby1 - tya - clc - adc #$10 - tay -//SEG80 [30] (byte) flip::c#1 ← -- (byte) flip::c#2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1=_dec_zpby1 - dec $5 -//SEG81 [31] if((byte) flip::c#1!=(byte) 0) goto flip::@2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1_neq_0_then_la1 - lda $5 - bne flip__B2_from_B2 -//SEG82 flip::@4 -flip__B4: -//SEG83 [32] (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#2 ] -- yby=_dec_yby - dey -//SEG84 [33] (byte) flip::r#1 ← -- (byte) flip::r#2 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1=_dec_zpby1 - dec $4 -//SEG85 [34] if((byte) flip::r#1!=(byte) 0) goto flip::@1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1_neq_0_then_la1 - lda $4 - bne flip__B1_from_B4 -//SEG86 [35] phi from flip::@4 to flip::@3 -flip__B3_from_B4: -//SEG87 [35] phi (byte) flip::i#2 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG88 [35] phi from flip::@3 to flip::@3 -flip__B3_from_B3: -//SEG89 [35] phi (byte) flip::i#2 = (byte) flip::i#1 -- register_copy -//SEG90 flip::@3 -flip__B3: -//SEG91 [36] (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] -- aby=cowo1_staridx_xby - lda $1100,x -//SEG92 [37] *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 [ flip::i#2 ] -- cowo1_staridx_xby=aby - sta $1000,x -//SEG93 [38] (byte) flip::i#1 ← ++ (byte) flip::i#2 [ flip::i#1 ] -- xby=_inc_xby - inx -//SEG94 [39] if((byte) flip::i#1!=(byte) 0) goto flip::@3 [ flip::i#1 ] -- xby_neq_0_then_la1 - cpx #$0 - bne flip__B3_from_B3 -//SEG95 flip::@return -flip__Breturn: -//SEG96 [40] return [ ] - rts +flip: { + //SEG58 [24] phi from flip to flip::@1 + b1_from_flip: + //SEG59 [24] phi (byte) flip::r#2 = (byte) 16 -- zpby1=coby1 + lda #$10 + sta $4 + //SEG60 [24] phi (byte) flip::dstIdx#5 = (byte) 15 -- yby=coby1 + ldy #$f + //SEG61 [24] phi (byte) flip::srcIdx#3 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG62 [24] phi from flip::@4 to flip::@1 + b1_from_b4: + //SEG63 [24] phi (byte) flip::r#2 = (byte) flip::r#1 -- register_copy + //SEG64 [24] phi (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 -- register_copy + //SEG65 [24] phi (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 -- register_copy + //SEG66 flip::@1 + b1: + //SEG67 [25] phi from flip::@1 to flip::@2 + b2_from_b1: + //SEG68 [25] phi (byte) flip::c#2 = (byte) 16 -- zpby1=coby1 + lda #$10 + sta $5 + //SEG69 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 -- register_copy + //SEG70 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 -- register_copy + //SEG71 [25] phi from flip::@2 to flip::@2 + b2_from_b2: + //SEG72 [25] phi (byte) flip::c#2 = (byte) flip::c#1 -- register_copy + //SEG73 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 -- register_copy + //SEG74 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 -- register_copy + //SEG75 flip::@2 + b2: + //SEG76 [26] (byte~) flip::$0 ← (word) 4096 *idx (byte) flip::srcIdx#2 [ flip::srcIdx#2 flip::dstIdx#3 flip::$0 flip::c#2 flip::r#2 ] -- aby=cowo1_staridx_xby + lda $1000,x + //SEG77 [27] *((word) 4352 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 [ flip::srcIdx#2 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- cowo1_staridx_yby=aby + sta $1100,y + //SEG78 [28] (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 [ flip::srcIdx#1 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- xby=_inc_xby + inx + //SEG79 [29] (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#2 flip::r#2 ] -- yby=yby_plus_coby1 + tya + clc + adc #$10 + tay + //SEG80 [30] (byte) flip::c#1 ← -- (byte) flip::c#2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1=_dec_zpby1 + dec $5 + //SEG81 [31] if((byte) flip::c#1!=(byte) 0) goto flip::@2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1_neq_0_then_la1 + lda $5 + bne b2_from_b2 + //SEG82 flip::@4 + b4: + //SEG83 [32] (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#2 ] -- yby=_dec_yby + dey + //SEG84 [33] (byte) flip::r#1 ← -- (byte) flip::r#2 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1=_dec_zpby1 + dec $4 + //SEG85 [34] if((byte) flip::r#1!=(byte) 0) goto flip::@1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1_neq_0_then_la1 + lda $4 + bne b1_from_b4 + //SEG86 [35] phi from flip::@4 to flip::@3 + b3_from_b4: + //SEG87 [35] phi (byte) flip::i#2 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG88 [35] phi from flip::@3 to flip::@3 + b3_from_b3: + //SEG89 [35] phi (byte) flip::i#2 = (byte) flip::i#1 -- register_copy + //SEG90 flip::@3 + b3: + //SEG91 [36] (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] -- aby=cowo1_staridx_xby + lda $1100,x + //SEG92 [37] *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 [ flip::i#2 ] -- cowo1_staridx_xby=aby + sta $1000,x + //SEG93 [38] (byte) flip::i#1 ← ++ (byte) flip::i#2 [ flip::i#1 ] -- xby=_inc_xby + inx + //SEG94 [39] if((byte) flip::i#1!=(byte) 0) goto flip::@3 [ flip::i#1 ] -- xby_neq_0_then_la1 + cpx #$0 + bne b3_from_b3 + //SEG95 flip::@return + breturn: + //SEG96 [40] return [ ] + rts +} //SEG97 prepare -prepare: -//SEG98 [41] phi from prepare to prepare::@1 -prepare__B1_from_prepare: -//SEG99 [41] phi (byte) prepare::i#2 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG100 [41] phi from prepare::@1 to prepare::@1 -prepare__B1_from_B1: -//SEG101 [41] phi (byte) prepare::i#2 = (byte) prepare::i#1 -- register_copy -//SEG102 prepare::@1 -prepare__B1: -//SEG103 [42] *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] -- cowo1_staridx_xby=xby - txa - sta $1000,x -//SEG104 [43] (byte) prepare::i#1 ← ++ (byte) prepare::i#2 [ prepare::i#1 ] -- xby=_inc_xby - inx -//SEG105 [44] if((byte) prepare::i#1!=(byte) 0) goto prepare::@1 [ prepare::i#1 ] -- xby_neq_0_then_la1 - cpx #$0 - bne prepare__B1_from_B1 -//SEG106 prepare::@return -prepare__Breturn: -//SEG107 [45] return [ ] - rts +prepare: { + //SEG98 [41] phi from prepare to prepare::@1 + b1_from_prepare: + //SEG99 [41] phi (byte) prepare::i#2 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG100 [41] phi from prepare::@1 to prepare::@1 + b1_from_b1: + //SEG101 [41] phi (byte) prepare::i#2 = (byte) prepare::i#1 -- register_copy + //SEG102 prepare::@1 + b1: + //SEG103 [42] *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] -- cowo1_staridx_xby=xby + txa + sta $1000,x + //SEG104 [43] (byte) prepare::i#1 ← ++ (byte) prepare::i#2 [ prepare::i#1 ] -- xby=_inc_xby + inx + //SEG105 [44] if((byte) prepare::i#1!=(byte) 0) goto prepare::@1 [ prepare::i#1 ] -- xby_neq_0_then_la1 + cpx #$0 + bne b1_from_b1 + //SEG106 prepare::@return + breturn: + //SEG107 [45] return [ ] + rts +} -Removing instruction jmp main__B3 +Removing instruction jmp b3 Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call prepare param-assignment [ ] - jsr prepare -//SEG5 [2] phi from main to main::@3 -main__B3_from_main: -//SEG6 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 - ldx #$19 - jmp main__B3 -//SEG7 [2] phi from main::@11 to main::@3 -main__B3_from_B11: -//SEG8 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 - ldx #$19 -//SEG9 [2] phi from main::@3 to main::@3 -main__B3_from_B3: -//SEG10 [2] phi from main::@6 to main::@3 -main__B3_from_B6: -//SEG11 [2] phi (byte) main::c#2 = (byte) main::c#1 -- register_copy -//SEG12 main::@3 -main__B3: -//SEG13 [3] (byte~) main::$1 ← * (word) 53266 [ main::$1 main::c#2 ] -- aby=_star_cowo1 - lda $d012 -//SEG14 [4] if((byte~) main::$1!=(byte) 254) goto main::@3 [ main::c#2 ] -- aby_neq_coby1_then_la1 - cmp #$fe - bne main__B3_from_B3 -//SEG15 main::@4 -main__B4: -//SEG16 [5] (byte~) main::$3 ← * (word) 53266 [ main::$3 main::c#2 ] -- aby=_star_cowo1 - lda $d012 -//SEG17 [6] if((byte~) main::$3!=(byte) 255) goto main::@4 [ main::c#2 ] -- aby_neq_coby1_then_la1 - cmp #$ff - bne main__B4 -//SEG18 main::@6 -main__B6: -//SEG19 [7] (byte) main::c#1 ← -- (byte) main::c#2 [ main::c#1 ] -- xby=_dec_xby - dex -//SEG20 [8] if((byte) main::c#1!=(byte) 0) goto main::@3 [ main::c#1 ] -- xby_neq_0_then_la1 - cpx #$0 - bne main__B3_from_B6 -//SEG21 main::@7 -main__B7: -//SEG22 [9] call flip param-assignment [ ] - jsr flip -//SEG23 main::@10 -main__B10: -//SEG24 [10] call plot param-assignment [ ] - jsr plot -//SEG25 main::@11 -main__B11: -//SEG26 [11] if(true) goto main::@3 [ ] -- true_then_la1 - jmp main__B3_from_B11 -//SEG27 main::@return -main__Breturn: -//SEG28 [12] return [ ] - rts +main: { + //SEG4 [1] call prepare param-assignment [ ] + jsr prepare + //SEG5 [2] phi from main to main::@3 + b3_from_main: + //SEG6 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 + ldx #$19 + jmp b3 + //SEG7 [2] phi from main::@11 to main::@3 + b3_from_b11: + //SEG8 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 + ldx #$19 + //SEG9 [2] phi from main::@3 to main::@3 + b3_from_b3: + //SEG10 [2] phi from main::@6 to main::@3 + b3_from_b6: + //SEG11 [2] phi (byte) main::c#2 = (byte) main::c#1 -- register_copy + //SEG12 main::@3 + b3: + //SEG13 [3] (byte~) main::$1 ← * (word) 53266 [ main::$1 main::c#2 ] -- aby=_star_cowo1 + lda $d012 + //SEG14 [4] if((byte~) main::$1!=(byte) 254) goto main::@3 [ main::c#2 ] -- aby_neq_coby1_then_la1 + cmp #$fe + bne b3_from_b3 + //SEG15 main::@4 + b4: + //SEG16 [5] (byte~) main::$3 ← * (word) 53266 [ main::$3 main::c#2 ] -- aby=_star_cowo1 + lda $d012 + //SEG17 [6] if((byte~) main::$3!=(byte) 255) goto main::@4 [ main::c#2 ] -- aby_neq_coby1_then_la1 + cmp #$ff + bne b4 + //SEG18 main::@6 + b6: + //SEG19 [7] (byte) main::c#1 ← -- (byte) main::c#2 [ main::c#1 ] -- xby=_dec_xby + dex + //SEG20 [8] if((byte) main::c#1!=(byte) 0) goto main::@3 [ main::c#1 ] -- xby_neq_0_then_la1 + cpx #$0 + bne b3_from_b6 + //SEG21 main::@7 + b7: + //SEG22 [9] call flip param-assignment [ ] + jsr flip + //SEG23 main::@10 + b10: + //SEG24 [10] call plot param-assignment [ ] + jsr plot + //SEG25 main::@11 + b11: + //SEG26 [11] if(true) goto main::@3 [ ] -- true_then_la1 + jmp b3_from_b11 + //SEG27 main::@return + breturn: + //SEG28 [12] return [ ] + rts +} //SEG29 plot -plot: -//SEG30 [13] phi from plot to plot::@1 -plot__B1_from_plot: -//SEG31 [13] phi (byte) plot::y#2 = (byte) 16 -- zpby1=coby1 - lda #$10 - sta $4 -//SEG32 [13] phi (byte*) plot::line#2 = (word) 1236 -- zpptrby1=cowo1 - lda #<$4d4 - sta $2 - lda #>$4d4 - sta $2+$1 -//SEG33 [13] phi (byte) plot::i#3 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG34 [13] phi from plot::@3 to plot::@1 -plot__B1_from_B3: -//SEG35 [13] phi (byte) plot::y#2 = (byte) plot::y#1 -- register_copy -//SEG36 [13] phi (byte*) plot::line#2 = (byte*) plot::line#1 -- register_copy -//SEG37 [13] phi (byte) plot::i#3 = (byte) plot::i#1 -- register_copy -//SEG38 plot::@1 -plot__B1: -//SEG39 [14] phi from plot::@1 to plot::@2 -plot__B2_from_B1: -//SEG40 [14] phi (byte) plot::x#2 = (byte) 0 -- yby=coby1 - ldy #$0 -//SEG41 [14] phi (byte) plot::i#2 = (byte) plot::i#3 -- register_copy -//SEG42 [14] phi from plot::@2 to plot::@2 -plot__B2_from_B2: -//SEG43 [14] phi (byte) plot::x#2 = (byte) plot::x#1 -- register_copy -//SEG44 [14] phi (byte) plot::i#2 = (byte) plot::i#1 -- register_copy -//SEG45 plot::@2 -plot__B2: -//SEG46 [15] (byte~) plot::$3 ← (word) 4096 *idx (byte) plot::i#2 [ plot::i#2 plot::line#2 plot::x#2 plot::$3 plot::y#2 ] -- aby=cowo1_staridx_xby - lda $1000,x -//SEG47 [16] *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 [ plot::i#2 plot::line#2 plot::x#2 plot::y#2 ] -- zpptrby1_staridx_yby=aby - sta ($2),y -//SEG48 [17] (byte) plot::i#1 ← ++ (byte) plot::i#2 [ plot::i#1 plot::line#2 plot::x#2 plot::y#2 ] -- xby=_inc_xby - inx -//SEG49 [18] (byte) plot::x#1 ← ++ (byte) plot::x#2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby=_inc_yby - iny -//SEG50 [19] if((byte) plot::x#1<(byte) 16) goto plot::@2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby_lt_coby1_then_la1 - cpy #$10 - bcc plot__B2_from_B2 -//SEG51 plot::@3 -plot__B3: -//SEG52 [20] (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 [ plot::i#1 plot::line#1 plot::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 - lda $2 - clc - adc #$28 - sta $2 - bcc !+ - inc $2+$1 -!: -//SEG53 [21] (byte) plot::y#1 ← -- (byte) plot::y#2 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1=_dec_zpby1 - dec $4 -//SEG54 [22] if((byte) plot::y#1!=(byte) 0) goto plot::@1 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1_neq_0_then_la1 - lda $4 - bne plot__B1_from_B3 -//SEG55 plot::@return -plot__Breturn: -//SEG56 [23] return [ ] - rts +plot: { + //SEG30 [13] phi from plot to plot::@1 + b1_from_plot: + //SEG31 [13] phi (byte) plot::y#2 = (byte) 16 -- zpby1=coby1 + lda #$10 + sta $4 + //SEG32 [13] phi (byte*) plot::line#2 = (word) 1236 -- zpptrby1=cowo1 + lda #<$4d4 + sta $2 + lda #>$4d4 + sta $2+$1 + //SEG33 [13] phi (byte) plot::i#3 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG34 [13] phi from plot::@3 to plot::@1 + b1_from_b3: + //SEG35 [13] phi (byte) plot::y#2 = (byte) plot::y#1 -- register_copy + //SEG36 [13] phi (byte*) plot::line#2 = (byte*) plot::line#1 -- register_copy + //SEG37 [13] phi (byte) plot::i#3 = (byte) plot::i#1 -- register_copy + //SEG38 plot::@1 + b1: + //SEG39 [14] phi from plot::@1 to plot::@2 + b2_from_b1: + //SEG40 [14] phi (byte) plot::x#2 = (byte) 0 -- yby=coby1 + ldy #$0 + //SEG41 [14] phi (byte) plot::i#2 = (byte) plot::i#3 -- register_copy + //SEG42 [14] phi from plot::@2 to plot::@2 + b2_from_b2: + //SEG43 [14] phi (byte) plot::x#2 = (byte) plot::x#1 -- register_copy + //SEG44 [14] phi (byte) plot::i#2 = (byte) plot::i#1 -- register_copy + //SEG45 plot::@2 + b2: + //SEG46 [15] (byte~) plot::$3 ← (word) 4096 *idx (byte) plot::i#2 [ plot::i#2 plot::line#2 plot::x#2 plot::$3 plot::y#2 ] -- aby=cowo1_staridx_xby + lda $1000,x + //SEG47 [16] *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 [ plot::i#2 plot::line#2 plot::x#2 plot::y#2 ] -- zpptrby1_staridx_yby=aby + sta ($2),y + //SEG48 [17] (byte) plot::i#1 ← ++ (byte) plot::i#2 [ plot::i#1 plot::line#2 plot::x#2 plot::y#2 ] -- xby=_inc_xby + inx + //SEG49 [18] (byte) plot::x#1 ← ++ (byte) plot::x#2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby=_inc_yby + iny + //SEG50 [19] if((byte) plot::x#1<(byte) 16) goto plot::@2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby_lt_coby1_then_la1 + cpy #$10 + bcc b2_from_b2 + //SEG51 plot::@3 + b3: + //SEG52 [20] (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 [ plot::i#1 plot::line#1 plot::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 + lda $2 + clc + adc #$28 + sta $2 + bcc !+ + inc $2+$1 + !: + //SEG53 [21] (byte) plot::y#1 ← -- (byte) plot::y#2 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1=_dec_zpby1 + dec $4 + //SEG54 [22] if((byte) plot::y#1!=(byte) 0) goto plot::@1 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1_neq_0_then_la1 + lda $4 + bne b1_from_b3 + //SEG55 plot::@return + breturn: + //SEG56 [23] return [ ] + rts +} //SEG57 flip -flip: -//SEG58 [24] phi from flip to flip::@1 -flip__B1_from_flip: -//SEG59 [24] phi (byte) flip::r#2 = (byte) 16 -- zpby1=coby1 - lda #$10 - sta $4 -//SEG60 [24] phi (byte) flip::dstIdx#5 = (byte) 15 -- yby=coby1 - ldy #$f -//SEG61 [24] phi (byte) flip::srcIdx#3 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG62 [24] phi from flip::@4 to flip::@1 -flip__B1_from_B4: -//SEG63 [24] phi (byte) flip::r#2 = (byte) flip::r#1 -- register_copy -//SEG64 [24] phi (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 -- register_copy -//SEG65 [24] phi (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 -- register_copy -//SEG66 flip::@1 -flip__B1: -//SEG67 [25] phi from flip::@1 to flip::@2 -flip__B2_from_B1: -//SEG68 [25] phi (byte) flip::c#2 = (byte) 16 -- zpby1=coby1 - lda #$10 - sta $5 -//SEG69 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 -- register_copy -//SEG70 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 -- register_copy -//SEG71 [25] phi from flip::@2 to flip::@2 -flip__B2_from_B2: -//SEG72 [25] phi (byte) flip::c#2 = (byte) flip::c#1 -- register_copy -//SEG73 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 -- register_copy -//SEG74 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 -- register_copy -//SEG75 flip::@2 -flip__B2: -//SEG76 [26] (byte~) flip::$0 ← (word) 4096 *idx (byte) flip::srcIdx#2 [ flip::srcIdx#2 flip::dstIdx#3 flip::$0 flip::c#2 flip::r#2 ] -- aby=cowo1_staridx_xby - lda $1000,x -//SEG77 [27] *((word) 4352 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 [ flip::srcIdx#2 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- cowo1_staridx_yby=aby - sta $1100,y -//SEG78 [28] (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 [ flip::srcIdx#1 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- xby=_inc_xby - inx -//SEG79 [29] (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#2 flip::r#2 ] -- yby=yby_plus_coby1 - tya - clc - adc #$10 - tay -//SEG80 [30] (byte) flip::c#1 ← -- (byte) flip::c#2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1=_dec_zpby1 - dec $5 -//SEG81 [31] if((byte) flip::c#1!=(byte) 0) goto flip::@2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1_neq_0_then_la1 - lda $5 - bne flip__B2_from_B2 -//SEG82 flip::@4 -flip__B4: -//SEG83 [32] (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#2 ] -- yby=_dec_yby - dey -//SEG84 [33] (byte) flip::r#1 ← -- (byte) flip::r#2 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1=_dec_zpby1 - dec $4 -//SEG85 [34] if((byte) flip::r#1!=(byte) 0) goto flip::@1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1_neq_0_then_la1 - lda $4 - bne flip__B1_from_B4 -//SEG86 [35] phi from flip::@4 to flip::@3 -flip__B3_from_B4: -//SEG87 [35] phi (byte) flip::i#2 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG88 [35] phi from flip::@3 to flip::@3 -flip__B3_from_B3: -//SEG89 [35] phi (byte) flip::i#2 = (byte) flip::i#1 -- register_copy -//SEG90 flip::@3 -flip__B3: -//SEG91 [36] (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] -- aby=cowo1_staridx_xby - lda $1100,x -//SEG92 [37] *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 [ flip::i#2 ] -- cowo1_staridx_xby=aby - sta $1000,x -//SEG93 [38] (byte) flip::i#1 ← ++ (byte) flip::i#2 [ flip::i#1 ] -- xby=_inc_xby - inx -//SEG94 [39] if((byte) flip::i#1!=(byte) 0) goto flip::@3 [ flip::i#1 ] -- xby_neq_0_then_la1 - cpx #$0 - bne flip__B3_from_B3 -//SEG95 flip::@return -flip__Breturn: -//SEG96 [40] return [ ] - rts +flip: { + //SEG58 [24] phi from flip to flip::@1 + b1_from_flip: + //SEG59 [24] phi (byte) flip::r#2 = (byte) 16 -- zpby1=coby1 + lda #$10 + sta $4 + //SEG60 [24] phi (byte) flip::dstIdx#5 = (byte) 15 -- yby=coby1 + ldy #$f + //SEG61 [24] phi (byte) flip::srcIdx#3 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG62 [24] phi from flip::@4 to flip::@1 + b1_from_b4: + //SEG63 [24] phi (byte) flip::r#2 = (byte) flip::r#1 -- register_copy + //SEG64 [24] phi (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 -- register_copy + //SEG65 [24] phi (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 -- register_copy + //SEG66 flip::@1 + b1: + //SEG67 [25] phi from flip::@1 to flip::@2 + b2_from_b1: + //SEG68 [25] phi (byte) flip::c#2 = (byte) 16 -- zpby1=coby1 + lda #$10 + sta $5 + //SEG69 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 -- register_copy + //SEG70 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 -- register_copy + //SEG71 [25] phi from flip::@2 to flip::@2 + b2_from_b2: + //SEG72 [25] phi (byte) flip::c#2 = (byte) flip::c#1 -- register_copy + //SEG73 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 -- register_copy + //SEG74 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 -- register_copy + //SEG75 flip::@2 + b2: + //SEG76 [26] (byte~) flip::$0 ← (word) 4096 *idx (byte) flip::srcIdx#2 [ flip::srcIdx#2 flip::dstIdx#3 flip::$0 flip::c#2 flip::r#2 ] -- aby=cowo1_staridx_xby + lda $1000,x + //SEG77 [27] *((word) 4352 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 [ flip::srcIdx#2 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- cowo1_staridx_yby=aby + sta $1100,y + //SEG78 [28] (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 [ flip::srcIdx#1 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- xby=_inc_xby + inx + //SEG79 [29] (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#2 flip::r#2 ] -- yby=yby_plus_coby1 + tya + clc + adc #$10 + tay + //SEG80 [30] (byte) flip::c#1 ← -- (byte) flip::c#2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1=_dec_zpby1 + dec $5 + //SEG81 [31] if((byte) flip::c#1!=(byte) 0) goto flip::@2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1_neq_0_then_la1 + lda $5 + bne b2_from_b2 + //SEG82 flip::@4 + b4: + //SEG83 [32] (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#2 ] -- yby=_dec_yby + dey + //SEG84 [33] (byte) flip::r#1 ← -- (byte) flip::r#2 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1=_dec_zpby1 + dec $4 + //SEG85 [34] if((byte) flip::r#1!=(byte) 0) goto flip::@1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1_neq_0_then_la1 + lda $4 + bne b1_from_b4 + //SEG86 [35] phi from flip::@4 to flip::@3 + b3_from_b4: + //SEG87 [35] phi (byte) flip::i#2 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG88 [35] phi from flip::@3 to flip::@3 + b3_from_b3: + //SEG89 [35] phi (byte) flip::i#2 = (byte) flip::i#1 -- register_copy + //SEG90 flip::@3 + b3: + //SEG91 [36] (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] -- aby=cowo1_staridx_xby + lda $1100,x + //SEG92 [37] *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 [ flip::i#2 ] -- cowo1_staridx_xby=aby + sta $1000,x + //SEG93 [38] (byte) flip::i#1 ← ++ (byte) flip::i#2 [ flip::i#1 ] -- xby=_inc_xby + inx + //SEG94 [39] if((byte) flip::i#1!=(byte) 0) goto flip::@3 [ flip::i#1 ] -- xby_neq_0_then_la1 + cpx #$0 + bne b3_from_b3 + //SEG95 flip::@return + breturn: + //SEG96 [40] return [ ] + rts +} //SEG97 prepare -prepare: -//SEG98 [41] phi from prepare to prepare::@1 -prepare__B1_from_prepare: -//SEG99 [41] phi (byte) prepare::i#2 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG100 [41] phi from prepare::@1 to prepare::@1 -prepare__B1_from_B1: -//SEG101 [41] phi (byte) prepare::i#2 = (byte) prepare::i#1 -- register_copy -//SEG102 prepare::@1 -prepare__B1: -//SEG103 [42] *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] -- cowo1_staridx_xby=xby - txa - sta $1000,x -//SEG104 [43] (byte) prepare::i#1 ← ++ (byte) prepare::i#2 [ prepare::i#1 ] -- xby=_inc_xby - inx -//SEG105 [44] if((byte) prepare::i#1!=(byte) 0) goto prepare::@1 [ prepare::i#1 ] -- xby_neq_0_then_la1 - cpx #$0 - bne prepare__B1_from_B1 -//SEG106 prepare::@return -prepare__Breturn: -//SEG107 [45] return [ ] - rts +prepare: { + //SEG98 [41] phi from prepare to prepare::@1 + b1_from_prepare: + //SEG99 [41] phi (byte) prepare::i#2 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG100 [41] phi from prepare::@1 to prepare::@1 + b1_from_b1: + //SEG101 [41] phi (byte) prepare::i#2 = (byte) prepare::i#1 -- register_copy + //SEG102 prepare::@1 + b1: + //SEG103 [42] *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] -- cowo1_staridx_xby=xby + txa + sta $1000,x + //SEG104 [43] (byte) prepare::i#1 ← ++ (byte) prepare::i#2 [ prepare::i#1 ] -- xby=_inc_xby + inx + //SEG105 [44] if((byte) prepare::i#1!=(byte) 0) goto prepare::@1 [ prepare::i#1 ] -- xby_neq_0_then_la1 + cpx #$0 + bne b1_from_b1 + //SEG106 prepare::@return + breturn: + //SEG107 [45] return [ ] + rts +} FINAL SYMBOL TABLE -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte*) RASTER (byte[1000]) SCREEN (byte[256]) buffer1 @@ -5253,229 +5269,233 @@ reg byte a [ flip::$0 ] reg byte a [ flip::$4 ] FINAL CODE -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call prepare param-assignment [ ] - jsr prepare -//SEG5 [2] phi from main to main::@3 -main__B3_from_main: -//SEG6 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 - ldx #$19 - jmp main__B3 -//SEG7 [2] phi from main::@11 to main::@3 -main__B3_from_B11: -//SEG8 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 - ldx #$19 -//SEG9 [2] phi from main::@3 to main::@3 -main__B3_from_B3: -//SEG10 [2] phi from main::@6 to main::@3 -main__B3_from_B6: -//SEG11 [2] phi (byte) main::c#2 = (byte) main::c#1 -- register_copy -//SEG12 main::@3 -main__B3: -//SEG13 [3] (byte~) main::$1 ← * (word) 53266 [ main::$1 main::c#2 ] -- aby=_star_cowo1 - lda $d012 -//SEG14 [4] if((byte~) main::$1!=(byte) 254) goto main::@3 [ main::c#2 ] -- aby_neq_coby1_then_la1 - cmp #$fe - bne main__B3_from_B3 -//SEG15 main::@4 -main__B4: -//SEG16 [5] (byte~) main::$3 ← * (word) 53266 [ main::$3 main::c#2 ] -- aby=_star_cowo1 - lda $d012 -//SEG17 [6] if((byte~) main::$3!=(byte) 255) goto main::@4 [ main::c#2 ] -- aby_neq_coby1_then_la1 - cmp #$ff - bne main__B4 -//SEG18 main::@6 -main__B6: -//SEG19 [7] (byte) main::c#1 ← -- (byte) main::c#2 [ main::c#1 ] -- xby=_dec_xby - dex -//SEG20 [8] if((byte) main::c#1!=(byte) 0) goto main::@3 [ main::c#1 ] -- xby_neq_0_then_la1 - cpx #$0 - bne main__B3_from_B6 -//SEG21 main::@7 -main__B7: -//SEG22 [9] call flip param-assignment [ ] - jsr flip -//SEG23 main::@10 -main__B10: -//SEG24 [10] call plot param-assignment [ ] - jsr plot -//SEG25 main::@11 -main__B11: -//SEG26 [11] if(true) goto main::@3 [ ] -- true_then_la1 - jmp main__B3_from_B11 -//SEG27 main::@return -main__Breturn: -//SEG28 [12] return [ ] - rts +main: { + //SEG4 [1] call prepare param-assignment [ ] + jsr prepare + //SEG5 [2] phi from main to main::@3 + b3_from_main: + //SEG6 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 + ldx #$19 + jmp b3 + //SEG7 [2] phi from main::@11 to main::@3 + b3_from_b11: + //SEG8 [2] phi (byte) main::c#2 = (byte) 25 -- xby=coby1 + ldx #$19 + //SEG9 [2] phi from main::@3 to main::@3 + b3_from_b3: + //SEG10 [2] phi from main::@6 to main::@3 + b3_from_b6: + //SEG11 [2] phi (byte) main::c#2 = (byte) main::c#1 -- register_copy + //SEG12 main::@3 + b3: + //SEG13 [3] (byte~) main::$1 ← * (word) 53266 [ main::$1 main::c#2 ] -- aby=_star_cowo1 + lda $d012 + //SEG14 [4] if((byte~) main::$1!=(byte) 254) goto main::@3 [ main::c#2 ] -- aby_neq_coby1_then_la1 + cmp #$fe + bne b3_from_b3 + //SEG15 main::@4 + b4: + //SEG16 [5] (byte~) main::$3 ← * (word) 53266 [ main::$3 main::c#2 ] -- aby=_star_cowo1 + lda $d012 + //SEG17 [6] if((byte~) main::$3!=(byte) 255) goto main::@4 [ main::c#2 ] -- aby_neq_coby1_then_la1 + cmp #$ff + bne b4 + //SEG18 main::@6 + b6: + //SEG19 [7] (byte) main::c#1 ← -- (byte) main::c#2 [ main::c#1 ] -- xby=_dec_xby + dex + //SEG20 [8] if((byte) main::c#1!=(byte) 0) goto main::@3 [ main::c#1 ] -- xby_neq_0_then_la1 + cpx #$0 + bne b3_from_b6 + //SEG21 main::@7 + b7: + //SEG22 [9] call flip param-assignment [ ] + jsr flip + //SEG23 main::@10 + b10: + //SEG24 [10] call plot param-assignment [ ] + jsr plot + //SEG25 main::@11 + b11: + //SEG26 [11] if(true) goto main::@3 [ ] -- true_then_la1 + jmp b3_from_b11 + //SEG27 main::@return + breturn: + //SEG28 [12] return [ ] + rts +} //SEG29 plot -plot: -//SEG30 [13] phi from plot to plot::@1 -plot__B1_from_plot: -//SEG31 [13] phi (byte) plot::y#2 = (byte) 16 -- zpby1=coby1 - lda #$10 - sta $4 -//SEG32 [13] phi (byte*) plot::line#2 = (word) 1236 -- zpptrby1=cowo1 - lda #<$4d4 - sta $2 - lda #>$4d4 - sta $2+$1 -//SEG33 [13] phi (byte) plot::i#3 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG34 [13] phi from plot::@3 to plot::@1 -plot__B1_from_B3: -//SEG35 [13] phi (byte) plot::y#2 = (byte) plot::y#1 -- register_copy -//SEG36 [13] phi (byte*) plot::line#2 = (byte*) plot::line#1 -- register_copy -//SEG37 [13] phi (byte) plot::i#3 = (byte) plot::i#1 -- register_copy -//SEG38 plot::@1 -plot__B1: -//SEG39 [14] phi from plot::@1 to plot::@2 -plot__B2_from_B1: -//SEG40 [14] phi (byte) plot::x#2 = (byte) 0 -- yby=coby1 - ldy #$0 -//SEG41 [14] phi (byte) plot::i#2 = (byte) plot::i#3 -- register_copy -//SEG42 [14] phi from plot::@2 to plot::@2 -plot__B2_from_B2: -//SEG43 [14] phi (byte) plot::x#2 = (byte) plot::x#1 -- register_copy -//SEG44 [14] phi (byte) plot::i#2 = (byte) plot::i#1 -- register_copy -//SEG45 plot::@2 -plot__B2: -//SEG46 [15] (byte~) plot::$3 ← (word) 4096 *idx (byte) plot::i#2 [ plot::i#2 plot::line#2 plot::x#2 plot::$3 plot::y#2 ] -- aby=cowo1_staridx_xby - lda $1000,x -//SEG47 [16] *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 [ plot::i#2 plot::line#2 plot::x#2 plot::y#2 ] -- zpptrby1_staridx_yby=aby - sta ($2),y -//SEG48 [17] (byte) plot::i#1 ← ++ (byte) plot::i#2 [ plot::i#1 plot::line#2 plot::x#2 plot::y#2 ] -- xby=_inc_xby - inx -//SEG49 [18] (byte) plot::x#1 ← ++ (byte) plot::x#2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby=_inc_yby - iny -//SEG50 [19] if((byte) plot::x#1<(byte) 16) goto plot::@2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby_lt_coby1_then_la1 - cpy #$10 - bcc plot__B2_from_B2 -//SEG51 plot::@3 -plot__B3: -//SEG52 [20] (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 [ plot::i#1 plot::line#1 plot::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 - lda $2 - clc - adc #$28 - sta $2 - bcc !+ - inc $2+$1 -!: -//SEG53 [21] (byte) plot::y#1 ← -- (byte) plot::y#2 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1=_dec_zpby1 - dec $4 -//SEG54 [22] if((byte) plot::y#1!=(byte) 0) goto plot::@1 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1_neq_0_then_la1 - lda $4 - bne plot__B1_from_B3 -//SEG55 plot::@return -plot__Breturn: -//SEG56 [23] return [ ] - rts +plot: { + //SEG30 [13] phi from plot to plot::@1 + b1_from_plot: + //SEG31 [13] phi (byte) plot::y#2 = (byte) 16 -- zpby1=coby1 + lda #$10 + sta $4 + //SEG32 [13] phi (byte*) plot::line#2 = (word) 1236 -- zpptrby1=cowo1 + lda #<$4d4 + sta $2 + lda #>$4d4 + sta $2+$1 + //SEG33 [13] phi (byte) plot::i#3 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG34 [13] phi from plot::@3 to plot::@1 + b1_from_b3: + //SEG35 [13] phi (byte) plot::y#2 = (byte) plot::y#1 -- register_copy + //SEG36 [13] phi (byte*) plot::line#2 = (byte*) plot::line#1 -- register_copy + //SEG37 [13] phi (byte) plot::i#3 = (byte) plot::i#1 -- register_copy + //SEG38 plot::@1 + b1: + //SEG39 [14] phi from plot::@1 to plot::@2 + b2_from_b1: + //SEG40 [14] phi (byte) plot::x#2 = (byte) 0 -- yby=coby1 + ldy #$0 + //SEG41 [14] phi (byte) plot::i#2 = (byte) plot::i#3 -- register_copy + //SEG42 [14] phi from plot::@2 to plot::@2 + b2_from_b2: + //SEG43 [14] phi (byte) plot::x#2 = (byte) plot::x#1 -- register_copy + //SEG44 [14] phi (byte) plot::i#2 = (byte) plot::i#1 -- register_copy + //SEG45 plot::@2 + b2: + //SEG46 [15] (byte~) plot::$3 ← (word) 4096 *idx (byte) plot::i#2 [ plot::i#2 plot::line#2 plot::x#2 plot::$3 plot::y#2 ] -- aby=cowo1_staridx_xby + lda $1000,x + //SEG47 [16] *((byte*) plot::line#2 + (byte) plot::x#2) ← (byte~) plot::$3 [ plot::i#2 plot::line#2 plot::x#2 plot::y#2 ] -- zpptrby1_staridx_yby=aby + sta ($2),y + //SEG48 [17] (byte) plot::i#1 ← ++ (byte) plot::i#2 [ plot::i#1 plot::line#2 plot::x#2 plot::y#2 ] -- xby=_inc_xby + inx + //SEG49 [18] (byte) plot::x#1 ← ++ (byte) plot::x#2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby=_inc_yby + iny + //SEG50 [19] if((byte) plot::x#1<(byte) 16) goto plot::@2 [ plot::i#1 plot::x#1 plot::line#2 plot::y#2 ] -- yby_lt_coby1_then_la1 + cpy #$10 + bcc b2_from_b2 + //SEG51 plot::@3 + b3: + //SEG52 [20] (byte*) plot::line#1 ← (byte*) plot::line#2 + (byte) 40 [ plot::i#1 plot::line#1 plot::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 + lda $2 + clc + adc #$28 + sta $2 + bcc !+ + inc $2+$1 + !: + //SEG53 [21] (byte) plot::y#1 ← -- (byte) plot::y#2 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1=_dec_zpby1 + dec $4 + //SEG54 [22] if((byte) plot::y#1!=(byte) 0) goto plot::@1 [ plot::i#1 plot::line#1 plot::y#1 ] -- zpby1_neq_0_then_la1 + lda $4 + bne b1_from_b3 + //SEG55 plot::@return + breturn: + //SEG56 [23] return [ ] + rts +} //SEG57 flip -flip: -//SEG58 [24] phi from flip to flip::@1 -flip__B1_from_flip: -//SEG59 [24] phi (byte) flip::r#2 = (byte) 16 -- zpby1=coby1 - lda #$10 - sta $4 -//SEG60 [24] phi (byte) flip::dstIdx#5 = (byte) 15 -- yby=coby1 - ldy #$f -//SEG61 [24] phi (byte) flip::srcIdx#3 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG62 [24] phi from flip::@4 to flip::@1 -flip__B1_from_B4: -//SEG63 [24] phi (byte) flip::r#2 = (byte) flip::r#1 -- register_copy -//SEG64 [24] phi (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 -- register_copy -//SEG65 [24] phi (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 -- register_copy -//SEG66 flip::@1 -flip__B1: -//SEG67 [25] phi from flip::@1 to flip::@2 -flip__B2_from_B1: -//SEG68 [25] phi (byte) flip::c#2 = (byte) 16 -- zpby1=coby1 - lda #$10 - sta $5 -//SEG69 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 -- register_copy -//SEG70 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 -- register_copy -//SEG71 [25] phi from flip::@2 to flip::@2 -flip__B2_from_B2: -//SEG72 [25] phi (byte) flip::c#2 = (byte) flip::c#1 -- register_copy -//SEG73 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 -- register_copy -//SEG74 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 -- register_copy -//SEG75 flip::@2 -flip__B2: -//SEG76 [26] (byte~) flip::$0 ← (word) 4096 *idx (byte) flip::srcIdx#2 [ flip::srcIdx#2 flip::dstIdx#3 flip::$0 flip::c#2 flip::r#2 ] -- aby=cowo1_staridx_xby - lda $1000,x -//SEG77 [27] *((word) 4352 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 [ flip::srcIdx#2 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- cowo1_staridx_yby=aby - sta $1100,y -//SEG78 [28] (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 [ flip::srcIdx#1 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- xby=_inc_xby - inx -//SEG79 [29] (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#2 flip::r#2 ] -- yby=yby_plus_coby1 - tya - clc - adc #$10 - tay -//SEG80 [30] (byte) flip::c#1 ← -- (byte) flip::c#2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1=_dec_zpby1 - dec $5 -//SEG81 [31] if((byte) flip::c#1!=(byte) 0) goto flip::@2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1_neq_0_then_la1 - lda $5 - bne flip__B2_from_B2 -//SEG82 flip::@4 -flip__B4: -//SEG83 [32] (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#2 ] -- yby=_dec_yby - dey -//SEG84 [33] (byte) flip::r#1 ← -- (byte) flip::r#2 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1=_dec_zpby1 - dec $4 -//SEG85 [34] if((byte) flip::r#1!=(byte) 0) goto flip::@1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1_neq_0_then_la1 - lda $4 - bne flip__B1_from_B4 -//SEG86 [35] phi from flip::@4 to flip::@3 -flip__B3_from_B4: -//SEG87 [35] phi (byte) flip::i#2 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG88 [35] phi from flip::@3 to flip::@3 -flip__B3_from_B3: -//SEG89 [35] phi (byte) flip::i#2 = (byte) flip::i#1 -- register_copy -//SEG90 flip::@3 -flip__B3: -//SEG91 [36] (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] -- aby=cowo1_staridx_xby - lda $1100,x -//SEG92 [37] *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 [ flip::i#2 ] -- cowo1_staridx_xby=aby - sta $1000,x -//SEG93 [38] (byte) flip::i#1 ← ++ (byte) flip::i#2 [ flip::i#1 ] -- xby=_inc_xby - inx -//SEG94 [39] if((byte) flip::i#1!=(byte) 0) goto flip::@3 [ flip::i#1 ] -- xby_neq_0_then_la1 - cpx #$0 - bne flip__B3_from_B3 -//SEG95 flip::@return -flip__Breturn: -//SEG96 [40] return [ ] - rts +flip: { + //SEG58 [24] phi from flip to flip::@1 + b1_from_flip: + //SEG59 [24] phi (byte) flip::r#2 = (byte) 16 -- zpby1=coby1 + lda #$10 + sta $4 + //SEG60 [24] phi (byte) flip::dstIdx#5 = (byte) 15 -- yby=coby1 + ldy #$f + //SEG61 [24] phi (byte) flip::srcIdx#3 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG62 [24] phi from flip::@4 to flip::@1 + b1_from_b4: + //SEG63 [24] phi (byte) flip::r#2 = (byte) flip::r#1 -- register_copy + //SEG64 [24] phi (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 -- register_copy + //SEG65 [24] phi (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 -- register_copy + //SEG66 flip::@1 + b1: + //SEG67 [25] phi from flip::@1 to flip::@2 + b2_from_b1: + //SEG68 [25] phi (byte) flip::c#2 = (byte) 16 -- zpby1=coby1 + lda #$10 + sta $5 + //SEG69 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 -- register_copy + //SEG70 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 -- register_copy + //SEG71 [25] phi from flip::@2 to flip::@2 + b2_from_b2: + //SEG72 [25] phi (byte) flip::c#2 = (byte) flip::c#1 -- register_copy + //SEG73 [25] phi (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 -- register_copy + //SEG74 [25] phi (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 -- register_copy + //SEG75 flip::@2 + b2: + //SEG76 [26] (byte~) flip::$0 ← (word) 4096 *idx (byte) flip::srcIdx#2 [ flip::srcIdx#2 flip::dstIdx#3 flip::$0 flip::c#2 flip::r#2 ] -- aby=cowo1_staridx_xby + lda $1000,x + //SEG77 [27] *((word) 4352 + (byte) flip::dstIdx#3) ← (byte~) flip::$0 [ flip::srcIdx#2 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- cowo1_staridx_yby=aby + sta $1100,y + //SEG78 [28] (byte) flip::srcIdx#1 ← ++ (byte) flip::srcIdx#2 [ flip::srcIdx#1 flip::dstIdx#3 flip::c#2 flip::r#2 ] -- xby=_inc_xby + inx + //SEG79 [29] (byte) flip::dstIdx#1 ← (byte) flip::dstIdx#3 + (byte) 16 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#2 flip::r#2 ] -- yby=yby_plus_coby1 + tya + clc + adc #$10 + tay + //SEG80 [30] (byte) flip::c#1 ← -- (byte) flip::c#2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1=_dec_zpby1 + dec $5 + //SEG81 [31] if((byte) flip::c#1!=(byte) 0) goto flip::@2 [ flip::srcIdx#1 flip::dstIdx#1 flip::c#1 flip::r#2 ] -- zpby1_neq_0_then_la1 + lda $5 + bne b2_from_b2 + //SEG82 flip::@4 + b4: + //SEG83 [32] (byte) flip::dstIdx#2 ← -- (byte) flip::dstIdx#1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#2 ] -- yby=_dec_yby + dey + //SEG84 [33] (byte) flip::r#1 ← -- (byte) flip::r#2 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1=_dec_zpby1 + dec $4 + //SEG85 [34] if((byte) flip::r#1!=(byte) 0) goto flip::@1 [ flip::srcIdx#1 flip::dstIdx#2 flip::r#1 ] -- zpby1_neq_0_then_la1 + lda $4 + bne b1_from_b4 + //SEG86 [35] phi from flip::@4 to flip::@3 + b3_from_b4: + //SEG87 [35] phi (byte) flip::i#2 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG88 [35] phi from flip::@3 to flip::@3 + b3_from_b3: + //SEG89 [35] phi (byte) flip::i#2 = (byte) flip::i#1 -- register_copy + //SEG90 flip::@3 + b3: + //SEG91 [36] (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] -- aby=cowo1_staridx_xby + lda $1100,x + //SEG92 [37] *((word) 4096 + (byte) flip::i#2) ← (byte~) flip::$4 [ flip::i#2 ] -- cowo1_staridx_xby=aby + sta $1000,x + //SEG93 [38] (byte) flip::i#1 ← ++ (byte) flip::i#2 [ flip::i#1 ] -- xby=_inc_xby + inx + //SEG94 [39] if((byte) flip::i#1!=(byte) 0) goto flip::@3 [ flip::i#1 ] -- xby_neq_0_then_la1 + cpx #$0 + bne b3_from_b3 + //SEG95 flip::@return + breturn: + //SEG96 [40] return [ ] + rts +} //SEG97 prepare -prepare: -//SEG98 [41] phi from prepare to prepare::@1 -prepare__B1_from_prepare: -//SEG99 [41] phi (byte) prepare::i#2 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG100 [41] phi from prepare::@1 to prepare::@1 -prepare__B1_from_B1: -//SEG101 [41] phi (byte) prepare::i#2 = (byte) prepare::i#1 -- register_copy -//SEG102 prepare::@1 -prepare__B1: -//SEG103 [42] *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] -- cowo1_staridx_xby=xby - txa - sta $1000,x -//SEG104 [43] (byte) prepare::i#1 ← ++ (byte) prepare::i#2 [ prepare::i#1 ] -- xby=_inc_xby - inx -//SEG105 [44] if((byte) prepare::i#1!=(byte) 0) goto prepare::@1 [ prepare::i#1 ] -- xby_neq_0_then_la1 - cpx #$0 - bne prepare__B1_from_B1 -//SEG106 prepare::@return -prepare__Breturn: -//SEG107 [45] return [ ] - rts +prepare: { + //SEG98 [41] phi from prepare to prepare::@1 + b1_from_prepare: + //SEG99 [41] phi (byte) prepare::i#2 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG100 [41] phi from prepare::@1 to prepare::@1 + b1_from_b1: + //SEG101 [41] phi (byte) prepare::i#2 = (byte) prepare::i#1 -- register_copy + //SEG102 prepare::@1 + b1: + //SEG103 [42] *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] -- cowo1_staridx_xby=xby + txa + sta $1000,x + //SEG104 [43] (byte) prepare::i#1 ← ++ (byte) prepare::i#2 [ prepare::i#1 ] -- xby=_inc_xby + inx + //SEG105 [44] if((byte) prepare::i#1!=(byte) 0) goto prepare::@1 [ prepare::i#1 ] -- xby_neq_0_then_la1 + cpx #$0 + bne b1_from_b1 + //SEG106 prepare::@return + breturn: + //SEG107 [45] return [ ] + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.sym b/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.sym index 1bc0c9859..48c368387 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.sym +++ b/src/main/java/dk/camelot64/kickc/test/ref/flipper-rex2.sym @@ -1,5 +1,5 @@ -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte*) RASTER (byte[1000]) SCREEN (byte[256]) buffer1 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopmin.asm b/src/main/java/dk/camelot64/kickc/test/ref/loopmin.asm index 945fea1de..8f0d5455c 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopmin.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopmin.asm @@ -1,22 +1,22 @@ -BBEGIN: -B1_from_BBEGIN: +bbegin: +b1_from_bbegin: lda #$0 ldx #$a -B1_from_B3: -B1: +b1_from_b3: +b1: cpx #$5 beq !+ - bcs B2 + bcs b2 !: -B3_from_B1: -B3: +b3_from_b1: +b3: dex cpx #$0 - bne B1_from_B3 -BEND: -B2: + bne b1_from_b3 +bend: +b2: stx $ff clc adc $ff -B3_from_B2: - jmp B3 +b3_from_b2: + jmp b3 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopmin.cfg b/src/main/java/dk/camelot64/kickc/test/ref/loopmin.cfg index b779acca0..b078ca5e4 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopmin.cfg +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopmin.cfg @@ -1,16 +1,16 @@ -@BEGIN: from +@begin: from to:@1 -@1: from @3 @BEGIN - [0] (byte) s#2 ← phi( @3/(byte) s#4 @BEGIN/(byte) 0 ) [ i#2 s#2 ] - [0] (byte) i#2 ← phi( @3/(byte) i#1 @BEGIN/(byte) 10 ) [ i#2 s#2 ] +@1: from @3 @begin + [0] (byte) s#2 ← phi( @3/(byte) s#4 @begin/(byte) 0 ) [ i#2 s#2 ] + [0] (byte) i#2 ← phi( @3/(byte) i#1 @begin/(byte) 10 ) [ i#2 s#2 ] [1] if((byte) i#2>(byte) 5) goto @2 [ i#2 s#2 ] to:@3 @3: from @1 @2 [2] (byte) s#4 ← phi( @1/(byte) s#2 @2/(byte) s#1 ) [ s#4 i#2 ] [3] (byte) i#1 ← -- (byte) i#2 [ i#1 s#4 ] [4] if((byte) i#1>(byte) 0) goto @1 [ i#1 s#4 ] - to:@END -@END: from @3 + to:@end +@end: from @3 @2: from @1 [5] (byte) s#1 ← (byte) s#2 + (byte) i#2 [ i#2 s#1 ] to:@3 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopmin.log b/src/main/java/dk/camelot64/kickc/test/ref/loopmin.log index 78106e2ff..ff1e22fbb 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopmin.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopmin.log @@ -33,11 +33,11 @@ SYMBOLS (byte) s INITIAL CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) i ← (byte) 10 (byte) s ← (byte) 0 to:@1 -@1: from @3 @BEGIN +@1: from @3 @begin (boolean~) $0 ← (byte) i > (byte) 5 if((boolean~) $0) goto @2 to:@4 @@ -55,18 +55,18 @@ INITIAL CONTROL FLOW GRAPH @5: from to:@2 @6: from @3 - to:@END -@END: from @6 + to:@end +@end: from @6 Removing empty block @4 Removing empty block @5 Removing empty block @6 CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) i ← (byte) 10 (byte) s ← (byte) 0 to:@1 -@1: from @3 @BEGIN +@1: from @3 @begin (boolean~) $0 ← (byte) i > (byte) 5 if((boolean~) $0) goto @2 to:@3 @@ -78,17 +78,17 @@ CONTROL FLOW GRAPH (byte) i ← -- (byte) i (boolean~) $2 ← (byte) i > (byte) 0 if((boolean~) $2) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 PROCEDURE MODIFY VARIABLE ANALYSIS CONTROL FLOW GRAPH WITH ASSIGNMENT CALL -@BEGIN: from +@begin: from (byte) i ← (byte) 10 (byte) s ← (byte) 0 to:@1 -@1: from @3 @BEGIN +@1: from @3 @begin (boolean~) $0 ← (byte) i > (byte) 5 if((boolean~) $0) goto @2 to:@3 @@ -100,20 +100,20 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL (byte) i ← -- (byte) i (boolean~) $2 ← (byte) i > (byte) 0 if((boolean~) $2) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Completing Phi functions... Completing Phi functions... Completing Phi functions... CONTROL FLOW GRAPH SSA -@BEGIN: from +@begin: from (byte) i#0 ← (byte) 10 (byte) s#0 ← (byte) 0 to:@1 -@1: from @3 @BEGIN - (byte) s#3 ← phi( @3/(byte) s#4 @BEGIN/(byte) s#0 ) - (byte) i#2 ← phi( @3/(byte) i#1 @BEGIN/(byte) i#0 ) +@1: from @3 @begin + (byte) s#3 ← phi( @3/(byte) s#4 @begin/(byte) s#0 ) + (byte) i#2 ← phi( @3/(byte) i#1 @begin/(byte) i#0 ) (boolean~) $0 ← (byte) i#2 > (byte) 5 if((boolean~) $0) goto @2 to:@3 @@ -129,17 +129,17 @@ CONTROL FLOW GRAPH SSA (byte) i#1 ← -- (byte) i#4 (boolean~) $2 ← (byte) i#1 > (byte) 0 if((boolean~) $2) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN -@BEGIN: from +@begin: from (byte) i#0 ← (byte) 10 (byte) s#0 ← (byte) 0 to:@1 -@1: from @3 @BEGIN - (byte) s#3 ← phi( @3/(byte) s#4 @BEGIN/(byte) s#0 ) - (byte) i#2 ← phi( @3/(byte) i#1 @BEGIN/(byte) i#0 ) +@1: from @3 @begin + (byte) s#3 ← phi( @3/(byte) s#4 @begin/(byte) s#0 ) + (byte) i#2 ← phi( @3/(byte) i#1 @begin/(byte) i#0 ) (boolean~) $0 ← (byte) i#2 > (byte) 5 if((boolean~) $0) goto @2 to:@3 @@ -155,18 +155,18 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN (byte) i#1 ← -- (byte) i#4 (boolean~) $2 ← (byte) i#1 > (byte) 0 if((boolean~) $2) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Constant (byte) i#0 (byte) 10 Constant (byte) s#0 (byte) 0 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from to:@1 -@1: from @3 @BEGIN - (byte) s#3 ← phi( @3/(byte) s#4 @BEGIN/(byte) 0 ) - (byte) i#2 ← phi( @3/(byte) i#1 @BEGIN/(byte) 10 ) +@1: from @3 @begin + (byte) s#3 ← phi( @3/(byte) s#4 @begin/(byte) 0 ) + (byte) i#2 ← phi( @3/(byte) i#1 @begin/(byte) 10 ) (boolean~) $0 ← (byte) i#2 > (byte) 5 if((boolean~) $0) goto @2 to:@3 @@ -182,19 +182,19 @@ CONTROL FLOW GRAPH (byte) i#1 ← -- (byte) i#4 (boolean~) $2 ← (byte) i#1 > (byte) 0 if((boolean~) $2) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Alias (byte) s#2 = (byte) s#3 Alias (byte) i#2 = (byte) i#3 Alias (byte) s#1 = (byte~) $1 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from to:@1 -@1: from @3 @BEGIN - (byte) s#2 ← phi( @3/(byte) s#4 @BEGIN/(byte) 0 ) - (byte) i#2 ← phi( @3/(byte) i#1 @BEGIN/(byte) 10 ) +@1: from @3 @begin + (byte) s#2 ← phi( @3/(byte) s#4 @begin/(byte) 0 ) + (byte) i#2 ← phi( @3/(byte) i#1 @begin/(byte) 10 ) (boolean~) $0 ← (byte) i#2 > (byte) 5 if((boolean~) $0) goto @2 to:@3 @@ -207,17 +207,17 @@ CONTROL FLOW GRAPH (byte) i#1 ← -- (byte) i#4 (boolean~) $2 ← (byte) i#1 > (byte) 0 if((boolean~) $2) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Redundant Phi (byte) i#4 (byte) i#2 Succesful SSA optimization Pass2RedundantPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from to:@1 -@1: from @3 @BEGIN - (byte) s#2 ← phi( @3/(byte) s#4 @BEGIN/(byte) 0 ) - (byte) i#2 ← phi( @3/(byte) i#1 @BEGIN/(byte) 10 ) +@1: from @3 @begin + (byte) s#2 ← phi( @3/(byte) s#4 @begin/(byte) 0 ) + (byte) i#2 ← phi( @3/(byte) i#1 @begin/(byte) 10 ) (boolean~) $0 ← (byte) i#2 > (byte) 5 if((boolean~) $0) goto @2 to:@3 @@ -229,18 +229,18 @@ CONTROL FLOW GRAPH (byte) i#1 ← -- (byte) i#2 (boolean~) $2 ← (byte) i#1 > (byte) 0 if((boolean~) $2) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 Simple Condition (boolean~) $0 if((byte) i#2>(byte) 5) goto @2 Simple Condition (boolean~) $2 if((byte) i#1>(byte) 0) goto @1 Succesful SSA optimization Pass2ConditionalJumpSimplification CONTROL FLOW GRAPH -@BEGIN: from +@begin: from to:@1 -@1: from @3 @BEGIN - (byte) s#2 ← phi( @3/(byte) s#4 @BEGIN/(byte) 0 ) - (byte) i#2 ← phi( @3/(byte) i#1 @BEGIN/(byte) 10 ) +@1: from @3 @begin + (byte) s#2 ← phi( @3/(byte) s#4 @begin/(byte) 0 ) + (byte) i#2 ← phi( @3/(byte) i#1 @begin/(byte) 10 ) if((byte) i#2>(byte) 5) goto @2 to:@3 @2: from @1 @@ -250,19 +250,19 @@ CONTROL FLOW GRAPH (byte) s#4 ← phi( @1/(byte) s#2 @2/(byte) s#1 ) (byte) i#1 ← -- (byte) i#2 if((byte) i#1>(byte) 0) goto @1 - to:@END -@END: from @3 + to:@end +@end: from @3 -Block Sequence Planned @BEGIN @1 @3 @END @2 +Block Sequence Planned @begin @1 @3 @end @2 Added new block during phi lifting @7(between @3 and @1) Added new block during phi lifting @8(between @1 and @3) -Block Sequence Planned @BEGIN @1 @8 @3 @END @7 @2 +Block Sequence Planned @begin @1 @8 @3 @end @7 @2 CONTROL FLOW GRAPH - PHI LIFTED -@BEGIN: from +@begin: from to:@1 -@1: from @7 @BEGIN - (byte) s#2 ← phi( @7/(byte~) s#5 @BEGIN/(byte) 0 ) - (byte) i#2 ← phi( @7/(byte~) i#5 @BEGIN/(byte) 10 ) +@1: from @7 @begin + (byte) s#2 ← phi( @7/(byte~) s#5 @begin/(byte) 0 ) + (byte) i#2 ← phi( @7/(byte~) i#5 @begin/(byte) 10 ) if((byte) i#2>(byte) 5) goto @2 to:@8 @8: from @1 @@ -272,8 +272,8 @@ CONTROL FLOW GRAPH - PHI LIFTED (byte) s#4 ← phi( @8/(byte~) s#6 @2/(byte~) s#7 ) (byte) i#1 ← -- (byte) i#2 if((byte) i#1>(byte) 0) goto @7 - to:@END -@END: from @3 + to:@end +@end: from @3 @7: from @3 (byte~) i#5 ← (byte) i#1 (byte~) s#5 ← (byte) s#4 @@ -288,11 +288,11 @@ Propagating live ranges... Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES -@BEGIN: from +@begin: from to:@1 -@1: from @7 @BEGIN - [0] (byte) s#2 ← phi( @7/(byte~) s#5 @BEGIN/(byte) 0 ) [ i#2 s#2 ] - [0] (byte) i#2 ← phi( @7/(byte~) i#5 @BEGIN/(byte) 10 ) [ i#2 s#2 ] +@1: from @7 @begin + [0] (byte) s#2 ← phi( @7/(byte~) s#5 @begin/(byte) 0 ) [ i#2 s#2 ] + [0] (byte) i#2 ← phi( @7/(byte~) i#5 @begin/(byte) 10 ) [ i#2 s#2 ] [1] if((byte) i#2>(byte) 5) goto @2 [ i#2 s#2 ] to:@8 @8: from @1 @@ -302,8 +302,8 @@ CONTROL FLOW GRAPH - LIVE RANGES [3] (byte) s#4 ← phi( @8/(byte~) s#6 @2/(byte~) s#7 ) [ i#2 s#4 ] [4] (byte) i#1 ← -- (byte) i#2 [ i#1 s#4 ] [5] if((byte) i#1>(byte) 0) goto @7 [ i#1 s#4 ] - to:@END -@END: from @3 + to:@end +@end: from @3 @7: from @3 [6] (byte~) i#5 ← (byte) i#1 [ i#5 s#4 ] [7] (byte~) s#5 ← (byte) s#4 [ i#5 s#5 ] @@ -321,24 +321,24 @@ Coalesced [9] s#7 ← s#1 Coalesced down to 2 phi equivalence classes Culled Empty Block (label) @8 Culled Empty Block (label) @7 -Block Sequence Planned @BEGIN @1 @3 @END @2 +Block Sequence Planned @begin @1 @3 @end @2 Propagating live ranges... Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED -@BEGIN: from +@begin: from to:@1 -@1: from @3 @BEGIN - [0] (byte) s#2 ← phi( @3/(byte) s#4 @BEGIN/(byte) 0 ) [ i#2 s#2 ] - [0] (byte) i#2 ← phi( @3/(byte) i#1 @BEGIN/(byte) 10 ) [ i#2 s#2 ] +@1: from @3 @begin + [0] (byte) s#2 ← phi( @3/(byte) s#4 @begin/(byte) 0 ) [ i#2 s#2 ] + [0] (byte) i#2 ← phi( @3/(byte) i#1 @begin/(byte) 10 ) [ i#2 s#2 ] [1] if((byte) i#2>(byte) 5) goto @2 [ i#2 s#2 ] to:@3 @3: from @1 @2 [2] (byte) s#4 ← phi( @1/(byte) s#2 @2/(byte) s#1 ) [ s#4 i#2 ] [3] (byte) i#1 ← -- (byte) i#2 [ i#1 s#4 ] [4] if((byte) i#1>(byte) 0) goto @1 [ i#1 s#4 ] - to:@END -@END: from @3 + to:@end +@end: from @3 @2: from @1 [5] (byte) s#1 ← (byte) s#2 + (byte) i#2 [ i#2 s#1 ] to:@3 @@ -346,11 +346,11 @@ CONTROL FLOW GRAPH - PHI MEM COALESCED CALL GRAPH DOMINATORS -@BEGIN dominated by @BEGIN -@1 dominated by @1 @BEGIN -@3 dominated by @1 @BEGIN @3 -@END dominated by @1 @BEGIN @3 @END -@2 dominated by @1 @BEGIN @2 +@begin dominated by @begin +@1 dominated by @1 @begin +@3 dominated by @1 @3 @begin +@end dominated by @1 @3 @end @begin +@2 dominated by @1 @2 @begin Found back edge: Loop head: @1 tails: @3 blocks: null Populated: Loop head: @1 tails: @3 blocks: @3 @1 @2 @@ -381,55 +381,55 @@ Complete equivalence classes Allocated zp byte:2 to zp byte:2 [ i#2 i#1 ] Allocated zp byte:3 to zp byte:3 [ s#2 s#4 s#1 ] INITIAL ASM -//SEG0 @BEGIN -BBEGIN: -//SEG1 [0] phi from @BEGIN to @1 -B1_from_BBEGIN: +//SEG0 @begin +bbegin: +//SEG1 [0] phi from @begin to @1 +b1_from_bbegin: //SEG2 [0] phi (byte) s#2 = (byte) 0 -- zpby1=coby1 lda #$0 sta $3 //SEG3 [0] phi (byte) i#2 = (byte) 10 -- zpby1=coby1 lda #$a sta $2 - jmp B1 + jmp b1 //SEG4 [0] phi from @3 to @1 -B1_from_B3: +b1_from_b3: //SEG5 [0] phi (byte) s#2 = (byte) s#4 -- register_copy //SEG6 [0] phi (byte) i#2 = (byte) i#1 -- register_copy - jmp B1 + jmp b1 //SEG7 @1 -B1: +b1: //SEG8 [1] if((byte) i#2>(byte) 5) goto @2 [ i#2 s#2 ] -- zpby1_gt_coby1_then_la1 lda $2 cmp #$5 beq !+ - bcs B2 + bcs b2 !: //SEG9 [2] phi from @1 to @3 -B3_from_B1: +b3_from_b1: //SEG10 [2] phi (byte) s#4 = (byte) s#2 -- register_copy - jmp B3 + jmp b3 //SEG11 @3 -B3: +b3: //SEG12 [3] (byte) i#1 ← -- (byte) i#2 [ i#1 s#4 ] -- zpby1=_dec_zpby1 dec $2 //SEG13 [4] if((byte) i#1>(byte) 0) goto @1 [ i#1 s#4 ] -- zpby1_gt_0_then_la1 lda $2 - bne B1_from_B3 - jmp BEND -//SEG14 @END -BEND: + bne b1_from_b3 + jmp bend +//SEG14 @end +bend: //SEG15 @2 -B2: +b2: //SEG16 [5] (byte) s#1 ← (byte) s#2 + (byte) i#2 [ i#2 s#1 ] -- zpby1=zpby1_plus_zpby2 lda $3 clc adc $2 sta $3 //SEG17 [2] phi from @2 to @3 -B3_from_B2: +b3_from_b2: //SEG18 [2] phi (byte) s#4 = (byte) s#1 -- register_copy - jmp B3 + jmp b3 REGISTER UPLIFT POTENTIAL REGISTERS Potential registers zp byte:2 [ i#2 i#1 ] : zp byte:2 , reg byte a , reg byte x , reg byte y , @@ -439,105 +439,105 @@ REGISTER UPLIFT SCOPES Uplift Scope [] 49.5: zp byte:3 [ s#2 s#4 s#1 ] 27.5: zp byte:2 [ i#2 i#1 ] Uplifting [] best 405 combination reg byte a [ s#2 s#4 s#1 ] reg byte x [ i#2 i#1 ] -Removing instruction jmp B1 -Removing instruction jmp B3 -Removing instruction jmp BEND +Removing instruction jmp b1 +Removing instruction jmp b3 +Removing instruction jmp bend Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: -//SEG1 [0] phi from @BEGIN to @1 -B1_from_BBEGIN: +//SEG0 @begin +bbegin: +//SEG1 [0] phi from @begin to @1 +b1_from_bbegin: //SEG2 [0] phi (byte) s#2 = (byte) 0 -- aby=coby1 lda #$0 //SEG3 [0] phi (byte) i#2 = (byte) 10 -- xby=coby1 ldx #$a - jmp B1 + jmp b1 //SEG4 [0] phi from @3 to @1 -B1_from_B3: +b1_from_b3: //SEG5 [0] phi (byte) s#2 = (byte) s#4 -- register_copy //SEG6 [0] phi (byte) i#2 = (byte) i#1 -- register_copy //SEG7 @1 -B1: +b1: //SEG8 [1] if((byte) i#2>(byte) 5) goto @2 [ i#2 s#2 ] -- xby_gt_coby1_then_la1 cpx #$5 beq !+ - bcs B2 + bcs b2 !: //SEG9 [2] phi from @1 to @3 -B3_from_B1: +b3_from_b1: //SEG10 [2] phi (byte) s#4 = (byte) s#2 -- register_copy //SEG11 @3 -B3: +b3: //SEG12 [3] (byte) i#1 ← -- (byte) i#2 [ i#1 s#4 ] -- xby=_dec_xby dex //SEG13 [4] if((byte) i#1>(byte) 0) goto @1 [ i#1 s#4 ] -- xby_gt_0_then_la1 cpx #$0 - bne B1_from_B3 -//SEG14 @END -BEND: + bne b1_from_b3 +//SEG14 @end +bend: //SEG15 @2 -B2: +b2: //SEG16 [5] (byte) s#1 ← (byte) s#2 + (byte) i#2 [ i#2 s#1 ] -- aby=aby_plus_xby stx $ff clc adc $ff //SEG17 [2] phi from @2 to @3 -B3_from_B2: +b3_from_b2: //SEG18 [2] phi (byte) s#4 = (byte) s#1 -- register_copy - jmp B3 + jmp b3 -Removing instruction jmp B1 +Removing instruction jmp b1 Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: -//SEG1 [0] phi from @BEGIN to @1 -B1_from_BBEGIN: +//SEG0 @begin +bbegin: +//SEG1 [0] phi from @begin to @1 +b1_from_bbegin: //SEG2 [0] phi (byte) s#2 = (byte) 0 -- aby=coby1 lda #$0 //SEG3 [0] phi (byte) i#2 = (byte) 10 -- xby=coby1 ldx #$a //SEG4 [0] phi from @3 to @1 -B1_from_B3: +b1_from_b3: //SEG5 [0] phi (byte) s#2 = (byte) s#4 -- register_copy //SEG6 [0] phi (byte) i#2 = (byte) i#1 -- register_copy //SEG7 @1 -B1: +b1: //SEG8 [1] if((byte) i#2>(byte) 5) goto @2 [ i#2 s#2 ] -- xby_gt_coby1_then_la1 cpx #$5 beq !+ - bcs B2 + bcs b2 !: //SEG9 [2] phi from @1 to @3 -B3_from_B1: +b3_from_b1: //SEG10 [2] phi (byte) s#4 = (byte) s#2 -- register_copy //SEG11 @3 -B3: +b3: //SEG12 [3] (byte) i#1 ← -- (byte) i#2 [ i#1 s#4 ] -- xby=_dec_xby dex //SEG13 [4] if((byte) i#1>(byte) 0) goto @1 [ i#1 s#4 ] -- xby_gt_0_then_la1 cpx #$0 - bne B1_from_B3 -//SEG14 @END -BEND: + bne b1_from_b3 +//SEG14 @end +bend: //SEG15 @2 -B2: +b2: //SEG16 [5] (byte) s#1 ← (byte) s#2 + (byte) i#2 [ i#2 s#1 ] -- aby=aby_plus_xby stx $ff clc adc $ff //SEG17 [2] phi from @2 to @3 -B3_from_B2: +b3_from_b2: //SEG18 [2] phi (byte) s#4 = (byte) s#1 -- register_copy - jmp B3 + jmp b3 FINAL SYMBOL TABLE (label) @1 (label) @2 (label) @3 -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte) i (byte) i#1 reg byte x 16.5 (byte) i#2 reg byte x 11.0 @@ -550,45 +550,45 @@ reg byte x [ i#2 i#1 ] reg byte a [ s#2 s#4 s#1 ] FINAL CODE -//SEG0 @BEGIN -BBEGIN: -//SEG1 [0] phi from @BEGIN to @1 -B1_from_BBEGIN: +//SEG0 @begin +bbegin: +//SEG1 [0] phi from @begin to @1 +b1_from_bbegin: //SEG2 [0] phi (byte) s#2 = (byte) 0 -- aby=coby1 lda #$0 //SEG3 [0] phi (byte) i#2 = (byte) 10 -- xby=coby1 ldx #$a //SEG4 [0] phi from @3 to @1 -B1_from_B3: +b1_from_b3: //SEG5 [0] phi (byte) s#2 = (byte) s#4 -- register_copy //SEG6 [0] phi (byte) i#2 = (byte) i#1 -- register_copy //SEG7 @1 -B1: +b1: //SEG8 [1] if((byte) i#2>(byte) 5) goto @2 [ i#2 s#2 ] -- xby_gt_coby1_then_la1 cpx #$5 beq !+ - bcs B2 + bcs b2 !: //SEG9 [2] phi from @1 to @3 -B3_from_B1: +b3_from_b1: //SEG10 [2] phi (byte) s#4 = (byte) s#2 -- register_copy //SEG11 @3 -B3: +b3: //SEG12 [3] (byte) i#1 ← -- (byte) i#2 [ i#1 s#4 ] -- xby=_dec_xby dex //SEG13 [4] if((byte) i#1>(byte) 0) goto @1 [ i#1 s#4 ] -- xby_gt_0_then_la1 cpx #$0 - bne B1_from_B3 -//SEG14 @END -BEND: + bne b1_from_b3 +//SEG14 @end +bend: //SEG15 @2 -B2: +b2: //SEG16 [5] (byte) s#1 ← (byte) s#2 + (byte) i#2 [ i#2 s#1 ] -- aby=aby_plus_xby stx $ff clc adc $ff //SEG17 [2] phi from @2 to @3 -B3_from_B2: +b3_from_b2: //SEG18 [2] phi (byte) s#4 = (byte) s#1 -- register_copy - jmp B3 + jmp b3 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopmin.sym b/src/main/java/dk/camelot64/kickc/test/ref/loopmin.sym index df7eb690f..049b5041c 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopmin.sym +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopmin.sym @@ -1,8 +1,8 @@ (label) @1 (label) @2 (label) @3 -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte) i (byte) i#1 reg byte x 16.5 (byte) i#2 reg byte x 11.0 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopnest.asm b/src/main/java/dk/camelot64/kickc/test/ref/loopnest.asm index 0ebc60fa9..2511a4484 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopnest.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopnest.asm @@ -1,26 +1,28 @@ -BBEGIN: +bbegin: jsr main -BEND: -main: -main__B1_from_main: - ldy #$64 -main__B1_from_B3: -main__B1: - jsr nest -main__B3: - dey - cpy #$0 - bne main__B1_from_B3 -main__Breturn: - rts -nest: -nest__B1_from_nest: - ldx #$64 -nest__B1_from_B1: -nest__B1: - stx $400 - dex - cpx #$0 - bne nest__B1_from_B1 -nest__Breturn: - rts +bend: +main: { + b1_from_main: + ldy #$64 + b1_from_b3: + b1: + jsr nest + b3: + dey + cpy #$0 + bne b1_from_b3 + breturn: + rts +} +nest: { + b1_from_nest: + ldx #$64 + b1_from_b1: + b1: + stx $400 + dex + cpx #$0 + bne b1_from_b1 + breturn: + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopnest.cfg b/src/main/java/dk/camelot64/kickc/test/ref/loopnest.cfg index 71c51cb40..880c2c746 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopnest.cfg +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopnest.cfg @@ -1,8 +1,8 @@ -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@3 [1] (byte) main::i#2 ← phi( main/(byte) 100 main::@3/(byte) main::i#1 ) [ main::i#2 ] @@ -14,7 +14,7 @@ main::@3: from main::@1 to:main::@return main::@return: from main::@3 [5] return [ ] - to:@RETURN + to:@return nest: from main::@1 to:nest::@1 nest::@1: from nest nest::@1 @@ -25,4 +25,4 @@ nest::@1: from nest nest::@1 to:nest::@return nest::@return: from nest::@1 [10] return [ main::i#2 ] - to:@RETURN + to:@return diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopnest.log b/src/main/java/dk/camelot64/kickc/test/ref/loopnest.log index 10cd894fb..40b0e3905 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopnest.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopnest.log @@ -58,7 +58,7 @@ SYMBOLS (byte) nest::j INITIAL CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte*) SCREEN ← (word) 1024 (void~) $0 ← call main to:@1 @@ -75,8 +75,8 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 return - to:@RETURN -@1: from @BEGIN + to:@return +@1: from @begin to:@2 nest: from (byte) nest::j ← (byte) 100 @@ -91,20 +91,20 @@ nest::@2: from nest::@1 to:nest::@return nest::@return: from nest::@2 return - to:@RETURN + to:@return @2: from @1 - to:@END -@END: from @2 + to:@end +@end: from @2 Removing empty block main::@2 Removing empty block @1 Removing empty block nest::@2 Removing empty block @2 CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte*) SCREEN ← (word) 1024 (void~) $0 ← call main - to:@END + to:@end main: from (byte) main::i ← (byte) 100 to:main::@1 @@ -116,7 +116,7 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 return - to:@RETURN + to:@return nest: from (byte) nest::j ← (byte) 100 to:nest::@1 @@ -128,19 +128,19 @@ nest::@1: from nest nest::@1 to:nest::@return nest::@return: from nest::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin PROCEDURE MODIFY VARIABLE ANALYSIS CONTROL FLOW GRAPH WITH ASSIGNMENT CALL -@BEGIN: from +@begin: from (byte*) SCREEN ← (word) 1024 call main param-assignment to:@3 -@3: from @BEGIN - to:@END -main: from @BEGIN +@3: from @begin + to:@end +main: from @begin (byte) main::i ← (byte) 100 to:main::@1 main::@1: from main main::@3 @@ -153,7 +153,7 @@ main::@3: from main::@1 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest: from main::@1 (byte) nest::j ← (byte) 100 to:nest::@1 @@ -165,22 +165,22 @@ nest::@1: from nest nest::@1 to:nest::@return nest::@return: from nest::@1 return - to:@RETURN -@END: from @3 + to:@return +@end: from @3 Completing Phi functions... Completing Phi functions... Completing Phi functions... Completing Phi functions... CONTROL FLOW GRAPH SSA -@BEGIN: from +@begin: from (byte*) SCREEN#0 ← (word) 1024 call main param-assignment to:@3 -@3: from @BEGIN - to:@END -main: from @BEGIN - (byte*) SCREEN#4 ← phi( @BEGIN/(byte*) SCREEN#0 ) +@3: from @begin + to:@end +main: from @begin + (byte*) SCREEN#4 ← phi( @begin/(byte*) SCREEN#0 ) (byte) main::i#0 ← (byte) 100 to:main::@1 main::@1: from main main::@3 @@ -197,7 +197,7 @@ main::@3: from main::@1 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest: from main::@1 (byte*) SCREEN#2 ← phi( main::@1/(byte*) SCREEN#3 ) (byte) nest::j#0 ← (byte) 100 @@ -212,18 +212,18 @@ nest::@1: from nest nest::@1 to:nest::@return nest::@return: from nest::@1 return - to:@RETURN -@END: from @3 + to:@return +@end: from @3 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN -@BEGIN: from +@begin: from (byte*) SCREEN#0 ← (word) 1024 call main param-assignment to:@3 -@3: from @BEGIN - to:@END -main: from @BEGIN - (byte*) SCREEN#4 ← phi( @BEGIN/(byte*) SCREEN#0 ) +@3: from @begin + to:@end +main: from @begin + (byte*) SCREEN#4 ← phi( @begin/(byte*) SCREEN#0 ) (byte) main::i#0 ← (byte) 100 to:main::@1 main::@1: from main main::@3 @@ -240,7 +240,7 @@ main::@3: from main::@1 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest: from main::@1 (byte*) SCREEN#2 ← phi( main::@1/(byte*) SCREEN#3 ) (byte) nest::j#0 ← (byte) 100 @@ -255,18 +255,18 @@ nest::@1: from nest nest::@1 to:nest::@return nest::@return: from nest::@1 return - to:@RETURN -@END: from @3 + to:@return +@end: from @3 Culled Empty Block (label) @3 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte*) SCREEN#0 ← (word) 1024 call main param-assignment - to:@END -main: from @BEGIN - (byte*) SCREEN#4 ← phi( @BEGIN/(byte*) SCREEN#0 ) + to:@end +main: from @begin + (byte*) SCREEN#4 ← phi( @begin/(byte*) SCREEN#0 ) (byte) main::i#0 ← (byte) 100 to:main::@1 main::@1: from main main::@3 @@ -283,7 +283,7 @@ main::@3: from main::@1 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest: from main::@1 (byte*) SCREEN#2 ← phi( main::@1/(byte*) SCREEN#3 ) (byte) nest::j#0 ← (byte) 100 @@ -298,19 +298,19 @@ nest::@1: from nest nest::@1 to:nest::@return nest::@return: from nest::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte*) SCREEN#0 (word) 1024 Constant (byte) main::i#0 (byte) 100 Constant (byte) nest::j#0 (byte) 100 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN - (byte*) SCREEN#4 ← phi( @BEGIN/(word) 1024 ) + to:@end +main: from @begin + (byte*) SCREEN#4 ← phi( @begin/(word) 1024 ) to:main::@1 main::@1: from main main::@3 (byte*) SCREEN#3 ← phi( main/(byte*) SCREEN#4 main::@3/(byte*) SCREEN#5 ) @@ -326,7 +326,7 @@ main::@3: from main::@1 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest: from main::@1 (byte*) SCREEN#2 ← phi( main::@1/(byte*) SCREEN#3 ) to:nest::@1 @@ -340,18 +340,18 @@ nest::@1: from nest nest::@1 to:nest::@return nest::@return: from nest::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Alias (byte) main::i#2 = (byte) main::i#3 Alias (byte*) SCREEN#2 = (byte*) SCREEN#5 (byte*) SCREEN#3 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN - (byte*) SCREEN#4 ← phi( @BEGIN/(word) 1024 ) + to:@end +main: from @begin + (byte*) SCREEN#4 ← phi( @begin/(word) 1024 ) to:main::@1 main::@1: from main main::@3 (byte*) SCREEN#2 ← phi( main/(byte*) SCREEN#4 main::@3/(byte*) SCREEN#2 ) @@ -365,7 +365,7 @@ main::@3: from main::@1 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest: from main::@1 to:nest::@1 nest::@1: from nest nest::@1 @@ -378,16 +378,16 @@ nest::@1: from nest nest::@1 to:nest::@return nest::@return: from nest::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Redundant Phi (byte*) SCREEN#4 (word) 1024 Succesful SSA optimization Pass2RedundantPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@3 (byte*) SCREEN#2 ← phi( main/(word) 1024 main::@3/(byte*) SCREEN#2 ) @@ -401,7 +401,7 @@ main::@3: from main::@1 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest: from main::@1 to:nest::@1 nest::@1: from nest nest::@1 @@ -414,17 +414,17 @@ nest::@1: from nest nest::@1 to:nest::@return nest::@return: from nest::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Self Phi Eliminated (byte*) SCREEN#2 Self Phi Eliminated (byte*) SCREEN#1 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@3 (byte*) SCREEN#2 ← phi( main/(word) 1024 ) @@ -438,7 +438,7 @@ main::@3: from main::@1 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest: from main::@1 to:nest::@1 nest::@1: from nest nest::@1 @@ -451,17 +451,17 @@ nest::@1: from nest nest::@1 to:nest::@return nest::@return: from nest::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Simple Condition (boolean~) main::$1 if((byte) main::i#1>(byte) 0) goto main::@1 Simple Condition (boolean~) nest::$0 if((byte) nest::j#1>(byte) 0) goto nest::@1 Succesful SSA optimization Pass2ConditionalJumpSimplification CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@3 (byte*) SCREEN#2 ← phi( main/(word) 1024 ) @@ -474,7 +474,7 @@ main::@3: from main::@1 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest: from main::@1 to:nest::@1 nest::@1: from nest nest::@1 @@ -486,16 +486,16 @@ nest::@1: from nest nest::@1 to:nest::@return nest::@return: from nest::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte*) SCREEN#2 (word) 1024 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@3 (byte) main::i#2 ← phi( main/(byte) 100 main::@3/(byte) main::i#1 ) @@ -507,7 +507,7 @@ main::@3: from main::@1 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest: from main::@1 to:nest::@1 nest::@1: from nest nest::@1 @@ -519,16 +519,16 @@ nest::@1: from nest nest::@1 to:nest::@return nest::@return: from nest::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Redundant Phi (byte*) SCREEN#1 (word) 1024 Succesful SSA optimization Pass2RedundantPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@3 (byte) main::i#2 ← phi( main/(byte) 100 main::@3/(byte) main::i#1 ) @@ -540,7 +540,7 @@ main::@3: from main::@1 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest: from main::@1 to:nest::@1 nest::@1: from nest nest::@1 @@ -551,19 +551,19 @@ nest::@1: from nest nest::@1 to:nest::@return nest::@return: from nest::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin -Block Sequence Planned @BEGIN @END main main::@1 main::@3 main::@return nest nest::@1 nest::@return +Block Sequence Planned @begin @end main main::@1 main::@3 main::@return nest nest::@1 nest::@return Added new block during phi lifting main::@4(between main::@3 and main::@1) Added new block during phi lifting nest::@3(between nest::@1 and nest::@1) -Block Sequence Planned @BEGIN @END main main::@1 main::@3 main::@return main::@4 nest nest::@1 nest::@return nest::@3 +Block Sequence Planned @begin @end main main::@1 main::@3 main::@return main::@4 nest nest::@1 nest::@return nest::@3 CONTROL FLOW GRAPH - PHI LIFTED -@BEGIN: from +@begin: from call main param-assignment - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@4 (byte) main::i#2 ← phi( main/(byte) 100 main::@4/(byte~) main::i#4 ) @@ -575,7 +575,7 @@ main::@3: from main::@1 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return main::@4: from main::@3 (byte~) main::i#4 ← (byte) main::i#1 to:main::@1 @@ -589,7 +589,7 @@ nest::@1: from nest nest::@3 to:nest::@return nest::@return: from nest::@1 return - to:@RETURN + to:@return nest::@3: from nest::@1 (byte~) nest::j#3 ← (byte) nest::j#1 to:nest::@1 @@ -603,11 +603,11 @@ Propagating live ranges... Propagated main::i#2 through call [2] call nest param-assignment Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@4 [1] (byte) main::i#2 ← phi( main/(byte) 100 main::@4/(byte~) main::i#4 ) [ main::i#2 ] @@ -619,7 +619,7 @@ main::@3: from main::@1 to:main::@return main::@return: from main::@3 [5] return [ ] - to:@RETURN + to:@return main::@4: from main::@3 [6] (byte~) main::i#4 ← (byte) main::i#1 [ main::i#4 ] to:main::@1 @@ -633,7 +633,7 @@ nest::@1: from nest nest::@3 to:nest::@return nest::@return: from nest::@1 [11] return [ main::i#2 ] - to:@RETURN + to:@return nest::@3: from nest::@1 [12] (byte~) nest::j#3 ← (byte) nest::j#1 [ main::i#2 nest::j#3 ] to:nest::@1 @@ -644,7 +644,7 @@ Coalesced [12] nest::j#3 ← nest::j#1 Coalesced down to 2 phi equivalence classes Culled Empty Block (label) main::@4 Culled Empty Block (label) nest::@3 -Block Sequence Planned @BEGIN @END main main::@1 main::@3 main::@return nest nest::@1 nest::@return +Block Sequence Planned @begin @end main main::@1 main::@3 main::@return nest nest::@1 nest::@return Propagating live ranges... Propagating live ranges... Propagating live ranges... @@ -654,11 +654,11 @@ Propagating live ranges... Propagated main::i#2 through call [2] call nest param-assignment Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@3 [1] (byte) main::i#2 ← phi( main/(byte) 100 main::@3/(byte) main::i#1 ) [ main::i#2 ] @@ -670,7 +670,7 @@ main::@3: from main::@1 to:main::@return main::@return: from main::@3 [5] return [ ] - to:@RETURN + to:@return nest: from main::@1 to:nest::@1 nest::@1: from nest nest::@1 @@ -681,22 +681,22 @@ nest::@1: from nest nest::@1 to:nest::@return nest::@return: from nest::@1 [10] return [ main::i#2 ] - to:@RETURN + to:@return CALL GRAPH Calls in [] to 0:main Calls in [main] to 2:nest DOMINATORS -@BEGIN dominated by @BEGIN -@END dominated by @BEGIN @END -main dominated by @BEGIN main -main::@1 dominated by @BEGIN main::@1 main -main::@3 dominated by @BEGIN main::@1 main::@3 main -main::@return dominated by @BEGIN main::@return main::@1 main::@3 main -nest dominated by @BEGIN nest main::@1 main -nest::@1 dominated by @BEGIN nest main::@1 nest::@1 main -nest::@return dominated by @BEGIN nest::@return nest main::@1 nest::@1 main +@begin dominated by @begin +@end dominated by @end @begin +main dominated by @begin main +main::@1 dominated by @begin main::@1 main +main::@3 dominated by @begin main::@1 main::@3 main +main::@return dominated by main::@return @begin main::@1 main::@3 main +nest dominated by @begin nest main::@1 main +nest::@1 dominated by @begin nest main::@1 nest::@1 main +nest::@return dominated by nest::@return @begin nest main::@1 nest::@1 main Found back edge: Loop head: main::@1 tails: main::@3 blocks: null Found back edge: Loop head: nest::@1 tails: nest::@1 blocks: null @@ -736,69 +736,71 @@ Complete equivalence classes Allocated zp byte:2 to zp byte:2 [ main::i#2 main::i#1 ] Allocated zp byte:3 to zp byte:3 [ nest::j#2 nest::j#1 ] INITIAL ASM -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main - jmp BEND -//SEG2 @END -BEND: + jmp bend +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] phi from main to main::@1 -main__B1_from_main: -//SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $2 - jmp main__B1 -//SEG6 [1] phi from main::@3 to main::@1 -main__B1_from_B3: -//SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy - jmp main__B1 -//SEG8 main::@1 -main__B1: -//SEG9 [2] call nest param-assignment [ main::i#2 ] - jsr nest - jmp main__B3 -//SEG10 main::@3 -main__B3: -//SEG11 [3] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- zpby1=_dec_zpby1 - dec $2 -//SEG12 [4] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- zpby1_gt_0_then_la1 - lda $2 - bne main__B1_from_B3 - jmp main__Breturn -//SEG13 main::@return -main__Breturn: -//SEG14 [5] return [ ] - rts +main: { + //SEG4 [1] phi from main to main::@1 + b1_from_main: + //SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $2 + jmp b1 + //SEG6 [1] phi from main::@3 to main::@1 + b1_from_b3: + //SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy + jmp b1 + //SEG8 main::@1 + b1: + //SEG9 [2] call nest param-assignment [ main::i#2 ] + jsr nest + jmp b3 + //SEG10 main::@3 + b3: + //SEG11 [3] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- zpby1=_dec_zpby1 + dec $2 + //SEG12 [4] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- zpby1_gt_0_then_la1 + lda $2 + bne b1_from_b3 + jmp breturn + //SEG13 main::@return + breturn: + //SEG14 [5] return [ ] + rts +} //SEG15 nest -nest: -//SEG16 [6] phi from nest to nest::@1 -nest__B1_from_nest: -//SEG17 [6] phi (byte) nest::j#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $3 - jmp nest__B1 -//SEG18 [6] phi from nest::@1 to nest::@1 -nest__B1_from_B1: -//SEG19 [6] phi (byte) nest::j#2 = (byte) nest::j#1 -- register_copy - jmp nest__B1 -//SEG20 nest::@1 -nest__B1: -//SEG21 [7] *((word) 1024) ← (byte) nest::j#2 [ main::i#2 nest::j#2 ] -- _star_cowo1=zpby1 - lda $3 - sta $400 -//SEG22 [8] (byte) nest::j#1 ← -- (byte) nest::j#2 [ main::i#2 nest::j#1 ] -- zpby1=_dec_zpby1 - dec $3 -//SEG23 [9] if((byte) nest::j#1>(byte) 0) goto nest::@1 [ main::i#2 nest::j#1 ] -- zpby1_gt_0_then_la1 - lda $3 - bne nest__B1_from_B1 - jmp nest__Breturn -//SEG24 nest::@return -nest__Breturn: -//SEG25 [10] return [ main::i#2 ] - rts +nest: { + //SEG16 [6] phi from nest to nest::@1 + b1_from_nest: + //SEG17 [6] phi (byte) nest::j#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $3 + jmp b1 + //SEG18 [6] phi from nest::@1 to nest::@1 + b1_from_b1: + //SEG19 [6] phi (byte) nest::j#2 = (byte) nest::j#1 -- register_copy + jmp b1 + //SEG20 nest::@1 + b1: + //SEG21 [7] *((word) 1024) ← (byte) nest::j#2 [ main::i#2 nest::j#2 ] -- _star_cowo1=zpby1 + lda $3 + sta $400 + //SEG22 [8] (byte) nest::j#1 ← -- (byte) nest::j#2 [ main::i#2 nest::j#1 ] -- zpby1=_dec_zpby1 + dec $3 + //SEG23 [9] if((byte) nest::j#1>(byte) 0) goto nest::@1 [ main::i#2 nest::j#1 ] -- zpby1_gt_0_then_la1 + lda $3 + bne b1_from_b1 + jmp breturn + //SEG24 nest::@return + breturn: + //SEG25 [10] return [ main::i#2 ] + rts +} REGISTER UPLIFT POTENTIAL REGISTERS Potential registers zp byte:2 [ main::i#2 main::i#1 ] : zp byte:2 , reg byte a , reg byte x , reg byte y , @@ -812,129 +814,133 @@ Uplift Scope [] Uplifting [nest] best 2506 combination reg byte x [ nest::j#2 nest::j#1 ] Uplifting [main] best 2436 combination reg byte y [ main::i#2 main::i#1 ] Uplifting [] best 2436 combination -Removing instruction jmp BEND -Removing instruction jmp main__B1 -Removing instruction jmp main__B3 -Removing instruction jmp main__Breturn -Removing instruction jmp nest__B1 -Removing instruction jmp nest__Breturn +Removing instruction jmp bend +Removing instruction jmp b1 +Removing instruction jmp b3 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp breturn Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] phi from main to main::@1 -main__B1_from_main: -//SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- yby=coby1 - ldy #$64 - jmp main__B1 -//SEG6 [1] phi from main::@3 to main::@1 -main__B1_from_B3: -//SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy -//SEG8 main::@1 -main__B1: -//SEG9 [2] call nest param-assignment [ main::i#2 ] - jsr nest -//SEG10 main::@3 -main__B3: -//SEG11 [3] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- yby=_dec_yby - dey -//SEG12 [4] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- yby_gt_0_then_la1 - cpy #$0 - bne main__B1_from_B3 -//SEG13 main::@return -main__Breturn: -//SEG14 [5] return [ ] - rts +main: { + //SEG4 [1] phi from main to main::@1 + b1_from_main: + //SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- yby=coby1 + ldy #$64 + jmp b1 + //SEG6 [1] phi from main::@3 to main::@1 + b1_from_b3: + //SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy + //SEG8 main::@1 + b1: + //SEG9 [2] call nest param-assignment [ main::i#2 ] + jsr nest + //SEG10 main::@3 + b3: + //SEG11 [3] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- yby=_dec_yby + dey + //SEG12 [4] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- yby_gt_0_then_la1 + cpy #$0 + bne b1_from_b3 + //SEG13 main::@return + breturn: + //SEG14 [5] return [ ] + rts +} //SEG15 nest -nest: -//SEG16 [6] phi from nest to nest::@1 -nest__B1_from_nest: -//SEG17 [6] phi (byte) nest::j#2 = (byte) 100 -- xby=coby1 - ldx #$64 - jmp nest__B1 -//SEG18 [6] phi from nest::@1 to nest::@1 -nest__B1_from_B1: -//SEG19 [6] phi (byte) nest::j#2 = (byte) nest::j#1 -- register_copy -//SEG20 nest::@1 -nest__B1: -//SEG21 [7] *((word) 1024) ← (byte) nest::j#2 [ main::i#2 nest::j#2 ] -- _star_cowo1=xby - stx $400 -//SEG22 [8] (byte) nest::j#1 ← -- (byte) nest::j#2 [ main::i#2 nest::j#1 ] -- xby=_dec_xby - dex -//SEG23 [9] if((byte) nest::j#1>(byte) 0) goto nest::@1 [ main::i#2 nest::j#1 ] -- xby_gt_0_then_la1 - cpx #$0 - bne nest__B1_from_B1 -//SEG24 nest::@return -nest__Breturn: -//SEG25 [10] return [ main::i#2 ] - rts +nest: { + //SEG16 [6] phi from nest to nest::@1 + b1_from_nest: + //SEG17 [6] phi (byte) nest::j#2 = (byte) 100 -- xby=coby1 + ldx #$64 + jmp b1 + //SEG18 [6] phi from nest::@1 to nest::@1 + b1_from_b1: + //SEG19 [6] phi (byte) nest::j#2 = (byte) nest::j#1 -- register_copy + //SEG20 nest::@1 + b1: + //SEG21 [7] *((word) 1024) ← (byte) nest::j#2 [ main::i#2 nest::j#2 ] -- _star_cowo1=xby + stx $400 + //SEG22 [8] (byte) nest::j#1 ← -- (byte) nest::j#2 [ main::i#2 nest::j#1 ] -- xby=_dec_xby + dex + //SEG23 [9] if((byte) nest::j#1>(byte) 0) goto nest::@1 [ main::i#2 nest::j#1 ] -- xby_gt_0_then_la1 + cpx #$0 + bne b1_from_b1 + //SEG24 nest::@return + breturn: + //SEG25 [10] return [ main::i#2 ] + rts +} -Removing instruction jmp main__B1 -Removing instruction jmp nest__B1 +Removing instruction jmp b1 +Removing instruction jmp b1 Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] phi from main to main::@1 -main__B1_from_main: -//SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- yby=coby1 - ldy #$64 -//SEG6 [1] phi from main::@3 to main::@1 -main__B1_from_B3: -//SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy -//SEG8 main::@1 -main__B1: -//SEG9 [2] call nest param-assignment [ main::i#2 ] - jsr nest -//SEG10 main::@3 -main__B3: -//SEG11 [3] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- yby=_dec_yby - dey -//SEG12 [4] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- yby_gt_0_then_la1 - cpy #$0 - bne main__B1_from_B3 -//SEG13 main::@return -main__Breturn: -//SEG14 [5] return [ ] - rts +main: { + //SEG4 [1] phi from main to main::@1 + b1_from_main: + //SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- yby=coby1 + ldy #$64 + //SEG6 [1] phi from main::@3 to main::@1 + b1_from_b3: + //SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy + //SEG8 main::@1 + b1: + //SEG9 [2] call nest param-assignment [ main::i#2 ] + jsr nest + //SEG10 main::@3 + b3: + //SEG11 [3] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- yby=_dec_yby + dey + //SEG12 [4] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- yby_gt_0_then_la1 + cpy #$0 + bne b1_from_b3 + //SEG13 main::@return + breturn: + //SEG14 [5] return [ ] + rts +} //SEG15 nest -nest: -//SEG16 [6] phi from nest to nest::@1 -nest__B1_from_nest: -//SEG17 [6] phi (byte) nest::j#2 = (byte) 100 -- xby=coby1 - ldx #$64 -//SEG18 [6] phi from nest::@1 to nest::@1 -nest__B1_from_B1: -//SEG19 [6] phi (byte) nest::j#2 = (byte) nest::j#1 -- register_copy -//SEG20 nest::@1 -nest__B1: -//SEG21 [7] *((word) 1024) ← (byte) nest::j#2 [ main::i#2 nest::j#2 ] -- _star_cowo1=xby - stx $400 -//SEG22 [8] (byte) nest::j#1 ← -- (byte) nest::j#2 [ main::i#2 nest::j#1 ] -- xby=_dec_xby - dex -//SEG23 [9] if((byte) nest::j#1>(byte) 0) goto nest::@1 [ main::i#2 nest::j#1 ] -- xby_gt_0_then_la1 - cpx #$0 - bne nest__B1_from_B1 -//SEG24 nest::@return -nest__Breturn: -//SEG25 [10] return [ main::i#2 ] - rts +nest: { + //SEG16 [6] phi from nest to nest::@1 + b1_from_nest: + //SEG17 [6] phi (byte) nest::j#2 = (byte) 100 -- xby=coby1 + ldx #$64 + //SEG18 [6] phi from nest::@1 to nest::@1 + b1_from_b1: + //SEG19 [6] phi (byte) nest::j#2 = (byte) nest::j#1 -- register_copy + //SEG20 nest::@1 + b1: + //SEG21 [7] *((word) 1024) ← (byte) nest::j#2 [ main::i#2 nest::j#2 ] -- _star_cowo1=xby + stx $400 + //SEG22 [8] (byte) nest::j#1 ← -- (byte) nest::j#2 [ main::i#2 nest::j#1 ] -- xby=_dec_xby + dex + //SEG23 [9] if((byte) nest::j#1>(byte) 0) goto nest::@1 [ main::i#2 nest::j#1 ] -- xby_gt_0_then_la1 + cpx #$0 + bne b1_from_b1 + //SEG24 nest::@return + breturn: + //SEG25 [10] return [ main::i#2 ] + rts +} FINAL SYMBOL TABLE -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte*) SCREEN (void()) main() (label) main::@1 @@ -954,56 +960,58 @@ reg byte y [ main::i#2 main::i#1 ] reg byte x [ nest::j#2 nest::j#1 ] FINAL CODE -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] phi from main to main::@1 -main__B1_from_main: -//SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- yby=coby1 - ldy #$64 -//SEG6 [1] phi from main::@3 to main::@1 -main__B1_from_B3: -//SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy -//SEG8 main::@1 -main__B1: -//SEG9 [2] call nest param-assignment [ main::i#2 ] - jsr nest -//SEG10 main::@3 -main__B3: -//SEG11 [3] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- yby=_dec_yby - dey -//SEG12 [4] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- yby_gt_0_then_la1 - cpy #$0 - bne main__B1_from_B3 -//SEG13 main::@return -main__Breturn: -//SEG14 [5] return [ ] - rts +main: { + //SEG4 [1] phi from main to main::@1 + b1_from_main: + //SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- yby=coby1 + ldy #$64 + //SEG6 [1] phi from main::@3 to main::@1 + b1_from_b3: + //SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy + //SEG8 main::@1 + b1: + //SEG9 [2] call nest param-assignment [ main::i#2 ] + jsr nest + //SEG10 main::@3 + b3: + //SEG11 [3] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- yby=_dec_yby + dey + //SEG12 [4] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- yby_gt_0_then_la1 + cpy #$0 + bne b1_from_b3 + //SEG13 main::@return + breturn: + //SEG14 [5] return [ ] + rts +} //SEG15 nest -nest: -//SEG16 [6] phi from nest to nest::@1 -nest__B1_from_nest: -//SEG17 [6] phi (byte) nest::j#2 = (byte) 100 -- xby=coby1 - ldx #$64 -//SEG18 [6] phi from nest::@1 to nest::@1 -nest__B1_from_B1: -//SEG19 [6] phi (byte) nest::j#2 = (byte) nest::j#1 -- register_copy -//SEG20 nest::@1 -nest__B1: -//SEG21 [7] *((word) 1024) ← (byte) nest::j#2 [ main::i#2 nest::j#2 ] -- _star_cowo1=xby - stx $400 -//SEG22 [8] (byte) nest::j#1 ← -- (byte) nest::j#2 [ main::i#2 nest::j#1 ] -- xby=_dec_xby - dex -//SEG23 [9] if((byte) nest::j#1>(byte) 0) goto nest::@1 [ main::i#2 nest::j#1 ] -- xby_gt_0_then_la1 - cpx #$0 - bne nest__B1_from_B1 -//SEG24 nest::@return -nest__Breturn: -//SEG25 [10] return [ main::i#2 ] - rts +nest: { + //SEG16 [6] phi from nest to nest::@1 + b1_from_nest: + //SEG17 [6] phi (byte) nest::j#2 = (byte) 100 -- xby=coby1 + ldx #$64 + //SEG18 [6] phi from nest::@1 to nest::@1 + b1_from_b1: + //SEG19 [6] phi (byte) nest::j#2 = (byte) nest::j#1 -- register_copy + //SEG20 nest::@1 + b1: + //SEG21 [7] *((word) 1024) ← (byte) nest::j#2 [ main::i#2 nest::j#2 ] -- _star_cowo1=xby + stx $400 + //SEG22 [8] (byte) nest::j#1 ← -- (byte) nest::j#2 [ main::i#2 nest::j#1 ] -- xby=_dec_xby + dex + //SEG23 [9] if((byte) nest::j#1>(byte) 0) goto nest::@1 [ main::i#2 nest::j#1 ] -- xby_gt_0_then_la1 + cpx #$0 + bne b1_from_b1 + //SEG24 nest::@return + breturn: + //SEG25 [10] return [ main::i#2 ] + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopnest.sym b/src/main/java/dk/camelot64/kickc/test/ref/loopnest.sym index 7a7d9e76f..15982bd6e 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopnest.sym +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopnest.sym @@ -1,5 +1,5 @@ -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte*) SCREEN (void()) main() (label) main::@1 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.asm b/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.asm index 0b8f7d9e7..fd19bef35 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.asm @@ -1,66 +1,69 @@ -BBEGIN: +bbegin: jsr main -BEND: -main: -main__B1_from_main: - lda #$64 - sta $2 -main__B1_from_B3: -main__B1: -main__B2_from_B1: - lda #$64 - sta $3 -main__B2_from_B5: -main__B2: - jsr nest1 -main__B5: - dec $3 - lda $3 - bne main__B2_from_B5 -main__B3: - dec $2 - lda $2 - bne main__B1_from_B3 -main__Breturn: - rts -nest1: -nest1__B1_from_nest1: - lda #$64 - sta $4 -nest1__B1_from_B3: -nest1__B1: -nest1__B2_from_B1: - lda #$64 -nest1__B2_from_B5: -nest1__B2: - jsr nest2 -nest1__B5: - sec - sbc #$1 - cmp #$0 - bne nest1__B2_from_B5 -nest1__B3: - dec $4 - lda $4 - bne nest1__B1_from_B3 -nest1__Breturn: - rts -nest2: -nest2__B1_from_nest2: - ldx #$64 -nest2__B1_from_B3: -nest2__B1: -nest2__B2_from_B1: - ldy #$64 -nest2__B2_from_B2: -nest2__B2: - sty $400 - dey - cpy #$0 - bne nest2__B2_from_B2 -nest2__B3: - dex - cpx #$0 - bne nest2__B1_from_B3 -nest2__Breturn: - rts +bend: +main: { + b1_from_main: + lda #$64 + sta $2 + b1_from_b3: + b1: + b2_from_b1: + lda #$64 + sta $3 + b2_from_b5: + b2: + jsr nest1 + b5: + dec $3 + lda $3 + bne b2_from_b5 + b3: + dec $2 + lda $2 + bne b1_from_b3 + breturn: + rts +} +nest1: { + b1_from_nest1: + lda #$64 + sta $4 + b1_from_b3: + b1: + b2_from_b1: + lda #$64 + b2_from_b5: + b2: + jsr nest2 + b5: + sec + sbc #$1 + cmp #$0 + bne b2_from_b5 + b3: + dec $4 + lda $4 + bne b1_from_b3 + breturn: + rts +} +nest2: { + b1_from_nest2: + ldx #$64 + b1_from_b3: + b1: + b2_from_b1: + ldy #$64 + b2_from_b2: + b2: + sty $400 + dey + cpy #$0 + bne b2_from_b2 + b3: + dex + cpx #$0 + bne b1_from_b3 + breturn: + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.cfg b/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.cfg index adae3215e..d88eaf218 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.cfg +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.cfg @@ -1,8 +1,8 @@ -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@3 [1] (byte) main::i#2 ← phi( main/(byte) 100 main::@3/(byte) main::i#1 ) [ main::i#2 ] @@ -21,7 +21,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 [8] return [ ] - to:@RETURN + to:@return nest1: from main::@2 to:nest1::@1 nest1::@1: from nest1 nest1::@3 @@ -41,7 +41,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 [16] return [ main::j#2 main::i#2 ] - to:@RETURN + to:@return nest2: from nest1::@2 to:nest2::@1 nest2::@1: from nest2 nest2::@3 @@ -59,4 +59,4 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 [24] return [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] - to:@RETURN + to:@return diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.log b/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.log index 82b3d1875..82cccff31 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.log @@ -118,7 +118,7 @@ SYMBOLS (byte) nest2::j INITIAL CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte*) SCREEN ← (word) 1024 (void~) $0 ← call main to:@1 @@ -143,8 +143,8 @@ main::@4: from main::@3 to:main::@return main::@return: from main::@4 return - to:@RETURN -@1: from @BEGIN + to:@return +@1: from @begin to:@2 nest1: from (byte) nest1::i ← (byte) 100 @@ -167,7 +167,7 @@ nest1::@4: from nest1::@3 to:nest1::@return nest1::@return: from nest1::@4 return - to:@RETURN + to:@return @2: from @1 to:@3 nest2: from @@ -191,10 +191,10 @@ nest2::@4: from nest2::@3 to:nest2::@return nest2::@return: from nest2::@4 return - to:@RETURN + to:@return @3: from @2 - to:@END -@END: from @3 + to:@end +@end: from @3 Removing empty block main::@4 Removing empty block @1 @@ -203,10 +203,10 @@ Removing empty block @2 Removing empty block nest2::@4 Removing empty block @3 CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte*) SCREEN ← (word) 1024 (void~) $0 ← call main - to:@END + to:@end main: from (byte) main::i ← (byte) 100 to:main::@1 @@ -226,7 +226,7 @@ main::@3: from main::@2 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest1: from (byte) nest1::i ← (byte) 100 to:nest1::@1 @@ -246,7 +246,7 @@ nest1::@3: from nest1::@2 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest2: from (byte) nest2::i ← (byte) 100 to:nest2::@1 @@ -266,19 +266,19 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin PROCEDURE MODIFY VARIABLE ANALYSIS CONTROL FLOW GRAPH WITH ASSIGNMENT CALL -@BEGIN: from +@begin: from (byte*) SCREEN ← (word) 1024 call main param-assignment to:@4 -@4: from @BEGIN - to:@END -main: from @BEGIN +@4: from @begin + to:@end +main: from @begin (byte) main::i ← (byte) 100 to:main::@1 main::@1: from main main::@3 @@ -299,7 +299,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest1: from main::@2 (byte) nest1::i ← (byte) 100 to:nest1::@1 @@ -321,7 +321,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest2: from nest1::@2 (byte) nest2::i ← (byte) 100 to:nest2::@1 @@ -341,8 +341,8 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN -@END: from @4 + to:@return +@end: from @4 Completing Phi functions... Completing Phi functions... @@ -354,14 +354,14 @@ Completing Phi functions... Completing Phi functions... Completing Phi functions... CONTROL FLOW GRAPH SSA -@BEGIN: from +@begin: from (byte*) SCREEN#0 ← (word) 1024 call main param-assignment to:@4 -@4: from @BEGIN - to:@END -main: from @BEGIN - (byte*) SCREEN#13 ← phi( @BEGIN/(byte*) SCREEN#0 ) +@4: from @begin + to:@end +main: from @begin + (byte*) SCREEN#13 ← phi( @begin/(byte*) SCREEN#0 ) (byte) main::i#0 ← (byte) 100 to:main::@1 main::@1: from main main::@3 @@ -392,7 +392,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest1: from main::@2 (byte*) SCREEN#8 ← phi( main::@2/(byte*) SCREEN#10 ) (byte) nest1::i#0 ← (byte) 100 @@ -425,7 +425,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest2: from nest1::@2 (byte*) SCREEN#3 ← phi( nest1::@2/(byte*) SCREEN#5 ) (byte) nest2::i#0 ← (byte) 100 @@ -453,18 +453,18 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN -@END: from @4 + to:@return +@end: from @4 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN -@BEGIN: from +@begin: from (byte*) SCREEN#0 ← (word) 1024 call main param-assignment to:@4 -@4: from @BEGIN - to:@END -main: from @BEGIN - (byte*) SCREEN#13 ← phi( @BEGIN/(byte*) SCREEN#0 ) +@4: from @begin + to:@end +main: from @begin + (byte*) SCREEN#13 ← phi( @begin/(byte*) SCREEN#0 ) (byte) main::i#0 ← (byte) 100 to:main::@1 main::@1: from main main::@3 @@ -495,7 +495,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest1: from main::@2 (byte*) SCREEN#8 ← phi( main::@2/(byte*) SCREEN#10 ) (byte) nest1::i#0 ← (byte) 100 @@ -528,7 +528,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest2: from nest1::@2 (byte*) SCREEN#3 ← phi( nest1::@2/(byte*) SCREEN#5 ) (byte) nest2::i#0 ← (byte) 100 @@ -556,18 +556,18 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN -@END: from @4 + to:@return +@end: from @4 Culled Empty Block (label) @4 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte*) SCREEN#0 ← (word) 1024 call main param-assignment - to:@END -main: from @BEGIN - (byte*) SCREEN#13 ← phi( @BEGIN/(byte*) SCREEN#0 ) + to:@end +main: from @begin + (byte*) SCREEN#13 ← phi( @begin/(byte*) SCREEN#0 ) (byte) main::i#0 ← (byte) 100 to:main::@1 main::@1: from main main::@3 @@ -598,7 +598,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest1: from main::@2 (byte*) SCREEN#8 ← phi( main::@2/(byte*) SCREEN#10 ) (byte) nest1::i#0 ← (byte) 100 @@ -631,7 +631,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest2: from nest1::@2 (byte*) SCREEN#3 ← phi( nest1::@2/(byte*) SCREEN#5 ) (byte) nest2::i#0 ← (byte) 100 @@ -659,8 +659,8 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte*) SCREEN#0 (word) 1024 Constant (byte) main::i#0 (byte) 100 @@ -671,11 +671,11 @@ Constant (byte) nest2::i#0 (byte) 100 Constant (byte) nest2::j#0 (byte) 100 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN - (byte*) SCREEN#13 ← phi( @BEGIN/(word) 1024 ) + to:@end +main: from @begin + (byte*) SCREEN#13 ← phi( @begin/(word) 1024 ) to:main::@1 main::@1: from main main::@3 (byte*) SCREEN#11 ← phi( main/(byte*) SCREEN#13 main::@3/(byte*) SCREEN#14 ) @@ -704,7 +704,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest1: from main::@2 (byte*) SCREEN#8 ← phi( main::@2/(byte*) SCREEN#10 ) to:nest1::@1 @@ -735,7 +735,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest2: from nest1::@2 (byte*) SCREEN#3 ← phi( nest1::@2/(byte*) SCREEN#5 ) to:nest2::@1 @@ -761,8 +761,8 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Alias (byte) main::j#2 = (byte) main::j#3 Alias (byte) main::i#2 = (byte) main::i#3 (byte) main::i#4 @@ -774,11 +774,11 @@ Alias (byte) nest2::i#2 = (byte) nest2::i#3 Alias (byte*) SCREEN#1 = (byte*) SCREEN#4 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN - (byte*) SCREEN#13 ← phi( @BEGIN/(word) 1024 ) + to:@end +main: from @begin + (byte*) SCREEN#13 ← phi( @begin/(word) 1024 ) to:main::@1 main::@1: from main main::@3 (byte*) SCREEN#11 ← phi( main/(byte*) SCREEN#13 main::@3/(byte*) SCREEN#10 ) @@ -802,7 +802,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest1: from main::@2 to:nest1::@1 nest1::@1: from nest1 nest1::@3 @@ -827,7 +827,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest2: from nest1::@2 to:nest2::@1 nest2::@1: from nest2 nest2::@3 @@ -850,16 +850,16 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Redundant Phi (byte*) SCREEN#13 (word) 1024 Succesful SSA optimization Pass2RedundantPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@3 (byte*) SCREEN#11 ← phi( main/(word) 1024 main::@3/(byte*) SCREEN#10 ) @@ -883,7 +883,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest1: from main::@2 to:nest1::@1 nest1::@1: from nest1 nest1::@3 @@ -908,7 +908,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest2: from nest1::@2 to:nest2::@1 nest2::@1: from nest2 nest2::@3 @@ -931,8 +931,8 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Self Phi Eliminated (byte) main::i#2 Self Phi Eliminated (byte*) SCREEN#10 @@ -942,10 +942,10 @@ Self Phi Eliminated (byte*) SCREEN#1 Self Phi Eliminated (byte) nest2::i#2 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@3 (byte*) SCREEN#11 ← phi( main/(word) 1024 main::@3/(byte*) SCREEN#10 ) @@ -969,7 +969,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest1: from main::@2 to:nest1::@1 nest1::@1: from nest1 nest1::@3 @@ -994,7 +994,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest2: from nest1::@2 to:nest2::@1 nest2::@1: from nest2 nest2::@3 @@ -1017,8 +1017,8 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Simple Condition (boolean~) main::$1 if((byte) main::j#1>(byte) 0) goto main::@2 Simple Condition (boolean~) main::$2 if((byte) main::i#1>(byte) 0) goto main::@1 @@ -1028,10 +1028,10 @@ Simple Condition (boolean~) nest2::$0 if((byte) nest2::j#1>(byte) 0) goto nest2: Simple Condition (boolean~) nest2::$1 if((byte) nest2::i#1>(byte) 0) goto nest2::@1 Succesful SSA optimization Pass2ConditionalJumpSimplification CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@3 (byte*) SCREEN#11 ← phi( main/(word) 1024 main::@3/(byte*) SCREEN#10 ) @@ -1053,7 +1053,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest1: from main::@2 to:nest1::@1 nest1::@1: from nest1 nest1::@3 @@ -1076,7 +1076,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest2: from nest1::@2 to:nest2::@1 nest2::@1: from nest2 nest2::@3 @@ -1097,8 +1097,8 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Alias (byte) main::i#2 = (byte) main::i#5 Alias (byte*) SCREEN#10 = (byte*) SCREEN#11 @@ -1108,10 +1108,10 @@ Alias (byte*) SCREEN#1 = (byte*) SCREEN#2 Alias (byte) nest2::i#2 = (byte) nest2::i#4 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@3 (byte*) SCREEN#10 ← phi( main/(word) 1024 main::@3/(byte*) SCREEN#10 ) @@ -1131,7 +1131,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest1: from main::@2 to:nest1::@1 nest1::@1: from nest1 nest1::@3 @@ -1152,7 +1152,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest2: from nest1::@2 to:nest2::@1 nest2::@1: from nest2 nest2::@3 @@ -1171,18 +1171,18 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Self Phi Eliminated (byte*) SCREEN#10 Self Phi Eliminated (byte*) SCREEN#3 Self Phi Eliminated (byte*) SCREEN#1 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@3 (byte*) SCREEN#10 ← phi( main/(word) 1024 ) @@ -1202,7 +1202,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest1: from main::@2 to:nest1::@1 nest1::@1: from nest1 nest1::@3 @@ -1223,7 +1223,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest2: from nest1::@2 to:nest2::@1 nest2::@1: from nest2 nest2::@3 @@ -1242,16 +1242,16 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte*) SCREEN#10 (word) 1024 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@3 (byte) main::i#2 ← phi( main/(byte) 100 main::@3/(byte) main::i#1 ) @@ -1270,7 +1270,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest1: from main::@2 to:nest1::@1 nest1::@1: from nest1 nest1::@3 @@ -1291,7 +1291,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest2: from nest1::@2 to:nest2::@1 nest2::@1: from nest2 nest2::@3 @@ -1310,16 +1310,16 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Alias (byte*) SCREEN#1 = (byte*) SCREEN#3 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@3 (byte) main::i#2 ← phi( main/(byte) 100 main::@3/(byte) main::i#1 ) @@ -1338,7 +1338,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest1: from main::@2 to:nest1::@1 nest1::@1: from nest1 nest1::@3 @@ -1359,7 +1359,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest2: from nest1::@2 to:nest2::@1 nest2::@1: from nest2 nest2::@3 @@ -1377,16 +1377,16 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Redundant Phi (byte*) SCREEN#1 (word) 1024 Succesful SSA optimization Pass2RedundantPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@3 (byte) main::i#2 ← phi( main/(byte) 100 main::@3/(byte) main::i#1 ) @@ -1405,7 +1405,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return nest1: from main::@2 to:nest1::@1 nest1::@1: from nest1 nest1::@3 @@ -1425,7 +1425,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest2: from nest1::@2 to:nest2::@1 nest2::@1: from nest2 nest2::@3 @@ -1443,23 +1443,23 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin -Block Sequence Planned @BEGIN @END main main::@1 main::@2 main::@5 main::@3 main::@return nest1 nest1::@1 nest1::@2 nest1::@5 nest1::@3 nest1::@return nest2 nest2::@1 nest2::@2 nest2::@3 nest2::@return +Block Sequence Planned @begin @end main main::@1 main::@2 main::@5 main::@3 main::@return nest1 nest1::@1 nest1::@2 nest1::@5 nest1::@3 nest1::@return nest2 nest2::@1 nest2::@2 nest2::@3 nest2::@return Added new block during phi lifting main::@6(between main::@3 and main::@1) Added new block during phi lifting main::@7(between main::@5 and main::@2) Added new block during phi lifting nest1::@6(between nest1::@3 and nest1::@1) Added new block during phi lifting nest1::@7(between nest1::@5 and nest1::@2) Added new block during phi lifting nest2::@5(between nest2::@3 and nest2::@1) Added new block during phi lifting nest2::@6(between nest2::@2 and nest2::@2) -Block Sequence Planned @BEGIN @END main main::@1 main::@2 main::@5 main::@3 main::@return main::@6 main::@7 nest1 nest1::@1 nest1::@2 nest1::@5 nest1::@3 nest1::@return nest1::@6 nest1::@7 nest2 nest2::@1 nest2::@2 nest2::@3 nest2::@return nest2::@5 nest2::@6 +Block Sequence Planned @begin @end main main::@1 main::@2 main::@5 main::@3 main::@return main::@6 main::@7 nest1 nest1::@1 nest1::@2 nest1::@5 nest1::@3 nest1::@return nest1::@6 nest1::@7 nest2 nest2::@1 nest2::@2 nest2::@3 nest2::@return nest2::@5 nest2::@6 CONTROL FLOW GRAPH - PHI LIFTED -@BEGIN: from +@begin: from call main param-assignment - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@6 (byte) main::i#2 ← phi( main/(byte) 100 main::@6/(byte~) main::i#6 ) @@ -1478,7 +1478,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return main::@6: from main::@3 (byte~) main::i#6 ← (byte) main::i#1 to:main::@1 @@ -1504,7 +1504,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 return - to:@RETURN + to:@return nest1::@6: from nest1::@3 (byte~) nest1::i#6 ← (byte) nest1::i#1 to:nest1::@1 @@ -1528,7 +1528,7 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 return - to:@RETURN + to:@return nest2::@5: from nest2::@3 (byte~) nest2::i#5 ← (byte) nest2::i#1 to:nest2::@1 @@ -1598,11 +1598,11 @@ Propagated nest1::j#2 through call [13] call nest2 param-assignment Propagated nest1::i#2 through call [13] call nest2 param-assignment Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@6 [1] (byte) main::i#2 ← phi( main/(byte) 100 main::@6/(byte~) main::i#6 ) [ main::i#2 ] @@ -1621,7 +1621,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 [8] return [ ] - to:@RETURN + to:@return main::@6: from main::@3 [9] (byte~) main::i#6 ← (byte) main::i#1 [ main::i#6 ] to:main::@1 @@ -1647,7 +1647,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 [18] return [ main::j#2 main::i#2 ] - to:@RETURN + to:@return nest1::@6: from nest1::@3 [19] (byte~) nest1::i#6 ← (byte) nest1::i#1 [ main::j#2 main::i#2 nest1::i#6 ] to:nest1::@1 @@ -1671,7 +1671,7 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 [28] return [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] - to:@RETURN + to:@return nest2::@5: from nest2::@3 [29] (byte~) nest2::i#5 ← (byte) nest2::i#1 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#5 ] to:nest2::@1 @@ -1693,7 +1693,7 @@ Culled Empty Block (label) nest1::@6 Culled Empty Block (label) nest1::@7 Culled Empty Block (label) nest2::@5 Culled Empty Block (label) nest2::@6 -Block Sequence Planned @BEGIN @END main main::@1 main::@2 main::@5 main::@3 main::@return nest1 nest1::@1 nest1::@2 nest1::@5 nest1::@3 nest1::@return nest2 nest2::@1 nest2::@2 nest2::@3 nest2::@return +Block Sequence Planned @begin @end main main::@1 main::@2 main::@5 main::@3 main::@return nest1 nest1::@1 nest1::@2 nest1::@5 nest1::@3 nest1::@return nest2 nest2::@1 nest2::@2 nest2::@3 nest2::@return Propagating live ranges... Propagating live ranges... Propagating live ranges... @@ -1756,11 +1756,11 @@ Propagated nest1::j#2 through call [11] call nest2 param-assignment Propagated nest1::i#2 through call [11] call nest2 param-assignment Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@3 [1] (byte) main::i#2 ← phi( main/(byte) 100 main::@3/(byte) main::i#1 ) [ main::i#2 ] @@ -1779,7 +1779,7 @@ main::@3: from main::@5 to:main::@return main::@return: from main::@3 [8] return [ ] - to:@RETURN + to:@return nest1: from main::@2 to:nest1::@1 nest1::@1: from nest1 nest1::@3 @@ -1799,7 +1799,7 @@ nest1::@3: from nest1::@5 to:nest1::@return nest1::@return: from nest1::@3 [16] return [ main::j#2 main::i#2 ] - to:@RETURN + to:@return nest2: from nest1::@2 to:nest2::@1 nest2::@1: from nest2 nest2::@3 @@ -1817,7 +1817,7 @@ nest2::@3: from nest2::@2 to:nest2::@return nest2::@return: from nest2::@3 [24] return [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] - to:@RETURN + to:@return CALL GRAPH Calls in [] to 0:main @@ -1825,25 +1825,25 @@ Calls in [main] to 3:nest1 Calls in [nest1] to 11:nest2 DOMINATORS -@BEGIN dominated by @BEGIN -@END dominated by @BEGIN @END -main dominated by @BEGIN main -main::@1 dominated by @BEGIN main::@1 main -main::@2 dominated by @BEGIN main::@2 main::@1 main -main::@5 dominated by @BEGIN main::@2 main::@1 main::@5 main -main::@3 dominated by @BEGIN main::@2 main::@1 main::@3 main main::@5 -main::@return dominated by @BEGIN main::@2 main::@1 main::@3 main main::@5 main::@return -nest1 dominated by @BEGIN main::@2 main::@1 main nest1 -nest1::@1 dominated by nest1::@1 @BEGIN main::@2 main::@1 main nest1 -nest1::@2 dominated by nest1::@1 nest1::@2 @BEGIN main::@2 main::@1 main nest1 -nest1::@5 dominated by nest1::@1 @BEGIN nest1::@2 nest1::@5 main::@2 main::@1 main nest1 -nest1::@3 dominated by nest1::@1 @BEGIN nest1::@2 nest1::@5 nest1::@3 main::@2 main::@1 main nest1 -nest1::@return dominated by nest1::@1 @BEGIN nest1::@2 nest1::@5 nest1::@3 nest1::@return main::@2 main::@1 main nest1 -nest2 dominated by nest1::@1 @BEGIN nest1::@2 main::@2 main::@1 main nest2 nest1 -nest2::@1 dominated by nest1::@1 @BEGIN nest1::@2 main::@2 main::@1 main nest2 nest2::@1 nest1 -nest2::@2 dominated by nest1::@1 @BEGIN nest1::@2 main::@2 main::@1 main nest2::@2 nest2 nest2::@1 nest1 -nest2::@3 dominated by nest1::@1 @BEGIN nest1::@2 main::@2 main::@1 main nest2::@3 nest2::@2 nest2 nest2::@1 nest1 -nest2::@return dominated by nest1::@1 @BEGIN nest1::@2 nest2::@return main::@2 main::@1 main nest2::@3 nest2::@2 nest2 nest2::@1 nest1 +@begin dominated by @begin +@end dominated by @end @begin +main dominated by @begin main +main::@1 dominated by @begin main::@1 main +main::@2 dominated by @begin main::@2 main::@1 main +main::@5 dominated by @begin main::@2 main::@1 main::@5 main +main::@3 dominated by @begin main::@2 main::@1 main::@3 main main::@5 +main::@return dominated by @begin main::@2 main::@1 main::@3 main main::@5 main::@return +nest1 dominated by @begin main::@2 main::@1 main nest1 +nest1::@1 dominated by nest1::@1 @begin main::@2 main::@1 main nest1 +nest1::@2 dominated by nest1::@1 nest1::@2 @begin main::@2 main::@1 main nest1 +nest1::@5 dominated by nest1::@1 nest1::@2 nest1::@5 @begin main::@2 main::@1 main nest1 +nest1::@3 dominated by nest1::@1 nest1::@2 nest1::@5 nest1::@3 @begin main::@2 main::@1 main nest1 +nest1::@return dominated by nest1::@1 nest1::@2 nest1::@5 nest1::@3 @begin nest1::@return main::@2 main::@1 main nest1 +nest2 dominated by nest1::@1 nest1::@2 @begin main::@2 main::@1 main nest2 nest1 +nest2::@1 dominated by nest1::@1 nest1::@2 @begin main::@2 main::@1 main nest2 nest2::@1 nest1 +nest2::@2 dominated by nest1::@1 nest1::@2 @begin main::@2 main::@1 main nest2::@2 nest2 nest2::@1 nest1 +nest2::@3 dominated by nest1::@1 nest1::@2 @begin main::@2 main::@1 main nest2::@3 nest2::@2 nest2 nest2::@1 nest1 +nest2::@return dominated by nest1::@1 nest1::@2 nest2::@return @begin main::@2 main::@1 main nest2::@3 nest2::@2 nest2 nest2::@1 nest1 Found back edge: Loop head: main::@2 tails: main::@5 blocks: null Found back edge: Loop head: main::@1 tails: main::@3 blocks: null @@ -1929,158 +1929,161 @@ Allocated zp byte:5 to zp byte:5 [ nest1::j#2 nest1::j#1 ] Allocated zp byte:6 to zp byte:6 [ nest2::i#2 nest2::i#1 ] Allocated zp byte:7 to zp byte:7 [ nest2::j#2 nest2::j#1 ] INITIAL ASM -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main - jmp BEND -//SEG2 @END -BEND: + jmp bend +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] phi from main to main::@1 -main__B1_from_main: -//SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $2 - jmp main__B1 -//SEG6 [1] phi from main::@3 to main::@1 -main__B1_from_B3: -//SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy - jmp main__B1 -//SEG8 main::@1 -main__B1: -//SEG9 [2] phi from main::@1 to main::@2 -main__B2_from_B1: -//SEG10 [2] phi (byte) main::j#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $3 - jmp main__B2 -//SEG11 [2] phi from main::@5 to main::@2 -main__B2_from_B5: -//SEG12 [2] phi (byte) main::j#2 = (byte) main::j#1 -- register_copy - jmp main__B2 -//SEG13 main::@2 -main__B2: -//SEG14 [3] call nest1 param-assignment [ main::j#2 main::i#2 ] - jsr nest1 - jmp main__B5 -//SEG15 main::@5 -main__B5: -//SEG16 [4] (byte) main::j#1 ← -- (byte) main::j#2 [ main::j#1 main::i#2 ] -- zpby1=_dec_zpby1 - dec $3 -//SEG17 [5] if((byte) main::j#1>(byte) 0) goto main::@2 [ main::j#1 main::i#2 ] -- zpby1_gt_0_then_la1 - lda $3 - bne main__B2_from_B5 - jmp main__B3 -//SEG18 main::@3 -main__B3: -//SEG19 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- zpby1=_dec_zpby1 - dec $2 -//SEG20 [7] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- zpby1_gt_0_then_la1 - lda $2 - bne main__B1_from_B3 - jmp main__Breturn -//SEG21 main::@return -main__Breturn: -//SEG22 [8] return [ ] - rts +main: { + //SEG4 [1] phi from main to main::@1 + b1_from_main: + //SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $2 + jmp b1 + //SEG6 [1] phi from main::@3 to main::@1 + b1_from_b3: + //SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy + jmp b1 + //SEG8 main::@1 + b1: + //SEG9 [2] phi from main::@1 to main::@2 + b2_from_b1: + //SEG10 [2] phi (byte) main::j#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $3 + jmp b2 + //SEG11 [2] phi from main::@5 to main::@2 + b2_from_b5: + //SEG12 [2] phi (byte) main::j#2 = (byte) main::j#1 -- register_copy + jmp b2 + //SEG13 main::@2 + b2: + //SEG14 [3] call nest1 param-assignment [ main::j#2 main::i#2 ] + jsr nest1 + jmp b5 + //SEG15 main::@5 + b5: + //SEG16 [4] (byte) main::j#1 ← -- (byte) main::j#2 [ main::j#1 main::i#2 ] -- zpby1=_dec_zpby1 + dec $3 + //SEG17 [5] if((byte) main::j#1>(byte) 0) goto main::@2 [ main::j#1 main::i#2 ] -- zpby1_gt_0_then_la1 + lda $3 + bne b2_from_b5 + jmp b3 + //SEG18 main::@3 + b3: + //SEG19 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- zpby1=_dec_zpby1 + dec $2 + //SEG20 [7] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- zpby1_gt_0_then_la1 + lda $2 + bne b1_from_b3 + jmp breturn + //SEG21 main::@return + breturn: + //SEG22 [8] return [ ] + rts +} //SEG23 nest1 -nest1: -//SEG24 [9] phi from nest1 to nest1::@1 -nest1__B1_from_nest1: -//SEG25 [9] phi (byte) nest1::i#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $4 - jmp nest1__B1 -//SEG26 [9] phi from nest1::@3 to nest1::@1 -nest1__B1_from_B3: -//SEG27 [9] phi (byte) nest1::i#2 = (byte) nest1::i#1 -- register_copy - jmp nest1__B1 -//SEG28 nest1::@1 -nest1__B1: -//SEG29 [10] phi from nest1::@1 to nest1::@2 -nest1__B2_from_B1: -//SEG30 [10] phi (byte) nest1::j#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $5 - jmp nest1__B2 -//SEG31 [10] phi from nest1::@5 to nest1::@2 -nest1__B2_from_B5: -//SEG32 [10] phi (byte) nest1::j#2 = (byte) nest1::j#1 -- register_copy - jmp nest1__B2 -//SEG33 nest1::@2 -nest1__B2: -//SEG34 [11] call nest2 param-assignment [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] - jsr nest2 - jmp nest1__B5 -//SEG35 nest1::@5 -nest1__B5: -//SEG36 [12] (byte) nest1::j#1 ← -- (byte) nest1::j#2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- zpby1=_dec_zpby1 - dec $5 -//SEG37 [13] if((byte) nest1::j#1>(byte) 0) goto nest1::@2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- zpby1_gt_0_then_la1 - lda $5 - bne nest1__B2_from_B5 - jmp nest1__B3 -//SEG38 nest1::@3 -nest1__B3: -//SEG39 [14] (byte) nest1::i#1 ← -- (byte) nest1::i#2 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1=_dec_zpby1 - dec $4 -//SEG40 [15] if((byte) nest1::i#1>(byte) 0) goto nest1::@1 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1_gt_0_then_la1 - lda $4 - bne nest1__B1_from_B3 - jmp nest1__Breturn -//SEG41 nest1::@return -nest1__Breturn: -//SEG42 [16] return [ main::j#2 main::i#2 ] - rts +nest1: { + //SEG24 [9] phi from nest1 to nest1::@1 + b1_from_nest1: + //SEG25 [9] phi (byte) nest1::i#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $4 + jmp b1 + //SEG26 [9] phi from nest1::@3 to nest1::@1 + b1_from_b3: + //SEG27 [9] phi (byte) nest1::i#2 = (byte) nest1::i#1 -- register_copy + jmp b1 + //SEG28 nest1::@1 + b1: + //SEG29 [10] phi from nest1::@1 to nest1::@2 + b2_from_b1: + //SEG30 [10] phi (byte) nest1::j#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $5 + jmp b2 + //SEG31 [10] phi from nest1::@5 to nest1::@2 + b2_from_b5: + //SEG32 [10] phi (byte) nest1::j#2 = (byte) nest1::j#1 -- register_copy + jmp b2 + //SEG33 nest1::@2 + b2: + //SEG34 [11] call nest2 param-assignment [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] + jsr nest2 + jmp b5 + //SEG35 nest1::@5 + b5: + //SEG36 [12] (byte) nest1::j#1 ← -- (byte) nest1::j#2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- zpby1=_dec_zpby1 + dec $5 + //SEG37 [13] if((byte) nest1::j#1>(byte) 0) goto nest1::@2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- zpby1_gt_0_then_la1 + lda $5 + bne b2_from_b5 + jmp b3 + //SEG38 nest1::@3 + b3: + //SEG39 [14] (byte) nest1::i#1 ← -- (byte) nest1::i#2 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1=_dec_zpby1 + dec $4 + //SEG40 [15] if((byte) nest1::i#1>(byte) 0) goto nest1::@1 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1_gt_0_then_la1 + lda $4 + bne b1_from_b3 + jmp breturn + //SEG41 nest1::@return + breturn: + //SEG42 [16] return [ main::j#2 main::i#2 ] + rts +} //SEG43 nest2 -nest2: -//SEG44 [17] phi from nest2 to nest2::@1 -nest2__B1_from_nest2: -//SEG45 [17] phi (byte) nest2::i#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $6 - jmp nest2__B1 -//SEG46 [17] phi from nest2::@3 to nest2::@1 -nest2__B1_from_B3: -//SEG47 [17] phi (byte) nest2::i#2 = (byte) nest2::i#1 -- register_copy - jmp nest2__B1 -//SEG48 nest2::@1 -nest2__B1: -//SEG49 [18] phi from nest2::@1 to nest2::@2 -nest2__B2_from_B1: -//SEG50 [18] phi (byte) nest2::j#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $7 - jmp nest2__B2 -//SEG51 [18] phi from nest2::@2 to nest2::@2 -nest2__B2_from_B2: -//SEG52 [18] phi (byte) nest2::j#2 = (byte) nest2::j#1 -- register_copy - jmp nest2__B2 -//SEG53 nest2::@2 -nest2__B2: -//SEG54 [19] *((word) 1024) ← (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#2 nest2::i#2 ] -- _star_cowo1=zpby1 - lda $7 - sta $400 -//SEG55 [20] (byte) nest2::j#1 ← -- (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- zpby1=_dec_zpby1 - dec $7 -//SEG56 [21] if((byte) nest2::j#1>(byte) 0) goto nest2::@2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- zpby1_gt_0_then_la1 - lda $7 - bne nest2__B2_from_B2 - jmp nest2__B3 -//SEG57 nest2::@3 -nest2__B3: -//SEG58 [22] (byte) nest2::i#1 ← -- (byte) nest2::i#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- zpby1=_dec_zpby1 - dec $6 -//SEG59 [23] if((byte) nest2::i#1>(byte) 0) goto nest2::@1 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- zpby1_gt_0_then_la1 - lda $6 - bne nest2__B1_from_B3 - jmp nest2__Breturn -//SEG60 nest2::@return -nest2__Breturn: -//SEG61 [24] return [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] - rts +nest2: { + //SEG44 [17] phi from nest2 to nest2::@1 + b1_from_nest2: + //SEG45 [17] phi (byte) nest2::i#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $6 + jmp b1 + //SEG46 [17] phi from nest2::@3 to nest2::@1 + b1_from_b3: + //SEG47 [17] phi (byte) nest2::i#2 = (byte) nest2::i#1 -- register_copy + jmp b1 + //SEG48 nest2::@1 + b1: + //SEG49 [18] phi from nest2::@1 to nest2::@2 + b2_from_b1: + //SEG50 [18] phi (byte) nest2::j#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $7 + jmp b2 + //SEG51 [18] phi from nest2::@2 to nest2::@2 + b2_from_b2: + //SEG52 [18] phi (byte) nest2::j#2 = (byte) nest2::j#1 -- register_copy + jmp b2 + //SEG53 nest2::@2 + b2: + //SEG54 [19] *((word) 1024) ← (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#2 nest2::i#2 ] -- _star_cowo1=zpby1 + lda $7 + sta $400 + //SEG55 [20] (byte) nest2::j#1 ← -- (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- zpby1=_dec_zpby1 + dec $7 + //SEG56 [21] if((byte) nest2::j#1>(byte) 0) goto nest2::@2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- zpby1_gt_0_then_la1 + lda $7 + bne b2_from_b2 + jmp b3 + //SEG57 nest2::@3 + b3: + //SEG58 [22] (byte) nest2::i#1 ← -- (byte) nest2::i#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- zpby1=_dec_zpby1 + dec $6 + //SEG59 [23] if((byte) nest2::i#1>(byte) 0) goto nest2::@1 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- zpby1_gt_0_then_la1 + lda $6 + bne b1_from_b3 + jmp breturn + //SEG60 nest2::@return + breturn: + //SEG61 [24] return [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] + rts +} REGISTER UPLIFT POTENTIAL REGISTERS Potential registers zp byte:2 [ main::i#2 main::i#1 ] : zp byte:2 , reg byte a , reg byte x , reg byte y , @@ -2100,298 +2103,304 @@ Uplifting [nest2] best 23613122 combination reg byte y [ nest2::j#2 nest2::j#1 ] Uplifting [nest1] best 23563122 combination reg byte a [ nest1::j#2 nest1::j#1 ] zp byte:4 [ nest1::i#2 nest1::i#1 ] Uplifting [main] best 23563122 combination zp byte:3 [ main::j#2 main::j#1 ] zp byte:2 [ main::i#2 main::i#1 ] Uplifting [] best 23563122 combination -Removing instruction jmp BEND -Removing instruction jmp main__B1 -Removing instruction jmp main__B2 -Removing instruction jmp main__B5 -Removing instruction jmp main__B3 -Removing instruction jmp main__Breturn -Removing instruction jmp nest1__B1 -Removing instruction jmp nest1__B2 -Removing instruction jmp nest1__B5 -Removing instruction jmp nest1__B3 -Removing instruction jmp nest1__Breturn -Removing instruction jmp nest2__B1 -Removing instruction jmp nest2__B2 -Removing instruction jmp nest2__B3 -Removing instruction jmp nest2__Breturn +Removing instruction jmp bend +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b5 +Removing instruction jmp b3 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b5 +Removing instruction jmp b3 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b3 +Removing instruction jmp breturn Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] phi from main to main::@1 -main__B1_from_main: -//SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $2 - jmp main__B1 -//SEG6 [1] phi from main::@3 to main::@1 -main__B1_from_B3: -//SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy -//SEG8 main::@1 -main__B1: -//SEG9 [2] phi from main::@1 to main::@2 -main__B2_from_B1: -//SEG10 [2] phi (byte) main::j#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $3 - jmp main__B2 -//SEG11 [2] phi from main::@5 to main::@2 -main__B2_from_B5: -//SEG12 [2] phi (byte) main::j#2 = (byte) main::j#1 -- register_copy -//SEG13 main::@2 -main__B2: -//SEG14 [3] call nest1 param-assignment [ main::j#2 main::i#2 ] - jsr nest1 -//SEG15 main::@5 -main__B5: -//SEG16 [4] (byte) main::j#1 ← -- (byte) main::j#2 [ main::j#1 main::i#2 ] -- zpby1=_dec_zpby1 - dec $3 -//SEG17 [5] if((byte) main::j#1>(byte) 0) goto main::@2 [ main::j#1 main::i#2 ] -- zpby1_gt_0_then_la1 - lda $3 - bne main__B2_from_B5 -//SEG18 main::@3 -main__B3: -//SEG19 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- zpby1=_dec_zpby1 - dec $2 -//SEG20 [7] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- zpby1_gt_0_then_la1 - lda $2 - bne main__B1_from_B3 -//SEG21 main::@return -main__Breturn: -//SEG22 [8] return [ ] - rts +main: { + //SEG4 [1] phi from main to main::@1 + b1_from_main: + //SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $2 + jmp b1 + //SEG6 [1] phi from main::@3 to main::@1 + b1_from_b3: + //SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy + //SEG8 main::@1 + b1: + //SEG9 [2] phi from main::@1 to main::@2 + b2_from_b1: + //SEG10 [2] phi (byte) main::j#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $3 + jmp b2 + //SEG11 [2] phi from main::@5 to main::@2 + b2_from_b5: + //SEG12 [2] phi (byte) main::j#2 = (byte) main::j#1 -- register_copy + //SEG13 main::@2 + b2: + //SEG14 [3] call nest1 param-assignment [ main::j#2 main::i#2 ] + jsr nest1 + //SEG15 main::@5 + b5: + //SEG16 [4] (byte) main::j#1 ← -- (byte) main::j#2 [ main::j#1 main::i#2 ] -- zpby1=_dec_zpby1 + dec $3 + //SEG17 [5] if((byte) main::j#1>(byte) 0) goto main::@2 [ main::j#1 main::i#2 ] -- zpby1_gt_0_then_la1 + lda $3 + bne b2_from_b5 + //SEG18 main::@3 + b3: + //SEG19 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- zpby1=_dec_zpby1 + dec $2 + //SEG20 [7] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- zpby1_gt_0_then_la1 + lda $2 + bne b1_from_b3 + //SEG21 main::@return + breturn: + //SEG22 [8] return [ ] + rts +} //SEG23 nest1 -nest1: -//SEG24 [9] phi from nest1 to nest1::@1 -nest1__B1_from_nest1: -//SEG25 [9] phi (byte) nest1::i#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $4 - jmp nest1__B1 -//SEG26 [9] phi from nest1::@3 to nest1::@1 -nest1__B1_from_B3: -//SEG27 [9] phi (byte) nest1::i#2 = (byte) nest1::i#1 -- register_copy -//SEG28 nest1::@1 -nest1__B1: -//SEG29 [10] phi from nest1::@1 to nest1::@2 -nest1__B2_from_B1: -//SEG30 [10] phi (byte) nest1::j#2 = (byte) 100 -- aby=coby1 - lda #$64 - jmp nest1__B2 -//SEG31 [10] phi from nest1::@5 to nest1::@2 -nest1__B2_from_B5: -//SEG32 [10] phi (byte) nest1::j#2 = (byte) nest1::j#1 -- register_copy -//SEG33 nest1::@2 -nest1__B2: -//SEG34 [11] call nest2 param-assignment [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] - jsr nest2 -//SEG35 nest1::@5 -nest1__B5: -//SEG36 [12] (byte) nest1::j#1 ← -- (byte) nest1::j#2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- aby=_dec_aby - sec - sbc #$1 -//SEG37 [13] if((byte) nest1::j#1>(byte) 0) goto nest1::@2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- aby_gt_0_then_la1 - cmp #$0 - bne nest1__B2_from_B5 -//SEG38 nest1::@3 -nest1__B3: -//SEG39 [14] (byte) nest1::i#1 ← -- (byte) nest1::i#2 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1=_dec_zpby1 - dec $4 -//SEG40 [15] if((byte) nest1::i#1>(byte) 0) goto nest1::@1 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1_gt_0_then_la1 - lda $4 - bne nest1__B1_from_B3 -//SEG41 nest1::@return -nest1__Breturn: -//SEG42 [16] return [ main::j#2 main::i#2 ] - rts +nest1: { + //SEG24 [9] phi from nest1 to nest1::@1 + b1_from_nest1: + //SEG25 [9] phi (byte) nest1::i#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $4 + jmp b1 + //SEG26 [9] phi from nest1::@3 to nest1::@1 + b1_from_b3: + //SEG27 [9] phi (byte) nest1::i#2 = (byte) nest1::i#1 -- register_copy + //SEG28 nest1::@1 + b1: + //SEG29 [10] phi from nest1::@1 to nest1::@2 + b2_from_b1: + //SEG30 [10] phi (byte) nest1::j#2 = (byte) 100 -- aby=coby1 + lda #$64 + jmp b2 + //SEG31 [10] phi from nest1::@5 to nest1::@2 + b2_from_b5: + //SEG32 [10] phi (byte) nest1::j#2 = (byte) nest1::j#1 -- register_copy + //SEG33 nest1::@2 + b2: + //SEG34 [11] call nest2 param-assignment [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] + jsr nest2 + //SEG35 nest1::@5 + b5: + //SEG36 [12] (byte) nest1::j#1 ← -- (byte) nest1::j#2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- aby=_dec_aby + sec + sbc #$1 + //SEG37 [13] if((byte) nest1::j#1>(byte) 0) goto nest1::@2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- aby_gt_0_then_la1 + cmp #$0 + bne b2_from_b5 + //SEG38 nest1::@3 + b3: + //SEG39 [14] (byte) nest1::i#1 ← -- (byte) nest1::i#2 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1=_dec_zpby1 + dec $4 + //SEG40 [15] if((byte) nest1::i#1>(byte) 0) goto nest1::@1 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1_gt_0_then_la1 + lda $4 + bne b1_from_b3 + //SEG41 nest1::@return + breturn: + //SEG42 [16] return [ main::j#2 main::i#2 ] + rts +} //SEG43 nest2 -nest2: -//SEG44 [17] phi from nest2 to nest2::@1 -nest2__B1_from_nest2: -//SEG45 [17] phi (byte) nest2::i#2 = (byte) 100 -- xby=coby1 - ldx #$64 - jmp nest2__B1 -//SEG46 [17] phi from nest2::@3 to nest2::@1 -nest2__B1_from_B3: -//SEG47 [17] phi (byte) nest2::i#2 = (byte) nest2::i#1 -- register_copy -//SEG48 nest2::@1 -nest2__B1: -//SEG49 [18] phi from nest2::@1 to nest2::@2 -nest2__B2_from_B1: -//SEG50 [18] phi (byte) nest2::j#2 = (byte) 100 -- yby=coby1 - ldy #$64 - jmp nest2__B2 -//SEG51 [18] phi from nest2::@2 to nest2::@2 -nest2__B2_from_B2: -//SEG52 [18] phi (byte) nest2::j#2 = (byte) nest2::j#1 -- register_copy -//SEG53 nest2::@2 -nest2__B2: -//SEG54 [19] *((word) 1024) ← (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#2 nest2::i#2 ] -- _star_cowo1=yby - sty $400 -//SEG55 [20] (byte) nest2::j#1 ← -- (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- yby=_dec_yby - dey -//SEG56 [21] if((byte) nest2::j#1>(byte) 0) goto nest2::@2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- yby_gt_0_then_la1 - cpy #$0 - bne nest2__B2_from_B2 -//SEG57 nest2::@3 -nest2__B3: -//SEG58 [22] (byte) nest2::i#1 ← -- (byte) nest2::i#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- xby=_dec_xby - dex -//SEG59 [23] if((byte) nest2::i#1>(byte) 0) goto nest2::@1 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- xby_gt_0_then_la1 - cpx #$0 - bne nest2__B1_from_B3 -//SEG60 nest2::@return -nest2__Breturn: -//SEG61 [24] return [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] - rts +nest2: { + //SEG44 [17] phi from nest2 to nest2::@1 + b1_from_nest2: + //SEG45 [17] phi (byte) nest2::i#2 = (byte) 100 -- xby=coby1 + ldx #$64 + jmp b1 + //SEG46 [17] phi from nest2::@3 to nest2::@1 + b1_from_b3: + //SEG47 [17] phi (byte) nest2::i#2 = (byte) nest2::i#1 -- register_copy + //SEG48 nest2::@1 + b1: + //SEG49 [18] phi from nest2::@1 to nest2::@2 + b2_from_b1: + //SEG50 [18] phi (byte) nest2::j#2 = (byte) 100 -- yby=coby1 + ldy #$64 + jmp b2 + //SEG51 [18] phi from nest2::@2 to nest2::@2 + b2_from_b2: + //SEG52 [18] phi (byte) nest2::j#2 = (byte) nest2::j#1 -- register_copy + //SEG53 nest2::@2 + b2: + //SEG54 [19] *((word) 1024) ← (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#2 nest2::i#2 ] -- _star_cowo1=yby + sty $400 + //SEG55 [20] (byte) nest2::j#1 ← -- (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- yby=_dec_yby + dey + //SEG56 [21] if((byte) nest2::j#1>(byte) 0) goto nest2::@2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- yby_gt_0_then_la1 + cpy #$0 + bne b2_from_b2 + //SEG57 nest2::@3 + b3: + //SEG58 [22] (byte) nest2::i#1 ← -- (byte) nest2::i#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- xby=_dec_xby + dex + //SEG59 [23] if((byte) nest2::i#1>(byte) 0) goto nest2::@1 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- xby_gt_0_then_la1 + cpx #$0 + bne b1_from_b3 + //SEG60 nest2::@return + breturn: + //SEG61 [24] return [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] + rts +} -Removing instruction jmp main__B1 -Removing instruction jmp main__B2 -Removing instruction jmp nest1__B1 -Removing instruction jmp nest1__B2 -Removing instruction jmp nest2__B1 -Removing instruction jmp nest2__B2 +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b1 +Removing instruction jmp b2 Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] phi from main to main::@1 -main__B1_from_main: -//SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $2 -//SEG6 [1] phi from main::@3 to main::@1 -main__B1_from_B3: -//SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy -//SEG8 main::@1 -main__B1: -//SEG9 [2] phi from main::@1 to main::@2 -main__B2_from_B1: -//SEG10 [2] phi (byte) main::j#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $3 -//SEG11 [2] phi from main::@5 to main::@2 -main__B2_from_B5: -//SEG12 [2] phi (byte) main::j#2 = (byte) main::j#1 -- register_copy -//SEG13 main::@2 -main__B2: -//SEG14 [3] call nest1 param-assignment [ main::j#2 main::i#2 ] - jsr nest1 -//SEG15 main::@5 -main__B5: -//SEG16 [4] (byte) main::j#1 ← -- (byte) main::j#2 [ main::j#1 main::i#2 ] -- zpby1=_dec_zpby1 - dec $3 -//SEG17 [5] if((byte) main::j#1>(byte) 0) goto main::@2 [ main::j#1 main::i#2 ] -- zpby1_gt_0_then_la1 - lda $3 - bne main__B2_from_B5 -//SEG18 main::@3 -main__B3: -//SEG19 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- zpby1=_dec_zpby1 - dec $2 -//SEG20 [7] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- zpby1_gt_0_then_la1 - lda $2 - bne main__B1_from_B3 -//SEG21 main::@return -main__Breturn: -//SEG22 [8] return [ ] - rts +main: { + //SEG4 [1] phi from main to main::@1 + b1_from_main: + //SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $2 + //SEG6 [1] phi from main::@3 to main::@1 + b1_from_b3: + //SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy + //SEG8 main::@1 + b1: + //SEG9 [2] phi from main::@1 to main::@2 + b2_from_b1: + //SEG10 [2] phi (byte) main::j#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $3 + //SEG11 [2] phi from main::@5 to main::@2 + b2_from_b5: + //SEG12 [2] phi (byte) main::j#2 = (byte) main::j#1 -- register_copy + //SEG13 main::@2 + b2: + //SEG14 [3] call nest1 param-assignment [ main::j#2 main::i#2 ] + jsr nest1 + //SEG15 main::@5 + b5: + //SEG16 [4] (byte) main::j#1 ← -- (byte) main::j#2 [ main::j#1 main::i#2 ] -- zpby1=_dec_zpby1 + dec $3 + //SEG17 [5] if((byte) main::j#1>(byte) 0) goto main::@2 [ main::j#1 main::i#2 ] -- zpby1_gt_0_then_la1 + lda $3 + bne b2_from_b5 + //SEG18 main::@3 + b3: + //SEG19 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- zpby1=_dec_zpby1 + dec $2 + //SEG20 [7] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- zpby1_gt_0_then_la1 + lda $2 + bne b1_from_b3 + //SEG21 main::@return + breturn: + //SEG22 [8] return [ ] + rts +} //SEG23 nest1 -nest1: -//SEG24 [9] phi from nest1 to nest1::@1 -nest1__B1_from_nest1: -//SEG25 [9] phi (byte) nest1::i#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $4 -//SEG26 [9] phi from nest1::@3 to nest1::@1 -nest1__B1_from_B3: -//SEG27 [9] phi (byte) nest1::i#2 = (byte) nest1::i#1 -- register_copy -//SEG28 nest1::@1 -nest1__B1: -//SEG29 [10] phi from nest1::@1 to nest1::@2 -nest1__B2_from_B1: -//SEG30 [10] phi (byte) nest1::j#2 = (byte) 100 -- aby=coby1 - lda #$64 -//SEG31 [10] phi from nest1::@5 to nest1::@2 -nest1__B2_from_B5: -//SEG32 [10] phi (byte) nest1::j#2 = (byte) nest1::j#1 -- register_copy -//SEG33 nest1::@2 -nest1__B2: -//SEG34 [11] call nest2 param-assignment [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] - jsr nest2 -//SEG35 nest1::@5 -nest1__B5: -//SEG36 [12] (byte) nest1::j#1 ← -- (byte) nest1::j#2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- aby=_dec_aby - sec - sbc #$1 -//SEG37 [13] if((byte) nest1::j#1>(byte) 0) goto nest1::@2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- aby_gt_0_then_la1 - cmp #$0 - bne nest1__B2_from_B5 -//SEG38 nest1::@3 -nest1__B3: -//SEG39 [14] (byte) nest1::i#1 ← -- (byte) nest1::i#2 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1=_dec_zpby1 - dec $4 -//SEG40 [15] if((byte) nest1::i#1>(byte) 0) goto nest1::@1 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1_gt_0_then_la1 - lda $4 - bne nest1__B1_from_B3 -//SEG41 nest1::@return -nest1__Breturn: -//SEG42 [16] return [ main::j#2 main::i#2 ] - rts +nest1: { + //SEG24 [9] phi from nest1 to nest1::@1 + b1_from_nest1: + //SEG25 [9] phi (byte) nest1::i#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $4 + //SEG26 [9] phi from nest1::@3 to nest1::@1 + b1_from_b3: + //SEG27 [9] phi (byte) nest1::i#2 = (byte) nest1::i#1 -- register_copy + //SEG28 nest1::@1 + b1: + //SEG29 [10] phi from nest1::@1 to nest1::@2 + b2_from_b1: + //SEG30 [10] phi (byte) nest1::j#2 = (byte) 100 -- aby=coby1 + lda #$64 + //SEG31 [10] phi from nest1::@5 to nest1::@2 + b2_from_b5: + //SEG32 [10] phi (byte) nest1::j#2 = (byte) nest1::j#1 -- register_copy + //SEG33 nest1::@2 + b2: + //SEG34 [11] call nest2 param-assignment [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] + jsr nest2 + //SEG35 nest1::@5 + b5: + //SEG36 [12] (byte) nest1::j#1 ← -- (byte) nest1::j#2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- aby=_dec_aby + sec + sbc #$1 + //SEG37 [13] if((byte) nest1::j#1>(byte) 0) goto nest1::@2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- aby_gt_0_then_la1 + cmp #$0 + bne b2_from_b5 + //SEG38 nest1::@3 + b3: + //SEG39 [14] (byte) nest1::i#1 ← -- (byte) nest1::i#2 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1=_dec_zpby1 + dec $4 + //SEG40 [15] if((byte) nest1::i#1>(byte) 0) goto nest1::@1 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1_gt_0_then_la1 + lda $4 + bne b1_from_b3 + //SEG41 nest1::@return + breturn: + //SEG42 [16] return [ main::j#2 main::i#2 ] + rts +} //SEG43 nest2 -nest2: -//SEG44 [17] phi from nest2 to nest2::@1 -nest2__B1_from_nest2: -//SEG45 [17] phi (byte) nest2::i#2 = (byte) 100 -- xby=coby1 - ldx #$64 -//SEG46 [17] phi from nest2::@3 to nest2::@1 -nest2__B1_from_B3: -//SEG47 [17] phi (byte) nest2::i#2 = (byte) nest2::i#1 -- register_copy -//SEG48 nest2::@1 -nest2__B1: -//SEG49 [18] phi from nest2::@1 to nest2::@2 -nest2__B2_from_B1: -//SEG50 [18] phi (byte) nest2::j#2 = (byte) 100 -- yby=coby1 - ldy #$64 -//SEG51 [18] phi from nest2::@2 to nest2::@2 -nest2__B2_from_B2: -//SEG52 [18] phi (byte) nest2::j#2 = (byte) nest2::j#1 -- register_copy -//SEG53 nest2::@2 -nest2__B2: -//SEG54 [19] *((word) 1024) ← (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#2 nest2::i#2 ] -- _star_cowo1=yby - sty $400 -//SEG55 [20] (byte) nest2::j#1 ← -- (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- yby=_dec_yby - dey -//SEG56 [21] if((byte) nest2::j#1>(byte) 0) goto nest2::@2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- yby_gt_0_then_la1 - cpy #$0 - bne nest2__B2_from_B2 -//SEG57 nest2::@3 -nest2__B3: -//SEG58 [22] (byte) nest2::i#1 ← -- (byte) nest2::i#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- xby=_dec_xby - dex -//SEG59 [23] if((byte) nest2::i#1>(byte) 0) goto nest2::@1 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- xby_gt_0_then_la1 - cpx #$0 - bne nest2__B1_from_B3 -//SEG60 nest2::@return -nest2__Breturn: -//SEG61 [24] return [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] - rts +nest2: { + //SEG44 [17] phi from nest2 to nest2::@1 + b1_from_nest2: + //SEG45 [17] phi (byte) nest2::i#2 = (byte) 100 -- xby=coby1 + ldx #$64 + //SEG46 [17] phi from nest2::@3 to nest2::@1 + b1_from_b3: + //SEG47 [17] phi (byte) nest2::i#2 = (byte) nest2::i#1 -- register_copy + //SEG48 nest2::@1 + b1: + //SEG49 [18] phi from nest2::@1 to nest2::@2 + b2_from_b1: + //SEG50 [18] phi (byte) nest2::j#2 = (byte) 100 -- yby=coby1 + ldy #$64 + //SEG51 [18] phi from nest2::@2 to nest2::@2 + b2_from_b2: + //SEG52 [18] phi (byte) nest2::j#2 = (byte) nest2::j#1 -- register_copy + //SEG53 nest2::@2 + b2: + //SEG54 [19] *((word) 1024) ← (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#2 nest2::i#2 ] -- _star_cowo1=yby + sty $400 + //SEG55 [20] (byte) nest2::j#1 ← -- (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- yby=_dec_yby + dey + //SEG56 [21] if((byte) nest2::j#1>(byte) 0) goto nest2::@2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- yby_gt_0_then_la1 + cpy #$0 + bne b2_from_b2 + //SEG57 nest2::@3 + b3: + //SEG58 [22] (byte) nest2::i#1 ← -- (byte) nest2::i#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- xby=_dec_xby + dex + //SEG59 [23] if((byte) nest2::i#1>(byte) 0) goto nest2::@1 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- xby_gt_0_then_la1 + cpx #$0 + bne b1_from_b3 + //SEG60 nest2::@return + breturn: + //SEG61 [24] return [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] + rts +} FINAL SYMBOL TABLE -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte*) SCREEN (void()) main() (label) main::@1 @@ -2437,132 +2446,135 @@ reg byte x [ nest2::i#2 nest2::i#1 ] reg byte y [ nest2::j#2 nest2::j#1 ] FINAL CODE -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] phi from main to main::@1 -main__B1_from_main: -//SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $2 -//SEG6 [1] phi from main::@3 to main::@1 -main__B1_from_B3: -//SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy -//SEG8 main::@1 -main__B1: -//SEG9 [2] phi from main::@1 to main::@2 -main__B2_from_B1: -//SEG10 [2] phi (byte) main::j#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $3 -//SEG11 [2] phi from main::@5 to main::@2 -main__B2_from_B5: -//SEG12 [2] phi (byte) main::j#2 = (byte) main::j#1 -- register_copy -//SEG13 main::@2 -main__B2: -//SEG14 [3] call nest1 param-assignment [ main::j#2 main::i#2 ] - jsr nest1 -//SEG15 main::@5 -main__B5: -//SEG16 [4] (byte) main::j#1 ← -- (byte) main::j#2 [ main::j#1 main::i#2 ] -- zpby1=_dec_zpby1 - dec $3 -//SEG17 [5] if((byte) main::j#1>(byte) 0) goto main::@2 [ main::j#1 main::i#2 ] -- zpby1_gt_0_then_la1 - lda $3 - bne main__B2_from_B5 -//SEG18 main::@3 -main__B3: -//SEG19 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- zpby1=_dec_zpby1 - dec $2 -//SEG20 [7] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- zpby1_gt_0_then_la1 - lda $2 - bne main__B1_from_B3 -//SEG21 main::@return -main__Breturn: -//SEG22 [8] return [ ] - rts +main: { + //SEG4 [1] phi from main to main::@1 + b1_from_main: + //SEG5 [1] phi (byte) main::i#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $2 + //SEG6 [1] phi from main::@3 to main::@1 + b1_from_b3: + //SEG7 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy + //SEG8 main::@1 + b1: + //SEG9 [2] phi from main::@1 to main::@2 + b2_from_b1: + //SEG10 [2] phi (byte) main::j#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $3 + //SEG11 [2] phi from main::@5 to main::@2 + b2_from_b5: + //SEG12 [2] phi (byte) main::j#2 = (byte) main::j#1 -- register_copy + //SEG13 main::@2 + b2: + //SEG14 [3] call nest1 param-assignment [ main::j#2 main::i#2 ] + jsr nest1 + //SEG15 main::@5 + b5: + //SEG16 [4] (byte) main::j#1 ← -- (byte) main::j#2 [ main::j#1 main::i#2 ] -- zpby1=_dec_zpby1 + dec $3 + //SEG17 [5] if((byte) main::j#1>(byte) 0) goto main::@2 [ main::j#1 main::i#2 ] -- zpby1_gt_0_then_la1 + lda $3 + bne b2_from_b5 + //SEG18 main::@3 + b3: + //SEG19 [6] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 ] -- zpby1=_dec_zpby1 + dec $2 + //SEG20 [7] if((byte) main::i#1>(byte) 0) goto main::@1 [ main::i#1 ] -- zpby1_gt_0_then_la1 + lda $2 + bne b1_from_b3 + //SEG21 main::@return + breturn: + //SEG22 [8] return [ ] + rts +} //SEG23 nest1 -nest1: -//SEG24 [9] phi from nest1 to nest1::@1 -nest1__B1_from_nest1: -//SEG25 [9] phi (byte) nest1::i#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $4 -//SEG26 [9] phi from nest1::@3 to nest1::@1 -nest1__B1_from_B3: -//SEG27 [9] phi (byte) nest1::i#2 = (byte) nest1::i#1 -- register_copy -//SEG28 nest1::@1 -nest1__B1: -//SEG29 [10] phi from nest1::@1 to nest1::@2 -nest1__B2_from_B1: -//SEG30 [10] phi (byte) nest1::j#2 = (byte) 100 -- aby=coby1 - lda #$64 -//SEG31 [10] phi from nest1::@5 to nest1::@2 -nest1__B2_from_B5: -//SEG32 [10] phi (byte) nest1::j#2 = (byte) nest1::j#1 -- register_copy -//SEG33 nest1::@2 -nest1__B2: -//SEG34 [11] call nest2 param-assignment [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] - jsr nest2 -//SEG35 nest1::@5 -nest1__B5: -//SEG36 [12] (byte) nest1::j#1 ← -- (byte) nest1::j#2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- aby=_dec_aby - sec - sbc #$1 -//SEG37 [13] if((byte) nest1::j#1>(byte) 0) goto nest1::@2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- aby_gt_0_then_la1 - cmp #$0 - bne nest1__B2_from_B5 -//SEG38 nest1::@3 -nest1__B3: -//SEG39 [14] (byte) nest1::i#1 ← -- (byte) nest1::i#2 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1=_dec_zpby1 - dec $4 -//SEG40 [15] if((byte) nest1::i#1>(byte) 0) goto nest1::@1 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1_gt_0_then_la1 - lda $4 - bne nest1__B1_from_B3 -//SEG41 nest1::@return -nest1__Breturn: -//SEG42 [16] return [ main::j#2 main::i#2 ] - rts +nest1: { + //SEG24 [9] phi from nest1 to nest1::@1 + b1_from_nest1: + //SEG25 [9] phi (byte) nest1::i#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $4 + //SEG26 [9] phi from nest1::@3 to nest1::@1 + b1_from_b3: + //SEG27 [9] phi (byte) nest1::i#2 = (byte) nest1::i#1 -- register_copy + //SEG28 nest1::@1 + b1: + //SEG29 [10] phi from nest1::@1 to nest1::@2 + b2_from_b1: + //SEG30 [10] phi (byte) nest1::j#2 = (byte) 100 -- aby=coby1 + lda #$64 + //SEG31 [10] phi from nest1::@5 to nest1::@2 + b2_from_b5: + //SEG32 [10] phi (byte) nest1::j#2 = (byte) nest1::j#1 -- register_copy + //SEG33 nest1::@2 + b2: + //SEG34 [11] call nest2 param-assignment [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] + jsr nest2 + //SEG35 nest1::@5 + b5: + //SEG36 [12] (byte) nest1::j#1 ← -- (byte) nest1::j#2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- aby=_dec_aby + sec + sbc #$1 + //SEG37 [13] if((byte) nest1::j#1>(byte) 0) goto nest1::@2 [ main::j#2 main::i#2 nest1::j#1 nest1::i#2 ] -- aby_gt_0_then_la1 + cmp #$0 + bne b2_from_b5 + //SEG38 nest1::@3 + b3: + //SEG39 [14] (byte) nest1::i#1 ← -- (byte) nest1::i#2 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1=_dec_zpby1 + dec $4 + //SEG40 [15] if((byte) nest1::i#1>(byte) 0) goto nest1::@1 [ main::j#2 main::i#2 nest1::i#1 ] -- zpby1_gt_0_then_la1 + lda $4 + bne b1_from_b3 + //SEG41 nest1::@return + breturn: + //SEG42 [16] return [ main::j#2 main::i#2 ] + rts +} //SEG43 nest2 -nest2: -//SEG44 [17] phi from nest2 to nest2::@1 -nest2__B1_from_nest2: -//SEG45 [17] phi (byte) nest2::i#2 = (byte) 100 -- xby=coby1 - ldx #$64 -//SEG46 [17] phi from nest2::@3 to nest2::@1 -nest2__B1_from_B3: -//SEG47 [17] phi (byte) nest2::i#2 = (byte) nest2::i#1 -- register_copy -//SEG48 nest2::@1 -nest2__B1: -//SEG49 [18] phi from nest2::@1 to nest2::@2 -nest2__B2_from_B1: -//SEG50 [18] phi (byte) nest2::j#2 = (byte) 100 -- yby=coby1 - ldy #$64 -//SEG51 [18] phi from nest2::@2 to nest2::@2 -nest2__B2_from_B2: -//SEG52 [18] phi (byte) nest2::j#2 = (byte) nest2::j#1 -- register_copy -//SEG53 nest2::@2 -nest2__B2: -//SEG54 [19] *((word) 1024) ← (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#2 nest2::i#2 ] -- _star_cowo1=yby - sty $400 -//SEG55 [20] (byte) nest2::j#1 ← -- (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- yby=_dec_yby - dey -//SEG56 [21] if((byte) nest2::j#1>(byte) 0) goto nest2::@2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- yby_gt_0_then_la1 - cpy #$0 - bne nest2__B2_from_B2 -//SEG57 nest2::@3 -nest2__B3: -//SEG58 [22] (byte) nest2::i#1 ← -- (byte) nest2::i#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- xby=_dec_xby - dex -//SEG59 [23] if((byte) nest2::i#1>(byte) 0) goto nest2::@1 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- xby_gt_0_then_la1 - cpx #$0 - bne nest2__B1_from_B3 -//SEG60 nest2::@return -nest2__Breturn: -//SEG61 [24] return [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] - rts +nest2: { + //SEG44 [17] phi from nest2 to nest2::@1 + b1_from_nest2: + //SEG45 [17] phi (byte) nest2::i#2 = (byte) 100 -- xby=coby1 + ldx #$64 + //SEG46 [17] phi from nest2::@3 to nest2::@1 + b1_from_b3: + //SEG47 [17] phi (byte) nest2::i#2 = (byte) nest2::i#1 -- register_copy + //SEG48 nest2::@1 + b1: + //SEG49 [18] phi from nest2::@1 to nest2::@2 + b2_from_b1: + //SEG50 [18] phi (byte) nest2::j#2 = (byte) 100 -- yby=coby1 + ldy #$64 + //SEG51 [18] phi from nest2::@2 to nest2::@2 + b2_from_b2: + //SEG52 [18] phi (byte) nest2::j#2 = (byte) nest2::j#1 -- register_copy + //SEG53 nest2::@2 + b2: + //SEG54 [19] *((word) 1024) ← (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#2 nest2::i#2 ] -- _star_cowo1=yby + sty $400 + //SEG55 [20] (byte) nest2::j#1 ← -- (byte) nest2::j#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- yby=_dec_yby + dey + //SEG56 [21] if((byte) nest2::j#1>(byte) 0) goto nest2::@2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::j#1 nest2::i#2 ] -- yby_gt_0_then_la1 + cpy #$0 + bne b2_from_b2 + //SEG57 nest2::@3 + b3: + //SEG58 [22] (byte) nest2::i#1 ← -- (byte) nest2::i#2 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- xby=_dec_xby + dex + //SEG59 [23] if((byte) nest2::i#1>(byte) 0) goto nest2::@1 [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 nest2::i#1 ] -- xby_gt_0_then_la1 + cpx #$0 + bne b1_from_b3 + //SEG60 nest2::@return + breturn: + //SEG61 [24] return [ main::j#2 main::i#2 nest1::j#2 nest1::i#2 ] + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.sym b/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.sym index 1d7d046f7..c4777bca4 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.sym +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopnest2.sym @@ -1,5 +1,5 @@ -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte*) SCREEN (void()) main() (label) main::@1 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.asm b/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.asm index 2e86f9e12..87dc109c0 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.asm @@ -1,26 +1,27 @@ -BBEGIN: +bbegin: jsr main -BEND: -main: -main__B1_from_main: - ldy #$0 - ldx #$64 -main__B1: - dex - cpx #$0 - bne main__B2 -main__Breturn: - rts -main__B2: +bend: +main: { + b1_from_main: + ldy #$0 + ldx #$64 + b1: + dex + cpx #$0 + bne b2 + breturn: + rts +} +b2: cpx #$32 beq !+ - bcs main__B4 + bcs b4 !: -main__B5: +b5: dey -main__B1_from_B5: - jmp main__B1 -main__B4: +b1_from_b5: + jmp b1 +b4: iny -main__B1_from_B4: - jmp main__B1 +b1_from_b4: + jmp b1 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.cfg b/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.cfg index a7ebfe712..3e02d067c 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.cfg +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.cfg @@ -1,8 +1,8 @@ -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@4 main::@5 [1] (byte) main::s#3 ← phi( main/(byte) 0 main::@4/(byte) main::s#1 main::@5/(byte) main::s#2 ) [ main::i#2 main::s#3 ] @@ -12,7 +12,7 @@ main::@1: from main main::@4 main::@5 to:main::@return main::@return: from main::@1 [4] return [ ] - to:@RETURN + to:@return main::@2: from main::@1 [5] if((byte) main::i#1>(byte) 50) goto main::@4 [ main::i#1 main::s#3 ] to:main::@5 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.log b/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.log index 7c2c35a48..90f375922 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.log @@ -57,7 +57,7 @@ SYMBOLS (byte) main::s INITIAL CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (void~) $0 ← call main to:@1 main: from @@ -97,10 +97,10 @@ main::@12: from to:main::@3 main::@return: from main::@3 return - to:@RETURN -@1: from @BEGIN - to:@END -@END: from @1 + to:@return +@1: from @begin + to:@end +@end: from @1 Removing empty block main::@7 Removing empty block main::@3 @@ -112,9 +112,9 @@ Removing empty block main::@11 Removing empty block main::@12 Removing empty block @1 CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (void~) $0 ← call main - to:@END + to:@end main: from (byte) main::i ← (byte) 100 (byte) main::s ← (byte) 0 @@ -136,18 +136,18 @@ main::@5: from main::@2 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin PROCEDURE MODIFY VARIABLE ANALYSIS CONTROL FLOW GRAPH WITH ASSIGNMENT CALL -@BEGIN: from +@begin: from call main param-assignment to:@2 -@2: from @BEGIN - to:@END -main: from @BEGIN +@2: from @begin + to:@end +main: from @begin (byte) main::i ← (byte) 100 (byte) main::s ← (byte) 0 to:main::@1 @@ -168,19 +168,19 @@ main::@5: from main::@2 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @2 + to:@return +@end: from @2 Completing Phi functions... Completing Phi functions... Completing Phi functions... CONTROL FLOW GRAPH SSA -@BEGIN: from +@begin: from call main param-assignment to:@2 -@2: from @BEGIN - to:@END -main: from @BEGIN +@2: from @begin + to:@end +main: from @begin (byte) main::i#0 ← (byte) 100 (byte) main::s#0 ← (byte) 0 to:main::@1 @@ -209,16 +209,16 @@ main::@5: from main::@2 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @2 + to:@return +@end: from @2 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN -@BEGIN: from +@begin: from call main param-assignment to:@2 -@2: from @BEGIN - to:@END -main: from @BEGIN +@2: from @begin + to:@end +main: from @begin (byte) main::i#0 ← (byte) 100 (byte) main::s#0 ← (byte) 0 to:main::@1 @@ -247,16 +247,16 @@ main::@5: from main::@2 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @2 + to:@return +@end: from @2 Culled Empty Block (label) @2 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin (byte) main::i#0 ← (byte) 100 (byte) main::s#0 ← (byte) 0 to:main::@1 @@ -285,17 +285,17 @@ main::@5: from main::@2 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte) main::i#0 (byte) 100 Constant (byte) main::s#0 (byte) 0 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@4 main::@5 (byte) main::s#6 ← phi( main/(byte) 0 main::@4/(byte) main::s#1 main::@5/(byte) main::s#2 ) @@ -322,17 +322,17 @@ main::@5: from main::@2 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin 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 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@4 main::@5 (byte) main::s#3 ← phi( main/(byte) 0 main::@4/(byte) main::s#1 main::@5/(byte) main::s#2 ) @@ -353,17 +353,17 @@ main::@5: from main::@2 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Simple Condition (boolean~) main::$0 if((byte) main::i#1>(byte) 0) goto main::@2 Simple Condition (boolean~) main::$1 if((byte) main::i#1>(byte) 50) goto main::@4 Succesful SSA optimization Pass2ConditionalJumpSimplification CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@4 main::@5 (byte) main::s#3 ← phi( main/(byte) 0 main::@4/(byte) main::s#1 main::@5/(byte) main::s#2 ) @@ -382,17 +382,17 @@ main::@5: from main::@2 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin -Block Sequence Planned @BEGIN @END main main::@1 main::@return main::@2 main::@5 main::@4 -Block Sequence Planned @BEGIN @END main main::@1 main::@return main::@2 main::@5 main::@4 +Block Sequence Planned @begin @end main main::@1 main::@return main::@2 main::@5 main::@4 +Block Sequence Planned @begin @end main main::@1 main::@return main::@2 main::@5 main::@4 CONTROL FLOW GRAPH - PHI LIFTED -@BEGIN: from +@begin: from call main param-assignment - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@4 main::@5 (byte) main::s#3 ← phi( main/(byte) 0 main::@4/(byte~) main::s#7 main::@5/(byte~) main::s#8 ) @@ -402,7 +402,7 @@ main::@1: from main main::@4 main::@5 to:main::@return main::@return: from main::@1 return - to:@RETURN + to:@return main::@2: from main::@1 if((byte) main::i#1>(byte) 50) goto main::@4 to:main::@5 @@ -422,11 +422,11 @@ Propagating live ranges... Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@4 main::@5 [1] (byte) main::s#3 ← phi( main/(byte) 0 main::@4/(byte~) main::s#7 main::@5/(byte~) main::s#8 ) [ main::i#2 main::s#3 ] @@ -436,7 +436,7 @@ main::@1: from main main::@4 main::@5 to:main::@return main::@return: from main::@1 [4] return [ ] - to:@RETURN + to:@return main::@2: from main::@1 [5] if((byte) main::i#1>(byte) 50) goto main::@4 [ main::i#1 main::s#3 ] to:main::@5 @@ -457,17 +457,17 @@ Coalesced [8] main::s#8 ← main::s#2 Coalesced (already) [10] main::i#6 ← main::i#1 Coalesced [11] main::s#7 ← main::s#1 Coalesced down to 2 phi equivalence classes -Block Sequence Planned @BEGIN @END main main::@1 main::@return main::@2 main::@5 main::@4 +Block Sequence Planned @begin @end main main::@1 main::@return main::@2 main::@5 main::@4 Propagating live ranges... Propagating live ranges... Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@4 main::@5 [1] (byte) main::s#3 ← phi( main/(byte) 0 main::@4/(byte) main::s#1 main::@5/(byte) main::s#2 ) [ main::i#2 main::s#3 ] @@ -477,7 +477,7 @@ main::@1: from main main::@4 main::@5 to:main::@return main::@return: from main::@1 [4] return [ ] - to:@RETURN + to:@return main::@2: from main::@1 [5] if((byte) main::i#1>(byte) 50) goto main::@4 [ main::i#1 main::s#3 ] to:main::@5 @@ -492,14 +492,14 @@ CALL GRAPH Calls in [] to 0:main DOMINATORS -@BEGIN dominated by @BEGIN -@END dominated by @BEGIN @END -main dominated by @BEGIN main -main::@1 dominated by @BEGIN main::@1 main -main::@return dominated by @BEGIN main::@return main::@1 main -main::@2 dominated by @BEGIN main::@2 main::@1 main -main::@5 dominated by @BEGIN main::@2 main::@1 main::@5 main -main::@4 dominated by @BEGIN main::@2 main::@1 main::@4 main +@begin dominated by @begin +@end dominated by @end @begin +main dominated by @begin main +main::@1 dominated by @begin main::@1 main +main::@return dominated by main::@return @begin main::@1 main +main::@2 dominated by @begin main::@2 main::@1 main +main::@5 dominated by @begin main::@2 main::@1 main::@5 main +main::@4 dominated by @begin main::@2 main::@1 main::@4 main Found back edge: Loop head: main::@1 tails: main::@5 blocks: null Found back edge: Loop head: main::@1 tails: main::@4 blocks: null @@ -535,63 +535,64 @@ Complete equivalence classes Allocated zp byte:2 to zp byte:2 [ main::i#2 main::i#1 ] Allocated zp byte:3 to zp byte:3 [ main::s#3 main::s#1 main::s#2 ] INITIAL ASM -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main - jmp BEND -//SEG2 @END -BEND: + jmp bend +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] phi from main to main::@1 -main__B1_from_main: -//SEG5 [1] phi (byte) main::s#3 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $3 -//SEG6 [1] phi (byte) main::i#2 = (byte) 100 -- zpby1=coby1 - lda #$64 - sta $2 - jmp main__B1 -//SEG7 main::@1 -main__B1: -//SEG8 [2] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 main::s#3 ] -- zpby1=_dec_zpby1 - dec $2 -//SEG9 [3] if((byte) main::i#1>(byte) 0) goto main::@2 [ main::i#1 main::s#3 ] -- zpby1_gt_0_then_la1 - lda $2 - bne main__B2 - jmp main__Breturn -//SEG10 main::@return -main__Breturn: -//SEG11 [4] return [ ] - rts +main: { + //SEG4 [1] phi from main to main::@1 + b1_from_main: + //SEG5 [1] phi (byte) main::s#3 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $3 + //SEG6 [1] phi (byte) main::i#2 = (byte) 100 -- zpby1=coby1 + lda #$64 + sta $2 + jmp b1 + //SEG7 main::@1 + b1: + //SEG8 [2] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 main::s#3 ] -- zpby1=_dec_zpby1 + dec $2 + //SEG9 [3] if((byte) main::i#1>(byte) 0) goto main::@2 [ main::i#1 main::s#3 ] -- zpby1_gt_0_then_la1 + lda $2 + bne b2 + jmp breturn + //SEG10 main::@return + breturn: + //SEG11 [4] return [ ] + rts +} //SEG12 main::@2 -main__B2: +b2: //SEG13 [5] if((byte) main::i#1>(byte) 50) goto main::@4 [ main::i#1 main::s#3 ] -- zpby1_gt_coby1_then_la1 lda $2 cmp #$32 beq !+ - bcs main__B4 + bcs b4 !: - jmp main__B5 + jmp b5 //SEG14 main::@5 -main__B5: +b5: //SEG15 [6] (byte) main::s#2 ← -- (byte) main::s#3 [ main::i#1 main::s#2 ] -- zpby1=_dec_zpby1 dec $3 //SEG16 [1] phi from main::@5 to main::@1 -main__B1_from_B5: +b1_from_b5: //SEG17 [1] phi (byte) main::s#3 = (byte) main::s#2 -- register_copy //SEG18 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy - jmp main__B1 + jmp b1 //SEG19 main::@4 -main__B4: +b4: //SEG20 [7] (byte) main::s#1 ← ++ (byte) main::s#3 [ main::i#1 main::s#1 ] -- zpby1=_inc_zpby1 inc $3 //SEG21 [1] phi from main::@4 to main::@1 -main__B1_from_B4: +b1_from_b4: //SEG22 [1] phi (byte) main::s#3 = (byte) main::s#1 -- register_copy //SEG23 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy - jmp main__B1 + jmp b1 REGISTER UPLIFT POTENTIAL REGISTERS Potential registers zp byte:2 [ main::i#2 main::i#1 ] : zp byte:2 , reg byte a , reg byte x , reg byte y , @@ -603,66 +604,67 @@ Uplift Scope [] Uplifting [main] best 380 combination reg byte y [ main::s#3 main::s#1 main::s#2 ] reg byte x [ main::i#2 main::i#1 ] Uplifting [] best 380 combination -Removing instruction jmp BEND -Removing instruction jmp main__B1 -Removing instruction jmp main__Breturn -Removing instruction jmp main__B5 +Removing instruction jmp bend +Removing instruction jmp b1 +Removing instruction jmp breturn +Removing instruction jmp b5 Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] phi from main to main::@1 -main__B1_from_main: -//SEG5 [1] phi (byte) main::s#3 = (byte) 0 -- yby=coby1 - ldy #$0 -//SEG6 [1] phi (byte) main::i#2 = (byte) 100 -- xby=coby1 - ldx #$64 -//SEG7 main::@1 -main__B1: -//SEG8 [2] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 main::s#3 ] -- xby=_dec_xby - dex -//SEG9 [3] if((byte) main::i#1>(byte) 0) goto main::@2 [ main::i#1 main::s#3 ] -- xby_gt_0_then_la1 - cpx #$0 - bne main__B2 -//SEG10 main::@return -main__Breturn: -//SEG11 [4] return [ ] - rts +main: { + //SEG4 [1] phi from main to main::@1 + b1_from_main: + //SEG5 [1] phi (byte) main::s#3 = (byte) 0 -- yby=coby1 + ldy #$0 + //SEG6 [1] phi (byte) main::i#2 = (byte) 100 -- xby=coby1 + ldx #$64 + //SEG7 main::@1 + b1: + //SEG8 [2] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 main::s#3 ] -- xby=_dec_xby + dex + //SEG9 [3] if((byte) main::i#1>(byte) 0) goto main::@2 [ main::i#1 main::s#3 ] -- xby_gt_0_then_la1 + cpx #$0 + bne b2 + //SEG10 main::@return + breturn: + //SEG11 [4] return [ ] + rts +} //SEG12 main::@2 -main__B2: +b2: //SEG13 [5] if((byte) main::i#1>(byte) 50) goto main::@4 [ main::i#1 main::s#3 ] -- xby_gt_coby1_then_la1 cpx #$32 beq !+ - bcs main__B4 + bcs b4 !: //SEG14 main::@5 -main__B5: +b5: //SEG15 [6] (byte) main::s#2 ← -- (byte) main::s#3 [ main::i#1 main::s#2 ] -- yby=_dec_yby dey //SEG16 [1] phi from main::@5 to main::@1 -main__B1_from_B5: +b1_from_b5: //SEG17 [1] phi (byte) main::s#3 = (byte) main::s#2 -- register_copy //SEG18 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy - jmp main__B1 + jmp b1 //SEG19 main::@4 -main__B4: +b4: //SEG20 [7] (byte) main::s#1 ← ++ (byte) main::s#3 [ main::i#1 main::s#1 ] -- yby=_inc_yby iny //SEG21 [1] phi from main::@4 to main::@1 -main__B1_from_B4: +b1_from_b4: //SEG22 [1] phi (byte) main::s#3 = (byte) main::s#1 -- register_copy //SEG23 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy - jmp main__B1 + jmp b1 FINAL SYMBOL TABLE -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (void()) main() (label) main::@1 (label) main::@2 @@ -681,54 +683,55 @@ reg byte x [ main::i#2 main::i#1 ] reg byte y [ main::s#3 main::s#1 main::s#2 ] FINAL CODE -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] phi from main to main::@1 -main__B1_from_main: -//SEG5 [1] phi (byte) main::s#3 = (byte) 0 -- yby=coby1 - ldy #$0 -//SEG6 [1] phi (byte) main::i#2 = (byte) 100 -- xby=coby1 - ldx #$64 -//SEG7 main::@1 -main__B1: -//SEG8 [2] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 main::s#3 ] -- xby=_dec_xby - dex -//SEG9 [3] if((byte) main::i#1>(byte) 0) goto main::@2 [ main::i#1 main::s#3 ] -- xby_gt_0_then_la1 - cpx #$0 - bne main__B2 -//SEG10 main::@return -main__Breturn: -//SEG11 [4] return [ ] - rts +main: { + //SEG4 [1] phi from main to main::@1 + b1_from_main: + //SEG5 [1] phi (byte) main::s#3 = (byte) 0 -- yby=coby1 + ldy #$0 + //SEG6 [1] phi (byte) main::i#2 = (byte) 100 -- xby=coby1 + ldx #$64 + //SEG7 main::@1 + b1: + //SEG8 [2] (byte) main::i#1 ← -- (byte) main::i#2 [ main::i#1 main::s#3 ] -- xby=_dec_xby + dex + //SEG9 [3] if((byte) main::i#1>(byte) 0) goto main::@2 [ main::i#1 main::s#3 ] -- xby_gt_0_then_la1 + cpx #$0 + bne b2 + //SEG10 main::@return + breturn: + //SEG11 [4] return [ ] + rts +} //SEG12 main::@2 -main__B2: +b2: //SEG13 [5] if((byte) main::i#1>(byte) 50) goto main::@4 [ main::i#1 main::s#3 ] -- xby_gt_coby1_then_la1 cpx #$32 beq !+ - bcs main__B4 + bcs b4 !: //SEG14 main::@5 -main__B5: +b5: //SEG15 [6] (byte) main::s#2 ← -- (byte) main::s#3 [ main::i#1 main::s#2 ] -- yby=_dec_yby dey //SEG16 [1] phi from main::@5 to main::@1 -main__B1_from_B5: +b1_from_b5: //SEG17 [1] phi (byte) main::s#3 = (byte) main::s#2 -- register_copy //SEG18 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy - jmp main__B1 + jmp b1 //SEG19 main::@4 -main__B4: +b4: //SEG20 [7] (byte) main::s#1 ← ++ (byte) main::s#3 [ main::i#1 main::s#1 ] -- yby=_inc_yby iny //SEG21 [1] phi from main::@4 to main::@1 -main__B1_from_B4: +b1_from_b4: //SEG22 [1] phi (byte) main::s#3 = (byte) main::s#1 -- register_copy //SEG23 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy - jmp main__B1 + jmp b1 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.sym b/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.sym index d9b051c67..d15fa31c0 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.sym +++ b/src/main/java/dk/camelot64/kickc/test/ref/loopsplit.sym @@ -1,5 +1,5 @@ -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (void()) main() (label) main::@1 (label) main::@2 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/minus.asm b/src/main/java/dk/camelot64/kickc/test/ref/minus.asm index 8fd308dd6..c028e66ef 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/minus.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/minus.asm @@ -1,13 +1,13 @@ -BBEGIN: -B1_from_BBEGIN: +bbegin: +b1_from_bbegin: ldx #$5 -B1_from_B1: -B1: +b1_from_b1: +b1: txa clc adc #$4 sta $1100,x inx cpx #$a - bcc B1_from_B1 -BEND: + bcc b1_from_b1 +bend: diff --git a/src/main/java/dk/camelot64/kickc/test/ref/minus.cfg b/src/main/java/dk/camelot64/kickc/test/ref/minus.cfg index 77aeb7f43..215bb8704 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/minus.cfg +++ b/src/main/java/dk/camelot64/kickc/test/ref/minus.cfg @@ -1,10 +1,10 @@ -@BEGIN: from +@begin: from to:@1 -@1: from @1 @BEGIN - [0] (byte) i#2 ← phi( @1/(byte) i#1 @BEGIN/(byte) 5 ) [ i#2 ] +@1: from @1 @begin + [0] (byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 ) [ i#2 ] [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] [2] *((word) 4352 + (byte) i#2) ← (byte~) $1 [ i#2 ] [3] (byte) i#1 ← (byte) i#2 + (byte) 1 [ i#1 ] [4] if((byte) i#1<(byte) 10) goto @1 [ i#1 ] - to:@END -@END: from @1 + to:@end +@end: from @1 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/minus.log b/src/main/java/dk/camelot64/kickc/test/ref/minus.log index b8537abaa..73e95a642 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/minus.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/minus.log @@ -27,11 +27,11 @@ SYMBOLS (byte[16]) p INITIAL CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte[16]) p ← (word) 4352 (byte) i ← (byte) 5 to:@1 -@1: from @1 @BEGIN +@1: from @1 @begin (byte~) $0 ← (byte) 2 + (byte) i (byte~) $1 ← (byte~) $0 + (byte) 2 *((byte[16]) p + (byte) i) ← (byte~) $1 @@ -41,16 +41,16 @@ INITIAL CONTROL FLOW GRAPH if((boolean~) $3) goto @1 to:@2 @2: from @1 - to:@END -@END: from @2 + to:@end +@end: from @2 Removing empty block @2 CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte[16]) p ← (word) 4352 (byte) i ← (byte) 5 to:@1 -@1: from @1 @BEGIN +@1: from @1 @begin (byte~) $0 ← (byte) 2 + (byte) i (byte~) $1 ← (byte~) $0 + (byte) 2 *((byte[16]) p + (byte) i) ← (byte~) $1 @@ -58,17 +58,17 @@ CONTROL FLOW GRAPH (byte) i ← (byte~) $2 (boolean~) $3 ← (byte) i < (byte) 10 if((boolean~) $3) goto @1 - to:@END -@END: from @1 + to:@end +@end: from @1 PROCEDURE MODIFY VARIABLE ANALYSIS CONTROL FLOW GRAPH WITH ASSIGNMENT CALL -@BEGIN: from +@begin: from (byte[16]) p ← (word) 4352 (byte) i ← (byte) 5 to:@1 -@1: from @1 @BEGIN +@1: from @1 @begin (byte~) $0 ← (byte) 2 + (byte) i (byte~) $1 ← (byte~) $0 + (byte) 2 *((byte[16]) p + (byte) i) ← (byte~) $1 @@ -76,18 +76,18 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL (byte) i ← (byte~) $2 (boolean~) $3 ← (byte) i < (byte) 10 if((boolean~) $3) goto @1 - to:@END -@END: from @1 + to:@end +@end: from @1 Completing Phi functions... CONTROL FLOW GRAPH SSA -@BEGIN: from +@begin: from (byte[16]) p#0 ← (word) 4352 (byte) i#0 ← (byte) 5 to:@1 -@1: from @1 @BEGIN - (byte[16]) p#1 ← phi( @1/(byte[16]) p#1 @BEGIN/(byte[16]) p#0 ) - (byte) i#2 ← phi( @1/(byte) i#1 @BEGIN/(byte) i#0 ) +@1: from @1 @begin + (byte[16]) p#1 ← phi( @1/(byte[16]) p#1 @begin/(byte[16]) p#0 ) + (byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) i#0 ) (byte~) $0 ← (byte) 2 + (byte) i#2 (byte~) $1 ← (byte~) $0 + (byte) 2 *((byte[16]) p#1 + (byte) i#2) ← (byte~) $1 @@ -95,17 +95,17 @@ CONTROL FLOW GRAPH SSA (byte) i#1 ← (byte~) $2 (boolean~) $3 ← (byte) i#1 < (byte) 10 if((boolean~) $3) goto @1 - to:@END -@END: from @1 + to:@end +@end: from @1 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN -@BEGIN: from +@begin: from (byte[16]) p#0 ← (word) 4352 (byte) i#0 ← (byte) 5 to:@1 -@1: from @1 @BEGIN - (byte[16]) p#1 ← phi( @1/(byte[16]) p#1 @BEGIN/(byte[16]) p#0 ) - (byte) i#2 ← phi( @1/(byte) i#1 @BEGIN/(byte) i#0 ) +@1: from @1 @begin + (byte[16]) p#1 ← phi( @1/(byte[16]) p#1 @begin/(byte[16]) p#0 ) + (byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) i#0 ) (byte~) $0 ← (byte) 2 + (byte) i#2 (byte~) $1 ← (byte~) $0 + (byte) 2 *((byte[16]) p#1 + (byte) i#2) ← (byte~) $1 @@ -113,18 +113,18 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN (byte) i#1 ← (byte~) $2 (boolean~) $3 ← (byte) i#1 < (byte) 10 if((boolean~) $3) goto @1 - to:@END -@END: from @1 + to:@end +@end: from @1 Constant (byte[16]) p#0 (word) 4352 Constant (byte) i#0 (byte) 5 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from to:@1 -@1: from @1 @BEGIN - (byte[16]) p#1 ← phi( @1/(byte[16]) p#1 @BEGIN/(word) 4352 ) - (byte) i#2 ← phi( @1/(byte) i#1 @BEGIN/(byte) 5 ) +@1: from @1 @begin + (byte[16]) p#1 ← phi( @1/(byte[16]) p#1 @begin/(word) 4352 ) + (byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 ) (byte~) $0 ← (byte) 2 + (byte) i#2 (byte~) $1 ← (byte~) $0 + (byte) 2 *((byte[16]) p#1 + (byte) i#2) ← (byte~) $1 @@ -132,19 +132,19 @@ CONTROL FLOW GRAPH (byte) i#1 ← (byte~) $2 (boolean~) $3 ← (byte) i#1 < (byte) 10 if((boolean~) $3) goto @1 - to:@END -@END: from @1 + to:@end +@end: from @1 Multiple usages for variable. Not optimizing sub-constant (byte) i#2 Consolidated constant in assignment $1 Multiple usages for variable. Not optimizing sub-constant (byte) i#2 Succesful SSA optimization Pass2ConstantAdditionElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from to:@1 -@1: from @1 @BEGIN - (byte[16]) p#1 ← phi( @1/(byte[16]) p#1 @BEGIN/(word) 4352 ) - (byte) i#2 ← phi( @1/(byte) i#1 @BEGIN/(byte) 5 ) +@1: from @1 @begin + (byte[16]) p#1 ← phi( @1/(byte[16]) p#1 @begin/(word) 4352 ) + (byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 ) (byte~) $0 ← (byte) i#2 (byte~) $1 ← (byte~) $0 + (byte) 4 *((byte[16]) p#1 + (byte) i#2) ← (byte~) $1 @@ -152,70 +152,70 @@ CONTROL FLOW GRAPH (byte) i#1 ← (byte~) $2 (boolean~) $3 ← (byte) i#1 < (byte) 10 if((boolean~) $3) goto @1 - to:@END -@END: from @1 + to:@end +@end: from @1 Alias (byte) i#2 = (byte~) $0 Alias (byte) i#1 = (byte~) $2 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from to:@1 -@1: from @1 @BEGIN - (byte[16]) p#1 ← phi( @1/(byte[16]) p#1 @BEGIN/(word) 4352 ) - (byte) i#2 ← phi( @1/(byte) i#1 @BEGIN/(byte) 5 ) +@1: from @1 @begin + (byte[16]) p#1 ← phi( @1/(byte[16]) p#1 @begin/(word) 4352 ) + (byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 ) (byte~) $1 ← (byte) i#2 + (byte) 4 *((byte[16]) p#1 + (byte) i#2) ← (byte~) $1 (byte) i#1 ← (byte) i#2 + (byte) 1 (boolean~) $3 ← (byte) i#1 < (byte) 10 if((boolean~) $3) goto @1 - to:@END -@END: from @1 + to:@end +@end: from @1 Self Phi Eliminated (byte[16]) p#1 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from to:@1 -@1: from @1 @BEGIN - (byte[16]) p#1 ← phi( @BEGIN/(word) 4352 ) - (byte) i#2 ← phi( @1/(byte) i#1 @BEGIN/(byte) 5 ) +@1: from @1 @begin + (byte[16]) p#1 ← phi( @begin/(word) 4352 ) + (byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 ) (byte~) $1 ← (byte) i#2 + (byte) 4 *((byte[16]) p#1 + (byte) i#2) ← (byte~) $1 (byte) i#1 ← (byte) i#2 + (byte) 1 (boolean~) $3 ← (byte) i#1 < (byte) 10 if((boolean~) $3) goto @1 - to:@END -@END: from @1 + to:@end +@end: from @1 Simple Condition (boolean~) $3 if((byte) i#1<(byte) 10) goto @1 Succesful SSA optimization Pass2ConditionalJumpSimplification CONTROL FLOW GRAPH -@BEGIN: from +@begin: from to:@1 -@1: from @1 @BEGIN - (byte[16]) p#1 ← phi( @BEGIN/(word) 4352 ) - (byte) i#2 ← phi( @1/(byte) i#1 @BEGIN/(byte) 5 ) +@1: from @1 @begin + (byte[16]) p#1 ← phi( @begin/(word) 4352 ) + (byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 ) (byte~) $1 ← (byte) i#2 + (byte) 4 *((byte[16]) p#1 + (byte) i#2) ← (byte~) $1 (byte) i#1 ← (byte) i#2 + (byte) 1 if((byte) i#1<(byte) 10) goto @1 - to:@END -@END: from @1 + to:@end +@end: from @1 Constant (byte[16]) p#1 (word) 4352 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from to:@1 -@1: from @1 @BEGIN - (byte) i#2 ← phi( @1/(byte) i#1 @BEGIN/(byte) 5 ) +@1: from @1 @begin + (byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 ) (byte~) $1 ← (byte) i#2 + (byte) 4 *((word) 4352 + (byte) i#2) ← (byte~) $1 (byte) i#1 ← (byte) i#2 + (byte) 1 if((byte) i#1<(byte) 10) goto @1 - to:@END -@END: from @1 + to:@end +@end: from @1 Multiple usages for variable. Not optimizing sub-constant (byte) i#2 Multiple usages for variable. Not optimizing sub-constant (byte) i#2 @@ -223,36 +223,36 @@ Multiple usages for variable. Not optimizing sub-constant (byte) i#2 Multiple usages for variable. Not optimizing sub-constant (byte) i#2 Multiple usages for variable. Not optimizing sub-constant (byte) i#2 Multiple usages for variable. Not optimizing sub-constant (byte) i#2 -Block Sequence Planned @BEGIN @1 @END +Block Sequence Planned @begin @1 @end Added new block during phi lifting @3(between @1 and @1) -Block Sequence Planned @BEGIN @1 @END @3 +Block Sequence Planned @begin @1 @end @3 CONTROL FLOW GRAPH - PHI LIFTED -@BEGIN: from +@begin: from to:@1 -@1: from @3 @BEGIN - (byte) i#2 ← phi( @3/(byte~) i#3 @BEGIN/(byte) 5 ) +@1: from @3 @begin + (byte) i#2 ← phi( @3/(byte~) i#3 @begin/(byte) 5 ) (byte~) $1 ← (byte) i#2 + (byte) 4 *((word) 4352 + (byte) i#2) ← (byte~) $1 (byte) i#1 ← (byte) i#2 + (byte) 1 if((byte) i#1<(byte) 10) goto @3 - to:@END -@END: from @1 + to:@end +@end: from @1 @3: from @1 (byte~) i#3 ← (byte) i#1 to:@1 Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES -@BEGIN: from +@begin: from to:@1 -@1: from @3 @BEGIN - [0] (byte) i#2 ← phi( @3/(byte~) i#3 @BEGIN/(byte) 5 ) [ i#2 ] +@1: from @3 @begin + [0] (byte) i#2 ← phi( @3/(byte~) i#3 @begin/(byte) 5 ) [ i#2 ] [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] [2] *((word) 4352 + (byte) i#2) ← (byte~) $1 [ i#2 ] [3] (byte) i#1 ← (byte) i#2 + (byte) 1 [ i#1 ] [4] if((byte) i#1<(byte) 10) goto @3 [ i#1 ] - to:@END -@END: from @1 + to:@end +@end: from @1 @3: from @1 [5] (byte~) i#3 ← (byte) i#1 [ i#3 ] to:@1 @@ -261,26 +261,26 @@ Created 1 initial phi equivalence classes Coalesced [5] i#3 ← i#1 Coalesced down to 1 phi equivalence classes Culled Empty Block (label) @3 -Block Sequence Planned @BEGIN @1 @END +Block Sequence Planned @begin @1 @end Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED -@BEGIN: from +@begin: from to:@1 -@1: from @1 @BEGIN - [0] (byte) i#2 ← phi( @1/(byte) i#1 @BEGIN/(byte) 5 ) [ i#2 ] +@1: from @1 @begin + [0] (byte) i#2 ← phi( @1/(byte) i#1 @begin/(byte) 5 ) [ i#2 ] [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] [2] *((word) 4352 + (byte) i#2) ← (byte~) $1 [ i#2 ] [3] (byte) i#1 ← (byte) i#2 + (byte) 1 [ i#1 ] [4] if((byte) i#1<(byte) 10) goto @1 [ i#1 ] - to:@END -@END: from @1 + to:@end +@end: from @1 CALL GRAPH DOMINATORS -@BEGIN dominated by @BEGIN -@1 dominated by @1 @BEGIN -@END dominated by @1 @BEGIN @END +@begin dominated by @begin +@1 dominated by @1 @begin +@end dominated by @1 @end @begin Found back edge: Loop head: @1 tails: @1 blocks: null Populated: Loop head: @1 tails: @1 blocks: @1 @@ -309,20 +309,20 @@ Complete equivalence classes Allocated zp byte:2 to zp byte:2 [ i#2 i#1 ] Allocated zp byte:3 to zp byte:3 [ $1 ] INITIAL ASM -//SEG0 @BEGIN -BBEGIN: -//SEG1 [0] phi from @BEGIN to @1 -B1_from_BBEGIN: +//SEG0 @begin +bbegin: +//SEG1 [0] phi from @begin to @1 +b1_from_bbegin: //SEG2 [0] phi (byte) i#2 = (byte) 5 -- zpby1=coby1 lda #$5 sta $2 - jmp B1 + jmp b1 //SEG3 [0] phi from @1 to @1 -B1_from_B1: +b1_from_b1: //SEG4 [0] phi (byte) i#2 = (byte) i#1 -- register_copy - jmp B1 + jmp b1 //SEG5 @1 -B1: +b1: //SEG6 [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] -- zpby1=zpby2_plus_coby1 lda $2 clc @@ -337,10 +337,10 @@ B1: //SEG9 [4] if((byte) i#1<(byte) 10) goto @1 [ i#1 ] -- zpby1_lt_coby1_then_la1 lda $2 cmp #$a - bcc B1_from_B1 - jmp BEND -//SEG10 @END -BEND: + bcc b1_from_b1 + jmp bend +//SEG10 @end +bend: Statement [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp byte:2 [ i#2 i#1 ] @@ -353,22 +353,22 @@ REGISTER UPLIFT SCOPES Uplift Scope [] 31.17: zp byte:2 [ i#2 i#1 ] 22: zp byte:3 [ $1 ] Uplifting [] best 285 combination reg byte x [ i#2 i#1 ] reg byte a [ $1 ] -Removing instruction jmp B1 -Removing instruction jmp BEND +Removing instruction jmp b1 +Removing instruction jmp bend Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: -//SEG1 [0] phi from @BEGIN to @1 -B1_from_BBEGIN: +//SEG0 @begin +bbegin: +//SEG1 [0] phi from @begin to @1 +b1_from_bbegin: //SEG2 [0] phi (byte) i#2 = (byte) 5 -- xby=coby1 ldx #$5 - jmp B1 + jmp b1 //SEG3 [0] phi from @1 to @1 -B1_from_B1: +b1_from_b1: //SEG4 [0] phi (byte) i#2 = (byte) i#1 -- register_copy //SEG5 @1 -B1: +b1: //SEG6 [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] -- aby=xby_plus_coby1 txa clc @@ -379,24 +379,24 @@ B1: inx //SEG9 [4] if((byte) i#1<(byte) 10) goto @1 [ i#1 ] -- xby_lt_coby1_then_la1 cpx #$a - bcc B1_from_B1 -//SEG10 @END -BEND: + bcc b1_from_b1 +//SEG10 @end +bend: -Removing instruction jmp B1 +Removing instruction jmp b1 Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: -//SEG1 [0] phi from @BEGIN to @1 -B1_from_BBEGIN: +//SEG0 @begin +bbegin: +//SEG1 [0] phi from @begin to @1 +b1_from_bbegin: //SEG2 [0] phi (byte) i#2 = (byte) 5 -- xby=coby1 ldx #$5 //SEG3 [0] phi from @1 to @1 -B1_from_B1: +b1_from_b1: //SEG4 [0] phi (byte) i#2 = (byte) i#1 -- register_copy //SEG5 @1 -B1: +b1: //SEG6 [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] -- aby=xby_plus_coby1 txa clc @@ -407,15 +407,15 @@ B1: inx //SEG9 [4] if((byte) i#1<(byte) 10) goto @1 [ i#1 ] -- xby_lt_coby1_then_la1 cpx #$a - bcc B1_from_B1 -//SEG10 @END -BEND: + bcc b1_from_b1 +//SEG10 @end +bend: FINAL SYMBOL TABLE (byte~) $1 reg byte a 22.0 (label) @1 -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte) i (byte) i#1 reg byte x 16.5 (byte) i#2 reg byte x 14.666666666666666 @@ -425,17 +425,17 @@ reg byte x [ i#2 i#1 ] reg byte a [ $1 ] FINAL CODE -//SEG0 @BEGIN -BBEGIN: -//SEG1 [0] phi from @BEGIN to @1 -B1_from_BBEGIN: +//SEG0 @begin +bbegin: +//SEG1 [0] phi from @begin to @1 +b1_from_bbegin: //SEG2 [0] phi (byte) i#2 = (byte) 5 -- xby=coby1 ldx #$5 //SEG3 [0] phi from @1 to @1 -B1_from_B1: +b1_from_b1: //SEG4 [0] phi (byte) i#2 = (byte) i#1 -- register_copy //SEG5 @1 -B1: +b1: //SEG6 [1] (byte~) $1 ← (byte) i#2 + (byte) 4 [ i#2 $1 ] -- aby=xby_plus_coby1 txa clc @@ -446,7 +446,7 @@ B1: inx //SEG9 [4] if((byte) i#1<(byte) 10) goto @1 [ i#1 ] -- xby_lt_coby1_then_la1 cpx #$a - bcc B1_from_B1 -//SEG10 @END -BEND: + bcc b1_from_b1 +//SEG10 @end +bend: diff --git a/src/main/java/dk/camelot64/kickc/test/ref/minus.sym b/src/main/java/dk/camelot64/kickc/test/ref/minus.sym index 8d18321a5..e14a26bf2 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/minus.sym +++ b/src/main/java/dk/camelot64/kickc/test/ref/minus.sym @@ -1,7 +1,7 @@ (byte~) $1 reg byte a 22.0 (label) @1 -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte) i (byte) i#1 reg byte x 16.5 (byte) i#2 reg byte x 14.666666666666666 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/modglobal.asm b/src/main/java/dk/camelot64/kickc/test/ref/modglobal.asm index ccfd5bf10..d12901d94 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/modglobal.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/modglobal.asm @@ -1,23 +1,25 @@ -BBEGIN: +bbegin: jsr main -BEND: -main: -inccnt_from_main: - ldy #$0 - ldx #$0 - jsr inccnt -main__B1: - sta $400 - inx -inccnt_from_B1: - jsr inccnt -main__B2: - sta $401 -main__Breturn: - rts -inccnt: - inx - iny - txa -inccnt__Breturn: - rts +bend: +main: { + inccnt_from_main: + ldy #$0 + ldx #$0 + jsr inccnt + b1: + sta $400 + inx + inccnt_from_b1: + jsr inccnt + b2: + sta $401 + breturn: + rts +} +inccnt: { + inx + iny + txa + breturn: + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/modglobal.cfg b/src/main/java/dk/camelot64/kickc/test/ref/modglobal.cfg index 284ed57c4..59544de49 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/modglobal.cfg +++ b/src/main/java/dk/camelot64/kickc/test/ref/modglobal.cfg @@ -1,8 +1,8 @@ -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] call inccnt param-assignment [ inccnt::return#0 cnt#1 cnt2#1 ] to:main::@1 main::@1: from main @@ -17,7 +17,7 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 [8] return [ ] - to:@RETURN + to:@return inccnt: from main main::@1 [9] (byte) cnt2#11 ← phi( main/(byte) 0 main::@1/(byte) cnt2#1 ) [ cnt#12 cnt2#11 ] [9] (byte) cnt#12 ← phi( main/(byte) 0 main::@1/(byte) cnt#3 ) [ cnt#12 cnt2#11 ] @@ -27,4 +27,4 @@ inccnt: from main main::@1 to:inccnt::@return inccnt::@return: from inccnt [13] return [ inccnt::return#0 cnt#1 cnt2#1 ] - to:@RETURN + to:@return diff --git a/src/main/java/dk/camelot64/kickc/test/ref/modglobal.log b/src/main/java/dk/camelot64/kickc/test/ref/modglobal.log index dfc760924..91c579cc3 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/modglobal.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/modglobal.log @@ -60,7 +60,7 @@ SYMBOLS (label) main::@return INITIAL CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) cnt ← (byte) 0 (byte) cnt2 ← (byte) 0 (byte[256]) SCREEN ← (word) 1024 @@ -75,8 +75,8 @@ main: from to:main::@return main::@return: from main return - to:@RETURN -@1: from @BEGIN + to:@return +@1: from @begin to:@2 inccnt: from (byte) cnt ← ++ (byte) cnt @@ -86,23 +86,23 @@ inccnt: from inccnt::@return: from inccnt inccnt::@1 (byte) inccnt::return ← (byte) inccnt::return return (byte) inccnt::return - to:@RETURN + to:@return inccnt::@1: from to:inccnt::@return @2: from @1 - to:@END -@END: from @2 + to:@end +@end: from @2 Removing empty block @1 Removing empty block inccnt::@1 Removing empty block @2 CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) cnt ← (byte) 0 (byte) cnt2 ← (byte) 0 (byte[256]) SCREEN ← (word) 1024 (void~) $0 ← call main - to:@END + to:@end main: from (byte~) main::$0 ← call inccnt *((byte[256]) SCREEN + (byte) 0) ← (byte~) main::$0 @@ -112,7 +112,7 @@ main: from to:main::@return main::@return: from main return - to:@RETURN + to:@return inccnt: from (byte) cnt ← ++ (byte) cnt (byte) cnt2 ← ++ (byte) cnt2 @@ -121,8 +121,8 @@ inccnt: from inccnt::@return: from inccnt (byte) inccnt::return ← (byte) inccnt::return return (byte) inccnt::return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin PROCEDURE MODIFY VARIABLE ANALYSIS main modifies cnt @@ -131,17 +131,17 @@ inccnt modifies cnt inccnt modifies cnt2 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL -@BEGIN: from +@begin: from (byte) cnt ← (byte) 0 (byte) cnt2 ← (byte) 0 (byte[256]) SCREEN ← (word) 1024 call main param-assignment to:@3 -@3: from @BEGIN +@3: from @begin (byte) cnt ← (byte) cnt (byte) cnt2 ← (byte) cnt2 - to:@END -main: from @BEGIN + to:@end +main: from @begin (byte) inccnt::return ← call inccnt param-assignment to:main::@1 main::@1: from main @@ -162,7 +162,7 @@ main::@return: from main::@2 (byte) cnt ← (byte) cnt (byte) cnt2 ← (byte) cnt2 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt ← ++ (byte) cnt (byte) cnt2 ← ++ (byte) cnt2 @@ -173,28 +173,28 @@ inccnt::@return: from inccnt (byte) cnt ← (byte) cnt (byte) cnt2 ← (byte) cnt2 return (byte) inccnt::return - to:@RETURN -@END: from @3 + to:@return +@end: from @3 Completing Phi functions... Completing Phi functions... CONTROL FLOW GRAPH SSA -@BEGIN: from +@begin: from (byte) cnt#0 ← (byte) 0 (byte) cnt2#0 ← (byte) 0 (byte[256]) SCREEN#0 ← (word) 1024 call main param-assignment to:@3 -@3: from @BEGIN - (byte) cnt2#7 ← phi( @BEGIN/(byte) cnt2#0 ) - (byte) cnt#8 ← phi( @BEGIN/(byte) cnt#0 ) +@3: from @begin + (byte) cnt2#7 ← phi( @begin/(byte) cnt2#0 ) + (byte) cnt#8 ← phi( @begin/(byte) cnt#0 ) (byte) cnt#1 ← (byte) cnt#8 (byte) cnt2#1 ← (byte) cnt2#7 - to:@END -main: from @BEGIN - (byte[256]) SCREEN#3 ← phi( @BEGIN/(byte[256]) SCREEN#0 ) - (byte) cnt2#13 ← phi( @BEGIN/(byte) cnt2#0 ) - (byte) cnt#14 ← phi( @BEGIN/(byte) cnt#0 ) + to:@end +main: from @begin + (byte[256]) SCREEN#3 ← phi( @begin/(byte[256]) SCREEN#0 ) + (byte) cnt2#13 ← phi( @begin/(byte) cnt2#0 ) + (byte) cnt#14 ← phi( @begin/(byte) cnt#0 ) (byte) inccnt::return#0 ← call inccnt param-assignment to:main::@1 main::@1: from main @@ -225,7 +225,7 @@ main::@return: from main::@2 (byte) cnt#5 ← (byte) cnt#11 (byte) cnt2#4 ← (byte) cnt2#10 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt2#11 ← phi( main/(byte) cnt2#13 main::@1/(byte) cnt2#2 ) (byte) cnt#12 ← phi( main/(byte) cnt#14 main::@1/(byte) cnt#3 ) @@ -241,26 +241,26 @@ inccnt::@return: from inccnt (byte) cnt#7 ← (byte) cnt#13 (byte) cnt2#6 ← (byte) cnt2#12 return (byte) inccnt::return#3 - to:@RETURN -@END: from @3 + to:@return +@end: from @3 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN -@BEGIN: from +@begin: from (byte) cnt#0 ← (byte) 0 (byte) cnt2#0 ← (byte) 0 (byte[256]) SCREEN#0 ← (word) 1024 call main param-assignment to:@3 -@3: from @BEGIN - (byte) cnt2#7 ← phi( @BEGIN/(byte) cnt2#4 ) - (byte) cnt#8 ← phi( @BEGIN/(byte) cnt#5 ) +@3: from @begin + (byte) cnt2#7 ← phi( @begin/(byte) cnt2#4 ) + (byte) cnt#8 ← phi( @begin/(byte) cnt#5 ) (byte) cnt#1 ← (byte) cnt#8 (byte) cnt2#1 ← (byte) cnt2#7 - to:@END -main: from @BEGIN - (byte[256]) SCREEN#3 ← phi( @BEGIN/(byte[256]) SCREEN#0 ) - (byte) cnt2#13 ← phi( @BEGIN/(byte) cnt2#0 ) - (byte) cnt#14 ← phi( @BEGIN/(byte) cnt#0 ) + to:@end +main: from @begin + (byte[256]) SCREEN#3 ← phi( @begin/(byte[256]) SCREEN#0 ) + (byte) cnt2#13 ← phi( @begin/(byte) cnt2#0 ) + (byte) cnt#14 ← phi( @begin/(byte) cnt#0 ) call inccnt param-assignment (byte) inccnt::return#0 ← (byte) inccnt::return#3 to:main::@1 @@ -293,7 +293,7 @@ main::@return: from main::@2 (byte) cnt#5 ← (byte) cnt#11 (byte) cnt2#4 ← (byte) cnt2#10 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt2#11 ← phi( main/(byte) cnt2#13 main::@1/(byte) cnt2#2 ) (byte) cnt#12 ← phi( main/(byte) cnt#14 main::@1/(byte) cnt#3 ) @@ -309,27 +309,27 @@ inccnt::@return: from inccnt (byte) cnt#7 ← (byte) cnt#13 (byte) cnt2#6 ← (byte) cnt2#12 return - to:@RETURN -@END: from @3 + to:@return +@end: from @3 Constant (byte) cnt#0 (byte) 0 Constant (byte) cnt2#0 (byte) 0 Constant (byte[256]) SCREEN#0 (word) 1024 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment to:@3 -@3: from @BEGIN - (byte) cnt2#7 ← phi( @BEGIN/(byte) cnt2#4 ) - (byte) cnt#8 ← phi( @BEGIN/(byte) cnt#5 ) +@3: from @begin + (byte) cnt2#7 ← phi( @begin/(byte) cnt2#4 ) + (byte) cnt#8 ← phi( @begin/(byte) cnt#5 ) (byte) cnt#1 ← (byte) cnt#8 (byte) cnt2#1 ← (byte) cnt2#7 - to:@END -main: from @BEGIN - (byte[256]) SCREEN#3 ← phi( @BEGIN/(word) 1024 ) - (byte) cnt2#13 ← phi( @BEGIN/(byte) 0 ) - (byte) cnt#14 ← phi( @BEGIN/(byte) 0 ) + to:@end +main: from @begin + (byte[256]) SCREEN#3 ← phi( @begin/(word) 1024 ) + (byte) cnt2#13 ← phi( @begin/(byte) 0 ) + (byte) cnt#14 ← phi( @begin/(byte) 0 ) call inccnt param-assignment (byte) inccnt::return#0 ← (byte) inccnt::return#3 to:main::@1 @@ -362,7 +362,7 @@ main::@return: from main::@2 (byte) cnt#5 ← (byte) cnt#11 (byte) cnt2#4 ← (byte) cnt2#10 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt2#11 ← phi( main/(byte) cnt2#13 main::@1/(byte) cnt2#2 ) (byte) cnt#12 ← phi( main/(byte) cnt#14 main::@1/(byte) cnt#3 ) @@ -378,8 +378,8 @@ inccnt::@return: from inccnt (byte) cnt#7 ← (byte) cnt#13 (byte) cnt2#6 ← (byte) cnt2#12 return - to:@RETURN -@END: from @3 + to:@return +@end: from @3 Not aliassing across scopes: main::$0 inccnt::return#4 Not aliassing across scopes: main::$1 inccnt::return#5 @@ -390,15 +390,15 @@ Alias (byte) inccnt::return#0 = (byte) inccnt::return#3 (byte) inccnt::return#4 Alias (byte[256]) SCREEN#1 = (byte[256]) SCREEN#3 (byte[256]) SCREEN#2 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment to:@3 -@3: from @BEGIN - to:@END -main: from @BEGIN - (byte[256]) SCREEN#1 ← phi( @BEGIN/(word) 1024 ) - (byte) cnt2#13 ← phi( @BEGIN/(byte) 0 ) - (byte) cnt#14 ← phi( @BEGIN/(byte) 0 ) +@3: from @begin + to:@end +main: from @begin + (byte[256]) SCREEN#1 ← phi( @begin/(word) 1024 ) + (byte) cnt2#13 ← phi( @begin/(byte) 0 ) + (byte) cnt#14 ← phi( @begin/(byte) 0 ) call inccnt param-assignment to:main::@1 main::@1: from main @@ -413,7 +413,7 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt2#11 ← phi( main/(byte) cnt2#13 main::@1/(byte) cnt2#1 ) (byte) cnt#12 ← phi( main/(byte) cnt#14 main::@1/(byte) cnt#3 ) @@ -423,20 +423,20 @@ inccnt: from main main::@1 to:inccnt::@return inccnt::@return: from inccnt return - to:@RETURN -@END: from @3 + to:@return +@end: from @3 Redundant Phi (byte) cnt#14 (byte) 0 Redundant Phi (byte) cnt2#13 (byte) 0 Redundant Phi (byte[256]) SCREEN#1 (word) 1024 Succesful SSA optimization Pass2RedundantPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment to:@3 -@3: from @BEGIN - to:@END -main: from @BEGIN +@3: from @begin + to:@end +main: from @begin call inccnt param-assignment to:main::@1 main::@1: from main @@ -451,7 +451,7 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt2#11 ← phi( main/(byte) 0 main::@1/(byte) cnt2#1 ) (byte) cnt#12 ← phi( main/(byte) 0 main::@1/(byte) cnt#3 ) @@ -461,16 +461,16 @@ inccnt: from main main::@1 to:inccnt::@return inccnt::@return: from inccnt return - to:@RETURN -@END: from @3 + to:@return +@end: from @3 Culled Empty Block (label) @3 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call inccnt param-assignment to:main::@1 main::@1: from main @@ -485,7 +485,7 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt2#11 ← phi( main/(byte) 0 main::@1/(byte) cnt2#1 ) (byte) cnt#12 ← phi( main/(byte) 0 main::@1/(byte) cnt#3 ) @@ -495,17 +495,17 @@ inccnt: from main main::@1 to:inccnt::@return inccnt::@return: from inccnt return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Consolidated assigned array index constant in assignment *(1024) Consolidated assigned array index constant in assignment *(1025) Succesful SSA optimization Pass2ConstantAdditionElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call inccnt param-assignment to:main::@1 main::@1: from main @@ -520,7 +520,7 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt2#11 ← phi( main/(byte) 0 main::@1/(byte) cnt2#1 ) (byte) cnt#12 ← phi( main/(byte) 0 main::@1/(byte) cnt#3 ) @@ -530,8 +530,8 @@ inccnt: from main main::@1 to:inccnt::@return inccnt::@return: from inccnt return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Not aliassing across scopes: main::$0 inccnt::return#0 Not aliassing across scopes: main::$1 inccnt::return#0 @@ -539,14 +539,14 @@ Not aliassing across scopes: inccnt::return#0 cnt#1 Not aliassing across scopes: main::$0 inccnt::return#0 Not aliassing across scopes: main::$1 inccnt::return#0 Not aliassing across scopes: inccnt::return#0 cnt#1 -Block Sequence Planned @BEGIN @END main main::@1 main::@2 main::@return inccnt inccnt::@return -Block Sequence Planned @BEGIN @END main main::@1 main::@2 main::@return inccnt inccnt::@return +Block Sequence Planned @begin @end main main::@1 main::@2 main::@return inccnt inccnt::@return +Block Sequence Planned @begin @end main main::@1 main::@2 main::@return inccnt inccnt::@return CONTROL FLOW GRAPH - PHI LIFTED -@BEGIN: from +@begin: from call main param-assignment - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin call inccnt param-assignment to:main::@1 main::@1: from main @@ -563,7 +563,7 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt2#11 ← phi( main/(byte) 0 main::@1/(byte~) cnt2#14 ) (byte) cnt#12 ← phi( main/(byte) 0 main::@1/(byte~) cnt#15 ) @@ -573,7 +573,7 @@ inccnt: from main main::@1 to:inccnt::@return inccnt::@return: from inccnt return - to:@RETURN + to:@return Propagating live ranges... Propagating live ranges... @@ -583,11 +583,11 @@ Propagating live ranges... Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] call inccnt param-assignment [ inccnt::return#0 cnt#1 cnt2#1 ] to:main::@1 main::@1: from main @@ -604,7 +604,7 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 [10] return [ ] - to:@RETURN + to:@return inccnt: from main main::@1 [11] (byte) cnt2#11 ← phi( main/(byte) 0 main::@1/(byte~) cnt2#14 ) [ cnt#12 cnt2#11 ] [11] (byte) cnt#12 ← phi( main/(byte) 0 main::@1/(byte~) cnt#15 ) [ cnt#12 cnt2#11 ] @@ -614,13 +614,13 @@ inccnt: from main main::@1 to:inccnt::@return inccnt::@return: from inccnt [15] return [ inccnt::return#0 cnt#1 cnt2#1 ] - to:@RETURN + to:@return Created 2 initial phi equivalence classes Coalesced [5] cnt#15 ← cnt#3 Coalesced [6] cnt2#14 ← cnt2#1 Coalesced down to 2 phi equivalence classes -Block Sequence Planned @BEGIN @END main main::@1 main::@2 main::@return inccnt inccnt::@return +Block Sequence Planned @begin @end main main::@1 main::@2 main::@return inccnt inccnt::@return Propagating live ranges... Propagating live ranges... Propagating live ranges... @@ -628,11 +628,11 @@ Propagating live ranges... Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] call inccnt param-assignment [ inccnt::return#0 cnt#1 cnt2#1 ] to:main::@1 main::@1: from main @@ -647,7 +647,7 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 [8] return [ ] - to:@RETURN + to:@return inccnt: from main main::@1 [9] (byte) cnt2#11 ← phi( main/(byte) 0 main::@1/(byte) cnt2#1 ) [ cnt#12 cnt2#11 ] [9] (byte) cnt#12 ← phi( main/(byte) 0 main::@1/(byte) cnt#3 ) [ cnt#12 cnt2#11 ] @@ -657,21 +657,21 @@ inccnt: from main main::@1 to:inccnt::@return inccnt::@return: from inccnt [13] return [ inccnt::return#0 cnt#1 cnt2#1 ] - to:@RETURN + to:@return CALL GRAPH Calls in [] to 0:main Calls in [main] to 1:inccnt 5:inccnt DOMINATORS -@BEGIN dominated by @BEGIN -@END dominated by @BEGIN @END -main dominated by @BEGIN main -main::@1 dominated by @BEGIN main::@1 main -main::@2 dominated by @BEGIN main::@2 main::@1 main -main::@return dominated by @BEGIN main::@return main::@2 main::@1 main -inccnt dominated by @BEGIN inccnt main -inccnt::@return dominated by inccnt::@return @BEGIN inccnt main +@begin dominated by @begin +@end dominated by @end @begin +main dominated by @begin main +main::@1 dominated by @begin main::@1 main +main::@2 dominated by @begin main::@2 main::@1 main +main::@return dominated by main::@return @begin main::@2 main::@1 main +inccnt dominated by inccnt @begin main +inccnt::@return dominated by inccnt::@return inccnt @begin main NATURAL LOOPS @@ -718,74 +718,76 @@ Allocated zp byte:5 to zp byte:5 [ main::$1 ] Allocated zp byte:6 to zp byte:6 [ cnt#1 ] Allocated zp byte:7 to zp byte:7 [ inccnt::return#0 ] INITIAL ASM -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main - jmp BEND -//SEG2 @END -BEND: + jmp bend +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call inccnt param-assignment [ inccnt::return#0 cnt#1 cnt2#1 ] -//SEG5 [9] phi from main to inccnt -inccnt_from_main: -//SEG6 [9] phi (byte) cnt2#11 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $3 -//SEG7 [9] phi (byte) cnt#12 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $2 - jsr inccnt - jmp main__B1 -//SEG8 main::@1 -main__B1: -//SEG9 [2] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#1 cnt2#1 ] -- zpby1=zpby2 - lda $7 - sta $4 -//SEG10 [3] *((word) 1024) ← (byte~) main::$0 [ cnt#1 cnt2#1 ] -- _star_cowo1=zpby1 - lda $4 - sta $400 -//SEG11 [4] (byte) cnt#3 ← ++ (byte) cnt#1 [ cnt#3 cnt2#1 ] -- zpby1=_inc_zpby2 - lda $6 - sta $2 - inc $2 -//SEG12 [5] call inccnt param-assignment [ inccnt::return#0 ] -//SEG13 [9] phi from main::@1 to inccnt -inccnt_from_B1: -//SEG14 [9] phi (byte) cnt2#11 = (byte) cnt2#1 -- register_copy -//SEG15 [9] phi (byte) cnt#12 = (byte) cnt#3 -- register_copy - jsr inccnt - jmp main__B2 -//SEG16 main::@2 -main__B2: -//SEG17 [6] (byte~) main::$1 ← (byte) inccnt::return#0 [ main::$1 ] -- zpby1=zpby2 - lda $7 - sta $5 -//SEG18 [7] *((word) 1025) ← (byte~) main::$1 [ ] -- _star_cowo1=zpby1 - lda $5 - sta $401 - jmp main__Breturn -//SEG19 main::@return -main__Breturn: -//SEG20 [8] return [ ] - rts +main: { + //SEG4 [1] call inccnt param-assignment [ inccnt::return#0 cnt#1 cnt2#1 ] + //SEG5 [9] phi from main to inccnt + inccnt_from_main: + //SEG6 [9] phi (byte) cnt2#11 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $3 + //SEG7 [9] phi (byte) cnt#12 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $2 + jsr inccnt + jmp b1 + //SEG8 main::@1 + b1: + //SEG9 [2] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#1 cnt2#1 ] -- zpby1=zpby2 + lda $7 + sta $4 + //SEG10 [3] *((word) 1024) ← (byte~) main::$0 [ cnt#1 cnt2#1 ] -- _star_cowo1=zpby1 + lda $4 + sta $400 + //SEG11 [4] (byte) cnt#3 ← ++ (byte) cnt#1 [ cnt#3 cnt2#1 ] -- zpby1=_inc_zpby2 + lda $6 + sta $2 + inc $2 + //SEG12 [5] call inccnt param-assignment [ inccnt::return#0 ] + //SEG13 [9] phi from main::@1 to inccnt + inccnt_from_b1: + //SEG14 [9] phi (byte) cnt2#11 = (byte) cnt2#1 -- register_copy + //SEG15 [9] phi (byte) cnt#12 = (byte) cnt#3 -- register_copy + jsr inccnt + jmp b2 + //SEG16 main::@2 + b2: + //SEG17 [6] (byte~) main::$1 ← (byte) inccnt::return#0 [ main::$1 ] -- zpby1=zpby2 + lda $7 + sta $5 + //SEG18 [7] *((word) 1025) ← (byte~) main::$1 [ ] -- _star_cowo1=zpby1 + lda $5 + sta $401 + jmp breturn + //SEG19 main::@return + breturn: + //SEG20 [8] return [ ] + rts +} //SEG21 inccnt -inccnt: -//SEG22 [10] (byte) cnt#1 ← ++ (byte) cnt#12 [ cnt#1 cnt2#11 ] -- zpby1=_inc_zpby2 - lda $2 - sta $6 - inc $6 -//SEG23 [11] (byte) cnt2#1 ← ++ (byte) cnt2#11 [ cnt#1 cnt2#1 ] -- zpby1=_inc_zpby1 - inc $3 -//SEG24 [12] (byte) inccnt::return#0 ← (byte) cnt#1 [ inccnt::return#0 cnt#1 cnt2#1 ] -- zpby1=zpby2 - lda $6 - sta $7 - jmp inccnt__Breturn -//SEG25 inccnt::@return -inccnt__Breturn: -//SEG26 [13] return [ inccnt::return#0 cnt#1 cnt2#1 ] - rts +inccnt: { + //SEG22 [10] (byte) cnt#1 ← ++ (byte) cnt#12 [ cnt#1 cnt2#11 ] -- zpby1=_inc_zpby2 + lda $2 + sta $6 + inc $6 + //SEG23 [11] (byte) cnt2#1 ← ++ (byte) cnt2#11 [ cnt#1 cnt2#1 ] -- zpby1=_inc_zpby1 + inc $3 + //SEG24 [12] (byte) inccnt::return#0 ← (byte) cnt#1 [ inccnt::return#0 cnt#1 cnt2#1 ] -- zpby1=zpby2 + lda $6 + sta $7 + jmp breturn + //SEG25 inccnt::@return + breturn: + //SEG26 [13] return [ inccnt::return#0 cnt#1 cnt2#1 ] + rts +} REGISTER UPLIFT POTENTIAL REGISTERS Potential registers zp byte:2 [ cnt#12 cnt#3 ] : zp byte:2 , reg byte a , reg byte x , reg byte y , @@ -803,69 +805,71 @@ Uplift Scope [inccnt] 1.5: zp byte:7 [ inccnt::return#0 ] Uplifting [] best 84 combination reg byte x [ cnt#12 cnt#3 ] reg byte y [ cnt2#11 cnt2#1 ] reg byte x [ cnt#1 ] Uplifting [main] best 72 combination reg byte a [ main::$0 ] reg byte a [ main::$1 ] Uplifting [inccnt] best 65 combination reg byte a [ inccnt::return#0 ] -Removing instruction jmp BEND -Removing instruction jmp main__B1 -Removing instruction jmp main__B2 -Removing instruction jmp main__Breturn -Removing instruction jmp inccnt__Breturn +Removing instruction jmp bend +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp breturn +Removing instruction jmp breturn Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call inccnt param-assignment [ inccnt::return#0 cnt#1 cnt2#1 ] -//SEG5 [9] phi from main to inccnt -inccnt_from_main: -//SEG6 [9] phi (byte) cnt2#11 = (byte) 0 -- yby=coby1 - ldy #$0 -//SEG7 [9] phi (byte) cnt#12 = (byte) 0 -- xby=coby1 - ldx #$0 - jsr inccnt -//SEG8 main::@1 -main__B1: -//SEG9 [2] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#1 cnt2#1 ] - // (byte~) main::$0 = (byte) inccnt::return#0 // register copy reg byte a -//SEG10 [3] *((word) 1024) ← (byte~) main::$0 [ cnt#1 cnt2#1 ] -- _star_cowo1=aby - sta $400 -//SEG11 [4] (byte) cnt#3 ← ++ (byte) cnt#1 [ cnt#3 cnt2#1 ] -- xby=_inc_xby - inx -//SEG12 [5] call inccnt param-assignment [ inccnt::return#0 ] -//SEG13 [9] phi from main::@1 to inccnt -inccnt_from_B1: -//SEG14 [9] phi (byte) cnt2#11 = (byte) cnt2#1 -- register_copy -//SEG15 [9] phi (byte) cnt#12 = (byte) cnt#3 -- register_copy - jsr inccnt -//SEG16 main::@2 -main__B2: -//SEG17 [6] (byte~) main::$1 ← (byte) inccnt::return#0 [ main::$1 ] - // (byte~) main::$1 = (byte) inccnt::return#0 // register copy reg byte a -//SEG18 [7] *((word) 1025) ← (byte~) main::$1 [ ] -- _star_cowo1=aby - sta $401 -//SEG19 main::@return -main__Breturn: -//SEG20 [8] return [ ] - rts +main: { + //SEG4 [1] call inccnt param-assignment [ inccnt::return#0 cnt#1 cnt2#1 ] + //SEG5 [9] phi from main to inccnt + inccnt_from_main: + //SEG6 [9] phi (byte) cnt2#11 = (byte) 0 -- yby=coby1 + ldy #$0 + //SEG7 [9] phi (byte) cnt#12 = (byte) 0 -- xby=coby1 + ldx #$0 + jsr inccnt + //SEG8 main::@1 + b1: + //SEG9 [2] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#1 cnt2#1 ] + // (byte~) main::$0 = (byte) inccnt::return#0 // register copy reg byte a + //SEG10 [3] *((word) 1024) ← (byte~) main::$0 [ cnt#1 cnt2#1 ] -- _star_cowo1=aby + sta $400 + //SEG11 [4] (byte) cnt#3 ← ++ (byte) cnt#1 [ cnt#3 cnt2#1 ] -- xby=_inc_xby + inx + //SEG12 [5] call inccnt param-assignment [ inccnt::return#0 ] + //SEG13 [9] phi from main::@1 to inccnt + inccnt_from_b1: + //SEG14 [9] phi (byte) cnt2#11 = (byte) cnt2#1 -- register_copy + //SEG15 [9] phi (byte) cnt#12 = (byte) cnt#3 -- register_copy + jsr inccnt + //SEG16 main::@2 + b2: + //SEG17 [6] (byte~) main::$1 ← (byte) inccnt::return#0 [ main::$1 ] + // (byte~) main::$1 = (byte) inccnt::return#0 // register copy reg byte a + //SEG18 [7] *((word) 1025) ← (byte~) main::$1 [ ] -- _star_cowo1=aby + sta $401 + //SEG19 main::@return + breturn: + //SEG20 [8] return [ ] + rts +} //SEG21 inccnt -inccnt: -//SEG22 [10] (byte) cnt#1 ← ++ (byte) cnt#12 [ cnt#1 cnt2#11 ] -- xby=_inc_xby - inx -//SEG23 [11] (byte) cnt2#1 ← ++ (byte) cnt2#11 [ cnt#1 cnt2#1 ] -- yby=_inc_yby - iny -//SEG24 [12] (byte) inccnt::return#0 ← (byte) cnt#1 [ inccnt::return#0 cnt#1 cnt2#1 ] -- aby=xby - txa -//SEG25 inccnt::@return -inccnt__Breturn: -//SEG26 [13] return [ inccnt::return#0 cnt#1 cnt2#1 ] - rts +inccnt: { + //SEG22 [10] (byte) cnt#1 ← ++ (byte) cnt#12 [ cnt#1 cnt2#11 ] -- xby=_inc_xby + inx + //SEG23 [11] (byte) cnt2#1 ← ++ (byte) cnt2#11 [ cnt#1 cnt2#1 ] -- yby=_inc_yby + iny + //SEG24 [12] (byte) inccnt::return#0 ← (byte) cnt#1 [ inccnt::return#0 cnt#1 cnt2#1 ] -- aby=xby + txa + //SEG25 inccnt::@return + breturn: + //SEG26 [13] return [ inccnt::return#0 cnt#1 cnt2#1 ] + rts +} FINAL SYMBOL TABLE -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte[256]) SCREEN (byte) cnt (byte) cnt#1 reg byte x 0.8571428571428571 @@ -893,56 +897,58 @@ reg byte x [ cnt#1 ] reg byte a [ inccnt::return#0 ] FINAL CODE -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call inccnt param-assignment [ inccnt::return#0 cnt#1 cnt2#1 ] -//SEG5 [9] phi from main to inccnt -inccnt_from_main: -//SEG6 [9] phi (byte) cnt2#11 = (byte) 0 -- yby=coby1 - ldy #$0 -//SEG7 [9] phi (byte) cnt#12 = (byte) 0 -- xby=coby1 - ldx #$0 - jsr inccnt -//SEG8 main::@1 -main__B1: -//SEG9 [2] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#1 cnt2#1 ] - // (byte~) main::$0 = (byte) inccnt::return#0 // register copy reg byte a -//SEG10 [3] *((word) 1024) ← (byte~) main::$0 [ cnt#1 cnt2#1 ] -- _star_cowo1=aby - sta $400 -//SEG11 [4] (byte) cnt#3 ← ++ (byte) cnt#1 [ cnt#3 cnt2#1 ] -- xby=_inc_xby - inx -//SEG12 [5] call inccnt param-assignment [ inccnt::return#0 ] -//SEG13 [9] phi from main::@1 to inccnt -inccnt_from_B1: -//SEG14 [9] phi (byte) cnt2#11 = (byte) cnt2#1 -- register_copy -//SEG15 [9] phi (byte) cnt#12 = (byte) cnt#3 -- register_copy - jsr inccnt -//SEG16 main::@2 -main__B2: -//SEG17 [6] (byte~) main::$1 ← (byte) inccnt::return#0 [ main::$1 ] - // (byte~) main::$1 = (byte) inccnt::return#0 // register copy reg byte a -//SEG18 [7] *((word) 1025) ← (byte~) main::$1 [ ] -- _star_cowo1=aby - sta $401 -//SEG19 main::@return -main__Breturn: -//SEG20 [8] return [ ] - rts +main: { + //SEG4 [1] call inccnt param-assignment [ inccnt::return#0 cnt#1 cnt2#1 ] + //SEG5 [9] phi from main to inccnt + inccnt_from_main: + //SEG6 [9] phi (byte) cnt2#11 = (byte) 0 -- yby=coby1 + ldy #$0 + //SEG7 [9] phi (byte) cnt#12 = (byte) 0 -- xby=coby1 + ldx #$0 + jsr inccnt + //SEG8 main::@1 + b1: + //SEG9 [2] (byte~) main::$0 ← (byte) inccnt::return#0 [ main::$0 cnt#1 cnt2#1 ] + // (byte~) main::$0 = (byte) inccnt::return#0 // register copy reg byte a + //SEG10 [3] *((word) 1024) ← (byte~) main::$0 [ cnt#1 cnt2#1 ] -- _star_cowo1=aby + sta $400 + //SEG11 [4] (byte) cnt#3 ← ++ (byte) cnt#1 [ cnt#3 cnt2#1 ] -- xby=_inc_xby + inx + //SEG12 [5] call inccnt param-assignment [ inccnt::return#0 ] + //SEG13 [9] phi from main::@1 to inccnt + inccnt_from_b1: + //SEG14 [9] phi (byte) cnt2#11 = (byte) cnt2#1 -- register_copy + //SEG15 [9] phi (byte) cnt#12 = (byte) cnt#3 -- register_copy + jsr inccnt + //SEG16 main::@2 + b2: + //SEG17 [6] (byte~) main::$1 ← (byte) inccnt::return#0 [ main::$1 ] + // (byte~) main::$1 = (byte) inccnt::return#0 // register copy reg byte a + //SEG18 [7] *((word) 1025) ← (byte~) main::$1 [ ] -- _star_cowo1=aby + sta $401 + //SEG19 main::@return + breturn: + //SEG20 [8] return [ ] + rts +} //SEG21 inccnt -inccnt: -//SEG22 [10] (byte) cnt#1 ← ++ (byte) cnt#12 [ cnt#1 cnt2#11 ] -- xby=_inc_xby - inx -//SEG23 [11] (byte) cnt2#1 ← ++ (byte) cnt2#11 [ cnt#1 cnt2#1 ] -- yby=_inc_yby - iny -//SEG24 [12] (byte) inccnt::return#0 ← (byte) cnt#1 [ inccnt::return#0 cnt#1 cnt2#1 ] -- aby=xby - txa -//SEG25 inccnt::@return -inccnt__Breturn: -//SEG26 [13] return [ inccnt::return#0 cnt#1 cnt2#1 ] - rts +inccnt: { + //SEG22 [10] (byte) cnt#1 ← ++ (byte) cnt#12 [ cnt#1 cnt2#11 ] -- xby=_inc_xby + inx + //SEG23 [11] (byte) cnt2#1 ← ++ (byte) cnt2#11 [ cnt#1 cnt2#1 ] -- yby=_inc_yby + iny + //SEG24 [12] (byte) inccnt::return#0 ← (byte) cnt#1 [ inccnt::return#0 cnt#1 cnt2#1 ] -- aby=xby + txa + //SEG25 inccnt::@return + breturn: + //SEG26 [13] return [ inccnt::return#0 cnt#1 cnt2#1 ] + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/modglobal.sym b/src/main/java/dk/camelot64/kickc/test/ref/modglobal.sym index 05188cb40..e3eaf08cc 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/modglobal.sym +++ b/src/main/java/dk/camelot64/kickc/test/ref/modglobal.sym @@ -1,5 +1,5 @@ -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte[256]) SCREEN (byte) cnt (byte) cnt#1 reg byte x 0.8571428571428571 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.asm b/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.asm index cf4500246..91311dae2 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.asm @@ -1,21 +1,23 @@ -BBEGIN: +bbegin: jsr main -BEND: -main: -inccnt_from_main: - ldx #$0 - jsr inccnt -main__B1: - stx $400 - inx -inccnt_from_B1: - jsr inccnt -main__B2: - inx - stx $401 -main__Breturn: - rts -inccnt: - inx -inccnt__Breturn: - rts +bend: +main: { + inccnt_from_main: + ldx #$0 + jsr inccnt + b1: + stx $400 + inx + inccnt_from_b1: + jsr inccnt + b2: + inx + stx $401 + breturn: + rts +} +inccnt: { + inx + breturn: + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.cfg b/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.cfg index 3d2e13159..2b64a99f3 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.cfg +++ b/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.cfg @@ -1,8 +1,8 @@ -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] call inccnt param-assignment [ cnt#10 ] to:main::@1 main::@1: from main @@ -16,11 +16,11 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 [7] return [ ] - to:@RETURN + to:@return inccnt: from main main::@1 [8] (byte) cnt#13 ← phi( main/(byte) 0 main::@1/(byte) cnt#3 ) [ cnt#13 ] [9] (byte) cnt#10 ← ++ (byte) cnt#13 [ cnt#10 ] to:inccnt::@return inccnt::@return: from inccnt [10] return [ cnt#10 ] - to:@RETURN + to:@return diff --git a/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.log b/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.log index b2f52b0fd..943b5e418 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.log @@ -52,7 +52,7 @@ SYMBOLS (label) main::@return INITIAL CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) cnt ← (byte) 0 (byte[256]) SCREEN ← (word) 1024 (void~) $0 ← call main @@ -67,27 +67,27 @@ main: from to:main::@return main::@return: from main return - to:@RETURN -@1: from @BEGIN + to:@return +@1: from @begin to:@2 inccnt: from (byte) cnt ← ++ (byte) cnt to:inccnt::@return inccnt::@return: from inccnt return - to:@RETURN + to:@return @2: from @1 - to:@END -@END: from @2 + to:@end +@end: from @2 Removing empty block @1 Removing empty block @2 CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte) cnt ← (byte) 0 (byte[256]) SCREEN ← (word) 1024 (void~) $0 ← call main - to:@END + to:@end main: from (void~) main::$0 ← call inccnt *((byte[256]) SCREEN + (byte) 0) ← (byte) cnt @@ -98,29 +98,29 @@ main: from to:main::@return main::@return: from main return - to:@RETURN + to:@return inccnt: from (byte) cnt ← ++ (byte) cnt to:inccnt::@return inccnt::@return: from inccnt return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin PROCEDURE MODIFY VARIABLE ANALYSIS main modifies cnt inccnt modifies cnt CONTROL FLOW GRAPH WITH ASSIGNMENT CALL -@BEGIN: from +@begin: from (byte) cnt ← (byte) 0 (byte[256]) SCREEN ← (word) 1024 call main param-assignment to:@3 -@3: from @BEGIN +@3: from @begin (byte) cnt ← (byte) cnt - to:@END -main: from @BEGIN + to:@end +main: from @begin call inccnt param-assignment to:main::@1 main::@1: from main @@ -137,31 +137,31 @@ main::@2: from main::@1 main::@return: from main::@2 (byte) cnt ← (byte) cnt return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt ← ++ (byte) cnt to:inccnt::@return inccnt::@return: from inccnt (byte) cnt ← (byte) cnt return - to:@RETURN -@END: from @3 + to:@return +@end: from @3 Completing Phi functions... Completing Phi functions... CONTROL FLOW GRAPH SSA -@BEGIN: from +@begin: from (byte) cnt#0 ← (byte) 0 (byte[256]) SCREEN#0 ← (word) 1024 call main param-assignment to:@3 -@3: from @BEGIN - (byte) cnt#9 ← phi( @BEGIN/(byte) cnt#0 ) +@3: from @begin + (byte) cnt#9 ← phi( @begin/(byte) cnt#0 ) (byte) cnt#1 ← (byte) cnt#9 - to:@END -main: from @BEGIN - (byte[256]) SCREEN#3 ← phi( @BEGIN/(byte[256]) SCREEN#0 ) - (byte) cnt#15 ← phi( @BEGIN/(byte) cnt#0 ) + to:@end +main: from @begin + (byte[256]) SCREEN#3 ← phi( @begin/(byte[256]) SCREEN#0 ) + (byte) cnt#15 ← phi( @begin/(byte) cnt#0 ) call inccnt param-assignment to:main::@1 main::@1: from main @@ -183,7 +183,7 @@ main::@return: from main::@2 (byte) cnt#12 ← phi( main::@2/(byte) cnt#5 ) (byte) cnt#6 ← (byte) cnt#12 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt#13 ← phi( main/(byte) cnt#15 main::@1/(byte) cnt#3 ) (byte) cnt#7 ← ++ (byte) cnt#13 @@ -192,22 +192,22 @@ inccnt::@return: from inccnt (byte) cnt#14 ← phi( inccnt/(byte) cnt#7 ) (byte) cnt#8 ← (byte) cnt#14 return - to:@RETURN -@END: from @3 + to:@return +@end: from @3 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN -@BEGIN: from +@begin: from (byte) cnt#0 ← (byte) 0 (byte[256]) SCREEN#0 ← (word) 1024 call main param-assignment to:@3 -@3: from @BEGIN - (byte) cnt#9 ← phi( @BEGIN/(byte) cnt#6 ) +@3: from @begin + (byte) cnt#9 ← phi( @begin/(byte) cnt#6 ) (byte) cnt#1 ← (byte) cnt#9 - to:@END -main: from @BEGIN - (byte[256]) SCREEN#3 ← phi( @BEGIN/(byte[256]) SCREEN#0 ) - (byte) cnt#15 ← phi( @BEGIN/(byte) cnt#0 ) + to:@end +main: from @begin + (byte[256]) SCREEN#3 ← phi( @begin/(byte[256]) SCREEN#0 ) + (byte) cnt#15 ← phi( @begin/(byte) cnt#0 ) call inccnt param-assignment to:main::@1 main::@1: from main @@ -229,7 +229,7 @@ main::@return: from main::@2 (byte) cnt#12 ← phi( main::@2/(byte) cnt#5 ) (byte) cnt#6 ← (byte) cnt#12 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt#13 ← phi( main/(byte) cnt#15 main::@1/(byte) cnt#3 ) (byte) cnt#7 ← ++ (byte) cnt#13 @@ -238,23 +238,23 @@ inccnt::@return: from inccnt (byte) cnt#14 ← phi( inccnt/(byte) cnt#7 ) (byte) cnt#8 ← (byte) cnt#14 return - to:@RETURN -@END: from @3 + to:@return +@end: from @3 Constant (byte) cnt#0 (byte) 0 Constant (byte[256]) SCREEN#0 (word) 1024 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment to:@3 -@3: from @BEGIN - (byte) cnt#9 ← phi( @BEGIN/(byte) cnt#6 ) +@3: from @begin + (byte) cnt#9 ← phi( @begin/(byte) cnt#6 ) (byte) cnt#1 ← (byte) cnt#9 - to:@END -main: from @BEGIN - (byte[256]) SCREEN#3 ← phi( @BEGIN/(word) 1024 ) - (byte) cnt#15 ← phi( @BEGIN/(byte) 0 ) + to:@end +main: from @begin + (byte[256]) SCREEN#3 ← phi( @begin/(word) 1024 ) + (byte) cnt#15 ← phi( @begin/(byte) 0 ) call inccnt param-assignment to:main::@1 main::@1: from main @@ -276,7 +276,7 @@ main::@return: from main::@2 (byte) cnt#12 ← phi( main::@2/(byte) cnt#5 ) (byte) cnt#6 ← (byte) cnt#12 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt#13 ← phi( main/(byte) cnt#15 main::@1/(byte) cnt#3 ) (byte) cnt#7 ← ++ (byte) cnt#13 @@ -285,22 +285,22 @@ inccnt::@return: from inccnt (byte) cnt#14 ← phi( inccnt/(byte) cnt#7 ) (byte) cnt#8 ← (byte) cnt#14 return - to:@RETURN -@END: from @3 + to:@return +@end: from @3 Alias (byte) cnt#1 = (byte) cnt#9 (byte) cnt#6 (byte) cnt#12 (byte) cnt#5 Alias (byte) cnt#10 = (byte) cnt#8 (byte) cnt#2 (byte) cnt#11 (byte) cnt#4 (byte) cnt#14 (byte) cnt#7 Alias (byte[256]) SCREEN#1 = (byte[256]) SCREEN#3 (byte[256]) SCREEN#2 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment to:@3 -@3: from @BEGIN - to:@END -main: from @BEGIN - (byte[256]) SCREEN#1 ← phi( @BEGIN/(word) 1024 ) - (byte) cnt#15 ← phi( @BEGIN/(byte) 0 ) +@3: from @begin + to:@end +main: from @begin + (byte[256]) SCREEN#1 ← phi( @begin/(word) 1024 ) + (byte) cnt#15 ← phi( @begin/(byte) 0 ) call inccnt param-assignment to:main::@1 main::@1: from main @@ -314,26 +314,26 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt#13 ← phi( main/(byte) cnt#15 main::@1/(byte) cnt#3 ) (byte) cnt#10 ← ++ (byte) cnt#13 to:inccnt::@return inccnt::@return: from inccnt return - to:@RETURN -@END: from @3 + to:@return +@end: from @3 Redundant Phi (byte) cnt#15 (byte) 0 Redundant Phi (byte[256]) SCREEN#1 (word) 1024 Succesful SSA optimization Pass2RedundantPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment to:@3 -@3: from @BEGIN - to:@END -main: from @BEGIN +@3: from @begin + to:@end +main: from @begin call inccnt param-assignment to:main::@1 main::@1: from main @@ -347,23 +347,23 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt#13 ← phi( main/(byte) 0 main::@1/(byte) cnt#3 ) (byte) cnt#10 ← ++ (byte) cnt#13 to:inccnt::@return inccnt::@return: from inccnt return - to:@RETURN -@END: from @3 + to:@return +@end: from @3 Culled Empty Block (label) @3 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call inccnt param-assignment to:main::@1 main::@1: from main @@ -377,24 +377,24 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt#13 ← phi( main/(byte) 0 main::@1/(byte) cnt#3 ) (byte) cnt#10 ← ++ (byte) cnt#13 to:inccnt::@return inccnt::@return: from inccnt return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Consolidated assigned array index constant in assignment *(1024) Consolidated assigned array index constant in assignment *(1025) Succesful SSA optimization Pass2ConstantAdditionElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call inccnt param-assignment to:main::@1 main::@1: from main @@ -408,24 +408,24 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt#13 ← phi( main/(byte) 0 main::@1/(byte) cnt#3 ) (byte) cnt#10 ← ++ (byte) cnt#13 to:inccnt::@return inccnt::@return: from inccnt return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin -Block Sequence Planned @BEGIN @END main main::@1 main::@2 main::@return inccnt inccnt::@return -Block Sequence Planned @BEGIN @END main main::@1 main::@2 main::@return inccnt inccnt::@return +Block Sequence Planned @begin @end main main::@1 main::@2 main::@return inccnt inccnt::@return +Block Sequence Planned @begin @end main main::@1 main::@2 main::@return inccnt inccnt::@return CONTROL FLOW GRAPH - PHI LIFTED -@BEGIN: from +@begin: from call main param-assignment - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin call inccnt param-assignment to:main::@1 main::@1: from main @@ -440,23 +440,23 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 return - to:@RETURN + to:@return inccnt: from main main::@1 (byte) cnt#13 ← phi( main/(byte) 0 main::@1/(byte~) cnt#16 ) (byte) cnt#10 ← ++ (byte) cnt#13 to:inccnt::@return inccnt::@return: from inccnt return - to:@RETURN + to:@return Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] call inccnt param-assignment [ cnt#10 ] to:main::@1 main::@1: from main @@ -471,27 +471,27 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 [8] return [ ] - to:@RETURN + to:@return inccnt: from main main::@1 [9] (byte) cnt#13 ← phi( main/(byte) 0 main::@1/(byte~) cnt#16 ) [ cnt#13 ] [10] (byte) cnt#10 ← ++ (byte) cnt#13 [ cnt#10 ] to:inccnt::@return inccnt::@return: from inccnt [11] return [ cnt#10 ] - to:@RETURN + to:@return Created 1 initial phi equivalence classes Coalesced [4] cnt#16 ← cnt#3 Coalesced down to 1 phi equivalence classes -Block Sequence Planned @BEGIN @END main main::@1 main::@2 main::@return inccnt inccnt::@return +Block Sequence Planned @begin @end main main::@1 main::@2 main::@return inccnt inccnt::@return Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] call inccnt param-assignment [ cnt#10 ] to:main::@1 main::@1: from main @@ -505,28 +505,28 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 [7] return [ ] - to:@RETURN + to:@return inccnt: from main main::@1 [8] (byte) cnt#13 ← phi( main/(byte) 0 main::@1/(byte) cnt#3 ) [ cnt#13 ] [9] (byte) cnt#10 ← ++ (byte) cnt#13 [ cnt#10 ] to:inccnt::@return inccnt::@return: from inccnt [10] return [ cnt#10 ] - to:@RETURN + to:@return CALL GRAPH Calls in [] to 0:main Calls in [main] to 1:inccnt 4:inccnt DOMINATORS -@BEGIN dominated by @BEGIN -@END dominated by @BEGIN @END -main dominated by @BEGIN main -main::@1 dominated by @BEGIN main::@1 main -main::@2 dominated by @BEGIN main::@2 main::@1 main -main::@return dominated by @BEGIN main::@return main::@2 main::@1 main -inccnt dominated by @BEGIN inccnt main -inccnt::@return dominated by inccnt::@return @BEGIN inccnt main +@begin dominated by @begin +@end dominated by @end @begin +main dominated by @begin main +main::@1 dominated by @begin main::@1 main +main::@2 dominated by @begin main::@2 main::@1 main +main::@return dominated by main::@return @begin main::@2 main::@1 main +inccnt dominated by inccnt @begin main +inccnt::@return dominated by inccnt::@return inccnt @begin main NATURAL LOOPS @@ -558,63 +558,65 @@ Allocated zp byte:2 to zp byte:2 [ cnt#13 cnt#3 ] Allocated zp byte:3 to zp byte:3 [ cnt#1 ] Allocated zp byte:4 to zp byte:4 [ cnt#10 ] INITIAL ASM -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main - jmp BEND -//SEG2 @END -BEND: + jmp bend +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call inccnt param-assignment [ cnt#10 ] -//SEG5 [8] phi from main to inccnt -inccnt_from_main: -//SEG6 [8] phi (byte) cnt#13 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $2 - jsr inccnt - jmp main__B1 -//SEG7 main::@1 -main__B1: -//SEG8 [2] *((word) 1024) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=zpby1 - lda $4 - sta $400 -//SEG9 [3] (byte) cnt#3 ← ++ (byte) cnt#10 [ cnt#3 ] -- zpby1=_inc_zpby2 - lda $4 - sta $2 - inc $2 -//SEG10 [4] call inccnt param-assignment [ cnt#10 ] -//SEG11 [8] phi from main::@1 to inccnt -inccnt_from_B1: -//SEG12 [8] phi (byte) cnt#13 = (byte) cnt#3 -- register_copy - jsr inccnt - jmp main__B2 -//SEG13 main::@2 -main__B2: -//SEG14 [5] (byte) cnt#1 ← ++ (byte) cnt#10 [ cnt#1 ] -- zpby1=_inc_zpby2 - lda $4 - sta $3 - inc $3 -//SEG15 [6] *((word) 1025) ← (byte) cnt#1 [ ] -- _star_cowo1=zpby1 - lda $3 - sta $401 - jmp main__Breturn -//SEG16 main::@return -main__Breturn: -//SEG17 [7] return [ ] - rts +main: { + //SEG4 [1] call inccnt param-assignment [ cnt#10 ] + //SEG5 [8] phi from main to inccnt + inccnt_from_main: + //SEG6 [8] phi (byte) cnt#13 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $2 + jsr inccnt + jmp b1 + //SEG7 main::@1 + b1: + //SEG8 [2] *((word) 1024) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=zpby1 + lda $4 + sta $400 + //SEG9 [3] (byte) cnt#3 ← ++ (byte) cnt#10 [ cnt#3 ] -- zpby1=_inc_zpby2 + lda $4 + sta $2 + inc $2 + //SEG10 [4] call inccnt param-assignment [ cnt#10 ] + //SEG11 [8] phi from main::@1 to inccnt + inccnt_from_b1: + //SEG12 [8] phi (byte) cnt#13 = (byte) cnt#3 -- register_copy + jsr inccnt + jmp b2 + //SEG13 main::@2 + b2: + //SEG14 [5] (byte) cnt#1 ← ++ (byte) cnt#10 [ cnt#1 ] -- zpby1=_inc_zpby2 + lda $4 + sta $3 + inc $3 + //SEG15 [6] *((word) 1025) ← (byte) cnt#1 [ ] -- _star_cowo1=zpby1 + lda $3 + sta $401 + jmp breturn + //SEG16 main::@return + breturn: + //SEG17 [7] return [ ] + rts +} //SEG18 inccnt -inccnt: -//SEG19 [9] (byte) cnt#10 ← ++ (byte) cnt#13 [ cnt#10 ] -- zpby1=_inc_zpby2 - lda $2 - sta $4 - inc $4 - jmp inccnt__Breturn -//SEG20 inccnt::@return -inccnt__Breturn: -//SEG21 [10] return [ cnt#10 ] - rts +inccnt: { + //SEG19 [9] (byte) cnt#10 ← ++ (byte) cnt#13 [ cnt#10 ] -- zpby1=_inc_zpby2 + lda $2 + sta $4 + inc $4 + jmp breturn + //SEG20 inccnt::@return + breturn: + //SEG21 [10] return [ cnt#10 ] + rts +} REGISTER UPLIFT POTENTIAL REGISTERS Potential registers zp byte:2 [ cnt#13 cnt#3 ] : zp byte:2 , reg byte a , reg byte x , reg byte y , @@ -629,60 +631,62 @@ Uplift Scope [inccnt] Uplifting [] best 61 combination reg byte x [ cnt#13 cnt#3 ] reg byte x [ cnt#1 ] reg byte x [ cnt#10 ] Uplifting [main] best 61 combination Uplifting [inccnt] best 61 combination -Removing instruction jmp BEND -Removing instruction jmp main__B1 -Removing instruction jmp main__B2 -Removing instruction jmp main__Breturn -Removing instruction jmp inccnt__Breturn +Removing instruction jmp bend +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp breturn +Removing instruction jmp breturn Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call inccnt param-assignment [ cnt#10 ] -//SEG5 [8] phi from main to inccnt -inccnt_from_main: -//SEG6 [8] phi (byte) cnt#13 = (byte) 0 -- xby=coby1 - ldx #$0 - jsr inccnt -//SEG7 main::@1 -main__B1: -//SEG8 [2] *((word) 1024) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=xby - stx $400 -//SEG9 [3] (byte) cnt#3 ← ++ (byte) cnt#10 [ cnt#3 ] -- xby=_inc_xby - inx -//SEG10 [4] call inccnt param-assignment [ cnt#10 ] -//SEG11 [8] phi from main::@1 to inccnt -inccnt_from_B1: -//SEG12 [8] phi (byte) cnt#13 = (byte) cnt#3 -- register_copy - jsr inccnt -//SEG13 main::@2 -main__B2: -//SEG14 [5] (byte) cnt#1 ← ++ (byte) cnt#10 [ cnt#1 ] -- xby=_inc_xby - inx -//SEG15 [6] *((word) 1025) ← (byte) cnt#1 [ ] -- _star_cowo1=xby - stx $401 -//SEG16 main::@return -main__Breturn: -//SEG17 [7] return [ ] - rts +main: { + //SEG4 [1] call inccnt param-assignment [ cnt#10 ] + //SEG5 [8] phi from main to inccnt + inccnt_from_main: + //SEG6 [8] phi (byte) cnt#13 = (byte) 0 -- xby=coby1 + ldx #$0 + jsr inccnt + //SEG7 main::@1 + b1: + //SEG8 [2] *((word) 1024) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=xby + stx $400 + //SEG9 [3] (byte) cnt#3 ← ++ (byte) cnt#10 [ cnt#3 ] -- xby=_inc_xby + inx + //SEG10 [4] call inccnt param-assignment [ cnt#10 ] + //SEG11 [8] phi from main::@1 to inccnt + inccnt_from_b1: + //SEG12 [8] phi (byte) cnt#13 = (byte) cnt#3 -- register_copy + jsr inccnt + //SEG13 main::@2 + b2: + //SEG14 [5] (byte) cnt#1 ← ++ (byte) cnt#10 [ cnt#1 ] -- xby=_inc_xby + inx + //SEG15 [6] *((word) 1025) ← (byte) cnt#1 [ ] -- _star_cowo1=xby + stx $401 + //SEG16 main::@return + breturn: + //SEG17 [7] return [ ] + rts +} //SEG18 inccnt -inccnt: -//SEG19 [9] (byte) cnt#10 ← ++ (byte) cnt#13 [ cnt#10 ] -- xby=_inc_xby - inx -//SEG20 inccnt::@return -inccnt__Breturn: -//SEG21 [10] return [ cnt#10 ] - rts +inccnt: { + //SEG19 [9] (byte) cnt#10 ← ++ (byte) cnt#13 [ cnt#10 ] -- xby=_inc_xby + inx + //SEG20 inccnt::@return + breturn: + //SEG21 [10] return [ cnt#10 ] + rts +} FINAL SYMBOL TABLE -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte[256]) SCREEN (byte) cnt (byte) cnt#1 reg byte x 4.0 @@ -701,47 +705,49 @@ reg byte x [ cnt#1 ] reg byte x [ cnt#10 ] FINAL CODE -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call inccnt param-assignment [ cnt#10 ] -//SEG5 [8] phi from main to inccnt -inccnt_from_main: -//SEG6 [8] phi (byte) cnt#13 = (byte) 0 -- xby=coby1 - ldx #$0 - jsr inccnt -//SEG7 main::@1 -main__B1: -//SEG8 [2] *((word) 1024) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=xby - stx $400 -//SEG9 [3] (byte) cnt#3 ← ++ (byte) cnt#10 [ cnt#3 ] -- xby=_inc_xby - inx -//SEG10 [4] call inccnt param-assignment [ cnt#10 ] -//SEG11 [8] phi from main::@1 to inccnt -inccnt_from_B1: -//SEG12 [8] phi (byte) cnt#13 = (byte) cnt#3 -- register_copy - jsr inccnt -//SEG13 main::@2 -main__B2: -//SEG14 [5] (byte) cnt#1 ← ++ (byte) cnt#10 [ cnt#1 ] -- xby=_inc_xby - inx -//SEG15 [6] *((word) 1025) ← (byte) cnt#1 [ ] -- _star_cowo1=xby - stx $401 -//SEG16 main::@return -main__Breturn: -//SEG17 [7] return [ ] - rts +main: { + //SEG4 [1] call inccnt param-assignment [ cnt#10 ] + //SEG5 [8] phi from main to inccnt + inccnt_from_main: + //SEG6 [8] phi (byte) cnt#13 = (byte) 0 -- xby=coby1 + ldx #$0 + jsr inccnt + //SEG7 main::@1 + b1: + //SEG8 [2] *((word) 1024) ← (byte) cnt#10 [ cnt#10 ] -- _star_cowo1=xby + stx $400 + //SEG9 [3] (byte) cnt#3 ← ++ (byte) cnt#10 [ cnt#3 ] -- xby=_inc_xby + inx + //SEG10 [4] call inccnt param-assignment [ cnt#10 ] + //SEG11 [8] phi from main::@1 to inccnt + inccnt_from_b1: + //SEG12 [8] phi (byte) cnt#13 = (byte) cnt#3 -- register_copy + jsr inccnt + //SEG13 main::@2 + b2: + //SEG14 [5] (byte) cnt#1 ← ++ (byte) cnt#10 [ cnt#1 ] -- xby=_inc_xby + inx + //SEG15 [6] *((word) 1025) ← (byte) cnt#1 [ ] -- _star_cowo1=xby + stx $401 + //SEG16 main::@return + breturn: + //SEG17 [7] return [ ] + rts +} //SEG18 inccnt -inccnt: -//SEG19 [9] (byte) cnt#10 ← ++ (byte) cnt#13 [ cnt#10 ] -- xby=_inc_xby - inx -//SEG20 inccnt::@return -inccnt__Breturn: -//SEG21 [10] return [ cnt#10 ] - rts +inccnt: { + //SEG19 [9] (byte) cnt#10 ← ++ (byte) cnt#13 [ cnt#10 ] -- xby=_inc_xby + inx + //SEG20 inccnt::@return + breturn: + //SEG21 [10] return [ cnt#10 ] + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.sym b/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.sym index 0ccd4a4be..3d65693a5 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.sym +++ b/src/main/java/dk/camelot64/kickc/test/ref/modglobalmin.sym @@ -1,5 +1,5 @@ -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte[256]) SCREEN (byte) cnt (byte) cnt#1 reg byte x 4.0 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.asm b/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.asm index 63f257e42..51ff4abbd 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.asm @@ -1,29 +1,31 @@ -BBEGIN: +bbegin: jsr main -BEND: -main: - jsr lvalue -main__B1: - jsr rvalue -main__B2: - jsr rvaluevar -main__B3: - jsr lvaluevar -main__Breturn: - rts -lvaluevar: -lvaluevar__B1_from_lvaluevar: - lda #<$400 - sta $2 - lda #>$400 - sta $2+$1 - ldx #$2 -lvaluevar__B1: - cpx #$a - bcc lvaluevar__B2 -lvaluevar__Breturn: - rts -lvaluevar__B2: +bend: +main: { + jsr lvalue + b1: + jsr rvalue + b2: + jsr rvaluevar + b3: + jsr lvaluevar + breturn: + rts +} +lvaluevar: { + b1_from_lvaluevar: + lda #<$400 + sta $2 + lda #>$400 + sta $2+$1 + ldx #$2 + b1: + cpx #$a + bcc b2 + breturn: + rts +} +b2: ldy #$0 lda #$4 sta ($2),y @@ -32,21 +34,22 @@ lvaluevar__B2: inc $2+$1 !: inx -lvaluevar__B1_from_B2: - jmp lvaluevar__B1 -rvaluevar: -rvaluevar__B1_from_rvaluevar: - lda #<$400 - sta $2 - lda #>$400 - sta $2+$1 - ldx #$2 -rvaluevar__B1: - cpx #$a - bcc rvaluevar__B2 -rvaluevar__Breturn: - rts -rvaluevar__B2: +b1_from_b2: + jmp b1 +rvaluevar: { + b1_from_rvaluevar: + lda #<$400 + sta $2 + lda #>$400 + sta $2+$1 + ldx #$2 + b1: + cpx #$a + bcc b2 + breturn: + rts +} +b2: ldy #$0 lda ($2),y inc $2 @@ -54,38 +57,40 @@ rvaluevar__B2: inc $2+$1 !: inx -rvaluevar__B1_from_B2: - jmp rvaluevar__B1 -rvalue: - lda $400 - lda $401 -rvalue__B1_from_rvalue: - ldx #$2 -rvalue__B1: - cpx #$a - bcc rvalue__B2 -rvalue__Breturn: - rts -rvalue__B2: +b1_from_b2: + jmp b1 +rvalue: { + lda $400 + lda $401 + b1_from_rvalue: + ldx #$2 + b1: + cpx #$a + bcc b2 + breturn: + rts +} +b2: lda $400,x inx -rvalue__B1_from_B2: - jmp rvalue__B1 -lvalue: - lda #$1 - sta $400 - lda #$2 - sta $401 -lvalue__B1_from_lvalue: - ldx #$2 -lvalue__B1: - cpx #$a - bcc lvalue__B2 -lvalue__Breturn: - rts -lvalue__B2: +b1_from_b2: + jmp b1 +lvalue: { + lda #$1 + sta $400 + lda #$2 + sta $401 + b1_from_lvalue: + ldx #$2 + b1: + cpx #$a + bcc b2 + breturn: + rts +} +b2: lda #$3 sta $400,x inx -lvalue__B1_from_B2: - jmp lvalue__B1 +b1_from_b2: + jmp b1 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.cfg b/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.cfg index 28477bf97..cc7152aea 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.cfg +++ b/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.cfg @@ -1,8 +1,8 @@ -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] call lvalue param-assignment [ ] to:main::@1 main::@1: from main @@ -16,7 +16,7 @@ main::@3: from main::@2 to:main::@return main::@return: from main::@3 [5] return [ ] - to:@RETURN + to:@return lvaluevar: from main::@3 to:lvaluevar::@1 lvaluevar::@1: from lvaluevar lvaluevar::@2 @@ -26,7 +26,7 @@ lvaluevar::@1: from lvaluevar lvaluevar::@2 to:lvaluevar::@return lvaluevar::@return: from lvaluevar::@1 [8] return [ ] - to:@RETURN + to:@return lvaluevar::@2: from lvaluevar::@1 [9] *((byte*) lvaluevar::screen#2) ← (byte) 4 [ lvaluevar::i#2 lvaluevar::screen#2 ] [10] (byte*) lvaluevar::screen#1 ← ++ (byte*) lvaluevar::screen#2 [ lvaluevar::screen#1 lvaluevar::i#2 ] @@ -41,7 +41,7 @@ rvaluevar::@1: from rvaluevar rvaluevar::@2 to:rvaluevar::@return rvaluevar::@return: from rvaluevar::@1 [14] return [ ] - to:@RETURN + to:@return rvaluevar::@2: from rvaluevar::@1 [15] (byte) rvaluevar::b#0 ← * (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#2 ] [16] (byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2 [ rvaluevar::screen#1 rvaluevar::i#2 ] @@ -57,7 +57,7 @@ rvalue::@1: from rvalue rvalue::@2 to:rvalue::@return rvalue::@return: from rvalue::@1 [22] return [ ] - to:@RETURN + to:@return rvalue::@2: from rvalue::@1 [23] (byte) rvalue::b#2 ← (word) 1024 *idx (byte) rvalue::i#2 [ rvalue::i#2 ] [24] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] @@ -72,7 +72,7 @@ lvalue::@1: from lvalue lvalue::@2 to:lvalue::@return lvalue::@return: from lvalue::@1 [29] return [ ] - to:@RETURN + to:@return lvalue::@2: from lvalue::@1 [30] *((word) 1024 + (byte) lvalue::i#2) ← (byte) 3 [ lvalue::i#2 ] [31] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] diff --git a/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.log b/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.log index c5ff7a945..624eb91b9 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.log @@ -211,7 +211,7 @@ SYMBOLS (byte*) rvaluevar::screen INITIAL CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (void~) $0 ← call main to:@1 main: from @@ -222,8 +222,8 @@ main: from to:main::@return main::@return: from main return - to:@RETURN -@1: from @BEGIN + to:@return +@1: from @begin to:@2 lvalue: from (byte[1024]) lvalue::SCREEN ← (word) 1024 @@ -249,7 +249,7 @@ lvalue::@6: from to:lvalue::@3 lvalue::@return: from lvalue::@3 return - to:@RETURN + to:@return @2: from @1 to:@3 rvalue: from @@ -279,7 +279,7 @@ rvalue::@6: from to:rvalue::@3 rvalue::@return: from rvalue::@3 return - to:@RETURN + to:@return @3: from @2 to:@4 lvaluevar: from @@ -306,7 +306,7 @@ lvaluevar::@6: from to:lvaluevar::@3 lvaluevar::@return: from lvaluevar::@3 return - to:@RETURN + to:@return @4: from @3 to:@5 rvaluevar: from @@ -333,10 +333,10 @@ rvaluevar::@6: from to:rvaluevar::@3 rvaluevar::@return: from rvaluevar::@3 return - to:@RETURN + to:@return @5: from @4 - to:@END -@END: from @5 + to:@end +@end: from @5 Removing empty block @1 Removing empty block lvalue::@4 @@ -360,9 +360,9 @@ Removing empty block rvaluevar::@5 Removing empty block rvaluevar::@6 Removing empty block @5 CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (void~) $0 ← call main - to:@END + to:@end main: from (void~) main::$0 ← call lvalue (void~) main::$1 ← call rvalue @@ -371,7 +371,7 @@ main: from to:main::@return main::@return: from main return - to:@RETURN + to:@return lvalue: from (byte[1024]) lvalue::SCREEN ← (word) 1024 *((byte[1024]) lvalue::SCREEN) ← (byte) 1 @@ -388,7 +388,7 @@ lvalue::@2: from lvalue::@1 to:lvalue::@1 lvalue::@return: from lvalue::@1 return - to:@RETURN + to:@return rvalue: from (byte[1024]) rvalue::SCREEN ← (word) 1024 (byte~) rvalue::$0 ← * (byte[1024]) rvalue::SCREEN @@ -408,7 +408,7 @@ rvalue::@2: from rvalue::@1 to:rvalue::@1 rvalue::@return: from rvalue::@1 return - to:@RETURN + to:@return lvaluevar: from (byte*) lvaluevar::screen ← (word) 1024 (byte) lvaluevar::b ← (byte) 4 @@ -425,7 +425,7 @@ lvaluevar::@2: from lvaluevar::@1 to:lvaluevar::@1 lvaluevar::@return: from lvaluevar::@1 return - to:@RETURN + to:@return rvaluevar: from (byte*) rvaluevar::screen ← (word) 1024 (byte) rvaluevar::i ← (byte) 2 @@ -442,18 +442,18 @@ rvaluevar::@2: from rvaluevar::@1 to:rvaluevar::@1 rvaluevar::@return: from rvaluevar::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin PROCEDURE MODIFY VARIABLE ANALYSIS CONTROL FLOW GRAPH WITH ASSIGNMENT CALL -@BEGIN: from +@begin: from call main param-assignment to:@6 -@6: from @BEGIN - to:@END -main: from @BEGIN +@6: from @begin + to:@end +main: from @begin call lvalue param-assignment to:main::@1 main::@1: from main @@ -469,7 +469,7 @@ main::@4: from main::@3 to:main::@return main::@return: from main::@4 return - to:@RETURN + to:@return lvalue: from main (byte[1024]) lvalue::SCREEN ← (word) 1024 *((byte[1024]) lvalue::SCREEN) ← (byte) 1 @@ -486,7 +486,7 @@ lvalue::@2: from lvalue::@1 to:lvalue::@1 lvalue::@return: from lvalue::@1 return - to:@RETURN + to:@return rvalue: from main::@1 (byte[1024]) rvalue::SCREEN ← (word) 1024 (byte~) rvalue::$0 ← * (byte[1024]) rvalue::SCREEN @@ -506,7 +506,7 @@ rvalue::@2: from rvalue::@1 to:rvalue::@1 rvalue::@return: from rvalue::@1 return - to:@RETURN + to:@return lvaluevar: from main::@3 (byte*) lvaluevar::screen ← (word) 1024 (byte) lvaluevar::b ← (byte) 4 @@ -523,7 +523,7 @@ lvaluevar::@2: from lvaluevar::@1 to:lvaluevar::@1 lvaluevar::@return: from lvaluevar::@1 return - to:@RETURN + to:@return rvaluevar: from main::@2 (byte*) rvaluevar::screen ← (word) 1024 (byte) rvaluevar::i ← (byte) 2 @@ -540,18 +540,18 @@ rvaluevar::@2: from rvaluevar::@1 to:rvaluevar::@1 rvaluevar::@return: from rvaluevar::@1 return - to:@RETURN -@END: from @6 + to:@return +@end: from @6 Completing Phi functions... Completing Phi functions... CONTROL FLOW GRAPH SSA -@BEGIN: from +@begin: from call main param-assignment to:@6 -@6: from @BEGIN - to:@END -main: from @BEGIN +@6: from @begin + to:@end +main: from @begin call lvalue param-assignment to:main::@1 main::@1: from main @@ -567,7 +567,7 @@ main::@4: from main::@3 to:main::@return main::@return: from main::@4 return - to:@RETURN + to:@return lvalue: from main (byte[1024]) lvalue::SCREEN#0 ← (word) 1024 *((byte[1024]) lvalue::SCREEN#0) ← (byte) 1 @@ -588,7 +588,7 @@ lvalue::@2: from lvalue::@1 to:lvalue::@1 lvalue::@return: from lvalue::@1 return - to:@RETURN + to:@return rvalue: from main::@1 (byte[1024]) rvalue::SCREEN#0 ← (word) 1024 (byte~) rvalue::$0 ← * (byte[1024]) rvalue::SCREEN#0 @@ -612,7 +612,7 @@ rvalue::@2: from rvalue::@1 to:rvalue::@1 rvalue::@return: from rvalue::@1 return - to:@RETURN + to:@return lvaluevar: from main::@3 (byte*) lvaluevar::screen#0 ← (word) 1024 (byte) lvaluevar::b#0 ← (byte) 4 @@ -635,7 +635,7 @@ lvaluevar::@2: from lvaluevar::@1 to:lvaluevar::@1 lvaluevar::@return: from lvaluevar::@1 return - to:@RETURN + to:@return rvaluevar: from main::@2 (byte*) rvaluevar::screen#0 ← (word) 1024 (byte) rvaluevar::i#0 ← (byte) 2 @@ -656,16 +656,16 @@ rvaluevar::@2: from rvaluevar::@1 to:rvaluevar::@1 rvaluevar::@return: from rvaluevar::@1 return - to:@RETURN -@END: from @6 + to:@return +@end: from @6 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN -@BEGIN: from +@begin: from call main param-assignment to:@6 -@6: from @BEGIN - to:@END -main: from @BEGIN +@6: from @begin + to:@end +main: from @begin call lvalue param-assignment to:main::@1 main::@1: from main @@ -681,7 +681,7 @@ main::@4: from main::@3 to:main::@return main::@return: from main::@4 return - to:@RETURN + to:@return lvalue: from main (byte[1024]) lvalue::SCREEN#0 ← (word) 1024 *((byte[1024]) lvalue::SCREEN#0) ← (byte) 1 @@ -702,7 +702,7 @@ lvalue::@2: from lvalue::@1 to:lvalue::@1 lvalue::@return: from lvalue::@1 return - to:@RETURN + to:@return rvalue: from main::@1 (byte[1024]) rvalue::SCREEN#0 ← (word) 1024 (byte~) rvalue::$0 ← * (byte[1024]) rvalue::SCREEN#0 @@ -726,7 +726,7 @@ rvalue::@2: from rvalue::@1 to:rvalue::@1 rvalue::@return: from rvalue::@1 return - to:@RETURN + to:@return lvaluevar: from main::@3 (byte*) lvaluevar::screen#0 ← (word) 1024 (byte) lvaluevar::b#0 ← (byte) 4 @@ -749,7 +749,7 @@ lvaluevar::@2: from lvaluevar::@1 to:lvaluevar::@1 lvaluevar::@return: from lvaluevar::@1 return - to:@RETURN + to:@return rvaluevar: from main::@2 (byte*) rvaluevar::screen#0 ← (word) 1024 (byte) rvaluevar::i#0 ← (byte) 2 @@ -770,17 +770,17 @@ rvaluevar::@2: from rvaluevar::@1 to:rvaluevar::@1 rvaluevar::@return: from rvaluevar::@1 return - to:@RETURN -@END: from @6 + to:@return +@end: from @6 Culled Empty Block (label) @6 Culled Empty Block (label) main::@4 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call lvalue param-assignment to:main::@1 main::@1: from main @@ -794,7 +794,7 @@ main::@3: from main::@2 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return lvalue: from main (byte[1024]) lvalue::SCREEN#0 ← (word) 1024 *((byte[1024]) lvalue::SCREEN#0) ← (byte) 1 @@ -815,7 +815,7 @@ lvalue::@2: from lvalue::@1 to:lvalue::@1 lvalue::@return: from lvalue::@1 return - to:@RETURN + to:@return rvalue: from main::@1 (byte[1024]) rvalue::SCREEN#0 ← (word) 1024 (byte~) rvalue::$0 ← * (byte[1024]) rvalue::SCREEN#0 @@ -839,7 +839,7 @@ rvalue::@2: from rvalue::@1 to:rvalue::@1 rvalue::@return: from rvalue::@1 return - to:@RETURN + to:@return lvaluevar: from main::@3 (byte*) lvaluevar::screen#0 ← (word) 1024 (byte) lvaluevar::b#0 ← (byte) 4 @@ -862,7 +862,7 @@ lvaluevar::@2: from lvaluevar::@1 to:lvaluevar::@1 lvaluevar::@return: from lvaluevar::@1 return - to:@RETURN + to:@return rvaluevar: from main::@2 (byte*) rvaluevar::screen#0 ← (word) 1024 (byte) rvaluevar::i#0 ← (byte) 2 @@ -883,8 +883,8 @@ rvaluevar::@2: from rvaluevar::@1 to:rvaluevar::@1 rvaluevar::@return: from rvaluevar::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte[1024]) lvalue::SCREEN#0 (word) 1024 Constant (byte) lvalue::i#0 (byte) 2 @@ -897,10 +897,10 @@ Constant (byte*) rvaluevar::screen#0 (word) 1024 Constant (byte) rvaluevar::i#0 (byte) 2 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call lvalue param-assignment to:main::@1 main::@1: from main @@ -914,7 +914,7 @@ main::@3: from main::@2 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return lvalue: from main *((word) 1024) ← (byte) 1 *((word) 1024 + (byte) 1) ← (byte) 2 @@ -933,7 +933,7 @@ lvalue::@2: from lvalue::@1 to:lvalue::@1 lvalue::@return: from lvalue::@1 return - to:@RETURN + to:@return rvalue: from main::@1 (byte~) rvalue::$0 ← * (word) 1024 (byte) rvalue::b#0 ← (byte~) rvalue::$0 @@ -955,7 +955,7 @@ rvalue::@2: from rvalue::@1 to:rvalue::@1 rvalue::@return: from rvalue::@1 return - to:@RETURN + to:@return lvaluevar: from main::@3 to:lvaluevar::@1 lvaluevar::@1: from lvaluevar lvaluevar::@2 @@ -975,7 +975,7 @@ lvaluevar::@2: from lvaluevar::@1 to:lvaluevar::@1 lvaluevar::@return: from lvaluevar::@1 return - to:@RETURN + to:@return rvaluevar: from main::@2 to:rvaluevar::@1 rvaluevar::@1: from rvaluevar rvaluevar::@2 @@ -994,17 +994,17 @@ rvaluevar::@2: from rvaluevar::@1 to:rvaluevar::@1 rvaluevar::@return: from rvaluevar::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Consolidated assigned array index constant in assignment *(1025) Consolidated referenced array index constant in assignment rvalue::$1 Succesful SSA optimization Pass2ConstantAdditionElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call lvalue param-assignment to:main::@1 main::@1: from main @@ -1018,7 +1018,7 @@ main::@3: from main::@2 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return lvalue: from main *((word) 1024) ← (byte) 1 *((word) 1025) ← (byte) 2 @@ -1037,7 +1037,7 @@ lvalue::@2: from lvalue::@1 to:lvalue::@1 lvalue::@return: from lvalue::@1 return - to:@RETURN + to:@return rvalue: from main::@1 (byte~) rvalue::$0 ← * (word) 1024 (byte) rvalue::b#0 ← (byte~) rvalue::$0 @@ -1059,7 +1059,7 @@ rvalue::@2: from rvalue::@1 to:rvalue::@1 rvalue::@return: from rvalue::@1 return - to:@RETURN + to:@return lvaluevar: from main::@3 to:lvaluevar::@1 lvaluevar::@1: from lvaluevar lvaluevar::@2 @@ -1079,7 +1079,7 @@ lvaluevar::@2: from lvaluevar::@1 to:lvaluevar::@1 lvaluevar::@return: from lvaluevar::@1 return - to:@RETURN + to:@return rvaluevar: from main::@2 to:rvaluevar::@1 rvaluevar::@1: from rvaluevar rvaluevar::@2 @@ -1098,8 +1098,8 @@ rvaluevar::@2: from rvaluevar::@1 to:rvaluevar::@1 rvaluevar::@return: from rvaluevar::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Alias (byte[1024]) lvalue::SCREEN#1 = (byte[1024]) lvalue::SCREEN#2 Alias (byte) lvalue::i#2 = (byte) lvalue::i#3 @@ -1116,10 +1116,10 @@ Alias (byte) rvaluevar::i#2 = (byte) rvaluevar::i#3 Alias (byte) rvaluevar::b#0 = (byte~) rvaluevar::$1 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call lvalue param-assignment to:main::@1 main::@1: from main @@ -1133,7 +1133,7 @@ main::@3: from main::@2 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return lvalue: from main *((word) 1024) ← (byte) 1 *((word) 1025) ← (byte) 2 @@ -1150,7 +1150,7 @@ lvalue::@2: from lvalue::@1 to:lvalue::@1 lvalue::@return: from lvalue::@1 return - to:@RETURN + to:@return rvalue: from main::@1 (byte) rvalue::b#0 ← * (word) 1024 (byte) rvalue::b#1 ← * (word) 1025 @@ -1167,7 +1167,7 @@ rvalue::@2: from rvalue::@1 to:rvalue::@1 rvalue::@return: from rvalue::@1 return - to:@RETURN + to:@return lvaluevar: from main::@3 to:lvaluevar::@1 lvaluevar::@1: from lvaluevar lvaluevar::@2 @@ -1184,7 +1184,7 @@ lvaluevar::@2: from lvaluevar::@1 to:lvaluevar::@1 lvaluevar::@return: from lvaluevar::@1 return - to:@RETURN + to:@return rvaluevar: from main::@2 to:rvaluevar::@1 rvaluevar::@1: from rvaluevar rvaluevar::@2 @@ -1200,18 +1200,18 @@ rvaluevar::@2: from rvaluevar::@1 to:rvaluevar::@1 rvaluevar::@return: from rvaluevar::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Self Phi Eliminated (byte[1024]) lvalue::SCREEN#1 Self Phi Eliminated (byte[1024]) rvalue::SCREEN#1 Self Phi Eliminated (byte) lvaluevar::b#1 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call lvalue param-assignment to:main::@1 main::@1: from main @@ -1225,7 +1225,7 @@ main::@3: from main::@2 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return lvalue: from main *((word) 1024) ← (byte) 1 *((word) 1025) ← (byte) 2 @@ -1242,7 +1242,7 @@ lvalue::@2: from lvalue::@1 to:lvalue::@1 lvalue::@return: from lvalue::@1 return - to:@RETURN + to:@return rvalue: from main::@1 (byte) rvalue::b#0 ← * (word) 1024 (byte) rvalue::b#1 ← * (word) 1025 @@ -1259,7 +1259,7 @@ rvalue::@2: from rvalue::@1 to:rvalue::@1 rvalue::@return: from rvalue::@1 return - to:@RETURN + to:@return lvaluevar: from main::@3 to:lvaluevar::@1 lvaluevar::@1: from lvaluevar lvaluevar::@2 @@ -1276,7 +1276,7 @@ lvaluevar::@2: from lvaluevar::@1 to:lvaluevar::@1 lvaluevar::@return: from lvaluevar::@1 return - to:@RETURN + to:@return rvaluevar: from main::@2 to:rvaluevar::@1 rvaluevar::@1: from rvaluevar rvaluevar::@2 @@ -1292,8 +1292,8 @@ rvaluevar::@2: from rvaluevar::@1 to:rvaluevar::@1 rvaluevar::@return: from rvaluevar::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Simple Condition (boolean~) lvalue::$0 if((byte) lvalue::i#2<(byte) 10) goto lvalue::@2 Simple Condition (boolean~) rvalue::$2 if((byte) rvalue::i#2<(byte) 10) goto rvalue::@2 @@ -1301,10 +1301,10 @@ Simple Condition (boolean~) lvaluevar::$0 if((byte) lvaluevar::i#2<(byte) 10) go Simple Condition (boolean~) rvaluevar::$0 if((byte) rvaluevar::i#2<(byte) 10) goto rvaluevar::@2 Succesful SSA optimization Pass2ConditionalJumpSimplification CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call lvalue param-assignment to:main::@1 main::@1: from main @@ -1318,7 +1318,7 @@ main::@3: from main::@2 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return lvalue: from main *((word) 1024) ← (byte) 1 *((word) 1025) ← (byte) 2 @@ -1334,7 +1334,7 @@ lvalue::@2: from lvalue::@1 to:lvalue::@1 lvalue::@return: from lvalue::@1 return - to:@RETURN + to:@return rvalue: from main::@1 (byte) rvalue::b#0 ← * (word) 1024 (byte) rvalue::b#1 ← * (word) 1025 @@ -1350,7 +1350,7 @@ rvalue::@2: from rvalue::@1 to:rvalue::@1 rvalue::@return: from rvalue::@1 return - to:@RETURN + to:@return lvaluevar: from main::@3 to:lvaluevar::@1 lvaluevar::@1: from lvaluevar lvaluevar::@2 @@ -1366,7 +1366,7 @@ lvaluevar::@2: from lvaluevar::@1 to:lvaluevar::@1 lvaluevar::@return: from lvaluevar::@1 return - to:@RETURN + to:@return rvaluevar: from main::@2 to:rvaluevar::@1 rvaluevar::@1: from rvaluevar rvaluevar::@2 @@ -1381,18 +1381,18 @@ rvaluevar::@2: from rvaluevar::@1 to:rvaluevar::@1 rvaluevar::@return: from rvaluevar::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte[1024]) lvalue::SCREEN#1 (word) 1024 Constant (byte[1024]) rvalue::SCREEN#1 (word) 1024 Constant (byte) lvaluevar::b#1 (byte) 4 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call lvalue param-assignment to:main::@1 main::@1: from main @@ -1406,7 +1406,7 @@ main::@3: from main::@2 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return lvalue: from main *((word) 1024) ← (byte) 1 *((word) 1025) ← (byte) 2 @@ -1421,7 +1421,7 @@ lvalue::@2: from lvalue::@1 to:lvalue::@1 lvalue::@return: from lvalue::@1 return - to:@RETURN + to:@return rvalue: from main::@1 (byte) rvalue::b#0 ← * (word) 1024 (byte) rvalue::b#1 ← * (word) 1025 @@ -1436,7 +1436,7 @@ rvalue::@2: from rvalue::@1 to:rvalue::@1 rvalue::@return: from rvalue::@1 return - to:@RETURN + to:@return lvaluevar: from main::@3 to:lvaluevar::@1 lvaluevar::@1: from lvaluevar lvaluevar::@2 @@ -1451,7 +1451,7 @@ lvaluevar::@2: from lvaluevar::@1 to:lvaluevar::@1 lvaluevar::@return: from lvaluevar::@1 return - to:@RETURN + to:@return rvaluevar: from main::@2 to:rvaluevar::@1 rvaluevar::@1: from rvaluevar rvaluevar::@2 @@ -1466,19 +1466,19 @@ rvaluevar::@2: from rvaluevar::@1 to:rvaluevar::@1 rvaluevar::@return: from rvaluevar::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Multiple usages for variable. Not optimizing sub-constant (byte) rvalue::i#2 Multiple usages for variable. Not optimizing sub-constant (byte) rvalue::i#2 -Block Sequence Planned @BEGIN @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 -Block Sequence Planned @BEGIN @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 +Block Sequence Planned @begin @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 +Block Sequence Planned @begin @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 CONTROL FLOW GRAPH - PHI LIFTED -@BEGIN: from +@begin: from call main param-assignment - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin call lvalue param-assignment to:main::@1 main::@1: from main @@ -1492,7 +1492,7 @@ main::@3: from main::@2 to:main::@return main::@return: from main::@3 return - to:@RETURN + to:@return lvaluevar: from main::@3 to:lvaluevar::@1 lvaluevar::@1: from lvaluevar lvaluevar::@2 @@ -1502,7 +1502,7 @@ lvaluevar::@1: from lvaluevar lvaluevar::@2 to:lvaluevar::@return lvaluevar::@return: from lvaluevar::@1 return - to:@RETURN + to:@return lvaluevar::@2: from lvaluevar::@1 *((byte*) lvaluevar::screen#2) ← (byte) 4 (byte*) lvaluevar::screen#1 ← ++ (byte*) lvaluevar::screen#2 @@ -1519,7 +1519,7 @@ rvaluevar::@1: from rvaluevar rvaluevar::@2 to:rvaluevar::@return rvaluevar::@return: from rvaluevar::@1 return - to:@RETURN + to:@return rvaluevar::@2: from rvaluevar::@1 (byte) rvaluevar::b#0 ← * (byte*) rvaluevar::screen#2 (byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2 @@ -1537,7 +1537,7 @@ rvalue::@1: from rvalue rvalue::@2 to:rvalue::@return rvalue::@return: from rvalue::@1 return - to:@RETURN + to:@return rvalue::@2: from rvalue::@1 (byte) rvalue::b#2 ← (word) 1024 *idx (byte) rvalue::i#2 (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 @@ -1553,7 +1553,7 @@ lvalue::@1: from lvalue lvalue::@2 to:lvalue::@return lvalue::@return: from lvalue::@1 return - to:@RETURN + to:@return lvalue::@2: from lvalue::@1 *((word) 1024 + (byte) lvalue::i#2) ← (byte) 3 (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 @@ -1568,11 +1568,11 @@ Propagating live ranges... Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] call lvalue param-assignment [ ] to:main::@1 main::@1: from main @@ -1586,7 +1586,7 @@ main::@3: from main::@2 to:main::@return main::@return: from main::@3 [5] return [ ] - to:@RETURN + to:@return lvaluevar: from main::@3 to:lvaluevar::@1 lvaluevar::@1: from lvaluevar lvaluevar::@2 @@ -1596,7 +1596,7 @@ lvaluevar::@1: from lvaluevar lvaluevar::@2 to:lvaluevar::@return lvaluevar::@return: from lvaluevar::@1 [8] return [ ] - to:@RETURN + to:@return lvaluevar::@2: from lvaluevar::@1 [9] *((byte*) lvaluevar::screen#2) ← (byte) 4 [ lvaluevar::i#2 lvaluevar::screen#2 ] [10] (byte*) lvaluevar::screen#1 ← ++ (byte*) lvaluevar::screen#2 [ lvaluevar::i#2 lvaluevar::screen#1 ] @@ -1613,7 +1613,7 @@ rvaluevar::@1: from rvaluevar rvaluevar::@2 to:rvaluevar::@return rvaluevar::@return: from rvaluevar::@1 [16] return [ ] - to:@RETURN + to:@return rvaluevar::@2: from rvaluevar::@1 [17] (byte) rvaluevar::b#0 ← * (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#2 ] [18] (byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#1 ] @@ -1631,7 +1631,7 @@ rvalue::@1: from rvalue rvalue::@2 to:rvalue::@return rvalue::@return: from rvalue::@1 [26] return [ ] - to:@RETURN + to:@return rvalue::@2: from rvalue::@1 [27] (byte) rvalue::b#2 ← (word) 1024 *idx (byte) rvalue::i#2 [ rvalue::i#2 ] [28] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] @@ -1647,7 +1647,7 @@ lvalue::@1: from lvalue lvalue::@2 to:lvalue::@return lvalue::@return: from lvalue::@1 [34] return [ ] - to:@RETURN + to:@return lvalue::@2: from lvalue::@1 [35] *((word) 1024 + (byte) lvalue::i#2) ← (byte) 3 [ lvalue::i#2 ] [36] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] @@ -1662,7 +1662,7 @@ Coalesced [21] rvaluevar::screen#4 ← rvaluevar::screen#1 Coalesced [29] rvalue::i#4 ← rvalue::i#1 Coalesced [37] lvalue::i#4 ← lvalue::i#1 Coalesced down to 6 phi equivalence classes -Block Sequence Planned @BEGIN @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 +Block Sequence Planned @begin @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 empty live range for unused variable rvaluevar::b#0 Adding empty live range for unused variable rvalue::b#0 Adding empty live range for unused variable rvalue::b#1 @@ -1671,11 +1671,11 @@ Propagating live ranges... Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] call lvalue param-assignment [ ] to:main::@1 main::@1: from main @@ -1689,7 +1689,7 @@ main::@3: from main::@2 to:main::@return main::@return: from main::@3 [5] return [ ] - to:@RETURN + to:@return lvaluevar: from main::@3 to:lvaluevar::@1 lvaluevar::@1: from lvaluevar lvaluevar::@2 @@ -1699,7 +1699,7 @@ lvaluevar::@1: from lvaluevar lvaluevar::@2 to:lvaluevar::@return lvaluevar::@return: from lvaluevar::@1 [8] return [ ] - to:@RETURN + to:@return lvaluevar::@2: from lvaluevar::@1 [9] *((byte*) lvaluevar::screen#2) ← (byte) 4 [ lvaluevar::i#2 lvaluevar::screen#2 ] [10] (byte*) lvaluevar::screen#1 ← ++ (byte*) lvaluevar::screen#2 [ lvaluevar::screen#1 lvaluevar::i#2 ] @@ -1714,7 +1714,7 @@ rvaluevar::@1: from rvaluevar rvaluevar::@2 to:rvaluevar::@return rvaluevar::@return: from rvaluevar::@1 [14] return [ ] - to:@RETURN + to:@return rvaluevar::@2: from rvaluevar::@1 [15] (byte) rvaluevar::b#0 ← * (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#2 ] [16] (byte*) rvaluevar::screen#1 ← ++ (byte*) rvaluevar::screen#2 [ rvaluevar::screen#1 rvaluevar::i#2 ] @@ -1730,7 +1730,7 @@ rvalue::@1: from rvalue rvalue::@2 to:rvalue::@return rvalue::@return: from rvalue::@1 [22] return [ ] - to:@RETURN + to:@return rvalue::@2: from rvalue::@1 [23] (byte) rvalue::b#2 ← (word) 1024 *idx (byte) rvalue::i#2 [ rvalue::i#2 ] [24] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] @@ -1745,7 +1745,7 @@ lvalue::@1: from lvalue lvalue::@2 to:lvalue::@return lvalue::@return: from lvalue::@1 [29] return [ ] - to:@RETURN + to:@return lvalue::@2: from lvalue::@1 [30] *((word) 1024 + (byte) lvalue::i#2) ← (byte) 3 [ lvalue::i#2 ] [31] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] @@ -1756,29 +1756,29 @@ Calls in [] to 0:main Calls in [main] to 1:lvalue 2:rvalue 3:rvaluevar 4:lvaluevar DOMINATORS -@BEGIN dominated by @BEGIN -@END dominated by @BEGIN @END -main dominated by @BEGIN main -main::@1 dominated by @BEGIN main::@1 main -main::@2 dominated by @BEGIN main::@2 main::@1 main -main::@3 dominated by @BEGIN main::@2 main::@1 main::@3 main -main::@return dominated by @BEGIN main::@2 main::@1 main::@3 main main::@return -lvaluevar dominated by @BEGIN main::@2 main::@1 main::@3 main lvaluevar -lvaluevar::@1 dominated by @BEGIN main::@2 main::@1 main::@3 main lvaluevar::@1 lvaluevar -lvaluevar::@return dominated by @BEGIN main::@2 main::@1 main::@3 main lvaluevar::@1 lvaluevar::@return lvaluevar -lvaluevar::@2 dominated by @BEGIN main::@2 main::@1 main::@3 main lvaluevar::@2 lvaluevar::@1 lvaluevar -rvaluevar dominated by rvaluevar @BEGIN main::@2 main::@1 main -rvaluevar::@1 dominated by rvaluevar @BEGIN main::@2 main::@1 main rvaluevar::@1 -rvaluevar::@return dominated by rvaluevar @BEGIN rvaluevar::@return main::@2 main::@1 main rvaluevar::@1 -rvaluevar::@2 dominated by rvaluevar @BEGIN main::@2 main::@1 main rvaluevar::@2 rvaluevar::@1 -rvalue dominated by @BEGIN main::@1 rvalue main -rvalue::@1 dominated by @BEGIN main::@1 rvalue::@1 rvalue main -rvalue::@return dominated by @BEGIN main::@1 rvalue::@1 rvalue main rvalue::@return -rvalue::@2 dominated by @BEGIN main::@1 rvalue::@1 rvalue rvalue::@2 main -lvalue dominated by @BEGIN main lvalue -lvalue::@1 dominated by @BEGIN lvalue::@1 main lvalue -lvalue::@return dominated by @BEGIN lvalue::@return lvalue::@1 main lvalue -lvalue::@2 dominated by @BEGIN lvalue::@1 lvalue::@2 main lvalue +@begin dominated by @begin +@end dominated by @end @begin +main dominated by @begin main +main::@1 dominated by @begin main::@1 main +main::@2 dominated by @begin main::@2 main::@1 main +main::@3 dominated by @begin main::@2 main::@1 main::@3 main +main::@return dominated by @begin main::@2 main::@1 main::@3 main main::@return +lvaluevar dominated by @begin main::@2 main::@1 main::@3 main lvaluevar +lvaluevar::@1 dominated by @begin main::@2 main::@1 main::@3 main lvaluevar::@1 lvaluevar +lvaluevar::@return dominated by @begin main::@2 main::@1 main::@3 main lvaluevar::@1 lvaluevar::@return lvaluevar +lvaluevar::@2 dominated by @begin main::@2 main::@1 main::@3 main lvaluevar::@2 lvaluevar::@1 lvaluevar +rvaluevar dominated by rvaluevar @begin main::@2 main::@1 main +rvaluevar::@1 dominated by rvaluevar @begin main::@2 main::@1 main rvaluevar::@1 +rvaluevar::@return dominated by rvaluevar @begin rvaluevar::@return main::@2 main::@1 main rvaluevar::@1 +rvaluevar::@2 dominated by rvaluevar @begin main::@2 main::@1 main rvaluevar::@2 rvaluevar::@1 +rvalue dominated by @begin main::@1 rvalue main +rvalue::@1 dominated by @begin main::@1 rvalue::@1 rvalue main +rvalue::@return dominated by @begin main::@1 rvalue::@1 rvalue main rvalue::@return +rvalue::@2 dominated by @begin main::@1 rvalue::@1 rvalue rvalue::@2 main +lvalue dominated by @begin main lvalue +lvalue::@1 dominated by @begin lvalue::@1 main lvalue +lvalue::@return dominated by lvalue::@return @begin lvalue::@1 main lvalue +lvalue::@2 dominated by @begin lvalue::@1 lvalue::@2 main lvalue Found back edge: Loop head: lvaluevar::@1 tails: lvaluevar::@2 blocks: null Found back edge: Loop head: rvaluevar::@1 tails: rvaluevar::@2 blocks: null @@ -1878,63 +1878,65 @@ Allocated zp byte:11 to zp byte:11 [ rvalue::b#0 ] Allocated zp byte:12 to zp byte:12 [ rvalue::b#1 ] Allocated zp byte:13 to zp byte:13 [ rvalue::b#2 ] INITIAL ASM -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main - jmp BEND -//SEG2 @END -BEND: + jmp bend +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call lvalue param-assignment [ ] - jsr lvalue - jmp main__B1 -//SEG5 main::@1 -main__B1: -//SEG6 [2] call rvalue param-assignment [ ] - jsr rvalue - jmp main__B2 -//SEG7 main::@2 -main__B2: -//SEG8 [3] call rvaluevar param-assignment [ ] - jsr rvaluevar - jmp main__B3 -//SEG9 main::@3 -main__B3: -//SEG10 [4] call lvaluevar param-assignment [ ] - jsr lvaluevar - jmp main__Breturn -//SEG11 main::@return -main__Breturn: -//SEG12 [5] return [ ] - rts +main: { + //SEG4 [1] call lvalue param-assignment [ ] + jsr lvalue + jmp b1 + //SEG5 main::@1 + b1: + //SEG6 [2] call rvalue param-assignment [ ] + jsr rvalue + jmp b2 + //SEG7 main::@2 + b2: + //SEG8 [3] call rvaluevar param-assignment [ ] + jsr rvaluevar + jmp b3 + //SEG9 main::@3 + b3: + //SEG10 [4] call lvaluevar param-assignment [ ] + jsr lvaluevar + jmp breturn + //SEG11 main::@return + breturn: + //SEG12 [5] return [ ] + rts +} //SEG13 lvaluevar -lvaluevar: -//SEG14 [6] phi from lvaluevar to lvaluevar::@1 -lvaluevar__B1_from_lvaluevar: -//SEG15 [6] phi (byte*) lvaluevar::screen#2 = (word) 1024 -- zpptrby1=cowo1 - lda #<$400 - sta $3 - lda #>$400 - sta $3+$1 -//SEG16 [6] phi (byte) lvaluevar::i#2 = (byte) 2 -- zpby1=coby1 - lda #$2 - sta $2 - jmp lvaluevar__B1 -//SEG17 lvaluevar::@1 -lvaluevar__B1: -//SEG18 [7] if((byte) lvaluevar::i#2<(byte) 10) goto lvaluevar::@2 [ lvaluevar::i#2 lvaluevar::screen#2 ] -- zpby1_lt_coby1_then_la1 - lda $2 - cmp #$a - bcc lvaluevar__B2 - jmp lvaluevar__Breturn -//SEG19 lvaluevar::@return -lvaluevar__Breturn: -//SEG20 [8] return [ ] - rts +lvaluevar: { + //SEG14 [6] phi from lvaluevar to lvaluevar::@1 + b1_from_lvaluevar: + //SEG15 [6] phi (byte*) lvaluevar::screen#2 = (word) 1024 -- zpptrby1=cowo1 + lda #<$400 + sta $3 + lda #>$400 + sta $3+$1 + //SEG16 [6] phi (byte) lvaluevar::i#2 = (byte) 2 -- zpby1=coby1 + lda #$2 + sta $2 + jmp b1 + //SEG17 lvaluevar::@1 + b1: + //SEG18 [7] if((byte) lvaluevar::i#2<(byte) 10) goto lvaluevar::@2 [ lvaluevar::i#2 lvaluevar::screen#2 ] -- zpby1_lt_coby1_then_la1 + lda $2 + cmp #$a + bcc b2 + jmp breturn + //SEG19 lvaluevar::@return + breturn: + //SEG20 [8] return [ ] + rts +} //SEG21 lvaluevar::@2 -lvaluevar__B2: +b2: //SEG22 [9] *((byte*) lvaluevar::screen#2) ← (byte) 4 [ lvaluevar::i#2 lvaluevar::screen#2 ] -- _star_zpptrby1=coby1 ldy #$0 lda #$4 @@ -1947,36 +1949,37 @@ lvaluevar__B2: //SEG24 [11] (byte) lvaluevar::i#1 ← ++ (byte) lvaluevar::i#2 [ lvaluevar::i#1 lvaluevar::screen#1 ] -- zpby1=_inc_zpby1 inc $2 //SEG25 [6] phi from lvaluevar::@2 to lvaluevar::@1 -lvaluevar__B1_from_B2: +b1_from_b2: //SEG26 [6] phi (byte*) lvaluevar::screen#2 = (byte*) lvaluevar::screen#1 -- register_copy //SEG27 [6] phi (byte) lvaluevar::i#2 = (byte) lvaluevar::i#1 -- register_copy - jmp lvaluevar__B1 + jmp b1 //SEG28 rvaluevar -rvaluevar: -//SEG29 [12] phi from rvaluevar to rvaluevar::@1 -rvaluevar__B1_from_rvaluevar: -//SEG30 [12] phi (byte*) rvaluevar::screen#2 = (word) 1024 -- zpptrby1=cowo1 - lda #<$400 - sta $6 - lda #>$400 - sta $6+$1 -//SEG31 [12] phi (byte) rvaluevar::i#2 = (byte) 2 -- zpby1=coby1 - lda #$2 - sta $5 - jmp rvaluevar__B1 -//SEG32 rvaluevar::@1 -rvaluevar__B1: -//SEG33 [13] if((byte) rvaluevar::i#2<(byte) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] -- zpby1_lt_coby1_then_la1 - lda $5 - cmp #$a - bcc rvaluevar__B2 - jmp rvaluevar__Breturn -//SEG34 rvaluevar::@return -rvaluevar__Breturn: -//SEG35 [14] return [ ] - rts +rvaluevar: { + //SEG29 [12] phi from rvaluevar to rvaluevar::@1 + b1_from_rvaluevar: + //SEG30 [12] phi (byte*) rvaluevar::screen#2 = (word) 1024 -- zpptrby1=cowo1 + lda #<$400 + sta $6 + lda #>$400 + sta $6+$1 + //SEG31 [12] phi (byte) rvaluevar::i#2 = (byte) 2 -- zpby1=coby1 + lda #$2 + sta $5 + jmp b1 + //SEG32 rvaluevar::@1 + b1: + //SEG33 [13] if((byte) rvaluevar::i#2<(byte) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] -- zpby1_lt_coby1_then_la1 + lda $5 + cmp #$a + bcc b2 + jmp breturn + //SEG34 rvaluevar::@return + breturn: + //SEG35 [14] return [ ] + rts +} //SEG36 rvaluevar::@2 -rvaluevar__B2: +b2: //SEG37 [15] (byte) rvaluevar::b#0 ← * (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#2 ] -- zpby1=_star_zpptrby1 ldy #$0 lda ($6),y @@ -1989,37 +1992,38 @@ rvaluevar__B2: //SEG39 [17] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 rvaluevar::screen#1 ] -- zpby1=_inc_zpby1 inc $5 //SEG40 [12] phi from rvaluevar::@2 to rvaluevar::@1 -rvaluevar__B1_from_B2: +b1_from_b2: //SEG41 [12] phi (byte*) rvaluevar::screen#2 = (byte*) rvaluevar::screen#1 -- register_copy //SEG42 [12] phi (byte) rvaluevar::i#2 = (byte) rvaluevar::i#1 -- register_copy - jmp rvaluevar__B1 + jmp b1 //SEG43 rvalue -rvalue: -//SEG44 [18] (byte) rvalue::b#0 ← * (word) 1024 [ ] -- zpby1=_star_cowo1 - lda $400 - sta $b -//SEG45 [19] (byte) rvalue::b#1 ← * (word) 1025 [ ] -- zpby1=_star_cowo1 - lda $401 - sta $c -//SEG46 [20] phi from rvalue to rvalue::@1 -rvalue__B1_from_rvalue: -//SEG47 [20] phi (byte) rvalue::i#2 = (byte) 2 -- zpby1=coby1 - lda #$2 - sta $8 - jmp rvalue__B1 -//SEG48 rvalue::@1 -rvalue__B1: -//SEG49 [21] if((byte) rvalue::i#2<(byte) 10) goto rvalue::@2 [ rvalue::i#2 ] -- zpby1_lt_coby1_then_la1 - lda $8 - cmp #$a - bcc rvalue__B2 - jmp rvalue__Breturn -//SEG50 rvalue::@return -rvalue__Breturn: -//SEG51 [22] return [ ] - rts +rvalue: { + //SEG44 [18] (byte) rvalue::b#0 ← * (word) 1024 [ ] -- zpby1=_star_cowo1 + lda $400 + sta $b + //SEG45 [19] (byte) rvalue::b#1 ← * (word) 1025 [ ] -- zpby1=_star_cowo1 + lda $401 + sta $c + //SEG46 [20] phi from rvalue to rvalue::@1 + b1_from_rvalue: + //SEG47 [20] phi (byte) rvalue::i#2 = (byte) 2 -- zpby1=coby1 + lda #$2 + sta $8 + jmp b1 + //SEG48 rvalue::@1 + b1: + //SEG49 [21] if((byte) rvalue::i#2<(byte) 10) goto rvalue::@2 [ rvalue::i#2 ] -- zpby1_lt_coby1_then_la1 + lda $8 + cmp #$a + bcc b2 + jmp breturn + //SEG50 rvalue::@return + breturn: + //SEG51 [22] return [ ] + rts +} //SEG52 rvalue::@2 -rvalue__B2: +b2: //SEG53 [23] (byte) rvalue::b#2 ← (word) 1024 *idx (byte) rvalue::i#2 [ rvalue::i#2 ] -- zpby1=cowo1_staridx_zpby2 ldx $8 lda $400,x @@ -2027,36 +2031,37 @@ rvalue__B2: //SEG54 [24] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] -- zpby1=_inc_zpby1 inc $8 //SEG55 [20] phi from rvalue::@2 to rvalue::@1 -rvalue__B1_from_B2: +b1_from_b2: //SEG56 [20] phi (byte) rvalue::i#2 = (byte) rvalue::i#1 -- register_copy - jmp rvalue__B1 + jmp b1 //SEG57 lvalue -lvalue: -//SEG58 [25] *((word) 1024) ← (byte) 1 [ ] -- _star_cowo1=coby2 - lda #$1 - sta $400 -//SEG59 [26] *((word) 1025) ← (byte) 2 [ ] -- _star_cowo1=coby2 - lda #$2 - sta $401 -//SEG60 [27] phi from lvalue to lvalue::@1 -lvalue__B1_from_lvalue: -//SEG61 [27] phi (byte) lvalue::i#2 = (byte) 2 -- zpby1=coby1 - lda #$2 - sta $9 - jmp lvalue__B1 -//SEG62 lvalue::@1 -lvalue__B1: -//SEG63 [28] if((byte) lvalue::i#2<(byte) 10) goto lvalue::@2 [ lvalue::i#2 ] -- zpby1_lt_coby1_then_la1 - lda $9 - cmp #$a - bcc lvalue__B2 - jmp lvalue__Breturn -//SEG64 lvalue::@return -lvalue__Breturn: -//SEG65 [29] return [ ] - rts +lvalue: { + //SEG58 [25] *((word) 1024) ← (byte) 1 [ ] -- _star_cowo1=coby2 + lda #$1 + sta $400 + //SEG59 [26] *((word) 1025) ← (byte) 2 [ ] -- _star_cowo1=coby2 + lda #$2 + sta $401 + //SEG60 [27] phi from lvalue to lvalue::@1 + b1_from_lvalue: + //SEG61 [27] phi (byte) lvalue::i#2 = (byte) 2 -- zpby1=coby1 + lda #$2 + sta $9 + jmp b1 + //SEG62 lvalue::@1 + b1: + //SEG63 [28] if((byte) lvalue::i#2<(byte) 10) goto lvalue::@2 [ lvalue::i#2 ] -- zpby1_lt_coby1_then_la1 + lda $9 + cmp #$a + bcc b2 + jmp breturn + //SEG64 lvalue::@return + breturn: + //SEG65 [29] return [ ] + rts +} //SEG66 lvalue::@2 -lvalue__B2: +b2: //SEG67 [30] *((word) 1024 + (byte) lvalue::i#2) ← (byte) 3 [ lvalue::i#2 ] -- cowo1_staridx_zpby1=coby2 lda #$3 ldx $9 @@ -2064,9 +2069,9 @@ lvalue__B2: //SEG68 [31] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] -- zpby1=_inc_zpby1 inc $9 //SEG69 [27] phi from lvalue::@2 to lvalue::@1 -lvalue__B1_from_B2: +b1_from_b2: //SEG70 [27] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 -- register_copy - jmp lvalue__B1 + jmp b1 Statement [9] *((byte*) lvaluevar::screen#2) ← (byte) 4 [ 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 byte:2 [ lvaluevar::i#2 lvaluevar::i#1 ] @@ -2111,69 +2116,71 @@ Uplifting [main] best 1575 combination Uplifting [] best 1575 combination Coalescing zero page register [ zp ptr byte:3 [ lvaluevar::screen#2 lvaluevar::screen#1 ] ] with [ zp ptr byte:6 [ rvaluevar::screen#2 rvaluevar::screen#1 ] ] Re-allocated ZP register from zp ptr byte:3 to zp ptr byte:2 -Removing instruction jmp BEND -Removing instruction jmp main__B1 -Removing instruction jmp main__B2 -Removing instruction jmp main__B3 -Removing instruction jmp main__Breturn -Removing instruction jmp lvaluevar__B1 -Removing instruction jmp lvaluevar__Breturn -Removing instruction jmp rvaluevar__B1 -Removing instruction jmp rvaluevar__Breturn -Removing instruction jmp rvalue__B1 -Removing instruction jmp rvalue__Breturn -Removing instruction jmp lvalue__B1 -Removing instruction jmp lvalue__Breturn +Removing instruction jmp bend +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b3 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp breturn Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call lvalue param-assignment [ ] - jsr lvalue -//SEG5 main::@1 -main__B1: -//SEG6 [2] call rvalue param-assignment [ ] - jsr rvalue -//SEG7 main::@2 -main__B2: -//SEG8 [3] call rvaluevar param-assignment [ ] - jsr rvaluevar -//SEG9 main::@3 -main__B3: -//SEG10 [4] call lvaluevar param-assignment [ ] - jsr lvaluevar -//SEG11 main::@return -main__Breturn: -//SEG12 [5] return [ ] - rts +main: { + //SEG4 [1] call lvalue param-assignment [ ] + jsr lvalue + //SEG5 main::@1 + b1: + //SEG6 [2] call rvalue param-assignment [ ] + jsr rvalue + //SEG7 main::@2 + b2: + //SEG8 [3] call rvaluevar param-assignment [ ] + jsr rvaluevar + //SEG9 main::@3 + b3: + //SEG10 [4] call lvaluevar param-assignment [ ] + jsr lvaluevar + //SEG11 main::@return + breturn: + //SEG12 [5] return [ ] + rts +} //SEG13 lvaluevar -lvaluevar: -//SEG14 [6] phi from lvaluevar to lvaluevar::@1 -lvaluevar__B1_from_lvaluevar: -//SEG15 [6] phi (byte*) lvaluevar::screen#2 = (word) 1024 -- zpptrby1=cowo1 - lda #<$400 - sta $2 - lda #>$400 - sta $2+$1 -//SEG16 [6] phi (byte) lvaluevar::i#2 = (byte) 2 -- xby=coby1 - ldx #$2 -//SEG17 lvaluevar::@1 -lvaluevar__B1: -//SEG18 [7] if((byte) lvaluevar::i#2<(byte) 10) goto lvaluevar::@2 [ lvaluevar::i#2 lvaluevar::screen#2 ] -- xby_lt_coby1_then_la1 - cpx #$a - bcc lvaluevar__B2 -//SEG19 lvaluevar::@return -lvaluevar__Breturn: -//SEG20 [8] return [ ] - rts +lvaluevar: { + //SEG14 [6] phi from lvaluevar to lvaluevar::@1 + b1_from_lvaluevar: + //SEG15 [6] phi (byte*) lvaluevar::screen#2 = (word) 1024 -- zpptrby1=cowo1 + lda #<$400 + sta $2 + lda #>$400 + sta $2+$1 + //SEG16 [6] phi (byte) lvaluevar::i#2 = (byte) 2 -- xby=coby1 + ldx #$2 + //SEG17 lvaluevar::@1 + b1: + //SEG18 [7] if((byte) lvaluevar::i#2<(byte) 10) goto lvaluevar::@2 [ lvaluevar::i#2 lvaluevar::screen#2 ] -- xby_lt_coby1_then_la1 + cpx #$a + bcc b2 + //SEG19 lvaluevar::@return + breturn: + //SEG20 [8] return [ ] + rts +} //SEG21 lvaluevar::@2 -lvaluevar__B2: +b2: //SEG22 [9] *((byte*) lvaluevar::screen#2) ← (byte) 4 [ lvaluevar::i#2 lvaluevar::screen#2 ] -- _star_zpptrby1=coby1 ldy #$0 lda #$4 @@ -2186,32 +2193,33 @@ lvaluevar__B2: //SEG24 [11] (byte) lvaluevar::i#1 ← ++ (byte) lvaluevar::i#2 [ lvaluevar::i#1 lvaluevar::screen#1 ] -- xby=_inc_xby inx //SEG25 [6] phi from lvaluevar::@2 to lvaluevar::@1 -lvaluevar__B1_from_B2: +b1_from_b2: //SEG26 [6] phi (byte*) lvaluevar::screen#2 = (byte*) lvaluevar::screen#1 -- register_copy //SEG27 [6] phi (byte) lvaluevar::i#2 = (byte) lvaluevar::i#1 -- register_copy - jmp lvaluevar__B1 + jmp b1 //SEG28 rvaluevar -rvaluevar: -//SEG29 [12] phi from rvaluevar to rvaluevar::@1 -rvaluevar__B1_from_rvaluevar: -//SEG30 [12] phi (byte*) rvaluevar::screen#2 = (word) 1024 -- zpptrby1=cowo1 - lda #<$400 - sta $2 - lda #>$400 - sta $2+$1 -//SEG31 [12] phi (byte) rvaluevar::i#2 = (byte) 2 -- xby=coby1 - ldx #$2 -//SEG32 rvaluevar::@1 -rvaluevar__B1: -//SEG33 [13] if((byte) rvaluevar::i#2<(byte) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] -- xby_lt_coby1_then_la1 - cpx #$a - bcc rvaluevar__B2 -//SEG34 rvaluevar::@return -rvaluevar__Breturn: -//SEG35 [14] return [ ] - rts +rvaluevar: { + //SEG29 [12] phi from rvaluevar to rvaluevar::@1 + b1_from_rvaluevar: + //SEG30 [12] phi (byte*) rvaluevar::screen#2 = (word) 1024 -- zpptrby1=cowo1 + lda #<$400 + sta $2 + lda #>$400 + sta $2+$1 + //SEG31 [12] phi (byte) rvaluevar::i#2 = (byte) 2 -- xby=coby1 + ldx #$2 + //SEG32 rvaluevar::@1 + b1: + //SEG33 [13] if((byte) rvaluevar::i#2<(byte) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] -- xby_lt_coby1_then_la1 + cpx #$a + bcc b2 + //SEG34 rvaluevar::@return + breturn: + //SEG35 [14] return [ ] + rts +} //SEG36 rvaluevar::@2 -rvaluevar__B2: +b2: //SEG37 [15] (byte) rvaluevar::b#0 ← * (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#2 ] -- aby=_star_zpptrby1 ldy #$0 lda ($2),y @@ -2223,75 +2231,77 @@ rvaluevar__B2: //SEG39 [17] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 rvaluevar::screen#1 ] -- xby=_inc_xby inx //SEG40 [12] phi from rvaluevar::@2 to rvaluevar::@1 -rvaluevar__B1_from_B2: +b1_from_b2: //SEG41 [12] phi (byte*) rvaluevar::screen#2 = (byte*) rvaluevar::screen#1 -- register_copy //SEG42 [12] phi (byte) rvaluevar::i#2 = (byte) rvaluevar::i#1 -- register_copy - jmp rvaluevar__B1 + jmp b1 //SEG43 rvalue -rvalue: -//SEG44 [18] (byte) rvalue::b#0 ← * (word) 1024 [ ] -- aby=_star_cowo1 - lda $400 -//SEG45 [19] (byte) rvalue::b#1 ← * (word) 1025 [ ] -- aby=_star_cowo1 - lda $401 -//SEG46 [20] phi from rvalue to rvalue::@1 -rvalue__B1_from_rvalue: -//SEG47 [20] phi (byte) rvalue::i#2 = (byte) 2 -- xby=coby1 - ldx #$2 -//SEG48 rvalue::@1 -rvalue__B1: -//SEG49 [21] if((byte) rvalue::i#2<(byte) 10) goto rvalue::@2 [ rvalue::i#2 ] -- xby_lt_coby1_then_la1 - cpx #$a - bcc rvalue__B2 -//SEG50 rvalue::@return -rvalue__Breturn: -//SEG51 [22] return [ ] - rts +rvalue: { + //SEG44 [18] (byte) rvalue::b#0 ← * (word) 1024 [ ] -- aby=_star_cowo1 + lda $400 + //SEG45 [19] (byte) rvalue::b#1 ← * (word) 1025 [ ] -- aby=_star_cowo1 + lda $401 + //SEG46 [20] phi from rvalue to rvalue::@1 + b1_from_rvalue: + //SEG47 [20] phi (byte) rvalue::i#2 = (byte) 2 -- xby=coby1 + ldx #$2 + //SEG48 rvalue::@1 + b1: + //SEG49 [21] if((byte) rvalue::i#2<(byte) 10) goto rvalue::@2 [ rvalue::i#2 ] -- xby_lt_coby1_then_la1 + cpx #$a + bcc b2 + //SEG50 rvalue::@return + breturn: + //SEG51 [22] return [ ] + rts +} //SEG52 rvalue::@2 -rvalue__B2: +b2: //SEG53 [23] (byte) rvalue::b#2 ← (word) 1024 *idx (byte) rvalue::i#2 [ rvalue::i#2 ] -- aby=cowo1_staridx_xby lda $400,x //SEG54 [24] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] -- xby=_inc_xby inx //SEG55 [20] phi from rvalue::@2 to rvalue::@1 -rvalue__B1_from_B2: +b1_from_b2: //SEG56 [20] phi (byte) rvalue::i#2 = (byte) rvalue::i#1 -- register_copy - jmp rvalue__B1 + jmp b1 //SEG57 lvalue -lvalue: -//SEG58 [25] *((word) 1024) ← (byte) 1 [ ] -- _star_cowo1=coby2 - lda #$1 - sta $400 -//SEG59 [26] *((word) 1025) ← (byte) 2 [ ] -- _star_cowo1=coby2 - lda #$2 - sta $401 -//SEG60 [27] phi from lvalue to lvalue::@1 -lvalue__B1_from_lvalue: -//SEG61 [27] phi (byte) lvalue::i#2 = (byte) 2 -- xby=coby1 - ldx #$2 -//SEG62 lvalue::@1 -lvalue__B1: -//SEG63 [28] if((byte) lvalue::i#2<(byte) 10) goto lvalue::@2 [ lvalue::i#2 ] -- xby_lt_coby1_then_la1 - cpx #$a - bcc lvalue__B2 -//SEG64 lvalue::@return -lvalue__Breturn: -//SEG65 [29] return [ ] - rts +lvalue: { + //SEG58 [25] *((word) 1024) ← (byte) 1 [ ] -- _star_cowo1=coby2 + lda #$1 + sta $400 + //SEG59 [26] *((word) 1025) ← (byte) 2 [ ] -- _star_cowo1=coby2 + lda #$2 + sta $401 + //SEG60 [27] phi from lvalue to lvalue::@1 + b1_from_lvalue: + //SEG61 [27] phi (byte) lvalue::i#2 = (byte) 2 -- xby=coby1 + ldx #$2 + //SEG62 lvalue::@1 + b1: + //SEG63 [28] if((byte) lvalue::i#2<(byte) 10) goto lvalue::@2 [ lvalue::i#2 ] -- xby_lt_coby1_then_la1 + cpx #$a + bcc b2 + //SEG64 lvalue::@return + breturn: + //SEG65 [29] return [ ] + rts +} //SEG66 lvalue::@2 -lvalue__B2: +b2: //SEG67 [30] *((word) 1024 + (byte) lvalue::i#2) ← (byte) 3 [ lvalue::i#2 ] -- cowo1_staridx_xby=coby2 lda #$3 sta $400,x //SEG68 [31] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] -- xby=_inc_xby inx //SEG69 [27] phi from lvalue::@2 to lvalue::@1 -lvalue__B1_from_B2: +b1_from_b2: //SEG70 [27] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 -- register_copy - jmp lvalue__B1 + jmp b1 FINAL SYMBOL TABLE -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (void()) lvalue() (label) lvalue::@1 (label) lvalue::@2 @@ -2352,54 +2362,56 @@ reg byte a [ rvalue::b#1 ] reg byte a [ rvalue::b#2 ] FINAL CODE -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call lvalue param-assignment [ ] - jsr lvalue -//SEG5 main::@1 -main__B1: -//SEG6 [2] call rvalue param-assignment [ ] - jsr rvalue -//SEG7 main::@2 -main__B2: -//SEG8 [3] call rvaluevar param-assignment [ ] - jsr rvaluevar -//SEG9 main::@3 -main__B3: -//SEG10 [4] call lvaluevar param-assignment [ ] - jsr lvaluevar -//SEG11 main::@return -main__Breturn: -//SEG12 [5] return [ ] - rts +main: { + //SEG4 [1] call lvalue param-assignment [ ] + jsr lvalue + //SEG5 main::@1 + b1: + //SEG6 [2] call rvalue param-assignment [ ] + jsr rvalue + //SEG7 main::@2 + b2: + //SEG8 [3] call rvaluevar param-assignment [ ] + jsr rvaluevar + //SEG9 main::@3 + b3: + //SEG10 [4] call lvaluevar param-assignment [ ] + jsr lvaluevar + //SEG11 main::@return + breturn: + //SEG12 [5] return [ ] + rts +} //SEG13 lvaluevar -lvaluevar: -//SEG14 [6] phi from lvaluevar to lvaluevar::@1 -lvaluevar__B1_from_lvaluevar: -//SEG15 [6] phi (byte*) lvaluevar::screen#2 = (word) 1024 -- zpptrby1=cowo1 - lda #<$400 - sta $2 - lda #>$400 - sta $2+$1 -//SEG16 [6] phi (byte) lvaluevar::i#2 = (byte) 2 -- xby=coby1 - ldx #$2 -//SEG17 lvaluevar::@1 -lvaluevar__B1: -//SEG18 [7] if((byte) lvaluevar::i#2<(byte) 10) goto lvaluevar::@2 [ lvaluevar::i#2 lvaluevar::screen#2 ] -- xby_lt_coby1_then_la1 - cpx #$a - bcc lvaluevar__B2 -//SEG19 lvaluevar::@return -lvaluevar__Breturn: -//SEG20 [8] return [ ] - rts +lvaluevar: { + //SEG14 [6] phi from lvaluevar to lvaluevar::@1 + b1_from_lvaluevar: + //SEG15 [6] phi (byte*) lvaluevar::screen#2 = (word) 1024 -- zpptrby1=cowo1 + lda #<$400 + sta $2 + lda #>$400 + sta $2+$1 + //SEG16 [6] phi (byte) lvaluevar::i#2 = (byte) 2 -- xby=coby1 + ldx #$2 + //SEG17 lvaluevar::@1 + b1: + //SEG18 [7] if((byte) lvaluevar::i#2<(byte) 10) goto lvaluevar::@2 [ lvaluevar::i#2 lvaluevar::screen#2 ] -- xby_lt_coby1_then_la1 + cpx #$a + bcc b2 + //SEG19 lvaluevar::@return + breturn: + //SEG20 [8] return [ ] + rts +} //SEG21 lvaluevar::@2 -lvaluevar__B2: +b2: //SEG22 [9] *((byte*) lvaluevar::screen#2) ← (byte) 4 [ lvaluevar::i#2 lvaluevar::screen#2 ] -- _star_zpptrby1=coby1 ldy #$0 lda #$4 @@ -2412,32 +2424,33 @@ lvaluevar__B2: //SEG24 [11] (byte) lvaluevar::i#1 ← ++ (byte) lvaluevar::i#2 [ lvaluevar::i#1 lvaluevar::screen#1 ] -- xby=_inc_xby inx //SEG25 [6] phi from lvaluevar::@2 to lvaluevar::@1 -lvaluevar__B1_from_B2: +b1_from_b2: //SEG26 [6] phi (byte*) lvaluevar::screen#2 = (byte*) lvaluevar::screen#1 -- register_copy //SEG27 [6] phi (byte) lvaluevar::i#2 = (byte) lvaluevar::i#1 -- register_copy - jmp lvaluevar__B1 + jmp b1 //SEG28 rvaluevar -rvaluevar: -//SEG29 [12] phi from rvaluevar to rvaluevar::@1 -rvaluevar__B1_from_rvaluevar: -//SEG30 [12] phi (byte*) rvaluevar::screen#2 = (word) 1024 -- zpptrby1=cowo1 - lda #<$400 - sta $2 - lda #>$400 - sta $2+$1 -//SEG31 [12] phi (byte) rvaluevar::i#2 = (byte) 2 -- xby=coby1 - ldx #$2 -//SEG32 rvaluevar::@1 -rvaluevar__B1: -//SEG33 [13] if((byte) rvaluevar::i#2<(byte) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] -- xby_lt_coby1_then_la1 - cpx #$a - bcc rvaluevar__B2 -//SEG34 rvaluevar::@return -rvaluevar__Breturn: -//SEG35 [14] return [ ] - rts +rvaluevar: { + //SEG29 [12] phi from rvaluevar to rvaluevar::@1 + b1_from_rvaluevar: + //SEG30 [12] phi (byte*) rvaluevar::screen#2 = (word) 1024 -- zpptrby1=cowo1 + lda #<$400 + sta $2 + lda #>$400 + sta $2+$1 + //SEG31 [12] phi (byte) rvaluevar::i#2 = (byte) 2 -- xby=coby1 + ldx #$2 + //SEG32 rvaluevar::@1 + b1: + //SEG33 [13] if((byte) rvaluevar::i#2<(byte) 10) goto rvaluevar::@2 [ rvaluevar::i#2 rvaluevar::screen#2 ] -- xby_lt_coby1_then_la1 + cpx #$a + bcc b2 + //SEG34 rvaluevar::@return + breturn: + //SEG35 [14] return [ ] + rts +} //SEG36 rvaluevar::@2 -rvaluevar__B2: +b2: //SEG37 [15] (byte) rvaluevar::b#0 ← * (byte*) rvaluevar::screen#2 [ rvaluevar::i#2 rvaluevar::screen#2 ] -- aby=_star_zpptrby1 ldy #$0 lda ($2),y @@ -2449,69 +2462,71 @@ rvaluevar__B2: //SEG39 [17] (byte) rvaluevar::i#1 ← ++ (byte) rvaluevar::i#2 [ rvaluevar::i#1 rvaluevar::screen#1 ] -- xby=_inc_xby inx //SEG40 [12] phi from rvaluevar::@2 to rvaluevar::@1 -rvaluevar__B1_from_B2: +b1_from_b2: //SEG41 [12] phi (byte*) rvaluevar::screen#2 = (byte*) rvaluevar::screen#1 -- register_copy //SEG42 [12] phi (byte) rvaluevar::i#2 = (byte) rvaluevar::i#1 -- register_copy - jmp rvaluevar__B1 + jmp b1 //SEG43 rvalue -rvalue: -//SEG44 [18] (byte) rvalue::b#0 ← * (word) 1024 [ ] -- aby=_star_cowo1 - lda $400 -//SEG45 [19] (byte) rvalue::b#1 ← * (word) 1025 [ ] -- aby=_star_cowo1 - lda $401 -//SEG46 [20] phi from rvalue to rvalue::@1 -rvalue__B1_from_rvalue: -//SEG47 [20] phi (byte) rvalue::i#2 = (byte) 2 -- xby=coby1 - ldx #$2 -//SEG48 rvalue::@1 -rvalue__B1: -//SEG49 [21] if((byte) rvalue::i#2<(byte) 10) goto rvalue::@2 [ rvalue::i#2 ] -- xby_lt_coby1_then_la1 - cpx #$a - bcc rvalue__B2 -//SEG50 rvalue::@return -rvalue__Breturn: -//SEG51 [22] return [ ] - rts +rvalue: { + //SEG44 [18] (byte) rvalue::b#0 ← * (word) 1024 [ ] -- aby=_star_cowo1 + lda $400 + //SEG45 [19] (byte) rvalue::b#1 ← * (word) 1025 [ ] -- aby=_star_cowo1 + lda $401 + //SEG46 [20] phi from rvalue to rvalue::@1 + b1_from_rvalue: + //SEG47 [20] phi (byte) rvalue::i#2 = (byte) 2 -- xby=coby1 + ldx #$2 + //SEG48 rvalue::@1 + b1: + //SEG49 [21] if((byte) rvalue::i#2<(byte) 10) goto rvalue::@2 [ rvalue::i#2 ] -- xby_lt_coby1_then_la1 + cpx #$a + bcc b2 + //SEG50 rvalue::@return + breturn: + //SEG51 [22] return [ ] + rts +} //SEG52 rvalue::@2 -rvalue__B2: +b2: //SEG53 [23] (byte) rvalue::b#2 ← (word) 1024 *idx (byte) rvalue::i#2 [ rvalue::i#2 ] -- aby=cowo1_staridx_xby lda $400,x //SEG54 [24] (byte) rvalue::i#1 ← ++ (byte) rvalue::i#2 [ rvalue::i#1 ] -- xby=_inc_xby inx //SEG55 [20] phi from rvalue::@2 to rvalue::@1 -rvalue__B1_from_B2: +b1_from_b2: //SEG56 [20] phi (byte) rvalue::i#2 = (byte) rvalue::i#1 -- register_copy - jmp rvalue__B1 + jmp b1 //SEG57 lvalue -lvalue: -//SEG58 [25] *((word) 1024) ← (byte) 1 [ ] -- _star_cowo1=coby2 - lda #$1 - sta $400 -//SEG59 [26] *((word) 1025) ← (byte) 2 [ ] -- _star_cowo1=coby2 - lda #$2 - sta $401 -//SEG60 [27] phi from lvalue to lvalue::@1 -lvalue__B1_from_lvalue: -//SEG61 [27] phi (byte) lvalue::i#2 = (byte) 2 -- xby=coby1 - ldx #$2 -//SEG62 lvalue::@1 -lvalue__B1: -//SEG63 [28] if((byte) lvalue::i#2<(byte) 10) goto lvalue::@2 [ lvalue::i#2 ] -- xby_lt_coby1_then_la1 - cpx #$a - bcc lvalue__B2 -//SEG64 lvalue::@return -lvalue__Breturn: -//SEG65 [29] return [ ] - rts +lvalue: { + //SEG58 [25] *((word) 1024) ← (byte) 1 [ ] -- _star_cowo1=coby2 + lda #$1 + sta $400 + //SEG59 [26] *((word) 1025) ← (byte) 2 [ ] -- _star_cowo1=coby2 + lda #$2 + sta $401 + //SEG60 [27] phi from lvalue to lvalue::@1 + b1_from_lvalue: + //SEG61 [27] phi (byte) lvalue::i#2 = (byte) 2 -- xby=coby1 + ldx #$2 + //SEG62 lvalue::@1 + b1: + //SEG63 [28] if((byte) lvalue::i#2<(byte) 10) goto lvalue::@2 [ lvalue::i#2 ] -- xby_lt_coby1_then_la1 + cpx #$a + bcc b2 + //SEG64 lvalue::@return + breturn: + //SEG65 [29] return [ ] + rts +} //SEG66 lvalue::@2 -lvalue__B2: +b2: //SEG67 [30] *((word) 1024 + (byte) lvalue::i#2) ← (byte) 3 [ lvalue::i#2 ] -- cowo1_staridx_xby=coby2 lda #$3 sta $400,x //SEG68 [31] (byte) lvalue::i#1 ← ++ (byte) lvalue::i#2 [ lvalue::i#1 ] -- xby=_inc_xby inx //SEG69 [27] phi from lvalue::@2 to lvalue::@1 -lvalue__B1_from_B2: +b1_from_b2: //SEG70 [27] phi (byte) lvalue::i#2 = (byte) lvalue::i#1 -- register_copy - jmp lvalue__B1 + jmp b1 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.sym b/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.sym index befb3faa1..6974617bc 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.sym +++ b/src/main/java/dk/camelot64/kickc/test/ref/ptrtest.sym @@ -1,5 +1,5 @@ -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (void()) lvalue() (label) lvalue::@1 (label) lvalue::@2 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.asm b/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.asm index caeafc91e..7446a9104 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.asm @@ -1,16 +1,17 @@ -BBEGIN: +bbegin: jsr main -BEND: -main: -main__B1_from_main: - ldx #$2 -main__B1: - cpx #$a - bcc main__B2 -main__Breturn: - rts -main__B2: +bend: +main: { + b1_from_main: + ldx #$2 + b1: + cpx #$a + bcc b2 + breturn: + rts +} +b2: lda $400,x inx -main__B1_from_B2: - jmp main__B1 +b1_from_b2: + jmp b1 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.cfg b/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.cfg index 8b99c36d3..36c1fceac 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.cfg +++ b/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.cfg @@ -1,8 +1,8 @@ -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@2 [1] (byte) main::i#2 ← phi( main/(byte) 2 main::@2/(byte) main::i#1 ) [ main::i#2 ] @@ -10,7 +10,7 @@ main::@1: from main main::@2 to:main::@return main::@return: from main::@1 [3] return [ ] - to:@RETURN + to:@return main::@2: from main::@1 [4] (byte) main::b#0 ← (word) 1024 *idx (byte) main::i#2 [ main::i#2 ] [5] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] diff --git a/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.log b/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.log index 017b02b61..f477b7b51 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.log @@ -51,7 +51,7 @@ SYMBOLS (byte) main::i INITIAL CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (void~) $0 ← call main to:@1 main: from @@ -77,10 +77,10 @@ main::@6: from to:main::@3 main::@return: from main::@3 return - to:@RETURN -@1: from @BEGIN - to:@END -@END: from @1 + to:@return +@1: from @begin + to:@end +@end: from @1 Removing empty block main::@4 Removing empty block main::@3 @@ -88,9 +88,9 @@ Removing empty block main::@5 Removing empty block main::@6 Removing empty block @1 CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (void~) $0 ← call main - to:@END + to:@end main: from (byte[1024]) main::SCREEN ← (word) 1024 (byte) main::i ← (byte) 2 @@ -106,18 +106,18 @@ main::@2: from main::@1 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin PROCEDURE MODIFY VARIABLE ANALYSIS CONTROL FLOW GRAPH WITH ASSIGNMENT CALL -@BEGIN: from +@begin: from call main param-assignment to:@2 -@2: from @BEGIN - to:@END -main: from @BEGIN +@2: from @begin + to:@end +main: from @begin (byte[1024]) main::SCREEN ← (word) 1024 (byte) main::i ← (byte) 2 to:main::@1 @@ -132,18 +132,18 @@ main::@2: from main::@1 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @2 + to:@return +@end: from @2 Completing Phi functions... Completing Phi functions... CONTROL FLOW GRAPH SSA -@BEGIN: from +@begin: from call main param-assignment to:@2 -@2: from @BEGIN - to:@END -main: from @BEGIN +@2: from @begin + to:@end +main: from @begin (byte[1024]) main::SCREEN#0 ← (word) 1024 (byte) main::i#0 ← (byte) 2 to:main::@1 @@ -162,16 +162,16 @@ main::@2: from main::@1 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @2 + to:@return +@end: from @2 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN -@BEGIN: from +@begin: from call main param-assignment to:@2 -@2: from @BEGIN - to:@END -main: from @BEGIN +@2: from @begin + to:@end +main: from @begin (byte[1024]) main::SCREEN#0 ← (word) 1024 (byte) main::i#0 ← (byte) 2 to:main::@1 @@ -190,16 +190,16 @@ main::@2: from main::@1 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @2 + to:@return +@end: from @2 Culled Empty Block (label) @2 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin (byte[1024]) main::SCREEN#0 ← (word) 1024 (byte) main::i#0 ← (byte) 2 to:main::@1 @@ -218,17 +218,17 @@ main::@2: from main::@1 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte[1024]) main::SCREEN#0 (word) 1024 Constant (byte) main::i#0 (byte) 2 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@2 (byte[1024]) main::SCREEN#2 ← phi( main/(word) 1024 main::@2/(byte[1024]) main::SCREEN#1 ) @@ -245,18 +245,18 @@ main::@2: from main::@1 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Alias (byte[1024]) main::SCREEN#1 = (byte[1024]) main::SCREEN#2 Alias (byte) main::i#2 = (byte) main::i#3 Alias (byte) main::b#0 = (byte~) main::$1 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@2 (byte[1024]) main::SCREEN#1 ← phi( main/(word) 1024 main::@2/(byte[1024]) main::SCREEN#1 ) @@ -270,16 +270,16 @@ main::@2: from main::@1 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Self Phi Eliminated (byte[1024]) main::SCREEN#1 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@2 (byte[1024]) main::SCREEN#1 ← phi( main/(word) 1024 ) @@ -293,16 +293,16 @@ main::@2: from main::@1 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Simple Condition (boolean~) main::$0 if((byte) main::i#2<(byte) 10) goto main::@2 Succesful SSA optimization Pass2ConditionalJumpSimplification CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@2 (byte[1024]) main::SCREEN#1 ← phi( main/(word) 1024 ) @@ -315,16 +315,16 @@ main::@2: from main::@1 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte[1024]) main::SCREEN#1 (word) 1024 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin to:main::@1 main::@1: from main main::@2 (byte) main::i#2 ← phi( main/(byte) 2 main::@2/(byte) main::i#1 ) @@ -336,19 +336,19 @@ main::@2: from main::@1 to:main::@1 main::@return: from main::@1 return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2 Multiple usages for variable. Not optimizing sub-constant (byte) main::i#2 -Block Sequence Planned @BEGIN @END main main::@1 main::@return main::@2 -Block Sequence Planned @BEGIN @END main main::@1 main::@return main::@2 +Block Sequence Planned @begin @end main main::@1 main::@return main::@2 +Block Sequence Planned @begin @end main main::@1 main::@return main::@2 CONTROL FLOW GRAPH - PHI LIFTED -@BEGIN: from +@begin: from call main param-assignment - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@2 (byte) main::i#2 ← phi( main/(byte) 2 main::@2/(byte~) main::i#4 ) @@ -356,7 +356,7 @@ main::@1: from main main::@2 to:main::@return main::@return: from main::@1 return - to:@RETURN + to:@return main::@2: from main::@1 (byte) main::b#0 ← (word) 1024 *idx (byte) main::i#2 (byte) main::i#1 ← ++ (byte) main::i#2 @@ -366,11 +366,11 @@ main::@2: from main::@1 Adding empty live range for unused variable main::b#0 Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@2 [1] (byte) main::i#2 ← phi( main/(byte) 2 main::@2/(byte~) main::i#4 ) [ main::i#2 ] @@ -378,7 +378,7 @@ main::@1: from main main::@2 to:main::@return main::@return: from main::@1 [3] return [ ] - to:@RETURN + to:@return main::@2: from main::@1 [4] (byte) main::b#0 ← (word) 1024 *idx (byte) main::i#2 [ main::i#2 ] [5] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] @@ -388,15 +388,15 @@ main::@2: from main::@1 Created 1 initial phi equivalence classes Coalesced [6] main::i#4 ← main::i#1 Coalesced down to 1 phi equivalence classes -Block Sequence Planned @BEGIN @END main main::@1 main::@return main::@2 +Block Sequence Planned @begin @end main main::@1 main::@return main::@2 Adding empty live range for unused variable main::b#0 Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin to:main::@1 main::@1: from main main::@2 [1] (byte) main::i#2 ← phi( main/(byte) 2 main::@2/(byte) main::i#1 ) [ main::i#2 ] @@ -404,7 +404,7 @@ main::@1: from main main::@2 to:main::@return main::@return: from main::@1 [3] return [ ] - to:@RETURN + to:@return main::@2: from main::@1 [4] (byte) main::b#0 ← (word) 1024 *idx (byte) main::i#2 [ main::i#2 ] [5] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] @@ -414,12 +414,12 @@ CALL GRAPH Calls in [] to 0:main DOMINATORS -@BEGIN dominated by @BEGIN -@END dominated by @BEGIN @END -main dominated by @BEGIN main -main::@1 dominated by @BEGIN main::@1 main -main::@return dominated by @BEGIN main::@return main::@1 main -main::@2 dominated by @BEGIN main::@2 main::@1 main +@begin dominated by @begin +@end dominated by @end @begin +main dominated by @begin main +main::@1 dominated by @begin main::@1 main +main::@return dominated by main::@return @begin main::@1 main +main::@2 dominated by @begin main::@2 main::@1 main Found back edge: Loop head: main::@1 tails: main::@2 blocks: null Populated: Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1 @@ -451,34 +451,35 @@ Complete equivalence classes Allocated zp byte:2 to zp byte:2 [ main::i#2 main::i#1 ] Allocated zp byte:3 to zp byte:3 [ main::b#0 ] INITIAL ASM -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main - jmp BEND -//SEG2 @END -BEND: + jmp bend +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] phi from main to main::@1 -main__B1_from_main: -//SEG5 [1] phi (byte) main::i#2 = (byte) 2 -- zpby1=coby1 - lda #$2 - sta $2 - jmp main__B1 -//SEG6 main::@1 -main__B1: -//SEG7 [2] if((byte) main::i#2<(byte) 10) goto main::@2 [ main::i#2 ] -- zpby1_lt_coby1_then_la1 - lda $2 - cmp #$a - bcc main__B2 - jmp main__Breturn -//SEG8 main::@return -main__Breturn: -//SEG9 [3] return [ ] - rts +main: { + //SEG4 [1] phi from main to main::@1 + b1_from_main: + //SEG5 [1] phi (byte) main::i#2 = (byte) 2 -- zpby1=coby1 + lda #$2 + sta $2 + jmp b1 + //SEG6 main::@1 + b1: + //SEG7 [2] if((byte) main::i#2<(byte) 10) goto main::@2 [ main::i#2 ] -- zpby1_lt_coby1_then_la1 + lda $2 + cmp #$a + bcc b2 + jmp breturn + //SEG8 main::@return + breturn: + //SEG9 [3] return [ ] + rts +} //SEG10 main::@2 -main__B2: +b2: //SEG11 [4] (byte) main::b#0 ← (word) 1024 *idx (byte) main::i#2 [ main::i#2 ] -- zpby1=cowo1_staridx_zpby2 ldx $2 lda $400,x @@ -486,9 +487,9 @@ main__B2: //SEG12 [5] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- zpby1=_inc_zpby1 inc $2 //SEG13 [1] phi from main::@2 to main::@1 -main__B1_from_B2: +b1_from_b2: //SEG14 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy - jmp main__B1 + jmp b1 REGISTER UPLIFT POTENTIAL REGISTERS Potential registers zp byte:2 [ main::i#2 main::i#1 ] : zp byte:2 , reg byte a , reg byte x , reg byte y , @@ -500,46 +501,47 @@ Uplift Scope [] Uplifting [main] best 235 combination reg byte a [ main::b#0 ] reg byte x [ main::i#2 main::i#1 ] Uplifting [] best 235 combination -Removing instruction jmp BEND -Removing instruction jmp main__B1 -Removing instruction jmp main__Breturn +Removing instruction jmp bend +Removing instruction jmp b1 +Removing instruction jmp breturn Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] phi from main to main::@1 -main__B1_from_main: -//SEG5 [1] phi (byte) main::i#2 = (byte) 2 -- xby=coby1 - ldx #$2 -//SEG6 main::@1 -main__B1: -//SEG7 [2] if((byte) main::i#2<(byte) 10) goto main::@2 [ main::i#2 ] -- xby_lt_coby1_then_la1 - cpx #$a - bcc main__B2 -//SEG8 main::@return -main__Breturn: -//SEG9 [3] return [ ] - rts +main: { + //SEG4 [1] phi from main to main::@1 + b1_from_main: + //SEG5 [1] phi (byte) main::i#2 = (byte) 2 -- xby=coby1 + ldx #$2 + //SEG6 main::@1 + b1: + //SEG7 [2] if((byte) main::i#2<(byte) 10) goto main::@2 [ main::i#2 ] -- xby_lt_coby1_then_la1 + cpx #$a + bcc b2 + //SEG8 main::@return + breturn: + //SEG9 [3] return [ ] + rts +} //SEG10 main::@2 -main__B2: +b2: //SEG11 [4] (byte) main::b#0 ← (word) 1024 *idx (byte) main::i#2 [ main::i#2 ] -- aby=cowo1_staridx_xby lda $400,x //SEG12 [5] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- xby=_inc_xby inx //SEG13 [1] phi from main::@2 to main::@1 -main__B1_from_B2: +b1_from_b2: //SEG14 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy - jmp main__B1 + jmp b1 FINAL SYMBOL TABLE -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (void()) main() (label) main::@1 (label) main::@2 @@ -555,35 +557,36 @@ reg byte x [ main::i#2 main::i#1 ] reg byte a [ main::b#0 ] FINAL CODE -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] phi from main to main::@1 -main__B1_from_main: -//SEG5 [1] phi (byte) main::i#2 = (byte) 2 -- xby=coby1 - ldx #$2 -//SEG6 main::@1 -main__B1: -//SEG7 [2] if((byte) main::i#2<(byte) 10) goto main::@2 [ main::i#2 ] -- xby_lt_coby1_then_la1 - cpx #$a - bcc main__B2 -//SEG8 main::@return -main__Breturn: -//SEG9 [3] return [ ] - rts +main: { + //SEG4 [1] phi from main to main::@1 + b1_from_main: + //SEG5 [1] phi (byte) main::i#2 = (byte) 2 -- xby=coby1 + ldx #$2 + //SEG6 main::@1 + b1: + //SEG7 [2] if((byte) main::i#2<(byte) 10) goto main::@2 [ main::i#2 ] -- xby_lt_coby1_then_la1 + cpx #$a + bcc b2 + //SEG8 main::@return + breturn: + //SEG9 [3] return [ ] + rts +} //SEG10 main::@2 -main__B2: +b2: //SEG11 [4] (byte) main::b#0 ← (word) 1024 *idx (byte) main::i#2 [ main::i#2 ] -- aby=cowo1_staridx_xby lda $400,x //SEG12 [5] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] -- xby=_inc_xby inx //SEG13 [1] phi from main::@2 to main::@1 -main__B1_from_B2: +b1_from_b2: //SEG14 [1] phi (byte) main::i#2 = (byte) main::i#1 -- register_copy - jmp main__B1 + jmp b1 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.sym b/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.sym index 51dedf953..9948ec675 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.sym +++ b/src/main/java/dk/camelot64/kickc/test/ref/ptrtestmin.sym @@ -1,5 +1,5 @@ -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (void()) main() (label) main::@1 (label) main::@2 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/summin.asm b/src/main/java/dk/camelot64/kickc/test/ref/summin.asm index 940708608..a64cade94 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/summin.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/summin.asm @@ -1,31 +1,32 @@ -BBEGIN: -sum_from_BBEGIN: +bbegin: +sum_from_bbegin: lda #$2 ldy #$1 jsr sum -B2: +b2: sta $2 -sum_from_B2: +sum_from_b2: lda #$4 ldy #$3 jsr sum -B3: +b3: tax -sum_from_B3: +sum_from_b3: lda #$d ldy #$9 jsr sum -B4: +b4: sta $3 txa clc adc $2 clc adc $3 -BEND: -sum: - sty $ff - clc - adc $ff -sum__Breturn: - rts +bend: +sum: { + sty $ff + clc + adc $ff + breturn: + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/summin.cfg b/src/main/java/dk/camelot64/kickc/test/ref/summin.cfg index 9ab34cce3..4ce068bca 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/summin.cfg +++ b/src/main/java/dk/camelot64/kickc/test/ref/summin.cfg @@ -1,7 +1,7 @@ -@BEGIN: from +@begin: from [0] call sum param-assignment [ sum::return#0 ] to:@2 -@2: from @BEGIN +@2: from @begin [1] (byte) s1#0 ← (byte) sum::return#0 [ s1#0 ] [2] call sum param-assignment [ sum::return#0 s1#0 ] to:@3 @@ -13,13 +13,13 @@ [5] (byte) s3#0 ← (byte) sum::return#0 [ s1#0 s2#0 s3#0 ] [6] (byte~) $3 ← (byte) s1#0 + (byte) s2#0 [ $3 s3#0 ] [7] (byte) s4#0 ← (byte~) $3 + (byte) s3#0 [ ] - to:@END -@END: from @4 -sum: from @2 @3 @BEGIN - [8] (byte) sum::b#3 ← phi( @2/(byte) 4 @3/(byte) 13 @BEGIN/(byte) 2 ) [ s1#0 s2#0 sum::a#3 sum::b#3 ] - [8] (byte) sum::a#3 ← phi( @2/(byte) 3 @3/(byte) 9 @BEGIN/(byte) 1 ) [ s1#0 s2#0 sum::a#3 sum::b#3 ] + to:@end +@end: from @4 +sum: from @2 @3 @begin + [8] (byte) sum::b#3 ← phi( @2/(byte) 4 @3/(byte) 13 @begin/(byte) 2 ) [ s1#0 s2#0 sum::a#3 sum::b#3 ] + [8] (byte) sum::a#3 ← phi( @2/(byte) 3 @3/(byte) 9 @begin/(byte) 1 ) [ s1#0 s2#0 sum::a#3 sum::b#3 ] [9] (byte) sum::return#0 ← (byte) sum::a#3 + (byte) sum::b#3 [ sum::return#0 s1#0 s2#0 ] to:sum::@return sum::@return: from sum [10] return [ sum::return#0 s1#0 s2#0 ] - to:@RETURN + to:@return diff --git a/src/main/java/dk/camelot64/kickc/test/ref/summin.log b/src/main/java/dk/camelot64/kickc/test/ref/summin.log index 2c91edfbc..290513b90 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/summin.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/summin.log @@ -43,7 +43,7 @@ SYMBOLS (byte) sum::return INITIAL CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte~) $0 ← call sum (byte) 1 (byte) 2 (byte) s1 ← (byte~) $0 (byte~) $1 ← call sum (byte) 3 (byte) 4 @@ -61,17 +61,17 @@ sum: from sum::@return: from sum sum::@1 (byte) sum::return ← (byte) sum::return return (byte) sum::return - to:@RETURN + to:@return sum::@1: from to:sum::@return -@1: from @BEGIN - to:@END -@END: from @1 +@1: from @begin + to:@end +@end: from @1 Removing empty block sum::@1 Removing empty block @1 CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte~) $0 ← call sum (byte) 1 (byte) 2 (byte) s1 ← (byte~) $0 (byte~) $1 ← call sum (byte) 3 (byte) 4 @@ -81,7 +81,7 @@ CONTROL FLOW GRAPH (byte~) $3 ← (byte) s1 + (byte) s2 (byte~) $4 ← (byte~) $3 + (byte) s3 (byte) s4 ← (byte~) $4 - to:@END + to:@end sum: from (byte~) sum::$0 ← (byte) sum::a + (byte) sum::b (byte) sum::return ← (byte~) sum::$0 @@ -89,18 +89,18 @@ sum: from sum::@return: from sum (byte) sum::return ← (byte) sum::return return (byte) sum::return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin PROCEDURE MODIFY VARIABLE ANALYSIS CONTROL FLOW GRAPH WITH ASSIGNMENT CALL -@BEGIN: from +@begin: from (byte) sum::a ← (byte) 1 (byte) sum::b ← (byte) 2 (byte) sum::return ← call sum param-assignment to:@2 -@2: from @BEGIN +@2: from @begin (byte~) $0 ← (byte) sum::return (byte) s1 ← (byte~) $0 (byte) sum::a ← (byte) 3 @@ -120,27 +120,27 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL (byte~) $3 ← (byte) s1 + (byte) s2 (byte~) $4 ← (byte~) $3 + (byte) s3 (byte) s4 ← (byte~) $4 - to:@END -sum: from @2 @3 @BEGIN + to:@end +sum: from @2 @3 @begin (byte~) sum::$0 ← (byte) sum::a + (byte) sum::b (byte) sum::return ← (byte~) sum::$0 to:sum::@return sum::@return: from sum (byte) sum::return ← (byte) sum::return return (byte) sum::return - to:@RETURN -@END: from @4 + to:@return +@end: from @4 Completing Phi functions... Completing Phi functions... CONTROL FLOW GRAPH SSA -@BEGIN: from +@begin: from (byte) sum::a#0 ← (byte) 1 (byte) sum::b#0 ← (byte) 2 (byte) sum::return#0 ← call sum param-assignment to:@2 -@2: from @BEGIN - (byte) sum::return#5 ← phi( @BEGIN/(byte) sum::return#0 ) +@2: from @begin + (byte) sum::return#5 ← phi( @begin/(byte) sum::return#0 ) (byte~) $0 ← (byte) sum::return#5 (byte) s1#0 ← (byte~) $0 (byte) sum::a#1 ← (byte) 3 @@ -165,10 +165,10 @@ CONTROL FLOW GRAPH SSA (byte~) $3 ← (byte) s1#1 + (byte) s2#1 (byte~) $4 ← (byte~) $3 + (byte) s3#0 (byte) s4#0 ← (byte~) $4 - to:@END -sum: from @2 @3 @BEGIN - (byte) sum::b#3 ← phi( @2/(byte) sum::b#1 @3/(byte) sum::b#2 @BEGIN/(byte) sum::b#0 ) - (byte) sum::a#3 ← phi( @2/(byte) sum::a#1 @3/(byte) sum::a#2 @BEGIN/(byte) sum::a#0 ) + to:@end +sum: from @2 @3 @begin + (byte) sum::b#3 ← phi( @2/(byte) sum::b#1 @3/(byte) sum::b#2 @begin/(byte) sum::b#0 ) + (byte) sum::a#3 ← phi( @2/(byte) sum::a#1 @3/(byte) sum::a#2 @begin/(byte) sum::a#0 ) (byte~) sum::$0 ← (byte) sum::a#3 + (byte) sum::b#3 (byte) sum::return#3 ← (byte~) sum::$0 to:sum::@return @@ -176,18 +176,18 @@ sum::@return: from sum (byte) sum::return#8 ← phi( sum/(byte) sum::return#3 ) (byte) sum::return#4 ← (byte) sum::return#8 return (byte) sum::return#4 - to:@RETURN -@END: from @4 + to:@return +@end: from @4 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN -@BEGIN: from +@begin: from (byte) sum::a#0 ← (byte) 1 (byte) sum::b#0 ← (byte) 2 call sum param-assignment (byte) sum::return#0 ← (byte) sum::return#4 to:@2 -@2: from @BEGIN - (byte) sum::return#5 ← phi( @BEGIN/(byte) sum::return#0 ) +@2: from @begin + (byte) sum::return#5 ← phi( @begin/(byte) sum::return#0 ) (byte~) $0 ← (byte) sum::return#5 (byte) s1#0 ← (byte~) $0 (byte) sum::a#1 ← (byte) 3 @@ -214,10 +214,10 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN (byte~) $3 ← (byte) s1#1 + (byte) s2#1 (byte~) $4 ← (byte~) $3 + (byte) s3#0 (byte) s4#0 ← (byte~) $4 - to:@END -sum: from @2 @3 @BEGIN - (byte) sum::b#3 ← phi( @2/(byte) sum::b#1 @3/(byte) sum::b#2 @BEGIN/(byte) sum::b#0 ) - (byte) sum::a#3 ← phi( @2/(byte) sum::a#1 @3/(byte) sum::a#2 @BEGIN/(byte) sum::a#0 ) + to:@end +sum: from @2 @3 @begin + (byte) sum::b#3 ← phi( @2/(byte) sum::b#1 @3/(byte) sum::b#2 @begin/(byte) sum::b#0 ) + (byte) sum::a#3 ← phi( @2/(byte) sum::a#1 @3/(byte) sum::a#2 @begin/(byte) sum::a#0 ) (byte~) sum::$0 ← (byte) sum::a#3 + (byte) sum::b#3 (byte) sum::return#3 ← (byte~) sum::$0 to:sum::@return @@ -225,8 +225,8 @@ sum::@return: from sum (byte) sum::return#8 ← phi( sum/(byte) sum::return#3 ) (byte) sum::return#4 ← (byte) sum::return#8 return - to:@RETURN -@END: from @4 + to:@return +@end: from @4 Constant (byte) sum::a#0 (byte) 1 Constant (byte) sum::b#0 (byte) 2 @@ -236,12 +236,12 @@ Constant (byte) sum::a#2 (byte) 9 Constant (byte) sum::b#2 (byte) 13 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call sum param-assignment (byte) sum::return#0 ← (byte) sum::return#4 to:@2 -@2: from @BEGIN - (byte) sum::return#5 ← phi( @BEGIN/(byte) sum::return#0 ) +@2: from @begin + (byte) sum::return#5 ← phi( @begin/(byte) sum::return#0 ) (byte~) $0 ← (byte) sum::return#5 (byte) s1#0 ← (byte~) $0 call sum param-assignment @@ -264,10 +264,10 @@ CONTROL FLOW GRAPH (byte~) $3 ← (byte) s1#1 + (byte) s2#1 (byte~) $4 ← (byte~) $3 + (byte) s3#0 (byte) s4#0 ← (byte~) $4 - to:@END -sum: from @2 @3 @BEGIN - (byte) sum::b#3 ← phi( @2/(byte) 4 @3/(byte) 13 @BEGIN/(byte) 2 ) - (byte) sum::a#3 ← phi( @2/(byte) 3 @3/(byte) 9 @BEGIN/(byte) 1 ) + to:@end +sum: from @2 @3 @begin + (byte) sum::b#3 ← phi( @2/(byte) 4 @3/(byte) 13 @begin/(byte) 2 ) + (byte) sum::a#3 ← phi( @2/(byte) 3 @3/(byte) 9 @begin/(byte) 1 ) (byte~) sum::$0 ← (byte) sum::a#3 + (byte) sum::b#3 (byte) sum::return#3 ← (byte~) sum::$0 to:sum::@return @@ -275,8 +275,8 @@ sum::@return: from sum (byte) sum::return#8 ← phi( sum/(byte) sum::return#3 ) (byte) sum::return#4 ← (byte) sum::return#8 return - to:@RETURN -@END: from @4 + to:@return +@end: from @4 Not aliassing across scopes: $0 sum::return#5 Not aliassing across scopes: $1 sum::return#6 @@ -288,10 +288,10 @@ Alias (byte) s3#0 = (byte~) $2 Alias (byte) s4#0 = (byte~) $4 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call sum param-assignment to:@2 -@2: from @BEGIN +@2: from @begin (byte) s1#0 ← (byte) sum::return#0 call sum param-assignment to:@3 @@ -303,27 +303,27 @@ CONTROL FLOW GRAPH (byte) s3#0 ← (byte) sum::return#0 (byte~) $3 ← (byte) s1#0 + (byte) s2#0 (byte) s4#0 ← (byte~) $3 + (byte) s3#0 - to:@END -sum: from @2 @3 @BEGIN - (byte) sum::b#3 ← phi( @2/(byte) 4 @3/(byte) 13 @BEGIN/(byte) 2 ) - (byte) sum::a#3 ← phi( @2/(byte) 3 @3/(byte) 9 @BEGIN/(byte) 1 ) + to:@end +sum: from @2 @3 @begin + (byte) sum::b#3 ← phi( @2/(byte) 4 @3/(byte) 13 @begin/(byte) 2 ) + (byte) sum::a#3 ← phi( @2/(byte) 3 @3/(byte) 9 @begin/(byte) 1 ) (byte) sum::return#0 ← (byte) sum::a#3 + (byte) sum::b#3 to:sum::@return sum::@return: from sum return - to:@RETURN -@END: from @4 + to:@return +@end: from @4 Not aliassing across scopes: s1#0 sum::return#0 Not aliassing across scopes: s2#0 sum::return#0 Not aliassing across scopes: s3#0 sum::return#0 -Block Sequence Planned @BEGIN @2 @3 @4 @END sum sum::@return -Block Sequence Planned @BEGIN @2 @3 @4 @END sum sum::@return +Block Sequence Planned @begin @2 @3 @4 @end sum sum::@return +Block Sequence Planned @begin @2 @3 @4 @end sum sum::@return CONTROL FLOW GRAPH - PHI LIFTED -@BEGIN: from +@begin: from call sum param-assignment to:@2 -@2: from @BEGIN +@2: from @begin (byte) s1#0 ← (byte) sum::return#0 call sum param-assignment to:@3 @@ -335,16 +335,16 @@ CONTROL FLOW GRAPH - PHI LIFTED (byte) s3#0 ← (byte) sum::return#0 (byte~) $3 ← (byte) s1#0 + (byte) s2#0 (byte) s4#0 ← (byte~) $3 + (byte) s3#0 - to:@END -@END: from @4 -sum: from @2 @3 @BEGIN - (byte) sum::b#3 ← phi( @2/(byte) 4 @3/(byte) 13 @BEGIN/(byte) 2 ) - (byte) sum::a#3 ← phi( @2/(byte) 3 @3/(byte) 9 @BEGIN/(byte) 1 ) + to:@end +@end: from @4 +sum: from @2 @3 @begin + (byte) sum::b#3 ← phi( @2/(byte) 4 @3/(byte) 13 @begin/(byte) 2 ) + (byte) sum::a#3 ← phi( @2/(byte) 3 @3/(byte) 9 @begin/(byte) 1 ) (byte) sum::return#0 ← (byte) sum::a#3 + (byte) sum::b#3 to:sum::@return sum::@return: from sum return - to:@RETURN + to:@return Adding empty live range for unused variable s4#0 Propagating live ranges... @@ -362,10 +362,10 @@ Propagated s1#0 through call [4] call sum param-assignment Propagated s2#0 through call [4] call sum param-assignment Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES -@BEGIN: from +@begin: from [0] call sum param-assignment [ sum::return#0 ] to:@2 -@2: from @BEGIN +@2: from @begin [1] (byte) s1#0 ← (byte) sum::return#0 [ s1#0 ] [2] call sum param-assignment [ sum::return#0 s1#0 ] to:@3 @@ -377,20 +377,20 @@ CONTROL FLOW GRAPH - LIVE RANGES [5] (byte) s3#0 ← (byte) sum::return#0 [ s1#0 s2#0 s3#0 ] [6] (byte~) $3 ← (byte) s1#0 + (byte) s2#0 [ $3 s3#0 ] [7] (byte) s4#0 ← (byte~) $3 + (byte) s3#0 [ ] - to:@END -@END: from @4 -sum: from @2 @3 @BEGIN - [8] (byte) sum::b#3 ← phi( @2/(byte) 4 @3/(byte) 13 @BEGIN/(byte) 2 ) [ s1#0 s2#0 sum::a#3 sum::b#3 ] - [8] (byte) sum::a#3 ← phi( @2/(byte) 3 @3/(byte) 9 @BEGIN/(byte) 1 ) [ s1#0 s2#0 sum::a#3 sum::b#3 ] + to:@end +@end: from @4 +sum: from @2 @3 @begin + [8] (byte) sum::b#3 ← phi( @2/(byte) 4 @3/(byte) 13 @begin/(byte) 2 ) [ s1#0 s2#0 sum::a#3 sum::b#3 ] + [8] (byte) sum::a#3 ← phi( @2/(byte) 3 @3/(byte) 9 @begin/(byte) 1 ) [ s1#0 s2#0 sum::a#3 sum::b#3 ] [9] (byte) sum::return#0 ← (byte) sum::a#3 + (byte) sum::b#3 [ sum::return#0 s1#0 s2#0 ] to:sum::@return sum::@return: from sum [10] return [ sum::return#0 s1#0 s2#0 ] - to:@RETURN + to:@return Created 2 initial phi equivalence classes Coalesced down to 2 phi equivalence classes -Block Sequence Planned @BEGIN @2 @3 @4 @END sum sum::@return +Block Sequence Planned @begin @2 @3 @4 @end sum sum::@return Adding empty live range for unused variable s4#0 Propagating live ranges... Propagating live ranges... @@ -407,10 +407,10 @@ Propagated s1#0 through call [4] call sum param-assignment Propagated s2#0 through call [4] call sum param-assignment Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED -@BEGIN: from +@begin: from [0] call sum param-assignment [ sum::return#0 ] to:@2 -@2: from @BEGIN +@2: from @begin [1] (byte) s1#0 ← (byte) sum::return#0 [ s1#0 ] [2] call sum param-assignment [ sum::return#0 s1#0 ] to:@3 @@ -422,28 +422,28 @@ CONTROL FLOW GRAPH - PHI MEM COALESCED [5] (byte) s3#0 ← (byte) sum::return#0 [ s1#0 s2#0 s3#0 ] [6] (byte~) $3 ← (byte) s1#0 + (byte) s2#0 [ $3 s3#0 ] [7] (byte) s4#0 ← (byte~) $3 + (byte) s3#0 [ ] - to:@END -@END: from @4 -sum: from @2 @3 @BEGIN - [8] (byte) sum::b#3 ← phi( @2/(byte) 4 @3/(byte) 13 @BEGIN/(byte) 2 ) [ s1#0 s2#0 sum::a#3 sum::b#3 ] - [8] (byte) sum::a#3 ← phi( @2/(byte) 3 @3/(byte) 9 @BEGIN/(byte) 1 ) [ s1#0 s2#0 sum::a#3 sum::b#3 ] + to:@end +@end: from @4 +sum: from @2 @3 @begin + [8] (byte) sum::b#3 ← phi( @2/(byte) 4 @3/(byte) 13 @begin/(byte) 2 ) [ s1#0 s2#0 sum::a#3 sum::b#3 ] + [8] (byte) sum::a#3 ← phi( @2/(byte) 3 @3/(byte) 9 @begin/(byte) 1 ) [ s1#0 s2#0 sum::a#3 sum::b#3 ] [9] (byte) sum::return#0 ← (byte) sum::a#3 + (byte) sum::b#3 [ sum::return#0 s1#0 s2#0 ] to:sum::@return sum::@return: from sum [10] return [ sum::return#0 s1#0 s2#0 ] - to:@RETURN + to:@return CALL GRAPH Calls in [] to 0:sum 2:sum 4:sum DOMINATORS -@BEGIN dominated by @BEGIN -@2 dominated by @BEGIN @2 -@3 dominated by @BEGIN @2 @3 -@4 dominated by @BEGIN @2 @3 @4 -@END dominated by @BEGIN @2 @3 @4 @END -sum dominated by @BEGIN sum -sum::@return dominated by @BEGIN sum::@return sum +@begin dominated by @begin +@2 dominated by @2 @begin +@3 dominated by @2 @3 @begin +@4 dominated by @2 @3 @4 @begin +@end dominated by @2 @3 @4 @end @begin +sum dominated by @begin sum +sum::@return dominated by @begin sum::@return sum NATURAL LOOPS @@ -497,11 +497,11 @@ Allocated zp byte:7 to zp byte:7 [ $3 ] Allocated zp byte:8 to zp byte:8 [ s4#0 ] Allocated zp byte:9 to zp byte:9 [ sum::return#0 ] INITIAL ASM -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call sum param-assignment [ sum::return#0 ] -//SEG2 [8] phi from @BEGIN to sum -sum_from_BBEGIN: +//SEG2 [8] phi from @begin to sum +sum_from_bbegin: //SEG3 [8] phi (byte) sum::b#3 = (byte) 2 -- zpby1=coby1 lda #$2 sta $3 @@ -509,15 +509,15 @@ sum_from_BBEGIN: lda #$1 sta $2 jsr sum - jmp B2 + jmp b2 //SEG5 @2 -B2: +b2: //SEG6 [1] (byte) s1#0 ← (byte) sum::return#0 [ s1#0 ] -- zpby1=zpby2 lda $9 sta $4 //SEG7 [2] call sum param-assignment [ sum::return#0 s1#0 ] //SEG8 [8] phi from @2 to sum -sum_from_B2: +sum_from_b2: //SEG9 [8] phi (byte) sum::b#3 = (byte) 4 -- zpby1=coby1 lda #$4 sta $3 @@ -525,15 +525,15 @@ sum_from_B2: lda #$3 sta $2 jsr sum - jmp B3 + jmp b3 //SEG11 @3 -B3: +b3: //SEG12 [3] (byte) s2#0 ← (byte) sum::return#0 [ s1#0 s2#0 ] -- zpby1=zpby2 lda $9 sta $5 //SEG13 [4] call sum param-assignment [ sum::return#0 s1#0 s2#0 ] //SEG14 [8] phi from @3 to sum -sum_from_B3: +sum_from_b3: //SEG15 [8] phi (byte) sum::b#3 = (byte) 13 -- zpby1=coby1 lda #$d sta $3 @@ -541,9 +541,9 @@ sum_from_B3: lda #$9 sta $2 jsr sum - jmp B4 + jmp b4 //SEG17 @4 -B4: +b4: //SEG18 [5] (byte) s3#0 ← (byte) sum::return#0 [ s1#0 s2#0 s3#0 ] -- zpby1=zpby2 lda $9 sta $6 @@ -557,21 +557,22 @@ B4: clc adc $6 sta $8 - jmp BEND -//SEG21 @END -BEND: + jmp bend +//SEG21 @end +bend: //SEG22 sum -sum: -//SEG23 [9] (byte) sum::return#0 ← (byte) sum::a#3 + (byte) sum::b#3 [ sum::return#0 s1#0 s2#0 ] -- zpby1=zpby2_plus_zpby3 - lda $2 - clc - adc $3 - sta $9 - jmp sum__Breturn -//SEG24 sum::@return -sum__Breturn: -//SEG25 [10] return [ sum::return#0 s1#0 s2#0 ] - rts +sum: { + //SEG23 [9] (byte) sum::return#0 ← (byte) sum::a#3 + (byte) sum::b#3 [ sum::return#0 s1#0 s2#0 ] -- zpby1=zpby2_plus_zpby3 + lda $2 + clc + adc $3 + sta $9 + jmp breturn + //SEG24 sum::@return + breturn: + //SEG25 [10] return [ sum::return#0 s1#0 s2#0 ] + rts +} REGISTER UPLIFT POTENTIAL REGISTERS Potential registers zp byte:2 [ sum::a#3 ] : zp byte:2 , reg byte a , reg byte x , reg byte y , @@ -591,49 +592,49 @@ Uplifting [] best 107 combination reg byte a [ s4#0 ] reg byte a [ $3 ] zp byte: Uplifting [sum] best 79 combination reg byte y [ sum::a#3 ] reg byte a [ sum::b#3 ] reg byte a [ sum::return#0 ] Re-allocated ZP register from zp byte:4 to zp byte:2 Re-allocated ZP register from zp byte:6 to zp byte:3 -Removing instruction jmp B2 -Removing instruction jmp B3 -Removing instruction jmp B4 -Removing instruction jmp BEND -Removing instruction jmp sum__Breturn +Removing instruction jmp b2 +Removing instruction jmp b3 +Removing instruction jmp b4 +Removing instruction jmp bend +Removing instruction jmp breturn Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call sum param-assignment [ sum::return#0 ] -//SEG2 [8] phi from @BEGIN to sum -sum_from_BBEGIN: +//SEG2 [8] phi from @begin to sum +sum_from_bbegin: //SEG3 [8] phi (byte) sum::b#3 = (byte) 2 -- aby=coby1 lda #$2 //SEG4 [8] phi (byte) sum::a#3 = (byte) 1 -- yby=coby1 ldy #$1 jsr sum //SEG5 @2 -B2: +b2: //SEG6 [1] (byte) s1#0 ← (byte) sum::return#0 [ s1#0 ] -- zpby1=aby sta $2 //SEG7 [2] call sum param-assignment [ sum::return#0 s1#0 ] //SEG8 [8] phi from @2 to sum -sum_from_B2: +sum_from_b2: //SEG9 [8] phi (byte) sum::b#3 = (byte) 4 -- aby=coby1 lda #$4 //SEG10 [8] phi (byte) sum::a#3 = (byte) 3 -- yby=coby1 ldy #$3 jsr sum //SEG11 @3 -B3: +b3: //SEG12 [3] (byte) s2#0 ← (byte) sum::return#0 [ s1#0 s2#0 ] -- xby=aby tax //SEG13 [4] call sum param-assignment [ sum::return#0 s1#0 s2#0 ] //SEG14 [8] phi from @3 to sum -sum_from_B3: +sum_from_b3: //SEG15 [8] phi (byte) sum::b#3 = (byte) 13 -- aby=coby1 lda #$d //SEG16 [8] phi (byte) sum::a#3 = (byte) 9 -- yby=coby1 ldy #$9 jsr sum //SEG17 @4 -B4: +b4: //SEG18 [5] (byte) s3#0 ← (byte) sum::return#0 [ s1#0 s2#0 s3#0 ] -- zpby1=aby sta $3 //SEG19 [6] (byte~) $3 ← (byte) s1#0 + (byte) s2#0 [ $3 s3#0 ] -- aby=zpby1_plus_xby @@ -643,26 +644,27 @@ B4: //SEG20 [7] (byte) s4#0 ← (byte~) $3 + (byte) s3#0 [ ] -- aby=aby_plus_zpby1 clc adc $3 -//SEG21 @END -BEND: +//SEG21 @end +bend: //SEG22 sum -sum: -//SEG23 [9] (byte) sum::return#0 ← (byte) sum::a#3 + (byte) sum::b#3 [ sum::return#0 s1#0 s2#0 ] -- aby=yby_plus_aby - sty $ff - clc - adc $ff -//SEG24 sum::@return -sum__Breturn: -//SEG25 [10] return [ sum::return#0 s1#0 s2#0 ] - rts +sum: { + //SEG23 [9] (byte) sum::return#0 ← (byte) sum::a#3 + (byte) sum::b#3 [ sum::return#0 s1#0 s2#0 ] -- aby=yby_plus_aby + sty $ff + clc + adc $ff + //SEG24 sum::@return + breturn: + //SEG25 [10] return [ sum::return#0 s1#0 s2#0 ] + rts +} FINAL SYMBOL TABLE (byte~) $3 reg byte a 4.0 (label) @2 (label) @3 (label) @4 -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte) s1 (byte) s1#0 zp byte:2 0.5 (byte) s2 @@ -690,42 +692,42 @@ reg byte a [ s4#0 ] reg byte a [ sum::return#0 ] FINAL CODE -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call sum param-assignment [ sum::return#0 ] -//SEG2 [8] phi from @BEGIN to sum -sum_from_BBEGIN: +//SEG2 [8] phi from @begin to sum +sum_from_bbegin: //SEG3 [8] phi (byte) sum::b#3 = (byte) 2 -- aby=coby1 lda #$2 //SEG4 [8] phi (byte) sum::a#3 = (byte) 1 -- yby=coby1 ldy #$1 jsr sum //SEG5 @2 -B2: +b2: //SEG6 [1] (byte) s1#0 ← (byte) sum::return#0 [ s1#0 ] -- zpby1=aby sta $2 //SEG7 [2] call sum param-assignment [ sum::return#0 s1#0 ] //SEG8 [8] phi from @2 to sum -sum_from_B2: +sum_from_b2: //SEG9 [8] phi (byte) sum::b#3 = (byte) 4 -- aby=coby1 lda #$4 //SEG10 [8] phi (byte) sum::a#3 = (byte) 3 -- yby=coby1 ldy #$3 jsr sum //SEG11 @3 -B3: +b3: //SEG12 [3] (byte) s2#0 ← (byte) sum::return#0 [ s1#0 s2#0 ] -- xby=aby tax //SEG13 [4] call sum param-assignment [ sum::return#0 s1#0 s2#0 ] //SEG14 [8] phi from @3 to sum -sum_from_B3: +sum_from_b3: //SEG15 [8] phi (byte) sum::b#3 = (byte) 13 -- aby=coby1 lda #$d //SEG16 [8] phi (byte) sum::a#3 = (byte) 9 -- yby=coby1 ldy #$9 jsr sum //SEG17 @4 -B4: +b4: //SEG18 [5] (byte) s3#0 ← (byte) sum::return#0 [ s1#0 s2#0 s3#0 ] -- zpby1=aby sta $3 //SEG19 [6] (byte~) $3 ← (byte) s1#0 + (byte) s2#0 [ $3 s3#0 ] -- aby=zpby1_plus_xby @@ -735,16 +737,17 @@ B4: //SEG20 [7] (byte) s4#0 ← (byte~) $3 + (byte) s3#0 [ ] -- aby=aby_plus_zpby1 clc adc $3 -//SEG21 @END -BEND: +//SEG21 @end +bend: //SEG22 sum -sum: -//SEG23 [9] (byte) sum::return#0 ← (byte) sum::a#3 + (byte) sum::b#3 [ sum::return#0 s1#0 s2#0 ] -- aby=yby_plus_aby - sty $ff - clc - adc $ff -//SEG24 sum::@return -sum__Breturn: -//SEG25 [10] return [ sum::return#0 s1#0 s2#0 ] - rts +sum: { + //SEG23 [9] (byte) sum::return#0 ← (byte) sum::a#3 + (byte) sum::b#3 [ sum::return#0 s1#0 s2#0 ] -- aby=yby_plus_aby + sty $ff + clc + adc $ff + //SEG24 sum::@return + breturn: + //SEG25 [10] return [ sum::return#0 s1#0 s2#0 ] + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/summin.sym b/src/main/java/dk/camelot64/kickc/test/ref/summin.sym index a08a3f6aa..8595aca59 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/summin.sym +++ b/src/main/java/dk/camelot64/kickc/test/ref/summin.sym @@ -2,8 +2,8 @@ (label) @2 (label) @3 (label) @4 -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte) s1 (byte) s1#0 zp byte:2 0.5 (byte) s2 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/useglobal.asm b/src/main/java/dk/camelot64/kickc/test/ref/useglobal.asm index 08122dcb6..2c6f7cbcb 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/useglobal.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/useglobal.asm @@ -1,8 +1,9 @@ -BBEGIN: +bbegin: jsr main -BEND: -main: - lda #$1 - sta $400 -main__Breturn: - rts +bend: +main: { + lda #$1 + sta $400 + breturn: + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/useglobal.cfg b/src/main/java/dk/camelot64/kickc/test/ref/useglobal.cfg index 3e6cabbbc..02dba420e 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/useglobal.cfg +++ b/src/main/java/dk/camelot64/kickc/test/ref/useglobal.cfg @@ -1,10 +1,10 @@ -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] *((word) 1024) ← (byte) 1 [ ] to:main::@return main::@return: from main [2] return [ ] - to:@RETURN + to:@return diff --git a/src/main/java/dk/camelot64/kickc/test/ref/useglobal.log b/src/main/java/dk/camelot64/kickc/test/ref/useglobal.log index 7d450436b..8de7b589a 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/useglobal.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/useglobal.log @@ -20,7 +20,7 @@ SYMBOLS (label) main::@return INITIAL CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte*) SCREEN ← (word) 1024 (void~) $0 ← call main to:@1 @@ -29,171 +29,171 @@ main: from to:main::@return main::@return: from main return - to:@RETURN -@1: from @BEGIN - to:@END -@END: from @1 + to:@return +@1: from @begin + to:@end +@end: from @1 Removing empty block @1 CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte*) SCREEN ← (word) 1024 (void~) $0 ← call main - to:@END + to:@end main: from *((byte*) SCREEN) ← (byte) 1 to:main::@return main::@return: from main return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin PROCEDURE MODIFY VARIABLE ANALYSIS CONTROL FLOW GRAPH WITH ASSIGNMENT CALL -@BEGIN: from +@begin: from (byte*) SCREEN ← (word) 1024 call main param-assignment to:@2 -@2: from @BEGIN - to:@END -main: from @BEGIN +@2: from @begin + to:@end +main: from @begin *((byte*) SCREEN) ← (byte) 1 to:main::@return main::@return: from main return - to:@RETURN -@END: from @2 + to:@return +@end: from @2 Completing Phi functions... CONTROL FLOW GRAPH SSA -@BEGIN: from +@begin: from (byte*) SCREEN#0 ← (word) 1024 call main param-assignment to:@2 -@2: from @BEGIN - to:@END -main: from @BEGIN - (byte*) SCREEN#1 ← phi( @BEGIN/(byte*) SCREEN#0 ) +@2: from @begin + to:@end +main: from @begin + (byte*) SCREEN#1 ← phi( @begin/(byte*) SCREEN#0 ) *((byte*) SCREEN#1) ← (byte) 1 to:main::@return main::@return: from main return - to:@RETURN -@END: from @2 + to:@return +@end: from @2 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN -@BEGIN: from +@begin: from (byte*) SCREEN#0 ← (word) 1024 call main param-assignment to:@2 -@2: from @BEGIN - to:@END -main: from @BEGIN - (byte*) SCREEN#1 ← phi( @BEGIN/(byte*) SCREEN#0 ) +@2: from @begin + to:@end +main: from @begin + (byte*) SCREEN#1 ← phi( @begin/(byte*) SCREEN#0 ) *((byte*) SCREEN#1) ← (byte) 1 to:main::@return main::@return: from main return - to:@RETURN -@END: from @2 + to:@return +@end: from @2 Culled Empty Block (label) @2 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte*) SCREEN#0 ← (word) 1024 call main param-assignment - to:@END -main: from @BEGIN - (byte*) SCREEN#1 ← phi( @BEGIN/(byte*) SCREEN#0 ) + to:@end +main: from @begin + (byte*) SCREEN#1 ← phi( @begin/(byte*) SCREEN#0 ) *((byte*) SCREEN#1) ← (byte) 1 to:main::@return main::@return: from main return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Constant (byte*) SCREEN#0 (word) 1024 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN - (byte*) SCREEN#1 ← phi( @BEGIN/(word) 1024 ) + to:@end +main: from @begin + (byte*) SCREEN#1 ← phi( @begin/(word) 1024 ) *((byte*) SCREEN#1) ← (byte) 1 to:main::@return main::@return: from main return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin Redundant Phi (byte*) SCREEN#1 (word) 1024 Succesful SSA optimization Pass2RedundantPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin *((word) 1024) ← (byte) 1 to:main::@return main::@return: from main return - to:@RETURN -@END: from @BEGIN + to:@return +@end: from @begin -Block Sequence Planned @BEGIN @END main main::@return -Block Sequence Planned @BEGIN @END main main::@return +Block Sequence Planned @begin @end main main::@return +Block Sequence Planned @begin @end main main::@return CONTROL FLOW GRAPH - PHI LIFTED -@BEGIN: from +@begin: from call main param-assignment - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin *((word) 1024) ← (byte) 1 to:main::@return main::@return: from main return - to:@RETURN + to:@return Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] *((word) 1024) ← (byte) 1 [ ] to:main::@return main::@return: from main [2] return [ ] - to:@RETURN + to:@return Created 0 initial phi equivalence classes Coalesced down to 0 phi equivalence classes -Block Sequence Planned @BEGIN @END main main::@return +Block Sequence Planned @begin @end main main::@return Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] *((word) 1024) ← (byte) 1 [ ] to:main::@return main::@return: from main [2] return [ ] - to:@RETURN + to:@return CALL GRAPH Calls in [] to 0:main DOMINATORS -@BEGIN dominated by @BEGIN -@END dominated by @BEGIN @END -main dominated by @BEGIN main -main::@return dominated by @BEGIN main::@return main +@begin dominated by @begin +@end dominated by @end @begin +main dominated by @begin main +main::@return dominated by main::@return @begin main NATURAL LOOPS @@ -209,23 +209,24 @@ VARIABLE REGISTER WEIGHTS Initial phi equivalence classes Complete equivalence classes INITIAL ASM -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main - jmp BEND -//SEG2 @END -BEND: + jmp bend +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] *((word) 1024) ← (byte) 1 [ ] -- _star_cowo1=coby2 - lda #$1 - sta $400 - jmp main__Breturn -//SEG5 main::@return -main__Breturn: -//SEG6 [2] return [ ] - rts +main: { + //SEG4 [1] *((word) 1024) ← (byte) 1 [ ] -- _star_cowo1=coby2 + lda #$1 + sta $400 + jmp breturn + //SEG5 main::@return + breturn: + //SEG6 [2] return [ ] + rts +} Statement [1] *((word) 1024) ← (byte) 1 [ ] always clobbers reg byte a Statement [1] *((word) 1024) ← (byte) 1 [ ] always clobbers reg byte a @@ -237,48 +238,50 @@ Uplift Scope [] Uplifting [main] best 24 combination Uplifting [] best 24 combination -Removing instruction jmp BEND -Removing instruction jmp main__Breturn +Removing instruction jmp bend +Removing instruction jmp breturn Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] *((word) 1024) ← (byte) 1 [ ] -- _star_cowo1=coby2 - lda #$1 - sta $400 -//SEG5 main::@return -main__Breturn: -//SEG6 [2] return [ ] - rts +main: { + //SEG4 [1] *((word) 1024) ← (byte) 1 [ ] -- _star_cowo1=coby2 + lda #$1 + sta $400 + //SEG5 main::@return + breturn: + //SEG6 [2] return [ ] + rts +} FINAL SYMBOL TABLE -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte*) SCREEN (void()) main() (label) main::@return FINAL CODE -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] *((word) 1024) ← (byte) 1 [ ] -- _star_cowo1=coby2 - lda #$1 - sta $400 -//SEG5 main::@return -main__Breturn: -//SEG6 [2] return [ ] - rts +main: { + //SEG4 [1] *((word) 1024) ← (byte) 1 [ ] -- _star_cowo1=coby2 + lda #$1 + sta $400 + //SEG5 main::@return + breturn: + //SEG6 [2] return [ ] + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/useglobal.sym b/src/main/java/dk/camelot64/kickc/test/ref/useglobal.sym index 46563cb31..a9d294ba6 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/useglobal.sym +++ b/src/main/java/dk/camelot64/kickc/test/ref/useglobal.sym @@ -1,5 +1,5 @@ -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte*) SCREEN (void()) main() (label) main::@return diff --git a/src/main/java/dk/camelot64/kickc/test/ref/voronoi.asm b/src/main/java/dk/camelot64/kickc/test/ref/voronoi.asm index 883331848..da61114f9 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/voronoi.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/voronoi.asm @@ -1,101 +1,103 @@ -BBEGIN: +bbegin: jsr main -BEND: -main: -addpoint_from_main: - lda #$1 - sta $2 - ldy #$5 - lda #$0 - sta $8 - lda #$5 - jsr addpoint -main__B3: -addpoint_from_B3: - lda #$2 - sta $2 - ldy #$8 - lda #$f - jsr addpoint -main__B4: -addpoint_from_B4: - lda #$3 - sta $2 - ldy #$e - lda #$6 - jsr addpoint -main__B5: -addpoint_from_B5: - lda #$4 - sta $2 - ldy #$2 - lda #$22 - jsr addpoint -main__B6: -addpoint_from_B6: - lda #$5 - sta $2 - ldy #$11 - lda #$15 - jsr addpoint -main__B7: -addpoint_from_B7: - lda #$7 - sta $2 - ldy #$16 - lda #$1f - jsr addpoint -main__B8: - jsr initscreen -main__B1: - jsr render -main__B10: - jsr animate -main__B11: - jmp main__B1 -main__Breturn: - rts -animate: - lda $1000 - clc - adc #$1 - sta $1000 - lda $1000 - cmp #$28 - beq animate__B1 -animate__B2: - lda $1100 - clc - adc #$1 - sta $1100 - lda $1100 - cmp #$19 - beq animate__B3 -animate__B4: - ldx $1001 - dex - stx $1001 - lda $1001 - cmp #$ff - beq animate__B5 -animate__B6: - lda $1102 - clc - adc #$1 - sta $1102 - lda $1102 - cmp #$19 - beq animate__B7 -animate__B8: - ldx $1103 - dex - stx $1103 - lda $1103 - cmp #$ff - beq animate__B9 -animate__Breturn: - rts -animate__B9: +bend: +main: { + addpoint_from_main: + lda #$1 + sta $2 + ldy #$5 + lda #$0 + sta $8 + lda #$5 + jsr addpoint + b3: + addpoint_from_b3: + lda #$2 + sta $2 + ldy #$8 + lda #$f + jsr addpoint + b4: + addpoint_from_b4: + lda #$3 + sta $2 + ldy #$e + lda #$6 + jsr addpoint + b5: + addpoint_from_b5: + lda #$4 + sta $2 + ldy #$2 + lda #$22 + jsr addpoint + b6: + addpoint_from_b6: + lda #$5 + sta $2 + ldy #$11 + lda #$15 + jsr addpoint + b7: + addpoint_from_b7: + lda #$7 + sta $2 + ldy #$16 + lda #$1f + jsr addpoint + b8: + jsr initscreen + b1: + jsr render + b10: + jsr animate + b11: + jmp b1 + breturn: + rts +} +animate: { + lda $1000 + clc + adc #$1 + sta $1000 + lda $1000 + cmp #$28 + beq b1 + b2: + lda $1100 + clc + adc #$1 + sta $1100 + lda $1100 + cmp #$19 + beq b3 + b4: + ldx $1001 + dex + stx $1001 + lda $1001 + cmp #$ff + beq b5 + b6: + lda $1102 + clc + adc #$1 + sta $1102 + lda $1102 + cmp #$19 + beq b7 + b8: + ldx $1103 + dex + stx $1103 + lda $1103 + cmp #$ff + beq b9 + breturn: + rts +} +b9: lda #$19 sta $1103 lda $1003 @@ -104,181 +106,185 @@ animate__B9: sta $1003 lda $1003 cmp #$28 - bcs animate__B11 - jmp animate__Breturn -animate__B11: + bcs b11 + jmp breturn +b11: lda $1003 sec sbc #$28 sta $1003 - jmp animate__Breturn -animate__B7: + jmp breturn +b7: lda #$0 sta $1102 - jmp animate__B8 -animate__B5: + jmp b8 +b5: lda #$28 sta $1001 - jmp animate__B6 -animate__B3: + jmp b6 +b3: lda #$0 sta $1100 - jmp animate__B4 -animate__B1: + jmp b4 +b1: lda #$0 sta $1000 - jmp animate__B2 -render: -render__B1_from_render: - lda #<$d800 - sta $3 - lda #>$d800 - sta $3+$1 - lda #$0 - sta $2 -render__B1_from_B3: -render__B1: -render__B2_from_B1: - lda #$0 - sta $5 -render__B2_from_B5: -render__B2: - lda $5 - sta $9 - lda $2 - sta $a - jsr findcol -render__B5: - tya - ldy $5 - sta ($3),y - inc $5 - lda $5 - cmp #$28 - bcc render__B2_from_B5 -render__B3: - lda $3 - clc - adc #$28 - sta $3 - bcc !+ - inc $3+$1 -!: - inc $2 - lda $2 - cmp #$19 - bcc render__B1_from_B3 -render__Breturn: - rts -findcol: -findcol__B1_from_findcol: - ldy #$0 - lda #$ff - sta $6 - ldx #$0 -findcol__B1_from_B13: -findcol__B1: - lda $1000,x - sta $7 - lda $1100,x - sta $b - lda $9 - cmp $7 - beq findcol__B2 -findcol__B3: - lda $9 - cmp $7 - bcc findcol__B6 -findcol__B7: - lda $9 - sec - sbc $7 - sta $7 -findcol__B8_from_B7: -findcol__B8: - lda $a - cmp $b - bcc findcol__B9 -findcol__B10: - lda $a - sec - sbc $b - clc - adc $7 -findcol__B11_from_B10: -findcol__B11: - cmp $6 - bcc findcol__B12 -findcol__B13_from_B11: -findcol__B13: - inx - cpx $8 - bcc findcol__B1_from_B13 -findcol__Breturn_from_B13: - jmp findcol__Breturn -findcol__Breturn_from_B2: - ldy #$0 -findcol__Breturn: - rts -findcol__B12: + jmp b2 +render: { + b1_from_render: + lda #<$d800 + sta $3 + lda #>$d800 + sta $3+$1 + lda #$0 + sta $2 + b1_from_b3: + b1: + b2_from_b1: + lda #$0 + sta $5 + b2_from_b5: + b2: + lda $5 + sta $9 + lda $2 + sta $a + jsr findcol + b5: + tya + ldy $5 + sta ($3),y + inc $5 + lda $5 + cmp #$28 + bcc b2_from_b5 + b3: + lda $3 + clc + adc #$28 + sta $3 + bcc !+ + inc $3+$1 + !: + inc $2 + lda $2 + cmp #$19 + bcc b1_from_b3 + breturn: + rts +} +findcol: { + b1_from_findcol: + ldy #$0 + lda #$ff + sta $6 + ldx #$0 + b1_from_b13: + b1: + lda $1000,x + sta $7 + lda $1100,x + sta $b + lda $9 + cmp $7 + beq b2 + b3: + lda $9 + cmp $7 + bcc b6 + b7: + lda $9 + sec + sbc $7 + sta $7 + b8_from_b7: + b8: + lda $a + cmp $b + bcc b9 + b10: + lda $a + sec + sbc $b + clc + adc $7 + b11_from_b10: + b11: + cmp $6 + bcc b12 + b13_from_b11: + b13: + inx + cpx $8 + bcc b1_from_b13 + breturn_from_b13: + jmp breturn + breturn_from_b2: + ldy #$0 + breturn: + rts +} +b12: ldy $1200,x sta $6 -findcol__B13_from_B12: - jmp findcol__B13 -findcol__B9: +b13_from_b12: + jmp b13 +b9: lda $b sec sbc $a clc adc $7 -findcol__B11_from_B9: - jmp findcol__B11 -findcol__B6: +b11_from_b9: + jmp b11 +b6: lda $7 sec sbc $9 sta $7 -findcol__B8_from_B6: - jmp findcol__B8 -findcol__B2: +b8_from_b6: + jmp b8 +b2: lda $a cmp $b - beq findcol__Breturn_from_B2 - jmp findcol__B3 -initscreen: -initscreen__B1_from_initscreen: - lda #<$400 - sta $3 - lda #>$400 - sta $3+$1 -initscreen__B1_from_B1: -initscreen__B1: - ldy #$0 - lda #$e6 - sta ($3),y - inc $3 - bne !+ - inc $3+$1 -!: - lda $3+$1 - cmp #>$7e8 - bcc initscreen__B1_from_B1 - bne !+ - lda $3 - cmp #<$7e8 - bcc initscreen__B1_from_B1 -!: -initscreen__Breturn: - rts -addpoint: - ldx $8 - sta $1000,x - tya - ldy $8 - sta $1100,y - lda $2 - ldx $8 - sta $1200,x - inc $8 -addpoint__Breturn: - rts + beq breturn_from_b2 + jmp b3 +initscreen: { + b1_from_initscreen: + lda #<$400 + sta $3 + lda #>$400 + sta $3+$1 + b1_from_b1: + b1: + ldy #$0 + lda #$e6 + sta ($3),y + inc $3 + bne !+ + inc $3+$1 + !: + lda $3+$1 + cmp #>$7e8 + bcc b1_from_b1 + bne !+ + lda $3 + cmp #<$7e8 + bcc b1_from_b1 + !: + breturn: + rts +} +addpoint: { + ldx $8 + sta $1000,x + tya + ldy $8 + sta $1100,y + lda $2 + ldx $8 + sta $1200,x + inc $8 + breturn: + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/voronoi.cfg b/src/main/java/dk/camelot64/kickc/test/ref/voronoi.cfg index 4a9870515..c9106dd7c 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/voronoi.cfg +++ b/src/main/java/dk/camelot64/kickc/test/ref/voronoi.cfg @@ -1,8 +1,8 @@ -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] call addpoint param-assignment [ ] to:main::@3 main::@3: from main @@ -34,7 +34,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 [11] return [ ] - to:@RETURN + to:@return animate: from main::@10 [12] (byte~) animate::$0 ← * (word) 4096 [ animate::$0 ] [13] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ] @@ -72,7 +72,7 @@ animate::@8: from animate::@6 animate::@7 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 [37] return [ ] - to:@RETURN + to:@return animate::@9: from animate::@8 [38] *((word) 4355) ← (byte) 25 [ ] [39] (byte~) animate::$20 ← * (word) 4099 [ animate::$20 ] @@ -123,7 +123,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 [63] return [ ] - to:@RETURN + to:@return findcol: from render::@2 to:findcol::@1 findcol::@1: from findcol findcol::@13 @@ -161,7 +161,7 @@ findcol::@13: from findcol::@11 findcol::@12 findcol::@return: from findcol::@13 findcol::@2 [79] (byte) findcol::return#0 ← phi( findcol::@13/(byte) findcol::mincol#2 findcol::@2/(byte) 0 ) [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] [80] return [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] - to:@RETURN + to:@return findcol::@12: from findcol::@11 [81] (byte) findcol::mincol#1 ← (word) 4608 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#6 findcol::mincol#1 numpoints#1 ] [82] (byte~) findcol::diff#13 ← (byte) findcol::diff#6 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::mincol#1 findcol::diff#13 numpoints#1 ] @@ -186,7 +186,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 [91] return [ ] - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 [92] (byte) addpoint::c#6 ← phi( main/(byte) 1 main::@3/(byte) 2 main::@4/(byte) 3 main::@5/(byte) 4 main::@6/(byte) 5 main::@7/(byte) 7 ) [ numpoints#19 addpoint::x#6 addpoint::y#6 addpoint::c#6 ] [92] (byte) addpoint::y#6 ← phi( main/(byte) 5 main::@3/(byte) 8 main::@4/(byte) 14 main::@5/(byte) 2 main::@6/(byte) 17 main::@7/(byte) 22 ) [ numpoints#19 addpoint::x#6 addpoint::y#6 addpoint::c#6 ] @@ -199,4 +199,4 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 to:addpoint::@return addpoint::@return: from addpoint [97] return [ ] - to:@RETURN + to:@return diff --git a/src/main/java/dk/camelot64/kickc/test/ref/voronoi.log b/src/main/java/dk/camelot64/kickc/test/ref/voronoi.log index fc2b79251..f15ba9adc 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/voronoi.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/voronoi.log @@ -437,7 +437,7 @@ SYMBOLS (byte) render::y INITIAL CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte*) SCREEN ← (word) 1024 (byte*) COLORS ← (word) 55296 (byte) FILL ← (byte) 230 @@ -465,8 +465,8 @@ main::@2: from main::@1 to:main::@return main::@return: from main::@2 return - to:@RETURN -@1: from @BEGIN + to:@return +@1: from @begin to:@2 animate: from (byte~) animate::$0 ← (byte[256]) XPOS *idx (byte) 0 @@ -564,7 +564,7 @@ animate::@24: from to:animate::@11 animate::@return: from animate::@10 return - to:@RETURN + to:@return @2: from @1 to:@3 addpoint: from @@ -575,7 +575,7 @@ addpoint: from to:addpoint::@return addpoint::@return: from addpoint return - to:@RETURN + to:@return @3: from @2 to:@4 initscreen: from @@ -592,7 +592,7 @@ initscreen::@2: from initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@2 return - to:@RETURN + to:@return @4: from @3 to:@5 render: from @@ -621,7 +621,7 @@ render::@4: from render::@3 to:render::@return render::@return: from render::@4 return - to:@RETURN + to:@return @5: from @4 to:@6 findcol: from @@ -661,7 +661,7 @@ findcol::@17: from findcol::@return: from findcol::@27 findcol::@28 findcol::@4 (byte) findcol::return ← (byte) findcol::return return (byte) findcol::return - to:@RETURN + to:@return findcol::@18: from to:findcol::@5 findcol::@6: from findcol::@20 findcol::@3 @@ -722,8 +722,8 @@ findcol::@27: from findcol::@13 findcol::@28: from to:findcol::@return @6: from @5 - to:@END -@END: from @6 + to:@end +@end: from @6 Removing empty block main::@2 Removing empty block @1 @@ -764,7 +764,7 @@ Removing empty block findcol::@26 Removing empty block findcol::@28 Removing empty block @6 CONTROL FLOW GRAPH -@BEGIN: from +@begin: from (byte*) SCREEN ← (word) 1024 (byte*) COLORS ← (word) 55296 (byte) FILL ← (byte) 230 @@ -773,7 +773,7 @@ CONTROL FLOW GRAPH (byte[256]) YPOS ← (word) 4352 (byte[256]) COLS ← (word) 4608 (void~) $0 ← call main - to:@END + to:@end main: from (void~) main::$0 ← call addpoint (byte) 5 (byte) 5 (byte) 1 (void~) main::$1 ← call addpoint (byte) 15 (byte) 8 (byte) 2 @@ -790,7 +790,7 @@ main::@1: from main main::@1 to:main::@return main::@return: from main::@1 return - to:@RETURN + to:@return animate: from (byte~) animate::$0 ← (byte[256]) XPOS *idx (byte) 0 (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 @@ -859,7 +859,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from *((byte[256]) XPOS + (byte) numpoints) ← (byte) addpoint::x *((byte[256]) YPOS + (byte) numpoints) ← (byte) addpoint::y @@ -868,7 +868,7 @@ addpoint: from to:addpoint::@return addpoint::@return: from addpoint return - to:@RETURN + to:@return initscreen: from (byte*) initscreen::screen ← (byte*) SCREEN to:initscreen::@1 @@ -881,7 +881,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from (byte*) render::colline ← (byte*) COLORS (byte) render::y ← (byte) 0 @@ -906,7 +906,7 @@ render::@3: from render::@2 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from (byte) findcol::mindiff ← (byte) 255 (byte) findcol::mincol ← (byte) 0 @@ -934,7 +934,7 @@ findcol::@4: from findcol::@2 findcol::@return: from findcol::@27 findcol::@4 (byte) findcol::return ← (byte) findcol::return return (byte) findcol::return - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte~) findcol::$5 ← (byte) findcol::xp - (byte) findcol::x (byte) findcol::diff ← (byte~) findcol::$5 @@ -974,14 +974,14 @@ findcol::@13: from findcol::@11 findcol::@12 findcol::@27: from findcol::@13 (byte) findcol::return ← (byte) findcol::mincol to:findcol::@return -@END: from @BEGIN +@end: from @begin PROCEDURE MODIFY VARIABLE ANALYSIS main modifies numpoints addpoint modifies numpoints CONTROL FLOW GRAPH WITH ASSIGNMENT CALL -@BEGIN: from +@begin: from (byte*) SCREEN ← (word) 1024 (byte*) COLORS ← (word) 55296 (byte) FILL ← (byte) 230 @@ -991,10 +991,10 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL (byte[256]) COLS ← (word) 4608 call main param-assignment to:@7 -@7: from @BEGIN +@7: from @begin (byte) numpoints ← (byte) numpoints - to:@END -main: from @BEGIN + to:@end +main: from @begin (byte) addpoint::x ← (byte) 5 (byte) addpoint::y ← (byte) 5 (byte) addpoint::c ← (byte) 1 @@ -1053,7 +1053,7 @@ main::@11: from main::@10 main::@return: from main::@11 (byte) numpoints ← (byte) numpoints return - to:@RETURN + to:@return animate: from main::@10 (byte~) animate::$0 ← (byte[256]) XPOS *idx (byte) 0 (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 @@ -1122,7 +1122,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 *((byte[256]) XPOS + (byte) numpoints) ← (byte) addpoint::x *((byte[256]) YPOS + (byte) numpoints) ← (byte) addpoint::y @@ -1132,7 +1132,7 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 addpoint::@return: from addpoint (byte) numpoints ← (byte) numpoints return - to:@RETURN + to:@return initscreen: from main::@8 (byte*) initscreen::screen ← (byte*) SCREEN to:initscreen::@1 @@ -1145,7 +1145,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from main::@1 (byte*) render::colline ← (byte*) COLORS (byte) render::y ← (byte) 0 @@ -1175,7 +1175,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from render::@2 (byte) findcol::mindiff ← (byte) 255 (byte) findcol::mincol ← (byte) 0 @@ -1203,7 +1203,7 @@ findcol::@4: from findcol::@2 findcol::@return: from findcol::@27 findcol::@4 (byte) findcol::return ← (byte) findcol::return return (byte) findcol::return - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte~) findcol::$5 ← (byte) findcol::xp - (byte) findcol::x (byte) findcol::diff ← (byte~) findcol::$5 @@ -1243,7 +1243,7 @@ findcol::@13: from findcol::@11 findcol::@12 findcol::@27: from findcol::@13 (byte) findcol::return ← (byte) findcol::mincol to:findcol::@return -@END: from @7 +@end: from @7 Completing Phi functions... Completing Phi functions... @@ -1260,7 +1260,7 @@ Completing Phi functions... Completing Phi functions... Completing Phi functions... CONTROL FLOW GRAPH SSA -@BEGIN: from +@begin: from (byte*) SCREEN#0 ← (word) 1024 (byte*) COLORS#0 ← (word) 55296 (byte) FILL#0 ← (byte) 230 @@ -1270,18 +1270,18 @@ CONTROL FLOW GRAPH SSA (byte[256]) COLS#0 ← (word) 4608 call main param-assignment to:@7 -@7: from @BEGIN - (byte) numpoints#11 ← phi( @BEGIN/(byte) numpoints#0 ) +@7: from @begin + (byte) numpoints#11 ← phi( @begin/(byte) numpoints#0 ) (byte) numpoints#1 ← (byte) numpoints#11 - to:@END -main: from @BEGIN - (byte*) COLORS#12 ← phi( @BEGIN/(byte*) COLORS#0 ) - (byte) FILL#9 ← phi( @BEGIN/(byte) FILL#0 ) - (byte*) SCREEN#9 ← phi( @BEGIN/(byte*) SCREEN#0 ) - (byte[256]) COLS#3 ← phi( @BEGIN/(byte[256]) COLS#0 ) - (byte[256]) YPOS#13 ← phi( @BEGIN/(byte[256]) YPOS#0 ) - (byte[256]) XPOS#13 ← phi( @BEGIN/(byte[256]) XPOS#0 ) - (byte) numpoints#22 ← phi( @BEGIN/(byte) numpoints#0 ) + to:@end +main: from @begin + (byte*) COLORS#12 ← phi( @begin/(byte*) COLORS#0 ) + (byte) FILL#9 ← phi( @begin/(byte) FILL#0 ) + (byte*) SCREEN#9 ← phi( @begin/(byte*) SCREEN#0 ) + (byte[256]) COLS#3 ← phi( @begin/(byte[256]) COLS#0 ) + (byte[256]) YPOS#13 ← phi( @begin/(byte[256]) YPOS#0 ) + (byte[256]) XPOS#13 ← phi( @begin/(byte[256]) XPOS#0 ) + (byte) numpoints#22 ← phi( @begin/(byte) numpoints#0 ) (byte) addpoint::x#0 ← (byte) 5 (byte) addpoint::y#0 ← (byte) 5 (byte) addpoint::c#0 ← (byte) 1 @@ -1403,7 +1403,7 @@ main::@return: from main::@11 (byte) numpoints#18 ← phi( main::@11/(byte) numpoints#23 ) (byte) numpoints#8 ← (byte) numpoints#18 return - to:@RETURN + to:@return animate: from main::@10 (byte[256]) YPOS#9 ← phi( main::@10/(byte[256]) YPOS#21 ) (byte[256]) XPOS#1 ← phi( main::@10/(byte[256]) XPOS#9 ) @@ -1493,7 +1493,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 (byte[256]) COLS#1 ← phi( main/(byte[256]) COLS#3 main::@3/(byte[256]) COLS#4 main::@4/(byte[256]) COLS#5 main::@5/(byte[256]) COLS#6 main::@6/(byte[256]) COLS#7 main::@7/(byte[256]) COLS#8 ) (byte) addpoint::c#6 ← phi( main/(byte) addpoint::c#0 main::@3/(byte) addpoint::c#1 main::@4/(byte) addpoint::c#2 main::@5/(byte) addpoint::c#3 main::@6/(byte) addpoint::c#4 main::@7/(byte) addpoint::c#5 ) @@ -1511,7 +1511,7 @@ addpoint::@return: from addpoint (byte) numpoints#20 ← phi( addpoint/(byte) numpoints#9 ) (byte) numpoints#10 ← (byte) numpoints#20 return - to:@RETURN + to:@return initscreen: from main::@8 (byte) FILL#2 ← phi( main::@8/(byte) FILL#3 ) (byte*) SCREEN#1 ← phi( main::@8/(byte*) SCREEN#3 ) @@ -1529,7 +1529,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from main::@1 (byte) numpoints#41 ← phi( main::@1/(byte) numpoints#29 ) (byte[256]) COLS#23 ← phi( main::@1/(byte[256]) COLS#25 ) @@ -1591,7 +1591,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from render::@2 (byte) numpoints#37 ← phi( render::@2/(byte) numpoints#38 ) (byte[256]) COLS#18 ← phi( render::@2/(byte[256]) COLS#20 ) @@ -1657,7 +1657,7 @@ findcol::@return: from findcol::@27 findcol::@4 (byte) findcol::return#5 ← phi( findcol::@27/(byte) findcol::return#3 findcol::@4/(byte) findcol::return#1 ) (byte) findcol::return#2 ← (byte) findcol::return#5 return (byte) findcol::return#2 - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte) findcol::mincol#8 ← phi( findcol::@3/(byte) findcol::mincol#10 ) (byte[256]) YPOS#36 ← phi( findcol::@3/(byte[256]) YPOS#38 ) @@ -1780,10 +1780,10 @@ findcol::@27: from findcol::@13 (byte) findcol::mincol#2 ← phi( findcol::@13/(byte) findcol::mincol#3 ) (byte) findcol::return#3 ← (byte) findcol::mincol#2 to:findcol::@return -@END: from @7 +@end: from @7 CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN -@BEGIN: from +@begin: from (byte*) SCREEN#0 ← (word) 1024 (byte*) COLORS#0 ← (word) 55296 (byte) FILL#0 ← (byte) 230 @@ -1793,18 +1793,18 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN (byte[256]) COLS#0 ← (word) 4608 call main param-assignment to:@7 -@7: from @BEGIN - (byte) numpoints#11 ← phi( @BEGIN/(byte) numpoints#8 ) +@7: from @begin + (byte) numpoints#11 ← phi( @begin/(byte) numpoints#8 ) (byte) numpoints#1 ← (byte) numpoints#11 - to:@END -main: from @BEGIN - (byte*) COLORS#12 ← phi( @BEGIN/(byte*) COLORS#0 ) - (byte) FILL#9 ← phi( @BEGIN/(byte) FILL#0 ) - (byte*) SCREEN#9 ← phi( @BEGIN/(byte*) SCREEN#0 ) - (byte[256]) COLS#3 ← phi( @BEGIN/(byte[256]) COLS#0 ) - (byte[256]) YPOS#13 ← phi( @BEGIN/(byte[256]) YPOS#0 ) - (byte[256]) XPOS#13 ← phi( @BEGIN/(byte[256]) XPOS#0 ) - (byte) numpoints#22 ← phi( @BEGIN/(byte) numpoints#0 ) + to:@end +main: from @begin + (byte*) COLORS#12 ← phi( @begin/(byte*) COLORS#0 ) + (byte) FILL#9 ← phi( @begin/(byte) FILL#0 ) + (byte*) SCREEN#9 ← phi( @begin/(byte*) SCREEN#0 ) + (byte[256]) COLS#3 ← phi( @begin/(byte[256]) COLS#0 ) + (byte[256]) YPOS#13 ← phi( @begin/(byte[256]) YPOS#0 ) + (byte[256]) XPOS#13 ← phi( @begin/(byte[256]) XPOS#0 ) + (byte) numpoints#22 ← phi( @begin/(byte) numpoints#0 ) (byte) addpoint::x#0 ← (byte) 5 (byte) addpoint::y#0 ← (byte) 5 (byte) addpoint::c#0 ← (byte) 1 @@ -1926,7 +1926,7 @@ main::@return: from main::@11 (byte) numpoints#18 ← phi( main::@11/(byte) numpoints#23 ) (byte) numpoints#8 ← (byte) numpoints#18 return - to:@RETURN + to:@return animate: from main::@10 (byte[256]) YPOS#9 ← phi( main::@10/(byte[256]) YPOS#21 ) (byte[256]) XPOS#1 ← phi( main::@10/(byte[256]) XPOS#9 ) @@ -2016,7 +2016,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 (byte[256]) COLS#1 ← phi( main/(byte[256]) COLS#3 main::@3/(byte[256]) COLS#4 main::@4/(byte[256]) COLS#5 main::@5/(byte[256]) COLS#6 main::@6/(byte[256]) COLS#7 main::@7/(byte[256]) COLS#8 ) (byte) addpoint::c#6 ← phi( main/(byte) addpoint::c#0 main::@3/(byte) addpoint::c#1 main::@4/(byte) addpoint::c#2 main::@5/(byte) addpoint::c#3 main::@6/(byte) addpoint::c#4 main::@7/(byte) addpoint::c#5 ) @@ -2034,7 +2034,7 @@ addpoint::@return: from addpoint (byte) numpoints#20 ← phi( addpoint/(byte) numpoints#9 ) (byte) numpoints#10 ← (byte) numpoints#20 return - to:@RETURN + to:@return initscreen: from main::@8 (byte) FILL#2 ← phi( main::@8/(byte) FILL#3 ) (byte*) SCREEN#1 ← phi( main::@8/(byte*) SCREEN#3 ) @@ -2052,7 +2052,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from main::@1 (byte) numpoints#41 ← phi( main::@1/(byte) numpoints#29 ) (byte[256]) COLS#23 ← phi( main::@1/(byte[256]) COLS#25 ) @@ -2115,7 +2115,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from render::@2 (byte) numpoints#37 ← phi( render::@2/(byte) numpoints#38 ) (byte[256]) COLS#18 ← phi( render::@2/(byte[256]) COLS#20 ) @@ -2181,7 +2181,7 @@ findcol::@return: from findcol::@27 findcol::@4 (byte) findcol::return#5 ← phi( findcol::@27/(byte) findcol::return#3 findcol::@4/(byte) findcol::return#1 ) (byte) findcol::return#2 ← (byte) findcol::return#5 return - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte) findcol::mincol#8 ← phi( findcol::@3/(byte) findcol::mincol#10 ) (byte[256]) YPOS#36 ← phi( findcol::@3/(byte[256]) YPOS#38 ) @@ -2304,7 +2304,7 @@ findcol::@27: from findcol::@13 (byte) findcol::mincol#2 ← phi( findcol::@13/(byte) findcol::mincol#3 ) (byte) findcol::return#3 ← (byte) findcol::mincol#2 to:findcol::@return -@END: from @7 +@end: from @7 Constant (byte*) SCREEN#0 (word) 1024 Constant (byte*) COLORS#0 (word) 55296 @@ -2339,21 +2339,21 @@ Constant (byte) findcol::i#0 (byte) 0 Constant (byte) findcol::return#1 (byte) 0 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment to:@7 -@7: from @BEGIN - (byte) numpoints#11 ← phi( @BEGIN/(byte) numpoints#8 ) +@7: from @begin + (byte) numpoints#11 ← phi( @begin/(byte) numpoints#8 ) (byte) numpoints#1 ← (byte) numpoints#11 - to:@END -main: from @BEGIN - (byte*) COLORS#12 ← phi( @BEGIN/(word) 55296 ) - (byte) FILL#9 ← phi( @BEGIN/(byte) 230 ) - (byte*) SCREEN#9 ← phi( @BEGIN/(word) 1024 ) - (byte[256]) COLS#3 ← phi( @BEGIN/(word) 4608 ) - (byte[256]) YPOS#13 ← phi( @BEGIN/(word) 4352 ) - (byte[256]) XPOS#13 ← phi( @BEGIN/(word) 4096 ) - (byte) numpoints#22 ← phi( @BEGIN/(byte) 0 ) + to:@end +main: from @begin + (byte*) COLORS#12 ← phi( @begin/(word) 55296 ) + (byte) FILL#9 ← phi( @begin/(byte) 230 ) + (byte*) SCREEN#9 ← phi( @begin/(word) 1024 ) + (byte[256]) COLS#3 ← phi( @begin/(word) 4608 ) + (byte[256]) YPOS#13 ← phi( @begin/(word) 4352 ) + (byte[256]) XPOS#13 ← phi( @begin/(word) 4096 ) + (byte) numpoints#22 ← phi( @begin/(byte) 0 ) call addpoint param-assignment to:main::@3 main::@3: from main @@ -2457,7 +2457,7 @@ main::@return: from main::@11 (byte) numpoints#18 ← phi( main::@11/(byte) numpoints#23 ) (byte) numpoints#8 ← (byte) numpoints#18 return - to:@RETURN + to:@return animate: from main::@10 (byte[256]) YPOS#9 ← phi( main::@10/(byte[256]) YPOS#21 ) (byte[256]) XPOS#1 ← phi( main::@10/(byte[256]) XPOS#9 ) @@ -2547,7 +2547,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 (byte[256]) COLS#1 ← phi( main/(byte[256]) COLS#3 main::@3/(byte[256]) COLS#4 main::@4/(byte[256]) COLS#5 main::@5/(byte[256]) COLS#6 main::@6/(byte[256]) COLS#7 main::@7/(byte[256]) COLS#8 ) (byte) addpoint::c#6 ← phi( main/(byte) 1 main::@3/(byte) 2 main::@4/(byte) 3 main::@5/(byte) 4 main::@6/(byte) 5 main::@7/(byte) 7 ) @@ -2565,7 +2565,7 @@ addpoint::@return: from addpoint (byte) numpoints#20 ← phi( addpoint/(byte) numpoints#9 ) (byte) numpoints#10 ← (byte) numpoints#20 return - to:@RETURN + to:@return initscreen: from main::@8 (byte) FILL#2 ← phi( main::@8/(byte) FILL#3 ) (byte*) SCREEN#1 ← phi( main::@8/(byte*) SCREEN#3 ) @@ -2583,7 +2583,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from main::@1 (byte) numpoints#41 ← phi( main::@1/(byte) numpoints#29 ) (byte[256]) COLS#23 ← phi( main::@1/(byte[256]) COLS#25 ) @@ -2644,7 +2644,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from render::@2 (byte) numpoints#37 ← phi( render::@2/(byte) numpoints#38 ) (byte[256]) COLS#18 ← phi( render::@2/(byte[256]) COLS#20 ) @@ -2706,7 +2706,7 @@ findcol::@return: from findcol::@27 findcol::@4 (byte) findcol::return#5 ← phi( findcol::@27/(byte) findcol::return#3 findcol::@4/(byte) 0 ) (byte) findcol::return#2 ← (byte) findcol::return#5 return - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte) findcol::mincol#8 ← phi( findcol::@3/(byte) findcol::mincol#10 ) (byte[256]) YPOS#36 ← phi( findcol::@3/(byte[256]) YPOS#38 ) @@ -2829,7 +2829,7 @@ findcol::@27: from findcol::@13 (byte) findcol::mincol#2 ← phi( findcol::@13/(byte) findcol::mincol#3 ) (byte) findcol::return#3 ← (byte) findcol::mincol#2 to:findcol::@return -@END: from @7 +@end: from @7 Multiple usages for variable. Not optimizing sub-constant (byte*) SCREEN#2 Not aliassing across scopes: initscreen::screen#0 SCREEN#1 @@ -2918,19 +2918,19 @@ Alias (byte) findcol::mincol#1 = (byte~) findcol::$13 Alias (byte) findcol::mincol#2 = (byte) findcol::mincol#3 (byte) findcol::return#3 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment to:@7 -@7: from @BEGIN - to:@END -main: from @BEGIN - (byte*) COLORS#10 ← phi( @BEGIN/(word) 55296 ) - (byte) FILL#2 ← phi( @BEGIN/(byte) 230 ) - (byte*) SCREEN#1 ← phi( @BEGIN/(word) 1024 ) - (byte[256]) COLS#27 ← phi( @BEGIN/(word) 4608 ) - (byte[256]) YPOS#13 ← phi( @BEGIN/(word) 4352 ) - (byte[256]) XPOS#13 ← phi( @BEGIN/(word) 4096 ) - (byte) numpoints#22 ← phi( @BEGIN/(byte) 0 ) +@7: from @begin + to:@end +main: from @begin + (byte*) COLORS#10 ← phi( @begin/(word) 55296 ) + (byte) FILL#2 ← phi( @begin/(byte) 230 ) + (byte*) SCREEN#1 ← phi( @begin/(word) 1024 ) + (byte[256]) COLS#27 ← phi( @begin/(word) 4608 ) + (byte[256]) YPOS#13 ← phi( @begin/(word) 4352 ) + (byte[256]) XPOS#13 ← phi( @begin/(word) 4096 ) + (byte) numpoints#22 ← phi( @begin/(byte) 0 ) call addpoint param-assignment to:main::@3 main::@3: from main @@ -2969,7 +2969,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return animate: from main::@10 (byte~) animate::$0 ← (byte[256]) XPOS#1 *idx (byte) 0 (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 @@ -3046,7 +3046,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 (byte[256]) COLS#1 ← phi( main/(byte[256]) COLS#27 main::@3/(byte[256]) COLS#27 main::@4/(byte[256]) COLS#27 main::@5/(byte[256]) COLS#27 main::@6/(byte[256]) COLS#27 main::@7/(byte[256]) COLS#27 ) (byte) addpoint::c#6 ← phi( main/(byte) 1 main::@3/(byte) 2 main::@4/(byte) 3 main::@5/(byte) 4 main::@6/(byte) 5 main::@7/(byte) 7 ) @@ -3062,7 +3062,7 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 to:addpoint::@return addpoint::@return: from addpoint return - to:@RETURN + to:@return initscreen: from main::@8 (byte*) initscreen::screen#0 ← (byte*) SCREEN#1 to:initscreen::@1 @@ -3078,7 +3078,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from main::@1 (byte*) render::colline#0 ← (byte*) COLORS#1 to:render::@1 @@ -3117,7 +3117,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from render::@2 to:findcol::@1 findcol::@1: from findcol findcol::@13 @@ -3159,7 +3159,7 @@ findcol::@4: from findcol::@2 findcol::@return: from findcol::@27 findcol::@4 (byte) findcol::return#0 ← phi( findcol::@27/(byte) findcol::mincol#2 findcol::@4/(byte) 0 ) return - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte) findcol::diff#0 ← (byte) findcol::xp#1 - (byte) findcol::x#2 to:findcol::@8 @@ -3222,7 +3222,7 @@ findcol::@13: from findcol::@11 findcol::@12 to:findcol::@27 findcol::@27: from findcol::@13 to:findcol::@return -@END: from @7 +@end: from @7 Redundant Phi (byte) numpoints#22 (byte) 0 Redundant Phi (byte[256]) XPOS#13 (word) 4096 @@ -3281,12 +3281,12 @@ Redundant Phi (byte) findcol::y#9 (byte) findcol::y#11 Redundant Phi (byte[256]) COLS#19 (byte[256]) COLS#2 Succesful SSA optimization Pass2RedundantPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment to:@7 -@7: from @BEGIN - to:@END -main: from @BEGIN +@7: from @begin + to:@end +main: from @begin call addpoint param-assignment to:main::@3 main::@3: from main @@ -3325,7 +3325,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return animate: from main::@10 (byte~) animate::$0 ← (byte[256]) XPOS#1 *idx (byte) 0 (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 @@ -3394,7 +3394,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 (byte) addpoint::c#6 ← phi( main/(byte) 1 main::@3/(byte) 2 main::@4/(byte) 3 main::@5/(byte) 4 main::@6/(byte) 5 main::@7/(byte) 7 ) (byte) addpoint::y#6 ← phi( main/(byte) 5 main::@3/(byte) 8 main::@4/(byte) 14 main::@5/(byte) 2 main::@6/(byte) 17 main::@7/(byte) 22 ) @@ -3407,7 +3407,7 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 to:addpoint::@return addpoint::@return: from addpoint return - to:@RETURN + to:@return initscreen: from main::@8 (byte*) initscreen::screen#0 ← (word) 1024 to:initscreen::@1 @@ -3423,7 +3423,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from main::@1 (byte*) render::colline#0 ← (byte*) COLORS#1 to:render::@1 @@ -3462,7 +3462,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from render::@2 to:findcol::@1 findcol::@1: from findcol findcol::@13 @@ -3493,7 +3493,7 @@ findcol::@4: from findcol::@2 findcol::@return: from findcol::@27 findcol::@4 (byte) findcol::return#0 ← phi( findcol::@27/(byte) findcol::mincol#2 findcol::@4/(byte) 0 ) return - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte) findcol::diff#0 ← (byte) findcol::xp#0 - (byte) findcol::x#1 to:findcol::@8 @@ -3530,7 +3530,7 @@ findcol::@13: from findcol::@11 findcol::@12 to:findcol::@27 findcol::@27: from findcol::@13 to:findcol::@return -@END: from @7 +@end: from @7 Self Phi Eliminated (byte*) COLORS#1 Self Phi Eliminated (byte[256]) XPOS#1 @@ -3553,12 +3553,12 @@ Self Phi Eliminated (byte[256]) COLS#16 Self Phi Eliminated (byte) numpoints#35 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment to:@7 -@7: from @BEGIN - to:@END -main: from @BEGIN +@7: from @begin + to:@end +main: from @begin call addpoint param-assignment to:main::@3 main::@3: from main @@ -3597,7 +3597,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return animate: from main::@10 (byte~) animate::$0 ← (byte[256]) XPOS#1 *idx (byte) 0 (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 @@ -3666,7 +3666,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 (byte) addpoint::c#6 ← phi( main/(byte) 1 main::@3/(byte) 2 main::@4/(byte) 3 main::@5/(byte) 4 main::@6/(byte) 5 main::@7/(byte) 7 ) (byte) addpoint::y#6 ← phi( main/(byte) 5 main::@3/(byte) 8 main::@4/(byte) 14 main::@5/(byte) 2 main::@6/(byte) 17 main::@7/(byte) 22 ) @@ -3679,7 +3679,7 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 to:addpoint::@return addpoint::@return: from addpoint return - to:@RETURN + to:@return initscreen: from main::@8 (byte*) initscreen::screen#0 ← (word) 1024 to:initscreen::@1 @@ -3695,7 +3695,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from main::@1 (byte*) render::colline#0 ← (byte*) COLORS#1 to:render::@1 @@ -3734,7 +3734,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from render::@2 to:findcol::@1 findcol::@1: from findcol findcol::@13 @@ -3765,7 +3765,7 @@ findcol::@4: from findcol::@2 findcol::@return: from findcol::@27 findcol::@4 (byte) findcol::return#0 ← phi( findcol::@27/(byte) findcol::mincol#2 findcol::@4/(byte) 0 ) return - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte) findcol::diff#0 ← (byte) findcol::xp#0 - (byte) findcol::x#1 to:findcol::@8 @@ -3802,7 +3802,7 @@ findcol::@13: from findcol::@11 findcol::@12 to:findcol::@27 findcol::@27: from findcol::@13 to:findcol::@return -@END: from @7 +@end: from @7 Simple Condition (boolean~) animate::$3 if((byte~) animate::$2==(byte) 40) goto animate::@1 Simple Condition (boolean~) animate::$7 if((byte~) animate::$6==(byte) 25) goto animate::@3 @@ -3821,12 +3821,12 @@ Simple Condition (boolean~) findcol::$12 if((byte) findcol::diff#6<(byte) findco Simple Condition (boolean~) findcol::$14 if((byte) findcol::i#1<(byte) numpoints#35) goto findcol::@1 Succesful SSA optimization Pass2ConditionalJumpSimplification CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment to:@7 -@7: from @BEGIN - to:@END -main: from @BEGIN +@7: from @begin + to:@end +main: from @begin call addpoint param-assignment to:main::@3 main::@3: from main @@ -3865,7 +3865,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return animate: from main::@10 (byte~) animate::$0 ← (byte[256]) XPOS#1 *idx (byte) 0 (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 @@ -3928,7 +3928,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 (byte) addpoint::c#6 ← phi( main/(byte) 1 main::@3/(byte) 2 main::@4/(byte) 3 main::@5/(byte) 4 main::@6/(byte) 5 main::@7/(byte) 7 ) (byte) addpoint::y#6 ← phi( main/(byte) 5 main::@3/(byte) 8 main::@4/(byte) 14 main::@5/(byte) 2 main::@6/(byte) 17 main::@7/(byte) 22 ) @@ -3941,7 +3941,7 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 to:addpoint::@return addpoint::@return: from addpoint return - to:@RETURN + to:@return initscreen: from main::@8 (byte*) initscreen::screen#0 ← (word) 1024 to:initscreen::@1 @@ -3956,7 +3956,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from main::@1 (byte*) render::colline#0 ← (byte*) COLORS#1 to:render::@1 @@ -3993,7 +3993,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from render::@2 to:findcol::@1 findcol::@1: from findcol findcol::@13 @@ -4021,7 +4021,7 @@ findcol::@4: from findcol::@2 findcol::@return: from findcol::@27 findcol::@4 (byte) findcol::return#0 ← phi( findcol::@27/(byte) findcol::mincol#2 findcol::@4/(byte) 0 ) return - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte) findcol::diff#0 ← (byte) findcol::xp#0 - (byte) findcol::x#1 to:findcol::@8 @@ -4055,7 +4055,7 @@ findcol::@13: from findcol::@11 findcol::@12 to:findcol::@27 findcol::@27: from findcol::@13 to:findcol::@return -@END: from @7 +@end: from @7 Culled Empty Block (label) @7 Culled Empty Block (label) main::@9 @@ -4063,10 +4063,10 @@ Culled Empty Block (label) findcol::@4 Culled Empty Block (label) findcol::@27 Succesful SSA optimization Pass2CullEmptyBlocks CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call addpoint param-assignment to:main::@3 main::@3: from main @@ -4103,7 +4103,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return animate: from main::@10 (byte~) animate::$0 ← (byte[256]) XPOS#1 *idx (byte) 0 (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 @@ -4166,7 +4166,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 (byte) addpoint::c#6 ← phi( main/(byte) 1 main::@3/(byte) 2 main::@4/(byte) 3 main::@5/(byte) 4 main::@6/(byte) 5 main::@7/(byte) 7 ) (byte) addpoint::y#6 ← phi( main/(byte) 5 main::@3/(byte) 8 main::@4/(byte) 14 main::@5/(byte) 2 main::@6/(byte) 17 main::@7/(byte) 22 ) @@ -4179,7 +4179,7 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 to:addpoint::@return addpoint::@return: from addpoint return - to:@RETURN + to:@return initscreen: from main::@8 (byte*) initscreen::screen#0 ← (word) 1024 to:initscreen::@1 @@ -4194,7 +4194,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from main::@1 (byte*) render::colline#0 ← (byte*) COLORS#1 to:render::@1 @@ -4231,7 +4231,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from render::@2 to:findcol::@1 findcol::@1: from findcol findcol::@13 @@ -4257,7 +4257,7 @@ findcol::@3: from findcol::@1 findcol::@2 findcol::@return: from findcol::@13 findcol::@2 (byte) findcol::return#0 ← phi( findcol::@13/(byte) findcol::mincol#2 findcol::@2/(byte) 0 ) return - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte) findcol::diff#0 ← (byte) findcol::xp#0 - (byte) findcol::x#1 to:findcol::@8 @@ -4289,7 +4289,7 @@ findcol::@13: from findcol::@11 findcol::@12 (byte) findcol::i#1 ← ++ (byte) findcol::i#12 if((byte) findcol::i#1<(byte) numpoints#35) goto findcol::@1 to:findcol::@return -@END: from @BEGIN +@end: from @begin Constant (byte*) COLORS#1 (word) 55296 Constant (byte[256]) XPOS#1 (word) 4096 @@ -4300,10 +4300,10 @@ Constant (byte) FILL#1 (byte) 230 Constant (byte*) SCREEN#2 (word) 1024 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call addpoint param-assignment to:main::@3 main::@3: from main @@ -4336,7 +4336,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return animate: from main::@10 (byte~) animate::$0 ← (word) 4096 *idx (byte) 0 (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 @@ -4399,7 +4399,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 (byte) addpoint::c#6 ← phi( main/(byte) 1 main::@3/(byte) 2 main::@4/(byte) 3 main::@5/(byte) 4 main::@6/(byte) 5 main::@7/(byte) 7 ) (byte) addpoint::y#6 ← phi( main/(byte) 5 main::@3/(byte) 8 main::@4/(byte) 14 main::@5/(byte) 2 main::@6/(byte) 17 main::@7/(byte) 22 ) @@ -4412,7 +4412,7 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 to:addpoint::@return addpoint::@return: from addpoint return - to:@RETURN + to:@return initscreen: from main::@8 to:initscreen::@1 initscreen::@1: from initscreen initscreen::@1 @@ -4424,7 +4424,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from main::@1 (byte*) render::colline#0 ← (word) 55296 to:render::@1 @@ -4461,7 +4461,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from render::@2 to:findcol::@1 findcol::@1: from findcol findcol::@13 @@ -4487,7 +4487,7 @@ findcol::@3: from findcol::@1 findcol::@2 findcol::@return: from findcol::@13 findcol::@2 (byte) findcol::return#0 ← phi( findcol::@13/(byte) findcol::mincol#2 findcol::@2/(byte) 0 ) return - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte) findcol::diff#0 ← (byte) findcol::xp#0 - (byte) findcol::x#1 to:findcol::@8 @@ -4519,7 +4519,7 @@ findcol::@13: from findcol::@11 findcol::@12 (byte) findcol::i#1 ← ++ (byte) findcol::i#12 if((byte) findcol::i#1<(byte) numpoints#35) goto findcol::@1 to:findcol::@return -@END: from @BEGIN +@end: from @begin Consolidated referenced array index constant in assignment animate::$0 Consolidated assigned array index constant in assignment *(4096) @@ -4548,10 +4548,10 @@ Consolidated referenced array index constant in assignment animate::$24 Consolidated assigned array index constant in assignment *(4099) Succesful SSA optimization Pass2ConstantAdditionElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call addpoint param-assignment to:main::@3 main::@3: from main @@ -4584,7 +4584,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return animate: from main::@10 (byte~) animate::$0 ← * (word) 4096 (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 @@ -4647,7 +4647,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 (byte) addpoint::c#6 ← phi( main/(byte) 1 main::@3/(byte) 2 main::@4/(byte) 3 main::@5/(byte) 4 main::@6/(byte) 5 main::@7/(byte) 7 ) (byte) addpoint::y#6 ← phi( main/(byte) 5 main::@3/(byte) 8 main::@4/(byte) 14 main::@5/(byte) 2 main::@6/(byte) 17 main::@7/(byte) 22 ) @@ -4660,7 +4660,7 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 to:addpoint::@return addpoint::@return: from addpoint return - to:@RETURN + to:@return initscreen: from main::@8 to:initscreen::@1 initscreen::@1: from initscreen initscreen::@1 @@ -4672,7 +4672,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from main::@1 (byte*) render::colline#0 ← (word) 55296 to:render::@1 @@ -4709,7 +4709,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from render::@2 to:findcol::@1 findcol::@1: from findcol findcol::@13 @@ -4735,7 +4735,7 @@ findcol::@3: from findcol::@1 findcol::@2 findcol::@return: from findcol::@13 findcol::@2 (byte) findcol::return#0 ← phi( findcol::@13/(byte) findcol::mincol#2 findcol::@2/(byte) 0 ) return - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte) findcol::diff#0 ← (byte) findcol::xp#0 - (byte) findcol::x#1 to:findcol::@8 @@ -4767,7 +4767,7 @@ findcol::@13: from findcol::@11 findcol::@12 (byte) findcol::i#1 ← ++ (byte) findcol::i#12 if((byte) findcol::i#1<(byte) numpoints#35) goto findcol::@1 to:findcol::@return -@END: from @BEGIN +@end: from @begin Not aliassing across scopes: findcol::x#0 render::x#2 Not aliassing across scopes: findcol::y#0 render::y#2 @@ -4783,10 +4783,10 @@ Alias (byte) findcol::x#0 = (byte) findcol::x#1 Alias (byte) findcol::y#0 = (byte) findcol::y#1 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call addpoint param-assignment to:main::@3 main::@3: from main @@ -4818,7 +4818,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return animate: from main::@10 (byte~) animate::$0 ← * (word) 4096 (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 @@ -4881,7 +4881,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 (byte) addpoint::c#6 ← phi( main/(byte) 1 main::@3/(byte) 2 main::@4/(byte) 3 main::@5/(byte) 4 main::@6/(byte) 5 main::@7/(byte) 7 ) (byte) addpoint::y#6 ← phi( main/(byte) 5 main::@3/(byte) 8 main::@4/(byte) 14 main::@5/(byte) 2 main::@6/(byte) 17 main::@7/(byte) 22 ) @@ -4894,7 +4894,7 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 to:addpoint::@return addpoint::@return: from addpoint return - to:@RETURN + to:@return initscreen: from main::@8 to:initscreen::@1 initscreen::@1: from initscreen initscreen::@1 @@ -4906,7 +4906,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from main::@1 (byte*) render::colline#0 ← (word) 55296 to:render::@1 @@ -4937,7 +4937,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from render::@2 to:findcol::@1 findcol::@1: from findcol findcol::@13 @@ -4957,7 +4957,7 @@ findcol::@3: from findcol::@1 findcol::@2 findcol::@return: from findcol::@13 findcol::@2 (byte) findcol::return#0 ← phi( findcol::@13/(byte) findcol::mincol#2 findcol::@2/(byte) 0 ) return - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte) findcol::diff#0 ← (byte) findcol::xp#0 - (byte) findcol::x#0 to:findcol::@8 @@ -4989,7 +4989,7 @@ findcol::@13: from findcol::@11 findcol::@12 (byte) findcol::i#1 ← ++ (byte) findcol::i#12 if((byte) findcol::i#1<(byte) numpoints#35) goto findcol::@1 to:findcol::@return -@END: from @BEGIN +@end: from @begin Self Phi Eliminated (byte[256]) XPOS#19 Self Phi Eliminated (byte[256]) YPOS#19 @@ -4997,10 +4997,10 @@ Self Phi Eliminated (byte[256]) COLS#16 Self Phi Eliminated (byte) numpoints#35 Succesful SSA optimization Pass2SelfPhiElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call addpoint param-assignment to:main::@3 main::@3: from main @@ -5032,7 +5032,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return animate: from main::@10 (byte~) animate::$0 ← * (word) 4096 (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 @@ -5095,7 +5095,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 (byte) addpoint::c#6 ← phi( main/(byte) 1 main::@3/(byte) 2 main::@4/(byte) 3 main::@5/(byte) 4 main::@6/(byte) 5 main::@7/(byte) 7 ) (byte) addpoint::y#6 ← phi( main/(byte) 5 main::@3/(byte) 8 main::@4/(byte) 14 main::@5/(byte) 2 main::@6/(byte) 17 main::@7/(byte) 22 ) @@ -5108,7 +5108,7 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 to:addpoint::@return addpoint::@return: from addpoint return - to:@RETURN + to:@return initscreen: from main::@8 to:initscreen::@1 initscreen::@1: from initscreen initscreen::@1 @@ -5120,7 +5120,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from main::@1 (byte*) render::colline#0 ← (word) 55296 to:render::@1 @@ -5151,7 +5151,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from render::@2 to:findcol::@1 findcol::@1: from findcol findcol::@13 @@ -5171,7 +5171,7 @@ findcol::@3: from findcol::@1 findcol::@2 findcol::@return: from findcol::@13 findcol::@2 (byte) findcol::return#0 ← phi( findcol::@13/(byte) findcol::mincol#2 findcol::@2/(byte) 0 ) return - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte) findcol::diff#0 ← (byte) findcol::xp#0 - (byte) findcol::x#0 to:findcol::@8 @@ -5203,7 +5203,7 @@ findcol::@13: from findcol::@11 findcol::@12 (byte) findcol::i#1 ← ++ (byte) findcol::i#12 if((byte) findcol::i#1<(byte) numpoints#35) goto findcol::@1 to:findcol::@return -@END: from @BEGIN +@end: from @begin Constant (byte*~) initscreen::$0 (word) 2024 Constant (byte*) render::colline#0 (word) 55296 @@ -5212,10 +5212,10 @@ Constant (byte[256]) YPOS#19 (word) 4352 Constant (byte[256]) COLS#16 (word) 4608 Succesful SSA optimization Pass2ConstantPropagation CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call addpoint param-assignment to:main::@3 main::@3: from main @@ -5247,7 +5247,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return animate: from main::@10 (byte~) animate::$0 ← * (word) 4096 (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 @@ -5310,7 +5310,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 (byte) addpoint::c#6 ← phi( main/(byte) 1 main::@3/(byte) 2 main::@4/(byte) 3 main::@5/(byte) 4 main::@6/(byte) 5 main::@7/(byte) 7 ) (byte) addpoint::y#6 ← phi( main/(byte) 5 main::@3/(byte) 8 main::@4/(byte) 14 main::@5/(byte) 2 main::@6/(byte) 17 main::@7/(byte) 22 ) @@ -5323,7 +5323,7 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 to:addpoint::@return addpoint::@return: from addpoint return - to:@RETURN + to:@return initscreen: from main::@8 to:initscreen::@1 initscreen::@1: from initscreen initscreen::@1 @@ -5334,7 +5334,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from main::@1 to:render::@1 render::@1: from render render::@3 @@ -5361,7 +5361,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from render::@2 to:findcol::@1 findcol::@1: from findcol findcol::@13 @@ -5381,7 +5381,7 @@ findcol::@3: from findcol::@1 findcol::@2 findcol::@return: from findcol::@13 findcol::@2 (byte) findcol::return#0 ← phi( findcol::@13/(byte) findcol::mincol#2 findcol::@2/(byte) 0 ) return - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte) findcol::diff#0 ← (byte) findcol::xp#0 - (byte) findcol::x#0 to:findcol::@8 @@ -5413,7 +5413,7 @@ findcol::@13: from findcol::@11 findcol::@12 (byte) findcol::i#1 ← ++ (byte) findcol::i#12 if((byte) findcol::i#1<(byte) numpoints#35) goto findcol::@1 to:findcol::@return -@END: from @BEGIN +@end: from @begin Multiple usages for variable. Not optimizing sub-constant (byte) findcol::i#12 Multiple usages for variable. Not optimizing sub-constant (byte) findcol::i#12 @@ -5424,10 +5424,10 @@ Not aliassing across scopes: render::col#0 findcol::return#0 Alias (byte) numpoints#1 = (byte) numpoints#35 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH -@BEGIN: from +@begin: from call main param-assignment - to:@END -main: from @BEGIN + to:@end +main: from @begin call addpoint param-assignment to:main::@3 main::@3: from main @@ -5459,7 +5459,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return animate: from main::@10 (byte~) animate::$0 ← * (word) 4096 (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 @@ -5522,7 +5522,7 @@ animate::@11: from animate::@9 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 (byte) addpoint::c#6 ← phi( main/(byte) 1 main::@3/(byte) 2 main::@4/(byte) 3 main::@5/(byte) 4 main::@6/(byte) 5 main::@7/(byte) 7 ) (byte) addpoint::y#6 ← phi( main/(byte) 5 main::@3/(byte) 8 main::@4/(byte) 14 main::@5/(byte) 2 main::@6/(byte) 17 main::@7/(byte) 22 ) @@ -5535,7 +5535,7 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 to:addpoint::@return addpoint::@return: from addpoint return - to:@RETURN + to:@return initscreen: from main::@8 to:initscreen::@1 initscreen::@1: from initscreen initscreen::@1 @@ -5546,7 +5546,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return render: from main::@1 to:render::@1 render::@1: from render render::@3 @@ -5572,7 +5572,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return findcol: from render::@2 to:findcol::@1 findcol::@1: from findcol findcol::@13 @@ -5592,7 +5592,7 @@ findcol::@3: from findcol::@1 findcol::@2 findcol::@return: from findcol::@13 findcol::@2 (byte) findcol::return#0 ← phi( findcol::@13/(byte) findcol::mincol#2 findcol::@2/(byte) 0 ) return - to:@RETURN + to:@return findcol::@6: from findcol::@3 (byte) findcol::diff#0 ← (byte) findcol::xp#0 - (byte) findcol::x#0 to:findcol::@8 @@ -5624,7 +5624,7 @@ findcol::@13: from findcol::@11 findcol::@12 (byte) findcol::i#1 ← ++ (byte) findcol::i#12 if((byte) findcol::i#1<(byte) numpoints#1) goto findcol::@1 to:findcol::@return -@END: from @BEGIN +@end: from @begin Multiple usages for variable. Not optimizing sub-constant (byte) findcol::i#12 Multiple usages for variable. Not optimizing sub-constant (byte) findcol::i#12 @@ -5632,20 +5632,20 @@ Multiple usages for variable. Not optimizing sub-constant (byte) findcol::i#12 Not aliassing across scopes: findcol::x#0 render::x#2 Not aliassing across scopes: findcol::y#0 render::y#2 Not aliassing across scopes: render::col#0 findcol::return#0 -Block Sequence Planned @BEGIN @END main main::@3 main::@4 main::@5 main::@6 main::@7 main::@8 main::@1 main::@10 main::@11 main::@return animate animate::@2 animate::@4 animate::@6 animate::@8 animate::@return animate::@9 animate::@11 animate::@7 animate::@5 animate::@3 animate::@1 render render::@1 render::@2 render::@5 render::@3 render::@return findcol findcol::@1 findcol::@3 findcol::@7 findcol::@8 findcol::@10 findcol::@11 findcol::@13 findcol::@return findcol::@12 findcol::@9 findcol::@6 findcol::@2 initscreen initscreen::@1 initscreen::@return addpoint addpoint::@return +Block Sequence Planned @begin @end main main::@3 main::@4 main::@5 main::@6 main::@7 main::@8 main::@1 main::@10 main::@11 main::@return animate animate::@2 animate::@4 animate::@6 animate::@8 animate::@return animate::@9 animate::@11 animate::@7 animate::@5 animate::@3 animate::@1 render render::@1 render::@2 render::@5 render::@3 render::@return findcol findcol::@1 findcol::@3 findcol::@7 findcol::@8 findcol::@10 findcol::@11 findcol::@13 findcol::@return findcol::@12 findcol::@9 findcol::@6 findcol::@2 initscreen initscreen::@1 initscreen::@return addpoint addpoint::@return Added new block during phi lifting render::@6(between render::@3 and render::@1) Added new block during phi lifting render::@7(between render::@5 and render::@2) Added new block during phi lifting findcol::@29(between findcol::@13 and findcol::@1) Added new block during phi lifting findcol::@30(between findcol::@11 and findcol::@13) Added new block during phi lifting findcol::@31(between findcol::@13 and findcol::@return) Added new block during phi lifting initscreen::@3(between initscreen::@1 and initscreen::@1) -Block Sequence Planned @BEGIN @END main main::@3 main::@4 main::@5 main::@6 main::@7 main::@8 main::@1 main::@10 main::@11 main::@return animate animate::@2 animate::@4 animate::@6 animate::@8 animate::@return animate::@9 animate::@11 animate::@7 animate::@5 animate::@3 animate::@1 render render::@1 render::@2 render::@5 render::@3 render::@return render::@6 render::@7 findcol findcol::@1 findcol::@3 findcol::@7 findcol::@8 findcol::@10 findcol::@11 findcol::@30 findcol::@13 findcol::@31 findcol::@return findcol::@29 findcol::@12 findcol::@9 findcol::@6 findcol::@2 initscreen initscreen::@1 initscreen::@return initscreen::@3 addpoint addpoint::@return +Block Sequence Planned @begin @end main main::@3 main::@4 main::@5 main::@6 main::@7 main::@8 main::@1 main::@10 main::@11 main::@return animate animate::@2 animate::@4 animate::@6 animate::@8 animate::@return animate::@9 animate::@11 animate::@7 animate::@5 animate::@3 animate::@1 render render::@1 render::@2 render::@5 render::@3 render::@return render::@6 render::@7 findcol findcol::@1 findcol::@3 findcol::@7 findcol::@8 findcol::@10 findcol::@11 findcol::@30 findcol::@13 findcol::@31 findcol::@return findcol::@29 findcol::@12 findcol::@9 findcol::@6 findcol::@2 initscreen initscreen::@1 initscreen::@return initscreen::@3 addpoint addpoint::@return CONTROL FLOW GRAPH - PHI LIFTED -@BEGIN: from +@begin: from call main param-assignment - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin call addpoint param-assignment to:main::@3 main::@3: from main @@ -5682,7 +5682,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 return - to:@RETURN + to:@return animate: from main::@10 (byte~) animate::$0 ← * (word) 4096 (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 @@ -5720,7 +5720,7 @@ animate::@8: from animate::@6 animate::@7 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 return - to:@RETURN + to:@return animate::@9: from animate::@8 *((word) 4355) ← (byte) 25 (byte~) animate::$20 ← * (word) 4099 @@ -5771,7 +5771,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 return - to:@RETURN + to:@return render::@6: from render::@3 (byte~) render::y#6 ← (byte) render::y#1 (byte*~) render::colline#6 ← (byte*) render::colline#1 @@ -5825,7 +5825,7 @@ findcol::@31: from findcol::@13 findcol::@return: from findcol::@2 findcol::@31 (byte) findcol::return#0 ← phi( findcol::@31/(byte~) findcol::mincol#16 findcol::@2/(byte) 0 ) return - to:@RETURN + to:@return findcol::@29: from findcol::@13 (byte~) findcol::i#13 ← (byte) findcol::i#1 (byte~) findcol::mindiff#12 ← (byte) findcol::mindiff#11 @@ -5858,7 +5858,7 @@ initscreen::@1: from initscreen initscreen::@3 to:initscreen::@return initscreen::@return: from initscreen::@1 return - to:@RETURN + to:@return initscreen::@3: from initscreen::@1 (byte*~) initscreen::screen#3 ← (byte*) initscreen::screen#1 to:initscreen::@1 @@ -5874,7 +5874,7 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 to:addpoint::@return addpoint::@return: from addpoint return - to:@RETURN + to:@return Propagating live ranges... Propagating live ranges... @@ -5939,11 +5939,11 @@ Propagated render::y#2 through call [60] call findcol param-assignment Propagated render::colline#2 through call [60] call findcol param-assignment Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] call addpoint param-assignment [ numpoints#1 ] to:main::@3 main::@3: from main @@ -5980,7 +5980,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 [16] return [ ] - to:@RETURN + to:@return animate: from main::@10 [17] (byte~) animate::$0 ← * (word) 4096 [ animate::$0 ] [18] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ] @@ -6018,7 +6018,7 @@ animate::@8: from animate::@6 animate::@7 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 [42] return [ ] - to:@RETURN + to:@return animate::@9: from animate::@8 [43] *((word) 4355) ← (byte) 25 [ ] [44] (byte~) animate::$20 ← * (word) 4099 [ animate::$20 ] @@ -6069,7 +6069,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 [68] return [ ] - to:@RETURN + to:@return render::@6: from render::@3 [69] (byte~) render::y#6 ← (byte) render::y#1 [ render::y#6 render::colline#1 ] [70] (byte*~) render::colline#6 ← (byte*) render::colline#1 [ render::y#6 render::colline#6 ] @@ -6123,7 +6123,7 @@ findcol::@31: from findcol::@13 findcol::@return: from findcol::@2 findcol::@31 [92] (byte) findcol::return#0 ← phi( findcol::@31/(byte~) findcol::mincol#16 findcol::@2/(byte) 0 ) [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] [93] return [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] - to:@RETURN + to:@return findcol::@29: from findcol::@13 [94] (byte~) findcol::i#13 ← (byte) findcol::i#1 [ numpoints#1 render::x#2 render::y#2 render::colline#2 findcol::i#13 findcol::x#0 findcol::y#0 findcol::mincol#2 findcol::mindiff#11 ] [95] (byte~) findcol::mindiff#12 ← (byte) findcol::mindiff#11 [ numpoints#1 render::x#2 render::y#2 render::colline#2 findcol::i#13 findcol::mindiff#12 findcol::x#0 findcol::y#0 findcol::mincol#2 ] @@ -6156,7 +6156,7 @@ initscreen::@1: from initscreen initscreen::@3 to:initscreen::@return initscreen::@return: from initscreen::@1 [110] return [ ] - to:@RETURN + to:@return initscreen::@3: from initscreen::@1 [111] (byte*~) initscreen::screen#3 ← (byte*) initscreen::screen#1 [ initscreen::screen#3 ] to:initscreen::@1 @@ -6172,7 +6172,7 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 to:addpoint::@return addpoint::@return: from addpoint [117] return [ numpoints#1 ] - to:@RETURN + to:@return Created 16 initial phi equivalence classes Coalesced [2] numpoints#43 ← numpoints#1 @@ -6203,7 +6203,7 @@ Culled Empty Block (label) findcol::@30 Culled Empty Block (label) findcol::@31 Culled Empty Block (label) findcol::@29 Culled Empty Block (label) initscreen::@3 -Block Sequence Planned @BEGIN @END main main::@3 main::@4 main::@5 main::@6 main::@7 main::@8 main::@1 main::@10 main::@11 main::@return animate animate::@2 animate::@4 animate::@6 animate::@8 animate::@return animate::@9 animate::@11 animate::@7 animate::@5 animate::@3 animate::@1 render render::@1 render::@2 render::@5 render::@3 render::@return findcol findcol::@1 findcol::@3 findcol::@7 findcol::@8 findcol::@10 findcol::@11 findcol::@13 findcol::@return findcol::@12 findcol::@9 findcol::@6 findcol::@2 initscreen initscreen::@1 initscreen::@return addpoint addpoint::@return +Block Sequence Planned @begin @end main main::@3 main::@4 main::@5 main::@6 main::@7 main::@8 main::@1 main::@10 main::@11 main::@return animate animate::@2 animate::@4 animate::@6 animate::@8 animate::@return animate::@9 animate::@11 animate::@7 animate::@5 animate::@3 animate::@1 render render::@1 render::@2 render::@5 render::@3 render::@return findcol findcol::@1 findcol::@3 findcol::@7 findcol::@8 findcol::@10 findcol::@11 findcol::@13 findcol::@return findcol::@12 findcol::@9 findcol::@6 findcol::@2 initscreen initscreen::@1 initscreen::@return addpoint addpoint::@return Propagating live ranges... Propagating live ranges... Propagating live ranges... @@ -6247,11 +6247,11 @@ Propagated render::y#2 through call [55] call findcol param-assignment Propagated render::colline#2 through call [55] call findcol param-assignment Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED -@BEGIN: from +@begin: from [0] call main param-assignment [ ] - to:@END -@END: from @BEGIN -main: from @BEGIN + to:@end +@end: from @begin +main: from @begin [1] call addpoint param-assignment [ ] to:main::@3 main::@3: from main @@ -6283,7 +6283,7 @@ main::@11: from main::@10 to:main::@return main::@return: from main::@11 [11] return [ ] - to:@RETURN + to:@return animate: from main::@10 [12] (byte~) animate::$0 ← * (word) 4096 [ animate::$0 ] [13] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ] @@ -6321,7 +6321,7 @@ animate::@8: from animate::@6 animate::@7 to:animate::@return animate::@return: from animate::@11 animate::@8 animate::@9 [37] return [ ] - to:@RETURN + to:@return animate::@9: from animate::@8 [38] *((word) 4355) ← (byte) 25 [ ] [39] (byte~) animate::$20 ← * (word) 4099 [ animate::$20 ] @@ -6372,7 +6372,7 @@ render::@3: from render::@5 to:render::@return render::@return: from render::@3 [63] return [ ] - to:@RETURN + to:@return findcol: from render::@2 to:findcol::@1 findcol::@1: from findcol findcol::@13 @@ -6410,7 +6410,7 @@ findcol::@13: from findcol::@11 findcol::@12 findcol::@return: from findcol::@13 findcol::@2 [79] (byte) findcol::return#0 ← phi( findcol::@13/(byte) findcol::mincol#2 findcol::@2/(byte) 0 ) [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] [80] return [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] - to:@RETURN + to:@return findcol::@12: from findcol::@11 [81] (byte) findcol::mincol#1 ← (word) 4608 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#6 findcol::mincol#1 numpoints#1 ] [82] (byte~) findcol::diff#13 ← (byte) findcol::diff#6 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::mincol#1 findcol::diff#13 numpoints#1 ] @@ -6435,7 +6435,7 @@ initscreen::@1: from initscreen initscreen::@1 to:initscreen::@return initscreen::@return: from initscreen::@1 [91] return [ ] - to:@RETURN + to:@return addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 [92] (byte) addpoint::c#6 ← phi( main/(byte) 1 main::@3/(byte) 2 main::@4/(byte) 3 main::@5/(byte) 4 main::@6/(byte) 5 main::@7/(byte) 7 ) [ numpoints#19 addpoint::x#6 addpoint::y#6 addpoint::c#6 ] [92] (byte) addpoint::y#6 ← phi( main/(byte) 5 main::@3/(byte) 8 main::@4/(byte) 14 main::@5/(byte) 2 main::@6/(byte) 17 main::@7/(byte) 22 ) [ numpoints#19 addpoint::x#6 addpoint::y#6 addpoint::c#6 ] @@ -6448,7 +6448,7 @@ addpoint: from main main::@3 main::@4 main::@5 main::@6 main::@7 to:addpoint::@return addpoint::@return: from addpoint [97] return [ ] - to:@RETURN + to:@return CALL GRAPH Calls in [] to 0:main @@ -6456,55 +6456,55 @@ Calls in [main] to 1:addpoint 2:addpoint 3:addpoint 4:addpoint 5:addpoint 6:addp Calls in [render] to 55:findcol DOMINATORS -@BEGIN dominated by @BEGIN -@END dominated by @BEGIN @END -main dominated by @BEGIN main -main::@3 dominated by @BEGIN main::@3 main -main::@4 dominated by @BEGIN main::@4 main::@3 main -main::@5 dominated by @BEGIN main::@4 main::@3 main::@5 main -main::@6 dominated by @BEGIN main::@4 main::@3 main::@6 main::@5 main -main::@7 dominated by @BEGIN main::@4 main::@3 main::@6 main::@5 main::@7 main -main::@8 dominated by @BEGIN main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -main::@1 dominated by @BEGIN main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -main::@10 dominated by @BEGIN main::@10 main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -main::@11 dominated by @BEGIN main::@10 main::@11 main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -main::@return dominated by @BEGIN main::@return main::@10 main::@11 main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -animate dominated by @BEGIN animate main::@10 main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -animate::@2 dominated by @BEGIN animate animate::@2 main::@10 main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -animate::@4 dominated by @BEGIN animate animate::@4 animate::@2 main::@10 main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -animate::@6 dominated by @BEGIN animate animate::@6 animate::@4 animate::@2 main::@10 main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -animate::@8 dominated by @BEGIN animate animate::@6 animate::@4 animate::@2 animate::@8 main::@10 main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -animate::@return dominated by @BEGIN animate animate::@return animate::@6 animate::@4 animate::@2 animate::@8 main::@10 main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -animate::@9 dominated by @BEGIN animate animate::@6 animate::@4 animate::@2 animate::@9 animate::@8 main::@10 main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -animate::@11 dominated by @BEGIN animate animate::@11 animate::@6 animate::@4 animate::@2 animate::@9 animate::@8 main::@10 main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -animate::@7 dominated by @BEGIN animate animate::@6 animate::@4 animate::@2 animate::@7 main::@10 main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -animate::@5 dominated by @BEGIN animate animate::@5 animate::@4 animate::@2 main::@10 main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -animate::@3 dominated by @BEGIN animate animate::@3 animate::@2 main::@10 main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -animate::@1 dominated by @BEGIN animate animate::@1 main::@10 main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -render dominated by @BEGIN render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -render::@1 dominated by @BEGIN render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -render::@2 dominated by @BEGIN render::@2 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -render::@5 dominated by @BEGIN render::@2 render::@5 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -render::@3 dominated by @BEGIN render::@3 render::@2 render::@5 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -render::@return dominated by @BEGIN render::@3 render::@2 render::@5 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 render::@return main -findcol dominated by @BEGIN findcol render::@2 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -findcol::@1 dominated by @BEGIN findcol render::@2 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 findcol::@1 main -findcol::@3 dominated by @BEGIN findcol render::@2 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 findcol::@3 findcol::@1 main -findcol::@7 dominated by @BEGIN findcol render::@2 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 findcol::@7 main::@8 findcol::@3 findcol::@1 main -findcol::@8 dominated by @BEGIN findcol render::@2 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 findcol::@8 main::@7 main::@8 findcol::@3 findcol::@1 main -findcol::@10 dominated by @BEGIN findcol render::@2 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 findcol::@8 main::@8 findcol::@3 findcol::@1 findcol::@10 main -findcol::@11 dominated by @BEGIN findcol render::@2 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 findcol::@8 main::@8 findcol::@3 findcol::@1 findcol::@11 main -findcol::@13 dominated by @BEGIN findcol render::@2 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 findcol::@8 main::@8 findcol::@3 findcol::@1 findcol::@13 findcol::@11 main -findcol::@return dominated by @BEGIN findcol render::@2 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 findcol::@1 findcol::@return main -findcol::@12 dominated by @BEGIN findcol render::@2 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 findcol::@8 main::@8 findcol::@3 findcol::@1 findcol::@12 findcol::@11 main -findcol::@9 dominated by @BEGIN findcol render::@2 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 findcol::@8 main::@8 findcol::@3 findcol::@1 findcol::@9 main -findcol::@6 dominated by @BEGIN findcol render::@2 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 findcol::@6 findcol::@3 findcol::@1 main -findcol::@2 dominated by @BEGIN findcol render::@2 render::@1 render main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 findcol::@2 findcol::@1 main -initscreen dominated by @BEGIN initscreen main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main -initscreen::@1 dominated by @BEGIN main::@4 initscreen main::@3 main::@6 main::@5 main::@7 main::@8 main initscreen::@1 -initscreen::@return dominated by @BEGIN main::@4 initscreen main::@3 main::@6 main::@5 main::@7 main::@8 initscreen::@return main initscreen::@1 -addpoint dominated by @BEGIN addpoint main -addpoint::@return dominated by @BEGIN addpoint addpoint::@return main +@begin dominated by @begin +@end dominated by @end @begin +main dominated by @begin main +main::@3 dominated by @begin main::@3 main +main::@4 dominated by @begin main::@4 main::@3 main +main::@5 dominated by @begin main::@4 main::@3 main::@5 main +main::@6 dominated by @begin main::@4 main::@3 main::@6 main::@5 main +main::@7 dominated by @begin main::@4 main::@3 main::@6 main::@5 main::@7 main +main::@8 dominated by @begin main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +main::@1 dominated by @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +main::@10 dominated by main::@10 @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +main::@11 dominated by main::@10 main::@11 @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +main::@return dominated by main::@return main::@10 main::@11 @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +animate dominated by animate main::@10 @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +animate::@2 dominated by animate animate::@2 main::@10 @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +animate::@4 dominated by animate animate::@4 animate::@2 main::@10 @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +animate::@6 dominated by animate animate::@6 animate::@4 animate::@2 main::@10 @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +animate::@8 dominated by animate animate::@6 animate::@4 animate::@2 animate::@8 main::@10 @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +animate::@return dominated by animate animate::@return animate::@6 animate::@4 animate::@2 animate::@8 main::@10 @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +animate::@9 dominated by animate animate::@6 animate::@4 animate::@2 animate::@9 animate::@8 main::@10 @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +animate::@11 dominated by animate animate::@11 animate::@6 animate::@4 animate::@2 animate::@9 animate::@8 main::@10 @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +animate::@7 dominated by animate animate::@6 animate::@4 animate::@2 animate::@7 main::@10 @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +animate::@5 dominated by animate animate::@5 animate::@4 animate::@2 main::@10 @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +animate::@3 dominated by animate animate::@3 animate::@2 main::@10 @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +animate::@1 dominated by animate animate::@1 main::@10 @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +render dominated by render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +render::@1 dominated by render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +render::@2 dominated by render::@2 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +render::@5 dominated by render::@2 render::@5 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +render::@3 dominated by render::@3 render::@2 render::@5 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +render::@return dominated by render::@3 render::@2 render::@5 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 render::@return main +findcol dominated by findcol render::@2 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +findcol::@1 dominated by findcol render::@2 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 findcol::@1 main +findcol::@3 dominated by findcol render::@2 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 findcol::@3 findcol::@1 main +findcol::@7 dominated by findcol render::@2 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 findcol::@7 main::@8 findcol::@3 findcol::@1 main +findcol::@8 dominated by findcol render::@2 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 findcol::@8 main::@7 main::@8 findcol::@3 findcol::@1 main +findcol::@10 dominated by findcol render::@2 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 findcol::@8 main::@8 findcol::@3 findcol::@1 findcol::@10 main +findcol::@11 dominated by findcol render::@2 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 findcol::@8 main::@8 findcol::@3 findcol::@1 findcol::@11 main +findcol::@13 dominated by findcol render::@2 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 findcol::@8 main::@8 findcol::@3 findcol::@1 findcol::@13 findcol::@11 main +findcol::@return dominated by findcol render::@2 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 findcol::@1 findcol::@return main +findcol::@12 dominated by findcol render::@2 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 findcol::@8 main::@8 findcol::@3 findcol::@1 findcol::@12 findcol::@11 main +findcol::@9 dominated by findcol render::@2 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 findcol::@8 main::@8 findcol::@3 findcol::@1 findcol::@9 main +findcol::@6 dominated by findcol render::@2 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 findcol::@6 findcol::@3 findcol::@1 main +findcol::@2 dominated by findcol render::@2 render::@1 render @begin main::@1 main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 findcol::@2 findcol::@1 main +initscreen dominated by @begin initscreen main::@4 main::@3 main::@6 main::@5 main::@7 main::@8 main +initscreen::@1 dominated by @begin main::@4 initscreen main::@3 main::@6 main::@5 main::@7 main::@8 main initscreen::@1 +initscreen::@return dominated by @begin main::@4 initscreen main::@3 main::@6 main::@5 main::@7 main::@8 initscreen::@return main initscreen::@1 +addpoint dominated by addpoint @begin main +addpoint::@return dominated by addpoint addpoint::@return @begin main Found back edge: Loop head: main::@1 tails: main::@11 blocks: null Found back edge: Loop head: render::@2 tails: render::@5 blocks: null @@ -6753,252 +6753,254 @@ Allocated zp byte:41 to zp byte:41 [ findcol::yp#0 ] Allocated zp byte:42 to zp byte:42 [ findcol::$10 ] Allocated zp byte:43 to zp byte:43 [ findcol::$8 ] INITIAL ASM -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main - jmp BEND -//SEG2 @END -BEND: + jmp bend +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call addpoint param-assignment [ ] -//SEG5 [92] phi from main to addpoint -addpoint_from_main: -//SEG6 [92] phi (byte) addpoint::c#6 = (byte) 1 -- zpby1=coby1 - lda #$1 - sta $10 -//SEG7 [92] phi (byte) addpoint::y#6 = (byte) 5 -- zpby1=coby1 - lda #$5 - sta $f -//SEG8 [92] phi (byte) numpoints#19 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $e -//SEG9 [92] phi (byte) addpoint::x#6 = (byte) 5 -- zpby1=coby1 - lda #$5 - sta $d - jsr addpoint - jmp main__B3 -//SEG10 main::@3 -main__B3: -//SEG11 [2] call addpoint param-assignment [ ] -//SEG12 [92] phi from main::@3 to addpoint -addpoint_from_B3: -//SEG13 [92] phi (byte) addpoint::c#6 = (byte) 2 -- zpby1=coby1 - lda #$2 - sta $10 -//SEG14 [92] phi (byte) addpoint::y#6 = (byte) 8 -- zpby1=coby1 - lda #$8 - sta $f -//SEG15 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG16 [92] phi (byte) addpoint::x#6 = (byte) 15 -- zpby1=coby1 - lda #$f - sta $d - jsr addpoint - jmp main__B4 -//SEG17 main::@4 -main__B4: -//SEG18 [3] call addpoint param-assignment [ ] -//SEG19 [92] phi from main::@4 to addpoint -addpoint_from_B4: -//SEG20 [92] phi (byte) addpoint::c#6 = (byte) 3 -- zpby1=coby1 - lda #$3 - sta $10 -//SEG21 [92] phi (byte) addpoint::y#6 = (byte) 14 -- zpby1=coby1 - lda #$e - sta $f -//SEG22 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG23 [92] phi (byte) addpoint::x#6 = (byte) 6 -- zpby1=coby1 - lda #$6 - sta $d - jsr addpoint - jmp main__B5 -//SEG24 main::@5 -main__B5: -//SEG25 [4] call addpoint param-assignment [ ] -//SEG26 [92] phi from main::@5 to addpoint -addpoint_from_B5: -//SEG27 [92] phi (byte) addpoint::c#6 = (byte) 4 -- zpby1=coby1 - lda #$4 - sta $10 -//SEG28 [92] phi (byte) addpoint::y#6 = (byte) 2 -- zpby1=coby1 - lda #$2 - sta $f -//SEG29 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG30 [92] phi (byte) addpoint::x#6 = (byte) 34 -- zpby1=coby1 - lda #$22 - sta $d - jsr addpoint - jmp main__B6 -//SEG31 main::@6 -main__B6: -//SEG32 [5] call addpoint param-assignment [ ] -//SEG33 [92] phi from main::@6 to addpoint -addpoint_from_B6: -//SEG34 [92] phi (byte) addpoint::c#6 = (byte) 5 -- zpby1=coby1 - lda #$5 - sta $10 -//SEG35 [92] phi (byte) addpoint::y#6 = (byte) 17 -- zpby1=coby1 - lda #$11 - sta $f -//SEG36 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG37 [92] phi (byte) addpoint::x#6 = (byte) 21 -- zpby1=coby1 - lda #$15 - sta $d - jsr addpoint - jmp main__B7 -//SEG38 main::@7 -main__B7: -//SEG39 [6] call addpoint param-assignment [ ] -//SEG40 [92] phi from main::@7 to addpoint -addpoint_from_B7: -//SEG41 [92] phi (byte) addpoint::c#6 = (byte) 7 -- zpby1=coby1 - lda #$7 - sta $10 -//SEG42 [92] phi (byte) addpoint::y#6 = (byte) 22 -- zpby1=coby1 - lda #$16 - sta $f -//SEG43 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG44 [92] phi (byte) addpoint::x#6 = (byte) 31 -- zpby1=coby1 - lda #$1f - sta $d - jsr addpoint - jmp main__B8 -//SEG45 main::@8 -main__B8: -//SEG46 [7] call initscreen param-assignment [ ] - jsr initscreen - jmp main__B1 -//SEG47 main::@1 -main__B1: -//SEG48 [8] call render param-assignment [ ] - jsr render - jmp main__B10 -//SEG49 main::@10 -main__B10: -//SEG50 [9] call animate param-assignment [ ] - jsr animate - jmp main__B11 -//SEG51 main::@11 -main__B11: -//SEG52 [10] if(true) goto main::@1 [ ] -- true_then_la1 - jmp main__B1 - jmp main__Breturn -//SEG53 main::@return -main__Breturn: -//SEG54 [11] return [ ] - rts +main: { + //SEG4 [1] call addpoint param-assignment [ ] + //SEG5 [92] phi from main to addpoint + addpoint_from_main: + //SEG6 [92] phi (byte) addpoint::c#6 = (byte) 1 -- zpby1=coby1 + lda #$1 + sta $10 + //SEG7 [92] phi (byte) addpoint::y#6 = (byte) 5 -- zpby1=coby1 + lda #$5 + sta $f + //SEG8 [92] phi (byte) numpoints#19 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $e + //SEG9 [92] phi (byte) addpoint::x#6 = (byte) 5 -- zpby1=coby1 + lda #$5 + sta $d + jsr addpoint + jmp b3 + //SEG10 main::@3 + b3: + //SEG11 [2] call addpoint param-assignment [ ] + //SEG12 [92] phi from main::@3 to addpoint + addpoint_from_b3: + //SEG13 [92] phi (byte) addpoint::c#6 = (byte) 2 -- zpby1=coby1 + lda #$2 + sta $10 + //SEG14 [92] phi (byte) addpoint::y#6 = (byte) 8 -- zpby1=coby1 + lda #$8 + sta $f + //SEG15 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG16 [92] phi (byte) addpoint::x#6 = (byte) 15 -- zpby1=coby1 + lda #$f + sta $d + jsr addpoint + jmp b4 + //SEG17 main::@4 + b4: + //SEG18 [3] call addpoint param-assignment [ ] + //SEG19 [92] phi from main::@4 to addpoint + addpoint_from_b4: + //SEG20 [92] phi (byte) addpoint::c#6 = (byte) 3 -- zpby1=coby1 + lda #$3 + sta $10 + //SEG21 [92] phi (byte) addpoint::y#6 = (byte) 14 -- zpby1=coby1 + lda #$e + sta $f + //SEG22 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG23 [92] phi (byte) addpoint::x#6 = (byte) 6 -- zpby1=coby1 + lda #$6 + sta $d + jsr addpoint + jmp b5 + //SEG24 main::@5 + b5: + //SEG25 [4] call addpoint param-assignment [ ] + //SEG26 [92] phi from main::@5 to addpoint + addpoint_from_b5: + //SEG27 [92] phi (byte) addpoint::c#6 = (byte) 4 -- zpby1=coby1 + lda #$4 + sta $10 + //SEG28 [92] phi (byte) addpoint::y#6 = (byte) 2 -- zpby1=coby1 + lda #$2 + sta $f + //SEG29 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG30 [92] phi (byte) addpoint::x#6 = (byte) 34 -- zpby1=coby1 + lda #$22 + sta $d + jsr addpoint + jmp b6 + //SEG31 main::@6 + b6: + //SEG32 [5] call addpoint param-assignment [ ] + //SEG33 [92] phi from main::@6 to addpoint + addpoint_from_b6: + //SEG34 [92] phi (byte) addpoint::c#6 = (byte) 5 -- zpby1=coby1 + lda #$5 + sta $10 + //SEG35 [92] phi (byte) addpoint::y#6 = (byte) 17 -- zpby1=coby1 + lda #$11 + sta $f + //SEG36 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG37 [92] phi (byte) addpoint::x#6 = (byte) 21 -- zpby1=coby1 + lda #$15 + sta $d + jsr addpoint + jmp b7 + //SEG38 main::@7 + b7: + //SEG39 [6] call addpoint param-assignment [ ] + //SEG40 [92] phi from main::@7 to addpoint + addpoint_from_b7: + //SEG41 [92] phi (byte) addpoint::c#6 = (byte) 7 -- zpby1=coby1 + lda #$7 + sta $10 + //SEG42 [92] phi (byte) addpoint::y#6 = (byte) 22 -- zpby1=coby1 + lda #$16 + sta $f + //SEG43 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG44 [92] phi (byte) addpoint::x#6 = (byte) 31 -- zpby1=coby1 + lda #$1f + sta $d + jsr addpoint + jmp b8 + //SEG45 main::@8 + b8: + //SEG46 [7] call initscreen param-assignment [ ] + jsr initscreen + jmp b1 + //SEG47 main::@1 + b1: + //SEG48 [8] call render param-assignment [ ] + jsr render + jmp b10 + //SEG49 main::@10 + b10: + //SEG50 [9] call animate param-assignment [ ] + jsr animate + jmp b11 + //SEG51 main::@11 + b11: + //SEG52 [10] if(true) goto main::@1 [ ] -- true_then_la1 + jmp b1 + jmp breturn + //SEG53 main::@return + breturn: + //SEG54 [11] return [ ] + rts +} //SEG55 animate -animate: -//SEG56 [12] (byte~) animate::$0 ← * (word) 4096 [ animate::$0 ] -- zpby1=_star_cowo1 - lda $1000 - sta $11 -//SEG57 [13] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ] -- zpby1=zpby2_plus_1 - lda $11 - clc - adc #$1 - sta $12 -//SEG58 [14] *((word) 4096) ← (byte~) animate::$1 [ ] -- _star_cowo1=zpby1 - lda $12 - sta $1000 -//SEG59 [15] (byte~) animate::$2 ← * (word) 4096 [ animate::$2 ] -- zpby1=_star_cowo1 - lda $1000 - sta $13 -//SEG60 [16] if((byte~) animate::$2==(byte) 40) goto animate::@1 [ ] -- zpby1_eq_coby1_then_la1 - lda $13 - cmp #$28 - beq animate__B1 - jmp animate__B2 -//SEG61 animate::@2 -animate__B2: -//SEG62 [17] (byte~) animate::$4 ← * (word) 4352 [ animate::$4 ] -- zpby1=_star_cowo1 - lda $1100 - sta $14 -//SEG63 [18] (byte~) animate::$5 ← (byte~) animate::$4 + (byte) 1 [ animate::$5 ] -- zpby1=zpby2_plus_1 - lda $14 - clc - adc #$1 - sta $15 -//SEG64 [19] *((word) 4352) ← (byte~) animate::$5 [ ] -- _star_cowo1=zpby1 - lda $15 - sta $1100 -//SEG65 [20] (byte~) animate::$6 ← * (word) 4352 [ animate::$6 ] -- zpby1=_star_cowo1 - lda $1100 - sta $16 -//SEG66 [21] if((byte~) animate::$6==(byte) 25) goto animate::@3 [ ] -- zpby1_eq_coby1_then_la1 - lda $16 - cmp #$19 - beq animate__B3 - jmp animate__B4 -//SEG67 animate::@4 -animate__B4: -//SEG68 [22] (byte~) animate::$8 ← * (word) 4097 [ animate::$8 ] -- zpby1=_star_cowo1 - lda $1001 - sta $17 -//SEG69 [23] (byte~) animate::$9 ← (byte~) animate::$8 - (byte) 1 [ animate::$9 ] -- zpby1=zpby2_minus_1 - lda $17 - sec - sbc #$1 - sta $18 -//SEG70 [24] *((word) 4097) ← (byte~) animate::$9 [ ] -- _star_cowo1=zpby1 - lda $18 - sta $1001 -//SEG71 [25] (byte~) animate::$10 ← * (word) 4097 [ animate::$10 ] -- zpby1=_star_cowo1 - lda $1001 - sta $19 -//SEG72 [26] if((byte~) animate::$10==(byte) 255) goto animate::@5 [ ] -- zpby1_eq_coby1_then_la1 - lda $19 - cmp #$ff - beq animate__B5 - jmp animate__B6 -//SEG73 animate::@6 -animate__B6: -//SEG74 [27] (byte~) animate::$12 ← * (word) 4354 [ animate::$12 ] -- zpby1=_star_cowo1 - lda $1102 - sta $1a -//SEG75 [28] (byte~) animate::$13 ← (byte~) animate::$12 + (byte) 1 [ animate::$13 ] -- zpby1=zpby2_plus_1 - lda $1a - clc - adc #$1 - sta $1b -//SEG76 [29] *((word) 4354) ← (byte~) animate::$13 [ ] -- _star_cowo1=zpby1 - lda $1b - sta $1102 -//SEG77 [30] (byte~) animate::$14 ← * (word) 4354 [ animate::$14 ] -- zpby1=_star_cowo1 - lda $1102 - sta $1c -//SEG78 [31] if((byte~) animate::$14==(byte) 25) goto animate::@7 [ ] -- zpby1_eq_coby1_then_la1 - lda $1c - cmp #$19 - beq animate__B7 - jmp animate__B8 -//SEG79 animate::@8 -animate__B8: -//SEG80 [32] (byte~) animate::$16 ← * (word) 4355 [ animate::$16 ] -- zpby1=_star_cowo1 - lda $1103 - sta $1d -//SEG81 [33] (byte~) animate::$17 ← (byte~) animate::$16 - (byte) 1 [ animate::$17 ] -- zpby1=zpby2_minus_1 - lda $1d - sec - sbc #$1 - sta $1e -//SEG82 [34] *((word) 4355) ← (byte~) animate::$17 [ ] -- _star_cowo1=zpby1 - lda $1e - sta $1103 -//SEG83 [35] (byte~) animate::$18 ← * (word) 4355 [ animate::$18 ] -- zpby1=_star_cowo1 - lda $1103 - sta $1f -//SEG84 [36] if((byte~) animate::$18==(byte) 255) goto animate::@9 [ ] -- zpby1_eq_coby1_then_la1 - lda $1f - cmp #$ff - beq animate__B9 - jmp animate__Breturn -//SEG85 animate::@return -animate__Breturn: -//SEG86 [37] return [ ] - rts +animate: { + //SEG56 [12] (byte~) animate::$0 ← * (word) 4096 [ animate::$0 ] -- zpby1=_star_cowo1 + lda $1000 + sta $11 + //SEG57 [13] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ] -- zpby1=zpby2_plus_1 + lda $11 + clc + adc #$1 + sta $12 + //SEG58 [14] *((word) 4096) ← (byte~) animate::$1 [ ] -- _star_cowo1=zpby1 + lda $12 + sta $1000 + //SEG59 [15] (byte~) animate::$2 ← * (word) 4096 [ animate::$2 ] -- zpby1=_star_cowo1 + lda $1000 + sta $13 + //SEG60 [16] if((byte~) animate::$2==(byte) 40) goto animate::@1 [ ] -- zpby1_eq_coby1_then_la1 + lda $13 + cmp #$28 + beq b1 + jmp b2 + //SEG61 animate::@2 + b2: + //SEG62 [17] (byte~) animate::$4 ← * (word) 4352 [ animate::$4 ] -- zpby1=_star_cowo1 + lda $1100 + sta $14 + //SEG63 [18] (byte~) animate::$5 ← (byte~) animate::$4 + (byte) 1 [ animate::$5 ] -- zpby1=zpby2_plus_1 + lda $14 + clc + adc #$1 + sta $15 + //SEG64 [19] *((word) 4352) ← (byte~) animate::$5 [ ] -- _star_cowo1=zpby1 + lda $15 + sta $1100 + //SEG65 [20] (byte~) animate::$6 ← * (word) 4352 [ animate::$6 ] -- zpby1=_star_cowo1 + lda $1100 + sta $16 + //SEG66 [21] if((byte~) animate::$6==(byte) 25) goto animate::@3 [ ] -- zpby1_eq_coby1_then_la1 + lda $16 + cmp #$19 + beq b3 + jmp b4 + //SEG67 animate::@4 + b4: + //SEG68 [22] (byte~) animate::$8 ← * (word) 4097 [ animate::$8 ] -- zpby1=_star_cowo1 + lda $1001 + sta $17 + //SEG69 [23] (byte~) animate::$9 ← (byte~) animate::$8 - (byte) 1 [ animate::$9 ] -- zpby1=zpby2_minus_1 + lda $17 + sec + sbc #$1 + sta $18 + //SEG70 [24] *((word) 4097) ← (byte~) animate::$9 [ ] -- _star_cowo1=zpby1 + lda $18 + sta $1001 + //SEG71 [25] (byte~) animate::$10 ← * (word) 4097 [ animate::$10 ] -- zpby1=_star_cowo1 + lda $1001 + sta $19 + //SEG72 [26] if((byte~) animate::$10==(byte) 255) goto animate::@5 [ ] -- zpby1_eq_coby1_then_la1 + lda $19 + cmp #$ff + beq b5 + jmp b6 + //SEG73 animate::@6 + b6: + //SEG74 [27] (byte~) animate::$12 ← * (word) 4354 [ animate::$12 ] -- zpby1=_star_cowo1 + lda $1102 + sta $1a + //SEG75 [28] (byte~) animate::$13 ← (byte~) animate::$12 + (byte) 1 [ animate::$13 ] -- zpby1=zpby2_plus_1 + lda $1a + clc + adc #$1 + sta $1b + //SEG76 [29] *((word) 4354) ← (byte~) animate::$13 [ ] -- _star_cowo1=zpby1 + lda $1b + sta $1102 + //SEG77 [30] (byte~) animate::$14 ← * (word) 4354 [ animate::$14 ] -- zpby1=_star_cowo1 + lda $1102 + sta $1c + //SEG78 [31] if((byte~) animate::$14==(byte) 25) goto animate::@7 [ ] -- zpby1_eq_coby1_then_la1 + lda $1c + cmp #$19 + beq b7 + jmp b8 + //SEG79 animate::@8 + b8: + //SEG80 [32] (byte~) animate::$16 ← * (word) 4355 [ animate::$16 ] -- zpby1=_star_cowo1 + lda $1103 + sta $1d + //SEG81 [33] (byte~) animate::$17 ← (byte~) animate::$16 - (byte) 1 [ animate::$17 ] -- zpby1=zpby2_minus_1 + lda $1d + sec + sbc #$1 + sta $1e + //SEG82 [34] *((word) 4355) ← (byte~) animate::$17 [ ] -- _star_cowo1=zpby1 + lda $1e + sta $1103 + //SEG83 [35] (byte~) animate::$18 ← * (word) 4355 [ animate::$18 ] -- zpby1=_star_cowo1 + lda $1103 + sta $1f + //SEG84 [36] if((byte~) animate::$18==(byte) 255) goto animate::@9 [ ] -- zpby1_eq_coby1_then_la1 + lda $1f + cmp #$ff + beq b9 + jmp breturn + //SEG85 animate::@return + breturn: + //SEG86 [37] return [ ] + rts +} //SEG87 animate::@9 -animate__B9: +b9: //SEG88 [38] *((word) 4355) ← (byte) 25 [ ] -- _star_cowo1=coby2 lda #$19 sta $1103 @@ -7019,10 +7021,10 @@ animate__B9: //SEG93 [43] if((byte~) animate::$22>=(byte) 40) goto animate::@11 [ ] -- zpby1_ge_coby1_then_la1 lda $22 cmp #$28 - bcs animate__B11 - jmp animate__Breturn + bcs b11 + jmp breturn //SEG94 animate::@11 -animate__B11: +b11: //SEG95 [44] (byte~) animate::$24 ← * (word) 4099 [ animate::$24 ] -- zpby1=_star_cowo1 lda $1003 sta $23 @@ -7034,220 +7036,222 @@ animate__B11: //SEG97 [46] *((word) 4099) ← (byte~) animate::$25 [ ] -- _star_cowo1=zpby1 lda $24 sta $1003 - jmp animate__Breturn + jmp breturn //SEG98 animate::@7 -animate__B7: +b7: //SEG99 [47] *((word) 4354) ← (byte) 0 [ ] -- _star_cowo1=coby2 lda #$0 sta $1102 - jmp animate__B8 + jmp b8 //SEG100 animate::@5 -animate__B5: +b5: //SEG101 [48] *((word) 4097) ← (byte) 40 [ ] -- _star_cowo1=coby2 lda #$28 sta $1001 - jmp animate__B6 + jmp b6 //SEG102 animate::@3 -animate__B3: +b3: //SEG103 [49] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2 lda #$0 sta $1100 - jmp animate__B4 + jmp b4 //SEG104 animate::@1 -animate__B1: +b1: //SEG105 [50] *((word) 4096) ← (byte) 0 [ ] -- _star_cowo1=coby2 lda #$0 sta $1000 - jmp animate__B2 + jmp b2 //SEG106 render -render: -//SEG107 [51] phi from render to render::@1 -render__B1_from_render: -//SEG108 [51] phi (byte*) render::colline#2 = (word) 55296 -- zpptrby1=cowo1 - lda #<$d800 - sta $3 - lda #>$d800 - sta $3+$1 -//SEG109 [51] phi (byte) render::y#2 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $2 - jmp render__B1 -//SEG110 [51] phi from render::@3 to render::@1 -render__B1_from_B3: -//SEG111 [51] phi (byte*) render::colline#2 = (byte*) render::colline#1 -- register_copy -//SEG112 [51] phi (byte) render::y#2 = (byte) render::y#1 -- register_copy - jmp render__B1 -//SEG113 render::@1 -render__B1: -//SEG114 [52] phi from render::@1 to render::@2 -render__B2_from_B1: -//SEG115 [52] phi (byte) render::x#2 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $5 - jmp render__B2 -//SEG116 [52] phi from render::@5 to render::@2 -render__B2_from_B5: -//SEG117 [52] phi (byte) render::x#2 = (byte) render::x#1 -- register_copy - jmp render__B2 -//SEG118 render::@2 -render__B2: -//SEG119 [53] (byte) findcol::x#0 ← (byte) render::x#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 - lda $5 - sta $25 -//SEG120 [54] (byte) findcol::y#0 ← (byte) render::y#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 - lda $2 - sta $26 -//SEG121 [55] call findcol param-assignment [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] - jsr findcol - jmp render__B5 -//SEG122 render::@5 -render__B5: -//SEG123 [56] (byte) render::col#0 ← (byte) findcol::return#0 [ render::x#2 render::y#2 render::colline#2 render::col#0 ] -- zpby1=zpby2 - lda $a - sta $27 -//SEG124 [57] *((byte*) render::colline#2 + (byte) render::x#2) ← (byte) render::col#0 [ render::x#2 render::y#2 render::colline#2 ] -- zpptrby1_staridx_zpby1=zpby2 - lda $27 - ldy $5 - sta ($3),y -//SEG125 [58] (byte) render::x#1 ← ++ (byte) render::x#2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1=_inc_zpby1 - inc $5 -//SEG126 [59] if((byte) render::x#1<(byte) 40) goto render::@2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1_lt_coby1_then_la1 - lda $5 - cmp #$28 - bcc render__B2_from_B5 - jmp render__B3 -//SEG127 render::@3 -render__B3: -//SEG128 [60] (byte*) render::colline#1 ← (byte*) render::colline#2 + (byte) 40 [ render::colline#1 render::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 - lda $3 - clc - adc #$28 - sta $3 - bcc !+ - inc $3+$1 -!: -//SEG129 [61] (byte) render::y#1 ← ++ (byte) render::y#2 [ render::y#1 render::colline#1 ] -- zpby1=_inc_zpby1 - inc $2 -//SEG130 [62] if((byte) render::y#1<(byte) 25) goto render::@1 [ render::y#1 render::colline#1 ] -- zpby1_lt_coby1_then_la1 - lda $2 - cmp #$19 - bcc render__B1_from_B3 - jmp render__Breturn -//SEG131 render::@return -render__Breturn: -//SEG132 [63] return [ ] - rts +render: { + //SEG107 [51] phi from render to render::@1 + b1_from_render: + //SEG108 [51] phi (byte*) render::colline#2 = (word) 55296 -- zpptrby1=cowo1 + lda #<$d800 + sta $3 + lda #>$d800 + sta $3+$1 + //SEG109 [51] phi (byte) render::y#2 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $2 + jmp b1 + //SEG110 [51] phi from render::@3 to render::@1 + b1_from_b3: + //SEG111 [51] phi (byte*) render::colline#2 = (byte*) render::colline#1 -- register_copy + //SEG112 [51] phi (byte) render::y#2 = (byte) render::y#1 -- register_copy + jmp b1 + //SEG113 render::@1 + b1: + //SEG114 [52] phi from render::@1 to render::@2 + b2_from_b1: + //SEG115 [52] phi (byte) render::x#2 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $5 + jmp b2 + //SEG116 [52] phi from render::@5 to render::@2 + b2_from_b5: + //SEG117 [52] phi (byte) render::x#2 = (byte) render::x#1 -- register_copy + jmp b2 + //SEG118 render::@2 + b2: + //SEG119 [53] (byte) findcol::x#0 ← (byte) render::x#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 + lda $5 + sta $25 + //SEG120 [54] (byte) findcol::y#0 ← (byte) render::y#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 + lda $2 + sta $26 + //SEG121 [55] call findcol param-assignment [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] + jsr findcol + jmp b5 + //SEG122 render::@5 + b5: + //SEG123 [56] (byte) render::col#0 ← (byte) findcol::return#0 [ render::x#2 render::y#2 render::colline#2 render::col#0 ] -- zpby1=zpby2 + lda $a + sta $27 + //SEG124 [57] *((byte*) render::colline#2 + (byte) render::x#2) ← (byte) render::col#0 [ render::x#2 render::y#2 render::colline#2 ] -- zpptrby1_staridx_zpby1=zpby2 + lda $27 + ldy $5 + sta ($3),y + //SEG125 [58] (byte) render::x#1 ← ++ (byte) render::x#2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1=_inc_zpby1 + inc $5 + //SEG126 [59] if((byte) render::x#1<(byte) 40) goto render::@2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1_lt_coby1_then_la1 + lda $5 + cmp #$28 + bcc b2_from_b5 + jmp b3 + //SEG127 render::@3 + b3: + //SEG128 [60] (byte*) render::colline#1 ← (byte*) render::colline#2 + (byte) 40 [ render::colline#1 render::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 + lda $3 + clc + adc #$28 + sta $3 + bcc !+ + inc $3+$1 + !: + //SEG129 [61] (byte) render::y#1 ← ++ (byte) render::y#2 [ render::y#1 render::colline#1 ] -- zpby1=_inc_zpby1 + inc $2 + //SEG130 [62] if((byte) render::y#1<(byte) 25) goto render::@1 [ render::y#1 render::colline#1 ] -- zpby1_lt_coby1_then_la1 + lda $2 + cmp #$19 + bcc b1_from_b3 + jmp breturn + //SEG131 render::@return + breturn: + //SEG132 [63] return [ ] + rts +} //SEG133 findcol -findcol: -//SEG134 [64] phi from findcol to findcol::@1 -findcol__B1_from_findcol: -//SEG135 [64] phi (byte) findcol::mincol#11 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $a -//SEG136 [64] phi (byte) findcol::mindiff#10 = (byte) 255 -- zpby1=coby1 - lda #$ff - sta $7 -//SEG137 [64] phi (byte) findcol::i#12 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $6 - jmp findcol__B1 -//SEG138 [64] phi from findcol::@13 to findcol::@1 -findcol__B1_from_B13: -//SEG139 [64] phi (byte) findcol::mincol#11 = (byte) findcol::mincol#2 -- register_copy -//SEG140 [64] phi (byte) findcol::mindiff#10 = (byte) findcol::mindiff#11 -- register_copy -//SEG141 [64] phi (byte) findcol::i#12 = (byte) findcol::i#1 -- register_copy - jmp findcol__B1 -//SEG142 findcol::@1 -findcol__B1: -//SEG143 [65] (byte) findcol::xp#0 ← (word) 4096 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_zpby2 - ldx $6 - lda $1000,x - sta $28 -//SEG144 [66] (byte) findcol::yp#0 ← (word) 4352 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_zpby2 - ldx $6 - lda $1100,x - sta $29 -//SEG145 [67] if((byte) findcol::x#0==(byte) findcol::xp#0) goto findcol::@2 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_eq_zpby2_then_la1 - lda $25 - cmp $28 - beq findcol__B2 - jmp findcol__B3 -//SEG146 findcol::@3 -findcol__B3: -//SEG147 [68] if((byte) findcol::x#0<(byte) findcol::xp#0) goto findcol::@6 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 - lda $25 - cmp $28 - bcc findcol__B6 - jmp findcol__B7 -//SEG148 findcol::@7 -findcol__B7: -//SEG149 [69] (byte) findcol::diff#1 ← (byte) findcol::x#0 - (byte) findcol::xp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::diff#1 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby2_minus_zpby3 - lda $25 - sec - sbc $28 - sta $8 -//SEG150 [70] phi from findcol::@7 to findcol::@8 -findcol__B8_from_B7: -//SEG151 [70] phi (byte) findcol::diff#4 = (byte) findcol::diff#1 -- register_copy - jmp findcol__B8 -//SEG152 findcol::@8 -findcol__B8: -//SEG153 [71] if((byte) findcol::y#0<(byte) findcol::yp#0) goto findcol::@9 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::yp#0 findcol::diff#4 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 - lda $26 - cmp $29 - bcc findcol__B9 - jmp findcol__B10 -//SEG154 findcol::@10 -findcol__B10: -//SEG155 [72] (byte~) findcol::$10 ← (byte) findcol::y#0 - (byte) findcol::yp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#4 findcol::$10 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby2_minus_zpby3 - lda $26 - sec - sbc $29 - sta $2a -//SEG156 [73] (byte) findcol::diff#3 ← (byte) findcol::diff#4 + (byte~) findcol::$10 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#3 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby2_plus_zpby3 - lda $8 - clc - adc $2a - sta $9 -//SEG157 [74] phi from findcol::@10 to findcol::@11 -findcol__B11_from_B10: -//SEG158 [74] phi (byte) findcol::diff#6 = (byte) findcol::diff#3 -- register_copy - jmp findcol__B11 -//SEG159 findcol::@11 -findcol__B11: -//SEG160 [75] if((byte) findcol::diff#6<(byte) findcol::mindiff#10) goto findcol::@12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#6 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 - lda $9 - cmp $7 - bcc findcol__B12 -//SEG161 [76] phi from findcol::@11 to findcol::@13 -findcol__B13_from_B11: -//SEG162 [76] phi (byte) findcol::mindiff#11 = (byte) findcol::mindiff#10 -- register_copy -//SEG163 [76] phi (byte) findcol::mincol#2 = (byte) findcol::mincol#11 -- register_copy - jmp findcol__B13 -//SEG164 findcol::@13 -findcol__B13: -//SEG165 [77] (byte) findcol::i#1 ← ++ (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- zpby1=_inc_zpby1 - inc $6 -//SEG166 [78] if((byte) findcol::i#1<(byte) numpoints#1) goto findcol::@1 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 - lda $6 - cmp $e - bcc findcol__B1_from_B13 -//SEG167 [79] phi from findcol::@13 to findcol::@return -findcol__Breturn_from_B13: -//SEG168 [79] phi (byte) findcol::return#0 = (byte) findcol::mincol#2 -- register_copy - jmp findcol__Breturn -//SEG169 [79] phi from findcol::@2 to findcol::@return -findcol__Breturn_from_B2: -//SEG170 [79] phi (byte) findcol::return#0 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $a - jmp findcol__Breturn -//SEG171 findcol::@return -findcol__Breturn: -//SEG172 [80] return [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] - rts +findcol: { + //SEG134 [64] phi from findcol to findcol::@1 + b1_from_findcol: + //SEG135 [64] phi (byte) findcol::mincol#11 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $a + //SEG136 [64] phi (byte) findcol::mindiff#10 = (byte) 255 -- zpby1=coby1 + lda #$ff + sta $7 + //SEG137 [64] phi (byte) findcol::i#12 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $6 + jmp b1 + //SEG138 [64] phi from findcol::@13 to findcol::@1 + b1_from_b13: + //SEG139 [64] phi (byte) findcol::mincol#11 = (byte) findcol::mincol#2 -- register_copy + //SEG140 [64] phi (byte) findcol::mindiff#10 = (byte) findcol::mindiff#11 -- register_copy + //SEG141 [64] phi (byte) findcol::i#12 = (byte) findcol::i#1 -- register_copy + jmp b1 + //SEG142 findcol::@1 + b1: + //SEG143 [65] (byte) findcol::xp#0 ← (word) 4096 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_zpby2 + ldx $6 + lda $1000,x + sta $28 + //SEG144 [66] (byte) findcol::yp#0 ← (word) 4352 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_zpby2 + ldx $6 + lda $1100,x + sta $29 + //SEG145 [67] if((byte) findcol::x#0==(byte) findcol::xp#0) goto findcol::@2 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_eq_zpby2_then_la1 + lda $25 + cmp $28 + beq b2 + jmp b3 + //SEG146 findcol::@3 + b3: + //SEG147 [68] if((byte) findcol::x#0<(byte) findcol::xp#0) goto findcol::@6 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 + lda $25 + cmp $28 + bcc b6 + jmp b7 + //SEG148 findcol::@7 + b7: + //SEG149 [69] (byte) findcol::diff#1 ← (byte) findcol::x#0 - (byte) findcol::xp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::diff#1 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby2_minus_zpby3 + lda $25 + sec + sbc $28 + sta $8 + //SEG150 [70] phi from findcol::@7 to findcol::@8 + b8_from_b7: + //SEG151 [70] phi (byte) findcol::diff#4 = (byte) findcol::diff#1 -- register_copy + jmp b8 + //SEG152 findcol::@8 + b8: + //SEG153 [71] if((byte) findcol::y#0<(byte) findcol::yp#0) goto findcol::@9 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::yp#0 findcol::diff#4 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 + lda $26 + cmp $29 + bcc b9 + jmp b10 + //SEG154 findcol::@10 + b10: + //SEG155 [72] (byte~) findcol::$10 ← (byte) findcol::y#0 - (byte) findcol::yp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#4 findcol::$10 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby2_minus_zpby3 + lda $26 + sec + sbc $29 + sta $2a + //SEG156 [73] (byte) findcol::diff#3 ← (byte) findcol::diff#4 + (byte~) findcol::$10 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#3 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby2_plus_zpby3 + lda $8 + clc + adc $2a + sta $9 + //SEG157 [74] phi from findcol::@10 to findcol::@11 + b11_from_b10: + //SEG158 [74] phi (byte) findcol::diff#6 = (byte) findcol::diff#3 -- register_copy + jmp b11 + //SEG159 findcol::@11 + b11: + //SEG160 [75] if((byte) findcol::diff#6<(byte) findcol::mindiff#10) goto findcol::@12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#6 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 + lda $9 + cmp $7 + bcc b12 + //SEG161 [76] phi from findcol::@11 to findcol::@13 + b13_from_b11: + //SEG162 [76] phi (byte) findcol::mindiff#11 = (byte) findcol::mindiff#10 -- register_copy + //SEG163 [76] phi (byte) findcol::mincol#2 = (byte) findcol::mincol#11 -- register_copy + jmp b13 + //SEG164 findcol::@13 + b13: + //SEG165 [77] (byte) findcol::i#1 ← ++ (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- zpby1=_inc_zpby1 + inc $6 + //SEG166 [78] if((byte) findcol::i#1<(byte) numpoints#1) goto findcol::@1 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 + lda $6 + cmp $e + bcc b1_from_b13 + //SEG167 [79] phi from findcol::@13 to findcol::@return + breturn_from_b13: + //SEG168 [79] phi (byte) findcol::return#0 = (byte) findcol::mincol#2 -- register_copy + jmp breturn + //SEG169 [79] phi from findcol::@2 to findcol::@return + breturn_from_b2: + //SEG170 [79] phi (byte) findcol::return#0 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $a + jmp breturn + //SEG171 findcol::@return + breturn: + //SEG172 [80] return [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] + rts +} //SEG173 findcol::@12 -findcol__B12: +b12: //SEG174 [81] (byte) findcol::mincol#1 ← (word) 4608 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#6 findcol::mincol#1 numpoints#1 ] -- zpby1=cowo1_staridx_zpby2 ldx $6 lda $1200,x @@ -7256,12 +7260,12 @@ findcol__B12: lda $9 sta $7 //SEG176 [76] phi from findcol::@12 to findcol::@13 -findcol__B13_from_B12: +b13_from_b12: //SEG177 [76] phi (byte) findcol::mindiff#11 = (byte~) findcol::diff#13 -- register_copy //SEG178 [76] phi (byte) findcol::mincol#2 = (byte) findcol::mincol#1 -- register_copy - jmp findcol__B13 + jmp b13 //SEG179 findcol::@9 -findcol__B9: +b9: //SEG180 [83] (byte~) findcol::$8 ← (byte) findcol::yp#0 - (byte) findcol::y#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#4 findcol::mindiff#10 findcol::mincol#11 numpoints#1 findcol::$8 ] -- zpby1=zpby2_minus_zpby3 lda $29 sec @@ -7273,87 +7277,89 @@ findcol__B9: adc $2b sta $9 //SEG182 [74] phi from findcol::@9 to findcol::@11 -findcol__B11_from_B9: +b11_from_b9: //SEG183 [74] phi (byte) findcol::diff#6 = (byte) findcol::diff#2 -- register_copy - jmp findcol__B11 + jmp b11 //SEG184 findcol::@6 -findcol__B6: +b6: //SEG185 [85] (byte) findcol::diff#0 ← (byte) findcol::xp#0 - (byte) findcol::x#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::diff#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby2_minus_zpby3 lda $28 sec sbc $25 sta $8 //SEG186 [70] phi from findcol::@6 to findcol::@8 -findcol__B8_from_B6: +b8_from_b6: //SEG187 [70] phi (byte) findcol::diff#4 = (byte) findcol::diff#0 -- register_copy - jmp findcol__B8 + jmp b8 //SEG188 findcol::@2 -findcol__B2: +b2: //SEG189 [86] if((byte) findcol::y#0==(byte) findcol::yp#0) goto findcol::@return [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_eq_zpby2_then_la1 lda $26 cmp $29 - beq findcol__Breturn_from_B2 - jmp findcol__B3 + beq breturn_from_b2 + jmp b3 //SEG190 initscreen -initscreen: -//SEG191 [87] phi from initscreen to initscreen::@1 -initscreen__B1_from_initscreen: -//SEG192 [87] phi (byte*) initscreen::screen#2 = (word) 1024 -- zpptrby1=cowo1 - lda #<$400 - sta $b - lda #>$400 - sta $b+$1 - jmp initscreen__B1 -//SEG193 [87] phi from initscreen::@1 to initscreen::@1 -initscreen__B1_from_B1: -//SEG194 [87] phi (byte*) initscreen::screen#2 = (byte*) initscreen::screen#1 -- register_copy - jmp initscreen__B1 -//SEG195 initscreen::@1 -initscreen__B1: -//SEG196 [88] *((byte*) initscreen::screen#2) ← (byte) 230 [ initscreen::screen#2 ] -- _star_zpptrby1=coby1 - ldy #$0 - lda #$e6 - sta ($b),y -//SEG197 [89] (byte*) initscreen::screen#1 ← ++ (byte*) initscreen::screen#2 [ initscreen::screen#1 ] -- zpptrby1=_inc_zpptrby1 - inc $b - bne !+ - inc $b+$1 -!: -//SEG198 [90] if((byte*) initscreen::screen#1<(word) 2024) goto initscreen::@1 [ initscreen::screen#1 ] -- zpptrby1_lt_cowo1_then_la1 - lda $b+$1 - cmp #>$7e8 - bcc initscreen__B1_from_B1 - bne !+ - lda $b - cmp #<$7e8 - bcc initscreen__B1_from_B1 -!: - jmp initscreen__Breturn -//SEG199 initscreen::@return -initscreen__Breturn: -//SEG200 [91] return [ ] - rts +initscreen: { + //SEG191 [87] phi from initscreen to initscreen::@1 + b1_from_initscreen: + //SEG192 [87] phi (byte*) initscreen::screen#2 = (word) 1024 -- zpptrby1=cowo1 + lda #<$400 + sta $b + lda #>$400 + sta $b+$1 + jmp b1 + //SEG193 [87] phi from initscreen::@1 to initscreen::@1 + b1_from_b1: + //SEG194 [87] phi (byte*) initscreen::screen#2 = (byte*) initscreen::screen#1 -- register_copy + jmp b1 + //SEG195 initscreen::@1 + b1: + //SEG196 [88] *((byte*) initscreen::screen#2) ← (byte) 230 [ initscreen::screen#2 ] -- _star_zpptrby1=coby1 + ldy #$0 + lda #$e6 + sta ($b),y + //SEG197 [89] (byte*) initscreen::screen#1 ← ++ (byte*) initscreen::screen#2 [ initscreen::screen#1 ] -- zpptrby1=_inc_zpptrby1 + inc $b + bne !+ + inc $b+$1 + !: + //SEG198 [90] if((byte*) initscreen::screen#1<(word) 2024) goto initscreen::@1 [ initscreen::screen#1 ] -- zpptrby1_lt_cowo1_then_la1 + lda $b+$1 + cmp #>$7e8 + bcc b1_from_b1 + bne !+ + lda $b + cmp #<$7e8 + bcc b1_from_b1 + !: + jmp breturn + //SEG199 initscreen::@return + breturn: + //SEG200 [91] return [ ] + rts +} //SEG201 addpoint -addpoint: -//SEG202 [93] *((word) 4096 + (byte) numpoints#19) ← (byte) addpoint::x#6 [ numpoints#19 addpoint::y#6 addpoint::c#6 ] -- cowo1_staridx_zpby1=zpby2 - lda $d - ldx $e - sta $1000,x -//SEG203 [94] *((word) 4352 + (byte) numpoints#19) ← (byte) addpoint::y#6 [ numpoints#19 addpoint::c#6 ] -- cowo1_staridx_zpby1=zpby2 - lda $f - ldx $e - sta $1100,x -//SEG204 [95] *((word) 4608 + (byte) numpoints#19) ← (byte) addpoint::c#6 [ numpoints#19 ] -- cowo1_staridx_zpby1=zpby2 - lda $10 - ldx $e - sta $1200,x -//SEG205 [96] (byte) numpoints#1 ← ++ (byte) numpoints#19 [ ] -- zpby1=_inc_zpby1 - inc $e - jmp addpoint__Breturn -//SEG206 addpoint::@return -addpoint__Breturn: -//SEG207 [97] return [ ] - rts +addpoint: { + //SEG202 [93] *((word) 4096 + (byte) numpoints#19) ← (byte) addpoint::x#6 [ numpoints#19 addpoint::y#6 addpoint::c#6 ] -- cowo1_staridx_zpby1=zpby2 + lda $d + ldx $e + sta $1000,x + //SEG203 [94] *((word) 4352 + (byte) numpoints#19) ← (byte) addpoint::y#6 [ numpoints#19 addpoint::c#6 ] -- cowo1_staridx_zpby1=zpby2 + lda $f + ldx $e + sta $1100,x + //SEG204 [95] *((word) 4608 + (byte) numpoints#19) ← (byte) addpoint::c#6 [ numpoints#19 ] -- cowo1_staridx_zpby1=zpby2 + lda $10 + ldx $e + sta $1200,x + //SEG205 [96] (byte) numpoints#1 ← ++ (byte) numpoints#19 [ ] -- zpby1=_inc_zpby1 + inc $e + jmp breturn + //SEG206 addpoint::@return + breturn: + //SEG207 [97] return [ ] + rts +} Statement [38] *((word) 4355) ← (byte) 25 [ ] always clobbers reg byte a Statement [40] (byte~) animate::$21 ← (byte~) animate::$20 + (byte) 7 [ animate::$21 ] always clobbers reg byte a @@ -7485,226 +7491,228 @@ Re-allocated ZP register from zp byte:14 to zp byte:8 Re-allocated ZP register from zp byte:37 to zp byte:9 Re-allocated ZP register from zp byte:38 to zp byte:10 Re-allocated ZP register from zp byte:41 to zp byte:11 -Removing instruction jmp BEND -Removing instruction jmp main__B3 -Removing instruction jmp main__B4 -Removing instruction jmp main__B5 -Removing instruction jmp main__B6 -Removing instruction jmp main__B7 -Removing instruction jmp main__B8 -Removing instruction jmp main__B1 -Removing instruction jmp main__B10 -Removing instruction jmp main__B11 -Removing instruction jmp main__Breturn -Removing instruction jmp animate__B2 -Removing instruction jmp animate__B4 -Removing instruction jmp animate__B6 -Removing instruction jmp animate__B8 -Removing instruction jmp animate__Breturn -Removing instruction jmp render__B1 -Removing instruction jmp render__B2 -Removing instruction jmp render__B5 -Removing instruction jmp render__B3 -Removing instruction jmp render__Breturn -Removing instruction jmp findcol__B1 -Removing instruction jmp findcol__B3 -Removing instruction jmp findcol__B7 -Removing instruction jmp findcol__B8 -Removing instruction jmp findcol__B10 -Removing instruction jmp findcol__B11 -Removing instruction jmp findcol__B13 -Removing instruction jmp findcol__Breturn -Removing instruction jmp initscreen__B1 -Removing instruction jmp initscreen__Breturn -Removing instruction jmp addpoint__Breturn +Removing instruction jmp bend +Removing instruction jmp b3 +Removing instruction jmp b4 +Removing instruction jmp b5 +Removing instruction jmp b6 +Removing instruction jmp b7 +Removing instruction jmp b8 +Removing instruction jmp b1 +Removing instruction jmp b10 +Removing instruction jmp b11 +Removing instruction jmp breturn +Removing instruction jmp b2 +Removing instruction jmp b4 +Removing instruction jmp b6 +Removing instruction jmp b8 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b5 +Removing instruction jmp b3 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp b3 +Removing instruction jmp b7 +Removing instruction jmp b8 +Removing instruction jmp b10 +Removing instruction jmp b11 +Removing instruction jmp b13 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp breturn +Removing instruction jmp breturn Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call addpoint param-assignment [ ] -//SEG5 [92] phi from main to addpoint -addpoint_from_main: -//SEG6 [92] phi (byte) addpoint::c#6 = (byte) 1 -- zpby1=coby1 - lda #$1 - sta $2 -//SEG7 [92] phi (byte) addpoint::y#6 = (byte) 5 -- yby=coby1 - ldy #$5 -//SEG8 [92] phi (byte) numpoints#19 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $8 -//SEG9 [92] phi (byte) addpoint::x#6 = (byte) 5 -- aby=coby1 - lda #$5 - jsr addpoint -//SEG10 main::@3 -main__B3: -//SEG11 [2] call addpoint param-assignment [ ] -//SEG12 [92] phi from main::@3 to addpoint -addpoint_from_B3: -//SEG13 [92] phi (byte) addpoint::c#6 = (byte) 2 -- zpby1=coby1 - lda #$2 - sta $2 -//SEG14 [92] phi (byte) addpoint::y#6 = (byte) 8 -- yby=coby1 - ldy #$8 -//SEG15 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG16 [92] phi (byte) addpoint::x#6 = (byte) 15 -- aby=coby1 - lda #$f - jsr addpoint -//SEG17 main::@4 -main__B4: -//SEG18 [3] call addpoint param-assignment [ ] -//SEG19 [92] phi from main::@4 to addpoint -addpoint_from_B4: -//SEG20 [92] phi (byte) addpoint::c#6 = (byte) 3 -- zpby1=coby1 - lda #$3 - sta $2 -//SEG21 [92] phi (byte) addpoint::y#6 = (byte) 14 -- yby=coby1 - ldy #$e -//SEG22 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG23 [92] phi (byte) addpoint::x#6 = (byte) 6 -- aby=coby1 - lda #$6 - jsr addpoint -//SEG24 main::@5 -main__B5: -//SEG25 [4] call addpoint param-assignment [ ] -//SEG26 [92] phi from main::@5 to addpoint -addpoint_from_B5: -//SEG27 [92] phi (byte) addpoint::c#6 = (byte) 4 -- zpby1=coby1 - lda #$4 - sta $2 -//SEG28 [92] phi (byte) addpoint::y#6 = (byte) 2 -- yby=coby1 - ldy #$2 -//SEG29 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG30 [92] phi (byte) addpoint::x#6 = (byte) 34 -- aby=coby1 - lda #$22 - jsr addpoint -//SEG31 main::@6 -main__B6: -//SEG32 [5] call addpoint param-assignment [ ] -//SEG33 [92] phi from main::@6 to addpoint -addpoint_from_B6: -//SEG34 [92] phi (byte) addpoint::c#6 = (byte) 5 -- zpby1=coby1 - lda #$5 - sta $2 -//SEG35 [92] phi (byte) addpoint::y#6 = (byte) 17 -- yby=coby1 - ldy #$11 -//SEG36 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG37 [92] phi (byte) addpoint::x#6 = (byte) 21 -- aby=coby1 - lda #$15 - jsr addpoint -//SEG38 main::@7 -main__B7: -//SEG39 [6] call addpoint param-assignment [ ] -//SEG40 [92] phi from main::@7 to addpoint -addpoint_from_B7: -//SEG41 [92] phi (byte) addpoint::c#6 = (byte) 7 -- zpby1=coby1 - lda #$7 - sta $2 -//SEG42 [92] phi (byte) addpoint::y#6 = (byte) 22 -- yby=coby1 - ldy #$16 -//SEG43 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG44 [92] phi (byte) addpoint::x#6 = (byte) 31 -- aby=coby1 - lda #$1f - jsr addpoint -//SEG45 main::@8 -main__B8: -//SEG46 [7] call initscreen param-assignment [ ] - jsr initscreen -//SEG47 main::@1 -main__B1: -//SEG48 [8] call render param-assignment [ ] - jsr render -//SEG49 main::@10 -main__B10: -//SEG50 [9] call animate param-assignment [ ] - jsr animate -//SEG51 main::@11 -main__B11: -//SEG52 [10] if(true) goto main::@1 [ ] -- true_then_la1 - jmp main__B1 -//SEG53 main::@return -main__Breturn: -//SEG54 [11] return [ ] - rts +main: { + //SEG4 [1] call addpoint param-assignment [ ] + //SEG5 [92] phi from main to addpoint + addpoint_from_main: + //SEG6 [92] phi (byte) addpoint::c#6 = (byte) 1 -- zpby1=coby1 + lda #$1 + sta $2 + //SEG7 [92] phi (byte) addpoint::y#6 = (byte) 5 -- yby=coby1 + ldy #$5 + //SEG8 [92] phi (byte) numpoints#19 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $8 + //SEG9 [92] phi (byte) addpoint::x#6 = (byte) 5 -- aby=coby1 + lda #$5 + jsr addpoint + //SEG10 main::@3 + b3: + //SEG11 [2] call addpoint param-assignment [ ] + //SEG12 [92] phi from main::@3 to addpoint + addpoint_from_b3: + //SEG13 [92] phi (byte) addpoint::c#6 = (byte) 2 -- zpby1=coby1 + lda #$2 + sta $2 + //SEG14 [92] phi (byte) addpoint::y#6 = (byte) 8 -- yby=coby1 + ldy #$8 + //SEG15 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG16 [92] phi (byte) addpoint::x#6 = (byte) 15 -- aby=coby1 + lda #$f + jsr addpoint + //SEG17 main::@4 + b4: + //SEG18 [3] call addpoint param-assignment [ ] + //SEG19 [92] phi from main::@4 to addpoint + addpoint_from_b4: + //SEG20 [92] phi (byte) addpoint::c#6 = (byte) 3 -- zpby1=coby1 + lda #$3 + sta $2 + //SEG21 [92] phi (byte) addpoint::y#6 = (byte) 14 -- yby=coby1 + ldy #$e + //SEG22 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG23 [92] phi (byte) addpoint::x#6 = (byte) 6 -- aby=coby1 + lda #$6 + jsr addpoint + //SEG24 main::@5 + b5: + //SEG25 [4] call addpoint param-assignment [ ] + //SEG26 [92] phi from main::@5 to addpoint + addpoint_from_b5: + //SEG27 [92] phi (byte) addpoint::c#6 = (byte) 4 -- zpby1=coby1 + lda #$4 + sta $2 + //SEG28 [92] phi (byte) addpoint::y#6 = (byte) 2 -- yby=coby1 + ldy #$2 + //SEG29 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG30 [92] phi (byte) addpoint::x#6 = (byte) 34 -- aby=coby1 + lda #$22 + jsr addpoint + //SEG31 main::@6 + b6: + //SEG32 [5] call addpoint param-assignment [ ] + //SEG33 [92] phi from main::@6 to addpoint + addpoint_from_b6: + //SEG34 [92] phi (byte) addpoint::c#6 = (byte) 5 -- zpby1=coby1 + lda #$5 + sta $2 + //SEG35 [92] phi (byte) addpoint::y#6 = (byte) 17 -- yby=coby1 + ldy #$11 + //SEG36 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG37 [92] phi (byte) addpoint::x#6 = (byte) 21 -- aby=coby1 + lda #$15 + jsr addpoint + //SEG38 main::@7 + b7: + //SEG39 [6] call addpoint param-assignment [ ] + //SEG40 [92] phi from main::@7 to addpoint + addpoint_from_b7: + //SEG41 [92] phi (byte) addpoint::c#6 = (byte) 7 -- zpby1=coby1 + lda #$7 + sta $2 + //SEG42 [92] phi (byte) addpoint::y#6 = (byte) 22 -- yby=coby1 + ldy #$16 + //SEG43 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG44 [92] phi (byte) addpoint::x#6 = (byte) 31 -- aby=coby1 + lda #$1f + jsr addpoint + //SEG45 main::@8 + b8: + //SEG46 [7] call initscreen param-assignment [ ] + jsr initscreen + //SEG47 main::@1 + b1: + //SEG48 [8] call render param-assignment [ ] + jsr render + //SEG49 main::@10 + b10: + //SEG50 [9] call animate param-assignment [ ] + jsr animate + //SEG51 main::@11 + b11: + //SEG52 [10] if(true) goto main::@1 [ ] -- true_then_la1 + jmp b1 + //SEG53 main::@return + breturn: + //SEG54 [11] return [ ] + rts +} //SEG55 animate -animate: -//SEG56 [12] (byte~) animate::$0 ← * (word) 4096 [ animate::$0 ] -- aby=_star_cowo1 - lda $1000 -//SEG57 [13] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ] -- aby=aby_plus_1 - clc - adc #$1 -//SEG58 [14] *((word) 4096) ← (byte~) animate::$1 [ ] -- _star_cowo1=aby - sta $1000 -//SEG59 [15] (byte~) animate::$2 ← * (word) 4096 [ animate::$2 ] -- aby=_star_cowo1 - lda $1000 -//SEG60 [16] if((byte~) animate::$2==(byte) 40) goto animate::@1 [ ] -- aby_eq_coby1_then_la1 - cmp #$28 - beq animate__B1 -//SEG61 animate::@2 -animate__B2: -//SEG62 [17] (byte~) animate::$4 ← * (word) 4352 [ animate::$4 ] -- aby=_star_cowo1 - lda $1100 -//SEG63 [18] (byte~) animate::$5 ← (byte~) animate::$4 + (byte) 1 [ animate::$5 ] -- aby=aby_plus_1 - clc - adc #$1 -//SEG64 [19] *((word) 4352) ← (byte~) animate::$5 [ ] -- _star_cowo1=aby - sta $1100 -//SEG65 [20] (byte~) animate::$6 ← * (word) 4352 [ animate::$6 ] -- aby=_star_cowo1 - lda $1100 -//SEG66 [21] if((byte~) animate::$6==(byte) 25) goto animate::@3 [ ] -- aby_eq_coby1_then_la1 - cmp #$19 - beq animate__B3 -//SEG67 animate::@4 -animate__B4: -//SEG68 [22] (byte~) animate::$8 ← * (word) 4097 [ animate::$8 ] -- xby=_star_cowo1 - ldx $1001 -//SEG69 [23] (byte~) animate::$9 ← (byte~) animate::$8 - (byte) 1 [ animate::$9 ] -- xby=xby_minus_1 - dex -//SEG70 [24] *((word) 4097) ← (byte~) animate::$9 [ ] -- _star_cowo1=xby - stx $1001 -//SEG71 [25] (byte~) animate::$10 ← * (word) 4097 [ animate::$10 ] -- aby=_star_cowo1 - lda $1001 -//SEG72 [26] if((byte~) animate::$10==(byte) 255) goto animate::@5 [ ] -- aby_eq_coby1_then_la1 - cmp #$ff - beq animate__B5 -//SEG73 animate::@6 -animate__B6: -//SEG74 [27] (byte~) animate::$12 ← * (word) 4354 [ animate::$12 ] -- aby=_star_cowo1 - lda $1102 -//SEG75 [28] (byte~) animate::$13 ← (byte~) animate::$12 + (byte) 1 [ animate::$13 ] -- aby=aby_plus_1 - clc - adc #$1 -//SEG76 [29] *((word) 4354) ← (byte~) animate::$13 [ ] -- _star_cowo1=aby - sta $1102 -//SEG77 [30] (byte~) animate::$14 ← * (word) 4354 [ animate::$14 ] -- aby=_star_cowo1 - lda $1102 -//SEG78 [31] if((byte~) animate::$14==(byte) 25) goto animate::@7 [ ] -- aby_eq_coby1_then_la1 - cmp #$19 - beq animate__B7 -//SEG79 animate::@8 -animate__B8: -//SEG80 [32] (byte~) animate::$16 ← * (word) 4355 [ animate::$16 ] -- xby=_star_cowo1 - ldx $1103 -//SEG81 [33] (byte~) animate::$17 ← (byte~) animate::$16 - (byte) 1 [ animate::$17 ] -- xby=xby_minus_1 - dex -//SEG82 [34] *((word) 4355) ← (byte~) animate::$17 [ ] -- _star_cowo1=xby - stx $1103 -//SEG83 [35] (byte~) animate::$18 ← * (word) 4355 [ animate::$18 ] -- aby=_star_cowo1 - lda $1103 -//SEG84 [36] if((byte~) animate::$18==(byte) 255) goto animate::@9 [ ] -- aby_eq_coby1_then_la1 - cmp #$ff - beq animate__B9 -//SEG85 animate::@return -animate__Breturn: -//SEG86 [37] return [ ] - rts +animate: { + //SEG56 [12] (byte~) animate::$0 ← * (word) 4096 [ animate::$0 ] -- aby=_star_cowo1 + lda $1000 + //SEG57 [13] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ] -- aby=aby_plus_1 + clc + adc #$1 + //SEG58 [14] *((word) 4096) ← (byte~) animate::$1 [ ] -- _star_cowo1=aby + sta $1000 + //SEG59 [15] (byte~) animate::$2 ← * (word) 4096 [ animate::$2 ] -- aby=_star_cowo1 + lda $1000 + //SEG60 [16] if((byte~) animate::$2==(byte) 40) goto animate::@1 [ ] -- aby_eq_coby1_then_la1 + cmp #$28 + beq b1 + //SEG61 animate::@2 + b2: + //SEG62 [17] (byte~) animate::$4 ← * (word) 4352 [ animate::$4 ] -- aby=_star_cowo1 + lda $1100 + //SEG63 [18] (byte~) animate::$5 ← (byte~) animate::$4 + (byte) 1 [ animate::$5 ] -- aby=aby_plus_1 + clc + adc #$1 + //SEG64 [19] *((word) 4352) ← (byte~) animate::$5 [ ] -- _star_cowo1=aby + sta $1100 + //SEG65 [20] (byte~) animate::$6 ← * (word) 4352 [ animate::$6 ] -- aby=_star_cowo1 + lda $1100 + //SEG66 [21] if((byte~) animate::$6==(byte) 25) goto animate::@3 [ ] -- aby_eq_coby1_then_la1 + cmp #$19 + beq b3 + //SEG67 animate::@4 + b4: + //SEG68 [22] (byte~) animate::$8 ← * (word) 4097 [ animate::$8 ] -- xby=_star_cowo1 + ldx $1001 + //SEG69 [23] (byte~) animate::$9 ← (byte~) animate::$8 - (byte) 1 [ animate::$9 ] -- xby=xby_minus_1 + dex + //SEG70 [24] *((word) 4097) ← (byte~) animate::$9 [ ] -- _star_cowo1=xby + stx $1001 + //SEG71 [25] (byte~) animate::$10 ← * (word) 4097 [ animate::$10 ] -- aby=_star_cowo1 + lda $1001 + //SEG72 [26] if((byte~) animate::$10==(byte) 255) goto animate::@5 [ ] -- aby_eq_coby1_then_la1 + cmp #$ff + beq b5 + //SEG73 animate::@6 + b6: + //SEG74 [27] (byte~) animate::$12 ← * (word) 4354 [ animate::$12 ] -- aby=_star_cowo1 + lda $1102 + //SEG75 [28] (byte~) animate::$13 ← (byte~) animate::$12 + (byte) 1 [ animate::$13 ] -- aby=aby_plus_1 + clc + adc #$1 + //SEG76 [29] *((word) 4354) ← (byte~) animate::$13 [ ] -- _star_cowo1=aby + sta $1102 + //SEG77 [30] (byte~) animate::$14 ← * (word) 4354 [ animate::$14 ] -- aby=_star_cowo1 + lda $1102 + //SEG78 [31] if((byte~) animate::$14==(byte) 25) goto animate::@7 [ ] -- aby_eq_coby1_then_la1 + cmp #$19 + beq b7 + //SEG79 animate::@8 + b8: + //SEG80 [32] (byte~) animate::$16 ← * (word) 4355 [ animate::$16 ] -- xby=_star_cowo1 + ldx $1103 + //SEG81 [33] (byte~) animate::$17 ← (byte~) animate::$16 - (byte) 1 [ animate::$17 ] -- xby=xby_minus_1 + dex + //SEG82 [34] *((word) 4355) ← (byte~) animate::$17 [ ] -- _star_cowo1=xby + stx $1103 + //SEG83 [35] (byte~) animate::$18 ← * (word) 4355 [ animate::$18 ] -- aby=_star_cowo1 + lda $1103 + //SEG84 [36] if((byte~) animate::$18==(byte) 255) goto animate::@9 [ ] -- aby_eq_coby1_then_la1 + cmp #$ff + beq b9 + //SEG85 animate::@return + breturn: + //SEG86 [37] return [ ] + rts +} //SEG87 animate::@9 -animate__B9: +b9: //SEG88 [38] *((word) 4355) ← (byte) 25 [ ] -- _star_cowo1=coby2 lda #$19 sta $1103 @@ -7719,10 +7727,10 @@ animate__B9: lda $1003 //SEG93 [43] if((byte~) animate::$22>=(byte) 40) goto animate::@11 [ ] -- aby_ge_coby1_then_la1 cmp #$28 - bcs animate__B11 - jmp animate__Breturn + bcs b11 + jmp breturn //SEG94 animate::@11 -animate__B11: +b11: //SEG95 [44] (byte~) animate::$24 ← * (word) 4099 [ animate::$24 ] -- aby=_star_cowo1 lda $1003 //SEG96 [45] (byte~) animate::$25 ← (byte~) animate::$24 - (byte) 40 [ animate::$25 ] -- aby=aby_minus_coby1 @@ -7730,206 +7738,208 @@ animate__B11: sbc #$28 //SEG97 [46] *((word) 4099) ← (byte~) animate::$25 [ ] -- _star_cowo1=aby sta $1003 - jmp animate__Breturn + jmp breturn //SEG98 animate::@7 -animate__B7: +b7: //SEG99 [47] *((word) 4354) ← (byte) 0 [ ] -- _star_cowo1=coby2 lda #$0 sta $1102 - jmp animate__B8 + jmp b8 //SEG100 animate::@5 -animate__B5: +b5: //SEG101 [48] *((word) 4097) ← (byte) 40 [ ] -- _star_cowo1=coby2 lda #$28 sta $1001 - jmp animate__B6 + jmp b6 //SEG102 animate::@3 -animate__B3: +b3: //SEG103 [49] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2 lda #$0 sta $1100 - jmp animate__B4 + jmp b4 //SEG104 animate::@1 -animate__B1: +b1: //SEG105 [50] *((word) 4096) ← (byte) 0 [ ] -- _star_cowo1=coby2 lda #$0 sta $1000 - jmp animate__B2 + jmp b2 //SEG106 render -render: -//SEG107 [51] phi from render to render::@1 -render__B1_from_render: -//SEG108 [51] phi (byte*) render::colline#2 = (word) 55296 -- zpptrby1=cowo1 - lda #<$d800 - sta $3 - lda #>$d800 - sta $3+$1 -//SEG109 [51] phi (byte) render::y#2 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $2 - jmp render__B1 -//SEG110 [51] phi from render::@3 to render::@1 -render__B1_from_B3: -//SEG111 [51] phi (byte*) render::colline#2 = (byte*) render::colline#1 -- register_copy -//SEG112 [51] phi (byte) render::y#2 = (byte) render::y#1 -- register_copy -//SEG113 render::@1 -render__B1: -//SEG114 [52] phi from render::@1 to render::@2 -render__B2_from_B1: -//SEG115 [52] phi (byte) render::x#2 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $5 - jmp render__B2 -//SEG116 [52] phi from render::@5 to render::@2 -render__B2_from_B5: -//SEG117 [52] phi (byte) render::x#2 = (byte) render::x#1 -- register_copy -//SEG118 render::@2 -render__B2: -//SEG119 [53] (byte) findcol::x#0 ← (byte) render::x#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 - lda $5 - sta $9 -//SEG120 [54] (byte) findcol::y#0 ← (byte) render::y#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 - lda $2 - sta $a -//SEG121 [55] call findcol param-assignment [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] - jsr findcol -//SEG122 render::@5 -render__B5: -//SEG123 [56] (byte) render::col#0 ← (byte) findcol::return#0 [ render::x#2 render::y#2 render::colline#2 render::col#0 ] -- aby=yby - tya -//SEG124 [57] *((byte*) render::colline#2 + (byte) render::x#2) ← (byte) render::col#0 [ render::x#2 render::y#2 render::colline#2 ] -- zpptrby1_staridx_zpby1=aby - ldy $5 - sta ($3),y -//SEG125 [58] (byte) render::x#1 ← ++ (byte) render::x#2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1=_inc_zpby1 - inc $5 -//SEG126 [59] if((byte) render::x#1<(byte) 40) goto render::@2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1_lt_coby1_then_la1 - lda $5 - cmp #$28 - bcc render__B2_from_B5 -//SEG127 render::@3 -render__B3: -//SEG128 [60] (byte*) render::colline#1 ← (byte*) render::colline#2 + (byte) 40 [ render::colline#1 render::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 - lda $3 - clc - adc #$28 - sta $3 - bcc !+ - inc $3+$1 -!: -//SEG129 [61] (byte) render::y#1 ← ++ (byte) render::y#2 [ render::y#1 render::colline#1 ] -- zpby1=_inc_zpby1 - inc $2 -//SEG130 [62] if((byte) render::y#1<(byte) 25) goto render::@1 [ render::y#1 render::colline#1 ] -- zpby1_lt_coby1_then_la1 - lda $2 - cmp #$19 - bcc render__B1_from_B3 -//SEG131 render::@return -render__Breturn: -//SEG132 [63] return [ ] - rts +render: { + //SEG107 [51] phi from render to render::@1 + b1_from_render: + //SEG108 [51] phi (byte*) render::colline#2 = (word) 55296 -- zpptrby1=cowo1 + lda #<$d800 + sta $3 + lda #>$d800 + sta $3+$1 + //SEG109 [51] phi (byte) render::y#2 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $2 + jmp b1 + //SEG110 [51] phi from render::@3 to render::@1 + b1_from_b3: + //SEG111 [51] phi (byte*) render::colline#2 = (byte*) render::colline#1 -- register_copy + //SEG112 [51] phi (byte) render::y#2 = (byte) render::y#1 -- register_copy + //SEG113 render::@1 + b1: + //SEG114 [52] phi from render::@1 to render::@2 + b2_from_b1: + //SEG115 [52] phi (byte) render::x#2 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $5 + jmp b2 + //SEG116 [52] phi from render::@5 to render::@2 + b2_from_b5: + //SEG117 [52] phi (byte) render::x#2 = (byte) render::x#1 -- register_copy + //SEG118 render::@2 + b2: + //SEG119 [53] (byte) findcol::x#0 ← (byte) render::x#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 + lda $5 + sta $9 + //SEG120 [54] (byte) findcol::y#0 ← (byte) render::y#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 + lda $2 + sta $a + //SEG121 [55] call findcol param-assignment [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] + jsr findcol + //SEG122 render::@5 + b5: + //SEG123 [56] (byte) render::col#0 ← (byte) findcol::return#0 [ render::x#2 render::y#2 render::colline#2 render::col#0 ] -- aby=yby + tya + //SEG124 [57] *((byte*) render::colline#2 + (byte) render::x#2) ← (byte) render::col#0 [ render::x#2 render::y#2 render::colline#2 ] -- zpptrby1_staridx_zpby1=aby + ldy $5 + sta ($3),y + //SEG125 [58] (byte) render::x#1 ← ++ (byte) render::x#2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1=_inc_zpby1 + inc $5 + //SEG126 [59] if((byte) render::x#1<(byte) 40) goto render::@2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1_lt_coby1_then_la1 + lda $5 + cmp #$28 + bcc b2_from_b5 + //SEG127 render::@3 + b3: + //SEG128 [60] (byte*) render::colline#1 ← (byte*) render::colline#2 + (byte) 40 [ render::colline#1 render::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 + lda $3 + clc + adc #$28 + sta $3 + bcc !+ + inc $3+$1 + !: + //SEG129 [61] (byte) render::y#1 ← ++ (byte) render::y#2 [ render::y#1 render::colline#1 ] -- zpby1=_inc_zpby1 + inc $2 + //SEG130 [62] if((byte) render::y#1<(byte) 25) goto render::@1 [ render::y#1 render::colline#1 ] -- zpby1_lt_coby1_then_la1 + lda $2 + cmp #$19 + bcc b1_from_b3 + //SEG131 render::@return + breturn: + //SEG132 [63] return [ ] + rts +} //SEG133 findcol -findcol: -//SEG134 [64] phi from findcol to findcol::@1 -findcol__B1_from_findcol: -//SEG135 [64] phi (byte) findcol::mincol#11 = (byte) 0 -- yby=coby1 - ldy #$0 -//SEG136 [64] phi (byte) findcol::mindiff#10 = (byte) 255 -- zpby1=coby1 - lda #$ff - sta $6 -//SEG137 [64] phi (byte) findcol::i#12 = (byte) 0 -- xby=coby1 - ldx #$0 - jmp findcol__B1 -//SEG138 [64] phi from findcol::@13 to findcol::@1 -findcol__B1_from_B13: -//SEG139 [64] phi (byte) findcol::mincol#11 = (byte) findcol::mincol#2 -- register_copy -//SEG140 [64] phi (byte) findcol::mindiff#10 = (byte) findcol::mindiff#11 -- register_copy -//SEG141 [64] phi (byte) findcol::i#12 = (byte) findcol::i#1 -- register_copy -//SEG142 findcol::@1 -findcol__B1: -//SEG143 [65] (byte) findcol::xp#0 ← (word) 4096 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_xby - lda $1000,x - sta $7 -//SEG144 [66] (byte) findcol::yp#0 ← (word) 4352 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_xby - lda $1100,x - sta $b -//SEG145 [67] if((byte) findcol::x#0==(byte) findcol::xp#0) goto findcol::@2 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_eq_zpby2_then_la1 - lda $9 - cmp $7 - beq findcol__B2 -//SEG146 findcol::@3 -findcol__B3: -//SEG147 [68] if((byte) findcol::x#0<(byte) findcol::xp#0) goto findcol::@6 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 - lda $9 - cmp $7 - bcc findcol__B6 -//SEG148 findcol::@7 -findcol__B7: -//SEG149 [69] (byte) findcol::diff#1 ← (byte) findcol::x#0 - (byte) findcol::xp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::diff#1 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby2_minus_zpby1 - lda $9 - sec - sbc $7 - sta $7 -//SEG150 [70] phi from findcol::@7 to findcol::@8 -findcol__B8_from_B7: -//SEG151 [70] phi (byte) findcol::diff#4 = (byte) findcol::diff#1 -- register_copy -//SEG152 findcol::@8 -findcol__B8: -//SEG153 [71] if((byte) findcol::y#0<(byte) findcol::yp#0) goto findcol::@9 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::yp#0 findcol::diff#4 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 - lda $a - cmp $b - bcc findcol__B9 -//SEG154 findcol::@10 -findcol__B10: -//SEG155 [72] (byte~) findcol::$10 ← (byte) findcol::y#0 - (byte) findcol::yp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#4 findcol::$10 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby=zpby1_minus_zpby2 - lda $a - sec - sbc $b -//SEG156 [73] (byte) findcol::diff#3 ← (byte) findcol::diff#4 + (byte~) findcol::$10 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#3 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby=zpby1_plus_aby - clc - adc $7 -//SEG157 [74] phi from findcol::@10 to findcol::@11 -findcol__B11_from_B10: -//SEG158 [74] phi (byte) findcol::diff#6 = (byte) findcol::diff#3 -- register_copy -//SEG159 findcol::@11 -findcol__B11: -//SEG160 [75] if((byte) findcol::diff#6<(byte) findcol::mindiff#10) goto findcol::@12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#6 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby_lt_zpby1_then_la1 - cmp $6 - bcc findcol__B12 -//SEG161 [76] phi from findcol::@11 to findcol::@13 -findcol__B13_from_B11: -//SEG162 [76] phi (byte) findcol::mindiff#11 = (byte) findcol::mindiff#10 -- register_copy -//SEG163 [76] phi (byte) findcol::mincol#2 = (byte) findcol::mincol#11 -- register_copy -//SEG164 findcol::@13 -findcol__B13: -//SEG165 [77] (byte) findcol::i#1 ← ++ (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- xby=_inc_xby - inx -//SEG166 [78] if((byte) findcol::i#1<(byte) numpoints#1) goto findcol::@1 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- xby_lt_zpby1_then_la1 - cpx $8 - bcc findcol__B1_from_B13 -//SEG167 [79] phi from findcol::@13 to findcol::@return -findcol__Breturn_from_B13: -//SEG168 [79] phi (byte) findcol::return#0 = (byte) findcol::mincol#2 -- register_copy - jmp findcol__Breturn -//SEG169 [79] phi from findcol::@2 to findcol::@return -findcol__Breturn_from_B2: -//SEG170 [79] phi (byte) findcol::return#0 = (byte) 0 -- yby=coby1 - ldy #$0 -//SEG171 findcol::@return -findcol__Breturn: -//SEG172 [80] return [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] - rts +findcol: { + //SEG134 [64] phi from findcol to findcol::@1 + b1_from_findcol: + //SEG135 [64] phi (byte) findcol::mincol#11 = (byte) 0 -- yby=coby1 + ldy #$0 + //SEG136 [64] phi (byte) findcol::mindiff#10 = (byte) 255 -- zpby1=coby1 + lda #$ff + sta $6 + //SEG137 [64] phi (byte) findcol::i#12 = (byte) 0 -- xby=coby1 + ldx #$0 + jmp b1 + //SEG138 [64] phi from findcol::@13 to findcol::@1 + b1_from_b13: + //SEG139 [64] phi (byte) findcol::mincol#11 = (byte) findcol::mincol#2 -- register_copy + //SEG140 [64] phi (byte) findcol::mindiff#10 = (byte) findcol::mindiff#11 -- register_copy + //SEG141 [64] phi (byte) findcol::i#12 = (byte) findcol::i#1 -- register_copy + //SEG142 findcol::@1 + b1: + //SEG143 [65] (byte) findcol::xp#0 ← (word) 4096 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_xby + lda $1000,x + sta $7 + //SEG144 [66] (byte) findcol::yp#0 ← (word) 4352 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_xby + lda $1100,x + sta $b + //SEG145 [67] if((byte) findcol::x#0==(byte) findcol::xp#0) goto findcol::@2 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_eq_zpby2_then_la1 + lda $9 + cmp $7 + beq b2 + //SEG146 findcol::@3 + b3: + //SEG147 [68] if((byte) findcol::x#0<(byte) findcol::xp#0) goto findcol::@6 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 + lda $9 + cmp $7 + bcc b6 + //SEG148 findcol::@7 + b7: + //SEG149 [69] (byte) findcol::diff#1 ← (byte) findcol::x#0 - (byte) findcol::xp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::diff#1 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby2_minus_zpby1 + lda $9 + sec + sbc $7 + sta $7 + //SEG150 [70] phi from findcol::@7 to findcol::@8 + b8_from_b7: + //SEG151 [70] phi (byte) findcol::diff#4 = (byte) findcol::diff#1 -- register_copy + //SEG152 findcol::@8 + b8: + //SEG153 [71] if((byte) findcol::y#0<(byte) findcol::yp#0) goto findcol::@9 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::yp#0 findcol::diff#4 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 + lda $a + cmp $b + bcc b9 + //SEG154 findcol::@10 + b10: + //SEG155 [72] (byte~) findcol::$10 ← (byte) findcol::y#0 - (byte) findcol::yp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#4 findcol::$10 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby=zpby1_minus_zpby2 + lda $a + sec + sbc $b + //SEG156 [73] (byte) findcol::diff#3 ← (byte) findcol::diff#4 + (byte~) findcol::$10 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#3 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby=zpby1_plus_aby + clc + adc $7 + //SEG157 [74] phi from findcol::@10 to findcol::@11 + b11_from_b10: + //SEG158 [74] phi (byte) findcol::diff#6 = (byte) findcol::diff#3 -- register_copy + //SEG159 findcol::@11 + b11: + //SEG160 [75] if((byte) findcol::diff#6<(byte) findcol::mindiff#10) goto findcol::@12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#6 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby_lt_zpby1_then_la1 + cmp $6 + bcc b12 + //SEG161 [76] phi from findcol::@11 to findcol::@13 + b13_from_b11: + //SEG162 [76] phi (byte) findcol::mindiff#11 = (byte) findcol::mindiff#10 -- register_copy + //SEG163 [76] phi (byte) findcol::mincol#2 = (byte) findcol::mincol#11 -- register_copy + //SEG164 findcol::@13 + b13: + //SEG165 [77] (byte) findcol::i#1 ← ++ (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- xby=_inc_xby + inx + //SEG166 [78] if((byte) findcol::i#1<(byte) numpoints#1) goto findcol::@1 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- xby_lt_zpby1_then_la1 + cpx $8 + bcc b1_from_b13 + //SEG167 [79] phi from findcol::@13 to findcol::@return + breturn_from_b13: + //SEG168 [79] phi (byte) findcol::return#0 = (byte) findcol::mincol#2 -- register_copy + jmp breturn + //SEG169 [79] phi from findcol::@2 to findcol::@return + breturn_from_b2: + //SEG170 [79] phi (byte) findcol::return#0 = (byte) 0 -- yby=coby1 + ldy #$0 + //SEG171 findcol::@return + breturn: + //SEG172 [80] return [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] + rts +} //SEG173 findcol::@12 -findcol__B12: +b12: //SEG174 [81] (byte) findcol::mincol#1 ← (word) 4608 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#6 findcol::mincol#1 numpoints#1 ] -- yby=cowo1_staridx_xby ldy $1200,x //SEG175 [82] (byte~) findcol::diff#13 ← (byte) findcol::diff#6 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::mincol#1 findcol::diff#13 numpoints#1 ] -- zpby1=aby sta $6 //SEG176 [76] phi from findcol::@12 to findcol::@13 -findcol__B13_from_B12: +b13_from_b12: //SEG177 [76] phi (byte) findcol::mindiff#11 = (byte~) findcol::diff#13 -- register_copy //SEG178 [76] phi (byte) findcol::mincol#2 = (byte) findcol::mincol#1 -- register_copy - jmp findcol__B13 + jmp b13 //SEG179 findcol::@9 -findcol__B9: +b9: //SEG180 [83] (byte~) findcol::$8 ← (byte) findcol::yp#0 - (byte) findcol::y#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#4 findcol::mindiff#10 findcol::mincol#11 numpoints#1 findcol::$8 ] -- aby=zpby1_minus_zpby2 lda $b sec @@ -7938,276 +7948,280 @@ findcol__B9: clc adc $7 //SEG182 [74] phi from findcol::@9 to findcol::@11 -findcol__B11_from_B9: +b11_from_b9: //SEG183 [74] phi (byte) findcol::diff#6 = (byte) findcol::diff#2 -- register_copy - jmp findcol__B11 + jmp b11 //SEG184 findcol::@6 -findcol__B6: +b6: //SEG185 [85] (byte) findcol::diff#0 ← (byte) findcol::xp#0 - (byte) findcol::x#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::diff#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby1_minus_zpby2 lda $7 sec sbc $9 sta $7 //SEG186 [70] phi from findcol::@6 to findcol::@8 -findcol__B8_from_B6: +b8_from_b6: //SEG187 [70] phi (byte) findcol::diff#4 = (byte) findcol::diff#0 -- register_copy - jmp findcol__B8 + jmp b8 //SEG188 findcol::@2 -findcol__B2: +b2: //SEG189 [86] if((byte) findcol::y#0==(byte) findcol::yp#0) goto findcol::@return [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_eq_zpby2_then_la1 lda $a cmp $b - beq findcol__Breturn_from_B2 - jmp findcol__B3 + beq breturn_from_b2 + jmp b3 //SEG190 initscreen -initscreen: -//SEG191 [87] phi from initscreen to initscreen::@1 -initscreen__B1_from_initscreen: -//SEG192 [87] phi (byte*) initscreen::screen#2 = (word) 1024 -- zpptrby1=cowo1 - lda #<$400 - sta $3 - lda #>$400 - sta $3+$1 - jmp initscreen__B1 -//SEG193 [87] phi from initscreen::@1 to initscreen::@1 -initscreen__B1_from_B1: -//SEG194 [87] phi (byte*) initscreen::screen#2 = (byte*) initscreen::screen#1 -- register_copy -//SEG195 initscreen::@1 -initscreen__B1: -//SEG196 [88] *((byte*) initscreen::screen#2) ← (byte) 230 [ initscreen::screen#2 ] -- _star_zpptrby1=coby1 - ldy #$0 - lda #$e6 - sta ($3),y -//SEG197 [89] (byte*) initscreen::screen#1 ← ++ (byte*) initscreen::screen#2 [ initscreen::screen#1 ] -- zpptrby1=_inc_zpptrby1 - inc $3 - bne !+ - inc $3+$1 -!: -//SEG198 [90] if((byte*) initscreen::screen#1<(word) 2024) goto initscreen::@1 [ initscreen::screen#1 ] -- zpptrby1_lt_cowo1_then_la1 - lda $3+$1 - cmp #>$7e8 - bcc initscreen__B1_from_B1 - bne !+ - lda $3 - cmp #<$7e8 - bcc initscreen__B1_from_B1 -!: -//SEG199 initscreen::@return -initscreen__Breturn: -//SEG200 [91] return [ ] - rts +initscreen: { + //SEG191 [87] phi from initscreen to initscreen::@1 + b1_from_initscreen: + //SEG192 [87] phi (byte*) initscreen::screen#2 = (word) 1024 -- zpptrby1=cowo1 + lda #<$400 + sta $3 + lda #>$400 + sta $3+$1 + jmp b1 + //SEG193 [87] phi from initscreen::@1 to initscreen::@1 + b1_from_b1: + //SEG194 [87] phi (byte*) initscreen::screen#2 = (byte*) initscreen::screen#1 -- register_copy + //SEG195 initscreen::@1 + b1: + //SEG196 [88] *((byte*) initscreen::screen#2) ← (byte) 230 [ initscreen::screen#2 ] -- _star_zpptrby1=coby1 + ldy #$0 + lda #$e6 + sta ($3),y + //SEG197 [89] (byte*) initscreen::screen#1 ← ++ (byte*) initscreen::screen#2 [ initscreen::screen#1 ] -- zpptrby1=_inc_zpptrby1 + inc $3 + bne !+ + inc $3+$1 + !: + //SEG198 [90] if((byte*) initscreen::screen#1<(word) 2024) goto initscreen::@1 [ initscreen::screen#1 ] -- zpptrby1_lt_cowo1_then_la1 + lda $3+$1 + cmp #>$7e8 + bcc b1_from_b1 + bne !+ + lda $3 + cmp #<$7e8 + bcc b1_from_b1 + !: + //SEG199 initscreen::@return + breturn: + //SEG200 [91] return [ ] + rts +} //SEG201 addpoint -addpoint: -//SEG202 [93] *((word) 4096 + (byte) numpoints#19) ← (byte) addpoint::x#6 [ numpoints#19 addpoint::y#6 addpoint::c#6 ] -- cowo1_staridx_zpby1=aby - ldx $8 - sta $1000,x -//SEG203 [94] *((word) 4352 + (byte) numpoints#19) ← (byte) addpoint::y#6 [ numpoints#19 addpoint::c#6 ] -- cowo1_staridx_zpby1=yby - tya - ldy $8 - sta $1100,y -//SEG204 [95] *((word) 4608 + (byte) numpoints#19) ← (byte) addpoint::c#6 [ numpoints#19 ] -- cowo1_staridx_zpby1=zpby2 - lda $2 - ldx $8 - sta $1200,x -//SEG205 [96] (byte) numpoints#1 ← ++ (byte) numpoints#19 [ ] -- zpby1=_inc_zpby1 - inc $8 -//SEG206 addpoint::@return -addpoint__Breturn: -//SEG207 [97] return [ ] - rts +addpoint: { + //SEG202 [93] *((word) 4096 + (byte) numpoints#19) ← (byte) addpoint::x#6 [ numpoints#19 addpoint::y#6 addpoint::c#6 ] -- cowo1_staridx_zpby1=aby + ldx $8 + sta $1000,x + //SEG203 [94] *((word) 4352 + (byte) numpoints#19) ← (byte) addpoint::y#6 [ numpoints#19 addpoint::c#6 ] -- cowo1_staridx_zpby1=yby + tya + ldy $8 + sta $1100,y + //SEG204 [95] *((word) 4608 + (byte) numpoints#19) ← (byte) addpoint::c#6 [ numpoints#19 ] -- cowo1_staridx_zpby1=zpby2 + lda $2 + ldx $8 + sta $1200,x + //SEG205 [96] (byte) numpoints#1 ← ++ (byte) numpoints#19 [ ] -- zpby1=_inc_zpby1 + inc $8 + //SEG206 addpoint::@return + breturn: + //SEG207 [97] return [ ] + rts +} -Removing instruction jmp render__B1 -Removing instruction jmp render__B2 -Removing instruction jmp findcol__B1 -Removing instruction jmp initscreen__B1 +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b1 +Removing instruction jmp b1 Succesful ASM optimization Pass5NextJumpElimination ASSEMBLER -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call addpoint param-assignment [ ] -//SEG5 [92] phi from main to addpoint -addpoint_from_main: -//SEG6 [92] phi (byte) addpoint::c#6 = (byte) 1 -- zpby1=coby1 - lda #$1 - sta $2 -//SEG7 [92] phi (byte) addpoint::y#6 = (byte) 5 -- yby=coby1 - ldy #$5 -//SEG8 [92] phi (byte) numpoints#19 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $8 -//SEG9 [92] phi (byte) addpoint::x#6 = (byte) 5 -- aby=coby1 - lda #$5 - jsr addpoint -//SEG10 main::@3 -main__B3: -//SEG11 [2] call addpoint param-assignment [ ] -//SEG12 [92] phi from main::@3 to addpoint -addpoint_from_B3: -//SEG13 [92] phi (byte) addpoint::c#6 = (byte) 2 -- zpby1=coby1 - lda #$2 - sta $2 -//SEG14 [92] phi (byte) addpoint::y#6 = (byte) 8 -- yby=coby1 - ldy #$8 -//SEG15 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG16 [92] phi (byte) addpoint::x#6 = (byte) 15 -- aby=coby1 - lda #$f - jsr addpoint -//SEG17 main::@4 -main__B4: -//SEG18 [3] call addpoint param-assignment [ ] -//SEG19 [92] phi from main::@4 to addpoint -addpoint_from_B4: -//SEG20 [92] phi (byte) addpoint::c#6 = (byte) 3 -- zpby1=coby1 - lda #$3 - sta $2 -//SEG21 [92] phi (byte) addpoint::y#6 = (byte) 14 -- yby=coby1 - ldy #$e -//SEG22 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG23 [92] phi (byte) addpoint::x#6 = (byte) 6 -- aby=coby1 - lda #$6 - jsr addpoint -//SEG24 main::@5 -main__B5: -//SEG25 [4] call addpoint param-assignment [ ] -//SEG26 [92] phi from main::@5 to addpoint -addpoint_from_B5: -//SEG27 [92] phi (byte) addpoint::c#6 = (byte) 4 -- zpby1=coby1 - lda #$4 - sta $2 -//SEG28 [92] phi (byte) addpoint::y#6 = (byte) 2 -- yby=coby1 - ldy #$2 -//SEG29 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG30 [92] phi (byte) addpoint::x#6 = (byte) 34 -- aby=coby1 - lda #$22 - jsr addpoint -//SEG31 main::@6 -main__B6: -//SEG32 [5] call addpoint param-assignment [ ] -//SEG33 [92] phi from main::@6 to addpoint -addpoint_from_B6: -//SEG34 [92] phi (byte) addpoint::c#6 = (byte) 5 -- zpby1=coby1 - lda #$5 - sta $2 -//SEG35 [92] phi (byte) addpoint::y#6 = (byte) 17 -- yby=coby1 - ldy #$11 -//SEG36 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG37 [92] phi (byte) addpoint::x#6 = (byte) 21 -- aby=coby1 - lda #$15 - jsr addpoint -//SEG38 main::@7 -main__B7: -//SEG39 [6] call addpoint param-assignment [ ] -//SEG40 [92] phi from main::@7 to addpoint -addpoint_from_B7: -//SEG41 [92] phi (byte) addpoint::c#6 = (byte) 7 -- zpby1=coby1 - lda #$7 - sta $2 -//SEG42 [92] phi (byte) addpoint::y#6 = (byte) 22 -- yby=coby1 - ldy #$16 -//SEG43 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG44 [92] phi (byte) addpoint::x#6 = (byte) 31 -- aby=coby1 - lda #$1f - jsr addpoint -//SEG45 main::@8 -main__B8: -//SEG46 [7] call initscreen param-assignment [ ] - jsr initscreen -//SEG47 main::@1 -main__B1: -//SEG48 [8] call render param-assignment [ ] - jsr render -//SEG49 main::@10 -main__B10: -//SEG50 [9] call animate param-assignment [ ] - jsr animate -//SEG51 main::@11 -main__B11: -//SEG52 [10] if(true) goto main::@1 [ ] -- true_then_la1 - jmp main__B1 -//SEG53 main::@return -main__Breturn: -//SEG54 [11] return [ ] - rts +main: { + //SEG4 [1] call addpoint param-assignment [ ] + //SEG5 [92] phi from main to addpoint + addpoint_from_main: + //SEG6 [92] phi (byte) addpoint::c#6 = (byte) 1 -- zpby1=coby1 + lda #$1 + sta $2 + //SEG7 [92] phi (byte) addpoint::y#6 = (byte) 5 -- yby=coby1 + ldy #$5 + //SEG8 [92] phi (byte) numpoints#19 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $8 + //SEG9 [92] phi (byte) addpoint::x#6 = (byte) 5 -- aby=coby1 + lda #$5 + jsr addpoint + //SEG10 main::@3 + b3: + //SEG11 [2] call addpoint param-assignment [ ] + //SEG12 [92] phi from main::@3 to addpoint + addpoint_from_b3: + //SEG13 [92] phi (byte) addpoint::c#6 = (byte) 2 -- zpby1=coby1 + lda #$2 + sta $2 + //SEG14 [92] phi (byte) addpoint::y#6 = (byte) 8 -- yby=coby1 + ldy #$8 + //SEG15 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG16 [92] phi (byte) addpoint::x#6 = (byte) 15 -- aby=coby1 + lda #$f + jsr addpoint + //SEG17 main::@4 + b4: + //SEG18 [3] call addpoint param-assignment [ ] + //SEG19 [92] phi from main::@4 to addpoint + addpoint_from_b4: + //SEG20 [92] phi (byte) addpoint::c#6 = (byte) 3 -- zpby1=coby1 + lda #$3 + sta $2 + //SEG21 [92] phi (byte) addpoint::y#6 = (byte) 14 -- yby=coby1 + ldy #$e + //SEG22 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG23 [92] phi (byte) addpoint::x#6 = (byte) 6 -- aby=coby1 + lda #$6 + jsr addpoint + //SEG24 main::@5 + b5: + //SEG25 [4] call addpoint param-assignment [ ] + //SEG26 [92] phi from main::@5 to addpoint + addpoint_from_b5: + //SEG27 [92] phi (byte) addpoint::c#6 = (byte) 4 -- zpby1=coby1 + lda #$4 + sta $2 + //SEG28 [92] phi (byte) addpoint::y#6 = (byte) 2 -- yby=coby1 + ldy #$2 + //SEG29 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG30 [92] phi (byte) addpoint::x#6 = (byte) 34 -- aby=coby1 + lda #$22 + jsr addpoint + //SEG31 main::@6 + b6: + //SEG32 [5] call addpoint param-assignment [ ] + //SEG33 [92] phi from main::@6 to addpoint + addpoint_from_b6: + //SEG34 [92] phi (byte) addpoint::c#6 = (byte) 5 -- zpby1=coby1 + lda #$5 + sta $2 + //SEG35 [92] phi (byte) addpoint::y#6 = (byte) 17 -- yby=coby1 + ldy #$11 + //SEG36 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG37 [92] phi (byte) addpoint::x#6 = (byte) 21 -- aby=coby1 + lda #$15 + jsr addpoint + //SEG38 main::@7 + b7: + //SEG39 [6] call addpoint param-assignment [ ] + //SEG40 [92] phi from main::@7 to addpoint + addpoint_from_b7: + //SEG41 [92] phi (byte) addpoint::c#6 = (byte) 7 -- zpby1=coby1 + lda #$7 + sta $2 + //SEG42 [92] phi (byte) addpoint::y#6 = (byte) 22 -- yby=coby1 + ldy #$16 + //SEG43 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG44 [92] phi (byte) addpoint::x#6 = (byte) 31 -- aby=coby1 + lda #$1f + jsr addpoint + //SEG45 main::@8 + b8: + //SEG46 [7] call initscreen param-assignment [ ] + jsr initscreen + //SEG47 main::@1 + b1: + //SEG48 [8] call render param-assignment [ ] + jsr render + //SEG49 main::@10 + b10: + //SEG50 [9] call animate param-assignment [ ] + jsr animate + //SEG51 main::@11 + b11: + //SEG52 [10] if(true) goto main::@1 [ ] -- true_then_la1 + jmp b1 + //SEG53 main::@return + breturn: + //SEG54 [11] return [ ] + rts +} //SEG55 animate -animate: -//SEG56 [12] (byte~) animate::$0 ← * (word) 4096 [ animate::$0 ] -- aby=_star_cowo1 - lda $1000 -//SEG57 [13] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ] -- aby=aby_plus_1 - clc - adc #$1 -//SEG58 [14] *((word) 4096) ← (byte~) animate::$1 [ ] -- _star_cowo1=aby - sta $1000 -//SEG59 [15] (byte~) animate::$2 ← * (word) 4096 [ animate::$2 ] -- aby=_star_cowo1 - lda $1000 -//SEG60 [16] if((byte~) animate::$2==(byte) 40) goto animate::@1 [ ] -- aby_eq_coby1_then_la1 - cmp #$28 - beq animate__B1 -//SEG61 animate::@2 -animate__B2: -//SEG62 [17] (byte~) animate::$4 ← * (word) 4352 [ animate::$4 ] -- aby=_star_cowo1 - lda $1100 -//SEG63 [18] (byte~) animate::$5 ← (byte~) animate::$4 + (byte) 1 [ animate::$5 ] -- aby=aby_plus_1 - clc - adc #$1 -//SEG64 [19] *((word) 4352) ← (byte~) animate::$5 [ ] -- _star_cowo1=aby - sta $1100 -//SEG65 [20] (byte~) animate::$6 ← * (word) 4352 [ animate::$6 ] -- aby=_star_cowo1 - lda $1100 -//SEG66 [21] if((byte~) animate::$6==(byte) 25) goto animate::@3 [ ] -- aby_eq_coby1_then_la1 - cmp #$19 - beq animate__B3 -//SEG67 animate::@4 -animate__B4: -//SEG68 [22] (byte~) animate::$8 ← * (word) 4097 [ animate::$8 ] -- xby=_star_cowo1 - ldx $1001 -//SEG69 [23] (byte~) animate::$9 ← (byte~) animate::$8 - (byte) 1 [ animate::$9 ] -- xby=xby_minus_1 - dex -//SEG70 [24] *((word) 4097) ← (byte~) animate::$9 [ ] -- _star_cowo1=xby - stx $1001 -//SEG71 [25] (byte~) animate::$10 ← * (word) 4097 [ animate::$10 ] -- aby=_star_cowo1 - lda $1001 -//SEG72 [26] if((byte~) animate::$10==(byte) 255) goto animate::@5 [ ] -- aby_eq_coby1_then_la1 - cmp #$ff - beq animate__B5 -//SEG73 animate::@6 -animate__B6: -//SEG74 [27] (byte~) animate::$12 ← * (word) 4354 [ animate::$12 ] -- aby=_star_cowo1 - lda $1102 -//SEG75 [28] (byte~) animate::$13 ← (byte~) animate::$12 + (byte) 1 [ animate::$13 ] -- aby=aby_plus_1 - clc - adc #$1 -//SEG76 [29] *((word) 4354) ← (byte~) animate::$13 [ ] -- _star_cowo1=aby - sta $1102 -//SEG77 [30] (byte~) animate::$14 ← * (word) 4354 [ animate::$14 ] -- aby=_star_cowo1 - lda $1102 -//SEG78 [31] if((byte~) animate::$14==(byte) 25) goto animate::@7 [ ] -- aby_eq_coby1_then_la1 - cmp #$19 - beq animate__B7 -//SEG79 animate::@8 -animate__B8: -//SEG80 [32] (byte~) animate::$16 ← * (word) 4355 [ animate::$16 ] -- xby=_star_cowo1 - ldx $1103 -//SEG81 [33] (byte~) animate::$17 ← (byte~) animate::$16 - (byte) 1 [ animate::$17 ] -- xby=xby_minus_1 - dex -//SEG82 [34] *((word) 4355) ← (byte~) animate::$17 [ ] -- _star_cowo1=xby - stx $1103 -//SEG83 [35] (byte~) animate::$18 ← * (word) 4355 [ animate::$18 ] -- aby=_star_cowo1 - lda $1103 -//SEG84 [36] if((byte~) animate::$18==(byte) 255) goto animate::@9 [ ] -- aby_eq_coby1_then_la1 - cmp #$ff - beq animate__B9 -//SEG85 animate::@return -animate__Breturn: -//SEG86 [37] return [ ] - rts +animate: { + //SEG56 [12] (byte~) animate::$0 ← * (word) 4096 [ animate::$0 ] -- aby=_star_cowo1 + lda $1000 + //SEG57 [13] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ] -- aby=aby_plus_1 + clc + adc #$1 + //SEG58 [14] *((word) 4096) ← (byte~) animate::$1 [ ] -- _star_cowo1=aby + sta $1000 + //SEG59 [15] (byte~) animate::$2 ← * (word) 4096 [ animate::$2 ] -- aby=_star_cowo1 + lda $1000 + //SEG60 [16] if((byte~) animate::$2==(byte) 40) goto animate::@1 [ ] -- aby_eq_coby1_then_la1 + cmp #$28 + beq b1 + //SEG61 animate::@2 + b2: + //SEG62 [17] (byte~) animate::$4 ← * (word) 4352 [ animate::$4 ] -- aby=_star_cowo1 + lda $1100 + //SEG63 [18] (byte~) animate::$5 ← (byte~) animate::$4 + (byte) 1 [ animate::$5 ] -- aby=aby_plus_1 + clc + adc #$1 + //SEG64 [19] *((word) 4352) ← (byte~) animate::$5 [ ] -- _star_cowo1=aby + sta $1100 + //SEG65 [20] (byte~) animate::$6 ← * (word) 4352 [ animate::$6 ] -- aby=_star_cowo1 + lda $1100 + //SEG66 [21] if((byte~) animate::$6==(byte) 25) goto animate::@3 [ ] -- aby_eq_coby1_then_la1 + cmp #$19 + beq b3 + //SEG67 animate::@4 + b4: + //SEG68 [22] (byte~) animate::$8 ← * (word) 4097 [ animate::$8 ] -- xby=_star_cowo1 + ldx $1001 + //SEG69 [23] (byte~) animate::$9 ← (byte~) animate::$8 - (byte) 1 [ animate::$9 ] -- xby=xby_minus_1 + dex + //SEG70 [24] *((word) 4097) ← (byte~) animate::$9 [ ] -- _star_cowo1=xby + stx $1001 + //SEG71 [25] (byte~) animate::$10 ← * (word) 4097 [ animate::$10 ] -- aby=_star_cowo1 + lda $1001 + //SEG72 [26] if((byte~) animate::$10==(byte) 255) goto animate::@5 [ ] -- aby_eq_coby1_then_la1 + cmp #$ff + beq b5 + //SEG73 animate::@6 + b6: + //SEG74 [27] (byte~) animate::$12 ← * (word) 4354 [ animate::$12 ] -- aby=_star_cowo1 + lda $1102 + //SEG75 [28] (byte~) animate::$13 ← (byte~) animate::$12 + (byte) 1 [ animate::$13 ] -- aby=aby_plus_1 + clc + adc #$1 + //SEG76 [29] *((word) 4354) ← (byte~) animate::$13 [ ] -- _star_cowo1=aby + sta $1102 + //SEG77 [30] (byte~) animate::$14 ← * (word) 4354 [ animate::$14 ] -- aby=_star_cowo1 + lda $1102 + //SEG78 [31] if((byte~) animate::$14==(byte) 25) goto animate::@7 [ ] -- aby_eq_coby1_then_la1 + cmp #$19 + beq b7 + //SEG79 animate::@8 + b8: + //SEG80 [32] (byte~) animate::$16 ← * (word) 4355 [ animate::$16 ] -- xby=_star_cowo1 + ldx $1103 + //SEG81 [33] (byte~) animate::$17 ← (byte~) animate::$16 - (byte) 1 [ animate::$17 ] -- xby=xby_minus_1 + dex + //SEG82 [34] *((word) 4355) ← (byte~) animate::$17 [ ] -- _star_cowo1=xby + stx $1103 + //SEG83 [35] (byte~) animate::$18 ← * (word) 4355 [ animate::$18 ] -- aby=_star_cowo1 + lda $1103 + //SEG84 [36] if((byte~) animate::$18==(byte) 255) goto animate::@9 [ ] -- aby_eq_coby1_then_la1 + cmp #$ff + beq b9 + //SEG85 animate::@return + breturn: + //SEG86 [37] return [ ] + rts +} //SEG87 animate::@9 -animate__B9: +b9: //SEG88 [38] *((word) 4355) ← (byte) 25 [ ] -- _star_cowo1=coby2 lda #$19 sta $1103 @@ -8222,10 +8236,10 @@ animate__B9: lda $1003 //SEG93 [43] if((byte~) animate::$22>=(byte) 40) goto animate::@11 [ ] -- aby_ge_coby1_then_la1 cmp #$28 - bcs animate__B11 - jmp animate__Breturn + bcs b11 + jmp breturn //SEG94 animate::@11 -animate__B11: +b11: //SEG95 [44] (byte~) animate::$24 ← * (word) 4099 [ animate::$24 ] -- aby=_star_cowo1 lda $1003 //SEG96 [45] (byte~) animate::$25 ← (byte~) animate::$24 - (byte) 40 [ animate::$25 ] -- aby=aby_minus_coby1 @@ -8233,203 +8247,205 @@ animate__B11: sbc #$28 //SEG97 [46] *((word) 4099) ← (byte~) animate::$25 [ ] -- _star_cowo1=aby sta $1003 - jmp animate__Breturn + jmp breturn //SEG98 animate::@7 -animate__B7: +b7: //SEG99 [47] *((word) 4354) ← (byte) 0 [ ] -- _star_cowo1=coby2 lda #$0 sta $1102 - jmp animate__B8 + jmp b8 //SEG100 animate::@5 -animate__B5: +b5: //SEG101 [48] *((word) 4097) ← (byte) 40 [ ] -- _star_cowo1=coby2 lda #$28 sta $1001 - jmp animate__B6 + jmp b6 //SEG102 animate::@3 -animate__B3: +b3: //SEG103 [49] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2 lda #$0 sta $1100 - jmp animate__B4 + jmp b4 //SEG104 animate::@1 -animate__B1: +b1: //SEG105 [50] *((word) 4096) ← (byte) 0 [ ] -- _star_cowo1=coby2 lda #$0 sta $1000 - jmp animate__B2 + jmp b2 //SEG106 render -render: -//SEG107 [51] phi from render to render::@1 -render__B1_from_render: -//SEG108 [51] phi (byte*) render::colline#2 = (word) 55296 -- zpptrby1=cowo1 - lda #<$d800 - sta $3 - lda #>$d800 - sta $3+$1 -//SEG109 [51] phi (byte) render::y#2 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $2 -//SEG110 [51] phi from render::@3 to render::@1 -render__B1_from_B3: -//SEG111 [51] phi (byte*) render::colline#2 = (byte*) render::colline#1 -- register_copy -//SEG112 [51] phi (byte) render::y#2 = (byte) render::y#1 -- register_copy -//SEG113 render::@1 -render__B1: -//SEG114 [52] phi from render::@1 to render::@2 -render__B2_from_B1: -//SEG115 [52] phi (byte) render::x#2 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $5 -//SEG116 [52] phi from render::@5 to render::@2 -render__B2_from_B5: -//SEG117 [52] phi (byte) render::x#2 = (byte) render::x#1 -- register_copy -//SEG118 render::@2 -render__B2: -//SEG119 [53] (byte) findcol::x#0 ← (byte) render::x#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 - lda $5 - sta $9 -//SEG120 [54] (byte) findcol::y#0 ← (byte) render::y#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 - lda $2 - sta $a -//SEG121 [55] call findcol param-assignment [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] - jsr findcol -//SEG122 render::@5 -render__B5: -//SEG123 [56] (byte) render::col#0 ← (byte) findcol::return#0 [ render::x#2 render::y#2 render::colline#2 render::col#0 ] -- aby=yby - tya -//SEG124 [57] *((byte*) render::colline#2 + (byte) render::x#2) ← (byte) render::col#0 [ render::x#2 render::y#2 render::colline#2 ] -- zpptrby1_staridx_zpby1=aby - ldy $5 - sta ($3),y -//SEG125 [58] (byte) render::x#1 ← ++ (byte) render::x#2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1=_inc_zpby1 - inc $5 -//SEG126 [59] if((byte) render::x#1<(byte) 40) goto render::@2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1_lt_coby1_then_la1 - lda $5 - cmp #$28 - bcc render__B2_from_B5 -//SEG127 render::@3 -render__B3: -//SEG128 [60] (byte*) render::colline#1 ← (byte*) render::colline#2 + (byte) 40 [ render::colline#1 render::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 - lda $3 - clc - adc #$28 - sta $3 - bcc !+ - inc $3+$1 -!: -//SEG129 [61] (byte) render::y#1 ← ++ (byte) render::y#2 [ render::y#1 render::colline#1 ] -- zpby1=_inc_zpby1 - inc $2 -//SEG130 [62] if((byte) render::y#1<(byte) 25) goto render::@1 [ render::y#1 render::colline#1 ] -- zpby1_lt_coby1_then_la1 - lda $2 - cmp #$19 - bcc render__B1_from_B3 -//SEG131 render::@return -render__Breturn: -//SEG132 [63] return [ ] - rts +render: { + //SEG107 [51] phi from render to render::@1 + b1_from_render: + //SEG108 [51] phi (byte*) render::colline#2 = (word) 55296 -- zpptrby1=cowo1 + lda #<$d800 + sta $3 + lda #>$d800 + sta $3+$1 + //SEG109 [51] phi (byte) render::y#2 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $2 + //SEG110 [51] phi from render::@3 to render::@1 + b1_from_b3: + //SEG111 [51] phi (byte*) render::colline#2 = (byte*) render::colline#1 -- register_copy + //SEG112 [51] phi (byte) render::y#2 = (byte) render::y#1 -- register_copy + //SEG113 render::@1 + b1: + //SEG114 [52] phi from render::@1 to render::@2 + b2_from_b1: + //SEG115 [52] phi (byte) render::x#2 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $5 + //SEG116 [52] phi from render::@5 to render::@2 + b2_from_b5: + //SEG117 [52] phi (byte) render::x#2 = (byte) render::x#1 -- register_copy + //SEG118 render::@2 + b2: + //SEG119 [53] (byte) findcol::x#0 ← (byte) render::x#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 + lda $5 + sta $9 + //SEG120 [54] (byte) findcol::y#0 ← (byte) render::y#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 + lda $2 + sta $a + //SEG121 [55] call findcol param-assignment [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] + jsr findcol + //SEG122 render::@5 + b5: + //SEG123 [56] (byte) render::col#0 ← (byte) findcol::return#0 [ render::x#2 render::y#2 render::colline#2 render::col#0 ] -- aby=yby + tya + //SEG124 [57] *((byte*) render::colline#2 + (byte) render::x#2) ← (byte) render::col#0 [ render::x#2 render::y#2 render::colline#2 ] -- zpptrby1_staridx_zpby1=aby + ldy $5 + sta ($3),y + //SEG125 [58] (byte) render::x#1 ← ++ (byte) render::x#2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1=_inc_zpby1 + inc $5 + //SEG126 [59] if((byte) render::x#1<(byte) 40) goto render::@2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1_lt_coby1_then_la1 + lda $5 + cmp #$28 + bcc b2_from_b5 + //SEG127 render::@3 + b3: + //SEG128 [60] (byte*) render::colline#1 ← (byte*) render::colline#2 + (byte) 40 [ render::colline#1 render::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 + lda $3 + clc + adc #$28 + sta $3 + bcc !+ + inc $3+$1 + !: + //SEG129 [61] (byte) render::y#1 ← ++ (byte) render::y#2 [ render::y#1 render::colline#1 ] -- zpby1=_inc_zpby1 + inc $2 + //SEG130 [62] if((byte) render::y#1<(byte) 25) goto render::@1 [ render::y#1 render::colline#1 ] -- zpby1_lt_coby1_then_la1 + lda $2 + cmp #$19 + bcc b1_from_b3 + //SEG131 render::@return + breturn: + //SEG132 [63] return [ ] + rts +} //SEG133 findcol -findcol: -//SEG134 [64] phi from findcol to findcol::@1 -findcol__B1_from_findcol: -//SEG135 [64] phi (byte) findcol::mincol#11 = (byte) 0 -- yby=coby1 - ldy #$0 -//SEG136 [64] phi (byte) findcol::mindiff#10 = (byte) 255 -- zpby1=coby1 - lda #$ff - sta $6 -//SEG137 [64] phi (byte) findcol::i#12 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG138 [64] phi from findcol::@13 to findcol::@1 -findcol__B1_from_B13: -//SEG139 [64] phi (byte) findcol::mincol#11 = (byte) findcol::mincol#2 -- register_copy -//SEG140 [64] phi (byte) findcol::mindiff#10 = (byte) findcol::mindiff#11 -- register_copy -//SEG141 [64] phi (byte) findcol::i#12 = (byte) findcol::i#1 -- register_copy -//SEG142 findcol::@1 -findcol__B1: -//SEG143 [65] (byte) findcol::xp#0 ← (word) 4096 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_xby - lda $1000,x - sta $7 -//SEG144 [66] (byte) findcol::yp#0 ← (word) 4352 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_xby - lda $1100,x - sta $b -//SEG145 [67] if((byte) findcol::x#0==(byte) findcol::xp#0) goto findcol::@2 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_eq_zpby2_then_la1 - lda $9 - cmp $7 - beq findcol__B2 -//SEG146 findcol::@3 -findcol__B3: -//SEG147 [68] if((byte) findcol::x#0<(byte) findcol::xp#0) goto findcol::@6 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 - lda $9 - cmp $7 - bcc findcol__B6 -//SEG148 findcol::@7 -findcol__B7: -//SEG149 [69] (byte) findcol::diff#1 ← (byte) findcol::x#0 - (byte) findcol::xp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::diff#1 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby2_minus_zpby1 - lda $9 - sec - sbc $7 - sta $7 -//SEG150 [70] phi from findcol::@7 to findcol::@8 -findcol__B8_from_B7: -//SEG151 [70] phi (byte) findcol::diff#4 = (byte) findcol::diff#1 -- register_copy -//SEG152 findcol::@8 -findcol__B8: -//SEG153 [71] if((byte) findcol::y#0<(byte) findcol::yp#0) goto findcol::@9 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::yp#0 findcol::diff#4 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 - lda $a - cmp $b - bcc findcol__B9 -//SEG154 findcol::@10 -findcol__B10: -//SEG155 [72] (byte~) findcol::$10 ← (byte) findcol::y#0 - (byte) findcol::yp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#4 findcol::$10 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby=zpby1_minus_zpby2 - lda $a - sec - sbc $b -//SEG156 [73] (byte) findcol::diff#3 ← (byte) findcol::diff#4 + (byte~) findcol::$10 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#3 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby=zpby1_plus_aby - clc - adc $7 -//SEG157 [74] phi from findcol::@10 to findcol::@11 -findcol__B11_from_B10: -//SEG158 [74] phi (byte) findcol::diff#6 = (byte) findcol::diff#3 -- register_copy -//SEG159 findcol::@11 -findcol__B11: -//SEG160 [75] if((byte) findcol::diff#6<(byte) findcol::mindiff#10) goto findcol::@12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#6 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby_lt_zpby1_then_la1 - cmp $6 - bcc findcol__B12 -//SEG161 [76] phi from findcol::@11 to findcol::@13 -findcol__B13_from_B11: -//SEG162 [76] phi (byte) findcol::mindiff#11 = (byte) findcol::mindiff#10 -- register_copy -//SEG163 [76] phi (byte) findcol::mincol#2 = (byte) findcol::mincol#11 -- register_copy -//SEG164 findcol::@13 -findcol__B13: -//SEG165 [77] (byte) findcol::i#1 ← ++ (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- xby=_inc_xby - inx -//SEG166 [78] if((byte) findcol::i#1<(byte) numpoints#1) goto findcol::@1 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- xby_lt_zpby1_then_la1 - cpx $8 - bcc findcol__B1_from_B13 -//SEG167 [79] phi from findcol::@13 to findcol::@return -findcol__Breturn_from_B13: -//SEG168 [79] phi (byte) findcol::return#0 = (byte) findcol::mincol#2 -- register_copy - jmp findcol__Breturn -//SEG169 [79] phi from findcol::@2 to findcol::@return -findcol__Breturn_from_B2: -//SEG170 [79] phi (byte) findcol::return#0 = (byte) 0 -- yby=coby1 - ldy #$0 -//SEG171 findcol::@return -findcol__Breturn: -//SEG172 [80] return [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] - rts +findcol: { + //SEG134 [64] phi from findcol to findcol::@1 + b1_from_findcol: + //SEG135 [64] phi (byte) findcol::mincol#11 = (byte) 0 -- yby=coby1 + ldy #$0 + //SEG136 [64] phi (byte) findcol::mindiff#10 = (byte) 255 -- zpby1=coby1 + lda #$ff + sta $6 + //SEG137 [64] phi (byte) findcol::i#12 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG138 [64] phi from findcol::@13 to findcol::@1 + b1_from_b13: + //SEG139 [64] phi (byte) findcol::mincol#11 = (byte) findcol::mincol#2 -- register_copy + //SEG140 [64] phi (byte) findcol::mindiff#10 = (byte) findcol::mindiff#11 -- register_copy + //SEG141 [64] phi (byte) findcol::i#12 = (byte) findcol::i#1 -- register_copy + //SEG142 findcol::@1 + b1: + //SEG143 [65] (byte) findcol::xp#0 ← (word) 4096 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_xby + lda $1000,x + sta $7 + //SEG144 [66] (byte) findcol::yp#0 ← (word) 4352 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_xby + lda $1100,x + sta $b + //SEG145 [67] if((byte) findcol::x#0==(byte) findcol::xp#0) goto findcol::@2 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_eq_zpby2_then_la1 + lda $9 + cmp $7 + beq b2 + //SEG146 findcol::@3 + b3: + //SEG147 [68] if((byte) findcol::x#0<(byte) findcol::xp#0) goto findcol::@6 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 + lda $9 + cmp $7 + bcc b6 + //SEG148 findcol::@7 + b7: + //SEG149 [69] (byte) findcol::diff#1 ← (byte) findcol::x#0 - (byte) findcol::xp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::diff#1 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby2_minus_zpby1 + lda $9 + sec + sbc $7 + sta $7 + //SEG150 [70] phi from findcol::@7 to findcol::@8 + b8_from_b7: + //SEG151 [70] phi (byte) findcol::diff#4 = (byte) findcol::diff#1 -- register_copy + //SEG152 findcol::@8 + b8: + //SEG153 [71] if((byte) findcol::y#0<(byte) findcol::yp#0) goto findcol::@9 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::yp#0 findcol::diff#4 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 + lda $a + cmp $b + bcc b9 + //SEG154 findcol::@10 + b10: + //SEG155 [72] (byte~) findcol::$10 ← (byte) findcol::y#0 - (byte) findcol::yp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#4 findcol::$10 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby=zpby1_minus_zpby2 + lda $a + sec + sbc $b + //SEG156 [73] (byte) findcol::diff#3 ← (byte) findcol::diff#4 + (byte~) findcol::$10 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#3 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby=zpby1_plus_aby + clc + adc $7 + //SEG157 [74] phi from findcol::@10 to findcol::@11 + b11_from_b10: + //SEG158 [74] phi (byte) findcol::diff#6 = (byte) findcol::diff#3 -- register_copy + //SEG159 findcol::@11 + b11: + //SEG160 [75] if((byte) findcol::diff#6<(byte) findcol::mindiff#10) goto findcol::@12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#6 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby_lt_zpby1_then_la1 + cmp $6 + bcc b12 + //SEG161 [76] phi from findcol::@11 to findcol::@13 + b13_from_b11: + //SEG162 [76] phi (byte) findcol::mindiff#11 = (byte) findcol::mindiff#10 -- register_copy + //SEG163 [76] phi (byte) findcol::mincol#2 = (byte) findcol::mincol#11 -- register_copy + //SEG164 findcol::@13 + b13: + //SEG165 [77] (byte) findcol::i#1 ← ++ (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- xby=_inc_xby + inx + //SEG166 [78] if((byte) findcol::i#1<(byte) numpoints#1) goto findcol::@1 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- xby_lt_zpby1_then_la1 + cpx $8 + bcc b1_from_b13 + //SEG167 [79] phi from findcol::@13 to findcol::@return + breturn_from_b13: + //SEG168 [79] phi (byte) findcol::return#0 = (byte) findcol::mincol#2 -- register_copy + jmp breturn + //SEG169 [79] phi from findcol::@2 to findcol::@return + breturn_from_b2: + //SEG170 [79] phi (byte) findcol::return#0 = (byte) 0 -- yby=coby1 + ldy #$0 + //SEG171 findcol::@return + breturn: + //SEG172 [80] return [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] + rts +} //SEG173 findcol::@12 -findcol__B12: +b12: //SEG174 [81] (byte) findcol::mincol#1 ← (word) 4608 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#6 findcol::mincol#1 numpoints#1 ] -- yby=cowo1_staridx_xby ldy $1200,x //SEG175 [82] (byte~) findcol::diff#13 ← (byte) findcol::diff#6 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::mincol#1 findcol::diff#13 numpoints#1 ] -- zpby1=aby sta $6 //SEG176 [76] phi from findcol::@12 to findcol::@13 -findcol__B13_from_B12: +b13_from_b12: //SEG177 [76] phi (byte) findcol::mindiff#11 = (byte~) findcol::diff#13 -- register_copy //SEG178 [76] phi (byte) findcol::mincol#2 = (byte) findcol::mincol#1 -- register_copy - jmp findcol__B13 + jmp b13 //SEG179 findcol::@9 -findcol__B9: +b9: //SEG180 [83] (byte~) findcol::$8 ← (byte) findcol::yp#0 - (byte) findcol::y#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#4 findcol::mindiff#10 findcol::mincol#11 numpoints#1 findcol::$8 ] -- aby=zpby1_minus_zpby2 lda $b sec @@ -8438,86 +8454,88 @@ findcol__B9: clc adc $7 //SEG182 [74] phi from findcol::@9 to findcol::@11 -findcol__B11_from_B9: +b11_from_b9: //SEG183 [74] phi (byte) findcol::diff#6 = (byte) findcol::diff#2 -- register_copy - jmp findcol__B11 + jmp b11 //SEG184 findcol::@6 -findcol__B6: +b6: //SEG185 [85] (byte) findcol::diff#0 ← (byte) findcol::xp#0 - (byte) findcol::x#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::diff#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby1_minus_zpby2 lda $7 sec sbc $9 sta $7 //SEG186 [70] phi from findcol::@6 to findcol::@8 -findcol__B8_from_B6: +b8_from_b6: //SEG187 [70] phi (byte) findcol::diff#4 = (byte) findcol::diff#0 -- register_copy - jmp findcol__B8 + jmp b8 //SEG188 findcol::@2 -findcol__B2: +b2: //SEG189 [86] if((byte) findcol::y#0==(byte) findcol::yp#0) goto findcol::@return [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_eq_zpby2_then_la1 lda $a cmp $b - beq findcol__Breturn_from_B2 - jmp findcol__B3 + beq breturn_from_b2 + jmp b3 //SEG190 initscreen -initscreen: -//SEG191 [87] phi from initscreen to initscreen::@1 -initscreen__B1_from_initscreen: -//SEG192 [87] phi (byte*) initscreen::screen#2 = (word) 1024 -- zpptrby1=cowo1 - lda #<$400 - sta $3 - lda #>$400 - sta $3+$1 -//SEG193 [87] phi from initscreen::@1 to initscreen::@1 -initscreen__B1_from_B1: -//SEG194 [87] phi (byte*) initscreen::screen#2 = (byte*) initscreen::screen#1 -- register_copy -//SEG195 initscreen::@1 -initscreen__B1: -//SEG196 [88] *((byte*) initscreen::screen#2) ← (byte) 230 [ initscreen::screen#2 ] -- _star_zpptrby1=coby1 - ldy #$0 - lda #$e6 - sta ($3),y -//SEG197 [89] (byte*) initscreen::screen#1 ← ++ (byte*) initscreen::screen#2 [ initscreen::screen#1 ] -- zpptrby1=_inc_zpptrby1 - inc $3 - bne !+ - inc $3+$1 -!: -//SEG198 [90] if((byte*) initscreen::screen#1<(word) 2024) goto initscreen::@1 [ initscreen::screen#1 ] -- zpptrby1_lt_cowo1_then_la1 - lda $3+$1 - cmp #>$7e8 - bcc initscreen__B1_from_B1 - bne !+ - lda $3 - cmp #<$7e8 - bcc initscreen__B1_from_B1 -!: -//SEG199 initscreen::@return -initscreen__Breturn: -//SEG200 [91] return [ ] - rts +initscreen: { + //SEG191 [87] phi from initscreen to initscreen::@1 + b1_from_initscreen: + //SEG192 [87] phi (byte*) initscreen::screen#2 = (word) 1024 -- zpptrby1=cowo1 + lda #<$400 + sta $3 + lda #>$400 + sta $3+$1 + //SEG193 [87] phi from initscreen::@1 to initscreen::@1 + b1_from_b1: + //SEG194 [87] phi (byte*) initscreen::screen#2 = (byte*) initscreen::screen#1 -- register_copy + //SEG195 initscreen::@1 + b1: + //SEG196 [88] *((byte*) initscreen::screen#2) ← (byte) 230 [ initscreen::screen#2 ] -- _star_zpptrby1=coby1 + ldy #$0 + lda #$e6 + sta ($3),y + //SEG197 [89] (byte*) initscreen::screen#1 ← ++ (byte*) initscreen::screen#2 [ initscreen::screen#1 ] -- zpptrby1=_inc_zpptrby1 + inc $3 + bne !+ + inc $3+$1 + !: + //SEG198 [90] if((byte*) initscreen::screen#1<(word) 2024) goto initscreen::@1 [ initscreen::screen#1 ] -- zpptrby1_lt_cowo1_then_la1 + lda $3+$1 + cmp #>$7e8 + bcc b1_from_b1 + bne !+ + lda $3 + cmp #<$7e8 + bcc b1_from_b1 + !: + //SEG199 initscreen::@return + breturn: + //SEG200 [91] return [ ] + rts +} //SEG201 addpoint -addpoint: -//SEG202 [93] *((word) 4096 + (byte) numpoints#19) ← (byte) addpoint::x#6 [ numpoints#19 addpoint::y#6 addpoint::c#6 ] -- cowo1_staridx_zpby1=aby - ldx $8 - sta $1000,x -//SEG203 [94] *((word) 4352 + (byte) numpoints#19) ← (byte) addpoint::y#6 [ numpoints#19 addpoint::c#6 ] -- cowo1_staridx_zpby1=yby - tya - ldy $8 - sta $1100,y -//SEG204 [95] *((word) 4608 + (byte) numpoints#19) ← (byte) addpoint::c#6 [ numpoints#19 ] -- cowo1_staridx_zpby1=zpby2 - lda $2 - ldx $8 - sta $1200,x -//SEG205 [96] (byte) numpoints#1 ← ++ (byte) numpoints#19 [ ] -- zpby1=_inc_zpby1 - inc $8 -//SEG206 addpoint::@return -addpoint__Breturn: -//SEG207 [97] return [ ] - rts +addpoint: { + //SEG202 [93] *((word) 4096 + (byte) numpoints#19) ← (byte) addpoint::x#6 [ numpoints#19 addpoint::y#6 addpoint::c#6 ] -- cowo1_staridx_zpby1=aby + ldx $8 + sta $1000,x + //SEG203 [94] *((word) 4352 + (byte) numpoints#19) ← (byte) addpoint::y#6 [ numpoints#19 addpoint::c#6 ] -- cowo1_staridx_zpby1=yby + tya + ldy $8 + sta $1100,y + //SEG204 [95] *((word) 4608 + (byte) numpoints#19) ← (byte) addpoint::c#6 [ numpoints#19 ] -- cowo1_staridx_zpby1=zpby2 + lda $2 + ldx $8 + sta $1200,x + //SEG205 [96] (byte) numpoints#1 ← ++ (byte) numpoints#19 [ ] -- zpby1=_inc_zpby1 + inc $8 + //SEG206 addpoint::@return + breturn: + //SEG207 [97] return [ ] + rts +} FINAL SYMBOL TABLE -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte*) COLORS (byte[256]) COLS (byte) FILL @@ -8684,192 +8702,194 @@ reg byte a [ findcol::$10 ] reg byte a [ findcol::$8 ] FINAL CODE -//SEG0 @BEGIN -BBEGIN: +//SEG0 @begin +bbegin: //SEG1 [0] call main param-assignment [ ] jsr main -//SEG2 @END -BEND: +//SEG2 @end +bend: //SEG3 main -main: -//SEG4 [1] call addpoint param-assignment [ ] -//SEG5 [92] phi from main to addpoint -addpoint_from_main: -//SEG6 [92] phi (byte) addpoint::c#6 = (byte) 1 -- zpby1=coby1 - lda #$1 - sta $2 -//SEG7 [92] phi (byte) addpoint::y#6 = (byte) 5 -- yby=coby1 - ldy #$5 -//SEG8 [92] phi (byte) numpoints#19 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $8 -//SEG9 [92] phi (byte) addpoint::x#6 = (byte) 5 -- aby=coby1 - lda #$5 - jsr addpoint -//SEG10 main::@3 -main__B3: -//SEG11 [2] call addpoint param-assignment [ ] -//SEG12 [92] phi from main::@3 to addpoint -addpoint_from_B3: -//SEG13 [92] phi (byte) addpoint::c#6 = (byte) 2 -- zpby1=coby1 - lda #$2 - sta $2 -//SEG14 [92] phi (byte) addpoint::y#6 = (byte) 8 -- yby=coby1 - ldy #$8 -//SEG15 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG16 [92] phi (byte) addpoint::x#6 = (byte) 15 -- aby=coby1 - lda #$f - jsr addpoint -//SEG17 main::@4 -main__B4: -//SEG18 [3] call addpoint param-assignment [ ] -//SEG19 [92] phi from main::@4 to addpoint -addpoint_from_B4: -//SEG20 [92] phi (byte) addpoint::c#6 = (byte) 3 -- zpby1=coby1 - lda #$3 - sta $2 -//SEG21 [92] phi (byte) addpoint::y#6 = (byte) 14 -- yby=coby1 - ldy #$e -//SEG22 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG23 [92] phi (byte) addpoint::x#6 = (byte) 6 -- aby=coby1 - lda #$6 - jsr addpoint -//SEG24 main::@5 -main__B5: -//SEG25 [4] call addpoint param-assignment [ ] -//SEG26 [92] phi from main::@5 to addpoint -addpoint_from_B5: -//SEG27 [92] phi (byte) addpoint::c#6 = (byte) 4 -- zpby1=coby1 - lda #$4 - sta $2 -//SEG28 [92] phi (byte) addpoint::y#6 = (byte) 2 -- yby=coby1 - ldy #$2 -//SEG29 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG30 [92] phi (byte) addpoint::x#6 = (byte) 34 -- aby=coby1 - lda #$22 - jsr addpoint -//SEG31 main::@6 -main__B6: -//SEG32 [5] call addpoint param-assignment [ ] -//SEG33 [92] phi from main::@6 to addpoint -addpoint_from_B6: -//SEG34 [92] phi (byte) addpoint::c#6 = (byte) 5 -- zpby1=coby1 - lda #$5 - sta $2 -//SEG35 [92] phi (byte) addpoint::y#6 = (byte) 17 -- yby=coby1 - ldy #$11 -//SEG36 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG37 [92] phi (byte) addpoint::x#6 = (byte) 21 -- aby=coby1 - lda #$15 - jsr addpoint -//SEG38 main::@7 -main__B7: -//SEG39 [6] call addpoint param-assignment [ ] -//SEG40 [92] phi from main::@7 to addpoint -addpoint_from_B7: -//SEG41 [92] phi (byte) addpoint::c#6 = (byte) 7 -- zpby1=coby1 - lda #$7 - sta $2 -//SEG42 [92] phi (byte) addpoint::y#6 = (byte) 22 -- yby=coby1 - ldy #$16 -//SEG43 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy -//SEG44 [92] phi (byte) addpoint::x#6 = (byte) 31 -- aby=coby1 - lda #$1f - jsr addpoint -//SEG45 main::@8 -main__B8: -//SEG46 [7] call initscreen param-assignment [ ] - jsr initscreen -//SEG47 main::@1 -main__B1: -//SEG48 [8] call render param-assignment [ ] - jsr render -//SEG49 main::@10 -main__B10: -//SEG50 [9] call animate param-assignment [ ] - jsr animate -//SEG51 main::@11 -main__B11: -//SEG52 [10] if(true) goto main::@1 [ ] -- true_then_la1 - jmp main__B1 -//SEG53 main::@return -main__Breturn: -//SEG54 [11] return [ ] - rts +main: { + //SEG4 [1] call addpoint param-assignment [ ] + //SEG5 [92] phi from main to addpoint + addpoint_from_main: + //SEG6 [92] phi (byte) addpoint::c#6 = (byte) 1 -- zpby1=coby1 + lda #$1 + sta $2 + //SEG7 [92] phi (byte) addpoint::y#6 = (byte) 5 -- yby=coby1 + ldy #$5 + //SEG8 [92] phi (byte) numpoints#19 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $8 + //SEG9 [92] phi (byte) addpoint::x#6 = (byte) 5 -- aby=coby1 + lda #$5 + jsr addpoint + //SEG10 main::@3 + b3: + //SEG11 [2] call addpoint param-assignment [ ] + //SEG12 [92] phi from main::@3 to addpoint + addpoint_from_b3: + //SEG13 [92] phi (byte) addpoint::c#6 = (byte) 2 -- zpby1=coby1 + lda #$2 + sta $2 + //SEG14 [92] phi (byte) addpoint::y#6 = (byte) 8 -- yby=coby1 + ldy #$8 + //SEG15 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG16 [92] phi (byte) addpoint::x#6 = (byte) 15 -- aby=coby1 + lda #$f + jsr addpoint + //SEG17 main::@4 + b4: + //SEG18 [3] call addpoint param-assignment [ ] + //SEG19 [92] phi from main::@4 to addpoint + addpoint_from_b4: + //SEG20 [92] phi (byte) addpoint::c#6 = (byte) 3 -- zpby1=coby1 + lda #$3 + sta $2 + //SEG21 [92] phi (byte) addpoint::y#6 = (byte) 14 -- yby=coby1 + ldy #$e + //SEG22 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG23 [92] phi (byte) addpoint::x#6 = (byte) 6 -- aby=coby1 + lda #$6 + jsr addpoint + //SEG24 main::@5 + b5: + //SEG25 [4] call addpoint param-assignment [ ] + //SEG26 [92] phi from main::@5 to addpoint + addpoint_from_b5: + //SEG27 [92] phi (byte) addpoint::c#6 = (byte) 4 -- zpby1=coby1 + lda #$4 + sta $2 + //SEG28 [92] phi (byte) addpoint::y#6 = (byte) 2 -- yby=coby1 + ldy #$2 + //SEG29 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG30 [92] phi (byte) addpoint::x#6 = (byte) 34 -- aby=coby1 + lda #$22 + jsr addpoint + //SEG31 main::@6 + b6: + //SEG32 [5] call addpoint param-assignment [ ] + //SEG33 [92] phi from main::@6 to addpoint + addpoint_from_b6: + //SEG34 [92] phi (byte) addpoint::c#6 = (byte) 5 -- zpby1=coby1 + lda #$5 + sta $2 + //SEG35 [92] phi (byte) addpoint::y#6 = (byte) 17 -- yby=coby1 + ldy #$11 + //SEG36 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG37 [92] phi (byte) addpoint::x#6 = (byte) 21 -- aby=coby1 + lda #$15 + jsr addpoint + //SEG38 main::@7 + b7: + //SEG39 [6] call addpoint param-assignment [ ] + //SEG40 [92] phi from main::@7 to addpoint + addpoint_from_b7: + //SEG41 [92] phi (byte) addpoint::c#6 = (byte) 7 -- zpby1=coby1 + lda #$7 + sta $2 + //SEG42 [92] phi (byte) addpoint::y#6 = (byte) 22 -- yby=coby1 + ldy #$16 + //SEG43 [92] phi (byte) numpoints#19 = (byte) numpoints#1 -- register_copy + //SEG44 [92] phi (byte) addpoint::x#6 = (byte) 31 -- aby=coby1 + lda #$1f + jsr addpoint + //SEG45 main::@8 + b8: + //SEG46 [7] call initscreen param-assignment [ ] + jsr initscreen + //SEG47 main::@1 + b1: + //SEG48 [8] call render param-assignment [ ] + jsr render + //SEG49 main::@10 + b10: + //SEG50 [9] call animate param-assignment [ ] + jsr animate + //SEG51 main::@11 + b11: + //SEG52 [10] if(true) goto main::@1 [ ] -- true_then_la1 + jmp b1 + //SEG53 main::@return + breturn: + //SEG54 [11] return [ ] + rts +} //SEG55 animate -animate: -//SEG56 [12] (byte~) animate::$0 ← * (word) 4096 [ animate::$0 ] -- aby=_star_cowo1 - lda $1000 -//SEG57 [13] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ] -- aby=aby_plus_1 - clc - adc #$1 -//SEG58 [14] *((word) 4096) ← (byte~) animate::$1 [ ] -- _star_cowo1=aby - sta $1000 -//SEG59 [15] (byte~) animate::$2 ← * (word) 4096 [ animate::$2 ] -- aby=_star_cowo1 - lda $1000 -//SEG60 [16] if((byte~) animate::$2==(byte) 40) goto animate::@1 [ ] -- aby_eq_coby1_then_la1 - cmp #$28 - beq animate__B1 -//SEG61 animate::@2 -animate__B2: -//SEG62 [17] (byte~) animate::$4 ← * (word) 4352 [ animate::$4 ] -- aby=_star_cowo1 - lda $1100 -//SEG63 [18] (byte~) animate::$5 ← (byte~) animate::$4 + (byte) 1 [ animate::$5 ] -- aby=aby_plus_1 - clc - adc #$1 -//SEG64 [19] *((word) 4352) ← (byte~) animate::$5 [ ] -- _star_cowo1=aby - sta $1100 -//SEG65 [20] (byte~) animate::$6 ← * (word) 4352 [ animate::$6 ] -- aby=_star_cowo1 - lda $1100 -//SEG66 [21] if((byte~) animate::$6==(byte) 25) goto animate::@3 [ ] -- aby_eq_coby1_then_la1 - cmp #$19 - beq animate__B3 -//SEG67 animate::@4 -animate__B4: -//SEG68 [22] (byte~) animate::$8 ← * (word) 4097 [ animate::$8 ] -- xby=_star_cowo1 - ldx $1001 -//SEG69 [23] (byte~) animate::$9 ← (byte~) animate::$8 - (byte) 1 [ animate::$9 ] -- xby=xby_minus_1 - dex -//SEG70 [24] *((word) 4097) ← (byte~) animate::$9 [ ] -- _star_cowo1=xby - stx $1001 -//SEG71 [25] (byte~) animate::$10 ← * (word) 4097 [ animate::$10 ] -- aby=_star_cowo1 - lda $1001 -//SEG72 [26] if((byte~) animate::$10==(byte) 255) goto animate::@5 [ ] -- aby_eq_coby1_then_la1 - cmp #$ff - beq animate__B5 -//SEG73 animate::@6 -animate__B6: -//SEG74 [27] (byte~) animate::$12 ← * (word) 4354 [ animate::$12 ] -- aby=_star_cowo1 - lda $1102 -//SEG75 [28] (byte~) animate::$13 ← (byte~) animate::$12 + (byte) 1 [ animate::$13 ] -- aby=aby_plus_1 - clc - adc #$1 -//SEG76 [29] *((word) 4354) ← (byte~) animate::$13 [ ] -- _star_cowo1=aby - sta $1102 -//SEG77 [30] (byte~) animate::$14 ← * (word) 4354 [ animate::$14 ] -- aby=_star_cowo1 - lda $1102 -//SEG78 [31] if((byte~) animate::$14==(byte) 25) goto animate::@7 [ ] -- aby_eq_coby1_then_la1 - cmp #$19 - beq animate__B7 -//SEG79 animate::@8 -animate__B8: -//SEG80 [32] (byte~) animate::$16 ← * (word) 4355 [ animate::$16 ] -- xby=_star_cowo1 - ldx $1103 -//SEG81 [33] (byte~) animate::$17 ← (byte~) animate::$16 - (byte) 1 [ animate::$17 ] -- xby=xby_minus_1 - dex -//SEG82 [34] *((word) 4355) ← (byte~) animate::$17 [ ] -- _star_cowo1=xby - stx $1103 -//SEG83 [35] (byte~) animate::$18 ← * (word) 4355 [ animate::$18 ] -- aby=_star_cowo1 - lda $1103 -//SEG84 [36] if((byte~) animate::$18==(byte) 255) goto animate::@9 [ ] -- aby_eq_coby1_then_la1 - cmp #$ff - beq animate__B9 -//SEG85 animate::@return -animate__Breturn: -//SEG86 [37] return [ ] - rts +animate: { + //SEG56 [12] (byte~) animate::$0 ← * (word) 4096 [ animate::$0 ] -- aby=_star_cowo1 + lda $1000 + //SEG57 [13] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ] -- aby=aby_plus_1 + clc + adc #$1 + //SEG58 [14] *((word) 4096) ← (byte~) animate::$1 [ ] -- _star_cowo1=aby + sta $1000 + //SEG59 [15] (byte~) animate::$2 ← * (word) 4096 [ animate::$2 ] -- aby=_star_cowo1 + lda $1000 + //SEG60 [16] if((byte~) animate::$2==(byte) 40) goto animate::@1 [ ] -- aby_eq_coby1_then_la1 + cmp #$28 + beq b1 + //SEG61 animate::@2 + b2: + //SEG62 [17] (byte~) animate::$4 ← * (word) 4352 [ animate::$4 ] -- aby=_star_cowo1 + lda $1100 + //SEG63 [18] (byte~) animate::$5 ← (byte~) animate::$4 + (byte) 1 [ animate::$5 ] -- aby=aby_plus_1 + clc + adc #$1 + //SEG64 [19] *((word) 4352) ← (byte~) animate::$5 [ ] -- _star_cowo1=aby + sta $1100 + //SEG65 [20] (byte~) animate::$6 ← * (word) 4352 [ animate::$6 ] -- aby=_star_cowo1 + lda $1100 + //SEG66 [21] if((byte~) animate::$6==(byte) 25) goto animate::@3 [ ] -- aby_eq_coby1_then_la1 + cmp #$19 + beq b3 + //SEG67 animate::@4 + b4: + //SEG68 [22] (byte~) animate::$8 ← * (word) 4097 [ animate::$8 ] -- xby=_star_cowo1 + ldx $1001 + //SEG69 [23] (byte~) animate::$9 ← (byte~) animate::$8 - (byte) 1 [ animate::$9 ] -- xby=xby_minus_1 + dex + //SEG70 [24] *((word) 4097) ← (byte~) animate::$9 [ ] -- _star_cowo1=xby + stx $1001 + //SEG71 [25] (byte~) animate::$10 ← * (word) 4097 [ animate::$10 ] -- aby=_star_cowo1 + lda $1001 + //SEG72 [26] if((byte~) animate::$10==(byte) 255) goto animate::@5 [ ] -- aby_eq_coby1_then_la1 + cmp #$ff + beq b5 + //SEG73 animate::@6 + b6: + //SEG74 [27] (byte~) animate::$12 ← * (word) 4354 [ animate::$12 ] -- aby=_star_cowo1 + lda $1102 + //SEG75 [28] (byte~) animate::$13 ← (byte~) animate::$12 + (byte) 1 [ animate::$13 ] -- aby=aby_plus_1 + clc + adc #$1 + //SEG76 [29] *((word) 4354) ← (byte~) animate::$13 [ ] -- _star_cowo1=aby + sta $1102 + //SEG77 [30] (byte~) animate::$14 ← * (word) 4354 [ animate::$14 ] -- aby=_star_cowo1 + lda $1102 + //SEG78 [31] if((byte~) animate::$14==(byte) 25) goto animate::@7 [ ] -- aby_eq_coby1_then_la1 + cmp #$19 + beq b7 + //SEG79 animate::@8 + b8: + //SEG80 [32] (byte~) animate::$16 ← * (word) 4355 [ animate::$16 ] -- xby=_star_cowo1 + ldx $1103 + //SEG81 [33] (byte~) animate::$17 ← (byte~) animate::$16 - (byte) 1 [ animate::$17 ] -- xby=xby_minus_1 + dex + //SEG82 [34] *((word) 4355) ← (byte~) animate::$17 [ ] -- _star_cowo1=xby + stx $1103 + //SEG83 [35] (byte~) animate::$18 ← * (word) 4355 [ animate::$18 ] -- aby=_star_cowo1 + lda $1103 + //SEG84 [36] if((byte~) animate::$18==(byte) 255) goto animate::@9 [ ] -- aby_eq_coby1_then_la1 + cmp #$ff + beq b9 + //SEG85 animate::@return + breturn: + //SEG86 [37] return [ ] + rts +} //SEG87 animate::@9 -animate__B9: +b9: //SEG88 [38] *((word) 4355) ← (byte) 25 [ ] -- _star_cowo1=coby2 lda #$19 sta $1103 @@ -8884,10 +8904,10 @@ animate__B9: lda $1003 //SEG93 [43] if((byte~) animate::$22>=(byte) 40) goto animate::@11 [ ] -- aby_ge_coby1_then_la1 cmp #$28 - bcs animate__B11 - jmp animate__Breturn + bcs b11 + jmp breturn //SEG94 animate::@11 -animate__B11: +b11: //SEG95 [44] (byte~) animate::$24 ← * (word) 4099 [ animate::$24 ] -- aby=_star_cowo1 lda $1003 //SEG96 [45] (byte~) animate::$25 ← (byte~) animate::$24 - (byte) 40 [ animate::$25 ] -- aby=aby_minus_coby1 @@ -8895,203 +8915,205 @@ animate__B11: sbc #$28 //SEG97 [46] *((word) 4099) ← (byte~) animate::$25 [ ] -- _star_cowo1=aby sta $1003 - jmp animate__Breturn + jmp breturn //SEG98 animate::@7 -animate__B7: +b7: //SEG99 [47] *((word) 4354) ← (byte) 0 [ ] -- _star_cowo1=coby2 lda #$0 sta $1102 - jmp animate__B8 + jmp b8 //SEG100 animate::@5 -animate__B5: +b5: //SEG101 [48] *((word) 4097) ← (byte) 40 [ ] -- _star_cowo1=coby2 lda #$28 sta $1001 - jmp animate__B6 + jmp b6 //SEG102 animate::@3 -animate__B3: +b3: //SEG103 [49] *((word) 4352) ← (byte) 0 [ ] -- _star_cowo1=coby2 lda #$0 sta $1100 - jmp animate__B4 + jmp b4 //SEG104 animate::@1 -animate__B1: +b1: //SEG105 [50] *((word) 4096) ← (byte) 0 [ ] -- _star_cowo1=coby2 lda #$0 sta $1000 - jmp animate__B2 + jmp b2 //SEG106 render -render: -//SEG107 [51] phi from render to render::@1 -render__B1_from_render: -//SEG108 [51] phi (byte*) render::colline#2 = (word) 55296 -- zpptrby1=cowo1 - lda #<$d800 - sta $3 - lda #>$d800 - sta $3+$1 -//SEG109 [51] phi (byte) render::y#2 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $2 -//SEG110 [51] phi from render::@3 to render::@1 -render__B1_from_B3: -//SEG111 [51] phi (byte*) render::colline#2 = (byte*) render::colline#1 -- register_copy -//SEG112 [51] phi (byte) render::y#2 = (byte) render::y#1 -- register_copy -//SEG113 render::@1 -render__B1: -//SEG114 [52] phi from render::@1 to render::@2 -render__B2_from_B1: -//SEG115 [52] phi (byte) render::x#2 = (byte) 0 -- zpby1=coby1 - lda #$0 - sta $5 -//SEG116 [52] phi from render::@5 to render::@2 -render__B2_from_B5: -//SEG117 [52] phi (byte) render::x#2 = (byte) render::x#1 -- register_copy -//SEG118 render::@2 -render__B2: -//SEG119 [53] (byte) findcol::x#0 ← (byte) render::x#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 - lda $5 - sta $9 -//SEG120 [54] (byte) findcol::y#0 ← (byte) render::y#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 - lda $2 - sta $a -//SEG121 [55] call findcol param-assignment [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] - jsr findcol -//SEG122 render::@5 -render__B5: -//SEG123 [56] (byte) render::col#0 ← (byte) findcol::return#0 [ render::x#2 render::y#2 render::colline#2 render::col#0 ] -- aby=yby - tya -//SEG124 [57] *((byte*) render::colline#2 + (byte) render::x#2) ← (byte) render::col#0 [ render::x#2 render::y#2 render::colline#2 ] -- zpptrby1_staridx_zpby1=aby - ldy $5 - sta ($3),y -//SEG125 [58] (byte) render::x#1 ← ++ (byte) render::x#2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1=_inc_zpby1 - inc $5 -//SEG126 [59] if((byte) render::x#1<(byte) 40) goto render::@2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1_lt_coby1_then_la1 - lda $5 - cmp #$28 - bcc render__B2_from_B5 -//SEG127 render::@3 -render__B3: -//SEG128 [60] (byte*) render::colline#1 ← (byte*) render::colline#2 + (byte) 40 [ render::colline#1 render::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 - lda $3 - clc - adc #$28 - sta $3 - bcc !+ - inc $3+$1 -!: -//SEG129 [61] (byte) render::y#1 ← ++ (byte) render::y#2 [ render::y#1 render::colline#1 ] -- zpby1=_inc_zpby1 - inc $2 -//SEG130 [62] if((byte) render::y#1<(byte) 25) goto render::@1 [ render::y#1 render::colline#1 ] -- zpby1_lt_coby1_then_la1 - lda $2 - cmp #$19 - bcc render__B1_from_B3 -//SEG131 render::@return -render__Breturn: -//SEG132 [63] return [ ] - rts +render: { + //SEG107 [51] phi from render to render::@1 + b1_from_render: + //SEG108 [51] phi (byte*) render::colline#2 = (word) 55296 -- zpptrby1=cowo1 + lda #<$d800 + sta $3 + lda #>$d800 + sta $3+$1 + //SEG109 [51] phi (byte) render::y#2 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $2 + //SEG110 [51] phi from render::@3 to render::@1 + b1_from_b3: + //SEG111 [51] phi (byte*) render::colline#2 = (byte*) render::colline#1 -- register_copy + //SEG112 [51] phi (byte) render::y#2 = (byte) render::y#1 -- register_copy + //SEG113 render::@1 + b1: + //SEG114 [52] phi from render::@1 to render::@2 + b2_from_b1: + //SEG115 [52] phi (byte) render::x#2 = (byte) 0 -- zpby1=coby1 + lda #$0 + sta $5 + //SEG116 [52] phi from render::@5 to render::@2 + b2_from_b5: + //SEG117 [52] phi (byte) render::x#2 = (byte) render::x#1 -- register_copy + //SEG118 render::@2 + b2: + //SEG119 [53] (byte) findcol::x#0 ← (byte) render::x#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 + lda $5 + sta $9 + //SEG120 [54] (byte) findcol::y#0 ← (byte) render::y#2 [ render::x#2 render::y#2 render::colline#2 ] -- zpby1=zpby2 + lda $2 + sta $a + //SEG121 [55] call findcol param-assignment [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] + jsr findcol + //SEG122 render::@5 + b5: + //SEG123 [56] (byte) render::col#0 ← (byte) findcol::return#0 [ render::x#2 render::y#2 render::colline#2 render::col#0 ] -- aby=yby + tya + //SEG124 [57] *((byte*) render::colline#2 + (byte) render::x#2) ← (byte) render::col#0 [ render::x#2 render::y#2 render::colline#2 ] -- zpptrby1_staridx_zpby1=aby + ldy $5 + sta ($3),y + //SEG125 [58] (byte) render::x#1 ← ++ (byte) render::x#2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1=_inc_zpby1 + inc $5 + //SEG126 [59] if((byte) render::x#1<(byte) 40) goto render::@2 [ render::x#1 render::y#2 render::colline#2 ] -- zpby1_lt_coby1_then_la1 + lda $5 + cmp #$28 + bcc b2_from_b5 + //SEG127 render::@3 + b3: + //SEG128 [60] (byte*) render::colline#1 ← (byte*) render::colline#2 + (byte) 40 [ render::colline#1 render::y#2 ] -- zpptrby1=zpptrby1_plus_coby1 + lda $3 + clc + adc #$28 + sta $3 + bcc !+ + inc $3+$1 + !: + //SEG129 [61] (byte) render::y#1 ← ++ (byte) render::y#2 [ render::y#1 render::colline#1 ] -- zpby1=_inc_zpby1 + inc $2 + //SEG130 [62] if((byte) render::y#1<(byte) 25) goto render::@1 [ render::y#1 render::colline#1 ] -- zpby1_lt_coby1_then_la1 + lda $2 + cmp #$19 + bcc b1_from_b3 + //SEG131 render::@return + breturn: + //SEG132 [63] return [ ] + rts +} //SEG133 findcol -findcol: -//SEG134 [64] phi from findcol to findcol::@1 -findcol__B1_from_findcol: -//SEG135 [64] phi (byte) findcol::mincol#11 = (byte) 0 -- yby=coby1 - ldy #$0 -//SEG136 [64] phi (byte) findcol::mindiff#10 = (byte) 255 -- zpby1=coby1 - lda #$ff - sta $6 -//SEG137 [64] phi (byte) findcol::i#12 = (byte) 0 -- xby=coby1 - ldx #$0 -//SEG138 [64] phi from findcol::@13 to findcol::@1 -findcol__B1_from_B13: -//SEG139 [64] phi (byte) findcol::mincol#11 = (byte) findcol::mincol#2 -- register_copy -//SEG140 [64] phi (byte) findcol::mindiff#10 = (byte) findcol::mindiff#11 -- register_copy -//SEG141 [64] phi (byte) findcol::i#12 = (byte) findcol::i#1 -- register_copy -//SEG142 findcol::@1 -findcol__B1: -//SEG143 [65] (byte) findcol::xp#0 ← (word) 4096 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_xby - lda $1000,x - sta $7 -//SEG144 [66] (byte) findcol::yp#0 ← (word) 4352 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_xby - lda $1100,x - sta $b -//SEG145 [67] if((byte) findcol::x#0==(byte) findcol::xp#0) goto findcol::@2 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_eq_zpby2_then_la1 - lda $9 - cmp $7 - beq findcol__B2 -//SEG146 findcol::@3 -findcol__B3: -//SEG147 [68] if((byte) findcol::x#0<(byte) findcol::xp#0) goto findcol::@6 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 - lda $9 - cmp $7 - bcc findcol__B6 -//SEG148 findcol::@7 -findcol__B7: -//SEG149 [69] (byte) findcol::diff#1 ← (byte) findcol::x#0 - (byte) findcol::xp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::diff#1 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby2_minus_zpby1 - lda $9 - sec - sbc $7 - sta $7 -//SEG150 [70] phi from findcol::@7 to findcol::@8 -findcol__B8_from_B7: -//SEG151 [70] phi (byte) findcol::diff#4 = (byte) findcol::diff#1 -- register_copy -//SEG152 findcol::@8 -findcol__B8: -//SEG153 [71] if((byte) findcol::y#0<(byte) findcol::yp#0) goto findcol::@9 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::yp#0 findcol::diff#4 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 - lda $a - cmp $b - bcc findcol__B9 -//SEG154 findcol::@10 -findcol__B10: -//SEG155 [72] (byte~) findcol::$10 ← (byte) findcol::y#0 - (byte) findcol::yp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#4 findcol::$10 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby=zpby1_minus_zpby2 - lda $a - sec - sbc $b -//SEG156 [73] (byte) findcol::diff#3 ← (byte) findcol::diff#4 + (byte~) findcol::$10 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#3 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby=zpby1_plus_aby - clc - adc $7 -//SEG157 [74] phi from findcol::@10 to findcol::@11 -findcol__B11_from_B10: -//SEG158 [74] phi (byte) findcol::diff#6 = (byte) findcol::diff#3 -- register_copy -//SEG159 findcol::@11 -findcol__B11: -//SEG160 [75] if((byte) findcol::diff#6<(byte) findcol::mindiff#10) goto findcol::@12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#6 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby_lt_zpby1_then_la1 - cmp $6 - bcc findcol__B12 -//SEG161 [76] phi from findcol::@11 to findcol::@13 -findcol__B13_from_B11: -//SEG162 [76] phi (byte) findcol::mindiff#11 = (byte) findcol::mindiff#10 -- register_copy -//SEG163 [76] phi (byte) findcol::mincol#2 = (byte) findcol::mincol#11 -- register_copy -//SEG164 findcol::@13 -findcol__B13: -//SEG165 [77] (byte) findcol::i#1 ← ++ (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- xby=_inc_xby - inx -//SEG166 [78] if((byte) findcol::i#1<(byte) numpoints#1) goto findcol::@1 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- xby_lt_zpby1_then_la1 - cpx $8 - bcc findcol__B1_from_B13 -//SEG167 [79] phi from findcol::@13 to findcol::@return -findcol__Breturn_from_B13: -//SEG168 [79] phi (byte) findcol::return#0 = (byte) findcol::mincol#2 -- register_copy - jmp findcol__Breturn -//SEG169 [79] phi from findcol::@2 to findcol::@return -findcol__Breturn_from_B2: -//SEG170 [79] phi (byte) findcol::return#0 = (byte) 0 -- yby=coby1 - ldy #$0 -//SEG171 findcol::@return -findcol__Breturn: -//SEG172 [80] return [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] - rts +findcol: { + //SEG134 [64] phi from findcol to findcol::@1 + b1_from_findcol: + //SEG135 [64] phi (byte) findcol::mincol#11 = (byte) 0 -- yby=coby1 + ldy #$0 + //SEG136 [64] phi (byte) findcol::mindiff#10 = (byte) 255 -- zpby1=coby1 + lda #$ff + sta $6 + //SEG137 [64] phi (byte) findcol::i#12 = (byte) 0 -- xby=coby1 + ldx #$0 + //SEG138 [64] phi from findcol::@13 to findcol::@1 + b1_from_b13: + //SEG139 [64] phi (byte) findcol::mincol#11 = (byte) findcol::mincol#2 -- register_copy + //SEG140 [64] phi (byte) findcol::mindiff#10 = (byte) findcol::mindiff#11 -- register_copy + //SEG141 [64] phi (byte) findcol::i#12 = (byte) findcol::i#1 -- register_copy + //SEG142 findcol::@1 + b1: + //SEG143 [65] (byte) findcol::xp#0 ← (word) 4096 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_xby + lda $1000,x + sta $7 + //SEG144 [66] (byte) findcol::yp#0 ← (word) 4352 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=cowo1_staridx_xby + lda $1100,x + sta $b + //SEG145 [67] if((byte) findcol::x#0==(byte) findcol::xp#0) goto findcol::@2 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_eq_zpby2_then_la1 + lda $9 + cmp $7 + beq b2 + //SEG146 findcol::@3 + b3: + //SEG147 [68] if((byte) findcol::x#0<(byte) findcol::xp#0) goto findcol::@6 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 + lda $9 + cmp $7 + bcc b6 + //SEG148 findcol::@7 + b7: + //SEG149 [69] (byte) findcol::diff#1 ← (byte) findcol::x#0 - (byte) findcol::xp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::diff#1 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby2_minus_zpby1 + lda $9 + sec + sbc $7 + sta $7 + //SEG150 [70] phi from findcol::@7 to findcol::@8 + b8_from_b7: + //SEG151 [70] phi (byte) findcol::diff#4 = (byte) findcol::diff#1 -- register_copy + //SEG152 findcol::@8 + b8: + //SEG153 [71] if((byte) findcol::y#0<(byte) findcol::yp#0) goto findcol::@9 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::yp#0 findcol::diff#4 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_lt_zpby2_then_la1 + lda $a + cmp $b + bcc b9 + //SEG154 findcol::@10 + b10: + //SEG155 [72] (byte~) findcol::$10 ← (byte) findcol::y#0 - (byte) findcol::yp#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#4 findcol::$10 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby=zpby1_minus_zpby2 + lda $a + sec + sbc $b + //SEG156 [73] (byte) findcol::diff#3 ← (byte) findcol::diff#4 + (byte~) findcol::$10 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#3 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby=zpby1_plus_aby + clc + adc $7 + //SEG157 [74] phi from findcol::@10 to findcol::@11 + b11_from_b10: + //SEG158 [74] phi (byte) findcol::diff#6 = (byte) findcol::diff#3 -- register_copy + //SEG159 findcol::@11 + b11: + //SEG160 [75] if((byte) findcol::diff#6<(byte) findcol::mindiff#10) goto findcol::@12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#6 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- aby_lt_zpby1_then_la1 + cmp $6 + bcc b12 + //SEG161 [76] phi from findcol::@11 to findcol::@13 + b13_from_b11: + //SEG162 [76] phi (byte) findcol::mindiff#11 = (byte) findcol::mindiff#10 -- register_copy + //SEG163 [76] phi (byte) findcol::mincol#2 = (byte) findcol::mincol#11 -- register_copy + //SEG164 findcol::@13 + b13: + //SEG165 [77] (byte) findcol::i#1 ← ++ (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- xby=_inc_xby + inx + //SEG166 [78] if((byte) findcol::i#1<(byte) numpoints#1) goto findcol::@1 [ render::x#2 render::y#2 render::colline#2 findcol::i#1 findcol::mindiff#11 findcol::mincol#2 findcol::x#0 findcol::y#0 numpoints#1 ] -- xby_lt_zpby1_then_la1 + cpx $8 + bcc b1_from_b13 + //SEG167 [79] phi from findcol::@13 to findcol::@return + breturn_from_b13: + //SEG168 [79] phi (byte) findcol::return#0 = (byte) findcol::mincol#2 -- register_copy + jmp breturn + //SEG169 [79] phi from findcol::@2 to findcol::@return + breturn_from_b2: + //SEG170 [79] phi (byte) findcol::return#0 = (byte) 0 -- yby=coby1 + ldy #$0 + //SEG171 findcol::@return + breturn: + //SEG172 [80] return [ render::x#2 render::y#2 findcol::return#0 render::colline#2 ] + rts +} //SEG173 findcol::@12 -findcol__B12: +b12: //SEG174 [81] (byte) findcol::mincol#1 ← (word) 4608 *idx (byte) findcol::i#12 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#6 findcol::mincol#1 numpoints#1 ] -- yby=cowo1_staridx_xby ldy $1200,x //SEG175 [82] (byte~) findcol::diff#13 ← (byte) findcol::diff#6 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::mincol#1 findcol::diff#13 numpoints#1 ] -- zpby1=aby sta $6 //SEG176 [76] phi from findcol::@12 to findcol::@13 -findcol__B13_from_B12: +b13_from_b12: //SEG177 [76] phi (byte) findcol::mindiff#11 = (byte~) findcol::diff#13 -- register_copy //SEG178 [76] phi (byte) findcol::mincol#2 = (byte) findcol::mincol#1 -- register_copy - jmp findcol__B13 + jmp b13 //SEG179 findcol::@9 -findcol__B9: +b9: //SEG180 [83] (byte~) findcol::$8 ← (byte) findcol::yp#0 - (byte) findcol::y#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::y#0 findcol::diff#4 findcol::mindiff#10 findcol::mincol#11 numpoints#1 findcol::$8 ] -- aby=zpby1_minus_zpby2 lda $b sec @@ -9100,80 +9122,82 @@ findcol__B9: clc adc $7 //SEG182 [74] phi from findcol::@9 to findcol::@11 -findcol__B11_from_B9: +b11_from_b9: //SEG183 [74] phi (byte) findcol::diff#6 = (byte) findcol::diff#2 -- register_copy - jmp findcol__B11 + jmp b11 //SEG184 findcol::@6 -findcol__B6: +b6: //SEG185 [85] (byte) findcol::diff#0 ← (byte) findcol::xp#0 - (byte) findcol::x#0 [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::diff#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1=zpby1_minus_zpby2 lda $7 sec sbc $9 sta $7 //SEG186 [70] phi from findcol::@6 to findcol::@8 -findcol__B8_from_B6: +b8_from_b6: //SEG187 [70] phi (byte) findcol::diff#4 = (byte) findcol::diff#0 -- register_copy - jmp findcol__B8 + jmp b8 //SEG188 findcol::@2 -findcol__B2: +b2: //SEG189 [86] if((byte) findcol::y#0==(byte) findcol::yp#0) goto findcol::@return [ render::x#2 render::y#2 render::colline#2 findcol::i#12 findcol::x#0 findcol::xp#0 findcol::y#0 findcol::yp#0 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ] -- zpby1_eq_zpby2_then_la1 lda $a cmp $b - beq findcol__Breturn_from_B2 - jmp findcol__B3 + beq breturn_from_b2 + jmp b3 //SEG190 initscreen -initscreen: -//SEG191 [87] phi from initscreen to initscreen::@1 -initscreen__B1_from_initscreen: -//SEG192 [87] phi (byte*) initscreen::screen#2 = (word) 1024 -- zpptrby1=cowo1 - lda #<$400 - sta $3 - lda #>$400 - sta $3+$1 -//SEG193 [87] phi from initscreen::@1 to initscreen::@1 -initscreen__B1_from_B1: -//SEG194 [87] phi (byte*) initscreen::screen#2 = (byte*) initscreen::screen#1 -- register_copy -//SEG195 initscreen::@1 -initscreen__B1: -//SEG196 [88] *((byte*) initscreen::screen#2) ← (byte) 230 [ initscreen::screen#2 ] -- _star_zpptrby1=coby1 - ldy #$0 - lda #$e6 - sta ($3),y -//SEG197 [89] (byte*) initscreen::screen#1 ← ++ (byte*) initscreen::screen#2 [ initscreen::screen#1 ] -- zpptrby1=_inc_zpptrby1 - inc $3 - bne !+ - inc $3+$1 -!: -//SEG198 [90] if((byte*) initscreen::screen#1<(word) 2024) goto initscreen::@1 [ initscreen::screen#1 ] -- zpptrby1_lt_cowo1_then_la1 - lda $3+$1 - cmp #>$7e8 - bcc initscreen__B1_from_B1 - bne !+ - lda $3 - cmp #<$7e8 - bcc initscreen__B1_from_B1 -!: -//SEG199 initscreen::@return -initscreen__Breturn: -//SEG200 [91] return [ ] - rts +initscreen: { + //SEG191 [87] phi from initscreen to initscreen::@1 + b1_from_initscreen: + //SEG192 [87] phi (byte*) initscreen::screen#2 = (word) 1024 -- zpptrby1=cowo1 + lda #<$400 + sta $3 + lda #>$400 + sta $3+$1 + //SEG193 [87] phi from initscreen::@1 to initscreen::@1 + b1_from_b1: + //SEG194 [87] phi (byte*) initscreen::screen#2 = (byte*) initscreen::screen#1 -- register_copy + //SEG195 initscreen::@1 + b1: + //SEG196 [88] *((byte*) initscreen::screen#2) ← (byte) 230 [ initscreen::screen#2 ] -- _star_zpptrby1=coby1 + ldy #$0 + lda #$e6 + sta ($3),y + //SEG197 [89] (byte*) initscreen::screen#1 ← ++ (byte*) initscreen::screen#2 [ initscreen::screen#1 ] -- zpptrby1=_inc_zpptrby1 + inc $3 + bne !+ + inc $3+$1 + !: + //SEG198 [90] if((byte*) initscreen::screen#1<(word) 2024) goto initscreen::@1 [ initscreen::screen#1 ] -- zpptrby1_lt_cowo1_then_la1 + lda $3+$1 + cmp #>$7e8 + bcc b1_from_b1 + bne !+ + lda $3 + cmp #<$7e8 + bcc b1_from_b1 + !: + //SEG199 initscreen::@return + breturn: + //SEG200 [91] return [ ] + rts +} //SEG201 addpoint -addpoint: -//SEG202 [93] *((word) 4096 + (byte) numpoints#19) ← (byte) addpoint::x#6 [ numpoints#19 addpoint::y#6 addpoint::c#6 ] -- cowo1_staridx_zpby1=aby - ldx $8 - sta $1000,x -//SEG203 [94] *((word) 4352 + (byte) numpoints#19) ← (byte) addpoint::y#6 [ numpoints#19 addpoint::c#6 ] -- cowo1_staridx_zpby1=yby - tya - ldy $8 - sta $1100,y -//SEG204 [95] *((word) 4608 + (byte) numpoints#19) ← (byte) addpoint::c#6 [ numpoints#19 ] -- cowo1_staridx_zpby1=zpby2 - lda $2 - ldx $8 - sta $1200,x -//SEG205 [96] (byte) numpoints#1 ← ++ (byte) numpoints#19 [ ] -- zpby1=_inc_zpby1 - inc $8 -//SEG206 addpoint::@return -addpoint__Breturn: -//SEG207 [97] return [ ] - rts +addpoint: { + //SEG202 [93] *((word) 4096 + (byte) numpoints#19) ← (byte) addpoint::x#6 [ numpoints#19 addpoint::y#6 addpoint::c#6 ] -- cowo1_staridx_zpby1=aby + ldx $8 + sta $1000,x + //SEG203 [94] *((word) 4352 + (byte) numpoints#19) ← (byte) addpoint::y#6 [ numpoints#19 addpoint::c#6 ] -- cowo1_staridx_zpby1=yby + tya + ldy $8 + sta $1100,y + //SEG204 [95] *((word) 4608 + (byte) numpoints#19) ← (byte) addpoint::c#6 [ numpoints#19 ] -- cowo1_staridx_zpby1=zpby2 + lda $2 + ldx $8 + sta $1200,x + //SEG205 [96] (byte) numpoints#1 ← ++ (byte) numpoints#19 [ ] -- zpby1=_inc_zpby1 + inc $8 + //SEG206 addpoint::@return + breturn: + //SEG207 [97] return [ ] + rts +} diff --git a/src/main/java/dk/camelot64/kickc/test/ref/voronoi.sym b/src/main/java/dk/camelot64/kickc/test/ref/voronoi.sym index fefdad772..f1cab0f0e 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/voronoi.sym +++ b/src/main/java/dk/camelot64/kickc/test/ref/voronoi.sym @@ -1,5 +1,5 @@ -(label) @BEGIN -(label) @END +(label) @begin +(label) @end (byte*) COLORS (byte[256]) COLS (byte) FILL