1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-10-10 20:23:47 +00:00

Added inline hello world 2

This commit is contained in:
jespergravgaard 2018-08-31 23:43:37 +02:00
parent 82c7a6c84d
commit e335a956e7
7 changed files with 794 additions and 1 deletions

View File

@ -247,6 +247,11 @@ public class TestPrograms {
compileAndCompare("helloworld2");
}
@Test
public void testHelloWorld2Inline() throws IOException, URISyntaxException {
compileAndCompare("helloworld2-inline");
}
@Test
public void testChessboard() throws IOException, URISyntaxException {
compileAndCompare("chessboard");

View File

@ -0,0 +1,14 @@
byte* screen = $400;
void main() {
byte* hello = "hello world!@";
print2(screen, hello);
print2(screen+80, hello);
}
inline void print2(byte* at, byte* msg) {
byte j=0;
for(byte i=0; msg[i]!='@'; i++) {
at[j] = msg[i];
j += 2;
}
}

View File

@ -5,7 +5,7 @@ void main() {
print2(screen+80, hello);
}
void print2(byte* at, byte* msg) {
inline void print2(byte* at, byte* msg) {
byte j=0;
for(byte i=0; msg[i]!='@'; i++) {
at[j] = msg[i];

View File

@ -0,0 +1,32 @@
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
.label screen = $400
jsr main
main: {
.label print22_at = screen+$50
ldx #0
ldy #0
print21_b1:
lda print21_msg,y
sta screen,x
inx
inx
iny
lda print21_msg,y
cmp #'@'
bne print21_b1
ldx #0
ldy #0
print22_b1:
lda print21_msg,y
sta print22_at,x
inx
inx
iny
lda print21_msg,y
cmp #'@'
bne print22_b1
rts
print21_msg: .text "hello world!@"
}

View File

@ -0,0 +1,37 @@
@begin: scope:[] from
[0] phi() [ ] ( )
to:@2
@2: scope:[] from @begin
[1] phi() [ ] ( )
[2] call main [ ] ( )
to:@end
@end: scope:[] from @2
[3] phi() [ ] ( )
main: scope:[main] from @2
[4] phi() [ ] ( main:2 [ ] )
to:main::print21
main::print21: scope:[main] from main
[5] phi() [ ] ( main:2 [ ] )
to:main::print21_@1
main::print21_@1: scope:[main] from main::print21 main::print21_@1
[6] (byte) main::print21_j#2 ← phi( main::print21/(byte/signed byte/word/signed word/dword/signed dword) 0 main::print21_@1/(byte) main::print21_j#1 ) [ main::print21_i#2 main::print21_j#2 ] ( main:2 [ main::print21_i#2 main::print21_j#2 ] )
[6] (byte) main::print21_i#2 ← phi( main::print21/(byte/signed byte/word/signed word/dword/signed dword) 0 main::print21_@1/(byte) main::print21_i#1 ) [ main::print21_i#2 main::print21_j#2 ] ( main:2 [ main::print21_i#2 main::print21_j#2 ] )
[7] *((const byte*) screen#0 + (byte) main::print21_j#2) ← *((const byte*) main::print21_msg#0 + (byte) main::print21_i#2) [ main::print21_i#2 main::print21_j#2 ] ( main:2 [ main::print21_i#2 main::print21_j#2 ] )
[8] (byte) main::print21_j#1 ← (byte) main::print21_j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 [ main::print21_i#2 main::print21_j#1 ] ( main:2 [ main::print21_i#2 main::print21_j#1 ] )
[9] (byte) main::print21_i#1 ← ++ (byte) main::print21_i#2 [ main::print21_i#1 main::print21_j#1 ] ( main:2 [ main::print21_i#1 main::print21_j#1 ] )
[10] if(*((const byte*) main::print21_msg#0 + (byte) main::print21_i#1)!=(byte) '@') goto main::print21_@1 [ main::print21_i#1 main::print21_j#1 ] ( main:2 [ main::print21_i#1 main::print21_j#1 ] )
to:main::print22
main::print22: scope:[main] from main::print21_@1
[11] phi() [ ] ( main:2 [ ] )
to:main::print22_@1
main::print22_@1: scope:[main] from main::print22 main::print22_@1
[12] (byte) main::print22_j#2 ← phi( main::print22/(byte/signed byte/word/signed word/dword/signed dword) 0 main::print22_@1/(byte) main::print22_j#1 ) [ main::print22_i#2 main::print22_j#2 ] ( main:2 [ main::print22_i#2 main::print22_j#2 ] )
[12] (byte) main::print22_i#2 ← phi( main::print22/(byte/signed byte/word/signed word/dword/signed dword) 0 main::print22_@1/(byte) main::print22_i#1 ) [ main::print22_i#2 main::print22_j#2 ] ( main:2 [ main::print22_i#2 main::print22_j#2 ] )
[13] *((const byte*) main::print22_at#0 + (byte) main::print22_j#2) ← *((const byte*) main::print21_msg#0 + (byte) main::print22_i#2) [ main::print22_i#2 main::print22_j#2 ] ( main:2 [ main::print22_i#2 main::print22_j#2 ] )
[14] (byte) main::print22_j#1 ← (byte) main::print22_j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 [ main::print22_i#2 main::print22_j#1 ] ( main:2 [ main::print22_i#2 main::print22_j#1 ] )
[15] (byte) main::print22_i#1 ← ++ (byte) main::print22_i#2 [ main::print22_i#1 main::print22_j#1 ] ( main:2 [ main::print22_i#1 main::print22_j#1 ] )
[16] if(*((const byte*) main::print21_msg#0 + (byte) main::print22_i#1)!=(byte) '@') goto main::print22_@1 [ main::print22_i#1 main::print22_j#1 ] ( main:2 [ main::print22_i#1 main::print22_j#1 ] )
to:main::@return
main::@return: scope:[main] from main::print22_@1
[17] return [ ] ( main:2 [ ] )
to:@return

View File

@ -0,0 +1,668 @@
Inlined call call print2 (byte*) screen (byte*) main::hello
Inlined call call print2 (byte*~) main::$1 (byte*) main::hello
CONTROL FLOW GRAPH SSA
@begin: scope:[] from
(byte*) screen#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024
to:@2
main: scope:[main] from @2
(byte*) screen#1 ← phi( @2/(byte*) screen#3 )
(byte*) main::hello#0 ← (const string) main::$3
(byte*) main::print21_at#0 ← (byte*) screen#1
(byte*) main::print21_msg#0 ← (byte*) main::hello#0
to:main::print21
main::print21: scope:[main] from main
(byte*) main::hello#3 ← phi( main/(byte*) main::hello#0 )
(byte*) screen#5 ← phi( main/(byte*) screen#1 )
(byte*) main::print21_at#2 ← phi( main/(byte*) main::print21_at#0 )
(byte*) main::print21_msg#2 ← phi( main/(byte*) main::print21_msg#0 )
(byte) main::print21_j#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte) main::print21_i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::print21_@1
main::print21_@1: scope:[main] from main::print21 main::print21_@1
(byte*) main::hello#2 ← phi( main::print21/(byte*) main::hello#3 main::print21_@1/(byte*) main::hello#2 )
(byte*) screen#4 ← phi( main::print21/(byte*) screen#5 main::print21_@1/(byte*) screen#4 )
(byte) main::print21_j#2 ← phi( main::print21/(byte) main::print21_j#0 main::print21_@1/(byte) main::print21_j#1 )
(byte*) main::print21_at#1 ← phi( main::print21/(byte*) main::print21_at#2 main::print21_@1/(byte*) main::print21_at#1 )
(byte) main::print21_i#2 ← phi( main::print21/(byte) main::print21_i#0 main::print21_@1/(byte) main::print21_i#1 )
(byte*) main::print21_msg#1 ← phi( main::print21/(byte*) main::print21_msg#2 main::print21_@1/(byte*) main::print21_msg#1 )
*((byte*) main::print21_at#1 + (byte) main::print21_j#2) ← *((byte*) main::print21_msg#1 + (byte) main::print21_i#2)
(byte) main::print21_j#1 ← (byte) main::print21_j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2
(byte) main::print21_i#1 ← ++ (byte) main::print21_i#2
(bool) main::print21_$0#0 ← *((byte*) main::print21_msg#1 + (byte) main::print21_i#1) != (byte) '@'
if((bool) main::print21_$0#0) goto main::print21_@1
to:main::@1
main::@1: scope:[main] from main::print21_@1
(byte*) main::hello#1 ← phi( main::print21_@1/(byte*) main::hello#2 )
(byte*) screen#2 ← phi( main::print21_@1/(byte*) screen#4 )
(byte*~) main::$1 ← (byte*) screen#2 + (byte/signed byte/word/signed word/dword/signed dword) 80
(byte*) main::print22_at#0 ← (byte*~) main::$1
(byte*) main::print22_msg#0 ← (byte*) main::hello#1
to:main::print22
main::print22: scope:[main] from main::@1
(byte*) main::print22_at#2 ← phi( main::@1/(byte*) main::print22_at#0 )
(byte*) main::print22_msg#2 ← phi( main::@1/(byte*) main::print22_msg#0 )
(byte) main::print22_j#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte) main::print22_i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::print22_@1
main::print22_@1: scope:[main] from main::print22 main::print22_@1
(byte) main::print22_j#2 ← phi( main::print22/(byte) main::print22_j#0 main::print22_@1/(byte) main::print22_j#1 )
(byte*) main::print22_at#1 ← phi( main::print22/(byte*) main::print22_at#2 main::print22_@1/(byte*) main::print22_at#1 )
(byte) main::print22_i#2 ← phi( main::print22/(byte) main::print22_i#0 main::print22_@1/(byte) main::print22_i#1 )
(byte*) main::print22_msg#1 ← phi( main::print22/(byte*) main::print22_msg#2 main::print22_@1/(byte*) main::print22_msg#1 )
*((byte*) main::print22_at#1 + (byte) main::print22_j#2) ← *((byte*) main::print22_msg#1 + (byte) main::print22_i#2)
(byte) main::print22_j#1 ← (byte) main::print22_j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2
(byte) main::print22_i#1 ← ++ (byte) main::print22_i#2
(bool) main::print22_$0#0 ← *((byte*) main::print22_msg#1 + (byte) main::print22_i#1) != (byte) '@'
if((bool) main::print22_$0#0) goto main::print22_@1
to:main::@return
main::@return: scope:[main] from main::print22_@1
return
to:@return
@2: scope:[] from @begin
(byte*) screen#3 ← phi( @begin/(byte*) screen#0 )
call main
to:@3
@3: scope:[] from @2
to:@end
@end: scope:[] from @3
SYMBOL TABLE SSA
(label) @2
(label) @3
(label) @begin
(label) @end
(void()) main()
(byte*~) main::$1
(const string) main::$3 = (string) "hello world!@"
(label) main::@1
(label) main::@return
(byte*) main::hello
(byte*) main::hello#0
(byte*) main::hello#1
(byte*) main::hello#2
(byte*) main::hello#3
(label) main::print21
(bool~) main::print21_$0
(bool) main::print21_$0#0
(label) main::print21_@1
(byte*) main::print21_at
(byte*) main::print21_at#0
(byte*) main::print21_at#1
(byte*) main::print21_at#2
(byte) main::print21_i
(byte) main::print21_i#0
(byte) main::print21_i#1
(byte) main::print21_i#2
(byte) main::print21_j
(byte) main::print21_j#0
(byte) main::print21_j#1
(byte) main::print21_j#2
(byte*) main::print21_msg
(byte*) main::print21_msg#0
(byte*) main::print21_msg#1
(byte*) main::print21_msg#2
(label) main::print22
(bool~) main::print22_$0
(bool) main::print22_$0#0
(label) main::print22_@1
(byte*) main::print22_at
(byte*) main::print22_at#0
(byte*) main::print22_at#1
(byte*) main::print22_at#2
(byte) main::print22_i
(byte) main::print22_i#0
(byte) main::print22_i#1
(byte) main::print22_i#2
(byte) main::print22_j
(byte) main::print22_j#0
(byte) main::print22_j#1
(byte) main::print22_j#2
(byte*) main::print22_msg
(byte*) main::print22_msg#0
(byte*) main::print22_msg#1
(byte*) main::print22_msg#2
(byte*) screen
(byte*) screen#0
(byte*) screen#1
(byte*) screen#2
(byte*) screen#3
(byte*) screen#4
(byte*) screen#5
Culled Empty Block (label) @3
Successful SSA optimization Pass2CullEmptyBlocks
Alias (byte*) main::print21_msg#0 = (byte*) main::hello#0 (byte*) main::print21_msg#2 (byte*) main::hello#3
Alias (byte*) main::print21_at#0 = (byte*) main::print21_at#2
Alias (byte*) screen#1 = (byte*) screen#5
Alias (byte*) screen#2 = (byte*) screen#4
Alias (byte*) main::hello#1 = (byte*) main::hello#2 (byte*) main::print22_msg#0 (byte*) main::print22_msg#2
Alias (byte*) main::print22_at#0 = (byte*~) main::$1 (byte*) main::print22_at#2
Alias (byte*) screen#0 = (byte*) screen#3
Successful SSA optimization Pass2AliasElimination
Self Phi Eliminated (byte*) main::print21_msg#1
Self Phi Eliminated (byte*) main::print21_at#1
Self Phi Eliminated (byte*) screen#2
Self Phi Eliminated (byte*) main::hello#1
Self Phi Eliminated (byte*) main::print22_msg#1
Self Phi Eliminated (byte*) main::print22_at#1
Successful SSA optimization Pass2SelfPhiElimination
Redundant Phi (byte*) screen#1 (byte*) screen#0
Redundant Phi (byte*) main::print21_msg#1 (byte*) main::print21_msg#0
Redundant Phi (byte*) main::print21_at#1 (byte*) main::print21_at#0
Redundant Phi (byte*) screen#2 (byte*) screen#1
Redundant Phi (byte*) main::hello#1 (byte*) main::print21_msg#0
Redundant Phi (byte*) main::print22_msg#1 (byte*) main::hello#1
Redundant Phi (byte*) main::print22_at#1 (byte*) main::print22_at#0
Successful SSA optimization Pass2RedundantPhiElimination
Simple Condition (bool) main::print21_$0#0 if(*((byte*) main::print21_msg#0 + (byte) main::print21_i#1)!=(byte) '@') goto main::print21_@1
Simple Condition (bool) main::print22_$0#0 if(*((byte*) main::print21_msg#0 + (byte) main::print22_i#1)!=(byte) '@') goto main::print22_@1
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte*) screen#0 = ((byte*))1024
Constant (const byte*) main::print21_msg#0 = main::$3
Constant (const byte) main::print21_j#0 = 0
Constant (const byte) main::print21_i#0 = 0
Constant (const byte) main::print22_j#0 = 0
Constant (const byte) main::print22_i#0 = 0
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte*) main::print21_at#0 = screen#0
Constant (const byte*) main::print22_at#0 = screen#0+80
Successful SSA optimization Pass2ConstantIdentification
Culled Empty Block (label) main::@1
Successful SSA optimization Pass2CullEmptyBlocks
Inlining constant with var siblings (const byte) main::print21_j#0
Inlining constant with var siblings (const byte) main::print21_i#0
Inlining constant with var siblings (const byte) main::print22_j#0
Inlining constant with var siblings (const byte) main::print22_i#0
Constant inlined main::print22_i#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined main::$3 = (const byte*) main::print21_msg#0
Constant inlined main::print21_at#0 = (const byte*) screen#0
Constant inlined main::print21_i#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined main::print22_j#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined main::print21_j#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Successful SSA optimization Pass2ConstantInlining
Added new block during phi lifting main::@3(between main::print21_@1 and main::print21_@1)
Added new block during phi lifting main::@4(between main::print22_@1 and main::print22_@1)
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @2
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::print21
Adding NOP phi() at start of main::print22
CALL GRAPH
Calls in [] to main:2
Created 4 initial phi equivalence classes
Coalesced [18] main::print22_i#3 ← main::print22_i#1
Coalesced [19] main::print22_j#3 ← main::print22_j#1
Coalesced [20] main::print21_i#3 ← main::print21_i#1
Coalesced [21] main::print21_j#3 ← main::print21_j#1
Coalesced down to 4 phi equivalence classes
Culled Empty Block (label) main::@4
Culled Empty Block (label) main::@3
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @2
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::print21
Adding NOP phi() at start of main::print22
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
[0] phi() [ ] ( )
to:@2
@2: scope:[] from @begin
[1] phi() [ ] ( )
[2] call main [ ] ( )
to:@end
@end: scope:[] from @2
[3] phi() [ ] ( )
main: scope:[main] from @2
[4] phi() [ ] ( main:2 [ ] )
to:main::print21
main::print21: scope:[main] from main
[5] phi() [ ] ( main:2 [ ] )
to:main::print21_@1
main::print21_@1: scope:[main] from main::print21 main::print21_@1
[6] (byte) main::print21_j#2 ← phi( main::print21/(byte/signed byte/word/signed word/dword/signed dword) 0 main::print21_@1/(byte) main::print21_j#1 ) [ main::print21_i#2 main::print21_j#2 ] ( main:2 [ main::print21_i#2 main::print21_j#2 ] )
[6] (byte) main::print21_i#2 ← phi( main::print21/(byte/signed byte/word/signed word/dword/signed dword) 0 main::print21_@1/(byte) main::print21_i#1 ) [ main::print21_i#2 main::print21_j#2 ] ( main:2 [ main::print21_i#2 main::print21_j#2 ] )
[7] *((const byte*) screen#0 + (byte) main::print21_j#2) ← *((const byte*) main::print21_msg#0 + (byte) main::print21_i#2) [ main::print21_i#2 main::print21_j#2 ] ( main:2 [ main::print21_i#2 main::print21_j#2 ] )
[8] (byte) main::print21_j#1 ← (byte) main::print21_j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 [ main::print21_i#2 main::print21_j#1 ] ( main:2 [ main::print21_i#2 main::print21_j#1 ] )
[9] (byte) main::print21_i#1 ← ++ (byte) main::print21_i#2 [ main::print21_i#1 main::print21_j#1 ] ( main:2 [ main::print21_i#1 main::print21_j#1 ] )
[10] if(*((const byte*) main::print21_msg#0 + (byte) main::print21_i#1)!=(byte) '@') goto main::print21_@1 [ main::print21_i#1 main::print21_j#1 ] ( main:2 [ main::print21_i#1 main::print21_j#1 ] )
to:main::print22
main::print22: scope:[main] from main::print21_@1
[11] phi() [ ] ( main:2 [ ] )
to:main::print22_@1
main::print22_@1: scope:[main] from main::print22 main::print22_@1
[12] (byte) main::print22_j#2 ← phi( main::print22/(byte/signed byte/word/signed word/dword/signed dword) 0 main::print22_@1/(byte) main::print22_j#1 ) [ main::print22_i#2 main::print22_j#2 ] ( main:2 [ main::print22_i#2 main::print22_j#2 ] )
[12] (byte) main::print22_i#2 ← phi( main::print22/(byte/signed byte/word/signed word/dword/signed dword) 0 main::print22_@1/(byte) main::print22_i#1 ) [ main::print22_i#2 main::print22_j#2 ] ( main:2 [ main::print22_i#2 main::print22_j#2 ] )
[13] *((const byte*) main::print22_at#0 + (byte) main::print22_j#2) ← *((const byte*) main::print21_msg#0 + (byte) main::print22_i#2) [ main::print22_i#2 main::print22_j#2 ] ( main:2 [ main::print22_i#2 main::print22_j#2 ] )
[14] (byte) main::print22_j#1 ← (byte) main::print22_j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 [ main::print22_i#2 main::print22_j#1 ] ( main:2 [ main::print22_i#2 main::print22_j#1 ] )
[15] (byte) main::print22_i#1 ← ++ (byte) main::print22_i#2 [ main::print22_i#1 main::print22_j#1 ] ( main:2 [ main::print22_i#1 main::print22_j#1 ] )
[16] if(*((const byte*) main::print21_msg#0 + (byte) main::print22_i#1)!=(byte) '@') goto main::print22_@1 [ main::print22_i#1 main::print22_j#1 ] ( main:2 [ main::print22_i#1 main::print22_j#1 ] )
to:main::@return
main::@return: scope:[main] from main::print22_@1
[17] return [ ] ( main:2 [ ] )
to:@return
VARIABLE REGISTER WEIGHTS
(void()) main()
(byte*) main::hello
(bool~) main::print21_$0
(byte*) main::print21_at
(byte) main::print21_i
(byte) main::print21_i#1 16.5
(byte) main::print21_i#2 11.0
(byte) main::print21_j
(byte) main::print21_j#1 7.333333333333333
(byte) main::print21_j#2 16.5
(byte*) main::print21_msg
(bool~) main::print22_$0
(byte*) main::print22_at
(byte) main::print22_i
(byte) main::print22_i#1 16.5
(byte) main::print22_i#2 11.0
(byte) main::print22_j
(byte) main::print22_j#1 7.333333333333333
(byte) main::print22_j#2 16.5
(byte*) main::print22_msg
(byte*) screen
Initial phi equivalence classes
[ main::print21_i#2 main::print21_i#1 ]
[ main::print21_j#2 main::print21_j#1 ]
[ main::print22_i#2 main::print22_i#1 ]
[ main::print22_j#2 main::print22_j#1 ]
Complete equivalence classes
[ main::print21_i#2 main::print21_i#1 ]
[ main::print21_j#2 main::print21_j#1 ]
[ main::print22_i#2 main::print22_i#1 ]
[ main::print22_j#2 main::print22_j#1 ]
Allocated zp ZP_BYTE:2 [ main::print21_i#2 main::print21_i#1 ]
Allocated zp ZP_BYTE:3 [ main::print21_j#2 main::print21_j#1 ]
Allocated zp ZP_BYTE:4 [ main::print22_i#2 main::print22_i#1 ]
Allocated zp ZP_BYTE:5 [ main::print22_j#2 main::print22_j#1 ]
INITIAL ASM
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.label screen = $400
//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 [ ] ( )
//SEG6 [4] phi from @2 to main [phi:@2->main]
main_from_b2:
jsr main
//SEG7 [3] phi from @2 to @end [phi:@2->@end]
bend_from_b2:
jmp bend
//SEG8 @end
bend:
//SEG9 main
main: {
.label print22_at = screen+$50
.label print21_j = 3
.label print21_i = 2
.label print22_j = 5
.label print22_i = 4
//SEG10 [5] phi from main to main::print21 [phi:main->main::print21]
print21_from_main:
jmp print21
//SEG11 main::print21
print21:
//SEG12 [6] phi from main::print21 to main::print21_@1 [phi:main::print21->main::print21_@1]
print21_b1_from_print21:
//SEG13 [6] phi (byte) main::print21_j#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::print21->main::print21_@1#0] -- vbuz1=vbuc1
lda #0
sta print21_j
//SEG14 [6] phi (byte) main::print21_i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::print21->main::print21_@1#1] -- vbuz1=vbuc1
lda #0
sta print21_i
jmp print21_b1
//SEG15 [6] phi from main::print21_@1 to main::print21_@1 [phi:main::print21_@1->main::print21_@1]
print21_b1_from_print21_b1:
//SEG16 [6] phi (byte) main::print21_j#2 = (byte) main::print21_j#1 [phi:main::print21_@1->main::print21_@1#0] -- register_copy
//SEG17 [6] phi (byte) main::print21_i#2 = (byte) main::print21_i#1 [phi:main::print21_@1->main::print21_@1#1] -- register_copy
jmp print21_b1
//SEG18 main::print21_@1
print21_b1:
//SEG19 [7] *((const byte*) screen#0 + (byte) main::print21_j#2) ← *((const byte*) main::print21_msg#0 + (byte) main::print21_i#2) [ main::print21_i#2 main::print21_j#2 ] ( main:2 [ main::print21_i#2 main::print21_j#2 ] ) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2
ldy print21_i
lda print21_msg,y
ldy print21_j
sta screen,y
//SEG20 [8] (byte) main::print21_j#1 ← (byte) main::print21_j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 [ main::print21_i#2 main::print21_j#1 ] ( main:2 [ main::print21_i#2 main::print21_j#1 ] ) -- vbuz1=vbuz1_plus_2
lda print21_j
clc
adc #2
sta print21_j
//SEG21 [9] (byte) main::print21_i#1 ← ++ (byte) main::print21_i#2 [ main::print21_i#1 main::print21_j#1 ] ( main:2 [ main::print21_i#1 main::print21_j#1 ] ) -- vbuz1=_inc_vbuz1
inc print21_i
//SEG22 [10] if(*((const byte*) main::print21_msg#0 + (byte) main::print21_i#1)!=(byte) '@') goto main::print21_@1 [ main::print21_i#1 main::print21_j#1 ] ( main:2 [ main::print21_i#1 main::print21_j#1 ] ) -- pbuc1_derefidx_vbuz1_neq_vbuc2_then_la1
ldy print21_i
lda print21_msg,y
cmp #'@'
bne print21_b1_from_print21_b1
//SEG23 [11] phi from main::print21_@1 to main::print22 [phi:main::print21_@1->main::print22]
print22_from_print21_b1:
jmp print22
//SEG24 main::print22
print22:
//SEG25 [12] phi from main::print22 to main::print22_@1 [phi:main::print22->main::print22_@1]
print22_b1_from_print22:
//SEG26 [12] phi (byte) main::print22_j#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::print22->main::print22_@1#0] -- vbuz1=vbuc1
lda #0
sta print22_j
//SEG27 [12] phi (byte) main::print22_i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::print22->main::print22_@1#1] -- vbuz1=vbuc1
lda #0
sta print22_i
jmp print22_b1
//SEG28 [12] phi from main::print22_@1 to main::print22_@1 [phi:main::print22_@1->main::print22_@1]
print22_b1_from_print22_b1:
//SEG29 [12] phi (byte) main::print22_j#2 = (byte) main::print22_j#1 [phi:main::print22_@1->main::print22_@1#0] -- register_copy
//SEG30 [12] phi (byte) main::print22_i#2 = (byte) main::print22_i#1 [phi:main::print22_@1->main::print22_@1#1] -- register_copy
jmp print22_b1
//SEG31 main::print22_@1
print22_b1:
//SEG32 [13] *((const byte*) main::print22_at#0 + (byte) main::print22_j#2) ← *((const byte*) main::print21_msg#0 + (byte) main::print22_i#2) [ main::print22_i#2 main::print22_j#2 ] ( main:2 [ main::print22_i#2 main::print22_j#2 ] ) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2
ldy print22_i
lda print21_msg,y
ldy print22_j
sta print22_at,y
//SEG33 [14] (byte) main::print22_j#1 ← (byte) main::print22_j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 [ main::print22_i#2 main::print22_j#1 ] ( main:2 [ main::print22_i#2 main::print22_j#1 ] ) -- vbuz1=vbuz1_plus_2
lda print22_j
clc
adc #2
sta print22_j
//SEG34 [15] (byte) main::print22_i#1 ← ++ (byte) main::print22_i#2 [ main::print22_i#1 main::print22_j#1 ] ( main:2 [ main::print22_i#1 main::print22_j#1 ] ) -- vbuz1=_inc_vbuz1
inc print22_i
//SEG35 [16] if(*((const byte*) main::print21_msg#0 + (byte) main::print22_i#1)!=(byte) '@') goto main::print22_@1 [ main::print22_i#1 main::print22_j#1 ] ( main:2 [ main::print22_i#1 main::print22_j#1 ] ) -- pbuc1_derefidx_vbuz1_neq_vbuc2_then_la1
ldy print22_i
lda print21_msg,y
cmp #'@'
bne print22_b1_from_print22_b1
jmp breturn
//SEG36 main::@return
breturn:
//SEG37 [17] return [ ] ( main:2 [ ] )
rts
print21_msg: .text "hello world!@"
}
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [7] *((const byte*) screen#0 + (byte) main::print21_j#2) ← *((const byte*) main::print21_msg#0 + (byte) main::print21_i#2) [ main::print21_i#2 main::print21_j#2 ] ( main:2 [ main::print21_i#2 main::print21_j#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::print21_i#2 main::print21_i#1 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:3 [ main::print21_j#2 main::print21_j#1 ]
Statement [10] if(*((const byte*) main::print21_msg#0 + (byte) main::print21_i#1)!=(byte) '@') goto main::print21_@1 [ main::print21_i#1 main::print21_j#1 ] ( main:2 [ main::print21_i#1 main::print21_j#1 ] ) always clobbers reg byte a
Statement [13] *((const byte*) main::print22_at#0 + (byte) main::print22_j#2) ← *((const byte*) main::print21_msg#0 + (byte) main::print22_i#2) [ main::print22_i#2 main::print22_j#2 ] ( main:2 [ main::print22_i#2 main::print22_j#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:4 [ main::print22_i#2 main::print22_i#1 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:5 [ main::print22_j#2 main::print22_j#1 ]
Statement [16] if(*((const byte*) main::print21_msg#0 + (byte) main::print22_i#1)!=(byte) '@') goto main::print22_@1 [ main::print22_i#1 main::print22_j#1 ] ( main:2 [ main::print22_i#1 main::print22_j#1 ] ) always clobbers reg byte a
Statement [7] *((const byte*) screen#0 + (byte) main::print21_j#2) ← *((const byte*) main::print21_msg#0 + (byte) main::print21_i#2) [ main::print21_i#2 main::print21_j#2 ] ( main:2 [ main::print21_i#2 main::print21_j#2 ] ) always clobbers reg byte a
Statement [10] if(*((const byte*) main::print21_msg#0 + (byte) main::print21_i#1)!=(byte) '@') goto main::print21_@1 [ main::print21_i#1 main::print21_j#1 ] ( main:2 [ main::print21_i#1 main::print21_j#1 ] ) always clobbers reg byte a
Statement [13] *((const byte*) main::print22_at#0 + (byte) main::print22_j#2) ← *((const byte*) main::print21_msg#0 + (byte) main::print22_i#2) [ main::print22_i#2 main::print22_j#2 ] ( main:2 [ main::print22_i#2 main::print22_j#2 ] ) always clobbers reg byte a
Statement [16] if(*((const byte*) main::print21_msg#0 + (byte) main::print22_i#1)!=(byte) '@') goto main::print22_@1 [ main::print22_i#1 main::print22_j#1 ] ( main:2 [ main::print22_i#1 main::print22_j#1 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ main::print21_i#2 main::print21_i#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ main::print21_j#2 main::print21_j#1 ] : zp ZP_BYTE:3 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:4 [ main::print22_i#2 main::print22_i#1 ] : zp ZP_BYTE:4 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:5 [ main::print22_j#2 main::print22_j#1 ] : zp ZP_BYTE:5 , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 27.5: zp ZP_BYTE:2 [ main::print21_i#2 main::print21_i#1 ] 27.5: zp ZP_BYTE:4 [ main::print22_i#2 main::print22_i#1 ] 23.83: zp ZP_BYTE:3 [ main::print21_j#2 main::print21_j#1 ] 23.83: zp ZP_BYTE:5 [ main::print22_j#2 main::print22_j#1 ]
Uplift Scope []
Uplifting [main] best 744 combination reg byte y [ main::print21_i#2 main::print21_i#1 ] reg byte y [ main::print22_i#2 main::print22_i#1 ] reg byte x [ main::print21_j#2 main::print21_j#1 ] reg byte x [ main::print22_j#2 main::print22_j#1 ]
Uplifting [] best 744 combination
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.label screen = $400
//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 [ ] ( )
//SEG6 [4] phi from @2 to main [phi:@2->main]
main_from_b2:
jsr main
//SEG7 [3] phi from @2 to @end [phi:@2->@end]
bend_from_b2:
jmp bend
//SEG8 @end
bend:
//SEG9 main
main: {
.label print22_at = screen+$50
//SEG10 [5] phi from main to main::print21 [phi:main->main::print21]
print21_from_main:
jmp print21
//SEG11 main::print21
print21:
//SEG12 [6] phi from main::print21 to main::print21_@1 [phi:main::print21->main::print21_@1]
print21_b1_from_print21:
//SEG13 [6] phi (byte) main::print21_j#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::print21->main::print21_@1#0] -- vbuxx=vbuc1
ldx #0
//SEG14 [6] phi (byte) main::print21_i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::print21->main::print21_@1#1] -- vbuyy=vbuc1
ldy #0
jmp print21_b1
//SEG15 [6] phi from main::print21_@1 to main::print21_@1 [phi:main::print21_@1->main::print21_@1]
print21_b1_from_print21_b1:
//SEG16 [6] phi (byte) main::print21_j#2 = (byte) main::print21_j#1 [phi:main::print21_@1->main::print21_@1#0] -- register_copy
//SEG17 [6] phi (byte) main::print21_i#2 = (byte) main::print21_i#1 [phi:main::print21_@1->main::print21_@1#1] -- register_copy
jmp print21_b1
//SEG18 main::print21_@1
print21_b1:
//SEG19 [7] *((const byte*) screen#0 + (byte) main::print21_j#2) ← *((const byte*) main::print21_msg#0 + (byte) main::print21_i#2) [ main::print21_i#2 main::print21_j#2 ] ( main:2 [ main::print21_i#2 main::print21_j#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuyy
lda print21_msg,y
sta screen,x
//SEG20 [8] (byte) main::print21_j#1 ← (byte) main::print21_j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 [ main::print21_i#2 main::print21_j#1 ] ( main:2 [ main::print21_i#2 main::print21_j#1 ] ) -- vbuxx=vbuxx_plus_2
inx
inx
//SEG21 [9] (byte) main::print21_i#1 ← ++ (byte) main::print21_i#2 [ main::print21_i#1 main::print21_j#1 ] ( main:2 [ main::print21_i#1 main::print21_j#1 ] ) -- vbuyy=_inc_vbuyy
iny
//SEG22 [10] if(*((const byte*) main::print21_msg#0 + (byte) main::print21_i#1)!=(byte) '@') goto main::print21_@1 [ main::print21_i#1 main::print21_j#1 ] ( main:2 [ main::print21_i#1 main::print21_j#1 ] ) -- pbuc1_derefidx_vbuyy_neq_vbuc2_then_la1
lda print21_msg,y
cmp #'@'
bne print21_b1_from_print21_b1
//SEG23 [11] phi from main::print21_@1 to main::print22 [phi:main::print21_@1->main::print22]
print22_from_print21_b1:
jmp print22
//SEG24 main::print22
print22:
//SEG25 [12] phi from main::print22 to main::print22_@1 [phi:main::print22->main::print22_@1]
print22_b1_from_print22:
//SEG26 [12] phi (byte) main::print22_j#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::print22->main::print22_@1#0] -- vbuxx=vbuc1
ldx #0
//SEG27 [12] phi (byte) main::print22_i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::print22->main::print22_@1#1] -- vbuyy=vbuc1
ldy #0
jmp print22_b1
//SEG28 [12] phi from main::print22_@1 to main::print22_@1 [phi:main::print22_@1->main::print22_@1]
print22_b1_from_print22_b1:
//SEG29 [12] phi (byte) main::print22_j#2 = (byte) main::print22_j#1 [phi:main::print22_@1->main::print22_@1#0] -- register_copy
//SEG30 [12] phi (byte) main::print22_i#2 = (byte) main::print22_i#1 [phi:main::print22_@1->main::print22_@1#1] -- register_copy
jmp print22_b1
//SEG31 main::print22_@1
print22_b1:
//SEG32 [13] *((const byte*) main::print22_at#0 + (byte) main::print22_j#2) ← *((const byte*) main::print21_msg#0 + (byte) main::print22_i#2) [ main::print22_i#2 main::print22_j#2 ] ( main:2 [ main::print22_i#2 main::print22_j#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuyy
lda print21_msg,y
sta print22_at,x
//SEG33 [14] (byte) main::print22_j#1 ← (byte) main::print22_j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 [ main::print22_i#2 main::print22_j#1 ] ( main:2 [ main::print22_i#2 main::print22_j#1 ] ) -- vbuxx=vbuxx_plus_2
inx
inx
//SEG34 [15] (byte) main::print22_i#1 ← ++ (byte) main::print22_i#2 [ main::print22_i#1 main::print22_j#1 ] ( main:2 [ main::print22_i#1 main::print22_j#1 ] ) -- vbuyy=_inc_vbuyy
iny
//SEG35 [16] if(*((const byte*) main::print21_msg#0 + (byte) main::print22_i#1)!=(byte) '@') goto main::print22_@1 [ main::print22_i#1 main::print22_j#1 ] ( main:2 [ main::print22_i#1 main::print22_j#1 ] ) -- pbuc1_derefidx_vbuyy_neq_vbuc2_then_la1
lda print21_msg,y
cmp #'@'
bne print22_b1_from_print22_b1
jmp breturn
//SEG36 main::@return
breturn:
//SEG37 [17] return [ ] ( main:2 [ ] )
rts
print21_msg: .text "hello world!@"
}
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b2
Removing instruction jmp bend
Removing instruction jmp print21
Removing instruction jmp print21_b1
Removing instruction jmp print22
Removing instruction jmp print22_b1
Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination
Replacing label print21_b1_from_print21_b1 with print21_b1
Replacing label print22_b1_from_print22_b1 with print22_b1
Removing instruction bbegin:
Removing instruction b2_from_bbegin:
Removing instruction main_from_b2:
Removing instruction bend_from_b2:
Removing instruction print21_from_main:
Removing instruction print21_b1_from_print21:
Removing instruction print21_b1_from_print21_b1:
Removing instruction print22_from_print21_b1:
Removing instruction print22_b1_from_print22:
Removing instruction print22_b1_from_print22_b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b2:
Removing instruction bend:
Removing instruction print21:
Removing instruction print22:
Removing instruction breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Removing instruction jmp print21_b1
Removing instruction jmp print22_b1
Succesful ASM optimization Pass5NextJumpElimination
FINAL SYMBOL TABLE
(label) @2
(label) @begin
(label) @end
(void()) main()
(label) main::@return
(byte*) main::hello
(label) main::print21
(bool~) main::print21_$0
(label) main::print21_@1
(byte*) main::print21_at
(byte) main::print21_i
(byte) main::print21_i#1 reg byte y 16.5
(byte) main::print21_i#2 reg byte y 11.0
(byte) main::print21_j
(byte) main::print21_j#1 reg byte x 7.333333333333333
(byte) main::print21_j#2 reg byte x 16.5
(byte*) main::print21_msg
(const byte*) main::print21_msg#0 print21_msg = (string) "hello world!@"
(label) main::print22
(bool~) main::print22_$0
(label) main::print22_@1
(byte*) main::print22_at
(const byte*) main::print22_at#0 print22_at = (const byte*) screen#0+(byte/signed byte/word/signed word/dword/signed dword) 80
(byte) main::print22_i
(byte) main::print22_i#1 reg byte y 16.5
(byte) main::print22_i#2 reg byte y 11.0
(byte) main::print22_j
(byte) main::print22_j#1 reg byte x 7.333333333333333
(byte) main::print22_j#2 reg byte x 16.5
(byte*) main::print22_msg
(byte*) screen
(const byte*) screen#0 screen = ((byte*))(word/signed word/dword/signed dword) 1024
reg byte y [ main::print21_i#2 main::print21_i#1 ]
reg byte x [ main::print21_j#2 main::print21_j#1 ]
reg byte y [ main::print22_i#2 main::print22_i#1 ]
reg byte x [ main::print22_j#2 main::print22_j#1 ]
FINAL ASSEMBLER
Score: 582
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.label screen = $400
//SEG2 @begin
//SEG3 [1] phi from @begin to @2 [phi:@begin->@2]
//SEG4 @2
//SEG5 [2] call main [ ] ( )
//SEG6 [4] phi from @2 to main [phi:@2->main]
jsr main
//SEG7 [3] phi from @2 to @end [phi:@2->@end]
//SEG8 @end
//SEG9 main
main: {
.label print22_at = screen+$50
//SEG10 [5] phi from main to main::print21 [phi:main->main::print21]
//SEG11 main::print21
//SEG12 [6] phi from main::print21 to main::print21_@1 [phi:main::print21->main::print21_@1]
//SEG13 [6] phi (byte) main::print21_j#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::print21->main::print21_@1#0] -- vbuxx=vbuc1
ldx #0
//SEG14 [6] phi (byte) main::print21_i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::print21->main::print21_@1#1] -- vbuyy=vbuc1
ldy #0
//SEG15 [6] phi from main::print21_@1 to main::print21_@1 [phi:main::print21_@1->main::print21_@1]
//SEG16 [6] phi (byte) main::print21_j#2 = (byte) main::print21_j#1 [phi:main::print21_@1->main::print21_@1#0] -- register_copy
//SEG17 [6] phi (byte) main::print21_i#2 = (byte) main::print21_i#1 [phi:main::print21_@1->main::print21_@1#1] -- register_copy
//SEG18 main::print21_@1
print21_b1:
//SEG19 [7] *((const byte*) screen#0 + (byte) main::print21_j#2) ← *((const byte*) main::print21_msg#0 + (byte) main::print21_i#2) [ main::print21_i#2 main::print21_j#2 ] ( main:2 [ main::print21_i#2 main::print21_j#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuyy
lda print21_msg,y
sta screen,x
//SEG20 [8] (byte) main::print21_j#1 ← (byte) main::print21_j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 [ main::print21_i#2 main::print21_j#1 ] ( main:2 [ main::print21_i#2 main::print21_j#1 ] ) -- vbuxx=vbuxx_plus_2
inx
inx
//SEG21 [9] (byte) main::print21_i#1 ← ++ (byte) main::print21_i#2 [ main::print21_i#1 main::print21_j#1 ] ( main:2 [ main::print21_i#1 main::print21_j#1 ] ) -- vbuyy=_inc_vbuyy
iny
//SEG22 [10] if(*((const byte*) main::print21_msg#0 + (byte) main::print21_i#1)!=(byte) '@') goto main::print21_@1 [ main::print21_i#1 main::print21_j#1 ] ( main:2 [ main::print21_i#1 main::print21_j#1 ] ) -- pbuc1_derefidx_vbuyy_neq_vbuc2_then_la1
lda print21_msg,y
cmp #'@'
bne print21_b1
//SEG23 [11] phi from main::print21_@1 to main::print22 [phi:main::print21_@1->main::print22]
//SEG24 main::print22
//SEG25 [12] phi from main::print22 to main::print22_@1 [phi:main::print22->main::print22_@1]
//SEG26 [12] phi (byte) main::print22_j#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::print22->main::print22_@1#0] -- vbuxx=vbuc1
ldx #0
//SEG27 [12] phi (byte) main::print22_i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::print22->main::print22_@1#1] -- vbuyy=vbuc1
ldy #0
//SEG28 [12] phi from main::print22_@1 to main::print22_@1 [phi:main::print22_@1->main::print22_@1]
//SEG29 [12] phi (byte) main::print22_j#2 = (byte) main::print22_j#1 [phi:main::print22_@1->main::print22_@1#0] -- register_copy
//SEG30 [12] phi (byte) main::print22_i#2 = (byte) main::print22_i#1 [phi:main::print22_@1->main::print22_@1#1] -- register_copy
//SEG31 main::print22_@1
print22_b1:
//SEG32 [13] *((const byte*) main::print22_at#0 + (byte) main::print22_j#2) ← *((const byte*) main::print21_msg#0 + (byte) main::print22_i#2) [ main::print22_i#2 main::print22_j#2 ] ( main:2 [ main::print22_i#2 main::print22_j#2 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuyy
lda print21_msg,y
sta print22_at,x
//SEG33 [14] (byte) main::print22_j#1 ← (byte) main::print22_j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2 [ main::print22_i#2 main::print22_j#1 ] ( main:2 [ main::print22_i#2 main::print22_j#1 ] ) -- vbuxx=vbuxx_plus_2
inx
inx
//SEG34 [15] (byte) main::print22_i#1 ← ++ (byte) main::print22_i#2 [ main::print22_i#1 main::print22_j#1 ] ( main:2 [ main::print22_i#1 main::print22_j#1 ] ) -- vbuyy=_inc_vbuyy
iny
//SEG35 [16] if(*((const byte*) main::print21_msg#0 + (byte) main::print22_i#1)!=(byte) '@') goto main::print22_@1 [ main::print22_i#1 main::print22_j#1 ] ( main:2 [ main::print22_i#1 main::print22_j#1 ] ) -- pbuc1_derefidx_vbuyy_neq_vbuc2_then_la1
lda print21_msg,y
cmp #'@'
bne print22_b1
//SEG36 main::@return
//SEG37 [17] return [ ] ( main:2 [ ] )
rts
print21_msg: .text "hello world!@"
}

View File

@ -0,0 +1,37 @@
(label) @2
(label) @begin
(label) @end
(void()) main()
(label) main::@return
(byte*) main::hello
(label) main::print21
(bool~) main::print21_$0
(label) main::print21_@1
(byte*) main::print21_at
(byte) main::print21_i
(byte) main::print21_i#1 reg byte y 16.5
(byte) main::print21_i#2 reg byte y 11.0
(byte) main::print21_j
(byte) main::print21_j#1 reg byte x 7.333333333333333
(byte) main::print21_j#2 reg byte x 16.5
(byte*) main::print21_msg
(const byte*) main::print21_msg#0 print21_msg = (string) "hello world!@"
(label) main::print22
(bool~) main::print22_$0
(label) main::print22_@1
(byte*) main::print22_at
(const byte*) main::print22_at#0 print22_at = (const byte*) screen#0+(byte/signed byte/word/signed word/dword/signed dword) 80
(byte) main::print22_i
(byte) main::print22_i#1 reg byte y 16.5
(byte) main::print22_i#2 reg byte y 11.0
(byte) main::print22_j
(byte) main::print22_j#1 reg byte x 7.333333333333333
(byte) main::print22_j#2 reg byte x 16.5
(byte*) main::print22_msg
(byte*) screen
(const byte*) screen#0 screen = ((byte*))(word/signed word/dword/signed dword) 1024
reg byte y [ main::print21_i#2 main::print21_i#1 ]
reg byte x [ main::print21_j#2 main::print21_j#1 ]
reg byte y [ main::print22_i#2 main::print22_i#1 ]
reg byte x [ main::print22_j#2 main::print22_j#1 ]