kickc/src/test/ref/examples/c64/fastmultiply/fastmultiply8.log

2540 lines
130 KiB
Plaintext

Resolved forward reference mulf_sqr1 to mulf_sqr1
Resolved forward reference mulf_sqr2 to mulf_sqr2
Setting inferred volatile on symbol affected by address-of: fmul8::aa in asm { ldaaa staA1+1 eor#$ff staA2+1 ldxbb sec A1: ldamulf_sqr1,x A2: sbcmulf_sqr2,x stacc }
Setting inferred volatile on symbol affected by address-of: fmul8::bb in asm { ldaaa staA1+1 eor#$ff staA2+1 ldxbb sec A1: ldamulf_sqr1,x A2: sbcmulf_sqr2,x stacc }
Setting inferred volatile on symbol affected by address-of: fmul8::cc in asm { ldaaa staA1+1 eor#$ff staA2+1 ldxbb sec A1: ldamulf_sqr1,x A2: sbcmulf_sqr2,x stacc }
Inlined call call __init
Eliminating unused variable with no statement memset::$2
Eliminating unused variable with no statement main::$1
Eliminating unused variable with no statement main::$5
CONTROL FLOW GRAPH SSA
void print_schar_at(signed char b , char *at)
print_schar_at: scope:[print_schar_at] from main::@1 main::@3 main::@9
print_schar_at::at#6 = phi( main::@1/print_schar_at::at#0, main::@3/print_schar_at::at#1, main::@9/print_schar_at::at#2 )
print_schar_at::b#4 = phi( main::@1/print_schar_at::b#1, main::@3/print_schar_at::b#2, main::@9/print_schar_at::b#3 )
print_schar_at::$0 = print_schar_at::b#4 < 0
if(print_schar_at::$0) goto print_schar_at::@1
to:print_schar_at::@3
print_schar_at::@1: scope:[print_schar_at] from print_schar_at
print_schar_at::b#7 = phi( print_schar_at/print_schar_at::b#4 )
print_schar_at::at#3 = phi( print_schar_at/print_schar_at::at#6 )
print_char_at::ch#0 = '-'
print_char_at::at#0 = print_schar_at::at#3
call print_char_at
to:print_schar_at::@4
print_schar_at::@4: scope:[print_schar_at] from print_schar_at::@1
print_schar_at::at#7 = phi( print_schar_at::@1/print_schar_at::at#3 )
print_schar_at::b#5 = phi( print_schar_at::@1/print_schar_at::b#7 )
print_schar_at::$5 = - print_schar_at::b#5
print_schar_at::b#0 = print_schar_at::$5
to:print_schar_at::@2
print_schar_at::@3: scope:[print_schar_at] from print_schar_at
print_schar_at::b#9 = phi( print_schar_at/print_schar_at::b#4 )
print_schar_at::at#4 = phi( print_schar_at/print_schar_at::at#6 )
print_char_at::ch#1 = ' '
print_char_at::at#1 = print_schar_at::at#4
call print_char_at
to:print_schar_at::@5
print_schar_at::@5: scope:[print_schar_at] from print_schar_at::@3
print_schar_at::b#8 = phi( print_schar_at::@3/print_schar_at::b#9 )
print_schar_at::at#8 = phi( print_schar_at::@3/print_schar_at::at#4 )
to:print_schar_at::@2
print_schar_at::@2: scope:[print_schar_at] from print_schar_at::@4 print_schar_at::@5
print_schar_at::b#6 = phi( print_schar_at::@4/print_schar_at::b#0, print_schar_at::@5/print_schar_at::b#8 )
print_schar_at::at#5 = phi( print_schar_at::@4/print_schar_at::at#7, print_schar_at::@5/print_schar_at::at#8 )
print_schar_at::$1 = print_schar_at::at#5 + 1
print_uchar_at::b#0 = (char)print_schar_at::b#6
print_uchar_at::at#0 = print_schar_at::$1
call print_uchar_at
to:print_schar_at::@6
print_schar_at::@6: scope:[print_schar_at] from print_schar_at::@2
to:print_schar_at::@return
print_schar_at::@return: scope:[print_schar_at] from print_schar_at::@6
return
to:@return
void print_uchar_at(char b , char *at)
print_uchar_at: scope:[print_uchar_at] from print_schar_at::@2
print_uchar_at::at#1 = phi( print_schar_at::@2/print_uchar_at::at#0 )
print_uchar_at::b#1 = phi( print_schar_at::@2/print_uchar_at::b#0 )
print_uchar_at::$0 = print_uchar_at::b#1 >> 4
print_char_at::ch#2 = print_hextab[print_uchar_at::$0]
print_char_at::at#2 = print_uchar_at::at#1
call print_char_at
to:print_uchar_at::@1
print_uchar_at::@1: scope:[print_uchar_at] from print_uchar_at
print_uchar_at::at#2 = phi( print_uchar_at/print_uchar_at::at#1 )
print_uchar_at::b#2 = phi( print_uchar_at/print_uchar_at::b#1 )
print_uchar_at::$2 = print_uchar_at::b#2 & $f
print_uchar_at::$3 = print_uchar_at::at#2 + 1
print_char_at::ch#3 = print_hextab[print_uchar_at::$2]
print_char_at::at#3 = print_uchar_at::$3
call print_char_at
to:print_uchar_at::@2
print_uchar_at::@2: scope:[print_uchar_at] from print_uchar_at::@1
to:print_uchar_at::@return
print_uchar_at::@return: scope:[print_uchar_at] from print_uchar_at::@2
return
to:@return
void print_char_at(char ch , char *at)
print_char_at: scope:[print_char_at] from print_schar_at::@1 print_schar_at::@3 print_uchar_at print_uchar_at::@1
print_char_at::at#4 = phi( print_schar_at::@1/print_char_at::at#0, print_schar_at::@3/print_char_at::at#1, print_uchar_at/print_char_at::at#2, print_uchar_at::@1/print_char_at::at#3 )
print_char_at::ch#4 = phi( print_schar_at::@1/print_char_at::ch#0, print_schar_at::@3/print_char_at::ch#1, print_uchar_at/print_char_at::ch#2, print_uchar_at::@1/print_char_at::ch#3 )
*print_char_at::at#4 = print_char_at::ch#4
to:print_char_at::@return
print_char_at::@return: scope:[print_char_at] from print_char_at
return
to:@return
void print_cls()
print_cls: scope:[print_cls] from init_screen
print_screen#2 = phi( init_screen/print_screen#4 )
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
to:print_cls::@return
print_cls::@return: scope:[print_cls] from print_cls::@1
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#6 = phi( __start::@1/print_screen#7 )
call init_screen
to:main::@6
main::@6: scope:[main] from main
main::at_line#0 = (char *)$400
main::at#0 = main::at_line#0 + 4
main::k#0 = 0
to:main::@1
main::@1: scope:[main] from main::@6 main::@7
main::at_line#7 = phi( main::@6/main::at_line#0, main::@7/main::at_line#5 )
main::at#4 = phi( main::@6/main::at#0, main::@7/main::at#1 )
main::k#2 = phi( main::@6/main::k#0, main::@7/main::k#1 )
print_schar_at::b#1 = vals[main::k#2]
print_schar_at::at#0 = main::at#4
call print_schar_at
to:main::@7
main::@7: scope:[main] from main::@1
main::at_line#5 = phi( main::@1/main::at_line#7 )
main::k#3 = phi( main::@1/main::k#2 )
main::at#5 = phi( main::@1/main::at#4 )
main::at#1 = main::at#5 + 4
main::k#1 = main::k#3 + rangenext(0,8)
main::$3 = main::k#1 != rangelast(0,8)
if(main::$3) goto main::@1
to:main::@2
main::@2: scope:[main] from main::@7
main::at_line#3 = phi( main::@7/main::at_line#5 )
main::i#0 = 0
to:main::@3
main::@3: scope:[main] from main::@2 main::@5
main::i#2 = phi( main::@2/main::i#0, main::@5/main::i#1 )
main::at_line#2 = phi( main::@2/main::at_line#3, main::@5/main::at_line#4 )
main::at_line#1 = main::at_line#2 + $28
main::at#2 = main::at_line#1
print_schar_at::b#2 = vals[main::i#2]
print_schar_at::at#1 = main::at#2
call print_schar_at
to:main::@8
main::@8: scope:[main] from main::@3
main::at_line#10 = phi( main::@3/main::at_line#1 )
main::i#6 = phi( main::@3/main::i#2 )
main::at#9 = phi( main::@3/main::at#2 )
main::j#0 = 0
to:main::@4
main::@4: scope:[main] from main::@10 main::@8
main::at_line#9 = phi( main::@10/main::at_line#6, main::@8/main::at_line#10 )
main::j#2 = phi( main::@10/main::j#1, main::@8/main::j#0 )
main::i#3 = phi( main::@10/main::i#5, main::@8/main::i#6 )
main::at#6 = phi( main::@10/main::at#8, main::@8/main::at#9 )
main::at#3 = main::at#6 + 4
fmul8::aa = vals[main::i#3]
fmul8::bb = vals[main::j#2]
call fmul8
fmul8::return#0 = fmul8::return#2
to:main::@9
main::@9: scope:[main] from main::@4
main::at_line#8 = phi( main::@4/main::at_line#9 )
main::i#7 = phi( main::@4/main::i#3 )
main::j#4 = phi( main::@4/main::j#2 )
main::at#7 = phi( main::@4/main::at#3 )
fmul8::return#3 = phi( main::@4/fmul8::return#0 )
main::r#0 = fmul8::return#3
print_schar_at::b#3 = main::r#0
print_schar_at::at#2 = main::at#7
call print_schar_at
to:main::@10
main::@10: scope:[main] from main::@9
main::at_line#6 = phi( main::@9/main::at_line#8 )
main::i#5 = phi( main::@9/main::i#7 )
main::at#8 = phi( main::@9/main::at#7 )
main::j#3 = phi( main::@9/main::j#4 )
main::j#1 = main::j#3 + rangenext(0,8)
main::$7 = main::j#1 != rangelast(0,8)
if(main::$7) goto main::@4
to:main::@5
main::@5: scope:[main] from main::@10
main::at_line#4 = phi( main::@10/main::at_line#6 )
main::i#4 = phi( main::@10/main::i#5 )
main::i#1 = main::i#4 + rangenext(0,8)
main::$8 = main::i#1 != rangelast(0,8)
if(main::$8) goto main::@3
to:main::@return
main::@return: scope:[main] from main::@5
return
to:@return
void init_screen()
init_screen: scope:[init_screen] from main
print_screen#4 = phi( main/print_screen#6 )
call print_cls
to:init_screen::@4
init_screen::@4: scope:[init_screen] from init_screen
init_screen::COLS#0 = (char *)$d800
init_screen::l#0 = 0
to:init_screen::@1
init_screen::@1: scope:[init_screen] from init_screen::@1 init_screen::@4
init_screen::l#2 = phi( init_screen::@1/init_screen::l#1, init_screen::@4/init_screen::l#0 )
init_screen::COLS#2 = phi( init_screen::@1/init_screen::COLS#2, init_screen::@4/init_screen::COLS#0 )
init_screen::COLS#2[init_screen::l#2] = init_screen::WHITE
init_screen::l#1 = init_screen::l#2 + rangenext(0,$27)
init_screen::$1 = init_screen::l#1 != rangelast(0,$27)
if(init_screen::$1) goto init_screen::@1
to:init_screen::@2
init_screen::@2: scope:[init_screen] from init_screen::@1
init_screen::COLS#4 = phi( init_screen::@1/init_screen::COLS#2 )
init_screen::m#0 = 0
to:init_screen::@3
init_screen::@3: scope:[init_screen] from init_screen::@2 init_screen::@3
init_screen::m#2 = phi( init_screen::@2/init_screen::m#0, init_screen::@3/init_screen::m#1 )
init_screen::COLS#3 = phi( init_screen::@2/init_screen::COLS#4, init_screen::@3/init_screen::COLS#1 )
init_screen::COLS#3[0] = init_screen::WHITE
init_screen::COLS#3[1] = init_screen::WHITE
init_screen::COLS#3[2] = init_screen::WHITE
init_screen::COLS#3[3] = init_screen::WHITE
init_screen::COLS#1 = init_screen::COLS#3 + $28
init_screen::m#1 = init_screen::m#2 + rangenext(0,$18)
init_screen::$2 = init_screen::m#1 != rangelast(0,$18)
if(init_screen::$2) goto init_screen::@3
to:init_screen::@return
init_screen::@return: scope:[init_screen] from init_screen::@3
return
to:@return
signed char fmul8(volatile signed char aa , volatile signed char bb)
fmul8: scope:[fmul8] from main::@4
fmul8::cc = 0
asm { ldaaa staA1+1 eor#$ff staA2+1 ldxbb sec A1: ldamulf_sqr1,x A2: sbcmulf_sqr2,x stacc }
fmul8::return#1 = fmul8::cc
to:fmul8::@return
fmul8::@return: scope:[fmul8] from fmul8
fmul8::return#4 = phi( fmul8/fmul8::return#1 )
fmul8::return#2 = fmul8::return#4
return
to:@return
void __start()
__start: scope:[__start] from
to:__start::__init1
__start::__init1: scope:[__start] from __start
print_screen#0 = (char *)$400
to:__start::@1
__start::@1: scope:[__start] from __start::__init1
print_screen#7 = phi( __start::__init1/print_screen#0 )
call main
to:__start::@2
__start::@2: scope:[__start] from __start::@1
print_screen#5 = phi( __start::@1/print_screen#7 )
to:__start::@return
__start::@return: scope:[__start] from __start::@2
print_screen#3 = phi( __start::@2/print_screen#5 )
print_screen#1 = print_screen#3
return
to:@return
SYMBOL TABLE SSA
__constant char RADIX::BINARY = 2
__constant char RADIX::DECIMAL = $a
__constant char RADIX::HEXADECIMAL = $10
__constant char RADIX::OCTAL = 8
void __start()
signed char fmul8(volatile signed char aa , volatile signed char bb)
__loadstore volatile signed char fmul8::aa
__loadstore volatile signed char fmul8::bb
__loadstore volatile signed char fmul8::cc
signed char fmul8::return
signed char fmul8::return#0
signed char fmul8::return#1
signed char fmul8::return#2
signed char fmul8::return#3
signed char fmul8::return#4
void init_screen()
bool init_screen::$1
bool init_screen::$2
char *init_screen::COLS
char *init_screen::COLS#0
char *init_screen::COLS#1
char *init_screen::COLS#2
char *init_screen::COLS#3
char *init_screen::COLS#4
__constant char init_screen::WHITE = 1
char init_screen::l
char init_screen::l#0
char init_screen::l#1
char init_screen::l#2
char init_screen::m
char init_screen::m#0
char init_screen::m#1
char init_screen::m#2
void main()
bool main::$3
bool main::$7
bool main::$8
char *main::at
char *main::at#0
char *main::at#1
char *main::at#2
char *main::at#3
char *main::at#4
char *main::at#5
char *main::at#6
char *main::at#7
char *main::at#8
char *main::at#9
char *main::at_line
char *main::at_line#0
char *main::at_line#1
char *main::at_line#10
char *main::at_line#2
char *main::at_line#3
char *main::at_line#4
char *main::at_line#5
char *main::at_line#6
char *main::at_line#7
char *main::at_line#8
char *main::at_line#9
char main::i
char main::i#0
char main::i#1
char main::i#2
char main::i#3
char main::i#4
char main::i#5
char main::i#6
char main::i#7
char main::j
char main::j#0
char main::j#1
char main::j#2
char main::j#3
char main::j#4
char main::k
char main::k#0
char main::k#1
char main::k#2
char main::k#3
signed char main::r
signed char main::r#0
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 mulf_sqr1[$200] = kickasm {{ .for(var i=0;i<$200;i++) {
.if(i<=159) { .byte round((i*i)/256) }
.if(i>159 && i<=351 ) { .byte round(((i-256)*(i-256))/256) }
.if(i>351) { .byte round(((512-i)*(512-i))/256) }
}
}}
__constant char mulf_sqr2[$200] = kickasm {{ .for(var i=0;i<$200;i++) {
.if(i<=159) { .byte round((-i-1)*(-i-1)/256) }
.if(i>159 && i<=351 ) { .byte round(((255-i)*(255-i))/256) }
.if(i>351) { .byte round(((i-511)*(i-511))/256) }
}
}}
void print_char_at(char ch , char *at)
char *print_char_at::at
char *print_char_at::at#0
char *print_char_at::at#1
char *print_char_at::at#2
char *print_char_at::at#3
char *print_char_at::at#4
char print_char_at::ch
char print_char_at::ch#0
char print_char_at::ch#1
char print_char_at::ch#2
char print_char_at::ch#3
char print_char_at::ch#4
void print_cls()
__constant const char print_hextab[] = "0123456789abcdef"z
void print_schar_at(signed char b , char *at)
bool print_schar_at::$0
char *print_schar_at::$1
signed char print_schar_at::$5
char *print_schar_at::at
char *print_schar_at::at#0
char *print_schar_at::at#1
char *print_schar_at::at#2
char *print_schar_at::at#3
char *print_schar_at::at#4
char *print_schar_at::at#5
char *print_schar_at::at#6
char *print_schar_at::at#7
char *print_schar_at::at#8
signed char print_schar_at::b
signed char print_schar_at::b#0
signed char print_schar_at::b#1
signed char print_schar_at::b#2
signed char print_schar_at::b#3
signed char print_schar_at::b#4
signed char print_schar_at::b#5
signed char print_schar_at::b#6
signed char print_schar_at::b#7
signed char print_schar_at::b#8
signed char print_schar_at::b#9
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
void print_uchar_at(char b , char *at)
char print_uchar_at::$0
number print_uchar_at::$2
char *print_uchar_at::$3
char *print_uchar_at::at
char *print_uchar_at::at#0
char *print_uchar_at::at#1
char *print_uchar_at::at#2
char print_uchar_at::b
char print_uchar_at::b#0
char print_uchar_at::b#1
char print_uchar_at::b#2
__constant signed char vals[] = { -$5f, -$40, -$20, -$10, 0, $10, $20, $40, $5f }
Adding number conversion cast (snumber) 0 in print_schar_at::$0 = print_schar_at::b#4 < 0
Adding number conversion cast (unumber) 1 in print_schar_at::$1 = print_schar_at::at#5 + 1
Adding number conversion cast (unumber) 4 in print_uchar_at::$0 = print_uchar_at::b#1 >> 4
Adding number conversion cast (unumber) $f in print_uchar_at::$2 = print_uchar_at::b#2 & $f
Adding number conversion cast (unumber) print_uchar_at::$2 in print_uchar_at::$2 = print_uchar_at::b#2 & (unumber)$f
Adding number conversion cast (unumber) 1 in print_uchar_at::$3 = print_uchar_at::at#2 + 1
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) 4 in main::at#0 = main::at_line#0 + 4
Adding number conversion cast (unumber) 4 in main::at#1 = main::at#5 + 4
Adding number conversion cast (unumber) $28 in main::at_line#1 = main::at_line#2 + $28
Adding number conversion cast (unumber) 4 in main::at#3 = main::at#6 + 4
Adding number conversion cast (unumber) 0 in init_screen::COLS#3[0] = init_screen::WHITE
Adding number conversion cast (unumber) 1 in init_screen::COLS#3[1] = init_screen::WHITE
Adding number conversion cast (unumber) 2 in init_screen::COLS#3[2] = init_screen::WHITE
Adding number conversion cast (unumber) 3 in init_screen::COLS#3[3] = init_screen::WHITE
Adding number conversion cast (unumber) $28 in init_screen::COLS#1 = init_screen::COLS#3 + $28
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 1
Simplifying constant integer cast 4
Simplifying constant integer cast $f
Simplifying constant integer cast 1
Simplifying constant integer cast $3e8
Simplifying constant integer cast 0
Simplifying constant pointer cast (char *) 1024
Simplifying constant integer cast 4
Simplifying constant integer cast 4
Simplifying constant integer cast $28
Simplifying constant integer cast 4
Simplifying constant pointer cast (char *) 55296
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast 2
Simplifying constant integer cast 3
Simplifying constant integer cast $28
Simplifying constant pointer cast (char *) 1024
Successful SSA optimization PassNCastSimplification
Finalized signed number type (signed char) 0
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 4
Finalized unsigned number type (char) $f
Finalized unsigned number type (char) 1
Finalized unsigned number type (unsigned int) $3e8
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 4
Finalized unsigned number type (char) 4
Finalized unsigned number type (char) $28
Finalized unsigned number type (char) 4
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 2
Finalized unsigned number type (char) 3
Finalized unsigned number type (char) $28
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inferred type updated to char in print_uchar_at::$2 = print_uchar_at::b#2 & $f
Inversing boolean not [45] memset::$1 = memset::num#1 <= 0 from [44] memset::$0 = memset::num#1 > 0
Successful SSA optimization Pass2UnaryNotSimplification
Alias candidate removed (volatile)fmul8::return#1 = fmul8::cc fmul8::return#4 fmul8::return#2
Alias print_schar_at::at#3 = print_schar_at::at#6 print_schar_at::at#7 print_schar_at::at#4 print_schar_at::at#8
Alias print_schar_at::b#4 = print_schar_at::b#7 print_schar_at::b#5 print_schar_at::b#9 print_schar_at::b#8
Alias print_schar_at::b#0 = print_schar_at::$5
Alias print_uchar_at::at#0 = print_schar_at::$1
Alias print_uchar_at::b#1 = print_uchar_at::b#2
Alias print_uchar_at::at#1 = print_uchar_at::at#2
Alias print_char_at::at#3 = print_uchar_at::$3
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 main::at#4 = main::at#5
Alias main::k#2 = main::k#3
Alias main::at_line#3 = main::at_line#5 main::at_line#7
Alias main::at#2 = main::at_line#1 main::at#9 main::at_line#10
Alias main::i#2 = main::i#6
Alias fmul8::return#0 = fmul8::return#3
Alias main::at#3 = main::at#7 main::at#8
Alias main::j#2 = main::j#4 main::j#3
Alias main::i#3 = main::i#7 main::i#5 main::i#4
Alias main::at_line#4 = main::at_line#8 main::at_line#9 main::at_line#6
Alias init_screen::COLS#2 = init_screen::COLS#4
Alias print_screen#0 = print_screen#7 print_screen#5 print_screen#3 print_screen#1
Successful SSA optimization Pass2AliasElimination
Alias candidate removed (volatile)fmul8::return#1 = fmul8::cc fmul8::return#4 fmul8::return#2
Alias print_schar_at::at#3 = print_schar_at::at#5
Successful SSA optimization Pass2AliasElimination
Alias candidate removed (volatile)fmul8::return#1 = fmul8::cc fmul8::return#4 fmul8::return#2
Identical Phi Values print_uchar_at::b#1 print_uchar_at::b#0
Identical Phi Values print_uchar_at::at#1 print_uchar_at::at#0
Identical Phi Values print_screen#2 print_screen#4
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_screen#6 print_screen#0
Identical Phi Values main::at_line#3 main::at_line#0
Identical Phi Values main::i#3 main::i#2
Identical Phi Values main::at_line#4 main::at#2
Identical Phi Values print_screen#4 print_screen#6
Identical Phi Values init_screen::COLS#2 init_screen::COLS#0
Identical Phi Values fmul8::return#4 fmul8::return#1
Successful SSA optimization Pass2IdenticalPhiElimination
Identical Phi Values memset::return#1 memset::str#0
Successful SSA optimization Pass2IdenticalPhiElimination
Simple Condition print_schar_at::$0 [2] if(print_schar_at::b#4<0) goto print_schar_at::@1
Simple Condition memset::$1 [37] if(memset::num#0<=0) goto memset::@1
Simple Condition memset::$3 [44] if(memset::dst#2!=memset::end#0) goto memset::@4
Simple Condition main::$3 [60] if(main::k#1!=rangelast(0,8)) goto main::@1
Simple Condition main::$7 [80] if(main::j#1!=rangelast(0,8)) goto main::@4
Simple Condition main::$8 [83] if(main::i#1!=rangelast(0,8)) goto main::@3
Simple Condition init_screen::$1 [93] if(init_screen::l#1!=rangelast(0,$27)) goto init_screen::@1
Simple Condition init_screen::$2 [103] if(init_screen::m#1!=rangelast(0,$18)) goto init_screen::@3
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant print_char_at::ch#0 = '-'
Constant print_char_at::ch#1 = ' '
Constant memset::c#0 = ' '
Constant memset::num#0 = $3e8
Constant main::at_line#0 = (char *) 1024
Constant main::k#0 = 0
Constant main::i#0 = 0
Constant main::j#0 = 0
Constant init_screen::COLS#0 = (char *) 55296
Constant init_screen::l#0 = 0
Constant init_screen::m#0 = 0
Constant print_screen#0 = (char *) 1024
Successful SSA optimization Pass2ConstantIdentification
Constant memset::str#0 = (void *)print_screen#0
Successful SSA optimization Pass2ConstantIdentification
Constant memset::return#0 = memset::str#0
Constant memset::$4 = (char *)memset::str#0
Constant memset::dst#0 = (char *)memset::str#0
Successful SSA optimization Pass2ConstantIdentification
if() condition always false - eliminating [37] if(memset::num#0<=0) goto memset::@1
Successful SSA optimization Pass2ConstantIfs
Resolved ranged next value [58] main::k#1 = ++ main::k#2 to ++
Resolved ranged comparison value [60] if(main::k#1!=rangelast(0,8)) goto main::@1 to 9
Resolved ranged next value [78] main::j#1 = ++ main::j#2 to ++
Resolved ranged comparison value [80] if(main::j#1!=rangelast(0,8)) goto main::@4 to 9
Resolved ranged next value [81] main::i#1 = ++ main::i#2 to ++
Resolved ranged comparison value [83] if(main::i#1!=rangelast(0,8)) goto main::@3 to 9
Resolved ranged next value [91] init_screen::l#1 = ++ init_screen::l#2 to ++
Resolved ranged comparison value [93] if(init_screen::l#1!=rangelast(0,$27)) goto init_screen::@1 to $28
Resolved ranged next value [101] init_screen::m#1 = ++ init_screen::m#2 to ++
Resolved ranged comparison value [103] if(init_screen::m#1!=rangelast(0,$18)) goto init_screen::@3 to $19
Simplifying expression containing zero init_screen::COLS#3 in [96] init_screen::COLS#3[0] = init_screen::WHITE
Successful SSA optimization PassNSimplifyExpressionWithZero
Eliminating unused constant memset::return#0
Successful SSA optimization PassNEliminateUnusedVars
Removing unused procedure __start
Removing unused procedure block __start
Removing unused procedure block __start::__init1
Removing unused procedure block __start::@1
Removing unused procedure block __start::@2
Removing unused procedure block __start::@return
Successful SSA optimization PassNEliminateEmptyStart
Adding number conversion cast (unumber) 9 in [40] if(main::k#1!=9) goto main::@1
Adding number conversion cast (unumber) 9 in [57] if(main::j#1!=9) goto main::@4
Adding number conversion cast (unumber) 9 in [59] if(main::i#1!=9) goto main::@3
Adding number conversion cast (unumber) $28 in [65] if(init_screen::l#1!=$28) goto init_screen::@1
Adding number conversion cast (unumber) $19 in [73] if(init_screen::m#1!=$19) goto init_screen::@3
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant integer cast 9
Simplifying constant integer cast 9
Simplifying constant integer cast 9
Simplifying constant integer cast $28
Simplifying constant integer cast $19
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (char) 9
Finalized unsigned number type (char) 9
Finalized unsigned number type (char) 9
Finalized unsigned number type (char) $28
Finalized unsigned number type (char) $19
Successful SSA optimization PassNFinalizeNumberTypeConversions
Alias candidate removed (volatile)fmul8::return#1 = fmul8::cc fmul8::return#2
Constant right-side identified [26] memset::end#0 = memset::$4 + memset::num#0
Constant right-side identified [33] main::at#0 = main::at_line#0 + 4
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant memset::end#0 = memset::$4+memset::num#0
Constant main::at#0 = main::at_line#0+4
Successful SSA optimization Pass2ConstantIdentification
Alias candidate removed (volatile)fmul8::return#1 = fmul8::cc fmul8::return#2
Inlining constant with var siblings print_char_at::ch#0
Inlining constant with var siblings print_char_at::ch#1
Inlining constant with var siblings memset::dst#0
Inlining constant with var siblings main::at_line#0
Inlining constant with var siblings main::k#0
Inlining constant with var siblings main::i#0
Inlining constant with var siblings main::j#0
Inlining constant with var siblings main::at#0
Inlining constant with var siblings init_screen::COLS#0
Inlining constant with var siblings init_screen::l#0
Inlining constant with var siblings init_screen::m#0
Constant inlined memset::$4 = (char *)memset::str#0
Constant inlined print_char_at::ch#0 = '-'
Constant inlined init_screen::m#0 = 0
Constant inlined print_char_at::ch#1 = ' '
Constant inlined init_screen::l#0 = 0
Constant inlined main::i#0 = 0
Constant inlined memset::dst#0 = (char *)memset::str#0
Constant inlined main::k#0 = 0
Constant inlined main::j#0 = 0
Constant inlined main::at_line#0 = (char *) 1024
Constant inlined main::at#0 = (char *) 1024+4
Constant inlined init_screen::COLS#0 = (char *) 55296
Successful SSA optimization Pass2ConstantInlining
Alias candidate removed (volatile)fmul8::return#1 = fmul8::cc fmul8::return#2
Alias candidate removed (volatile)fmul8::return#1 = fmul8::cc fmul8::return#2
Finalized unsigned number type (char) 2
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) $a
Finalized unsigned number type (char) $10
Finalized unsigned number type (unsigned int) $200
Finalized unsigned number type (unsigned int) $200
Successful SSA optimization PassNFinalizeNumberTypeConversions
Alias candidate removed (volatile)fmul8::return#1 = fmul8::cc fmul8::return#2
Alias candidate removed (volatile)fmul8::return#1 = fmul8::cc fmul8::return#2
Added new block during phi lifting main::@11(between main::@7 and main::@1)
Added new block during phi lifting main::@12(between main::@5 and main::@3)
Added new block during phi lifting main::@13(between main::@10 and main::@4)
Added new block during phi lifting init_screen::@5(between init_screen::@1 and init_screen::@1)
Added new block during phi lifting init_screen::@6(between init_screen::@3 and init_screen::@3)
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@6
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of init_screen
Adding NOP phi() at start of init_screen::@4
Adding NOP phi() at start of init_screen::@2
Adding NOP phi() at start of print_schar_at::@6
Adding NOP phi() at start of print_cls
Adding NOP phi() at start of print_cls::@1
Adding NOP phi() at start of print_uchar_at::@2
Adding NOP phi() at start of memset
Adding NOP phi() at start of memset::@2
Adding NOP phi() at start of memset::@1
CALL GRAPH
Calls in [main] to init_screen:1 print_schar_at:8 print_schar_at:19 fmul8:25 print_schar_at:32
Calls in [init_screen] to print_cls:45
Calls in [print_schar_at] to print_char_at:68 print_uchar_at:73 print_char_at:78
Calls in [print_cls] to memset:87
Calls in [print_uchar_at] to print_char_at:98 print_char_at:104
Created 15 initial phi equivalence classes
Coalesced [6] print_schar_at::b#10 = print_schar_at::b#1
Coalesced [7] print_schar_at::at#9 = print_schar_at::at#0
Coalesced [17] print_schar_at::b#11 = print_schar_at::b#2
Coalesced [18] print_schar_at::at#10 = print_schar_at::at#1
Not coalescing [20] main::at#12 = main::at#2
Coalesced [30] print_schar_at::b#12 = print_schar_at::b#3
Coalesced [31] print_schar_at::at#11 = print_schar_at::at#2
Coalesced [38] main::at_line#11 = main::at#2
Coalesced [39] main::i#8 = main::i#1
Coalesced [40] main::at#11 = main::at#3
Coalesced [41] main::j#5 = main::j#1
Coalesced [42] main::k#4 = main::k#1
Coalesced [43] main::at#10 = main::at#1
Coalesced [61] init_screen::COLS#5 = init_screen::COLS#1
Coalesced [62] init_screen::m#3 = init_screen::m#1
Coalesced [63] init_screen::l#3 = init_screen::l#1
Coalesced [67] print_char_at::at#6 = print_char_at::at#1
Coalesced [69] print_schar_at::b#14 = print_schar_at::b#4
Coalesced [77] print_char_at::at#5 = print_char_at::at#0
Coalesced [80] print_schar_at::b#13 = print_schar_at::b#0
Coalesced [96] print_char_at::ch#5 = print_char_at::ch#2
Coalesced [97] print_char_at::at#7 = print_char_at::at#2
Coalesced [102] print_char_at::ch#6 = print_char_at::ch#3
Coalesced [103] print_char_at::at#8 = print_char_at::at#3
Coalesced [115] memset::dst#4 = memset::dst#1
Coalesced down to 14 phi equivalence classes
Culled Empty Block label main::@6
Culled Empty Block label main::@2
Culled Empty Block label main::@12
Culled Empty Block label main::@13
Culled Empty Block label main::@11
Culled Empty Block label init_screen::@4
Culled Empty Block label init_screen::@2
Culled Empty Block label init_screen::@6
Culled Empty Block label init_screen::@5
Culled Empty Block label print_schar_at::@5
Culled Empty Block label print_schar_at::@6
Culled Empty Block label print_cls::@1
Culled Empty Block label print_uchar_at::@2
Culled Empty Block label memset::@2
Culled Empty Block label memset::@1
Renumbering block memset::@3 to memset::@1
Renumbering block memset::@4 to memset::@2
Renumbering block main::@3 to main::@2
Renumbering block main::@4 to main::@3
Renumbering block main::@5 to main::@4
Renumbering block main::@7 to main::@5
Renumbering block main::@8 to main::@6
Renumbering block main::@9 to main::@7
Renumbering block main::@10 to main::@8
Renumbering block init_screen::@3 to init_screen::@2
Adding NOP phi() at start of main
Adding NOP phi() at start of init_screen
Adding NOP phi() at start of print_cls
Adding NOP phi() at start of memset
FINAL CONTROL FLOW GRAPH
void main()
main: scope:[main] from
[0] phi()
[1] call init_screen
to:main::@1
main::@1: scope:[main] from main main::@5
[2] main::at#4 = phi( main/(char *) 1024+4, main::@5/main::at#1 )
[2] main::k#2 = phi( main/0, main::@5/main::k#1 )
[3] print_schar_at::b#1 = vals[main::k#2]
[4] print_schar_at::at#0 = main::at#4
[5] call print_schar_at
to:main::@5
main::@5: scope:[main] from main::@1
[6] main::at#1 = main::at#4 + 4
[7] main::k#1 = ++ main::k#2
[8] if(main::k#1!=9) goto main::@1
to:main::@2
main::@2: scope:[main] from main::@4 main::@5
[9] main::i#2 = phi( main::@5/0, main::@4/main::i#1 )
[9] main::at_line#2 = phi( main::@5/(char *) 1024, main::@4/main::at#2 )
[10] main::at#2 = main::at_line#2 + $28
[11] print_schar_at::b#2 = vals[main::i#2]
[12] print_schar_at::at#1 = main::at#2
[13] call print_schar_at
to:main::@6
main::@6: scope:[main] from main::@2
[14] main::at#12 = main::at#2
to:main::@3
main::@3: scope:[main] from main::@6 main::@8
[15] main::j#2 = phi( main::@8/main::j#1, main::@6/0 )
[15] main::at#6 = phi( main::@8/main::at#3, main::@6/main::at#12 )
[16] main::at#3 = main::at#6 + 4
[17] fmul8::aa = vals[main::i#2]
[18] fmul8::bb = vals[main::j#2]
[19] call fmul8
[20] fmul8::return#0 = fmul8::return#2
to:main::@7
main::@7: scope:[main] from main::@3
[21] main::r#0 = fmul8::return#0
[22] print_schar_at::b#3 = main::r#0
[23] print_schar_at::at#2 = main::at#3
[24] call print_schar_at
to:main::@8
main::@8: scope:[main] from main::@7
[25] main::j#1 = ++ main::j#2
[26] if(main::j#1!=9) goto main::@3
to:main::@4
main::@4: scope:[main] from main::@8
[27] main::i#1 = ++ main::i#2
[28] if(main::i#1!=9) goto main::@2
to:main::@return
main::@return: scope:[main] from main::@4
[29] return
to:@return
void init_screen()
init_screen: scope:[init_screen] from main
[30] phi()
[31] call print_cls
to:init_screen::@1
init_screen::@1: scope:[init_screen] from init_screen init_screen::@1
[32] init_screen::l#2 = phi( init_screen::@1/init_screen::l#1, init_screen/0 )
[33] ((char *) 55296)[init_screen::l#2] = init_screen::WHITE
[34] init_screen::l#1 = ++ init_screen::l#2
[35] if(init_screen::l#1!=$28) goto init_screen::@1
to:init_screen::@2
init_screen::@2: scope:[init_screen] from init_screen::@1 init_screen::@2
[36] init_screen::m#2 = phi( init_screen::@1/0, init_screen::@2/init_screen::m#1 )
[36] init_screen::COLS#3 = phi( init_screen::@1/(char *) 55296, init_screen::@2/init_screen::COLS#1 )
[37] *init_screen::COLS#3 = init_screen::WHITE
[38] init_screen::COLS#3[1] = init_screen::WHITE
[39] init_screen::COLS#3[2] = init_screen::WHITE
[40] init_screen::COLS#3[3] = init_screen::WHITE
[41] init_screen::COLS#1 = init_screen::COLS#3 + $28
[42] init_screen::m#1 = ++ init_screen::m#2
[43] if(init_screen::m#1!=$19) goto init_screen::@2
to:init_screen::@return
init_screen::@return: scope:[init_screen] from init_screen::@2
[44] return
to:@return
void print_schar_at(signed char b , char *at)
print_schar_at: scope:[print_schar_at] from main::@1 main::@2 main::@7
[45] print_schar_at::at#3 = phi( main::@1/print_schar_at::at#0, main::@2/print_schar_at::at#1, main::@7/print_schar_at::at#2 )
[45] print_schar_at::b#4 = phi( main::@1/print_schar_at::b#1, main::@2/print_schar_at::b#2, main::@7/print_schar_at::b#3 )
[46] if(print_schar_at::b#4<0) goto print_schar_at::@1
to:print_schar_at::@3
print_schar_at::@3: scope:[print_schar_at] from print_schar_at
[47] print_char_at::at#1 = print_schar_at::at#3
[48] call print_char_at
to:print_schar_at::@2
print_schar_at::@2: scope:[print_schar_at] from print_schar_at::@3 print_schar_at::@4
[49] print_schar_at::b#6 = phi( print_schar_at::@4/print_schar_at::b#0, print_schar_at::@3/print_schar_at::b#4 )
[50] print_uchar_at::at#0 = print_schar_at::at#3 + 1
[51] print_uchar_at::b#0 = (char)print_schar_at::b#6
[52] call print_uchar_at
to:print_schar_at::@return
print_schar_at::@return: scope:[print_schar_at] from print_schar_at::@2
[53] return
to:@return
print_schar_at::@1: scope:[print_schar_at] from print_schar_at
[54] print_char_at::at#0 = print_schar_at::at#3
[55] call print_char_at
to:print_schar_at::@4
print_schar_at::@4: scope:[print_schar_at] from print_schar_at::@1
[56] print_schar_at::b#0 = - print_schar_at::b#4
to:print_schar_at::@2
signed char fmul8(volatile signed char aa , volatile signed char bb)
fmul8: scope:[fmul8] from main::@3
[57] fmul8::cc = 0
asm { ldaaa staA1+1 eor#$ff staA2+1 ldxbb sec A1: ldamulf_sqr1,x A2: sbcmulf_sqr2,x stacc }
[59] fmul8::return#1 = fmul8::cc
to:fmul8::@return
fmul8::@return: scope:[fmul8] from fmul8
[60] fmul8::return#2 = fmul8::return#1
[61] return
to:@return
void print_cls()
print_cls: scope:[print_cls] from init_screen
[62] phi()
[63] call memset
to:print_cls::@return
print_cls::@return: scope:[print_cls] from print_cls
[64] return
to:@return
void print_char_at(char ch , char *at)
print_char_at: scope:[print_char_at] from print_schar_at::@1 print_schar_at::@3 print_uchar_at print_uchar_at::@1
[65] print_char_at::at#4 = phi( print_schar_at::@1/print_char_at::at#0, print_schar_at::@3/print_char_at::at#1, print_uchar_at/print_char_at::at#2, print_uchar_at::@1/print_char_at::at#3 )
[65] print_char_at::ch#4 = phi( print_schar_at::@1/'-', print_schar_at::@3/' ', print_uchar_at/print_char_at::ch#2, print_uchar_at::@1/print_char_at::ch#3 )
[66] *print_char_at::at#4 = print_char_at::ch#4
to:print_char_at::@return
print_char_at::@return: scope:[print_char_at] from print_char_at
[67] return
to:@return
void print_uchar_at(char b , char *at)
print_uchar_at: scope:[print_uchar_at] from print_schar_at::@2
[68] print_uchar_at::$0 = print_uchar_at::b#0 >> 4
[69] print_char_at::ch#2 = print_hextab[print_uchar_at::$0]
[70] print_char_at::at#2 = print_uchar_at::at#0
[71] call print_char_at
to:print_uchar_at::@1
print_uchar_at::@1: scope:[print_uchar_at] from print_uchar_at
[72] print_uchar_at::$2 = print_uchar_at::b#0 & $f
[73] print_char_at::at#3 = print_uchar_at::at#0 + 1
[74] print_char_at::ch#3 = print_hextab[print_uchar_at::$2]
[75] call print_char_at
to:print_uchar_at::@return
print_uchar_at::@return: scope:[print_uchar_at] from print_uchar_at::@1
[76] return
to:@return
void * memset(void *str , char c , unsigned int num)
memset: scope:[memset] from print_cls
[77] phi()
to:memset::@1
memset::@1: scope:[memset] from memset memset::@2
[78] memset::dst#2 = phi( memset/(char *)memset::str#0, memset::@2/memset::dst#1 )
[79] if(memset::dst#2!=memset::end#0) goto memset::@2
to:memset::@return
memset::@return: scope:[memset] from memset::@1
[80] return
to:@return
memset::@2: scope:[memset] from memset::@1
[81] *memset::dst#2 = memset::c#0
[82] memset::dst#1 = ++ memset::dst#2
to:memset::@1
VARIABLE REGISTER WEIGHTS
signed char fmul8(volatile signed char aa , volatile signed char bb)
__loadstore volatile signed char fmul8::aa // 33.666666666666664
__loadstore volatile signed char fmul8::bb // 50.5
__loadstore volatile signed char fmul8::cc // 1001.0
signed char fmul8::return
signed char fmul8::return#0 // 202.0
signed char fmul8::return#1 // 2002.0
signed char fmul8::return#2 // 367.33333333333337
void init_screen()
char *init_screen::COLS
char *init_screen::COLS#1 // 67.33333333333333
char *init_screen::COLS#3 // 121.2
char init_screen::l
char init_screen::l#1 // 151.5
char init_screen::l#2 // 151.5
char init_screen::m
char init_screen::m#1 // 151.5
char init_screen::m#2 // 33.666666666666664
void main()
char *main::at
char *main::at#1 // 7.333333333333333
char *main::at#12 // 22.0
char *main::at#2 // 2.3157894736842106
char *main::at#3 // 27.545454545454547
char *main::at#4 // 8.25
char *main::at#6 // 213.0
char *main::at_line
char *main::at_line#2 // 22.0
char main::i
char main::i#1 // 16.5
char main::i#2 // 7.444444444444445
char main::j
char main::j#1 // 151.5
char main::j#2 // 30.299999999999997
char main::k
char main::k#1 // 16.5
char main::k#2 // 6.6000000000000005
signed char main::r
signed char main::r#0 // 202.0
void * memset(void *str , char c , unsigned int num)
char memset::c
char *memset::dst
char *memset::dst#1 // 20002.0
char *memset::dst#2 // 13334.666666666666
char *memset::end
unsigned int memset::num
void *memset::return
void *memset::str
void print_char_at(char ch , char *at)
char *print_char_at::at
char *print_char_at::at#0 // 2002.0
char *print_char_at::at#1 // 2002.0
char *print_char_at::at#2 // 20002.0
char *print_char_at::at#3 // 10001.0
char *print_char_at::at#4 // 122005.0
char print_char_at::ch
char print_char_at::ch#2 // 10001.0
char print_char_at::ch#3 // 20002.0
char print_char_at::ch#4 // 120003.0
void print_cls()
void print_schar_at(signed char b , char *at)
char *print_schar_at::at
char *print_schar_at::at#0 // 22.0
char *print_schar_at::at#1 // 22.0
char *print_schar_at::at#2 // 202.0
char *print_schar_at::at#3 // 390.75
signed char print_schar_at::b
signed char print_schar_at::b#0 // 2002.0
signed char print_schar_at::b#1 // 11.0
signed char print_schar_at::b#2 // 11.0
signed char print_schar_at::b#3 // 101.0
signed char print_schar_at::b#4 // 521.0
signed char print_schar_at::b#6 // 1001.0
char *print_screen
void print_uchar_at(char b , char *at)
char print_uchar_at::$0 // 20002.0
char print_uchar_at::$2 // 10001.0
char *print_uchar_at::at
char *print_uchar_at::at#0 // 3000.4285714285716
char print_uchar_at::b
char print_uchar_at::b#0 // 4200.6
Initial phi equivalence classes
[ main::k#2 main::k#1 ]
[ main::at#4 main::at#1 ]
[ main::at_line#2 main::at#2 ]
[ main::i#2 main::i#1 ]
[ main::at#6 main::at#3 main::at#12 ]
[ main::j#2 main::j#1 ]
[ init_screen::l#2 init_screen::l#1 ]
[ init_screen::COLS#3 init_screen::COLS#1 ]
[ init_screen::m#2 init_screen::m#1 ]
[ print_schar_at::at#3 print_schar_at::at#0 print_schar_at::at#1 print_schar_at::at#2 ]
[ print_schar_at::b#6 print_schar_at::b#0 print_schar_at::b#4 print_schar_at::b#1 print_schar_at::b#2 print_schar_at::b#3 ]
[ print_char_at::ch#4 print_char_at::ch#2 print_char_at::ch#3 ]
[ print_char_at::at#4 print_char_at::at#0 print_char_at::at#1 print_char_at::at#2 print_char_at::at#3 ]
[ memset::dst#2 memset::dst#1 ]
Added variable fmul8::aa to live range equivalence class [ fmul8::aa ]
Added variable fmul8::bb to live range equivalence class [ fmul8::bb ]
Added variable fmul8::return#0 to live range equivalence class [ fmul8::return#0 ]
Added variable main::r#0 to live range equivalence class [ main::r#0 ]
Added variable print_uchar_at::at#0 to live range equivalence class [ print_uchar_at::at#0 ]
Added variable print_uchar_at::b#0 to live range equivalence class [ print_uchar_at::b#0 ]
Added variable fmul8::cc to live range equivalence class [ fmul8::cc ]
Added variable fmul8::return#1 to live range equivalence class [ fmul8::return#1 ]
Added variable fmul8::return#2 to live range equivalence class [ fmul8::return#2 ]
Added variable print_uchar_at::$0 to live range equivalence class [ print_uchar_at::$0 ]
Added variable print_uchar_at::$2 to live range equivalence class [ print_uchar_at::$2 ]
Complete equivalence classes
[ main::k#2 main::k#1 ]
[ main::at#4 main::at#1 ]
[ main::at_line#2 main::at#2 ]
[ main::i#2 main::i#1 ]
[ main::at#6 main::at#3 main::at#12 ]
[ main::j#2 main::j#1 ]
[ init_screen::l#2 init_screen::l#1 ]
[ init_screen::COLS#3 init_screen::COLS#1 ]
[ init_screen::m#2 init_screen::m#1 ]
[ print_schar_at::at#3 print_schar_at::at#0 print_schar_at::at#1 print_schar_at::at#2 ]
[ print_schar_at::b#6 print_schar_at::b#0 print_schar_at::b#4 print_schar_at::b#1 print_schar_at::b#2 print_schar_at::b#3 ]
[ print_char_at::ch#4 print_char_at::ch#2 print_char_at::ch#3 ]
[ print_char_at::at#4 print_char_at::at#0 print_char_at::at#1 print_char_at::at#2 print_char_at::at#3 ]
[ memset::dst#2 memset::dst#1 ]
[ fmul8::aa ]
[ fmul8::bb ]
[ fmul8::return#0 ]
[ main::r#0 ]
[ print_uchar_at::at#0 ]
[ print_uchar_at::b#0 ]
[ fmul8::cc ]
[ fmul8::return#1 ]
[ fmul8::return#2 ]
[ print_uchar_at::$0 ]
[ print_uchar_at::$2 ]
Allocated zp[2]:2 [ print_char_at::at#4 print_char_at::at#0 print_char_at::at#1 print_char_at::at#2 print_char_at::at#3 ]
Allocated zp[1]:4 [ print_char_at::ch#4 print_char_at::ch#2 print_char_at::ch#3 ]
Allocated zp[2]:5 [ memset::dst#2 memset::dst#1 ]
Allocated zp[1]:7 [ print_uchar_at::$0 ]
Allocated zp[1]:8 [ print_uchar_at::$2 ]
Allocated zp[1]:9 [ print_uchar_at::b#0 ]
Allocated zp[1]:10 [ print_schar_at::b#6 print_schar_at::b#0 print_schar_at::b#4 print_schar_at::b#1 print_schar_at::b#2 print_schar_at::b#3 ]
Allocated zp[2]:11 [ print_uchar_at::at#0 ]
Allocated zp[1]:13 [ fmul8::return#1 ]
Allocated zp[1]:14 [ fmul8::cc ]
Allocated zp[2]:15 [ print_schar_at::at#3 print_schar_at::at#0 print_schar_at::at#1 print_schar_at::at#2 ]
Allocated zp[1]:17 [ fmul8::return#2 ]
Allocated zp[1]:18 [ init_screen::l#2 init_screen::l#1 ]
Allocated zp[2]:19 [ main::at#6 main::at#3 main::at#12 ]
Allocated zp[1]:21 [ fmul8::return#0 ]
Allocated zp[1]:22 [ main::r#0 ]
Allocated zp[2]:23 [ init_screen::COLS#3 init_screen::COLS#1 ]
Allocated zp[1]:25 [ init_screen::m#2 init_screen::m#1 ]
Allocated zp[1]:26 [ main::j#2 main::j#1 ]
Allocated zp[1]:27 [ fmul8::bb ]
Allocated zp[1]:28 [ fmul8::aa ]
Allocated zp[2]:29 [ main::at_line#2 main::at#2 ]
Allocated zp[1]:31 [ main::i#2 main::i#1 ]
Allocated zp[1]:32 [ main::k#2 main::k#1 ]
Allocated zp[2]:33 [ main::at#4 main::at#1 ]
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [4] print_schar_at::at#0 = main::at#4 [ main::k#2 main::at#4 print_schar_at::b#1 print_schar_at::at#0 ] ( [ main::k#2 main::at#4 print_schar_at::b#1 print_schar_at::at#0 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:32 [ main::k#2 main::k#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:10 [ print_schar_at::b#6 print_schar_at::b#0 print_schar_at::b#4 print_schar_at::b#1 print_schar_at::b#2 print_schar_at::b#3 ]
Statement [6] main::at#1 = main::at#4 + 4 [ main::k#2 main::at#1 ] ( [ main::k#2 main::at#1 ] { } ) always clobbers reg byte a
Statement [10] main::at#2 = main::at_line#2 + $28 [ main::i#2 main::at#2 ] ( [ main::i#2 main::at#2 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:31 [ main::i#2 main::i#1 ]
Statement [12] print_schar_at::at#1 = main::at#2 [ main::i#2 main::at#2 print_schar_at::b#2 print_schar_at::at#1 ] ( [ main::i#2 main::at#2 print_schar_at::b#2 print_schar_at::at#1 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } } ) always clobbers reg byte a
Statement [14] main::at#12 = main::at#2 [ main::i#2 main::at#2 main::at#12 ] ( [ main::i#2 main::at#2 main::at#12 ] { } ) always clobbers reg byte a
Statement [16] main::at#3 = main::at#6 + 4 [ main::i#2 main::at#2 main::j#2 main::at#3 ] ( [ main::i#2 main::at#2 main::j#2 main::at#3 ] { { fmul8::return#0 = fmul8::return#2 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:26 [ main::j#2 main::j#1 ]
Statement [17] fmul8::aa = vals[main::i#2] [ main::i#2 main::at#2 main::j#2 main::at#3 fmul8::aa ] ( [ main::i#2 main::at#2 main::j#2 main::at#3 fmul8::aa ] { { fmul8::return#0 = fmul8::return#2 } } ) always clobbers reg byte a
Statement [18] fmul8::bb = vals[main::j#2] [ main::i#2 main::at#2 main::j#2 main::at#3 fmul8::aa fmul8::bb ] ( [ main::i#2 main::at#2 main::j#2 main::at#3 fmul8::aa fmul8::bb ] { { fmul8::return#0 = fmul8::return#2 } } ) always clobbers reg byte a
Statement [23] print_schar_at::at#2 = main::at#3 [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::b#3 print_schar_at::at#2 ] ( [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::b#3 print_schar_at::at#2 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } } ) always clobbers reg byte a
Statement [33] ((char *) 55296)[init_screen::l#2] = init_screen::WHITE [ init_screen::l#2 ] ( init_screen:1 [ init_screen::l#2 ] { } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:18 [ init_screen::l#2 init_screen::l#1 ]
Statement [37] *init_screen::COLS#3 = init_screen::WHITE [ init_screen::COLS#3 init_screen::m#2 ] ( init_screen:1 [ init_screen::COLS#3 init_screen::m#2 ] { } ) always clobbers reg byte a reg byte y
Removing always clobbered register reg byte a as potential for zp[1]:25 [ init_screen::m#2 init_screen::m#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:25 [ init_screen::m#2 init_screen::m#1 ]
Statement [38] init_screen::COLS#3[1] = init_screen::WHITE [ init_screen::COLS#3 init_screen::m#2 ] ( init_screen:1 [ init_screen::COLS#3 init_screen::m#2 ] { } ) always clobbers reg byte a reg byte y
Statement [39] init_screen::COLS#3[2] = init_screen::WHITE [ init_screen::COLS#3 init_screen::m#2 ] ( init_screen:1 [ init_screen::COLS#3 init_screen::m#2 ] { } ) always clobbers reg byte a reg byte y
Statement [40] init_screen::COLS#3[3] = init_screen::WHITE [ init_screen::COLS#3 init_screen::m#2 ] ( init_screen:1 [ init_screen::COLS#3 init_screen::m#2 ] { } ) always clobbers reg byte a reg byte y
Statement [41] init_screen::COLS#1 = init_screen::COLS#3 + $28 [ init_screen::m#2 init_screen::COLS#1 ] ( init_screen:1 [ init_screen::m#2 init_screen::COLS#1 ] { } ) always clobbers reg byte a
Statement [47] print_char_at::at#1 = print_schar_at::at#3 [ print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#1 ] ( print_schar_at:5 [ main::k#2 main::at#4 print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#1 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_char_at::at#1 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#0 main::at#4 } } print_schar_at:13 [ main::i#2 main::at#2 print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#1 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_char_at::at#1 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#1 main::at#2 } } print_schar_at:24 [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#1 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_char_at::at#1 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#2 main::at#3 } } ) always clobbers reg byte a
Statement [50] print_uchar_at::at#0 = print_schar_at::at#3 + 1 [ print_schar_at::b#6 print_uchar_at::at#0 ] ( print_schar_at:5 [ main::k#2 main::at#4 print_schar_at::b#6 print_uchar_at::at#0 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } } print_schar_at:13 [ main::i#2 main::at#2 print_schar_at::b#6 print_uchar_at::at#0 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } } print_schar_at:24 [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::b#6 print_uchar_at::at#0 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } } ) always clobbers reg byte a
Statement [54] print_char_at::at#0 = print_schar_at::at#3 [ print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#0 ] ( print_schar_at:5 [ main::k#2 main::at#4 print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#0 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_char_at::at#0 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#0 main::at#4 } } print_schar_at:13 [ main::i#2 main::at#2 print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#0 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_char_at::at#0 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#1 main::at#2 } } print_schar_at:24 [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#0 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_char_at::at#0 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#2 main::at#3 } } ) always clobbers reg byte a
Statement [56] print_schar_at::b#0 = - print_schar_at::b#4 [ print_schar_at::at#3 print_schar_at::b#0 ] ( print_schar_at:5 [ main::k#2 main::at#4 print_schar_at::at#3 print_schar_at::b#0 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } } print_schar_at:13 [ main::i#2 main::at#2 print_schar_at::at#3 print_schar_at::b#0 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } } print_schar_at:24 [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::at#3 print_schar_at::b#0 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } } ) always clobbers reg byte a
Statement [57] fmul8::cc = 0 [ fmul8::aa fmul8::bb fmul8::cc ] ( fmul8:19 [ main::i#2 main::at#2 main::j#2 main::at#3 fmul8::aa fmul8::bb fmul8::cc ] { { fmul8::return#0 = fmul8::return#2 } } ) always clobbers reg byte a
Statement asm { ldaaa staA1+1 eor#$ff staA2+1 ldxbb sec A1: ldamulf_sqr1,x A2: sbcmulf_sqr2,x stacc } always clobbers reg byte a reg byte x
Removing always clobbered register reg byte x as potential for zp[1]:31 [ main::i#2 main::i#1 ]
Removing always clobbered register reg byte x as potential for zp[1]:26 [ main::j#2 main::j#1 ]
Statement [66] *print_char_at::at#4 = print_char_at::ch#4 [ ] ( print_schar_at:5::print_char_at:48 [ main::k#2 main::at#4 print_schar_at::b#4 print_schar_at::at#3 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_char_at::at#1 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#0 main::at#4 } } print_schar_at:13::print_char_at:48 [ main::i#2 main::at#2 print_schar_at::b#4 print_schar_at::at#3 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_char_at::at#1 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#1 main::at#2 } } print_schar_at:24::print_char_at:48 [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::b#4 print_schar_at::at#3 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_char_at::at#1 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#2 main::at#3 } } print_schar_at:5::print_char_at:55 [ main::k#2 main::at#4 print_schar_at::b#4 print_schar_at::at#3 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_char_at::at#0 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#0 main::at#4 } } print_schar_at:13::print_char_at:55 [ main::i#2 main::at#2 print_schar_at::b#4 print_schar_at::at#3 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_char_at::at#0 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#1 main::at#2 } } print_schar_at:24::print_char_at:55 [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::b#4 print_schar_at::at#3 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_char_at::at#0 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#2 main::at#3 } } print_schar_at:5::print_uchar_at:52::print_char_at:71 [ main::k#2 main::at#4 print_uchar_at::at#0 print_uchar_at::b#0 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } print_schar_at:13::print_uchar_at:52::print_char_at:71 [ main::i#2 main::at#2 print_uchar_at::at#0 print_uchar_at::b#0 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } print_schar_at:24::print_uchar_at:52::print_char_at:71 [ main::i#2 main::at#2 main::j#2 main::at#3 print_uchar_at::at#0 print_uchar_at::b#0 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } print_schar_at:5::print_uchar_at:52::print_char_at:75 [ main::k#2 main::at#4 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } print_schar_at:13::print_uchar_at:52::print_char_at:75 [ main::i#2 main::at#2 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } print_schar_at:24::print_uchar_at:52::print_char_at:75 [ main::i#2 main::at#2 main::j#2 main::at#3 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:32 [ main::k#2 main::k#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:10 [ print_schar_at::b#6 print_schar_at::b#0 print_schar_at::b#4 print_schar_at::b#1 print_schar_at::b#2 print_schar_at::b#3 ]
Removing always clobbered register reg byte y as potential for zp[1]:31 [ main::i#2 main::i#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:26 [ main::j#2 main::j#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:9 [ print_uchar_at::b#0 ]
Statement [68] print_uchar_at::$0 = print_uchar_at::b#0 >> 4 [ print_uchar_at::at#0 print_uchar_at::b#0 print_uchar_at::$0 ] ( print_schar_at:5::print_uchar_at:52 [ main::k#2 main::at#4 print_uchar_at::at#0 print_uchar_at::b#0 print_uchar_at::$0 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } print_schar_at:13::print_uchar_at:52 [ main::i#2 main::at#2 print_uchar_at::at#0 print_uchar_at::b#0 print_uchar_at::$0 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } print_schar_at:24::print_uchar_at:52 [ main::i#2 main::at#2 main::j#2 main::at#3 print_uchar_at::at#0 print_uchar_at::b#0 print_uchar_at::$0 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:9 [ print_uchar_at::b#0 ]
Statement [70] print_char_at::at#2 = print_uchar_at::at#0 [ print_uchar_at::at#0 print_uchar_at::b#0 print_char_at::ch#2 print_char_at::at#2 ] ( print_schar_at:5::print_uchar_at:52 [ main::k#2 main::at#4 print_uchar_at::at#0 print_uchar_at::b#0 print_char_at::ch#2 print_char_at::at#2 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } print_schar_at:13::print_uchar_at:52 [ main::i#2 main::at#2 print_uchar_at::at#0 print_uchar_at::b#0 print_char_at::ch#2 print_char_at::at#2 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } print_schar_at:24::print_uchar_at:52 [ main::i#2 main::at#2 main::j#2 main::at#3 print_uchar_at::at#0 print_uchar_at::b#0 print_char_at::ch#2 print_char_at::at#2 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:4 [ print_char_at::ch#4 print_char_at::ch#2 print_char_at::ch#3 ]
Statement [72] print_uchar_at::$2 = print_uchar_at::b#0 & $f [ print_uchar_at::at#0 print_uchar_at::$2 ] ( print_schar_at:5::print_uchar_at:52 [ main::k#2 main::at#4 print_uchar_at::at#0 print_uchar_at::$2 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } print_schar_at:13::print_uchar_at:52 [ main::i#2 main::at#2 print_uchar_at::at#0 print_uchar_at::$2 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } print_schar_at:24::print_uchar_at:52 [ main::i#2 main::at#2 main::j#2 main::at#3 print_uchar_at::at#0 print_uchar_at::$2 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } ) always clobbers reg byte a
Statement [73] print_char_at::at#3 = print_uchar_at::at#0 + 1 [ print_char_at::at#3 print_uchar_at::$2 ] ( print_schar_at:5::print_uchar_at:52 [ main::k#2 main::at#4 print_char_at::at#3 print_uchar_at::$2 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } print_schar_at:13::print_uchar_at:52 [ main::i#2 main::at#2 print_char_at::at#3 print_uchar_at::$2 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } print_schar_at:24::print_uchar_at:52 [ main::i#2 main::at#2 main::j#2 main::at#3 print_char_at::at#3 print_uchar_at::$2 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:8 [ print_uchar_at::$2 ]
Statement [79] if(memset::dst#2!=memset::end#0) goto memset::@2 [ memset::dst#2 ] ( init_screen:1::print_cls:31::memset:63 [ memset::dst#2 ] { } ) always clobbers reg byte a
Statement [81] *memset::dst#2 = memset::c#0 [ memset::dst#2 ] ( init_screen:1::print_cls:31::memset:63 [ memset::dst#2 ] { } ) always clobbers reg byte a reg byte y
Statement [4] print_schar_at::at#0 = main::at#4 [ main::k#2 main::at#4 print_schar_at::b#1 print_schar_at::at#0 ] ( [ main::k#2 main::at#4 print_schar_at::b#1 print_schar_at::at#0 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } } ) always clobbers reg byte a
Statement [6] main::at#1 = main::at#4 + 4 [ main::k#2 main::at#1 ] ( [ main::k#2 main::at#1 ] { } ) always clobbers reg byte a
Statement [10] main::at#2 = main::at_line#2 + $28 [ main::i#2 main::at#2 ] ( [ main::i#2 main::at#2 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } } ) always clobbers reg byte a
Statement [11] print_schar_at::b#2 = vals[main::i#2] [ main::i#2 main::at#2 print_schar_at::b#2 ] ( [ main::i#2 main::at#2 print_schar_at::b#2 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } } ) always clobbers reg byte y
Statement [12] print_schar_at::at#1 = main::at#2 [ main::i#2 main::at#2 print_schar_at::b#2 print_schar_at::at#1 ] ( [ main::i#2 main::at#2 print_schar_at::b#2 print_schar_at::at#1 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } } ) always clobbers reg byte a
Statement [14] main::at#12 = main::at#2 [ main::i#2 main::at#2 main::at#12 ] ( [ main::i#2 main::at#2 main::at#12 ] { } ) always clobbers reg byte a
Statement [16] main::at#3 = main::at#6 + 4 [ main::i#2 main::at#2 main::j#2 main::at#3 ] ( [ main::i#2 main::at#2 main::j#2 main::at#3 ] { { fmul8::return#0 = fmul8::return#2 } } ) always clobbers reg byte a
Statement [17] fmul8::aa = vals[main::i#2] [ main::i#2 main::at#2 main::j#2 main::at#3 fmul8::aa ] ( [ main::i#2 main::at#2 main::j#2 main::at#3 fmul8::aa ] { { fmul8::return#0 = fmul8::return#2 } } ) always clobbers reg byte a reg byte y
Statement [18] fmul8::bb = vals[main::j#2] [ main::i#2 main::at#2 main::j#2 main::at#3 fmul8::aa fmul8::bb ] ( [ main::i#2 main::at#2 main::j#2 main::at#3 fmul8::aa fmul8::bb ] { { fmul8::return#0 = fmul8::return#2 } } ) always clobbers reg byte a reg byte y
Statement [23] print_schar_at::at#2 = main::at#3 [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::b#3 print_schar_at::at#2 ] ( [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::b#3 print_schar_at::at#2 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } } ) always clobbers reg byte a
Statement [26] if(main::j#1!=9) goto main::@3 [ main::i#2 main::at#2 main::at#3 main::j#1 ] ( [ main::i#2 main::at#2 main::at#3 main::j#1 ] { } ) always clobbers reg byte a
Statement [28] if(main::i#1!=9) goto main::@2 [ main::at#2 main::i#1 ] ( [ main::at#2 main::i#1 ] { } ) always clobbers reg byte a
Statement [33] ((char *) 55296)[init_screen::l#2] = init_screen::WHITE [ init_screen::l#2 ] ( init_screen:1 [ init_screen::l#2 ] { } ) always clobbers reg byte a
Statement [37] *init_screen::COLS#3 = init_screen::WHITE [ init_screen::COLS#3 init_screen::m#2 ] ( init_screen:1 [ init_screen::COLS#3 init_screen::m#2 ] { } ) always clobbers reg byte a reg byte y
Statement [38] init_screen::COLS#3[1] = init_screen::WHITE [ init_screen::COLS#3 init_screen::m#2 ] ( init_screen:1 [ init_screen::COLS#3 init_screen::m#2 ] { } ) always clobbers reg byte a reg byte y
Statement [39] init_screen::COLS#3[2] = init_screen::WHITE [ init_screen::COLS#3 init_screen::m#2 ] ( init_screen:1 [ init_screen::COLS#3 init_screen::m#2 ] { } ) always clobbers reg byte a reg byte y
Statement [40] init_screen::COLS#3[3] = init_screen::WHITE [ init_screen::COLS#3 init_screen::m#2 ] ( init_screen:1 [ init_screen::COLS#3 init_screen::m#2 ] { } ) always clobbers reg byte a reg byte y
Statement [41] init_screen::COLS#1 = init_screen::COLS#3 + $28 [ init_screen::m#2 init_screen::COLS#1 ] ( init_screen:1 [ init_screen::m#2 init_screen::COLS#1 ] { } ) always clobbers reg byte a
Statement [47] print_char_at::at#1 = print_schar_at::at#3 [ print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#1 ] ( print_schar_at:5 [ main::k#2 main::at#4 print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#1 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_char_at::at#1 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#0 main::at#4 } } print_schar_at:13 [ main::i#2 main::at#2 print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#1 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_char_at::at#1 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#1 main::at#2 } } print_schar_at:24 [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#1 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_char_at::at#1 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#2 main::at#3 } } ) always clobbers reg byte a
Statement [50] print_uchar_at::at#0 = print_schar_at::at#3 + 1 [ print_schar_at::b#6 print_uchar_at::at#0 ] ( print_schar_at:5 [ main::k#2 main::at#4 print_schar_at::b#6 print_uchar_at::at#0 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } } print_schar_at:13 [ main::i#2 main::at#2 print_schar_at::b#6 print_uchar_at::at#0 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } } print_schar_at:24 [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::b#6 print_uchar_at::at#0 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } } ) always clobbers reg byte a
Statement [54] print_char_at::at#0 = print_schar_at::at#3 [ print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#0 ] ( print_schar_at:5 [ main::k#2 main::at#4 print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#0 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_char_at::at#0 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#0 main::at#4 } } print_schar_at:13 [ main::i#2 main::at#2 print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#0 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_char_at::at#0 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#1 main::at#2 } } print_schar_at:24 [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::b#4 print_schar_at::at#3 print_char_at::at#0 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_char_at::at#0 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#2 main::at#3 } } ) always clobbers reg byte a
Statement [56] print_schar_at::b#0 = - print_schar_at::b#4 [ print_schar_at::at#3 print_schar_at::b#0 ] ( print_schar_at:5 [ main::k#2 main::at#4 print_schar_at::at#3 print_schar_at::b#0 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } } print_schar_at:13 [ main::i#2 main::at#2 print_schar_at::at#3 print_schar_at::b#0 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } } print_schar_at:24 [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::at#3 print_schar_at::b#0 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } } ) always clobbers reg byte a
Statement [57] fmul8::cc = 0 [ fmul8::aa fmul8::bb fmul8::cc ] ( fmul8:19 [ main::i#2 main::at#2 main::j#2 main::at#3 fmul8::aa fmul8::bb fmul8::cc ] { { fmul8::return#0 = fmul8::return#2 } } ) always clobbers reg byte a
Statement asm { ldaaa staA1+1 eor#$ff staA2+1 ldxbb sec A1: ldamulf_sqr1,x A2: sbcmulf_sqr2,x stacc } always clobbers reg byte a reg byte x
Statement [66] *print_char_at::at#4 = print_char_at::ch#4 [ ] ( print_schar_at:5::print_char_at:48 [ main::k#2 main::at#4 print_schar_at::b#4 print_schar_at::at#3 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_char_at::at#1 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#0 main::at#4 } } print_schar_at:13::print_char_at:48 [ main::i#2 main::at#2 print_schar_at::b#4 print_schar_at::at#3 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_char_at::at#1 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#1 main::at#2 } } print_schar_at:24::print_char_at:48 [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::b#4 print_schar_at::at#3 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_char_at::at#1 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#2 main::at#3 } } print_schar_at:5::print_char_at:55 [ main::k#2 main::at#4 print_schar_at::b#4 print_schar_at::at#3 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_char_at::at#0 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#0 main::at#4 } } print_schar_at:13::print_char_at:55 [ main::i#2 main::at#2 print_schar_at::b#4 print_schar_at::at#3 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_char_at::at#0 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#1 main::at#2 } } print_schar_at:24::print_char_at:55 [ main::i#2 main::at#2 main::j#2 main::at#3 print_schar_at::b#4 print_schar_at::at#3 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_char_at::at#0 = print_char_at::at#4 print_schar_at::at#3 print_schar_at::at#2 main::at#3 } } print_schar_at:5::print_uchar_at:52::print_char_at:71 [ main::k#2 main::at#4 print_uchar_at::at#0 print_uchar_at::b#0 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } print_schar_at:13::print_uchar_at:52::print_char_at:71 [ main::i#2 main::at#2 print_uchar_at::at#0 print_uchar_at::b#0 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } print_schar_at:24::print_uchar_at:52::print_char_at:71 [ main::i#2 main::at#2 main::j#2 main::at#3 print_uchar_at::at#0 print_uchar_at::b#0 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } print_schar_at:5::print_uchar_at:52::print_char_at:75 [ main::k#2 main::at#4 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } print_schar_at:13::print_uchar_at:52::print_char_at:75 [ main::i#2 main::at#2 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } print_schar_at:24::print_uchar_at:52::print_char_at:75 [ main::i#2 main::at#2 main::j#2 main::at#3 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } ) always clobbers reg byte a reg byte y
Statement [68] print_uchar_at::$0 = print_uchar_at::b#0 >> 4 [ print_uchar_at::at#0 print_uchar_at::b#0 print_uchar_at::$0 ] ( print_schar_at:5::print_uchar_at:52 [ main::k#2 main::at#4 print_uchar_at::at#0 print_uchar_at::b#0 print_uchar_at::$0 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } print_schar_at:13::print_uchar_at:52 [ main::i#2 main::at#2 print_uchar_at::at#0 print_uchar_at::b#0 print_uchar_at::$0 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } print_schar_at:24::print_uchar_at:52 [ main::i#2 main::at#2 main::j#2 main::at#3 print_uchar_at::at#0 print_uchar_at::b#0 print_uchar_at::$0 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } ) always clobbers reg byte a
Statement [70] print_char_at::at#2 = print_uchar_at::at#0 [ print_uchar_at::at#0 print_uchar_at::b#0 print_char_at::ch#2 print_char_at::at#2 ] ( print_schar_at:5::print_uchar_at:52 [ main::k#2 main::at#4 print_uchar_at::at#0 print_uchar_at::b#0 print_char_at::ch#2 print_char_at::at#2 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } print_schar_at:13::print_uchar_at:52 [ main::i#2 main::at#2 print_uchar_at::at#0 print_uchar_at::b#0 print_char_at::ch#2 print_char_at::at#2 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } print_schar_at:24::print_uchar_at:52 [ main::i#2 main::at#2 main::j#2 main::at#3 print_uchar_at::at#0 print_uchar_at::b#0 print_char_at::ch#2 print_char_at::at#2 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } { print_char_at::ch#2 = print_char_at::ch#4 } { print_char_at::at#2 = print_char_at::at#4 print_uchar_at::at#0 } } ) always clobbers reg byte a
Statement [72] print_uchar_at::$2 = print_uchar_at::b#0 & $f [ print_uchar_at::at#0 print_uchar_at::$2 ] ( print_schar_at:5::print_uchar_at:52 [ main::k#2 main::at#4 print_uchar_at::at#0 print_uchar_at::$2 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } print_schar_at:13::print_uchar_at:52 [ main::i#2 main::at#2 print_uchar_at::at#0 print_uchar_at::$2 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } print_schar_at:24::print_uchar_at:52 [ main::i#2 main::at#2 main::j#2 main::at#3 print_uchar_at::at#0 print_uchar_at::$2 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } ) always clobbers reg byte a
Statement [73] print_char_at::at#3 = print_uchar_at::at#0 + 1 [ print_char_at::at#3 print_uchar_at::$2 ] ( print_schar_at:5::print_uchar_at:52 [ main::k#2 main::at#4 print_char_at::at#3 print_uchar_at::$2 ] { { print_schar_at::b#1 = print_schar_at::b#4 } { print_schar_at::at#0 = print_schar_at::at#3 main::at#4 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } print_schar_at:13::print_uchar_at:52 [ main::i#2 main::at#2 print_char_at::at#3 print_uchar_at::$2 ] { { print_schar_at::b#2 = print_schar_at::b#4 } { print_schar_at::at#1 = print_schar_at::at#3 main::at#2 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } print_schar_at:24::print_uchar_at:52 [ main::i#2 main::at#2 main::j#2 main::at#3 print_char_at::at#3 print_uchar_at::$2 ] { { print_schar_at::b#3 = print_schar_at::b#4 main::r#0 } { print_schar_at::at#2 = print_schar_at::at#3 main::at#3 } { print_char_at::ch#3 = print_char_at::ch#4 } { print_char_at::at#3 = print_char_at::at#4 } } ) always clobbers reg byte a
Statement [79] if(memset::dst#2!=memset::end#0) goto memset::@2 [ memset::dst#2 ] ( init_screen:1::print_cls:31::memset:63 [ memset::dst#2 ] { } ) always clobbers reg byte a
Statement [81] *memset::dst#2 = memset::c#0 [ memset::dst#2 ] ( init_screen:1::print_cls:31::memset:63 [ memset::dst#2 ] { } ) always clobbers reg byte a reg byte y
Potential registers zp[1]:32 [ main::k#2 main::k#1 ] : zp[1]:32 , reg byte x ,
Potential registers zp[2]:33 [ main::at#4 main::at#1 ] : zp[2]:33 ,
Potential registers zp[2]:29 [ main::at_line#2 main::at#2 ] : zp[2]:29 ,
Potential registers zp[1]:31 [ main::i#2 main::i#1 ] : zp[1]:31 ,
Potential registers zp[2]:19 [ main::at#6 main::at#3 main::at#12 ] : zp[2]:19 ,
Potential registers zp[1]:26 [ main::j#2 main::j#1 ] : zp[1]:26 ,
Potential registers zp[1]:18 [ init_screen::l#2 init_screen::l#1 ] : zp[1]:18 , reg byte x , reg byte y ,
Potential registers zp[2]:23 [ init_screen::COLS#3 init_screen::COLS#1 ] : zp[2]:23 ,
Potential registers zp[1]:25 [ init_screen::m#2 init_screen::m#1 ] : zp[1]:25 , reg byte x ,
Potential registers zp[2]:15 [ print_schar_at::at#3 print_schar_at::at#0 print_schar_at::at#1 print_schar_at::at#2 ] : zp[2]:15 ,
Potential registers zp[1]:10 [ print_schar_at::b#6 print_schar_at::b#0 print_schar_at::b#4 print_schar_at::b#1 print_schar_at::b#2 print_schar_at::b#3 ] : zp[1]:10 , reg byte x ,
Potential registers zp[1]:4 [ print_char_at::ch#4 print_char_at::ch#2 print_char_at::ch#3 ] : zp[1]:4 , reg byte x , reg byte y ,
Potential registers zp[2]:2 [ print_char_at::at#4 print_char_at::at#0 print_char_at::at#1 print_char_at::at#2 print_char_at::at#3 ] : zp[2]:2 ,
Potential registers zp[2]:5 [ memset::dst#2 memset::dst#1 ] : zp[2]:5 ,
Potential registers zp[1]:28 [ fmul8::aa ] : zp[1]:28 ,
Potential registers zp[1]:27 [ fmul8::bb ] : zp[1]:27 ,
Potential registers zp[1]:21 [ fmul8::return#0 ] : zp[1]:21 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:22 [ main::r#0 ] : zp[1]:22 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[2]:11 [ print_uchar_at::at#0 ] : zp[2]:11 ,
Potential registers zp[1]:9 [ print_uchar_at::b#0 ] : zp[1]:9 , reg byte x ,
Potential registers zp[1]:14 [ fmul8::cc ] : zp[1]:14 ,
Potential registers zp[1]:13 [ fmul8::return#1 ] : zp[1]:13 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:17 [ fmul8::return#2 ] : zp[1]:17 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:7 [ print_uchar_at::$0 ] : zp[1]:7 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:8 [ print_uchar_at::$2 ] : zp[1]:8 , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [print_char_at] 156,012: zp[2]:2 [ print_char_at::at#4 print_char_at::at#0 print_char_at::at#1 print_char_at::at#2 print_char_at::at#3 ] 150,006: zp[1]:4 [ print_char_at::ch#4 print_char_at::ch#2 print_char_at::ch#3 ]
Uplift Scope [print_uchar_at] 20,002: zp[1]:7 [ print_uchar_at::$0 ] 10,001: zp[1]:8 [ print_uchar_at::$2 ] 4,200.6: zp[1]:9 [ print_uchar_at::b#0 ] 3,000.43: zp[2]:11 [ print_uchar_at::at#0 ]
Uplift Scope [memset] 33,336.67: zp[2]:5 [ memset::dst#2 memset::dst#1 ]
Uplift Scope [print_schar_at] 3,647: zp[1]:10 [ print_schar_at::b#6 print_schar_at::b#0 print_schar_at::b#4 print_schar_at::b#1 print_schar_at::b#2 print_schar_at::b#3 ] 636.75: zp[2]:15 [ print_schar_at::at#3 print_schar_at::at#0 print_schar_at::at#1 print_schar_at::at#2 ]
Uplift Scope [fmul8] 2,002: zp[1]:13 [ fmul8::return#1 ] 1,001: zp[1]:14 [ fmul8::cc ] 367.33: zp[1]:17 [ fmul8::return#2 ] 202: zp[1]:21 [ fmul8::return#0 ] 50.5: zp[1]:27 [ fmul8::bb ] 33.67: zp[1]:28 [ fmul8::aa ]
Uplift Scope [main] 262.55: zp[2]:19 [ main::at#6 main::at#3 main::at#12 ] 202: zp[1]:22 [ main::r#0 ] 181.8: zp[1]:26 [ main::j#2 main::j#1 ] 24.32: zp[2]:29 [ main::at_line#2 main::at#2 ] 23.94: zp[1]:31 [ main::i#2 main::i#1 ] 23.1: zp[1]:32 [ main::k#2 main::k#1 ] 15.58: zp[2]:33 [ main::at#4 main::at#1 ]
Uplift Scope [init_screen] 303: zp[1]:18 [ init_screen::l#2 init_screen::l#1 ] 188.53: zp[2]:23 [ init_screen::COLS#3 init_screen::COLS#1 ] 185.17: zp[1]:25 [ init_screen::m#2 init_screen::m#1 ]
Uplift Scope [print_cls]
Uplift Scope [RADIX]
Uplift Scope []
Uplifting [print_char_at] best 14208 combination zp[2]:2 [ print_char_at::at#4 print_char_at::at#0 print_char_at::at#1 print_char_at::at#2 print_char_at::at#3 ] reg byte x [ print_char_at::ch#4 print_char_at::ch#2 print_char_at::ch#3 ]
Uplifting [print_uchar_at] best 14200 combination reg byte a [ print_uchar_at::$0 ] reg byte y [ print_uchar_at::$2 ] zp[1]:9 [ print_uchar_at::b#0 ] zp[2]:11 [ print_uchar_at::at#0 ]
Uplifting [memset] best 14200 combination zp[2]:5 [ memset::dst#2 memset::dst#1 ]
Uplifting [print_schar_at] best 14200 combination zp[1]:10 [ print_schar_at::b#6 print_schar_at::b#0 print_schar_at::b#4 print_schar_at::b#1 print_schar_at::b#2 print_schar_at::b#3 ] zp[2]:15 [ print_schar_at::at#3 print_schar_at::at#0 print_schar_at::at#1 print_schar_at::at#2 ]
Uplifting [fmul8] best 13291 combination reg byte a [ fmul8::return#1 ] zp[1]:14 [ fmul8::cc ] reg byte a [ fmul8::return#2 ] reg byte a [ fmul8::return#0 ] zp[1]:27 [ fmul8::bb ] zp[1]:28 [ fmul8::aa ]
Uplifting [main] best 12691 combination zp[2]:19 [ main::at#6 main::at#3 main::at#12 ] reg byte a [ main::r#0 ] zp[1]:26 [ main::j#2 main::j#1 ] zp[2]:29 [ main::at_line#2 main::at#2 ] zp[1]:31 [ main::i#2 main::i#1 ] zp[1]:32 [ main::k#2 main::k#1 ] zp[2]:33 [ main::at#4 main::at#1 ]
Uplifting [init_screen] best 12481 combination reg byte x [ init_screen::l#2 init_screen::l#1 ] zp[2]:23 [ init_screen::COLS#3 init_screen::COLS#1 ] reg byte x [ init_screen::m#2 init_screen::m#1 ]
Uplifting [print_cls] best 12481 combination
Uplifting [RADIX] best 12481 combination
Uplifting [] best 12481 combination
Attempting to uplift remaining variables inzp[1]:9 [ print_uchar_at::b#0 ]
Uplifting [print_uchar_at] best 12481 combination zp[1]:9 [ print_uchar_at::b#0 ]
Attempting to uplift remaining variables inzp[1]:10 [ print_schar_at::b#6 print_schar_at::b#0 print_schar_at::b#4 print_schar_at::b#1 print_schar_at::b#2 print_schar_at::b#3 ]
Uplifting [print_schar_at] best 12481 combination zp[1]:10 [ print_schar_at::b#6 print_schar_at::b#0 print_schar_at::b#4 print_schar_at::b#1 print_schar_at::b#2 print_schar_at::b#3 ]
Attempting to uplift remaining variables inzp[1]:14 [ fmul8::cc ]
Uplifting [fmul8] best 12481 combination zp[1]:14 [ fmul8::cc ]
Attempting to uplift remaining variables inzp[1]:26 [ main::j#2 main::j#1 ]
Uplifting [main] best 12481 combination zp[1]:26 [ main::j#2 main::j#1 ]
Attempting to uplift remaining variables inzp[1]:27 [ fmul8::bb ]
Uplifting [fmul8] best 12481 combination zp[1]:27 [ fmul8::bb ]
Attempting to uplift remaining variables inzp[1]:28 [ fmul8::aa ]
Uplifting [fmul8] best 12481 combination zp[1]:28 [ fmul8::aa ]
Attempting to uplift remaining variables inzp[1]:31 [ main::i#2 main::i#1 ]
Uplifting [main] best 12481 combination zp[1]:31 [ main::i#2 main::i#1 ]
Attempting to uplift remaining variables inzp[1]:32 [ main::k#2 main::k#1 ]
Uplifting [main] best 12481 combination zp[1]:32 [ main::k#2 main::k#1 ]
Coalescing zero page register [ zp[2]:15 [ print_schar_at::at#3 print_schar_at::at#0 print_schar_at::at#1 print_schar_at::at#2 ] ] with [ zp[2]:2 [ print_char_at::at#4 print_char_at::at#0 print_char_at::at#1 print_char_at::at#2 print_char_at::at#3 ] ] - score: 2
Coalescing zero page register [ zp[2]:15 [ print_schar_at::at#3 print_schar_at::at#0 print_schar_at::at#1 print_schar_at::at#2 print_char_at::at#4 print_char_at::at#0 print_char_at::at#1 print_char_at::at#2 print_char_at::at#3 ] ] with [ zp[2]:11 [ print_uchar_at::at#0 ] ] - score: 1
Coalescing zero page register [ zp[1]:10 [ print_schar_at::b#6 print_schar_at::b#0 print_schar_at::b#4 print_schar_at::b#1 print_schar_at::b#2 print_schar_at::b#3 ] ] with [ zp[1]:9 [ print_uchar_at::b#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:15 [ print_schar_at::at#3 print_schar_at::at#0 print_schar_at::at#1 print_schar_at::at#2 print_char_at::at#4 print_char_at::at#0 print_char_at::at#1 print_char_at::at#2 print_char_at::at#3 print_uchar_at::at#0 ] ] with [ zp[2]:23 [ init_screen::COLS#3 init_screen::COLS#1 ] ]
Allocated (was zp[2]:15) zp[2]:2 [ print_schar_at::at#3 print_schar_at::at#0 print_schar_at::at#1 print_schar_at::at#2 print_char_at::at#4 print_char_at::at#0 print_char_at::at#1 print_char_at::at#2 print_char_at::at#3 print_uchar_at::at#0 init_screen::COLS#3 init_screen::COLS#1 ]
Allocated (was zp[2]:5) zp[2]:4 [ memset::dst#2 memset::dst#1 ]
Allocated (was zp[1]:10) zp[1]:6 [ print_schar_at::b#6 print_schar_at::b#0 print_schar_at::b#4 print_schar_at::b#1 print_schar_at::b#2 print_schar_at::b#3 print_uchar_at::b#0 ]
Allocated (was zp[1]:14) zp[1]:7 [ fmul8::cc ]
Allocated (was zp[2]:19) zp[2]:8 [ main::at#6 main::at#3 main::at#12 ]
Allocated (was zp[1]:26) zp[1]:10 [ main::j#2 main::j#1 ]
Allocated (was zp[1]:27) zp[1]:11 [ fmul8::bb ]
Allocated (was zp[1]:28) zp[1]:12 [ fmul8::aa ]
Allocated (was zp[2]:29) zp[2]:13 [ main::at_line#2 main::at#2 ]
Allocated (was zp[1]:31) zp[1]:15 [ main::i#2 main::i#1 ]
Allocated (was zp[1]:32) zp[1]:16 [ main::k#2 main::k#1 ]
Allocated (was zp[2]:33) zp[2]:17 [ main::at#4 main::at#1 ]
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
// Seriously fast multiply 8-bit version (8bit*8bit=8bit)
// Multiplies two signed 8-bit numbers and results in an 8-bit number
// C=A*B, A in [-64;64], B in [-96;95], C in [-96;95] - 64 acts a 1 (X*64=X)
// Uses the formula a*b = (a+b)^2/4 - (a-b)^2/4
// See the following for information about the method
// - http://codebase64.org/doku.php?id=base:seriously_fast_multiplication
// - http://codebase64.org/doku.php?id=magazines:chacking16
// Upstart
// Commodore 64 PRG executable file
.file [name="fastmultiply8.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
.label print_screen = $400
.segment Code
// main
main: {
.label at = $11
.label k = $10
.label at_1 = $d
.label at_2 = 8
.label j = $a
.label i = $f
.label at_line = $d
// [1] call init_screen
// [30] phi from main to init_screen [phi:main->init_screen]
init_screen_from_main:
jsr init_screen
// [2] phi from main to main::@1 [phi:main->main::@1]
__b1_from_main:
// [2] phi main::at#4 = (char *) 1024+4 [phi:main->main::@1#0] -- pbuz1=pbuc1
lda #<$400+4
sta.z at
lda #>$400+4
sta.z at+1
// [2] phi main::k#2 = 0 [phi:main->main::@1#1] -- vbuz1=vbuc1
lda #0
sta.z k
jmp __b1
// [2] phi from main::@5 to main::@1 [phi:main::@5->main::@1]
__b1_from___b5:
// [2] phi main::at#4 = main::at#1 [phi:main::@5->main::@1#0] -- register_copy
// [2] phi main::k#2 = main::k#1 [phi:main::@5->main::@1#1] -- register_copy
jmp __b1
// main::@1
__b1:
// [3] print_schar_at::b#1 = vals[main::k#2] -- vbsz1=pbsc1_derefidx_vbuz2
ldy.z k
lda vals,y
sta.z print_schar_at.b
// [4] print_schar_at::at#0 = main::at#4 -- pbuz1=pbuz2
lda.z at
sta.z print_schar_at.at
lda.z at+1
sta.z print_schar_at.at+1
// [5] call print_schar_at
// [45] phi from main::@1 to print_schar_at [phi:main::@1->print_schar_at]
print_schar_at_from___b1:
// [45] phi print_schar_at::at#3 = print_schar_at::at#0 [phi:main::@1->print_schar_at#0] -- register_copy
// [45] phi print_schar_at::b#4 = print_schar_at::b#1 [phi:main::@1->print_schar_at#1] -- register_copy
jsr print_schar_at
jmp __b5
// main::@5
__b5:
// [6] main::at#1 = main::at#4 + 4 -- pbuz1=pbuz1_plus_vbuc1
lda #4
clc
adc.z at
sta.z at
bcc !+
inc.z at+1
!:
// [7] main::k#1 = ++ main::k#2 -- vbuz1=_inc_vbuz1
inc.z k
// [8] if(main::k#1!=9) goto main::@1 -- vbuz1_neq_vbuc1_then_la1
lda #9
cmp.z k
bne __b1_from___b5
// [9] phi from main::@5 to main::@2 [phi:main::@5->main::@2]
__b2_from___b5:
// [9] phi main::i#2 = 0 [phi:main::@5->main::@2#0] -- vbuz1=vbuc1
lda #0
sta.z i
// [9] phi main::at_line#2 = (char *) 1024 [phi:main::@5->main::@2#1] -- pbuz1=pbuc1
lda #<$400
sta.z at_line
lda #>$400
sta.z at_line+1
jmp __b2
// [9] phi from main::@4 to main::@2 [phi:main::@4->main::@2]
__b2_from___b4:
// [9] phi main::i#2 = main::i#1 [phi:main::@4->main::@2#0] -- register_copy
// [9] phi main::at_line#2 = main::at#2 [phi:main::@4->main::@2#1] -- register_copy
jmp __b2
// main::@2
__b2:
// [10] main::at#2 = main::at_line#2 + $28 -- pbuz1=pbuz1_plus_vbuc1
lda #$28
clc
adc.z at_1
sta.z at_1
bcc !+
inc.z at_1+1
!:
// [11] print_schar_at::b#2 = vals[main::i#2] -- vbsz1=pbsc1_derefidx_vbuz2
ldy.z i
lda vals,y
sta.z print_schar_at.b
// [12] print_schar_at::at#1 = main::at#2 -- pbuz1=pbuz2
lda.z at_1
sta.z print_schar_at.at
lda.z at_1+1
sta.z print_schar_at.at+1
// [13] call print_schar_at
// [45] phi from main::@2 to print_schar_at [phi:main::@2->print_schar_at]
print_schar_at_from___b2:
// [45] phi print_schar_at::at#3 = print_schar_at::at#1 [phi:main::@2->print_schar_at#0] -- register_copy
// [45] phi print_schar_at::b#4 = print_schar_at::b#2 [phi:main::@2->print_schar_at#1] -- register_copy
jsr print_schar_at
jmp __b6
// main::@6
__b6:
// [14] main::at#12 = main::at#2 -- pbuz1=pbuz2
lda.z at_1
sta.z at_2
lda.z at_1+1
sta.z at_2+1
// [15] phi from main::@6 to main::@3 [phi:main::@6->main::@3]
__b3_from___b6:
// [15] phi main::j#2 = 0 [phi:main::@6->main::@3#0] -- vbuz1=vbuc1
lda #0
sta.z j
// [15] phi main::at#6 = main::at#12 [phi:main::@6->main::@3#1] -- register_copy
jmp __b3
// [15] phi from main::@8 to main::@3 [phi:main::@8->main::@3]
__b3_from___b8:
// [15] phi main::j#2 = main::j#1 [phi:main::@8->main::@3#0] -- register_copy
// [15] phi main::at#6 = main::at#3 [phi:main::@8->main::@3#1] -- register_copy
jmp __b3
// main::@3
__b3:
// [16] main::at#3 = main::at#6 + 4 -- pbuz1=pbuz1_plus_vbuc1
lda #4
clc
adc.z at_2
sta.z at_2
bcc !+
inc.z at_2+1
!:
// [17] fmul8::aa = vals[main::i#2] -- vbsz1=pbsc1_derefidx_vbuz2
ldy.z i
lda vals,y
sta.z fmul8.aa
// [18] fmul8::bb = vals[main::j#2] -- vbsz1=pbsc1_derefidx_vbuz2
ldy.z j
lda vals,y
sta.z fmul8.bb
// [19] call fmul8
jsr fmul8
// [20] fmul8::return#0 = fmul8::return#2
jmp __b7
// main::@7
__b7:
// [21] main::r#0 = fmul8::return#0
// [22] print_schar_at::b#3 = main::r#0 -- vbsz1=vbsaa
sta.z print_schar_at.b
// [23] print_schar_at::at#2 = main::at#3 -- pbuz1=pbuz2
lda.z at_2
sta.z print_schar_at.at
lda.z at_2+1
sta.z print_schar_at.at+1
// [24] call print_schar_at
// [45] phi from main::@7 to print_schar_at [phi:main::@7->print_schar_at]
print_schar_at_from___b7:
// [45] phi print_schar_at::at#3 = print_schar_at::at#2 [phi:main::@7->print_schar_at#0] -- register_copy
// [45] phi print_schar_at::b#4 = print_schar_at::b#3 [phi:main::@7->print_schar_at#1] -- register_copy
jsr print_schar_at
jmp __b8
// main::@8
__b8:
// [25] main::j#1 = ++ main::j#2 -- vbuz1=_inc_vbuz1
inc.z j
// [26] if(main::j#1!=9) goto main::@3 -- vbuz1_neq_vbuc1_then_la1
lda #9
cmp.z j
bne __b3_from___b8
jmp __b4
// main::@4
__b4:
// [27] main::i#1 = ++ main::i#2 -- vbuz1=_inc_vbuz1
inc.z i
// [28] if(main::i#1!=9) goto main::@2 -- vbuz1_neq_vbuc1_then_la1
lda #9
cmp.z i
bne __b2_from___b4
jmp __breturn
// main::@return
__breturn:
// [29] return
rts
}
// init_screen
init_screen: {
.const WHITE = 1
.label COLS = 2
// [31] call print_cls
// [62] phi from init_screen to print_cls [phi:init_screen->print_cls]
print_cls_from_init_screen:
jsr print_cls
// [32] phi from init_screen to init_screen::@1 [phi:init_screen->init_screen::@1]
__b1_from_init_screen:
// [32] phi init_screen::l#2 = 0 [phi:init_screen->init_screen::@1#0] -- vbuxx=vbuc1
ldx #0
jmp __b1
// [32] phi from init_screen::@1 to init_screen::@1 [phi:init_screen::@1->init_screen::@1]
__b1_from___b1:
// [32] phi init_screen::l#2 = init_screen::l#1 [phi:init_screen::@1->init_screen::@1#0] -- register_copy
jmp __b1
// init_screen::@1
__b1:
// [33] ((char *) 55296)[init_screen::l#2] = init_screen::WHITE -- pbuc1_derefidx_vbuxx=vbuc2
lda #WHITE
sta $d800,x
// [34] init_screen::l#1 = ++ init_screen::l#2 -- vbuxx=_inc_vbuxx
inx
// [35] if(init_screen::l#1!=$28) goto init_screen::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #$28
bne __b1_from___b1
// [36] phi from init_screen::@1 to init_screen::@2 [phi:init_screen::@1->init_screen::@2]
__b2_from___b1:
// [36] phi init_screen::m#2 = 0 [phi:init_screen::@1->init_screen::@2#0] -- vbuxx=vbuc1
ldx #0
// [36] phi init_screen::COLS#3 = (char *) 55296 [phi:init_screen::@1->init_screen::@2#1] -- pbuz1=pbuc1
lda #<$d800
sta.z COLS
lda #>$d800
sta.z COLS+1
jmp __b2
// [36] phi from init_screen::@2 to init_screen::@2 [phi:init_screen::@2->init_screen::@2]
__b2_from___b2:
// [36] phi init_screen::m#2 = init_screen::m#1 [phi:init_screen::@2->init_screen::@2#0] -- register_copy
// [36] phi init_screen::COLS#3 = init_screen::COLS#1 [phi:init_screen::@2->init_screen::@2#1] -- register_copy
jmp __b2
// init_screen::@2
__b2:
// [37] *init_screen::COLS#3 = init_screen::WHITE -- _deref_pbuz1=vbuc1
lda #WHITE
ldy #0
sta (COLS),y
// [38] init_screen::COLS#3[1] = init_screen::WHITE -- pbuz1_derefidx_vbuc1=vbuc2
lda #WHITE
ldy #1
sta (COLS),y
// [39] init_screen::COLS#3[2] = init_screen::WHITE -- pbuz1_derefidx_vbuc1=vbuc2
lda #WHITE
ldy #2
sta (COLS),y
// [40] init_screen::COLS#3[3] = init_screen::WHITE -- pbuz1_derefidx_vbuc1=vbuc2
lda #WHITE
ldy #3
sta (COLS),y
// [41] init_screen::COLS#1 = init_screen::COLS#3 + $28 -- pbuz1=pbuz1_plus_vbuc1
lda #$28
clc
adc.z COLS
sta.z COLS
bcc !+
inc.z COLS+1
!:
// [42] init_screen::m#1 = ++ init_screen::m#2 -- vbuxx=_inc_vbuxx
inx
// [43] if(init_screen::m#1!=$19) goto init_screen::@2 -- vbuxx_neq_vbuc1_then_la1
cpx #$19
bne __b2_from___b2
jmp __breturn
// init_screen::@return
__breturn:
// [44] return
rts
}
// print_schar_at
// Print a signed char as hex at a specific screen position
// void print_schar_at(__zp(6) signed char b, __zp(2) char *at)
print_schar_at: {
.label b = 6
.label at = 2
// [46] if(print_schar_at::b#4<0) goto print_schar_at::@1 -- vbsz1_lt_0_then_la1
lda.z b
bmi __b1
jmp __b3
// print_schar_at::@3
__b3:
// [47] print_char_at::at#1 = print_schar_at::at#3
// [48] call print_char_at
// [65] phi from print_schar_at::@3 to print_char_at [phi:print_schar_at::@3->print_char_at]
print_char_at_from___b3:
// [65] phi print_char_at::at#4 = print_char_at::at#1 [phi:print_schar_at::@3->print_char_at#0] -- register_copy
// [65] phi print_char_at::ch#4 = ' ' [phi:print_schar_at::@3->print_char_at#1] -- vbuxx=vbuc1
ldx #' '
jsr print_char_at
// [49] phi from print_schar_at::@3 print_schar_at::@4 to print_schar_at::@2 [phi:print_schar_at::@3/print_schar_at::@4->print_schar_at::@2]
__b2_from___b3:
__b2_from___b4:
// [49] phi print_schar_at::b#6 = print_schar_at::b#4 [phi:print_schar_at::@3/print_schar_at::@4->print_schar_at::@2#0] -- register_copy
jmp __b2
// print_schar_at::@2
__b2:
// [50] print_uchar_at::at#0 = print_schar_at::at#3 + 1 -- pbuz1=pbuz1_plus_1
inc.z print_uchar_at.at
bne !+
inc.z print_uchar_at.at+1
!:
// [51] print_uchar_at::b#0 = (char)print_schar_at::b#6
// [52] call print_uchar_at
jsr print_uchar_at
jmp __breturn
// print_schar_at::@return
__breturn:
// [53] return
rts
// print_schar_at::@1
__b1:
// [54] print_char_at::at#0 = print_schar_at::at#3
// [55] call print_char_at
// [65] phi from print_schar_at::@1 to print_char_at [phi:print_schar_at::@1->print_char_at]
print_char_at_from___b1:
// [65] phi print_char_at::at#4 = print_char_at::at#0 [phi:print_schar_at::@1->print_char_at#0] -- register_copy
// [65] phi print_char_at::ch#4 = '-' [phi:print_schar_at::@1->print_char_at#1] -- vbuxx=vbuc1
ldx #'-'
jsr print_char_at
jmp __b4
// print_schar_at::@4
__b4:
// [56] print_schar_at::b#0 = - print_schar_at::b#4 -- vbsz1=_neg_vbsz1
lda.z b
eor #$ff
clc
adc #1
sta.z b
jmp __b2_from___b4
}
// fmul8
// __register(A) signed char fmul8(__zp($c) volatile signed char aa, __zp($b) volatile signed char bb)
fmul8: {
.label aa = $c
.label bb = $b
.label cc = 7
// [57] fmul8::cc = 0 -- vbsz1=vbsc1
lda #0
sta.z cc
// asm { ldaaa staA1+1 eor#$ff staA2+1 ldxbb sec A1: ldamulf_sqr1,x A2: sbcmulf_sqr2,x stacc }
lda aa
sta A1+1
eor #$ff
sta A2+1
ldx bb
sec
A1:
lda mulf_sqr1,x
A2:
sbc mulf_sqr2,x
sta cc
// [59] fmul8::return#1 = fmul8::cc -- vbsaa=vbsz1
lda.z cc
jmp __breturn
// fmul8::@return
__breturn:
// [60] fmul8::return#2 = fmul8::return#1
// [61] return
rts
}
// print_cls
// Clear the screen. Also resets current line/char cursor.
print_cls: {
// [63] call memset
// [77] phi from print_cls to memset [phi:print_cls->memset]
memset_from_print_cls:
jsr memset
jmp __breturn
// print_cls::@return
__breturn:
// [64] return
rts
}
// print_char_at
// Print a single char
// void print_char_at(__register(X) char ch, __zp(2) char *at)
print_char_at: {
.label at = 2
// [66] *print_char_at::at#4 = print_char_at::ch#4 -- _deref_pbuz1=vbuxx
txa
ldy #0
sta (at),y
jmp __breturn
// print_char_at::@return
__breturn:
// [67] return
rts
}
// print_uchar_at
// Print a char as HEX at a specific position
// void print_uchar_at(__zp(6) char b, __zp(2) char *at)
print_uchar_at: {
.label b = 6
.label at = 2
// [68] print_uchar_at::$0 = print_uchar_at::b#0 >> 4 -- vbuaa=vbuz1_ror_4
lda.z b
lsr
lsr
lsr
lsr
// [69] print_char_at::ch#2 = print_hextab[print_uchar_at::$0] -- vbuxx=pbuc1_derefidx_vbuaa
tay
ldx print_hextab,y
// [70] print_char_at::at#2 = print_uchar_at::at#0
// [71] call print_char_at
// Table of hexadecimal digits
// [65] phi from print_uchar_at to print_char_at [phi:print_uchar_at->print_char_at]
print_char_at_from_print_uchar_at:
// [65] phi print_char_at::at#4 = print_char_at::at#2 [phi:print_uchar_at->print_char_at#0] -- register_copy
// [65] phi print_char_at::ch#4 = print_char_at::ch#2 [phi:print_uchar_at->print_char_at#1] -- register_copy
jsr print_char_at
jmp __b1
// print_uchar_at::@1
__b1:
// [72] print_uchar_at::$2 = print_uchar_at::b#0 & $f -- vbuyy=vbuz1_band_vbuc1
lda #$f
and.z b
tay
// [73] print_char_at::at#3 = print_uchar_at::at#0 + 1 -- pbuz1=pbuz1_plus_1
inc.z print_char_at.at
bne !+
inc.z print_char_at.at+1
!:
// [74] print_char_at::ch#3 = print_hextab[print_uchar_at::$2] -- vbuxx=pbuc1_derefidx_vbuyy
ldx print_hextab,y
// [75] call print_char_at
// [65] phi from print_uchar_at::@1 to print_char_at [phi:print_uchar_at::@1->print_char_at]
print_char_at_from___b1:
// [65] phi print_char_at::at#4 = print_char_at::at#3 [phi:print_uchar_at::@1->print_char_at#0] -- register_copy
// [65] phi print_char_at::ch#4 = print_char_at::ch#3 [phi:print_uchar_at::@1->print_char_at#1] -- register_copy
jsr print_char_at
jmp __breturn
// print_uchar_at::@return
__breturn:
// [76] return
rts
}
// memset
// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
// void * memset(void *str, char c, unsigned int num)
memset: {
.const c = ' '
.const num = $3e8
.label str = print_screen
.label end = str+num
.label dst = 4
// [78] phi from memset to memset::@1 [phi:memset->memset::@1]
__b1_from_memset:
// [78] phi memset::dst#2 = (char *)memset::str#0 [phi:memset->memset::@1#0] -- pbuz1=pbuc1
lda #<str
sta.z dst
lda #>str
sta.z dst+1
jmp __b1
// memset::@1
__b1:
// [79] 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 #<end
bne __b2
jmp __breturn
// memset::@return
__breturn:
// [80] return
rts
// memset::@2
__b2:
// [81] *memset::dst#2 = memset::c#0 -- _deref_pbuz1=vbuc1
lda #c
ldy #0
sta (dst),y
// [82] memset::dst#1 = ++ memset::dst#2 -- pbuz1=_inc_pbuz1
inc.z dst
bne !+
inc.z dst+1
!:
// [78] phi from memset::@2 to memset::@1 [phi:memset::@2->memset::@1]
__b1_from___b2:
// [78] phi memset::dst#2 = memset::dst#1 [phi:memset::@2->memset::@1#0] -- register_copy
jmp __b1
}
// File Data
.segment Data
print_hextab: .text "0123456789abcdef"
vals: .byte -$5f, -$40, -$20, -$10, 0, $10, $20, $40, $5f
// mulf_sqr tables will contain f(x)=int(x*x) and g(x) = f(1-x).
// f(x) = >(( x * x ))
.align $100
mulf_sqr1:
.for(var i=0;i<$200;i++) {
.if(i<=159) { .byte round((i*i)/256) }
.if(i>159 && i<=351 ) { .byte round(((i-256)*(i-256))/256) }
.if(i>351) { .byte round(((512-i)*(512-i))/256) }
}
// g(x) = >((( 1 - x ) * ( 1 - x )))
.align $100
mulf_sqr2:
.for(var i=0;i<$200;i++) {
.if(i<=159) { .byte round((-i-1)*(-i-1)/256) }
.if(i>159 && i<=351 ) { .byte round(((255-i)*(255-i))/256) }
.if(i>351) { .byte round(((i-511)*(i-511))/256) }
}
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __b1
Removing instruction jmp __b5
Removing instruction jmp __b2
Removing instruction jmp __b6
Removing instruction jmp __b3
Removing instruction jmp __b7
Removing instruction jmp __b8
Removing instruction jmp __b4
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b2
Removing instruction jmp __breturn
Removing instruction jmp __b3
Removing instruction jmp __b2
Removing instruction jmp __breturn
Removing instruction jmp __b4
Removing instruction jmp __breturn
Removing instruction jmp __breturn
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda #WHITE
Removing instruction lda #WHITE
Removing instruction lda #WHITE
Removing instruction lda.z cc
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Replacing label __b1_from___b5 with __b1
Replacing label __b3_from___b8 with __b3
Replacing label __b2_from___b4 with __b2
Replacing label __b1_from___b1 with __b1
Replacing label __b2_from___b2 with __b2
Replacing label __b2_from___b4 with __b2
Removing instruction __b1_from___b5:
Removing instruction __b2_from___b4:
Removing instruction __b3_from___b8:
Removing instruction __b1_from___b1:
Removing instruction __b2_from___b2:
Removing instruction print_char_at_from___b3:
Removing instruction __b2_from___b3:
Removing instruction __b2_from___b4:
Removing instruction print_char_at_from___b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction init_screen_from_main:
Removing instruction __b1_from_main:
Removing instruction print_schar_at_from___b1:
Removing instruction __b5:
Removing instruction __b2_from___b5:
Removing instruction print_schar_at_from___b2:
Removing instruction __b6:
Removing instruction __b3_from___b6:
Removing instruction __b7:
Removing instruction print_schar_at_from___b7:
Removing instruction __b8:
Removing instruction __b4:
Removing instruction __breturn:
Removing instruction print_cls_from_init_screen:
Removing instruction __b1_from_init_screen:
Removing instruction __b2_from___b1:
Removing instruction __breturn:
Removing instruction __b3:
Removing instruction __breturn:
Removing instruction __b4:
Removing instruction __breturn:
Removing instruction memset_from_print_cls:
Removing instruction __breturn:
Removing instruction __breturn:
Removing instruction print_char_at_from_print_uchar_at:
Removing instruction __b1:
Removing instruction print_char_at_from___b1:
Removing instruction __breturn:
Removing instruction __b1_from_memset:
Removing instruction __breturn:
Removing instruction __b1_from___b2:
Succesful ASM optimization Pass5UnusedLabelElimination
Removing instruction jmp __b1
Removing instruction jmp __b2
Removing instruction jmp __b3
Removing instruction jmp __b1
Removing instruction jmp __b2
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda #9
Succesful ASM optimization Pass5UnnecesaryLoadElimination
FINAL SYMBOL TABLE
__constant char RADIX::BINARY = 2
__constant char RADIX::DECIMAL = $a
__constant char RADIX::HEXADECIMAL = $10
__constant char RADIX::OCTAL = 8
signed char fmul8(volatile signed char aa , volatile signed char bb)
__loadstore volatile signed char fmul8::aa // zp[1]:12 33.666666666666664
__loadstore volatile signed char fmul8::bb // zp[1]:11 50.5
__loadstore volatile signed char fmul8::cc // zp[1]:7 1001.0
signed char fmul8::return
signed char fmul8::return#0 // reg byte a 202.0
signed char fmul8::return#1 // reg byte a 2002.0
signed char fmul8::return#2 // reg byte a 367.33333333333337
void init_screen()
char *init_screen::COLS
char *init_screen::COLS#1 // COLS zp[2]:2 67.33333333333333
char *init_screen::COLS#3 // COLS zp[2]:2 121.2
__constant char init_screen::WHITE = 1
char init_screen::l
char init_screen::l#1 // reg byte x 151.5
char init_screen::l#2 // reg byte x 151.5
char init_screen::m
char init_screen::m#1 // reg byte x 151.5
char init_screen::m#2 // reg byte x 33.666666666666664
void main()
char *main::at
char *main::at#1 // at zp[2]:17 7.333333333333333
char *main::at#12 // at_2 zp[2]:8 22.0
char *main::at#2 // at_1 zp[2]:13 2.3157894736842106
char *main::at#3 // at_2 zp[2]:8 27.545454545454547
char *main::at#4 // at zp[2]:17 8.25
char *main::at#6 // at_2 zp[2]:8 213.0
char *main::at_line
char *main::at_line#2 // at_line zp[2]:13 22.0
char main::i
char main::i#1 // i zp[1]:15 16.5
char main::i#2 // i zp[1]:15 7.444444444444445
char main::j
char main::j#1 // j zp[1]:10 151.5
char main::j#2 // j zp[1]:10 30.299999999999997
char main::k
char main::k#1 // k zp[1]:16 16.5
char main::k#2 // k zp[1]:16 6.6000000000000005
signed char main::r
signed char main::r#0 // reg byte a 202.0
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 mulf_sqr1[$200] = kickasm {{ .for(var i=0;i<$200;i++) {
.if(i<=159) { .byte round((i*i)/256) }
.if(i>159 && i<=351 ) { .byte round(((i-256)*(i-256))/256) }
.if(i>351) { .byte round(((512-i)*(512-i))/256) }
}
}}
__constant char mulf_sqr2[$200] = kickasm {{ .for(var i=0;i<$200;i++) {
.if(i<=159) { .byte round((-i-1)*(-i-1)/256) }
.if(i>159 && i<=351 ) { .byte round(((255-i)*(255-i))/256) }
.if(i>351) { .byte round(((i-511)*(i-511))/256) }
}
}}
void print_char_at(char ch , char *at)
char *print_char_at::at
char *print_char_at::at#0 // at zp[2]:2 2002.0
char *print_char_at::at#1 // at zp[2]:2 2002.0
char *print_char_at::at#2 // at zp[2]:2 20002.0
char *print_char_at::at#3 // at zp[2]:2 10001.0
char *print_char_at::at#4 // at zp[2]:2 122005.0
char print_char_at::ch
char print_char_at::ch#2 // reg byte x 10001.0
char print_char_at::ch#3 // reg byte x 20002.0
char print_char_at::ch#4 // reg byte x 120003.0
void print_cls()
__constant const char print_hextab[] = "0123456789abcdef"z
void print_schar_at(signed char b , char *at)
char *print_schar_at::at
char *print_schar_at::at#0 // at zp[2]:2 22.0
char *print_schar_at::at#1 // at zp[2]:2 22.0
char *print_schar_at::at#2 // at zp[2]:2 202.0
char *print_schar_at::at#3 // at zp[2]:2 390.75
signed char print_schar_at::b
signed char print_schar_at::b#0 // b zp[1]:6 2002.0
signed char print_schar_at::b#1 // b zp[1]:6 11.0
signed char print_schar_at::b#2 // b zp[1]:6 11.0
signed char print_schar_at::b#3 // b zp[1]:6 101.0
signed char print_schar_at::b#4 // b zp[1]:6 521.0
signed char print_schar_at::b#6 // b zp[1]:6 1001.0
char *print_screen
__constant char *print_screen#0 = (char *) 1024 // print_screen
void print_uchar_at(char b , char *at)
char print_uchar_at::$0 // reg byte a 20002.0
char print_uchar_at::$2 // reg byte y 10001.0
char *print_uchar_at::at
char *print_uchar_at::at#0 // at zp[2]:2 3000.4285714285716
char print_uchar_at::b
char print_uchar_at::b#0 // b zp[1]:6 4200.6
__constant signed char vals[] = { -$5f, -$40, -$20, -$10, 0, $10, $20, $40, $5f }
zp[1]:16 [ main::k#2 main::k#1 ]
zp[2]:17 [ main::at#4 main::at#1 ]
zp[2]:13 [ main::at_line#2 main::at#2 ]
zp[1]:15 [ main::i#2 main::i#1 ]
zp[2]:8 [ main::at#6 main::at#3 main::at#12 ]
zp[1]:10 [ main::j#2 main::j#1 ]
reg byte x [ init_screen::l#2 init_screen::l#1 ]
reg byte x [ init_screen::m#2 init_screen::m#1 ]
zp[2]:2 [ print_schar_at::at#3 print_schar_at::at#0 print_schar_at::at#1 print_schar_at::at#2 print_char_at::at#4 print_char_at::at#0 print_char_at::at#1 print_char_at::at#2 print_char_at::at#3 print_uchar_at::at#0 init_screen::COLS#3 init_screen::COLS#1 ]
zp[1]:6 [ print_schar_at::b#6 print_schar_at::b#0 print_schar_at::b#4 print_schar_at::b#1 print_schar_at::b#2 print_schar_at::b#3 print_uchar_at::b#0 ]
reg byte x [ print_char_at::ch#4 print_char_at::ch#2 print_char_at::ch#3 ]
zp[2]:4 [ memset::dst#2 memset::dst#1 ]
zp[1]:12 [ fmul8::aa ]
zp[1]:11 [ fmul8::bb ]
reg byte a [ fmul8::return#0 ]
reg byte a [ main::r#0 ]
zp[1]:7 [ fmul8::cc ]
reg byte a [ fmul8::return#1 ]
reg byte a [ fmul8::return#2 ]
reg byte a [ print_uchar_at::$0 ]
reg byte y [ print_uchar_at::$2 ]
FINAL ASSEMBLER
Score: 10748
// File Comments
// Seriously fast multiply 8-bit version (8bit*8bit=8bit)
// Multiplies two signed 8-bit numbers and results in an 8-bit number
// C=A*B, A in [-64;64], B in [-96;95], C in [-96;95] - 64 acts a 1 (X*64=X)
// Uses the formula a*b = (a+b)^2/4 - (a-b)^2/4
// See the following for information about the method
// - http://codebase64.org/doku.php?id=base:seriously_fast_multiplication
// - http://codebase64.org/doku.php?id=magazines:chacking16
// Upstart
// Commodore 64 PRG executable file
.file [name="fastmultiply8.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
.label print_screen = $400
.segment Code
// main
main: {
.label at = $11
.label k = $10
.label at_1 = $d
.label at_2 = 8
.label j = $a
.label i = $f
.label at_line = $d
// init_screen()
// [1] call init_screen
// [30] phi from main to init_screen [phi:main->init_screen]
jsr init_screen
// [2] phi from main to main::@1 [phi:main->main::@1]
// [2] phi main::at#4 = (char *) 1024+4 [phi:main->main::@1#0] -- pbuz1=pbuc1
lda #<$400+4
sta.z at
lda #>$400+4
sta.z at+1
// [2] phi main::k#2 = 0 [phi:main->main::@1#1] -- vbuz1=vbuc1
lda #0
sta.z k
// [2] phi from main::@5 to main::@1 [phi:main::@5->main::@1]
// [2] phi main::at#4 = main::at#1 [phi:main::@5->main::@1#0] -- register_copy
// [2] phi main::k#2 = main::k#1 [phi:main::@5->main::@1#1] -- register_copy
// main::@1
__b1:
// print_schar_at(vals[k], at)
// [3] print_schar_at::b#1 = vals[main::k#2] -- vbsz1=pbsc1_derefidx_vbuz2
ldy.z k
lda vals,y
sta.z print_schar_at.b
// [4] print_schar_at::at#0 = main::at#4 -- pbuz1=pbuz2
lda.z at
sta.z print_schar_at.at
lda.z at+1
sta.z print_schar_at.at+1
// [5] call print_schar_at
// [45] phi from main::@1 to print_schar_at [phi:main::@1->print_schar_at]
// [45] phi print_schar_at::at#3 = print_schar_at::at#0 [phi:main::@1->print_schar_at#0] -- register_copy
// [45] phi print_schar_at::b#4 = print_schar_at::b#1 [phi:main::@1->print_schar_at#1] -- register_copy
jsr print_schar_at
// main::@5
// at += 4
// [6] main::at#1 = main::at#4 + 4 -- pbuz1=pbuz1_plus_vbuc1
lda #4
clc
adc.z at
sta.z at
bcc !+
inc.z at+1
!:
// for(char k: 0..8)
// [7] main::k#1 = ++ main::k#2 -- vbuz1=_inc_vbuz1
inc.z k
// [8] if(main::k#1!=9) goto main::@1 -- vbuz1_neq_vbuc1_then_la1
lda #9
cmp.z k
bne __b1
// [9] phi from main::@5 to main::@2 [phi:main::@5->main::@2]
// [9] phi main::i#2 = 0 [phi:main::@5->main::@2#0] -- vbuz1=vbuc1
lda #0
sta.z i
// [9] phi main::at_line#2 = (char *) 1024 [phi:main::@5->main::@2#1] -- pbuz1=pbuc1
lda #<$400
sta.z at_line
lda #>$400
sta.z at_line+1
// [9] phi from main::@4 to main::@2 [phi:main::@4->main::@2]
// [9] phi main::i#2 = main::i#1 [phi:main::@4->main::@2#0] -- register_copy
// [9] phi main::at_line#2 = main::at#2 [phi:main::@4->main::@2#1] -- register_copy
// main::@2
__b2:
// at_line +=40
// [10] main::at#2 = main::at_line#2 + $28 -- pbuz1=pbuz1_plus_vbuc1
lda #$28
clc
adc.z at_1
sta.z at_1
bcc !+
inc.z at_1+1
!:
// print_schar_at(vals[i], at)
// [11] print_schar_at::b#2 = vals[main::i#2] -- vbsz1=pbsc1_derefidx_vbuz2
ldy.z i
lda vals,y
sta.z print_schar_at.b
// [12] print_schar_at::at#1 = main::at#2 -- pbuz1=pbuz2
lda.z at_1
sta.z print_schar_at.at
lda.z at_1+1
sta.z print_schar_at.at+1
// [13] call print_schar_at
// [45] phi from main::@2 to print_schar_at [phi:main::@2->print_schar_at]
// [45] phi print_schar_at::at#3 = print_schar_at::at#1 [phi:main::@2->print_schar_at#0] -- register_copy
// [45] phi print_schar_at::b#4 = print_schar_at::b#2 [phi:main::@2->print_schar_at#1] -- register_copy
jsr print_schar_at
// main::@6
// [14] main::at#12 = main::at#2 -- pbuz1=pbuz2
lda.z at_1
sta.z at_2
lda.z at_1+1
sta.z at_2+1
// [15] phi from main::@6 to main::@3 [phi:main::@6->main::@3]
// [15] phi main::j#2 = 0 [phi:main::@6->main::@3#0] -- vbuz1=vbuc1
lda #0
sta.z j
// [15] phi main::at#6 = main::at#12 [phi:main::@6->main::@3#1] -- register_copy
// [15] phi from main::@8 to main::@3 [phi:main::@8->main::@3]
// [15] phi main::j#2 = main::j#1 [phi:main::@8->main::@3#0] -- register_copy
// [15] phi main::at#6 = main::at#3 [phi:main::@8->main::@3#1] -- register_copy
// main::@3
__b3:
// at += 4
// [16] main::at#3 = main::at#6 + 4 -- pbuz1=pbuz1_plus_vbuc1
lda #4
clc
adc.z at_2
sta.z at_2
bcc !+
inc.z at_2+1
!:
// signed char r = fmul8(vals[i], vals[j])
// [17] fmul8::aa = vals[main::i#2] -- vbsz1=pbsc1_derefidx_vbuz2
ldy.z i
lda vals,y
sta.z fmul8.aa
// [18] fmul8::bb = vals[main::j#2] -- vbsz1=pbsc1_derefidx_vbuz2
ldy.z j
lda vals,y
sta.z fmul8.bb
// [19] call fmul8
jsr fmul8
// [20] fmul8::return#0 = fmul8::return#2
// main::@7
// [21] main::r#0 = fmul8::return#0
// print_schar_at(r, at)
// [22] print_schar_at::b#3 = main::r#0 -- vbsz1=vbsaa
sta.z print_schar_at.b
// [23] print_schar_at::at#2 = main::at#3 -- pbuz1=pbuz2
lda.z at_2
sta.z print_schar_at.at
lda.z at_2+1
sta.z print_schar_at.at+1
// [24] call print_schar_at
// [45] phi from main::@7 to print_schar_at [phi:main::@7->print_schar_at]
// [45] phi print_schar_at::at#3 = print_schar_at::at#2 [phi:main::@7->print_schar_at#0] -- register_copy
// [45] phi print_schar_at::b#4 = print_schar_at::b#3 [phi:main::@7->print_schar_at#1] -- register_copy
jsr print_schar_at
// main::@8
// for(char j: 0..8)
// [25] main::j#1 = ++ main::j#2 -- vbuz1=_inc_vbuz1
inc.z j
// [26] if(main::j#1!=9) goto main::@3 -- vbuz1_neq_vbuc1_then_la1
lda #9
cmp.z j
bne __b3
// main::@4
// for(char i: 0..8)
// [27] main::i#1 = ++ main::i#2 -- vbuz1=_inc_vbuz1
inc.z i
// [28] if(main::i#1!=9) goto main::@2 -- vbuz1_neq_vbuc1_then_la1
cmp.z i
bne __b2
// main::@return
// }
// [29] return
rts
}
// init_screen
init_screen: {
.const WHITE = 1
.label COLS = 2
// print_cls()
// [31] call print_cls
// [62] phi from init_screen to print_cls [phi:init_screen->print_cls]
jsr print_cls
// [32] phi from init_screen to init_screen::@1 [phi:init_screen->init_screen::@1]
// [32] phi init_screen::l#2 = 0 [phi:init_screen->init_screen::@1#0] -- vbuxx=vbuc1
ldx #0
// [32] phi from init_screen::@1 to init_screen::@1 [phi:init_screen::@1->init_screen::@1]
// [32] phi init_screen::l#2 = init_screen::l#1 [phi:init_screen::@1->init_screen::@1#0] -- register_copy
// init_screen::@1
__b1:
// COLS[l] = WHITE
// [33] ((char *) 55296)[init_screen::l#2] = init_screen::WHITE -- pbuc1_derefidx_vbuxx=vbuc2
lda #WHITE
sta $d800,x
// for(char l: 0..39)
// [34] init_screen::l#1 = ++ init_screen::l#2 -- vbuxx=_inc_vbuxx
inx
// [35] if(init_screen::l#1!=$28) goto init_screen::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #$28
bne __b1
// [36] phi from init_screen::@1 to init_screen::@2 [phi:init_screen::@1->init_screen::@2]
// [36] phi init_screen::m#2 = 0 [phi:init_screen::@1->init_screen::@2#0] -- vbuxx=vbuc1
ldx #0
// [36] phi init_screen::COLS#3 = (char *) 55296 [phi:init_screen::@1->init_screen::@2#1] -- pbuz1=pbuc1
lda #<$d800
sta.z COLS
lda #>$d800
sta.z COLS+1
// [36] phi from init_screen::@2 to init_screen::@2 [phi:init_screen::@2->init_screen::@2]
// [36] phi init_screen::m#2 = init_screen::m#1 [phi:init_screen::@2->init_screen::@2#0] -- register_copy
// [36] phi init_screen::COLS#3 = init_screen::COLS#1 [phi:init_screen::@2->init_screen::@2#1] -- register_copy
// init_screen::@2
__b2:
// COLS[0] = WHITE
// [37] *init_screen::COLS#3 = init_screen::WHITE -- _deref_pbuz1=vbuc1
lda #WHITE
ldy #0
sta (COLS),y
// COLS[1] = WHITE
// [38] init_screen::COLS#3[1] = init_screen::WHITE -- pbuz1_derefidx_vbuc1=vbuc2
ldy #1
sta (COLS),y
// COLS[2] = WHITE
// [39] init_screen::COLS#3[2] = init_screen::WHITE -- pbuz1_derefidx_vbuc1=vbuc2
ldy #2
sta (COLS),y
// COLS[3] = WHITE
// [40] init_screen::COLS#3[3] = init_screen::WHITE -- pbuz1_derefidx_vbuc1=vbuc2
ldy #3
sta (COLS),y
// COLS += 40
// [41] init_screen::COLS#1 = init_screen::COLS#3 + $28 -- pbuz1=pbuz1_plus_vbuc1
lda #$28
clc
adc.z COLS
sta.z COLS
bcc !+
inc.z COLS+1
!:
// for(char m: 0..24)
// [42] init_screen::m#1 = ++ init_screen::m#2 -- vbuxx=_inc_vbuxx
inx
// [43] if(init_screen::m#1!=$19) goto init_screen::@2 -- vbuxx_neq_vbuc1_then_la1
cpx #$19
bne __b2
// init_screen::@return
// }
// [44] return
rts
}
// print_schar_at
// Print a signed char as hex at a specific screen position
// void print_schar_at(__zp(6) signed char b, __zp(2) char *at)
print_schar_at: {
.label b = 6
.label at = 2
// if(b<0)
// [46] if(print_schar_at::b#4<0) goto print_schar_at::@1 -- vbsz1_lt_0_then_la1
lda.z b
bmi __b1
// print_schar_at::@3
// print_char_at(' ', at)
// [47] print_char_at::at#1 = print_schar_at::at#3
// [48] call print_char_at
// [65] phi from print_schar_at::@3 to print_char_at [phi:print_schar_at::@3->print_char_at]
// [65] phi print_char_at::at#4 = print_char_at::at#1 [phi:print_schar_at::@3->print_char_at#0] -- register_copy
// [65] phi print_char_at::ch#4 = ' ' [phi:print_schar_at::@3->print_char_at#1] -- vbuxx=vbuc1
ldx #' '
jsr print_char_at
// [49] phi from print_schar_at::@3 print_schar_at::@4 to print_schar_at::@2 [phi:print_schar_at::@3/print_schar_at::@4->print_schar_at::@2]
// [49] phi print_schar_at::b#6 = print_schar_at::b#4 [phi:print_schar_at::@3/print_schar_at::@4->print_schar_at::@2#0] -- register_copy
// print_schar_at::@2
__b2:
// print_uchar_at((char)b, at+1)
// [50] print_uchar_at::at#0 = print_schar_at::at#3 + 1 -- pbuz1=pbuz1_plus_1
inc.z print_uchar_at.at
bne !+
inc.z print_uchar_at.at+1
!:
// [51] print_uchar_at::b#0 = (char)print_schar_at::b#6
// [52] call print_uchar_at
jsr print_uchar_at
// print_schar_at::@return
// }
// [53] return
rts
// print_schar_at::@1
__b1:
// print_char_at('-', at)
// [54] print_char_at::at#0 = print_schar_at::at#3
// [55] call print_char_at
// [65] phi from print_schar_at::@1 to print_char_at [phi:print_schar_at::@1->print_char_at]
// [65] phi print_char_at::at#4 = print_char_at::at#0 [phi:print_schar_at::@1->print_char_at#0] -- register_copy
// [65] phi print_char_at::ch#4 = '-' [phi:print_schar_at::@1->print_char_at#1] -- vbuxx=vbuc1
ldx #'-'
jsr print_char_at
// print_schar_at::@4
// b = -b
// [56] print_schar_at::b#0 = - print_schar_at::b#4 -- vbsz1=_neg_vbsz1
lda.z b
eor #$ff
clc
adc #1
sta.z b
jmp __b2
}
// fmul8
// __register(A) signed char fmul8(__zp($c) volatile signed char aa, __zp($b) volatile signed char bb)
fmul8: {
.label aa = $c
.label bb = $b
.label cc = 7
// signed char cc
// [57] fmul8::cc = 0 -- vbsz1=vbsc1
lda #0
sta.z cc
// asm
// asm { ldaaa staA1+1 eor#$ff staA2+1 ldxbb sec A1: ldamulf_sqr1,x A2: sbcmulf_sqr2,x stacc }
lda aa
sta A1+1
eor #$ff
sta A2+1
ldx bb
sec
A1:
lda mulf_sqr1,x
A2:
sbc mulf_sqr2,x
sta cc
// return cc;
// [59] fmul8::return#1 = fmul8::cc -- vbsaa=vbsz1
// fmul8::@return
// }
// [60] fmul8::return#2 = fmul8::return#1
// [61] return
rts
}
// print_cls
// Clear the screen. Also resets current line/char cursor.
print_cls: {
// memset(print_screen, ' ', 1000)
// [63] call memset
// [77] phi from print_cls to memset [phi:print_cls->memset]
jsr memset
// print_cls::@return
// }
// [64] return
rts
}
// print_char_at
// Print a single char
// void print_char_at(__register(X) char ch, __zp(2) char *at)
print_char_at: {
.label at = 2
// *(at) = ch
// [66] *print_char_at::at#4 = print_char_at::ch#4 -- _deref_pbuz1=vbuxx
txa
ldy #0
sta (at),y
// print_char_at::@return
// }
// [67] return
rts
}
// print_uchar_at
// Print a char as HEX at a specific position
// void print_uchar_at(__zp(6) char b, __zp(2) char *at)
print_uchar_at: {
.label b = 6
.label at = 2
// b>>4
// [68] print_uchar_at::$0 = print_uchar_at::b#0 >> 4 -- vbuaa=vbuz1_ror_4
lda.z b
lsr
lsr
lsr
lsr
// print_char_at(print_hextab[b>>4], at)
// [69] print_char_at::ch#2 = print_hextab[print_uchar_at::$0] -- vbuxx=pbuc1_derefidx_vbuaa
tay
ldx print_hextab,y
// [70] print_char_at::at#2 = print_uchar_at::at#0
// [71] call print_char_at
// Table of hexadecimal digits
// [65] phi from print_uchar_at to print_char_at [phi:print_uchar_at->print_char_at]
// [65] phi print_char_at::at#4 = print_char_at::at#2 [phi:print_uchar_at->print_char_at#0] -- register_copy
// [65] phi print_char_at::ch#4 = print_char_at::ch#2 [phi:print_uchar_at->print_char_at#1] -- register_copy
jsr print_char_at
// print_uchar_at::@1
// b&0xf
// [72] print_uchar_at::$2 = print_uchar_at::b#0 & $f -- vbuyy=vbuz1_band_vbuc1
lda #$f
and.z b
tay
// print_char_at(print_hextab[b&0xf], at+1)
// [73] print_char_at::at#3 = print_uchar_at::at#0 + 1 -- pbuz1=pbuz1_plus_1
inc.z print_char_at.at
bne !+
inc.z print_char_at.at+1
!:
// [74] print_char_at::ch#3 = print_hextab[print_uchar_at::$2] -- vbuxx=pbuc1_derefidx_vbuyy
ldx print_hextab,y
// [75] call print_char_at
// [65] phi from print_uchar_at::@1 to print_char_at [phi:print_uchar_at::@1->print_char_at]
// [65] phi print_char_at::at#4 = print_char_at::at#3 [phi:print_uchar_at::@1->print_char_at#0] -- register_copy
// [65] phi print_char_at::ch#4 = print_char_at::ch#3 [phi:print_uchar_at::@1->print_char_at#1] -- register_copy
jsr print_char_at
// print_uchar_at::@return
// }
// [76] return
rts
}
// memset
// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
// void * memset(void *str, char c, unsigned int num)
memset: {
.const c = ' '
.const num = $3e8
.label str = print_screen
.label end = str+num
.label dst = 4
// [78] phi from memset to memset::@1 [phi:memset->memset::@1]
// [78] phi memset::dst#2 = (char *)memset::str#0 [phi:memset->memset::@1#0] -- pbuz1=pbuc1
lda #<str
sta.z dst
lda #>str
sta.z dst+1
// memset::@1
__b1:
// for(char* dst = str; dst!=end; dst++)
// [79] 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 #<end
bne __b2
// memset::@return
// }
// [80] return
rts
// memset::@2
__b2:
// *dst = c
// [81] *memset::dst#2 = memset::c#0 -- _deref_pbuz1=vbuc1
lda #c
ldy #0
sta (dst),y
// for(char* dst = str; dst!=end; dst++)
// [82] memset::dst#1 = ++ memset::dst#2 -- pbuz1=_inc_pbuz1
inc.z dst
bne !+
inc.z dst+1
!:
// [78] phi from memset::@2 to memset::@1 [phi:memset::@2->memset::@1]
// [78] phi memset::dst#2 = memset::dst#1 [phi:memset::@2->memset::@1#0] -- register_copy
jmp __b1
}
// File Data
.segment Data
print_hextab: .text "0123456789abcdef"
vals: .byte -$5f, -$40, -$20, -$10, 0, $10, $20, $40, $5f
// mulf_sqr tables will contain f(x)=int(x*x) and g(x) = f(1-x).
// f(x) = >(( x * x ))
.align $100
mulf_sqr1:
.for(var i=0;i<$200;i++) {
.if(i<=159) { .byte round((i*i)/256) }
.if(i>159 && i<=351 ) { .byte round(((i-256)*(i-256))/256) }
.if(i>351) { .byte round(((512-i)*(512-i))/256) }
}
// g(x) = >((( 1 - x ) * ( 1 - x )))
.align $100
mulf_sqr2:
.for(var i=0;i<$200;i++) {
.if(i<=159) { .byte round((-i-1)*(-i-1)/256) }
.if(i>159 && i<=351 ) { .byte round(((255-i)*(255-i))/256) }
.if(i>351) { .byte round(((i-511)*(i-511))/256) }
}