1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-09-08 17:54:40 +00:00

Fixing more tests with word arrays/pointers. Preparing for #139

This commit is contained in:
jespergravgaard 2019-04-19 11:25:29 +02:00
parent 898dc3e833
commit 4e93f0b056
12 changed files with 247 additions and 212 deletions

View File

@ -10,9 +10,9 @@ void main() {
print_cls();
byte s = 0;
for( byte i: 0..2) {
signed word w1 = swords[i*2];
signed word w1 = swords[i];
for( byte j: 0..2) {
signed word w2 = swords[j*2];
signed word w2 = swords[j];
for( byte op: 0..5 ) {
compare(w1,w2,op);
if(++s==3) {

View File

@ -8,9 +8,9 @@ void main() {
print_cls();
byte s = 0;
for( byte i: 0..2) {
word w1 = words[i*2];
word w1 = words[i];
for( byte j: 0..2) {
word w2 = words[j*2];
word w2 = words[j];
for( byte op: 0..5 ) {
compare(w1,w2,op);
if(++s==3) {

View File

@ -16,16 +16,16 @@ main::@1: scope:[main] from main main::@7
[6] (byte) main::s#7 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@7/(byte) main::s#10 )
[6] (byte*) print_char_cursor#81 ← phi( main/((byte*))(word/signed word/dword/signed dword) $400 main::@7/(byte*) print_char_cursor#76 )
[6] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@7/(byte) main::i#1 )
[7] (byte~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[8] (signed word) main::w1#0 ← *((const signed word[]) swords#0 + (byte~) main::$1)
[7] (byte) main::$8 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[8] (signed word) main::w1#0 ← *((const signed word[]) swords#0 + (byte) main::$8)
to:main::@2
main::@2: scope:[main] from main::@1 main::@6
[9] (byte*) print_line_cursor#30 ← phi( main::@1/(byte*) print_line_cursor#32 main::@6/(byte*) print_line_cursor#24 )
[9] (byte) main::s#5 ← phi( main::@1/(byte) main::s#7 main::@6/(byte) main::s#10 )
[9] (byte*) print_char_cursor#75 ← phi( main::@1/(byte*) print_char_cursor#81 main::@6/(byte*) print_char_cursor#76 )
[9] (byte) main::j#2 ← phi( main::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@6/(byte) main::j#1 )
[10] (byte~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[11] (signed word) main::w2#0 ← *((const signed word[]) swords#0 + (byte~) main::$2)
[10] (byte) main::$9 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[11] (signed word) main::w2#0 ← *((const signed word[]) swords#0 + (byte) main::$9)
to:main::@3
main::@3: scope:[main] from main::@2 main::@4
[12] (byte*) print_line_cursor#19 ← phi( main::@2/(byte*) print_line_cursor#30 main::@4/(byte*) print_line_cursor#24 )

View File

@ -1,3 +1,5 @@
Fixing pointer array-indexing *((signed word[]) swords + (byte) main::i)
Fixing pointer array-indexing *((signed word[]) swords + (byte) main::j)
Inlined call (byte~) vicSelectGfxBank::$0 ← call toDd00 (byte*) vicSelectGfxBank::gfx
CONTROL FLOW GRAPH SSA
@ -205,8 +207,8 @@ main::@1: scope:[main] from main::@15 main::@7
(byte) main::s#7 ← phi( main::@15/(byte) main::s#0 main::@7/(byte) main::s#10 )
(byte*) print_char_cursor#81 ← phi( main::@15/(byte*) print_char_cursor#18 main::@7/(byte*) print_char_cursor#78 )
(byte) main::i#2 ← phi( main::@15/(byte) main::i#0 main::@7/(byte) main::i#1 )
(byte/signed word/word/dword/signed dword~) main::$1 ← (byte) main::i#2 * (byte/signed byte/word/signed word/dword/signed dword) 2
(signed word) main::w1#0 ← *((signed word[]) swords#0 + (byte/signed word/word/dword/signed dword~) main::$1)
(byte) main::$8 ← (byte) main::i#2 * (const byte) SIZEOF_SIGNED_WORD
(signed word) main::w1#0 ← *((signed word[]) swords#0 + (byte) main::$8)
(byte) main::j#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@6
@ -216,8 +218,8 @@ main::@2: scope:[main] from main::@1 main::@6
(byte*) print_char_cursor#75 ← phi( main::@1/(byte*) print_char_cursor#81 main::@6/(byte*) print_char_cursor#82 )
(signed word) main::w1#2 ← phi( main::@1/(signed word) main::w1#0 main::@6/(signed word) main::w1#4 )
(byte) main::j#2 ← phi( main::@1/(byte) main::j#0 main::@6/(byte) main::j#1 )
(byte/signed word/word/dword/signed dword~) main::$2 ← (byte) main::j#2 * (byte/signed byte/word/signed word/dword/signed dword) 2
(signed word) main::w2#0 ← *((signed word[]) swords#0 + (byte/signed word/word/dword/signed dword~) main::$2)
(byte) main::$9 ← (byte) main::j#2 * (const byte) SIZEOF_SIGNED_WORD
(signed word) main::w2#0 ← *((signed word[]) swords#0 + (byte) main::$9)
(byte) main::op#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@3
main::@3: scope:[main] from main::@2 main::@4
@ -245,9 +247,9 @@ main::@16: scope:[main] from main::@3
(byte*) print_char_cursor#47 ← phi( main::@3/(byte*) print_char_cursor#28 )
(byte*) print_char_cursor#19 ← (byte*) print_char_cursor#47
(byte) main::s#1 ← ++ (byte) main::s#3
(bool~) main::$4 ← (byte) main::s#1 == (byte/signed byte/word/signed word/dword/signed dword) 3
(bool~) main::$5 ← ! (bool~) main::$4
if((bool~) main::$5) goto main::@4
(bool~) main::$2 ← (byte) main::s#1 == (byte/signed byte/word/signed word/dword/signed dword) 3
(bool~) main::$3 ← ! (bool~) main::$2
if((bool~) main::$3) goto main::@4
to:main::@5
main::@4: scope:[main] from main::@16 main::@17
(byte*) print_line_cursor#31 ← phi( main::@16/(byte*) print_line_cursor#22 main::@17/(byte*) print_line_cursor#6 )
@ -259,8 +261,8 @@ main::@4: scope:[main] from main::@16 main::@17
(signed word) main::w1#3 ← phi( main::@16/(signed word) main::w1#5 main::@17/(signed word) main::w1#6 )
(byte) main::op#3 ← phi( main::@16/(byte) main::op#4 main::@17/(byte) main::op#5 )
(byte) main::op#1 ← (byte) main::op#3 + rangenext(0,5)
(bool~) main::$7 ← (byte) main::op#1 != rangelast(0,5)
if((bool~) main::$7) goto main::@3
(bool~) main::$5 ← (byte) main::op#1 != rangelast(0,5)
if((bool~) main::$5) goto main::@3
to:main::@6
main::@5: scope:[main] from main::@16
(byte) main::i#9 ← phi( main::@16/(byte) main::i#6 )
@ -293,8 +295,8 @@ main::@6: scope:[main] from main::@4
(byte) main::i#4 ← phi( main::@4/(byte) main::i#5 )
(byte) main::j#3 ← phi( main::@4/(byte) main::j#4 )
(byte) main::j#1 ← (byte) main::j#3 + rangenext(0,2)
(bool~) main::$8 ← (byte) main::j#1 != rangelast(0,2)
if((bool~) main::$8) goto main::@2
(bool~) main::$6 ← (byte) main::j#1 != rangelast(0,2)
if((bool~) main::$6) goto main::@2
to:main::@7
main::@7: scope:[main] from main::@6
(byte) main::s#10 ← phi( main::@6/(byte) main::s#8 )
@ -302,8 +304,8 @@ main::@7: scope:[main] from main::@6
(byte*) print_line_cursor#24 ← phi( main::@6/(byte*) print_line_cursor#27 )
(byte) main::i#3 ← phi( main::@6/(byte) main::i#4 )
(byte) main::i#1 ← (byte) main::i#3 + rangenext(0,2)
(bool~) main::$9 ← (byte) main::i#1 != rangelast(0,2)
if((bool~) main::$9) goto main::@1
(bool~) main::$7 ← (byte) main::i#1 != rangelast(0,2)
if((bool~) main::$7) goto main::@1
to:main::@9
main::@9: scope:[main] from main::@10 main::@7
(byte*) print_char_cursor#69 ← phi( main::@10/(byte*) print_char_cursor#77 main::@7/(byte*) print_char_cursor#78 )
@ -663,6 +665,7 @@ SYMBOL TABLE SSA
(byte) LT#0
(byte) NE
(byte) NE#0
(const byte) SIZEOF_SIGNED_WORD = (byte/signed byte/word/signed word/dword/signed dword) 2
(byte) TT
(byte) TT#0
(void()) compare((signed word) compare::w1 , (signed word) compare::w2 , (byte) compare::op)
@ -862,13 +865,13 @@ SYMBOL TABLE SSA
(signed word) compare::w2#8
(signed word) compare::w2#9
(void()) main()
(byte/signed word/word/dword/signed dword~) main::$1
(byte/signed word/word/dword/signed dword~) main::$2
(bool~) main::$4
(bool~) main::$2
(bool~) main::$3
(bool~) main::$5
(bool~) main::$6
(bool~) main::$7
(bool~) main::$8
(bool~) main::$9
(byte) main::$8
(byte) main::$9
(label) main::@1
(label) main::@10
(label) main::@15
@ -1177,7 +1180,7 @@ SYMBOL TABLE SSA
(signed word[]) swords#0
Inversing boolean not [28] (bool~) print_sword::$1 ← (signed word) print_sword::w#3 >= (byte/signed byte/word/signed word/dword/signed dword) 0 from [27] (bool~) print_sword::$0 ← (signed word) print_sword::w#3 < (byte/signed byte/word/signed word/dword/signed dword) 0
Inversing boolean not [124] (bool~) main::$5 ← (byte) main::s#1 != (byte/signed byte/word/signed word/dword/signed dword) 3 from [123] (bool~) main::$4 ← (byte) main::s#1 == (byte/signed byte/word/signed word/dword/signed dword) 3
Inversing boolean not [124] (bool~) main::$3 ← (byte) main::s#1 != (byte/signed byte/word/signed word/dword/signed dword) 3 from [123] (bool~) main::$2 ← (byte) main::s#1 == (byte/signed byte/word/signed word/dword/signed dword) 3
Inversing boolean not [167] (bool~) compare::$28 ← (signed word) compare::w1#1 >= (signed word) compare::w2#1 from [166] (bool~) compare::$27 ← (signed word) compare::w1#1 < (signed word) compare::w2#1
Inversing boolean not [174] (bool~) compare::$26 ← (signed word) compare::w1#2 > (signed word) compare::w2#2 from [173] (bool~) compare::$25 ← (signed word) compare::w1#2 <= (signed word) compare::w2#2
Inversing boolean not [181] (bool~) compare::$24 ← (signed word) compare::w1#3 <= (signed word) compare::w2#3 from [180] (bool~) compare::$23 ← (signed word) compare::w1#3 > (signed word) compare::w2#3
@ -1325,10 +1328,10 @@ Simple Condition (bool~) print_str::$0 [6] if(*((byte*) print_str::str#2)!=(byte
Simple Condition (bool~) print_ln::$1 [19] if((byte*) print_line_cursor#1<(byte*) print_char_cursor#14) goto print_ln::@1
Simple Condition (bool~) print_sword::$1 [29] if((signed word) print_sword::w#3>=(byte/signed byte/word/signed word/dword/signed dword) 0) goto print_sword::@1
Simple Condition (bool~) print_cls::$1 [89] if((byte*) print_cls::sc#1!=(byte*~) print_cls::$0) goto print_cls::@1
Simple Condition (bool~) main::$5 [125] if((byte) main::s#1!=(byte/signed byte/word/signed word/dword/signed dword) 3) goto main::@4
Simple Condition (bool~) main::$7 [129] if((byte) main::op#1!=rangelast(0,5)) goto main::@3
Simple Condition (bool~) main::$8 [139] if((byte) main::j#1!=rangelast(0,2)) goto main::@2
Simple Condition (bool~) main::$9 [143] if((byte) main::i#1!=rangelast(0,2)) goto main::@1
Simple Condition (bool~) main::$3 [125] if((byte) main::s#1!=(byte/signed byte/word/signed word/dword/signed dword) 3) goto main::@4
Simple Condition (bool~) main::$5 [129] if((byte) main::op#1!=rangelast(0,5)) goto main::@3
Simple Condition (bool~) main::$6 [139] if((byte) main::j#1!=rangelast(0,2)) goto main::@2
Simple Condition (bool~) main::$7 [143] if((byte) main::i#1!=rangelast(0,2)) goto main::@1
Simple Condition (bool~) compare::$0 [164] if((byte) compare::op#0==(byte) LT#0) goto compare::@1
Simple Condition (bool~) compare::$28 [168] if((signed word) compare::w1#0>=(signed word) compare::w2#0) goto compare::@38
Simple Condition (bool~) compare::$1 [171] if((byte) compare::op#0==(byte) LE#0) goto compare::@2
@ -1394,8 +1397,8 @@ Resolved ranged next value main::j#1 ← ++ main::j#2 to ++
Resolved ranged comparison value if(main::j#1!=rangelast(0,2)) goto main::@2 to (byte/signed byte/word/signed word/dword/signed dword) 3
Resolved ranged next value main::i#1 ← ++ main::i#10 to ++
Resolved ranged comparison value if(main::i#1!=rangelast(0,2)) goto main::@1 to (byte/signed byte/word/signed word/dword/signed dword) 3
Rewriting multiplication to use shift (byte/signed word/word/dword/signed dword~) main::$1 ← (byte) main::i#2 * (byte/signed byte/word/signed word/dword/signed dword) 2
Rewriting multiplication to use shift (byte/signed word/word/dword/signed dword~) main::$2 ← (byte) main::j#2 * (byte/signed byte/word/signed word/dword/signed dword) 2
Rewriting multiplication to use shift (byte) main::$8 ← (byte) main::i#2 * (const byte) SIZEOF_SIGNED_WORD
Rewriting multiplication to use shift (byte) main::$9 ← (byte) main::j#2 * (const byte) SIZEOF_SIGNED_WORD
Successful SSA optimization Pass2MultiplyToShiftRewriting
Culled Empty Block (label) @4
Culled Empty Block (label) print_ln::@2
@ -1421,8 +1424,7 @@ Successful SSA optimization Pass2SelfPhiElimination
Redundant Phi (signed word) main::w1#2 (signed word) main::w1#0
Redundant Phi (byte) main::i#10 (byte) main::i#2
Successful SSA optimization Pass2RedundantPhiElimination
Inferred type updated to byte in [41] (byte/signed word/word/dword/signed dword~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
Inferred type updated to byte in [44] (byte/signed word/word/dword/signed dword~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
Successful SSA optimization PassNEliminateUnusedVars
Inlining constant with var siblings (const byte) print_char::ch#0
Inlining constant with var siblings (const byte) print_char::ch#3
Inlining constant with var siblings (const byte) print_char::ch#5
@ -1657,16 +1659,16 @@ main::@1: scope:[main] from main main::@7
[6] (byte) main::s#7 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@7/(byte) main::s#10 )
[6] (byte*) print_char_cursor#81 ← phi( main/((byte*))(word/signed word/dword/signed dword) $400 main::@7/(byte*) print_char_cursor#76 )
[6] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@7/(byte) main::i#1 )
[7] (byte~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[8] (signed word) main::w1#0 ← *((const signed word[]) swords#0 + (byte~) main::$1)
[7] (byte) main::$8 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[8] (signed word) main::w1#0 ← *((const signed word[]) swords#0 + (byte) main::$8)
to:main::@2
main::@2: scope:[main] from main::@1 main::@6
[9] (byte*) print_line_cursor#30 ← phi( main::@1/(byte*) print_line_cursor#32 main::@6/(byte*) print_line_cursor#24 )
[9] (byte) main::s#5 ← phi( main::@1/(byte) main::s#7 main::@6/(byte) main::s#10 )
[9] (byte*) print_char_cursor#75 ← phi( main::@1/(byte*) print_char_cursor#81 main::@6/(byte*) print_char_cursor#76 )
[9] (byte) main::j#2 ← phi( main::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@6/(byte) main::j#1 )
[10] (byte~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[11] (signed word) main::w2#0 ← *((const signed word[]) swords#0 + (byte~) main::$2)
[10] (byte) main::$9 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[11] (signed word) main::w2#0 ← *((const signed word[]) swords#0 + (byte) main::$9)
to:main::@3
main::@3: scope:[main] from main::@2 main::@4
[12] (byte*) print_line_cursor#19 ← phi( main::@2/(byte*) print_line_cursor#30 main::@4/(byte*) print_line_cursor#24 )
@ -1937,8 +1939,8 @@ VARIABLE REGISTER WEIGHTS
(signed word) compare::w2
(signed word) compare::w2#0 26.076923076923077
(void()) main()
(byte~) main::$1 22.0
(byte~) main::$2 202.0
(byte) main::$8 22.0
(byte) main::$9 202.0
(byte) main::i
(byte) main::i#1 16.5
(byte) main::i#2 1.5714285714285716
@ -2030,9 +2032,9 @@ Initial phi equivalence classes
[ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
[ print_str::str#2 print_str::str#1 print_str::str#0 ]
[ print_cls::sc#2 print_cls::sc#1 ]
Added variable main::$1 to zero page equivalence class [ main::$1 ]
Added variable main::$8 to zero page equivalence class [ main::$8 ]
Added variable main::w1#0 to zero page equivalence class [ main::w1#0 ]
Added variable main::$2 to zero page equivalence class [ main::$2 ]
Added variable main::$9 to zero page equivalence class [ main::$9 ]
Added variable main::w2#0 to zero page equivalence class [ main::w2#0 ]
Added variable compare::w1#0 to zero page equivalence class [ compare::w1#0 ]
Added variable compare::w2#0 to zero page equivalence class [ compare::w2#0 ]
@ -2053,9 +2055,9 @@ Complete equivalence classes
[ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
[ print_str::str#2 print_str::str#1 print_str::str#0 ]
[ print_cls::sc#2 print_cls::sc#1 ]
[ main::$1 ]
[ main::$8 ]
[ main::w1#0 ]
[ main::$2 ]
[ main::$9 ]
[ main::w2#0 ]
[ compare::w1#0 ]
[ compare::w2#0 ]
@ -2075,9 +2077,9 @@ Allocated zp ZP_WORD:14 [ print_char_cursor#60 print_char_cursor#43 print_char_c
Allocated zp ZP_BYTE:16 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
Allocated zp ZP_WORD:17 [ print_str::str#2 print_str::str#1 print_str::str#0 ]
Allocated zp ZP_WORD:19 [ print_cls::sc#2 print_cls::sc#1 ]
Allocated zp ZP_BYTE:21 [ main::$1 ]
Allocated zp ZP_BYTE:21 [ main::$8 ]
Allocated zp ZP_WORD:22 [ main::w1#0 ]
Allocated zp ZP_BYTE:24 [ main::$2 ]
Allocated zp ZP_BYTE:24 [ main::$9 ]
Allocated zp ZP_WORD:25 [ main::w2#0 ]
Allocated zp ZP_WORD:27 [ compare::w1#0 ]
Allocated zp ZP_WORD:29 [ compare::w2#0 ]
@ -2123,8 +2125,8 @@ bend_from_b1:
bend:
//SEG10 main
main: {
.label _1 = $15
.label _2 = $18
.label _8 = $15
.label _9 = $18
.label w1 = $16
.label w2 = $19
.label s = 5
@ -2163,12 +2165,12 @@ main: {
jmp b1
//SEG23 main::@1
b1:
//SEG24 [7] (byte~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuz1=vbuz2_rol_1
//SEG24 [7] (byte) main::$8 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuz1=vbuz2_rol_1
lda i
asl
sta _1
//SEG25 [8] (signed word) main::w1#0 ← *((const signed word[]) swords#0 + (byte~) main::$1) -- vwsz1=pwsc1_derefidx_vbuz2
ldy _1
sta _8
//SEG25 [8] (signed word) main::w1#0 ← *((const signed word[]) swords#0 + (byte) main::$8) -- vwsz1=pwsc1_derefidx_vbuz2
ldy _8
lda swords,y
sta w1
lda swords+1,y
@ -2191,12 +2193,12 @@ main: {
jmp b2
//SEG36 main::@2
b2:
//SEG37 [10] (byte~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuz1=vbuz2_rol_1
//SEG37 [10] (byte) main::$9 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuz1=vbuz2_rol_1
lda j
asl
sta _2
//SEG38 [11] (signed word) main::w2#0 ← *((const signed word[]) swords#0 + (byte~) main::$2) -- vwsz1=pwsc1_derefidx_vbuz2
ldy _2
sta _9
//SEG38 [11] (signed word) main::w2#0 ← *((const signed word[]) swords#0 + (byte) main::$9) -- vwsz1=pwsc1_derefidx_vbuz2
ldy _9
lda swords,y
sta w2
lda swords+1,y
@ -2975,13 +2977,13 @@ print_cls: {
swords: .word -$6fed, $12, $7fed
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [7] (byte~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::$1 ] ( main:2 [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::$1 ] ) always clobbers reg byte a
Statement [7] (byte) main::$8 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::$8 ] ( main:2 [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::$8 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:5 [ main::s#3 main::s#5 main::s#7 main::s#10 main::s#1 ]
Statement [8] (signed word) main::w1#0 ← *((const signed word[]) swords#0 + (byte~) main::$1) [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::w1#0 ] ( main:2 [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::w1#0 ] ) always clobbers reg byte a
Statement [10] (byte~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::$2 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::$2 ] ) always clobbers reg byte a
Statement [8] (signed word) main::w1#0 ← *((const signed word[]) swords#0 + (byte) main::$8) [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::w1#0 ] ( main:2 [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::w1#0 ] ) always clobbers reg byte a
Statement [10] (byte) main::$9 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::$9 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::$9 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:3 [ main::j#2 main::j#1 ]
Statement [11] (signed word) main::w2#0 ← *((const signed word[]) swords#0 + (byte~) main::$2) [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::w2#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::w2#0 ] ) always clobbers reg byte a
Statement [11] (signed word) main::w2#0 ← *((const signed word[]) swords#0 + (byte) main::$9) [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::w2#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::w2#0 ] ) always clobbers reg byte a
Statement [13] (signed word) compare::w1#0 ← (signed word) main::w1#0 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#67 main::s#3 print_line_cursor#19 compare::w1#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#67 main::s#3 print_line_cursor#19 compare::w1#0 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:4 [ main::op#2 main::op#1 ]
Statement [14] (signed word) compare::w2#0 ← (signed word) main::w2#0 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#67 main::s#3 print_line_cursor#19 compare::w1#0 compare::w2#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#67 main::s#3 print_line_cursor#19 compare::w1#0 compare::w2#0 ] ) always clobbers reg byte a
@ -3018,10 +3020,10 @@ Statement [104] if(*((byte*) print_str::str#2)!=(byte) '@') goto print_str::@2 [
Statement [106] *((byte*) print_char_cursor#2) ← *((byte*) print_str::str#2) [ print_char_cursor#2 print_str::str#2 ] ( main:2::compare:16::print_str:52 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 main::s#3 print_line_cursor#19 compare::w2#0 compare::r#10 print_char_cursor#2 print_str::str#2 ] ) always clobbers reg byte a reg byte y
Statement [111] *((byte*) print_cls::sc#2) ← (byte) ' ' [ print_cls::sc#2 ] ( main:2::print_cls:5 [ print_cls::sc#2 ] ) always clobbers reg byte a reg byte y
Statement [113] if((byte*) print_cls::sc#1!=((byte*))(word/signed word/dword/signed dword) $400+(word/signed word/dword/signed dword) $3e8) goto print_cls::@1 [ print_cls::sc#1 ] ( main:2::print_cls:5 [ print_cls::sc#1 ] ) always clobbers reg byte a
Statement [7] (byte~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::$1 ] ( main:2 [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::$1 ] ) always clobbers reg byte a
Statement [8] (signed word) main::w1#0 ← *((const signed word[]) swords#0 + (byte~) main::$1) [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::w1#0 ] ( main:2 [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::w1#0 ] ) always clobbers reg byte a
Statement [10] (byte~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::$2 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::$2 ] ) always clobbers reg byte a
Statement [11] (signed word) main::w2#0 ← *((const signed word[]) swords#0 + (byte~) main::$2) [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::w2#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::w2#0 ] ) always clobbers reg byte a
Statement [7] (byte) main::$8 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::$8 ] ( main:2 [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::$8 ] ) always clobbers reg byte a
Statement [8] (signed word) main::w1#0 ← *((const signed word[]) swords#0 + (byte) main::$8) [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::w1#0 ] ( main:2 [ main::i#2 print_char_cursor#81 main::s#7 print_line_cursor#32 main::w1#0 ] ) always clobbers reg byte a
Statement [10] (byte) main::$9 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::$9 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::$9 ] ) always clobbers reg byte a
Statement [11] (signed word) main::w2#0 ← *((const signed word[]) swords#0 + (byte) main::$9) [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::w2#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#75 main::s#5 print_line_cursor#30 main::w2#0 ] ) always clobbers reg byte a
Statement [13] (signed word) compare::w1#0 ← (signed word) main::w1#0 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#67 main::s#3 print_line_cursor#19 compare::w1#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#67 main::s#3 print_line_cursor#19 compare::w1#0 ] ) always clobbers reg byte a
Statement [14] (signed word) compare::w2#0 ← (signed word) main::w2#0 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#67 main::s#3 print_line_cursor#19 compare::w1#0 compare::w2#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#67 main::s#3 print_line_cursor#19 compare::w1#0 compare::w2#0 ] ) always clobbers reg byte a
Statement [21] (byte*~) print_char_cursor#116 ← (byte*) print_line_cursor#1 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#116 print_line_cursor#1 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#116 print_line_cursor#1 ] ) always clobbers reg byte a
@ -3062,9 +3064,9 @@ Potential registers zp ZP_WORD:14 [ print_char_cursor#60 print_char_cursor#43 pr
Potential registers zp ZP_BYTE:16 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] : zp ZP_BYTE:16 , reg byte x ,
Potential registers zp ZP_WORD:17 [ print_str::str#2 print_str::str#1 print_str::str#0 ] : zp ZP_WORD:17 ,
Potential registers zp ZP_WORD:19 [ print_cls::sc#2 print_cls::sc#1 ] : zp ZP_WORD:19 ,
Potential registers zp ZP_BYTE:21 [ main::$1 ] : zp ZP_BYTE:21 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:21 [ main::$8 ] : zp ZP_BYTE:21 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_WORD:22 [ main::w1#0 ] : zp ZP_WORD:22 ,
Potential registers zp ZP_BYTE:24 [ main::$2 ] : zp ZP_BYTE:24 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:24 [ main::$9 ] : zp ZP_BYTE:24 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_WORD:25 [ main::w2#0 ] : zp ZP_WORD:25 ,
Potential registers zp ZP_WORD:27 [ compare::w1#0 ] : zp ZP_WORD:27 ,
Potential registers zp ZP_WORD:29 [ compare::w2#0 ] : zp ZP_WORD:29 ,
@ -3075,7 +3077,7 @@ Potential registers zp ZP_BYTE:33 [ print_byte::$2 ] : zp ZP_BYTE:33 , reg byte
REGISTER UPLIFT SCOPES
Uplift Scope [] 27,162.22: zp ZP_WORD:6 [ print_line_cursor#9 print_line_cursor#19 print_line_cursor#30 print_line_cursor#32 print_line_cursor#24 print_line_cursor#1 ] 17,214.99: zp ZP_WORD:14 [ print_char_cursor#60 print_char_cursor#43 print_char_cursor#71 print_char_cursor#2 print_char_cursor#70 print_char_cursor#67 print_char_cursor#75 print_char_cursor#81 print_char_cursor#76 print_char_cursor#14 print_char_cursor#116 print_char_cursor#63 print_char_cursor#61 print_char_cursor#1 ]
Uplift Scope [print_str] 30,005.5: zp ZP_WORD:17 [ print_str::str#2 print_str::str#1 print_str::str#0 ]
Uplift Scope [main] 2,302.43: zp ZP_BYTE:5 [ main::s#3 main::s#5 main::s#7 main::s#10 main::s#1 ] 1,774.5: zp ZP_BYTE:4 [ main::op#2 main::op#1 ] 202: zp ZP_BYTE:24 [ main::$2 ] 170.44: zp ZP_BYTE:3 [ main::j#2 main::j#1 ] 78.71: zp ZP_WORD:25 [ main::w2#0 ] 53.26: zp ZP_WORD:22 [ main::w1#0 ] 22: zp ZP_BYTE:21 [ main::$1 ] 18.07: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope [main] 2,302.43: zp ZP_BYTE:5 [ main::s#3 main::s#5 main::s#7 main::s#10 main::s#1 ] 1,774.5: zp ZP_BYTE:4 [ main::op#2 main::op#1 ] 202: zp ZP_BYTE:24 [ main::$9 ] 170.44: zp ZP_BYTE:3 [ main::j#2 main::j#1 ] 78.71: zp ZP_WORD:25 [ main::w2#0 ] 53.26: zp ZP_WORD:22 [ main::w1#0 ] 22: zp ZP_BYTE:21 [ main::$8 ] 18.07: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope [compare] 168.83: zp ZP_BYTE:31 [ compare::op#0 ] 31.78: zp ZP_WORD:27 [ compare::w1#0 ] 26.08: zp ZP_WORD:29 [ compare::w2#0 ] 12.93: zp ZP_BYTE:10 [ compare::r#10 compare::r#16 compare::r#17 compare::r#18 compare::r#19 compare::r#20 compare::r#21 ] 0.29: zp ZP_WORD:8 [ compare::ops#10 ]
Uplift Scope [print_cls] 33: zp ZP_WORD:19 [ print_cls::sc#2 print_cls::sc#1 ]
Uplift Scope [print_char] 20: zp ZP_BYTE:11 [ print_char::ch#6 print_char::ch#4 print_char::ch#1 print_char::ch#2 ]
@ -3086,7 +3088,7 @@ Uplift Scope [print_word]
Uplifting [] best 1156370 combination zp ZP_WORD:6 [ print_line_cursor#9 print_line_cursor#19 print_line_cursor#30 print_line_cursor#32 print_line_cursor#24 print_line_cursor#1 ] zp ZP_WORD:14 [ print_char_cursor#60 print_char_cursor#43 print_char_cursor#71 print_char_cursor#2 print_char_cursor#70 print_char_cursor#67 print_char_cursor#75 print_char_cursor#81 print_char_cursor#76 print_char_cursor#14 print_char_cursor#116 print_char_cursor#63 print_char_cursor#61 print_char_cursor#1 ]
Uplifting [print_str] best 1156370 combination zp ZP_WORD:17 [ print_str::str#2 print_str::str#1 print_str::str#0 ]
Uplifting [main] best 1143930 combination zp ZP_BYTE:5 [ main::s#3 main::s#5 main::s#7 main::s#10 main::s#1 ] reg byte x [ main::op#2 main::op#1 ] reg byte a [ main::$2 ] zp ZP_BYTE:3 [ main::j#2 main::j#1 ] zp ZP_WORD:25 [ main::w2#0 ] zp ZP_WORD:22 [ main::w1#0 ] reg byte a [ main::$1 ] zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplifting [main] best 1143930 combination zp ZP_BYTE:5 [ main::s#3 main::s#5 main::s#7 main::s#10 main::s#1 ] reg byte x [ main::op#2 main::op#1 ] reg byte a [ main::$9 ] zp ZP_BYTE:3 [ main::j#2 main::j#1 ] zp ZP_WORD:25 [ main::w2#0 ] zp ZP_WORD:22 [ main::w1#0 ] reg byte a [ main::$8 ] zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Limited combination testing to 100 combinations of 256 possible.
Uplifting [compare] best 1140912 combination reg byte x [ compare::op#0 ] zp ZP_WORD:27 [ compare::w1#0 ] zp ZP_WORD:29 [ compare::w2#0 ] zp ZP_BYTE:10 [ compare::r#10 compare::r#16 compare::r#17 compare::r#18 compare::r#19 compare::r#20 compare::r#21 ] zp ZP_WORD:8 [ compare::ops#10 ]
Uplifting [print_cls] best 1140912 combination zp ZP_WORD:19 [ print_cls::sc#2 print_cls::sc#1 ]
@ -3194,10 +3196,10 @@ main: {
jmp b1
//SEG23 main::@1
b1:
//SEG24 [7] (byte~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
//SEG24 [7] (byte) main::$8 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
lda i
asl
//SEG25 [8] (signed word) main::w1#0 ← *((const signed word[]) swords#0 + (byte~) main::$1) -- vwsz1=pwsc1_derefidx_vbuaa
//SEG25 [8] (signed word) main::w1#0 ← *((const signed word[]) swords#0 + (byte) main::$8) -- vwsz1=pwsc1_derefidx_vbuaa
tay
lda swords,y
sta w1
@ -3221,10 +3223,10 @@ main: {
jmp b2
//SEG36 main::@2
b2:
//SEG37 [10] (byte~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
//SEG37 [10] (byte) main::$9 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
lda j
asl
//SEG38 [11] (signed word) main::w2#0 ← *((const signed word[]) swords#0 + (byte~) main::$2) -- vwsz1=pwsc1_derefidx_vbuaa
//SEG38 [11] (signed word) main::w2#0 ← *((const signed word[]) swords#0 + (byte) main::$9) -- vwsz1=pwsc1_derefidx_vbuaa
tay
lda swords,y
sta w2
@ -4238,8 +4240,8 @@ FINAL SYMBOL TABLE
(signed word) compare::w2
(signed word) compare::w2#0 w2 zp ZP_WORD:17 26.076923076923077
(void()) main()
(byte~) main::$1 reg byte a 22.0
(byte~) main::$2 reg byte a 202.0
(byte) main::$8 reg byte a 22.0
(byte) main::$9 reg byte a 202.0
(label) main::@1
(label) main::@2
(label) main::@3
@ -4355,9 +4357,9 @@ reg byte a [ print_char::ch#6 print_char::ch#4 print_char::ch#1 print_char::ch#2
zp ZP_WORD:10 [ print_sword::w#4 print_sword::w#3 print_sword::w#1 print_sword::w#2 print_sword::w#0 compare::w1#0 ]
zp ZP_WORD:12 [ print_char_cursor#60 print_char_cursor#43 print_char_cursor#71 print_char_cursor#2 print_char_cursor#70 print_char_cursor#67 print_char_cursor#75 print_char_cursor#81 print_char_cursor#76 print_char_cursor#14 print_char_cursor#116 print_char_cursor#63 print_char_cursor#61 print_char_cursor#1 ]
zp ZP_BYTE:14 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
reg byte a [ main::$1 ]
reg byte a [ main::$8 ]
zp ZP_WORD:15 [ main::w1#0 ]
reg byte a [ main::$2 ]
reg byte a [ main::$9 ]
zp ZP_WORD:17 [ main::w2#0 compare::w2#0 ]
reg byte x [ compare::op#0 ]
reg byte a [ print_byte::$0 ]
@ -4427,10 +4429,10 @@ main: {
//SEG22 [6] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@7->main::@1#3] -- register_copy
//SEG23 main::@1
b1:
//SEG24 [7] (byte~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
//SEG24 [7] (byte) main::$8 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
lda i
asl
//SEG25 [8] (signed word) main::w1#0 ← *((const signed word[]) swords#0 + (byte~) main::$1) -- vwsz1=pwsc1_derefidx_vbuaa
//SEG25 [8] (signed word) main::w1#0 ← *((const signed word[]) swords#0 + (byte) main::$8) -- vwsz1=pwsc1_derefidx_vbuaa
tay
lda swords,y
sta w1
@ -4450,10 +4452,10 @@ main: {
//SEG35 [9] phi (byte) main::j#2 = (byte) main::j#1 [phi:main::@6->main::@2#3] -- register_copy
//SEG36 main::@2
b2:
//SEG37 [10] (byte~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
//SEG37 [10] (byte) main::$9 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
lda j
asl
//SEG38 [11] (signed word) main::w2#0 ← *((const signed word[]) swords#0 + (byte~) main::$2) -- vwsz1=pwsc1_derefidx_vbuaa
//SEG38 [11] (signed word) main::w2#0 ← *((const signed word[]) swords#0 + (byte) main::$9) -- vwsz1=pwsc1_derefidx_vbuaa
tay
lda swords,y
sta w2

View File

@ -73,8 +73,8 @@
(signed word) compare::w2
(signed word) compare::w2#0 w2 zp ZP_WORD:17 26.076923076923077
(void()) main()
(byte~) main::$1 reg byte a 22.0
(byte~) main::$2 reg byte a 202.0
(byte) main::$8 reg byte a 22.0
(byte) main::$9 reg byte a 202.0
(label) main::@1
(label) main::@2
(label) main::@3
@ -190,9 +190,9 @@ reg byte a [ print_char::ch#6 print_char::ch#4 print_char::ch#1 print_char::ch#2
zp ZP_WORD:10 [ print_sword::w#4 print_sword::w#3 print_sword::w#1 print_sword::w#2 print_sword::w#0 compare::w1#0 ]
zp ZP_WORD:12 [ print_char_cursor#60 print_char_cursor#43 print_char_cursor#71 print_char_cursor#2 print_char_cursor#70 print_char_cursor#67 print_char_cursor#75 print_char_cursor#81 print_char_cursor#76 print_char_cursor#14 print_char_cursor#116 print_char_cursor#63 print_char_cursor#61 print_char_cursor#1 ]
zp ZP_BYTE:14 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
reg byte a [ main::$1 ]
reg byte a [ main::$8 ]
zp ZP_WORD:15 [ main::w1#0 ]
reg byte a [ main::$2 ]
reg byte a [ main::$9 ]
zp ZP_WORD:17 [ main::w2#0 compare::w2#0 ]
reg byte x [ compare::op#0 ]
reg byte a [ print_byte::$0 ]

View File

@ -16,16 +16,16 @@ main::@1: scope:[main] from main main::@7
[6] (byte) main::s#7 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@7/(byte) main::s#10 )
[6] (byte*) print_char_cursor#73 ← phi( main/((byte*))(word/signed word/dword/signed dword) $400 main::@7/(byte*) print_char_cursor#62 )
[6] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@7/(byte) main::i#1 )
[7] (byte~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[8] (word) main::w1#0 ← *((const word[]) words#0 + (byte~) main::$1)
[7] (byte) main::$8 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[8] (word) main::w1#0 ← *((const word[]) words#0 + (byte) main::$8)
to:main::@2
main::@2: scope:[main] from main::@1 main::@6
[9] (byte*) print_line_cursor#30 ← phi( main::@1/(byte*) print_line_cursor#32 main::@6/(byte*) print_line_cursor#24 )
[9] (byte) main::s#5 ← phi( main::@1/(byte) main::s#7 main::@6/(byte) main::s#10 )
[9] (byte*) print_char_cursor#61 ← phi( main::@1/(byte*) print_char_cursor#73 main::@6/(byte*) print_char_cursor#62 )
[9] (byte) main::j#2 ← phi( main::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@6/(byte) main::j#1 )
[10] (byte~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[11] (word) main::w2#0 ← *((const word[]) words#0 + (byte~) main::$2)
[10] (byte) main::$9 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[11] (word) main::w2#0 ← *((const word[]) words#0 + (byte) main::$9)
to:main::@3
main::@3: scope:[main] from main::@2 main::@4
[12] (byte*) print_line_cursor#19 ← phi( main::@2/(byte*) print_line_cursor#30 main::@4/(byte*) print_line_cursor#24 )

View File

@ -1,3 +1,5 @@
Fixing pointer array-indexing *((word[]) words + (byte) main::i)
Fixing pointer array-indexing *((word[]) words + (byte) main::j)
Inlined call (byte~) vicSelectGfxBank::$0 ← call toDd00 (byte*) vicSelectGfxBank::gfx
CONTROL FLOW GRAPH SSA
@ -168,8 +170,8 @@ main::@1: scope:[main] from main::@15 main::@7
(byte) main::s#7 ← phi( main::@15/(byte) main::s#0 main::@7/(byte) main::s#10 )
(byte*) print_char_cursor#73 ← phi( main::@15/(byte*) print_char_cursor#15 main::@7/(byte*) print_char_cursor#64 )
(byte) main::i#2 ← phi( main::@15/(byte) main::i#0 main::@7/(byte) main::i#1 )
(byte/signed word/word/dword/signed dword~) main::$1 ← (byte) main::i#2 * (byte/signed byte/word/signed word/dword/signed dword) 2
(word) main::w1#0 ← *((word[]) words#0 + (byte/signed word/word/dword/signed dword~) main::$1)
(byte) main::$8 ← (byte) main::i#2 * (const byte) SIZEOF_WORD
(word) main::w1#0 ← *((word[]) words#0 + (byte) main::$8)
(byte) main::j#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@6
@ -179,8 +181,8 @@ main::@2: scope:[main] from main::@1 main::@6
(byte*) print_char_cursor#61 ← phi( main::@1/(byte*) print_char_cursor#73 main::@6/(byte*) print_char_cursor#74 )
(word) main::w1#2 ← phi( main::@1/(word) main::w1#0 main::@6/(word) main::w1#4 )
(byte) main::j#2 ← phi( main::@1/(byte) main::j#0 main::@6/(byte) main::j#1 )
(byte/signed word/word/dword/signed dword~) main::$2 ← (byte) main::j#2 * (byte/signed byte/word/signed word/dword/signed dword) 2
(word) main::w2#0 ← *((word[]) words#0 + (byte/signed word/word/dword/signed dword~) main::$2)
(byte) main::$9 ← (byte) main::j#2 * (const byte) SIZEOF_WORD
(word) main::w2#0 ← *((word[]) words#0 + (byte) main::$9)
(byte) main::op#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@3
main::@3: scope:[main] from main::@2 main::@4
@ -208,9 +210,9 @@ main::@16: scope:[main] from main::@3
(byte*) print_char_cursor#40 ← phi( main::@3/(byte*) print_char_cursor#24 )
(byte*) print_char_cursor#16 ← (byte*) print_char_cursor#40
(byte) main::s#1 ← ++ (byte) main::s#3
(bool~) main::$4 ← (byte) main::s#1 == (byte/signed byte/word/signed word/dword/signed dword) 3
(bool~) main::$5 ← ! (bool~) main::$4
if((bool~) main::$5) goto main::@4
(bool~) main::$2 ← (byte) main::s#1 == (byte/signed byte/word/signed word/dword/signed dword) 3
(bool~) main::$3 ← ! (bool~) main::$2
if((bool~) main::$3) goto main::@4
to:main::@5
main::@4: scope:[main] from main::@16 main::@17
(byte*) print_line_cursor#31 ← phi( main::@16/(byte*) print_line_cursor#22 main::@17/(byte*) print_line_cursor#6 )
@ -222,8 +224,8 @@ main::@4: scope:[main] from main::@16 main::@17
(word) main::w1#3 ← phi( main::@16/(word) main::w1#5 main::@17/(word) main::w1#6 )
(byte) main::op#3 ← phi( main::@16/(byte) main::op#4 main::@17/(byte) main::op#5 )
(byte) main::op#1 ← (byte) main::op#3 + rangenext(0,5)
(bool~) main::$7 ← (byte) main::op#1 != rangelast(0,5)
if((bool~) main::$7) goto main::@3
(bool~) main::$5 ← (byte) main::op#1 != rangelast(0,5)
if((bool~) main::$5) goto main::@3
to:main::@6
main::@5: scope:[main] from main::@16
(byte) main::i#9 ← phi( main::@16/(byte) main::i#6 )
@ -256,8 +258,8 @@ main::@6: scope:[main] from main::@4
(byte) main::i#4 ← phi( main::@4/(byte) main::i#5 )
(byte) main::j#3 ← phi( main::@4/(byte) main::j#4 )
(byte) main::j#1 ← (byte) main::j#3 + rangenext(0,2)
(bool~) main::$8 ← (byte) main::j#1 != rangelast(0,2)
if((bool~) main::$8) goto main::@2
(bool~) main::$6 ← (byte) main::j#1 != rangelast(0,2)
if((bool~) main::$6) goto main::@2
to:main::@7
main::@7: scope:[main] from main::@6
(byte) main::s#10 ← phi( main::@6/(byte) main::s#8 )
@ -265,8 +267,8 @@ main::@7: scope:[main] from main::@6
(byte*) print_line_cursor#24 ← phi( main::@6/(byte*) print_line_cursor#27 )
(byte) main::i#3 ← phi( main::@6/(byte) main::i#4 )
(byte) main::i#1 ← (byte) main::i#3 + rangenext(0,2)
(bool~) main::$9 ← (byte) main::i#1 != rangelast(0,2)
if((bool~) main::$9) goto main::@1
(bool~) main::$7 ← (byte) main::i#1 != rangelast(0,2)
if((bool~) main::$7) goto main::@1
to:main::@9
main::@9: scope:[main] from main::@10 main::@7
(byte*) print_char_cursor#57 ← phi( main::@10/(byte*) print_char_cursor#63 main::@7/(byte*) print_char_cursor#64 )
@ -565,6 +567,7 @@ SYMBOL TABLE SSA
(label) @end
(byte) FF
(byte) FF#0
(const byte) SIZEOF_WORD = (byte/signed byte/word/signed word/dword/signed dword) 2
(byte) TT
(byte) TT#0
(void()) compare((word) compare::w1 , (word) compare::w2 , (byte) compare::op)
@ -737,13 +740,13 @@ SYMBOL TABLE SSA
(word) compare::w2#8
(word) compare::w2#9
(void()) main()
(byte/signed word/word/dword/signed dword~) main::$1
(byte/signed word/word/dword/signed dword~) main::$2
(bool~) main::$4
(bool~) main::$2
(bool~) main::$3
(bool~) main::$5
(bool~) main::$6
(bool~) main::$7
(bool~) main::$8
(bool~) main::$9
(byte) main::$8
(byte) main::$9
(label) main::@1
(label) main::@10
(label) main::@15
@ -1017,7 +1020,7 @@ SYMBOL TABLE SSA
(word[]) words
(word[]) words#0
Inversing boolean not [103] (bool~) main::$5 ← (byte) main::s#1 != (byte/signed byte/word/signed word/dword/signed dword) 3 from [102] (bool~) main::$4 ← (byte) main::s#1 == (byte/signed byte/word/signed word/dword/signed dword) 3
Inversing boolean not [103] (bool~) main::$3 ← (byte) main::s#1 != (byte/signed byte/word/signed word/dword/signed dword) 3 from [102] (bool~) main::$2 ← (byte) main::s#1 == (byte/signed byte/word/signed word/dword/signed dword) 3
Inversing boolean not [140] (bool~) compare::$23 ← (word) compare::w1#1 >= (word) compare::w2#1 from [139] (bool~) compare::$22 ← (word) compare::w1#1 < (word) compare::w2#1
Inversing boolean not [147] (bool~) compare::$21 ← (word) compare::w1#2 > (word) compare::w2#2 from [146] (bool~) compare::$20 ← (word) compare::w1#2 <= (word) compare::w2#2
Inversing boolean not [154] (bool~) compare::$19 ← (word) compare::w1#3 <= (word) compare::w2#3 from [153] (bool~) compare::$18 ← (word) compare::w1#3 > (word) compare::w2#3
@ -1140,10 +1143,10 @@ Successful SSA optimization Pass2RedundantPhiElimination
Simple Condition (bool~) print_str::$0 [6] if(*((byte*) print_str::str#2)!=(byte) '@') goto print_str::@2
Simple Condition (bool~) print_ln::$1 [19] if((byte*) print_line_cursor#1<(byte*) print_char_cursor#11) goto print_ln::@1
Simple Condition (bool~) print_cls::$1 [69] if((byte*) print_cls::sc#1!=(byte*~) print_cls::$0) goto print_cls::@1
Simple Condition (bool~) main::$5 [104] if((byte) main::s#1!=(byte/signed byte/word/signed word/dword/signed dword) 3) goto main::@4
Simple Condition (bool~) main::$7 [108] if((byte) main::op#1!=rangelast(0,5)) goto main::@3
Simple Condition (bool~) main::$8 [118] if((byte) main::j#1!=rangelast(0,2)) goto main::@2
Simple Condition (bool~) main::$9 [122] if((byte) main::i#1!=rangelast(0,2)) goto main::@1
Simple Condition (bool~) main::$3 [104] if((byte) main::s#1!=(byte/signed byte/word/signed word/dword/signed dword) 3) goto main::@4
Simple Condition (bool~) main::$5 [108] if((byte) main::op#1!=rangelast(0,5)) goto main::@3
Simple Condition (bool~) main::$6 [118] if((byte) main::j#1!=rangelast(0,2)) goto main::@2
Simple Condition (bool~) main::$7 [122] if((byte) main::i#1!=rangelast(0,2)) goto main::@1
Simple Condition (bool~) compare::$0 [137] if((byte) compare::op#0==(byte/signed byte/word/signed word/dword/signed dword) 0) goto compare::@1
Simple Condition (bool~) compare::$23 [141] if((word) compare::w1#0>=(word) compare::w2#0) goto compare::@34
Simple Condition (bool~) compare::$1 [144] if((byte) compare::op#0==(byte/signed byte/word/signed word/dword/signed dword) 1) goto compare::@2
@ -1196,8 +1199,8 @@ Resolved ranged next value main::j#1 ← ++ main::j#2 to ++
Resolved ranged comparison value if(main::j#1!=rangelast(0,2)) goto main::@2 to (byte/signed byte/word/signed word/dword/signed dword) 3
Resolved ranged next value main::i#1 ← ++ main::i#10 to ++
Resolved ranged comparison value if(main::i#1!=rangelast(0,2)) goto main::@1 to (byte/signed byte/word/signed word/dword/signed dword) 3
Rewriting multiplication to use shift (byte/signed word/word/dword/signed dword~) main::$1 ← (byte) main::i#2 * (byte/signed byte/word/signed word/dword/signed dword) 2
Rewriting multiplication to use shift (byte/signed word/word/dword/signed dword~) main::$2 ← (byte) main::j#2 * (byte/signed byte/word/signed word/dword/signed dword) 2
Rewriting multiplication to use shift (byte) main::$8 ← (byte) main::i#2 * (const byte) SIZEOF_WORD
Rewriting multiplication to use shift (byte) main::$9 ← (byte) main::j#2 * (const byte) SIZEOF_WORD
Successful SSA optimization Pass2MultiplyToShiftRewriting
Culled Empty Block (label) @4
Culled Empty Block (label) print_ln::@2
@ -1220,8 +1223,7 @@ Successful SSA optimization Pass2SelfPhiElimination
Redundant Phi (word) main::w1#2 (word) main::w1#0
Redundant Phi (byte) main::i#10 (byte) main::i#2
Successful SSA optimization Pass2RedundantPhiElimination
Inferred type updated to byte in [35] (byte/signed word/word/dword/signed dword~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
Inferred type updated to byte in [38] (byte/signed word/word/dword/signed dword~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
Successful SSA optimization PassNEliminateUnusedVars
Inlining constant with var siblings (const byte) print_char::ch#3
Inlining constant with var siblings (const byte*) print_cls::sc#0
Inlining constant with var siblings (const byte) main::s#0
@ -1428,16 +1430,16 @@ main::@1: scope:[main] from main main::@7
[6] (byte) main::s#7 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@7/(byte) main::s#10 )
[6] (byte*) print_char_cursor#73 ← phi( main/((byte*))(word/signed word/dword/signed dword) $400 main::@7/(byte*) print_char_cursor#62 )
[6] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@7/(byte) main::i#1 )
[7] (byte~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[8] (word) main::w1#0 ← *((const word[]) words#0 + (byte~) main::$1)
[7] (byte) main::$8 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[8] (word) main::w1#0 ← *((const word[]) words#0 + (byte) main::$8)
to:main::@2
main::@2: scope:[main] from main::@1 main::@6
[9] (byte*) print_line_cursor#30 ← phi( main::@1/(byte*) print_line_cursor#32 main::@6/(byte*) print_line_cursor#24 )
[9] (byte) main::s#5 ← phi( main::@1/(byte) main::s#7 main::@6/(byte) main::s#10 )
[9] (byte*) print_char_cursor#61 ← phi( main::@1/(byte*) print_char_cursor#73 main::@6/(byte*) print_char_cursor#62 )
[9] (byte) main::j#2 ← phi( main::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@6/(byte) main::j#1 )
[10] (byte~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[11] (word) main::w2#0 ← *((const word[]) words#0 + (byte~) main::$2)
[10] (byte) main::$9 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[11] (word) main::w2#0 ← *((const word[]) words#0 + (byte) main::$9)
to:main::@3
main::@3: scope:[main] from main::@2 main::@4
[12] (byte*) print_line_cursor#19 ← phi( main::@2/(byte*) print_line_cursor#30 main::@4/(byte*) print_line_cursor#24 )
@ -1672,8 +1674,8 @@ VARIABLE REGISTER WEIGHTS
(word) compare::w2
(word) compare::w2#0 32.741935483870954
(void()) main()
(byte~) main::$1 22.0
(byte~) main::$2 202.0
(byte) main::$8 22.0
(byte) main::$9 202.0
(byte) main::i
(byte) main::i#1 16.5
(byte) main::i#2 1.5714285714285716
@ -1758,9 +1760,9 @@ Initial phi equivalence classes
[ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
[ print_str::str#2 print_str::str#1 print_str::str#0 ]
[ print_cls::sc#2 print_cls::sc#1 ]
Added variable main::$1 to zero page equivalence class [ main::$1 ]
Added variable main::$8 to zero page equivalence class [ main::$8 ]
Added variable main::w1#0 to zero page equivalence class [ main::w1#0 ]
Added variable main::$2 to zero page equivalence class [ main::$2 ]
Added variable main::$9 to zero page equivalence class [ main::$9 ]
Added variable main::w2#0 to zero page equivalence class [ main::w2#0 ]
Added variable compare::w1#0 to zero page equivalence class [ compare::w1#0 ]
Added variable compare::w2#0 to zero page equivalence class [ compare::w2#0 ]
@ -1781,9 +1783,9 @@ Complete equivalence classes
[ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
[ print_str::str#2 print_str::str#1 print_str::str#0 ]
[ print_cls::sc#2 print_cls::sc#1 ]
[ main::$1 ]
[ main::$8 ]
[ main::w1#0 ]
[ main::$2 ]
[ main::$9 ]
[ main::w2#0 ]
[ compare::w1#0 ]
[ compare::w2#0 ]
@ -1803,9 +1805,9 @@ Allocated zp ZP_WORD:14 [ print_char_cursor#52 print_char_cursor#36 print_char_c
Allocated zp ZP_BYTE:16 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
Allocated zp ZP_WORD:17 [ print_str::str#2 print_str::str#1 print_str::str#0 ]
Allocated zp ZP_WORD:19 [ print_cls::sc#2 print_cls::sc#1 ]
Allocated zp ZP_BYTE:21 [ main::$1 ]
Allocated zp ZP_BYTE:21 [ main::$8 ]
Allocated zp ZP_WORD:22 [ main::w1#0 ]
Allocated zp ZP_BYTE:24 [ main::$2 ]
Allocated zp ZP_BYTE:24 [ main::$9 ]
Allocated zp ZP_WORD:25 [ main::w2#0 ]
Allocated zp ZP_WORD:27 [ compare::w1#0 ]
Allocated zp ZP_WORD:29 [ compare::w2#0 ]
@ -1844,8 +1846,8 @@ bend_from_b1:
bend:
//SEG10 main
main: {
.label _1 = $15
.label _2 = $18
.label _8 = $15
.label _9 = $18
.label w1 = $16
.label w2 = $19
.label s = 5
@ -1884,12 +1886,12 @@ main: {
jmp b1
//SEG23 main::@1
b1:
//SEG24 [7] (byte~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuz1=vbuz2_rol_1
//SEG24 [7] (byte) main::$8 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuz1=vbuz2_rol_1
lda i
asl
sta _1
//SEG25 [8] (word) main::w1#0 ← *((const word[]) words#0 + (byte~) main::$1) -- vwuz1=pwuc1_derefidx_vbuz2
ldy _1
sta _8
//SEG25 [8] (word) main::w1#0 ← *((const word[]) words#0 + (byte) main::$8) -- vwuz1=pwuc1_derefidx_vbuz2
ldy _8
lda words,y
sta w1
lda words+1,y
@ -1912,12 +1914,12 @@ main: {
jmp b2
//SEG36 main::@2
b2:
//SEG37 [10] (byte~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuz1=vbuz2_rol_1
//SEG37 [10] (byte) main::$9 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuz1=vbuz2_rol_1
lda j
asl
sta _2
//SEG38 [11] (word) main::w2#0 ← *((const word[]) words#0 + (byte~) main::$2) -- vwuz1=pwuc1_derefidx_vbuz2
ldy _2
sta _9
//SEG38 [11] (word) main::w2#0 ← *((const word[]) words#0 + (byte) main::$9) -- vwuz1=pwuc1_derefidx_vbuz2
ldy _9
lda words,y
sta w2
lda words+1,y
@ -2611,13 +2613,13 @@ print_cls: {
words: .word $12, $3f34, $cfed
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [7] (byte~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::$1 ] ( main:2 [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::$1 ] ) always clobbers reg byte a
Statement [7] (byte) main::$8 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::$8 ] ( main:2 [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::$8 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:5 [ main::s#3 main::s#5 main::s#7 main::s#10 main::s#1 ]
Statement [8] (word) main::w1#0 ← *((const word[]) words#0 + (byte~) main::$1) [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::w1#0 ] ( main:2 [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::w1#0 ] ) always clobbers reg byte a
Statement [10] (byte~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::$2 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::$2 ] ) always clobbers reg byte a
Statement [8] (word) main::w1#0 ← *((const word[]) words#0 + (byte) main::$8) [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::w1#0 ] ( main:2 [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::w1#0 ] ) always clobbers reg byte a
Statement [10] (byte) main::$9 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::$9 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::$9 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:3 [ main::j#2 main::j#1 ]
Statement [11] (word) main::w2#0 ← *((const word[]) words#0 + (byte~) main::$2) [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::w2#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::w2#0 ] ) always clobbers reg byte a
Statement [11] (word) main::w2#0 ← *((const word[]) words#0 + (byte) main::$9) [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::w2#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::w2#0 ] ) always clobbers reg byte a
Statement [13] (word) compare::w1#0 ← (word) main::w1#0 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#55 main::s#3 print_line_cursor#19 compare::w1#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#55 main::s#3 print_line_cursor#19 compare::w1#0 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:4 [ main::op#2 main::op#1 ]
Statement [14] (word) compare::w2#0 ← (word) main::w2#0 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#55 main::s#3 print_line_cursor#19 compare::w1#0 compare::w2#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#55 main::s#3 print_line_cursor#19 compare::w1#0 compare::w2#0 ] ) always clobbers reg byte a
@ -2650,10 +2652,10 @@ Statement [91] if(*((byte*) print_str::str#2)!=(byte) '@') goto print_str::@2 [
Statement [93] *((byte*) print_char_cursor#2) ← *((byte*) print_str::str#2) [ print_char_cursor#2 print_str::str#2 ] ( main:2::compare:16::print_str:48 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 main::s#3 print_line_cursor#19 compare::w2#0 compare::r#10 print_char_cursor#2 print_str::str#2 ] ) always clobbers reg byte a reg byte y
Statement [98] *((byte*) print_cls::sc#2) ← (byte) ' ' [ print_cls::sc#2 ] ( main:2::print_cls:5 [ print_cls::sc#2 ] ) always clobbers reg byte a reg byte y
Statement [100] if((byte*) print_cls::sc#1!=((byte*))(word/signed word/dword/signed dword) $400+(word/signed word/dword/signed dword) $3e8) goto print_cls::@1 [ print_cls::sc#1 ] ( main:2::print_cls:5 [ print_cls::sc#1 ] ) always clobbers reg byte a
Statement [7] (byte~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::$1 ] ( main:2 [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::$1 ] ) always clobbers reg byte a
Statement [8] (word) main::w1#0 ← *((const word[]) words#0 + (byte~) main::$1) [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::w1#0 ] ( main:2 [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::w1#0 ] ) always clobbers reg byte a
Statement [10] (byte~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::$2 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::$2 ] ) always clobbers reg byte a
Statement [11] (word) main::w2#0 ← *((const word[]) words#0 + (byte~) main::$2) [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::w2#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::w2#0 ] ) always clobbers reg byte a
Statement [7] (byte) main::$8 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::$8 ] ( main:2 [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::$8 ] ) always clobbers reg byte a
Statement [8] (word) main::w1#0 ← *((const word[]) words#0 + (byte) main::$8) [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::w1#0 ] ( main:2 [ main::i#2 print_char_cursor#73 main::s#7 print_line_cursor#32 main::w1#0 ] ) always clobbers reg byte a
Statement [10] (byte) main::$9 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::$9 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::$9 ] ) always clobbers reg byte a
Statement [11] (word) main::w2#0 ← *((const word[]) words#0 + (byte) main::$9) [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::w2#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 print_char_cursor#61 main::s#5 print_line_cursor#30 main::w2#0 ] ) always clobbers reg byte a
Statement [13] (word) compare::w1#0 ← (word) main::w1#0 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#55 main::s#3 print_line_cursor#19 compare::w1#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#55 main::s#3 print_line_cursor#19 compare::w1#0 ] ) always clobbers reg byte a
Statement [14] (word) compare::w2#0 ← (word) main::w2#0 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#55 main::s#3 print_line_cursor#19 compare::w1#0 compare::w2#0 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#55 main::s#3 print_line_cursor#19 compare::w1#0 compare::w2#0 ] ) always clobbers reg byte a
Statement [21] (byte*~) print_char_cursor#101 ← (byte*) print_line_cursor#1 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#101 print_line_cursor#1 ] ( main:2 [ main::i#2 main::w1#0 main::j#2 main::w2#0 main::op#2 print_char_cursor#101 print_line_cursor#1 ] ) always clobbers reg byte a
@ -2690,9 +2692,9 @@ Potential registers zp ZP_WORD:14 [ print_char_cursor#52 print_char_cursor#36 pr
Potential registers zp ZP_BYTE:16 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] : zp ZP_BYTE:16 , reg byte x ,
Potential registers zp ZP_WORD:17 [ print_str::str#2 print_str::str#1 print_str::str#0 ] : zp ZP_WORD:17 ,
Potential registers zp ZP_WORD:19 [ print_cls::sc#2 print_cls::sc#1 ] : zp ZP_WORD:19 ,
Potential registers zp ZP_BYTE:21 [ main::$1 ] : zp ZP_BYTE:21 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:21 [ main::$8 ] : zp ZP_BYTE:21 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_WORD:22 [ main::w1#0 ] : zp ZP_WORD:22 ,
Potential registers zp ZP_BYTE:24 [ main::$2 ] : zp ZP_BYTE:24 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:24 [ main::$9 ] : zp ZP_BYTE:24 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_WORD:25 [ main::w2#0 ] : zp ZP_WORD:25 ,
Potential registers zp ZP_WORD:27 [ compare::w1#0 ] : zp ZP_WORD:27 ,
Potential registers zp ZP_WORD:29 [ compare::w2#0 ] : zp ZP_WORD:29 ,
@ -2703,7 +2705,7 @@ Potential registers zp ZP_BYTE:33 [ print_byte::$2 ] : zp ZP_BYTE:33 , reg byte
REGISTER UPLIFT SCOPES
Uplift Scope [] 27,162.22: zp ZP_WORD:6 [ print_line_cursor#9 print_line_cursor#19 print_line_cursor#30 print_line_cursor#32 print_line_cursor#24 print_line_cursor#1 ] 17,968.66: zp ZP_WORD:14 [ print_char_cursor#52 print_char_cursor#36 print_char_cursor#55 print_char_cursor#61 print_char_cursor#73 print_char_cursor#62 print_char_cursor#11 print_char_cursor#101 print_char_cursor#53 print_char_cursor#2 print_char_cursor#1 ]
Uplift Scope [print_str] 30,005.5: zp ZP_WORD:17 [ print_str::str#2 print_str::str#1 print_str::str#0 ]
Uplift Scope [main] 2,302.43: zp ZP_BYTE:5 [ main::s#3 main::s#5 main::s#7 main::s#10 main::s#1 ] 1,774.5: zp ZP_BYTE:4 [ main::op#2 main::op#1 ] 202: zp ZP_BYTE:24 [ main::$2 ] 170.44: zp ZP_BYTE:3 [ main::j#2 main::j#1 ] 78.71: zp ZP_WORD:25 [ main::w2#0 ] 53.26: zp ZP_WORD:22 [ main::w1#0 ] 22: zp ZP_BYTE:21 [ main::$1 ] 18.07: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope [main] 2,302.43: zp ZP_BYTE:5 [ main::s#3 main::s#5 main::s#7 main::s#10 main::s#1 ] 1,774.5: zp ZP_BYTE:4 [ main::op#2 main::op#1 ] 202: zp ZP_BYTE:24 [ main::$9 ] 170.44: zp ZP_BYTE:3 [ main::j#2 main::j#1 ] 78.71: zp ZP_WORD:25 [ main::w2#0 ] 53.26: zp ZP_WORD:22 [ main::w1#0 ] 22: zp ZP_BYTE:21 [ main::$8 ] 18.07: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope [compare] 168.83: zp ZP_BYTE:31 [ compare::op#0 ] 36.25: zp ZP_WORD:27 [ compare::w1#0 ] 32.74: zp ZP_WORD:29 [ compare::w2#0 ] 14: zp ZP_BYTE:10 [ compare::r#10 compare::r#11 compare::r#12 compare::r#13 compare::r#14 compare::r#15 compare::r#16 ] 0.67: zp ZP_WORD:8 [ compare::ops#7 ]
Uplift Scope [print_cls] 33: zp ZP_WORD:19 [ print_cls::sc#2 print_cls::sc#1 ]
Uplift Scope [print_char] 20: zp ZP_BYTE:11 [ print_char::ch#4 print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
@ -2713,7 +2715,7 @@ Uplift Scope [print_ln]
Uplifting [] best 1156274 combination zp ZP_WORD:6 [ print_line_cursor#9 print_line_cursor#19 print_line_cursor#30 print_line_cursor#32 print_line_cursor#24 print_line_cursor#1 ] zp ZP_WORD:14 [ print_char_cursor#52 print_char_cursor#36 print_char_cursor#55 print_char_cursor#61 print_char_cursor#73 print_char_cursor#62 print_char_cursor#11 print_char_cursor#101 print_char_cursor#53 print_char_cursor#2 print_char_cursor#1 ]
Uplifting [print_str] best 1156274 combination zp ZP_WORD:17 [ print_str::str#2 print_str::str#1 print_str::str#0 ]
Uplifting [main] best 1143834 combination zp ZP_BYTE:5 [ main::s#3 main::s#5 main::s#7 main::s#10 main::s#1 ] reg byte x [ main::op#2 main::op#1 ] reg byte a [ main::$2 ] zp ZP_BYTE:3 [ main::j#2 main::j#1 ] zp ZP_WORD:25 [ main::w2#0 ] zp ZP_WORD:22 [ main::w1#0 ] reg byte a [ main::$1 ] zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplifting [main] best 1143834 combination zp ZP_BYTE:5 [ main::s#3 main::s#5 main::s#7 main::s#10 main::s#1 ] reg byte x [ main::op#2 main::op#1 ] reg byte a [ main::$9 ] zp ZP_BYTE:3 [ main::j#2 main::j#1 ] zp ZP_WORD:25 [ main::w2#0 ] zp ZP_WORD:22 [ main::w1#0 ] reg byte a [ main::$8 ] zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Limited combination testing to 100 combinations of 256 possible.
Uplifting [compare] best 1140816 combination reg byte x [ compare::op#0 ] zp ZP_WORD:27 [ compare::w1#0 ] zp ZP_WORD:29 [ compare::w2#0 ] zp ZP_BYTE:10 [ compare::r#10 compare::r#11 compare::r#12 compare::r#13 compare::r#14 compare::r#15 compare::r#16 ] zp ZP_WORD:8 [ compare::ops#7 ]
Uplifting [print_cls] best 1140816 combination zp ZP_WORD:19 [ print_cls::sc#2 print_cls::sc#1 ]
@ -2813,10 +2815,10 @@ main: {
jmp b1
//SEG23 main::@1
b1:
//SEG24 [7] (byte~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
//SEG24 [7] (byte) main::$8 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
lda i
asl
//SEG25 [8] (word) main::w1#0 ← *((const word[]) words#0 + (byte~) main::$1) -- vwuz1=pwuc1_derefidx_vbuaa
//SEG25 [8] (word) main::w1#0 ← *((const word[]) words#0 + (byte) main::$8) -- vwuz1=pwuc1_derefidx_vbuaa
tay
lda words,y
sta w1
@ -2840,10 +2842,10 @@ main: {
jmp b2
//SEG36 main::@2
b2:
//SEG37 [10] (byte~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
//SEG37 [10] (byte) main::$9 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
lda j
asl
//SEG38 [11] (word) main::w2#0 ← *((const word[]) words#0 + (byte~) main::$2) -- vwuz1=pwuc1_derefidx_vbuaa
//SEG38 [11] (word) main::w2#0 ← *((const word[]) words#0 + (byte) main::$9) -- vwuz1=pwuc1_derefidx_vbuaa
tay
lda words,y
sta w2
@ -3734,8 +3736,8 @@ FINAL SYMBOL TABLE
(word) compare::w2
(word) compare::w2#0 w2 zp ZP_WORD:17 32.741935483870954
(void()) main()
(byte~) main::$1 reg byte a 22.0
(byte~) main::$2 reg byte a 202.0
(byte) main::$8 reg byte a 22.0
(byte) main::$9 reg byte a 202.0
(label) main::@1
(label) main::@2
(label) main::@3
@ -3840,9 +3842,9 @@ reg byte a [ print_char::ch#4 print_char::ch#2 print_char::ch#0 print_char::ch#1
zp ZP_WORD:10 [ print_word::w#2 print_word::w#0 print_word::w#1 compare::w1#0 ]
zp ZP_WORD:12 [ print_char_cursor#52 print_char_cursor#36 print_char_cursor#55 print_char_cursor#61 print_char_cursor#73 print_char_cursor#62 print_char_cursor#11 print_char_cursor#101 print_char_cursor#53 print_char_cursor#2 print_char_cursor#1 ]
zp ZP_BYTE:14 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
reg byte a [ main::$1 ]
reg byte a [ main::$8 ]
zp ZP_WORD:15 [ main::w1#0 ]
reg byte a [ main::$2 ]
reg byte a [ main::$9 ]
zp ZP_WORD:17 [ main::w2#0 compare::w2#0 ]
reg byte x [ compare::op#0 ]
reg byte a [ print_byte::$0 ]
@ -3905,10 +3907,10 @@ main: {
//SEG22 [6] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@7->main::@1#3] -- register_copy
//SEG23 main::@1
b1:
//SEG24 [7] (byte~) main::$1 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
//SEG24 [7] (byte) main::$8 ← (byte) main::i#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
lda i
asl
//SEG25 [8] (word) main::w1#0 ← *((const word[]) words#0 + (byte~) main::$1) -- vwuz1=pwuc1_derefidx_vbuaa
//SEG25 [8] (word) main::w1#0 ← *((const word[]) words#0 + (byte) main::$8) -- vwuz1=pwuc1_derefidx_vbuaa
tay
lda words,y
sta w1
@ -3928,10 +3930,10 @@ main: {
//SEG35 [9] phi (byte) main::j#2 = (byte) main::j#1 [phi:main::@6->main::@2#3] -- register_copy
//SEG36 main::@2
b2:
//SEG37 [10] (byte~) main::$2 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
//SEG37 [10] (byte) main::$9 ← (byte) main::j#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuz1_rol_1
lda j
asl
//SEG38 [11] (word) main::w2#0 ← *((const word[]) words#0 + (byte~) main::$2) -- vwuz1=pwuc1_derefidx_vbuaa
//SEG38 [11] (word) main::w2#0 ← *((const word[]) words#0 + (byte) main::$9) -- vwuz1=pwuc1_derefidx_vbuaa
tay
lda words,y
sta w2

View File

@ -58,8 +58,8 @@
(word) compare::w2
(word) compare::w2#0 w2 zp ZP_WORD:17 32.741935483870954
(void()) main()
(byte~) main::$1 reg byte a 22.0
(byte~) main::$2 reg byte a 202.0
(byte) main::$8 reg byte a 22.0
(byte) main::$9 reg byte a 202.0
(label) main::@1
(label) main::@2
(label) main::@3
@ -164,9 +164,9 @@ reg byte a [ print_char::ch#4 print_char::ch#2 print_char::ch#0 print_char::ch#1
zp ZP_WORD:10 [ print_word::w#2 print_word::w#0 print_word::w#1 compare::w1#0 ]
zp ZP_WORD:12 [ print_char_cursor#52 print_char_cursor#36 print_char_cursor#55 print_char_cursor#61 print_char_cursor#73 print_char_cursor#62 print_char_cursor#11 print_char_cursor#101 print_char_cursor#53 print_char_cursor#2 print_char_cursor#1 ]
zp ZP_BYTE:14 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
reg byte a [ main::$1 ]
reg byte a [ main::$8 ]
zp ZP_WORD:15 [ main::w1#0 ]
reg byte a [ main::$2 ]
reg byte a [ main::$9 ]
zp ZP_WORD:17 [ main::w2#0 compare::w2#0 ]
reg byte x [ compare::op#0 ]
reg byte a [ print_byte::$0 ]

View File

@ -14,13 +14,14 @@ main: {
}
// move_enemy(byte register(Y) obj_slot)
move_enemy: {
sec
lda OBJ_WORLD_X,y
sbc #1
sta OBJ_WORLD_X,y
lda OBJ_WORLD_X+1,y
sbc #0
sta OBJ_WORLD_X+1,y
tya
asl
tax
lda OBJ_WORLD_X,x
bne !+
dec OBJ_WORLD_X+1,x
!:
dec OBJ_WORLD_X,x
rts
}
OBJ_WORLD_X: .fill 2*MAX_OBJECTS, 0

View File

@ -23,8 +23,9 @@ main::@return: scope:[main] from main::@2
[10] return
to:@return
move_enemy: scope:[move_enemy] from main::@1
[11] *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#0) ← *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#0) - (byte/signed byte/word/signed word/dword/signed dword) 1
[11] (byte) move_enemy::$0 ← (byte) move_enemy::obj_slot#0 << (byte/signed byte/word/signed word/dword/signed dword) 1
[12] *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) ← *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) - (byte/signed byte/word/signed word/dword/signed dword) 1
to:move_enemy::@return
move_enemy::@return: scope:[move_enemy] from move_enemy
[12] return
[13] return
to:@return

View File

@ -1,3 +1,5 @@
Fixing pointer array-indexing *((word[MAX_OBJECTS]) OBJ_WORLD_X + (byte) move_enemy::obj_slot)
Fixing pointer array-indexing *((word[MAX_OBJECTS]) OBJ_WORLD_X + (byte) move_enemy::obj_slot)
CONTROL FLOW GRAPH SSA
@begin: scope:[] from
@ -26,7 +28,8 @@ main::@return: scope:[main] from main::@3
to:@return
move_enemy: scope:[move_enemy] from main::@1
(byte) move_enemy::obj_slot#1 ← phi( main::@1/(byte) move_enemy::obj_slot#0 )
*((word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#1) ← *((word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#1) - (byte/signed byte/word/signed word/dword/signed dword) 1
(byte) move_enemy::$0 ← (byte) move_enemy::obj_slot#1 * (const byte) SIZEOF_WORD
*((word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) ← *((word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) - (byte/signed byte/word/signed word/dword/signed dword) 1
(bool) move_enemy::return#1 ← true
to:move_enemy::@return
move_enemy::@return: scope:[move_enemy] from move_enemy
@ -51,6 +54,7 @@ SYMBOL TABLE SSA
(byte) MAX_OBJECTS#0
(word[MAX_OBJECTS#0]) OBJ_WORLD_X
(word[MAX_OBJECTS#0]) OBJ_WORLD_X#0
(const byte) SIZEOF_WORD = (byte/signed byte/word/signed word/dword/signed dword) 2
(void()) main()
(bool~) main::$1
(label) main::@1
@ -62,6 +66,7 @@ SYMBOL TABLE SSA
(byte) main::i#2
(byte) main::i#3
(bool()) move_enemy((byte) move_enemy::obj_slot)
(byte) move_enemy::$0
(label) move_enemy::@return
(byte) move_enemy::obj_slot
(byte) move_enemy::obj_slot#0
@ -92,8 +97,11 @@ Successful SSA optimization PassNEliminateUnusedVars
Successful SSA optimization PassNEliminateUnusedVars
Resolved ranged next value main::i#1 ← ++ main::i#2 to ++
Resolved ranged comparison value if(main::i#1!=rangelast(0,5)) goto main::@1 to (byte/signed byte/word/signed word/dword/signed dword) 6
Rewriting multiplication to use shift (byte) move_enemy::$0 ← (byte) move_enemy::obj_slot#0 * (const byte) SIZEOF_WORD
Successful SSA optimization Pass2MultiplyToShiftRewriting
Culled Empty Block (label) @19
Successful SSA optimization Pass2CullEmptyBlocks
Successful SSA optimization PassNEliminateUnusedVars
Inlining constant with var siblings (const byte) main::i#0
Constant inlined main::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Successful SSA optimization Pass2ConstantInlining
@ -143,10 +151,11 @@ main::@return: scope:[main] from main::@2
[10] return
to:@return
move_enemy: scope:[move_enemy] from main::@1
[11] *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#0) ← *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#0) - (byte/signed byte/word/signed word/dword/signed dword) 1
[11] (byte) move_enemy::$0 ← (byte) move_enemy::obj_slot#0 << (byte/signed byte/word/signed word/dword/signed dword) 1
[12] *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) ← *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) - (byte/signed byte/word/signed word/dword/signed dword) 1
to:move_enemy::@return
move_enemy::@return: scope:[move_enemy] from move_enemy
[12] return
[13] return
to:@return
@ -158,18 +167,22 @@ VARIABLE REGISTER WEIGHTS
(byte) main::i#1 16.5
(byte) main::i#2 11.0
(bool()) move_enemy((byte) move_enemy::obj_slot)
(byte) move_enemy::$0 6.0
(byte) move_enemy::obj_slot
(byte) move_enemy::obj_slot#0 15.0
(byte) move_enemy::obj_slot#0 13.0
(bool) move_enemy::return
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
Added variable move_enemy::obj_slot#0 to zero page equivalence class [ move_enemy::obj_slot#0 ]
Added variable move_enemy::$0 to zero page equivalence class [ move_enemy::$0 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
[ move_enemy::obj_slot#0 ]
[ move_enemy::$0 ]
Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Allocated zp ZP_BYTE:3 [ move_enemy::obj_slot#0 ]
Allocated zp ZP_BYTE:4 [ move_enemy::$0 ]
INITIAL ASM
//SEG0 File Comments
@ -234,37 +247,45 @@ main: {
//SEG23 move_enemy
// move_enemy(byte zeropage(3) obj_slot)
move_enemy: {
.label _0 = 4
.label obj_slot = 3
//SEG24 [11] *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#0) ← *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#0) - (byte/signed byte/word/signed word/dword/signed dword) 1 -- pwuc1_derefidx_vbuz1=pwuc1_derefidx_vbuz1_minus_1
ldx obj_slot
//SEG24 [11] (byte) move_enemy::$0 ← (byte) move_enemy::obj_slot#0 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuz1=vbuz2_rol_1
lda obj_slot
asl
sta _0
//SEG25 [12] *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) ← *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) - (byte/signed byte/word/signed word/dword/signed dword) 1 -- pwuc1_derefidx_vbuz1=pwuc1_derefidx_vbuz1_minus_1
ldx _0
lda OBJ_WORLD_X,x
bne !+
dec OBJ_WORLD_X+1,x
!:
dec OBJ_WORLD_X,x
jmp breturn
//SEG25 move_enemy::@return
//SEG26 move_enemy::@return
breturn:
//SEG26 [12] return
//SEG27 [13] return
rts
}
OBJ_WORLD_X: .fill 2*MAX_OBJECTS, 0
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [11] *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#0) ← *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#0) - (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::move_enemy:7 [ main::i#2 ] ) always clobbers reg byte a
Statement [11] (byte) move_enemy::$0 ← (byte) move_enemy::obj_slot#0 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ move_enemy::$0 ] ( main:2::move_enemy:7 [ main::i#2 move_enemy::$0 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Statement [11] *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#0) ← *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#0) - (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::move_enemy:7 [ main::i#2 ] ) always clobbers reg byte a
Statement [12] *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) ← *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) - (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::move_enemy:7 [ main::i#2 ] ) always clobbers reg byte a
Statement [11] (byte) move_enemy::$0 ← (byte) move_enemy::obj_slot#0 << (byte/signed byte/word/signed word/dword/signed dword) 1 [ move_enemy::$0 ] ( main:2::move_enemy:7 [ main::i#2 move_enemy::$0 ] ) always clobbers reg byte a
Statement [12] *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) ← *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) - (byte/signed byte/word/signed word/dword/signed dword) 1 [ ] ( main:2::move_enemy:7 [ main::i#2 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ move_enemy::obj_slot#0 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:4 [ move_enemy::$0 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 27.5: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope [move_enemy] 15: zp ZP_BYTE:3 [ move_enemy::obj_slot#0 ]
Uplift Scope [move_enemy] 13: zp ZP_BYTE:3 [ move_enemy::obj_slot#0 ] 6: zp ZP_BYTE:4 [ move_enemy::$0 ]
Uplift Scope []
Uplifting [main] best 346 combination reg byte y [ main::i#2 main::i#1 ]
Uplifting [move_enemy] best 317 combination reg byte y [ move_enemy::obj_slot#0 ]
Uplifting [] best 317 combination
Uplifting [main] best 354 combination reg byte y [ main::i#2 main::i#1 ]
Uplifting [move_enemy] best 319 combination reg byte y [ move_enemy::obj_slot#0 ] reg byte a [ move_enemy::$0 ]
Uplifting [] best 319 combination
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 File Comments
@ -324,18 +345,20 @@ main: {
//SEG23 move_enemy
// move_enemy(byte register(Y) obj_slot)
move_enemy: {
//SEG24 [11] *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#0) ← *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#0) - (byte/signed byte/word/signed word/dword/signed dword) 1 -- pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuyy_minus_1
sec
lda OBJ_WORLD_X,y
sbc #1
sta OBJ_WORLD_X,y
lda OBJ_WORLD_X+1,y
sbc #0
sta OBJ_WORLD_X+1,y
//SEG24 [11] (byte) move_enemy::$0 ← (byte) move_enemy::obj_slot#0 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuyy_rol_1
tya
asl
//SEG25 [12] *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) ← *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) - (byte/signed byte/word/signed word/dword/signed dword) 1 -- pwuc1_derefidx_vbuaa=pwuc1_derefidx_vbuaa_minus_1
tax
lda OBJ_WORLD_X,x
bne !+
dec OBJ_WORLD_X+1,x
!:
dec OBJ_WORLD_X,x
jmp breturn
//SEG25 move_enemy::@return
//SEG26 move_enemy::@return
breturn:
//SEG26 [12] return
//SEG27 [13] return
rts
}
OBJ_WORLD_X: .fill 2*MAX_OBJECTS, 0
@ -385,17 +408,19 @@ FINAL SYMBOL TABLE
(byte) main::i#1 reg byte y 16.5
(byte) main::i#2 reg byte y 11.0
(bool()) move_enemy((byte) move_enemy::obj_slot)
(byte) move_enemy::$0 reg byte a 6.0
(label) move_enemy::@return
(byte) move_enemy::obj_slot
(byte) move_enemy::obj_slot#0 reg byte y 15.0
(byte) move_enemy::obj_slot#0 reg byte y 13.0
(bool) move_enemy::return
reg byte y [ main::i#2 main::i#1 ]
reg byte y [ move_enemy::obj_slot#0 ]
reg byte a [ move_enemy::$0 ]
FINAL ASSEMBLER
Score: 182
Score: 184
//SEG0 File Comments
// Adding a missing word-fragment for Travis Fisher
@ -437,16 +462,18 @@ main: {
//SEG23 move_enemy
// move_enemy(byte register(Y) obj_slot)
move_enemy: {
//SEG24 [11] *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#0) ← *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::obj_slot#0) - (byte/signed byte/word/signed word/dword/signed dword) 1 -- pwuc1_derefidx_vbuyy=pwuc1_derefidx_vbuyy_minus_1
sec
lda OBJ_WORLD_X,y
sbc #1
sta OBJ_WORLD_X,y
lda OBJ_WORLD_X+1,y
sbc #0
sta OBJ_WORLD_X+1,y
//SEG25 move_enemy::@return
//SEG26 [12] return
//SEG24 [11] (byte) move_enemy::$0 ← (byte) move_enemy::obj_slot#0 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuyy_rol_1
tya
asl
//SEG25 [12] *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) ← *((const word[MAX_OBJECTS#0]) OBJ_WORLD_X#0 + (byte) move_enemy::$0) - (byte/signed byte/word/signed word/dword/signed dword) 1 -- pwuc1_derefidx_vbuaa=pwuc1_derefidx_vbuaa_minus_1
tax
lda OBJ_WORLD_X,x
bne !+
dec OBJ_WORLD_X+1,x
!:
dec OBJ_WORLD_X,x
//SEG26 move_enemy::@return
//SEG27 [13] return
rts
}
OBJ_WORLD_X: .fill 2*MAX_OBJECTS, 0

View File

@ -13,10 +13,12 @@
(byte) main::i#1 reg byte y 16.5
(byte) main::i#2 reg byte y 11.0
(bool()) move_enemy((byte) move_enemy::obj_slot)
(byte) move_enemy::$0 reg byte a 6.0
(label) move_enemy::@return
(byte) move_enemy::obj_slot
(byte) move_enemy::obj_slot#0 reg byte y 15.0
(byte) move_enemy::obj_slot#0 reg byte y 13.0
(bool) move_enemy::return
reg byte y [ main::i#2 main::i#1 ]
reg byte y [ move_enemy::obj_slot#0 ]
reg byte a [ move_enemy::$0 ]