From c12c45b5bdae34f12334fd440891aa2cbcc53f0c Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Sat, 29 Jul 2017 13:41:47 +0200 Subject: [PATCH] Fixed cross-scope aliasing. Improved assignment ASM for register copies. --- src/dk/camelot64/kickc/Compiler.java | 88 ++++---- .../kickc/icl/LiveRangeVariables.java | 12 ++ .../Pass1ProcedureCallsReturnValue.java | 5 + .../kickc/passes/Pass2AliasElimination.java | 12 +- .../passes/Pass2AssertNoReturnValues.java | 31 +++ .../kickc/passes/Pass3LiveRangesAnalysis.java | 31 ++- .../kickc/passes/Pass3PhiLifting.java | 3 + .../Pass3VariableRegisterWeightAnalysis.java | 50 +++++ .../kickc/passes/Pass4CodeGeneration.java | 30 ++- src/dk/camelot64/kickc/test/ref/bresenham.log | 80 ++++---- .../camelot64/kickc/test/ref/flipper-rex2.log | 170 ++++++++-------- src/dk/camelot64/kickc/test/ref/loopmin.log | 32 +-- src/dk/camelot64/kickc/test/ref/loopnest.log | 16 +- src/dk/camelot64/kickc/test/ref/loopnest2.log | 48 ++--- src/dk/camelot64/kickc/test/ref/loopsplit.log | 32 +-- src/dk/camelot64/kickc/test/ref/minus.log | 8 +- src/dk/camelot64/kickc/test/ref/summin.asm | 7 + src/dk/camelot64/kickc/test/ref/summin.cfg | 19 +- src/dk/camelot64/kickc/test/ref/summin.log | 192 +++++++++++++----- src/dk/camelot64/kickc/test/ref/summin.sym | 11 +- src/dk/camelot64/kickc/test/summin.kc | 1 + 21 files changed, 567 insertions(+), 311 deletions(-) create mode 100644 src/dk/camelot64/kickc/passes/Pass2AssertNoReturnValues.java create mode 100644 src/dk/camelot64/kickc/passes/Pass3VariableRegisterWeightAnalysis.java diff --git a/src/dk/camelot64/kickc/Compiler.java b/src/dk/camelot64/kickc/Compiler.java index 3c17c038b..6e92446e1 100644 --- a/src/dk/camelot64/kickc/Compiler.java +++ b/src/dk/camelot64/kickc/Compiler.java @@ -10,7 +10,9 @@ import org.antlr.v4.runtime.*; import java.util.ArrayList; import java.util.List; -/** Perform KickC compilation and optimizations*/ +/** + * Perform KickC compilation and optimizations + */ public class Compiler { public static class CompilationResult { @@ -84,7 +86,7 @@ public class Compiler { } } - public AsmProgram pass4GenerateAsm(Program program, CompileLog log) { + public AsmProgram pass4GenerateAsm(Program program, CompileLog log) { Pass4CodeGeneration pass4CodeGeneration = new Pass4CodeGeneration(program); AsmProgram asmProgram = pass4CodeGeneration.generate(); @@ -97,11 +99,11 @@ public class Compiler { private void pass3RegisterAllocation(Program program, CompileLog log) { - Pass3BlockSequencePlanner pass3BlockSequencePlanner = new Pass3BlockSequencePlanner(program, log); - pass3BlockSequencePlanner.plan(); + new Pass3BlockSequencePlanner(program, log).plan(); + // Phi lifting ensures that all variables in phi-blocks are in different live range equivalence classes new Pass3PhiLifting(program, log).perform(); - pass3BlockSequencePlanner.plan(); + new Pass3BlockSequencePlanner(program, log).plan(); log.append("CONTROL FLOW GRAPH - PHI LIFTED"); log.append(program.getGraph().toString(program.getScope())); pass2AssertSSA(program, log); @@ -111,9 +113,10 @@ public class Compiler { log.append(program.getGraph().toString(program.getScope())); pass2AssertSSA(program, log); + // Phi mem coalesce removes as many variables introduced by phi lifting as possible - as long as their live ranges do not overlap new Pass3PhiMemCoalesce(program, log).optimize(); new Pass2CullEmptyBlocks(program, log).optimize(); - pass3BlockSequencePlanner.plan(); + new Pass3BlockSequencePlanner(program, log).plan(); new Pass3LiveRangesAnalysis(program, log).findLiveRanges(); log.append("CONTROL FLOW GRAPH - PHI MEM COALESCED"); log.append(program.getGraph().toString(program.getScope())); @@ -136,15 +139,17 @@ public class Compiler { log.append(program.getGraph().getLoopSet().toString()); new Pass3ZeroPageAllocation(program, log).allocate(); + + new Pass3VariableRegisterWeightAnalysis(program, log).findWeights(); + + new Pass3ZeroPageCoalesce(program, log).allocate(); new Pass3RegistersFinalize(program, log).allocate(); - - } - public void pass2OptimizeSSA(Program program, CompileLog log) { + public void pass2OptimizeSSA(Program program, CompileLog log) { List optimizations = new ArrayList<>(); optimizations.add(new Pass2CullEmptyBlocks(program, log)); optimizations.add(new Pass2ConstantPropagation(program, log)); @@ -176,6 +181,7 @@ public class Compiler { assertions.add(new Pass2AssertBlocks(program)); assertions.add(new Pass2AssertNoCallParameters(program)); assertions.add(new Pass2AssertNoCallLvalues(program)); + assertions.add(new Pass2AssertNoReturnValues(program)); assertions.add(new Pass2AssertNoProcs(program)); assertions.add(new Pass2AssertNoLabels(program)); for (Pass2SsaAssertion assertion : assertions) { @@ -183,57 +189,57 @@ public class Compiler { } } - public Program pass1GenerateSSA(KickCParser.FileContext file, CompileLog log) { + public Program pass1GenerateSSA(KickCParser.FileContext file, CompileLog log) { Pass1GenerateStatementSequence pass1GenerateStatementSequence1 = new Pass1GenerateStatementSequence(log); pass1GenerateStatementSequence1.generate(file); Pass1GenerateStatementSequence pass1GenerateStatementSequence = pass1GenerateStatementSequence1; - StatementSequence statementSequence = pass1GenerateStatementSequence.getSequence(); - ProgramScope programScope = pass1GenerateStatementSequence.getProgramScope(); + StatementSequence statementSequence = pass1GenerateStatementSequence.getSequence(); + ProgramScope programScope = pass1GenerateStatementSequence.getProgramScope(); Pass1TypeInference pass1TypeInference = new Pass1TypeInference(programScope); pass1TypeInference.inferTypes(statementSequence); log.append("PROGRAM"); - log.append(statementSequence.toString(programScope)); - log.append("SYMBOLS"); - log.append(programScope.getSymbolTableContents()); + log.append(statementSequence.toString(programScope)); + log.append("SYMBOLS"); + log.append(programScope.getSymbolTableContents()); - Pass1GenerateControlFlowGraph pass1GenerateControlFlowGraph = new Pass1GenerateControlFlowGraph(programScope); - ControlFlowGraph controlFlowGraph = pass1GenerateControlFlowGraph.generate(statementSequence); + Pass1GenerateControlFlowGraph pass1GenerateControlFlowGraph = new Pass1GenerateControlFlowGraph(programScope); + ControlFlowGraph controlFlowGraph = pass1GenerateControlFlowGraph.generate(statementSequence); - Program program = new Program(programScope, controlFlowGraph); + Program program = new Program(programScope, controlFlowGraph); - log.append("INITIAL CONTROL FLOW GRAPH"); + log.append("INITIAL CONTROL FLOW GRAPH"); + log.append(program.getGraph().toString(program.getScope())); + + Pass1EliminateEmptyBlocks pass1EliminateEmptyBlocks = new Pass1EliminateEmptyBlocks(program, log); + boolean blockEliminated = pass1EliminateEmptyBlocks.eliminate(); + if (blockEliminated) { + log.append("CONTROL FLOW GRAPH"); log.append(program.getGraph().toString(program.getScope())); - - Pass1EliminateEmptyBlocks pass1EliminateEmptyBlocks = new Pass1EliminateEmptyBlocks(program, log); - boolean blockEliminated = pass1EliminateEmptyBlocks.eliminate(); - if(blockEliminated) { - log.append("CONTROL FLOW GRAPH"); - log.append(program.getGraph().toString(program.getScope())); - } + } Pass1ProcedureCallParameters pass1ProcedureCallParameters = - new Pass1ProcedureCallParameters(program); - program.setGraph(pass1ProcedureCallParameters.generate()); - log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL"); - log.append(program.getGraph().toString(program.getScope())); + new Pass1ProcedureCallParameters(program); + program.setGraph(pass1ProcedureCallParameters.generate()); + log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL"); + log.append(program.getGraph().toString(program.getScope())); - Pass1GenerateSingleStaticAssignmentForm pass1GenerateSingleStaticAssignmentForm = - new Pass1GenerateSingleStaticAssignmentForm(log, program); - pass1GenerateSingleStaticAssignmentForm.generate(); + Pass1GenerateSingleStaticAssignmentForm pass1GenerateSingleStaticAssignmentForm = + new Pass1GenerateSingleStaticAssignmentForm(log, program); + pass1GenerateSingleStaticAssignmentForm.generate(); - log.append("CONTROL FLOW GRAPH SSA"); - log.append(program.getGraph().toString(program.getScope())); + log.append("CONTROL FLOW GRAPH SSA"); + log.append(program.getGraph().toString(program.getScope())); - Pass1ProcedureCallsReturnValue pass1ProcedureCallsReturnValue = - new Pass1ProcedureCallsReturnValue(program); - program.setGraph(pass1ProcedureCallsReturnValue.generate()); - log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN"); - log.append(program.getGraph().toString(program.getScope())); + Pass1ProcedureCallsReturnValue pass1ProcedureCallsReturnValue = + new Pass1ProcedureCallsReturnValue(program); + program.setGraph(pass1ProcedureCallsReturnValue.generate()); + log.append("CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN"); + log.append(program.getGraph().toString(program.getScope())); return program; } - public KickCParser.FileContext pass0ParseInput(final CharStream input, CompileLog log) { + public KickCParser.FileContext pass0ParseInput(final CharStream input, CompileLog log) { log.append(input.toString()); KickCLexer lexer = new KickCLexer(input); KickCParser parser = new KickCParser(new CommonTokenStream(lexer)); diff --git a/src/dk/camelot64/kickc/icl/LiveRangeVariables.java b/src/dk/camelot64/kickc/icl/LiveRangeVariables.java index e752b6ff6..d08bcc97c 100644 --- a/src/dk/camelot64/kickc/icl/LiveRangeVariables.java +++ b/src/dk/camelot64/kickc/icl/LiveRangeVariables.java @@ -30,6 +30,18 @@ public class LiveRangeVariables { return liveRange.add(statement); } + /** + * Add an empty alive range for a variable + * @param variable The variable + */ + public void addEmptyAlive(VariableRef variable) { + LiveRange liveRange = liveRanges.get(variable); + if (liveRange == null) { + liveRange = new LiveRange(); + liveRanges.put(variable, liveRange); + } + } + /** * Get all variables alive at a specific statement * @param statement The statement diff --git a/src/dk/camelot64/kickc/passes/Pass1ProcedureCallsReturnValue.java b/src/dk/camelot64/kickc/passes/Pass1ProcedureCallsReturnValue.java index 5bec00a26..8e7c85a4e 100644 --- a/src/dk/camelot64/kickc/passes/Pass1ProcedureCallsReturnValue.java +++ b/src/dk/camelot64/kickc/passes/Pass1ProcedureCallsReturnValue.java @@ -53,5 +53,10 @@ public class Pass1ProcedureCallsReturnValue extends ControlFlowGraphCopyVisitor return null; } + @Override + public StatementReturn visitReturn(StatementReturn origReturn) { + addStatementToCurrentBlock(new StatementReturn(null)); + return null; + } } diff --git a/src/dk/camelot64/kickc/passes/Pass2AliasElimination.java b/src/dk/camelot64/kickc/passes/Pass2AliasElimination.java index cf35d69c1..f9e2190ed 100644 --- a/src/dk/camelot64/kickc/passes/Pass2AliasElimination.java +++ b/src/dk/camelot64/kickc/passes/Pass2AliasElimination.java @@ -269,7 +269,11 @@ public class Pass2AliasElimination extends Pass2SsaOptimization { if (assignment.getrValue1() == null && assignment.getOperator() == null && assignment.getrValue2() instanceof VariableRef) { // Alias assignment VariableRef alias = (VariableRef) assignment.getrValue2(); - aliases.add(variable, alias); + if(variable.getScopeNames().equals(alias.getScopeNames())){ + aliases.add(variable, alias); + } else { + log.append("Not aliassing across scopes: "+variable+" "+alias); + } } } return null; @@ -283,7 +287,11 @@ public class Pass2AliasElimination extends Pass2SsaOptimization { if (phiRValue.getrValue() instanceof VariableRef) { VariableRef variable = phiVariable.getVariable(); VariableRef alias = (VariableRef) phiRValue.getrValue(); - aliases.add(variable, alias); + if(variable.getScopeNames().equals(alias.getScopeNames())){ + aliases.add(variable, alias); + } else { + log.append("Not aliassing across scopes: "+variable+" "+alias); + } } } } diff --git a/src/dk/camelot64/kickc/passes/Pass2AssertNoReturnValues.java b/src/dk/camelot64/kickc/passes/Pass2AssertNoReturnValues.java new file mode 100644 index 000000000..f4be97f17 --- /dev/null +++ b/src/dk/camelot64/kickc/passes/Pass2AssertNoReturnValues.java @@ -0,0 +1,31 @@ +package dk.camelot64.kickc.passes; + +import dk.camelot64.kickc.icl.ControlFlowGraphBaseVisitor; +import dk.camelot64.kickc.icl.Program; +import dk.camelot64.kickc.icl.StatementReturn; + +/** Asserts that the program does not contain returns with values (as they have been replaced with assignments) */ +public class Pass2AssertNoReturnValues extends Pass2SsaAssertion { + + public Pass2AssertNoReturnValues(Program program) { + super(program); + } + + @Override + public void check() throws AssertionFailed { + + ControlFlowGraphBaseVisitor checkCalls = new ControlFlowGraphBaseVisitor() { + + @Override + public Void visitReturn(StatementReturn aReturn) { + if(aReturn.getValue()!=null) { + throw new AssertionFailed("No return values allowed! "+ aReturn); + } + return null; + } + + }; + checkCalls.visitGraph(getGraph()); + } + +} diff --git a/src/dk/camelot64/kickc/passes/Pass3LiveRangesAnalysis.java b/src/dk/camelot64/kickc/passes/Pass3LiveRangesAnalysis.java index e05349a19..b7fe15516 100644 --- a/src/dk/camelot64/kickc/passes/Pass3LiveRangesAnalysis.java +++ b/src/dk/camelot64/kickc/passes/Pass3LiveRangesAnalysis.java @@ -22,11 +22,14 @@ public class Pass3LiveRangesAnalysis { } public void findLiveRanges() { + generateStatementIndexes(); + LiveRangeVariables liveRanges = initializeLiveRanges(); program.getScope().setLiveRangeVariables(liveRanges); //log.append("CONTROL FLOW GRAPH - LIVE RANGES"); //log.append(program.getGraph().toString(program.getScope())); + boolean propagating; do { propagating = propagateLiveRanges(liveRanges); @@ -35,6 +38,7 @@ public class Pass3LiveRangesAnalysis { //log.append("CONTROL FLOW GRAPH - LIVE RANGES"); //log.append(program.getGraph().toString(program.getScope())); } while (propagating); + program.getScope().setLiveRangeVariables(liveRanges); } @@ -164,7 +168,9 @@ public class Pass3LiveRangesAnalysis { @Override public Void visitReturn(StatementReturn aReturn) { - addInitialLiveRange(aReturn.getValue()); + if (aReturn.getValue() != null) { + addInitialLiveRange(aReturn.getValue()); + } return null; } @@ -196,7 +202,7 @@ public class Pass3LiveRangesAnalysis { * @return true if any propagation was done. (and more propagation is necessary to complete the live ranges) */ private boolean propagateLiveRanges(LiveRangeVariables liveRanges) { - LiveRangePropagator liveRangePropagator = new LiveRangePropagator(program, liveRanges); + LiveRangePropagator liveRangePropagator = new LiveRangePropagator(program, liveRanges, log); return liveRangePropagator.propagate(); } @@ -211,6 +217,7 @@ public class Pass3LiveRangesAnalysis { * The variable live ranges being propagated. */ private LiveRangeVariables liveRanges; + private CompileLog log; /** * Has anything been modified. @@ -227,9 +234,10 @@ public class Pass3LiveRangesAnalysis { */ private ControlFlowBlock currentBlock; - public LiveRangePropagator(Program program, LiveRangeVariables liveRanges) { + public LiveRangePropagator(Program program, LiveRangeVariables liveRanges, CompileLog log) { this.program = program; this.liveRanges = liveRanges; + this.log = log; this.modified = false; } @@ -275,6 +283,22 @@ public class Pass3LiveRangesAnalysis { modified |= liveRanges.addAlive(var, prev); } } + + // If any lValues do not have a live range (they are never used) - create an empty live range for them + if (defined != null) { + for (LValue lValue : defined) { + if(lValue instanceof VariableRef) { + LiveRange lValLiveRange = liveRanges.getLiveRange((VariableRef) lValue); + if(lValLiveRange==null) { + liveRanges.addEmptyAlive((VariableRef)lValue); + log.append("Adding empty live range for unused variable "+lValue); + } + } + + } + } + + } private List getPreviousStatements() { @@ -309,6 +333,7 @@ public class Pass3LiveRangesAnalysis { /** * Get the last statement executed in a specific block. * If the block is empty the last statement of the previous block is returned. + * * @param block The block to examine * @return The last statement of the block (or the last statement of previous blocks if the block is empty) */ diff --git a/src/dk/camelot64/kickc/passes/Pass3PhiLifting.java b/src/dk/camelot64/kickc/passes/Pass3PhiLifting.java index 58962c965..516ff1d15 100644 --- a/src/dk/camelot64/kickc/passes/Pass3PhiLifting.java +++ b/src/dk/camelot64/kickc/passes/Pass3PhiLifting.java @@ -10,6 +10,9 @@ import java.util.Map; /** * Perform PhiLifting to greatly reduce overlapping of alive intervals for variables. + * + * After phi lifting it is guaranteed that variables in different phi blocks are in different live range equivalence classes. + *

* PhiLifting introduces a large number of new virtual variables (one for each rvalue in phi-functions). * Most of these are eliminated again by the PhiMemCoalesce pass. *

diff --git a/src/dk/camelot64/kickc/passes/Pass3VariableRegisterWeightAnalysis.java b/src/dk/camelot64/kickc/passes/Pass3VariableRegisterWeightAnalysis.java new file mode 100644 index 000000000..02b7c93f9 --- /dev/null +++ b/src/dk/camelot64/kickc/passes/Pass3VariableRegisterWeightAnalysis.java @@ -0,0 +1,50 @@ +package dk.camelot64.kickc.passes; + +import dk.camelot64.kickc.CompileLog; +import dk.camelot64.kickc.icl.ControlFlowBlock; +import dk.camelot64.kickc.icl.Program; +import dk.camelot64.kickc.icl.Statement; + +/** + * Finds register weights for all variables. + * + * The register weight signifies how beneficial it would be for the variable to assigned to a register (instead of zero page). + * + * Uses Loop Depth and Live Ranges plus the statements of the control flow graph. + *

+ * Based on ComputeWeight from http://compilers.cs.ucla.edu/fernando/projects/soc/reports/short_tech.pdf + */ +public class Pass3VariableRegisterWeightAnalysis { + + private Program program; + private CompileLog log; + + public Pass3VariableRegisterWeightAnalysis(Program program, CompileLog log) { + this.program = program; + this.log = log; + } + + public Program getProgram() { + return program; + } + + public CompileLog getLog() { + return log; + } + + /** Find register weights for all variables */ + public void findWeights() { + + for (ControlFlowBlock block : program.getGraph().getAllBlocks()) { + for (Statement statement : block.getStatements()) { + + + + } + } + + + } + + +} diff --git a/src/dk/camelot64/kickc/passes/Pass4CodeGeneration.java b/src/dk/camelot64/kickc/passes/Pass4CodeGeneration.java index c5325883c..30a7bcaf3 100644 --- a/src/dk/camelot64/kickc/passes/Pass4CodeGeneration.java +++ b/src/dk/camelot64/kickc/passes/Pass4CodeGeneration.java @@ -68,9 +68,13 @@ public class Pass4CodeGeneration { } } if (!isAlu) { - AsmFragment asmFragment = new AsmFragment(assignment, symbols); - asm.addComment(statement.toString(symbols) + " // " + asmFragment.getSignature()); - asmFragment.generate(asm); + if(assignment.getOperator()==null && assignment.getrValue1()==null && isRegisterCopy(lValue, assignment.getrValue2())) { + asm.addComment(lValue.toString(symbols) + " = " + assignment.getrValue2().toString(symbols) + " // register copy "+getRegister(lValue)); + } else { + AsmFragment asmFragment = new AsmFragment(assignment, symbols); + asm.addComment(statement.toString(symbols) + " // " + asmFragment.getSignature()); + asmFragment.generate(asm); + } } } else if (statement instanceof StatementConditionalJump) { AsmFragment asmFragment = new AsmFragment((StatementConditionalJump) statement, block, symbols, graph); @@ -145,14 +149,20 @@ public class Pass4CodeGeneration { } private void genAsmMove(AsmProgram asm, LValue lValue, RValue rValue) { - if (getRegister(lValue).equals(getRegister(rValue))) { - // Do not move from register to itself - asm.addComment(lValue.toString(symbols) + " = " + rValue.toString(symbols) + " // register copy "); - return; + if (isRegisterCopy(lValue, rValue)) { + asm.addComment(lValue.toString(symbols) + " = " + rValue.toString(symbols) + " // register copy "+getRegister(lValue)); + } else { + AsmFragment asmFragment = new AsmFragment(lValue, rValue, symbols); + asm.addComment(lValue.toString(symbols) + " = " + rValue.toString(symbols) + " // " + asmFragment.getSignature()); + asmFragment.generate(asm); } - AsmFragment asmFragment = new AsmFragment(lValue, rValue, symbols); - asm.addComment(lValue.toString(symbols) + " = " + rValue.toString(symbols) + " // " + asmFragment.getSignature()); - asmFragment.generate(asm); + } + + private boolean isRegisterCopy(LValue lValue, RValue rValue) { + return + getRegister(lValue) != null && + getRegister(rValue) != null && + getRegister(lValue).equals(getRegister(rValue)); } diff --git a/src/dk/camelot64/kickc/test/ref/bresenham.log b/src/dk/camelot64/kickc/test/ref/bresenham.log index 2938f923b..18381203d 100644 --- a/src/dk/camelot64/kickc/test/ref/bresenham.log +++ b/src/dk/camelot64/kickc/test/ref/bresenham.log @@ -1046,10 +1046,10 @@ B1_from_BBEGIN: sta 2+1 jmp B1 B1_from_B3: - // (byte) y#2 = (byte) y#4 // register copy - // (byte) e#3 = (byte) e#5 // register copy - // (byte) x#2 = (byte) x#1 // register copy - // (byte*) cursor#3 = (byte*) cursor#5 // register copy + // (byte) y#2 = (byte) y#4 // register copy zp byte:6 + // (byte) e#3 = (byte) e#5 // register copy zp byte:5 + // (byte) x#2 = (byte) x#1 // register copy zp byte:4 + // (byte*) cursor#3 = (byte*) cursor#5 // register copy zp ptr byte:2 jmp B1 B1: // [1] *((byte*) cursor#3) ← (byte) 81 [ cursor#3 x#2 e#3 y#2 ] // zpiby1=coby1 @@ -1073,9 +1073,9 @@ B1: cmp 5 bcc B2 B3_from_B1: - // (byte) y#4 = (byte) y#2 // register copy - // (byte) e#5 = (byte) e#1 // register copy - // (byte*) cursor#5 = (byte*) cursor#1 // register copy + // (byte) y#4 = (byte) y#2 // register copy zp byte:6 + // (byte) e#5 = (byte) e#1 // register copy zp byte:5 + // (byte*) cursor#5 = (byte*) cursor#1 // register copy zp ptr byte:2 jmp B3 B3: // [7] if((byte) x#1<(byte) 40) goto @1 [ cursor#5 x#1 e#5 y#4 ] // zpby1_lt_coby1_then_la1 @@ -1101,9 +1101,9 @@ B2: sbc #39 sta 5 B3_from_B2: - // (byte) y#4 = (byte) y#1 // register copy - // (byte) e#5 = (byte) e#2 // register copy - // (byte*) cursor#5 = (byte*) cursor#2 // register copy + // (byte) y#4 = (byte) y#1 // register copy zp byte:6 + // (byte) e#5 = (byte) e#2 // register copy zp byte:5 + // (byte*) cursor#5 = (byte*) cursor#2 // register copy zp ptr byte:2 jmp B3 Removing instruction jmp B1 @@ -1129,10 +1129,10 @@ B1_from_BBEGIN: sta 2+1 jmp B1 B1_from_B3: - // (byte) y#2 = (byte) y#4 // register copy - // (byte) e#3 = (byte) e#5 // register copy - // (byte) x#2 = (byte) x#1 // register copy - // (byte*) cursor#3 = (byte*) cursor#5 // register copy + // (byte) y#2 = (byte) y#4 // register copy zp byte:6 + // (byte) e#3 = (byte) e#5 // register copy zp byte:5 + // (byte) x#2 = (byte) x#1 // register copy zp byte:4 + // (byte*) cursor#3 = (byte*) cursor#5 // register copy zp ptr byte:2 B1: // [1] *((byte*) cursor#3) ← (byte) 81 [ cursor#3 x#2 e#3 y#2 ] // zpiby1=coby1 ldy #0 @@ -1155,9 +1155,9 @@ B1: cmp 5 bcc B2 B3_from_B1: - // (byte) y#4 = (byte) y#2 // register copy - // (byte) e#5 = (byte) e#1 // register copy - // (byte*) cursor#5 = (byte*) cursor#1 // register copy + // (byte) y#4 = (byte) y#2 // register copy zp byte:6 + // (byte) e#5 = (byte) e#1 // register copy zp byte:5 + // (byte*) cursor#5 = (byte*) cursor#1 // register copy zp ptr byte:2 B3: // [7] if((byte) x#1<(byte) 40) goto @1 [ cursor#5 x#1 e#5 y#4 ] // zpby1_lt_coby1_then_la1 lda 4 @@ -1181,9 +1181,9 @@ B2: sbc #39 sta 5 B3_from_B2: - // (byte) y#4 = (byte) y#1 // register copy - // (byte) e#5 = (byte) e#2 // register copy - // (byte*) cursor#5 = (byte*) cursor#2 // register copy + // (byte) y#4 = (byte) y#1 // register copy zp byte:6 + // (byte) e#5 = (byte) e#2 // register copy zp byte:5 + // (byte*) cursor#5 = (byte*) cursor#2 // register copy zp ptr byte:2 jmp B3 Removing instruction jmp B1 @@ -1206,10 +1206,10 @@ B1_from_BBEGIN: lda #>1024 sta 2+1 B1_from_B3: - // (byte) y#2 = (byte) y#4 // register copy - // (byte) e#3 = (byte) e#5 // register copy - // (byte) x#2 = (byte) x#1 // register copy - // (byte*) cursor#3 = (byte*) cursor#5 // register copy + // (byte) y#2 = (byte) y#4 // register copy zp byte:6 + // (byte) e#3 = (byte) e#5 // register copy zp byte:5 + // (byte) x#2 = (byte) x#1 // register copy zp byte:4 + // (byte*) cursor#3 = (byte*) cursor#5 // register copy zp ptr byte:2 B1: // [1] *((byte*) cursor#3) ← (byte) 81 [ cursor#3 x#2 e#3 y#2 ] // zpiby1=coby1 ldy #0 @@ -1232,9 +1232,9 @@ B1: cmp 5 bcc B2 B3_from_B1: - // (byte) y#4 = (byte) y#2 // register copy - // (byte) e#5 = (byte) e#1 // register copy - // (byte*) cursor#5 = (byte*) cursor#1 // register copy + // (byte) y#4 = (byte) y#2 // register copy zp byte:6 + // (byte) e#5 = (byte) e#1 // register copy zp byte:5 + // (byte*) cursor#5 = (byte*) cursor#1 // register copy zp ptr byte:2 B3: // [7] if((byte) x#1<(byte) 40) goto @1 [ cursor#5 x#1 e#5 y#4 ] // zpby1_lt_coby1_then_la1 lda 4 @@ -1258,9 +1258,9 @@ B2: sbc #39 sta 5 B3_from_B2: - // (byte) y#4 = (byte) y#1 // register copy - // (byte) e#5 = (byte) e#2 // register copy - // (byte*) cursor#5 = (byte*) cursor#2 // register copy + // (byte) y#4 = (byte) y#1 // register copy zp byte:6 + // (byte) e#5 = (byte) e#2 // register copy zp byte:5 + // (byte*) cursor#5 = (byte*) cursor#2 // register copy zp ptr byte:2 jmp B3 FINAL SYMBOL TABLE @@ -1318,10 +1318,10 @@ B1_from_BBEGIN: lda #>1024 sta 2+1 B1_from_B3: - // (byte) y#2 = (byte) y#4 // register copy - // (byte) e#3 = (byte) e#5 // register copy - // (byte) x#2 = (byte) x#1 // register copy - // (byte*) cursor#3 = (byte*) cursor#5 // register copy + // (byte) y#2 = (byte) y#4 // register copy zp byte:6 + // (byte) e#3 = (byte) e#5 // register copy zp byte:5 + // (byte) x#2 = (byte) x#1 // register copy zp byte:4 + // (byte*) cursor#3 = (byte*) cursor#5 // register copy zp ptr byte:2 B1: // [1] *((byte*) cursor#3) ← (byte) 81 [ cursor#3 x#2 e#3 y#2 ] // zpiby1=coby1 ldy #0 @@ -1344,9 +1344,9 @@ B1: cmp 5 bcc B2 B3_from_B1: - // (byte) y#4 = (byte) y#2 // register copy - // (byte) e#5 = (byte) e#1 // register copy - // (byte*) cursor#5 = (byte*) cursor#1 // register copy + // (byte) y#4 = (byte) y#2 // register copy zp byte:6 + // (byte) e#5 = (byte) e#1 // register copy zp byte:5 + // (byte*) cursor#5 = (byte*) cursor#1 // register copy zp ptr byte:2 B3: // [7] if((byte) x#1<(byte) 40) goto @1 [ cursor#5 x#1 e#5 y#4 ] // zpby1_lt_coby1_then_la1 lda 4 @@ -1370,8 +1370,8 @@ B2: sbc #39 sta 5 B3_from_B2: - // (byte) y#4 = (byte) y#1 // register copy - // (byte) e#5 = (byte) e#2 // register copy - // (byte*) cursor#5 = (byte*) cursor#2 // register copy + // (byte) y#4 = (byte) y#1 // register copy zp byte:6 + // (byte) e#5 = (byte) e#2 // register copy zp byte:5 + // (byte*) cursor#5 = (byte*) cursor#2 // register copy zp ptr byte:2 jmp B3 diff --git a/src/dk/camelot64/kickc/test/ref/flipper-rex2.log b/src/dk/camelot64/kickc/test/ref/flipper-rex2.log index 568b2a818..7e70d7028 100644 --- a/src/dk/camelot64/kickc/test/ref/flipper-rex2.log +++ b/src/dk/camelot64/kickc/test/ref/flipper-rex2.log @@ -3920,7 +3920,7 @@ main__B3_from_B11: main__B3_from_B3: jmp main__B3 main__B3_from_B6: - // (byte) main::c#2 = (byte) main::c#1 // register copy + // (byte) main::c#2 = (byte) main::c#1 // register copy zp byte:2 jmp main__B3 main__B3: // [3] (byte~) main::$1 ← * (word) 53266 [ main::$1 main::c#2 ] // zpby1=_star_cowo1 @@ -3974,20 +3974,20 @@ plot__B1_from_plot: sta 5 jmp plot__B1 plot__B1_from_B3: - // (byte) plot::y#2 = (byte) plot::y#1 // register copy - // (byte*) plot::line#2 = (byte*) plot::line#1 // register copy - // (byte) plot::i#3 = (byte) plot::i#1 // register copy + // (byte) plot::y#2 = (byte) plot::y#1 // register copy zp byte:2 + // (byte*) plot::line#2 = (byte*) plot::line#1 // register copy zp ptr byte:3 + // (byte) plot::i#3 = (byte) plot::i#1 // register copy zp byte:5 jmp plot__B1 plot__B1: plot__B2_from_B1: // (byte) plot::x#2 = (byte) 0 // zpby1=coby1 lda #0 sta 6 - // (byte) plot::i#2 = (byte) plot::i#3 // register copy + // (byte) plot::i#2 = (byte) plot::i#3 // register copy zp byte:5 jmp plot__B2 plot__B2_from_B2: - // (byte) plot::x#2 = (byte) plot::x#1 // register copy - // (byte) plot::i#2 = (byte) plot::i#1 // register copy + // (byte) plot::x#2 = (byte) plot::x#1 // register copy zp byte:6 + // (byte) plot::i#2 = (byte) plot::i#1 // register copy zp byte:5 jmp plot__B2 plot__B2: // [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 @@ -4037,22 +4037,22 @@ flip__B1_from_flip: sta 5 jmp flip__B1 flip__B1_from_B4: - // (byte) flip::r#2 = (byte) flip::r#1 // register copy - // (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 // register copy - // (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 // register copy + // (byte) flip::r#2 = (byte) flip::r#1 // register copy zp byte:2 + // (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 // register copy zp byte:6 + // (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 // register copy zp byte:5 jmp flip__B1 flip__B1: flip__B2_from_B1: // (byte) flip::c#2 = (byte) 16 // zpby1=coby1 lda #16 sta 7 - // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 // register copy - // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 // register copy + // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 // register copy zp byte:6 + // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 // register copy zp byte:5 jmp flip__B2 flip__B2_from_B2: - // (byte) flip::c#2 = (byte) flip::c#1 // register copy - // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 // register copy - // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 // register copy + // (byte) flip::c#2 = (byte) flip::c#1 // register copy zp byte:7 + // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 // register copy zp byte:6 + // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 // register copy zp byte:5 jmp flip__B2 flip__B2: // [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 @@ -4090,7 +4090,7 @@ flip__B3_from_B4: sta 2 jmp flip__B3 flip__B3_from_B3: - // (byte) flip::i#2 = (byte) flip::i#1 // register copy + // (byte) flip::i#2 = (byte) flip::i#1 // register copy zp byte:2 jmp flip__B3 flip__B3: // [36] (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] // zpby1=cowo1_staridx_zpby2 @@ -4116,7 +4116,7 @@ prepare__B1_from_prepare: sta 2 jmp prepare__B1 prepare__B1_from_B1: - // (byte) prepare::i#2 = (byte) prepare::i#1 // register copy + // (byte) prepare::i#2 = (byte) prepare::i#1 // register copy zp byte:2 jmp prepare__B1 prepare__B1: // [42] *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] // ptr_cowo1_zpby1=zpby1 @@ -4171,7 +4171,7 @@ main__B3_from_B11: main__B3_from_B3: jmp main__B3 main__B3_from_B6: - // (byte) main::c#2 = (byte) main::c#1 // register copy + // (byte) main::c#2 = (byte) main::c#1 // register copy zp byte:2 main__B3: // [3] (byte~) main::$1 ← * (word) 53266 [ main::$1 main::c#2 ] // zpby1=_star_cowo1 lda 53266 @@ -4218,19 +4218,19 @@ plot__B1_from_plot: sta 5 jmp plot__B1 plot__B1_from_B3: - // (byte) plot::y#2 = (byte) plot::y#1 // register copy - // (byte*) plot::line#2 = (byte*) plot::line#1 // register copy - // (byte) plot::i#3 = (byte) plot::i#1 // register copy + // (byte) plot::y#2 = (byte) plot::y#1 // register copy zp byte:2 + // (byte*) plot::line#2 = (byte*) plot::line#1 // register copy zp ptr byte:3 + // (byte) plot::i#3 = (byte) plot::i#1 // register copy zp byte:5 plot__B1: plot__B2_from_B1: // (byte) plot::x#2 = (byte) 0 // zpby1=coby1 lda #0 sta 6 - // (byte) plot::i#2 = (byte) plot::i#3 // register copy + // (byte) plot::i#2 = (byte) plot::i#3 // register copy zp byte:5 jmp plot__B2 plot__B2_from_B2: - // (byte) plot::x#2 = (byte) plot::x#1 // register copy - // (byte) plot::i#2 = (byte) plot::i#1 // register copy + // (byte) plot::x#2 = (byte) plot::x#1 // register copy zp byte:6 + // (byte) plot::i#2 = (byte) plot::i#1 // register copy zp byte:5 plot__B2: // [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 ldy 5 @@ -4277,21 +4277,21 @@ flip__B1_from_flip: sta 5 jmp flip__B1 flip__B1_from_B4: - // (byte) flip::r#2 = (byte) flip::r#1 // register copy - // (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 // register copy - // (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 // register copy + // (byte) flip::r#2 = (byte) flip::r#1 // register copy zp byte:2 + // (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 // register copy zp byte:6 + // (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 // register copy zp byte:5 flip__B1: flip__B2_from_B1: // (byte) flip::c#2 = (byte) 16 // zpby1=coby1 lda #16 sta 7 - // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 // register copy - // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 // register copy + // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 // register copy zp byte:6 + // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 // register copy zp byte:5 jmp flip__B2 flip__B2_from_B2: - // (byte) flip::c#2 = (byte) flip::c#1 // register copy - // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 // register copy - // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 // register copy + // (byte) flip::c#2 = (byte) flip::c#1 // register copy zp byte:7 + // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 // register copy zp byte:6 + // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 // register copy zp byte:5 flip__B2: // [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 ldy 5 @@ -4327,7 +4327,7 @@ flip__B3_from_B4: sta 2 jmp flip__B3 flip__B3_from_B3: - // (byte) flip::i#2 = (byte) flip::i#1 // register copy + // (byte) flip::i#2 = (byte) flip::i#1 // register copy zp byte:2 flip__B3: // [36] (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] // zpby1=cowo1_staridx_zpby2 ldy 2 @@ -4351,7 +4351,7 @@ prepare__B1_from_prepare: sta 2 jmp prepare__B1 prepare__B1_from_B1: - // (byte) prepare::i#2 = (byte) prepare::i#1 // register copy + // (byte) prepare::i#2 = (byte) prepare::i#1 // register copy zp byte:2 prepare__B1: // [42] *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] // ptr_cowo1_zpby1=zpby1 ldy 2 @@ -4391,7 +4391,7 @@ main__B3_from_B11: jmp main__B3 main__B3_from_B3: main__B3_from_B6: - // (byte) main::c#2 = (byte) main::c#1 // register copy + // (byte) main::c#2 = (byte) main::c#1 // register copy zp byte:2 main__B3: // [3] (byte~) main::$1 ← * (word) 53266 [ main::$1 main::c#2 ] // zpby1=_star_cowo1 lda 53266 @@ -4437,18 +4437,18 @@ plot__B1_from_plot: lda #0 sta 5 plot__B1_from_B3: - // (byte) plot::y#2 = (byte) plot::y#1 // register copy - // (byte*) plot::line#2 = (byte*) plot::line#1 // register copy - // (byte) plot::i#3 = (byte) plot::i#1 // register copy + // (byte) plot::y#2 = (byte) plot::y#1 // register copy zp byte:2 + // (byte*) plot::line#2 = (byte*) plot::line#1 // register copy zp ptr byte:3 + // (byte) plot::i#3 = (byte) plot::i#1 // register copy zp byte:5 plot__B1: plot__B2_from_B1: // (byte) plot::x#2 = (byte) 0 // zpby1=coby1 lda #0 sta 6 - // (byte) plot::i#2 = (byte) plot::i#3 // register copy + // (byte) plot::i#2 = (byte) plot::i#3 // register copy zp byte:5 plot__B2_from_B2: - // (byte) plot::x#2 = (byte) plot::x#1 // register copy - // (byte) plot::i#2 = (byte) plot::i#1 // register copy + // (byte) plot::x#2 = (byte) plot::x#1 // register copy zp byte:6 + // (byte) plot::i#2 = (byte) plot::i#1 // register copy zp byte:5 plot__B2: // [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 ldy 5 @@ -4494,20 +4494,20 @@ flip__B1_from_flip: lda #0 sta 5 flip__B1_from_B4: - // (byte) flip::r#2 = (byte) flip::r#1 // register copy - // (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 // register copy - // (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 // register copy + // (byte) flip::r#2 = (byte) flip::r#1 // register copy zp byte:2 + // (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 // register copy zp byte:6 + // (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 // register copy zp byte:5 flip__B1: flip__B2_from_B1: // (byte) flip::c#2 = (byte) 16 // zpby1=coby1 lda #16 sta 7 - // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 // register copy - // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 // register copy + // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 // register copy zp byte:6 + // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 // register copy zp byte:5 flip__B2_from_B2: - // (byte) flip::c#2 = (byte) flip::c#1 // register copy - // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 // register copy - // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 // register copy + // (byte) flip::c#2 = (byte) flip::c#1 // register copy zp byte:7 + // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 // register copy zp byte:6 + // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 // register copy zp byte:5 flip__B2: // [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 ldy 5 @@ -4542,7 +4542,7 @@ flip__B3_from_B4: lda #0 sta 2 flip__B3_from_B3: - // (byte) flip::i#2 = (byte) flip::i#1 // register copy + // (byte) flip::i#2 = (byte) flip::i#1 // register copy zp byte:2 flip__B3: // [36] (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] // zpby1=cowo1_staridx_zpby2 ldy 2 @@ -4565,7 +4565,7 @@ prepare__B1_from_prepare: lda #0 sta 2 prepare__B1_from_B1: - // (byte) prepare::i#2 = (byte) prepare::i#1 // register copy + // (byte) prepare::i#2 = (byte) prepare::i#1 // register copy zp byte:2 prepare__B1: // [42] *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] // ptr_cowo1_zpby1=zpby1 ldy 2 @@ -4598,7 +4598,7 @@ main__B3_from_B11: sta 2 main__B3_from_B3: main__B3_from_B6: - // (byte) main::c#2 = (byte) main::c#1 // register copy + // (byte) main::c#2 = (byte) main::c#1 // register copy zp byte:2 main__B3: // [3] (byte~) main::$1 ← * (word) 53266 [ main::$1 main::c#2 ] // zpby1=_star_cowo1 lda 53266 @@ -4644,18 +4644,18 @@ plot__B1_from_plot: lda #0 sta 5 plot__B1_from_B3: - // (byte) plot::y#2 = (byte) plot::y#1 // register copy - // (byte*) plot::line#2 = (byte*) plot::line#1 // register copy - // (byte) plot::i#3 = (byte) plot::i#1 // register copy + // (byte) plot::y#2 = (byte) plot::y#1 // register copy zp byte:2 + // (byte*) plot::line#2 = (byte*) plot::line#1 // register copy zp ptr byte:3 + // (byte) plot::i#3 = (byte) plot::i#1 // register copy zp byte:5 plot__B1: plot__B2_from_B1: // (byte) plot::x#2 = (byte) 0 // zpby1=coby1 lda #0 sta 6 - // (byte) plot::i#2 = (byte) plot::i#3 // register copy + // (byte) plot::i#2 = (byte) plot::i#3 // register copy zp byte:5 plot__B2_from_B2: - // (byte) plot::x#2 = (byte) plot::x#1 // register copy - // (byte) plot::i#2 = (byte) plot::i#1 // register copy + // (byte) plot::x#2 = (byte) plot::x#1 // register copy zp byte:6 + // (byte) plot::i#2 = (byte) plot::i#1 // register copy zp byte:5 plot__B2: // [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 ldy 5 @@ -4701,20 +4701,20 @@ flip__B1_from_flip: lda #0 sta 5 flip__B1_from_B4: - // (byte) flip::r#2 = (byte) flip::r#1 // register copy - // (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 // register copy - // (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 // register copy + // (byte) flip::r#2 = (byte) flip::r#1 // register copy zp byte:2 + // (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 // register copy zp byte:6 + // (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 // register copy zp byte:5 flip__B1: flip__B2_from_B1: // (byte) flip::c#2 = (byte) 16 // zpby1=coby1 lda #16 sta 7 - // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 // register copy - // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 // register copy + // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 // register copy zp byte:6 + // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 // register copy zp byte:5 flip__B2_from_B2: - // (byte) flip::c#2 = (byte) flip::c#1 // register copy - // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 // register copy - // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 // register copy + // (byte) flip::c#2 = (byte) flip::c#1 // register copy zp byte:7 + // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 // register copy zp byte:6 + // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 // register copy zp byte:5 flip__B2: // [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 ldy 5 @@ -4749,7 +4749,7 @@ flip__B3_from_B4: lda #0 sta 2 flip__B3_from_B3: - // (byte) flip::i#2 = (byte) flip::i#1 // register copy + // (byte) flip::i#2 = (byte) flip::i#1 // register copy zp byte:2 flip__B3: // [36] (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] // zpby1=cowo1_staridx_zpby2 ldy 2 @@ -4772,7 +4772,7 @@ prepare__B1_from_prepare: lda #0 sta 2 prepare__B1_from_B1: - // (byte) prepare::i#2 = (byte) prepare::i#1 // register copy + // (byte) prepare::i#2 = (byte) prepare::i#1 // register copy zp byte:2 prepare__B1: // [42] *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] // ptr_cowo1_zpby1=zpby1 ldy 2 @@ -4886,7 +4886,7 @@ main__B3_from_B11: sta 2 main__B3_from_B3: main__B3_from_B6: - // (byte) main::c#2 = (byte) main::c#1 // register copy + // (byte) main::c#2 = (byte) main::c#1 // register copy zp byte:2 main__B3: // [3] (byte~) main::$1 ← * (word) 53266 [ main::$1 main::c#2 ] // zpby1=_star_cowo1 lda 53266 @@ -4932,18 +4932,18 @@ plot__B1_from_plot: lda #0 sta 5 plot__B1_from_B3: - // (byte) plot::y#2 = (byte) plot::y#1 // register copy - // (byte*) plot::line#2 = (byte*) plot::line#1 // register copy - // (byte) plot::i#3 = (byte) plot::i#1 // register copy + // (byte) plot::y#2 = (byte) plot::y#1 // register copy zp byte:2 + // (byte*) plot::line#2 = (byte*) plot::line#1 // register copy zp ptr byte:3 + // (byte) plot::i#3 = (byte) plot::i#1 // register copy zp byte:5 plot__B1: plot__B2_from_B1: // (byte) plot::x#2 = (byte) 0 // zpby1=coby1 lda #0 sta 6 - // (byte) plot::i#2 = (byte) plot::i#3 // register copy + // (byte) plot::i#2 = (byte) plot::i#3 // register copy zp byte:5 plot__B2_from_B2: - // (byte) plot::x#2 = (byte) plot::x#1 // register copy - // (byte) plot::i#2 = (byte) plot::i#1 // register copy + // (byte) plot::x#2 = (byte) plot::x#1 // register copy zp byte:6 + // (byte) plot::i#2 = (byte) plot::i#1 // register copy zp byte:5 plot__B2: // [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 ldy 5 @@ -4989,20 +4989,20 @@ flip__B1_from_flip: lda #0 sta 5 flip__B1_from_B4: - // (byte) flip::r#2 = (byte) flip::r#1 // register copy - // (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 // register copy - // (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 // register copy + // (byte) flip::r#2 = (byte) flip::r#1 // register copy zp byte:2 + // (byte) flip::dstIdx#5 = (byte) flip::dstIdx#2 // register copy zp byte:6 + // (byte) flip::srcIdx#3 = (byte) flip::srcIdx#1 // register copy zp byte:5 flip__B1: flip__B2_from_B1: // (byte) flip::c#2 = (byte) 16 // zpby1=coby1 lda #16 sta 7 - // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 // register copy - // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 // register copy + // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#5 // register copy zp byte:6 + // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#3 // register copy zp byte:5 flip__B2_from_B2: - // (byte) flip::c#2 = (byte) flip::c#1 // register copy - // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 // register copy - // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 // register copy + // (byte) flip::c#2 = (byte) flip::c#1 // register copy zp byte:7 + // (byte) flip::dstIdx#3 = (byte) flip::dstIdx#1 // register copy zp byte:6 + // (byte) flip::srcIdx#2 = (byte) flip::srcIdx#1 // register copy zp byte:5 flip__B2: // [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 ldy 5 @@ -5037,7 +5037,7 @@ flip__B3_from_B4: lda #0 sta 2 flip__B3_from_B3: - // (byte) flip::i#2 = (byte) flip::i#1 // register copy + // (byte) flip::i#2 = (byte) flip::i#1 // register copy zp byte:2 flip__B3: // [36] (byte~) flip::$4 ← (word) 4352 *idx (byte) flip::i#2 [ flip::i#2 flip::$4 ] // zpby1=cowo1_staridx_zpby2 ldy 2 @@ -5060,7 +5060,7 @@ prepare__B1_from_prepare: lda #0 sta 2 prepare__B1_from_B1: - // (byte) prepare::i#2 = (byte) prepare::i#1 // register copy + // (byte) prepare::i#2 = (byte) prepare::i#1 // register copy zp byte:2 prepare__B1: // [42] *((word) 4096 + (byte) prepare::i#2) ← (byte) prepare::i#2 [ prepare::i#2 ] // ptr_cowo1_zpby1=zpby1 ldy 2 diff --git a/src/dk/camelot64/kickc/test/ref/loopmin.log b/src/dk/camelot64/kickc/test/ref/loopmin.log index 023327fe1..4e18ca810 100644 --- a/src/dk/camelot64/kickc/test/ref/loopmin.log +++ b/src/dk/camelot64/kickc/test/ref/loopmin.log @@ -384,8 +384,8 @@ B1_from_BBEGIN: sta 2 jmp B1 B1_from_B3: - // (byte) s#2 = (byte) s#4 // register copy - // (byte) i#2 = (byte) i#1 // register copy + // (byte) s#2 = (byte) s#4 // register copy zp byte:3 + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 jmp B1 B1: // [1] if((byte) i#2>(byte) 5) goto @2 [ i#2 s#2 ] // zpby1_gt_coby1_then_la1 @@ -395,7 +395,7 @@ B1: bcs B2 !: B3_from_B1: - // (byte) s#4 = (byte) s#2 // register copy + // (byte) s#4 = (byte) s#2 // register copy zp byte:3 jmp B3 B3: // [3] (byte) i#1 ← -- (byte) i#2 [ i#1 s#4 ] // zpby1=_dec_zpby1 @@ -412,7 +412,7 @@ B2: adc 2 sta 3 B3_from_B2: - // (byte) s#4 = (byte) s#1 // register copy + // (byte) s#4 = (byte) s#1 // register copy zp byte:3 jmp B3 Removing instruction jmp B1 @@ -430,8 +430,8 @@ B1_from_BBEGIN: sta 2 jmp B1 B1_from_B3: - // (byte) s#2 = (byte) s#4 // register copy - // (byte) i#2 = (byte) i#1 // register copy + // (byte) s#2 = (byte) s#4 // register copy zp byte:3 + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 B1: // [1] if((byte) i#2>(byte) 5) goto @2 [ i#2 s#2 ] // zpby1_gt_coby1_then_la1 lda 2 @@ -440,7 +440,7 @@ B1: bcs B2 !: B3_from_B1: - // (byte) s#4 = (byte) s#2 // register copy + // (byte) s#4 = (byte) s#2 // register copy zp byte:3 B3: // [3] (byte) i#1 ← -- (byte) i#2 [ i#1 s#4 ] // zpby1=_dec_zpby1 dec 2 @@ -455,7 +455,7 @@ B2: adc 2 sta 3 B3_from_B2: - // (byte) s#4 = (byte) s#1 // register copy + // (byte) s#4 = (byte) s#1 // register copy zp byte:3 jmp B3 Removing instruction jmp B1 @@ -470,8 +470,8 @@ B1_from_BBEGIN: lda #10 sta 2 B1_from_B3: - // (byte) s#2 = (byte) s#4 // register copy - // (byte) i#2 = (byte) i#1 // register copy + // (byte) s#2 = (byte) s#4 // register copy zp byte:3 + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 B1: // [1] if((byte) i#2>(byte) 5) goto @2 [ i#2 s#2 ] // zpby1_gt_coby1_then_la1 lda 2 @@ -480,7 +480,7 @@ B1: bcs B2 !: B3_from_B1: - // (byte) s#4 = (byte) s#2 // register copy + // (byte) s#4 = (byte) s#2 // register copy zp byte:3 B3: // [3] (byte) i#1 ← -- (byte) i#2 [ i#1 s#4 ] // zpby1=_dec_zpby1 dec 2 @@ -495,7 +495,7 @@ B2: adc 2 sta 3 B3_from_B2: - // (byte) s#4 = (byte) s#1 // register copy + // (byte) s#4 = (byte) s#1 // register copy zp byte:3 jmp B3 FINAL SYMBOL TABLE @@ -525,8 +525,8 @@ B1_from_BBEGIN: lda #10 sta 2 B1_from_B3: - // (byte) s#2 = (byte) s#4 // register copy - // (byte) i#2 = (byte) i#1 // register copy + // (byte) s#2 = (byte) s#4 // register copy zp byte:3 + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 B1: // [1] if((byte) i#2>(byte) 5) goto @2 [ i#2 s#2 ] // zpby1_gt_coby1_then_la1 lda 2 @@ -535,7 +535,7 @@ B1: bcs B2 !: B3_from_B1: - // (byte) s#4 = (byte) s#2 // register copy + // (byte) s#4 = (byte) s#2 // register copy zp byte:3 B3: // [3] (byte) i#1 ← -- (byte) i#2 [ i#1 s#4 ] // zpby1=_dec_zpby1 dec 2 @@ -550,6 +550,6 @@ B2: adc 2 sta 3 B3_from_B2: - // (byte) s#4 = (byte) s#1 // register copy + // (byte) s#4 = (byte) s#1 // register copy zp byte:3 jmp B3 diff --git a/src/dk/camelot64/kickc/test/ref/loopnest.log b/src/dk/camelot64/kickc/test/ref/loopnest.log index 6d4f43e56..48e9debe7 100644 --- a/src/dk/camelot64/kickc/test/ref/loopnest.log +++ b/src/dk/camelot64/kickc/test/ref/loopnest.log @@ -735,7 +735,7 @@ main__B1_from_main: sta 2 jmp main__B1 main__B1_from_B3: - // (byte) main::i#2 = (byte) main::i#1 // register copy + // (byte) main::i#2 = (byte) main::i#1 // register copy zp byte:2 jmp main__B1 main__B1: jsr nest @@ -756,7 +756,7 @@ nest__B1_from_nest: sta 3 jmp nest__B1 nest__B1_from_B1: - // (byte) nest::j#2 = (byte) nest::j#1 // register copy + // (byte) nest::j#2 = (byte) nest::j#1 // register copy zp byte:3 jmp nest__B1 nest__B1: // [7] *((word) 1024) ← (byte) nest::j#2 [ main::i#2 nest::j#2 ] // coptr1=zpby1 @@ -789,7 +789,7 @@ main__B1_from_main: sta 2 jmp main__B1 main__B1_from_B3: - // (byte) main::i#2 = (byte) main::i#1 // register copy + // (byte) main::i#2 = (byte) main::i#1 // register copy zp byte:2 main__B1: jsr nest main__B3: @@ -807,7 +807,7 @@ nest__B1_from_nest: sta 3 jmp nest__B1 nest__B1_from_B1: - // (byte) nest::j#2 = (byte) nest::j#1 // register copy + // (byte) nest::j#2 = (byte) nest::j#1 // register copy zp byte:3 nest__B1: // [7] *((word) 1024) ← (byte) nest::j#2 [ main::i#2 nest::j#2 ] // coptr1=zpby1 lda 3 @@ -833,7 +833,7 @@ main__B1_from_main: lda #100 sta 2 main__B1_from_B3: - // (byte) main::i#2 = (byte) main::i#1 // register copy + // (byte) main::i#2 = (byte) main::i#1 // register copy zp byte:2 main__B1: jsr nest main__B3: @@ -850,7 +850,7 @@ nest__B1_from_nest: lda #100 sta 3 nest__B1_from_B1: - // (byte) nest::j#2 = (byte) nest::j#1 // register copy + // (byte) nest::j#2 = (byte) nest::j#1 // register copy zp byte:3 nest__B1: // [7] *((word) 1024) ← (byte) nest::j#2 [ main::i#2 nest::j#2 ] // coptr1=zpby1 lda 3 @@ -896,7 +896,7 @@ main__B1_from_main: lda #100 sta 2 main__B1_from_B3: - // (byte) main::i#2 = (byte) main::i#1 // register copy + // (byte) main::i#2 = (byte) main::i#1 // register copy zp byte:2 main__B1: jsr nest main__B3: @@ -913,7 +913,7 @@ nest__B1_from_nest: lda #100 sta 3 nest__B1_from_B1: - // (byte) nest::j#2 = (byte) nest::j#1 // register copy + // (byte) nest::j#2 = (byte) nest::j#1 // register copy zp byte:3 nest__B1: // [7] *((word) 1024) ← (byte) nest::j#2 [ main::i#2 nest::j#2 ] // coptr1=zpby1 lda 3 diff --git a/src/dk/camelot64/kickc/test/ref/loopnest2.log b/src/dk/camelot64/kickc/test/ref/loopnest2.log index 7e321c8ad..60c0a464b 100644 --- a/src/dk/camelot64/kickc/test/ref/loopnest2.log +++ b/src/dk/camelot64/kickc/test/ref/loopnest2.log @@ -1838,7 +1838,7 @@ main__B1_from_main: sta 2 jmp main__B1 main__B1_from_B3: - // (byte) main::i#2 = (byte) main::i#1 // register copy + // (byte) main::i#2 = (byte) main::i#1 // register copy zp byte:2 jmp main__B1 main__B1: main__B2_from_B1: @@ -1847,7 +1847,7 @@ main__B2_from_B1: sta 3 jmp main__B2 main__B2_from_B5: - // (byte) main::j#2 = (byte) main::j#1 // register copy + // (byte) main::j#2 = (byte) main::j#1 // register copy zp byte:3 jmp main__B2 main__B2: jsr nest1 @@ -1875,7 +1875,7 @@ nest1__B1_from_nest1: sta 4 jmp nest1__B1 nest1__B1_from_B3: - // (byte) nest1::i#2 = (byte) nest1::i#1 // register copy + // (byte) nest1::i#2 = (byte) nest1::i#1 // register copy zp byte:4 jmp nest1__B1 nest1__B1: nest1__B2_from_B1: @@ -1884,7 +1884,7 @@ nest1__B2_from_B1: sta 5 jmp nest1__B2 nest1__B2_from_B5: - // (byte) nest1::j#2 = (byte) nest1::j#1 // register copy + // (byte) nest1::j#2 = (byte) nest1::j#1 // register copy zp byte:5 jmp nest1__B2 nest1__B2: jsr nest2 @@ -1912,7 +1912,7 @@ nest2__B1_from_nest2: sta 6 jmp nest2__B1 nest2__B1_from_B3: - // (byte) nest2::i#2 = (byte) nest2::i#1 // register copy + // (byte) nest2::i#2 = (byte) nest2::i#1 // register copy zp byte:6 jmp nest2__B1 nest2__B1: nest2__B2_from_B1: @@ -1921,7 +1921,7 @@ nest2__B2_from_B1: sta 7 jmp nest2__B2 nest2__B2_from_B2: - // (byte) nest2::j#2 = (byte) nest2::j#1 // register copy + // (byte) nest2::j#2 = (byte) nest2::j#1 // register copy zp byte:7 jmp nest2__B2 nest2__B2: // [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 ] // coptr1=zpby1 @@ -1970,7 +1970,7 @@ main__B1_from_main: sta 2 jmp main__B1 main__B1_from_B3: - // (byte) main::i#2 = (byte) main::i#1 // register copy + // (byte) main::i#2 = (byte) main::i#1 // register copy zp byte:2 main__B1: main__B2_from_B1: // (byte) main::j#2 = (byte) 100 // zpby1=coby1 @@ -1978,7 +1978,7 @@ main__B2_from_B1: sta 3 jmp main__B2 main__B2_from_B5: - // (byte) main::j#2 = (byte) main::j#1 // register copy + // (byte) main::j#2 = (byte) main::j#1 // register copy zp byte:3 main__B2: jsr nest1 main__B5: @@ -2002,7 +2002,7 @@ nest1__B1_from_nest1: sta 4 jmp nest1__B1 nest1__B1_from_B3: - // (byte) nest1::i#2 = (byte) nest1::i#1 // register copy + // (byte) nest1::i#2 = (byte) nest1::i#1 // register copy zp byte:4 nest1__B1: nest1__B2_from_B1: // (byte) nest1::j#2 = (byte) 100 // zpby1=coby1 @@ -2010,7 +2010,7 @@ nest1__B2_from_B1: sta 5 jmp nest1__B2 nest1__B2_from_B5: - // (byte) nest1::j#2 = (byte) nest1::j#1 // register copy + // (byte) nest1::j#2 = (byte) nest1::j#1 // register copy zp byte:5 nest1__B2: jsr nest2 nest1__B5: @@ -2034,7 +2034,7 @@ nest2__B1_from_nest2: sta 6 jmp nest2__B1 nest2__B1_from_B3: - // (byte) nest2::i#2 = (byte) nest2::i#1 // register copy + // (byte) nest2::i#2 = (byte) nest2::i#1 // register copy zp byte:6 nest2__B1: nest2__B2_from_B1: // (byte) nest2::j#2 = (byte) 100 // zpby1=coby1 @@ -2042,7 +2042,7 @@ nest2__B2_from_B1: sta 7 jmp nest2__B2 nest2__B2_from_B2: - // (byte) nest2::j#2 = (byte) nest2::j#1 // register copy + // (byte) nest2::j#2 = (byte) nest2::j#1 // register copy zp byte:7 nest2__B2: // [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 ] // coptr1=zpby1 lda 7 @@ -2078,14 +2078,14 @@ main__B1_from_main: lda #100 sta 2 main__B1_from_B3: - // (byte) main::i#2 = (byte) main::i#1 // register copy + // (byte) main::i#2 = (byte) main::i#1 // register copy zp byte:2 main__B1: main__B2_from_B1: // (byte) main::j#2 = (byte) 100 // zpby1=coby1 lda #100 sta 3 main__B2_from_B5: - // (byte) main::j#2 = (byte) main::j#1 // register copy + // (byte) main::j#2 = (byte) main::j#1 // register copy zp byte:3 main__B2: jsr nest1 main__B5: @@ -2108,14 +2108,14 @@ nest1__B1_from_nest1: lda #100 sta 4 nest1__B1_from_B3: - // (byte) nest1::i#2 = (byte) nest1::i#1 // register copy + // (byte) nest1::i#2 = (byte) nest1::i#1 // register copy zp byte:4 nest1__B1: nest1__B2_from_B1: // (byte) nest1::j#2 = (byte) 100 // zpby1=coby1 lda #100 sta 5 nest1__B2_from_B5: - // (byte) nest1::j#2 = (byte) nest1::j#1 // register copy + // (byte) nest1::j#2 = (byte) nest1::j#1 // register copy zp byte:5 nest1__B2: jsr nest2 nest1__B5: @@ -2138,14 +2138,14 @@ nest2__B1_from_nest2: lda #100 sta 6 nest2__B1_from_B3: - // (byte) nest2::i#2 = (byte) nest2::i#1 // register copy + // (byte) nest2::i#2 = (byte) nest2::i#1 // register copy zp byte:6 nest2__B1: nest2__B2_from_B1: // (byte) nest2::j#2 = (byte) 100 // zpby1=coby1 lda #100 sta 7 nest2__B2_from_B2: - // (byte) nest2::j#2 = (byte) nest2::j#1 // register copy + // (byte) nest2::j#2 = (byte) nest2::j#1 // register copy zp byte:7 nest2__B2: // [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 ] // coptr1=zpby1 lda 7 @@ -2224,14 +2224,14 @@ main__B1_from_main: lda #100 sta 2 main__B1_from_B3: - // (byte) main::i#2 = (byte) main::i#1 // register copy + // (byte) main::i#2 = (byte) main::i#1 // register copy zp byte:2 main__B1: main__B2_from_B1: // (byte) main::j#2 = (byte) 100 // zpby1=coby1 lda #100 sta 3 main__B2_from_B5: - // (byte) main::j#2 = (byte) main::j#1 // register copy + // (byte) main::j#2 = (byte) main::j#1 // register copy zp byte:3 main__B2: jsr nest1 main__B5: @@ -2254,14 +2254,14 @@ nest1__B1_from_nest1: lda #100 sta 4 nest1__B1_from_B3: - // (byte) nest1::i#2 = (byte) nest1::i#1 // register copy + // (byte) nest1::i#2 = (byte) nest1::i#1 // register copy zp byte:4 nest1__B1: nest1__B2_from_B1: // (byte) nest1::j#2 = (byte) 100 // zpby1=coby1 lda #100 sta 5 nest1__B2_from_B5: - // (byte) nest1::j#2 = (byte) nest1::j#1 // register copy + // (byte) nest1::j#2 = (byte) nest1::j#1 // register copy zp byte:5 nest1__B2: jsr nest2 nest1__B5: @@ -2284,14 +2284,14 @@ nest2__B1_from_nest2: lda #100 sta 6 nest2__B1_from_B3: - // (byte) nest2::i#2 = (byte) nest2::i#1 // register copy + // (byte) nest2::i#2 = (byte) nest2::i#1 // register copy zp byte:6 nest2__B1: nest2__B2_from_B1: // (byte) nest2::j#2 = (byte) 100 // zpby1=coby1 lda #100 sta 7 nest2__B2_from_B2: - // (byte) nest2::j#2 = (byte) nest2::j#1 // register copy + // (byte) nest2::j#2 = (byte) nest2::j#1 // register copy zp byte:7 nest2__B2: // [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 ] // coptr1=zpby1 lda 7 diff --git a/src/dk/camelot64/kickc/test/ref/loopsplit.log b/src/dk/camelot64/kickc/test/ref/loopsplit.log index a534cd8d6..f2ae74b04 100644 --- a/src/dk/camelot64/kickc/test/ref/loopsplit.log +++ b/src/dk/camelot64/kickc/test/ref/loopsplit.log @@ -427,15 +427,15 @@ B5: // [4] (byte) s#2 ← -- (byte) s#3 [ i#1 s#2 ] // zpby1=_dec_zpby1 dec 3 B1_from_B5: - // (byte) s#3 = (byte) s#2 // register copy - // (byte) i#2 = (byte) i#1 // register copy + // (byte) s#3 = (byte) s#2 // register copy zp byte:3 + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 jmp B1 B4: // [5] (byte) s#1 ← ++ (byte) s#3 [ i#1 s#1 ] // zpby1=_inc_zpby1 inc 3 B1_from_B4: - // (byte) s#3 = (byte) s#1 // register copy - // (byte) i#2 = (byte) i#1 // register copy + // (byte) s#3 = (byte) s#1 // register copy zp byte:3 + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 jmp B1 Removing instruction jmp B1 @@ -469,15 +469,15 @@ B5: // [4] (byte) s#2 ← -- (byte) s#3 [ i#1 s#2 ] // zpby1=_dec_zpby1 dec 3 B1_from_B5: - // (byte) s#3 = (byte) s#2 // register copy - // (byte) i#2 = (byte) i#1 // register copy + // (byte) s#3 = (byte) s#2 // register copy zp byte:3 + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 jmp B1 B4: // [5] (byte) s#1 ← ++ (byte) s#3 [ i#1 s#1 ] // zpby1=_inc_zpby1 inc 3 B1_from_B4: - // (byte) s#3 = (byte) s#1 // register copy - // (byte) i#2 = (byte) i#1 // register copy + // (byte) s#3 = (byte) s#1 // register copy zp byte:3 + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 jmp B1 Removing instruction bne B2 @@ -508,15 +508,15 @@ B5: // [4] (byte) s#2 ← -- (byte) s#3 [ i#1 s#2 ] // zpby1=_dec_zpby1 dec 3 B1_from_B5: - // (byte) s#3 = (byte) s#2 // register copy - // (byte) i#2 = (byte) i#1 // register copy + // (byte) s#3 = (byte) s#2 // register copy zp byte:3 + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 jmp B1 B4: // [5] (byte) s#1 ← ++ (byte) s#3 [ i#1 s#1 ] // zpby1=_inc_zpby1 inc 3 B1_from_B4: - // (byte) s#3 = (byte) s#1 // register copy - // (byte) i#2 = (byte) i#1 // register copy + // (byte) s#3 = (byte) s#1 // register copy zp byte:3 + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 jmp B1 FINAL SYMBOL TABLE @@ -563,14 +563,14 @@ B5: // [4] (byte) s#2 ← -- (byte) s#3 [ i#1 s#2 ] // zpby1=_dec_zpby1 dec 3 B1_from_B5: - // (byte) s#3 = (byte) s#2 // register copy - // (byte) i#2 = (byte) i#1 // register copy + // (byte) s#3 = (byte) s#2 // register copy zp byte:3 + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 jmp B1 B4: // [5] (byte) s#1 ← ++ (byte) s#3 [ i#1 s#1 ] // zpby1=_inc_zpby1 inc 3 B1_from_B4: - // (byte) s#3 = (byte) s#1 // register copy - // (byte) i#2 = (byte) i#1 // register copy + // (byte) s#3 = (byte) s#1 // register copy zp byte:3 + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 jmp B1 diff --git a/src/dk/camelot64/kickc/test/ref/minus.log b/src/dk/camelot64/kickc/test/ref/minus.log index fcda3d38e..ca8a295b5 100644 --- a/src/dk/camelot64/kickc/test/ref/minus.log +++ b/src/dk/camelot64/kickc/test/ref/minus.log @@ -301,7 +301,7 @@ B1_from_BBEGIN: sta 2 jmp B1 B1_from_B1: - // (byte) i#2 = (byte) i#1 // register copy + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 jmp B1 B1: // [1] (byte~) $0 ← (byte) 2 + (byte) i#2 [ i#2 $0 ] // zpby1=coby1_plus_zpby2 @@ -338,7 +338,7 @@ B1_from_BBEGIN: sta 2 jmp B1 B1_from_B1: - // (byte) i#2 = (byte) i#1 // register copy + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 B1: // [1] (byte~) $0 ← (byte) 2 + (byte) i#2 [ i#2 $0 ] // zpby1=coby1_plus_zpby2 lda #2 @@ -371,7 +371,7 @@ B1_from_BBEGIN: lda #5 sta 2 B1_from_B1: - // (byte) i#2 = (byte) i#1 // register copy + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 B1: // [1] (byte~) $0 ← (byte) 2 + (byte) i#2 [ i#2 $0 ] // zpby1=coby1_plus_zpby2 lda #2 @@ -416,7 +416,7 @@ B1_from_BBEGIN: lda #5 sta 2 B1_from_B1: - // (byte) i#2 = (byte) i#1 // register copy + // (byte) i#2 = (byte) i#1 // register copy zp byte:2 B1: // [1] (byte~) $0 ← (byte) 2 + (byte) i#2 [ i#2 $0 ] // zpby1=coby1_plus_zpby2 lda #2 diff --git a/src/dk/camelot64/kickc/test/ref/summin.asm b/src/dk/camelot64/kickc/test/ref/summin.asm index 5050eaea2..4cfbffacf 100644 --- a/src/dk/camelot64/kickc/test/ref/summin.asm +++ b/src/dk/camelot64/kickc/test/ref/summin.asm @@ -6,12 +6,19 @@ sum_from_BBEGIN: sta 2 jsr sum B2: + lda 2 + sta 4 sum_from_B2: lda #13 sta 3 lda #9 sta 2 jsr sum +B3: + lda 4 + clc + adc 2 + sta 4 BEND: sum: lda 2 diff --git a/src/dk/camelot64/kickc/test/ref/summin.cfg b/src/dk/camelot64/kickc/test/ref/summin.cfg index 9ef1b4012..30b408fa7 100644 --- a/src/dk/camelot64/kickc/test/ref/summin.cfg +++ b/src/dk/camelot64/kickc/test/ref/summin.cfg @@ -1,15 +1,20 @@ @BEGIN: from - [0] call sum param-assignment [ ] + [0] call sum param-assignment [ sum::return#0 s1#0 ] to:@2 @2: from @BEGIN - [1] call sum param-assignment [ ] + [1] (byte) s1#0 ← (byte) sum::return#0 [ sum::return#0 s1#0 ] + [2] call sum param-assignment [ sum::return#0 s1#0 ] + to:@3 +@3: from @2 + [3] (byte) s2#0 ← (byte) sum::return#0 [ s1#0 s2#0 ] + [4] (byte) s3#0 ← (byte) s1#0 + (byte) s2#0 [ ] to:@END -@END: from @2 +@END: from @3 sum: from @2 @BEGIN - [2] (byte) sum::b#2 ← phi( @2/(byte) 13 @BEGIN/(byte) 2 ) [ sum::a#2 sum::b#2 ] - [2] (byte) sum::a#2 ← phi( @2/(byte) 9 @BEGIN/(byte) 1 ) [ sum::a#2 sum::b#2 ] - [3] (byte) s1#0 ← (byte) sum::a#2 + (byte) sum::b#2 [ s1#0 ] + [5] (byte) sum::b#2 ← phi( @2/(byte) 13 @BEGIN/(byte) 2 ) [ s1#0 sum::a#2 sum::b#2 ] + [5] (byte) sum::a#2 ← phi( @2/(byte) 9 @BEGIN/(byte) 1 ) [ s1#0 sum::a#2 sum::b#2 ] + [6] (byte) sum::return#0 ← (byte) sum::a#2 + (byte) sum::b#2 [ sum::return#0 s1#0 ] to:sum::@return sum::@return: from sum - [4] return (byte) s1#0 [ ] + [7] return [ sum::return#0 s1#0 ] to:@RETURN diff --git a/src/dk/camelot64/kickc/test/ref/summin.log b/src/dk/camelot64/kickc/test/ref/summin.log index f2bddb512..1686ca0c9 100644 --- a/src/dk/camelot64/kickc/test/ref/summin.log +++ b/src/dk/camelot64/kickc/test/ref/summin.log @@ -1,5 +1,6 @@ byte s1=sum(1,2); byte s2=sum(9,13); +byte s3=s1+s2; byte sum(byte a, byte b) { return a+b; } @@ -9,6 +10,8 @@ PROGRAM (byte) s1 ← (byte~) $0 (byte~) $1 ← call sum (byte) 9 (byte) 13 (byte) s2 ← (byte~) $1 + (byte~) $2 ← (byte) s1 + (byte) s2 + (byte) s3 ← (byte~) $2 proc (byte()) sum((byte) sum::a , (byte) sum::b) (byte~) sum::$0 ← (byte) sum::a + (byte) sum::b (byte) sum::return ← (byte~) sum::$0 @@ -21,8 +24,10 @@ sum::@return: SYMBOLS (byte~) $0 (byte~) $1 +(byte~) $2 (byte) s1 (byte) s2 +(byte) s3 (byte()) sum((byte) sum::a , (byte) sum::b) (byte~) sum::$0 (label) sum::@return @@ -37,6 +42,8 @@ INITIAL CONTROL FLOW GRAPH (byte) s1 ← (byte~) $0 (byte~) $1 ← call sum (byte) 9 (byte) 13 (byte) s2 ← (byte~) $1 + (byte~) $2 ← (byte) s1 + (byte) s2 + (byte) s3 ← (byte~) $2 to:@1 sum: from (byte~) sum::$0 ← (byte) sum::a + (byte) sum::b @@ -60,6 +67,8 @@ CONTROL FLOW GRAPH (byte) s1 ← (byte~) $0 (byte~) $1 ← call sum (byte) 9 (byte) 13 (byte) s2 ← (byte~) $1 + (byte~) $2 ← (byte) s1 + (byte) s2 + (byte) s3 ← (byte~) $2 to:@END sum: from (byte~) sum::$0 ← (byte) sum::a + (byte) sum::b @@ -87,6 +96,8 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL @3: from @2 (byte~) $1 ← (byte) sum::return (byte) s2 ← (byte~) $1 + (byte~) $2 ← (byte) s1 + (byte) s2 + (byte) s3 ← (byte~) $2 to:@END sum: from @2 @BEGIN (byte~) sum::$0 ← (byte) sum::a + (byte) sum::b @@ -114,9 +125,12 @@ CONTROL FLOW GRAPH SSA (byte) sum::return#1 ← call sum param-assignment to:@3 @3: from @2 + (byte) s1#1 ← phi( @2/(byte) s1#0 ) (byte) sum::return#5 ← phi( @2/(byte) sum::return#1 ) (byte~) $1 ← (byte) sum::return#5 (byte) s2#0 ← (byte~) $1 + (byte~) $2 ← (byte) s1#1 + (byte) s2#0 + (byte) s3#0 ← (byte~) $2 to:@END sum: from @2 @BEGIN (byte) sum::b#2 ← phi( @2/(byte) sum::b#1 @BEGIN/(byte) sum::b#0 ) @@ -148,9 +162,12 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN (byte) sum::return#1 ← (byte) sum::return#3 to:@3 @3: from @2 + (byte) s1#1 ← phi( @2/(byte) s1#0 ) (byte) sum::return#5 ← phi( @2/(byte) sum::return#1 ) (byte~) $1 ← (byte) sum::return#5 (byte) s2#0 ← (byte~) $1 + (byte~) $2 ← (byte) s1#1 + (byte) s2#0 + (byte) s3#0 ← (byte~) $2 to:@END sum: from @2 @BEGIN (byte) sum::b#2 ← phi( @2/(byte) sum::b#1 @BEGIN/(byte) sum::b#0 ) @@ -161,7 +178,7 @@ sum: from @2 @BEGIN sum::@return: from sum (byte) sum::return#6 ← phi( sum/(byte) sum::return#2 ) (byte) sum::return#3 ← (byte) sum::return#6 - return (byte) sum::return#3 + return to:@RETURN @END: from @3 @@ -183,9 +200,12 @@ CONTROL FLOW GRAPH (byte) sum::return#1 ← (byte) sum::return#3 to:@3 @3: from @2 + (byte) s1#1 ← phi( @2/(byte) s1#0 ) (byte) sum::return#5 ← phi( @2/(byte) sum::return#1 ) (byte~) $1 ← (byte) sum::return#5 (byte) s2#0 ← (byte~) $1 + (byte~) $2 ← (byte) s1#1 + (byte) s2#0 + (byte) s3#0 ← (byte~) $2 to:@END sum: from @2 @BEGIN (byte) sum::b#2 ← phi( @2/(byte) 13 @BEGIN/(byte) 2 ) @@ -196,115 +216,132 @@ sum: from @2 @BEGIN sum::@return: from sum (byte) sum::return#6 ← phi( sum/(byte) sum::return#2 ) (byte) sum::return#3 ← (byte) sum::return#6 - return (byte) sum::return#3 + return to:@RETURN @END: from @3 -Alias (byte) s1#0 = (byte) sum::return#0 (byte) sum::return#3 (byte) sum::return#4 (byte~) $0 (byte) sum::return#1 (byte) sum::return#5 (byte~) $1 (byte) s2#0 (byte) sum::return#2 (byte~) sum::$0 (byte) sum::return#6 +Not aliassing across scopes: $0 sum::return#4 +Not aliassing across scopes: $1 sum::return#5 +Alias (byte) sum::return#0 = (byte) sum::return#3 (byte) sum::return#4 (byte) sum::return#1 (byte) sum::return#5 (byte) sum::return#2 (byte~) sum::$0 (byte) sum::return#6 +Alias (byte) s1#0 = (byte~) $0 (byte) s1#1 +Alias (byte) s2#0 = (byte~) $1 +Alias (byte) s3#0 = (byte~) $2 Succesful SSA optimization Pass2AliasElimination CONTROL FLOW GRAPH @BEGIN: from call sum param-assignment to:@2 @2: from @BEGIN + (byte) s1#0 ← (byte) sum::return#0 call sum param-assignment to:@3 @3: from @2 + (byte) s2#0 ← (byte) sum::return#0 + (byte) s3#0 ← (byte) s1#0 + (byte) s2#0 to:@END sum: from @2 @BEGIN (byte) sum::b#2 ← phi( @2/(byte) 13 @BEGIN/(byte) 2 ) (byte) sum::a#2 ← phi( @2/(byte) 9 @BEGIN/(byte) 1 ) - (byte) s1#0 ← (byte) sum::a#2 + (byte) sum::b#2 + (byte) sum::return#0 ← (byte) sum::a#2 + (byte) sum::b#2 to:sum::@return sum::@return: from sum - return (byte) s1#0 + return to:@RETURN @END: from @3 -Culled Empty Block (label) @3 -Succesful SSA optimization Pass2CullEmptyBlocks -CONTROL FLOW GRAPH -@BEGIN: from - call sum param-assignment - to:@2 -@2: from @BEGIN - call sum param-assignment - to:@END -sum: from @2 @BEGIN - (byte) sum::b#2 ← phi( @2/(byte) 13 @BEGIN/(byte) 2 ) - (byte) sum::a#2 ← phi( @2/(byte) 9 @BEGIN/(byte) 1 ) - (byte) s1#0 ← (byte) sum::a#2 + (byte) sum::b#2 - to:sum::@return -sum::@return: from sum - return (byte) s1#0 - to:@RETURN -@END: from @2 - -Block Sequence Planned @BEGIN @2 @END sum sum::@return -Block Sequence Planned @BEGIN @2 @END sum sum::@return +Not aliassing across scopes: s1#0 sum::return#0 +Not aliassing across scopes: s2#0 sum::return#0 +Block Sequence Planned @BEGIN @2 @3 @END sum sum::@return +Block Sequence Planned @BEGIN @2 @3 @END sum sum::@return CONTROL FLOW GRAPH - PHI LIFTED @BEGIN: from call sum param-assignment to:@2 @2: from @BEGIN + (byte) s1#0 ← (byte) sum::return#0 call sum param-assignment + to:@3 +@3: from @2 + (byte) s2#0 ← (byte) sum::return#0 + (byte) s3#0 ← (byte) s1#0 + (byte) s2#0 to:@END -@END: from @2 +@END: from @3 sum: from @2 @BEGIN (byte) sum::b#2 ← phi( @2/(byte) 13 @BEGIN/(byte) 2 ) (byte) sum::a#2 ← phi( @2/(byte) 9 @BEGIN/(byte) 1 ) - (byte) s1#0 ← (byte) sum::a#2 + (byte) sum::b#2 + (byte) sum::return#0 ← (byte) sum::a#2 + (byte) sum::b#2 to:sum::@return sum::@return: from sum - return (byte) s1#0 + return to:@RETURN +Adding empty live range for unused variable s3#0 +Propagating live ranges... +Propagating live ranges... +Propagating live ranges... +Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - LIVE RANGES @BEGIN: from - [0] call sum param-assignment [ ] + [0] call sum param-assignment [ sum::return#0 s1#0 ] to:@2 @2: from @BEGIN - [1] call sum param-assignment [ ] + [1] (byte) s1#0 ← (byte) sum::return#0 [ sum::return#0 s1#0 ] + [2] call sum param-assignment [ sum::return#0 s1#0 ] + to:@3 +@3: from @2 + [3] (byte) s2#0 ← (byte) sum::return#0 [ s1#0 s2#0 ] + [4] (byte) s3#0 ← (byte) s1#0 + (byte) s2#0 [ ] to:@END -@END: from @2 +@END: from @3 sum: from @2 @BEGIN - [2] (byte) sum::b#2 ← phi( @2/(byte) 13 @BEGIN/(byte) 2 ) [ sum::a#2 sum::b#2 ] - [2] (byte) sum::a#2 ← phi( @2/(byte) 9 @BEGIN/(byte) 1 ) [ sum::a#2 sum::b#2 ] - [3] (byte) s1#0 ← (byte) sum::a#2 + (byte) sum::b#2 [ s1#0 ] + [5] (byte) sum::b#2 ← phi( @2/(byte) 13 @BEGIN/(byte) 2 ) [ s1#0 sum::a#2 sum::b#2 ] + [5] (byte) sum::a#2 ← phi( @2/(byte) 9 @BEGIN/(byte) 1 ) [ s1#0 sum::a#2 sum::b#2 ] + [6] (byte) sum::return#0 ← (byte) sum::a#2 + (byte) sum::b#2 [ sum::return#0 s1#0 ] to:sum::@return sum::@return: from sum - [4] return (byte) s1#0 [ ] + [7] return [ sum::return#0 s1#0 ] to:@RETURN Created 2 initial phi equivalence classes Coalesced down to 2 phi equivalence classes -Block Sequence Planned @BEGIN @2 @END sum sum::@return +Block Sequence Planned @BEGIN @2 @3 @END sum sum::@return +Adding empty live range for unused variable s3#0 +Propagating live ranges... +Propagating live ranges... +Propagating live ranges... +Propagating live ranges... Propagating live ranges... CONTROL FLOW GRAPH - PHI MEM COALESCED @BEGIN: from - [0] call sum param-assignment [ ] + [0] call sum param-assignment [ sum::return#0 s1#0 ] to:@2 @2: from @BEGIN - [1] call sum param-assignment [ ] + [1] (byte) s1#0 ← (byte) sum::return#0 [ sum::return#0 s1#0 ] + [2] call sum param-assignment [ sum::return#0 s1#0 ] + to:@3 +@3: from @2 + [3] (byte) s2#0 ← (byte) sum::return#0 [ s1#0 s2#0 ] + [4] (byte) s3#0 ← (byte) s1#0 + (byte) s2#0 [ ] to:@END -@END: from @2 +@END: from @3 sum: from @2 @BEGIN - [2] (byte) sum::b#2 ← phi( @2/(byte) 13 @BEGIN/(byte) 2 ) [ sum::a#2 sum::b#2 ] - [2] (byte) sum::a#2 ← phi( @2/(byte) 9 @BEGIN/(byte) 1 ) [ sum::a#2 sum::b#2 ] - [3] (byte) s1#0 ← (byte) sum::a#2 + (byte) sum::b#2 [ s1#0 ] + [5] (byte) sum::b#2 ← phi( @2/(byte) 13 @BEGIN/(byte) 2 ) [ s1#0 sum::a#2 sum::b#2 ] + [5] (byte) sum::a#2 ← phi( @2/(byte) 9 @BEGIN/(byte) 1 ) [ s1#0 sum::a#2 sum::b#2 ] + [6] (byte) sum::return#0 ← (byte) sum::a#2 + (byte) sum::b#2 [ sum::return#0 s1#0 ] to:sum::@return sum::@return: from sum - [4] return (byte) s1#0 [ ] + [7] return [ sum::return#0 s1#0 ] to:@RETURN CALL GRAPH -Calls in [] to 0:sum 1:sum +Calls in [] to 0:sum 2:sum DOMINATORS @BEGIN dominated by @BEGIN @2 dominated by @BEGIN @2 -@END dominated by @BEGIN @2 @END +@3 dominated by @BEGIN @2 @3 +@END dominated by @BEGIN @2 @3 @END sum dominated by @BEGIN sum sum::@return dominated by @BEGIN sum::@return sum @@ -320,14 +357,23 @@ Initial phi equivalence classes Copy Coalesced equivalence classes [ sum::a#2 ] [ sum::b#2 ] -Added variable s1#0 to zero page equivalence class [ sum::a#2 s1#0 ] +Added variable s1#0 to zero page equivalence class [ s1#0 ] +Added variable s2#0 to zero page equivalence class [ s2#0 ] +Added variable s3#0 to zero page equivalence class [ s1#0 s3#0 ] +Added variable sum::return#0 to zero page equivalence class [ sum::a#2 sum::return#0 ] Complete equivalence classes -[ sum::a#2 s1#0 ] +[ sum::a#2 sum::return#0 ] [ sum::b#2 ] -Allocated zp byte:2 to zp byte:2 [ sum::a#2 s1#0 ] +[ s1#0 s3#0 ] +[ s2#0 ] +Allocated zp byte:2 to zp byte:2 [ sum::a#2 sum::return#0 ] Allocated zp byte:3 to zp byte:3 [ sum::b#2 ] +Allocated zp byte:4 to zp byte:4 [ s1#0 s3#0 ] +Allocated zp byte:5 to zp byte:5 [ s2#0 ] +Coalescing zero page register [ zp byte:2 [ sum::a#2 sum::return#0 ] ] with [ zp byte:5 [ s2#0 ] ] Re-allocated ZP register from zp byte:2 to zp byte:2 Re-allocated ZP register from zp byte:3 to zp byte:3 +Re-allocated ZP register from zp byte:4 to zp byte:4 INITIAL ASM BBEGIN: sum_from_BBEGIN: @@ -340,6 +386,9 @@ sum_from_BBEGIN: jsr sum jmp B2 B2: + // [1] (byte) s1#0 ← (byte) sum::return#0 [ sum::return#0 s1#0 ] // zpby1=zpby2 + lda 2 + sta 4 sum_from_B2: // (byte) sum::b#2 = (byte) 13 // zpby1=coby1 lda #13 @@ -348,10 +397,18 @@ sum_from_B2: lda #9 sta 2 jsr sum + jmp B3 +B3: + // (byte) s2#0 = (byte) sum::return#0 // register copy zp byte:2 + // [4] (byte) s3#0 ← (byte) s1#0 + (byte) s2#0 [ ] // zpby1=zpby1_plus_zpby2 + lda 4 + clc + adc 2 + sta 4 jmp BEND BEND: sum: - // [3] (byte) s1#0 ← (byte) sum::a#2 + (byte) sum::b#2 [ s1#0 ] // zpby1=zpby1_plus_zpby2 + // [6] (byte) sum::return#0 ← (byte) sum::a#2 + (byte) sum::b#2 [ sum::return#0 s1#0 ] // zpby1=zpby1_plus_zpby2 lda 2 clc adc 3 @@ -361,6 +418,7 @@ sum__Breturn: rts Removing instruction jmp B2 +Removing instruction jmp B3 Removing instruction jmp BEND Removing instruction jmp sum__Breturn Succesful ASM optimization Pass5NextJumpElimination @@ -375,6 +433,9 @@ sum_from_BBEGIN: sta 2 jsr sum B2: + // [1] (byte) s1#0 ← (byte) sum::return#0 [ sum::return#0 s1#0 ] // zpby1=zpby2 + lda 2 + sta 4 sum_from_B2: // (byte) sum::b#2 = (byte) 13 // zpby1=coby1 lda #13 @@ -383,9 +444,16 @@ sum_from_B2: lda #9 sta 2 jsr sum +B3: + // (byte) s2#0 = (byte) sum::return#0 // register copy zp byte:2 + // [4] (byte) s3#0 ← (byte) s1#0 + (byte) s2#0 [ ] // zpby1=zpby1_plus_zpby2 + lda 4 + clc + adc 2 + sta 4 BEND: sum: - // [3] (byte) s1#0 ← (byte) sum::a#2 + (byte) sum::b#2 [ s1#0 ] // zpby1=zpby1_plus_zpby2 + // [6] (byte) sum::return#0 ← (byte) sum::a#2 + (byte) sum::b#2 [ sum::return#0 s1#0 ] // zpby1=zpby1_plus_zpby2 lda 2 clc adc 3 @@ -395,11 +463,15 @@ sum__Breturn: FINAL SYMBOL TABLE (label) @2 +(label) @3 (label) @BEGIN (label) @END (byte) s1 -(byte) s1#0 zp byte:2 +(byte) s1#0 zp byte:4 (byte) s2 +(byte) s2#0 zp byte:2 +(byte) s3 +(byte) s3#0 zp byte:4 (byte()) sum((byte) sum::a , (byte) sum::b) (label) sum::@return (byte) sum::a @@ -407,10 +479,12 @@ FINAL SYMBOL TABLE (byte) sum::b (byte) sum::b#2 zp byte:3 (byte) sum::return +(byte) sum::return#0 zp byte:2 -zp byte:2 [ sum::a#2 s1#0 ] +zp byte:2 [ sum::a#2 sum::return#0 s2#0 ] zp byte:3 [ sum::b#2 ] +zp byte:4 [ s1#0 s3#0 ] FINAL CODE BBEGIN: @@ -423,6 +497,9 @@ sum_from_BBEGIN: sta 2 jsr sum B2: + // [1] (byte) s1#0 ← (byte) sum::return#0 [ sum::return#0 s1#0 ] // zpby1=zpby2 + lda 2 + sta 4 sum_from_B2: // (byte) sum::b#2 = (byte) 13 // zpby1=coby1 lda #13 @@ -431,9 +508,16 @@ sum_from_B2: lda #9 sta 2 jsr sum +B3: + // (byte) s2#0 = (byte) sum::return#0 // register copy zp byte:2 + // [4] (byte) s3#0 ← (byte) s1#0 + (byte) s2#0 [ ] // zpby1=zpby1_plus_zpby2 + lda 4 + clc + adc 2 + sta 4 BEND: sum: - // [3] (byte) s1#0 ← (byte) sum::a#2 + (byte) sum::b#2 [ s1#0 ] // zpby1=zpby1_plus_zpby2 + // [6] (byte) sum::return#0 ← (byte) sum::a#2 + (byte) sum::b#2 [ sum::return#0 s1#0 ] // zpby1=zpby1_plus_zpby2 lda 2 clc adc 3 diff --git a/src/dk/camelot64/kickc/test/ref/summin.sym b/src/dk/camelot64/kickc/test/ref/summin.sym index 0f68584b0..2168befff 100644 --- a/src/dk/camelot64/kickc/test/ref/summin.sym +++ b/src/dk/camelot64/kickc/test/ref/summin.sym @@ -1,9 +1,13 @@ (label) @2 +(label) @3 (label) @BEGIN (label) @END (byte) s1 -(byte) s1#0 zp byte:2 +(byte) s1#0 zp byte:4 (byte) s2 +(byte) s2#0 zp byte:2 +(byte) s3 +(byte) s3#0 zp byte:4 (byte()) sum((byte) sum::a , (byte) sum::b) (label) sum::@return (byte) sum::a @@ -11,4 +15,9 @@ (byte) sum::b (byte) sum::b#2 zp byte:3 (byte) sum::return +(byte) sum::return#0 zp byte:2 + +zp byte:2 [ sum::a#2 sum::return#0 s2#0 ] +zp byte:3 [ sum::b#2 ] +zp byte:4 [ s1#0 s3#0 ] diff --git a/src/dk/camelot64/kickc/test/summin.kc b/src/dk/camelot64/kickc/test/summin.kc index 84dcb4b53..dd078cf86 100644 --- a/src/dk/camelot64/kickc/test/summin.kc +++ b/src/dk/camelot64/kickc/test/summin.kc @@ -1,5 +1,6 @@ byte s1=sum(1,2); byte s2=sum(9,13); +byte s3=s1+s2; byte sum(byte a, byte b) { return a+b; }