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

Improved fragment synthesis by allowing X/Y registers to be used for constant byte values - great for _derefidx_vbuc1! Closes #99

This commit is contained in:
jespergravgaard 2018-04-22 22:49:40 +02:00
parent eb2ff934c7
commit a34f77d319
11 changed files with 9742 additions and 9252 deletions

View File

@ -535,9 +535,13 @@ class AsmFragmentTemplateSynthesisRule {
synths.add(new AsmFragmentTemplateSynthesisRule("vb(.)aa=_dec_(.*)", null, null, "vb$1aa=$2_minus_1", null, null));
synths.add(new AsmFragmentTemplateSynthesisRule("vw(.)z1=_inc_vw(.z.)", null, null, "vw$1z1=vw$2_plus_1", null, null));
// Synthesize constants using AA
// Synthesize constants using AA/XX/YY
synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbuc1(.*)", rvalAa+"|"+twoC1+"|"+ derefC1, "lda #{c1}", "$1=$2vbuaa$3", null, mapC));
synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbsc1(.*)", rvalAa+"|"+twoC1+"|"+ derefC1, "lda #{c1}", "$1=$2vbsaa$3", null, mapC));
synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbuc1(.*)", rvalYy+"|"+twoC1+"|"+ derefC1, "ldy #{c1}", "$1=$2vbuyy$3", null, mapC));
synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbsc1(.*)", rvalYy+"|"+twoC1+"|"+ derefC1, "ldy #{c1}", "$1=$2vbsyy$3", null, mapC));
synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbuc1(.*)", rvalXx+"|"+twoC1+"|"+ derefC1, "ldx #{c1}", "$1=$2vbuxx$3", null, mapC));
synths.add(new AsmFragmentTemplateSynthesisRule("(.*)=(.*)vbsc1(.*)", rvalXx+"|"+twoC1+"|"+ derefC1, "ldx #{c1}", "$1=$2vbsxx$3", null, mapC));
// Synthesize some constant pointers as constant words
synths.add(new AsmFragmentTemplateSynthesisRule("(.*)_(lt|gt|le|ge|eq|neq)_p..([cz].)_then_(.*)", null, null, "$1_$2_vwu$3_then_$4", null, null));

View File

@ -5,6 +5,7 @@ import dk.camelot64.kickc.model.types.SymbolType;
import dk.camelot64.kickc.model.types.SymbolTypeSimple;
import dk.camelot64.kickc.model.values.ConstantInteger;
import dk.camelot64.kickc.model.values.ConstantLiteral;
import dk.camelot64.kickc.model.values.ConstantPointer;
/** Unary Increment operator (++) */
public class OperatorIncrement extends OperatorUnary {
@ -17,6 +18,8 @@ public class OperatorIncrement extends OperatorUnary {
public ConstantLiteral calculateLiteral(ConstantLiteral operand) {
if(operand instanceof ConstantInteger ) {
return new ConstantInteger(((ConstantInteger) operand).getInteger() + 1);
} else if(operand instanceof ConstantPointer) {
return new ConstantPointer(((ConstantPointer) operand).getLocation()+1, ((ConstantPointer) operand).getElementType());
}
throw new CompileError("Calculation not implemented " + getOperator() + " " + operand );
}

View File

@ -44,6 +44,11 @@ public class TestPrograms {
AsmFragmentTemplateUsages.logUsages(log, false, false, false, false, false, false);
}
@Test
public void testFragmentSynth() throws IOException, URISyntaxException {
compileAndCompare("fragment-synth");
}
@Test
public void testConstPointer() throws IOException, URISyntaxException {
compileAndCompare("const-pointer");

View File

@ -0,0 +1,22 @@
// Tests a sub-optimal fragment synthesis
// vbuaa=vbuxx_band_pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1_band_vbuxx < vbuaa=pbuz1_derefidx_vbuaa_band_vbuxx < vbuaa=pbuz1_derefidx_vbuyy_band_vbuxx < vbuaa=pbuz1_derefidx_vbuyy_band_vbuaa < vbuaa=vbuaa_band_pbuz1_derefidx_vbuyy - clobber:A Y cycles:11.5
void main() {
byte* screen = $400;
byte* z = $450;
z[2] = $f0;
z[3] = $0f;
byte x = $aa;
byte a1 = fct(x, z);
screen[0] = a1;
z++;
x = $55;
byte a2 = fct(x, z);
screen[1] = a2;
}
byte fct(byte register(X) x, byte* z) {
byte register(A) a = x & z[2];
return a;
}

View File

@ -0,0 +1,33 @@
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
jsr main
main: {
.label screen = $400
lda #$f0
sta $450+2
lda #$f
sta $450+3
lda #<$450
sta fct.z
lda #>$450
sta fct.z+1
ldx #$aa
jsr fct
sta screen+0
lda #<$450+1
sta fct.z
lda #>$450+1
sta fct.z+1
ldx #$55
jsr fct
sta screen+1
rts
}
fct: {
.label z = 2
ldy #2
txa
and (z),y
rts
}

View File

@ -0,0 +1,36 @@
@begin: scope:[] from
[0] phi() [ ] ( )
to:@2
@2: scope:[] from @begin
[1] phi() [ ] ( )
[2] call main param-assignment [ ] ( )
to:@end
@end: scope:[] from @2
[3] phi() [ ] ( )
main: scope:[main] from @2
[4] *(((byte*))(word/signed word/dword/signed dword) 1104+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (byte/word/signed word/dword/signed dword) 240 [ ] ( main:2 [ ] )
[5] *(((byte*))(word/signed word/dword/signed dword) 1104+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (byte/signed byte/word/signed word/dword/signed dword) 15 [ ] ( main:2 [ ] )
[6] call fct param-assignment [ fct::return#2 ] ( main:2 [ fct::return#2 ] )
[7] (byte) fct::return#0 ← (byte) fct::return#2 [ fct::return#0 ] ( main:2 [ fct::return#0 ] )
to:main::@1
main::@1: scope:[main] from main
[8] (byte) main::a1#0 ← (byte) fct::return#0 [ main::a1#0 ] ( main:2 [ main::a1#0 ] )
[9] *((const byte*) main::screen#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte) main::a1#0 [ ] ( main:2 [ ] )
[10] call fct param-assignment [ fct::return#2 ] ( main:2 [ fct::return#2 ] )
[11] (byte) fct::return#1 ← (byte) fct::return#2 [ fct::return#1 ] ( main:2 [ fct::return#1 ] )
to:main::@2
main::@2: scope:[main] from main::@1
[12] (byte) main::a2#0 ← (byte) fct::return#1 [ main::a2#0 ] ( main:2 [ main::a2#0 ] )
[13] *((const byte*) main::screen#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte) main::a2#0 [ ] ( main:2 [ ] )
to:main::@return
main::@return: scope:[main] from main::@2
[14] return [ ] ( main:2 [ ] )
to:@return
fct: scope:[fct] from main main::@1
[15] (byte*) fct::z#2 ← phi( main/((byte*))(word/signed word/dword/signed dword) 1104 main::@1/++((byte*))(word/signed word/dword/signed dword) 1104 ) [ fct::x#2 fct::z#2 ] ( main:2::fct:6 [ fct::x#2 fct::z#2 ] main:2::fct:10 [ fct::x#2 fct::z#2 ] )
[15] (byte) fct::x#2 ← phi( main/(byte/word/signed word/dword/signed dword) 170 main::@1/(byte/signed byte/word/signed word/dword/signed dword) 85 ) [ fct::x#2 fct::z#2 ] ( main:2::fct:6 [ fct::x#2 fct::z#2 ] main:2::fct:10 [ fct::x#2 fct::z#2 ] )
[16] (byte) fct::return#2 ← (byte) fct::x#2 & *((byte*) fct::z#2 + (byte/signed byte/word/signed word/dword/signed dword) 2) [ fct::return#2 ] ( main:2::fct:6 [ fct::return#2 ] main:2::fct:10 [ fct::return#2 ] )
to:fct::@return
fct::@return: scope:[fct] from fct
[17] return [ fct::return#2 ] ( main:2::fct:6 [ fct::return#2 ] main:2::fct:10 [ fct::return#2 ] )
to:@return

View File

@ -0,0 +1,736 @@
PARSING src/test/java/dk/camelot64/kickc/test/kc/fragment-synth.kc
// Tests a sub-optimal fragment synthesis
// vbuaa=vbuxx_band_pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1_band_vbuxx < vbuaa=pbuz1_derefidx_vbuaa_band_vbuxx < vbuaa=pbuz1_derefidx_vbuyy_band_vbuxx < vbuaa=pbuz1_derefidx_vbuyy_band_vbuaa < vbuaa=vbuaa_band_pbuz1_derefidx_vbuyy - clobber:A Y cycles:11.5
void main() {
byte* screen = $400;
byte* z = $450;
z[2] = $f0;
z[3] = $0f;
byte x = $aa;
byte a1 = fct(x, z);
screen[0] = a1;
z++;
x = $55;
byte a2 = fct(x, z);
screen[1] = a2;
}
byte fct(byte register(X) x, byte* z) {
byte register(A) a = x & z[2];
return a;
}
Adding pre/post-modifier (byte*) main::z ← ++ (byte*) main::z
SYMBOLS
(label) @1
(label) @2
(label) @begin
(label) @end
(byte()) fct((byte) fct::x , (byte*) fct::z)
(byte~) fct::$0
(label) fct::@1
(label) fct::@return
(byte) fct::a !reg byte a
(byte) fct::return
(byte) fct::x !reg byte x
(byte*) fct::z
(void()) main()
(byte~) main::$0
(byte~) main::$1
(label) main::@return
(byte) main::a1
(byte) main::a2
(byte*) main::screen
(byte) main::x
(byte*) main::z
Promoting word/signed word/dword/signed dword to byte* in main::screen ← ((byte*)) 1024
Promoting word/signed word/dword/signed dword to byte* in main::z ← ((byte*)) 1104
INITIAL CONTROL FLOW GRAPH
@begin: scope:[] from
to:@1
main: scope:[main] from
(byte*) main::screen ← ((byte*)) (word/signed word/dword/signed dword) 1024
(byte*) main::z ← ((byte*)) (word/signed word/dword/signed dword) 1104
*((byte*) main::z + (byte/signed byte/word/signed word/dword/signed dword) 2) ← (byte/word/signed word/dword/signed dword) 240
*((byte*) main::z + (byte/signed byte/word/signed word/dword/signed dword) 3) ← (byte/signed byte/word/signed word/dword/signed dword) 15
(byte) main::x ← (byte/word/signed word/dword/signed dword) 170
(byte~) main::$0 ← call fct (byte) main::x (byte*) main::z
(byte) main::a1 ← (byte~) main::$0
*((byte*) main::screen + (byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte) main::a1
(byte*) main::z ← ++ (byte*) main::z
(byte) main::x ← (byte/signed byte/word/signed word/dword/signed dword) 85
(byte~) main::$1 ← call fct (byte) main::x (byte*) main::z
(byte) main::a2 ← (byte~) main::$1
*((byte*) main::screen + (byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte) main::a2
to:main::@return
main::@return: scope:[main] from main
return
to:@return
@1: scope:[] from @begin
to:@2
fct: scope:[fct] from
(byte~) fct::$0 ← (byte) fct::x & *((byte*) fct::z + (byte/signed byte/word/signed word/dword/signed dword) 2)
(byte) fct::a ← (byte~) fct::$0
(byte) fct::return ← (byte) fct::a
to:fct::@return
fct::@return: scope:[fct] from fct fct::@1
(byte) fct::return ← (byte) fct::return
return (byte) fct::return
to:@return
fct::@1: scope:[fct] from
to:fct::@return
@2: scope:[] from @1
call main
to:@end
@end: scope:[] from @2
Removing empty block @1
Removing empty block fct::@1
PROCEDURE MODIFY VARIABLE ANALYSIS
Completing Phi functions...
CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN
@begin: scope:[] from
to:@2
main: scope:[main] from @2
(byte*) main::screen#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024
(byte*) main::z#0 ← ((byte*)) (word/signed word/dword/signed dword) 1104
*((byte*) main::z#0 + (byte/signed byte/word/signed word/dword/signed dword) 2) ← (byte/word/signed word/dword/signed dword) 240
*((byte*) main::z#0 + (byte/signed byte/word/signed word/dword/signed dword) 3) ← (byte/signed byte/word/signed word/dword/signed dword) 15
(byte) main::x#0 ← (byte/word/signed word/dword/signed dword) 170
(byte) fct::x#0 ← (byte) main::x#0
(byte*) fct::z#0 ← (byte*) main::z#0
call fct param-assignment
(byte) fct::return#0 ← (byte) fct::return#3
to:main::@1
main::@1: scope:[main] from main
(byte*) main::z#2 ← phi( main/(byte*) main::z#0 )
(byte*) main::screen#1 ← phi( main/(byte*) main::screen#0 )
(byte) fct::return#4 ← phi( main/(byte) fct::return#0 )
(byte~) main::$0 ← (byte) fct::return#4
(byte) main::a1#0 ← (byte~) main::$0
*((byte*) main::screen#1 + (byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte) main::a1#0
(byte*) main::z#1 ← ++ (byte*) main::z#2
(byte) main::x#1 ← (byte/signed byte/word/signed word/dword/signed dword) 85
(byte) fct::x#1 ← (byte) main::x#1
(byte*) fct::z#1 ← (byte*) main::z#1
call fct param-assignment
(byte) fct::return#1 ← (byte) fct::return#3
to:main::@2
main::@2: scope:[main] from main::@1
(byte*) main::screen#2 ← phi( main::@1/(byte*) main::screen#1 )
(byte) fct::return#5 ← phi( main::@1/(byte) fct::return#1 )
(byte~) main::$1 ← (byte) fct::return#5
(byte) main::a2#0 ← (byte~) main::$1
*((byte*) main::screen#2 + (byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte) main::a2#0
to:main::@return
main::@return: scope:[main] from main::@2
return
to:@return
fct: scope:[fct] from main main::@1
(byte*) fct::z#2 ← phi( main/(byte*) fct::z#0 main::@1/(byte*) fct::z#1 )
(byte) fct::x#2 ← phi( main/(byte) fct::x#0 main::@1/(byte) fct::x#1 )
(byte~) fct::$0 ← (byte) fct::x#2 & *((byte*) fct::z#2 + (byte/signed byte/word/signed word/dword/signed dword) 2)
(byte) fct::a#0 ← (byte~) fct::$0
(byte) fct::return#2 ← (byte) fct::a#0
to:fct::@return
fct::@return: scope:[fct] from fct
(byte) fct::return#6 ← phi( fct/(byte) fct::return#2 )
(byte) fct::return#3 ← (byte) fct::return#6
return
to:@return
@2: scope:[] from @begin
call main param-assignment
to:@3
@3: scope:[] from @2
to:@end
@end: scope:[] from @3
SYMBOL TABLE SSA
(label) @2
(label) @3
(label) @begin
(label) @end
(byte()) fct((byte) fct::x , (byte*) fct::z)
(byte~) fct::$0
(label) fct::@return
(byte) fct::a !reg byte a
(byte) fct::a#0 !reg byte a
(byte) fct::return
(byte) fct::return#0
(byte) fct::return#1
(byte) fct::return#2
(byte) fct::return#3
(byte) fct::return#4
(byte) fct::return#5
(byte) fct::return#6
(byte) fct::x !reg byte x
(byte) fct::x#0 !reg byte x
(byte) fct::x#1 !reg byte x
(byte) fct::x#2 !reg byte x
(byte*) fct::z
(byte*) fct::z#0
(byte*) fct::z#1
(byte*) fct::z#2
(void()) main()
(byte~) main::$0
(byte~) main::$1
(label) main::@1
(label) main::@2
(label) main::@return
(byte) main::a1
(byte) main::a1#0
(byte) main::a2
(byte) main::a2#0
(byte*) main::screen
(byte*) main::screen#0
(byte*) main::screen#1
(byte*) main::screen#2
(byte) main::x
(byte) main::x#0
(byte) main::x#1
(byte*) main::z
(byte*) main::z#0
(byte*) main::z#1
(byte*) main::z#2
OPTIMIZING CONTROL FLOW GRAPH
Culled Empty Block (label) @3
Succesful SSA optimization Pass2CullEmptyBlocks
Not aliassing across scopes: fct::x#0 main::x#0
Not aliassing across scopes: fct::z#0 main::z#0
Not aliassing across scopes: fct::return#0 fct::return#3
Not aliassing across scopes: main::$0 fct::return#4
Not aliassing across scopes: fct::x#1 main::x#1
Not aliassing across scopes: fct::z#1 main::z#1
Not aliassing across scopes: fct::return#1 fct::return#3
Not aliassing across scopes: main::$1 fct::return#5
Not aliassing across scopes: fct::x#2 fct::x#0
Not aliassing across scopes: fct::z#2 fct::z#0
Alias (byte) fct::return#0 = (byte) fct::return#4
Alias (byte*) main::screen#0 = (byte*) main::screen#1 (byte*) main::screen#2
Alias (byte*) main::z#0 = (byte*) main::z#2
Alias (byte) main::a1#0 = (byte~) main::$0
Alias (byte) fct::return#1 = (byte) fct::return#5
Alias (byte) main::a2#0 = (byte~) main::$1
Alias (byte) fct::return#2 = (byte) fct::a#0 (byte~) fct::$0 (byte) fct::return#6 (byte) fct::return#3
Succesful SSA optimization Pass2AliasElimination
Not aliassing across scopes: fct::x#0 main::x#0
Not aliassing across scopes: fct::z#0 main::z#0
Not aliassing across scopes: fct::return#0 fct::return#2
Not aliassing across scopes: main::a1#0 fct::return#0
Not aliassing across scopes: fct::x#1 main::x#1
Not aliassing across scopes: fct::z#1 main::z#1
Not aliassing across scopes: fct::return#1 fct::return#2
Not aliassing across scopes: main::a2#0 fct::return#1
Not aliassing across scopes: fct::x#2 fct::x#0
Not aliassing across scopes: fct::z#2 fct::z#0
Constant (const byte*) main::screen#0 = ((byte*))1024
Constant (const byte*) main::z#0 = ((byte*))1104
Constant (const byte) main::x#0 = 170
Constant (const byte) main::x#1 = 85
Succesful SSA optimization Pass2ConstantIdentification
Constant (const byte) fct::x#0 = main::x#0
Constant (const byte*) fct::z#0 = main::z#0
Constant (const byte*) main::z#1 = ++main::z#0
Constant (const byte) fct::x#1 = main::x#1
Succesful SSA optimization Pass2ConstantIdentification
Constant (const byte*) fct::z#1 = main::z#1
Succesful SSA optimization Pass2ConstantIdentification
Consolidated array index constant in *(main::z#0+2)
Consolidated array index constant in *(main::z#0+3)
Consolidated array index constant in *(main::screen#0+0)
Consolidated array index constant in *(main::screen#0+1)
Succesful SSA optimization Pass2ConstantAdditionElimination
Not aliassing across scopes: fct::return#0 fct::return#2
Not aliassing across scopes: main::a1#0 fct::return#0
Not aliassing across scopes: fct::return#1 fct::return#2
Not aliassing across scopes: main::a2#0 fct::return#1
OPTIMIZING CONTROL FLOW GRAPH
Inlining constant with different constant siblings (const byte*) main::z#0
Inlining constant with different constant siblings (const byte) main::x#0
Inlining constant with different constant siblings (const byte) main::x#1
Inlining constant with different constant siblings (const byte*) main::z#1
Inlining constant with var siblings (const byte) fct::x#0
Inlining constant with var siblings (const byte*) fct::z#0
Inlining constant with var siblings (const byte) fct::x#1
Inlining constant with var siblings (const byte*) fct::z#1
Constant inlined fct::z#0 = ((byte*))(word/signed word/dword/signed dword) 1104
Constant inlined fct::z#1 = ++((byte*))(word/signed word/dword/signed dword) 1104
Constant inlined main::z#0 = ((byte*))(word/signed word/dword/signed dword) 1104
Constant inlined main::z#1 = ++((byte*))(word/signed word/dword/signed dword) 1104
Constant inlined main::x#0 = (byte/word/signed word/dword/signed dword) 170
Constant inlined main::x#1 = (byte/signed byte/word/signed word/dword/signed dword) 85
Constant inlined fct::x#0 = (byte/word/signed word/dword/signed dword) 170
Constant inlined fct::x#1 = (byte/signed byte/word/signed word/dword/signed dword) 85
Succesful SSA optimization Pass2ConstantInlining
Block Sequence Planned @begin @2 @end main main::@1 main::@2 main::@return fct fct::@return
Block Sequence Planned @begin @2 @end main main::@1 main::@2 main::@return fct fct::@return
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @2
Adding NOP phi() at start of @end
CALL GRAPH
Calls in [] to main:2
Calls in [main] to fct:6 fct:10
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
Created 2 initial phi equivalence classes
Coalesced down to 2 phi equivalence classes
Block Sequence Planned @begin @2 @end main main::@1 main::@2 main::@return fct fct::@return
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @2
Adding NOP phi() at start of @end
Propagating live ranges...
Propagating live ranges...
Propagating live ranges...
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
[0] phi() [ ] ( )
to:@2
@2: scope:[] from @begin
[1] phi() [ ] ( )
[2] call main param-assignment [ ] ( )
to:@end
@end: scope:[] from @2
[3] phi() [ ] ( )
main: scope:[main] from @2
[4] *(((byte*))(word/signed word/dword/signed dword) 1104+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (byte/word/signed word/dword/signed dword) 240 [ ] ( main:2 [ ] )
[5] *(((byte*))(word/signed word/dword/signed dword) 1104+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (byte/signed byte/word/signed word/dword/signed dword) 15 [ ] ( main:2 [ ] )
[6] call fct param-assignment [ fct::return#2 ] ( main:2 [ fct::return#2 ] )
[7] (byte) fct::return#0 ← (byte) fct::return#2 [ fct::return#0 ] ( main:2 [ fct::return#0 ] )
to:main::@1
main::@1: scope:[main] from main
[8] (byte) main::a1#0 ← (byte) fct::return#0 [ main::a1#0 ] ( main:2 [ main::a1#0 ] )
[9] *((const byte*) main::screen#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte) main::a1#0 [ ] ( main:2 [ ] )
[10] call fct param-assignment [ fct::return#2 ] ( main:2 [ fct::return#2 ] )
[11] (byte) fct::return#1 ← (byte) fct::return#2 [ fct::return#1 ] ( main:2 [ fct::return#1 ] )
to:main::@2
main::@2: scope:[main] from main::@1
[12] (byte) main::a2#0 ← (byte) fct::return#1 [ main::a2#0 ] ( main:2 [ main::a2#0 ] )
[13] *((const byte*) main::screen#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte) main::a2#0 [ ] ( main:2 [ ] )
to:main::@return
main::@return: scope:[main] from main::@2
[14] return [ ] ( main:2 [ ] )
to:@return
fct: scope:[fct] from main main::@1
[15] (byte*) fct::z#2 ← phi( main/((byte*))(word/signed word/dword/signed dword) 1104 main::@1/++((byte*))(word/signed word/dword/signed dword) 1104 ) [ fct::x#2 fct::z#2 ] ( main:2::fct:6 [ fct::x#2 fct::z#2 ] main:2::fct:10 [ fct::x#2 fct::z#2 ] )
[15] (byte) fct::x#2 ← phi( main/(byte/word/signed word/dword/signed dword) 170 main::@1/(byte/signed byte/word/signed word/dword/signed dword) 85 ) [ fct::x#2 fct::z#2 ] ( main:2::fct:6 [ fct::x#2 fct::z#2 ] main:2::fct:10 [ fct::x#2 fct::z#2 ] )
[16] (byte) fct::return#2 ← (byte) fct::x#2 & *((byte*) fct::z#2 + (byte/signed byte/word/signed word/dword/signed dword) 2) [ fct::return#2 ] ( main:2::fct:6 [ fct::return#2 ] main:2::fct:10 [ fct::return#2 ] )
to:fct::@return
fct::@return: scope:[fct] from fct
[17] return [ fct::return#2 ] ( main:2::fct:6 [ fct::return#2 ] main:2::fct:10 [ fct::return#2 ] )
to:@return
DOMINATORS
@begin dominated by @begin
@2 dominated by @2 @begin
@end dominated by @2 @begin @end
main dominated by @2 @begin main
main::@1 dominated by @2 @begin main::@1 main
main::@2 dominated by @2 @begin main::@1 main::@2 main
main::@return dominated by main::@return @2 @begin main::@1 main::@2 main
fct dominated by @2 @begin fct main
fct::@return dominated by @2 @begin fct main fct::@return
NATURAL LOOPS
NATURAL LOOPS WITH DEPTH
Found 0 loops in scope []
Found 0 loops in scope [main]
Found 0 loops in scope [fct]
VARIABLE REGISTER WEIGHTS
(byte()) fct((byte) fct::x , (byte*) fct::z)
(byte) fct::a !reg byte a
(byte) fct::return
(byte) fct::return#0 4.0
(byte) fct::return#1 4.0
(byte) fct::return#2 1.5
(byte) fct::x !reg byte x
(byte) fct::x#2 !reg byte x 2.0
(byte*) fct::z
(byte*) fct::z#2 2.0
(void()) main()
(byte) main::a1
(byte) main::a1#0 4.0
(byte) main::a2
(byte) main::a2#0 4.0
(byte*) main::screen
(byte) main::x
(byte*) main::z
Initial phi equivalence classes
[ fct::x#2 ]
[ fct::z#2 ]
Added variable fct::return#0 to zero page equivalence class [ fct::return#0 ]
Added variable main::a1#0 to zero page equivalence class [ main::a1#0 ]
Added variable fct::return#1 to zero page equivalence class [ fct::return#1 ]
Added variable main::a2#0 to zero page equivalence class [ main::a2#0 ]
Added variable fct::return#2 to zero page equivalence class [ fct::return#2 ]
Complete equivalence classes
[ fct::x#2 ]
[ fct::z#2 ]
[ fct::return#0 ]
[ main::a1#0 ]
[ fct::return#1 ]
[ main::a2#0 ]
[ fct::return#2 ]
Allocated zp ZP_WORD:2 [ fct::z#2 ]
Allocated zp ZP_BYTE:4 [ fct::return#0 ]
Allocated zp ZP_BYTE:5 [ main::a1#0 ]
Allocated zp ZP_BYTE:6 [ fct::return#1 ]
Allocated zp ZP_BYTE:7 [ main::a2#0 ]
Allocated zp ZP_BYTE:8 [ fct::return#2 ]
INITIAL ASM
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @2 [phi:@begin->@2]
b2_from_bbegin:
jmp b2
//SEG4 @2
b2:
//SEG5 [2] call main param-assignment [ ] ( )
jsr main
//SEG6 [3] phi from @2 to @end [phi:@2->@end]
bend_from_b2:
jmp bend
//SEG7 @end
bend:
//SEG8 main
main: {
.label screen = $400
.label a1 = 5
.label a2 = 7
//SEG9 [4] *(((byte*))(word/signed word/dword/signed dword) 1104+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (byte/word/signed word/dword/signed dword) 240 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #$f0
sta $450+2
//SEG10 [5] *(((byte*))(word/signed word/dword/signed dword) 1104+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (byte/signed byte/word/signed word/dword/signed dword) 15 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #$f
sta $450+3
//SEG11 [6] call fct param-assignment [ fct::return#2 ] ( main:2 [ fct::return#2 ] )
//SEG12 [15] phi from main to fct [phi:main->fct]
fct_from_main:
//SEG13 [15] phi (byte*) fct::z#2 = ((byte*))(word/signed word/dword/signed dword) 1104 [phi:main->fct#0] -- pbuz1=pbuc1
lda #<$450
sta fct.z
lda #>$450
sta fct.z+1
//SEG14 [15] phi (byte) fct::x#2 = (byte/word/signed word/dword/signed dword) 170 [phi:main->fct#1] -- vbuxx=vbuc1
ldx #$aa
jsr fct
//SEG15 [7] (byte) fct::return#0 ← (byte) fct::return#2 [ fct::return#0 ] ( main:2 [ fct::return#0 ] ) -- vbuz1=vbuz2
lda fct.return_2
sta fct.return
jmp b1
//SEG16 main::@1
b1:
//SEG17 [8] (byte) main::a1#0 ← (byte) fct::return#0 [ main::a1#0 ] ( main:2 [ main::a1#0 ] ) -- vbuz1=vbuz2
lda fct.return
sta a1
//SEG18 [9] *((const byte*) main::screen#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte) main::a1#0 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuz1
lda a1
sta screen+0
//SEG19 [10] call fct param-assignment [ fct::return#2 ] ( main:2 [ fct::return#2 ] )
//SEG20 [15] phi from main::@1 to fct [phi:main::@1->fct]
fct_from_b1:
//SEG21 [15] phi (byte*) fct::z#2 = ++((byte*))(word/signed word/dword/signed dword) 1104 [phi:main::@1->fct#0] -- pbuz1=pbuc1
lda #<$450+1
sta fct.z
lda #>$450+1
sta fct.z+1
//SEG22 [15] phi (byte) fct::x#2 = (byte/signed byte/word/signed word/dword/signed dword) 85 [phi:main::@1->fct#1] -- vbuxx=vbuc1
ldx #$55
jsr fct
//SEG23 [11] (byte) fct::return#1 ← (byte) fct::return#2 [ fct::return#1 ] ( main:2 [ fct::return#1 ] ) -- vbuz1=vbuz2
lda fct.return_2
sta fct.return_1
jmp b2
//SEG24 main::@2
b2:
//SEG25 [12] (byte) main::a2#0 ← (byte) fct::return#1 [ main::a2#0 ] ( main:2 [ main::a2#0 ] ) -- vbuz1=vbuz2
lda fct.return_1
sta a2
//SEG26 [13] *((const byte*) main::screen#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte) main::a2#0 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuz1
lda a2
sta screen+1
jmp breturn
//SEG27 main::@return
breturn:
//SEG28 [14] return [ ] ( main:2 [ ] )
rts
}
//SEG29 fct
fct: {
.label return = 4
.label return_1 = 6
.label return_2 = 8
.label z = 2
//SEG30 [16] (byte) fct::return#2 ← (byte) fct::x#2 & *((byte*) fct::z#2 + (byte/signed byte/word/signed word/dword/signed dword) 2) [ fct::return#2 ] ( main:2::fct:6 [ fct::return#2 ] main:2::fct:10 [ fct::return#2 ] ) -- vbuz1=vbuxx_band_pbuz2_derefidx_vbuc1
ldy #2
txa
and (z),y
sta return_2
jmp breturn
//SEG31 fct::@return
breturn:
//SEG32 [17] return [ fct::return#2 ] ( main:2::fct:6 [ fct::return#2 ] main:2::fct:10 [ fct::return#2 ] )
rts
}
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [4] *(((byte*))(word/signed word/dword/signed dword) 1104+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (byte/word/signed word/dword/signed dword) 240 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [5] *(((byte*))(word/signed word/dword/signed dword) 1104+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (byte/signed byte/word/signed word/dword/signed dword) 15 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [16] (byte) fct::return#2 ← (byte) fct::x#2 & *((byte*) fct::z#2 + (byte/signed byte/word/signed word/dword/signed dword) 2) [ fct::return#2 ] ( main:2::fct:6 [ fct::return#2 ] main:2::fct:10 [ fct::return#2 ] ) always clobbers reg byte a reg byte y
Potential registers reg byte x [ fct::x#2 ] : reg byte x ,
Potential registers zp ZP_WORD:2 [ fct::z#2 ] : zp ZP_WORD:2 ,
Potential registers zp ZP_BYTE:4 [ fct::return#0 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:5 [ main::a1#0 ] : zp ZP_BYTE:5 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:6 [ fct::return#1 ] : zp ZP_BYTE:6 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:7 [ main::a2#0 ] : zp ZP_BYTE:7 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:8 [ fct::return#2 ] : zp ZP_BYTE:8 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [fct] 4: zp ZP_BYTE:4 [ fct::return#0 ] 4: zp ZP_BYTE:6 [ fct::return#1 ] 2: reg byte x [ fct::x#2 ] 2: zp ZP_WORD:2 [ fct::z#2 ] 1.5: zp ZP_BYTE:8 [ fct::return#2 ]
Uplift Scope [main] 4: zp ZP_BYTE:5 [ main::a1#0 ] 4: zp ZP_BYTE:7 [ main::a2#0 ]
Uplift Scope []
Uplifting [fct] best 113 combination reg byte a [ fct::return#0 ] reg byte a [ fct::return#1 ] reg byte x [ fct::x#2 ] zp ZP_WORD:2 [ fct::z#2 ] reg byte a [ fct::return#2 ]
Uplifting [main] best 101 combination reg byte a [ main::a1#0 ] reg byte a [ main::a2#0 ]
Uplifting [] best 101 combination
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @2 [phi:@begin->@2]
b2_from_bbegin:
jmp b2
//SEG4 @2
b2:
//SEG5 [2] call main param-assignment [ ] ( )
jsr main
//SEG6 [3] phi from @2 to @end [phi:@2->@end]
bend_from_b2:
jmp bend
//SEG7 @end
bend:
//SEG8 main
main: {
.label screen = $400
//SEG9 [4] *(((byte*))(word/signed word/dword/signed dword) 1104+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (byte/word/signed word/dword/signed dword) 240 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #$f0
sta $450+2
//SEG10 [5] *(((byte*))(word/signed word/dword/signed dword) 1104+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (byte/signed byte/word/signed word/dword/signed dword) 15 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #$f
sta $450+3
//SEG11 [6] call fct param-assignment [ fct::return#2 ] ( main:2 [ fct::return#2 ] )
//SEG12 [15] phi from main to fct [phi:main->fct]
fct_from_main:
//SEG13 [15] phi (byte*) fct::z#2 = ((byte*))(word/signed word/dword/signed dword) 1104 [phi:main->fct#0] -- pbuz1=pbuc1
lda #<$450
sta fct.z
lda #>$450
sta fct.z+1
//SEG14 [15] phi (byte) fct::x#2 = (byte/word/signed word/dword/signed dword) 170 [phi:main->fct#1] -- vbuxx=vbuc1
ldx #$aa
jsr fct
//SEG15 [7] (byte) fct::return#0 ← (byte) fct::return#2 [ fct::return#0 ] ( main:2 [ fct::return#0 ] )
// (byte) fct::return#0 = (byte) fct::return#2 // register copy reg byte a
jmp b1
//SEG16 main::@1
b1:
//SEG17 [8] (byte) main::a1#0 ← (byte) fct::return#0 [ main::a1#0 ] ( main:2 [ main::a1#0 ] )
// (byte) main::a1#0 = (byte) fct::return#0 // register copy reg byte a
//SEG18 [9] *((const byte*) main::screen#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte) main::a1#0 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuaa
sta screen+0
//SEG19 [10] call fct param-assignment [ fct::return#2 ] ( main:2 [ fct::return#2 ] )
//SEG20 [15] phi from main::@1 to fct [phi:main::@1->fct]
fct_from_b1:
//SEG21 [15] phi (byte*) fct::z#2 = ++((byte*))(word/signed word/dword/signed dword) 1104 [phi:main::@1->fct#0] -- pbuz1=pbuc1
lda #<$450+1
sta fct.z
lda #>$450+1
sta fct.z+1
//SEG22 [15] phi (byte) fct::x#2 = (byte/signed byte/word/signed word/dword/signed dword) 85 [phi:main::@1->fct#1] -- vbuxx=vbuc1
ldx #$55
jsr fct
//SEG23 [11] (byte) fct::return#1 ← (byte) fct::return#2 [ fct::return#1 ] ( main:2 [ fct::return#1 ] )
// (byte) fct::return#1 = (byte) fct::return#2 // register copy reg byte a
jmp b2
//SEG24 main::@2
b2:
//SEG25 [12] (byte) main::a2#0 ← (byte) fct::return#1 [ main::a2#0 ] ( main:2 [ main::a2#0 ] )
// (byte) main::a2#0 = (byte) fct::return#1 // register copy reg byte a
//SEG26 [13] *((const byte*) main::screen#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte) main::a2#0 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuaa
sta screen+1
jmp breturn
//SEG27 main::@return
breturn:
//SEG28 [14] return [ ] ( main:2 [ ] )
rts
}
//SEG29 fct
fct: {
.label z = 2
//SEG30 [16] (byte) fct::return#2 ← (byte) fct::x#2 & *((byte*) fct::z#2 + (byte/signed byte/word/signed word/dword/signed dword) 2) [ fct::return#2 ] ( main:2::fct:6 [ fct::return#2 ] main:2::fct:10 [ fct::return#2 ] ) -- vbuaa=vbuxx_band_pbuz1_derefidx_vbuc1
ldy #2
txa
and (z),y
jmp breturn
//SEG31 fct::@return
breturn:
//SEG32 [17] return [ fct::return#2 ] ( main:2::fct:6 [ fct::return#2 ] main:2::fct:10 [ fct::return#2 ] )
rts
}
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b2
Removing instruction jmp bend
Removing instruction jmp b1
Removing instruction jmp b2
Removing instruction jmp breturn
Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction bbegin:
Removing instruction b2_from_bbegin:
Removing instruction bend_from_b2:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b2:
Removing instruction bend:
Removing instruction fct_from_main:
Removing instruction b1:
Removing instruction fct_from_b1:
Removing instruction b2:
Removing instruction breturn:
Removing instruction breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
FINAL SYMBOL TABLE
(label) @2
(label) @begin
(label) @end
(byte()) fct((byte) fct::x , (byte*) fct::z)
(label) fct::@return
(byte) fct::a !reg byte a
(byte) fct::return
(byte) fct::return#0 reg byte a 4.0
(byte) fct::return#1 reg byte a 4.0
(byte) fct::return#2 reg byte a 1.5
(byte) fct::x !reg byte x
(byte) fct::x#2 !reg byte x 2.0
(byte*) fct::z
(byte*) fct::z#2 z zp ZP_WORD:2 2.0
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@return
(byte) main::a1
(byte) main::a1#0 reg byte a 4.0
(byte) main::a2
(byte) main::a2#0 reg byte a 4.0
(byte*) main::screen
(const byte*) main::screen#0 screen = ((byte*))(word/signed word/dword/signed dword) 1024
(byte) main::x
(byte*) main::z
reg byte x [ fct::x#2 ]
zp ZP_WORD:2 [ fct::z#2 ]
reg byte a [ fct::return#0 ]
reg byte a [ main::a1#0 ]
reg byte a [ fct::return#1 ]
reg byte a [ main::a2#0 ]
reg byte a [ fct::return#2 ]
FINAL ASSEMBLER
Score: 83
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
//SEG2 @begin
//SEG3 [1] phi from @begin to @2 [phi:@begin->@2]
//SEG4 @2
//SEG5 [2] call main param-assignment [ ] ( )
jsr main
//SEG6 [3] phi from @2 to @end [phi:@2->@end]
//SEG7 @end
//SEG8 main
main: {
.label screen = $400
//SEG9 [4] *(((byte*))(word/signed word/dword/signed dword) 1104+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (byte/word/signed word/dword/signed dword) 240 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #$f0
sta $450+2
//SEG10 [5] *(((byte*))(word/signed word/dword/signed dword) 1104+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (byte/signed byte/word/signed word/dword/signed dword) 15 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #$f
sta $450+3
//SEG11 [6] call fct param-assignment [ fct::return#2 ] ( main:2 [ fct::return#2 ] )
//SEG12 [15] phi from main to fct [phi:main->fct]
//SEG13 [15] phi (byte*) fct::z#2 = ((byte*))(word/signed word/dword/signed dword) 1104 [phi:main->fct#0] -- pbuz1=pbuc1
lda #<$450
sta fct.z
lda #>$450
sta fct.z+1
//SEG14 [15] phi (byte) fct::x#2 = (byte/word/signed word/dword/signed dword) 170 [phi:main->fct#1] -- vbuxx=vbuc1
ldx #$aa
jsr fct
//SEG15 [7] (byte) fct::return#0 ← (byte) fct::return#2 [ fct::return#0 ] ( main:2 [ fct::return#0 ] )
// (byte) fct::return#0 = (byte) fct::return#2 // register copy reg byte a
//SEG16 main::@1
//SEG17 [8] (byte) main::a1#0 ← (byte) fct::return#0 [ main::a1#0 ] ( main:2 [ main::a1#0 ] )
// (byte) main::a1#0 = (byte) fct::return#0 // register copy reg byte a
//SEG18 [9] *((const byte*) main::screen#0+(byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte) main::a1#0 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuaa
sta screen+0
//SEG19 [10] call fct param-assignment [ fct::return#2 ] ( main:2 [ fct::return#2 ] )
//SEG20 [15] phi from main::@1 to fct [phi:main::@1->fct]
//SEG21 [15] phi (byte*) fct::z#2 = ++((byte*))(word/signed word/dword/signed dword) 1104 [phi:main::@1->fct#0] -- pbuz1=pbuc1
lda #<$450+1
sta fct.z
lda #>$450+1
sta fct.z+1
//SEG22 [15] phi (byte) fct::x#2 = (byte/signed byte/word/signed word/dword/signed dword) 85 [phi:main::@1->fct#1] -- vbuxx=vbuc1
ldx #$55
jsr fct
//SEG23 [11] (byte) fct::return#1 ← (byte) fct::return#2 [ fct::return#1 ] ( main:2 [ fct::return#1 ] )
// (byte) fct::return#1 = (byte) fct::return#2 // register copy reg byte a
//SEG24 main::@2
//SEG25 [12] (byte) main::a2#0 ← (byte) fct::return#1 [ main::a2#0 ] ( main:2 [ main::a2#0 ] )
// (byte) main::a2#0 = (byte) fct::return#1 // register copy reg byte a
//SEG26 [13] *((const byte*) main::screen#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (byte) main::a2#0 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuaa
sta screen+1
//SEG27 main::@return
//SEG28 [14] return [ ] ( main:2 [ ] )
rts
}
//SEG29 fct
fct: {
.label z = 2
//SEG30 [16] (byte) fct::return#2 ← (byte) fct::x#2 & *((byte*) fct::z#2 + (byte/signed byte/word/signed word/dword/signed dword) 2) [ fct::return#2 ] ( main:2::fct:6 [ fct::return#2 ] main:2::fct:10 [ fct::return#2 ] ) -- vbuaa=vbuxx_band_pbuz1_derefidx_vbuc1
ldy #2
txa
and (z),y
//SEG31 fct::@return
//SEG32 [17] return [ fct::return#2 ] ( main:2::fct:6 [ fct::return#2 ] main:2::fct:10 [ fct::return#2 ] )
rts
}

View File

@ -0,0 +1,34 @@
(label) @2
(label) @begin
(label) @end
(byte()) fct((byte) fct::x , (byte*) fct::z)
(label) fct::@return
(byte) fct::a !reg byte a
(byte) fct::return
(byte) fct::return#0 reg byte a 4.0
(byte) fct::return#1 reg byte a 4.0
(byte) fct::return#2 reg byte a 1.5
(byte) fct::x !reg byte x
(byte) fct::x#2 !reg byte x 2.0
(byte*) fct::z
(byte*) fct::z#2 z zp ZP_WORD:2 2.0
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@return
(byte) main::a1
(byte) main::a1#0 reg byte a 4.0
(byte) main::a2
(byte) main::a2#0 reg byte a 4.0
(byte*) main::screen
(const byte*) main::screen#0 screen = ((byte*))(word/signed word/dword/signed dword) 1024
(byte) main::x
(byte*) main::z
reg byte x [ fct::x#2 ]
zp ZP_WORD:2 [ fct::z#2 ]
reg byte a [ fct::return#0 ]
reg byte a [ main::a1#0 ]
reg byte a [ fct::return#1 ]
reg byte a [ main::a2#0 ]
reg byte a [ fct::return#2 ]

View File

@ -26,9 +26,8 @@ vbuaa=pbuz1_derefidx_vbuz1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:8.
vbuaa=pbuz1_derefidx_vbuz2 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:8.5
ldy {z2}
lda ({z1}),y
vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:9.5
lda #{c1}
tay
vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:7.5
ldy #{c1}
lda ({z1}),y
vbuaa=pbuc1_derefidx_vbuaa < vbuaa=pbuc1_derefidx_vbuxx - clobber:A X cycles:6.5
tax
@ -88,9 +87,8 @@ vbuxx=pbuz1_derefidx_vbuz2 < vbuxx=pbuz1_derefidx_vbuyy < vbuaa=pbuz1_derefidx_v
ldy {z2}
lda ({z1}),y
tax
vbuxx=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A X Y cycles:11.5
lda #{c1}
tay
vbuxx=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A X Y cycles:9.5
ldy #{c1}
lda ({z1}),y
tax
vbuxx=pbuc1_derefidx_vbuaa < vbuxx=pbuc1_derefidx_vbuxx < vbuaa=pbuc1_derefidx_vbuxx - clobber:A X cycles:8.5
@ -149,9 +147,8 @@ vbuyy=pbuz1_derefidx_vbuz2 < vbuyy=pbuz1_derefidx_vbuyy < vbuaa=pbuz1_derefidx_v
ldy {z2}
lda ({z1}),y
tay
vbuyy=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:11.5
lda #{c1}
tay
vbuyy=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:9.5
ldy #{c1}
lda ({z1}),y
tay
vbuyy=pbuc1_derefidx_vbuaa < vbuyy=pbuc1_derefidx_vbuyy < vbuaa=pbuc1_derefidx_vbuyy - clobber:A Y cycles:8.5
@ -232,9 +229,8 @@ vbuz1=pbuz1_derefidx_vbuz2 < vbuz1=pbuz1_derefidx_vbuyy < vbuaa=pbuz1_derefidx_v
ldy {z2}
lda ({z1}),y
sta {z1}
vbuz1=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:12.5
lda #{c1}
tay
vbuz1=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:10.5
ldy #{c1}
lda ({z1}),y
sta {z1}
vbuz1=pbuz2_derefidx_vbuaa < vbuz1=pbuz2_derefidx_vbuyy < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:10.5
@ -261,9 +257,8 @@ vbuz1=pbuz2_derefidx_vbuz3 < vbuaa=pbuz1_derefidx_vbuz2 < vbuaa=pbuz1_derefidx_v
ldy {z3}
lda ({z2}),y
sta {z1}
vbuz1=pbuz2_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:12.5
lda #{c1}
tay
vbuz1=pbuz2_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:10.5
ldy #{c1}
lda ({z2}),y
sta {z1}
vbuz1=pbuc1_derefidx_vbuaa < vbuz1=pbuc1_derefidx_vbuxx < vbuaa=pbuc1_derefidx_vbuxx - clobber:A X cycles:9.5
@ -376,9 +371,8 @@ _deref_pbuz1=pbuz1_derefidx_vbuz2 < _deref_pbuz1=pbuz1_derefidx_vbuyy < vbuaa=pb
lda ({z1}),y
ldy #0
sta ({z1}),y
_deref_pbuz1=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:17.5
lda #{c1}
tay
_deref_pbuz1=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:15.5
ldy #{c1}
lda ({z1}),y
ldy #0
sta ({z1}),y
@ -412,9 +406,8 @@ _deref_pbuz1=pbuz2_derefidx_vbuz3 < _deref_pbuz1=pbuz2_derefidx_vbuyy < vbuaa=pb
lda ({z2}),y
ldy #0
sta ({z1}),y
_deref_pbuz1=pbuz2_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:17.5
lda #{c1}
tay
_deref_pbuz1=pbuz2_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:15.5
ldy #{c1}
lda ({z2}),y
ldy #0
sta ({z1}),y
@ -492,14 +485,12 @@ _deref_pbuc1=pbuz1_derefidx_vbuz2 < _deref_pbuc1=pbuz1_derefidx_vbuyy < vbuaa=pb
ldy {z2}
lda ({z1}),y
sta {c1}
_deref_pbuc1=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:13.5
lda #{c1}
tay
_deref_pbuc1=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:11.5
ldy #{c1}
lda ({z1}),y
sta {c1}
_deref_pbuc1=pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:13.5
lda #{c2}
tay
_deref_pbuc1=pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:11.5
ldy #{c2}
lda ({z1}),y
sta {c1}
_deref_pbuc1=pbuc1_derefidx_vbuaa < _deref_pbuc1=pbuc1_derefidx_vbuxx < vbuaa=pbuc1_derefidx_vbuxx - clobber:A X cycles:10.5
@ -548,14 +539,12 @@ _deref_pbuc1=pbuc2_derefidx_vbuz1 < _deref_pbuc1=pbuc2_derefidx_vbuyy < vbuaa=pb
ldy {z1}
lda {c2},y
sta {c1}
_deref_pbuc1=pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1 < vbuaa=pbuc1_derefidx_vbuaa < vbuaa=pbuc1_derefidx_vbuxx - clobber:A X cycles:12.5
lda #{c1}
tax
_deref_pbuc1=pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1 < vbuaa=pbuc1_derefidx_vbuxx - clobber:A X cycles:10.5
ldx #{c1}
lda {c2},x
sta {c1}
_deref_pbuc1=pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1 < vbuaa=pbuc1_derefidx_vbuaa < vbuaa=pbuc1_derefidx_vbuyy - clobber:A Y cycles:12.5
lda #{c1}
tay
_deref_pbuc1=pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1 < vbuaa=pbuc1_derefidx_vbuyy - clobber:A Y cycles:10.5
ldy #{c1}
lda {c2},y
sta {c1}
CANNOT SYNTHESIZE _deref_pbuc1=pbuc2_derefidx_vbuc2
@ -953,9 +942,8 @@ pbuz1_derefidx_vbuz2=pbuz3_derefidx_vbuz3 < vbuaa=pbuz1_derefidx_vbuz1 < vbuaa=p
ldy {z2}
sta ({z1}),y
CANNOT SYNTHESIZE pbuz1_derefidx_vbuz2=pbuz3_derefidx_vbuz4
pbuz1_derefidx_vbuz2=pbuz3_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:18.5
lda #{c1}
tay
pbuz1_derefidx_vbuz2=pbuz3_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:16.5
ldy #{c1}
lda ({z3}),y
ldy {z2}
sta ({z1}),y
@ -1139,10 +1127,9 @@ pbuc1_derefidx_vbuaa=pbuz1_derefidx_vbuz2 < pbuc1_derefidx_vbuaa=pbuz1_derefidx_
lda ({z1}),y
sta {c1},x
CANNOT SYNTHESIZE pbuc1_derefidx_vbuaa=pbuz1_derefidx_vbuc1
pbuc1_derefidx_vbuaa=pbuz1_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A X Y cycles:16.5
pbuc1_derefidx_vbuaa=pbuz1_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A X Y cycles:14.5
tax
lda #{c2}
tay
ldy #{c2}
lda ({z1}),y
sta {c1},x
CANNOT SYNTHESIZE pbuc1_derefidx_vbuaa=pbuc1_derefidx_vbuaa
@ -1226,9 +1213,8 @@ pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuz2 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_
lda ({z1}),y
sta {c1},x
CANNOT SYNTHESIZE pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc1
pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:14.5
lda #{c2}
tay
pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A Y cycles:12.5
ldy #{c2}
lda ({z1}),y
sta {c1},x
CANNOT SYNTHESIZE pbuc1_derefidx_vbuxx=pbuc1_derefidx_vbuaa
@ -1299,11 +1285,10 @@ pbuc1_derefidx_vbuyy=pbuz1_derefidx_vbuz2 < pbuc1_derefidx_vbuaa=pbuz1_derefidx_
lda ({z1}),y
sta {c1},x
CANNOT SYNTHESIZE pbuc1_derefidx_vbuyy=pbuz1_derefidx_vbuc1
pbuc1_derefidx_vbuyy=pbuz1_derefidx_vbuc2 < pbuc1_derefidx_vbuaa=pbuz1_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A X Y cycles:18.5
pbuc1_derefidx_vbuyy=pbuz1_derefidx_vbuc2 < pbuc1_derefidx_vbuaa=pbuz1_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A X Y cycles:16.5
tya
tax
lda #{c2}
tay
ldy #{c2}
lda ({z1}),y
sta {c1},x
CANNOT SYNTHESIZE pbuc1_derefidx_vbuyy=pbuc1_derefidx_vbuaa
@ -1423,11 +1408,10 @@ pbuc1_derefidx_vbuz1=pbuz1_derefidx_vbuz2 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_
lda ({z1}),y
sta {c1},x
CANNOT SYNTHESIZE pbuc1_derefidx_vbuz1=pbuz1_derefidx_vbuc1
pbuc1_derefidx_vbuz1=pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A X Y cycles:17.5
lda #{c2}
tay
lda ({z1}),y
pbuc1_derefidx_vbuz1=pbuz1_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A X Y cycles:15.5
ldx {z1}
ldy #{c2}
lda ({z1}),y
sta {c1},x
pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuaa < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuaa < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuyy < vbuaa=pbuz1_derefidx_vbuyy - clobber:A X Y cycles:15.5
ldx {z1}
@ -1458,17 +1442,15 @@ pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuz3 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_
ldy {z3}
lda ({z2}),y
sta {c1},x
pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A X Y cycles:17.5
lda #{c1}
tay
pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A X Y cycles:15.5
ldy #{c1}
lda ({z2}),y
ldx {z1}
sta {c1},x
pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuaa < vbuaa=pbuz1_derefidx_vbuyy - clobber:A X Y cycles:17.5
lda #{c2}
tay
lda ({z2}),y
pbuc1_derefidx_vbuz1=pbuz2_derefidx_vbuc2 < pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuc2 < vbuaa=pbuz1_derefidx_vbuc1 < vbuaa=pbuz1_derefidx_vbuyy - clobber:A X Y cycles:15.5
ldx {z1}
ldy #{c2}
lda ({z2}),y
sta {c1},x
pbuc1_derefidx_vbuz1=pbuc1_derefidx_vbuaa < pbuc1_derefidx_vbuz1=pbuc1_derefidx_vbuxx < vbuaa=pbuc1_derefidx_vbuxx - clobber:A X cycles:14.5
tax
@ -1539,9 +1521,8 @@ pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2 < pbuc1_derefidx_vbuz1=pbuc2_derefidx_
lda {c2},y
ldy {z1}
sta {c1},y
pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1 < vbuaa=pbuc1_derefidx_vbuaa < vbuaa=pbuc1_derefidx_vbuxx - clobber:A X cycles:16.5
lda #{c1}
tax
pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1 < vbuaa=pbuc1_derefidx_vbuxx - clobber:A X cycles:14.5
ldx #{c1}
lda {c2},x
ldx {z1}
sta {c1},x

View File

@ -335,13 +335,11 @@ CANNOT SYNTHESIZE vbuxx=_inc_pbuc1_derefidx_vbuc2
CANNOT SYNTHESIZE vbuxx=_neg_pbuc1_derefidx_vbuc2
CANNOT SYNTHESIZE vbuxx=_pos_pbuc1_derefidx_vbuc2
CANNOT SYNTHESIZE vbuxx=_bnot_vbuc1
vbuxx=_dec_vbuc1 < vbuxx=_dec_vbuaa < vbuxx=_dec_vbuxx - clobber:A X cycles:6.0
lda #{c1}
tax
vbuxx=_dec_vbuc1 < vbuxx=_dec_vbuxx - clobber:X cycles:4.0
ldx #{c1}
dex
vbuxx=_inc_vbuc1 < vbuxx=_inc_vbuaa < vbuxx=_inc_vbuxx - clobber:A X cycles:6.0
lda #{c1}
tax
vbuxx=_inc_vbuc1 < vbuxx=_inc_vbuxx - clobber:X cycles:4.0
ldx #{c1}
inx
CANNOT SYNTHESIZE vbuxx=_neg_vbuc1
CANNOT SYNTHESIZE vbuxx=_pos_vbuc1
@ -495,13 +493,11 @@ CANNOT SYNTHESIZE vbuyy=_inc_pbuc1_derefidx_vbuc2
CANNOT SYNTHESIZE vbuyy=_neg_pbuc1_derefidx_vbuc2
CANNOT SYNTHESIZE vbuyy=_pos_pbuc1_derefidx_vbuc2
CANNOT SYNTHESIZE vbuyy=_bnot_vbuc1
vbuyy=_dec_vbuc1 < vbuyy=_dec_vbuaa < vbuyy=_dec_vbuyy - clobber:A Y cycles:6.0
lda #{c1}
tay
vbuyy=_dec_vbuc1 < vbuyy=_dec_vbuyy - clobber:Y cycles:4.0
ldy #{c1}
dey
vbuyy=_inc_vbuc1 < vbuyy=_inc_vbuaa < vbuyy=_inc_vbuyy - clobber:A Y cycles:6.0
lda #{c1}
tay
vbuyy=_inc_vbuc1 < vbuyy=_inc_vbuyy - clobber:Y cycles:4.0
ldy #{c1}
iny
CANNOT SYNTHESIZE vbuyy=_neg_vbuc1
CANNOT SYNTHESIZE vbuyy=_pos_vbuc1
@ -852,11 +848,27 @@ vbuz1=_dec_vbuc1 < vbuaa=_dec_vbuc1 < vbuaa=vbuc1_minus_1 < vbuaa=vbuaa_minus_1
sec
sbc #1
sta {z1}
vbuz1=_dec_vbuc1 < vbuxx=_dec_vbuc1 < vbuxx=_dec_vbuxx - clobber:X cycles:7.0
ldx #{c1}
dex
stx {z1}
vbuz1=_dec_vbuc1 < vbuyy=_dec_vbuc1 < vbuyy=_dec_vbuyy - clobber:Y cycles:7.0
ldy #{c1}
dey
sty {z1}
vbuz1=_inc_vbuc1 < vbuaa=_inc_vbuc1 < vbuaa=vbuc1_plus_1 < vbuaa=1_plus_vbuc1 < vbuaa=1_plus_vbuaa < vbuaa=vbuaa_plus_1 - clobber:A cycles:9.0
lda #{c1}
clc
adc #1
sta {z1}
vbuz1=_inc_vbuc1 < vbuxx=_inc_vbuc1 < vbuxx=_inc_vbuxx - clobber:X cycles:7.0
ldx #{c1}
inx
stx {z1}
vbuz1=_inc_vbuc1 < vbuyy=_inc_vbuc1 < vbuyy=_inc_vbuyy - clobber:Y cycles:7.0
ldy #{c1}
iny
sty {z1}
CANNOT SYNTHESIZE vbuz1=_neg_vbuc1
CANNOT SYNTHESIZE vbuz1=_pos_vbuc1
CANNOT SYNTHESIZE _deref_pbuz1=_bnot_vbuaa
@ -1453,30 +1465,26 @@ _deref_pbuc1=_inc_pbuc2_derefidx_vbuz1 < _deref_pbuc1=_inc_pbuc2_derefidx_vbuyy
CANNOT SYNTHESIZE _deref_pbuc1=_neg_pbuc2_derefidx_vbuz1
CANNOT SYNTHESIZE _deref_pbuc1=_pos_pbuc2_derefidx_vbuz1
CANNOT SYNTHESIZE _deref_pbuc1=_bnot_pbuc2_derefidx_vbuc1
_deref_pbuc1=_dec_pbuc2_derefidx_vbuc1 < vbuaa=_dec_pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1_minus_1 < vbuaa=pbuc1_derefidx_vbuaa_minus_1 < vbuaa=pbuc1_derefidx_vbuxx_minus_1 < vbuaa=vbuaa_minus_1 - clobber:A X cycles:16.5
lda #{c1}
tax
_deref_pbuc1=_dec_pbuc2_derefidx_vbuc1 < vbuaa=_dec_pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1_minus_1 < vbuaa=pbuc1_derefidx_vbuxx_minus_1 < vbuaa=vbuaa_minus_1 - clobber:A X cycles:14.5
ldx #{c1}
lda {c2},x
sec
sbc #1
sta {c1}
_deref_pbuc1=_dec_pbuc2_derefidx_vbuc1 < vbuaa=_dec_pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1_minus_1 < vbuaa=pbuc1_derefidx_vbuaa_minus_1 < vbuaa=pbuc1_derefidx_vbuyy_minus_1 < vbuaa=vbuaa_minus_1 - clobber:A Y cycles:16.5
lda #{c1}
tay
_deref_pbuc1=_dec_pbuc2_derefidx_vbuc1 < vbuaa=_dec_pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1_minus_1 < vbuaa=pbuc1_derefidx_vbuyy_minus_1 < vbuaa=vbuaa_minus_1 - clobber:A Y cycles:14.5
ldy #{c1}
lda {c2},y
sec
sbc #1
sta {c1}
_deref_pbuc1=_inc_pbuc2_derefidx_vbuc1 < vbuaa=_inc_pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1_plus_1 < vbuaa=1_plus_pbuc2_derefidx_vbuc1 < vbuaa=1_plus_pbuc1_derefidx_vbuaa < vbuaa=1_plus_pbuc1_derefidx_vbuxx < vbuaa=1_plus_vbuaa < vbuaa=vbuaa_plus_1 - clobber:A X cycles:16.5
lda #{c1}
tax
_deref_pbuc1=_inc_pbuc2_derefidx_vbuc1 < vbuaa=_inc_pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1_plus_1 < vbuaa=1_plus_pbuc2_derefidx_vbuc1 < vbuaa=1_plus_pbuc1_derefidx_vbuxx < vbuaa=1_plus_vbuaa < vbuaa=vbuaa_plus_1 - clobber:A X cycles:14.5
ldx #{c1}
lda {c2},x
clc
adc #1
sta {c1}
_deref_pbuc1=_inc_pbuc2_derefidx_vbuc1 < vbuaa=_inc_pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1_plus_1 < vbuaa=1_plus_pbuc2_derefidx_vbuc1 < vbuaa=1_plus_pbuc1_derefidx_vbuaa < vbuaa=1_plus_pbuc1_derefidx_vbuyy < vbuaa=pbuc1_derefidx_vbuyy_plus_1 < vbuaa=vbuaa_plus_1 - clobber:A Y cycles:16.5
lda #{c1}
tay
_deref_pbuc1=_inc_pbuc2_derefidx_vbuc1 < vbuaa=_inc_pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1_plus_1 < vbuaa=1_plus_pbuc2_derefidx_vbuc1 < vbuaa=1_plus_pbuc1_derefidx_vbuyy < vbuaa=pbuc1_derefidx_vbuyy_plus_1 < vbuaa=vbuaa_plus_1 - clobber:A Y cycles:14.5
ldy #{c1}
lda {c2},y
clc
adc #1
@ -4094,17 +4102,15 @@ pbuc1_derefidx_vbuz1=_inc_pbuc2_derefidx_vbuz2 < pbuc1_derefidx_vbuz1=_inc_pbuc2
CANNOT SYNTHESIZE pbuc1_derefidx_vbuz1=_neg_pbuc2_derefidx_vbuz2
CANNOT SYNTHESIZE pbuc1_derefidx_vbuz1=_pos_pbuc2_derefidx_vbuz2
CANNOT SYNTHESIZE pbuc1_derefidx_vbuz1=_bnot_pbuc2_derefidx_vbuc1
pbuc1_derefidx_vbuz1=_dec_pbuc2_derefidx_vbuc1 < vbuaa=_dec_pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1_minus_1 < vbuaa=pbuc1_derefidx_vbuaa_minus_1 < vbuaa=pbuc1_derefidx_vbuxx_minus_1 < vbuaa=vbuaa_minus_1 - clobber:A X cycles:20.5
lda #{c1}
tax
pbuc1_derefidx_vbuz1=_dec_pbuc2_derefidx_vbuc1 < vbuaa=_dec_pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1_minus_1 < vbuaa=pbuc1_derefidx_vbuxx_minus_1 < vbuaa=vbuaa_minus_1 - clobber:A X cycles:18.5
ldx #{c1}
lda {c2},x
sec
sbc #1
ldx {z1}
sta {c1},x
pbuc1_derefidx_vbuz1=_inc_pbuc2_derefidx_vbuc1 < vbuaa=_inc_pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1_plus_1 < vbuaa=1_plus_pbuc2_derefidx_vbuc1 < vbuaa=1_plus_pbuc1_derefidx_vbuaa < vbuaa=1_plus_pbuc1_derefidx_vbuxx < vbuaa=1_plus_vbuaa < vbuaa=vbuaa_plus_1 - clobber:A X cycles:20.5
lda #{c1}
tax
pbuc1_derefidx_vbuz1=_inc_pbuc2_derefidx_vbuc1 < vbuaa=_inc_pbuc2_derefidx_vbuc1 < vbuaa=pbuc2_derefidx_vbuc1_plus_1 < vbuaa=1_plus_pbuc2_derefidx_vbuc1 < vbuaa=1_plus_pbuc1_derefidx_vbuxx < vbuaa=1_plus_vbuaa < vbuaa=vbuaa_plus_1 - clobber:A X cycles:18.5
ldx #{c1}
lda {c2},x
clc
adc #1