kickc/src/test/ref/min-fmul-16.log

2555 lines
124 KiB
Plaintext

Inlined call call __init
Eliminating unused variable with no statement main::$3
CONTROL FLOW GRAPH SSA
void print_uint(unsigned int w)
print_uint: scope:[print_uint] from print_ulong print_ulong::@1
print_char_cursor#36 = phi( print_ulong/print_char_cursor#37, print_ulong::@1/print_char_cursor#3 )
print_uint::w#2 = phi( print_ulong/print_uint::w#0, print_ulong::@1/print_uint::w#1 )
print_uint::$0 = byte1 print_uint::w#2
print_uchar::b#0 = print_uint::$0
call print_uchar
to:print_uint::@1
print_uint::@1: scope:[print_uint] from print_uint
print_uint::w#3 = phi( print_uint/print_uint::w#2 )
print_char_cursor#19 = phi( print_uint/print_char_cursor#8 )
print_char_cursor#0 = print_char_cursor#19
print_uint::$2 = byte0 print_uint::w#3
print_uchar::b#1 = print_uint::$2
call print_uchar
to:print_uint::@2
print_uint::@2: scope:[print_uint] from print_uint::@1
print_char_cursor#20 = phi( print_uint::@1/print_char_cursor#8 )
print_char_cursor#1 = print_char_cursor#20
to:print_uint::@return
print_uint::@return: scope:[print_uint] from print_uint::@2
print_char_cursor#21 = phi( print_uint::@2/print_char_cursor#1 )
print_char_cursor#2 = print_char_cursor#21
return
to:@return
void print_ulong(unsigned long dw)
print_ulong: scope:[print_ulong] from main::@5
print_char_cursor#37 = phi( main::@5/print_char_cursor#39 )
print_ulong::dw#1 = phi( main::@5/print_ulong::dw#0 )
print_ulong::$0 = word1 print_ulong::dw#1
print_uint::w#0 = print_ulong::$0
call print_uint
to:print_ulong::@1
print_ulong::@1: scope:[print_ulong] from print_ulong
print_ulong::dw#2 = phi( print_ulong/print_ulong::dw#1 )
print_char_cursor#22 = phi( print_ulong/print_char_cursor#2 )
print_char_cursor#3 = print_char_cursor#22
print_ulong::$2 = word0 print_ulong::dw#2
print_uint::w#1 = print_ulong::$2
call print_uint
to:print_ulong::@2
print_ulong::@2: scope:[print_ulong] from print_ulong::@1
print_char_cursor#23 = phi( print_ulong::@1/print_char_cursor#2 )
print_char_cursor#4 = print_char_cursor#23
to:print_ulong::@return
print_ulong::@return: scope:[print_ulong] from print_ulong::@2
print_char_cursor#24 = phi( print_ulong::@2/print_char_cursor#4 )
print_char_cursor#5 = print_char_cursor#24
return
to:@return
void print_uchar(char b)
print_uchar: scope:[print_uchar] from print_uint print_uint::@1
print_char_cursor#38 = phi( print_uint/print_char_cursor#36, print_uint::@1/print_char_cursor#0 )
print_uchar::b#2 = phi( print_uint/print_uchar::b#0, print_uint::@1/print_uchar::b#1 )
print_uchar::$0 = print_uchar::b#2 >> 4
print_char::ch#0 = print_hextab[print_uchar::$0]
call print_char
to:print_uchar::@1
print_uchar::@1: scope:[print_uchar] from print_uchar
print_uchar::b#3 = phi( print_uchar/print_uchar::b#2 )
print_char_cursor#25 = phi( print_uchar/print_char_cursor#10 )
print_char_cursor#6 = print_char_cursor#25
print_uchar::$2 = print_uchar::b#3 & $f
print_char::ch#1 = print_hextab[print_uchar::$2]
call print_char
to:print_uchar::@2
print_uchar::@2: scope:[print_uchar] from print_uchar::@1
print_char_cursor#26 = phi( print_uchar::@1/print_char_cursor#10 )
print_char_cursor#7 = print_char_cursor#26
to:print_uchar::@return
print_uchar::@return: scope:[print_uchar] from print_uchar::@2
print_char_cursor#27 = phi( print_uchar::@2/print_char_cursor#7 )
print_char_cursor#8 = print_char_cursor#27
return
to:@return
void print_char(char ch)
print_char: scope:[print_char] from print_uchar print_uchar::@1
print_char_cursor#28 = phi( print_uchar/print_char_cursor#38, print_uchar::@1/print_char_cursor#6 )
print_char::ch#2 = phi( print_uchar/print_char::ch#0, print_uchar::@1/print_char::ch#1 )
*print_char_cursor#28 = print_char::ch#2
print_char_cursor#9 = ++ print_char_cursor#28
to:print_char::@return
print_char::@return: scope:[print_char] from print_char
print_char_cursor#29 = phi( print_char/print_char_cursor#9 )
print_char_cursor#10 = print_char_cursor#29
return
to:@return
void print_set_screen(char *screen)
print_set_screen: scope:[print_set_screen] from main::@6
print_set_screen::screen#1 = phi( main::@6/print_set_screen::screen#0 )
print_screen#0 = print_set_screen::screen#1
print_line_cursor#0 = print_screen#0
print_char_cursor#11 = print_line_cursor#0
to:print_set_screen::@return
print_set_screen::@return: scope:[print_set_screen] from print_set_screen
print_char_cursor#30 = phi( print_set_screen/print_char_cursor#11 )
print_line_cursor#7 = phi( print_set_screen/print_line_cursor#0 )
print_screen#7 = phi( print_set_screen/print_screen#0 )
print_screen#1 = print_screen#7
print_line_cursor#1 = print_line_cursor#7
print_char_cursor#12 = print_char_cursor#30
return
to:@return
void main()
main: scope:[main] from __start::@1
print_line_cursor#17 = phi( __start::@1/print_line_cursor#14 )
print_screen#17 = phi( __start::@1/print_screen#14 )
print_char_cursor#44 = phi( __start::@1/print_char_cursor#41 )
call mulf_init
to:main::@4
main::@4: scope:[main] from main
print_line_cursor#15 = phi( main/print_line_cursor#17 )
print_screen#15 = phi( main/print_screen#17 )
print_char_cursor#42 = phi( main/print_char_cursor#44 )
asm { sei }
to:main::@1
main::@1: scope:[main] from main::@4 main::@7
print_line_cursor#13 = phi( main::@4/print_line_cursor#15, main::@7/print_line_cursor#2 )
print_screen#13 = phi( main::@4/print_screen#15, main::@7/print_screen#2 )
print_char_cursor#40 = phi( main::@4/print_char_cursor#42, main::@7/print_char_cursor#14 )
if(true) goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1 main::@2
print_line_cursor#19 = phi( main::@1/print_line_cursor#13, main::@2/print_line_cursor#19 )
print_screen#19 = phi( main::@1/print_screen#13, main::@2/print_screen#19 )
print_char_cursor#45 = phi( main::@1/print_char_cursor#40, main::@2/print_char_cursor#45 )
main::$1 = *RASTER != $ff
if(main::$1) goto main::@2
to:main::@3
main::@3: scope:[main] from main::@2
print_line_cursor#18 = phi( main::@2/print_line_cursor#19 )
print_screen#18 = phi( main::@2/print_screen#19 )
print_char_cursor#43 = phi( main::@2/print_char_cursor#45 )
*BORDER_COLOR = ++ *BORDER_COLOR
mulf16u::a#0 = main::a
mulf16u::b#0 = main::b
call mulf16u
mulf16u::return#0 = mulf16u::return#2
to:main::@5
main::@5: scope:[main] from main::@3
print_line_cursor#16 = phi( main::@3/print_line_cursor#18 )
print_screen#16 = phi( main::@3/print_screen#18 )
print_char_cursor#39 = phi( main::@3/print_char_cursor#43 )
mulf16u::return#3 = phi( main::@3/mulf16u::return#0 )
main::r#0 = mulf16u::return#3
*BORDER_COLOR = -- *BORDER_COLOR
print_ulong::dw#0 = main::r#0
call print_ulong
to:main::@6
main::@6: scope:[main] from main::@5
print_line_cursor#12 = phi( main::@5/print_line_cursor#16 )
print_screen#12 = phi( main::@5/print_screen#16 )
print_char_cursor#31 = phi( main::@5/print_char_cursor#5 )
print_char_cursor#13 = print_char_cursor#31
print_set_screen::screen#0 = SCREEN
call print_set_screen
to:main::@7
main::@7: scope:[main] from main::@6
print_char_cursor#32 = phi( main::@6/print_char_cursor#12 )
print_line_cursor#8 = phi( main::@6/print_line_cursor#1 )
print_screen#8 = phi( main::@6/print_screen#1 )
print_screen#2 = print_screen#8
print_line_cursor#2 = print_line_cursor#8
print_char_cursor#14 = print_char_cursor#32
to:main::@1
main::@return: scope:[main] from main::@1
print_line_cursor#9 = phi( main::@1/print_line_cursor#13 )
print_screen#9 = phi( main::@1/print_screen#13 )
print_char_cursor#33 = phi( main::@1/print_char_cursor#40 )
print_char_cursor#15 = print_char_cursor#33
print_screen#3 = print_screen#9
print_line_cursor#3 = print_line_cursor#9
return
to:@return
void mulf_init()
mulf_init: scope:[mulf_init] from main
mulf_init::sqr#0 = 0
mulf_init::x_2#0 = 0
mulf_init::c#0 = 0
mulf_init::sqr1_hi#0 = mulf_sqr1_hi+1
mulf_init::sqr1_lo#0 = mulf_sqr1_lo+1
to:mulf_init::@1
mulf_init::@1: scope:[mulf_init] from mulf_init mulf_init::@4
mulf_init::x_2#5 = phi( mulf_init/mulf_init::x_2#0, mulf_init::@4/mulf_init::x_2#2 )
mulf_init::sqr1_hi#5 = phi( mulf_init/mulf_init::sqr1_hi#0, mulf_init::@4/mulf_init::sqr1_hi#1 )
mulf_init::sqr#6 = phi( mulf_init/mulf_init::sqr#0, mulf_init::@4/mulf_init::sqr#1 )
mulf_init::c#3 = phi( mulf_init/mulf_init::c#0, mulf_init::@4/mulf_init::c#4 )
mulf_init::sqr1_lo#2 = phi( mulf_init/mulf_init::sqr1_lo#0, mulf_init::@4/mulf_init::sqr1_lo#1 )
mulf_init::$0 = mulf_init::sqr1_lo#2 != mulf_sqr1_lo+$200
if(mulf_init::$0) goto mulf_init::@2
to:mulf_init::@3
mulf_init::@2: scope:[mulf_init] from mulf_init::@1
mulf_init::x_2#4 = phi( mulf_init::@1/mulf_init::x_2#5 )
mulf_init::sqr1_hi#3 = phi( mulf_init::@1/mulf_init::sqr1_hi#5 )
mulf_init::sqr1_lo#4 = phi( mulf_init::@1/mulf_init::sqr1_lo#2 )
mulf_init::sqr#5 = phi( mulf_init::@1/mulf_init::sqr#6 )
mulf_init::c#2 = phi( mulf_init::@1/mulf_init::c#3 )
mulf_init::c#1 = ++ mulf_init::c#2
mulf_init::$1 = mulf_init::c#1 & 1
mulf_init::$2 = mulf_init::$1 == 0
mulf_init::$3 = ! mulf_init::$2
if(mulf_init::$3) goto mulf_init::@4
to:mulf_init::@5
mulf_init::@3: scope:[mulf_init] from mulf_init::@1
mulf_init::x_255#0 = (char)-1
mulf_init::dir#0 = $ff
mulf_init::sqr2_hi#0 = mulf_sqr2_hi
mulf_init::sqr2_lo#0 = mulf_sqr2_lo
to:mulf_init::@6
mulf_init::@4: scope:[mulf_init] from mulf_init::@2 mulf_init::@5
mulf_init::c#4 = phi( mulf_init::@2/mulf_init::c#1, mulf_init::@5/mulf_init::c#5 )
mulf_init::x_2#2 = phi( mulf_init::@2/mulf_init::x_2#4, mulf_init::@5/mulf_init::x_2#1 )
mulf_init::sqr1_hi#2 = phi( mulf_init::@2/mulf_init::sqr1_hi#3, mulf_init::@5/mulf_init::sqr1_hi#4 )
mulf_init::sqr1_lo#3 = phi( mulf_init::@2/mulf_init::sqr1_lo#4, mulf_init::@5/mulf_init::sqr1_lo#5 )
mulf_init::sqr#3 = phi( mulf_init::@2/mulf_init::sqr#5, mulf_init::@5/mulf_init::sqr#2 )
mulf_init::$4 = byte0 mulf_init::sqr#3
*mulf_init::sqr1_lo#3 = mulf_init::$4
mulf_init::$5 = byte1 mulf_init::sqr#3
*mulf_init::sqr1_hi#2 = mulf_init::$5
mulf_init::sqr1_hi#1 = ++ mulf_init::sqr1_hi#2
mulf_init::$6 = mulf_init::sqr#3 + mulf_init::x_2#2
mulf_init::sqr#1 = mulf_init::$6
mulf_init::sqr1_lo#1 = ++ mulf_init::sqr1_lo#3
to:mulf_init::@1
mulf_init::@5: scope:[mulf_init] from mulf_init::@2
mulf_init::c#5 = phi( mulf_init::@2/mulf_init::c#1 )
mulf_init::sqr1_hi#4 = phi( mulf_init::@2/mulf_init::sqr1_hi#3 )
mulf_init::sqr1_lo#5 = phi( mulf_init::@2/mulf_init::sqr1_lo#4 )
mulf_init::sqr#4 = phi( mulf_init::@2/mulf_init::sqr#5 )
mulf_init::x_2#3 = phi( mulf_init::@2/mulf_init::x_2#4 )
mulf_init::x_2#1 = ++ mulf_init::x_2#3
mulf_init::sqr#2 = ++ mulf_init::sqr#4
to:mulf_init::@4
mulf_init::@6: scope:[mulf_init] from mulf_init::@3 mulf_init::@9
mulf_init::dir#3 = phi( mulf_init::@3/mulf_init::dir#0, mulf_init::@9/mulf_init::dir#4 )
mulf_init::sqr2_hi#3 = phi( mulf_init::@3/mulf_init::sqr2_hi#0, mulf_init::@9/mulf_init::sqr2_hi#4 )
mulf_init::x_255#3 = phi( mulf_init::@3/mulf_init::x_255#0, mulf_init::@9/mulf_init::x_255#4 )
mulf_init::sqr2_lo#2 = phi( mulf_init::@3/mulf_init::sqr2_lo#0, mulf_init::@9/mulf_init::sqr2_lo#1 )
mulf_init::$7 = mulf_init::sqr2_lo#2 != mulf_sqr2_lo+$1ff
if(mulf_init::$7) goto mulf_init::@7
to:mulf_init::@8
mulf_init::@7: scope:[mulf_init] from mulf_init::@6
mulf_init::dir#2 = phi( mulf_init::@6/mulf_init::dir#3 )
mulf_init::sqr2_hi#2 = phi( mulf_init::@6/mulf_init::sqr2_hi#3 )
mulf_init::sqr2_lo#3 = phi( mulf_init::@6/mulf_init::sqr2_lo#2 )
mulf_init::x_255#2 = phi( mulf_init::@6/mulf_init::x_255#3 )
*mulf_init::sqr2_lo#3 = mulf_sqr1_lo[mulf_init::x_255#2]
*mulf_init::sqr2_hi#2 = mulf_sqr1_hi[mulf_init::x_255#2]
mulf_init::sqr2_hi#1 = ++ mulf_init::sqr2_hi#2
mulf_init::$8 = mulf_init::x_255#2 + mulf_init::dir#2
mulf_init::x_255#1 = mulf_init::$8
mulf_init::$9 = mulf_init::x_255#1 == 0
mulf_init::$10 = ! mulf_init::$9
if(mulf_init::$10) goto mulf_init::@9
to:mulf_init::@10
mulf_init::@8: scope:[mulf_init] from mulf_init::@6
*(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+$100)
*(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+$100)
to:mulf_init::@return
mulf_init::@9: scope:[mulf_init] from mulf_init::@10 mulf_init::@7
mulf_init::dir#4 = phi( mulf_init::@10/mulf_init::dir#1, mulf_init::@7/mulf_init::dir#2 )
mulf_init::sqr2_hi#4 = phi( mulf_init::@10/mulf_init::sqr2_hi#5, mulf_init::@7/mulf_init::sqr2_hi#1 )
mulf_init::x_255#4 = phi( mulf_init::@10/mulf_init::x_255#5, mulf_init::@7/mulf_init::x_255#1 )
mulf_init::sqr2_lo#4 = phi( mulf_init::@10/mulf_init::sqr2_lo#5, mulf_init::@7/mulf_init::sqr2_lo#3 )
mulf_init::sqr2_lo#1 = ++ mulf_init::sqr2_lo#4
to:mulf_init::@6
mulf_init::@10: scope:[mulf_init] from mulf_init::@7
mulf_init::sqr2_hi#5 = phi( mulf_init::@7/mulf_init::sqr2_hi#1 )
mulf_init::x_255#5 = phi( mulf_init::@7/mulf_init::x_255#1 )
mulf_init::sqr2_lo#5 = phi( mulf_init::@7/mulf_init::sqr2_lo#3 )
mulf_init::dir#1 = 1
to:mulf_init::@9
mulf_init::@return: scope:[mulf_init] from mulf_init::@8
return
to:@return
unsigned long mulf16u(unsigned int a , unsigned int b)
mulf16u: scope:[mulf16u] from main::@3
mulf16u::b#1 = phi( main::@3/mulf16u::b#0 )
mulf16u::a#1 = phi( main::@3/mulf16u::a#0 )
*mulf16u::memA = mulf16u::a#1
*mulf16u::memB = mulf16u::b#1
asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: }
mulf16u::return#1 = *mulf16u::memR
to:mulf16u::@return
mulf16u::@return: scope:[mulf16u] from mulf16u
mulf16u::return#4 = phi( mulf16u/mulf16u::return#1 )
mulf16u::return#2 = mulf16u::return#4
return
to:@return
void __start()
__start: scope:[__start] from
to:__start::__init1
__start::__init1: scope:[__start] from __start
print_screen#4 = (char *)$400
print_line_cursor#4 = print_screen#4
print_char_cursor#16 = print_line_cursor#4
to:__start::@1
__start::@1: scope:[__start] from __start::__init1
print_line_cursor#14 = phi( __start::__init1/print_line_cursor#4 )
print_screen#14 = phi( __start::__init1/print_screen#4 )
print_char_cursor#41 = phi( __start::__init1/print_char_cursor#16 )
call main
to:__start::@2
__start::@2: scope:[__start] from __start::@1
print_line_cursor#10 = phi( __start::@1/print_line_cursor#3 )
print_screen#10 = phi( __start::@1/print_screen#3 )
print_char_cursor#34 = phi( __start::@1/print_char_cursor#15 )
print_char_cursor#17 = print_char_cursor#34
print_screen#5 = print_screen#10
print_line_cursor#5 = print_line_cursor#10
to:__start::@return
__start::@return: scope:[__start] from __start::@2
print_char_cursor#35 = phi( __start::@2/print_char_cursor#17 )
print_line_cursor#11 = phi( __start::@2/print_line_cursor#5 )
print_screen#11 = phi( __start::@2/print_screen#5 )
print_screen#6 = print_screen#11
print_line_cursor#6 = print_line_cursor#11
print_char_cursor#18 = print_char_cursor#35
return
to:@return
SYMBOL TABLE SSA
__constant char *BORDER_COLOR = (char *)$d020
__constant char RADIX::BINARY = 2
__constant char RADIX::DECIMAL = $a
__constant char RADIX::HEXADECIMAL = $10
__constant char RADIX::OCTAL = 8
__constant char *RASTER = (char *)$d012
__constant char *SCREEN = (char *)$400
void __start()
void main()
bool main::$1
__constant unsigned int main::a = $4d2
__constant unsigned int main::b = $929
unsigned long main::r
unsigned long main::r#0
unsigned long mulf16u(unsigned int a , unsigned int b)
unsigned int mulf16u::a
unsigned int mulf16u::a#0
unsigned int mulf16u::a#1
unsigned int mulf16u::b
unsigned int mulf16u::b#0
unsigned int mulf16u::b#1
__constant unsigned int * const mulf16u::memA = (unsigned int *)$f8
__constant unsigned int * const mulf16u::memB = (unsigned int *)$fa
__constant unsigned long * const mulf16u::memR = (unsigned long *)$fc
unsigned long mulf16u::return
unsigned long mulf16u::return#0
unsigned long mulf16u::return#1
unsigned long mulf16u::return#2
unsigned long mulf16u::return#3
unsigned long mulf16u::return#4
void mulf_init()
bool mulf_init::$0
number mulf_init::$1
bool mulf_init::$10
bool mulf_init::$2
bool mulf_init::$3
char mulf_init::$4
char mulf_init::$5
unsigned int mulf_init::$6
bool mulf_init::$7
char mulf_init::$8
bool mulf_init::$9
char mulf_init::c
char mulf_init::c#0
char mulf_init::c#1
char mulf_init::c#2
char mulf_init::c#3
char mulf_init::c#4
char mulf_init::c#5
char mulf_init::dir
char mulf_init::dir#0
char mulf_init::dir#1
char mulf_init::dir#2
char mulf_init::dir#3
char mulf_init::dir#4
unsigned int mulf_init::sqr
unsigned int mulf_init::sqr#0
unsigned int mulf_init::sqr#1
unsigned int mulf_init::sqr#2
unsigned int mulf_init::sqr#3
unsigned int mulf_init::sqr#4
unsigned int mulf_init::sqr#5
unsigned int mulf_init::sqr#6
char *mulf_init::sqr1_hi
char *mulf_init::sqr1_hi#0
char *mulf_init::sqr1_hi#1
char *mulf_init::sqr1_hi#2
char *mulf_init::sqr1_hi#3
char *mulf_init::sqr1_hi#4
char *mulf_init::sqr1_hi#5
char *mulf_init::sqr1_lo
char *mulf_init::sqr1_lo#0
char *mulf_init::sqr1_lo#1
char *mulf_init::sqr1_lo#2
char *mulf_init::sqr1_lo#3
char *mulf_init::sqr1_lo#4
char *mulf_init::sqr1_lo#5
char *mulf_init::sqr2_hi
char *mulf_init::sqr2_hi#0
char *mulf_init::sqr2_hi#1
char *mulf_init::sqr2_hi#2
char *mulf_init::sqr2_hi#3
char *mulf_init::sqr2_hi#4
char *mulf_init::sqr2_hi#5
char *mulf_init::sqr2_lo
char *mulf_init::sqr2_lo#0
char *mulf_init::sqr2_lo#1
char *mulf_init::sqr2_lo#2
char *mulf_init::sqr2_lo#3
char *mulf_init::sqr2_lo#4
char *mulf_init::sqr2_lo#5
char mulf_init::x_2
char mulf_init::x_2#0
char mulf_init::x_2#1
char mulf_init::x_2#2
char mulf_init::x_2#3
char mulf_init::x_2#4
char mulf_init::x_2#5
char mulf_init::x_255
char mulf_init::x_255#0
char mulf_init::x_255#1
char mulf_init::x_255#2
char mulf_init::x_255#3
char mulf_init::x_255#4
char mulf_init::x_255#5
__constant char mulf_sqr1_hi[$200] = { fill( $200, 0) }
__constant char mulf_sqr1_lo[$200] = { fill( $200, 0) }
__constant char mulf_sqr2_hi[$200] = { fill( $200, 0) }
__constant char mulf_sqr2_lo[$200] = { fill( $200, 0) }
void print_char(char ch)
char print_char::ch
char print_char::ch#0
char print_char::ch#1
char print_char::ch#2
char *print_char_cursor
char *print_char_cursor#0
char *print_char_cursor#1
char *print_char_cursor#10
char *print_char_cursor#11
char *print_char_cursor#12
char *print_char_cursor#13
char *print_char_cursor#14
char *print_char_cursor#15
char *print_char_cursor#16
char *print_char_cursor#17
char *print_char_cursor#18
char *print_char_cursor#19
char *print_char_cursor#2
char *print_char_cursor#20
char *print_char_cursor#21
char *print_char_cursor#22
char *print_char_cursor#23
char *print_char_cursor#24
char *print_char_cursor#25
char *print_char_cursor#26
char *print_char_cursor#27
char *print_char_cursor#28
char *print_char_cursor#29
char *print_char_cursor#3
char *print_char_cursor#30
char *print_char_cursor#31
char *print_char_cursor#32
char *print_char_cursor#33
char *print_char_cursor#34
char *print_char_cursor#35
char *print_char_cursor#36
char *print_char_cursor#37
char *print_char_cursor#38
char *print_char_cursor#39
char *print_char_cursor#4
char *print_char_cursor#40
char *print_char_cursor#41
char *print_char_cursor#42
char *print_char_cursor#43
char *print_char_cursor#44
char *print_char_cursor#45
char *print_char_cursor#5
char *print_char_cursor#6
char *print_char_cursor#7
char *print_char_cursor#8
char *print_char_cursor#9
__constant const char print_hextab[] = "0123456789abcdef"z
char *print_line_cursor
char *print_line_cursor#0
char *print_line_cursor#1
char *print_line_cursor#10
char *print_line_cursor#11
char *print_line_cursor#12
char *print_line_cursor#13
char *print_line_cursor#14
char *print_line_cursor#15
char *print_line_cursor#16
char *print_line_cursor#17
char *print_line_cursor#18
char *print_line_cursor#19
char *print_line_cursor#2
char *print_line_cursor#3
char *print_line_cursor#4
char *print_line_cursor#5
char *print_line_cursor#6
char *print_line_cursor#7
char *print_line_cursor#8
char *print_line_cursor#9
char *print_screen
char *print_screen#0
char *print_screen#1
char *print_screen#10
char *print_screen#11
char *print_screen#12
char *print_screen#13
char *print_screen#14
char *print_screen#15
char *print_screen#16
char *print_screen#17
char *print_screen#18
char *print_screen#19
char *print_screen#2
char *print_screen#3
char *print_screen#4
char *print_screen#5
char *print_screen#6
char *print_screen#7
char *print_screen#8
char *print_screen#9
void print_set_screen(char *screen)
char *print_set_screen::screen
char *print_set_screen::screen#0
char *print_set_screen::screen#1
void print_uchar(char b)
char print_uchar::$0
number print_uchar::$2
char print_uchar::b
char print_uchar::b#0
char print_uchar::b#1
char print_uchar::b#2
char print_uchar::b#3
void print_uint(unsigned int w)
char print_uint::$0
char print_uint::$2
unsigned int print_uint::w
unsigned int print_uint::w#0
unsigned int print_uint::w#1
unsigned int print_uint::w#2
unsigned int print_uint::w#3
void print_ulong(unsigned long dw)
unsigned int print_ulong::$0
unsigned int print_ulong::$2
unsigned long print_ulong::dw
unsigned long print_ulong::dw#0
unsigned long print_ulong::dw#1
unsigned long print_ulong::dw#2
Adding number conversion cast (unumber) 4 in print_uchar::$0 = print_uchar::b#2 >> 4
Adding number conversion cast (unumber) $f in print_uchar::$2 = print_uchar::b#3 & $f
Adding number conversion cast (unumber) print_uchar::$2 in print_uchar::$2 = print_uchar::b#3 & (unumber)$f
Adding number conversion cast (unumber) $ff in main::$1 = *RASTER != $ff
Adding number conversion cast (unumber) 1 in mulf_init::sqr1_hi#0 = mulf_sqr1_hi+1
Adding number conversion cast (unumber) 1 in mulf_init::sqr1_lo#0 = mulf_sqr1_lo+1
Adding number conversion cast (unumber) $200 in mulf_init::$0 = mulf_init::sqr1_lo#2 != mulf_sqr1_lo+$200
Adding number conversion cast (unumber) 1 in mulf_init::$1 = mulf_init::c#1 & 1
Adding number conversion cast (unumber) mulf_init::$1 in mulf_init::$1 = mulf_init::c#1 & (unumber)1
Adding number conversion cast (unumber) 0 in mulf_init::$2 = mulf_init::$1 == 0
Adding number conversion cast (unumber) $1ff in mulf_init::$7 = mulf_init::sqr2_lo#2 != mulf_sqr2_lo+$1ff
Adding number conversion cast (unumber) 0 in mulf_init::$9 = mulf_init::x_255#1 == 0
Adding number conversion cast (unumber) $100 in *(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+$100)
Adding number conversion cast (unumber) $1ff in *(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+(unumber)$100)
Adding number conversion cast (unumber) $100 in *(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+$100)
Adding number conversion cast (unumber) $1ff in *(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+(unumber)$100)
Adding number conversion cast (unumber) 1 in mulf_init::dir#1 = 1
Successful SSA optimization PassNAddNumberTypeConversions
Inlining cast mulf_init::dir#1 = (unumber)1
Successful SSA optimization Pass2InlineCast
Simplifying constant pointer cast (unsigned int *) 248
Simplifying constant pointer cast (unsigned int *) 250
Simplifying constant pointer cast (unsigned long *) 252
Simplifying constant pointer cast (char *) 53266
Simplifying constant pointer cast (char *) 53280
Simplifying constant pointer cast (char *) 1024
Simplifying constant integer cast 4
Simplifying constant integer cast $f
Simplifying constant integer cast $ff
Simplifying constant integer cast 1
Simplifying constant integer cast 1
Simplifying constant integer cast $200
Simplifying constant integer cast 1
Simplifying constant integer cast 0
Simplifying constant integer cast -1
Simplifying constant integer cast $1ff
Simplifying constant integer cast 0
Simplifying constant integer cast $100
Simplifying constant integer cast $1ff
Simplifying constant integer cast $100
Simplifying constant integer cast $1ff
Simplifying constant integer cast 1
Simplifying constant pointer cast (char *) 1024
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (char) 4
Finalized unsigned number type (char) $f
Finalized unsigned number type (char) $ff
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 1
Finalized unsigned number type (unsigned int) $200
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 0
Finalized unsigned number type (unsigned int) $1ff
Finalized unsigned number type (char) 0
Finalized unsigned number type (unsigned int) $100
Finalized unsigned number type (unsigned int) $1ff
Finalized unsigned number type (unsigned int) $100
Finalized unsigned number type (unsigned int) $1ff
Finalized unsigned number type (char) 1
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inferred type updated to char in print_uchar::$2 = print_uchar::b#3 & $f
Inferred type updated to char in mulf_init::$1 = mulf_init::c#1 & 1
Inversing boolean not [102] mulf_init::$3 = mulf_init::$1 != 0 from [101] mulf_init::$2 = mulf_init::$1 == 0
Inversing boolean not [130] mulf_init::$10 = mulf_init::x_255#1 != 0 from [129] mulf_init::$9 = mulf_init::x_255#1 == 0
Successful SSA optimization Pass2UnaryNotSimplification
Alias print_uchar::b#0 = print_uint::$0
Alias print_uint::w#2 = print_uint::w#3
Alias print_char_cursor#0 = print_char_cursor#19
Alias print_uchar::b#1 = print_uint::$2
Alias print_char_cursor#1 = print_char_cursor#20 print_char_cursor#21 print_char_cursor#2
Alias print_uint::w#0 = print_ulong::$0
Alias print_ulong::dw#1 = print_ulong::dw#2
Alias print_char_cursor#22 = print_char_cursor#3
Alias print_uint::w#1 = print_ulong::$2
Alias print_char_cursor#23 = print_char_cursor#4 print_char_cursor#24 print_char_cursor#5
Alias print_uchar::b#2 = print_uchar::b#3
Alias print_char_cursor#25 = print_char_cursor#6
Alias print_char_cursor#26 = print_char_cursor#7 print_char_cursor#27 print_char_cursor#8
Alias print_char_cursor#10 = print_char_cursor#29 print_char_cursor#9
Alias print_screen#0 = print_line_cursor#0 print_char_cursor#11 print_screen#7 print_line_cursor#7 print_char_cursor#30 print_screen#1 print_line_cursor#1 print_char_cursor#12
Alias print_char_cursor#42 = print_char_cursor#44
Alias print_screen#15 = print_screen#17
Alias print_line_cursor#15 = print_line_cursor#17
Alias print_char_cursor#39 = print_char_cursor#43 print_char_cursor#45
Alias print_screen#12 = print_screen#18 print_screen#19 print_screen#16
Alias print_line_cursor#12 = print_line_cursor#18 print_line_cursor#19 print_line_cursor#16
Alias mulf16u::return#0 = mulf16u::return#3
Alias print_char_cursor#13 = print_char_cursor#31
Alias print_screen#2 = print_screen#8
Alias print_line_cursor#2 = print_line_cursor#8
Alias print_char_cursor#14 = print_char_cursor#32
Alias print_char_cursor#15 = print_char_cursor#33 print_char_cursor#40
Alias print_screen#13 = print_screen#9 print_screen#3
Alias print_line_cursor#13 = print_line_cursor#9 print_line_cursor#3
Alias mulf_init::c#2 = mulf_init::c#3
Alias mulf_init::sqr#4 = mulf_init::sqr#5 mulf_init::sqr#6
Alias mulf_init::sqr1_lo#2 = mulf_init::sqr1_lo#4 mulf_init::sqr1_lo#5
Alias mulf_init::sqr1_hi#3 = mulf_init::sqr1_hi#5 mulf_init::sqr1_hi#4
Alias mulf_init::x_2#3 = mulf_init::x_2#4 mulf_init::x_2#5
Alias mulf_init::sqr#1 = mulf_init::$6
Alias mulf_init::c#1 = mulf_init::c#5
Alias mulf_init::x_255#2 = mulf_init::x_255#3
Alias mulf_init::sqr2_lo#2 = mulf_init::sqr2_lo#3 mulf_init::sqr2_lo#5
Alias mulf_init::sqr2_hi#2 = mulf_init::sqr2_hi#3
Alias mulf_init::dir#2 = mulf_init::dir#3
Alias mulf_init::x_255#1 = mulf_init::$8 mulf_init::x_255#5
Alias mulf_init::sqr2_hi#1 = mulf_init::sqr2_hi#5
Alias mulf16u::return#1 = mulf16u::return#4 mulf16u::return#2
Alias print_char_cursor#16 = print_line_cursor#4 print_screen#4 print_char_cursor#41 print_screen#14 print_line_cursor#14
Alias print_char_cursor#17 = print_char_cursor#34 print_char_cursor#35 print_char_cursor#18
Alias print_screen#10 = print_screen#5 print_screen#11 print_screen#6
Alias print_line_cursor#10 = print_line_cursor#5 print_line_cursor#11 print_line_cursor#6
Successful SSA optimization Pass2AliasElimination
Alias mulf_init::sqr1_lo#2 = mulf_init::sqr1_lo#3
Alias mulf_init::sqr1_hi#2 = mulf_init::sqr1_hi#3
Alias mulf_init::c#1 = mulf_init::c#4
Alias mulf_init::sqr2_lo#2 = mulf_init::sqr2_lo#4
Alias mulf_init::x_255#1 = mulf_init::x_255#4
Alias mulf_init::sqr2_hi#1 = mulf_init::sqr2_hi#4
Successful SSA optimization Pass2AliasElimination
Identical Phi Values print_char_cursor#0 print_char_cursor#26
Identical Phi Values print_char_cursor#1 print_char_cursor#26
Identical Phi Values print_ulong::dw#1 print_ulong::dw#0
Identical Phi Values print_char_cursor#37 print_char_cursor#39
Identical Phi Values print_char_cursor#22 print_char_cursor#1
Identical Phi Values print_char_cursor#23 print_char_cursor#1
Identical Phi Values print_char_cursor#25 print_char_cursor#10
Identical Phi Values print_char_cursor#26 print_char_cursor#10
Identical Phi Values print_set_screen::screen#1 print_set_screen::screen#0
Identical Phi Values print_char_cursor#42 print_char_cursor#16
Identical Phi Values print_screen#15 print_char_cursor#16
Identical Phi Values print_line_cursor#15 print_char_cursor#16
Identical Phi Values print_char_cursor#39 print_char_cursor#15
Identical Phi Values print_screen#12 print_screen#13
Identical Phi Values print_line_cursor#12 print_line_cursor#13
Identical Phi Values print_char_cursor#13 print_char_cursor#23
Identical Phi Values print_screen#2 print_screen#0
Identical Phi Values print_line_cursor#2 print_screen#0
Identical Phi Values print_char_cursor#14 print_screen#0
Identical Phi Values mulf16u::a#1 mulf16u::a#0
Identical Phi Values mulf16u::b#1 mulf16u::b#0
Identical Phi Values print_char_cursor#17 print_char_cursor#15
Identical Phi Values print_screen#10 print_screen#13
Identical Phi Values print_line_cursor#10 print_line_cursor#13
Successful SSA optimization Pass2IdenticalPhiElimination
Simple Condition main::$1 [40] if(*RASTER!=$ff) goto main::@2
Simple Condition mulf_init::$0 [62] if(mulf_init::sqr1_lo#2!=mulf_sqr1_lo+$200) goto mulf_init::@2
Simple Condition mulf_init::$3 [66] if(mulf_init::$1!=0) goto mulf_init::@4
Simple Condition mulf_init::$7 [83] if(mulf_init::sqr2_lo#2!=mulf_sqr2_lo+$1ff) goto mulf_init::@7
Simple Condition mulf_init::$10 [89] if(mulf_init::x_255#1!=0) goto mulf_init::@9
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant mulf16u::a#0 = main::a
Constant mulf16u::b#0 = main::b
Constant print_set_screen::screen#0 = SCREEN
Constant mulf_init::sqr#0 = 0
Constant mulf_init::x_2#0 = 0
Constant mulf_init::c#0 = 0
Constant mulf_init::sqr1_hi#0 = mulf_sqr1_hi+1
Constant mulf_init::sqr1_lo#0 = mulf_sqr1_lo+1
Constant mulf_init::x_255#0 = -1
Constant mulf_init::dir#0 = $ff
Constant mulf_init::sqr2_hi#0 = mulf_sqr2_hi
Constant mulf_init::sqr2_lo#0 = mulf_sqr2_lo
Constant mulf_init::dir#1 = 1
Constant print_char_cursor#16 = (char *) 1024
Successful SSA optimization Pass2ConstantIdentification
Constant print_screen#0 = print_set_screen::screen#0
Successful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination [37] if(true) goto main::@2
Successful SSA optimization Pass2ConstantIfs
Removing unused block main::@return
Successful SSA optimization Pass2EliminateUnusedBlocks
Eliminating unused variable - keeping the phi block print_screen#13
Eliminating unused variable - keeping the phi block print_line_cursor#13
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
Inlining constant with var siblings mulf_init::sqr#0
Inlining constant with var siblings mulf_init::x_2#0
Inlining constant with var siblings mulf_init::c#0
Inlining constant with var siblings mulf_init::sqr1_hi#0
Inlining constant with var siblings mulf_init::sqr1_lo#0
Inlining constant with var siblings mulf_init::x_255#0
Inlining constant with var siblings mulf_init::dir#0
Inlining constant with var siblings mulf_init::sqr2_hi#0
Inlining constant with var siblings mulf_init::sqr2_lo#0
Inlining constant with var siblings mulf_init::dir#1
Inlining constant with var siblings print_char_cursor#16
Constant inlined mulf_init::c#0 = 0
Constant inlined mulf_init::sqr2_lo#0 = mulf_sqr2_lo
Constant inlined mulf_init::sqr#0 = 0
Constant inlined mulf16u::b#0 = main::b
Constant inlined mulf_init::sqr2_hi#0 = mulf_sqr2_hi
Constant inlined mulf16u::a#0 = main::a
Constant inlined print_screen#0 = SCREEN
Constant inlined mulf_init::dir#1 = 1
Constant inlined mulf_init::dir#0 = $ff
Constant inlined mulf_init::sqr1_hi#0 = mulf_sqr1_hi+1
Constant inlined print_set_screen::screen#0 = SCREEN
Constant inlined mulf_init::sqr1_lo#0 = mulf_sqr1_lo+1
Constant inlined mulf_init::x_255#0 = -1
Constant inlined print_char_cursor#16 = (char *) 1024
Constant inlined mulf_init::x_2#0 = 0
Successful SSA optimization Pass2ConstantInlining
Removing call to empty/unused procedure [35] call print_set_screen
Removing unused procedure print_set_screen
Removing unused procedure block print_set_screen
Removing unused procedure block print_set_screen::@return
Successful SSA optimization PassNEliminateEmptyProcedure
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
Finalized unsigned number type (unsigned int) $200
Finalized unsigned number type (unsigned int) $200
Finalized unsigned number type (unsigned int) $200
Finalized unsigned number type (unsigned int) $200
Finalized unsigned number type (unsigned int) $200
Finalized unsigned number type (unsigned int) $200
Successful SSA optimization PassNFinalizeNumberTypeConversions
Added new block during phi lifting mulf_init::@11(between mulf_init::@2 and mulf_init::@4)
Added new block during phi lifting mulf_init::@12(between mulf_init::@7 and mulf_init::@9)
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@6
Adding NOP phi() at start of main::@7
Adding NOP phi() at start of mulf_init
Adding NOP phi() at start of mulf_init::@3
Adding NOP phi() at start of mulf_init::@10
Adding NOP phi() at start of print_ulong::@2
Adding NOP phi() at start of print_uint::@2
Adding NOP phi() at start of print_uchar::@2
CALL GRAPH
Calls in [main] to mulf_init:1 mulf16u:6 print_ulong:11
Calls in [print_ulong] to print_uint:66 print_uint:70
Calls in [print_uint] to print_uchar:77 print_uchar:81
Calls in [print_uchar] to print_char:89 print_char:94
Created 19 initial phi equivalence classes
Coalesced [31] mulf_init::sqr2_lo#6 = mulf_init::sqr2_lo#1
Coalesced [32] mulf_init::x_255#6 = mulf_init::x_255#1
Coalesced [33] mulf_init::sqr2_hi#6 = mulf_init::sqr2_hi#1
Coalesced [34] mulf_init::dir#5 = mulf_init::dir#4
Coalesced (already) [35] mulf_init::dir#6 = mulf_init::dir#2
Coalesced [41] mulf_init::sqr#9 = mulf_init::sqr#2
Coalesced [42] mulf_init::x_2#8 = mulf_init::x_2#1
Coalesced [51] mulf_init::sqr1_lo#6 = mulf_init::sqr1_lo#1
Coalesced [52] mulf_init::c#6 = mulf_init::c#1
Coalesced [53] mulf_init::sqr#7 = mulf_init::sqr#1
Coalesced [54] mulf_init::sqr1_hi#6 = mulf_init::sqr1_hi#1
Coalesced [55] mulf_init::x_2#6 = mulf_init::x_2#2
Coalesced [56] mulf_init::sqr#8 = mulf_init::sqr#4
Coalesced (already) [57] mulf_init::x_2#7 = mulf_init::x_2#3
Coalesced [64] print_uint::w#4 = print_uint::w#0
Coalesced [65] print_char_cursor#46 = print_char_cursor#15
Coalesced [68] print_uint::w#5 = print_uint::w#1
Coalesced [69] print_char_cursor#47 = print_char_cursor#10
Coalesced [75] print_uchar::b#4 = print_uchar::b#0
Coalesced [76] print_char_cursor#48 = print_char_cursor#36
Coalesced [79] print_uchar::b#5 = print_uchar::b#1
Coalesced (already) [80] print_char_cursor#49 = print_char_cursor#10
Coalesced [87] print_char::ch#3 = print_char::ch#0
Coalesced [88] print_char_cursor#50 = print_char_cursor#38
Coalesced [92] print_char::ch#4 = print_char::ch#1
Coalesced (already) [93] print_char_cursor#51 = print_char_cursor#10
Coalesced down to 13 phi equivalence classes
Culled Empty Block label main::@6
Culled Empty Block label main::@7
Culled Empty Block label mulf_init::@3
Culled Empty Block label mulf_init::@10
Culled Empty Block label mulf_init::@11
Culled Empty Block label print_ulong::@2
Culled Empty Block label print_uint::@2
Culled Empty Block label print_uchar::@2
Renumbering block mulf_init::@4 to mulf_init::@3
Renumbering block mulf_init::@5 to mulf_init::@4
Renumbering block mulf_init::@6 to mulf_init::@5
Renumbering block mulf_init::@7 to mulf_init::@6
Renumbering block mulf_init::@8 to mulf_init::@7
Renumbering block mulf_init::@9 to mulf_init::@8
Renumbering block mulf_init::@12 to mulf_init::@9
Adding NOP phi() at start of main
Adding NOP phi() at start of mulf_init
Adding NOP phi() at start of mulf_init::@9
FINAL CONTROL FLOW GRAPH
void main()
main: scope:[main] from
[0] phi()
[1] call mulf_init
to:main::@4
main::@4: scope:[main] from main
asm { sei }
to:main::@1
main::@1: scope:[main] from main::@4 main::@5
[3] print_char_cursor#15 = phi( main::@4/(char *) 1024, main::@5/SCREEN )
to:main::@2
main::@2: scope:[main] from main::@1 main::@2
[4] if(*RASTER!=$ff) goto main::@2
to:main::@3
main::@3: scope:[main] from main::@2
[5] *BORDER_COLOR = ++ *BORDER_COLOR
[6] call mulf16u
[7] mulf16u::return#0 = mulf16u::return#1
to:main::@5
main::@5: scope:[main] from main::@3
[8] main::r#0 = mulf16u::return#0
[9] *BORDER_COLOR = -- *BORDER_COLOR
[10] print_ulong::dw#0 = main::r#0
[11] call print_ulong
to:main::@1
void mulf_init()
mulf_init: scope:[mulf_init] from main
[12] phi()
to:mulf_init::@1
mulf_init::@1: scope:[mulf_init] from mulf_init mulf_init::@3
[13] mulf_init::x_2#3 = phi( mulf_init/0, mulf_init::@3/mulf_init::x_2#2 )
[13] mulf_init::sqr1_hi#2 = phi( mulf_init/mulf_sqr1_hi+1, mulf_init::@3/mulf_init::sqr1_hi#1 )
[13] mulf_init::sqr#4 = phi( mulf_init/0, mulf_init::@3/mulf_init::sqr#1 )
[13] mulf_init::c#2 = phi( mulf_init/0, mulf_init::@3/mulf_init::c#1 )
[13] mulf_init::sqr1_lo#2 = phi( mulf_init/mulf_sqr1_lo+1, mulf_init::@3/mulf_init::sqr1_lo#1 )
[14] if(mulf_init::sqr1_lo#2!=mulf_sqr1_lo+$200) goto mulf_init::@2
to:mulf_init::@5
mulf_init::@5: scope:[mulf_init] from mulf_init::@1 mulf_init::@8
[15] mulf_init::dir#2 = phi( mulf_init::@1/$ff, mulf_init::@8/mulf_init::dir#4 )
[15] mulf_init::sqr2_hi#2 = phi( mulf_init::@1/mulf_sqr2_hi, mulf_init::@8/mulf_init::sqr2_hi#1 )
[15] mulf_init::x_255#2 = phi( mulf_init::@1/-1, mulf_init::@8/mulf_init::x_255#1 )
[15] mulf_init::sqr2_lo#2 = phi( mulf_init::@1/mulf_sqr2_lo, mulf_init::@8/mulf_init::sqr2_lo#1 )
[16] if(mulf_init::sqr2_lo#2!=mulf_sqr2_lo+$1ff) goto mulf_init::@6
to:mulf_init::@7
mulf_init::@7: scope:[mulf_init] from mulf_init::@5
[17] *(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+$100)
[18] *(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+$100)
to:mulf_init::@return
mulf_init::@return: scope:[mulf_init] from mulf_init::@7
[19] return
to:@return
mulf_init::@6: scope:[mulf_init] from mulf_init::@5
[20] *mulf_init::sqr2_lo#2 = mulf_sqr1_lo[mulf_init::x_255#2]
[21] *mulf_init::sqr2_hi#2 = mulf_sqr1_hi[mulf_init::x_255#2]
[22] mulf_init::sqr2_hi#1 = ++ mulf_init::sqr2_hi#2
[23] mulf_init::x_255#1 = mulf_init::x_255#2 + mulf_init::dir#2
[24] if(mulf_init::x_255#1!=0) goto mulf_init::@9
to:mulf_init::@8
mulf_init::@9: scope:[mulf_init] from mulf_init::@6
[25] phi()
to:mulf_init::@8
mulf_init::@8: scope:[mulf_init] from mulf_init::@6 mulf_init::@9
[26] mulf_init::dir#4 = phi( mulf_init::@6/1, mulf_init::@9/mulf_init::dir#2 )
[27] mulf_init::sqr2_lo#1 = ++ mulf_init::sqr2_lo#2
to:mulf_init::@5
mulf_init::@2: scope:[mulf_init] from mulf_init::@1
[28] mulf_init::c#1 = ++ mulf_init::c#2
[29] mulf_init::$1 = mulf_init::c#1 & 1
[30] if(mulf_init::$1!=0) goto mulf_init::@3
to:mulf_init::@4
mulf_init::@4: scope:[mulf_init] from mulf_init::@2
[31] mulf_init::x_2#1 = ++ mulf_init::x_2#3
[32] mulf_init::sqr#2 = ++ mulf_init::sqr#4
to:mulf_init::@3
mulf_init::@3: scope:[mulf_init] from mulf_init::@2 mulf_init::@4
[33] mulf_init::x_2#2 = phi( mulf_init::@2/mulf_init::x_2#3, mulf_init::@4/mulf_init::x_2#1 )
[33] mulf_init::sqr#3 = phi( mulf_init::@2/mulf_init::sqr#4, mulf_init::@4/mulf_init::sqr#2 )
[34] mulf_init::$4 = byte0 mulf_init::sqr#3
[35] *mulf_init::sqr1_lo#2 = mulf_init::$4
[36] mulf_init::$5 = byte1 mulf_init::sqr#3
[37] *mulf_init::sqr1_hi#2 = mulf_init::$5
[38] mulf_init::sqr1_hi#1 = ++ mulf_init::sqr1_hi#2
[39] mulf_init::sqr#1 = mulf_init::sqr#3 + mulf_init::x_2#2
[40] mulf_init::sqr1_lo#1 = ++ mulf_init::sqr1_lo#2
to:mulf_init::@1
unsigned long mulf16u(unsigned int a , unsigned int b)
mulf16u: scope:[mulf16u] from main::@3
[41] *mulf16u::memA = main::a
[42] *mulf16u::memB = main::b
asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: }
[44] mulf16u::return#1 = *mulf16u::memR
to:mulf16u::@return
mulf16u::@return: scope:[mulf16u] from mulf16u
[45] return
to:@return
void print_ulong(unsigned long dw)
print_ulong: scope:[print_ulong] from main::@5
[46] print_uint::w#0 = word1 print_ulong::dw#0
[47] call print_uint
to:print_ulong::@1
print_ulong::@1: scope:[print_ulong] from print_ulong
[48] print_uint::w#1 = word0 print_ulong::dw#0
[49] call print_uint
to:print_ulong::@return
print_ulong::@return: scope:[print_ulong] from print_ulong::@1
[50] return
to:@return
void print_uint(unsigned int w)
print_uint: scope:[print_uint] from print_ulong print_ulong::@1
[51] print_char_cursor#36 = phi( print_ulong/print_char_cursor#15, print_ulong::@1/print_char_cursor#10 )
[51] print_uint::w#2 = phi( print_ulong/print_uint::w#0, print_ulong::@1/print_uint::w#1 )
[52] print_uchar::b#0 = byte1 print_uint::w#2
[53] call print_uchar
to:print_uint::@1
print_uint::@1: scope:[print_uint] from print_uint
[54] print_uchar::b#1 = byte0 print_uint::w#2
[55] call print_uchar
to:print_uint::@return
print_uint::@return: scope:[print_uint] from print_uint::@1
[56] return
to:@return
void print_uchar(char b)
print_uchar: scope:[print_uchar] from print_uint print_uint::@1
[57] print_char_cursor#38 = phi( print_uint/print_char_cursor#36, print_uint::@1/print_char_cursor#10 )
[57] print_uchar::b#2 = phi( print_uint/print_uchar::b#0, print_uint::@1/print_uchar::b#1 )
[58] print_uchar::$0 = print_uchar::b#2 >> 4
[59] print_char::ch#0 = print_hextab[print_uchar::$0]
[60] call print_char
to:print_uchar::@1
print_uchar::@1: scope:[print_uchar] from print_uchar
[61] print_uchar::$2 = print_uchar::b#2 & $f
[62] print_char::ch#1 = print_hextab[print_uchar::$2]
[63] call print_char
to:print_uchar::@return
print_uchar::@return: scope:[print_uchar] from print_uchar::@1
[64] return
to:@return
void print_char(char ch)
print_char: scope:[print_char] from print_uchar print_uchar::@1
[65] print_char_cursor#28 = phi( print_uchar/print_char_cursor#38, print_uchar::@1/print_char_cursor#10 )
[65] print_char::ch#2 = phi( print_uchar/print_char::ch#0, print_uchar::@1/print_char::ch#1 )
[66] *print_char_cursor#28 = print_char::ch#2
[67] print_char_cursor#10 = ++ print_char_cursor#28
to:print_char::@return
print_char::@return: scope:[print_char] from print_char
[68] return
to:@return
VARIABLE REGISTER WEIGHTS
void main()
unsigned long main::r
unsigned long main::r#0 // 11.0
unsigned long mulf16u(unsigned int a , unsigned int b)
unsigned int mulf16u::a
unsigned int mulf16u::b
unsigned long mulf16u::return
unsigned long mulf16u::return#0 // 22.0
unsigned long mulf16u::return#1 // 37.33333333333333
void mulf_init()
char mulf_init::$1 // 202.0
char mulf_init::$4 // 202.0
char mulf_init::$5 // 202.0
char mulf_init::c
char mulf_init::c#1 // 23.307692307692307
char mulf_init::c#2 // 101.0
char mulf_init::dir
char mulf_init::dir#2 // 37.875
char mulf_init::dir#4 // 101.0
unsigned int mulf_init::sqr
unsigned int mulf_init::sqr#1 // 101.0
unsigned int mulf_init::sqr#2 // 202.0
unsigned int mulf_init::sqr#3 // 84.16666666666666
unsigned int mulf_init::sqr#4 // 50.5
char *mulf_init::sqr1_hi
char *mulf_init::sqr1_hi#1 // 67.33333333333333
char *mulf_init::sqr1_hi#2 // 25.25
char *mulf_init::sqr1_lo
char *mulf_init::sqr1_lo#1 // 202.0
char *mulf_init::sqr1_lo#2 // 28.857142857142858
char *mulf_init::sqr2_hi
char *mulf_init::sqr2_hi#1 // 33.666666666666664
char *mulf_init::sqr2_hi#2 // 75.75
char *mulf_init::sqr2_lo
char *mulf_init::sqr2_lo#1 // 202.0
char *mulf_init::sqr2_lo#2 // 44.888888888888886
char mulf_init::x_2
char mulf_init::x_2#1 // 101.0
char mulf_init::x_2#2 // 50.5
char mulf_init::x_2#3 // 60.599999999999994
char mulf_init::x_255
char mulf_init::x_255#1 // 60.599999999999994
char mulf_init::x_255#2 // 80.8
void print_char(char ch)
char print_char::ch
char print_char::ch#0 // 20002.0
char print_char::ch#1 // 20002.0
char print_char::ch#2 // 120003.0
char *print_char_cursor
char *print_char_cursor#10 // 8546.461538461539
char *print_char_cursor#15 // 11.222222222222221
char *print_char_cursor#28 // 110002.0
char *print_char_cursor#36 // 601.5
char *print_char_cursor#38 // 4001.0
char *print_line_cursor
char *print_screen
void print_uchar(char b)
char print_uchar::$0 // 20002.0
char print_uchar::$2 // 20002.0
char print_uchar::b
char print_uchar::b#0 // 2002.0
char print_uchar::b#1 // 2002.0
char print_uchar::b#2 // 5501.0
void print_uint(unsigned int w)
unsigned int print_uint::w
unsigned int print_uint::w#0 // 202.0
unsigned int print_uint::w#1 // 202.0
unsigned int print_uint::w#2 // 734.6666666666667
void print_ulong(unsigned long dw)
unsigned long print_ulong::dw
unsigned long print_ulong::dw#0 // 71.0
Initial phi equivalence classes
[ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ]
[ mulf_init::c#2 mulf_init::c#1 ]
[ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
[ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
[ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
[ mulf_init::x_255#2 mulf_init::x_255#1 ]
[ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
[ mulf_init::dir#2 mulf_init::dir#4 ]
[ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
[ print_uint::w#2 print_uint::w#0 print_uint::w#1 ]
[ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
[ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
[ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 ]
Added variable mulf16u::return#0 to live range equivalence class [ mulf16u::return#0 ]
Added variable main::r#0 to live range equivalence class [ main::r#0 ]
Added variable print_ulong::dw#0 to live range equivalence class [ print_ulong::dw#0 ]
Added variable mulf_init::$1 to live range equivalence class [ mulf_init::$1 ]
Added variable mulf_init::$4 to live range equivalence class [ mulf_init::$4 ]
Added variable mulf_init::$5 to live range equivalence class [ mulf_init::$5 ]
Added variable mulf16u::return#1 to live range equivalence class [ mulf16u::return#1 ]
Added variable print_uchar::$0 to live range equivalence class [ print_uchar::$0 ]
Added variable print_uchar::$2 to live range equivalence class [ print_uchar::$2 ]
Complete equivalence classes
[ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ]
[ mulf_init::c#2 mulf_init::c#1 ]
[ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
[ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
[ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
[ mulf_init::x_255#2 mulf_init::x_255#1 ]
[ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
[ mulf_init::dir#2 mulf_init::dir#4 ]
[ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
[ print_uint::w#2 print_uint::w#0 print_uint::w#1 ]
[ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
[ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
[ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 ]
[ mulf16u::return#0 ]
[ main::r#0 ]
[ print_ulong::dw#0 ]
[ mulf_init::$1 ]
[ mulf_init::$4 ]
[ mulf_init::$5 ]
[ mulf16u::return#1 ]
[ print_uchar::$0 ]
[ print_uchar::$2 ]
Allocated zp[1]:2 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
Allocated zp[2]:3 [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 ]
Allocated zp[1]:5 [ print_uchar::$0 ]
Allocated zp[1]:6 [ print_uchar::$2 ]
Allocated zp[1]:7 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Allocated zp[2]:8 [ print_uint::w#2 print_uint::w#0 print_uint::w#1 ]
Allocated zp[2]:10 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
Allocated zp[2]:12 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
Allocated zp[2]:14 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ]
Allocated zp[1]:16 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
Allocated zp[1]:17 [ mulf_init::$1 ]
Allocated zp[1]:18 [ mulf_init::$4 ]
Allocated zp[1]:19 [ mulf_init::$5 ]
Allocated zp[1]:20 [ mulf_init::x_255#2 mulf_init::x_255#1 ]
Allocated zp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ]
Allocated zp[1]:22 [ mulf_init::c#2 mulf_init::c#1 ]
Allocated zp[2]:23 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
Allocated zp[2]:25 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
Allocated zp[4]:27 [ print_ulong::dw#0 ]
Allocated zp[4]:31 [ mulf16u::return#1 ]
Allocated zp[4]:35 [ mulf16u::return#0 ]
Allocated zp[4]:39 [ main::r#0 ]
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [4] if(*RASTER!=$ff) goto main::@2 [ print_char_cursor#15 ] ( [ print_char_cursor#15 ] { } ) always clobbers reg byte a
Statement [7] mulf16u::return#0 = mulf16u::return#1 [ print_char_cursor#15 mulf16u::return#0 ] ( [ print_char_cursor#15 mulf16u::return#0 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) always clobbers reg byte a
Statement [8] main::r#0 = mulf16u::return#0 [ print_char_cursor#15 main::r#0 ] ( [ print_char_cursor#15 main::r#0 ] { { print_ulong::dw#0 = main::r#0 } } ) always clobbers reg byte a
Statement [10] print_ulong::dw#0 = main::r#0 [ print_char_cursor#15 print_ulong::dw#0 ] ( [ print_char_cursor#15 print_ulong::dw#0 ] { { print_ulong::dw#0 = main::r#0 } } ) always clobbers reg byte a
Statement [14] if(mulf_init::sqr1_lo#2!=mulf_sqr1_lo+$200) goto mulf_init::@2 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ( mulf_init:1 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] { } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:22 [ mulf_init::c#2 mulf_init::c#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:16 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
Statement [16] if(mulf_init::sqr2_lo#2!=mulf_sqr2_lo+$1ff) goto mulf_init::@6 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( mulf_init:1 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] { } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:20 [ mulf_init::x_255#2 mulf_init::x_255#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ]
Statement [17] *(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+$100) [ ] ( mulf_init:1 [ ] { } ) always clobbers reg byte a
Statement [18] *(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+$100) [ ] ( mulf_init:1 [ ] { } ) always clobbers reg byte a
Statement [20] *mulf_init::sqr2_lo#2 = mulf_sqr1_lo[mulf_init::x_255#2] [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( mulf_init:1 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] { } ) always clobbers reg byte a reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:20 [ mulf_init::x_255#2 mulf_init::x_255#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ]
Statement [21] *mulf_init::sqr2_hi#2 = mulf_sqr1_hi[mulf_init::x_255#2] [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( mulf_init:1 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] { } ) always clobbers reg byte a reg byte y
Statement [23] mulf_init::x_255#1 = mulf_init::x_255#2 + mulf_init::dir#2 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] ( mulf_init:1 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] { } ) always clobbers reg byte a
Statement [29] mulf_init::$1 = mulf_init::c#1 & 1 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$1 ] ( mulf_init:1 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$1 ] { } ) always clobbers reg byte a
Statement [35] *mulf_init::sqr1_lo#2 = mulf_init::$4 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( mulf_init:1 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] { } ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:22 [ mulf_init::c#2 mulf_init::c#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:16 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
Statement [37] *mulf_init::sqr1_hi#2 = mulf_init::$5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( mulf_init:1 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] { } ) always clobbers reg byte y
Statement [39] mulf_init::sqr#1 = mulf_init::sqr#3 + mulf_init::x_2#2 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ( mulf_init:1 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] { } ) always clobbers reg byte a
Statement [41] *mulf16u::memA = main::a [ ] ( mulf16u:6 [ print_char_cursor#15 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) always clobbers reg byte a
Statement [42] *mulf16u::memB = main::b [ ] ( mulf16u:6 [ print_char_cursor#15 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) always clobbers reg byte a
Statement asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: } always clobbers reg byte a reg byte x
Statement [44] mulf16u::return#1 = *mulf16u::memR [ mulf16u::return#1 ] ( mulf16u:6 [ print_char_cursor#15 mulf16u::return#1 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) always clobbers reg byte a
Statement [46] print_uint::w#0 = word1 print_ulong::dw#0 [ print_char_cursor#15 print_ulong::dw#0 print_uint::w#0 ] ( print_ulong:11 [ print_char_cursor#15 print_ulong::dw#0 print_uint::w#0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } } ) always clobbers reg byte a
Statement [48] print_uint::w#1 = word0 print_ulong::dw#0 [ print_uint::w#1 print_char_cursor#10 ] ( print_ulong:11 [ print_uint::w#1 print_char_cursor#10 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 } } ) always clobbers reg byte a
Statement [58] print_uchar::$0 = print_uchar::b#2 >> 4 [ print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] ( print_ulong:11::print_uint:47::print_uchar:53 [ print_ulong::dw#0 print_uint::w#2 print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:53 [ print_uint::w#2 print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55 [ print_ulong::dw#0 print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55 [ print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:7 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Statement [61] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#10 print_uchar::$2 ] ( print_ulong:11::print_uint:47::print_uchar:53 [ print_ulong::dw#0 print_uint::w#2 print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#10 = print_char_cursor#28 } } print_ulong:11::print_uint:49::print_uchar:53 [ print_uint::w#2 print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55 [ print_ulong::dw#0 print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55 [ print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } ) always clobbers reg byte a
Statement [66] *print_char_cursor#28 = print_char::ch#2 [ print_char_cursor#28 ] ( print_ulong:11::print_uint:47::print_uchar:53::print_char:60 [ print_ulong::dw#0 print_uint::w#2 print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:53::print_char:60 [ print_uint::w#2 print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55::print_char:60 [ print_ulong::dw#0 print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55::print_char:60 [ print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:53::print_char:63 [ print_ulong::dw#0 print_uint::w#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#10 = print_char_cursor#28 } } print_ulong:11::print_uint:49::print_uchar:53::print_char:63 [ print_uint::w#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55::print_char:63 [ print_ulong::dw#0 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55::print_char:63 [ print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:7 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Statement [4] if(*RASTER!=$ff) goto main::@2 [ print_char_cursor#15 ] ( [ print_char_cursor#15 ] { } ) always clobbers reg byte a
Statement [7] mulf16u::return#0 = mulf16u::return#1 [ print_char_cursor#15 mulf16u::return#0 ] ( [ print_char_cursor#15 mulf16u::return#0 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) always clobbers reg byte a
Statement [8] main::r#0 = mulf16u::return#0 [ print_char_cursor#15 main::r#0 ] ( [ print_char_cursor#15 main::r#0 ] { { print_ulong::dw#0 = main::r#0 } } ) always clobbers reg byte a
Statement [10] print_ulong::dw#0 = main::r#0 [ print_char_cursor#15 print_ulong::dw#0 ] ( [ print_char_cursor#15 print_ulong::dw#0 ] { { print_ulong::dw#0 = main::r#0 } } ) always clobbers reg byte a
Statement [14] if(mulf_init::sqr1_lo#2!=mulf_sqr1_lo+$200) goto mulf_init::@2 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ( mulf_init:1 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] { } ) always clobbers reg byte a
Statement [16] if(mulf_init::sqr2_lo#2!=mulf_sqr2_lo+$1ff) goto mulf_init::@6 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( mulf_init:1 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] { } ) always clobbers reg byte a
Statement [17] *(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+$100) [ ] ( mulf_init:1 [ ] { } ) always clobbers reg byte a
Statement [18] *(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+$100) [ ] ( mulf_init:1 [ ] { } ) always clobbers reg byte a
Statement [20] *mulf_init::sqr2_lo#2 = mulf_sqr1_lo[mulf_init::x_255#2] [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( mulf_init:1 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] { } ) always clobbers reg byte a reg byte y
Statement [21] *mulf_init::sqr2_hi#2 = mulf_sqr1_hi[mulf_init::x_255#2] [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( mulf_init:1 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] { } ) always clobbers reg byte a reg byte y
Statement [23] mulf_init::x_255#1 = mulf_init::x_255#2 + mulf_init::dir#2 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] ( mulf_init:1 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] { } ) always clobbers reg byte a
Statement [29] mulf_init::$1 = mulf_init::c#1 & 1 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$1 ] ( mulf_init:1 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$1 ] { } ) always clobbers reg byte a
Statement [35] *mulf_init::sqr1_lo#2 = mulf_init::$4 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( mulf_init:1 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] { } ) always clobbers reg byte y
Statement [37] *mulf_init::sqr1_hi#2 = mulf_init::$5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( mulf_init:1 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] { } ) always clobbers reg byte y
Statement [39] mulf_init::sqr#1 = mulf_init::sqr#3 + mulf_init::x_2#2 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ( mulf_init:1 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] { } ) always clobbers reg byte a
Statement [41] *mulf16u::memA = main::a [ ] ( mulf16u:6 [ print_char_cursor#15 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) always clobbers reg byte a
Statement [42] *mulf16u::memB = main::b [ ] ( mulf16u:6 [ print_char_cursor#15 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) always clobbers reg byte a
Statement asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: } always clobbers reg byte a reg byte x
Statement [44] mulf16u::return#1 = *mulf16u::memR [ mulf16u::return#1 ] ( mulf16u:6 [ print_char_cursor#15 mulf16u::return#1 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) always clobbers reg byte a
Statement [46] print_uint::w#0 = word1 print_ulong::dw#0 [ print_char_cursor#15 print_ulong::dw#0 print_uint::w#0 ] ( print_ulong:11 [ print_char_cursor#15 print_ulong::dw#0 print_uint::w#0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } } ) always clobbers reg byte a
Statement [48] print_uint::w#1 = word0 print_ulong::dw#0 [ print_uint::w#1 print_char_cursor#10 ] ( print_ulong:11 [ print_uint::w#1 print_char_cursor#10 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 } } ) always clobbers reg byte a
Statement [58] print_uchar::$0 = print_uchar::b#2 >> 4 [ print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] ( print_ulong:11::print_uint:47::print_uchar:53 [ print_ulong::dw#0 print_uint::w#2 print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:53 [ print_uint::w#2 print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55 [ print_ulong::dw#0 print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55 [ print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } ) always clobbers reg byte a
Statement [61] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#10 print_uchar::$2 ] ( print_ulong:11::print_uint:47::print_uchar:53 [ print_ulong::dw#0 print_uint::w#2 print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#10 = print_char_cursor#28 } } print_ulong:11::print_uint:49::print_uchar:53 [ print_uint::w#2 print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55 [ print_ulong::dw#0 print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55 [ print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } ) always clobbers reg byte a
Statement [66] *print_char_cursor#28 = print_char::ch#2 [ print_char_cursor#28 ] ( print_ulong:11::print_uint:47::print_uchar:53::print_char:60 [ print_ulong::dw#0 print_uint::w#2 print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:53::print_char:60 [ print_uint::w#2 print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55::print_char:60 [ print_ulong::dw#0 print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55::print_char:60 [ print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:53::print_char:63 [ print_ulong::dw#0 print_uint::w#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#10 = print_char_cursor#28 } } print_ulong:11::print_uint:49::print_uchar:53::print_char:63 [ print_uint::w#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55::print_char:63 [ print_ulong::dw#0 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55::print_char:63 [ print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } ) always clobbers reg byte y
Potential registers zp[2]:14 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] : zp[2]:14 ,
Potential registers zp[1]:22 [ mulf_init::c#2 mulf_init::c#1 ] : zp[1]:22 , reg byte x ,
Potential registers zp[2]:25 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] : zp[2]:25 ,
Potential registers zp[1]:16 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] : zp[1]:16 , reg byte x ,
Potential registers zp[2]:12 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] : zp[2]:12 ,
Potential registers zp[1]:20 [ mulf_init::x_255#2 mulf_init::x_255#1 ] : zp[1]:20 , reg byte x ,
Potential registers zp[2]:23 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] : zp[2]:23 ,
Potential registers zp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ] : zp[1]:21 , reg byte x ,
Potential registers zp[2]:10 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] : zp[2]:10 ,
Potential registers zp[2]:8 [ print_uint::w#2 print_uint::w#0 print_uint::w#1 ] : zp[2]:8 ,
Potential registers zp[1]:7 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] : zp[1]:7 , reg byte x ,
Potential registers zp[1]:2 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[2]:3 [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 ] : zp[2]:3 ,
Potential registers zp[4]:35 [ mulf16u::return#0 ] : zp[4]:35 ,
Potential registers zp[4]:39 [ main::r#0 ] : zp[4]:39 ,
Potential registers zp[4]:27 [ print_ulong::dw#0 ] : zp[4]:27 ,
Potential registers zp[1]:17 [ mulf_init::$1 ] : zp[1]:17 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:18 [ mulf_init::$4 ] : zp[1]:18 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:19 [ mulf_init::$5 ] : zp[1]:19 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[4]:31 [ mulf16u::return#1 ] : zp[4]:31 ,
Potential registers zp[1]:5 [ print_uchar::$0 ] : zp[1]:5 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:6 [ print_uchar::$2 ] : zp[1]:6 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [print_char] 160,007: zp[1]:2 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
Uplift Scope [] 123,162.18: zp[2]:3 [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 ]
Uplift Scope [print_uchar] 20,002: zp[1]:5 [ print_uchar::$0 ] 20,002: zp[1]:6 [ print_uchar::$2 ] 9,505: zp[1]:7 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Uplift Scope [mulf_init] 437.67: zp[2]:10 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] 246.89: zp[2]:12 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] 230.86: zp[2]:14 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] 212.1: zp[1]:16 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] 202: zp[1]:17 [ mulf_init::$1 ] 202: zp[1]:18 [ mulf_init::$4 ] 202: zp[1]:19 [ mulf_init::$5 ] 141.4: zp[1]:20 [ mulf_init::x_255#2 mulf_init::x_255#1 ] 138.88: zp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ] 124.31: zp[1]:22 [ mulf_init::c#2 mulf_init::c#1 ] 109.42: zp[2]:23 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] 92.58: zp[2]:25 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
Uplift Scope [print_uint] 1,138.67: zp[2]:8 [ print_uint::w#2 print_uint::w#0 print_uint::w#1 ]
Uplift Scope [print_ulong] 71: zp[4]:27 [ print_ulong::dw#0 ]
Uplift Scope [mulf16u] 37.33: zp[4]:31 [ mulf16u::return#1 ] 22: zp[4]:35 [ mulf16u::return#0 ]
Uplift Scope [main] 11: zp[4]:39 [ main::r#0 ]
Uplift Scope [RADIX]
Uplifting [print_char] best 6155 combination reg byte a [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
Uplifting [] best 6155 combination zp[2]:3 [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 ]
Uplifting [print_uchar] best 6137 combination reg byte a [ print_uchar::$0 ] reg byte x [ print_uchar::$2 ] reg byte x [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Uplifting [mulf_init] best 5907 combination zp[2]:10 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] zp[2]:12 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] zp[2]:14 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] reg byte x [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] reg byte a [ mulf_init::$1 ] reg byte a [ mulf_init::$4 ] reg byte a [ mulf_init::$5 ] zp[1]:20 [ mulf_init::x_255#2 mulf_init::x_255#1 ] zp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ] zp[1]:22 [ mulf_init::c#2 mulf_init::c#1 ] zp[2]:23 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] zp[2]:25 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
Limited combination testing to 100 combinations of 1024 possible.
Uplifting [print_uint] best 5907 combination zp[2]:8 [ print_uint::w#2 print_uint::w#0 print_uint::w#1 ]
Uplifting [print_ulong] best 5907 combination zp[4]:27 [ print_ulong::dw#0 ]
Uplifting [mulf16u] best 5907 combination zp[4]:31 [ mulf16u::return#1 ] zp[4]:35 [ mulf16u::return#0 ]
Uplifting [main] best 5907 combination zp[4]:39 [ main::r#0 ]
Uplifting [RADIX] best 5907 combination
Attempting to uplift remaining variables inzp[1]:20 [ mulf_init::x_255#2 mulf_init::x_255#1 ]
Uplifting [mulf_init] best 5787 combination reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ]
Attempting to uplift remaining variables inzp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ]
Uplifting [mulf_init] best 5787 combination zp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ]
Attempting to uplift remaining variables inzp[1]:22 [ mulf_init::c#2 mulf_init::c#1 ]
Uplifting [mulf_init] best 5787 combination zp[1]:22 [ mulf_init::c#2 mulf_init::c#1 ]
Coalescing zero page register [ zp[4]:35 [ mulf16u::return#0 ] ] with [ zp[4]:39 [ main::r#0 ] ] - score: 1
Coalescing zero page register [ zp[4]:35 [ mulf16u::return#0 main::r#0 ] ] with [ zp[4]:31 [ mulf16u::return#1 ] ] - score: 1
Coalescing zero page register [ zp[4]:35 [ mulf16u::return#0 main::r#0 mulf16u::return#1 ] ] with [ zp[4]:27 [ print_ulong::dw#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:8 [ print_uint::w#2 print_uint::w#0 print_uint::w#1 ] ] with [ zp[2]:14 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] ]
Coalescing zero page register [ zp[2]:3 [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 ] ] with [ zp[2]:25 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] ]
Allocated (was zp[2]:3) zp[2]:2 [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
Allocated (was zp[2]:8) zp[2]:4 [ print_uint::w#2 print_uint::w#0 print_uint::w#1 mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ]
Allocated (was zp[2]:10) zp[2]:6 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
Allocated (was zp[2]:12) zp[2]:8 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
Allocated (was zp[4]:35) zp[4]:10 [ mulf16u::return#0 main::r#0 mulf16u::return#1 print_ulong::dw#0 ]
Allocated (was zp[1]:21) zp[1]:14 [ mulf_init::dir#2 mulf_init::dir#4 ]
Allocated (was zp[1]:22) zp[1]:15 [ mulf_init::c#2 mulf_init::c#1 ]
Allocated (was zp[2]:23) zp[2]:16 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
/// @file
/// A lightweight library for printing on the C64.
///
/// Printing with this library is done by calling print_ function for each element
// Upstart
// Commodore 64 PRG executable file
.file [name="min-fmul-16.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 RASTER = $d012
.label BORDER_COLOR = $d020
.label SCREEN = $400
.label print_char_cursor = 2
.segment Code
// main
main: {
.label a = $4d2
.label b = $929
.label r = $a
// [1] call mulf_init
// [12] phi from main to mulf_init [phi:main->mulf_init]
mulf_init_from_main:
jsr mulf_init
jmp __b4
// main::@4
__b4:
// asm { sei }
sei
// [3] phi from main::@4 to main::@1 [phi:main::@4->main::@1]
__b1_from___b4:
// [3] phi print_char_cursor#15 = (char *) 1024 [phi:main::@4->main::@1#0] -- pbuz1=pbuc1
lda #<$400
sta.z print_char_cursor
lda #>$400
sta.z print_char_cursor+1
jmp __b1
// main::@1
__b1:
jmp __b2
// main::@2
__b2:
// [4] if(*RASTER!=$ff) goto main::@2 -- _deref_pbuc1_neq_vbuc2_then_la1
lda #$ff
cmp RASTER
bne __b2
jmp __b3
// main::@3
__b3:
// [5] *BORDER_COLOR = ++ *BORDER_COLOR -- _deref_pbuc1=_inc__deref_pbuc1
inc BORDER_COLOR
// [6] call mulf16u
jsr mulf16u
// [7] mulf16u::return#0 = mulf16u::return#1
jmp __b5
// main::@5
__b5:
// [8] main::r#0 = mulf16u::return#0
// [9] *BORDER_COLOR = -- *BORDER_COLOR -- _deref_pbuc1=_dec__deref_pbuc1
dec BORDER_COLOR
// [10] print_ulong::dw#0 = main::r#0
// [11] call print_ulong
jsr print_ulong
// [3] phi from main::@5 to main::@1 [phi:main::@5->main::@1]
__b1_from___b5:
// [3] phi print_char_cursor#15 = SCREEN [phi:main::@5->main::@1#0] -- pbuz1=pbuc1
lda #<SCREEN
sta.z print_char_cursor
lda #>SCREEN
sta.z print_char_cursor+1
jmp __b1
}
// mulf_init
// Initialize the mulf_sqr multiplication tables with f(x)=int(x*x/4)
mulf_init: {
// x/2
.label c = $f
// Counter used for determining x%2==0
.label sqr1_hi = 2
// Fill mulf_sqr1 = f(x) = int(x*x/4): If f(x) = x*x/4 then f(x+1) = f(x) + x/2 + 1/4
.label sqr = 6
.label sqr1_lo = 4
// Decrease or increase x_255 - initially we decrease
.label sqr2_hi = $10
.label sqr2_lo = 8
//Start with g(0)=f(255)
.label dir = $e
// [13] phi from mulf_init to mulf_init::@1 [phi:mulf_init->mulf_init::@1]
__b1_from_mulf_init:
// [13] phi mulf_init::x_2#3 = 0 [phi:mulf_init->mulf_init::@1#0] -- vbuxx=vbuc1
ldx #0
// [13] phi mulf_init::sqr1_hi#2 = mulf_sqr1_hi+1 [phi:mulf_init->mulf_init::@1#1] -- pbuz1=pbuc1
lda #<mulf_sqr1_hi+1
sta.z sqr1_hi
lda #>mulf_sqr1_hi+1
sta.z sqr1_hi+1
// [13] phi mulf_init::sqr#4 = 0 [phi:mulf_init->mulf_init::@1#2] -- vwuz1=vwuc1
lda #<0
sta.z sqr
lda #>0
sta.z sqr+1
// [13] phi mulf_init::c#2 = 0 [phi:mulf_init->mulf_init::@1#3] -- vbuz1=vbuc1
lda #0
sta.z c
// [13] phi mulf_init::sqr1_lo#2 = mulf_sqr1_lo+1 [phi:mulf_init->mulf_init::@1#4] -- pbuz1=pbuc1
lda #<mulf_sqr1_lo+1
sta.z sqr1_lo
lda #>mulf_sqr1_lo+1
sta.z sqr1_lo+1
jmp __b1
// mulf_init::@1
__b1:
// [14] if(mulf_init::sqr1_lo#2!=mulf_sqr1_lo+$200) goto mulf_init::@2 -- pbuz1_neq_pbuc1_then_la1
lda.z sqr1_lo+1
cmp #>mulf_sqr1_lo+$200
bne __b2
lda.z sqr1_lo
cmp #<mulf_sqr1_lo+$200
bne __b2
// [15] phi from mulf_init::@1 to mulf_init::@5 [phi:mulf_init::@1->mulf_init::@5]
__b5_from___b1:
// [15] phi mulf_init::dir#2 = $ff [phi:mulf_init::@1->mulf_init::@5#0] -- vbuz1=vbuc1
lda #$ff
sta.z dir
// [15] phi mulf_init::sqr2_hi#2 = mulf_sqr2_hi [phi:mulf_init::@1->mulf_init::@5#1] -- pbuz1=pbuc1
lda #<mulf_sqr2_hi
sta.z sqr2_hi
lda #>mulf_sqr2_hi
sta.z sqr2_hi+1
// [15] phi mulf_init::x_255#2 = -1 [phi:mulf_init::@1->mulf_init::@5#2] -- vbuxx=vbuc1
ldx #-1
// [15] phi mulf_init::sqr2_lo#2 = mulf_sqr2_lo [phi:mulf_init::@1->mulf_init::@5#3] -- pbuz1=pbuc1
lda #<mulf_sqr2_lo
sta.z sqr2_lo
lda #>mulf_sqr2_lo
sta.z sqr2_lo+1
jmp __b5
// mulf_init::@5
__b5:
// [16] if(mulf_init::sqr2_lo#2!=mulf_sqr2_lo+$1ff) goto mulf_init::@6 -- pbuz1_neq_pbuc1_then_la1
lda.z sqr2_lo+1
cmp #>mulf_sqr2_lo+$1ff
bne __b6
lda.z sqr2_lo
cmp #<mulf_sqr2_lo+$1ff
bne __b6
jmp __b7
// mulf_init::@7
__b7:
// [17] *(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+$100) -- _deref_pbuc1=_deref_pbuc2
// Set the very last value g(511) = f(256)
lda mulf_sqr1_lo+$100
sta mulf_sqr2_lo+$1ff
// [18] *(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+$100) -- _deref_pbuc1=_deref_pbuc2
lda mulf_sqr1_hi+$100
sta mulf_sqr2_hi+$1ff
jmp __breturn
// mulf_init::@return
__breturn:
// [19] return
rts
// mulf_init::@6
__b6:
// [20] *mulf_init::sqr2_lo#2 = mulf_sqr1_lo[mulf_init::x_255#2] -- _deref_pbuz1=pbuc1_derefidx_vbuxx
lda mulf_sqr1_lo,x
ldy #0
sta (sqr2_lo),y
// [21] *mulf_init::sqr2_hi#2 = mulf_sqr1_hi[mulf_init::x_255#2] -- _deref_pbuz1=pbuc1_derefidx_vbuxx
lda mulf_sqr1_hi,x
ldy #0
sta (sqr2_hi),y
// [22] mulf_init::sqr2_hi#1 = ++ mulf_init::sqr2_hi#2 -- pbuz1=_inc_pbuz1
inc.z sqr2_hi
bne !+
inc.z sqr2_hi+1
!:
// [23] mulf_init::x_255#1 = mulf_init::x_255#2 + mulf_init::dir#2 -- vbuxx=vbuxx_plus_vbuz1
txa
clc
adc.z dir
tax
// [24] if(mulf_init::x_255#1!=0) goto mulf_init::@9 -- vbuxx_neq_0_then_la1
cpx #0
bne __b9_from___b6
// [26] phi from mulf_init::@6 to mulf_init::@8 [phi:mulf_init::@6->mulf_init::@8]
__b8_from___b6:
// [26] phi mulf_init::dir#4 = 1 [phi:mulf_init::@6->mulf_init::@8#0] -- vbuz1=vbuc1
lda #1
sta.z dir
jmp __b8
// [25] phi from mulf_init::@6 to mulf_init::@9 [phi:mulf_init::@6->mulf_init::@9]
__b9_from___b6:
jmp __b9
// mulf_init::@9
__b9:
// [26] phi from mulf_init::@9 to mulf_init::@8 [phi:mulf_init::@9->mulf_init::@8]
__b8_from___b9:
// [26] phi mulf_init::dir#4 = mulf_init::dir#2 [phi:mulf_init::@9->mulf_init::@8#0] -- register_copy
jmp __b8
// mulf_init::@8
__b8:
// [27] mulf_init::sqr2_lo#1 = ++ mulf_init::sqr2_lo#2 -- pbuz1=_inc_pbuz1
inc.z sqr2_lo
bne !+
inc.z sqr2_lo+1
!:
// [15] phi from mulf_init::@8 to mulf_init::@5 [phi:mulf_init::@8->mulf_init::@5]
__b5_from___b8:
// [15] phi mulf_init::dir#2 = mulf_init::dir#4 [phi:mulf_init::@8->mulf_init::@5#0] -- register_copy
// [15] phi mulf_init::sqr2_hi#2 = mulf_init::sqr2_hi#1 [phi:mulf_init::@8->mulf_init::@5#1] -- register_copy
// [15] phi mulf_init::x_255#2 = mulf_init::x_255#1 [phi:mulf_init::@8->mulf_init::@5#2] -- register_copy
// [15] phi mulf_init::sqr2_lo#2 = mulf_init::sqr2_lo#1 [phi:mulf_init::@8->mulf_init::@5#3] -- register_copy
jmp __b5
// mulf_init::@2
__b2:
// [28] mulf_init::c#1 = ++ mulf_init::c#2 -- vbuz1=_inc_vbuz1
inc.z c
// [29] mulf_init::$1 = mulf_init::c#1 & 1 -- vbuaa=vbuz1_band_vbuc1
lda #1
and.z c
// [30] if(mulf_init::$1!=0) goto mulf_init::@3 -- vbuaa_neq_0_then_la1
cmp #0
bne __b3_from___b2
jmp __b4
// mulf_init::@4
__b4:
// [31] mulf_init::x_2#1 = ++ mulf_init::x_2#3 -- vbuxx=_inc_vbuxx
inx
// [32] mulf_init::sqr#2 = ++ mulf_init::sqr#4 -- vwuz1=_inc_vwuz1
inc.z sqr
bne !+
inc.z sqr+1
!:
// [33] phi from mulf_init::@2 mulf_init::@4 to mulf_init::@3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3]
__b3_from___b2:
__b3_from___b4:
// [33] phi mulf_init::x_2#2 = mulf_init::x_2#3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#0] -- register_copy
// [33] phi mulf_init::sqr#3 = mulf_init::sqr#4 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#1] -- register_copy
jmp __b3
// mulf_init::@3
__b3:
// [34] mulf_init::$4 = byte0 mulf_init::sqr#3 -- vbuaa=_byte0_vwuz1
lda.z sqr
// [35] *mulf_init::sqr1_lo#2 = mulf_init::$4 -- _deref_pbuz1=vbuaa
ldy #0
sta (sqr1_lo),y
// [36] mulf_init::$5 = byte1 mulf_init::sqr#3 -- vbuaa=_byte1_vwuz1
lda.z sqr+1
// [37] *mulf_init::sqr1_hi#2 = mulf_init::$5 -- _deref_pbuz1=vbuaa
ldy #0
sta (sqr1_hi),y
// [38] mulf_init::sqr1_hi#1 = ++ mulf_init::sqr1_hi#2 -- pbuz1=_inc_pbuz1
inc.z sqr1_hi
bne !+
inc.z sqr1_hi+1
!:
// [39] mulf_init::sqr#1 = mulf_init::sqr#3 + mulf_init::x_2#2 -- vwuz1=vwuz1_plus_vbuxx
txa
clc
adc.z sqr
sta.z sqr
bcc !+
inc.z sqr+1
!:
// [40] mulf_init::sqr1_lo#1 = ++ mulf_init::sqr1_lo#2 -- pbuz1=_inc_pbuz1
inc.z sqr1_lo
bne !+
inc.z sqr1_lo+1
!:
// [13] phi from mulf_init::@3 to mulf_init::@1 [phi:mulf_init::@3->mulf_init::@1]
__b1_from___b3:
// [13] phi mulf_init::x_2#3 = mulf_init::x_2#2 [phi:mulf_init::@3->mulf_init::@1#0] -- register_copy
// [13] phi mulf_init::sqr1_hi#2 = mulf_init::sqr1_hi#1 [phi:mulf_init::@3->mulf_init::@1#1] -- register_copy
// [13] phi mulf_init::sqr#4 = mulf_init::sqr#1 [phi:mulf_init::@3->mulf_init::@1#2] -- register_copy
// [13] phi mulf_init::c#2 = mulf_init::c#1 [phi:mulf_init::@3->mulf_init::@1#3] -- register_copy
// [13] phi mulf_init::sqr1_lo#2 = mulf_init::sqr1_lo#1 [phi:mulf_init::@3->mulf_init::@1#4] -- register_copy
jmp __b1
}
// mulf16u
// Fast multiply two unsigned words to a double word result
// Done in assembler to utilize fast addition A+X
// __zp($a) unsigned long mulf16u(unsigned int a, unsigned int b)
mulf16u: {
.label memA = $f8
.label memB = $fa
.label memR = $fc
.label return = $a
// [41] *mulf16u::memA = main::a -- _deref_pwuc1=vwuc2
lda #<main.a
sta.z memA
lda #>main.a
sta.z memA+1
// [42] *mulf16u::memB = main::b -- _deref_pwuc1=vwuc2
lda #<main.b
sta.z memB
lda #>main.b
sta.z memB+1
// asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: }
lda memA
sta sm1a+1
sta sm3a+1
sta sm5a+1
sta sm7a+1
eor #$ff
sta sm2a+1
sta sm4a+1
sta sm6a+1
sta sm8a+1
lda memA+1
sta sm1b+1
sta sm3b+1
sta sm5b+1
sta sm7b+1
eor #$ff
sta sm2b+1
sta sm4b+1
sta sm6b+1
sta sm8b+1
ldx memB
sec
sm1a:
lda mulf_sqr1_lo,x
sm2a:
sbc mulf_sqr2_lo,x
sta memR+0
sm3a:
lda mulf_sqr1_hi,x
sm4a:
sbc mulf_sqr2_hi,x
sta _AA+1
sec
sm1b:
lda mulf_sqr1_lo,x
sm2b:
sbc mulf_sqr2_lo,x
sta _cc+1
sm3b:
lda mulf_sqr1_hi,x
sm4b:
sbc mulf_sqr2_hi,x
sta _CC+1
ldx memB+1
sec
sm5a:
lda mulf_sqr1_lo,x
sm6a:
sbc mulf_sqr2_lo,x
sta _bb+1
sm7a:
lda mulf_sqr1_hi,x
sm8a:
sbc mulf_sqr2_hi,x
sta _BB+1
sec
sm5b:
lda mulf_sqr1_lo,x
sm6b:
sbc mulf_sqr2_lo,x
sta _dd+1
sm7b:
lda mulf_sqr1_hi,x
sm8b:
sbc mulf_sqr2_hi,x
sta memR+3
clc
_AA:
lda #0
_bb:
adc #0
sta memR+1
_BB:
lda #0
_CC:
adc #0
sta memR+2
bcc !+
inc memR+3
clc
!:
_cc:
lda #0
adc memR+1
sta memR+1
_dd:
lda #0
adc memR+2
sta memR+2
bcc !+
inc memR+3
!:
// [44] mulf16u::return#1 = *mulf16u::memR -- vduz1=_deref_pduc1
lda.z memR
sta.z return
lda.z memR+1
sta.z return+1
lda.z memR+2
sta.z return+2
lda.z memR+3
sta.z return+3
jmp __breturn
// mulf16u::@return
__breturn:
// [45] return
rts
}
// print_ulong
// Print a unsigned long as HEX
// void print_ulong(__zp($a) unsigned long dw)
print_ulong: {
.label dw = $a
// [46] print_uint::w#0 = word1 print_ulong::dw#0 -- vwuz1=_word1_vduz2
lda.z dw+2
sta.z print_uint.w
lda.z dw+3
sta.z print_uint.w+1
// [47] call print_uint
// [51] phi from print_ulong to print_uint [phi:print_ulong->print_uint]
print_uint_from_print_ulong:
// [51] phi print_char_cursor#36 = print_char_cursor#15 [phi:print_ulong->print_uint#0] -- register_copy
// [51] phi print_uint::w#2 = print_uint::w#0 [phi:print_ulong->print_uint#1] -- register_copy
jsr print_uint
jmp __b1
// print_ulong::@1
__b1:
// [48] print_uint::w#1 = word0 print_ulong::dw#0 -- vwuz1=_word0_vduz2
lda.z dw
sta.z print_uint.w
lda.z dw+1
sta.z print_uint.w+1
// [49] call print_uint
// [51] phi from print_ulong::@1 to print_uint [phi:print_ulong::@1->print_uint]
print_uint_from___b1:
// [51] phi print_char_cursor#36 = print_char_cursor#10 [phi:print_ulong::@1->print_uint#0] -- register_copy
// [51] phi print_uint::w#2 = print_uint::w#1 [phi:print_ulong::@1->print_uint#1] -- register_copy
jsr print_uint
jmp __breturn
// print_ulong::@return
__breturn:
// [50] return
rts
}
// print_uint
// Print a unsigned int as HEX
// void print_uint(__zp(4) unsigned int w)
print_uint: {
.label w = 4
// [52] print_uchar::b#0 = byte1 print_uint::w#2 -- vbuxx=_byte1_vwuz1
ldx.z w+1
// [53] call print_uchar
// [57] phi from print_uint to print_uchar [phi:print_uint->print_uchar]
print_uchar_from_print_uint:
// [57] phi print_char_cursor#38 = print_char_cursor#36 [phi:print_uint->print_uchar#0] -- register_copy
// [57] phi print_uchar::b#2 = print_uchar::b#0 [phi:print_uint->print_uchar#1] -- register_copy
jsr print_uchar
jmp __b1
// print_uint::@1
__b1:
// [54] print_uchar::b#1 = byte0 print_uint::w#2 -- vbuxx=_byte0_vwuz1
ldx.z w
// [55] call print_uchar
// [57] phi from print_uint::@1 to print_uchar [phi:print_uint::@1->print_uchar]
print_uchar_from___b1:
// [57] phi print_char_cursor#38 = print_char_cursor#10 [phi:print_uint::@1->print_uchar#0] -- register_copy
// [57] phi print_uchar::b#2 = print_uchar::b#1 [phi:print_uint::@1->print_uchar#1] -- register_copy
jsr print_uchar
jmp __breturn
// print_uint::@return
__breturn:
// [56] return
rts
}
// print_uchar
// Print a char as HEX
// void print_uchar(__register(X) char b)
print_uchar: {
// [58] print_uchar::$0 = print_uchar::b#2 >> 4 -- vbuaa=vbuxx_ror_4
txa
lsr
lsr
lsr
lsr
// [59] print_char::ch#0 = print_hextab[print_uchar::$0] -- vbuaa=pbuc1_derefidx_vbuaa
tay
lda print_hextab,y
// [60] call print_char
// Table of hexadecimal digits
// [65] phi from print_uchar to print_char [phi:print_uchar->print_char]
print_char_from_print_uchar:
// [65] phi print_char_cursor#28 = print_char_cursor#38 [phi:print_uchar->print_char#0] -- register_copy
// [65] phi print_char::ch#2 = print_char::ch#0 [phi:print_uchar->print_char#1] -- register_copy
jsr print_char
jmp __b1
// print_uchar::@1
__b1:
// [61] print_uchar::$2 = print_uchar::b#2 & $f -- vbuxx=vbuxx_band_vbuc1
lda #$f
axs #0
// [62] print_char::ch#1 = print_hextab[print_uchar::$2] -- vbuaa=pbuc1_derefidx_vbuxx
lda print_hextab,x
// [63] call print_char
// [65] phi from print_uchar::@1 to print_char [phi:print_uchar::@1->print_char]
print_char_from___b1:
// [65] phi print_char_cursor#28 = print_char_cursor#10 [phi:print_uchar::@1->print_char#0] -- register_copy
// [65] phi print_char::ch#2 = print_char::ch#1 [phi:print_uchar::@1->print_char#1] -- register_copy
jsr print_char
jmp __breturn
// print_uchar::@return
__breturn:
// [64] return
rts
}
// print_char
// Print a single char
// void print_char(__register(A) char ch)
print_char: {
// [66] *print_char_cursor#28 = print_char::ch#2 -- _deref_pbuz1=vbuaa
ldy #0
sta (print_char_cursor),y
// [67] print_char_cursor#10 = ++ print_char_cursor#28 -- pbuz1=_inc_pbuz1
inc.z print_char_cursor
bne !+
inc.z print_char_cursor+1
!:
jmp __breturn
// print_char::@return
__breturn:
// [68] return
rts
}
// File Data
.segment Data
print_hextab: .text "0123456789abcdef"
// mulf_sqr tables will contain f(x)=int(x*x/4) and g(x) = f(x-255).
// <f(x) = <(( x * x )/4)
.align $100
mulf_sqr1_lo: .fill $200, 0
// >f(x) = >(( x * x )/4)
.align $100
mulf_sqr1_hi: .fill $200, 0
// <g(x) = <((( x - 255) * ( x - 255 ))/4)
.align $100
mulf_sqr2_lo: .fill $200, 0
// >g(x) = >((( x - 255) * ( x - 255 ))/4)
.align $100
mulf_sqr2_hi: .fill $200, 0
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __b4
Removing instruction jmp __b1
Removing instruction jmp __b2
Removing instruction jmp __b3
Removing instruction jmp __b5
Removing instruction jmp __b1
Removing instruction jmp __b5
Removing instruction jmp __b7
Removing instruction jmp __breturn
Removing instruction jmp __b9
Removing instruction jmp __b8
Removing instruction jmp __b4
Removing instruction jmp __b3
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __breturn
Succesful ASM optimization Pass5NextJumpElimination
Replacing instruction lda #<0 with TXA
Removing instruction lda #>0
Removing instruction lda #0
Removing instruction ldy #0
Removing instruction ldy #0
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Replacing label __b1 with __b2
Replacing label __b9_from___b6 with __b8
Replacing label __b3_from___b2 with __b3
Removing instruction __b1:
Removing instruction __b9_from___b6:
Removing instruction __b9:
Removing instruction __b8_from___b9:
Removing instruction __b3_from___b2:
Removing instruction __b3_from___b4:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction mulf_init_from_main:
Removing instruction __b4:
Removing instruction __b1_from___b4:
Removing instruction __b3:
Removing instruction __b5:
Removing instruction __b1_from___b5:
Removing instruction __b1_from_mulf_init:
Removing instruction __b5_from___b1:
Removing instruction __b7:
Removing instruction __breturn:
Removing instruction __b8_from___b6:
Removing instruction __b5_from___b8:
Removing instruction __b4:
Removing instruction __b1_from___b3:
Removing instruction __breturn:
Removing instruction print_uint_from_print_ulong:
Removing instruction __b1:
Removing instruction print_uint_from___b1:
Removing instruction __breturn:
Removing instruction print_uchar_from_print_uint:
Removing instruction __b1:
Removing instruction print_uchar_from___b1:
Removing instruction __breturn:
Removing instruction print_char_from_print_uchar:
Removing instruction __b1:
Removing instruction print_char_from___b1:
Removing instruction __breturn:
Removing instruction __breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Removing instruction jmp __b8
Succesful ASM optimization Pass5NextJumpElimination
FINAL SYMBOL TABLE
__constant char *BORDER_COLOR = (char *) 53280
__constant char RADIX::BINARY = 2
__constant char RADIX::DECIMAL = $a
__constant char RADIX::HEXADECIMAL = $10
__constant char RADIX::OCTAL = 8
__constant char *RASTER = (char *) 53266
__constant char *SCREEN = (char *) 1024
void main()
__constant unsigned int main::a = $4d2
__constant unsigned int main::b = $929
unsigned long main::r
unsigned long main::r#0 // r zp[4]:10 11.0
unsigned long mulf16u(unsigned int a , unsigned int b)
unsigned int mulf16u::a
unsigned int mulf16u::b
__constant unsigned int * const mulf16u::memA = (unsigned int *) 248
__constant unsigned int * const mulf16u::memB = (unsigned int *) 250
__constant unsigned long * const mulf16u::memR = (unsigned long *) 252
unsigned long mulf16u::return
unsigned long mulf16u::return#0 // return zp[4]:10 22.0
unsigned long mulf16u::return#1 // return zp[4]:10 37.33333333333333
void mulf_init()
char mulf_init::$1 // reg byte a 202.0
char mulf_init::$4 // reg byte a 202.0
char mulf_init::$5 // reg byte a 202.0
char mulf_init::c
char mulf_init::c#1 // c zp[1]:15 23.307692307692307
char mulf_init::c#2 // c zp[1]:15 101.0
char mulf_init::dir
char mulf_init::dir#2 // dir zp[1]:14 37.875
char mulf_init::dir#4 // dir zp[1]:14 101.0
unsigned int mulf_init::sqr
unsigned int mulf_init::sqr#1 // sqr zp[2]:6 101.0
unsigned int mulf_init::sqr#2 // sqr zp[2]:6 202.0
unsigned int mulf_init::sqr#3 // sqr zp[2]:6 84.16666666666666
unsigned int mulf_init::sqr#4 // sqr zp[2]:6 50.5
char *mulf_init::sqr1_hi
char *mulf_init::sqr1_hi#1 // sqr1_hi zp[2]:2 67.33333333333333
char *mulf_init::sqr1_hi#2 // sqr1_hi zp[2]:2 25.25
char *mulf_init::sqr1_lo
char *mulf_init::sqr1_lo#1 // sqr1_lo zp[2]:4 202.0
char *mulf_init::sqr1_lo#2 // sqr1_lo zp[2]:4 28.857142857142858
char *mulf_init::sqr2_hi
char *mulf_init::sqr2_hi#1 // sqr2_hi zp[2]:16 33.666666666666664
char *mulf_init::sqr2_hi#2 // sqr2_hi zp[2]:16 75.75
char *mulf_init::sqr2_lo
char *mulf_init::sqr2_lo#1 // sqr2_lo zp[2]:8 202.0
char *mulf_init::sqr2_lo#2 // sqr2_lo zp[2]:8 44.888888888888886
char mulf_init::x_2
char mulf_init::x_2#1 // reg byte x 101.0
char mulf_init::x_2#2 // reg byte x 50.5
char mulf_init::x_2#3 // reg byte x 60.599999999999994
char mulf_init::x_255
char mulf_init::x_255#1 // reg byte x 60.599999999999994
char mulf_init::x_255#2 // reg byte x 80.8
__constant char mulf_sqr1_hi[$200] = { fill( $200, 0) }
__constant char mulf_sqr1_lo[$200] = { fill( $200, 0) }
__constant char mulf_sqr2_hi[$200] = { fill( $200, 0) }
__constant char mulf_sqr2_lo[$200] = { fill( $200, 0) }
void print_char(char ch)
char print_char::ch
char print_char::ch#0 // reg byte a 20002.0
char print_char::ch#1 // reg byte a 20002.0
char print_char::ch#2 // reg byte a 120003.0
char *print_char_cursor
char *print_char_cursor#10 // print_char_cursor zp[2]:2 8546.461538461539
char *print_char_cursor#15 // print_char_cursor zp[2]:2 11.222222222222221
char *print_char_cursor#28 // print_char_cursor zp[2]:2 110002.0
char *print_char_cursor#36 // print_char_cursor zp[2]:2 601.5
char *print_char_cursor#38 // print_char_cursor zp[2]:2 4001.0
__constant const char print_hextab[] = "0123456789abcdef"z
char *print_line_cursor
char *print_screen
void print_uchar(char b)
char print_uchar::$0 // reg byte a 20002.0
char print_uchar::$2 // reg byte x 20002.0
char print_uchar::b
char print_uchar::b#0 // reg byte x 2002.0
char print_uchar::b#1 // reg byte x 2002.0
char print_uchar::b#2 // reg byte x 5501.0
void print_uint(unsigned int w)
unsigned int print_uint::w
unsigned int print_uint::w#0 // w zp[2]:4 202.0
unsigned int print_uint::w#1 // w zp[2]:4 202.0
unsigned int print_uint::w#2 // w zp[2]:4 734.6666666666667
void print_ulong(unsigned long dw)
unsigned long print_ulong::dw
unsigned long print_ulong::dw#0 // dw zp[4]:10 71.0
zp[1]:15 [ mulf_init::c#2 mulf_init::c#1 ]
reg byte x [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
zp[2]:8 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ]
zp[2]:16 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
zp[1]:14 [ mulf_init::dir#2 mulf_init::dir#4 ]
zp[2]:6 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
zp[2]:4 [ print_uint::w#2 print_uint::w#0 print_uint::w#1 mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ]
reg byte x [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
reg byte a [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
zp[2]:2 [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
zp[4]:10 [ mulf16u::return#0 main::r#0 mulf16u::return#1 print_ulong::dw#0 ]
reg byte a [ mulf_init::$1 ]
reg byte a [ mulf_init::$4 ]
reg byte a [ mulf_init::$5 ]
reg byte a [ print_uchar::$0 ]
reg byte x [ print_uchar::$2 ]
FINAL ASSEMBLER
Score: 4327
// File Comments
/// @file
/// A lightweight library for printing on the C64.
///
/// Printing with this library is done by calling print_ function for each element
// Upstart
// Commodore 64 PRG executable file
.file [name="min-fmul-16.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 RASTER = $d012
.label BORDER_COLOR = $d020
.label SCREEN = $400
.label print_char_cursor = 2
.segment Code
// main
main: {
.label a = $4d2
.label b = $929
.label r = $a
// mulf_init()
// [1] call mulf_init
// [12] phi from main to mulf_init [phi:main->mulf_init]
jsr mulf_init
// main::@4
// asm
// asm { sei }
sei
// [3] phi from main::@4 to main::@1 [phi:main::@4->main::@1]
// [3] phi print_char_cursor#15 = (char *) 1024 [phi:main::@4->main::@1#0] -- pbuz1=pbuc1
lda #<$400
sta.z print_char_cursor
lda #>$400
sta.z print_char_cursor+1
// main::@1
// main::@2
__b2:
// while(*RASTER!=$ff)
// [4] if(*RASTER!=$ff) goto main::@2 -- _deref_pbuc1_neq_vbuc2_then_la1
lda #$ff
cmp RASTER
bne __b2
// main::@3
// (*BORDER_COLOR)++;
// [5] *BORDER_COLOR = ++ *BORDER_COLOR -- _deref_pbuc1=_inc__deref_pbuc1
inc BORDER_COLOR
// dword r = mulf16u(a, b)
// [6] call mulf16u
jsr mulf16u
// [7] mulf16u::return#0 = mulf16u::return#1
// main::@5
// [8] main::r#0 = mulf16u::return#0
// (*BORDER_COLOR)--;
// [9] *BORDER_COLOR = -- *BORDER_COLOR -- _deref_pbuc1=_dec__deref_pbuc1
dec BORDER_COLOR
// print_ulong(r)
// [10] print_ulong::dw#0 = main::r#0
// [11] call print_ulong
jsr print_ulong
// [3] phi from main::@5 to main::@1 [phi:main::@5->main::@1]
// [3] phi print_char_cursor#15 = SCREEN [phi:main::@5->main::@1#0] -- pbuz1=pbuc1
lda #<SCREEN
sta.z print_char_cursor
lda #>SCREEN
sta.z print_char_cursor+1
jmp __b2
}
// mulf_init
// Initialize the mulf_sqr multiplication tables with f(x)=int(x*x/4)
mulf_init: {
// x/2
.label c = $f
// Counter used for determining x%2==0
.label sqr1_hi = 2
// Fill mulf_sqr1 = f(x) = int(x*x/4): If f(x) = x*x/4 then f(x+1) = f(x) + x/2 + 1/4
.label sqr = 6
.label sqr1_lo = 4
// Decrease or increase x_255 - initially we decrease
.label sqr2_hi = $10
.label sqr2_lo = 8
//Start with g(0)=f(255)
.label dir = $e
// [13] phi from mulf_init to mulf_init::@1 [phi:mulf_init->mulf_init::@1]
// [13] phi mulf_init::x_2#3 = 0 [phi:mulf_init->mulf_init::@1#0] -- vbuxx=vbuc1
ldx #0
// [13] phi mulf_init::sqr1_hi#2 = mulf_sqr1_hi+1 [phi:mulf_init->mulf_init::@1#1] -- pbuz1=pbuc1
lda #<mulf_sqr1_hi+1
sta.z sqr1_hi
lda #>mulf_sqr1_hi+1
sta.z sqr1_hi+1
// [13] phi mulf_init::sqr#4 = 0 [phi:mulf_init->mulf_init::@1#2] -- vwuz1=vwuc1
txa
sta.z sqr
sta.z sqr+1
// [13] phi mulf_init::c#2 = 0 [phi:mulf_init->mulf_init::@1#3] -- vbuz1=vbuc1
sta.z c
// [13] phi mulf_init::sqr1_lo#2 = mulf_sqr1_lo+1 [phi:mulf_init->mulf_init::@1#4] -- pbuz1=pbuc1
lda #<mulf_sqr1_lo+1
sta.z sqr1_lo
lda #>mulf_sqr1_lo+1
sta.z sqr1_lo+1
// mulf_init::@1
__b1:
// for(byte* sqr1_lo = mulf_sqr1_lo+1; sqr1_lo!=mulf_sqr1_lo+512; sqr1_lo++)
// [14] if(mulf_init::sqr1_lo#2!=mulf_sqr1_lo+$200) goto mulf_init::@2 -- pbuz1_neq_pbuc1_then_la1
lda.z sqr1_lo+1
cmp #>mulf_sqr1_lo+$200
bne __b2
lda.z sqr1_lo
cmp #<mulf_sqr1_lo+$200
bne __b2
// [15] phi from mulf_init::@1 to mulf_init::@5 [phi:mulf_init::@1->mulf_init::@5]
// [15] phi mulf_init::dir#2 = $ff [phi:mulf_init::@1->mulf_init::@5#0] -- vbuz1=vbuc1
lda #$ff
sta.z dir
// [15] phi mulf_init::sqr2_hi#2 = mulf_sqr2_hi [phi:mulf_init::@1->mulf_init::@5#1] -- pbuz1=pbuc1
lda #<mulf_sqr2_hi
sta.z sqr2_hi
lda #>mulf_sqr2_hi
sta.z sqr2_hi+1
// [15] phi mulf_init::x_255#2 = -1 [phi:mulf_init::@1->mulf_init::@5#2] -- vbuxx=vbuc1
ldx #-1
// [15] phi mulf_init::sqr2_lo#2 = mulf_sqr2_lo [phi:mulf_init::@1->mulf_init::@5#3] -- pbuz1=pbuc1
lda #<mulf_sqr2_lo
sta.z sqr2_lo
lda #>mulf_sqr2_lo
sta.z sqr2_lo+1
// mulf_init::@5
__b5:
// for(byte* sqr2_lo = mulf_sqr2_lo; sqr2_lo!=mulf_sqr2_lo+511; sqr2_lo++)
// [16] if(mulf_init::sqr2_lo#2!=mulf_sqr2_lo+$1ff) goto mulf_init::@6 -- pbuz1_neq_pbuc1_then_la1
lda.z sqr2_lo+1
cmp #>mulf_sqr2_lo+$1ff
bne __b6
lda.z sqr2_lo
cmp #<mulf_sqr2_lo+$1ff
bne __b6
// mulf_init::@7
// *(mulf_sqr2_lo+511) = *(mulf_sqr1_lo+256)
// [17] *(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+$100) -- _deref_pbuc1=_deref_pbuc2
// Set the very last value g(511) = f(256)
lda mulf_sqr1_lo+$100
sta mulf_sqr2_lo+$1ff
// *(mulf_sqr2_hi+511) = *(mulf_sqr1_hi+256)
// [18] *(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+$100) -- _deref_pbuc1=_deref_pbuc2
lda mulf_sqr1_hi+$100
sta mulf_sqr2_hi+$1ff
// mulf_init::@return
// }
// [19] return
rts
// mulf_init::@6
__b6:
// *sqr2_lo = mulf_sqr1_lo[x_255]
// [20] *mulf_init::sqr2_lo#2 = mulf_sqr1_lo[mulf_init::x_255#2] -- _deref_pbuz1=pbuc1_derefidx_vbuxx
lda mulf_sqr1_lo,x
ldy #0
sta (sqr2_lo),y
// *sqr2_hi++ = mulf_sqr1_hi[x_255]
// [21] *mulf_init::sqr2_hi#2 = mulf_sqr1_hi[mulf_init::x_255#2] -- _deref_pbuz1=pbuc1_derefidx_vbuxx
lda mulf_sqr1_hi,x
sta (sqr2_hi),y
// *sqr2_hi++ = mulf_sqr1_hi[x_255];
// [22] mulf_init::sqr2_hi#1 = ++ mulf_init::sqr2_hi#2 -- pbuz1=_inc_pbuz1
inc.z sqr2_hi
bne !+
inc.z sqr2_hi+1
!:
// x_255 = x_255 + dir
// [23] mulf_init::x_255#1 = mulf_init::x_255#2 + mulf_init::dir#2 -- vbuxx=vbuxx_plus_vbuz1
txa
clc
adc.z dir
tax
// if(x_255==0)
// [24] if(mulf_init::x_255#1!=0) goto mulf_init::@9 -- vbuxx_neq_0_then_la1
cpx #0
bne __b8
// [26] phi from mulf_init::@6 to mulf_init::@8 [phi:mulf_init::@6->mulf_init::@8]
// [26] phi mulf_init::dir#4 = 1 [phi:mulf_init::@6->mulf_init::@8#0] -- vbuz1=vbuc1
lda #1
sta.z dir
// [25] phi from mulf_init::@6 to mulf_init::@9 [phi:mulf_init::@6->mulf_init::@9]
// mulf_init::@9
// [26] phi from mulf_init::@9 to mulf_init::@8 [phi:mulf_init::@9->mulf_init::@8]
// [26] phi mulf_init::dir#4 = mulf_init::dir#2 [phi:mulf_init::@9->mulf_init::@8#0] -- register_copy
// mulf_init::@8
__b8:
// for(byte* sqr2_lo = mulf_sqr2_lo; sqr2_lo!=mulf_sqr2_lo+511; sqr2_lo++)
// [27] mulf_init::sqr2_lo#1 = ++ mulf_init::sqr2_lo#2 -- pbuz1=_inc_pbuz1
inc.z sqr2_lo
bne !+
inc.z sqr2_lo+1
!:
// [15] phi from mulf_init::@8 to mulf_init::@5 [phi:mulf_init::@8->mulf_init::@5]
// [15] phi mulf_init::dir#2 = mulf_init::dir#4 [phi:mulf_init::@8->mulf_init::@5#0] -- register_copy
// [15] phi mulf_init::sqr2_hi#2 = mulf_init::sqr2_hi#1 [phi:mulf_init::@8->mulf_init::@5#1] -- register_copy
// [15] phi mulf_init::x_255#2 = mulf_init::x_255#1 [phi:mulf_init::@8->mulf_init::@5#2] -- register_copy
// [15] phi mulf_init::sqr2_lo#2 = mulf_init::sqr2_lo#1 [phi:mulf_init::@8->mulf_init::@5#3] -- register_copy
jmp __b5
// mulf_init::@2
__b2:
// if((++c&1)==0)
// [28] mulf_init::c#1 = ++ mulf_init::c#2 -- vbuz1=_inc_vbuz1
inc.z c
// ++c&1
// [29] mulf_init::$1 = mulf_init::c#1 & 1 -- vbuaa=vbuz1_band_vbuc1
lda #1
and.z c
// if((++c&1)==0)
// [30] if(mulf_init::$1!=0) goto mulf_init::@3 -- vbuaa_neq_0_then_la1
cmp #0
bne __b3
// mulf_init::@4
// x_2++;
// [31] mulf_init::x_2#1 = ++ mulf_init::x_2#3 -- vbuxx=_inc_vbuxx
inx
// sqr++;
// [32] mulf_init::sqr#2 = ++ mulf_init::sqr#4 -- vwuz1=_inc_vwuz1
inc.z sqr
bne !+
inc.z sqr+1
!:
// [33] phi from mulf_init::@2 mulf_init::@4 to mulf_init::@3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3]
// [33] phi mulf_init::x_2#2 = mulf_init::x_2#3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#0] -- register_copy
// [33] phi mulf_init::sqr#3 = mulf_init::sqr#4 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#1] -- register_copy
// mulf_init::@3
__b3:
// BYTE0(sqr)
// [34] mulf_init::$4 = byte0 mulf_init::sqr#3 -- vbuaa=_byte0_vwuz1
lda.z sqr
// *sqr1_lo = BYTE0(sqr)
// [35] *mulf_init::sqr1_lo#2 = mulf_init::$4 -- _deref_pbuz1=vbuaa
ldy #0
sta (sqr1_lo),y
// BYTE1(sqr)
// [36] mulf_init::$5 = byte1 mulf_init::sqr#3 -- vbuaa=_byte1_vwuz1
lda.z sqr+1
// *sqr1_hi++ = BYTE1(sqr)
// [37] *mulf_init::sqr1_hi#2 = mulf_init::$5 -- _deref_pbuz1=vbuaa
sta (sqr1_hi),y
// *sqr1_hi++ = BYTE1(sqr);
// [38] mulf_init::sqr1_hi#1 = ++ mulf_init::sqr1_hi#2 -- pbuz1=_inc_pbuz1
inc.z sqr1_hi
bne !+
inc.z sqr1_hi+1
!:
// sqr = sqr + x_2
// [39] mulf_init::sqr#1 = mulf_init::sqr#3 + mulf_init::x_2#2 -- vwuz1=vwuz1_plus_vbuxx
txa
clc
adc.z sqr
sta.z sqr
bcc !+
inc.z sqr+1
!:
// for(byte* sqr1_lo = mulf_sqr1_lo+1; sqr1_lo!=mulf_sqr1_lo+512; sqr1_lo++)
// [40] mulf_init::sqr1_lo#1 = ++ mulf_init::sqr1_lo#2 -- pbuz1=_inc_pbuz1
inc.z sqr1_lo
bne !+
inc.z sqr1_lo+1
!:
// [13] phi from mulf_init::@3 to mulf_init::@1 [phi:mulf_init::@3->mulf_init::@1]
// [13] phi mulf_init::x_2#3 = mulf_init::x_2#2 [phi:mulf_init::@3->mulf_init::@1#0] -- register_copy
// [13] phi mulf_init::sqr1_hi#2 = mulf_init::sqr1_hi#1 [phi:mulf_init::@3->mulf_init::@1#1] -- register_copy
// [13] phi mulf_init::sqr#4 = mulf_init::sqr#1 [phi:mulf_init::@3->mulf_init::@1#2] -- register_copy
// [13] phi mulf_init::c#2 = mulf_init::c#1 [phi:mulf_init::@3->mulf_init::@1#3] -- register_copy
// [13] phi mulf_init::sqr1_lo#2 = mulf_init::sqr1_lo#1 [phi:mulf_init::@3->mulf_init::@1#4] -- register_copy
jmp __b1
}
// mulf16u
// Fast multiply two unsigned words to a double word result
// Done in assembler to utilize fast addition A+X
// __zp($a) unsigned long mulf16u(unsigned int a, unsigned int b)
mulf16u: {
.label memA = $f8
.label memB = $fa
.label memR = $fc
.label return = $a
// *memA = a
// [41] *mulf16u::memA = main::a -- _deref_pwuc1=vwuc2
lda #<main.a
sta.z memA
lda #>main.a
sta.z memA+1
// *memB = b
// [42] *mulf16u::memB = main::b -- _deref_pwuc1=vwuc2
lda #<main.b
sta.z memB
lda #>main.b
sta.z memB+1
// asm
// asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: }
lda memA
sta sm1a+1
sta sm3a+1
sta sm5a+1
sta sm7a+1
eor #$ff
sta sm2a+1
sta sm4a+1
sta sm6a+1
sta sm8a+1
lda memA+1
sta sm1b+1
sta sm3b+1
sta sm5b+1
sta sm7b+1
eor #$ff
sta sm2b+1
sta sm4b+1
sta sm6b+1
sta sm8b+1
ldx memB
sec
sm1a:
lda mulf_sqr1_lo,x
sm2a:
sbc mulf_sqr2_lo,x
sta memR+0
sm3a:
lda mulf_sqr1_hi,x
sm4a:
sbc mulf_sqr2_hi,x
sta _AA+1
sec
sm1b:
lda mulf_sqr1_lo,x
sm2b:
sbc mulf_sqr2_lo,x
sta _cc+1
sm3b:
lda mulf_sqr1_hi,x
sm4b:
sbc mulf_sqr2_hi,x
sta _CC+1
ldx memB+1
sec
sm5a:
lda mulf_sqr1_lo,x
sm6a:
sbc mulf_sqr2_lo,x
sta _bb+1
sm7a:
lda mulf_sqr1_hi,x
sm8a:
sbc mulf_sqr2_hi,x
sta _BB+1
sec
sm5b:
lda mulf_sqr1_lo,x
sm6b:
sbc mulf_sqr2_lo,x
sta _dd+1
sm7b:
lda mulf_sqr1_hi,x
sm8b:
sbc mulf_sqr2_hi,x
sta memR+3
clc
_AA:
lda #0
_bb:
adc #0
sta memR+1
_BB:
lda #0
_CC:
adc #0
sta memR+2
bcc !+
inc memR+3
clc
!:
_cc:
lda #0
adc memR+1
sta memR+1
_dd:
lda #0
adc memR+2
sta memR+2
bcc !+
inc memR+3
!:
// return *memR;
// [44] mulf16u::return#1 = *mulf16u::memR -- vduz1=_deref_pduc1
lda.z memR
sta.z return
lda.z memR+1
sta.z return+1
lda.z memR+2
sta.z return+2
lda.z memR+3
sta.z return+3
// mulf16u::@return
// }
// [45] return
rts
}
// print_ulong
// Print a unsigned long as HEX
// void print_ulong(__zp($a) unsigned long dw)
print_ulong: {
.label dw = $a
// print_uint(WORD1(dw))
// [46] print_uint::w#0 = word1 print_ulong::dw#0 -- vwuz1=_word1_vduz2
lda.z dw+2
sta.z print_uint.w
lda.z dw+3
sta.z print_uint.w+1
// [47] call print_uint
// [51] phi from print_ulong to print_uint [phi:print_ulong->print_uint]
// [51] phi print_char_cursor#36 = print_char_cursor#15 [phi:print_ulong->print_uint#0] -- register_copy
// [51] phi print_uint::w#2 = print_uint::w#0 [phi:print_ulong->print_uint#1] -- register_copy
jsr print_uint
// print_ulong::@1
// print_uint(WORD0(dw))
// [48] print_uint::w#1 = word0 print_ulong::dw#0 -- vwuz1=_word0_vduz2
lda.z dw
sta.z print_uint.w
lda.z dw+1
sta.z print_uint.w+1
// [49] call print_uint
// [51] phi from print_ulong::@1 to print_uint [phi:print_ulong::@1->print_uint]
// [51] phi print_char_cursor#36 = print_char_cursor#10 [phi:print_ulong::@1->print_uint#0] -- register_copy
// [51] phi print_uint::w#2 = print_uint::w#1 [phi:print_ulong::@1->print_uint#1] -- register_copy
jsr print_uint
// print_ulong::@return
// }
// [50] return
rts
}
// print_uint
// Print a unsigned int as HEX
// void print_uint(__zp(4) unsigned int w)
print_uint: {
.label w = 4
// print_uchar(BYTE1(w))
// [52] print_uchar::b#0 = byte1 print_uint::w#2 -- vbuxx=_byte1_vwuz1
ldx.z w+1
// [53] call print_uchar
// [57] phi from print_uint to print_uchar [phi:print_uint->print_uchar]
// [57] phi print_char_cursor#38 = print_char_cursor#36 [phi:print_uint->print_uchar#0] -- register_copy
// [57] phi print_uchar::b#2 = print_uchar::b#0 [phi:print_uint->print_uchar#1] -- register_copy
jsr print_uchar
// print_uint::@1
// print_uchar(BYTE0(w))
// [54] print_uchar::b#1 = byte0 print_uint::w#2 -- vbuxx=_byte0_vwuz1
ldx.z w
// [55] call print_uchar
// [57] phi from print_uint::@1 to print_uchar [phi:print_uint::@1->print_uchar]
// [57] phi print_char_cursor#38 = print_char_cursor#10 [phi:print_uint::@1->print_uchar#0] -- register_copy
// [57] phi print_uchar::b#2 = print_uchar::b#1 [phi:print_uint::@1->print_uchar#1] -- register_copy
jsr print_uchar
// print_uint::@return
// }
// [56] return
rts
}
// print_uchar
// Print a char as HEX
// void print_uchar(__register(X) char b)
print_uchar: {
// b>>4
// [58] print_uchar::$0 = print_uchar::b#2 >> 4 -- vbuaa=vbuxx_ror_4
txa
lsr
lsr
lsr
lsr
// print_char(print_hextab[b>>4])
// [59] print_char::ch#0 = print_hextab[print_uchar::$0] -- vbuaa=pbuc1_derefidx_vbuaa
tay
lda print_hextab,y
// [60] call print_char
// Table of hexadecimal digits
// [65] phi from print_uchar to print_char [phi:print_uchar->print_char]
// [65] phi print_char_cursor#28 = print_char_cursor#38 [phi:print_uchar->print_char#0] -- register_copy
// [65] phi print_char::ch#2 = print_char::ch#0 [phi:print_uchar->print_char#1] -- register_copy
jsr print_char
// print_uchar::@1
// b&0xf
// [61] print_uchar::$2 = print_uchar::b#2 & $f -- vbuxx=vbuxx_band_vbuc1
lda #$f
axs #0
// print_char(print_hextab[b&0xf])
// [62] print_char::ch#1 = print_hextab[print_uchar::$2] -- vbuaa=pbuc1_derefidx_vbuxx
lda print_hextab,x
// [63] call print_char
// [65] phi from print_uchar::@1 to print_char [phi:print_uchar::@1->print_char]
// [65] phi print_char_cursor#28 = print_char_cursor#10 [phi:print_uchar::@1->print_char#0] -- register_copy
// [65] phi print_char::ch#2 = print_char::ch#1 [phi:print_uchar::@1->print_char#1] -- register_copy
jsr print_char
// print_uchar::@return
// }
// [64] return
rts
}
// print_char
// Print a single char
// void print_char(__register(A) char ch)
print_char: {
// *(print_char_cursor++) = ch
// [66] *print_char_cursor#28 = print_char::ch#2 -- _deref_pbuz1=vbuaa
ldy #0
sta (print_char_cursor),y
// *(print_char_cursor++) = ch;
// [67] print_char_cursor#10 = ++ print_char_cursor#28 -- pbuz1=_inc_pbuz1
inc.z print_char_cursor
bne !+
inc.z print_char_cursor+1
!:
// print_char::@return
// }
// [68] return
rts
}
// File Data
.segment Data
print_hextab: .text "0123456789abcdef"
// mulf_sqr tables will contain f(x)=int(x*x/4) and g(x) = f(x-255).
// <f(x) = <(( x * x )/4)
.align $100
mulf_sqr1_lo: .fill $200, 0
// >f(x) = >(( x * x )/4)
.align $100
mulf_sqr1_hi: .fill $200, 0
// <g(x) = <((( x - 255) * ( x - 255 ))/4)
.align $100
mulf_sqr2_lo: .fill $200, 0
// >g(x) = >((( x - 255) * ( x - 255 ))/4)
.align $100
mulf_sqr2_hi: .fill $200, 0