diff --git a/src/test/ref/multiply-16bit-const.asm b/src/test/ref/multiply-16bit-const.asm new file mode 100644 index 000000000..74130df52 --- /dev/null +++ b/src/test/ref/multiply-16bit-const.asm @@ -0,0 +1,455 @@ +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" + .label print_line_cursor = 6 + .label print_char_cursor = 6 + .label print_char_cursor_1 = $a + .label print_line_cursor_1 = 8 +main: { + .label i = 2 + .label __5 = $d + .label __6 = $d + .label __7 = $d + .label __8 = $d + .label __9 = $d + .label __10 = $d + .label __11 = $d + // print_cls() + jsr print_cls + lda #<$400 + sta.z print_char_cursor + lda #>$400 + sta.z print_char_cursor+1 + lda #<$400 + sta.z print_line_cursor_1 + lda #>$400 + sta.z print_line_cursor_1+1 + lda #<0 + sta.z i + sta.z i+1 + lda #<0>>$10 + sta.z i+2 + lda #>0>>$10 + sta.z i+3 + __b1: + // for(unsigned long i=0;i<3330;i+=333) + lda.z i+3 + cmp #>$d02>>$10 + bcc __b2 + bne !+ + lda.z i+2 + cmp #<$d02>>$10 + bcc __b2 + bne !+ + lda.z i+1 + cmp #>$d02 + bcc __b2 + bne !+ + lda.z i + cmp #<$d02 + bcc __b2 + !: + // } + rts + __b2: + // print_ulong_decimal(i*555) + lda.z i + asl + sta.z __5 + lda.z i+1 + rol + sta.z __5+1 + lda.z i+2 + rol + sta.z __5+2 + lda.z i+3 + rol + sta.z __5+3 + asl.z __5 + rol.z __5+1 + rol.z __5+2 + rol.z __5+3 + asl.z __5 + rol.z __5+1 + rol.z __5+2 + rol.z __5+3 + asl.z __5 + rol.z __5+1 + rol.z __5+2 + rol.z __5+3 + lda.z __6 + clc + adc.z i + sta.z __6 + lda.z __6+1 + adc.z i+1 + sta.z __6+1 + lda.z __6+2 + adc.z i+2 + sta.z __6+2 + lda.z __6+3 + adc.z i+3 + sta.z __6+3 + asl.z __7 + rol.z __7+1 + rol.z __7+2 + rol.z __7+3 + asl.z __7 + rol.z __7+1 + rol.z __7+2 + rol.z __7+3 + lda.z __8 + clc + adc.z i + sta.z __8 + lda.z __8+1 + adc.z i+1 + sta.z __8+1 + lda.z __8+2 + adc.z i+2 + sta.z __8+2 + lda.z __8+3 + adc.z i+3 + sta.z __8+3 + asl.z __9 + rol.z __9+1 + rol.z __9+2 + rol.z __9+3 + asl.z __9 + rol.z __9+1 + rol.z __9+2 + rol.z __9+3 + lda.z __10 + clc + adc.z i + sta.z __10 + lda.z __10+1 + adc.z i+1 + sta.z __10+1 + lda.z __10+2 + adc.z i+2 + sta.z __10+2 + lda.z __10+3 + adc.z i+3 + sta.z __10+3 + asl.z __11 + rol.z __11+1 + rol.z __11+2 + rol.z __11+3 + lda.z print_ulong_decimal.w + clc + adc.z i + sta.z print_ulong_decimal.w + lda.z print_ulong_decimal.w+1 + adc.z i+1 + sta.z print_ulong_decimal.w+1 + lda.z print_ulong_decimal.w+2 + adc.z i+2 + sta.z print_ulong_decimal.w+2 + lda.z print_ulong_decimal.w+3 + adc.z i+3 + sta.z print_ulong_decimal.w+3 + jsr print_ulong_decimal + // print_ln() + jsr print_ln + // i+=333 + lda.z i + clc + adc #<$14d + sta.z i + lda.z i+1 + adc #>$14d + sta.z i+1 + lda.z i+2 + adc #0 + sta.z i+2 + lda.z i+3 + adc #0 + sta.z i+3 + lda.z print_line_cursor + sta.z print_line_cursor_1 + lda.z print_line_cursor+1 + sta.z print_line_cursor_1+1 + jmp __b1 +} +// Print a newline +print_ln: { + __b1: + // print_line_cursor + $28 + lda #$28 + clc + adc.z print_line_cursor_1 + sta.z print_line_cursor + lda #0 + adc.z print_line_cursor_1+1 + sta.z print_line_cursor+1 + // while (print_line_cursordecimal_digits_long + sta.z str+1 + __b1: + // while(*str) + ldy #0 + lda (str),y + cmp #0 + bne __b2 + // } + rts + __b2: + // print_char(*(str++)) + ldy #0 + lda (str),y + jsr print_char + // print_char(*(str++)); + inc.z str + bne !+ + inc.z str+1 + !: + jmp __b1 +} +// Print a single char +// print_char(byte register(A) ch) +print_char: { + // *(print_char_cursor++) = ch + ldy #0 + sta (print_char_cursor_1),y + // *(print_char_cursor++) = ch; + inc.z print_char_cursor_1 + bne !+ + inc.z print_char_cursor_1+1 + !: + // } + rts +} +// Converts unsigned number value to a string representing it in RADIX format. +// If the leading digits are zero they are not included in the string. +// - value : The number to be converted to RADIX +// - buffer : receives the string representing the number and zero-termination. +// - radix : The radix to convert the number to (from the enum RADIX) +// ultoa(dword zp($d) value, byte* zp($11) buffer) +ultoa: { + .const max_digits = $a + .label digit_value = $13 + .label buffer = $11 + .label digit = $c + .label value = $d + lda #decimal_digits_long + sta.z buffer+1 + ldx #0 + txa + sta.z digit + __b1: + // for( char digit=0; digit= digit_value) + cpx #0 + bne __b5 + lda.z value+3 + cmp.z digit_value+3 + bcc !+ + bne __b5 + lda.z value+2 + cmp.z digit_value+2 + bcc !+ + bne __b5 + lda.z value+1 + cmp.z digit_value+1 + bcc !+ + bne __b5 + lda.z value + cmp.z digit_value + bcs __b5 + !: + __b4: + // for( char digit=0; digit= sub) + lda.z value+3 + cmp.z sub+3 + bcc !+ + bne __b2 + lda.z value+2 + cmp.z sub+2 + bcc !+ + bne __b2 + lda.z value+1 + cmp.z sub+1 + bcc !+ + bne __b2 + lda.z value + cmp.z sub + bcs __b2 + !: + // *buffer = DIGITS[digit] + lda DIGITS,x + ldy #0 + sta (buffer),y + // } + rts + __b2: + // digit++; + inx + // value -= sub + lda.z value + sec + sbc.z sub + sta.z value + lda.z value+1 + sbc.z sub+1 + sta.z value+1 + lda.z value+2 + sbc.z sub+2 + sta.z value+2 + lda.z value+3 + sbc.z sub+3 + sta.z value+3 + jmp __b1 +} +// Clear the screen. Also resets current line/char cursor. +print_cls: { + // memset(print_screen, ' ', 1000) + jsr memset + // } + rts +} +// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str. +memset: { + .const c = ' ' + .const num = $3e8 + .label str = $400 + .label end = str+num + .label dst = $11 + lda #str + sta.z dst+1 + __b1: + // for(char* dst = str; dst!=end; dst++) + lda.z dst+1 + cmp #>end + bne __b2 + lda.z dst + cmp #=(dword) ultoa::digit_value#0) goto ultoa::@5 + to:ultoa::@4 +ultoa::@4: scope:[ultoa] from ultoa::@6 ultoa::@7 + [55] (byte*) ultoa::buffer#14 ← phi( ultoa::@7/(byte*) ultoa::buffer#11 ultoa::@6/(byte*) ultoa::buffer#4 ) + [55] (byte) ultoa::started#4 ← phi( ultoa::@7/(byte) ultoa::started#2 ultoa::@6/(byte) 1 ) + [55] (dword) ultoa::value#6 ← phi( ultoa::@7/(dword) ultoa::value#2 ultoa::@6/(dword) ultoa::value#0 ) + [56] (byte) ultoa::digit#1 ← ++ (byte) ultoa::digit#2 + to:ultoa::@1 +ultoa::@5: scope:[ultoa] from ultoa::@2 ultoa::@7 + [57] (byte*) ultoa_append::buffer#0 ← (byte*) ultoa::buffer#11 + [58] (dword) ultoa_append::value#0 ← (dword) ultoa::value#2 + [59] (dword) ultoa_append::sub#0 ← (dword) ultoa::digit_value#0 + [60] call ultoa_append + [61] (dword) ultoa_append::return#0 ← (dword) ultoa_append::value#2 + to:ultoa::@6 +ultoa::@6: scope:[ultoa] from ultoa::@5 + [62] (dword) ultoa::value#0 ← (dword) ultoa_append::return#0 + [63] (byte*) ultoa::buffer#4 ← ++ (byte*) ultoa::buffer#11 + to:ultoa::@4 + +(dword()) ultoa_append((byte*) ultoa_append::buffer , (dword) ultoa_append::value , (dword) ultoa_append::sub) +ultoa_append: scope:[ultoa_append] from ultoa::@5 + [64] phi() + to:ultoa_append::@1 +ultoa_append::@1: scope:[ultoa_append] from ultoa_append ultoa_append::@2 + [65] (byte) ultoa_append::digit#2 ← phi( ultoa_append/(byte) 0 ultoa_append::@2/(byte) ultoa_append::digit#1 ) + [65] (dword) ultoa_append::value#2 ← phi( ultoa_append/(dword) ultoa_append::value#0 ultoa_append::@2/(dword) ultoa_append::value#1 ) + [66] if((dword) ultoa_append::value#2>=(dword) ultoa_append::sub#0) goto ultoa_append::@2 + to:ultoa_append::@3 +ultoa_append::@3: scope:[ultoa_append] from ultoa_append::@1 + [67] *((byte*) ultoa_append::buffer#0) ← *((const byte*) DIGITS + (byte) ultoa_append::digit#2) + to:ultoa_append::@return +ultoa_append::@return: scope:[ultoa_append] from ultoa_append::@3 + [68] return + to:@return +ultoa_append::@2: scope:[ultoa_append] from ultoa_append::@1 + [69] (byte) ultoa_append::digit#1 ← ++ (byte) ultoa_append::digit#2 + [70] (dword) ultoa_append::value#1 ← (dword) ultoa_append::value#2 - (dword) ultoa_append::sub#0 + to:ultoa_append::@1 + +(void()) print_cls() +print_cls: scope:[print_cls] from main + [71] phi() + [72] call memset + to:print_cls::@return +print_cls::@return: scope:[print_cls] from print_cls + [73] return + to:@return + +(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) +memset: scope:[memset] from print_cls + [74] phi() + to:memset::@1 +memset::@1: scope:[memset] from memset memset::@2 + [75] (byte*) memset::dst#2 ← phi( memset/(byte*)(const void*) memset::str#0 memset::@2/(byte*) memset::dst#1 ) + [76] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2 + to:memset::@return +memset::@return: scope:[memset] from memset::@1 + [77] return + to:@return +memset::@2: scope:[memset] from memset::@1 + [78] *((byte*) memset::dst#2) ← (const byte) memset::c#0 + [79] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2 + to:memset::@1 diff --git a/src/test/ref/multiply-16bit-const.log b/src/test/ref/multiply-16bit-const.log new file mode 100644 index 000000000..2a86ddcaf --- /dev/null +++ b/src/test/ref/multiply-16bit-const.log @@ -0,0 +1,3970 @@ +Fixing pointer addition (word*~) bsearch16u::$7 ← (word*) bsearch16u::items + (byte~) bsearch16u::$6 +Fixing pointer addition (word*~) bsearch16u::$15 ← (word*) bsearch16u::pivot + (number) 1 +Fixing pointer addition (word*~) bsearch16u::$1 ← (word*) bsearch16u::items - (number) 1 +Fixing pointer array-indexing *((word*) utoa::digit_values + (byte) utoa::digit) +Fixing pointer array-indexing *((dword*) ultoa::digit_values + (byte) ultoa::digit) +Warning! Adding boolean cast to non-boolean condition *((byte*) strcpy::src) +Warning! Adding boolean cast to non-boolean condition *((byte*) strlen::str) +Warning! Adding boolean cast to non-boolean condition *((byte*) print_str_lines::str) +Warning! Adding boolean cast to non-boolean condition (byte) print_str_lines::ch +Warning! Adding boolean cast to non-boolean condition *((byte*) print_str::str) +Warning! Adding boolean cast to non-boolean condition *((byte*) print_str_at::str) +Warning! Adding boolean cast to non-boolean sub-expression (byte) print_str_lines::ch +Identified constant variable (byte*) HEAP_TOP +Culled Empty Block (label) @1 +Culled Empty Block (label) @2 +Culled Empty Block (label) memset::@7 +Culled Empty Block (label) memset::@6 +Culled Empty Block (label) memset::@8 +Culled Empty Block (label) memset::@9 +Culled Empty Block (label) memset::@3 +Culled Empty Block (label) @3 +Culled Empty Block (label) @4 +Culled Empty Block (label) @5 +Culled Empty Block (label) @6 +Culled Empty Block (label) @7 +Culled Empty Block (label) @8 +Culled Empty Block (label) @9 +Culled Empty Block (label) @10 +Culled Empty Block (label) @11 +Culled Empty Block (label) @12 +Culled Empty Block (label) @13 +Culled Empty Block (label) ultoa::@13 +Culled Empty Block (label) ultoa::@5 +Culled Empty Block (label) ultoa::@14 +Culled Empty Block (label) ultoa::@6 +Culled Empty Block (label) ultoa::@15 +Culled Empty Block (label) ultoa::@7 +Culled Empty Block (label) ultoa::@16 +Culled Empty Block (label) ultoa::@17 +Culled Empty Block (label) ultoa::@22 +Culled Empty Block (label) ultoa::@23 +Culled Empty Block (label) ultoa::@25 +Culled Empty Block (label) @14 +Culled Empty Block (label) ultoa_append::@4 +Culled Empty Block (label) ultoa_append::@5 +Culled Empty Block (label) ultoa_append::@6 +Culled Empty Block (label) ultoa_append::@7 +Culled Empty Block (label) @16 +Culled Empty Block (label) @17 +Culled Empty Block (label) print_str::@4 +Culled Empty Block (label) print_str::@3 +Culled Empty Block (label) print_str::@5 +Culled Empty Block (label) print_str::@6 +Culled Empty Block (label) @18 +Culled Empty Block (label) @19 +Culled Empty Block (label) @20 +Culled Empty Block (label) @21 +Culled Empty Block (label) @22 +Culled Empty Block (label) @23 +Culled Empty Block (label) @24 +Culled Empty Block (label) @25 +Culled Empty Block (label) @26 +Culled Empty Block (label) @27 +Culled Empty Block (label) @28 +Culled Empty Block (label) @29 +Culled Empty Block (label) @30 +Culled Empty Block (label) @31 +Culled Empty Block (label) @32 +Culled Empty Block (label) @33 +Culled Empty Block (label) @34 +Culled Empty Block (label) @35 +Culled Empty Block (label) @36 +Culled Empty Block (label) @37 +Culled Empty Block (label) @38 +Culled Empty Block (label) @39 +Culled Empty Block (label) @40 +Culled Empty Block (label) main::@4 +Culled Empty Block (label) main::@3 +Culled Empty Block (label) main::@5 +Culled Empty Block (label) main::@6 + +CONTROL FLOW GRAPH SSA +@begin: scope:[] from + to:@15 + +(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) +memset: scope:[memset] from print_cls + (byte) memset::c#4 ← phi( print_cls/(byte) memset::c#0 ) + (void*) memset::str#3 ← phi( print_cls/(void*) memset::str#0 ) + (word) memset::num#1 ← phi( print_cls/(word) memset::num#0 ) + (bool~) memset::$0 ← (word) memset::num#1 > (number) 0 + (bool~) memset::$1 ← ! (bool~) memset::$0 + if((bool~) memset::$1) goto memset::@1 + to:memset::@2 +memset::@1: scope:[memset] from memset memset::@4 + (void*) memset::str#1 ← phi( memset/(void*) memset::str#3 memset::@4/(void*) memset::str#4 ) + (void*) memset::return#0 ← (void*) memset::str#1 + to:memset::@return +memset::@2: scope:[memset] from memset + (byte) memset::c#3 ← phi( memset/(byte) memset::c#4 ) + (word) memset::num#2 ← phi( memset/(word) memset::num#1 ) + (void*) memset::str#2 ← phi( memset/(void*) memset::str#3 ) + (byte*~) memset::$2 ← ((byte*)) (void*) memset::str#2 + (byte*~) memset::$3 ← (byte*~) memset::$2 + (word) memset::num#2 + (byte*) memset::end#0 ← (byte*~) memset::$3 + (byte*) memset::dst#0 ← ((byte*)) (void*) memset::str#2 + to:memset::@4 +memset::@4: scope:[memset] from memset::@2 memset::@5 + (byte) memset::c#2 ← phi( memset::@2/(byte) memset::c#3 memset::@5/(byte) memset::c#1 ) + (void*) memset::str#4 ← phi( memset::@2/(void*) memset::str#2 memset::@5/(void*) memset::str#5 ) + (byte*) memset::end#1 ← phi( memset::@2/(byte*) memset::end#0 memset::@5/(byte*) memset::end#2 ) + (byte*) memset::dst#2 ← phi( memset::@2/(byte*) memset::dst#0 memset::@5/(byte*) memset::dst#1 ) + (bool~) memset::$4 ← (byte*) memset::dst#2 != (byte*) memset::end#1 + if((bool~) memset::$4) goto memset::@5 + to:memset::@1 +memset::@5: scope:[memset] from memset::@4 + (void*) memset::str#5 ← phi( memset::@4/(void*) memset::str#4 ) + (byte*) memset::end#2 ← phi( memset::@4/(byte*) memset::end#1 ) + (byte*) memset::dst#3 ← phi( memset::@4/(byte*) memset::dst#2 ) + (byte) memset::c#1 ← phi( memset::@4/(byte) memset::c#2 ) + *((byte*) memset::dst#3) ← (byte) memset::c#1 + (byte*) memset::dst#1 ← ++ (byte*) memset::dst#3 + to:memset::@4 +memset::@return: scope:[memset] from memset::@1 + (void*) memset::return#3 ← phi( memset::@1/(void*) memset::return#0 ) + (void*) memset::return#1 ← (void*) memset::return#3 + return + to:@return + +(void()) ultoa((dword) ultoa::value , (byte*) ultoa::buffer , (byte) ultoa::radix) +ultoa: scope:[ultoa] from print_ulong_decimal + (byte*) ultoa::buffer#21 ← phi( print_ulong_decimal/(byte*) ultoa::buffer#5 ) + (dword) ultoa::value#12 ← phi( print_ulong_decimal/(dword) ultoa::value#1 ) + (byte) ultoa::radix#1 ← phi( print_ulong_decimal/(byte) ultoa::radix#0 ) + (byte) ultoa::max_digits#0 ← (byte) 0 + (dword*) ultoa::digit_values#0 ← (dword*) 0 + (bool~) ultoa::$0 ← (byte) ultoa::radix#1 == (const byte) DECIMAL + if((bool~) ultoa::$0) goto ultoa::@1 + to:ultoa::@9 +ultoa::@1: scope:[ultoa] from ultoa + (byte*) ultoa::buffer#17 ← phi( ultoa/(byte*) ultoa::buffer#21 ) + (dword) ultoa::value#8 ← phi( ultoa/(dword) ultoa::value#12 ) + (byte) ultoa::max_digits#1 ← (number) $a + (dword*) ultoa::digit_values#1 ← (const dword*) RADIX_DECIMAL_VALUES_LONG + to:ultoa::@8 +ultoa::@9: scope:[ultoa] from ultoa + (dword) ultoa::value#13 ← phi( ultoa/(dword) ultoa::value#12 ) + (byte*) ultoa::buffer#16 ← phi( ultoa/(byte*) ultoa::buffer#21 ) + (byte) ultoa::radix#2 ← phi( ultoa/(byte) ultoa::radix#1 ) + (bool~) ultoa::$1 ← (byte) ultoa::radix#2 == (const byte) HEXADECIMAL + if((bool~) ultoa::$1) goto ultoa::@2 + to:ultoa::@10 +ultoa::@2: scope:[ultoa] from ultoa::@9 + (byte*) ultoa::buffer#18 ← phi( ultoa::@9/(byte*) ultoa::buffer#16 ) + (dword) ultoa::value#9 ← phi( ultoa::@9/(dword) ultoa::value#13 ) + (byte) ultoa::max_digits#2 ← (number) 8 + (dword*) ultoa::digit_values#2 ← (const dword*) RADIX_HEXADECIMAL_VALUES_LONG + to:ultoa::@8 +ultoa::@10: scope:[ultoa] from ultoa::@9 + (dword) ultoa::value#14 ← phi( ultoa::@9/(dword) ultoa::value#13 ) + (byte*) ultoa::buffer#13 ← phi( ultoa::@9/(byte*) ultoa::buffer#16 ) + (byte) ultoa::radix#3 ← phi( ultoa::@9/(byte) ultoa::radix#2 ) + (bool~) ultoa::$2 ← (byte) ultoa::radix#3 == (const byte) OCTAL + if((bool~) ultoa::$2) goto ultoa::@3 + to:ultoa::@11 +ultoa::@3: scope:[ultoa] from ultoa::@10 + (byte*) ultoa::buffer#19 ← phi( ultoa::@10/(byte*) ultoa::buffer#13 ) + (dword) ultoa::value#10 ← phi( ultoa::@10/(dword) ultoa::value#14 ) + (byte) ultoa::max_digits#3 ← (number) $b + (dword*) ultoa::digit_values#3 ← (const dword*) RADIX_OCTAL_VALUES_LONG + to:ultoa::@8 +ultoa::@11: scope:[ultoa] from ultoa::@10 + (dword) ultoa::value#15 ← phi( ultoa::@10/(dword) ultoa::value#14 ) + (byte*) ultoa::buffer#10 ← phi( ultoa::@10/(byte*) ultoa::buffer#13 ) + (byte) ultoa::radix#4 ← phi( ultoa::@10/(byte) ultoa::radix#3 ) + (bool~) ultoa::$3 ← (byte) ultoa::radix#4 == (const byte) BINARY + if((bool~) ultoa::$3) goto ultoa::@4 + to:ultoa::@12 +ultoa::@4: scope:[ultoa] from ultoa::@11 + (byte*) ultoa::buffer#20 ← phi( ultoa::@11/(byte*) ultoa::buffer#10 ) + (dword) ultoa::value#11 ← phi( ultoa::@11/(dword) ultoa::value#15 ) + (byte) ultoa::max_digits#4 ← (number) $20 + (dword*) ultoa::digit_values#4 ← (const dword*) RADIX_BINARY_VALUES_LONG + to:ultoa::@8 +ultoa::@12: scope:[ultoa] from ultoa::@11 + (byte*) ultoa::buffer#6 ← phi( ultoa::@11/(byte*) ultoa::buffer#10 ) + *((byte*) ultoa::buffer#6) ← (byte) 'e' + (byte*) ultoa::buffer#0 ← ++ (byte*) ultoa::buffer#6 + *((byte*) ultoa::buffer#0) ← (byte) 'r' + (byte*) ultoa::buffer#1 ← ++ (byte*) ultoa::buffer#0 + *((byte*) ultoa::buffer#1) ← (byte) 'r' + (byte*) ultoa::buffer#2 ← ++ (byte*) ultoa::buffer#1 + *((byte*) ultoa::buffer#2) ← (number) 0 + to:ultoa::@return +ultoa::@return: scope:[ultoa] from ultoa::@12 ultoa::@20 + return + to:@return +ultoa::@8: scope:[ultoa] from ultoa::@1 ultoa::@2 ultoa::@3 ultoa::@4 + (byte*) ultoa::buffer#15 ← phi( ultoa::@1/(byte*) ultoa::buffer#17 ultoa::@2/(byte*) ultoa::buffer#18 ultoa::@3/(byte*) ultoa::buffer#19 ultoa::@4/(byte*) ultoa::buffer#20 ) + (dword) ultoa::value#7 ← phi( ultoa::@1/(dword) ultoa::value#8 ultoa::@2/(dword) ultoa::value#9 ultoa::@3/(dword) ultoa::value#10 ultoa::@4/(dword) ultoa::value#11 ) + (dword*) ultoa::digit_values#8 ← phi( ultoa::@1/(dword*) ultoa::digit_values#1 ultoa::@2/(dword*) ultoa::digit_values#2 ultoa::@3/(dword*) ultoa::digit_values#3 ultoa::@4/(dword*) ultoa::digit_values#4 ) + (byte) ultoa::max_digits#7 ← phi( ultoa::@1/(byte) ultoa::max_digits#1 ultoa::@2/(byte) ultoa::max_digits#2 ultoa::@3/(byte) ultoa::max_digits#3 ultoa::@4/(byte) ultoa::max_digits#4 ) + (byte) ultoa::started#0 ← (byte) 0 + (byte) ultoa::digit#0 ← (byte) 0 + to:ultoa::@18 +ultoa::@18: scope:[ultoa] from ultoa::@21 ultoa::@8 + (byte*) ultoa::buffer#11 ← phi( ultoa::@21/(byte*) ultoa::buffer#14 ultoa::@8/(byte*) ultoa::buffer#15 ) + (byte) ultoa::started#3 ← phi( ultoa::@21/(byte) ultoa::started#4 ultoa::@8/(byte) ultoa::started#0 ) + (dword) ultoa::value#5 ← phi( ultoa::@21/(dword) ultoa::value#6 ultoa::@8/(dword) ultoa::value#7 ) + (dword*) ultoa::digit_values#6 ← phi( ultoa::@21/(dword*) ultoa::digit_values#7 ultoa::@8/(dword*) ultoa::digit_values#8 ) + (byte) ultoa::digit#2 ← phi( ultoa::@21/(byte) ultoa::digit#1 ultoa::@8/(byte) ultoa::digit#0 ) + (byte) ultoa::max_digits#5 ← phi( ultoa::@21/(byte) ultoa::max_digits#6 ultoa::@8/(byte) ultoa::max_digits#7 ) + (number~) ultoa::$5 ← (byte) ultoa::max_digits#5 - (number) 1 + (bool~) ultoa::$6 ← (byte) ultoa::digit#2 < (number~) ultoa::$5 + if((bool~) ultoa::$6) goto ultoa::@19 + to:ultoa::@20 +ultoa::@19: scope:[ultoa] from ultoa::@18 + (byte) ultoa::max_digits#8 ← phi( ultoa::@18/(byte) ultoa::max_digits#5 ) + (byte*) ultoa::buffer#12 ← phi( ultoa::@18/(byte*) ultoa::buffer#11 ) + (byte) ultoa::started#2 ← phi( ultoa::@18/(byte) ultoa::started#3 ) + (dword) ultoa::value#2 ← phi( ultoa::@18/(dword) ultoa::value#5 ) + (dword*) ultoa::digit_values#5 ← phi( ultoa::@18/(dword*) ultoa::digit_values#6 ) + (byte) ultoa::digit#3 ← phi( ultoa::@18/(byte) ultoa::digit#2 ) + (byte~) ultoa::$11 ← (byte) ultoa::digit#3 * (const byte) SIZEOF_DWORD + (dword) ultoa::digit_value#0 ← *((dword*) ultoa::digit_values#5 + (byte~) ultoa::$11) + (bool~) ultoa::$7 ← (dword) ultoa::value#2 >= (dword) ultoa::digit_value#0 + (bool~) ultoa::$8 ← (byte) ultoa::started#2 || (bool~) ultoa::$7 + (bool~) ultoa::$9 ← ! (bool~) ultoa::$8 + if((bool~) ultoa::$9) goto ultoa::@21 + to:ultoa::@24 +ultoa::@20: scope:[ultoa] from ultoa::@18 + (byte*) ultoa::buffer#7 ← phi( ultoa::@18/(byte*) ultoa::buffer#11 ) + (dword) ultoa::value#3 ← phi( ultoa::@18/(dword) ultoa::value#5 ) + (byte~) ultoa::$4 ← ((byte)) (dword) ultoa::value#3 + *((byte*) ultoa::buffer#7) ← *((const byte*) DIGITS + (byte~) ultoa::$4) + (byte*) ultoa::buffer#3 ← ++ (byte*) ultoa::buffer#7 + *((byte*) ultoa::buffer#3) ← (number) 0 + to:ultoa::@return +ultoa::@21: scope:[ultoa] from ultoa::@19 ultoa::@26 + (byte*) ultoa::buffer#14 ← phi( ultoa::@19/(byte*) ultoa::buffer#12 ultoa::@26/(byte*) ultoa::buffer#4 ) + (byte) ultoa::started#4 ← phi( ultoa::@19/(byte) ultoa::started#2 ultoa::@26/(byte) ultoa::started#1 ) + (dword) ultoa::value#6 ← phi( ultoa::@19/(dword) ultoa::value#2 ultoa::@26/(dword) ultoa::value#0 ) + (dword*) ultoa::digit_values#7 ← phi( ultoa::@19/(dword*) ultoa::digit_values#5 ultoa::@26/(dword*) ultoa::digit_values#9 ) + (byte) ultoa::max_digits#6 ← phi( ultoa::@19/(byte) ultoa::max_digits#8 ultoa::@26/(byte) ultoa::max_digits#9 ) + (byte) ultoa::digit#4 ← phi( ultoa::@19/(byte) ultoa::digit#3 ultoa::@26/(byte) ultoa::digit#5 ) + (byte) ultoa::digit#1 ← ++ (byte) ultoa::digit#4 + to:ultoa::@18 +ultoa::@24: scope:[ultoa] from ultoa::@19 + (dword*) ultoa::digit_values#10 ← phi( ultoa::@19/(dword*) ultoa::digit_values#5 ) + (byte) ultoa::max_digits#10 ← phi( ultoa::@19/(byte) ultoa::max_digits#8 ) + (byte) ultoa::digit#6 ← phi( ultoa::@19/(byte) ultoa::digit#3 ) + (dword) ultoa::digit_value#1 ← phi( ultoa::@19/(dword) ultoa::digit_value#0 ) + (dword) ultoa::value#4 ← phi( ultoa::@19/(dword) ultoa::value#2 ) + (byte*) ultoa::buffer#8 ← phi( ultoa::@19/(byte*) ultoa::buffer#12 ) + (byte*) ultoa_append::buffer#0 ← (byte*) ultoa::buffer#8 + (dword) ultoa_append::value#0 ← (dword) ultoa::value#4 + (dword) ultoa_append::sub#0 ← (dword) ultoa::digit_value#1 + call ultoa_append + (dword) ultoa_append::return#0 ← (dword) ultoa_append::return#2 + to:ultoa::@26 +ultoa::@26: scope:[ultoa] from ultoa::@24 + (dword*) ultoa::digit_values#9 ← phi( ultoa::@24/(dword*) ultoa::digit_values#10 ) + (byte) ultoa::max_digits#9 ← phi( ultoa::@24/(byte) ultoa::max_digits#10 ) + (byte) ultoa::digit#5 ← phi( ultoa::@24/(byte) ultoa::digit#6 ) + (byte*) ultoa::buffer#9 ← phi( ultoa::@24/(byte*) ultoa::buffer#8 ) + (dword) ultoa_append::return#3 ← phi( ultoa::@24/(dword) ultoa_append::return#0 ) + (dword~) ultoa::$10 ← (dword) ultoa_append::return#3 + (dword) ultoa::value#0 ← (dword~) ultoa::$10 + (byte*) ultoa::buffer#4 ← ++ (byte*) ultoa::buffer#9 + (byte) ultoa::started#1 ← (number) 1 + to:ultoa::@21 + +(dword()) ultoa_append((byte*) ultoa_append::buffer , (dword) ultoa_append::value , (dword) ultoa_append::sub) +ultoa_append: scope:[ultoa_append] from ultoa::@24 + (byte*) ultoa_append::buffer#3 ← phi( ultoa::@24/(byte*) ultoa_append::buffer#0 ) + (dword) ultoa_append::sub#3 ← phi( ultoa::@24/(dword) ultoa_append::sub#0 ) + (dword) ultoa_append::value#5 ← phi( ultoa::@24/(dword) ultoa_append::value#0 ) + (byte) ultoa_append::digit#0 ← (byte) 0 + to:ultoa_append::@1 +ultoa_append::@1: scope:[ultoa_append] from ultoa_append ultoa_append::@2 + (byte*) ultoa_append::buffer#2 ← phi( ultoa_append/(byte*) ultoa_append::buffer#3 ultoa_append::@2/(byte*) ultoa_append::buffer#4 ) + (byte) ultoa_append::digit#4 ← phi( ultoa_append/(byte) ultoa_append::digit#0 ultoa_append::@2/(byte) ultoa_append::digit#1 ) + (dword) ultoa_append::sub#1 ← phi( ultoa_append/(dword) ultoa_append::sub#3 ultoa_append::@2/(dword) ultoa_append::sub#2 ) + (dword) ultoa_append::value#2 ← phi( ultoa_append/(dword) ultoa_append::value#5 ultoa_append::@2/(dword) ultoa_append::value#1 ) + (bool~) ultoa_append::$0 ← (dword) ultoa_append::value#2 >= (dword) ultoa_append::sub#1 + if((bool~) ultoa_append::$0) goto ultoa_append::@2 + to:ultoa_append::@3 +ultoa_append::@2: scope:[ultoa_append] from ultoa_append::@1 + (byte*) ultoa_append::buffer#4 ← phi( ultoa_append::@1/(byte*) ultoa_append::buffer#2 ) + (dword) ultoa_append::sub#2 ← phi( ultoa_append::@1/(dword) ultoa_append::sub#1 ) + (dword) ultoa_append::value#3 ← phi( ultoa_append::@1/(dword) ultoa_append::value#2 ) + (byte) ultoa_append::digit#2 ← phi( ultoa_append::@1/(byte) ultoa_append::digit#4 ) + (byte) ultoa_append::digit#1 ← ++ (byte) ultoa_append::digit#2 + (dword) ultoa_append::value#1 ← (dword) ultoa_append::value#3 - (dword) ultoa_append::sub#2 + to:ultoa_append::@1 +ultoa_append::@3: scope:[ultoa_append] from ultoa_append::@1 + (dword) ultoa_append::value#4 ← phi( ultoa_append::@1/(dword) ultoa_append::value#2 ) + (byte*) ultoa_append::buffer#1 ← phi( ultoa_append::@1/(byte*) ultoa_append::buffer#2 ) + (byte) ultoa_append::digit#3 ← phi( ultoa_append::@1/(byte) ultoa_append::digit#4 ) + *((byte*) ultoa_append::buffer#1) ← *((const byte*) DIGITS + (byte) ultoa_append::digit#3) + (dword) ultoa_append::return#1 ← (dword) ultoa_append::value#4 + to:ultoa_append::@return +ultoa_append::@return: scope:[ultoa_append] from ultoa_append::@3 + (dword) ultoa_append::return#4 ← phi( ultoa_append::@3/(dword) ultoa_append::return#1 ) + (dword) ultoa_append::return#2 ← (dword) ultoa_append::return#4 + return + to:@return +@15: scope:[] from @begin + (byte*) print_screen#0 ← (byte*)(number) $400 + (byte*) print_line_cursor#0 ← (byte*) print_screen#0 + (byte*) print_char_cursor#0 ← (byte*) print_line_cursor#0 + to:@41 + +(void()) print_str((byte*) print_str::str) +print_str: scope:[print_str] from print_ulong_decimal::@1 + (byte*) print_char_cursor#38 ← phi( print_ulong_decimal::@1/(byte*) print_char_cursor#33 ) + (byte*) print_str::str#5 ← phi( print_ulong_decimal::@1/(byte*) print_str::str#1 ) + to:print_str::@1 +print_str::@1: scope:[print_str] from print_str print_str::@7 + (byte*) print_char_cursor#31 ← phi( print_str/(byte*) print_char_cursor#38 print_str::@7/(byte*) print_char_cursor#1 ) + (byte*) print_str::str#2 ← phi( print_str/(byte*) print_str::str#5 print_str::@7/(byte*) print_str::str#0 ) + (bool~) print_str::$1 ← (number) 0 != *((byte*) print_str::str#2) + if((bool~) print_str::$1) goto print_str::@2 + to:print_str::@return +print_str::@2: scope:[print_str] from print_str::@1 + (byte*) print_char_cursor#30 ← phi( print_str::@1/(byte*) print_char_cursor#31 ) + (byte*) print_str::str#3 ← phi( print_str::@1/(byte*) print_str::str#2 ) + (byte) print_char::ch#0 ← *((byte*) print_str::str#3) + call print_char + to:print_str::@7 +print_str::@7: scope:[print_str] from print_str::@2 + (byte*) print_str::str#4 ← phi( print_str::@2/(byte*) print_str::str#3 ) + (byte*) print_char_cursor#16 ← phi( print_str::@2/(byte*) print_char_cursor#8 ) + (byte*) print_char_cursor#1 ← (byte*) print_char_cursor#16 + (byte*) print_str::str#0 ← ++ (byte*) print_str::str#4 + to:print_str::@1 +print_str::@return: scope:[print_str] from print_str::@1 + (byte*) print_char_cursor#17 ← phi( print_str::@1/(byte*) print_char_cursor#31 ) + (byte*) print_char_cursor#2 ← (byte*) print_char_cursor#17 + return + to:@return + +(void()) print_ln() +print_ln: scope:[print_ln] from main::@8 + (byte*) print_char_cursor#32 ← phi( main::@8/(byte*) print_char_cursor#12 ) + (byte*) print_line_cursor#17 ← phi( main::@8/(byte*) print_line_cursor#19 ) + to:print_ln::@1 +print_ln::@1: scope:[print_ln] from print_ln print_ln::@1 + (byte*) print_char_cursor#18 ← phi( print_ln/(byte*) print_char_cursor#32 print_ln::@1/(byte*) print_char_cursor#18 ) + (byte*) print_line_cursor#9 ← phi( print_ln/(byte*) print_line_cursor#17 print_ln::@1/(byte*) print_line_cursor#1 ) + (byte*~) print_ln::$0 ← (byte*) print_line_cursor#9 + (number) $28 + (byte*) print_line_cursor#1 ← (byte*~) print_ln::$0 + (bool~) print_ln::$1 ← (byte*) print_line_cursor#1 < (byte*) print_char_cursor#18 + if((bool~) print_ln::$1) goto print_ln::@1 + to:print_ln::@2 +print_ln::@2: scope:[print_ln] from print_ln::@1 + (byte*) print_line_cursor#10 ← phi( print_ln::@1/(byte*) print_line_cursor#1 ) + (byte*) print_char_cursor#3 ← (byte*) print_line_cursor#10 + to:print_ln::@return +print_ln::@return: scope:[print_ln] from print_ln::@2 + (byte*) print_char_cursor#19 ← phi( print_ln::@2/(byte*) print_char_cursor#3 ) + (byte*) print_line_cursor#11 ← phi( print_ln::@2/(byte*) print_line_cursor#10 ) + (byte*) print_line_cursor#2 ← (byte*) print_line_cursor#11 + (byte*) print_char_cursor#4 ← (byte*) print_char_cursor#19 + return + to:@return + +(void()) print_ulong_decimal((dword) print_ulong_decimal::w) +print_ulong_decimal: scope:[print_ulong_decimal] from main::@2 + (byte*) print_char_cursor#39 ← phi( main::@2/(byte*) print_char_cursor#35 ) + (dword) print_ulong_decimal::w#1 ← phi( main::@2/(dword) print_ulong_decimal::w#0 ) + (dword) ultoa::value#1 ← (dword) print_ulong_decimal::w#1 + (byte*) ultoa::buffer#5 ← (const byte*) decimal_digits_long + (byte) ultoa::radix#0 ← (const byte) DECIMAL + call ultoa + to:print_ulong_decimal::@1 +print_ulong_decimal::@1: scope:[print_ulong_decimal] from print_ulong_decimal + (byte*) print_char_cursor#33 ← phi( print_ulong_decimal/(byte*) print_char_cursor#39 ) + (byte*) print_str::str#1 ← (const byte*) decimal_digits_long + call print_str + to:print_ulong_decimal::@2 +print_ulong_decimal::@2: scope:[print_ulong_decimal] from print_ulong_decimal::@1 + (byte*) print_char_cursor#20 ← phi( print_ulong_decimal::@1/(byte*) print_char_cursor#2 ) + (byte*) print_char_cursor#5 ← (byte*) print_char_cursor#20 + to:print_ulong_decimal::@return +print_ulong_decimal::@return: scope:[print_ulong_decimal] from print_ulong_decimal::@2 + (byte*) print_char_cursor#21 ← phi( print_ulong_decimal::@2/(byte*) print_char_cursor#5 ) + (byte*) print_char_cursor#6 ← (byte*) print_char_cursor#21 + return + to:@return + +(void()) print_char((byte) print_char::ch) +print_char: scope:[print_char] from print_str::@2 + (byte*) print_char_cursor#22 ← phi( print_str::@2/(byte*) print_char_cursor#30 ) + (byte) print_char::ch#1 ← phi( print_str::@2/(byte) print_char::ch#0 ) + *((byte*) print_char_cursor#22) ← (byte) print_char::ch#1 + (byte*) print_char_cursor#7 ← ++ (byte*) print_char_cursor#22 + to:print_char::@return +print_char::@return: scope:[print_char] from print_char + (byte*) print_char_cursor#23 ← phi( print_char/(byte*) print_char_cursor#7 ) + (byte*) print_char_cursor#8 ← (byte*) print_char_cursor#23 + return + to:@return + +(void()) print_cls() +print_cls: scope:[print_cls] from main + (byte*) print_screen#1 ← phi( main/(byte*) print_screen#3 ) + (void*) memset::str#0 ← (void*)(byte*) print_screen#1 + (byte) memset::c#0 ← (byte) ' ' + (word) memset::num#0 ← (number) $3e8 + call memset + (void*) memset::return#2 ← (void*) memset::return#1 + to:print_cls::@1 +print_cls::@1: scope:[print_cls] from print_cls + (byte*) print_screen#2 ← phi( print_cls/(byte*) print_screen#1 ) + (byte*) print_line_cursor#3 ← (byte*) print_screen#2 + (byte*) print_char_cursor#9 ← (byte*) print_line_cursor#3 + to:print_cls::@return +print_cls::@return: scope:[print_cls] from print_cls::@1 + (byte*) print_char_cursor#24 ← phi( print_cls::@1/(byte*) print_char_cursor#9 ) + (byte*) print_line_cursor#12 ← phi( print_cls::@1/(byte*) print_line_cursor#3 ) + (byte*) print_line_cursor#4 ← (byte*) print_line_cursor#12 + (byte*) print_char_cursor#10 ← (byte*) print_char_cursor#24 + return + to:@return + +(void()) main() +main: scope:[main] from @41 + (byte*) print_char_cursor#34 ← phi( @41/(byte*) print_char_cursor#37 ) + (byte*) print_line_cursor#18 ← phi( @41/(byte*) print_line_cursor#21 ) + (byte*) print_screen#3 ← phi( @41/(byte*) print_screen#4 ) + call print_cls + to:main::@7 +main::@7: scope:[main] from main + (byte*) print_char_cursor#25 ← phi( main/(byte*) print_char_cursor#10 ) + (byte*) print_line_cursor#13 ← phi( main/(byte*) print_line_cursor#4 ) + (byte*) print_line_cursor#5 ← (byte*) print_line_cursor#13 + (byte*) print_char_cursor#11 ← (byte*) print_char_cursor#25 + (dword) main::i#0 ← (dword) 0 + to:main::@1 +main::@1: scope:[main] from main::@7 main::@9 + (byte*) print_char_cursor#36 ← phi( main::@7/(byte*) print_char_cursor#11 main::@9/(byte*) print_char_cursor#13 ) + (byte*) print_line_cursor#20 ← phi( main::@7/(byte*) print_line_cursor#5 main::@9/(byte*) print_line_cursor#6 ) + (dword) main::i#2 ← phi( main::@7/(dword) main::i#0 main::@9/(dword) main::i#1 ) + (bool~) main::$1 ← (dword) main::i#2 < (number) $d02 + if((bool~) main::$1) goto main::@2 + to:main::@return +main::@2: scope:[main] from main::@1 + (byte*) print_line_cursor#22 ← phi( main::@1/(byte*) print_line_cursor#20 ) + (byte*) print_char_cursor#35 ← phi( main::@1/(byte*) print_char_cursor#36 ) + (dword) main::i#3 ← phi( main::@1/(dword) main::i#2 ) + (number~) main::$2 ← (dword) main::i#3 * (number) $22b + (dword) print_ulong_decimal::w#0 ← (number~) main::$2 + call print_ulong_decimal + to:main::@8 +main::@8: scope:[main] from main::@2 + (dword) main::i#5 ← phi( main::@2/(dword) main::i#3 ) + (byte*) print_line_cursor#19 ← phi( main::@2/(byte*) print_line_cursor#22 ) + (byte*) print_char_cursor#26 ← phi( main::@2/(byte*) print_char_cursor#6 ) + (byte*) print_char_cursor#12 ← (byte*) print_char_cursor#26 + call print_ln + to:main::@9 +main::@9: scope:[main] from main::@8 + (dword) main::i#4 ← phi( main::@8/(dword) main::i#5 ) + (byte*) print_char_cursor#27 ← phi( main::@8/(byte*) print_char_cursor#4 ) + (byte*) print_line_cursor#14 ← phi( main::@8/(byte*) print_line_cursor#2 ) + (byte*) print_line_cursor#6 ← (byte*) print_line_cursor#14 + (byte*) print_char_cursor#13 ← (byte*) print_char_cursor#27 + (dword) main::i#1 ← (dword) main::i#4 + (number) $14d + to:main::@1 +main::@return: scope:[main] from main::@1 + (byte*) print_char_cursor#28 ← phi( main::@1/(byte*) print_char_cursor#36 ) + (byte*) print_line_cursor#15 ← phi( main::@1/(byte*) print_line_cursor#20 ) + (byte*) print_line_cursor#7 ← (byte*) print_line_cursor#15 + (byte*) print_char_cursor#14 ← (byte*) print_char_cursor#28 + return + to:@return +@41: scope:[] from @15 + (byte*) print_screen#4 ← phi( @15/(byte*) print_screen#0 ) + (byte*) print_char_cursor#37 ← phi( @15/(byte*) print_char_cursor#0 ) + (byte*) print_line_cursor#21 ← phi( @15/(byte*) print_line_cursor#0 ) + call main + to:@42 +@42: scope:[] from @41 + (byte*) print_char_cursor#29 ← phi( @41/(byte*) print_char_cursor#14 ) + (byte*) print_line_cursor#16 ← phi( @41/(byte*) print_line_cursor#7 ) + (byte*) print_line_cursor#8 ← (byte*) print_line_cursor#16 + (byte*) print_char_cursor#15 ← (byte*) print_char_cursor#29 + to:@end +@end: scope:[] from @42 + +SYMBOL TABLE SSA +(label) @15 +(label) @41 +(label) @42 +(label) @begin +(label) @end +(const byte) BINARY = (number) 2 +(const byte) DECIMAL = (number) $a +(const byte*) DIGITS[] = (byte*) "0123456789abcdef"z +(const byte) HEXADECIMAL = (number) $10 +(const byte) OCTAL = (number) 8 +(const byte) RADIX::BINARY = (number) 2 +(const byte) RADIX::DECIMAL = (number) $a +(const byte) RADIX::HEXADECIMAL = (number) $10 +(const byte) RADIX::OCTAL = (number) 8 +(const dword*) RADIX_BINARY_VALUES_LONG[] = { (dword) $80000000, (dword) $40000000, (dword) $20000000, (dword) $10000000, (dword) $8000000, (dword) $4000000, (dword) $2000000, (dword) $1000000, (dword) $800000, (dword) $400000, (dword) $200000, (dword) $100000, (dword) $80000, (dword) $40000, (dword) $20000, (dword) $10000, (dword) $8000, (dword) $4000, (dword) $2000, (dword) $1000, (dword) $800, (dword) $400, (dword) $200, (dword) $100, (dword) $80, (dword) $40, (dword) $20, (dword) $10, (dword) 8, (dword) 4, (dword) 2 } +(const dword*) RADIX_DECIMAL_VALUES_LONG[] = { (dword) $3b9aca00, (dword) $5f5e100, (dword) $989680, (dword) $f4240, (dword) $186a0, (dword) $2710, (dword) $3e8, (dword) $64, (dword) $a } +(const dword*) RADIX_HEXADECIMAL_VALUES_LONG[] = { (dword) $10000000, (dword) $1000000, (dword) $100000, (dword) $10000, (dword) $1000, (dword) $100, (dword) $10 } +(const dword*) RADIX_OCTAL_VALUES_LONG[] = { (dword) $40000000, (dword) $8000000, (dword) $1000000, (dword) $200000, (dword) $40000, (dword) $8000, (dword) $1000, (dword) $200, (dword) $40, (dword) 8 } +(const byte) SIZEOF_DWORD = (byte) 4 +(const byte*) decimal_digits_long[(number) $b] = { fill( $b, 0) } +(void()) main() +(bool~) main::$1 +(number~) main::$2 +(label) main::@1 +(label) main::@2 +(label) main::@7 +(label) main::@8 +(label) main::@9 +(label) main::@return +(dword) main::i +(dword) main::i#0 +(dword) main::i#1 +(dword) main::i#2 +(dword) main::i#3 +(dword) main::i#4 +(dword) main::i#5 +(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) +(bool~) memset::$0 +(bool~) memset::$1 +(byte*~) memset::$2 +(byte*~) memset::$3 +(bool~) memset::$4 +(label) memset::@1 +(label) memset::@2 +(label) memset::@4 +(label) memset::@5 +(label) memset::@return +(byte) memset::c +(byte) memset::c#0 +(byte) memset::c#1 +(byte) memset::c#2 +(byte) memset::c#3 +(byte) memset::c#4 +(byte*) memset::dst +(byte*) memset::dst#0 +(byte*) memset::dst#1 +(byte*) memset::dst#2 +(byte*) memset::dst#3 +(byte*) memset::end +(byte*) memset::end#0 +(byte*) memset::end#1 +(byte*) memset::end#2 +(word) memset::num +(word) memset::num#0 +(word) memset::num#1 +(word) memset::num#2 +(void*) memset::return +(void*) memset::return#0 +(void*) memset::return#1 +(void*) memset::return#2 +(void*) memset::return#3 +(void*) memset::str +(void*) memset::str#0 +(void*) memset::str#1 +(void*) memset::str#2 +(void*) memset::str#3 +(void*) memset::str#4 +(void*) memset::str#5 +(void()) print_char((byte) print_char::ch) +(label) print_char::@return +(byte) print_char::ch +(byte) print_char::ch#0 +(byte) print_char::ch#1 +(byte*) print_char_cursor +(byte*) print_char_cursor#0 +(byte*) print_char_cursor#1 +(byte*) print_char_cursor#10 +(byte*) print_char_cursor#11 +(byte*) print_char_cursor#12 +(byte*) print_char_cursor#13 +(byte*) print_char_cursor#14 +(byte*) print_char_cursor#15 +(byte*) print_char_cursor#16 +(byte*) print_char_cursor#17 +(byte*) print_char_cursor#18 +(byte*) print_char_cursor#19 +(byte*) print_char_cursor#2 +(byte*) print_char_cursor#20 +(byte*) print_char_cursor#21 +(byte*) print_char_cursor#22 +(byte*) print_char_cursor#23 +(byte*) print_char_cursor#24 +(byte*) print_char_cursor#25 +(byte*) print_char_cursor#26 +(byte*) print_char_cursor#27 +(byte*) print_char_cursor#28 +(byte*) print_char_cursor#29 +(byte*) print_char_cursor#3 +(byte*) print_char_cursor#30 +(byte*) print_char_cursor#31 +(byte*) print_char_cursor#32 +(byte*) print_char_cursor#33 +(byte*) print_char_cursor#34 +(byte*) print_char_cursor#35 +(byte*) print_char_cursor#36 +(byte*) print_char_cursor#37 +(byte*) print_char_cursor#38 +(byte*) print_char_cursor#39 +(byte*) print_char_cursor#4 +(byte*) print_char_cursor#5 +(byte*) print_char_cursor#6 +(byte*) print_char_cursor#7 +(byte*) print_char_cursor#8 +(byte*) print_char_cursor#9 +(void()) print_cls() +(label) print_cls::@1 +(label) print_cls::@return +(byte*) print_line_cursor +(byte*) print_line_cursor#0 +(byte*) print_line_cursor#1 +(byte*) print_line_cursor#10 +(byte*) print_line_cursor#11 +(byte*) print_line_cursor#12 +(byte*) print_line_cursor#13 +(byte*) print_line_cursor#14 +(byte*) print_line_cursor#15 +(byte*) print_line_cursor#16 +(byte*) print_line_cursor#17 +(byte*) print_line_cursor#18 +(byte*) print_line_cursor#19 +(byte*) print_line_cursor#2 +(byte*) print_line_cursor#20 +(byte*) print_line_cursor#21 +(byte*) print_line_cursor#22 +(byte*) print_line_cursor#3 +(byte*) print_line_cursor#4 +(byte*) print_line_cursor#5 +(byte*) print_line_cursor#6 +(byte*) print_line_cursor#7 +(byte*) print_line_cursor#8 +(byte*) print_line_cursor#9 +(void()) print_ln() +(byte*~) print_ln::$0 +(bool~) print_ln::$1 +(label) print_ln::@1 +(label) print_ln::@2 +(label) print_ln::@return +(byte*) print_screen +(byte*) print_screen#0 +(byte*) print_screen#1 +(byte*) print_screen#2 +(byte*) print_screen#3 +(byte*) print_screen#4 +(void()) print_str((byte*) print_str::str) +(bool~) print_str::$1 +(label) print_str::@1 +(label) print_str::@2 +(label) print_str::@7 +(label) print_str::@return +(byte*) print_str::str +(byte*) print_str::str#0 +(byte*) print_str::str#1 +(byte*) print_str::str#2 +(byte*) print_str::str#3 +(byte*) print_str::str#4 +(byte*) print_str::str#5 +(void()) print_ulong_decimal((dword) print_ulong_decimal::w) +(label) print_ulong_decimal::@1 +(label) print_ulong_decimal::@2 +(label) print_ulong_decimal::@return +(dword) print_ulong_decimal::w +(dword) print_ulong_decimal::w#0 +(dword) print_ulong_decimal::w#1 +(void()) ultoa((dword) ultoa::value , (byte*) ultoa::buffer , (byte) ultoa::radix) +(bool~) ultoa::$0 +(bool~) ultoa::$1 +(dword~) ultoa::$10 +(byte~) ultoa::$11 +(bool~) ultoa::$2 +(bool~) ultoa::$3 +(byte~) ultoa::$4 +(number~) ultoa::$5 +(bool~) ultoa::$6 +(bool~) ultoa::$7 +(bool~) ultoa::$8 +(bool~) ultoa::$9 +(label) ultoa::@1 +(label) ultoa::@10 +(label) ultoa::@11 +(label) ultoa::@12 +(label) ultoa::@18 +(label) ultoa::@19 +(label) ultoa::@2 +(label) ultoa::@20 +(label) ultoa::@21 +(label) ultoa::@24 +(label) ultoa::@26 +(label) ultoa::@3 +(label) ultoa::@4 +(label) ultoa::@8 +(label) ultoa::@9 +(label) ultoa::@return +(byte*) ultoa::buffer +(byte*) ultoa::buffer#0 +(byte*) ultoa::buffer#1 +(byte*) ultoa::buffer#10 +(byte*) ultoa::buffer#11 +(byte*) ultoa::buffer#12 +(byte*) ultoa::buffer#13 +(byte*) ultoa::buffer#14 +(byte*) ultoa::buffer#15 +(byte*) ultoa::buffer#16 +(byte*) ultoa::buffer#17 +(byte*) ultoa::buffer#18 +(byte*) ultoa::buffer#19 +(byte*) ultoa::buffer#2 +(byte*) ultoa::buffer#20 +(byte*) ultoa::buffer#21 +(byte*) ultoa::buffer#3 +(byte*) ultoa::buffer#4 +(byte*) ultoa::buffer#5 +(byte*) ultoa::buffer#6 +(byte*) ultoa::buffer#7 +(byte*) ultoa::buffer#8 +(byte*) ultoa::buffer#9 +(byte) ultoa::digit +(byte) ultoa::digit#0 +(byte) ultoa::digit#1 +(byte) ultoa::digit#2 +(byte) ultoa::digit#3 +(byte) ultoa::digit#4 +(byte) ultoa::digit#5 +(byte) ultoa::digit#6 +(dword) ultoa::digit_value +(dword) ultoa::digit_value#0 +(dword) ultoa::digit_value#1 +(dword*) ultoa::digit_values +(dword*) ultoa::digit_values#0 +(dword*) ultoa::digit_values#1 +(dword*) ultoa::digit_values#10 +(dword*) ultoa::digit_values#2 +(dword*) ultoa::digit_values#3 +(dword*) ultoa::digit_values#4 +(dword*) ultoa::digit_values#5 +(dword*) ultoa::digit_values#6 +(dword*) ultoa::digit_values#7 +(dword*) ultoa::digit_values#8 +(dword*) ultoa::digit_values#9 +(byte) ultoa::max_digits +(byte) ultoa::max_digits#0 +(byte) ultoa::max_digits#1 +(byte) ultoa::max_digits#10 +(byte) ultoa::max_digits#2 +(byte) ultoa::max_digits#3 +(byte) ultoa::max_digits#4 +(byte) ultoa::max_digits#5 +(byte) ultoa::max_digits#6 +(byte) ultoa::max_digits#7 +(byte) ultoa::max_digits#8 +(byte) ultoa::max_digits#9 +(byte) ultoa::radix +(byte) ultoa::radix#0 +(byte) ultoa::radix#1 +(byte) ultoa::radix#2 +(byte) ultoa::radix#3 +(byte) ultoa::radix#4 +(byte) ultoa::started +(byte) ultoa::started#0 +(byte) ultoa::started#1 +(byte) ultoa::started#2 +(byte) ultoa::started#3 +(byte) ultoa::started#4 +(dword) ultoa::value +(dword) ultoa::value#0 +(dword) ultoa::value#1 +(dword) ultoa::value#10 +(dword) ultoa::value#11 +(dword) ultoa::value#12 +(dword) ultoa::value#13 +(dword) ultoa::value#14 +(dword) ultoa::value#15 +(dword) ultoa::value#2 +(dword) ultoa::value#3 +(dword) ultoa::value#4 +(dword) ultoa::value#5 +(dword) ultoa::value#6 +(dword) ultoa::value#7 +(dword) ultoa::value#8 +(dword) ultoa::value#9 +(dword()) ultoa_append((byte*) ultoa_append::buffer , (dword) ultoa_append::value , (dword) ultoa_append::sub) +(bool~) ultoa_append::$0 +(label) ultoa_append::@1 +(label) ultoa_append::@2 +(label) ultoa_append::@3 +(label) ultoa_append::@return +(byte*) ultoa_append::buffer +(byte*) ultoa_append::buffer#0 +(byte*) ultoa_append::buffer#1 +(byte*) ultoa_append::buffer#2 +(byte*) ultoa_append::buffer#3 +(byte*) ultoa_append::buffer#4 +(byte) ultoa_append::digit +(byte) ultoa_append::digit#0 +(byte) ultoa_append::digit#1 +(byte) ultoa_append::digit#2 +(byte) ultoa_append::digit#3 +(byte) ultoa_append::digit#4 +(dword) ultoa_append::return +(dword) ultoa_append::return#0 +(dword) ultoa_append::return#1 +(dword) ultoa_append::return#2 +(dword) ultoa_append::return#3 +(dword) ultoa_append::return#4 +(dword) ultoa_append::sub +(dword) ultoa_append::sub#0 +(dword) ultoa_append::sub#1 +(dword) ultoa_append::sub#2 +(dword) ultoa_append::sub#3 +(dword) ultoa_append::value +(dword) ultoa_append::value#0 +(dword) ultoa_append::value#1 +(dword) ultoa_append::value#2 +(dword) ultoa_append::value#3 +(dword) ultoa_append::value#4 +(dword) ultoa_append::value#5 + +Adding number conversion cast (unumber) 0 in (bool~) memset::$0 ← (word) memset::num#1 > (number) 0 +Adding number conversion cast (unumber) $a in (byte) ultoa::max_digits#1 ← (number) $a +Adding number conversion cast (unumber) 8 in (byte) ultoa::max_digits#2 ← (number) 8 +Adding number conversion cast (unumber) $b in (byte) ultoa::max_digits#3 ← (number) $b +Adding number conversion cast (unumber) $20 in (byte) ultoa::max_digits#4 ← (number) $20 +Adding number conversion cast (unumber) 0 in *((byte*) ultoa::buffer#2) ← (number) 0 +Adding number conversion cast (unumber) 1 in (number~) ultoa::$5 ← (byte) ultoa::max_digits#5 - (number) 1 +Adding number conversion cast (unumber) ultoa::$5 in (number~) ultoa::$5 ← (byte) ultoa::max_digits#5 - (unumber)(number) 1 +Adding number conversion cast (unumber) 0 in *((byte*) ultoa::buffer#3) ← (number) 0 +Adding number conversion cast (unumber) 1 in (byte) ultoa::started#1 ← (number) 1 +Adding number conversion cast (unumber) 0 in (bool~) print_str::$1 ← (number) 0 != *((byte*) print_str::str#2) +Adding number conversion cast (unumber) $28 in (byte*~) print_ln::$0 ← (byte*) print_line_cursor#9 + (number) $28 +Adding number conversion cast (unumber) $3e8 in (word) memset::num#0 ← (number) $3e8 +Adding number conversion cast (unumber) $d02 in (bool~) main::$1 ← (dword) main::i#2 < (number) $d02 +Adding number conversion cast (unumber) $22b in (number~) main::$2 ← (dword) main::i#3 * (number) $22b +Adding number conversion cast (unumber) main::$2 in (number~) main::$2 ← (dword) main::i#3 * (unumber)(number) $22b +Adding number conversion cast (unumber) $14d in (dword) main::i#1 ← (dword) main::i#4 + (number) $14d +Successful SSA optimization PassNAddNumberTypeConversions +Inlining cast (byte*~) memset::$2 ← (byte*)(void*) memset::str#2 +Inlining cast (byte*) memset::dst#0 ← (byte*)(void*) memset::str#2 +Inlining cast (byte) ultoa::max_digits#1 ← (unumber)(number) $a +Inlining cast (byte) ultoa::max_digits#2 ← (unumber)(number) 8 +Inlining cast (byte) ultoa::max_digits#3 ← (unumber)(number) $b +Inlining cast (byte) ultoa::max_digits#4 ← (unumber)(number) $20 +Inlining cast *((byte*) ultoa::buffer#2) ← (unumber)(number) 0 +Inlining cast (byte~) ultoa::$4 ← (byte)(dword) ultoa::value#3 +Inlining cast *((byte*) ultoa::buffer#3) ← (unumber)(number) 0 +Inlining cast (byte) ultoa::started#1 ← (unumber)(number) 1 +Inlining cast (word) memset::num#0 ← (unumber)(number) $3e8 +Successful SSA optimization Pass2InlineCast +Simplifying constant integer cast 0 +Simplifying constant integer cast $a +Simplifying constant integer cast 8 +Simplifying constant integer cast $b +Simplifying constant integer cast $20 +Simplifying constant integer cast 0 +Simplifying constant integer cast 1 +Simplifying constant integer cast 0 +Simplifying constant integer cast 1 +Simplifying constant pointer cast (byte*) 1024 +Simplifying constant integer cast 0 +Simplifying constant integer cast $28 +Simplifying constant integer cast $3e8 +Simplifying constant integer cast $d02 +Simplifying constant integer cast $22b +Simplifying constant integer cast $14d +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) $a +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) $b +Finalized unsigned number type (byte) $20 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) $28 +Finalized unsigned number type (word) $3e8 +Finalized unsigned number type (word) $d02 +Finalized unsigned number type (word) $22b +Finalized unsigned number type (word) $14d +Successful SSA optimization PassNFinalizeNumberTypeConversions +Inferred type updated to byte in (unumber~) ultoa::$5 ← (byte) ultoa::max_digits#5 - (byte) 1 +Inferred type updated to dword in (unumber~) main::$2 ← (dword) main::i#3 * (word) $22b +Inversing boolean not [2] (bool~) memset::$1 ← (word) memset::num#1 <= (byte) 0 from [1] (bool~) memset::$0 ← (word) memset::num#1 > (byte) 0 +Successful SSA optimization Pass2UnaryNotSimplification +Alias memset::return#0 = memset::str#1 memset::return#3 memset::return#1 +Alias memset::str#2 = memset::str#3 +Alias memset::num#1 = memset::num#2 +Alias memset::c#3 = memset::c#4 +Alias memset::end#0 = memset::$3 +Alias memset::c#1 = memset::c#2 +Alias memset::dst#2 = memset::dst#3 +Alias memset::end#1 = memset::end#2 +Alias memset::str#4 = memset::str#5 +Alias ultoa::value#10 = ultoa::value#8 ultoa::value#12 ultoa::value#13 ultoa::value#9 ultoa::value#14 ultoa::value#15 ultoa::value#11 +Alias ultoa::buffer#10 = ultoa::buffer#17 ultoa::buffer#21 ultoa::buffer#16 ultoa::buffer#18 ultoa::buffer#13 ultoa::buffer#19 ultoa::buffer#20 ultoa::buffer#6 +Alias ultoa::radix#1 = ultoa::radix#2 ultoa::radix#3 ultoa::radix#4 +Alias ultoa::digit#2 = ultoa::digit#3 ultoa::digit#6 ultoa::digit#5 +Alias ultoa::digit_values#10 = ultoa::digit_values#5 ultoa::digit_values#6 ultoa::digit_values#9 +Alias ultoa::value#2 = ultoa::value#5 ultoa::value#3 ultoa::value#4 +Alias ultoa::started#2 = ultoa::started#3 +Alias ultoa::buffer#11 = ultoa::buffer#12 ultoa::buffer#7 ultoa::buffer#8 ultoa::buffer#9 +Alias ultoa::max_digits#10 = ultoa::max_digits#8 ultoa::max_digits#5 ultoa::max_digits#9 +Alias ultoa::digit_value#0 = ultoa::digit_value#1 +Alias ultoa_append::return#0 = ultoa_append::return#3 +Alias ultoa::value#0 = ultoa::$10 +Alias ultoa_append::digit#2 = ultoa_append::digit#4 ultoa_append::digit#3 +Alias ultoa_append::value#2 = ultoa_append::value#3 ultoa_append::value#4 ultoa_append::return#1 ultoa_append::return#4 ultoa_append::return#2 +Alias ultoa_append::sub#1 = ultoa_append::sub#2 +Alias ultoa_append::buffer#1 = ultoa_append::buffer#4 ultoa_append::buffer#2 +Alias print_line_cursor#0 = print_screen#0 print_char_cursor#0 print_line_cursor#21 print_char_cursor#37 print_screen#4 +Alias print_str::str#2 = print_str::str#3 print_str::str#4 +Alias print_char_cursor#17 = print_char_cursor#30 print_char_cursor#31 print_char_cursor#2 +Alias print_char_cursor#1 = print_char_cursor#16 +Alias print_line_cursor#1 = print_ln::$0 print_line_cursor#10 print_char_cursor#3 print_line_cursor#11 print_char_cursor#19 print_line_cursor#2 print_char_cursor#4 +Alias print_char_cursor#33 = print_char_cursor#39 +Alias print_char_cursor#20 = print_char_cursor#5 print_char_cursor#21 print_char_cursor#6 +Alias print_char_cursor#23 = print_char_cursor#7 print_char_cursor#8 +Alias print_line_cursor#12 = print_screen#2 print_screen#1 print_line_cursor#3 print_char_cursor#9 print_char_cursor#24 print_line_cursor#4 print_char_cursor#10 +Alias print_line_cursor#13 = print_line_cursor#5 +Alias print_char_cursor#11 = print_char_cursor#25 +Alias main::i#2 = main::i#3 main::i#5 main::i#4 +Alias print_char_cursor#14 = print_char_cursor#35 print_char_cursor#36 print_char_cursor#28 +Alias print_line_cursor#15 = print_line_cursor#22 print_line_cursor#20 print_line_cursor#19 print_line_cursor#7 +Alias print_ulong_decimal::w#0 = main::$2 +Alias print_char_cursor#12 = print_char_cursor#26 +Alias print_line_cursor#14 = print_line_cursor#6 +Alias print_char_cursor#13 = print_char_cursor#27 +Alias print_line_cursor#16 = print_line_cursor#8 +Alias print_char_cursor#15 = print_char_cursor#29 +Successful SSA optimization Pass2AliasElimination +Alias ultoa::value#10 = ultoa::value#7 +Alias ultoa::buffer#10 = ultoa::buffer#15 +Alias ultoa::digit#2 = ultoa::digit#4 +Alias ultoa::max_digits#10 = ultoa::max_digits#6 +Alias ultoa::digit_values#10 = ultoa::digit_values#7 +Successful SSA optimization Pass2AliasElimination +Identical Phi Values (word) memset::num#1 (word) memset::num#0 +Identical Phi Values (void*) memset::str#2 (void*) memset::str#0 +Identical Phi Values (byte) memset::c#3 (byte) memset::c#0 +Identical Phi Values (byte*) memset::end#1 (byte*) memset::end#0 +Identical Phi Values (void*) memset::str#4 (void*) memset::str#2 +Identical Phi Values (byte) memset::c#1 (byte) memset::c#3 +Identical Phi Values (byte) ultoa::radix#1 (byte) ultoa::radix#0 +Identical Phi Values (dword) ultoa::value#10 (dword) ultoa::value#1 +Identical Phi Values (byte*) ultoa::buffer#10 (byte*) ultoa::buffer#5 +Identical Phi Values (byte) ultoa::max_digits#10 (byte) ultoa::max_digits#7 +Identical Phi Values (dword*) ultoa::digit_values#10 (dword*) ultoa::digit_values#8 +Identical Phi Values (dword) ultoa_append::value#5 (dword) ultoa_append::value#0 +Identical Phi Values (dword) ultoa_append::sub#3 (dword) ultoa_append::sub#0 +Identical Phi Values (byte*) ultoa_append::buffer#3 (byte*) ultoa_append::buffer#0 +Identical Phi Values (dword) ultoa_append::sub#1 (dword) ultoa_append::sub#3 +Identical Phi Values (byte*) ultoa_append::buffer#1 (byte*) ultoa_append::buffer#3 +Identical Phi Values (byte*) print_str::str#5 (byte*) print_str::str#1 +Identical Phi Values (byte*) print_char_cursor#38 (byte*) print_char_cursor#33 +Identical Phi Values (byte*) print_char_cursor#1 (byte*) print_char_cursor#23 +Identical Phi Values (byte*) print_line_cursor#17 (byte*) print_line_cursor#15 +Identical Phi Values (byte*) print_char_cursor#32 (byte*) print_char_cursor#12 +Identical Phi Values (byte*) print_char_cursor#18 (byte*) print_char_cursor#32 +Identical Phi Values (dword) print_ulong_decimal::w#1 (dword) print_ulong_decimal::w#0 +Identical Phi Values (byte*) print_char_cursor#33 (byte*) print_char_cursor#14 +Identical Phi Values (byte*) print_char_cursor#20 (byte*) print_char_cursor#17 +Identical Phi Values (byte) print_char::ch#1 (byte) print_char::ch#0 +Identical Phi Values (byte*) print_char_cursor#22 (byte*) print_char_cursor#17 +Identical Phi Values (byte*) print_line_cursor#12 (byte*) print_screen#3 +Identical Phi Values (byte*) print_screen#3 (byte*) print_line_cursor#0 +Identical Phi Values (byte*) print_line_cursor#18 (byte*) print_line_cursor#0 +Identical Phi Values (byte*) print_char_cursor#34 (byte*) print_line_cursor#0 +Identical Phi Values (byte*) print_line_cursor#13 (byte*) print_line_cursor#12 +Identical Phi Values (byte*) print_char_cursor#11 (byte*) print_line_cursor#12 +Identical Phi Values (byte*) print_char_cursor#12 (byte*) print_char_cursor#20 +Identical Phi Values (byte*) print_line_cursor#14 (byte*) print_line_cursor#1 +Identical Phi Values (byte*) print_char_cursor#13 (byte*) print_line_cursor#1 +Identical Phi Values (byte*) print_line_cursor#16 (byte*) print_line_cursor#15 +Identical Phi Values (byte*) print_char_cursor#15 (byte*) print_char_cursor#14 +Successful SSA optimization Pass2IdenticalPhiElimination +Identical Phi Values (void*) memset::return#0 (void*) memset::str#0 +Successful SSA optimization Pass2IdenticalPhiElimination +Simple Condition (bool~) memset::$1 [2] if((word) memset::num#0<=(byte) 0) goto memset::@1 +Simple Condition (bool~) memset::$4 [9] if((byte*) memset::dst#2!=(byte*) memset::end#0) goto memset::@5 +Simple Condition (bool~) ultoa::$0 [17] if((byte) ultoa::radix#0==(const byte) DECIMAL) goto ultoa::@1 +Simple Condition (bool~) ultoa::$1 [21] if((byte) ultoa::radix#0==(const byte) HEXADECIMAL) goto ultoa::@2 +Simple Condition (bool~) ultoa::$2 [25] if((byte) ultoa::radix#0==(const byte) OCTAL) goto ultoa::@3 +Simple Condition (bool~) ultoa::$3 [29] if((byte) ultoa::radix#0==(const byte) BINARY) goto ultoa::@4 +Simple Condition (bool~) ultoa::$6 [46] if((byte) ultoa::digit#2<(byte~) ultoa::$5) goto ultoa::@19 +Simple Condition (bool~) ultoa_append::$0 [71] if((dword) ultoa_append::value#2>=(dword) ultoa_append::sub#0) goto ultoa_append::@2 +Simple Condition (bool~) print_str::$1 [80] if((byte) 0!=*((byte*) print_str::str#2)) goto print_str::@2 +Simple Condition (bool~) print_ln::$1 [90] if((byte*) print_line_cursor#1<(byte*) print_char_cursor#17) goto print_ln::@1 +Simple Condition (bool~) main::$1 [118] if((dword) main::i#2<(word) $d02) goto main::@2 +Successful SSA optimization Pass2ConditionalJumpSimplification +Rewriting ! if()-condition to reversed if() [51] (bool~) ultoa::$9 ← ! (bool~) ultoa::$8 +Rewriting || if()-condition to two if()s [50] (bool~) ultoa::$8 ← (byte) ultoa::started#2 || (bool~) ultoa::$7 +Successful SSA optimization Pass2ConditionalAndOrRewriting +Warning! Adding boolean cast to non-boolean condition (byte) ultoa::started#2 +Constant (const byte) ultoa::max_digits#0 = 0 +Constant (const dword*) ultoa::digit_values#0 = (dword*) 0 +Constant (const byte) ultoa::max_digits#1 = $a +Constant (const dword*) ultoa::digit_values#1 = RADIX_DECIMAL_VALUES_LONG +Constant (const byte) ultoa::max_digits#2 = 8 +Constant (const dword*) ultoa::digit_values#2 = RADIX_HEXADECIMAL_VALUES_LONG +Constant (const byte) ultoa::max_digits#3 = $b +Constant (const dword*) ultoa::digit_values#3 = RADIX_OCTAL_VALUES_LONG +Constant (const byte) ultoa::max_digits#4 = $20 +Constant (const dword*) ultoa::digit_values#4 = RADIX_BINARY_VALUES_LONG +Constant (const byte) ultoa::started#0 = 0 +Constant (const byte) ultoa::digit#0 = 0 +Constant (const byte) ultoa::started#1 = 1 +Constant (const byte) ultoa_append::digit#0 = 0 +Constant (const byte*) print_line_cursor#0 = (byte*) 1024 +Constant (const byte*) ultoa::buffer#5 = decimal_digits_long +Constant (const byte) ultoa::radix#0 = DECIMAL +Constant (const byte*) print_str::str#1 = decimal_digits_long +Constant (const byte) memset::c#0 = ' ' +Constant (const word) memset::num#0 = $3e8 +Constant (const dword) main::i#0 = 0 +Successful SSA optimization Pass2ConstantIdentification +Constant (const void*) memset::str#0 = (void*)print_line_cursor#0 +Successful SSA optimization Pass2ConstantIdentification +Constant (const byte*) memset::$2 = (byte*)memset::str#0 +Constant (const byte*) memset::dst#0 = (byte*)memset::str#0 +Constant (const void*) memset::return#2 = memset::str#0 +Successful SSA optimization Pass2ConstantIdentification +if() condition always false - eliminating [2] if((const word) memset::num#0<=(byte) 0) goto memset::@1 +if() condition always true - replacing block destination [17] if((const byte) ultoa::radix#0==(const byte) DECIMAL) goto ultoa::@1 +if() condition always false - eliminating [21] if((const byte) ultoa::radix#0==(const byte) HEXADECIMAL) goto ultoa::@2 +if() condition always false - eliminating [25] if((const byte) ultoa::radix#0==(const byte) OCTAL) goto ultoa::@3 +if() condition always false - eliminating [29] if((const byte) ultoa::radix#0==(const byte) BINARY) goto ultoa::@4 +Successful SSA optimization Pass2ConstantIfs +Eliminating unused constant (const void*) memset::return#2 +Eliminating unused constant (const byte) BINARY +Eliminating unused constant (const byte) OCTAL +Eliminating unused constant (const byte) HEXADECIMAL +Eliminating unused constant (const byte) ultoa::max_digits#0 +Eliminating unused constant (const dword*) ultoa::digit_values#0 +Eliminating unused constant (const byte) ultoa::radix#0 +Successful SSA optimization PassNEliminateUnusedVars +Eliminating unused constant (const byte) DECIMAL +Successful SSA optimization PassNEliminateUnusedVars +Eliminating variable (byte*) ultoa::buffer#0 from unused block ultoa::@12 +Eliminating variable (byte*) ultoa::buffer#1 from unused block ultoa::@12 +Eliminating variable (byte*) ultoa::buffer#2 from unused block ultoa::@12 +Removing unused block ultoa::@9 +Removing PHI-reference to removed block (ultoa::@2) in block ultoa::@8 +Removing PHI-reference to removed block (ultoa::@2) in block ultoa::@8 +Removing unused block ultoa::@2 +Removing unused block ultoa::@10 +Removing PHI-reference to removed block (ultoa::@3) in block ultoa::@8 +Removing PHI-reference to removed block (ultoa::@3) in block ultoa::@8 +Removing unused block ultoa::@3 +Removing unused block ultoa::@11 +Removing PHI-reference to removed block (ultoa::@4) in block ultoa::@8 +Removing PHI-reference to removed block (ultoa::@4) in block ultoa::@8 +Removing unused block ultoa::@4 +Removing unused block ultoa::@12 +Successful SSA optimization Pass2EliminateUnusedBlocks +Adding number conversion cast (unumber) 0 in (bool~) ultoa::$12 ← (number) 0 != (byte) ultoa::started#2 +Successful SSA optimization PassNAddNumberTypeConversions +Simplifying constant integer cast 0 +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type (byte) 0 +Successful SSA optimization PassNFinalizeNumberTypeConversions +Identical Phi Values (byte) ultoa::max_digits#7 (const byte) ultoa::max_digits#1 +Identical Phi Values (dword*) ultoa::digit_values#8 (const dword*) ultoa::digit_values#1 +Successful SSA optimization Pass2IdenticalPhiElimination +Simple Condition (bool~) ultoa::$12 [15] if((byte) 0!=(byte) ultoa::started#2) goto ultoa::@24 +Simple Condition (bool~) ultoa::$7 [63] if((dword) ultoa::value#2>=(dword) ultoa::digit_value#0) goto ultoa::@24 +Successful SSA optimization Pass2ConditionalJumpSimplification +Constant right-side identified [0] (byte*) memset::end#0 ← (const byte*) memset::$2 + (const word) memset::num#0 +Constant right-side identified [9] (byte~) ultoa::$5 ← (const byte) ultoa::max_digits#1 - (byte) 1 +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant (const byte*) memset::end#0 = memset::$2+memset::num#0 +Constant (const byte) ultoa::$5 = ultoa::max_digits#1-1 +Successful SSA optimization Pass2ConstantIdentification +Eliminating unused constant (const byte) ultoa::max_digits#2 +Eliminating unused constant (const dword*) ultoa::digit_values#2 +Eliminating unused constant (const byte) ultoa::max_digits#3 +Eliminating unused constant (const dword*) ultoa::digit_values#3 +Eliminating unused constant (const byte) ultoa::max_digits#4 +Eliminating unused constant (const dword*) ultoa::digit_values#4 +Successful SSA optimization PassNEliminateUnusedVars +Eliminating unused constant (const dword*) RADIX_BINARY_VALUES_LONG +Eliminating unused constant (const dword*) RADIX_OCTAL_VALUES_LONG +Eliminating unused constant (const dword*) RADIX_HEXADECIMAL_VALUES_LONG +Successful SSA optimization PassNEliminateUnusedVars +Rewriting multiplication to use shift [8] (byte~) ultoa::$11 ← (byte) ultoa::digit#2 * (const byte) SIZEOF_DWORD +Rewriting multiplication to use shift and addition[52] (dword) print_ulong_decimal::w#0 ← (dword) main::i#2 * (word) $22b +Successful SSA optimization Pass2MultiplyToShiftRewriting +Inlining constant with var siblings (const byte*) memset::dst#0 +Inlining constant with var siblings (const byte) ultoa::started#0 +Inlining constant with var siblings (const byte) ultoa::digit#0 +Inlining constant with var siblings (const byte) ultoa::started#1 +Inlining constant with var siblings (const byte*) ultoa::buffer#5 +Inlining constant with var siblings (const byte) ultoa_append::digit#0 +Inlining constant with var siblings (const byte*) print_str::str#1 +Inlining constant with var siblings (const dword) main::i#0 +Inlining constant with var siblings (const byte*) print_line_cursor#0 +Constant inlined memset::$2 = (byte*)(const void*) memset::str#0 +Constant inlined ultoa::buffer#5 = (const byte*) decimal_digits_long +Constant inlined ultoa::$5 = (const byte) ultoa::max_digits#1-(byte) 1 +Constant inlined ultoa::started#0 = (byte) 0 +Constant inlined ultoa::digit#0 = (byte) 0 +Constant inlined print_line_cursor#0 = (byte*) 1024 +Constant inlined main::i#0 = (dword) 0 +Constant inlined memset::dst#0 = (byte*)(const void*) memset::str#0 +Constant inlined ultoa_append::digit#0 = (byte) 0 +Constant inlined ultoa::digit_values#1 = (const dword*) RADIX_DECIMAL_VALUES_LONG +Constant inlined print_str::str#1 = (const byte*) decimal_digits_long +Constant inlined ultoa::started#1 = (byte) 1 +Successful SSA optimization Pass2ConstantInlining +Alias print_ulong_decimal::w#0 = main::$12 +Successful SSA optimization Pass2AliasElimination +Eliminating unused constant (const byte) SIZEOF_DWORD +Successful SSA optimization PassNEliminateUnusedVars +Added new block during phi lifting ultoa::@28(between ultoa::@27 and ultoa::@21) +Added new block during phi lifting print_ln::@3(between print_ln::@1 and print_ln::@1) +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @15 +Adding NOP phi() at start of @41 +Adding NOP phi() at start of @42 +Adding NOP phi() at start of @end +Adding NOP phi() at start of main +Adding NOP phi() at start of main::@7 +Adding NOP phi() at start of main::@8 +Adding NOP phi() at start of print_ln::@2 +Adding NOP phi() at start of print_ulong_decimal::@1 +Adding NOP phi() at start of print_ulong_decimal::@2 +Adding NOP phi() at start of ultoa +Adding NOP phi() at start of ultoa::@1 +Adding NOP phi() at start of print_cls +Adding NOP phi() at start of print_cls::@1 +Adding NOP phi() at start of memset +Adding NOP phi() at start of memset::@2 +Adding NOP phi() at start of memset::@1 +CALL GRAPH +Calls in [] to main:3 +Calls in [main] to print_cls:7 print_ulong_decimal:20 print_ln:22 +Calls in [print_ulong_decimal] to ultoa:35 print_str:37 +Calls in [print_str] to print_char:45 +Calls in [ultoa] to ultoa_append:78 +Calls in [print_cls] to memset:94 + +Created 16 initial phi equivalence classes +Coalesced [24] main::i#6 ← main::i#1 +Not coalescing [25] print_line_cursor#25 ← print_line_cursor#1 +Coalesced [26] print_char_cursor#42 ← print_line_cursor#1 +Coalesced [27] print_line_cursor#23 ← print_line_cursor#15 +Not coalescing [33] print_line_cursor#24 ← print_line_cursor#1 +Not coalescing [40] print_char_cursor#40 ← print_char_cursor#14 +Coalesced [47] print_str::str#6 ← print_str::str#0 +Coalesced [48] print_char_cursor#41 ← print_char_cursor#23 +Coalesced [54] ultoa::value#17 ← ultoa::value#1 +Coalesced [66] ultoa::value#18 ← ultoa::value#2 +Coalesced [67] ultoa::started#6 ← ultoa::started#2 +Coalesced [68] ultoa::buffer#23 ← ultoa::buffer#11 +Coalesced [71] ultoa::digit#7 ← ultoa::digit#1 +Coalesced (already) [72] ultoa::value#16 ← ultoa::value#6 +Coalesced (already) [73] ultoa::started#5 ← ultoa::started#4 +Coalesced (already) [74] ultoa::buffer#22 ← ultoa::buffer#14 +Coalesced [82] ultoa::value#19 ← ultoa::value#0 +Coalesced [83] ultoa::buffer#24 ← ultoa::buffer#4 +Coalesced [84] ultoa_append::value#6 ← ultoa_append::value#0 +Coalesced [91] ultoa_append::value#7 ← ultoa_append::value#1 +Coalesced [92] ultoa_append::digit#5 ← ultoa_append::digit#1 +Coalesced [105] memset::dst#4 ← memset::dst#1 +Coalesced down to 12 phi equivalence classes +Culled Empty Block (label) @15 +Culled Empty Block (label) @42 +Culled Empty Block (label) main::@7 +Culled Empty Block (label) print_ln::@2 +Culled Empty Block (label) print_ulong_decimal::@2 +Culled Empty Block (label) ultoa::@1 +Culled Empty Block (label) ultoa::@8 +Culled Empty Block (label) ultoa::@28 +Culled Empty Block (label) print_cls::@1 +Culled Empty Block (label) memset::@2 +Culled Empty Block (label) memset::@1 +Renumbering block @41 to @1 +Renumbering block memset::@4 to memset::@1 +Renumbering block memset::@5 to memset::@2 +Renumbering block ultoa::@18 to ultoa::@1 +Renumbering block ultoa::@19 to ultoa::@2 +Renumbering block ultoa::@20 to ultoa::@3 +Renumbering block ultoa::@21 to ultoa::@4 +Renumbering block ultoa::@24 to ultoa::@5 +Renumbering block ultoa::@26 to ultoa::@6 +Renumbering block ultoa::@27 to ultoa::@7 +Renumbering block print_str::@7 to print_str::@3 +Renumbering block print_ln::@3 to print_ln::@2 +Renumbering block main::@8 to main::@3 +Renumbering block main::@9 to main::@4 +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @1 +Adding NOP phi() at start of @end +Adding NOP phi() at start of main +Adding NOP phi() at start of main::@3 +Adding NOP phi() at start of print_ln +Adding NOP phi() at start of print_ulong_decimal::@1 +Adding NOP phi() at start of ultoa +Adding NOP phi() at start of ultoa_append +Adding NOP phi() at start of print_cls +Adding NOP phi() at start of memset + +FINAL CONTROL FLOW GRAPH +@begin: scope:[] from + [0] phi() + to:@1 +@1: scope:[] from @begin + [1] phi() + [2] call main + to:@end +@end: scope:[] from @1 + [3] phi() + +(void()) main() +main: scope:[main] from @1 + [4] phi() + [5] call print_cls + to:main::@1 +main::@1: scope:[main] from main main::@4 + [6] (byte*) print_char_cursor#14 ← phi( main/(byte*) 1024 main::@4/(byte*) print_line_cursor#1 ) + [6] (byte*) print_line_cursor#15 ← phi( main/(byte*) 1024 main::@4/(byte*) print_line_cursor#25 ) + [6] (dword) main::i#2 ← phi( main/(dword) 0 main::@4/(dword) main::i#1 ) + [7] if((dword) main::i#2<(word) $d02) goto main::@2 + to:main::@return +main::@return: scope:[main] from main::@1 + [8] return + to:@return +main::@2: scope:[main] from main::@1 + [9] (dword~) main::$5 ← (dword) main::i#2 << (byte) 4 + [10] (dword~) main::$6 ← (dword~) main::$5 + (dword) main::i#2 + [11] (dword~) main::$7 ← (dword~) main::$6 << (byte) 2 + [12] (dword~) main::$8 ← (dword~) main::$7 + (dword) main::i#2 + [13] (dword~) main::$9 ← (dword~) main::$8 << (byte) 2 + [14] (dword~) main::$10 ← (dword~) main::$9 + (dword) main::i#2 + [15] (dword~) main::$11 ← (dword~) main::$10 << (byte) 1 + [16] (dword) print_ulong_decimal::w#0 ← (dword~) main::$11 + (dword) main::i#2 + [17] call print_ulong_decimal + to:main::@3 +main::@3: scope:[main] from main::@2 + [18] phi() + [19] call print_ln + to:main::@4 +main::@4: scope:[main] from main::@3 + [20] (dword) main::i#1 ← (dword) main::i#2 + (word) $14d + [21] (byte*) print_line_cursor#25 ← (byte*) print_line_cursor#1 + to:main::@1 + +(void()) print_ln() +print_ln: scope:[print_ln] from main::@3 + [22] phi() + to:print_ln::@1 +print_ln::@1: scope:[print_ln] from print_ln print_ln::@2 + [23] (byte*) print_line_cursor#9 ← phi( print_ln/(byte*) print_line_cursor#15 print_ln::@2/(byte*) print_line_cursor#24 ) + [24] (byte*) print_line_cursor#1 ← (byte*) print_line_cursor#9 + (byte) $28 + [25] if((byte*) print_line_cursor#1<(byte*) print_char_cursor#17) goto print_ln::@2 + to:print_ln::@return +print_ln::@return: scope:[print_ln] from print_ln::@1 + [26] return + to:@return +print_ln::@2: scope:[print_ln] from print_ln::@1 + [27] (byte*) print_line_cursor#24 ← (byte*) print_line_cursor#1 + to:print_ln::@1 + +(void()) print_ulong_decimal((dword) print_ulong_decimal::w) +print_ulong_decimal: scope:[print_ulong_decimal] from main::@2 + [28] (dword) ultoa::value#1 ← (dword) print_ulong_decimal::w#0 + [29] call ultoa + to:print_ulong_decimal::@1 +print_ulong_decimal::@1: scope:[print_ulong_decimal] from print_ulong_decimal + [30] phi() + [31] call print_str + to:print_ulong_decimal::@return +print_ulong_decimal::@return: scope:[print_ulong_decimal] from print_ulong_decimal::@1 + [32] return + to:@return + +(void()) print_str((byte*) print_str::str) +print_str: scope:[print_str] from print_ulong_decimal::@1 + [33] (byte*) print_char_cursor#40 ← (byte*) print_char_cursor#14 + to:print_str::@1 +print_str::@1: scope:[print_str] from print_str print_str::@3 + [34] (byte*) print_char_cursor#17 ← phi( print_str/(byte*) print_char_cursor#40 print_str::@3/(byte*) print_char_cursor#23 ) + [34] (byte*) print_str::str#2 ← phi( print_str/(const byte*) decimal_digits_long print_str::@3/(byte*) print_str::str#0 ) + [35] if((byte) 0!=*((byte*) print_str::str#2)) goto print_str::@2 + to:print_str::@return +print_str::@return: scope:[print_str] from print_str::@1 + [36] return + to:@return +print_str::@2: scope:[print_str] from print_str::@1 + [37] (byte) print_char::ch#0 ← *((byte*) print_str::str#2) + [38] call print_char + to:print_str::@3 +print_str::@3: scope:[print_str] from print_str::@2 + [39] (byte*) print_str::str#0 ← ++ (byte*) print_str::str#2 + to:print_str::@1 + +(void()) print_char((byte) print_char::ch) +print_char: scope:[print_char] from print_str::@2 + [40] *((byte*) print_char_cursor#17) ← (byte) print_char::ch#0 + [41] (byte*) print_char_cursor#23 ← ++ (byte*) print_char_cursor#17 + to:print_char::@return +print_char::@return: scope:[print_char] from print_char + [42] return + to:@return + +(void()) ultoa((dword) ultoa::value , (byte*) ultoa::buffer , (byte) ultoa::radix) +ultoa: scope:[ultoa] from print_ulong_decimal + [43] phi() + to:ultoa::@1 +ultoa::@1: scope:[ultoa] from ultoa ultoa::@4 + [44] (byte*) ultoa::buffer#11 ← phi( ultoa::@4/(byte*) ultoa::buffer#14 ultoa/(const byte*) decimal_digits_long ) + [44] (byte) ultoa::started#2 ← phi( ultoa::@4/(byte) ultoa::started#4 ultoa/(byte) 0 ) + [44] (dword) ultoa::value#2 ← phi( ultoa::@4/(dword) ultoa::value#6 ultoa/(dword) ultoa::value#1 ) + [44] (byte) ultoa::digit#2 ← phi( ultoa::@4/(byte) ultoa::digit#1 ultoa/(byte) 0 ) + [45] if((byte) ultoa::digit#2<(const byte) ultoa::max_digits#1-(byte) 1) goto ultoa::@2 + to:ultoa::@3 +ultoa::@3: scope:[ultoa] from ultoa::@1 + [46] (byte~) ultoa::$4 ← (byte)(dword) ultoa::value#2 + [47] *((byte*) ultoa::buffer#11) ← *((const byte*) DIGITS + (byte~) ultoa::$4) + [48] (byte*) ultoa::buffer#3 ← ++ (byte*) ultoa::buffer#11 + [49] *((byte*) ultoa::buffer#3) ← (byte) 0 + to:ultoa::@return +ultoa::@return: scope:[ultoa] from ultoa::@3 + [50] return + to:@return +ultoa::@2: scope:[ultoa] from ultoa::@1 + [51] (byte~) ultoa::$11 ← (byte) ultoa::digit#2 << (byte) 2 + [52] (dword) ultoa::digit_value#0 ← *((const dword*) RADIX_DECIMAL_VALUES_LONG + (byte~) ultoa::$11) + [53] if((byte) 0!=(byte) ultoa::started#2) goto ultoa::@5 + to:ultoa::@7 +ultoa::@7: scope:[ultoa] from ultoa::@2 + [54] if((dword) ultoa::value#2>=(dword) ultoa::digit_value#0) goto ultoa::@5 + to:ultoa::@4 +ultoa::@4: scope:[ultoa] from ultoa::@6 ultoa::@7 + [55] (byte*) ultoa::buffer#14 ← phi( ultoa::@7/(byte*) ultoa::buffer#11 ultoa::@6/(byte*) ultoa::buffer#4 ) + [55] (byte) ultoa::started#4 ← phi( ultoa::@7/(byte) ultoa::started#2 ultoa::@6/(byte) 1 ) + [55] (dword) ultoa::value#6 ← phi( ultoa::@7/(dword) ultoa::value#2 ultoa::@6/(dword) ultoa::value#0 ) + [56] (byte) ultoa::digit#1 ← ++ (byte) ultoa::digit#2 + to:ultoa::@1 +ultoa::@5: scope:[ultoa] from ultoa::@2 ultoa::@7 + [57] (byte*) ultoa_append::buffer#0 ← (byte*) ultoa::buffer#11 + [58] (dword) ultoa_append::value#0 ← (dword) ultoa::value#2 + [59] (dword) ultoa_append::sub#0 ← (dword) ultoa::digit_value#0 + [60] call ultoa_append + [61] (dword) ultoa_append::return#0 ← (dword) ultoa_append::value#2 + to:ultoa::@6 +ultoa::@6: scope:[ultoa] from ultoa::@5 + [62] (dword) ultoa::value#0 ← (dword) ultoa_append::return#0 + [63] (byte*) ultoa::buffer#4 ← ++ (byte*) ultoa::buffer#11 + to:ultoa::@4 + +(dword()) ultoa_append((byte*) ultoa_append::buffer , (dword) ultoa_append::value , (dword) ultoa_append::sub) +ultoa_append: scope:[ultoa_append] from ultoa::@5 + [64] phi() + to:ultoa_append::@1 +ultoa_append::@1: scope:[ultoa_append] from ultoa_append ultoa_append::@2 + [65] (byte) ultoa_append::digit#2 ← phi( ultoa_append/(byte) 0 ultoa_append::@2/(byte) ultoa_append::digit#1 ) + [65] (dword) ultoa_append::value#2 ← phi( ultoa_append/(dword) ultoa_append::value#0 ultoa_append::@2/(dword) ultoa_append::value#1 ) + [66] if((dword) ultoa_append::value#2>=(dword) ultoa_append::sub#0) goto ultoa_append::@2 + to:ultoa_append::@3 +ultoa_append::@3: scope:[ultoa_append] from ultoa_append::@1 + [67] *((byte*) ultoa_append::buffer#0) ← *((const byte*) DIGITS + (byte) ultoa_append::digit#2) + to:ultoa_append::@return +ultoa_append::@return: scope:[ultoa_append] from ultoa_append::@3 + [68] return + to:@return +ultoa_append::@2: scope:[ultoa_append] from ultoa_append::@1 + [69] (byte) ultoa_append::digit#1 ← ++ (byte) ultoa_append::digit#2 + [70] (dword) ultoa_append::value#1 ← (dword) ultoa_append::value#2 - (dword) ultoa_append::sub#0 + to:ultoa_append::@1 + +(void()) print_cls() +print_cls: scope:[print_cls] from main + [71] phi() + [72] call memset + to:print_cls::@return +print_cls::@return: scope:[print_cls] from print_cls + [73] return + to:@return + +(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) +memset: scope:[memset] from print_cls + [74] phi() + to:memset::@1 +memset::@1: scope:[memset] from memset memset::@2 + [75] (byte*) memset::dst#2 ← phi( memset/(byte*)(const void*) memset::str#0 memset::@2/(byte*) memset::dst#1 ) + [76] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2 + to:memset::@return +memset::@return: scope:[memset] from memset::@1 + [77] return + to:@return +memset::@2: scope:[memset] from memset::@1 + [78] *((byte*) memset::dst#2) ← (const byte) memset::c#0 + [79] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2 + to:memset::@1 + + +VARIABLE REGISTER WEIGHTS +(void()) main() +(dword~) main::$10 202.0 +(dword~) main::$11 202.0 +(dword~) main::$5 202.0 +(dword~) main::$6 202.0 +(dword~) main::$7 202.0 +(dword~) main::$8 202.0 +(dword~) main::$9 202.0 +(dword) main::i +(dword) main::i#1 101.0 +(dword) main::i#2 62.153846153846146 +(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) +(byte) memset::c +(byte*) memset::dst +(byte*) memset::dst#1 20002.0 +(byte*) memset::dst#2 13334.666666666666 +(byte*) memset::end +(word) memset::num +(void*) memset::return +(void*) memset::str +(void()) print_char((byte) print_char::ch) +(byte) print_char::ch +(byte) print_char::ch#0 1.1000002E7 +(byte*) print_char_cursor +(byte*) print_char_cursor#14 777.076923076923 +(byte*) print_char_cursor#17 1507857.5 +(byte*) print_char_cursor#23 2750000.5 +(byte*) print_char_cursor#40 20002.0 +(void()) print_cls() +(byte*) print_line_cursor +(byte*) print_line_cursor#1 50034.16666666666 +(byte*) print_line_cursor#15 84.76923076923077 +(byte*) print_line_cursor#24 200002.0 +(byte*) print_line_cursor#25 202.0 +(byte*) print_line_cursor#9 201003.0 +(void()) print_ln() +(byte*) print_screen +(void()) print_str((byte*) print_str::str) +(byte*) print_str::str +(byte*) print_str::str#0 2000002.0 +(byte*) print_str::str#2 1000001.0 +(void()) print_ulong_decimal((dword) print_ulong_decimal::w) +(dword) print_ulong_decimal::w +(dword) print_ulong_decimal::w#0 1102.0 +(void()) ultoa((dword) ultoa::value , (byte*) ultoa::buffer , (byte) ultoa::radix) +(byte~) ultoa::$11 2000002.0 +(byte~) ultoa::$4 20002.0 +(byte*) ultoa::buffer +(byte*) ultoa::buffer#11 287143.2857142857 +(byte*) ultoa::buffer#14 1500001.5 +(byte*) ultoa::buffer#3 20002.0 +(byte*) ultoa::buffer#4 2000002.0 +(byte) ultoa::digit +(byte) ultoa::digit#1 2000002.0 +(byte) ultoa::digit#2 285714.5714285714 +(dword) ultoa::digit_value +(dword) ultoa::digit_value#0 600000.6000000001 +(dword*) ultoa::digit_values +(byte) ultoa::max_digits +(byte) ultoa::radix +(byte) ultoa::started +(byte) ultoa::started#2 500000.5 +(byte) ultoa::started#4 1000001.0 +(dword) ultoa::value +(dword) ultoa::value#0 1000001.0 +(dword) ultoa::value#1 5501.0 +(dword) ultoa::value#2 572857.857142857 +(dword) ultoa::value#6 1500001.5 +(dword()) ultoa_append((byte*) ultoa_append::buffer , (dword) ultoa_append::value , (dword) ultoa_append::sub) +(byte*) ultoa_append::buffer +(byte*) ultoa_append::buffer#0 1375000.25 +(byte) ultoa_append::digit +(byte) ultoa_append::digit#1 1.0000000001E10 +(byte) ultoa_append::digit#2 1.00050000015E10 +(dword) ultoa_append::return +(dword) ultoa_append::return#0 2000002.0 +(dword) ultoa_append::sub +(dword) ultoa_append::sub#0 3.3335000005E9 +(dword) ultoa_append::value +(dword) ultoa_append::value#0 3666667.333333333 +(dword) ultoa_append::value#1 2.0000000002E10 +(dword) ultoa_append::value#2 5.001833334166666E9 + +Initial phi equivalence classes +[ main::i#2 main::i#1 ] +[ print_char_cursor#14 print_line_cursor#1 ] +[ print_line_cursor#9 print_line_cursor#15 print_line_cursor#25 print_line_cursor#24 ] +[ print_str::str#2 print_str::str#0 ] +[ print_char_cursor#17 print_char_cursor#40 print_char_cursor#23 ] +[ ultoa::digit#2 ultoa::digit#1 ] +[ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ] +[ ultoa::started#2 ultoa::started#4 ] +[ ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ] +[ ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 ] +[ ultoa_append::digit#2 ultoa_append::digit#1 ] +[ memset::dst#2 memset::dst#1 ] +Added variable main::$5 to live range equivalence class [ main::$5 ] +Added variable main::$6 to live range equivalence class [ main::$6 ] +Added variable main::$7 to live range equivalence class [ main::$7 ] +Added variable main::$8 to live range equivalence class [ main::$8 ] +Added variable main::$9 to live range equivalence class [ main::$9 ] +Added variable main::$10 to live range equivalence class [ main::$10 ] +Added variable main::$11 to live range equivalence class [ main::$11 ] +Added variable print_ulong_decimal::w#0 to live range equivalence class [ print_ulong_decimal::w#0 ] +Added variable print_char::ch#0 to live range equivalence class [ print_char::ch#0 ] +Added variable ultoa::$4 to live range equivalence class [ ultoa::$4 ] +Added variable ultoa::buffer#3 to live range equivalence class [ ultoa::buffer#3 ] +Added variable ultoa::$11 to live range equivalence class [ ultoa::$11 ] +Added variable ultoa::digit_value#0 to live range equivalence class [ ultoa::digit_value#0 ] +Added variable ultoa_append::buffer#0 to live range equivalence class [ ultoa_append::buffer#0 ] +Added variable ultoa_append::sub#0 to live range equivalence class [ ultoa_append::sub#0 ] +Added variable ultoa_append::return#0 to live range equivalence class [ ultoa_append::return#0 ] +Complete equivalence classes +[ main::i#2 main::i#1 ] +[ print_char_cursor#14 print_line_cursor#1 ] +[ print_line_cursor#9 print_line_cursor#15 print_line_cursor#25 print_line_cursor#24 ] +[ print_str::str#2 print_str::str#0 ] +[ print_char_cursor#17 print_char_cursor#40 print_char_cursor#23 ] +[ ultoa::digit#2 ultoa::digit#1 ] +[ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ] +[ ultoa::started#2 ultoa::started#4 ] +[ ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ] +[ ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 ] +[ ultoa_append::digit#2 ultoa_append::digit#1 ] +[ memset::dst#2 memset::dst#1 ] +[ main::$5 ] +[ main::$6 ] +[ main::$7 ] +[ main::$8 ] +[ main::$9 ] +[ main::$10 ] +[ main::$11 ] +[ print_ulong_decimal::w#0 ] +[ print_char::ch#0 ] +[ ultoa::$4 ] +[ ultoa::buffer#3 ] +[ ultoa::$11 ] +[ ultoa::digit_value#0 ] +[ ultoa_append::buffer#0 ] +[ ultoa_append::sub#0 ] +[ ultoa_append::return#0 ] +Allocated zp[4]:2 [ main::i#2 main::i#1 ] +Allocated zp[2]:6 [ print_char_cursor#14 print_line_cursor#1 ] +Allocated zp[2]:8 [ print_line_cursor#9 print_line_cursor#15 print_line_cursor#25 print_line_cursor#24 ] +Allocated zp[2]:10 [ print_str::str#2 print_str::str#0 ] +Allocated zp[2]:12 [ print_char_cursor#17 print_char_cursor#40 print_char_cursor#23 ] +Allocated zp[1]:14 [ ultoa::digit#2 ultoa::digit#1 ] +Allocated zp[4]:15 [ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ] +Allocated zp[1]:19 [ ultoa::started#2 ultoa::started#4 ] +Allocated zp[2]:20 [ ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ] +Allocated zp[4]:22 [ ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 ] +Allocated zp[1]:26 [ ultoa_append::digit#2 ultoa_append::digit#1 ] +Allocated zp[2]:27 [ memset::dst#2 memset::dst#1 ] +Allocated zp[4]:29 [ main::$5 ] +Allocated zp[4]:33 [ main::$6 ] +Allocated zp[4]:37 [ main::$7 ] +Allocated zp[4]:41 [ main::$8 ] +Allocated zp[4]:45 [ main::$9 ] +Allocated zp[4]:49 [ main::$10 ] +Allocated zp[4]:53 [ main::$11 ] +Allocated zp[4]:57 [ print_ulong_decimal::w#0 ] +Allocated zp[1]:61 [ print_char::ch#0 ] +Allocated zp[1]:62 [ ultoa::$4 ] +Allocated zp[2]:63 [ ultoa::buffer#3 ] +Allocated zp[1]:65 [ ultoa::$11 ] +Allocated zp[4]:66 [ ultoa::digit_value#0 ] +Allocated zp[2]:70 [ ultoa_append::buffer#0 ] +Allocated zp[4]:72 [ ultoa_append::sub#0 ] +Allocated zp[4]:76 [ ultoa_append::return#0 ] + +INITIAL ASM +Target platform is c64basic / MOS6502X + // File Comments + // Upstart +.pc = $801 "Basic" +:BasicUpstart(__bbegin) +.pc = $80d "Program" + // Global Constants & labels + .label print_line_cursor = 6 + .label print_char_cursor = 6 + .label print_char_cursor_1 = $c + .label print_line_cursor_1 = 8 + // @begin +__bbegin: + // [1] phi from @begin to @1 [phi:@begin->@1] +__b1_from___bbegin: + jmp __b1 + // @1 +__b1: + // [2] call main + // [4] phi from @1 to main [phi:@1->main] +main_from___b1: + jsr main + // [3] phi from @1 to @end [phi:@1->@end] +__bend_from___b1: + jmp __bend + // @end +__bend: + // main +main: { + .label i = 2 + .label __5 = $1d + .label __6 = $21 + .label __7 = $25 + .label __8 = $29 + .label __9 = $2d + .label __10 = $31 + .label __11 = $35 + // [5] call print_cls + // [71] phi from main to print_cls [phi:main->print_cls] + print_cls_from_main: + jsr print_cls + // [6] phi from main to main::@1 [phi:main->main::@1] + __b1_from_main: + // [6] phi (byte*) print_char_cursor#14 = (byte*) 1024 [phi:main->main::@1#0] -- pbuz1=pbuc1 + lda #<$400 + sta.z print_char_cursor + lda #>$400 + sta.z print_char_cursor+1 + // [6] phi (byte*) print_line_cursor#15 = (byte*) 1024 [phi:main->main::@1#1] -- pbuz1=pbuc1 + lda #<$400 + sta.z print_line_cursor_1 + lda #>$400 + sta.z print_line_cursor_1+1 + // [6] phi (dword) main::i#2 = (dword) 0 [phi:main->main::@1#2] -- vduz1=vduc1 + lda #<0 + sta.z i + lda #>0 + sta.z i+1 + lda #<0>>$10 + sta.z i+2 + lda #>0>>$10 + sta.z i+3 + jmp __b1 + // main::@1 + __b1: + // [7] if((dword) main::i#2<(word) $d02) goto main::@2 -- vduz1_lt_vduc1_then_la1 + lda.z i+3 + cmp #>$d02>>$10 + bcc __b2 + bne !+ + lda.z i+2 + cmp #<$d02>>$10 + bcc __b2 + bne !+ + lda.z i+1 + cmp #>$d02 + bcc __b2 + bne !+ + lda.z i + cmp #<$d02 + bcc __b2 + !: + jmp __breturn + // main::@return + __breturn: + // [8] return + rts + // main::@2 + __b2: + // [9] (dword~) main::$5 ← (dword) main::i#2 << (byte) 4 -- vduz1=vduz2_rol_4 + lda.z i + asl + sta.z __5 + lda.z i+1 + rol + sta.z __5+1 + lda.z i+2 + rol + sta.z __5+2 + lda.z i+3 + rol + sta.z __5+3 + asl.z __5 + rol.z __5+1 + rol.z __5+2 + rol.z __5+3 + asl.z __5 + rol.z __5+1 + rol.z __5+2 + rol.z __5+3 + asl.z __5 + rol.z __5+1 + rol.z __5+2 + rol.z __5+3 + // [10] (dword~) main::$6 ← (dword~) main::$5 + (dword) main::i#2 -- vduz1=vduz2_plus_vduz3 + lda.z __5 + clc + adc.z i + sta.z __6 + lda.z __5+1 + adc.z i+1 + sta.z __6+1 + lda.z __5+2 + adc.z i+2 + sta.z __6+2 + lda.z __5+3 + adc.z i+3 + sta.z __6+3 + // [11] (dword~) main::$7 ← (dword~) main::$6 << (byte) 2 -- vduz1=vduz2_rol_2 + lda.z __6 + asl + sta.z __7 + lda.z __6+1 + rol + sta.z __7+1 + lda.z __6+2 + rol + sta.z __7+2 + lda.z __6+3 + rol + sta.z __7+3 + asl.z __7 + rol.z __7+1 + rol.z __7+2 + rol.z __7+3 + // [12] (dword~) main::$8 ← (dword~) main::$7 + (dword) main::i#2 -- vduz1=vduz2_plus_vduz3 + lda.z __7 + clc + adc.z i + sta.z __8 + lda.z __7+1 + adc.z i+1 + sta.z __8+1 + lda.z __7+2 + adc.z i+2 + sta.z __8+2 + lda.z __7+3 + adc.z i+3 + sta.z __8+3 + // [13] (dword~) main::$9 ← (dword~) main::$8 << (byte) 2 -- vduz1=vduz2_rol_2 + lda.z __8 + asl + sta.z __9 + lda.z __8+1 + rol + sta.z __9+1 + lda.z __8+2 + rol + sta.z __9+2 + lda.z __8+3 + rol + sta.z __9+3 + asl.z __9 + rol.z __9+1 + rol.z __9+2 + rol.z __9+3 + // [14] (dword~) main::$10 ← (dword~) main::$9 + (dword) main::i#2 -- vduz1=vduz2_plus_vduz3 + lda.z __9 + clc + adc.z i + sta.z __10 + lda.z __9+1 + adc.z i+1 + sta.z __10+1 + lda.z __9+2 + adc.z i+2 + sta.z __10+2 + lda.z __9+3 + adc.z i+3 + sta.z __10+3 + // [15] (dword~) main::$11 ← (dword~) main::$10 << (byte) 1 -- vduz1=vduz2_rol_1 + lda.z __10 + asl + sta.z __11 + lda.z __10+1 + rol + sta.z __11+1 + lda.z __10+2 + rol + sta.z __11+2 + lda.z __10+3 + rol + sta.z __11+3 + // [16] (dword) print_ulong_decimal::w#0 ← (dword~) main::$11 + (dword) main::i#2 -- vduz1=vduz2_plus_vduz3 + lda.z __11 + clc + adc.z i + sta.z print_ulong_decimal.w + lda.z __11+1 + adc.z i+1 + sta.z print_ulong_decimal.w+1 + lda.z __11+2 + adc.z i+2 + sta.z print_ulong_decimal.w+2 + lda.z __11+3 + adc.z i+3 + sta.z print_ulong_decimal.w+3 + // [17] call print_ulong_decimal + jsr print_ulong_decimal + // [18] phi from main::@2 to main::@3 [phi:main::@2->main::@3] + __b3_from___b2: + jmp __b3 + // main::@3 + __b3: + // [19] call print_ln + // [22] phi from main::@3 to print_ln [phi:main::@3->print_ln] + print_ln_from___b3: + jsr print_ln + jmp __b4 + // main::@4 + __b4: + // [20] (dword) main::i#1 ← (dword) main::i#2 + (word) $14d -- vduz1=vduz1_plus_vwuc1 + lda.z i + clc + adc #<$14d + sta.z i + lda.z i+1 + adc #>$14d + sta.z i+1 + lda.z i+2 + adc #0 + sta.z i+2 + lda.z i+3 + adc #0 + sta.z i+3 + // [21] (byte*) print_line_cursor#25 ← (byte*) print_line_cursor#1 -- pbuz1=pbuz2 + lda.z print_line_cursor + sta.z print_line_cursor_1 + lda.z print_line_cursor+1 + sta.z print_line_cursor_1+1 + // [6] phi from main::@4 to main::@1 [phi:main::@4->main::@1] + __b1_from___b4: + // [6] phi (byte*) print_char_cursor#14 = (byte*) print_line_cursor#1 [phi:main::@4->main::@1#0] -- register_copy + // [6] phi (byte*) print_line_cursor#15 = (byte*) print_line_cursor#25 [phi:main::@4->main::@1#1] -- register_copy + // [6] phi (dword) main::i#2 = (dword) main::i#1 [phi:main::@4->main::@1#2] -- register_copy + jmp __b1 +} + // print_ln +// Print a newline +print_ln: { + // [23] phi from print_ln print_ln::@2 to print_ln::@1 [phi:print_ln/print_ln::@2->print_ln::@1] + __b1_from_print_ln: + __b1_from___b2: + // [23] phi (byte*) print_line_cursor#9 = (byte*) print_line_cursor#15 [phi:print_ln/print_ln::@2->print_ln::@1#0] -- register_copy + jmp __b1 + // print_ln::@1 + __b1: + // [24] (byte*) print_line_cursor#1 ← (byte*) print_line_cursor#9 + (byte) $28 -- pbuz1=pbuz2_plus_vbuc1 + lda #$28 + clc + adc.z print_line_cursor_1 + sta.z print_line_cursor + lda #0 + adc.z print_line_cursor_1+1 + sta.z print_line_cursor+1 + // [25] if((byte*) print_line_cursor#1<(byte*) print_char_cursor#17) goto print_ln::@2 -- pbuz1_lt_pbuz2_then_la1 + lda.z print_line_cursor+1 + cmp.z print_char_cursor_1+1 + bcc __b2 + bne !+ + lda.z print_line_cursor + cmp.z print_char_cursor_1 + bcc __b2 + !: + jmp __breturn + // print_ln::@return + __breturn: + // [26] return + rts + // print_ln::@2 + __b2: + // [27] (byte*) print_line_cursor#24 ← (byte*) print_line_cursor#1 -- pbuz1=pbuz2 + lda.z print_line_cursor + sta.z print_line_cursor_1 + lda.z print_line_cursor+1 + sta.z print_line_cursor_1+1 + jmp __b1_from___b2 +} + // print_ulong_decimal +// Print a unsigned long as DECIMAL +// print_ulong_decimal(dword zp($39) w) +print_ulong_decimal: { + .label w = $39 + // [28] (dword) ultoa::value#1 ← (dword) print_ulong_decimal::w#0 -- vduz1=vduz2 + lda.z w + sta.z ultoa.value + lda.z w+1 + sta.z ultoa.value+1 + lda.z w+2 + sta.z ultoa.value+2 + lda.z w+3 + sta.z ultoa.value+3 + // [29] call ultoa + // [43] phi from print_ulong_decimal to ultoa [phi:print_ulong_decimal->ultoa] + ultoa_from_print_ulong_decimal: + jsr ultoa + // [30] phi from print_ulong_decimal to print_ulong_decimal::@1 [phi:print_ulong_decimal->print_ulong_decimal::@1] + __b1_from_print_ulong_decimal: + jmp __b1 + // print_ulong_decimal::@1 + __b1: + // [31] call print_str + jsr print_str + jmp __breturn + // print_ulong_decimal::@return + __breturn: + // [32] return + rts +} + // print_str +// Print a zero-terminated string +// print_str(byte* zp($a) str) +print_str: { + .label str = $a + // [33] (byte*) print_char_cursor#40 ← (byte*) print_char_cursor#14 -- pbuz1=pbuz2 + lda.z print_char_cursor + sta.z print_char_cursor_1 + lda.z print_char_cursor+1 + sta.z print_char_cursor_1+1 + // [34] phi from print_str to print_str::@1 [phi:print_str->print_str::@1] + __b1_from_print_str: + // [34] phi (byte*) print_char_cursor#17 = (byte*) print_char_cursor#40 [phi:print_str->print_str::@1#0] -- register_copy + // [34] phi (byte*) print_str::str#2 = (const byte*) decimal_digits_long [phi:print_str->print_str::@1#1] -- pbuz1=pbuc1 + lda #decimal_digits_long + sta.z str+1 + jmp __b1 + // print_str::@1 + __b1: + // [35] if((byte) 0!=*((byte*) print_str::str#2)) goto print_str::@2 -- vbuc1_neq__deref_pbuz1_then_la1 + ldy #0 + lda (str),y + cmp #0 + bne __b2 + jmp __breturn + // print_str::@return + __breturn: + // [36] return + rts + // print_str::@2 + __b2: + // [37] (byte) print_char::ch#0 ← *((byte*) print_str::str#2) -- vbuz1=_deref_pbuz2 + ldy #0 + lda (str),y + sta.z print_char.ch + // [38] call print_char + jsr print_char + jmp __b3 + // print_str::@3 + __b3: + // [39] (byte*) print_str::str#0 ← ++ (byte*) print_str::str#2 -- pbuz1=_inc_pbuz1 + inc.z str + bne !+ + inc.z str+1 + !: + // [34] phi from print_str::@3 to print_str::@1 [phi:print_str::@3->print_str::@1] + __b1_from___b3: + // [34] phi (byte*) print_char_cursor#17 = (byte*) print_char_cursor#23 [phi:print_str::@3->print_str::@1#0] -- register_copy + // [34] phi (byte*) print_str::str#2 = (byte*) print_str::str#0 [phi:print_str::@3->print_str::@1#1] -- register_copy + jmp __b1 +} + // print_char +// Print a single char +// print_char(byte zp($3d) ch) +print_char: { + .label ch = $3d + // [40] *((byte*) print_char_cursor#17) ← (byte) print_char::ch#0 -- _deref_pbuz1=vbuz2 + lda.z ch + ldy #0 + sta (print_char_cursor_1),y + // [41] (byte*) print_char_cursor#23 ← ++ (byte*) print_char_cursor#17 -- pbuz1=_inc_pbuz1 + inc.z print_char_cursor_1 + bne !+ + inc.z print_char_cursor_1+1 + !: + jmp __breturn + // print_char::@return + __breturn: + // [42] return + rts +} + // ultoa +// Converts unsigned number value to a string representing it in RADIX format. +// If the leading digits are zero they are not included in the string. +// - value : The number to be converted to RADIX +// - buffer : receives the string representing the number and zero-termination. +// - radix : The radix to convert the number to (from the enum RADIX) +// ultoa(dword zp($f) value, byte* zp($3f) buffer) +ultoa: { + .const max_digits = $a + .label __4 = $3e + .label __11 = $41 + .label digit_value = $42 + .label buffer = $3f + .label digit = $e + .label value = $f + .label buffer_1 = $14 + .label started = $13 + // [44] phi from ultoa to ultoa::@1 [phi:ultoa->ultoa::@1] + __b1_from_ultoa: + // [44] phi (byte*) ultoa::buffer#11 = (const byte*) decimal_digits_long [phi:ultoa->ultoa::@1#0] -- pbuz1=pbuc1 + lda #decimal_digits_long + sta.z buffer_1+1 + // [44] phi (byte) ultoa::started#2 = (byte) 0 [phi:ultoa->ultoa::@1#1] -- vbuz1=vbuc1 + lda #0 + sta.z started + // [44] phi (dword) ultoa::value#2 = (dword) ultoa::value#1 [phi:ultoa->ultoa::@1#2] -- register_copy + // [44] phi (byte) ultoa::digit#2 = (byte) 0 [phi:ultoa->ultoa::@1#3] -- vbuz1=vbuc1 + lda #0 + sta.z digit + jmp __b1 + // ultoa::@1 + __b1: + // [45] if((byte) ultoa::digit#2<(const byte) ultoa::max_digits#1-(byte) 1) goto ultoa::@2 -- vbuz1_lt_vbuc1_then_la1 + lda.z digit + cmp #max_digits-1 + bcc __b2 + jmp __b3 + // ultoa::@3 + __b3: + // [46] (byte~) ultoa::$4 ← (byte)(dword) ultoa::value#2 -- vbuz1=_byte_vduz2 + lda.z value + sta.z __4 + // [47] *((byte*) ultoa::buffer#11) ← *((const byte*) DIGITS + (byte~) ultoa::$4) -- _deref_pbuz1=pbuc1_derefidx_vbuz2 + ldy.z __4 + lda DIGITS,y + ldy #0 + sta (buffer_1),y + // [48] (byte*) ultoa::buffer#3 ← ++ (byte*) ultoa::buffer#11 -- pbuz1=_inc_pbuz2 + lda.z buffer_1 + clc + adc #1 + sta.z buffer + lda.z buffer_1+1 + adc #0 + sta.z buffer+1 + // [49] *((byte*) ultoa::buffer#3) ← (byte) 0 -- _deref_pbuz1=vbuc1 + lda #0 + ldy #0 + sta (buffer),y + jmp __breturn + // ultoa::@return + __breturn: + // [50] return + rts + // ultoa::@2 + __b2: + // [51] (byte~) ultoa::$11 ← (byte) ultoa::digit#2 << (byte) 2 -- vbuz1=vbuz2_rol_2 + lda.z digit + asl + asl + sta.z __11 + // [52] (dword) ultoa::digit_value#0 ← *((const dword*) RADIX_DECIMAL_VALUES_LONG + (byte~) ultoa::$11) -- vduz1=pduc1_derefidx_vbuz2 + ldy.z __11 + lda RADIX_DECIMAL_VALUES_LONG,y + sta.z digit_value + lda RADIX_DECIMAL_VALUES_LONG+1,y + sta.z digit_value+1 + lda RADIX_DECIMAL_VALUES_LONG+2,y + sta.z digit_value+2 + lda RADIX_DECIMAL_VALUES_LONG+3,y + sta.z digit_value+3 + // [53] if((byte) 0!=(byte) ultoa::started#2) goto ultoa::@5 -- vbuc1_neq_vbuz1_then_la1 + lda #0 + cmp.z started + bne __b5 + jmp __b7 + // ultoa::@7 + __b7: + // [54] if((dword) ultoa::value#2>=(dword) ultoa::digit_value#0) goto ultoa::@5 -- vduz1_ge_vduz2_then_la1 + lda.z value+3 + cmp.z digit_value+3 + bcc !+ + bne __b5 + lda.z value+2 + cmp.z digit_value+2 + bcc !+ + bne __b5 + lda.z value+1 + cmp.z digit_value+1 + bcc !+ + bne __b5 + lda.z value + cmp.z digit_value + bcs __b5 + !: + // [55] phi from ultoa::@7 to ultoa::@4 [phi:ultoa::@7->ultoa::@4] + __b4_from___b7: + // [55] phi (byte*) ultoa::buffer#14 = (byte*) ultoa::buffer#11 [phi:ultoa::@7->ultoa::@4#0] -- register_copy + // [55] phi (byte) ultoa::started#4 = (byte) ultoa::started#2 [phi:ultoa::@7->ultoa::@4#1] -- register_copy + // [55] phi (dword) ultoa::value#6 = (dword) ultoa::value#2 [phi:ultoa::@7->ultoa::@4#2] -- register_copy + jmp __b4 + // ultoa::@4 + __b4: + // [56] (byte) ultoa::digit#1 ← ++ (byte) ultoa::digit#2 -- vbuz1=_inc_vbuz1 + inc.z digit + // [44] phi from ultoa::@4 to ultoa::@1 [phi:ultoa::@4->ultoa::@1] + __b1_from___b4: + // [44] phi (byte*) ultoa::buffer#11 = (byte*) ultoa::buffer#14 [phi:ultoa::@4->ultoa::@1#0] -- register_copy + // [44] phi (byte) ultoa::started#2 = (byte) ultoa::started#4 [phi:ultoa::@4->ultoa::@1#1] -- register_copy + // [44] phi (dword) ultoa::value#2 = (dword) ultoa::value#6 [phi:ultoa::@4->ultoa::@1#2] -- register_copy + // [44] phi (byte) ultoa::digit#2 = (byte) ultoa::digit#1 [phi:ultoa::@4->ultoa::@1#3] -- register_copy + jmp __b1 + // ultoa::@5 + __b5: + // [57] (byte*) ultoa_append::buffer#0 ← (byte*) ultoa::buffer#11 -- pbuz1=pbuz2 + lda.z buffer_1 + sta.z ultoa_append.buffer + lda.z buffer_1+1 + sta.z ultoa_append.buffer+1 + // [58] (dword) ultoa_append::value#0 ← (dword) ultoa::value#2 -- vduz1=vduz2 + lda.z value + sta.z ultoa_append.value + lda.z value+1 + sta.z ultoa_append.value+1 + lda.z value+2 + sta.z ultoa_append.value+2 + lda.z value+3 + sta.z ultoa_append.value+3 + // [59] (dword) ultoa_append::sub#0 ← (dword) ultoa::digit_value#0 -- vduz1=vduz2 + lda.z digit_value + sta.z ultoa_append.sub + lda.z digit_value+1 + sta.z ultoa_append.sub+1 + lda.z digit_value+2 + sta.z ultoa_append.sub+2 + lda.z digit_value+3 + sta.z ultoa_append.sub+3 + // [60] call ultoa_append + // [64] phi from ultoa::@5 to ultoa_append [phi:ultoa::@5->ultoa_append] + ultoa_append_from___b5: + jsr ultoa_append + // [61] (dword) ultoa_append::return#0 ← (dword) ultoa_append::value#2 -- vduz1=vduz2 + lda.z ultoa_append.value + sta.z ultoa_append.return + lda.z ultoa_append.value+1 + sta.z ultoa_append.return+1 + lda.z ultoa_append.value+2 + sta.z ultoa_append.return+2 + lda.z ultoa_append.value+3 + sta.z ultoa_append.return+3 + jmp __b6 + // ultoa::@6 + __b6: + // [62] (dword) ultoa::value#0 ← (dword) ultoa_append::return#0 -- vduz1=vduz2 + lda.z ultoa_append.return + sta.z value + lda.z ultoa_append.return+1 + sta.z value+1 + lda.z ultoa_append.return+2 + sta.z value+2 + lda.z ultoa_append.return+3 + sta.z value+3 + // [63] (byte*) ultoa::buffer#4 ← ++ (byte*) ultoa::buffer#11 -- pbuz1=_inc_pbuz1 + inc.z buffer_1 + bne !+ + inc.z buffer_1+1 + !: + // [55] phi from ultoa::@6 to ultoa::@4 [phi:ultoa::@6->ultoa::@4] + __b4_from___b6: + // [55] phi (byte*) ultoa::buffer#14 = (byte*) ultoa::buffer#4 [phi:ultoa::@6->ultoa::@4#0] -- register_copy + // [55] phi (byte) ultoa::started#4 = (byte) 1 [phi:ultoa::@6->ultoa::@4#1] -- vbuz1=vbuc1 + lda #1 + sta.z started + // [55] phi (dword) ultoa::value#6 = (dword) ultoa::value#0 [phi:ultoa::@6->ultoa::@4#2] -- register_copy + jmp __b4 +} + // ultoa_append +// Used to convert a single digit of an unsigned number value to a string representation +// Counts a single digit up from '0' as long as the value is larger than sub. +// Each time the digit is increased sub is subtracted from value. +// - buffer : pointer to the char that receives the digit +// - value : The value where the digit will be derived from +// - sub : the value of a '1' in the digit. Subtracted continually while the digit is increased. +// (For decimal the subs used are 10000, 1000, 100, 10, 1) +// returns : the value reduced by sub * digit so that it is less than sub. +// ultoa_append(byte* zp($46) buffer, dword zp($16) value, dword zp($48) sub) +ultoa_append: { + .label buffer = $46 + .label value = $16 + .label sub = $48 + .label return = $4c + .label digit = $1a + // [65] phi from ultoa_append to ultoa_append::@1 [phi:ultoa_append->ultoa_append::@1] + __b1_from_ultoa_append: + // [65] phi (byte) ultoa_append::digit#2 = (byte) 0 [phi:ultoa_append->ultoa_append::@1#0] -- vbuz1=vbuc1 + lda #0 + sta.z digit + // [65] phi (dword) ultoa_append::value#2 = (dword) ultoa_append::value#0 [phi:ultoa_append->ultoa_append::@1#1] -- register_copy + jmp __b1 + // ultoa_append::@1 + __b1: + // [66] if((dword) ultoa_append::value#2>=(dword) ultoa_append::sub#0) goto ultoa_append::@2 -- vduz1_ge_vduz2_then_la1 + lda.z value+3 + cmp.z sub+3 + bcc !+ + bne __b2 + lda.z value+2 + cmp.z sub+2 + bcc !+ + bne __b2 + lda.z value+1 + cmp.z sub+1 + bcc !+ + bne __b2 + lda.z value + cmp.z sub + bcs __b2 + !: + jmp __b3 + // ultoa_append::@3 + __b3: + // [67] *((byte*) ultoa_append::buffer#0) ← *((const byte*) DIGITS + (byte) ultoa_append::digit#2) -- _deref_pbuz1=pbuc1_derefidx_vbuz2 + ldy.z digit + lda DIGITS,y + ldy #0 + sta (buffer),y + jmp __breturn + // ultoa_append::@return + __breturn: + // [68] return + rts + // ultoa_append::@2 + __b2: + // [69] (byte) ultoa_append::digit#1 ← ++ (byte) ultoa_append::digit#2 -- vbuz1=_inc_vbuz1 + inc.z digit + // [70] (dword) ultoa_append::value#1 ← (dword) ultoa_append::value#2 - (dword) ultoa_append::sub#0 -- vduz1=vduz1_minus_vduz2 + lda.z value + sec + sbc.z sub + sta.z value + lda.z value+1 + sbc.z sub+1 + sta.z value+1 + lda.z value+2 + sbc.z sub+2 + sta.z value+2 + lda.z value+3 + sbc.z sub+3 + sta.z value+3 + // [65] phi from ultoa_append::@2 to ultoa_append::@1 [phi:ultoa_append::@2->ultoa_append::@1] + __b1_from___b2: + // [65] phi (byte) ultoa_append::digit#2 = (byte) ultoa_append::digit#1 [phi:ultoa_append::@2->ultoa_append::@1#0] -- register_copy + // [65] phi (dword) ultoa_append::value#2 = (dword) ultoa_append::value#1 [phi:ultoa_append::@2->ultoa_append::@1#1] -- register_copy + jmp __b1 +} + // print_cls +// Clear the screen. Also resets current line/char cursor. +print_cls: { + // [72] call memset + // [74] phi from print_cls to memset [phi:print_cls->memset] + memset_from_print_cls: + jsr memset + jmp __breturn + // print_cls::@return + __breturn: + // [73] return + rts +} + // memset +// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str. +memset: { + .const c = ' ' + .const num = $3e8 + .label str = $400 + .label end = str+num + .label dst = $1b + // [75] phi from memset to memset::@1 [phi:memset->memset::@1] + __b1_from_memset: + // [75] phi (byte*) memset::dst#2 = (byte*)(const void*) memset::str#0 [phi:memset->memset::@1#0] -- pbuz1=pbuc1 + lda #str + sta.z dst+1 + jmp __b1 + // memset::@1 + __b1: + // [76] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2 -- pbuz1_neq_pbuc1_then_la1 + lda.z dst+1 + cmp #>end + bne __b2 + lda.z dst + cmp #memset::@1] + __b1_from___b2: + // [75] phi (byte*) memset::dst#2 = (byte*) memset::dst#1 [phi:memset::@2->memset::@1#0] -- register_copy + jmp __b1 +} + // File Data + // The digits used for numbers + DIGITS: .text "0123456789abcdef" + // Values of decimal digits + RADIX_DECIMAL_VALUES_LONG: .dword $3b9aca00, $5f5e100, $989680, $f4240, $186a0, $2710, $3e8, $64, $a + // Digits used for storing the decimal unsigned int + decimal_digits_long: .fill $b, 0 + +REGISTER UPLIFT POTENTIAL REGISTERS +Statement [7] if((dword) main::i#2<(word) $d02) goto main::@2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ] { } ) always clobbers reg byte a +Statement [9] (dword~) main::$5 ← (dword) main::i#2 << (byte) 4 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$5 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$5 ] { } ) always clobbers reg byte a +Statement [10] (dword~) main::$6 ← (dword~) main::$5 + (dword) main::i#2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$6 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$6 ] { } ) always clobbers reg byte a +Statement [11] (dword~) main::$7 ← (dword~) main::$6 << (byte) 2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$7 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$7 ] { } ) always clobbers reg byte a +Statement [12] (dword~) main::$8 ← (dword~) main::$7 + (dword) main::i#2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$8 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$8 ] { } ) always clobbers reg byte a +Statement [13] (dword~) main::$9 ← (dword~) main::$8 << (byte) 2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$9 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$9 ] { } ) always clobbers reg byte a +Statement [14] (dword~) main::$10 ← (dword~) main::$9 + (dword) main::i#2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$10 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$10 ] { } ) always clobbers reg byte a +Statement [15] (dword~) main::$11 ← (dword~) main::$10 << (byte) 1 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$11 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$11 ] { } ) always clobbers reg byte a +Statement [16] (dword) print_ulong_decimal::w#0 ← (dword~) main::$11 + (dword) main::i#2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 print_ulong_decimal::w#0 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 print_ulong_decimal::w#0 ] { } ) always clobbers reg byte a +Statement [20] (dword) main::i#1 ← (dword) main::i#2 + (word) $14d [ main::i#1 print_line_cursor#1 ] ( main:2 [ main::i#1 print_line_cursor#1 ] { } ) always clobbers reg byte a +Statement [21] (byte*) print_line_cursor#25 ← (byte*) print_line_cursor#1 [ main::i#1 print_line_cursor#25 print_line_cursor#1 ] ( main:2 [ main::i#1 print_line_cursor#25 print_line_cursor#1 ] { } ) always clobbers reg byte a +Statement [24] (byte*) print_line_cursor#1 ← (byte*) print_line_cursor#9 + (byte) $28 [ print_line_cursor#1 print_char_cursor#17 ] ( main:2::print_ln:19 [ main::i#2 print_line_cursor#1 print_char_cursor#17 ] { } ) always clobbers reg byte a +Statement [25] if((byte*) print_line_cursor#1<(byte*) print_char_cursor#17) goto print_ln::@2 [ print_line_cursor#1 print_char_cursor#17 ] ( main:2::print_ln:19 [ main::i#2 print_line_cursor#1 print_char_cursor#17 ] { } ) always clobbers reg byte a +Statement [27] (byte*) print_line_cursor#24 ← (byte*) print_line_cursor#1 [ print_line_cursor#24 print_char_cursor#17 ] ( main:2::print_ln:19 [ main::i#2 print_line_cursor#24 print_char_cursor#17 ] { } ) always clobbers reg byte a +Statement [28] (dword) ultoa::value#1 ← (dword) print_ulong_decimal::w#0 [ print_char_cursor#14 ultoa::value#1 ] ( main:2::print_ulong_decimal:17 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::value#1 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a +Statement [33] (byte*) print_char_cursor#40 ← (byte*) print_char_cursor#14 [ print_char_cursor#40 ] ( main:2::print_ulong_decimal:17::print_str:31 [ main::i#2 print_line_cursor#15 print_char_cursor#40 ] { } ) always clobbers reg byte a +Statement [35] if((byte) 0!=*((byte*) print_str::str#2)) goto print_str::@2 [ print_char_cursor#17 print_str::str#2 ] ( main:2::print_ulong_decimal:17::print_str:31 [ main::i#2 print_line_cursor#15 print_char_cursor#17 print_str::str#2 ] { } ) always clobbers reg byte a reg byte y +Statement [37] (byte) print_char::ch#0 ← *((byte*) print_str::str#2) [ print_char_cursor#17 print_str::str#2 print_char::ch#0 ] ( main:2::print_ulong_decimal:17::print_str:31 [ main::i#2 print_line_cursor#15 print_char_cursor#17 print_str::str#2 print_char::ch#0 ] { } ) always clobbers reg byte a reg byte y +Statement [40] *((byte*) print_char_cursor#17) ← (byte) print_char::ch#0 [ print_char_cursor#17 ] ( main:2::print_ulong_decimal:17::print_str:31::print_char:38 [ main::i#2 print_line_cursor#15 print_str::str#2 print_char_cursor#17 ] { } ) always clobbers reg byte y +Statement [46] (byte~) ultoa::$4 ← (byte)(dword) ultoa::value#2 [ ultoa::buffer#11 ultoa::$4 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::buffer#11 ultoa::$4 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a +Statement [47] *((byte*) ultoa::buffer#11) ← *((const byte*) DIGITS + (byte~) ultoa::$4) [ ultoa::buffer#11 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::buffer#11 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a reg byte y +Statement [48] (byte*) ultoa::buffer#3 ← ++ (byte*) ultoa::buffer#11 [ ultoa::buffer#3 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::buffer#3 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a +Statement [49] *((byte*) ultoa::buffer#3) ← (byte) 0 [ ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a reg byte y +Statement [51] (byte~) ultoa::$11 ← (byte) ultoa::digit#2 << (byte) 2 [ ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::$11 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::$11 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:14 [ ultoa::digit#2 ultoa::digit#1 ] +Removing always clobbered register reg byte a as potential for zp[1]:19 [ ultoa::started#2 ultoa::started#4 ] +Statement [52] (dword) ultoa::digit_value#0 ← *((const dword*) RADIX_DECIMAL_VALUES_LONG + (byte~) ultoa::$11) [ ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a +Statement [54] if((dword) ultoa::value#2>=(dword) ultoa::digit_value#0) goto ultoa::@5 [ ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a +Statement [57] (byte*) ultoa_append::buffer#0 ← (byte*) ultoa::buffer#11 [ ultoa::digit#2 ultoa::value#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::value#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } { ultoa_append::buffer#0 = ultoa::buffer#11 } { ultoa_append::value#0 = ultoa::value#2 } { ultoa_append::sub#0 = ultoa::digit_value#0 } { ultoa_append::return#0 = ultoa_append::value#2 } } ) always clobbers reg byte a +Statement [58] (dword) ultoa_append::value#0 ← (dword) ultoa::value#2 [ ultoa::digit#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ultoa_append::value#0 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ultoa_append::value#0 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } { ultoa_append::buffer#0 = ultoa::buffer#11 } { ultoa_append::value#0 = ultoa::value#2 } { ultoa_append::sub#0 = ultoa::digit_value#0 } { ultoa_append::return#0 = ultoa_append::value#2 } } ) always clobbers reg byte a +Statement [59] (dword) ultoa_append::sub#0 ← (dword) ultoa::digit_value#0 [ ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::value#0 ultoa_append::sub#0 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::value#0 ultoa_append::sub#0 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } { ultoa_append::buffer#0 = ultoa::buffer#11 } { ultoa_append::value#0 = ultoa::value#2 } { ultoa_append::sub#0 = ultoa::digit_value#0 } { ultoa_append::return#0 = ultoa_append::value#2 } } ) always clobbers reg byte a +Statement [61] (dword) ultoa_append::return#0 ← (dword) ultoa_append::value#2 [ ultoa::digit#2 ultoa::buffer#11 ultoa_append::return#0 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::buffer#11 ultoa_append::return#0 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } { ultoa_append::buffer#0 = ultoa::buffer#11 } { ultoa_append::value#0 = ultoa::value#2 } { ultoa_append::sub#0 = ultoa::digit_value#0 } { ultoa_append::return#0 = ultoa_append::value#2 } } ) always clobbers reg byte a +Statement [62] (dword) ultoa::value#0 ← (dword) ultoa_append::return#0 [ ultoa::digit#2 ultoa::buffer#11 ultoa::value#0 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::buffer#11 ultoa::value#0 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a +Statement [66] if((dword) ultoa_append::value#2>=(dword) ultoa_append::sub#0) goto ultoa_append::@2 [ ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#2 ultoa_append::digit#2 ] ( main:2::print_ulong_decimal:17::ultoa:29::ultoa_append:60 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#2 ultoa_append::digit#2 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } { ultoa_append::buffer#0 = ultoa::buffer#11 } { ultoa_append::value#0 = ultoa::value#2 } { ultoa_append::sub#0 = ultoa::digit_value#0 } { ultoa_append::return#0 = ultoa_append::value#2 } } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:26 [ ultoa_append::digit#2 ultoa_append::digit#1 ] +Statement [67] *((byte*) ultoa_append::buffer#0) ← *((const byte*) DIGITS + (byte) ultoa_append::digit#2) [ ultoa_append::value#2 ] ( main:2::print_ulong_decimal:17::ultoa:29::ultoa_append:60 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::buffer#11 ultoa_append::value#2 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } { ultoa_append::buffer#0 = ultoa::buffer#11 } { ultoa_append::value#0 = ultoa::value#2 } { ultoa_append::sub#0 = ultoa::digit_value#0 } { ultoa_append::return#0 = ultoa_append::value#2 } } ) always clobbers reg byte a reg byte y +Removing always clobbered register reg byte y as potential for zp[1]:14 [ ultoa::digit#2 ultoa::digit#1 ] +Statement [70] (dword) ultoa_append::value#1 ← (dword) ultoa_append::value#2 - (dword) ultoa_append::sub#0 [ ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#1 ultoa_append::digit#1 ] ( main:2::print_ulong_decimal:17::ultoa:29::ultoa_append:60 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#1 ultoa_append::digit#1 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } { ultoa_append::buffer#0 = ultoa::buffer#11 } { ultoa_append::value#0 = ultoa::value#2 } { ultoa_append::sub#0 = ultoa::digit_value#0 } { ultoa_append::return#0 = ultoa_append::value#2 } } ) always clobbers reg byte a +Statement [76] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2 [ memset::dst#2 ] ( main:2::print_cls:5::memset:72 [ memset::dst#2 ] { } ) always clobbers reg byte a +Statement [78] *((byte*) memset::dst#2) ← (const byte) memset::c#0 [ memset::dst#2 ] ( main:2::print_cls:5::memset:72 [ memset::dst#2 ] { } ) always clobbers reg byte a reg byte y +Statement [7] if((dword) main::i#2<(word) $d02) goto main::@2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ] { } ) always clobbers reg byte a +Statement [9] (dword~) main::$5 ← (dword) main::i#2 << (byte) 4 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$5 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$5 ] { } ) always clobbers reg byte a +Statement [10] (dword~) main::$6 ← (dword~) main::$5 + (dword) main::i#2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$6 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$6 ] { } ) always clobbers reg byte a +Statement [11] (dword~) main::$7 ← (dword~) main::$6 << (byte) 2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$7 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$7 ] { } ) always clobbers reg byte a +Statement [12] (dword~) main::$8 ← (dword~) main::$7 + (dword) main::i#2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$8 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$8 ] { } ) always clobbers reg byte a +Statement [13] (dword~) main::$9 ← (dword~) main::$8 << (byte) 2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$9 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$9 ] { } ) always clobbers reg byte a +Statement [14] (dword~) main::$10 ← (dword~) main::$9 + (dword) main::i#2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$10 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$10 ] { } ) always clobbers reg byte a +Statement [15] (dword~) main::$11 ← (dword~) main::$10 << (byte) 1 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$11 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 main::$11 ] { } ) always clobbers reg byte a +Statement [16] (dword) print_ulong_decimal::w#0 ← (dword~) main::$11 + (dword) main::i#2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 print_ulong_decimal::w#0 ] ( main:2 [ main::i#2 print_line_cursor#15 print_char_cursor#14 print_ulong_decimal::w#0 ] { } ) always clobbers reg byte a +Statement [20] (dword) main::i#1 ← (dword) main::i#2 + (word) $14d [ main::i#1 print_line_cursor#1 ] ( main:2 [ main::i#1 print_line_cursor#1 ] { } ) always clobbers reg byte a +Statement [21] (byte*) print_line_cursor#25 ← (byte*) print_line_cursor#1 [ main::i#1 print_line_cursor#25 print_line_cursor#1 ] ( main:2 [ main::i#1 print_line_cursor#25 print_line_cursor#1 ] { } ) always clobbers reg byte a +Statement [24] (byte*) print_line_cursor#1 ← (byte*) print_line_cursor#9 + (byte) $28 [ print_line_cursor#1 print_char_cursor#17 ] ( main:2::print_ln:19 [ main::i#2 print_line_cursor#1 print_char_cursor#17 ] { } ) always clobbers reg byte a +Statement [25] if((byte*) print_line_cursor#1<(byte*) print_char_cursor#17) goto print_ln::@2 [ print_line_cursor#1 print_char_cursor#17 ] ( main:2::print_ln:19 [ main::i#2 print_line_cursor#1 print_char_cursor#17 ] { } ) always clobbers reg byte a +Statement [27] (byte*) print_line_cursor#24 ← (byte*) print_line_cursor#1 [ print_line_cursor#24 print_char_cursor#17 ] ( main:2::print_ln:19 [ main::i#2 print_line_cursor#24 print_char_cursor#17 ] { } ) always clobbers reg byte a +Statement [28] (dword) ultoa::value#1 ← (dword) print_ulong_decimal::w#0 [ print_char_cursor#14 ultoa::value#1 ] ( main:2::print_ulong_decimal:17 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::value#1 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a +Statement [33] (byte*) print_char_cursor#40 ← (byte*) print_char_cursor#14 [ print_char_cursor#40 ] ( main:2::print_ulong_decimal:17::print_str:31 [ main::i#2 print_line_cursor#15 print_char_cursor#40 ] { } ) always clobbers reg byte a +Statement [35] if((byte) 0!=*((byte*) print_str::str#2)) goto print_str::@2 [ print_char_cursor#17 print_str::str#2 ] ( main:2::print_ulong_decimal:17::print_str:31 [ main::i#2 print_line_cursor#15 print_char_cursor#17 print_str::str#2 ] { } ) always clobbers reg byte a reg byte y +Statement [37] (byte) print_char::ch#0 ← *((byte*) print_str::str#2) [ print_char_cursor#17 print_str::str#2 print_char::ch#0 ] ( main:2::print_ulong_decimal:17::print_str:31 [ main::i#2 print_line_cursor#15 print_char_cursor#17 print_str::str#2 print_char::ch#0 ] { } ) always clobbers reg byte a reg byte y +Statement [40] *((byte*) print_char_cursor#17) ← (byte) print_char::ch#0 [ print_char_cursor#17 ] ( main:2::print_ulong_decimal:17::print_str:31::print_char:38 [ main::i#2 print_line_cursor#15 print_str::str#2 print_char_cursor#17 ] { } ) always clobbers reg byte y +Statement [46] (byte~) ultoa::$4 ← (byte)(dword) ultoa::value#2 [ ultoa::buffer#11 ultoa::$4 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::buffer#11 ultoa::$4 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a +Statement [47] *((byte*) ultoa::buffer#11) ← *((const byte*) DIGITS + (byte~) ultoa::$4) [ ultoa::buffer#11 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::buffer#11 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a reg byte y +Statement [48] (byte*) ultoa::buffer#3 ← ++ (byte*) ultoa::buffer#11 [ ultoa::buffer#3 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::buffer#3 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a +Statement [49] *((byte*) ultoa::buffer#3) ← (byte) 0 [ ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a reg byte y +Statement [51] (byte~) ultoa::$11 ← (byte) ultoa::digit#2 << (byte) 2 [ ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::$11 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::$11 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a +Statement [52] (dword) ultoa::digit_value#0 ← *((const dword*) RADIX_DECIMAL_VALUES_LONG + (byte~) ultoa::$11) [ ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a +Statement [54] if((dword) ultoa::value#2>=(dword) ultoa::digit_value#0) goto ultoa::@5 [ ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::value#2 ultoa::started#2 ultoa::buffer#11 ultoa::digit_value#0 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a +Statement [57] (byte*) ultoa_append::buffer#0 ← (byte*) ultoa::buffer#11 [ ultoa::digit#2 ultoa::value#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::value#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } { ultoa_append::buffer#0 = ultoa::buffer#11 } { ultoa_append::value#0 = ultoa::value#2 } { ultoa_append::sub#0 = ultoa::digit_value#0 } { ultoa_append::return#0 = ultoa_append::value#2 } } ) always clobbers reg byte a +Statement [58] (dword) ultoa_append::value#0 ← (dword) ultoa::value#2 [ ultoa::digit#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ultoa_append::value#0 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::buffer#11 ultoa::digit_value#0 ultoa_append::buffer#0 ultoa_append::value#0 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } { ultoa_append::buffer#0 = ultoa::buffer#11 } { ultoa_append::value#0 = ultoa::value#2 } { ultoa_append::sub#0 = ultoa::digit_value#0 } { ultoa_append::return#0 = ultoa_append::value#2 } } ) always clobbers reg byte a +Statement [59] (dword) ultoa_append::sub#0 ← (dword) ultoa::digit_value#0 [ ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::value#0 ultoa_append::sub#0 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::value#0 ultoa_append::sub#0 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } { ultoa_append::buffer#0 = ultoa::buffer#11 } { ultoa_append::value#0 = ultoa::value#2 } { ultoa_append::sub#0 = ultoa::digit_value#0 } { ultoa_append::return#0 = ultoa_append::value#2 } } ) always clobbers reg byte a +Statement [61] (dword) ultoa_append::return#0 ← (dword) ultoa_append::value#2 [ ultoa::digit#2 ultoa::buffer#11 ultoa_append::return#0 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::buffer#11 ultoa_append::return#0 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } { ultoa_append::buffer#0 = ultoa::buffer#11 } { ultoa_append::value#0 = ultoa::value#2 } { ultoa_append::sub#0 = ultoa::digit_value#0 } { ultoa_append::return#0 = ultoa_append::value#2 } } ) always clobbers reg byte a +Statement [62] (dword) ultoa::value#0 ← (dword) ultoa_append::return#0 [ ultoa::digit#2 ultoa::buffer#11 ultoa::value#0 ] ( main:2::print_ulong_decimal:17::ultoa:29 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::buffer#11 ultoa::value#0 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } } ) always clobbers reg byte a +Statement [66] if((dword) ultoa_append::value#2>=(dword) ultoa_append::sub#0) goto ultoa_append::@2 [ ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#2 ultoa_append::digit#2 ] ( main:2::print_ulong_decimal:17::ultoa:29::ultoa_append:60 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#2 ultoa_append::digit#2 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } { ultoa_append::buffer#0 = ultoa::buffer#11 } { ultoa_append::value#0 = ultoa::value#2 } { ultoa_append::sub#0 = ultoa::digit_value#0 } { ultoa_append::return#0 = ultoa_append::value#2 } } ) always clobbers reg byte a +Statement [67] *((byte*) ultoa_append::buffer#0) ← *((const byte*) DIGITS + (byte) ultoa_append::digit#2) [ ultoa_append::value#2 ] ( main:2::print_ulong_decimal:17::ultoa:29::ultoa_append:60 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::buffer#11 ultoa_append::value#2 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } { ultoa_append::buffer#0 = ultoa::buffer#11 } { ultoa_append::value#0 = ultoa::value#2 } { ultoa_append::sub#0 = ultoa::digit_value#0 } { ultoa_append::return#0 = ultoa_append::value#2 } } ) always clobbers reg byte a reg byte y +Statement [70] (dword) ultoa_append::value#1 ← (dword) ultoa_append::value#2 - (dword) ultoa_append::sub#0 [ ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#1 ultoa_append::digit#1 ] ( main:2::print_ulong_decimal:17::ultoa:29::ultoa_append:60 [ main::i#2 print_line_cursor#15 print_char_cursor#14 ultoa::digit#2 ultoa::buffer#11 ultoa_append::buffer#0 ultoa_append::sub#0 ultoa_append::value#1 ultoa_append::digit#1 ] { { ultoa::value#1 = print_ulong_decimal::w#0 } { ultoa_append::buffer#0 = ultoa::buffer#11 } { ultoa_append::value#0 = ultoa::value#2 } { ultoa_append::sub#0 = ultoa::digit_value#0 } { ultoa_append::return#0 = ultoa_append::value#2 } } ) always clobbers reg byte a +Statement [76] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2 [ memset::dst#2 ] ( main:2::print_cls:5::memset:72 [ memset::dst#2 ] { } ) always clobbers reg byte a +Statement [78] *((byte*) memset::dst#2) ← (const byte) memset::c#0 [ memset::dst#2 ] ( main:2::print_cls:5::memset:72 [ memset::dst#2 ] { } ) always clobbers reg byte a reg byte y +Potential registers zp[4]:2 [ main::i#2 main::i#1 ] : zp[4]:2 , +Potential registers zp[2]:6 [ print_char_cursor#14 print_line_cursor#1 ] : zp[2]:6 , +Potential registers zp[2]:8 [ print_line_cursor#9 print_line_cursor#15 print_line_cursor#25 print_line_cursor#24 ] : zp[2]:8 , +Potential registers zp[2]:10 [ print_str::str#2 print_str::str#0 ] : zp[2]:10 , +Potential registers zp[2]:12 [ print_char_cursor#17 print_char_cursor#40 print_char_cursor#23 ] : zp[2]:12 , +Potential registers zp[1]:14 [ ultoa::digit#2 ultoa::digit#1 ] : zp[1]:14 , reg byte x , +Potential registers zp[4]:15 [ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ] : zp[4]:15 , +Potential registers zp[1]:19 [ ultoa::started#2 ultoa::started#4 ] : zp[1]:19 , reg byte x , reg byte y , +Potential registers zp[2]:20 [ ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ] : zp[2]:20 , +Potential registers zp[4]:22 [ ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 ] : zp[4]:22 , +Potential registers zp[1]:26 [ ultoa_append::digit#2 ultoa_append::digit#1 ] : zp[1]:26 , reg byte x , reg byte y , +Potential registers zp[2]:27 [ memset::dst#2 memset::dst#1 ] : zp[2]:27 , +Potential registers zp[4]:29 [ main::$5 ] : zp[4]:29 , +Potential registers zp[4]:33 [ main::$6 ] : zp[4]:33 , +Potential registers zp[4]:37 [ main::$7 ] : zp[4]:37 , +Potential registers zp[4]:41 [ main::$8 ] : zp[4]:41 , +Potential registers zp[4]:45 [ main::$9 ] : zp[4]:45 , +Potential registers zp[4]:49 [ main::$10 ] : zp[4]:49 , +Potential registers zp[4]:53 [ main::$11 ] : zp[4]:53 , +Potential registers zp[4]:57 [ print_ulong_decimal::w#0 ] : zp[4]:57 , +Potential registers zp[1]:61 [ print_char::ch#0 ] : zp[1]:61 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:62 [ ultoa::$4 ] : zp[1]:62 , reg byte a , reg byte x , reg byte y , +Potential registers zp[2]:63 [ ultoa::buffer#3 ] : zp[2]:63 , +Potential registers zp[1]:65 [ ultoa::$11 ] : zp[1]:65 , reg byte a , reg byte x , reg byte y , +Potential registers zp[4]:66 [ ultoa::digit_value#0 ] : zp[4]:66 , +Potential registers zp[2]:70 [ ultoa_append::buffer#0 ] : zp[2]:70 , +Potential registers zp[4]:72 [ ultoa_append::sub#0 ] : zp[4]:72 , +Potential registers zp[4]:76 [ ultoa_append::return#0 ] : zp[4]:76 , + +REGISTER UPLIFT SCOPES +Uplift Scope [ultoa_append] 25,005,500,003.5: zp[4]:22 [ ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 ] 20,005,000,002.5: zp[1]:26 [ ultoa_append::digit#2 ultoa_append::digit#1 ] 3,333,500,000.5: zp[4]:72 [ ultoa_append::sub#0 ] 2,000,002: zp[4]:76 [ ultoa_append::return#0 ] 1,375,000.25: zp[2]:70 [ ultoa_append::buffer#0 ] +Uplift Scope [ultoa] 3,787,146.79: zp[2]:20 [ ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ] 3,078,361.36: zp[4]:15 [ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ] 2,285,716.57: zp[1]:14 [ ultoa::digit#2 ultoa::digit#1 ] 2,000,002: zp[1]:65 [ ultoa::$11 ] 1,500,001.5: zp[1]:19 [ ultoa::started#2 ultoa::started#4 ] 600,000.6: zp[4]:66 [ ultoa::digit_value#0 ] 20,002: zp[1]:62 [ ultoa::$4 ] 20,002: zp[2]:63 [ ultoa::buffer#3 ] +Uplift Scope [print_char] 11,000,002: zp[1]:61 [ print_char::ch#0 ] +Uplift Scope [] 4,277,860: zp[2]:12 [ print_char_cursor#17 print_char_cursor#40 print_char_cursor#23 ] 401,291.77: zp[2]:8 [ print_line_cursor#9 print_line_cursor#15 print_line_cursor#25 print_line_cursor#24 ] 50,811.24: zp[2]:6 [ print_char_cursor#14 print_line_cursor#1 ] +Uplift Scope [print_str] 3,000,003: zp[2]:10 [ print_str::str#2 print_str::str#0 ] +Uplift Scope [memset] 33,336.67: zp[2]:27 [ memset::dst#2 memset::dst#1 ] +Uplift Scope [main] 202: zp[4]:29 [ main::$5 ] 202: zp[4]:33 [ main::$6 ] 202: zp[4]:37 [ main::$7 ] 202: zp[4]:41 [ main::$8 ] 202: zp[4]:45 [ main::$9 ] 202: zp[4]:49 [ main::$10 ] 202: zp[4]:53 [ main::$11 ] 163.15: zp[4]:2 [ main::i#2 main::i#1 ] +Uplift Scope [print_ulong_decimal] 1,102: zp[4]:57 [ print_ulong_decimal::w#0 ] +Uplift Scope [RADIX] +Uplift Scope [print_ln] +Uplift Scope [print_cls] + +Uplifting [ultoa_append] best 137773 combination zp[4]:22 [ ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 ] reg byte x [ ultoa_append::digit#2 ultoa_append::digit#1 ] zp[4]:72 [ ultoa_append::sub#0 ] zp[4]:76 [ ultoa_append::return#0 ] zp[2]:70 [ ultoa_append::buffer#0 ] +Uplifting [ultoa] best 136469 combination zp[2]:20 [ ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ] zp[4]:15 [ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ] zp[1]:14 [ ultoa::digit#2 ultoa::digit#1 ] reg byte a [ ultoa::$11 ] reg byte x [ ultoa::started#2 ultoa::started#4 ] zp[4]:66 [ ultoa::digit_value#0 ] reg byte a [ ultoa::$4 ] zp[2]:63 [ ultoa::buffer#3 ] +Uplifting [print_char] best 136166 combination reg byte a [ print_char::ch#0 ] +Uplifting [] best 136166 combination zp[2]:12 [ print_char_cursor#17 print_char_cursor#40 print_char_cursor#23 ] zp[2]:8 [ print_line_cursor#9 print_line_cursor#15 print_line_cursor#25 print_line_cursor#24 ] zp[2]:6 [ print_char_cursor#14 print_line_cursor#1 ] +Uplifting [print_str] best 136166 combination zp[2]:10 [ print_str::str#2 print_str::str#0 ] +Uplifting [memset] best 136166 combination zp[2]:27 [ memset::dst#2 memset::dst#1 ] +Uplifting [main] best 136166 combination zp[4]:29 [ main::$5 ] zp[4]:33 [ main::$6 ] zp[4]:37 [ main::$7 ] zp[4]:41 [ main::$8 ] zp[4]:45 [ main::$9 ] zp[4]:49 [ main::$10 ] zp[4]:53 [ main::$11 ] zp[4]:2 [ main::i#2 main::i#1 ] +Uplifting [print_ulong_decimal] best 136166 combination zp[4]:57 [ print_ulong_decimal::w#0 ] +Uplifting [RADIX] best 136166 combination +Uplifting [print_ln] best 136166 combination +Uplifting [print_cls] best 136166 combination +Attempting to uplift remaining variables inzp[1]:14 [ ultoa::digit#2 ultoa::digit#1 ] +Uplifting [ultoa] best 136166 combination zp[1]:14 [ ultoa::digit#2 ultoa::digit#1 ] +Coalescing zero page register [ zp[4]:15 [ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ] ] with [ zp[4]:22 [ ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 ] ] - score: 1 +Coalescing zero page register [ zp[4]:15 [ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 ] ] with [ zp[4]:57 [ print_ulong_decimal::w#0 ] ] - score: 1 +Coalescing zero page register [ zp[4]:15 [ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 print_ulong_decimal::w#0 ] ] with [ zp[4]:76 [ ultoa_append::return#0 ] ] - score: 1 +Coalescing zero page register [ zp[2]:20 [ ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ] ] with [ zp[2]:63 [ ultoa::buffer#3 ] ] - score: 1 +Coalescing zero page register [ zp[2]:20 [ ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ultoa::buffer#3 ] ] with [ zp[2]:70 [ ultoa_append::buffer#0 ] ] - score: 1 +Coalescing zero page register [ zp[4]:29 [ main::$5 ] ] with [ zp[4]:33 [ main::$6 ] ] - score: 1 +Coalescing zero page register [ zp[4]:37 [ main::$7 ] ] with [ zp[4]:41 [ main::$8 ] ] - score: 1 +Coalescing zero page register [ zp[4]:45 [ main::$9 ] ] with [ zp[4]:49 [ main::$10 ] ] - score: 1 +Coalescing zero page register [ zp[4]:66 [ ultoa::digit_value#0 ] ] with [ zp[4]:72 [ ultoa_append::sub#0 ] ] - score: 1 +Coalescing zero page register [ zp[4]:15 [ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 print_ulong_decimal::w#0 ultoa_append::return#0 ] ] with [ zp[4]:53 [ main::$11 ] ] - score: 1 +Coalescing zero page register [ zp[4]:29 [ main::$5 main::$6 ] ] with [ zp[4]:37 [ main::$7 main::$8 ] ] - score: 1 +Coalescing zero page register [ zp[4]:15 [ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 print_ulong_decimal::w#0 ultoa_append::return#0 main::$11 ] ] with [ zp[4]:45 [ main::$9 main::$10 ] ] - score: 1 +Coalescing zero page register [ zp[4]:15 [ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 print_ulong_decimal::w#0 ultoa_append::return#0 main::$11 main::$9 main::$10 ] ] with [ zp[4]:29 [ main::$5 main::$6 main::$7 main::$8 ] ] - score: 1 +Coalescing zero page register [ zp[2]:20 [ ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ultoa::buffer#3 ultoa_append::buffer#0 ] ] with [ zp[2]:10 [ print_str::str#2 print_str::str#0 ] ] +Coalescing zero page register [ zp[2]:27 [ memset::dst#2 memset::dst#1 ] ] with [ zp[2]:20 [ ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ultoa::buffer#3 ultoa_append::buffer#0 print_str::str#2 print_str::str#0 ] ] +Allocated (was zp[2]:12) zp[2]:10 [ print_char_cursor#17 print_char_cursor#40 print_char_cursor#23 ] +Allocated (was zp[1]:14) zp[1]:12 [ ultoa::digit#2 ultoa::digit#1 ] +Allocated (was zp[4]:15) zp[4]:13 [ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 print_ulong_decimal::w#0 ultoa_append::return#0 main::$11 main::$9 main::$10 main::$5 main::$6 main::$7 main::$8 ] +Allocated (was zp[2]:27) zp[2]:17 [ memset::dst#2 memset::dst#1 ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ultoa::buffer#3 ultoa_append::buffer#0 print_str::str#2 print_str::str#0 ] +Allocated (was zp[4]:66) zp[4]:19 [ ultoa::digit_value#0 ultoa_append::sub#0 ] + +ASSEMBLER BEFORE OPTIMIZATION + // File Comments + // Upstart +.pc = $801 "Basic" +:BasicUpstart(__bbegin) +.pc = $80d "Program" + // Global Constants & labels + .label print_line_cursor = 6 + .label print_char_cursor = 6 + .label print_char_cursor_1 = $a + .label print_line_cursor_1 = 8 + // @begin +__bbegin: + // [1] phi from @begin to @1 [phi:@begin->@1] +__b1_from___bbegin: + jmp __b1 + // @1 +__b1: + // [2] call main + // [4] phi from @1 to main [phi:@1->main] +main_from___b1: + jsr main + // [3] phi from @1 to @end [phi:@1->@end] +__bend_from___b1: + jmp __bend + // @end +__bend: + // main +main: { + .label i = 2 + .label __5 = $d + .label __6 = $d + .label __7 = $d + .label __8 = $d + .label __9 = $d + .label __10 = $d + .label __11 = $d + // [5] call print_cls + // [71] phi from main to print_cls [phi:main->print_cls] + print_cls_from_main: + jsr print_cls + // [6] phi from main to main::@1 [phi:main->main::@1] + __b1_from_main: + // [6] phi (byte*) print_char_cursor#14 = (byte*) 1024 [phi:main->main::@1#0] -- pbuz1=pbuc1 + lda #<$400 + sta.z print_char_cursor + lda #>$400 + sta.z print_char_cursor+1 + // [6] phi (byte*) print_line_cursor#15 = (byte*) 1024 [phi:main->main::@1#1] -- pbuz1=pbuc1 + lda #<$400 + sta.z print_line_cursor_1 + lda #>$400 + sta.z print_line_cursor_1+1 + // [6] phi (dword) main::i#2 = (dword) 0 [phi:main->main::@1#2] -- vduz1=vduc1 + lda #<0 + sta.z i + lda #>0 + sta.z i+1 + lda #<0>>$10 + sta.z i+2 + lda #>0>>$10 + sta.z i+3 + jmp __b1 + // main::@1 + __b1: + // [7] if((dword) main::i#2<(word) $d02) goto main::@2 -- vduz1_lt_vduc1_then_la1 + lda.z i+3 + cmp #>$d02>>$10 + bcc __b2 + bne !+ + lda.z i+2 + cmp #<$d02>>$10 + bcc __b2 + bne !+ + lda.z i+1 + cmp #>$d02 + bcc __b2 + bne !+ + lda.z i + cmp #<$d02 + bcc __b2 + !: + jmp __breturn + // main::@return + __breturn: + // [8] return + rts + // main::@2 + __b2: + // [9] (dword~) main::$5 ← (dword) main::i#2 << (byte) 4 -- vduz1=vduz2_rol_4 + lda.z i + asl + sta.z __5 + lda.z i+1 + rol + sta.z __5+1 + lda.z i+2 + rol + sta.z __5+2 + lda.z i+3 + rol + sta.z __5+3 + asl.z __5 + rol.z __5+1 + rol.z __5+2 + rol.z __5+3 + asl.z __5 + rol.z __5+1 + rol.z __5+2 + rol.z __5+3 + asl.z __5 + rol.z __5+1 + rol.z __5+2 + rol.z __5+3 + // [10] (dword~) main::$6 ← (dword~) main::$5 + (dword) main::i#2 -- vduz1=vduz1_plus_vduz2 + lda.z __6 + clc + adc.z i + sta.z __6 + lda.z __6+1 + adc.z i+1 + sta.z __6+1 + lda.z __6+2 + adc.z i+2 + sta.z __6+2 + lda.z __6+3 + adc.z i+3 + sta.z __6+3 + // [11] (dword~) main::$7 ← (dword~) main::$6 << (byte) 2 -- vduz1=vduz1_rol_2 + asl.z __7 + rol.z __7+1 + rol.z __7+2 + rol.z __7+3 + asl.z __7 + rol.z __7+1 + rol.z __7+2 + rol.z __7+3 + // [12] (dword~) main::$8 ← (dword~) main::$7 + (dword) main::i#2 -- vduz1=vduz1_plus_vduz2 + lda.z __8 + clc + adc.z i + sta.z __8 + lda.z __8+1 + adc.z i+1 + sta.z __8+1 + lda.z __8+2 + adc.z i+2 + sta.z __8+2 + lda.z __8+3 + adc.z i+3 + sta.z __8+3 + // [13] (dword~) main::$9 ← (dword~) main::$8 << (byte) 2 -- vduz1=vduz1_rol_2 + asl.z __9 + rol.z __9+1 + rol.z __9+2 + rol.z __9+3 + asl.z __9 + rol.z __9+1 + rol.z __9+2 + rol.z __9+3 + // [14] (dword~) main::$10 ← (dword~) main::$9 + (dword) main::i#2 -- vduz1=vduz1_plus_vduz2 + lda.z __10 + clc + adc.z i + sta.z __10 + lda.z __10+1 + adc.z i+1 + sta.z __10+1 + lda.z __10+2 + adc.z i+2 + sta.z __10+2 + lda.z __10+3 + adc.z i+3 + sta.z __10+3 + // [15] (dword~) main::$11 ← (dword~) main::$10 << (byte) 1 -- vduz1=vduz1_rol_1 + asl.z __11 + rol.z __11+1 + rol.z __11+2 + rol.z __11+3 + // [16] (dword) print_ulong_decimal::w#0 ← (dword~) main::$11 + (dword) main::i#2 -- vduz1=vduz1_plus_vduz2 + lda.z print_ulong_decimal.w + clc + adc.z i + sta.z print_ulong_decimal.w + lda.z print_ulong_decimal.w+1 + adc.z i+1 + sta.z print_ulong_decimal.w+1 + lda.z print_ulong_decimal.w+2 + adc.z i+2 + sta.z print_ulong_decimal.w+2 + lda.z print_ulong_decimal.w+3 + adc.z i+3 + sta.z print_ulong_decimal.w+3 + // [17] call print_ulong_decimal + jsr print_ulong_decimal + // [18] phi from main::@2 to main::@3 [phi:main::@2->main::@3] + __b3_from___b2: + jmp __b3 + // main::@3 + __b3: + // [19] call print_ln + // [22] phi from main::@3 to print_ln [phi:main::@3->print_ln] + print_ln_from___b3: + jsr print_ln + jmp __b4 + // main::@4 + __b4: + // [20] (dword) main::i#1 ← (dword) main::i#2 + (word) $14d -- vduz1=vduz1_plus_vwuc1 + lda.z i + clc + adc #<$14d + sta.z i + lda.z i+1 + adc #>$14d + sta.z i+1 + lda.z i+2 + adc #0 + sta.z i+2 + lda.z i+3 + adc #0 + sta.z i+3 + // [21] (byte*) print_line_cursor#25 ← (byte*) print_line_cursor#1 -- pbuz1=pbuz2 + lda.z print_line_cursor + sta.z print_line_cursor_1 + lda.z print_line_cursor+1 + sta.z print_line_cursor_1+1 + // [6] phi from main::@4 to main::@1 [phi:main::@4->main::@1] + __b1_from___b4: + // [6] phi (byte*) print_char_cursor#14 = (byte*) print_line_cursor#1 [phi:main::@4->main::@1#0] -- register_copy + // [6] phi (byte*) print_line_cursor#15 = (byte*) print_line_cursor#25 [phi:main::@4->main::@1#1] -- register_copy + // [6] phi (dword) main::i#2 = (dword) main::i#1 [phi:main::@4->main::@1#2] -- register_copy + jmp __b1 +} + // print_ln +// Print a newline +print_ln: { + // [23] phi from print_ln print_ln::@2 to print_ln::@1 [phi:print_ln/print_ln::@2->print_ln::@1] + __b1_from_print_ln: + __b1_from___b2: + // [23] phi (byte*) print_line_cursor#9 = (byte*) print_line_cursor#15 [phi:print_ln/print_ln::@2->print_ln::@1#0] -- register_copy + jmp __b1 + // print_ln::@1 + __b1: + // [24] (byte*) print_line_cursor#1 ← (byte*) print_line_cursor#9 + (byte) $28 -- pbuz1=pbuz2_plus_vbuc1 + lda #$28 + clc + adc.z print_line_cursor_1 + sta.z print_line_cursor + lda #0 + adc.z print_line_cursor_1+1 + sta.z print_line_cursor+1 + // [25] if((byte*) print_line_cursor#1<(byte*) print_char_cursor#17) goto print_ln::@2 -- pbuz1_lt_pbuz2_then_la1 + lda.z print_line_cursor+1 + cmp.z print_char_cursor_1+1 + bcc __b2 + bne !+ + lda.z print_line_cursor + cmp.z print_char_cursor_1 + bcc __b2 + !: + jmp __breturn + // print_ln::@return + __breturn: + // [26] return + rts + // print_ln::@2 + __b2: + // [27] (byte*) print_line_cursor#24 ← (byte*) print_line_cursor#1 -- pbuz1=pbuz2 + lda.z print_line_cursor + sta.z print_line_cursor_1 + lda.z print_line_cursor+1 + sta.z print_line_cursor_1+1 + jmp __b1_from___b2 +} + // print_ulong_decimal +// Print a unsigned long as DECIMAL +// print_ulong_decimal(dword zp($d) w) +print_ulong_decimal: { + .label w = $d + // [28] (dword) ultoa::value#1 ← (dword) print_ulong_decimal::w#0 + // [29] call ultoa + // [43] phi from print_ulong_decimal to ultoa [phi:print_ulong_decimal->ultoa] + ultoa_from_print_ulong_decimal: + jsr ultoa + // [30] phi from print_ulong_decimal to print_ulong_decimal::@1 [phi:print_ulong_decimal->print_ulong_decimal::@1] + __b1_from_print_ulong_decimal: + jmp __b1 + // print_ulong_decimal::@1 + __b1: + // [31] call print_str + jsr print_str + jmp __breturn + // print_ulong_decimal::@return + __breturn: + // [32] return + rts +} + // print_str +// Print a zero-terminated string +// print_str(byte* zp($11) str) +print_str: { + .label str = $11 + // [33] (byte*) print_char_cursor#40 ← (byte*) print_char_cursor#14 -- pbuz1=pbuz2 + lda.z print_char_cursor + sta.z print_char_cursor_1 + lda.z print_char_cursor+1 + sta.z print_char_cursor_1+1 + // [34] phi from print_str to print_str::@1 [phi:print_str->print_str::@1] + __b1_from_print_str: + // [34] phi (byte*) print_char_cursor#17 = (byte*) print_char_cursor#40 [phi:print_str->print_str::@1#0] -- register_copy + // [34] phi (byte*) print_str::str#2 = (const byte*) decimal_digits_long [phi:print_str->print_str::@1#1] -- pbuz1=pbuc1 + lda #decimal_digits_long + sta.z str+1 + jmp __b1 + // print_str::@1 + __b1: + // [35] if((byte) 0!=*((byte*) print_str::str#2)) goto print_str::@2 -- vbuc1_neq__deref_pbuz1_then_la1 + ldy #0 + lda (str),y + cmp #0 + bne __b2 + jmp __breturn + // print_str::@return + __breturn: + // [36] return + rts + // print_str::@2 + __b2: + // [37] (byte) print_char::ch#0 ← *((byte*) print_str::str#2) -- vbuaa=_deref_pbuz1 + ldy #0 + lda (str),y + // [38] call print_char + jsr print_char + jmp __b3 + // print_str::@3 + __b3: + // [39] (byte*) print_str::str#0 ← ++ (byte*) print_str::str#2 -- pbuz1=_inc_pbuz1 + inc.z str + bne !+ + inc.z str+1 + !: + // [34] phi from print_str::@3 to print_str::@1 [phi:print_str::@3->print_str::@1] + __b1_from___b3: + // [34] phi (byte*) print_char_cursor#17 = (byte*) print_char_cursor#23 [phi:print_str::@3->print_str::@1#0] -- register_copy + // [34] phi (byte*) print_str::str#2 = (byte*) print_str::str#0 [phi:print_str::@3->print_str::@1#1] -- register_copy + jmp __b1 +} + // print_char +// Print a single char +// print_char(byte register(A) ch) +print_char: { + // [40] *((byte*) print_char_cursor#17) ← (byte) print_char::ch#0 -- _deref_pbuz1=vbuaa + ldy #0 + sta (print_char_cursor_1),y + // [41] (byte*) print_char_cursor#23 ← ++ (byte*) print_char_cursor#17 -- pbuz1=_inc_pbuz1 + inc.z print_char_cursor_1 + bne !+ + inc.z print_char_cursor_1+1 + !: + jmp __breturn + // print_char::@return + __breturn: + // [42] return + rts +} + // ultoa +// Converts unsigned number value to a string representing it in RADIX format. +// If the leading digits are zero they are not included in the string. +// - value : The number to be converted to RADIX +// - buffer : receives the string representing the number and zero-termination. +// - radix : The radix to convert the number to (from the enum RADIX) +// ultoa(dword zp($d) value, byte* zp($11) buffer) +ultoa: { + .const max_digits = $a + .label digit_value = $13 + .label buffer = $11 + .label digit = $c + .label value = $d + // [44] phi from ultoa to ultoa::@1 [phi:ultoa->ultoa::@1] + __b1_from_ultoa: + // [44] phi (byte*) ultoa::buffer#11 = (const byte*) decimal_digits_long [phi:ultoa->ultoa::@1#0] -- pbuz1=pbuc1 + lda #decimal_digits_long + sta.z buffer+1 + // [44] phi (byte) ultoa::started#2 = (byte) 0 [phi:ultoa->ultoa::@1#1] -- vbuxx=vbuc1 + ldx #0 + // [44] phi (dword) ultoa::value#2 = (dword) ultoa::value#1 [phi:ultoa->ultoa::@1#2] -- register_copy + // [44] phi (byte) ultoa::digit#2 = (byte) 0 [phi:ultoa->ultoa::@1#3] -- vbuz1=vbuc1 + lda #0 + sta.z digit + jmp __b1 + // ultoa::@1 + __b1: + // [45] if((byte) ultoa::digit#2<(const byte) ultoa::max_digits#1-(byte) 1) goto ultoa::@2 -- vbuz1_lt_vbuc1_then_la1 + lda.z digit + cmp #max_digits-1 + bcc __b2 + jmp __b3 + // ultoa::@3 + __b3: + // [46] (byte~) ultoa::$4 ← (byte)(dword) ultoa::value#2 -- vbuaa=_byte_vduz1 + lda.z value + // [47] *((byte*) ultoa::buffer#11) ← *((const byte*) DIGITS + (byte~) ultoa::$4) -- _deref_pbuz1=pbuc1_derefidx_vbuaa + tay + lda DIGITS,y + ldy #0 + sta (buffer),y + // [48] (byte*) ultoa::buffer#3 ← ++ (byte*) ultoa::buffer#11 -- pbuz1=_inc_pbuz1 + inc.z buffer + bne !+ + inc.z buffer+1 + !: + // [49] *((byte*) ultoa::buffer#3) ← (byte) 0 -- _deref_pbuz1=vbuc1 + lda #0 + ldy #0 + sta (buffer),y + jmp __breturn + // ultoa::@return + __breturn: + // [50] return + rts + // ultoa::@2 + __b2: + // [51] (byte~) ultoa::$11 ← (byte) ultoa::digit#2 << (byte) 2 -- vbuaa=vbuz1_rol_2 + lda.z digit + asl + asl + // [52] (dword) ultoa::digit_value#0 ← *((const dword*) RADIX_DECIMAL_VALUES_LONG + (byte~) ultoa::$11) -- vduz1=pduc1_derefidx_vbuaa + tay + lda RADIX_DECIMAL_VALUES_LONG,y + sta.z digit_value + lda RADIX_DECIMAL_VALUES_LONG+1,y + sta.z digit_value+1 + lda RADIX_DECIMAL_VALUES_LONG+2,y + sta.z digit_value+2 + lda RADIX_DECIMAL_VALUES_LONG+3,y + sta.z digit_value+3 + // [53] if((byte) 0!=(byte) ultoa::started#2) goto ultoa::@5 -- vbuc1_neq_vbuxx_then_la1 + cpx #0 + bne __b5 + jmp __b7 + // ultoa::@7 + __b7: + // [54] if((dword) ultoa::value#2>=(dword) ultoa::digit_value#0) goto ultoa::@5 -- vduz1_ge_vduz2_then_la1 + lda.z value+3 + cmp.z digit_value+3 + bcc !+ + bne __b5 + lda.z value+2 + cmp.z digit_value+2 + bcc !+ + bne __b5 + lda.z value+1 + cmp.z digit_value+1 + bcc !+ + bne __b5 + lda.z value + cmp.z digit_value + bcs __b5 + !: + // [55] phi from ultoa::@7 to ultoa::@4 [phi:ultoa::@7->ultoa::@4] + __b4_from___b7: + // [55] phi (byte*) ultoa::buffer#14 = (byte*) ultoa::buffer#11 [phi:ultoa::@7->ultoa::@4#0] -- register_copy + // [55] phi (byte) ultoa::started#4 = (byte) ultoa::started#2 [phi:ultoa::@7->ultoa::@4#1] -- register_copy + // [55] phi (dword) ultoa::value#6 = (dword) ultoa::value#2 [phi:ultoa::@7->ultoa::@4#2] -- register_copy + jmp __b4 + // ultoa::@4 + __b4: + // [56] (byte) ultoa::digit#1 ← ++ (byte) ultoa::digit#2 -- vbuz1=_inc_vbuz1 + inc.z digit + // [44] phi from ultoa::@4 to ultoa::@1 [phi:ultoa::@4->ultoa::@1] + __b1_from___b4: + // [44] phi (byte*) ultoa::buffer#11 = (byte*) ultoa::buffer#14 [phi:ultoa::@4->ultoa::@1#0] -- register_copy + // [44] phi (byte) ultoa::started#2 = (byte) ultoa::started#4 [phi:ultoa::@4->ultoa::@1#1] -- register_copy + // [44] phi (dword) ultoa::value#2 = (dword) ultoa::value#6 [phi:ultoa::@4->ultoa::@1#2] -- register_copy + // [44] phi (byte) ultoa::digit#2 = (byte) ultoa::digit#1 [phi:ultoa::@4->ultoa::@1#3] -- register_copy + jmp __b1 + // ultoa::@5 + __b5: + // [57] (byte*) ultoa_append::buffer#0 ← (byte*) ultoa::buffer#11 + // [58] (dword) ultoa_append::value#0 ← (dword) ultoa::value#2 + // [59] (dword) ultoa_append::sub#0 ← (dword) ultoa::digit_value#0 + // [60] call ultoa_append + // [64] phi from ultoa::@5 to ultoa_append [phi:ultoa::@5->ultoa_append] + ultoa_append_from___b5: + jsr ultoa_append + // [61] (dword) ultoa_append::return#0 ← (dword) ultoa_append::value#2 + jmp __b6 + // ultoa::@6 + __b6: + // [62] (dword) ultoa::value#0 ← (dword) ultoa_append::return#0 + // [63] (byte*) ultoa::buffer#4 ← ++ (byte*) ultoa::buffer#11 -- pbuz1=_inc_pbuz1 + inc.z buffer + bne !+ + inc.z buffer+1 + !: + // [55] phi from ultoa::@6 to ultoa::@4 [phi:ultoa::@6->ultoa::@4] + __b4_from___b6: + // [55] phi (byte*) ultoa::buffer#14 = (byte*) ultoa::buffer#4 [phi:ultoa::@6->ultoa::@4#0] -- register_copy + // [55] phi (byte) ultoa::started#4 = (byte) 1 [phi:ultoa::@6->ultoa::@4#1] -- vbuxx=vbuc1 + ldx #1 + // [55] phi (dword) ultoa::value#6 = (dword) ultoa::value#0 [phi:ultoa::@6->ultoa::@4#2] -- register_copy + jmp __b4 +} + // ultoa_append +// Used to convert a single digit of an unsigned number value to a string representation +// Counts a single digit up from '0' as long as the value is larger than sub. +// Each time the digit is increased sub is subtracted from value. +// - buffer : pointer to the char that receives the digit +// - value : The value where the digit will be derived from +// - sub : the value of a '1' in the digit. Subtracted continually while the digit is increased. +// (For decimal the subs used are 10000, 1000, 100, 10, 1) +// returns : the value reduced by sub * digit so that it is less than sub. +// ultoa_append(byte* zp($11) buffer, dword zp($d) value, dword zp($13) sub) +ultoa_append: { + .label buffer = $11 + .label value = $d + .label sub = $13 + .label return = $d + // [65] phi from ultoa_append to ultoa_append::@1 [phi:ultoa_append->ultoa_append::@1] + __b1_from_ultoa_append: + // [65] phi (byte) ultoa_append::digit#2 = (byte) 0 [phi:ultoa_append->ultoa_append::@1#0] -- vbuxx=vbuc1 + ldx #0 + // [65] phi (dword) ultoa_append::value#2 = (dword) ultoa_append::value#0 [phi:ultoa_append->ultoa_append::@1#1] -- register_copy + jmp __b1 + // ultoa_append::@1 + __b1: + // [66] if((dword) ultoa_append::value#2>=(dword) ultoa_append::sub#0) goto ultoa_append::@2 -- vduz1_ge_vduz2_then_la1 + lda.z value+3 + cmp.z sub+3 + bcc !+ + bne __b2 + lda.z value+2 + cmp.z sub+2 + bcc !+ + bne __b2 + lda.z value+1 + cmp.z sub+1 + bcc !+ + bne __b2 + lda.z value + cmp.z sub + bcs __b2 + !: + jmp __b3 + // ultoa_append::@3 + __b3: + // [67] *((byte*) ultoa_append::buffer#0) ← *((const byte*) DIGITS + (byte) ultoa_append::digit#2) -- _deref_pbuz1=pbuc1_derefidx_vbuxx + lda DIGITS,x + ldy #0 + sta (buffer),y + jmp __breturn + // ultoa_append::@return + __breturn: + // [68] return + rts + // ultoa_append::@2 + __b2: + // [69] (byte) ultoa_append::digit#1 ← ++ (byte) ultoa_append::digit#2 -- vbuxx=_inc_vbuxx + inx + // [70] (dword) ultoa_append::value#1 ← (dword) ultoa_append::value#2 - (dword) ultoa_append::sub#0 -- vduz1=vduz1_minus_vduz2 + lda.z value + sec + sbc.z sub + sta.z value + lda.z value+1 + sbc.z sub+1 + sta.z value+1 + lda.z value+2 + sbc.z sub+2 + sta.z value+2 + lda.z value+3 + sbc.z sub+3 + sta.z value+3 + // [65] phi from ultoa_append::@2 to ultoa_append::@1 [phi:ultoa_append::@2->ultoa_append::@1] + __b1_from___b2: + // [65] phi (byte) ultoa_append::digit#2 = (byte) ultoa_append::digit#1 [phi:ultoa_append::@2->ultoa_append::@1#0] -- register_copy + // [65] phi (dword) ultoa_append::value#2 = (dword) ultoa_append::value#1 [phi:ultoa_append::@2->ultoa_append::@1#1] -- register_copy + jmp __b1 +} + // print_cls +// Clear the screen. Also resets current line/char cursor. +print_cls: { + // [72] call memset + // [74] phi from print_cls to memset [phi:print_cls->memset] + memset_from_print_cls: + jsr memset + jmp __breturn + // print_cls::@return + __breturn: + // [73] return + rts +} + // memset +// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str. +memset: { + .const c = ' ' + .const num = $3e8 + .label str = $400 + .label end = str+num + .label dst = $11 + // [75] phi from memset to memset::@1 [phi:memset->memset::@1] + __b1_from_memset: + // [75] phi (byte*) memset::dst#2 = (byte*)(const void*) memset::str#0 [phi:memset->memset::@1#0] -- pbuz1=pbuc1 + lda #str + sta.z dst+1 + jmp __b1 + // memset::@1 + __b1: + // [76] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2 -- pbuz1_neq_pbuc1_then_la1 + lda.z dst+1 + cmp #>end + bne __b2 + lda.z dst + cmp #memset::@1] + __b1_from___b2: + // [75] phi (byte*) memset::dst#2 = (byte*) memset::dst#1 [phi:memset::@2->memset::@1#0] -- register_copy + jmp __b1 +} + // File Data + // The digits used for numbers + DIGITS: .text "0123456789abcdef" + // Values of decimal digits + RADIX_DECIMAL_VALUES_LONG: .dword $3b9aca00, $5f5e100, $989680, $f4240, $186a0, $2710, $3e8, $64, $a + // Digits used for storing the decimal unsigned int + decimal_digits_long: .fill $b, 0 + +ASSEMBLER OPTIMIZATIONS +Removing instruction jmp __b1 +Removing instruction jmp __bend +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Removing instruction jmp __b3 +Removing instruction jmp __b4 +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 __b3 +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp __b3 +Removing instruction jmp __breturn +Removing instruction jmp __b7 +Removing instruction jmp __b4 +Removing instruction jmp __b6 +Removing instruction jmp __b1 +Removing instruction jmp __b3 +Removing instruction jmp __breturn +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction lda #>0 +Removing instruction lda.z print_line_cursor+1 +Replacing instruction lda #0 with TXA +Replacing instruction ldy #0 with TAY +Succesful ASM optimization Pass5UnnecesaryLoadElimination +Replacing label __b1_from___b2 with __b1 +Removing instruction __b1_from___bbegin: +Removing instruction __b1: +Removing instruction main_from___b1: +Removing instruction __bend_from___b1: +Removing instruction __b3_from___b2: +Removing instruction print_ln_from___b3: +Removing instruction __b1_from_print_ln: +Removing instruction __b1_from___b2: +Removing instruction __b1_from_print_ulong_decimal: +Removing instruction __b4_from___b7: +Removing instruction ultoa_append_from___b5: +Succesful ASM optimization Pass5RedundantLabelElimination +Removing instruction __bend: +Removing instruction print_cls_from_main: +Removing instruction __b1_from_main: +Removing instruction __breturn: +Removing instruction __b3: +Removing instruction __b4: +Removing instruction __b1_from___b4: +Removing instruction __breturn: +Removing instruction ultoa_from_print_ulong_decimal: +Removing instruction __b1: +Removing instruction __breturn: +Removing instruction __b1_from_print_str: +Removing instruction __breturn: +Removing instruction __b3: +Removing instruction __b1_from___b3: +Removing instruction __breturn: +Removing instruction __b1_from_ultoa: +Removing instruction __b3: +Removing instruction __breturn: +Removing instruction __b7: +Removing instruction __b1_from___b4: +Removing instruction __b6: +Removing instruction __b4_from___b6: +Removing instruction __b1_from_ultoa_append: +Removing instruction __b3: +Removing instruction __breturn: +Removing instruction __b1_from___b2: +Removing instruction memset_from_print_cls: +Removing instruction __breturn: +Removing instruction __b1_from_memset: +Removing instruction __breturn: +Removing instruction __b1_from___b2: +Succesful ASM optimization Pass5UnusedLabelElimination +Updating BasicUpstart to call main directly +Removing instruction jsr main +Succesful ASM optimization Pass5SkipBegin +Removing instruction __bbegin: +Succesful ASM optimization Pass5UnusedLabelElimination + +FINAL SYMBOL TABLE +(label) @1 +(label) @begin +(label) @end +(const byte*) DIGITS[] = (byte*) "0123456789abcdef"z +(const byte) RADIX::BINARY = (number) 2 +(const byte) RADIX::DECIMAL = (number) $a +(const byte) RADIX::HEXADECIMAL = (number) $10 +(const byte) RADIX::OCTAL = (number) 8 +(const dword*) RADIX_DECIMAL_VALUES_LONG[] = { (dword) $3b9aca00, (dword) $5f5e100, (dword) $989680, (dword) $f4240, (dword) $186a0, (dword) $2710, (dword) $3e8, (dword) $64, (dword) $a } +(const byte*) decimal_digits_long[(number) $b] = { fill( $b, 0) } +(void()) main() +(dword~) main::$10 zp[4]:13 202.0 +(dword~) main::$11 zp[4]:13 202.0 +(dword~) main::$5 zp[4]:13 202.0 +(dword~) main::$6 zp[4]:13 202.0 +(dword~) main::$7 zp[4]:13 202.0 +(dword~) main::$8 zp[4]:13 202.0 +(dword~) main::$9 zp[4]:13 202.0 +(label) main::@1 +(label) main::@2 +(label) main::@3 +(label) main::@4 +(label) main::@return +(dword) main::i +(dword) main::i#1 i zp[4]:2 101.0 +(dword) main::i#2 i zp[4]:2 62.153846153846146 +(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) +(label) memset::@1 +(label) memset::@2 +(label) memset::@return +(byte) memset::c +(const byte) memset::c#0 c = (byte) ' ' +(byte*) memset::dst +(byte*) memset::dst#1 dst zp[2]:17 20002.0 +(byte*) memset::dst#2 dst zp[2]:17 13334.666666666666 +(byte*) memset::end +(const byte*) memset::end#0 end = (byte*)(const void*) memset::str#0+(const word) memset::num#0 +(word) memset::num +(const word) memset::num#0 num = (word) $3e8 +(void*) memset::return +(void*) memset::str +(const void*) memset::str#0 str = (void*)(byte*) 1024 +(void()) print_char((byte) print_char::ch) +(label) print_char::@return +(byte) print_char::ch +(byte) print_char::ch#0 reg byte a 1.1000002E7 +(byte*) print_char_cursor +(byte*) print_char_cursor#14 print_char_cursor zp[2]:6 777.076923076923 +(byte*) print_char_cursor#17 print_char_cursor_1 zp[2]:10 1507857.5 +(byte*) print_char_cursor#23 print_char_cursor_1 zp[2]:10 2750000.5 +(byte*) print_char_cursor#40 print_char_cursor_1 zp[2]:10 20002.0 +(void()) print_cls() +(label) print_cls::@return +(byte*) print_line_cursor +(byte*) print_line_cursor#1 print_line_cursor zp[2]:6 50034.16666666666 +(byte*) print_line_cursor#15 print_line_cursor_1 zp[2]:8 84.76923076923077 +(byte*) print_line_cursor#24 print_line_cursor_1 zp[2]:8 200002.0 +(byte*) print_line_cursor#25 print_line_cursor_1 zp[2]:8 202.0 +(byte*) print_line_cursor#9 print_line_cursor_1 zp[2]:8 201003.0 +(void()) print_ln() +(label) print_ln::@1 +(label) print_ln::@2 +(label) print_ln::@return +(byte*) print_screen +(void()) print_str((byte*) print_str::str) +(label) print_str::@1 +(label) print_str::@2 +(label) print_str::@3 +(label) print_str::@return +(byte*) print_str::str +(byte*) print_str::str#0 str zp[2]:17 2000002.0 +(byte*) print_str::str#2 str zp[2]:17 1000001.0 +(void()) print_ulong_decimal((dword) print_ulong_decimal::w) +(label) print_ulong_decimal::@1 +(label) print_ulong_decimal::@return +(dword) print_ulong_decimal::w +(dword) print_ulong_decimal::w#0 w zp[4]:13 1102.0 +(void()) ultoa((dword) ultoa::value , (byte*) ultoa::buffer , (byte) ultoa::radix) +(byte~) ultoa::$11 reg byte a 2000002.0 +(byte~) ultoa::$4 reg byte a 20002.0 +(label) ultoa::@1 +(label) ultoa::@2 +(label) ultoa::@3 +(label) ultoa::@4 +(label) ultoa::@5 +(label) ultoa::@6 +(label) ultoa::@7 +(label) ultoa::@return +(byte*) ultoa::buffer +(byte*) ultoa::buffer#11 buffer zp[2]:17 287143.2857142857 +(byte*) ultoa::buffer#14 buffer zp[2]:17 1500001.5 +(byte*) ultoa::buffer#3 buffer zp[2]:17 20002.0 +(byte*) ultoa::buffer#4 buffer zp[2]:17 2000002.0 +(byte) ultoa::digit +(byte) ultoa::digit#1 digit zp[1]:12 2000002.0 +(byte) ultoa::digit#2 digit zp[1]:12 285714.5714285714 +(dword) ultoa::digit_value +(dword) ultoa::digit_value#0 digit_value zp[4]:19 600000.6000000001 +(dword*) ultoa::digit_values +(byte) ultoa::max_digits +(const byte) ultoa::max_digits#1 max_digits = (byte) $a +(byte) ultoa::radix +(byte) ultoa::started +(byte) ultoa::started#2 reg byte x 500000.5 +(byte) ultoa::started#4 reg byte x 1000001.0 +(dword) ultoa::value +(dword) ultoa::value#0 value zp[4]:13 1000001.0 +(dword) ultoa::value#1 value zp[4]:13 5501.0 +(dword) ultoa::value#2 value zp[4]:13 572857.857142857 +(dword) ultoa::value#6 value zp[4]:13 1500001.5 +(dword()) ultoa_append((byte*) ultoa_append::buffer , (dword) ultoa_append::value , (dword) ultoa_append::sub) +(label) ultoa_append::@1 +(label) ultoa_append::@2 +(label) ultoa_append::@3 +(label) ultoa_append::@return +(byte*) ultoa_append::buffer +(byte*) ultoa_append::buffer#0 buffer zp[2]:17 1375000.25 +(byte) ultoa_append::digit +(byte) ultoa_append::digit#1 reg byte x 1.0000000001E10 +(byte) ultoa_append::digit#2 reg byte x 1.00050000015E10 +(dword) ultoa_append::return +(dword) ultoa_append::return#0 return zp[4]:13 2000002.0 +(dword) ultoa_append::sub +(dword) ultoa_append::sub#0 sub zp[4]:19 3.3335000005E9 +(dword) ultoa_append::value +(dword) ultoa_append::value#0 value zp[4]:13 3666667.333333333 +(dword) ultoa_append::value#1 value zp[4]:13 2.0000000002E10 +(dword) ultoa_append::value#2 value zp[4]:13 5.001833334166666E9 + +zp[4]:2 [ main::i#2 main::i#1 ] +zp[2]:6 [ print_char_cursor#14 print_line_cursor#1 ] +zp[2]:8 [ print_line_cursor#9 print_line_cursor#15 print_line_cursor#25 print_line_cursor#24 ] +zp[2]:10 [ print_char_cursor#17 print_char_cursor#40 print_char_cursor#23 ] +zp[1]:12 [ ultoa::digit#2 ultoa::digit#1 ] +zp[4]:13 [ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 print_ulong_decimal::w#0 ultoa_append::return#0 main::$11 main::$9 main::$10 main::$5 main::$6 main::$7 main::$8 ] +reg byte x [ ultoa::started#2 ultoa::started#4 ] +reg byte x [ ultoa_append::digit#2 ultoa_append::digit#1 ] +zp[2]:17 [ memset::dst#2 memset::dst#1 ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ultoa::buffer#3 ultoa_append::buffer#0 print_str::str#2 print_str::str#0 ] +reg byte a [ print_char::ch#0 ] +reg byte a [ ultoa::$4 ] +reg byte a [ ultoa::$11 ] +zp[4]:19 [ ultoa::digit_value#0 ultoa_append::sub#0 ] + + +FINAL ASSEMBLER +Score: 115473 + + // File Comments + // Upstart +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" + // Global Constants & labels + .label print_line_cursor = 6 + .label print_char_cursor = 6 + .label print_char_cursor_1 = $a + .label print_line_cursor_1 = 8 + // @begin + // [1] phi from @begin to @1 [phi:@begin->@1] + // @1 + // [2] call main + // [4] phi from @1 to main [phi:@1->main] + // [3] phi from @1 to @end [phi:@1->@end] + // @end + // main +main: { + .label i = 2 + .label __5 = $d + .label __6 = $d + .label __7 = $d + .label __8 = $d + .label __9 = $d + .label __10 = $d + .label __11 = $d + // print_cls() + // [5] call print_cls + // [71] phi from main to print_cls [phi:main->print_cls] + jsr print_cls + // [6] phi from main to main::@1 [phi:main->main::@1] + // [6] phi (byte*) print_char_cursor#14 = (byte*) 1024 [phi:main->main::@1#0] -- pbuz1=pbuc1 + lda #<$400 + sta.z print_char_cursor + lda #>$400 + sta.z print_char_cursor+1 + // [6] phi (byte*) print_line_cursor#15 = (byte*) 1024 [phi:main->main::@1#1] -- pbuz1=pbuc1 + lda #<$400 + sta.z print_line_cursor_1 + lda #>$400 + sta.z print_line_cursor_1+1 + // [6] phi (dword) main::i#2 = (dword) 0 [phi:main->main::@1#2] -- vduz1=vduc1 + lda #<0 + sta.z i + sta.z i+1 + lda #<0>>$10 + sta.z i+2 + lda #>0>>$10 + sta.z i+3 + // main::@1 + __b1: + // for(unsigned long i=0;i<3330;i+=333) + // [7] if((dword) main::i#2<(word) $d02) goto main::@2 -- vduz1_lt_vduc1_then_la1 + lda.z i+3 + cmp #>$d02>>$10 + bcc __b2 + bne !+ + lda.z i+2 + cmp #<$d02>>$10 + bcc __b2 + bne !+ + lda.z i+1 + cmp #>$d02 + bcc __b2 + bne !+ + lda.z i + cmp #<$d02 + bcc __b2 + !: + // main::@return + // } + // [8] return + rts + // main::@2 + __b2: + // print_ulong_decimal(i*555) + // [9] (dword~) main::$5 ← (dword) main::i#2 << (byte) 4 -- vduz1=vduz2_rol_4 + lda.z i + asl + sta.z __5 + lda.z i+1 + rol + sta.z __5+1 + lda.z i+2 + rol + sta.z __5+2 + lda.z i+3 + rol + sta.z __5+3 + asl.z __5 + rol.z __5+1 + rol.z __5+2 + rol.z __5+3 + asl.z __5 + rol.z __5+1 + rol.z __5+2 + rol.z __5+3 + asl.z __5 + rol.z __5+1 + rol.z __5+2 + rol.z __5+3 + // [10] (dword~) main::$6 ← (dword~) main::$5 + (dword) main::i#2 -- vduz1=vduz1_plus_vduz2 + lda.z __6 + clc + adc.z i + sta.z __6 + lda.z __6+1 + adc.z i+1 + sta.z __6+1 + lda.z __6+2 + adc.z i+2 + sta.z __6+2 + lda.z __6+3 + adc.z i+3 + sta.z __6+3 + // [11] (dword~) main::$7 ← (dword~) main::$6 << (byte) 2 -- vduz1=vduz1_rol_2 + asl.z __7 + rol.z __7+1 + rol.z __7+2 + rol.z __7+3 + asl.z __7 + rol.z __7+1 + rol.z __7+2 + rol.z __7+3 + // [12] (dword~) main::$8 ← (dword~) main::$7 + (dword) main::i#2 -- vduz1=vduz1_plus_vduz2 + lda.z __8 + clc + adc.z i + sta.z __8 + lda.z __8+1 + adc.z i+1 + sta.z __8+1 + lda.z __8+2 + adc.z i+2 + sta.z __8+2 + lda.z __8+3 + adc.z i+3 + sta.z __8+3 + // [13] (dword~) main::$9 ← (dword~) main::$8 << (byte) 2 -- vduz1=vduz1_rol_2 + asl.z __9 + rol.z __9+1 + rol.z __9+2 + rol.z __9+3 + asl.z __9 + rol.z __9+1 + rol.z __9+2 + rol.z __9+3 + // [14] (dword~) main::$10 ← (dword~) main::$9 + (dword) main::i#2 -- vduz1=vduz1_plus_vduz2 + lda.z __10 + clc + adc.z i + sta.z __10 + lda.z __10+1 + adc.z i+1 + sta.z __10+1 + lda.z __10+2 + adc.z i+2 + sta.z __10+2 + lda.z __10+3 + adc.z i+3 + sta.z __10+3 + // [15] (dword~) main::$11 ← (dword~) main::$10 << (byte) 1 -- vduz1=vduz1_rol_1 + asl.z __11 + rol.z __11+1 + rol.z __11+2 + rol.z __11+3 + // [16] (dword) print_ulong_decimal::w#0 ← (dword~) main::$11 + (dword) main::i#2 -- vduz1=vduz1_plus_vduz2 + lda.z print_ulong_decimal.w + clc + adc.z i + sta.z print_ulong_decimal.w + lda.z print_ulong_decimal.w+1 + adc.z i+1 + sta.z print_ulong_decimal.w+1 + lda.z print_ulong_decimal.w+2 + adc.z i+2 + sta.z print_ulong_decimal.w+2 + lda.z print_ulong_decimal.w+3 + adc.z i+3 + sta.z print_ulong_decimal.w+3 + // [17] call print_ulong_decimal + jsr print_ulong_decimal + // [18] phi from main::@2 to main::@3 [phi:main::@2->main::@3] + // main::@3 + // print_ln() + // [19] call print_ln + // [22] phi from main::@3 to print_ln [phi:main::@3->print_ln] + jsr print_ln + // main::@4 + // i+=333 + // [20] (dword) main::i#1 ← (dword) main::i#2 + (word) $14d -- vduz1=vduz1_plus_vwuc1 + lda.z i + clc + adc #<$14d + sta.z i + lda.z i+1 + adc #>$14d + sta.z i+1 + lda.z i+2 + adc #0 + sta.z i+2 + lda.z i+3 + adc #0 + sta.z i+3 + // [21] (byte*) print_line_cursor#25 ← (byte*) print_line_cursor#1 -- pbuz1=pbuz2 + lda.z print_line_cursor + sta.z print_line_cursor_1 + lda.z print_line_cursor+1 + sta.z print_line_cursor_1+1 + // [6] phi from main::@4 to main::@1 [phi:main::@4->main::@1] + // [6] phi (byte*) print_char_cursor#14 = (byte*) print_line_cursor#1 [phi:main::@4->main::@1#0] -- register_copy + // [6] phi (byte*) print_line_cursor#15 = (byte*) print_line_cursor#25 [phi:main::@4->main::@1#1] -- register_copy + // [6] phi (dword) main::i#2 = (dword) main::i#1 [phi:main::@4->main::@1#2] -- register_copy + jmp __b1 +} + // print_ln +// Print a newline +print_ln: { + // [23] phi from print_ln print_ln::@2 to print_ln::@1 [phi:print_ln/print_ln::@2->print_ln::@1] + // [23] phi (byte*) print_line_cursor#9 = (byte*) print_line_cursor#15 [phi:print_ln/print_ln::@2->print_ln::@1#0] -- register_copy + // print_ln::@1 + __b1: + // print_line_cursor + $28 + // [24] (byte*) print_line_cursor#1 ← (byte*) print_line_cursor#9 + (byte) $28 -- pbuz1=pbuz2_plus_vbuc1 + lda #$28 + clc + adc.z print_line_cursor_1 + sta.z print_line_cursor + lda #0 + adc.z print_line_cursor_1+1 + sta.z print_line_cursor+1 + // while (print_line_cursorultoa] + jsr ultoa + // [30] phi from print_ulong_decimal to print_ulong_decimal::@1 [phi:print_ulong_decimal->print_ulong_decimal::@1] + // print_ulong_decimal::@1 + // print_str(decimal_digits_long) + // [31] call print_str + jsr print_str + // print_ulong_decimal::@return + // } + // [32] return + rts +} + // print_str +// Print a zero-terminated string +// print_str(byte* zp($11) str) +print_str: { + .label str = $11 + // [33] (byte*) print_char_cursor#40 ← (byte*) print_char_cursor#14 -- pbuz1=pbuz2 + lda.z print_char_cursor + sta.z print_char_cursor_1 + lda.z print_char_cursor+1 + sta.z print_char_cursor_1+1 + // [34] phi from print_str to print_str::@1 [phi:print_str->print_str::@1] + // [34] phi (byte*) print_char_cursor#17 = (byte*) print_char_cursor#40 [phi:print_str->print_str::@1#0] -- register_copy + // [34] phi (byte*) print_str::str#2 = (const byte*) decimal_digits_long [phi:print_str->print_str::@1#1] -- pbuz1=pbuc1 + lda #decimal_digits_long + sta.z str+1 + // print_str::@1 + __b1: + // while(*str) + // [35] if((byte) 0!=*((byte*) print_str::str#2)) goto print_str::@2 -- vbuc1_neq__deref_pbuz1_then_la1 + ldy #0 + lda (str),y + cmp #0 + bne __b2 + // print_str::@return + // } + // [36] return + rts + // print_str::@2 + __b2: + // print_char(*(str++)) + // [37] (byte) print_char::ch#0 ← *((byte*) print_str::str#2) -- vbuaa=_deref_pbuz1 + ldy #0 + lda (str),y + // [38] call print_char + jsr print_char + // print_str::@3 + // print_char(*(str++)); + // [39] (byte*) print_str::str#0 ← ++ (byte*) print_str::str#2 -- pbuz1=_inc_pbuz1 + inc.z str + bne !+ + inc.z str+1 + !: + // [34] phi from print_str::@3 to print_str::@1 [phi:print_str::@3->print_str::@1] + // [34] phi (byte*) print_char_cursor#17 = (byte*) print_char_cursor#23 [phi:print_str::@3->print_str::@1#0] -- register_copy + // [34] phi (byte*) print_str::str#2 = (byte*) print_str::str#0 [phi:print_str::@3->print_str::@1#1] -- register_copy + jmp __b1 +} + // print_char +// Print a single char +// print_char(byte register(A) ch) +print_char: { + // *(print_char_cursor++) = ch + // [40] *((byte*) print_char_cursor#17) ← (byte) print_char::ch#0 -- _deref_pbuz1=vbuaa + ldy #0 + sta (print_char_cursor_1),y + // *(print_char_cursor++) = ch; + // [41] (byte*) print_char_cursor#23 ← ++ (byte*) print_char_cursor#17 -- pbuz1=_inc_pbuz1 + inc.z print_char_cursor_1 + bne !+ + inc.z print_char_cursor_1+1 + !: + // print_char::@return + // } + // [42] return + rts +} + // ultoa +// Converts unsigned number value to a string representing it in RADIX format. +// If the leading digits are zero they are not included in the string. +// - value : The number to be converted to RADIX +// - buffer : receives the string representing the number and zero-termination. +// - radix : The radix to convert the number to (from the enum RADIX) +// ultoa(dword zp($d) value, byte* zp($11) buffer) +ultoa: { + .const max_digits = $a + .label digit_value = $13 + .label buffer = $11 + .label digit = $c + .label value = $d + // [44] phi from ultoa to ultoa::@1 [phi:ultoa->ultoa::@1] + // [44] phi (byte*) ultoa::buffer#11 = (const byte*) decimal_digits_long [phi:ultoa->ultoa::@1#0] -- pbuz1=pbuc1 + lda #decimal_digits_long + sta.z buffer+1 + // [44] phi (byte) ultoa::started#2 = (byte) 0 [phi:ultoa->ultoa::@1#1] -- vbuxx=vbuc1 + ldx #0 + // [44] phi (dword) ultoa::value#2 = (dword) ultoa::value#1 [phi:ultoa->ultoa::@1#2] -- register_copy + // [44] phi (byte) ultoa::digit#2 = (byte) 0 [phi:ultoa->ultoa::@1#3] -- vbuz1=vbuc1 + txa + sta.z digit + // ultoa::@1 + __b1: + // for( char digit=0; digit= digit_value) + // [53] if((byte) 0!=(byte) ultoa::started#2) goto ultoa::@5 -- vbuc1_neq_vbuxx_then_la1 + cpx #0 + bne __b5 + // ultoa::@7 + // [54] if((dword) ultoa::value#2>=(dword) ultoa::digit_value#0) goto ultoa::@5 -- vduz1_ge_vduz2_then_la1 + lda.z value+3 + cmp.z digit_value+3 + bcc !+ + bne __b5 + lda.z value+2 + cmp.z digit_value+2 + bcc !+ + bne __b5 + lda.z value+1 + cmp.z digit_value+1 + bcc !+ + bne __b5 + lda.z value + cmp.z digit_value + bcs __b5 + !: + // [55] phi from ultoa::@7 to ultoa::@4 [phi:ultoa::@7->ultoa::@4] + // [55] phi (byte*) ultoa::buffer#14 = (byte*) ultoa::buffer#11 [phi:ultoa::@7->ultoa::@4#0] -- register_copy + // [55] phi (byte) ultoa::started#4 = (byte) ultoa::started#2 [phi:ultoa::@7->ultoa::@4#1] -- register_copy + // [55] phi (dword) ultoa::value#6 = (dword) ultoa::value#2 [phi:ultoa::@7->ultoa::@4#2] -- register_copy + // ultoa::@4 + __b4: + // for( char digit=0; digitultoa::@1] + // [44] phi (byte*) ultoa::buffer#11 = (byte*) ultoa::buffer#14 [phi:ultoa::@4->ultoa::@1#0] -- register_copy + // [44] phi (byte) ultoa::started#2 = (byte) ultoa::started#4 [phi:ultoa::@4->ultoa::@1#1] -- register_copy + // [44] phi (dword) ultoa::value#2 = (dword) ultoa::value#6 [phi:ultoa::@4->ultoa::@1#2] -- register_copy + // [44] phi (byte) ultoa::digit#2 = (byte) ultoa::digit#1 [phi:ultoa::@4->ultoa::@1#3] -- register_copy + jmp __b1 + // ultoa::@5 + __b5: + // ultoa_append(buffer++, value, digit_value) + // [57] (byte*) ultoa_append::buffer#0 ← (byte*) ultoa::buffer#11 + // [58] (dword) ultoa_append::value#0 ← (dword) ultoa::value#2 + // [59] (dword) ultoa_append::sub#0 ← (dword) ultoa::digit_value#0 + // [60] call ultoa_append + // [64] phi from ultoa::@5 to ultoa_append [phi:ultoa::@5->ultoa_append] + jsr ultoa_append + // ultoa_append(buffer++, value, digit_value) + // [61] (dword) ultoa_append::return#0 ← (dword) ultoa_append::value#2 + // ultoa::@6 + // value = ultoa_append(buffer++, value, digit_value) + // [62] (dword) ultoa::value#0 ← (dword) ultoa_append::return#0 + // value = ultoa_append(buffer++, value, digit_value); + // [63] (byte*) ultoa::buffer#4 ← ++ (byte*) ultoa::buffer#11 -- pbuz1=_inc_pbuz1 + inc.z buffer + bne !+ + inc.z buffer+1 + !: + // [55] phi from ultoa::@6 to ultoa::@4 [phi:ultoa::@6->ultoa::@4] + // [55] phi (byte*) ultoa::buffer#14 = (byte*) ultoa::buffer#4 [phi:ultoa::@6->ultoa::@4#0] -- register_copy + // [55] phi (byte) ultoa::started#4 = (byte) 1 [phi:ultoa::@6->ultoa::@4#1] -- vbuxx=vbuc1 + ldx #1 + // [55] phi (dword) ultoa::value#6 = (dword) ultoa::value#0 [phi:ultoa::@6->ultoa::@4#2] -- register_copy + jmp __b4 +} + // ultoa_append +// Used to convert a single digit of an unsigned number value to a string representation +// Counts a single digit up from '0' as long as the value is larger than sub. +// Each time the digit is increased sub is subtracted from value. +// - buffer : pointer to the char that receives the digit +// - value : The value where the digit will be derived from +// - sub : the value of a '1' in the digit. Subtracted continually while the digit is increased. +// (For decimal the subs used are 10000, 1000, 100, 10, 1) +// returns : the value reduced by sub * digit so that it is less than sub. +// ultoa_append(byte* zp($11) buffer, dword zp($d) value, dword zp($13) sub) +ultoa_append: { + .label buffer = $11 + .label value = $d + .label sub = $13 + .label return = $d + // [65] phi from ultoa_append to ultoa_append::@1 [phi:ultoa_append->ultoa_append::@1] + // [65] phi (byte) ultoa_append::digit#2 = (byte) 0 [phi:ultoa_append->ultoa_append::@1#0] -- vbuxx=vbuc1 + ldx #0 + // [65] phi (dword) ultoa_append::value#2 = (dword) ultoa_append::value#0 [phi:ultoa_append->ultoa_append::@1#1] -- register_copy + // ultoa_append::@1 + __b1: + // while (value >= sub) + // [66] if((dword) ultoa_append::value#2>=(dword) ultoa_append::sub#0) goto ultoa_append::@2 -- vduz1_ge_vduz2_then_la1 + lda.z value+3 + cmp.z sub+3 + bcc !+ + bne __b2 + lda.z value+2 + cmp.z sub+2 + bcc !+ + bne __b2 + lda.z value+1 + cmp.z sub+1 + bcc !+ + bne __b2 + lda.z value + cmp.z sub + bcs __b2 + !: + // ultoa_append::@3 + // *buffer = DIGITS[digit] + // [67] *((byte*) ultoa_append::buffer#0) ← *((const byte*) DIGITS + (byte) ultoa_append::digit#2) -- _deref_pbuz1=pbuc1_derefidx_vbuxx + lda DIGITS,x + ldy #0 + sta (buffer),y + // ultoa_append::@return + // } + // [68] return + rts + // ultoa_append::@2 + __b2: + // digit++; + // [69] (byte) ultoa_append::digit#1 ← ++ (byte) ultoa_append::digit#2 -- vbuxx=_inc_vbuxx + inx + // value -= sub + // [70] (dword) ultoa_append::value#1 ← (dword) ultoa_append::value#2 - (dword) ultoa_append::sub#0 -- vduz1=vduz1_minus_vduz2 + lda.z value + sec + sbc.z sub + sta.z value + lda.z value+1 + sbc.z sub+1 + sta.z value+1 + lda.z value+2 + sbc.z sub+2 + sta.z value+2 + lda.z value+3 + sbc.z sub+3 + sta.z value+3 + // [65] phi from ultoa_append::@2 to ultoa_append::@1 [phi:ultoa_append::@2->ultoa_append::@1] + // [65] phi (byte) ultoa_append::digit#2 = (byte) ultoa_append::digit#1 [phi:ultoa_append::@2->ultoa_append::@1#0] -- register_copy + // [65] phi (dword) ultoa_append::value#2 = (dword) ultoa_append::value#1 [phi:ultoa_append::@2->ultoa_append::@1#1] -- register_copy + jmp __b1 +} + // print_cls +// Clear the screen. Also resets current line/char cursor. +print_cls: { + // memset(print_screen, ' ', 1000) + // [72] call memset + // [74] phi from print_cls to memset [phi:print_cls->memset] + jsr memset + // print_cls::@return + // } + // [73] return + rts +} + // memset +// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str. +memset: { + .const c = ' ' + .const num = $3e8 + .label str = $400 + .label end = str+num + .label dst = $11 + // [75] phi from memset to memset::@1 [phi:memset->memset::@1] + // [75] phi (byte*) memset::dst#2 = (byte*)(const void*) memset::str#0 [phi:memset->memset::@1#0] -- pbuz1=pbuc1 + lda #str + sta.z dst+1 + // memset::@1 + __b1: + // for(char* dst = str; dst!=end; dst++) + // [76] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2 -- pbuz1_neq_pbuc1_then_la1 + lda.z dst+1 + cmp #>end + bne __b2 + lda.z dst + cmp #memset::@1] + // [75] phi (byte*) memset::dst#2 = (byte*) memset::dst#1 [phi:memset::@2->memset::@1#0] -- register_copy + jmp __b1 +} + // File Data + // The digits used for numbers + DIGITS: .text "0123456789abcdef" + // Values of decimal digits + RADIX_DECIMAL_VALUES_LONG: .dword $3b9aca00, $5f5e100, $989680, $f4240, $186a0, $2710, $3e8, $64, $a + // Digits used for storing the decimal unsigned int + decimal_digits_long: .fill $b, 0 + diff --git a/src/test/ref/multiply-16bit-const.sym b/src/test/ref/multiply-16bit-const.sym new file mode 100644 index 000000000..6e02848a7 --- /dev/null +++ b/src/test/ref/multiply-16bit-const.sym @@ -0,0 +1,142 @@ +(label) @1 +(label) @begin +(label) @end +(const byte*) DIGITS[] = (byte*) "0123456789abcdef"z +(const byte) RADIX::BINARY = (number) 2 +(const byte) RADIX::DECIMAL = (number) $a +(const byte) RADIX::HEXADECIMAL = (number) $10 +(const byte) RADIX::OCTAL = (number) 8 +(const dword*) RADIX_DECIMAL_VALUES_LONG[] = { (dword) $3b9aca00, (dword) $5f5e100, (dword) $989680, (dword) $f4240, (dword) $186a0, (dword) $2710, (dword) $3e8, (dword) $64, (dword) $a } +(const byte*) decimal_digits_long[(number) $b] = { fill( $b, 0) } +(void()) main() +(dword~) main::$10 zp[4]:13 202.0 +(dword~) main::$11 zp[4]:13 202.0 +(dword~) main::$5 zp[4]:13 202.0 +(dword~) main::$6 zp[4]:13 202.0 +(dword~) main::$7 zp[4]:13 202.0 +(dword~) main::$8 zp[4]:13 202.0 +(dword~) main::$9 zp[4]:13 202.0 +(label) main::@1 +(label) main::@2 +(label) main::@3 +(label) main::@4 +(label) main::@return +(dword) main::i +(dword) main::i#1 i zp[4]:2 101.0 +(dword) main::i#2 i zp[4]:2 62.153846153846146 +(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) +(label) memset::@1 +(label) memset::@2 +(label) memset::@return +(byte) memset::c +(const byte) memset::c#0 c = (byte) ' ' +(byte*) memset::dst +(byte*) memset::dst#1 dst zp[2]:17 20002.0 +(byte*) memset::dst#2 dst zp[2]:17 13334.666666666666 +(byte*) memset::end +(const byte*) memset::end#0 end = (byte*)(const void*) memset::str#0+(const word) memset::num#0 +(word) memset::num +(const word) memset::num#0 num = (word) $3e8 +(void*) memset::return +(void*) memset::str +(const void*) memset::str#0 str = (void*)(byte*) 1024 +(void()) print_char((byte) print_char::ch) +(label) print_char::@return +(byte) print_char::ch +(byte) print_char::ch#0 reg byte a 1.1000002E7 +(byte*) print_char_cursor +(byte*) print_char_cursor#14 print_char_cursor zp[2]:6 777.076923076923 +(byte*) print_char_cursor#17 print_char_cursor_1 zp[2]:10 1507857.5 +(byte*) print_char_cursor#23 print_char_cursor_1 zp[2]:10 2750000.5 +(byte*) print_char_cursor#40 print_char_cursor_1 zp[2]:10 20002.0 +(void()) print_cls() +(label) print_cls::@return +(byte*) print_line_cursor +(byte*) print_line_cursor#1 print_line_cursor zp[2]:6 50034.16666666666 +(byte*) print_line_cursor#15 print_line_cursor_1 zp[2]:8 84.76923076923077 +(byte*) print_line_cursor#24 print_line_cursor_1 zp[2]:8 200002.0 +(byte*) print_line_cursor#25 print_line_cursor_1 zp[2]:8 202.0 +(byte*) print_line_cursor#9 print_line_cursor_1 zp[2]:8 201003.0 +(void()) print_ln() +(label) print_ln::@1 +(label) print_ln::@2 +(label) print_ln::@return +(byte*) print_screen +(void()) print_str((byte*) print_str::str) +(label) print_str::@1 +(label) print_str::@2 +(label) print_str::@3 +(label) print_str::@return +(byte*) print_str::str +(byte*) print_str::str#0 str zp[2]:17 2000002.0 +(byte*) print_str::str#2 str zp[2]:17 1000001.0 +(void()) print_ulong_decimal((dword) print_ulong_decimal::w) +(label) print_ulong_decimal::@1 +(label) print_ulong_decimal::@return +(dword) print_ulong_decimal::w +(dword) print_ulong_decimal::w#0 w zp[4]:13 1102.0 +(void()) ultoa((dword) ultoa::value , (byte*) ultoa::buffer , (byte) ultoa::radix) +(byte~) ultoa::$11 reg byte a 2000002.0 +(byte~) ultoa::$4 reg byte a 20002.0 +(label) ultoa::@1 +(label) ultoa::@2 +(label) ultoa::@3 +(label) ultoa::@4 +(label) ultoa::@5 +(label) ultoa::@6 +(label) ultoa::@7 +(label) ultoa::@return +(byte*) ultoa::buffer +(byte*) ultoa::buffer#11 buffer zp[2]:17 287143.2857142857 +(byte*) ultoa::buffer#14 buffer zp[2]:17 1500001.5 +(byte*) ultoa::buffer#3 buffer zp[2]:17 20002.0 +(byte*) ultoa::buffer#4 buffer zp[2]:17 2000002.0 +(byte) ultoa::digit +(byte) ultoa::digit#1 digit zp[1]:12 2000002.0 +(byte) ultoa::digit#2 digit zp[1]:12 285714.5714285714 +(dword) ultoa::digit_value +(dword) ultoa::digit_value#0 digit_value zp[4]:19 600000.6000000001 +(dword*) ultoa::digit_values +(byte) ultoa::max_digits +(const byte) ultoa::max_digits#1 max_digits = (byte) $a +(byte) ultoa::radix +(byte) ultoa::started +(byte) ultoa::started#2 reg byte x 500000.5 +(byte) ultoa::started#4 reg byte x 1000001.0 +(dword) ultoa::value +(dword) ultoa::value#0 value zp[4]:13 1000001.0 +(dword) ultoa::value#1 value zp[4]:13 5501.0 +(dword) ultoa::value#2 value zp[4]:13 572857.857142857 +(dword) ultoa::value#6 value zp[4]:13 1500001.5 +(dword()) ultoa_append((byte*) ultoa_append::buffer , (dword) ultoa_append::value , (dword) ultoa_append::sub) +(label) ultoa_append::@1 +(label) ultoa_append::@2 +(label) ultoa_append::@3 +(label) ultoa_append::@return +(byte*) ultoa_append::buffer +(byte*) ultoa_append::buffer#0 buffer zp[2]:17 1375000.25 +(byte) ultoa_append::digit +(byte) ultoa_append::digit#1 reg byte x 1.0000000001E10 +(byte) ultoa_append::digit#2 reg byte x 1.00050000015E10 +(dword) ultoa_append::return +(dword) ultoa_append::return#0 return zp[4]:13 2000002.0 +(dword) ultoa_append::sub +(dword) ultoa_append::sub#0 sub zp[4]:19 3.3335000005E9 +(dword) ultoa_append::value +(dword) ultoa_append::value#0 value zp[4]:13 3666667.333333333 +(dword) ultoa_append::value#1 value zp[4]:13 2.0000000002E10 +(dword) ultoa_append::value#2 value zp[4]:13 5.001833334166666E9 + +zp[4]:2 [ main::i#2 main::i#1 ] +zp[2]:6 [ print_char_cursor#14 print_line_cursor#1 ] +zp[2]:8 [ print_line_cursor#9 print_line_cursor#15 print_line_cursor#25 print_line_cursor#24 ] +zp[2]:10 [ print_char_cursor#17 print_char_cursor#40 print_char_cursor#23 ] +zp[1]:12 [ ultoa::digit#2 ultoa::digit#1 ] +zp[4]:13 [ ultoa::value#2 ultoa::value#6 ultoa::value#1 ultoa::value#0 ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 print_ulong_decimal::w#0 ultoa_append::return#0 main::$11 main::$9 main::$10 main::$5 main::$6 main::$7 main::$8 ] +reg byte x [ ultoa::started#2 ultoa::started#4 ] +reg byte x [ ultoa_append::digit#2 ultoa_append::digit#1 ] +zp[2]:17 [ memset::dst#2 memset::dst#1 ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ultoa::buffer#3 ultoa_append::buffer#0 print_str::str#2 print_str::str#0 ] +reg byte a [ print_char::ch#0 ] +reg byte a [ ultoa::$4 ] +reg byte a [ ultoa::$11 ] +zp[4]:19 [ ultoa::digit_value#0 ultoa_append::sub#0 ]