Inlined call init_points::point = call getPoint(init_points::i) Inlined call init_points::$1 = call pointXpos(init_points::point) Inlined call init_points::$2 = call pointYpos(init_points::point) Inlined call print_points::point = call getPoint(print_points::i) Inlined call print_points::$2 = call pointXpos(print_points::point) Inlined call print_points::$5 = call pointYpos(print_points::point) Inlined call call __init Eliminating unused variable with no statement memset::$2 Eliminating unused variable with no statement init_points::$0 Eliminating unused variable with no statement print_points::$1 CONTROL FLOW GRAPH SSA void print_str(char *str) print_str: scope:[print_str] from print_points::@6 print_char_cursor#51 = phi( print_points::@6/print_char_cursor#14 ) print_str::str#5 = phi( print_points::@6/print_str::str#1 ) to:print_str::@1 print_str::@1: scope:[print_str] from print_str print_str::@3 print_char_cursor#43 = phi( print_str/print_char_cursor#51, print_str::@3/print_char_cursor#0 ) print_str::str#2 = phi( print_str/print_str::str#5, print_str::@3/print_str::str#0 ) print_str::$1 = 0 != *print_str::str#2 if(print_str::$1) goto print_str::@2 to:print_str::@return print_str::@2: scope:[print_str] from print_str::@1 print_char_cursor#42 = phi( print_str::@1/print_char_cursor#43 ) print_str::str#3 = phi( print_str::@1/print_str::str#2 ) print_char::ch#0 = *print_str::str#3 call print_char to:print_str::@3 print_str::@3: scope:[print_str] from print_str::@2 print_str::str#4 = phi( print_str::@2/print_str::str#3 ) print_char_cursor#22 = phi( print_str::@2/print_char_cursor#8 ) print_char_cursor#0 = print_char_cursor#22 print_str::str#0 = ++ print_str::str#4 to:print_str::@1 print_str::@return: scope:[print_str] from print_str::@1 print_char_cursor#23 = phi( print_str::@1/print_char_cursor#43 ) print_char_cursor#1 = print_char_cursor#23 return to:@return void print_ln() print_ln: scope:[print_ln] from print_points::@8 print_char_cursor#44 = phi( print_points::@8/print_char_cursor#16 ) print_line_cursor#23 = phi( print_points::@8/print_line_cursor#26 ) to:print_ln::@1 print_ln::@1: scope:[print_ln] from print_ln print_ln::@1 print_char_cursor#24 = phi( print_ln/print_char_cursor#44, print_ln::@1/print_char_cursor#24 ) print_line_cursor#12 = phi( print_ln/print_line_cursor#23, print_ln::@1/print_line_cursor#0 ) print_ln::$0 = print_line_cursor#12 + $28 print_line_cursor#0 = print_ln::$0 print_ln::$1 = print_line_cursor#0 < print_char_cursor#24 if(print_ln::$1) goto print_ln::@1 to:print_ln::@2 print_ln::@2: scope:[print_ln] from print_ln::@1 print_line_cursor#13 = phi( print_ln::@1/print_line_cursor#0 ) print_char_cursor#2 = print_line_cursor#13 to:print_ln::@return print_ln::@return: scope:[print_ln] from print_ln::@2 print_char_cursor#25 = phi( print_ln::@2/print_char_cursor#2 ) print_line_cursor#14 = phi( print_ln::@2/print_line_cursor#13 ) print_line_cursor#1 = print_line_cursor#14 print_char_cursor#3 = print_char_cursor#25 return to:@return void print_uchar(char b) print_uchar: scope:[print_uchar] from print_points::@3 print_points::@4 print_char_cursor#45 = phi( print_points::@3/print_char_cursor#48, print_points::@4/print_char_cursor#49 ) print_uchar::b#2 = phi( print_points::@3/print_uchar::b#0, print_points::@4/print_uchar::b#1 ) print_uchar::$0 = print_uchar::b#2 >> 4 print_char::ch#1 = print_hextab[print_uchar::$0] call print_char to:print_uchar::@1 print_uchar::@1: scope:[print_uchar] from print_uchar print_uchar::b#3 = phi( print_uchar/print_uchar::b#2 ) print_char_cursor#26 = phi( print_uchar/print_char_cursor#8 ) print_char_cursor#4 = print_char_cursor#26 print_uchar::$2 = print_uchar::b#3 & $f print_char::ch#2 = print_hextab[print_uchar::$2] call print_char to:print_uchar::@2 print_uchar::@2: scope:[print_uchar] from print_uchar::@1 print_char_cursor#27 = phi( print_uchar::@1/print_char_cursor#8 ) print_char_cursor#5 = print_char_cursor#27 to:print_uchar::@return print_uchar::@return: scope:[print_uchar] from print_uchar::@2 print_char_cursor#28 = phi( print_uchar::@2/print_char_cursor#5 ) print_char_cursor#6 = print_char_cursor#28 return to:@return void print_char(char ch) print_char: scope:[print_char] from print_str::@2 print_uchar print_uchar::@1 print_char_cursor#29 = phi( print_str::@2/print_char_cursor#42, print_uchar/print_char_cursor#45, print_uchar::@1/print_char_cursor#4 ) print_char::ch#3 = phi( print_str::@2/print_char::ch#0, print_uchar/print_char::ch#1, print_uchar::@1/print_char::ch#2 ) *print_char_cursor#29 = print_char::ch#3 print_char_cursor#7 = ++ print_char_cursor#29 to:print_char::@return print_char::@return: scope:[print_char] from print_char print_char_cursor#30 = phi( print_char/print_char_cursor#7 ) print_char_cursor#8 = print_char_cursor#30 return to:@return void print_cls() print_cls: scope:[print_cls] from print_points print_screen#2 = phi( print_points/print_screen#5 ) memset::str#0 = (void *)print_screen#2 memset::c#0 = ' ' memset::num#0 = $3e8 call memset memset::return#0 = memset::return#2 to:print_cls::@1 print_cls::@1: scope:[print_cls] from print_cls print_screen#3 = phi( print_cls/print_screen#2 ) print_line_cursor#2 = print_screen#3 print_char_cursor#9 = print_line_cursor#2 to:print_cls::@return print_cls::@return: scope:[print_cls] from print_cls::@1 print_char_cursor#31 = phi( print_cls::@1/print_char_cursor#9 ) print_line_cursor#15 = phi( print_cls::@1/print_line_cursor#2 ) print_line_cursor#3 = print_line_cursor#15 print_char_cursor#10 = print_char_cursor#31 return to:@return void * memset(void *str , char c , unsigned int num) memset: scope:[memset] from print_cls memset::c#4 = phi( print_cls/memset::c#0 ) memset::str#3 = phi( print_cls/memset::str#0 ) memset::num#1 = phi( print_cls/memset::num#0 ) memset::$0 = memset::num#1 > 0 memset::$1 = ! memset::$0 if(memset::$1) goto memset::@1 to:memset::@2 memset::@1: scope:[memset] from memset memset::@3 memset::str#1 = phi( memset/memset::str#3, memset::@3/memset::str#4 ) memset::return#1 = memset::str#1 to:memset::@return memset::@2: scope:[memset] from memset memset::c#3 = phi( memset/memset::c#4 ) memset::num#2 = phi( memset/memset::num#1 ) memset::str#2 = phi( memset/memset::str#3 ) memset::$4 = (char *)memset::str#2 memset::end#0 = memset::$4 + memset::num#2 memset::dst#0 = ((char *)) memset::str#2 to:memset::@3 memset::@3: scope:[memset] from memset::@2 memset::@4 memset::c#2 = phi( memset::@2/memset::c#3, memset::@4/memset::c#1 ) memset::str#4 = phi( memset::@2/memset::str#2, memset::@4/memset::str#5 ) memset::end#1 = phi( memset::@2/memset::end#0, memset::@4/memset::end#2 ) memset::dst#2 = phi( memset::@2/memset::dst#0, memset::@4/memset::dst#1 ) memset::$3 = memset::dst#2 != memset::end#1 if(memset::$3) goto memset::@4 to:memset::@1 memset::@4: scope:[memset] from memset::@3 memset::str#5 = phi( memset::@3/memset::str#4 ) memset::end#2 = phi( memset::@3/memset::end#1 ) memset::dst#3 = phi( memset::@3/memset::dst#2 ) memset::c#1 = phi( memset::@3/memset::c#2 ) *memset::dst#3 = memset::c#1 memset::dst#1 = ++ memset::dst#3 to:memset::@3 memset::@return: scope:[memset] from memset::@1 memset::return#3 = phi( memset::@1/memset::return#1 ) memset::return#2 = memset::return#3 return to:@return void main() main: scope:[main] from __start::@1 print_screen#9 = phi( __start::@1/print_screen#8 ) print_char_cursor#52 = phi( __start::@1/print_char_cursor#50 ) print_line_cursor#28 = phi( __start::@1/print_line_cursor#27 ) call init_points to:main::@1 main::@1: scope:[main] from main print_screen#7 = phi( main/print_screen#9 ) print_char_cursor#46 = phi( main/print_char_cursor#52 ) print_line_cursor#24 = phi( main/print_line_cursor#28 ) call print_points to:main::@2 main::@2: scope:[main] from main::@1 print_char_cursor#32 = phi( main::@1/print_char_cursor#18 ) print_line_cursor#16 = phi( main::@1/print_line_cursor#8 ) print_line_cursor#4 = print_line_cursor#16 print_char_cursor#11 = print_char_cursor#32 to:main::@return main::@return: scope:[main] from main::@2 print_char_cursor#33 = phi( main::@2/print_char_cursor#11 ) print_line_cursor#17 = phi( main::@2/print_line_cursor#4 ) print_line_cursor#5 = print_line_cursor#17 print_char_cursor#12 = print_char_cursor#33 return to:@return void init_points() init_points: scope:[init_points] from main init_points::pos#0 = $a init_points::i#0 = 0 to:init_points::@1 init_points::@1: scope:[init_points] from init_points init_points::@4 init_points::pos#12 = phi( init_points/init_points::pos#0, init_points::@4/init_points::pos#2 ) init_points::i#2 = phi( init_points/init_points::i#0, init_points::@4/init_points::i#1 ) init_points::getPoint1_idx#0 = init_points::i#2 to:init_points::getPoint1 init_points::getPoint1: scope:[init_points] from init_points::@1 init_points::i#11 = phi( init_points::@1/init_points::i#2 ) init_points::pos#11 = phi( init_points::@1/init_points::pos#12 ) init_points::getPoint1_idx#1 = phi( init_points::@1/init_points::getPoint1_idx#0 ) init_points::getPoint1_$0 = init_points::getPoint1_idx#1 * SIZEOF_POINT init_points::getPoint1_$1 = points + init_points::getPoint1_$0 init_points::getPoint1_return#0 = init_points::getPoint1_$1 to:init_points::getPoint1_@return init_points::getPoint1_@return: scope:[init_points] from init_points::getPoint1 init_points::i#10 = phi( init_points::getPoint1/init_points::i#11 ) init_points::pos#10 = phi( init_points::getPoint1/init_points::pos#11 ) init_points::getPoint1_return#2 = phi( init_points::getPoint1/init_points::getPoint1_return#0 ) init_points::getPoint1_return#1 = init_points::getPoint1_return#2 to:init_points::@2 init_points::@2: scope:[init_points] from init_points::getPoint1_@return init_points::i#9 = phi( init_points::getPoint1_@return/init_points::i#10 ) init_points::pos#9 = phi( init_points::getPoint1_@return/init_points::pos#10 ) init_points::getPoint1_return#3 = phi( init_points::getPoint1_@return/init_points::getPoint1_return#1 ) init_points::point#0 = init_points::getPoint1_return#3 init_points::pointXpos1_point#0 = init_points::point#0 to:init_points::pointXpos1 init_points::pointXpos1: scope:[init_points] from init_points::@2 init_points::i#8 = phi( init_points::@2/init_points::i#9 ) init_points::point#3 = phi( init_points::@2/init_points::point#0 ) init_points::pos#7 = phi( init_points::@2/init_points::pos#9 ) init_points::pointXpos1_point#1 = phi( init_points::@2/init_points::pointXpos1_point#0 ) init_points::pointXpos1_$0 = init_points::pointXpos1_point#1 + 0 init_points::pointXpos1_return#0 = (char *)init_points::pointXpos1_$0 to:init_points::pointXpos1_@return init_points::pointXpos1_@return: scope:[init_points] from init_points::pointXpos1 init_points::i#7 = phi( init_points::pointXpos1/init_points::i#8 ) init_points::point#2 = phi( init_points::pointXpos1/init_points::point#3 ) init_points::pos#5 = phi( init_points::pointXpos1/init_points::pos#7 ) init_points::pointXpos1_return#2 = phi( init_points::pointXpos1/init_points::pointXpos1_return#0 ) init_points::pointXpos1_return#1 = init_points::pointXpos1_return#2 to:init_points::@3 init_points::@3: scope:[init_points] from init_points::pointXpos1_@return init_points::i#6 = phi( init_points::pointXpos1_@return/init_points::i#7 ) init_points::point#1 = phi( init_points::pointXpos1_@return/init_points::point#2 ) init_points::pos#3 = phi( init_points::pointXpos1_@return/init_points::pos#5 ) init_points::pointXpos1_return#3 = phi( init_points::pointXpos1_@return/init_points::pointXpos1_return#1 ) init_points::$1 = init_points::pointXpos1_return#3 *init_points::$1 = init_points::pos#3 init_points::pos#1 = init_points::pos#3 + $a init_points::pointYpos1_point#0 = init_points::point#1 to:init_points::pointYpos1 init_points::pointYpos1: scope:[init_points] from init_points::@3 init_points::i#5 = phi( init_points::@3/init_points::i#6 ) init_points::pos#8 = phi( init_points::@3/init_points::pos#1 ) init_points::pointYpos1_point#1 = phi( init_points::@3/init_points::pointYpos1_point#0 ) init_points::pointYpos1_$0 = init_points::pointYpos1_point#1 + 1 init_points::pointYpos1_return#0 = (char *)init_points::pointYpos1_$0 to:init_points::pointYpos1_@return init_points::pointYpos1_@return: scope:[init_points] from init_points::pointYpos1 init_points::i#4 = phi( init_points::pointYpos1/init_points::i#5 ) init_points::pos#6 = phi( init_points::pointYpos1/init_points::pos#8 ) init_points::pointYpos1_return#2 = phi( init_points::pointYpos1/init_points::pointYpos1_return#0 ) init_points::pointYpos1_return#1 = init_points::pointYpos1_return#2 to:init_points::@4 init_points::@4: scope:[init_points] from init_points::pointYpos1_@return init_points::i#3 = phi( init_points::pointYpos1_@return/init_points::i#4 ) init_points::pos#4 = phi( init_points::pointYpos1_@return/init_points::pos#6 ) init_points::pointYpos1_return#3 = phi( init_points::pointYpos1_@return/init_points::pointYpos1_return#1 ) init_points::$2 = init_points::pointYpos1_return#3 *init_points::$2 = init_points::pos#4 init_points::pos#2 = init_points::pos#4 + $a init_points::i#1 = init_points::i#3 + rangenext(0,NUM_POINTS-1) init_points::$3 = init_points::i#1 != rangelast(0,NUM_POINTS-1) if(init_points::$3) goto init_points::@1 to:init_points::@return init_points::@return: scope:[init_points] from init_points::@4 return to:@return void print_points() print_points: scope:[print_points] from main::@1 print_char_cursor#47 = phi( main::@1/print_char_cursor#46 ) print_line_cursor#25 = phi( main::@1/print_line_cursor#24 ) print_screen#5 = phi( main::@1/print_screen#7 ) call print_cls to:print_points::@5 print_points::@5: scope:[print_points] from print_points print_char_cursor#34 = phi( print_points/print_char_cursor#10 ) print_line_cursor#18 = phi( print_points/print_line_cursor#3 ) print_line_cursor#6 = print_line_cursor#18 print_char_cursor#13 = print_char_cursor#34 print_points::i#0 = 0 to:print_points::@1 print_points::@1: scope:[print_points] from print_points::@5 print_points::@9 print_line_cursor#40 = phi( print_points::@5/print_line_cursor#6, print_points::@9/print_line_cursor#7 ) print_char_cursor#60 = phi( print_points::@5/print_char_cursor#13, print_points::@9/print_char_cursor#17 ) print_points::i#2 = phi( print_points::@5/print_points::i#0, print_points::@9/print_points::i#1 ) print_points::getPoint1_idx#0 = print_points::i#2 to:print_points::getPoint1 print_points::getPoint1: scope:[print_points] from print_points::@1 print_points::i#15 = phi( print_points::@1/print_points::i#2 ) print_line_cursor#39 = phi( print_points::@1/print_line_cursor#40 ) print_char_cursor#59 = phi( print_points::@1/print_char_cursor#60 ) print_points::getPoint1_idx#1 = phi( print_points::@1/print_points::getPoint1_idx#0 ) print_points::getPoint1_$0 = print_points::getPoint1_idx#1 * SIZEOF_POINT print_points::getPoint1_$1 = points + print_points::getPoint1_$0 print_points::getPoint1_return#0 = print_points::getPoint1_$1 to:print_points::getPoint1_@return print_points::getPoint1_@return: scope:[print_points] from print_points::getPoint1 print_points::i#14 = phi( print_points::getPoint1/print_points::i#15 ) print_line_cursor#38 = phi( print_points::getPoint1/print_line_cursor#39 ) print_char_cursor#58 = phi( print_points::getPoint1/print_char_cursor#59 ) print_points::getPoint1_return#2 = phi( print_points::getPoint1/print_points::getPoint1_return#0 ) print_points::getPoint1_return#1 = print_points::getPoint1_return#2 to:print_points::@2 print_points::@2: scope:[print_points] from print_points::getPoint1_@return print_points::i#13 = phi( print_points::getPoint1_@return/print_points::i#14 ) print_line_cursor#37 = phi( print_points::getPoint1_@return/print_line_cursor#38 ) print_char_cursor#57 = phi( print_points::getPoint1_@return/print_char_cursor#58 ) print_points::getPoint1_return#3 = phi( print_points::getPoint1_@return/print_points::getPoint1_return#1 ) print_points::point#0 = print_points::getPoint1_return#3 print_points::pointXpos1_point#0 = print_points::point#0 to:print_points::pointXpos1 print_points::pointXpos1: scope:[print_points] from print_points::@2 print_points::i#12 = phi( print_points::@2/print_points::i#13 ) print_line_cursor#36 = phi( print_points::@2/print_line_cursor#37 ) print_points::point#5 = phi( print_points::@2/print_points::point#0 ) print_char_cursor#55 = phi( print_points::@2/print_char_cursor#57 ) print_points::pointXpos1_point#1 = phi( print_points::@2/print_points::pointXpos1_point#0 ) print_points::pointXpos1_$0 = print_points::pointXpos1_point#1 + 0 print_points::pointXpos1_return#0 = (char *)print_points::pointXpos1_$0 to:print_points::pointXpos1_@return print_points::pointXpos1_@return: scope:[print_points] from print_points::pointXpos1 print_points::i#11 = phi( print_points::pointXpos1/print_points::i#12 ) print_line_cursor#35 = phi( print_points::pointXpos1/print_line_cursor#36 ) print_points::point#4 = phi( print_points::pointXpos1/print_points::point#5 ) print_char_cursor#53 = phi( print_points::pointXpos1/print_char_cursor#55 ) print_points::pointXpos1_return#2 = phi( print_points::pointXpos1/print_points::pointXpos1_return#0 ) print_points::pointXpos1_return#1 = print_points::pointXpos1_return#2 to:print_points::@3 print_points::@3: scope:[print_points] from print_points::pointXpos1_@return print_points::i#10 = phi( print_points::pointXpos1_@return/print_points::i#11 ) print_line_cursor#34 = phi( print_points::pointXpos1_@return/print_line_cursor#35 ) print_points::point#3 = phi( print_points::pointXpos1_@return/print_points::point#4 ) print_char_cursor#48 = phi( print_points::pointXpos1_@return/print_char_cursor#53 ) print_points::pointXpos1_return#3 = phi( print_points::pointXpos1_@return/print_points::pointXpos1_return#1 ) print_points::$2 = print_points::pointXpos1_return#3 print_uchar::b#0 = *print_points::$2 call print_uchar to:print_points::@6 print_points::@6: scope:[print_points] from print_points::@3 print_points::i#9 = phi( print_points::@3/print_points::i#10 ) print_line_cursor#33 = phi( print_points::@3/print_line_cursor#34 ) print_points::point#2 = phi( print_points::@3/print_points::point#3 ) print_char_cursor#35 = phi( print_points::@3/print_char_cursor#6 ) print_char_cursor#14 = print_char_cursor#35 print_str::str#1 = print_points::str call print_str to:print_points::@7 print_points::@7: scope:[print_points] from print_points::@6 print_points::i#8 = phi( print_points::@6/print_points::i#9 ) print_line_cursor#32 = phi( print_points::@6/print_line_cursor#33 ) print_points::point#1 = phi( print_points::@6/print_points::point#2 ) print_char_cursor#36 = phi( print_points::@6/print_char_cursor#1 ) print_char_cursor#15 = print_char_cursor#36 print_points::pointYpos1_point#0 = print_points::point#1 to:print_points::pointYpos1 print_points::pointYpos1: scope:[print_points] from print_points::@7 print_points::i#7 = phi( print_points::@7/print_points::i#8 ) print_line_cursor#31 = phi( print_points::@7/print_line_cursor#32 ) print_char_cursor#56 = phi( print_points::@7/print_char_cursor#15 ) print_points::pointYpos1_point#1 = phi( print_points::@7/print_points::pointYpos1_point#0 ) print_points::pointYpos1_$0 = print_points::pointYpos1_point#1 + 1 print_points::pointYpos1_return#0 = (char *)print_points::pointYpos1_$0 to:print_points::pointYpos1_@return print_points::pointYpos1_@return: scope:[print_points] from print_points::pointYpos1 print_points::i#6 = phi( print_points::pointYpos1/print_points::i#7 ) print_line_cursor#30 = phi( print_points::pointYpos1/print_line_cursor#31 ) print_char_cursor#54 = phi( print_points::pointYpos1/print_char_cursor#56 ) print_points::pointYpos1_return#2 = phi( print_points::pointYpos1/print_points::pointYpos1_return#0 ) print_points::pointYpos1_return#1 = print_points::pointYpos1_return#2 to:print_points::@4 print_points::@4: scope:[print_points] from print_points::pointYpos1_@return print_points::i#5 = phi( print_points::pointYpos1_@return/print_points::i#6 ) print_line_cursor#29 = phi( print_points::pointYpos1_@return/print_line_cursor#30 ) print_char_cursor#49 = phi( print_points::pointYpos1_@return/print_char_cursor#54 ) print_points::pointYpos1_return#3 = phi( print_points::pointYpos1_@return/print_points::pointYpos1_return#1 ) print_points::$5 = print_points::pointYpos1_return#3 print_uchar::b#1 = *print_points::$5 call print_uchar to:print_points::@8 print_points::@8: scope:[print_points] from print_points::@4 print_points::i#4 = phi( print_points::@4/print_points::i#5 ) print_line_cursor#26 = phi( print_points::@4/print_line_cursor#29 ) print_char_cursor#37 = phi( print_points::@4/print_char_cursor#6 ) print_char_cursor#16 = print_char_cursor#37 call print_ln to:print_points::@9 print_points::@9: scope:[print_points] from print_points::@8 print_points::i#3 = phi( print_points::@8/print_points::i#4 ) print_char_cursor#38 = phi( print_points::@8/print_char_cursor#3 ) print_line_cursor#19 = phi( print_points::@8/print_line_cursor#1 ) print_line_cursor#7 = print_line_cursor#19 print_char_cursor#17 = print_char_cursor#38 print_points::i#1 = print_points::i#3 + rangenext(0,NUM_POINTS-1) print_points::$8 = print_points::i#1 != rangelast(0,NUM_POINTS-1) if(print_points::$8) goto print_points::@1 to:print_points::@return print_points::@return: scope:[print_points] from print_points::@9 print_char_cursor#39 = phi( print_points::@9/print_char_cursor#17 ) print_line_cursor#20 = phi( print_points::@9/print_line_cursor#7 ) print_line_cursor#8 = print_line_cursor#20 print_char_cursor#18 = print_char_cursor#39 return to:@return void __start() __start: scope:[__start] from to:__start::__init1 __start::__init1: scope:[__start] from __start print_screen#0 = (char *)$400 print_line_cursor#9 = print_screen#0 print_char_cursor#19 = print_line_cursor#9 to:__start::@1 __start::@1: scope:[__start] from __start::__init1 print_screen#8 = phi( __start::__init1/print_screen#0 ) print_char_cursor#50 = phi( __start::__init1/print_char_cursor#19 ) print_line_cursor#27 = phi( __start::__init1/print_line_cursor#9 ) call main to:__start::@2 __start::@2: scope:[__start] from __start::@1 print_screen#6 = phi( __start::@1/print_screen#8 ) print_char_cursor#40 = phi( __start::@1/print_char_cursor#12 ) print_line_cursor#21 = phi( __start::@1/print_line_cursor#5 ) print_line_cursor#10 = print_line_cursor#21 print_char_cursor#20 = print_char_cursor#40 to:__start::@return __start::@return: scope:[__start] from __start::@2 print_char_cursor#41 = phi( __start::@2/print_char_cursor#20 ) print_line_cursor#22 = phi( __start::@2/print_line_cursor#10 ) print_screen#4 = phi( __start::@2/print_screen#6 ) print_screen#1 = print_screen#4 print_line_cursor#11 = print_line_cursor#22 print_char_cursor#21 = print_char_cursor#41 return to:@return SYMBOL TABLE SSA __constant const char NUM_POINTS = 4 __constant char RADIX::BINARY = 2 __constant char RADIX::DECIMAL = $a __constant char RADIX::HEXADECIMAL = $10 __constant char RADIX::OCTAL = 8 __constant const char SIZEOF_POINT = 2 void __start() void init_points() char *init_points::$1 char *init_points::$2 bool init_points::$3 char init_points::getPoint1_$0 char *init_points::getPoint1_$1 char init_points::getPoint1_idx char init_points::getPoint1_idx#0 char init_points::getPoint1_idx#1 char *init_points::getPoint1_return char *init_points::getPoint1_return#0 char *init_points::getPoint1_return#1 char *init_points::getPoint1_return#2 char *init_points::getPoint1_return#3 char init_points::i char init_points::i#0 char init_points::i#1 char init_points::i#10 char init_points::i#11 char init_points::i#2 char init_points::i#3 char init_points::i#4 char init_points::i#5 char init_points::i#6 char init_points::i#7 char init_points::i#8 char init_points::i#9 char *init_points::point char *init_points::point#0 char *init_points::point#1 char *init_points::point#2 char *init_points::point#3 char *init_points::pointXpos1_$0 char *init_points::pointXpos1_point char *init_points::pointXpos1_point#0 char *init_points::pointXpos1_point#1 char *init_points::pointXpos1_return char *init_points::pointXpos1_return#0 char *init_points::pointXpos1_return#1 char *init_points::pointXpos1_return#2 char *init_points::pointXpos1_return#3 char *init_points::pointYpos1_$0 char *init_points::pointYpos1_point char *init_points::pointYpos1_point#0 char *init_points::pointYpos1_point#1 char *init_points::pointYpos1_return char *init_points::pointYpos1_return#0 char *init_points::pointYpos1_return#1 char *init_points::pointYpos1_return#2 char *init_points::pointYpos1_return#3 char init_points::pos char init_points::pos#0 char init_points::pos#1 char init_points::pos#10 char init_points::pos#11 char init_points::pos#12 char init_points::pos#2 char init_points::pos#3 char init_points::pos#4 char init_points::pos#5 char init_points::pos#6 char init_points::pos#7 char init_points::pos#8 char init_points::pos#9 void main() void * memset(void *str , char c , unsigned int num) bool memset::$0 bool memset::$1 bool memset::$3 char *memset::$4 char memset::c char memset::c#0 char memset::c#1 char memset::c#2 char memset::c#3 char memset::c#4 char *memset::dst char *memset::dst#0 char *memset::dst#1 char *memset::dst#2 char *memset::dst#3 char *memset::end char *memset::end#0 char *memset::end#1 char *memset::end#2 unsigned int memset::num unsigned int memset::num#0 unsigned int memset::num#1 unsigned int memset::num#2 void *memset::return void *memset::return#0 void *memset::return#1 void *memset::return#2 void *memset::return#3 void *memset::str void *memset::str#0 void *memset::str#1 void *memset::str#2 void *memset::str#3 void *memset::str#4 void *memset::str#5 __constant char points[NUM_POINTS*SIZEOF_POINT] = { fill( NUM_POINTS*SIZEOF_POINT, 0) } void print_char(char ch) char print_char::ch char print_char::ch#0 char print_char::ch#1 char print_char::ch#2 char print_char::ch#3 char *print_char_cursor char *print_char_cursor#0 char *print_char_cursor#1 char *print_char_cursor#10 char *print_char_cursor#11 char *print_char_cursor#12 char *print_char_cursor#13 char *print_char_cursor#14 char *print_char_cursor#15 char *print_char_cursor#16 char *print_char_cursor#17 char *print_char_cursor#18 char *print_char_cursor#19 char *print_char_cursor#2 char *print_char_cursor#20 char *print_char_cursor#21 char *print_char_cursor#22 char *print_char_cursor#23 char *print_char_cursor#24 char *print_char_cursor#25 char *print_char_cursor#26 char *print_char_cursor#27 char *print_char_cursor#28 char *print_char_cursor#29 char *print_char_cursor#3 char *print_char_cursor#30 char *print_char_cursor#31 char *print_char_cursor#32 char *print_char_cursor#33 char *print_char_cursor#34 char *print_char_cursor#35 char *print_char_cursor#36 char *print_char_cursor#37 char *print_char_cursor#38 char *print_char_cursor#39 char *print_char_cursor#4 char *print_char_cursor#40 char *print_char_cursor#41 char *print_char_cursor#42 char *print_char_cursor#43 char *print_char_cursor#44 char *print_char_cursor#45 char *print_char_cursor#46 char *print_char_cursor#47 char *print_char_cursor#48 char *print_char_cursor#49 char *print_char_cursor#5 char *print_char_cursor#50 char *print_char_cursor#51 char *print_char_cursor#52 char *print_char_cursor#53 char *print_char_cursor#54 char *print_char_cursor#55 char *print_char_cursor#56 char *print_char_cursor#57 char *print_char_cursor#58 char *print_char_cursor#59 char *print_char_cursor#6 char *print_char_cursor#60 char *print_char_cursor#7 char *print_char_cursor#8 char *print_char_cursor#9 void print_cls() __constant const char print_hextab[] = "0123456789abcdef"z char *print_line_cursor char *print_line_cursor#0 char *print_line_cursor#1 char *print_line_cursor#10 char *print_line_cursor#11 char *print_line_cursor#12 char *print_line_cursor#13 char *print_line_cursor#14 char *print_line_cursor#15 char *print_line_cursor#16 char *print_line_cursor#17 char *print_line_cursor#18 char *print_line_cursor#19 char *print_line_cursor#2 char *print_line_cursor#20 char *print_line_cursor#21 char *print_line_cursor#22 char *print_line_cursor#23 char *print_line_cursor#24 char *print_line_cursor#25 char *print_line_cursor#26 char *print_line_cursor#27 char *print_line_cursor#28 char *print_line_cursor#29 char *print_line_cursor#3 char *print_line_cursor#30 char *print_line_cursor#31 char *print_line_cursor#32 char *print_line_cursor#33 char *print_line_cursor#34 char *print_line_cursor#35 char *print_line_cursor#36 char *print_line_cursor#37 char *print_line_cursor#38 char *print_line_cursor#39 char *print_line_cursor#4 char *print_line_cursor#40 char *print_line_cursor#5 char *print_line_cursor#6 char *print_line_cursor#7 char *print_line_cursor#8 char *print_line_cursor#9 void print_ln() char *print_ln::$0 bool print_ln::$1 void print_points() char *print_points::$2 char *print_points::$5 bool print_points::$8 char print_points::getPoint1_$0 char *print_points::getPoint1_$1 char print_points::getPoint1_idx char print_points::getPoint1_idx#0 char print_points::getPoint1_idx#1 char *print_points::getPoint1_return char *print_points::getPoint1_return#0 char *print_points::getPoint1_return#1 char *print_points::getPoint1_return#2 char *print_points::getPoint1_return#3 char print_points::i char print_points::i#0 char print_points::i#1 char print_points::i#10 char print_points::i#11 char print_points::i#12 char print_points::i#13 char print_points::i#14 char print_points::i#15 char print_points::i#2 char print_points::i#3 char print_points::i#4 char print_points::i#5 char print_points::i#6 char print_points::i#7 char print_points::i#8 char print_points::i#9 char *print_points::point char *print_points::point#0 char *print_points::point#1 char *print_points::point#2 char *print_points::point#3 char *print_points::point#4 char *print_points::point#5 char *print_points::pointXpos1_$0 char *print_points::pointXpos1_point char *print_points::pointXpos1_point#0 char *print_points::pointXpos1_point#1 char *print_points::pointXpos1_return char *print_points::pointXpos1_return#0 char *print_points::pointXpos1_return#1 char *print_points::pointXpos1_return#2 char *print_points::pointXpos1_return#3 char *print_points::pointYpos1_$0 char *print_points::pointYpos1_point char *print_points::pointYpos1_point#0 char *print_points::pointYpos1_point#1 char *print_points::pointYpos1_return char *print_points::pointYpos1_return#0 char *print_points::pointYpos1_return#1 char *print_points::pointYpos1_return#2 char *print_points::pointYpos1_return#3 __constant char print_points::str[2] = " " char *print_screen char *print_screen#0 char *print_screen#1 char *print_screen#2 char *print_screen#3 char *print_screen#4 char *print_screen#5 char *print_screen#6 char *print_screen#7 char *print_screen#8 char *print_screen#9 void print_str(char *str) bool print_str::$1 char *print_str::str char *print_str::str#0 char *print_str::str#1 char *print_str::str#2 char *print_str::str#3 char *print_str::str#4 char *print_str::str#5 void print_uchar(char b) char print_uchar::$0 number print_uchar::$2 char print_uchar::b char print_uchar::b#0 char print_uchar::b#1 char print_uchar::b#2 char print_uchar::b#3 Adding number conversion cast (unumber) 0 in print_str::$1 = 0 != *print_str::str#2 Adding number conversion cast (unumber) $28 in print_ln::$0 = print_line_cursor#12 + $28 Adding number conversion cast (unumber) 4 in print_uchar::$0 = print_uchar::b#2 >> 4 Adding number conversion cast (unumber) $f in print_uchar::$2 = print_uchar::b#3 & $f Adding number conversion cast (unumber) print_uchar::$2 in print_uchar::$2 = print_uchar::b#3 & (unumber)$f Adding number conversion cast (unumber) $3e8 in memset::num#0 = $3e8 Adding number conversion cast (unumber) 0 in memset::$0 = memset::num#1 > 0 Adding number conversion cast (unumber) 0 in init_points::pointXpos1_$0 = init_points::pointXpos1_point#1 + 0 Adding number conversion cast (unumber) $a in init_points::pos#1 = init_points::pos#3 + $a Adding number conversion cast (unumber) 1 in init_points::pointYpos1_$0 = init_points::pointYpos1_point#1 + 1 Adding number conversion cast (unumber) $a in init_points::pos#2 = init_points::pos#4 + $a Adding number conversion cast (unumber) 1 in init_points::i#1 = init_points::i#3 + rangenext(0,NUM_POINTS-1) Adding number conversion cast (unumber) 0 in print_points::pointXpos1_$0 = print_points::pointXpos1_point#1 + 0 Adding number conversion cast (unumber) 1 in print_points::pointYpos1_$0 = print_points::pointYpos1_point#1 + 1 Adding number conversion cast (unumber) 1 in print_points::i#1 = print_points::i#3 + rangenext(0,NUM_POINTS-1) Successful SSA optimization PassNAddNumberTypeConversions Inlining cast memset::num#0 = (unumber)$3e8 Inlining cast memset::dst#0 = (char *)memset::str#2 Successful SSA optimization Pass2InlineCast Simplifying constant integer cast 0 Simplifying constant integer cast $28 Simplifying constant integer cast 4 Simplifying constant integer cast $f Simplifying constant integer cast $3e8 Simplifying constant integer cast 0 Simplifying constant integer cast 0 Simplifying constant integer cast init_points::pointXpos1_$0 Simplifying constant integer cast $a Simplifying constant integer cast 1 Simplifying constant integer cast init_points::pointYpos1_$0 Simplifying constant integer cast $a Simplifying constant integer cast 1 Simplifying constant integer cast 0 Simplifying constant integer cast print_points::pointXpos1_$0 Simplifying constant integer cast 1 Simplifying constant integer cast print_points::pointYpos1_$0 Simplifying constant integer cast 1 Simplifying constant pointer cast (char *) 1024 Successful SSA optimization PassNCastSimplification Finalized unsigned number type (char) 0 Finalized unsigned number type (char) $28 Finalized unsigned number type (char) 4 Finalized unsigned number type (char) $f Finalized unsigned number type (unsigned int) $3e8 Finalized unsigned number type (char) 0 Finalized unsigned number type (char) 0 Finalized unsigned number type (char) $a Finalized unsigned number type (char) 1 Finalized unsigned number type (char) $a Finalized unsigned number type (char) 1 Finalized unsigned number type (char) 0 Finalized unsigned number type (char) 1 Finalized unsigned number type (char) 1 Successful SSA optimization PassNFinalizeNumberTypeConversions Inferred type updated to char in print_uchar::$2 = print_uchar::b#3 & $f Inversing boolean not [60] memset::$1 = memset::num#1 <= 0 from [59] memset::$0 = memset::num#1 > 0 Successful SSA optimization Pass2UnaryNotSimplification Alias print_str::str#2 = print_str::str#3 print_str::str#4 Alias print_char_cursor#1 = print_char_cursor#42 print_char_cursor#43 print_char_cursor#23 Alias print_char_cursor#0 = print_char_cursor#22 Alias print_line_cursor#0 = print_ln::$0 print_line_cursor#13 print_char_cursor#2 print_line_cursor#14 print_char_cursor#25 print_line_cursor#1 print_char_cursor#3 Alias print_uchar::b#2 = print_uchar::b#3 Alias print_char_cursor#26 = print_char_cursor#4 Alias print_char_cursor#27 = print_char_cursor#5 print_char_cursor#28 print_char_cursor#6 Alias print_char_cursor#30 = print_char_cursor#7 print_char_cursor#8 Alias print_line_cursor#15 = print_screen#3 print_screen#2 print_line_cursor#2 print_char_cursor#9 print_char_cursor#31 print_line_cursor#3 print_char_cursor#10 Alias memset::return#1 = memset::str#1 memset::return#3 memset::return#2 Alias memset::str#2 = memset::str#3 Alias memset::num#1 = memset::num#2 Alias memset::c#3 = memset::c#4 Alias memset::c#1 = memset::c#2 Alias memset::dst#2 = memset::dst#3 Alias memset::end#1 = memset::end#2 Alias memset::str#4 = memset::str#5 Alias print_line_cursor#24 = print_line_cursor#28 Alias print_char_cursor#46 = print_char_cursor#52 Alias print_screen#7 = print_screen#9 Alias print_line_cursor#16 = print_line_cursor#4 print_line_cursor#17 print_line_cursor#5 Alias print_char_cursor#11 = print_char_cursor#32 print_char_cursor#33 print_char_cursor#12 Alias init_points::i#10 = init_points::getPoint1_idx#0 init_points::i#2 init_points::getPoint1_idx#1 init_points::i#11 init_points::i#9 init_points::i#8 init_points::i#7 init_points::i#6 init_points::i#5 init_points::i#4 init_points::i#3 Alias init_points::pos#10 = init_points::pos#11 init_points::pos#12 init_points::pos#9 init_points::pos#7 init_points::pos#5 init_points::pos#3 Alias init_points::getPoint1_return#0 = init_points::getPoint1_$1 init_points::getPoint1_return#2 init_points::getPoint1_return#1 init_points::getPoint1_return#3 init_points::point#0 init_points::pointXpos1_point#0 init_points::pointXpos1_point#1 init_points::point#3 init_points::point#2 init_points::point#1 init_points::pointYpos1_point#0 init_points::pointYpos1_point#1 Alias init_points::pointXpos1_return#0 = init_points::pointXpos1_$0 init_points::pointXpos1_return#2 init_points::pointXpos1_return#1 init_points::pointXpos1_return#3 init_points::$1 Alias init_points::pos#1 = init_points::pos#8 init_points::pos#6 init_points::pos#4 Alias init_points::pointYpos1_return#0 = init_points::pointYpos1_$0 init_points::pointYpos1_return#2 init_points::pointYpos1_return#1 init_points::pointYpos1_return#3 init_points::$2 Alias print_line_cursor#18 = print_line_cursor#6 Alias print_char_cursor#13 = print_char_cursor#34 Alias print_points::i#10 = print_points::getPoint1_idx#0 print_points::i#2 print_points::getPoint1_idx#1 print_points::i#15 print_points::i#14 print_points::i#13 print_points::i#12 print_points::i#11 print_points::i#9 print_points::i#8 print_points::i#7 print_points::i#6 print_points::i#5 print_points::i#4 print_points::i#3 Alias print_char_cursor#48 = print_char_cursor#59 print_char_cursor#60 print_char_cursor#58 print_char_cursor#57 print_char_cursor#55 print_char_cursor#53 Alias print_line_cursor#26 = print_line_cursor#39 print_line_cursor#40 print_line_cursor#38 print_line_cursor#37 print_line_cursor#36 print_line_cursor#35 print_line_cursor#34 print_line_cursor#33 print_line_cursor#32 print_line_cursor#31 print_line_cursor#30 print_line_cursor#29 Alias print_points::point#0 = print_points::getPoint1_return#0 print_points::getPoint1_$1 print_points::getPoint1_return#2 print_points::getPoint1_return#1 print_points::getPoint1_return#3 print_points::pointXpos1_point#0 print_points::pointXpos1_point#1 print_points::point#5 print_points::point#4 print_points::point#3 print_points::point#2 print_points::point#1 print_points::pointYpos1_point#0 print_points::pointYpos1_point#1 Alias print_points::pointXpos1_return#0 = print_points::pointXpos1_$0 print_points::pointXpos1_return#2 print_points::pointXpos1_return#1 print_points::pointXpos1_return#3 print_points::$2 Alias print_char_cursor#14 = print_char_cursor#35 Alias print_char_cursor#15 = print_char_cursor#36 print_char_cursor#56 print_char_cursor#54 print_char_cursor#49 Alias print_points::pointYpos1_return#0 = print_points::pointYpos1_$0 print_points::pointYpos1_return#2 print_points::pointYpos1_return#1 print_points::pointYpos1_return#3 print_points::$5 Alias print_char_cursor#16 = print_char_cursor#37 Alias print_line_cursor#19 = print_line_cursor#7 print_line_cursor#20 print_line_cursor#8 Alias print_char_cursor#17 = print_char_cursor#38 print_char_cursor#39 print_char_cursor#18 Alias print_screen#0 = print_line_cursor#9 print_char_cursor#19 print_line_cursor#27 print_char_cursor#50 print_screen#8 print_screen#6 print_screen#4 print_screen#1 Alias print_line_cursor#10 = print_line_cursor#21 print_line_cursor#22 print_line_cursor#11 Alias print_char_cursor#20 = print_char_cursor#40 print_char_cursor#41 print_char_cursor#21 Successful SSA optimization Pass2AliasElimination Identical Phi Values print_str::str#5 print_str::str#1 Identical Phi Values print_char_cursor#51 print_char_cursor#14 Identical Phi Values print_char_cursor#0 print_char_cursor#30 Identical Phi Values print_line_cursor#23 print_line_cursor#26 Identical Phi Values print_char_cursor#44 print_char_cursor#16 Identical Phi Values print_char_cursor#24 print_char_cursor#44 Identical Phi Values print_char_cursor#26 print_char_cursor#30 Identical Phi Values print_char_cursor#27 print_char_cursor#30 Identical Phi Values print_line_cursor#15 print_screen#5 Identical Phi Values memset::num#1 memset::num#0 Identical Phi Values memset::str#2 memset::str#0 Identical Phi Values memset::c#3 memset::c#0 Identical Phi Values memset::end#1 memset::end#0 Identical Phi Values memset::str#4 memset::str#2 Identical Phi Values memset::c#1 memset::c#3 Identical Phi Values print_line_cursor#24 print_screen#0 Identical Phi Values print_char_cursor#46 print_screen#0 Identical Phi Values print_screen#7 print_screen#0 Identical Phi Values print_line_cursor#16 print_line_cursor#19 Identical Phi Values print_char_cursor#11 print_char_cursor#17 Identical Phi Values print_screen#5 print_screen#7 Identical Phi Values print_line_cursor#25 print_line_cursor#24 Identical Phi Values print_char_cursor#47 print_char_cursor#46 Identical Phi Values print_line_cursor#18 print_line_cursor#15 Identical Phi Values print_char_cursor#13 print_line_cursor#15 Identical Phi Values print_char_cursor#14 print_char_cursor#27 Identical Phi Values print_char_cursor#15 print_char_cursor#1 Identical Phi Values print_char_cursor#16 print_char_cursor#27 Identical Phi Values print_line_cursor#19 print_line_cursor#0 Identical Phi Values print_char_cursor#17 print_line_cursor#0 Identical Phi Values print_line_cursor#10 print_line_cursor#16 Identical Phi Values print_char_cursor#20 print_char_cursor#11 Successful SSA optimization Pass2IdenticalPhiElimination Identical Phi Values print_char_cursor#1 print_char_cursor#30 Identical Phi Values memset::return#1 memset::str#0 Successful SSA optimization Pass2IdenticalPhiElimination Simple Condition print_str::$1 [3] if(0!=*print_str::str#2) goto print_str::@2 Simple Condition print_ln::$1 [13] if(print_line_cursor#0> 4 [42] print_char::ch#1 = print_hextab[print_uchar::$0] [43] call print_char to:print_uchar::@1 print_uchar::@1: scope:[print_uchar] from print_uchar [44] print_uchar::$2 = print_uchar::b#2 & $f [45] print_char::ch#2 = print_hextab[print_uchar::$2] [46] call print_char to:print_uchar::@return print_uchar::@return: scope:[print_uchar] from print_uchar::@1 [47] return to:@return void print_str(char *str) print_str: scope:[print_str] from print_points::@4 [48] phi() to:print_str::@1 print_str::@1: scope:[print_str] from print_str print_str::@3 [49] print_str::str#2 = phi( print_str/print_points::str, print_str::@3/print_str::str#0 ) [50] if(0!=*print_str::str#2) goto print_str::@2 to:print_str::@return print_str::@return: scope:[print_str] from print_str::@1 [51] return to:@return print_str::@2: scope:[print_str] from print_str::@1 [52] print_char::ch#0 = *print_str::str#2 [53] call print_char to:print_str::@3 print_str::@3: scope:[print_str] from print_str::@2 [54] print_str::str#0 = ++ print_str::str#2 to:print_str::@1 void print_ln() print_ln: scope:[print_ln] from print_points::@5 [55] phi() to:print_ln::@1 print_ln::@1: scope:[print_ln] from print_ln print_ln::@1 [56] print_line_cursor#12 = phi( print_ln/print_line_cursor#26, print_ln::@1/print_line_cursor#0 ) [57] print_line_cursor#0 = print_line_cursor#12 + $28 [58] if(print_line_cursor#0> 4 [ print_uchar::b#2 print_char_cursor#45 print_uchar::$0 ] ( print_points:3::print_uchar:25 [ print_points::i#10 print_line_cursor#26 print_points::point#0 print_uchar::b#2 print_char_cursor#45 print_uchar::$0 ] { { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#29 = print_char_cursor#45 print_char_cursor#48 } { print_char::ch#1 = print_char::ch#3 } } print_points:3::print_uchar:30 [ print_points::i#10 print_line_cursor#26 print_uchar::b#2 print_char_cursor#45 print_uchar::$0 ] { { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#29 = print_char_cursor#45 print_char_cursor#30 } { print_char::ch#1 = print_char::ch#3 } } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:13 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] Statement [44] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#30 print_uchar::$2 ] ( print_points:3::print_uchar:25 [ print_points::i#10 print_line_cursor#26 print_points::point#0 print_char_cursor#30 print_uchar::$2 ] { { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#45 = print_char_cursor#48 } { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#29 = print_char_cursor#30 } } print_points:3::print_uchar:30 [ print_points::i#10 print_line_cursor#26 print_char_cursor#30 print_uchar::$2 ] { { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#29 = print_char_cursor#45 print_char_cursor#30 } { print_char::ch#2 = print_char::ch#3 } } ) always clobbers reg byte a Statement [50] if(0!=*print_str::str#2) goto print_str::@2 [ print_char_cursor#30 print_str::str#2 ] ( print_points:3::print_str:27 [ print_points::i#10 print_line_cursor#26 print_points::point#0 print_char_cursor#30 print_str::str#2 ] { } ) always clobbers reg byte a reg byte y Statement [52] print_char::ch#0 = *print_str::str#2 [ print_char_cursor#30 print_str::str#2 print_char::ch#0 ] ( print_points:3::print_str:27 [ print_points::i#10 print_line_cursor#26 print_points::point#0 print_char_cursor#30 print_str::str#2 print_char::ch#0 ] { { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#29 = print_char_cursor#30 } } ) always clobbers reg byte a reg byte y Statement [57] print_line_cursor#0 = print_line_cursor#12 + $28 [ print_line_cursor#0 print_char_cursor#30 ] ( print_points:3::print_ln:32 [ print_points::i#10 print_line_cursor#0 print_char_cursor#30 ] { } ) always clobbers reg byte a Statement [58] if(print_line_cursor#0> 4 [ print_uchar::b#2 print_char_cursor#45 print_uchar::$0 ] ( print_points:3::print_uchar:25 [ print_points::i#10 print_line_cursor#26 print_points::point#0 print_uchar::b#2 print_char_cursor#45 print_uchar::$0 ] { { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#29 = print_char_cursor#45 print_char_cursor#48 } { print_char::ch#1 = print_char::ch#3 } } print_points:3::print_uchar:30 [ print_points::i#10 print_line_cursor#26 print_uchar::b#2 print_char_cursor#45 print_uchar::$0 ] { { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#29 = print_char_cursor#45 print_char_cursor#30 } { print_char::ch#1 = print_char::ch#3 } } ) always clobbers reg byte a Statement [44] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#30 print_uchar::$2 ] ( print_points:3::print_uchar:25 [ print_points::i#10 print_line_cursor#26 print_points::point#0 print_char_cursor#30 print_uchar::$2 ] { { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#45 = print_char_cursor#48 } { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#29 = print_char_cursor#30 } } print_points:3::print_uchar:30 [ print_points::i#10 print_line_cursor#26 print_char_cursor#30 print_uchar::$2 ] { { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#29 = print_char_cursor#45 print_char_cursor#30 } { print_char::ch#2 = print_char::ch#3 } } ) always clobbers reg byte a Statement [50] if(0!=*print_str::str#2) goto print_str::@2 [ print_char_cursor#30 print_str::str#2 ] ( print_points:3::print_str:27 [ print_points::i#10 print_line_cursor#26 print_points::point#0 print_char_cursor#30 print_str::str#2 ] { } ) always clobbers reg byte a reg byte y Statement [52] print_char::ch#0 = *print_str::str#2 [ print_char_cursor#30 print_str::str#2 print_char::ch#0 ] ( print_points:3::print_str:27 [ print_points::i#10 print_line_cursor#26 print_points::point#0 print_char_cursor#30 print_str::str#2 print_char::ch#0 ] { { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#29 = print_char_cursor#30 } } ) always clobbers reg byte a reg byte y Statement [57] print_line_cursor#0 = print_line_cursor#12 + $28 [ print_line_cursor#0 print_char_cursor#30 ] ( print_points:3::print_ln:32 [ print_points::i#10 print_line_cursor#0 print_char_cursor#30 ] { } ) always clobbers reg byte a Statement [58] if(print_line_cursor#0init_points] init_points_from_main: jsr init_points // [2] phi from main to main::@1 [phi:main->main::@1] __b1_from_main: jmp __b1 // main::@1 __b1: // [3] call print_points // [18] phi from main::@1 to print_points [phi:main::@1->print_points] print_points_from___b1: jsr print_points jmp __breturn // main::@return __breturn: // [4] return rts } // init_points // Initialize points init_points: { .label getPoint1_return = 6 .label pos = 8 // [6] phi from init_points to init_points::@1 [phi:init_points->init_points::@1] __b1_from_init_points: // [6] phi init_points::pos#10 = $a [phi:init_points->init_points::@1#0] -- vbuz1=vbuc1 lda #$a sta.z pos // [6] phi init_points::i#10 = 0 [phi:init_points->init_points::@1#1] -- vbuxx=vbuc1 ldx #0 jmp __b1 // [6] phi from init_points::@3 to init_points::@1 [phi:init_points::@3->init_points::@1] __b1_from___b3: // [6] phi init_points::pos#10 = init_points::pos#2 [phi:init_points::@3->init_points::@1#0] -- register_copy // [6] phi init_points::i#10 = init_points::i#1 [phi:init_points::@3->init_points::@1#1] -- register_copy jmp __b1 // init_points::@1 __b1: jmp getPoint1 // init_points::getPoint1 getPoint1: // [7] init_points::getPoint1_$0 = init_points::i#10 << 1 -- vbuyy=vbuxx_rol_1 txa asl tay // [8] init_points::getPoint1_return#0 = points + init_points::getPoint1_$0 -- pbuz1=pbuc1_plus_vbuyy tya clc adc #points adc #0 sta.z getPoint1_return+1 // [9] phi from init_points::getPoint1 to init_points::pointXpos1 [phi:init_points::getPoint1->init_points::pointXpos1] pointXpos1_from_getPoint1: jmp pointXpos1 // init_points::pointXpos1 pointXpos1: jmp __b2 // init_points::@2 __b2: // [10] points[init_points::getPoint1_$0] = init_points::pos#10 -- pbuc1_derefidx_vbuyy=vbuz1 lda.z pos sta points,y // [11] init_points::pos#1 = init_points::pos#10 + $a -- vbuaa=vbuz1_plus_vbuc1 lda #$a clc adc.z pos // [12] phi from init_points::@2 to init_points::pointYpos1 [phi:init_points::@2->init_points::pointYpos1] pointYpos1_from___b2: jmp pointYpos1 // init_points::pointYpos1 pointYpos1: jmp __b3 // init_points::@3 __b3: // [13] init_points::getPoint1_return#0[1] = init_points::pos#1 -- pbuz1_derefidx_vbuc1=vbuaa ldy #1 sta (getPoint1_return),y // [14] init_points::pos#2 = init_points::pos#1 + $a -- vbuz1=vbuaa_plus_vbuc1 clc adc #$a sta.z pos // [15] init_points::i#1 = ++ init_points::i#10 -- vbuxx=_inc_vbuxx inx // [16] if(init_points::i#1!=NUM_POINTS-1+1) goto init_points::@1 -- vbuxx_neq_vbuc1_then_la1 cpx #NUM_POINTS-1+1 bne __b1_from___b3 jmp __breturn // init_points::@return __breturn: // [17] return rts } // print_points // Print points print_points: { .label point = 9 .label i = 8 // [19] call print_cls // [37] phi from print_points to print_cls [phi:print_points->print_cls] print_cls_from_print_points: jsr print_cls // [20] phi from print_points to print_points::@1 [phi:print_points->print_points::@1] __b1_from_print_points: // [20] phi print_line_cursor#26 = print_screen#0 [phi:print_points->print_points::@1#0] -- pbuz1=pbuc1 lda #print_screen sta.z print_line_cursor+1 // [20] phi print_char_cursor#48 = print_screen#0 [phi:print_points->print_points::@1#1] -- pbuz1=pbuc1 lda #print_screen sta.z print_char_cursor+1 // [20] phi print_points::i#10 = 0 [phi:print_points->print_points::@1#2] -- vbuz1=vbuc1 lda #0 sta.z i jmp __b1 // print_points::@1 __b1: jmp getPoint1 // print_points::getPoint1 getPoint1: // [21] print_points::getPoint1_$0 = print_points::i#10 << 1 -- vbuyy=vbuz1_rol_1 lda.z i asl tay // [22] print_points::point#0 = points + print_points::getPoint1_$0 -- pbuz1=pbuc1_plus_vbuyy tya clc adc #points adc #0 sta.z point+1 // [23] phi from print_points::getPoint1 to print_points::pointXpos1 [phi:print_points::getPoint1->print_points::pointXpos1] pointXpos1_from_getPoint1: jmp pointXpos1 // print_points::pointXpos1 pointXpos1: jmp __b2 // print_points::@2 __b2: // [24] print_uchar::b#0 = points[print_points::getPoint1_$0] -- vbuxx=pbuc1_derefidx_vbuyy ldx points,y // [25] call print_uchar // [40] phi from print_points::@2 to print_uchar [phi:print_points::@2->print_uchar] print_uchar_from___b2: // [40] phi print_char_cursor#45 = print_char_cursor#48 [phi:print_points::@2->print_uchar#0] -- register_copy // [40] phi print_uchar::b#2 = print_uchar::b#0 [phi:print_points::@2->print_uchar#1] -- register_copy jsr print_uchar // [26] phi from print_points::@2 to print_points::@4 [phi:print_points::@2->print_points::@4] __b4_from___b2: jmp __b4 // print_points::@4 __b4: // [27] call print_str // [48] phi from print_points::@4 to print_str [phi:print_points::@4->print_str] print_str_from___b4: jsr print_str // [28] phi from print_points::@4 to print_points::pointYpos1 [phi:print_points::@4->print_points::pointYpos1] pointYpos1_from___b4: jmp pointYpos1 // print_points::pointYpos1 pointYpos1: jmp __b3 // print_points::@3 __b3: // [29] print_uchar::b#1 = print_points::point#0[1] -- vbuxx=pbuz1_derefidx_vbuc1 ldy #1 lda (point),y tax // [30] call print_uchar // [40] phi from print_points::@3 to print_uchar [phi:print_points::@3->print_uchar] print_uchar_from___b3: // [40] phi print_char_cursor#45 = print_char_cursor#30 [phi:print_points::@3->print_uchar#0] -- register_copy // [40] phi print_uchar::b#2 = print_uchar::b#1 [phi:print_points::@3->print_uchar#1] -- register_copy jsr print_uchar // [31] phi from print_points::@3 to print_points::@5 [phi:print_points::@3->print_points::@5] __b5_from___b3: jmp __b5 // print_points::@5 __b5: // [32] call print_ln // [55] phi from print_points::@5 to print_ln [phi:print_points::@5->print_ln] print_ln_from___b5: jsr print_ln jmp __b6 // print_points::@6 __b6: // [33] print_points::i#1 = ++ print_points::i#10 -- vbuz1=_inc_vbuz1 inc.z i // [34] if(print_points::i#1!=NUM_POINTS-1+1) goto print_points::@7 -- vbuz1_neq_vbuc1_then_la1 lda #NUM_POINTS-1+1 cmp.z i bne __b7 jmp __breturn // print_points::@return __breturn: // [35] return rts // print_points::@7 __b7: // [36] print_char_cursor#66 = print_line_cursor#0 -- pbuz1=pbuz2 lda.z print_line_cursor sta.z print_char_cursor lda.z print_line_cursor+1 sta.z print_char_cursor+1 // [20] phi from print_points::@7 to print_points::@1 [phi:print_points::@7->print_points::@1] __b1_from___b7: // [20] phi print_line_cursor#26 = print_line_cursor#0 [phi:print_points::@7->print_points::@1#0] -- register_copy // [20] phi print_char_cursor#48 = print_char_cursor#66 [phi:print_points::@7->print_points::@1#1] -- register_copy // [20] phi print_points::i#10 = print_points::i#1 [phi:print_points::@7->print_points::@1#2] -- register_copy jmp __b1 .segment Data str: .text " " .byte 0 } .segment Code // print_cls // Clear the screen. Also resets current line/char cursor. print_cls: { // [38] call memset // [60] phi from print_cls to memset [phi:print_cls->memset] memset_from_print_cls: jsr memset jmp __breturn // print_cls::@return __breturn: // [39] return rts } // print_uchar // Print a char as HEX // void print_uchar(__register(X) char b) print_uchar: { // [41] print_uchar::$0 = print_uchar::b#2 >> 4 -- vbuaa=vbuxx_ror_4 txa lsr lsr lsr lsr // [42] print_char::ch#1 = print_hextab[print_uchar::$0] -- vbuaa=pbuc1_derefidx_vbuaa tay lda print_hextab,y // [43] call print_char // Table of hexadecimal digits // [66] phi from print_uchar to print_char [phi:print_uchar->print_char] print_char_from_print_uchar: // [66] phi print_char_cursor#29 = print_char_cursor#45 [phi:print_uchar->print_char#0] -- register_copy // [66] phi print_char::ch#3 = print_char::ch#1 [phi:print_uchar->print_char#1] -- register_copy jsr print_char jmp __b1 // print_uchar::@1 __b1: // [44] print_uchar::$2 = print_uchar::b#2 & $f -- vbuxx=vbuxx_band_vbuc1 lda #$f axs #0 // [45] print_char::ch#2 = print_hextab[print_uchar::$2] -- vbuaa=pbuc1_derefidx_vbuxx lda print_hextab,x // [46] call print_char // [66] phi from print_uchar::@1 to print_char [phi:print_uchar::@1->print_char] print_char_from___b1: // [66] phi print_char_cursor#29 = print_char_cursor#30 [phi:print_uchar::@1->print_char#0] -- register_copy // [66] phi print_char::ch#3 = print_char::ch#2 [phi:print_uchar::@1->print_char#1] -- register_copy jsr print_char jmp __breturn // print_uchar::@return __breturn: // [47] return rts } // print_str // Print a zero-terminated string // void print_str(__zp(4) char *str) print_str: { .label str = 4 // [49] phi from print_str to print_str::@1 [phi:print_str->print_str::@1] __b1_from_print_str: // [49] phi print_str::str#2 = print_points::str [phi:print_str->print_str::@1#0] -- pbuz1=pbuc1 lda #print_points.str sta.z str+1 jmp __b1 // print_str::@1 __b1: // [50] if(0!=*print_str::str#2) goto print_str::@2 -- 0_neq__deref_pbuz1_then_la1 ldy #0 lda (str),y cmp #0 bne __b2 jmp __breturn // print_str::@return __breturn: // [51] return rts // print_str::@2 __b2: // [52] print_char::ch#0 = *print_str::str#2 -- vbuaa=_deref_pbuz1 ldy #0 lda (str),y // [53] call print_char // [66] phi from print_str::@2 to print_char [phi:print_str::@2->print_char] print_char_from___b2: // [66] phi print_char_cursor#29 = print_char_cursor#30 [phi:print_str::@2->print_char#0] -- register_copy // [66] phi print_char::ch#3 = print_char::ch#0 [phi:print_str::@2->print_char#1] -- register_copy jsr print_char jmp __b3 // print_str::@3 __b3: // [54] print_str::str#0 = ++ print_str::str#2 -- pbuz1=_inc_pbuz1 inc.z str bne !+ inc.z str+1 !: // [49] phi from print_str::@3 to print_str::@1 [phi:print_str::@3->print_str::@1] __b1_from___b3: // [49] phi print_str::str#2 = print_str::str#0 [phi:print_str::@3->print_str::@1#0] -- register_copy jmp __b1 } // print_ln // Print a newline print_ln: { // [56] phi from print_ln print_ln::@1 to print_ln::@1 [phi:print_ln/print_ln::@1->print_ln::@1] __b1_from_print_ln: __b1_from___b1: // [56] phi print_line_cursor#12 = print_line_cursor#26 [phi:print_ln/print_ln::@1->print_ln::@1#0] -- register_copy jmp __b1 // print_ln::@1 __b1: // [57] print_line_cursor#0 = print_line_cursor#12 + $28 -- pbuz1=pbuz1_plus_vbuc1 lda #$28 clc adc.z print_line_cursor sta.z print_line_cursor bcc !+ inc.z print_line_cursor+1 !: // [58] if(print_line_cursor#0memset::@1] __b1_from_memset: // [61] phi memset::dst#2 = (char *)memset::str#0 [phi:memset->memset::@1#0] -- pbuz1=pbuc1 lda #str sta.z dst+1 jmp __b1 // memset::@1 __b1: // [62] if(memset::dst#2!=memset::end#0) goto memset::@2 -- pbuz1_neq_pbuc1_then_la1 lda.z dst+1 cmp #>end bne __b2 lda.z dst cmp #memset::@1] __b1_from___b2: // [61] phi memset::dst#2 = memset::dst#1 [phi:memset::@2->memset::@1#0] -- register_copy jmp __b1 } // print_char // Print a single char // void print_char(__register(A) char ch) print_char: { // [67] *print_char_cursor#29 = print_char::ch#3 -- _deref_pbuz1=vbuaa ldy #0 sta (print_char_cursor),y // [68] print_char_cursor#30 = ++ print_char_cursor#29 -- pbuz1=_inc_pbuz1 inc.z print_char_cursor bne !+ inc.z print_char_cursor+1 !: jmp __breturn // print_char::@return __breturn: // [69] return rts } // File Data .segment Data print_hextab: .text "0123456789abcdef" // All points points: .fill NUM_POINTS*SIZEOF_POINT, 0 ASSEMBLER OPTIMIZATIONS Removing instruction jmp __b1 Removing instruction jmp __breturn Removing instruction jmp __b1 Removing instruction jmp getPoint1 Removing instruction jmp pointXpos1 Removing instruction jmp __b2 Removing instruction jmp pointYpos1 Removing instruction jmp __b3 Removing instruction jmp __breturn Removing instruction jmp __b1 Removing instruction jmp getPoint1 Removing instruction jmp pointXpos1 Removing instruction jmp __b2 Removing instruction jmp __b4 Removing instruction jmp pointYpos1 Removing instruction jmp __b3 Removing instruction jmp __b5 Removing instruction jmp __b6 Removing instruction jmp __breturn Removing instruction jmp __breturn Removing instruction jmp __b1 Removing instruction jmp __breturn Removing instruction jmp __b1 Removing instruction jmp __breturn Removing instruction jmp __b3 Removing instruction jmp __b1 Removing instruction jmp __breturn Removing instruction jmp __b1 Removing instruction jmp __breturn Removing instruction jmp __breturn Succesful ASM optimization Pass5NextJumpElimination Replacing label __b1_from___b3 with __b1 Replacing label __b1_from___b1 with __b1 Replacing label __b1_from___b1 with __b1 Removing instruction __b1_from_main: Removing instruction print_points_from___b1: Removing instruction __b1_from___b3: Removing instruction getPoint1: Removing instruction pointXpos1_from_getPoint1: Removing instruction pointXpos1: Removing instruction pointYpos1_from___b2: Removing instruction pointYpos1: Removing instruction getPoint1: Removing instruction pointXpos1_from_getPoint1: Removing instruction pointXpos1: Removing instruction __b4_from___b2: Removing instruction print_str_from___b4: Removing instruction pointYpos1_from___b4: Removing instruction pointYpos1: Removing instruction __b5_from___b3: Removing instruction print_ln_from___b5: Removing instruction __b1_from_print_ln: Removing instruction __b1_from___b1: Succesful ASM optimization Pass5RedundantLabelElimination Removing instruction init_points_from_main: Removing instruction __b1: Removing instruction __breturn: Removing instruction __b1_from_init_points: Removing instruction __b2: Removing instruction __b3: Removing instruction __breturn: Removing instruction print_cls_from_print_points: Removing instruction __b1_from_print_points: Removing instruction __b2: Removing instruction print_uchar_from___b2: Removing instruction __b4: Removing instruction __b3: Removing instruction print_uchar_from___b3: Removing instruction __b5: Removing instruction __b6: Removing instruction __breturn: Removing instruction __b1_from___b7: Removing instruction memset_from_print_cls: Removing instruction __breturn: Removing instruction print_char_from_print_uchar: Removing instruction __b1: Removing instruction print_char_from___b1: Removing instruction __breturn: Removing instruction __b1_from_print_str: Removing instruction __breturn: Removing instruction print_char_from___b2: Removing instruction __b3: Removing instruction __b1_from___b3: Removing instruction __breturn: Removing instruction __b1_from_memset: Removing instruction __breturn: Removing instruction __b1_from___b2: Removing instruction __breturn: Succesful ASM optimization Pass5UnusedLabelElimination Removing instruction jmp __b1 Succesful ASM optimization Pass5NextJumpElimination FINAL SYMBOL TABLE __constant const char NUM_POINTS = 4 __constant char RADIX::BINARY = 2 __constant char RADIX::DECIMAL = $a __constant char RADIX::HEXADECIMAL = $10 __constant char RADIX::OCTAL = 8 __constant const char SIZEOF_POINT = 2 void init_points() char init_points::getPoint1_$0 // reg byte y 101.0 char init_points::getPoint1_idx char *init_points::getPoint1_return char *init_points::getPoint1_return#0 // getPoint1_return zp[2]:6 40.4 char init_points::i char init_points::i#1 // reg byte x 151.5 char init_points::i#10 // reg byte x 33.666666666666664 char *init_points::point char *init_points::pointXpos1_point char *init_points::pointXpos1_return char *init_points::pointYpos1_point char *init_points::pointYpos1_return char init_points::pos char init_points::pos#1 // reg byte a 101.0 char init_points::pos#10 // pos zp[1]:8 60.599999999999994 char init_points::pos#2 // pos zp[1]:8 67.33333333333333 void main() void * memset(void *str , char c , unsigned int num) char memset::c __constant char memset::c#0 = ' ' // c char *memset::dst char *memset::dst#1 // dst zp[2]:4 20002.0 char *memset::dst#2 // dst zp[2]:4 13334.666666666666 char *memset::end __constant char *memset::end#0 = (char *)memset::str#0+memset::num#0 // end unsigned int memset::num __constant unsigned int memset::num#0 = $3e8 // num void *memset::return void *memset::str __constant void *memset::str#0 = (void *)print_screen#0 // str __constant char points[NUM_POINTS*SIZEOF_POINT] = { fill( NUM_POINTS*SIZEOF_POINT, 0) } void print_char(char ch) char print_char::ch char print_char::ch#0 // reg byte a 200002.0 char print_char::ch#1 // reg byte a 2002.0 char print_char::ch#2 // reg byte a 2002.0 char print_char::ch#3 // reg byte a 1102004.0 char *print_char_cursor char *print_char_cursor#29 // print_char_cursor zp[2]:2 1051002.5 char *print_char_cursor#30 // print_char_cursor zp[2]:2 48044.2 char *print_char_cursor#45 // print_char_cursor zp[2]:2 401.0 char *print_char_cursor#48 // print_char_cursor zp[2]:2 40.4 char *print_char_cursor#66 // print_char_cursor zp[2]:2 202.0 void print_cls() __constant const char print_hextab[] = "0123456789abcdef"z char *print_line_cursor char *print_line_cursor#0 // print_line_cursor zp[2]:6 42886.42857142857 char *print_line_cursor#12 // print_line_cursor zp[2]:6 201003.0 char *print_line_cursor#26 // print_line_cursor zp[2]:6 84.76923076923077 void print_ln() void print_points() char print_points::getPoint1_$0 // reg byte y 101.0 char print_points::getPoint1_idx char *print_points::getPoint1_return char print_points::i char print_points::i#1 // i zp[1]:8 101.0 char print_points::i#10 // i zp[1]:8 23.307692307692307 char *print_points::point char *print_points::point#0 // point zp[2]:9 28.857142857142858 char *print_points::pointXpos1_point char *print_points::pointXpos1_return char *print_points::pointYpos1_point char *print_points::pointYpos1_return __constant char print_points::str[2] = " " char *print_screen __constant char *print_screen#0 = (char *) 1024 // print_screen void print_str(char *str) char *print_str::str char *print_str::str#0 // str zp[2]:4 200002.0 char *print_str::str#2 // str zp[2]:4 100001.0 void print_uchar(char b) char print_uchar::$0 // reg byte a 2002.0 char print_uchar::$2 // reg byte x 2002.0 char print_uchar::b char print_uchar::b#0 // reg byte x 202.0 char print_uchar::b#1 // reg byte x 202.0 char print_uchar::b#2 // reg byte x 551.0 reg byte x [ init_points::i#10 init_points::i#1 ] zp[1]:8 [ print_points::i#10 print_points::i#1 init_points::pos#10 init_points::pos#2 ] reg byte x [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] zp[2]:4 [ memset::dst#2 memset::dst#1 print_str::str#2 print_str::str#0 ] reg byte a [ print_char::ch#3 print_char::ch#0 print_char::ch#1 print_char::ch#2 ] zp[2]:2 [ print_char_cursor#29 print_char_cursor#45 print_char_cursor#48 print_char_cursor#66 print_char_cursor#30 ] reg byte y [ init_points::getPoint1_$0 ] zp[2]:6 [ init_points::getPoint1_return#0 print_line_cursor#12 print_line_cursor#26 print_line_cursor#0 ] reg byte a [ init_points::pos#1 ] reg byte y [ print_points::getPoint1_$0 ] zp[2]:9 [ print_points::point#0 ] reg byte a [ print_uchar::$0 ] reg byte x [ print_uchar::$2 ] FINAL ASSEMBLER Score: 10419 // File Comments // Implementing a semi-struct without the struct keyword by using pointer math and inline functions // // struct Point { // byte xpos; // The x-position // byte ypos; // The y-position // }; // Point points[NUM_POINTS]; // Upstart // Commodore 64 PRG executable file .file [name="semi-struct-1.prg", type="prg", segments="Program"] .segmentdef Program [segments="Basic, Code, Data"] .segmentdef Basic [start=$0801] .segmentdef Code [start=$80d] .segmentdef Data [startAfter="Code"] .segment Basic :BasicUpstart(main) // Global Constants & labels // The size of a point .const SIZEOF_POINT = 2 // The number of points .const NUM_POINTS = 4 .label print_screen = $400 .label print_line_cursor = 6 .label print_char_cursor = 2 .segment Code // main // Initialize some points and print them main: { // init_points() // [1] call init_points // [5] phi from main to init_points [phi:main->init_points] jsr init_points // [2] phi from main to main::@1 [phi:main->main::@1] // main::@1 // print_points() // [3] call print_points // [18] phi from main::@1 to print_points [phi:main::@1->print_points] jsr print_points // main::@return // } // [4] return rts } // init_points // Initialize points init_points: { .label getPoint1_return = 6 .label pos = 8 // [6] phi from init_points to init_points::@1 [phi:init_points->init_points::@1] // [6] phi init_points::pos#10 = $a [phi:init_points->init_points::@1#0] -- vbuz1=vbuc1 lda #$a sta.z pos // [6] phi init_points::i#10 = 0 [phi:init_points->init_points::@1#1] -- vbuxx=vbuc1 ldx #0 // [6] phi from init_points::@3 to init_points::@1 [phi:init_points::@3->init_points::@1] // [6] phi init_points::pos#10 = init_points::pos#2 [phi:init_points::@3->init_points::@1#0] -- register_copy // [6] phi init_points::i#10 = init_points::i#1 [phi:init_points::@3->init_points::@1#1] -- register_copy // init_points::@1 __b1: // init_points::getPoint1 // idx*SIZEOF_POINT // [7] init_points::getPoint1_$0 = init_points::i#10 << 1 -- vbuyy=vbuxx_rol_1 txa asl tay // points+idx*SIZEOF_POINT // [8] init_points::getPoint1_return#0 = points + init_points::getPoint1_$0 -- pbuz1=pbuc1_plus_vbuyy tya clc adc #points adc #0 sta.z getPoint1_return+1 // [9] phi from init_points::getPoint1 to init_points::pointXpos1 [phi:init_points::getPoint1->init_points::pointXpos1] // init_points::pointXpos1 // init_points::@2 // *pointXpos(point) = pos // [10] points[init_points::getPoint1_$0] = init_points::pos#10 -- pbuc1_derefidx_vbuyy=vbuz1 lda.z pos sta points,y // pos +=10 // [11] init_points::pos#1 = init_points::pos#10 + $a -- vbuaa=vbuz1_plus_vbuc1 lda #$a clc adc.z pos // [12] phi from init_points::@2 to init_points::pointYpos1 [phi:init_points::@2->init_points::pointYpos1] // init_points::pointYpos1 // init_points::@3 // *pointYpos(point) = pos // [13] init_points::getPoint1_return#0[1] = init_points::pos#1 -- pbuz1_derefidx_vbuc1=vbuaa ldy #1 sta (getPoint1_return),y // pos +=10 // [14] init_points::pos#2 = init_points::pos#1 + $a -- vbuz1=vbuaa_plus_vbuc1 clc adc #$a sta.z pos // for(byte i: 0..NUM_POINTS-1) // [15] init_points::i#1 = ++ init_points::i#10 -- vbuxx=_inc_vbuxx inx // [16] if(init_points::i#1!=NUM_POINTS-1+1) goto init_points::@1 -- vbuxx_neq_vbuc1_then_la1 cpx #NUM_POINTS-1+1 bne __b1 // init_points::@return // } // [17] return rts } // print_points // Print points print_points: { .label point = 9 .label i = 8 // print_cls() // [19] call print_cls // [37] phi from print_points to print_cls [phi:print_points->print_cls] jsr print_cls // [20] phi from print_points to print_points::@1 [phi:print_points->print_points::@1] // [20] phi print_line_cursor#26 = print_screen#0 [phi:print_points->print_points::@1#0] -- pbuz1=pbuc1 lda #print_screen sta.z print_line_cursor+1 // [20] phi print_char_cursor#48 = print_screen#0 [phi:print_points->print_points::@1#1] -- pbuz1=pbuc1 lda #print_screen sta.z print_char_cursor+1 // [20] phi print_points::i#10 = 0 [phi:print_points->print_points::@1#2] -- vbuz1=vbuc1 lda #0 sta.z i // print_points::@1 __b1: // print_points::getPoint1 // idx*SIZEOF_POINT // [21] print_points::getPoint1_$0 = print_points::i#10 << 1 -- vbuyy=vbuz1_rol_1 lda.z i asl tay // points+idx*SIZEOF_POINT // [22] print_points::point#0 = points + print_points::getPoint1_$0 -- pbuz1=pbuc1_plus_vbuyy tya clc adc #points adc #0 sta.z point+1 // [23] phi from print_points::getPoint1 to print_points::pointXpos1 [phi:print_points::getPoint1->print_points::pointXpos1] // print_points::pointXpos1 // print_points::@2 // print_uchar(*pointXpos(point)) // [24] print_uchar::b#0 = points[print_points::getPoint1_$0] -- vbuxx=pbuc1_derefidx_vbuyy ldx points,y // [25] call print_uchar // [40] phi from print_points::@2 to print_uchar [phi:print_points::@2->print_uchar] // [40] phi print_char_cursor#45 = print_char_cursor#48 [phi:print_points::@2->print_uchar#0] -- register_copy // [40] phi print_uchar::b#2 = print_uchar::b#0 [phi:print_points::@2->print_uchar#1] -- register_copy jsr print_uchar // [26] phi from print_points::@2 to print_points::@4 [phi:print_points::@2->print_points::@4] // print_points::@4 // print_str(" ") // [27] call print_str // [48] phi from print_points::@4 to print_str [phi:print_points::@4->print_str] jsr print_str // [28] phi from print_points::@4 to print_points::pointYpos1 [phi:print_points::@4->print_points::pointYpos1] // print_points::pointYpos1 // print_points::@3 // print_uchar(*pointYpos(point)) // [29] print_uchar::b#1 = print_points::point#0[1] -- vbuxx=pbuz1_derefidx_vbuc1 ldy #1 lda (point),y tax // [30] call print_uchar // [40] phi from print_points::@3 to print_uchar [phi:print_points::@3->print_uchar] // [40] phi print_char_cursor#45 = print_char_cursor#30 [phi:print_points::@3->print_uchar#0] -- register_copy // [40] phi print_uchar::b#2 = print_uchar::b#1 [phi:print_points::@3->print_uchar#1] -- register_copy jsr print_uchar // [31] phi from print_points::@3 to print_points::@5 [phi:print_points::@3->print_points::@5] // print_points::@5 // print_ln() // [32] call print_ln // [55] phi from print_points::@5 to print_ln [phi:print_points::@5->print_ln] jsr print_ln // print_points::@6 // for(byte i: 0..NUM_POINTS-1) // [33] print_points::i#1 = ++ print_points::i#10 -- vbuz1=_inc_vbuz1 inc.z i // [34] if(print_points::i#1!=NUM_POINTS-1+1) goto print_points::@7 -- vbuz1_neq_vbuc1_then_la1 lda #NUM_POINTS-1+1 cmp.z i bne __b7 // print_points::@return // } // [35] return rts // print_points::@7 __b7: // [36] print_char_cursor#66 = print_line_cursor#0 -- pbuz1=pbuz2 lda.z print_line_cursor sta.z print_char_cursor lda.z print_line_cursor+1 sta.z print_char_cursor+1 // [20] phi from print_points::@7 to print_points::@1 [phi:print_points::@7->print_points::@1] // [20] phi print_line_cursor#26 = print_line_cursor#0 [phi:print_points::@7->print_points::@1#0] -- register_copy // [20] phi print_char_cursor#48 = print_char_cursor#66 [phi:print_points::@7->print_points::@1#1] -- register_copy // [20] phi print_points::i#10 = print_points::i#1 [phi:print_points::@7->print_points::@1#2] -- register_copy jmp __b1 .segment Data str: .text " " .byte 0 } .segment Code // print_cls // Clear the screen. Also resets current line/char cursor. print_cls: { // memset(print_screen, ' ', 1000) // [38] call memset // [60] phi from print_cls to memset [phi:print_cls->memset] jsr memset // print_cls::@return // } // [39] return rts } // print_uchar // Print a char as HEX // void print_uchar(__register(X) char b) print_uchar: { // b>>4 // [41] print_uchar::$0 = print_uchar::b#2 >> 4 -- vbuaa=vbuxx_ror_4 txa lsr lsr lsr lsr // print_char(print_hextab[b>>4]) // [42] print_char::ch#1 = print_hextab[print_uchar::$0] -- vbuaa=pbuc1_derefidx_vbuaa tay lda print_hextab,y // [43] call print_char // Table of hexadecimal digits // [66] phi from print_uchar to print_char [phi:print_uchar->print_char] // [66] phi print_char_cursor#29 = print_char_cursor#45 [phi:print_uchar->print_char#0] -- register_copy // [66] phi print_char::ch#3 = print_char::ch#1 [phi:print_uchar->print_char#1] -- register_copy jsr print_char // print_uchar::@1 // b&0xf // [44] print_uchar::$2 = print_uchar::b#2 & $f -- vbuxx=vbuxx_band_vbuc1 lda #$f axs #0 // print_char(print_hextab[b&0xf]) // [45] print_char::ch#2 = print_hextab[print_uchar::$2] -- vbuaa=pbuc1_derefidx_vbuxx lda print_hextab,x // [46] call print_char // [66] phi from print_uchar::@1 to print_char [phi:print_uchar::@1->print_char] // [66] phi print_char_cursor#29 = print_char_cursor#30 [phi:print_uchar::@1->print_char#0] -- register_copy // [66] phi print_char::ch#3 = print_char::ch#2 [phi:print_uchar::@1->print_char#1] -- register_copy jsr print_char // print_uchar::@return // } // [47] return rts } // print_str // Print a zero-terminated string // void print_str(__zp(4) char *str) print_str: { .label str = 4 // [49] phi from print_str to print_str::@1 [phi:print_str->print_str::@1] // [49] phi print_str::str#2 = print_points::str [phi:print_str->print_str::@1#0] -- pbuz1=pbuc1 lda #print_points.str sta.z str+1 // print_str::@1 __b1: // while(*str) // [50] if(0!=*print_str::str#2) goto print_str::@2 -- 0_neq__deref_pbuz1_then_la1 ldy #0 lda (str),y cmp #0 bne __b2 // print_str::@return // } // [51] return rts // print_str::@2 __b2: // print_char(*(str++)) // [52] print_char::ch#0 = *print_str::str#2 -- vbuaa=_deref_pbuz1 ldy #0 lda (str),y // [53] call print_char // [66] phi from print_str::@2 to print_char [phi:print_str::@2->print_char] // [66] phi print_char_cursor#29 = print_char_cursor#30 [phi:print_str::@2->print_char#0] -- register_copy // [66] phi print_char::ch#3 = print_char::ch#0 [phi:print_str::@2->print_char#1] -- register_copy jsr print_char // print_str::@3 // print_char(*(str++)); // [54] print_str::str#0 = ++ print_str::str#2 -- pbuz1=_inc_pbuz1 inc.z str bne !+ inc.z str+1 !: // [49] phi from print_str::@3 to print_str::@1 [phi:print_str::@3->print_str::@1] // [49] phi print_str::str#2 = print_str::str#0 [phi:print_str::@3->print_str::@1#0] -- register_copy jmp __b1 } // print_ln // Print a newline print_ln: { // [56] phi from print_ln print_ln::@1 to print_ln::@1 [phi:print_ln/print_ln::@1->print_ln::@1] // [56] phi print_line_cursor#12 = print_line_cursor#26 [phi:print_ln/print_ln::@1->print_ln::@1#0] -- register_copy // print_ln::@1 __b1: // print_line_cursor + 0x28 // [57] print_line_cursor#0 = print_line_cursor#12 + $28 -- pbuz1=pbuz1_plus_vbuc1 lda #$28 clc adc.z print_line_cursor sta.z print_line_cursor bcc !+ inc.z print_line_cursor+1 !: // while (print_line_cursormemset::@1] // [61] phi memset::dst#2 = (char *)memset::str#0 [phi:memset->memset::@1#0] -- pbuz1=pbuc1 lda #str sta.z dst+1 // memset::@1 __b1: // for(char* dst = str; dst!=end; dst++) // [62] if(memset::dst#2!=memset::end#0) goto memset::@2 -- pbuz1_neq_pbuc1_then_la1 lda.z dst+1 cmp #>end bne __b2 lda.z dst cmp #memset::@1] // [61] phi memset::dst#2 = memset::dst#1 [phi:memset::@2->memset::@1#0] -- register_copy jmp __b1 } // print_char // Print a single char // void print_char(__register(A) char ch) print_char: { // *(print_char_cursor++) = ch // [67] *print_char_cursor#29 = print_char::ch#3 -- _deref_pbuz1=vbuaa ldy #0 sta (print_char_cursor),y // *(print_char_cursor++) = ch; // [68] print_char_cursor#30 = ++ print_char_cursor#29 -- pbuz1=_inc_pbuz1 inc.z print_char_cursor bne !+ inc.z print_char_cursor+1 !: // print_char::@return // } // [69] return rts } // File Data .segment Data print_hextab: .text "0123456789abcdef" // All points points: .fill NUM_POINTS*SIZEOF_POINT, 0