1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-04-11 20:37:40 +00:00

Added printf() support for newlines, %% and %c. Added tests for different formats.

This commit is contained in:
jespergravgaard 2020-04-21 08:41:52 +02:00
parent d7143771ba
commit f6ee599d79
15 changed files with 34031 additions and 23 deletions

@ -6,6 +6,7 @@ import dk.camelot64.kickc.model.ControlFlowBlock;
import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.statements.Statement;
import dk.camelot64.kickc.model.statements.StatementCall;
import dk.camelot64.kickc.model.symbols.Procedure;
import dk.camelot64.kickc.model.types.SymbolType;
import dk.camelot64.kickc.model.values.*;
@ -22,10 +23,14 @@ public class Pass1PrintfIntrinsicRewrite extends Pass2SsaOptimization {
/** The printf procedure name. */
public static final String INTRINSIC_PRINTF_NAME = "printf";
/** The printf routine used to print a raw char */
public static final String PRINTF_CHAR = "printf_char";
/** The printf routine used to print a raw string */
public static final String PRINTF_STR = "printf_str";
/** The printf routine used to print formatted strings. */
public static final String PRINTF_STRING = "printf_string";
/** The printf routine used to print signed chars. */
public static final String PRINTF_SCHAR = "printf_schar";
public static final String PRINTF_SCHAR = "printf_schar";
/** The printf routine used to print unsigned chars. */
public static final String PRINTF_UCHAR = "printf_uchar";
/** The printf routine used to print signed integers. */
@ -36,8 +41,11 @@ public class Pass1PrintfIntrinsicRewrite extends Pass2SsaOptimization {
public static final String PRINTF_SLONG = "printf_slong";
/** The printf routine used to print unsigned long integers. */
public static final String PRINTF_ULONG = "printf_ulong";
public static final String DECIMAL = "DECIMAL";
/** Hexadecimal Radix name. */
public static final String HEXADECIMAL = "HEXADECIMAL";
/** Decimal Radix name. */
public static final String DECIMAL = "DECIMAL";
/** Octal Radix name. */
public static final String OCTAL = "OCTAL";
public Pass1PrintfIntrinsicRewrite(Program program) {
@ -100,10 +108,12 @@ public class Pass1PrintfIntrinsicRewrite extends Pass2SsaOptimization {
// First output the non-matching part before the pattern
String prefix = formatString.substring(formatIdx, start);
printfConstantString(prefix, printfCall, stmtIt, formatEncoding);
addPrintfCall(PRINTF_STR, Arrays.asList(new ConstantString(prefix, formatEncoding, true)), stmtIt, printfCall);
formatIdx = end;
if(typeField.equals("s")) {
if(typeField.equals("%")) {
addPrintfCall(PRINTF_CHAR, Arrays.asList(new ConstantChar('%', formatEncoding)), stmtIt, printfCall);
} else if(typeField.equals("s")) {
// A formatted string
//struct printf_format_string {
// char min_length; // The minimal number of chars to output (used for padding with spaces or 0).
@ -114,9 +124,7 @@ public class Pass1PrintfIntrinsicRewrite extends Pass2SsaOptimization {
new ConstantInteger(width, SymbolType.BYTE),
new ConstantInteger(leftJustify, SymbolType.BYTE)
));
final StatementCall call_printf_str = new StatementCall(null, PRINTF_STRING, Arrays.asList(parameters.get(paramIdx), format_string_struct), printfCall.getSource(), Comment.NO_COMMENTS);
call_printf_str.setProcedure(getScope().getLocalProcedure(call_printf_str.getProcedureName()).getRef());
stmtIt.add(call_printf_str);
addPrintfCall(PRINTF_STRING, Arrays.asList(parameters.get(paramIdx), format_string_struct), stmtIt, printfCall);
paramIdx++;
} else if("diuxXo".contains(typeField)) {
// A formatted integer
@ -177,15 +185,29 @@ public class Pass1PrintfIntrinsicRewrite extends Pass2SsaOptimization {
new ConstantInteger(zeroPadding, SymbolType.BYTE),
radix
));
final StatementCall call_printf_str = new StatementCall(null, printf_number_procedure, Arrays.asList(parameters.get(paramIdx), format_number_struct), printfCall.getSource(), Comment.NO_COMMENTS);
call_printf_str.setProcedure(getScope().getLocalProcedure(call_printf_str.getProcedureName()).getRef());
stmtIt.add(call_printf_str);
addPrintfCall(printf_number_procedure, Arrays.asList(parameters.get(paramIdx), format_number_struct), stmtIt, printfCall);
paramIdx++;
} else if(typeField.equals("c")) {
// Print char
addPrintfCall(PRINTF_CHAR, Arrays.asList(parameters.get(paramIdx)), stmtIt, printfCall);
paramIdx++;
} else if(typeField.equals("p")) {
// Print a pointer
final ValueList format_number_struct =
new ValueList(Arrays.asList(
new ConstantInteger(width, SymbolType.BYTE),
new ConstantInteger(leftJustify, SymbolType.BYTE),
new ConstantInteger(signAlways, SymbolType.BYTE),
new ConstantInteger(zeroPadding, SymbolType.BYTE),
getScope().getLocalConstant(HEXADECIMAL).getRef()
));
addPrintfCall(PRINTF_UINT, Arrays.asList(new CastValue(SymbolType.WORD, parameters.get(paramIdx)), format_number_struct), stmtIt, printfCall);
paramIdx++;
}
}
// Grab the rest
String suffix = formatString.substring(formatIdx);
printfConstantString(suffix, printfCall, stmtIt, formatEncoding);
addPrintfCall(PRINTF_STR, Arrays.asList(new ConstantString(suffix, formatEncoding, true)), stmtIt, printfCall);
}
}
}
@ -193,17 +215,20 @@ public class Pass1PrintfIntrinsicRewrite extends Pass2SsaOptimization {
}
/**
* Add a printf_str() that prints a constant string.
*
* @param prefix The string to print
* @param printfCall The original printf call
* Adds a call to a PRINTF sub-function.
* @param printfProcedureName The name of ths sub-function to call
* @param printfProcedureParameters The parameters to pass
* @param stmtIt The statement iterator to add to
* @param encoding The string encoding
* @param printfCall The original printf call statement
*/
private void printfConstantString(String prefix, StatementCall printfCall, ListIterator<Statement> stmtIt, StringEncoding encoding) {
final StatementCall call_printf_str = new StatementCall(null, "printf_str", Arrays.asList(new ConstantString(prefix, encoding, true)), printfCall.getSource(), Comment.NO_COMMENTS);
call_printf_str.setProcedure(getScope().getLocalProcedure(call_printf_str.getProcedureName()).getRef());
stmtIt.add(call_printf_str);
private void addPrintfCall(String printfProcedureName, List<RValue> printfProcedureParameters, ListIterator<Statement> stmtIt, StatementCall printfCall) {
final StatementCall call_printf_str_prefix = new StatementCall(null, printfProcedureName, printfProcedureParameters, printfCall.getSource(), Comment.NO_COMMENTS);
final Procedure printfProcedure = getScope().getLocalProcedure(call_printf_str_prefix.getProcedureName());
if(printfProcedure==null) {
throw new CompileError("Needed printf sub-procedure not found " + printfProcedureName+"().", printfCall.getSource());
}
call_printf_str_prefix.setProcedure(printfProcedure.getRef());
stmtIt.add(call_printf_str_prefix);
}

@ -3,6 +3,11 @@
#include <stdlib.h>
// Print a formatted string.
// https://en.wikipedia.org/wiki/Printf_format_string
// This implementation supports decimal, octal and hexadecimal radix. It supports min length, left/right justify, zero-padding and always-sign.
__intrinsic void printf(char* format, ...);
// Clear the screen. Also places cursor at the top left.
void printf_cls();

@ -13,6 +13,11 @@ __ma char* printf_char_cursor = PRINTF_SCREEN_ADDRESS;
// Buffer used for stringified number being printed
struct printf_buffer_number printf_buffer;
// Print a formatted string.
// https://en.wikipedia.org/wiki/Printf_format_string
// This implementation supports decimal, octal and hexadecimal radix. It supports min length, left/right justify, zero-padding and always-sign.
__intrinsic void printf(char* format, ...);
// Clear the screen. Also resets current line/char cursor.
void printf_cls() {
memset(printf_screen, ' ', PRINTF_SCREEN_BYTES);
@ -24,7 +29,8 @@ void printf_cls() {
// If the end of the screen is reached scroll it up one char and place the cursor at the
void printf_char(char ch) {
*(printf_char_cursor++) = ch;
if(printf_char_cursor==printf_screen+PRINTF_SCREEN_BYTES) {
// Scroll the screen if the cursor has moved past the end of the screen
if(printf_char_cursor>=(printf_screen+PRINTF_SCREEN_BYTES)) {
memcpy(printf_screen, printf_screen+PRINTF_SCREEN_WIDTH, PRINTF_SCREEN_BYTES-PRINTF_SCREEN_WIDTH);
memset(printf_screen+PRINTF_SCREEN_BYTES-PRINTF_SCREEN_WIDTH, ' ', PRINTF_SCREEN_WIDTH);
printf_char_cursor = printf_char_cursor-PRINTF_SCREEN_WIDTH;
@ -47,9 +53,15 @@ void printf_padding(char pad, char length) {
}
// Print a zero-terminated string
// Handles escape codes such as newline
void printf_str(char* str) {
while(*str) {
printf_char(*str++);
while(true) {
char ch = *str++;
if(ch==0) break;
if(ch=='\n')
printf_ln();
else
printf_char(ch);
}
}

@ -40,6 +40,21 @@ public class TestPrograms {
public TestPrograms() {
}
@Test
public void testPrintfError1() throws IOException, URISyntaxException {
assertError("printf-error-1.c", "Needed printf sub-procedure not found");
}
@Test
public void testPrintf13() throws IOException, URISyntaxException {
compileAndCompare("printf-13.c");
}
@Test
public void testPrintf12() throws IOException, URISyntaxException {
compileAndCompare("printf-12.c");
}
@Test
public void testPrintf11() throws IOException, URISyntaxException {
compileAndCompare("printf-11.c");

36
src/test/kc/printf-12.c Normal file

@ -0,0 +1,36 @@
// Tests printf function call rewriting
// Print a bunch of different stuff using printf
#include <printf.h>
void main() {
printf_cls();
char c = 'x';
signed char sc = -12;
unsigned char uc = 34;
signed int si = -1234;
unsigned int ui = 5678;
signed long sl = -123456;
unsigned long ul = 567890;
// char
printf("A char: %c\n", c);
// pointer
printf("A pointer: %p\n", &c);
// percent sign
printf("A percent: %%\n");
// signed char
printf("A signed char: %hhd\n", sc);
// unsigned char
printf("An unsigned char: %hhu\n", uc);
// signed int
printf("A signed int: %d\n", si);
// unsigned int
printf("An unsigned int: %u\n", ui);
// signed long
printf("A signed long: %ld\n", sl);
// unsigned long
printf("An unsigned long: %lu\n", ul);
}

27
src/test/kc/printf-13.c Normal file

@ -0,0 +1,27 @@
// Tests printf function call rewriting
// Print using different formats
#include <printf.h>
void main() {
printf_cls();
// fixed width - right justify
printf("%%3s '%3s' '%3s' '%3s' '%3s'\n", "x", "xx", "xxx", "xxxx");
// fixed width - left justify
printf("%%-3s '%-3s' '%-3s' '%-3s' '%-3s'\n", "x", "xx", "xxx", "xxxx");
// fixed width - right justify
printf("%%3d '%3d' '%3d' '%3d' '%3d'\n", 1, 11, 111, 1111);
// fixed width - left justify
printf("%%-3d '%-3d' '%-3d' '%-3d' '%-3d'\n", -2, -22, -222, -2222);
// fixed width - right justify - always sign
printf("%%+3d '%+3d' '%+3d' '%+3d' '%+3d'\n", 3, -44, 555, -6666);
// fixed width - zero-pad
printf("%%03d '%03d' '%03d' '%03d' '%3d'\n", 1, 11, 111, 1111);
// octal
printf("%%o '%o' '%o' '%o' '%o'\n", 1, 11, 111, 1111);
// hexadecimal
printf("%%x '%x' '%x' '%x' '%x'\n", 1, 11, 111, 1111);
}

@ -0,0 +1,9 @@
// Tests printf function call rewriting
// Print a bunch of different stuff using printf
__intrinsic void printf(char* format, ...);
void main() {
printf("Hello World!");
}

1275
src/test/ref/printf-12.asm Normal file

File diff suppressed because it is too large Load Diff

702
src/test/ref/printf-12.cfg Normal file

@ -0,0 +1,702 @@
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
[1] (byte*) printf_line_cursor ← (byte*) 1024
[2] (byte*) printf_char_cursor ← (byte*) 1024
to:@2
@2: scope:[] from @1
[3] phi()
[4] call main
to:@end
@end: scope:[] from @2
[5] phi()
(void()) main()
main: scope:[main] from @2
[6] phi()
[7] call printf_cls
to:main::@1
main::@1: scope:[main] from main
[8] (volatile byte) main::c ← (byte) 'x'
[9] call printf_str
to:main::@2
main::@2: scope:[main] from main::@1
[10] (byte) printf_char::ch#3 ← (volatile byte) main::c
[11] call printf_char
to:main::@3
main::@3: scope:[main] from main::@2
[12] phi()
[13] call printf_str
to:main::@4
main::@4: scope:[main] from main::@3
[14] phi()
[15] call printf_str
to:main::@5
main::@5: scope:[main] from main::@4
[16] phi()
[17] call printf_uint
to:main::@6
main::@6: scope:[main] from main::@5
[18] phi()
[19] call printf_str
to:main::@7
main::@7: scope:[main] from main::@6
[20] phi()
[21] call printf_str
to:main::@8
main::@8: scope:[main] from main::@7
[22] phi()
[23] call printf_char
to:main::@9
main::@9: scope:[main] from main::@8
[24] phi()
[25] call printf_str
to:main::@10
main::@10: scope:[main] from main::@9
[26] phi()
[27] call printf_str
to:main::@11
main::@11: scope:[main] from main::@10
[28] phi()
[29] call printf_schar
to:main::@12
main::@12: scope:[main] from main::@11
[30] phi()
[31] call printf_str
to:main::@13
main::@13: scope:[main] from main::@12
[32] phi()
[33] call printf_str
to:main::@14
main::@14: scope:[main] from main::@13
[34] phi()
[35] call printf_uchar
to:main::@15
main::@15: scope:[main] from main::@14
[36] phi()
[37] call printf_str
to:main::@16
main::@16: scope:[main] from main::@15
[38] phi()
[39] call printf_str
to:main::@17
main::@17: scope:[main] from main::@16
[40] phi()
[41] call printf_sint
to:main::@18
main::@18: scope:[main] from main::@17
[42] phi()
[43] call printf_str
to:main::@19
main::@19: scope:[main] from main::@18
[44] phi()
[45] call printf_str
to:main::@20
main::@20: scope:[main] from main::@19
[46] phi()
[47] call printf_uint
to:main::@21
main::@21: scope:[main] from main::@20
[48] phi()
[49] call printf_str
to:main::@22
main::@22: scope:[main] from main::@21
[50] phi()
[51] call printf_str
to:main::@23
main::@23: scope:[main] from main::@22
[52] phi()
[53] call printf_slong
to:main::@24
main::@24: scope:[main] from main::@23
[54] phi()
[55] call printf_str
to:main::@25
main::@25: scope:[main] from main::@24
[56] phi()
[57] call printf_str
to:main::@26
main::@26: scope:[main] from main::@25
[58] phi()
[59] call printf_ulong
to:main::@27
main::@27: scope:[main] from main::@26
[60] phi()
[61] call printf_str
to:main::@return
main::@return: scope:[main] from main::@27
[62] return
to:@return
(void()) printf_str((byte*) printf_str::str)
printf_str: scope:[printf_str] from main::@1 main::@10 main::@12 main::@13 main::@15 main::@16 main::@18 main::@19 main::@21 main::@22 main::@24 main::@25 main::@27 main::@3 main::@4 main::@6 main::@7 main::@9 printf_number_buffer::@4
[63] (byte*) printf_str::str#22 ← phi( main::@1/(const byte*) main::str main::@10/(const byte*) main::str6 main::@12/(const byte*) main::str1 main::@13/(const byte*) main::str8 main::@15/(const byte*) main::str1 main::@16/(const byte*) main::str10 main::@18/(const byte*) main::str1 main::@19/(const byte*) main::str12 main::@21/(const byte*) main::str1 main::@22/(const byte*) main::str14 main::@24/(const byte*) main::str1 main::@25/(const byte*) main::str16 main::@27/(const byte*) main::str1 main::@3/(const byte*) main::str1 main::@4/(const byte*) main::str2 main::@6/(const byte*) main::str1 main::@7/(const byte*) main::str4 main::@9/(const byte*) main::str1 printf_number_buffer::@4/(byte*) printf_str::str#1 )
to:printf_str::@1
printf_str::@1: scope:[printf_str] from printf_str printf_str::@4 printf_str::@5
[64] (byte*) printf_str::str#20 ← phi( printf_str/(byte*) printf_str::str#22 printf_str::@4/(byte*) printf_str::str#0 printf_str::@5/(byte*) printf_str::str#0 )
to:printf_str::@2
printf_str::@2: scope:[printf_str] from printf_str::@1
[65] (byte) printf_str::ch#0 ← *((byte*) printf_str::str#20)
[66] (byte*) printf_str::str#0 ← ++ (byte*) printf_str::str#20
[67] if((byte) printf_str::ch#0!=(byte) 0) goto printf_str::@3
to:printf_str::@return
printf_str::@return: scope:[printf_str] from printf_str::@2
[68] return
to:@return
printf_str::@3: scope:[printf_str] from printf_str::@2
[69] if((byte) printf_str::ch#0==(byte) '
') goto printf_str::@4
to:printf_str::@5
printf_str::@5: scope:[printf_str] from printf_str::@3
[70] (byte) printf_char::ch#1 ← (byte) printf_str::ch#0
[71] call printf_char
to:printf_str::@1
printf_str::@4: scope:[printf_str] from printf_str::@3
[72] phi()
[73] call printf_ln
to:printf_str::@1
(void()) printf_ln()
printf_ln: scope:[printf_ln] from printf_str::@4
[74] phi()
to:printf_ln::@1
printf_ln::@1: scope:[printf_ln] from printf_ln printf_ln::@1
[75] (byte*) printf_line_cursor ← (byte*) printf_line_cursor + (byte) $28
[76] if((byte*) printf_line_cursor<(byte*) printf_char_cursor) goto printf_ln::@1
to:printf_ln::@2
printf_ln::@2: scope:[printf_ln] from printf_ln::@1
[77] (byte*) printf_char_cursor ← (byte*) printf_line_cursor
to:printf_ln::@return
printf_ln::@return: scope:[printf_ln] from printf_ln::@2
[78] return
to:@return
(void()) printf_char((byte) printf_char::ch)
printf_char: scope:[printf_char] from main::@2 main::@8 printf_number_buffer::@8 printf_padding::@2 printf_str::@5
[79] (byte) printf_char::ch#5 ← phi( main::@2/(byte) printf_char::ch#3 main::@8/(byte) '%' printf_number_buffer::@8/(byte) printf_char::ch#2 printf_padding::@2/(byte) printf_char::ch#0 printf_str::@5/(byte) printf_char::ch#1 )
[80] *((byte*) printf_char_cursor) ← (byte) printf_char::ch#5
[81] (byte*) printf_char_cursor ← ++ (byte*) printf_char_cursor
[82] if((byte*) printf_char_cursor<(const byte*) printf_screen+(word)(number) $28*(number) $19) goto printf_char::@return
to:printf_char::@1
printf_char::@1: scope:[printf_char] from printf_char
[83] phi()
[84] call memcpy
to:printf_char::@2
printf_char::@2: scope:[printf_char] from printf_char::@1
[85] phi()
[86] call memset
to:printf_char::@3
printf_char::@3: scope:[printf_char] from printf_char::@2
[87] (byte*~) printf_char::$8 ← (byte*) printf_char_cursor - (byte) $28
[88] (byte*) printf_char_cursor ← (byte*~) printf_char::$8
[89] (byte*) printf_line_cursor ← (byte*) printf_char_cursor
to:printf_char::@return
printf_char::@return: scope:[printf_char] from printf_char printf_char::@3
[90] return
to:@return
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
memset: scope:[memset] from printf_char::@2 printf_cls
[91] (byte) memset::c#4 ← phi( printf_char::@2/(byte) ' ' printf_cls/(byte) ' ' )
[91] (void*) memset::str#3 ← phi( printf_char::@2/(void*)(const byte*) printf_screen+(word)(number) $28*(number) $19-(byte) $28 printf_cls/(void*)(const byte*) printf_screen )
[91] (word) memset::num#2 ← phi( printf_char::@2/(byte) $28 printf_cls/(word)(number) $28*(number) $19 )
[92] if((word) memset::num#2<=(byte) 0) goto memset::@return
to:memset::@1
memset::@1: scope:[memset] from memset
[93] (byte*) memset::end#0 ← (byte*)(void*) memset::str#3 + (word) memset::num#2
[94] (byte*) memset::dst#4 ← (byte*)(void*) memset::str#3
to:memset::@2
memset::@2: scope:[memset] from memset::@1 memset::@3
[95] (byte*) memset::dst#2 ← phi( memset::@1/(byte*) memset::dst#4 memset::@3/(byte*) memset::dst#1 )
[96] if((byte*) memset::dst#2!=(byte*) memset::end#0) goto memset::@3
to:memset::@return
memset::@return: scope:[memset] from memset memset::@2
[97] return
to:@return
memset::@3: scope:[memset] from memset::@2
[98] *((byte*) memset::dst#2) ← (byte) memset::c#4
[99] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2
to:memset::@2
(void*()) memcpy((void*) memcpy::destination , (void*) memcpy::source , (word) memcpy::num)
memcpy: scope:[memcpy] from printf_char::@1
[100] phi()
to:memcpy::@1
memcpy::@1: scope:[memcpy] from memcpy memcpy::@2
[101] (byte*) memcpy::dst#2 ← phi( memcpy/(byte*)(const void*) memcpy::destination#0 memcpy::@2/(byte*) memcpy::dst#1 )
[101] (byte*) memcpy::src#2 ← phi( memcpy/(byte*)(const void*) memcpy::source#0 memcpy::@2/(byte*) memcpy::src#1 )
[102] if((byte*) memcpy::src#2!=(const byte*) memcpy::src_end#0) goto memcpy::@2
to:memcpy::@return
memcpy::@return: scope:[memcpy] from memcpy::@1
[103] return
to:@return
memcpy::@2: scope:[memcpy] from memcpy::@1
[104] *((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#2)
[105] (byte*) memcpy::dst#1 ← ++ (byte*) memcpy::dst#2
[106] (byte*) memcpy::src#1 ← ++ (byte*) memcpy::src#2
to:memcpy::@1
(void()) printf_ulong((dword) printf_ulong::uvalue , (byte) printf_ulong::format_min_length , (byte) printf_ulong::format_justify_left , (byte) printf_ulong::format_sign_always , (byte) printf_ulong::format_zero_padding , (byte) printf_ulong::format_radix)
printf_ulong: scope:[printf_ulong] from main::@26
[107] phi()
to:printf_ulong::@1
printf_ulong::@1: scope:[printf_ulong] from printf_ulong
[108] *((byte*)&(struct printf_buffer_number) printf_buffer) ← (byte) 0
[109] call ultoa
to:printf_ulong::@2
printf_ulong::@2: scope:[printf_ulong] from printf_ulong::@1
[110] (byte) printf_number_buffer::buffer_sign#1 ← *((byte*)&(struct printf_buffer_number) printf_buffer)
[111] call printf_number_buffer
to:printf_ulong::@return
printf_ulong::@return: scope:[printf_ulong] from printf_ulong::@2
[112] return
to:@return
(void()) printf_number_buffer((byte) printf_number_buffer::buffer_sign , (byte*) printf_number_buffer::buffer_digits , (byte) printf_number_buffer::format_min_length , (byte) printf_number_buffer::format_justify_left , (byte) printf_number_buffer::format_sign_always , (byte) printf_number_buffer::format_zero_padding , (byte) printf_number_buffer::format_radix)
printf_number_buffer: scope:[printf_number_buffer] from printf_schar::@3 printf_sint::@3 printf_slong::@3 printf_uchar::@2 printf_uint::@2 printf_ulong::@2
[113] (byte) printf_number_buffer::buffer_sign#10 ← phi( printf_schar::@3/(byte) printf_number_buffer::buffer_sign#4 printf_sint::@3/(byte) printf_number_buffer::buffer_sign#2 printf_slong::@3/(byte) printf_number_buffer::buffer_sign#0 printf_uchar::@2/(byte) printf_number_buffer::buffer_sign#5 printf_uint::@2/(byte) printf_number_buffer::buffer_sign#3 printf_ulong::@2/(byte) printf_number_buffer::buffer_sign#1 )
[113] (byte*) printf_number_buffer::buffer_digits#10 ← phi( printf_schar::@3/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS printf_sint::@3/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS printf_slong::@3/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS printf_uchar::@2/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS printf_uint::@2/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS printf_ulong::@2/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS )
[113] (byte) printf_number_buffer::format_zero_padding#10 ← phi( printf_schar::@3/(const byte) printf_schar::format_zero_padding#0 printf_sint::@3/(const byte) printf_sint::format_zero_padding#0 printf_slong::@3/(const byte) printf_slong::format_zero_padding#0 printf_uchar::@2/(const byte) printf_uchar::format_zero_padding#0 printf_uint::@2/(byte) 0 printf_ulong::@2/(const byte) printf_ulong::format_zero_padding#0 )
[113] (byte) printf_number_buffer::format_justify_left#10 ← phi( printf_schar::@3/(const byte) printf_schar::format_justify_left#0 printf_sint::@3/(const byte) printf_sint::format_justify_left#0 printf_slong::@3/(const byte) printf_slong::format_justify_left#0 printf_uchar::@2/(const byte) printf_uchar::format_justify_left#0 printf_uint::@2/(byte) 0 printf_ulong::@2/(const byte) printf_ulong::format_justify_left#0 )
[113] (byte) printf_number_buffer::format_min_length#10 ← phi( printf_schar::@3/(const byte) printf_schar::format_min_length#0 printf_sint::@3/(const byte) printf_sint::format_min_length#0 printf_slong::@3/(const byte) printf_slong::format_min_length#0 printf_uchar::@2/(const byte) printf_uchar::format_min_length#0 printf_uint::@2/(byte) 0 printf_ulong::@2/(const byte) printf_ulong::format_min_length#0 )
[114] if((byte) 0==(byte) printf_number_buffer::format_min_length#10) goto printf_number_buffer::@1
to:printf_number_buffer::@5
printf_number_buffer::@5: scope:[printf_number_buffer] from printf_number_buffer
[115] (byte*) strlen::str#1 ← (byte*) printf_number_buffer::buffer_digits#10
[116] call strlen
[117] (word) strlen::return#2 ← (word) strlen::len#2
to:printf_number_buffer::@12
printf_number_buffer::@12: scope:[printf_number_buffer] from printf_number_buffer::@5
[118] (word~) printf_number_buffer::$18 ← (word) strlen::return#2
[119] (signed byte) printf_number_buffer::len#0 ← (signed byte)(word~) printf_number_buffer::$18
[120] if((byte) 0==(byte) printf_number_buffer::buffer_sign#10) goto printf_number_buffer::@11
to:printf_number_buffer::@6
printf_number_buffer::@6: scope:[printf_number_buffer] from printf_number_buffer::@12
[121] (signed byte) printf_number_buffer::len#1 ← ++ (signed byte) printf_number_buffer::len#0
to:printf_number_buffer::@11
printf_number_buffer::@11: scope:[printf_number_buffer] from printf_number_buffer::@12 printf_number_buffer::@6
[122] (signed byte) printf_number_buffer::len#2 ← phi( printf_number_buffer::@12/(signed byte) printf_number_buffer::len#0 printf_number_buffer::@6/(signed byte) printf_number_buffer::len#1 )
[123] (signed byte) printf_number_buffer::padding#1 ← (signed byte)(byte) printf_number_buffer::format_min_length#10 - (signed byte) printf_number_buffer::len#2
[124] if((signed byte) printf_number_buffer::padding#1>=(signed byte) 0) goto printf_number_buffer::@19
to:printf_number_buffer::@1
printf_number_buffer::@19: scope:[printf_number_buffer] from printf_number_buffer::@11
[125] phi()
to:printf_number_buffer::@1
printf_number_buffer::@1: scope:[printf_number_buffer] from printf_number_buffer printf_number_buffer::@11 printf_number_buffer::@19
[126] (signed byte) printf_number_buffer::padding#10 ← phi( printf_number_buffer/(signed byte) 0 printf_number_buffer::@19/(signed byte) printf_number_buffer::padding#1 printf_number_buffer::@11/(signed byte) 0 )
[127] if((byte) 0!=(byte) printf_number_buffer::format_justify_left#10) goto printf_number_buffer::@2
to:printf_number_buffer::@15
printf_number_buffer::@15: scope:[printf_number_buffer] from printf_number_buffer::@1
[128] if((byte) 0!=(byte) printf_number_buffer::format_zero_padding#10) goto printf_number_buffer::@2
to:printf_number_buffer::@14
printf_number_buffer::@14: scope:[printf_number_buffer] from printf_number_buffer::@15
[129] if((signed byte) 0!=(signed byte) printf_number_buffer::padding#10) goto printf_number_buffer::@7
to:printf_number_buffer::@2
printf_number_buffer::@7: scope:[printf_number_buffer] from printf_number_buffer::@14
[130] (byte) printf_padding::length#0 ← (byte)(signed byte) printf_number_buffer::padding#10
[131] call printf_padding
to:printf_number_buffer::@2
printf_number_buffer::@2: scope:[printf_number_buffer] from printf_number_buffer::@1 printf_number_buffer::@14 printf_number_buffer::@15 printf_number_buffer::@7
[132] if((byte) 0==(byte) printf_number_buffer::buffer_sign#10) goto printf_number_buffer::@3
to:printf_number_buffer::@8
printf_number_buffer::@8: scope:[printf_number_buffer] from printf_number_buffer::@2
[133] (byte) printf_char::ch#2 ← (byte) printf_number_buffer::buffer_sign#10
[134] call printf_char
to:printf_number_buffer::@3
printf_number_buffer::@3: scope:[printf_number_buffer] from printf_number_buffer::@2 printf_number_buffer::@8
[135] if((byte) 0==(byte) printf_number_buffer::format_zero_padding#10) goto printf_number_buffer::@4
to:printf_number_buffer::@16
printf_number_buffer::@16: scope:[printf_number_buffer] from printf_number_buffer::@3
[136] if((signed byte) 0!=(signed byte) printf_number_buffer::padding#10) goto printf_number_buffer::@9
to:printf_number_buffer::@4
printf_number_buffer::@9: scope:[printf_number_buffer] from printf_number_buffer::@16
[137] (byte) printf_padding::length#1 ← (byte)(signed byte) printf_number_buffer::padding#10
[138] call printf_padding
to:printf_number_buffer::@4
printf_number_buffer::@4: scope:[printf_number_buffer] from printf_number_buffer::@16 printf_number_buffer::@3 printf_number_buffer::@9
[139] (byte*) printf_str::str#1 ← (byte*) printf_number_buffer::buffer_digits#10
[140] call printf_str
to:printf_number_buffer::@13
printf_number_buffer::@13: scope:[printf_number_buffer] from printf_number_buffer::@4
[141] if((byte) 0==(byte) printf_number_buffer::format_justify_left#10) goto printf_number_buffer::@return
to:printf_number_buffer::@18
printf_number_buffer::@18: scope:[printf_number_buffer] from printf_number_buffer::@13
[142] if((byte) 0!=(byte) printf_number_buffer::format_zero_padding#10) goto printf_number_buffer::@return
to:printf_number_buffer::@17
printf_number_buffer::@17: scope:[printf_number_buffer] from printf_number_buffer::@18
[143] if((signed byte) 0!=(signed byte) printf_number_buffer::padding#10) goto printf_number_buffer::@10
to:printf_number_buffer::@return
printf_number_buffer::@10: scope:[printf_number_buffer] from printf_number_buffer::@17
[144] (byte) printf_padding::length#2 ← (byte)(signed byte) printf_number_buffer::padding#10
[145] call printf_padding
to:printf_number_buffer::@return
printf_number_buffer::@return: scope:[printf_number_buffer] from printf_number_buffer::@10 printf_number_buffer::@13 printf_number_buffer::@17 printf_number_buffer::@18
[146] return
to:@return
(void()) printf_padding((byte) printf_padding::pad , (byte) printf_padding::length)
printf_padding: scope:[printf_padding] from printf_number_buffer::@10 printf_number_buffer::@7 printf_number_buffer::@9
[147] (byte) printf_padding::pad#5 ← phi( printf_number_buffer::@9/(byte) '0' printf_number_buffer::@10/(byte) ' ' printf_number_buffer::@7/(byte) ' ' )
[147] (byte) printf_padding::length#4 ← phi( printf_number_buffer::@9/(byte) printf_padding::length#1 printf_number_buffer::@10/(byte) printf_padding::length#2 printf_number_buffer::@7/(byte) printf_padding::length#0 )
to:printf_padding::@1
printf_padding::@1: scope:[printf_padding] from printf_padding printf_padding::@3
[148] (byte) printf_padding::i#2 ← phi( printf_padding/(byte) 0 printf_padding::@3/(byte) printf_padding::i#1 )
[149] if((byte) printf_padding::i#2<(byte) printf_padding::length#4) goto printf_padding::@2
to:printf_padding::@return
printf_padding::@return: scope:[printf_padding] from printf_padding::@1
[150] return
to:@return
printf_padding::@2: scope:[printf_padding] from printf_padding::@1
[151] (byte) printf_char::ch#0 ← (byte) printf_padding::pad#5
[152] call printf_char
to:printf_padding::@3
printf_padding::@3: scope:[printf_padding] from printf_padding::@2
[153] (byte) printf_padding::i#1 ← ++ (byte) printf_padding::i#2
to:printf_padding::@1
(word()) strlen((byte*) strlen::str)
strlen: scope:[strlen] from printf_number_buffer::@5
[154] phi()
to:strlen::@1
strlen::@1: scope:[strlen] from strlen strlen::@2
[155] (word) strlen::len#2 ← phi( strlen/(word) 0 strlen::@2/(word) strlen::len#1 )
[155] (byte*) strlen::str#2 ← phi( strlen/(byte*) strlen::str#1 strlen::@2/(byte*) strlen::str#0 )
[156] if((byte) 0!=*((byte*) strlen::str#2)) goto strlen::@2
to:strlen::@return
strlen::@return: scope:[strlen] from strlen::@1
[157] return
to:@return
strlen::@2: scope:[strlen] from strlen::@1
[158] (word) strlen::len#1 ← ++ (word) strlen::len#2
[159] (byte*) strlen::str#0 ← ++ (byte*) strlen::str#2
to:strlen::@1
(void()) ultoa((dword) ultoa::value , (byte*) ultoa::buffer , (byte) ultoa::radix)
ultoa: scope:[ultoa] from printf_slong::@2 printf_ulong::@1
[160] (byte*) ultoa::buffer#11 ← phi( printf_slong::@2/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS printf_ulong::@1/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS )
[160] (dword) ultoa::value#10 ← phi( printf_slong::@2/(const dword) printf_slong::uvalue#0 printf_ulong::@1/(const dword) main::ul )
to:ultoa::@1
ultoa::@1: scope:[ultoa] from ultoa ultoa::@4
[161] (byte*) ultoa::buffer#10 ← phi( ultoa::@4/(byte*) ultoa::buffer#15 ultoa/(byte*) ultoa::buffer#11 )
[161] (byte) ultoa::started#2 ← phi( ultoa::@4/(byte) ultoa::started#4 ultoa/(byte) 0 )
[161] (dword) ultoa::value#3 ← phi( ultoa::@4/(dword) ultoa::value#7 ultoa/(dword) ultoa::value#10 )
[161] (byte) ultoa::digit#2 ← phi( ultoa::@4/(byte) ultoa::digit#1 ultoa/(byte) 0 )
[162] if((byte) ultoa::digit#2<(byte) $a-(byte) 1) goto ultoa::@2
to:ultoa::@3
ultoa::@3: scope:[ultoa] from ultoa::@1
[163] (byte~) ultoa::$11 ← (byte)(dword) ultoa::value#3
[164] *((byte*) ultoa::buffer#10) ← *((const byte*) DIGITS + (byte~) ultoa::$11)
[165] (byte*) ultoa::buffer#3 ← ++ (byte*) ultoa::buffer#10
[166] *((byte*) ultoa::buffer#3) ← (byte) 0
to:ultoa::@return
ultoa::@return: scope:[ultoa] from ultoa::@3
[167] return
to:@return
ultoa::@2: scope:[ultoa] from ultoa::@1
[168] (byte~) ultoa::$10 ← (byte) ultoa::digit#2 << (byte) 2
[169] (dword) ultoa::digit_value#0 ← *((const dword*) RADIX_DECIMAL_VALUES_LONG + (byte~) ultoa::$10)
[170] if((byte) 0!=(byte) ultoa::started#2) goto ultoa::@5
to:ultoa::@7
ultoa::@7: scope:[ultoa] from ultoa::@2
[171] if((dword) ultoa::value#3>=(dword) ultoa::digit_value#0) goto ultoa::@5
to:ultoa::@4
ultoa::@4: scope:[ultoa] from ultoa::@6 ultoa::@7
[172] (byte*) ultoa::buffer#15 ← phi( ultoa::@7/(byte*) ultoa::buffer#10 ultoa::@6/(byte*) ultoa::buffer#4 )
[172] (byte) ultoa::started#4 ← phi( ultoa::@7/(byte) ultoa::started#2 ultoa::@6/(byte) 1 )
[172] (dword) ultoa::value#7 ← phi( ultoa::@7/(dword) ultoa::value#3 ultoa::@6/(dword) ultoa::value#0 )
[173] (byte) ultoa::digit#1 ← ++ (byte) ultoa::digit#2
to:ultoa::@1
ultoa::@5: scope:[ultoa] from ultoa::@2 ultoa::@7
[174] (byte*) ultoa_append::buffer#0 ← (byte*) ultoa::buffer#10
[175] (dword) ultoa_append::value#0 ← (dword) ultoa::value#3
[176] (dword) ultoa_append::sub#0 ← (dword) ultoa::digit_value#0
[177] call ultoa_append
[178] (dword) ultoa_append::return#0 ← (dword) ultoa_append::value#2
to:ultoa::@6
ultoa::@6: scope:[ultoa] from ultoa::@5
[179] (dword) ultoa::value#0 ← (dword) ultoa_append::return#0
[180] (byte*) ultoa::buffer#4 ← ++ (byte*) ultoa::buffer#10
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
[181] phi()
to:ultoa_append::@1
ultoa_append::@1: scope:[ultoa_append] from ultoa_append ultoa_append::@2
[182] (byte) ultoa_append::digit#2 ← phi( ultoa_append/(byte) 0 ultoa_append::@2/(byte) ultoa_append::digit#1 )
[182] (dword) ultoa_append::value#2 ← phi( ultoa_append/(dword) ultoa_append::value#0 ultoa_append::@2/(dword) ultoa_append::value#1 )
[183] 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
[184] *((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
[185] return
to:@return
ultoa_append::@2: scope:[ultoa_append] from ultoa_append::@1
[186] (byte) ultoa_append::digit#1 ← ++ (byte) ultoa_append::digit#2
[187] (dword) ultoa_append::value#1 ← (dword) ultoa_append::value#2 - (dword) ultoa_append::sub#0
to:ultoa_append::@1
(void()) printf_slong((signed dword) printf_slong::value , (byte) printf_slong::format_min_length , (byte) printf_slong::format_justify_left , (byte) printf_slong::format_sign_always , (byte) printf_slong::format_zero_padding , (byte) printf_slong::format_radix)
printf_slong: scope:[printf_slong] from main::@23
[188] *((byte*)&(struct printf_buffer_number) printf_buffer) ← (byte) 0
to:printf_slong::@1
printf_slong::@1: scope:[printf_slong] from printf_slong
[189] *((byte*)&(struct printf_buffer_number) printf_buffer) ← (byte) '-'
to:printf_slong::@2
printf_slong::@2: scope:[printf_slong] from printf_slong::@1
[190] phi()
[191] call ultoa
to:printf_slong::@3
printf_slong::@3: scope:[printf_slong] from printf_slong::@2
[192] (byte) printf_number_buffer::buffer_sign#0 ← *((byte*)&(struct printf_buffer_number) printf_buffer)
[193] call printf_number_buffer
to:printf_slong::@return
printf_slong::@return: scope:[printf_slong] from printf_slong::@3
[194] return
to:@return
(void()) printf_uint((word) printf_uint::uvalue , (byte) printf_uint::format_min_length , (byte) printf_uint::format_justify_left , (byte) printf_uint::format_sign_always , (byte) printf_uint::format_zero_padding , (byte) printf_uint::format_radix)
printf_uint: scope:[printf_uint] from main::@20 main::@5
[195] (byte) printf_uint::format_radix#2 ← phi( main::@20/(const byte) DECIMAL main::@5/(const byte) HEXADECIMAL )
[195] (word) printf_uint::uvalue#2 ← phi( main::@20/(const word) main::ui main::@5/(word)&(volatile byte) main::c )
to:printf_uint::@1
printf_uint::@1: scope:[printf_uint] from printf_uint
[196] *((byte*)&(struct printf_buffer_number) printf_buffer) ← (byte) 0
[197] (word) utoa::value#2 ← (word) printf_uint::uvalue#2
[198] (byte) utoa::radix#1 ← (byte) printf_uint::format_radix#2
[199] call utoa
to:printf_uint::@2
printf_uint::@2: scope:[printf_uint] from printf_uint::@1
[200] (byte) printf_number_buffer::buffer_sign#3 ← *((byte*)&(struct printf_buffer_number) printf_buffer)
[201] call printf_number_buffer
to:printf_uint::@return
printf_uint::@return: scope:[printf_uint] from printf_uint::@2
[202] return
to:@return
(void()) utoa((word) utoa::value , (byte*) utoa::buffer , (byte) utoa::radix)
utoa: scope:[utoa] from printf_sint::@2 printf_uint::@1
[203] (byte*) utoa::buffer#11 ← phi( printf_sint::@2/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS printf_uint::@1/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS )
[203] (word) utoa::value#10 ← phi( printf_sint::@2/(const word) printf_sint::uvalue#0 printf_uint::@1/(word) utoa::value#2 )
[203] (byte) utoa::radix#2 ← phi( printf_sint::@2/(const byte) DECIMAL printf_uint::@1/(byte) utoa::radix#1 )
[204] if((byte) utoa::radix#2==(const byte) DECIMAL) goto utoa::@1
to:utoa::@2
utoa::@2: scope:[utoa] from utoa
[205] if((byte) utoa::radix#2==(const byte) HEXADECIMAL) goto utoa::@1
to:utoa::@3
utoa::@3: scope:[utoa] from utoa::@2
[206] if((byte) utoa::radix#2==(const byte) OCTAL) goto utoa::@1
to:utoa::@4
utoa::@4: scope:[utoa] from utoa::@3
[207] if((byte) utoa::radix#2==(const byte) BINARY) goto utoa::@1
to:utoa::@5
utoa::@5: scope:[utoa] from utoa::@4
[208] *((byte*) utoa::buffer#11) ← (byte) 'e'
[209] (byte*) utoa::buffer#0 ← ++ (byte*) utoa::buffer#11
[210] *((byte*) utoa::buffer#0) ← (byte) 'r'
[211] (byte*) utoa::buffer#1 ← ++ (byte*) utoa::buffer#0
[212] *((byte*) utoa::buffer#1) ← (byte) 'r'
[213] (byte*) utoa::buffer#2 ← ++ (byte*) utoa::buffer#1
[214] *((byte*) utoa::buffer#2) ← (byte) 0
to:utoa::@return
utoa::@return: scope:[utoa] from utoa::@5 utoa::@8
[215] return
to:@return
utoa::@1: scope:[utoa] from utoa utoa::@2 utoa::@3 utoa::@4
[216] (word*) utoa::digit_values#8 ← phi( utoa/(const word*) RADIX_DECIMAL_VALUES utoa::@2/(const word*) RADIX_HEXADECIMAL_VALUES utoa::@3/(const word*) RADIX_OCTAL_VALUES utoa::@4/(const word*) RADIX_BINARY_VALUES )
[216] (byte) utoa::max_digits#7 ← phi( utoa/(byte) 5 utoa::@2/(byte) 4 utoa::@3/(byte) 6 utoa::@4/(byte) $10 )
to:utoa::@6
utoa::@6: scope:[utoa] from utoa::@1 utoa::@9
[217] (byte*) utoa::buffer#10 ← phi( utoa::@9/(byte*) utoa::buffer#15 utoa::@1/(byte*) utoa::buffer#11 )
[217] (byte) utoa::started#2 ← phi( utoa::@9/(byte) utoa::started#4 utoa::@1/(byte) 0 )
[217] (word) utoa::value#3 ← phi( utoa::@9/(word) utoa::value#7 utoa::@1/(word) utoa::value#10 )
[217] (byte) utoa::digit#2 ← phi( utoa::@9/(byte) utoa::digit#1 utoa::@1/(byte) 0 )
[218] (byte~) utoa::$4 ← (byte) utoa::max_digits#7 - (byte) 1
[219] if((byte) utoa::digit#2<(byte~) utoa::$4) goto utoa::@7
to:utoa::@8
utoa::@8: scope:[utoa] from utoa::@6
[220] (byte~) utoa::$11 ← (byte)(word) utoa::value#3
[221] *((byte*) utoa::buffer#10) ← *((const byte*) DIGITS + (byte~) utoa::$11)
[222] (byte*) utoa::buffer#3 ← ++ (byte*) utoa::buffer#10
[223] *((byte*) utoa::buffer#3) ← (byte) 0
to:utoa::@return
utoa::@7: scope:[utoa] from utoa::@6
[224] (byte~) utoa::$10 ← (byte) utoa::digit#2 << (byte) 1
[225] (word) utoa::digit_value#0 ← *((word*) utoa::digit_values#8 + (byte~) utoa::$10)
[226] if((byte) 0!=(byte) utoa::started#2) goto utoa::@10
to:utoa::@12
utoa::@12: scope:[utoa] from utoa::@7
[227] if((word) utoa::value#3>=(word) utoa::digit_value#0) goto utoa::@10
to:utoa::@9
utoa::@9: scope:[utoa] from utoa::@11 utoa::@12
[228] (byte*) utoa::buffer#15 ← phi( utoa::@12/(byte*) utoa::buffer#10 utoa::@11/(byte*) utoa::buffer#4 )
[228] (byte) utoa::started#4 ← phi( utoa::@12/(byte) utoa::started#2 utoa::@11/(byte) 1 )
[228] (word) utoa::value#7 ← phi( utoa::@12/(word) utoa::value#3 utoa::@11/(word) utoa::value#0 )
[229] (byte) utoa::digit#1 ← ++ (byte) utoa::digit#2
to:utoa::@6
utoa::@10: scope:[utoa] from utoa::@12 utoa::@7
[230] (byte*) utoa_append::buffer#0 ← (byte*) utoa::buffer#10
[231] (word) utoa_append::value#0 ← (word) utoa::value#3
[232] (word) utoa_append::sub#0 ← (word) utoa::digit_value#0
[233] call utoa_append
[234] (word) utoa_append::return#0 ← (word) utoa_append::value#2
to:utoa::@11
utoa::@11: scope:[utoa] from utoa::@10
[235] (word) utoa::value#0 ← (word) utoa_append::return#0
[236] (byte*) utoa::buffer#4 ← ++ (byte*) utoa::buffer#10
to:utoa::@9
(word()) utoa_append((byte*) utoa_append::buffer , (word) utoa_append::value , (word) utoa_append::sub)
utoa_append: scope:[utoa_append] from utoa::@10
[237] phi()
to:utoa_append::@1
utoa_append::@1: scope:[utoa_append] from utoa_append utoa_append::@2
[238] (byte) utoa_append::digit#2 ← phi( utoa_append/(byte) 0 utoa_append::@2/(byte) utoa_append::digit#1 )
[238] (word) utoa_append::value#2 ← phi( utoa_append/(word) utoa_append::value#0 utoa_append::@2/(word) utoa_append::value#1 )
[239] if((word) utoa_append::value#2>=(word) utoa_append::sub#0) goto utoa_append::@2
to:utoa_append::@3
utoa_append::@3: scope:[utoa_append] from utoa_append::@1
[240] *((byte*) utoa_append::buffer#0) ← *((const byte*) DIGITS + (byte) utoa_append::digit#2)
to:utoa_append::@return
utoa_append::@return: scope:[utoa_append] from utoa_append::@3
[241] return
to:@return
utoa_append::@2: scope:[utoa_append] from utoa_append::@1
[242] (byte) utoa_append::digit#1 ← ++ (byte) utoa_append::digit#2
[243] (word) utoa_append::value#1 ← (word) utoa_append::value#2 - (word) utoa_append::sub#0
to:utoa_append::@1
(void()) printf_sint((signed word) printf_sint::value , (byte) printf_sint::format_min_length , (byte) printf_sint::format_justify_left , (byte) printf_sint::format_sign_always , (byte) printf_sint::format_zero_padding , (byte) printf_sint::format_radix)
printf_sint: scope:[printf_sint] from main::@17
[244] *((byte*)&(struct printf_buffer_number) printf_buffer) ← (byte) 0
to:printf_sint::@1
printf_sint::@1: scope:[printf_sint] from printf_sint
[245] *((byte*)&(struct printf_buffer_number) printf_buffer) ← (byte) '-'
to:printf_sint::@2
printf_sint::@2: scope:[printf_sint] from printf_sint::@1
[246] phi()
[247] call utoa
to:printf_sint::@3
printf_sint::@3: scope:[printf_sint] from printf_sint::@2
[248] (byte) printf_number_buffer::buffer_sign#2 ← *((byte*)&(struct printf_buffer_number) printf_buffer)
[249] call printf_number_buffer
to:printf_sint::@return
printf_sint::@return: scope:[printf_sint] from printf_sint::@3
[250] return
to:@return
(void()) printf_uchar((byte) printf_uchar::uvalue , (byte) printf_uchar::format_min_length , (byte) printf_uchar::format_justify_left , (byte) printf_uchar::format_sign_always , (byte) printf_uchar::format_zero_padding , (byte) printf_uchar::format_radix)
printf_uchar: scope:[printf_uchar] from main::@14
[251] phi()
to:printf_uchar::@1
printf_uchar::@1: scope:[printf_uchar] from printf_uchar
[252] *((byte*)&(struct printf_buffer_number) printf_buffer) ← (byte) 0
[253] call uctoa
to:printf_uchar::@2
printf_uchar::@2: scope:[printf_uchar] from printf_uchar::@1
[254] (byte) printf_number_buffer::buffer_sign#5 ← *((byte*)&(struct printf_buffer_number) printf_buffer)
[255] call printf_number_buffer
to:printf_uchar::@return
printf_uchar::@return: scope:[printf_uchar] from printf_uchar::@2
[256] return
to:@return
(void()) uctoa((byte) uctoa::value , (byte*) uctoa::buffer , (byte) uctoa::radix)
uctoa: scope:[uctoa] from printf_schar::@2 printf_uchar::@1
[257] (byte*) uctoa::buffer#11 ← phi( printf_schar::@2/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS printf_uchar::@1/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS )
[257] (byte) uctoa::value#10 ← phi( printf_schar::@2/(const byte) printf_schar::uvalue#0 printf_uchar::@1/(const byte) main::uc )
to:uctoa::@1
uctoa::@1: scope:[uctoa] from uctoa uctoa::@4
[258] (byte*) uctoa::buffer#10 ← phi( uctoa::@4/(byte*) uctoa::buffer#15 uctoa/(byte*) uctoa::buffer#11 )
[258] (byte) uctoa::started#2 ← phi( uctoa::@4/(byte) uctoa::started#4 uctoa/(byte) 0 )
[258] (byte) uctoa::value#3 ← phi( uctoa::@4/(byte) uctoa::value#7 uctoa/(byte) uctoa::value#10 )
[258] (byte) uctoa::digit#2 ← phi( uctoa::@4/(byte) uctoa::digit#1 uctoa/(byte) 0 )
[259] if((byte) uctoa::digit#2<(byte) 3-(byte) 1) goto uctoa::@2
to:uctoa::@3
uctoa::@3: scope:[uctoa] from uctoa::@1
[260] *((byte*) uctoa::buffer#10) ← *((const byte*) DIGITS + (byte) uctoa::value#3)
[261] (byte*) uctoa::buffer#3 ← ++ (byte*) uctoa::buffer#10
[262] *((byte*) uctoa::buffer#3) ← (byte) 0
to:uctoa::@return
uctoa::@return: scope:[uctoa] from uctoa::@3
[263] return
to:@return
uctoa::@2: scope:[uctoa] from uctoa::@1
[264] (byte) uctoa::digit_value#0 ← *((const byte*) RADIX_DECIMAL_VALUES_CHAR + (byte) uctoa::digit#2)
[265] if((byte) 0!=(byte) uctoa::started#2) goto uctoa::@5
to:uctoa::@7
uctoa::@7: scope:[uctoa] from uctoa::@2
[266] if((byte) uctoa::value#3>=(byte) uctoa::digit_value#0) goto uctoa::@5
to:uctoa::@4
uctoa::@4: scope:[uctoa] from uctoa::@6 uctoa::@7
[267] (byte*) uctoa::buffer#15 ← phi( uctoa::@7/(byte*) uctoa::buffer#10 uctoa::@6/(byte*) uctoa::buffer#4 )
[267] (byte) uctoa::started#4 ← phi( uctoa::@7/(byte) uctoa::started#2 uctoa::@6/(byte) 1 )
[267] (byte) uctoa::value#7 ← phi( uctoa::@7/(byte) uctoa::value#3 uctoa::@6/(byte) uctoa::value#0 )
[268] (byte) uctoa::digit#1 ← ++ (byte) uctoa::digit#2
to:uctoa::@1
uctoa::@5: scope:[uctoa] from uctoa::@2 uctoa::@7
[269] (byte*) uctoa_append::buffer#0 ← (byte*) uctoa::buffer#10
[270] (byte) uctoa_append::value#0 ← (byte) uctoa::value#3
[271] (byte) uctoa_append::sub#0 ← (byte) uctoa::digit_value#0
[272] call uctoa_append
[273] (byte) uctoa_append::return#0 ← (byte) uctoa_append::value#2
to:uctoa::@6
uctoa::@6: scope:[uctoa] from uctoa::@5
[274] (byte) uctoa::value#0 ← (byte) uctoa_append::return#0
[275] (byte*) uctoa::buffer#4 ← ++ (byte*) uctoa::buffer#10
to:uctoa::@4
(byte()) uctoa_append((byte*) uctoa_append::buffer , (byte) uctoa_append::value , (byte) uctoa_append::sub)
uctoa_append: scope:[uctoa_append] from uctoa::@5
[276] phi()
to:uctoa_append::@1
uctoa_append::@1: scope:[uctoa_append] from uctoa_append uctoa_append::@2
[277] (byte) uctoa_append::digit#2 ← phi( uctoa_append/(byte) 0 uctoa_append::@2/(byte) uctoa_append::digit#1 )
[277] (byte) uctoa_append::value#2 ← phi( uctoa_append/(byte) uctoa_append::value#0 uctoa_append::@2/(byte) uctoa_append::value#1 )
[278] if((byte) uctoa_append::value#2>=(byte) uctoa_append::sub#0) goto uctoa_append::@2
to:uctoa_append::@3
uctoa_append::@3: scope:[uctoa_append] from uctoa_append::@1
[279] *((byte*) uctoa_append::buffer#0) ← *((const byte*) DIGITS + (byte) uctoa_append::digit#2)
to:uctoa_append::@return
uctoa_append::@return: scope:[uctoa_append] from uctoa_append::@3
[280] return
to:@return
uctoa_append::@2: scope:[uctoa_append] from uctoa_append::@1
[281] (byte) uctoa_append::digit#1 ← ++ (byte) uctoa_append::digit#2
[282] (byte) uctoa_append::value#1 ← (byte) uctoa_append::value#2 - (byte) uctoa_append::sub#0
to:uctoa_append::@1
(void()) printf_schar((signed byte) printf_schar::value , (byte) printf_schar::format_min_length , (byte) printf_schar::format_justify_left , (byte) printf_schar::format_sign_always , (byte) printf_schar::format_zero_padding , (byte) printf_schar::format_radix)
printf_schar: scope:[printf_schar] from main::@11
[283] *((byte*)&(struct printf_buffer_number) printf_buffer) ← (byte) 0
to:printf_schar::@1
printf_schar::@1: scope:[printf_schar] from printf_schar
[284] *((byte*)&(struct printf_buffer_number) printf_buffer) ← (byte) '-'
to:printf_schar::@2
printf_schar::@2: scope:[printf_schar] from printf_schar::@1
[285] phi()
[286] call uctoa
to:printf_schar::@3
printf_schar::@3: scope:[printf_schar] from printf_schar::@2
[287] (byte) printf_number_buffer::buffer_sign#4 ← *((byte*)&(struct printf_buffer_number) printf_buffer)
[288] call printf_number_buffer
to:printf_schar::@return
printf_schar::@return: scope:[printf_schar] from printf_schar::@3
[289] return
to:@return
(void()) printf_cls()
printf_cls: scope:[printf_cls] from main
[290] phi()
[291] call memset
to:printf_cls::@1
printf_cls::@1: scope:[printf_cls] from printf_cls
[292] (byte*) printf_line_cursor ← (const byte*) printf_screen
[293] (byte*) printf_char_cursor ← (byte*) printf_line_cursor
to:printf_cls::@return
printf_cls::@return: scope:[printf_cls] from printf_cls::@1
[294] return
to:@return

13781
src/test/ref/printf-12.log Normal file

File diff suppressed because one or more lines are too long

526
src/test/ref/printf-12.sym Normal file

@ -0,0 +1,526 @@
(label) @1
(label) @2
(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) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS = (byte) 1
(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 word*) RADIX_BINARY_VALUES[] = { (word) $8000, (word) $4000, (word) $2000, (word) $1000, (word) $800, (word) $400, (word) $200, (word) $100, (word) $80, (word) $40, (word) $20, (word) $10, (word) 8, (word) 4, (word) 2 }
(const word*) RADIX_DECIMAL_VALUES[] = { (word) $2710, (word) $3e8, (word) $64, (word) $a }
(const byte*) RADIX_DECIMAL_VALUES_CHAR[] = { (byte) $64, (byte) $a }
(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 word*) RADIX_HEXADECIMAL_VALUES[] = { (word) $1000, (word) $100, (word) $10 }
(const word*) RADIX_OCTAL_VALUES[] = { (word) $8000, (word) $1000, (word) $200, (word) $40, (word) 8 }
(const byte) SIZEOF_STRUCT_PRINTF_BUFFER_NUMBER = (byte) $c
(void()) main()
(label) main::@1
(label) main::@10
(label) main::@11
(label) main::@12
(label) main::@13
(label) main::@14
(label) main::@15
(label) main::@16
(label) main::@17
(label) main::@18
(label) main::@19
(label) main::@2
(label) main::@20
(label) main::@21
(label) main::@22
(label) main::@23
(label) main::@24
(label) main::@25
(label) main::@26
(label) main::@27
(label) main::@3
(label) main::@4
(label) main::@5
(label) main::@6
(label) main::@7
(label) main::@8
(label) main::@9
(label) main::@return
(volatile byte) main::c loadstore zp[1]:22 11.0
(const signed byte) main::sc = (signed byte) -$c
(const signed word) main::si = (signed word) -$4d2
(const signed dword) main::sl = (signed dword) -$1e240
(const byte*) main::str[(byte) 9] = (byte*) "A char: "
(const byte*) main::str1[(byte) 2] = (byte*) "
"
(const byte*) main::str10[(byte) $f] = (byte*) "A signed int: "
(const byte*) main::str12[(byte) $12] = (byte*) "An unsigned int: "
(const byte*) main::str14[(byte) $10] = (byte*) "A signed long: "
(const byte*) main::str16[(byte) $13] = (byte*) "An unsigned long: "
(const byte*) main::str2[(byte) $c] = (byte*) "A pointer: "
(const byte*) main::str4[(byte) $c] = (byte*) "A percent: "
(const byte*) main::str6[(byte) $10] = (byte*) "A signed char: "
(const byte*) main::str8[(byte) $13] = (byte*) "An unsigned char: "
(const byte) main::uc = (byte) $22
(const word) main::ui = (word) $162e
(const dword) main::ul = (dword) $8aa52
(void*()) memcpy((void*) memcpy::destination , (void*) memcpy::source , (word) memcpy::num)
(label) memcpy::@1
(label) memcpy::@2
(label) memcpy::@return
(void*) memcpy::destination
(const void*) memcpy::destination#0 destination = (void*)(const byte*) printf_screen
(byte*) memcpy::dst
(byte*) memcpy::dst#1 dst zp[2]:11 1.000000001E9
(byte*) memcpy::dst#2 dst zp[2]:11 1.000000001E9
(word) memcpy::num
(const word) memcpy::num#0 num = (word)(number) $28*(number) $19-(number) $28
(void*) memcpy::return
(void*) memcpy::source
(const void*) memcpy::source#0 source = (void*)(const byte*) printf_screen+(byte) $28
(byte*) memcpy::src
(byte*) memcpy::src#1 src zp[2]:8 2.000000002E9
(byte*) memcpy::src#2 src zp[2]:8 1.000000001E9
(byte*) memcpy::src_end
(const byte*) memcpy::src_end#0 src_end = (byte*)(const void*) memcpy::source#0+(const word) memcpy::num#0
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
(label) memset::@1
(label) memset::@2
(label) memset::@3
(label) memset::@return
(byte) memset::c
(byte) memset::c#4 reg byte x 1.25000000125E8
(byte*) memset::dst
(byte*) memset::dst#1 dst zp[2]:11 2.000000002E9
(byte*) memset::dst#2 dst zp[2]:11 1.3366666683333335E9
(byte*) memset::dst#4 dst zp[2]:11 2.0000002E7
(byte*) memset::end
(byte*) memset::end#0 end zp[2]:8 1.683333336666667E8
(word) memset::num
(word) memset::num#2 num zp[2]:8 1.0000001E7
(void*) memset::return
(void*) memset::str
(void*) memset::str#3 str zp[2]:11
(struct printf_buffer_number) printf_buffer loadstore mem[12] = {}
(const byte*) printf_buffer_number::digits[(number) $b] = { fill( $b, 0) }
(byte) printf_buffer_number::sign
(void()) printf_char((byte) printf_char::ch)
(byte*~) printf_char::$8 zp[2]:20 2000002.0
(label) printf_char::@1
(label) printf_char::@2
(label) printf_char::@3
(label) printf_char::@return
(byte) printf_char::ch
(byte) printf_char::ch#0 reg byte a 200002.0
(byte) printf_char::ch#1 reg byte a 200002.0
(byte) printf_char::ch#2 reg byte a 2002.0
(byte) printf_char::ch#3 reg byte a 22.0
(byte) printf_char::ch#5 reg byte a 1201015.0
(byte*) printf_char_cursor loadstore zp[2]:20 654546.1333333328
(void()) printf_cls()
(label) printf_cls::@1
(label) printf_cls::@return
(byte) printf_format_number::justify_left
(byte) printf_format_number::min_length
(byte) printf_format_number::radix
(byte) printf_format_number::sign_always
(byte) printf_format_number::zero_padding
(byte) printf_format_string::justify_left
(byte) printf_format_string::min_length
(byte*) printf_line_cursor loadstore zp[2]:18 1875777.6956521738
(void()) printf_ln()
(label) printf_ln::@1
(label) printf_ln::@2
(label) printf_ln::@return
(void()) printf_number_buffer((byte) printf_number_buffer::buffer_sign , (byte*) printf_number_buffer::buffer_digits , (byte) printf_number_buffer::format_min_length , (byte) printf_number_buffer::format_justify_left , (byte) printf_number_buffer::format_sign_always , (byte) printf_number_buffer::format_zero_padding , (byte) printf_number_buffer::format_radix)
(word~) printf_number_buffer::$18 zp[2]:11 1001.0
(label) printf_number_buffer::@1
(label) printf_number_buffer::@10
(label) printf_number_buffer::@11
(label) printf_number_buffer::@12
(label) printf_number_buffer::@13
(label) printf_number_buffer::@14
(label) printf_number_buffer::@15
(label) printf_number_buffer::@16
(label) printf_number_buffer::@17
(label) printf_number_buffer::@18
(label) printf_number_buffer::@19
(label) printf_number_buffer::@2
(label) printf_number_buffer::@3
(label) printf_number_buffer::@4
(label) printf_number_buffer::@5
(label) printf_number_buffer::@6
(label) printf_number_buffer::@7
(label) printf_number_buffer::@8
(label) printf_number_buffer::@9
(label) printf_number_buffer::@return
(struct printf_buffer_number) printf_number_buffer::buffer
(byte*) printf_number_buffer::buffer_digits
(byte*) printf_number_buffer::buffer_digits#10 buffer_digits zp[2]:16 77.0
(byte) printf_number_buffer::buffer_sign
(byte) printf_number_buffer::buffer_sign#0 buffer_sign zp[1]:13 202.0
(byte) printf_number_buffer::buffer_sign#1 buffer_sign zp[1]:13 202.0
(byte) printf_number_buffer::buffer_sign#10 buffer_sign zp[1]:13 180.45
(byte) printf_number_buffer::buffer_sign#2 buffer_sign zp[1]:13 202.0
(byte) printf_number_buffer::buffer_sign#3 buffer_sign zp[1]:13 202.0
(byte) printf_number_buffer::buffer_sign#4 buffer_sign zp[1]:13 202.0
(byte) printf_number_buffer::buffer_sign#5 buffer_sign zp[1]:13 202.0
(struct printf_format_number) printf_number_buffer::format
(byte) printf_number_buffer::format_justify_left
(byte) printf_number_buffer::format_justify_left#10 format_justify_left zp[1]:3 71.5
(byte) printf_number_buffer::format_min_length
(byte) printf_number_buffer::format_min_length#10 reg byte x 100.1
(byte) printf_number_buffer::format_radix
(byte) printf_number_buffer::format_sign_always
(byte) printf_number_buffer::format_zero_padding
(byte) printf_number_buffer::format_zero_padding#10 format_zero_padding zp[1]:10 103.55172413793102
(signed byte) printf_number_buffer::len
(signed byte) printf_number_buffer::len#0 reg byte y 1501.5
(signed byte) printf_number_buffer::len#1 reg byte y 2002.0
(signed byte) printf_number_buffer::len#2 reg byte y 3003.0
(signed byte) printf_number_buffer::padding
(signed byte) printf_number_buffer::padding#1 padding zp[1]:14 1001.0
(signed byte) printf_number_buffer::padding#10 padding zp[1]:14 222.44444444444446
(void()) printf_padding((byte) printf_padding::pad , (byte) printf_padding::length)
(label) printf_padding::@1
(label) printf_padding::@2
(label) printf_padding::@3
(label) printf_padding::@return
(byte) printf_padding::i
(byte) printf_padding::i#1 i zp[1]:2 200002.0
(byte) printf_padding::i#2 i zp[1]:2 75000.75
(byte) printf_padding::length
(byte) printf_padding::length#0 length zp[1]:15 2002.0
(byte) printf_padding::length#1 length zp[1]:15 2002.0
(byte) printf_padding::length#2 length zp[1]:15 2002.0
(byte) printf_padding::length#4 length zp[1]:15 17167.333333333332
(byte) printf_padding::pad
(byte) printf_padding::pad#5 pad zp[1]:29 16666.833333333332
(void()) printf_schar((signed byte) printf_schar::value , (byte) printf_schar::format_min_length , (byte) printf_schar::format_justify_left , (byte) printf_schar::format_sign_always , (byte) printf_schar::format_zero_padding , (byte) printf_schar::format_radix)
(label) printf_schar::@1
(label) printf_schar::@2
(label) printf_schar::@3
(label) printf_schar::@return
(struct printf_format_number) printf_schar::format
(byte) printf_schar::format_justify_left
(const byte) printf_schar::format_justify_left#0 format_justify_left = (byte) 0
(byte) printf_schar::format_min_length
(const byte) printf_schar::format_min_length#0 format_min_length = (byte) 0
(byte) printf_schar::format_radix
(byte) printf_schar::format_sign_always
(byte) printf_schar::format_zero_padding
(const byte) printf_schar::format_zero_padding#0 format_zero_padding = (byte) 0
(byte) printf_schar::uvalue
(const byte) printf_schar::uvalue#0 uvalue = (byte)(const signed byte) printf_schar::value#0
(signed byte) printf_schar::value
(const signed byte) printf_schar::value#0 value = -(const signed byte) main::sc
(const byte*) printf_screen = (byte*) 1024
(void()) printf_sint((signed word) printf_sint::value , (byte) printf_sint::format_min_length , (byte) printf_sint::format_justify_left , (byte) printf_sint::format_sign_always , (byte) printf_sint::format_zero_padding , (byte) printf_sint::format_radix)
(label) printf_sint::@1
(label) printf_sint::@2
(label) printf_sint::@3
(label) printf_sint::@return
(struct printf_format_number) printf_sint::format
(byte) printf_sint::format_justify_left
(const byte) printf_sint::format_justify_left#0 format_justify_left = (byte) 0
(byte) printf_sint::format_min_length
(const byte) printf_sint::format_min_length#0 format_min_length = (byte) 0
(byte) printf_sint::format_radix
(byte) printf_sint::format_sign_always
(byte) printf_sint::format_zero_padding
(const byte) printf_sint::format_zero_padding#0 format_zero_padding = (byte) 0
(word) printf_sint::uvalue
(const word) printf_sint::uvalue#0 uvalue = (word)(const signed word) printf_sint::value#0
(signed word) printf_sint::value
(const signed word) printf_sint::value#0 value = -(const signed word) main::si
(void()) printf_slong((signed dword) printf_slong::value , (byte) printf_slong::format_min_length , (byte) printf_slong::format_justify_left , (byte) printf_slong::format_sign_always , (byte) printf_slong::format_zero_padding , (byte) printf_slong::format_radix)
(label) printf_slong::@1
(label) printf_slong::@2
(label) printf_slong::@3
(label) printf_slong::@return
(struct printf_format_number) printf_slong::format
(byte) printf_slong::format_justify_left
(const byte) printf_slong::format_justify_left#0 format_justify_left = (byte) 0
(byte) printf_slong::format_min_length
(const byte) printf_slong::format_min_length#0 format_min_length = (byte) 0
(byte) printf_slong::format_radix
(byte) printf_slong::format_sign_always
(byte) printf_slong::format_zero_padding
(const byte) printf_slong::format_zero_padding#0 format_zero_padding = (byte) 0
(dword) printf_slong::uvalue
(const dword) printf_slong::uvalue#0 uvalue = (dword)(const signed dword) printf_slong::value#0
(signed dword) printf_slong::value
(const signed dword) printf_slong::value#0 value = -(const signed dword) main::sl
(void()) printf_str((byte*) printf_str::str)
(label) printf_str::@1
(label) printf_str::@2
(label) printf_str::@3
(label) printf_str::@4
(label) printf_str::@5
(label) printf_str::@return
(byte) printf_str::ch
(byte) printf_str::ch#0 reg byte a 100001.0
(byte*) printf_str::str
(byte*) printf_str::str#0 str zp[2]:16 42857.57142857143
(byte*) printf_str::str#1 str zp[2]:16 2002.0
(byte*) printf_str::str#20 str zp[2]:16 205002.5
(byte*) printf_str::str#22 str zp[2]:16 11002.0
(void()) printf_uchar((byte) printf_uchar::uvalue , (byte) printf_uchar::format_min_length , (byte) printf_uchar::format_justify_left , (byte) printf_uchar::format_sign_always , (byte) printf_uchar::format_zero_padding , (byte) printf_uchar::format_radix)
(label) printf_uchar::@1
(label) printf_uchar::@2
(label) printf_uchar::@return
(struct printf_format_number) printf_uchar::format
(byte) printf_uchar::format_justify_left
(const byte) printf_uchar::format_justify_left#0 format_justify_left = (byte) 0
(byte) printf_uchar::format_min_length
(const byte) printf_uchar::format_min_length#0 format_min_length = (byte) 0
(byte) printf_uchar::format_radix
(byte) printf_uchar::format_sign_always
(byte) printf_uchar::format_zero_padding
(const byte) printf_uchar::format_zero_padding#0 format_zero_padding = (byte) 0
(byte) printf_uchar::uvalue
(void()) printf_uint((word) printf_uint::uvalue , (byte) printf_uint::format_min_length , (byte) printf_uint::format_justify_left , (byte) printf_uint::format_sign_always , (byte) printf_uint::format_zero_padding , (byte) printf_uint::format_radix)
(label) printf_uint::@1
(label) printf_uint::@2
(label) printf_uint::@return
(struct printf_format_number) printf_uint::format
(byte) printf_uint::format_justify_left
(byte) printf_uint::format_min_length
(byte) printf_uint::format_radix
(byte) printf_uint::format_radix#2 reg byte x 33.666666666666664
(byte) printf_uint::format_sign_always
(byte) printf_uint::format_zero_padding
(word) printf_uint::uvalue
(word) printf_uint::uvalue#2 uvalue zp[2]:8 50.5
(void()) printf_ulong((dword) printf_ulong::uvalue , (byte) printf_ulong::format_min_length , (byte) printf_ulong::format_justify_left , (byte) printf_ulong::format_sign_always , (byte) printf_ulong::format_zero_padding , (byte) printf_ulong::format_radix)
(label) printf_ulong::@1
(label) printf_ulong::@2
(label) printf_ulong::@return
(struct printf_format_number) printf_ulong::format
(byte) printf_ulong::format_justify_left
(const byte) printf_ulong::format_justify_left#0 format_justify_left = (byte) 0
(byte) printf_ulong::format_min_length
(const byte) printf_ulong::format_min_length#0 format_min_length = (byte) 0
(byte) printf_ulong::format_radix
(byte) printf_ulong::format_sign_always
(byte) printf_ulong::format_zero_padding
(const byte) printf_ulong::format_zero_padding#0 format_zero_padding = (byte) 0
(dword) printf_ulong::uvalue
(word()) strlen((byte*) strlen::str)
(label) strlen::@1
(label) strlen::@2
(label) strlen::@return
(word) strlen::len
(word) strlen::len#1 len zp[2]:11 100001.0
(word) strlen::len#2 len zp[2]:11 50250.75
(word) strlen::return
(word) strlen::return#2 return zp[2]:11 2002.0
(byte*) strlen::str
(byte*) strlen::str#0 str zp[2]:8 200002.0
(byte*) strlen::str#1 str zp[2]:8 5501.0
(byte*) strlen::str#2 str zp[2]:8 103334.66666666666
(void()) uctoa((byte) uctoa::value , (byte*) uctoa::buffer , (byte) uctoa::radix)
(label) uctoa::@1
(label) uctoa::@2
(label) uctoa::@3
(label) uctoa::@4
(label) uctoa::@5
(label) uctoa::@6
(label) uctoa::@7
(label) uctoa::@return
(byte*) uctoa::buffer
(byte*) uctoa::buffer#10 buffer zp[2]:16 3583.916666666666
(byte*) uctoa::buffer#11 buffer zp[2]:16 1001.0
(byte*) uctoa::buffer#15 buffer zp[2]:16 15001.5
(byte*) uctoa::buffer#3 buffer zp[2]:16 2002.0
(byte*) uctoa::buffer#4 buffer zp[2]:16 20002.0
(byte) uctoa::digit
(byte) uctoa::digit#1 digit zp[1]:14 20002.0
(byte) uctoa::digit#2 digit zp[1]:14 3077.230769230769
(byte) uctoa::digit_value
(byte) uctoa::digit_value#0 digit_value zp[1]:29 6000.6
(byte*) uctoa::digit_values
(byte) uctoa::max_digits
(byte) uctoa::radix
(byte) uctoa::started
(byte) uctoa::started#2 started zp[1]:15 6000.6
(byte) uctoa::started#4 started zp[1]:15 10001.0
(byte) uctoa::value
(byte) uctoa::value#0 reg byte x 10001.0
(byte) uctoa::value#10 reg byte x 1001.0
(byte) uctoa::value#3 reg byte x 7000.999999999999
(byte) uctoa::value#7 reg byte x 15001.5
(byte()) uctoa_append((byte*) uctoa_append::buffer , (byte) uctoa_append::value , (byte) uctoa_append::sub)
(label) uctoa_append::@1
(label) uctoa_append::@2
(label) uctoa_append::@3
(label) uctoa_append::@return
(byte*) uctoa_append::buffer
(byte*) uctoa_append::buffer#0 buffer zp[2]:16 13750.25
(byte) uctoa_append::digit
(byte) uctoa_append::digit#1 reg byte y 1.0000001E7
(byte) uctoa_append::digit#2 reg byte y 1.00500015E7
(byte) uctoa_append::return
(byte) uctoa_append::return#0 reg byte x 20002.0
(byte) uctoa_append::sub
(byte) uctoa_append::sub#0 sub zp[1]:29 3335000.5
(byte) uctoa_append::value
(byte) uctoa_append::value#0 reg byte x 36667.33333333333
(byte) uctoa_append::value#1 reg byte x 2.0000002E7
(byte) uctoa_append::value#2 reg byte x 5018334.166666666
(void()) ultoa((dword) ultoa::value , (byte*) ultoa::buffer , (byte) ultoa::radix)
(byte~) ultoa::$10 reg byte a 20002.0
(byte~) ultoa::$11 reg byte a 2002.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#10 buffer zp[2]:16 3071.9285714285716
(byte*) ultoa::buffer#11 buffer zp[2]:16 1001.0
(byte*) ultoa::buffer#15 buffer zp[2]:16 15001.5
(byte*) ultoa::buffer#3 buffer zp[2]:16 2002.0
(byte*) ultoa::buffer#4 buffer zp[2]:16 20002.0
(byte) ultoa::digit
(byte) ultoa::digit#1 digit zp[1]:3 20002.0
(byte) ultoa::digit#2 digit zp[1]:3 2857.4285714285716
(dword) ultoa::digit_value
(dword) ultoa::digit_value#0 digit_value zp[4]:23 6000.6
(dword*) ultoa::digit_values
(byte) ultoa::max_digits
(byte) ultoa::radix
(byte) ultoa::started
(byte) ultoa::started#2 reg byte x 5000.5
(byte) ultoa::started#4 reg byte x 10001.0
(dword) ultoa::value
(dword) ultoa::value#0 value zp[4]:4 10001.0
(dword) ultoa::value#10 value zp[4]:4 1001.0
(dword) ultoa::value#3 value zp[4]:4 5857.857142857143
(dword) ultoa::value#7 value zp[4]:4 15001.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]:16 13750.25
(byte) ultoa_append::digit
(byte) ultoa_append::digit#1 reg byte x 1.0000001E7
(byte) ultoa_append::digit#2 reg byte x 1.00500015E7
(dword) ultoa_append::return
(dword) ultoa_append::return#0 return zp[4]:4 20002.0
(dword) ultoa_append::sub
(dword) ultoa_append::sub#0 sub zp[4]:23 3335000.5
(dword) ultoa_append::value
(dword) ultoa_append::value#0 value zp[4]:4 36667.33333333333
(dword) ultoa_append::value#1 value zp[4]:4 2.0000002E7
(dword) ultoa_append::value#2 value zp[4]:4 5018334.166666666
(void()) utoa((word) utoa::value , (byte*) utoa::buffer , (byte) utoa::radix)
(byte~) utoa::$10 reg byte a 20002.0
(byte~) utoa::$11 reg byte a 2002.0
(byte~) utoa::$4 reg byte a 20002.0
(label) utoa::@1
(label) utoa::@10
(label) utoa::@11
(label) utoa::@12
(label) utoa::@2
(label) utoa::@3
(label) utoa::@4
(label) utoa::@5
(label) utoa::@6
(label) utoa::@7
(label) utoa::@8
(label) utoa::@9
(label) utoa::@return
(byte*) utoa::buffer
(byte*) utoa::buffer#0 buffer zp[2]:16 1501.5
(byte*) utoa::buffer#1 buffer zp[2]:16 1501.5
(byte*) utoa::buffer#10 buffer zp[2]:16 2867.133333333333
(byte*) utoa::buffer#11 buffer zp[2]:16 429.0
(byte*) utoa::buffer#15 buffer zp[2]:16 15001.5
(byte*) utoa::buffer#2 buffer zp[2]:16 2002.0
(byte*) utoa::buffer#3 buffer zp[2]:16 2002.0
(byte*) utoa::buffer#4 buffer zp[2]:16 20002.0
(byte) utoa::digit
(byte) utoa::digit#1 digit zp[1]:13 20002.0
(byte) utoa::digit#2 digit zp[1]:13 2666.9333333333334
(word) utoa::digit_value
(word) utoa::digit_value#0 digit_value zp[2]:27 6000.6
(word*) utoa::digit_values
(word*) utoa::digit_values#8 digit_values zp[2]:11 588.2941176470588
(byte) utoa::max_digits
(byte) utoa::max_digits#7 max_digits zp[1]:10 588.2941176470588
(byte) utoa::radix
(byte) utoa::radix#1 reg byte x 202.0
(byte) utoa::radix#2 reg byte x 1026.25
(byte) utoa::started
(byte) utoa::started#2 reg byte x 4286.142857142857
(byte) utoa::started#4 reg byte x 10001.0
(word) utoa::value
(word) utoa::value#0 value zp[2]:8 10001.0
(word) utoa::value#10 value zp[2]:8 183.66666666666669
(word) utoa::value#2 value zp[2]:8 101.0
(word) utoa::value#3 value zp[2]:8 5125.625
(word) utoa::value#7 value zp[2]:8 15001.5
(word()) utoa_append((byte*) utoa_append::buffer , (word) utoa_append::value , (word) utoa_append::sub)
(label) utoa_append::@1
(label) utoa_append::@2
(label) utoa_append::@3
(label) utoa_append::@return
(byte*) utoa_append::buffer
(byte*) utoa_append::buffer#0 buffer zp[2]:16 13750.25
(byte) utoa_append::digit
(byte) utoa_append::digit#1 reg byte x 1.0000001E7
(byte) utoa_append::digit#2 reg byte x 1.00500015E7
(word) utoa_append::return
(word) utoa_append::return#0 return zp[2]:8 20002.0
(word) utoa_append::sub
(word) utoa_append::sub#0 sub zp[2]:27 3335000.5
(word) utoa_append::value
(word) utoa_append::value#0 value zp[2]:8 36667.33333333333
(word) utoa_append::value#1 value zp[2]:8 2.0000002E7
(word) utoa_append::value#2 value zp[2]:8 5018334.166666666
reg byte a [ printf_char::ch#5 printf_char::ch#3 printf_char::ch#2 printf_char::ch#0 printf_char::ch#1 ]
reg byte x [ memset::c#4 ]
reg byte x [ printf_number_buffer::format_min_length#10 ]
reg byte y [ printf_number_buffer::len#2 printf_number_buffer::len#0 printf_number_buffer::len#1 ]
zp[1]:2 [ printf_padding::i#2 printf_padding::i#1 ]
zp[1]:3 [ ultoa::digit#2 ultoa::digit#1 printf_number_buffer::format_justify_left#10 ]
zp[4]:4 [ ultoa::value#3 ultoa::value#7 ultoa::value#10 ultoa::value#0 ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 ultoa_append::return#0 ]
reg byte x [ ultoa::started#2 ultoa::started#4 ]
reg byte x [ ultoa_append::digit#2 ultoa_append::digit#1 ]
zp[2]:8 [ printf_uint::uvalue#2 utoa::value#3 utoa::value#7 utoa::value#10 utoa::value#2 utoa::value#0 utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 utoa_append::return#0 strlen::str#2 strlen::str#1 strlen::str#0 memcpy::src#2 memcpy::src#1 memset::num#2 memset::end#0 ]
reg byte x [ printf_uint::format_radix#2 ]
reg byte x [ utoa::radix#2 utoa::radix#1 ]
zp[1]:10 [ utoa::max_digits#7 printf_number_buffer::format_zero_padding#10 ]
zp[2]:11 [ utoa::digit_values#8 strlen::len#2 strlen::len#1 strlen::return#2 printf_number_buffer::$18 memcpy::dst#2 memcpy::dst#1 memset::str#3 memset::dst#2 memset::dst#4 memset::dst#1 ]
zp[1]:13 [ utoa::digit#2 utoa::digit#1 printf_number_buffer::buffer_sign#10 printf_number_buffer::buffer_sign#4 printf_number_buffer::buffer_sign#2 printf_number_buffer::buffer_sign#0 printf_number_buffer::buffer_sign#5 printf_number_buffer::buffer_sign#3 printf_number_buffer::buffer_sign#1 ]
reg byte x [ utoa::started#2 utoa::started#4 ]
reg byte x [ utoa_append::digit#2 utoa_append::digit#1 ]
zp[1]:14 [ uctoa::digit#2 uctoa::digit#1 printf_number_buffer::padding#10 printf_number_buffer::padding#1 ]
reg byte x [ uctoa::value#3 uctoa::value#7 uctoa::value#10 uctoa::value#0 ]
zp[1]:15 [ uctoa::started#2 uctoa::started#4 printf_padding::length#4 printf_padding::length#1 printf_padding::length#2 printf_padding::length#0 ]
zp[2]:16 [ uctoa::buffer#10 uctoa::buffer#15 uctoa::buffer#11 uctoa::buffer#4 uctoa::buffer#3 uctoa_append::buffer#0 utoa::buffer#10 utoa::buffer#15 utoa::buffer#11 utoa::buffer#4 utoa::buffer#0 utoa::buffer#3 utoa_append::buffer#0 utoa::buffer#1 utoa::buffer#2 ultoa::buffer#10 ultoa::buffer#15 ultoa::buffer#11 ultoa::buffer#4 ultoa::buffer#3 ultoa_append::buffer#0 printf_str::str#20 printf_str::str#22 printf_str::str#1 printf_str::str#0 printf_number_buffer::buffer_digits#10 ]
reg byte x [ uctoa_append::value#2 uctoa_append::value#0 uctoa_append::value#1 ]
reg byte y [ uctoa_append::digit#2 uctoa_append::digit#1 ]
zp[2]:18 [ printf_line_cursor ]
zp[2]:20 [ printf_char_cursor printf_char::$8 ]
zp[1]:22 [ main::c ]
reg byte a [ printf_str::ch#0 ]
reg byte a [ ultoa::$11 ]
reg byte a [ ultoa::$10 ]
zp[4]:23 [ ultoa::digit_value#0 ultoa_append::sub#0 ]
reg byte a [ utoa::$4 ]
reg byte a [ utoa::$11 ]
reg byte a [ utoa::$10 ]
zp[2]:27 [ utoa::digit_value#0 utoa_append::sub#0 ]
zp[1]:29 [ uctoa::digit_value#0 uctoa_append::sub#0 printf_padding::pad#5 ]
reg byte x [ uctoa_append::return#0 ]
mem[12] [ printf_buffer ]

1405
src/test/ref/printf-13.asm Normal file

File diff suppressed because it is too large Load Diff

807
src/test/ref/printf-13.cfg Normal file

@ -0,0 +1,807 @@
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
[1] (byte*) printf_line_cursor ← (byte*) 1024
[2] (byte*) printf_char_cursor ← (byte*) 1024
to:@2
@2: scope:[] from @1
[3] phi()
[4] call main
to:@end
@end: scope:[] from @2
[5] phi()
(void()) main()
main: scope:[main] from @2
[6] phi()
[7] call printf_cls
to:main::@1
main::@1: scope:[main] from main
[8] phi()
[9] call printf_str
to:main::@2
main::@2: scope:[main] from main::@1
[10] phi()
[11] call printf_char
to:main::@3
main::@3: scope:[main] from main::@2
[12] phi()
[13] call printf_str
to:main::@4
main::@4: scope:[main] from main::@3
[14] phi()
[15] call printf_string
to:main::@5
main::@5: scope:[main] from main::@4
[16] phi()
[17] call printf_str
to:main::@6
main::@6: scope:[main] from main::@5
[18] phi()
[19] call printf_string
to:main::@7
main::@7: scope:[main] from main::@6
[20] phi()
[21] call printf_str
to:main::@8
main::@8: scope:[main] from main::@7
[22] phi()
[23] call printf_string
to:main::@9
main::@9: scope:[main] from main::@8
[24] phi()
[25] call printf_str
to:main::@10
main::@10: scope:[main] from main::@9
[26] phi()
[27] call printf_string
to:main::@11
main::@11: scope:[main] from main::@10
[28] phi()
[29] call printf_str
to:main::@12
main::@12: scope:[main] from main::@11
[30] phi()
[31] call printf_str
to:main::@13
main::@13: scope:[main] from main::@12
[32] phi()
[33] call printf_char
to:main::@14
main::@14: scope:[main] from main::@13
[34] phi()
[35] call printf_str
to:main::@15
main::@15: scope:[main] from main::@14
[36] phi()
[37] call printf_string
to:main::@16
main::@16: scope:[main] from main::@15
[38] phi()
[39] call printf_str
to:main::@17
main::@17: scope:[main] from main::@16
[40] phi()
[41] call printf_string
to:main::@18
main::@18: scope:[main] from main::@17
[42] phi()
[43] call printf_str
to:main::@19
main::@19: scope:[main] from main::@18
[44] phi()
[45] call printf_string
to:main::@20
main::@20: scope:[main] from main::@19
[46] phi()
[47] call printf_str
to:main::@21
main::@21: scope:[main] from main::@20
[48] phi()
[49] call printf_string
to:main::@22
main::@22: scope:[main] from main::@21
[50] phi()
[51] call printf_str
to:main::@23
main::@23: scope:[main] from main::@22
[52] phi()
[53] call printf_str
to:main::@24
main::@24: scope:[main] from main::@23
[54] phi()
[55] call printf_char
to:main::@25
main::@25: scope:[main] from main::@24
[56] phi()
[57] call printf_str
to:main::@26
main::@26: scope:[main] from main::@25
[58] phi()
[59] call printf_sint
to:main::@27
main::@27: scope:[main] from main::@26
[60] phi()
[61] call printf_str
to:main::@28
main::@28: scope:[main] from main::@27
[62] phi()
[63] call printf_sint
to:main::@29
main::@29: scope:[main] from main::@28
[64] phi()
[65] call printf_str
to:main::@30
main::@30: scope:[main] from main::@29
[66] phi()
[67] call printf_sint
to:main::@31
main::@31: scope:[main] from main::@30
[68] phi()
[69] call printf_str
to:main::@32
main::@32: scope:[main] from main::@31
[70] phi()
[71] call printf_sint
to:main::@33
main::@33: scope:[main] from main::@32
[72] phi()
[73] call printf_str
to:main::@34
main::@34: scope:[main] from main::@33
[74] phi()
[75] call printf_str
to:main::@35
main::@35: scope:[main] from main::@34
[76] phi()
[77] call printf_char
to:main::@36
main::@36: scope:[main] from main::@35
[78] phi()
[79] call printf_str
to:main::@37
main::@37: scope:[main] from main::@36
[80] phi()
[81] call printf_sint
to:main::@38
main::@38: scope:[main] from main::@37
[82] phi()
[83] call printf_str
to:main::@39
main::@39: scope:[main] from main::@38
[84] phi()
[85] call printf_sint
to:main::@40
main::@40: scope:[main] from main::@39
[86] phi()
[87] call printf_str
to:main::@41
main::@41: scope:[main] from main::@40
[88] phi()
[89] call printf_sint
to:main::@42
main::@42: scope:[main] from main::@41
[90] phi()
[91] call printf_str
to:main::@43
main::@43: scope:[main] from main::@42
[92] phi()
[93] call printf_sint
to:main::@44
main::@44: scope:[main] from main::@43
[94] phi()
[95] call printf_str
to:main::@45
main::@45: scope:[main] from main::@44
[96] phi()
[97] call printf_str
to:main::@46
main::@46: scope:[main] from main::@45
[98] phi()
[99] call printf_char
to:main::@47
main::@47: scope:[main] from main::@46
[100] phi()
[101] call printf_str
to:main::@48
main::@48: scope:[main] from main::@47
[102] phi()
[103] call printf_sint
to:main::@49
main::@49: scope:[main] from main::@48
[104] phi()
[105] call printf_str
to:main::@50
main::@50: scope:[main] from main::@49
[106] phi()
[107] call printf_sint
to:main::@51
main::@51: scope:[main] from main::@50
[108] phi()
[109] call printf_str
to:main::@52
main::@52: scope:[main] from main::@51
[110] phi()
[111] call printf_sint
to:main::@53
main::@53: scope:[main] from main::@52
[112] phi()
[113] call printf_str
to:main::@54
main::@54: scope:[main] from main::@53
[114] phi()
[115] call printf_sint
to:main::@55
main::@55: scope:[main] from main::@54
[116] phi()
[117] call printf_str
to:main::@56
main::@56: scope:[main] from main::@55
[118] phi()
[119] call printf_str
to:main::@57
main::@57: scope:[main] from main::@56
[120] phi()
[121] call printf_char
to:main::@58
main::@58: scope:[main] from main::@57
[122] phi()
[123] call printf_str
to:main::@59
main::@59: scope:[main] from main::@58
[124] phi()
[125] call printf_sint
to:main::@60
main::@60: scope:[main] from main::@59
[126] phi()
[127] call printf_str
to:main::@61
main::@61: scope:[main] from main::@60
[128] phi()
[129] call printf_sint
to:main::@62
main::@62: scope:[main] from main::@61
[130] phi()
[131] call printf_str
to:main::@63
main::@63: scope:[main] from main::@62
[132] phi()
[133] call printf_sint
to:main::@64
main::@64: scope:[main] from main::@63
[134] phi()
[135] call printf_str
to:main::@65
main::@65: scope:[main] from main::@64
[136] phi()
[137] call printf_sint
to:main::@66
main::@66: scope:[main] from main::@65
[138] phi()
[139] call printf_str
to:main::@67
main::@67: scope:[main] from main::@66
[140] phi()
[141] call printf_str
to:main::@68
main::@68: scope:[main] from main::@67
[142] phi()
[143] call printf_char
to:main::@69
main::@69: scope:[main] from main::@68
[144] phi()
[145] call printf_str
to:main::@70
main::@70: scope:[main] from main::@69
[146] phi()
[147] call printf_uint
to:main::@71
main::@71: scope:[main] from main::@70
[148] phi()
[149] call printf_str
to:main::@72
main::@72: scope:[main] from main::@71
[150] phi()
[151] call printf_uint
to:main::@73
main::@73: scope:[main] from main::@72
[152] phi()
[153] call printf_str
to:main::@74
main::@74: scope:[main] from main::@73
[154] phi()
[155] call printf_uint
to:main::@75
main::@75: scope:[main] from main::@74
[156] phi()
[157] call printf_str
to:main::@76
main::@76: scope:[main] from main::@75
[158] phi()
[159] call printf_uint
to:main::@77
main::@77: scope:[main] from main::@76
[160] phi()
[161] call printf_str
to:main::@78
main::@78: scope:[main] from main::@77
[162] phi()
[163] call printf_str
to:main::@79
main::@79: scope:[main] from main::@78
[164] phi()
[165] call printf_char
to:main::@80
main::@80: scope:[main] from main::@79
[166] phi()
[167] call printf_str
to:main::@81
main::@81: scope:[main] from main::@80
[168] phi()
[169] call printf_uint
to:main::@82
main::@82: scope:[main] from main::@81
[170] phi()
[171] call printf_str
to:main::@83
main::@83: scope:[main] from main::@82
[172] phi()
[173] call printf_uint
to:main::@84
main::@84: scope:[main] from main::@83
[174] phi()
[175] call printf_str
to:main::@85
main::@85: scope:[main] from main::@84
[176] phi()
[177] call printf_uint
to:main::@86
main::@86: scope:[main] from main::@85
[178] phi()
[179] call printf_str
to:main::@87
main::@87: scope:[main] from main::@86
[180] phi()
[181] call printf_uint
to:main::@88
main::@88: scope:[main] from main::@87
[182] phi()
[183] call printf_str
to:main::@return
main::@return: scope:[main] from main::@88
[184] return
to:@return
(void()) printf_str((byte*) printf_str::str)
printf_str: scope:[printf_str] from main::@1 main::@11 main::@12 main::@14 main::@16 main::@18 main::@20 main::@22 main::@23 main::@25 main::@27 main::@29 main::@3 main::@31 main::@33 main::@34 main::@36 main::@38 main::@40 main::@42 main::@44 main::@45 main::@47 main::@49 main::@5 main::@51 main::@53 main::@55 main::@56 main::@58 main::@60 main::@62 main::@64 main::@66 main::@67 main::@69 main::@7 main::@71 main::@73 main::@75 main::@77 main::@78 main::@80 main::@82 main::@84 main::@86 main::@88 main::@9 printf_number_buffer::@4 printf_string::@2
[185] (byte*) printf_str::str#53 ← phi( main::@1/(const byte*) main::str main::@11/(const byte*) main::str9 main::@12/(const byte*) main::str main::@14/(const byte*) main::str11 main::@16/(const byte*) main::str3 main::@18/(const byte*) main::str3 main::@20/(const byte*) main::str3 main::@22/(const byte*) main::str9 main::@23/(const byte*) main::str main::@25/(const byte*) main::str21 main::@27/(const byte*) main::str3 main::@29/(const byte*) main::str3 main::@3/(const byte*) main::str1 main::@31/(const byte*) main::str3 main::@33/(const byte*) main::str9 main::@34/(const byte*) main::str main::@36/(const byte*) main::str27 main::@38/(const byte*) main::str3 main::@40/(const byte*) main::str3 main::@42/(const byte*) main::str3 main::@44/(const byte*) main::str9 main::@45/(const byte*) main::str main::@47/(const byte*) main::str33 main::@49/(const byte*) main::str3 main::@5/(const byte*) main::str3 main::@51/(const byte*) main::str3 main::@53/(const byte*) main::str3 main::@55/(const byte*) main::str9 main::@56/(const byte*) main::str main::@58/(const byte*) main::str39 main::@60/(const byte*) main::str3 main::@62/(const byte*) main::str3 main::@64/(const byte*) main::str3 main::@66/(const byte*) main::str9 main::@67/(const byte*) main::str main::@69/(const byte*) main::str45 main::@7/(const byte*) main::str3 main::@71/(const byte*) main::str3 main::@73/(const byte*) main::str3 main::@75/(const byte*) main::str3 main::@77/(const byte*) main::str9 main::@78/(const byte*) main::str main::@80/(const byte*) main::str51 main::@82/(const byte*) main::str3 main::@84/(const byte*) main::str3 main::@86/(const byte*) main::str3 main::@88/(const byte*) main::str9 main::@9/(const byte*) main::str3 printf_number_buffer::@4/(byte*) printf_str::str#1 printf_string::@2/(byte*) printf_str::str#2 )
to:printf_str::@1
printf_str::@1: scope:[printf_str] from printf_str printf_str::@4 printf_str::@5
[186] (byte*) printf_str::str#51 ← phi( printf_str/(byte*) printf_str::str#53 printf_str::@4/(byte*) printf_str::str#0 printf_str::@5/(byte*) printf_str::str#0 )
to:printf_str::@2
printf_str::@2: scope:[printf_str] from printf_str::@1
[187] (byte) printf_str::ch#0 ← *((byte*) printf_str::str#51)
[188] (byte*) printf_str::str#0 ← ++ (byte*) printf_str::str#51
[189] if((byte) printf_str::ch#0!=(byte) 0) goto printf_str::@3
to:printf_str::@return
printf_str::@return: scope:[printf_str] from printf_str::@2
[190] return
to:@return
printf_str::@3: scope:[printf_str] from printf_str::@2
[191] if((byte) printf_str::ch#0==(byte) '
') goto printf_str::@4
to:printf_str::@5
printf_str::@5: scope:[printf_str] from printf_str::@3
[192] (byte) printf_char::ch#1 ← (byte) printf_str::ch#0
[193] call printf_char
to:printf_str::@1
printf_str::@4: scope:[printf_str] from printf_str::@3
[194] phi()
[195] call printf_ln
to:printf_str::@1
(void()) printf_ln()
printf_ln: scope:[printf_ln] from printf_str::@4
[196] phi()
to:printf_ln::@1
printf_ln::@1: scope:[printf_ln] from printf_ln printf_ln::@1
[197] (byte*) printf_line_cursor ← (byte*) printf_line_cursor + (byte) $28
[198] if((byte*) printf_line_cursor<(byte*) printf_char_cursor) goto printf_ln::@1
to:printf_ln::@2
printf_ln::@2: scope:[printf_ln] from printf_ln::@1
[199] (byte*) printf_char_cursor ← (byte*) printf_line_cursor
to:printf_ln::@return
printf_ln::@return: scope:[printf_ln] from printf_ln::@2
[200] return
to:@return
(void()) printf_char((byte) printf_char::ch)
printf_char: scope:[printf_char] from main::@13 main::@2 main::@24 main::@35 main::@46 main::@57 main::@68 main::@79 printf_number_buffer::@8 printf_padding::@2 printf_str::@5
[201] (byte) printf_char::ch#11 ← phi( main::@13/(byte) '%' main::@2/(byte) '%' main::@24/(byte) '%' main::@35/(byte) '%' main::@46/(byte) '%' main::@57/(byte) '%' main::@68/(byte) '%' main::@79/(byte) '%' printf_number_buffer::@8/(byte) printf_char::ch#2 printf_padding::@2/(byte) printf_char::ch#0 printf_str::@5/(byte) printf_char::ch#1 )
[202] *((byte*) printf_char_cursor) ← (byte) printf_char::ch#11
[203] (byte*) printf_char_cursor ← ++ (byte*) printf_char_cursor
[204] if((byte*) printf_char_cursor<(const byte*) printf_screen+(word)(number) $28*(number) $19) goto printf_char::@return
to:printf_char::@1
printf_char::@1: scope:[printf_char] from printf_char
[205] phi()
[206] call memcpy
to:printf_char::@2
printf_char::@2: scope:[printf_char] from printf_char::@1
[207] phi()
[208] call memset
to:printf_char::@3
printf_char::@3: scope:[printf_char] from printf_char::@2
[209] (byte*~) printf_char::$8 ← (byte*) printf_char_cursor - (byte) $28
[210] (byte*) printf_char_cursor ← (byte*~) printf_char::$8
[211] (byte*) printf_line_cursor ← (byte*) printf_char_cursor
to:printf_char::@return
printf_char::@return: scope:[printf_char] from printf_char printf_char::@3
[212] return
to:@return
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
memset: scope:[memset] from printf_char::@2 printf_cls
[213] (byte) memset::c#4 ← phi( printf_char::@2/(byte) ' ' printf_cls/(byte) ' ' )
[213] (void*) memset::str#3 ← phi( printf_char::@2/(void*)(const byte*) printf_screen+(word)(number) $28*(number) $19-(byte) $28 printf_cls/(void*)(const byte*) printf_screen )
[213] (word) memset::num#2 ← phi( printf_char::@2/(byte) $28 printf_cls/(word)(number) $28*(number) $19 )
[214] if((word) memset::num#2<=(byte) 0) goto memset::@return
to:memset::@1
memset::@1: scope:[memset] from memset
[215] (byte*) memset::end#0 ← (byte*)(void*) memset::str#3 + (word) memset::num#2
[216] (byte*) memset::dst#4 ← (byte*)(void*) memset::str#3
to:memset::@2
memset::@2: scope:[memset] from memset::@1 memset::@3
[217] (byte*) memset::dst#2 ← phi( memset::@1/(byte*) memset::dst#4 memset::@3/(byte*) memset::dst#1 )
[218] if((byte*) memset::dst#2!=(byte*) memset::end#0) goto memset::@3
to:memset::@return
memset::@return: scope:[memset] from memset memset::@2
[219] return
to:@return
memset::@3: scope:[memset] from memset::@2
[220] *((byte*) memset::dst#2) ← (byte) memset::c#4
[221] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2
to:memset::@2
(void*()) memcpy((void*) memcpy::destination , (void*) memcpy::source , (word) memcpy::num)
memcpy: scope:[memcpy] from printf_char::@1
[222] phi()
to:memcpy::@1
memcpy::@1: scope:[memcpy] from memcpy memcpy::@2
[223] (byte*) memcpy::dst#2 ← phi( memcpy/(byte*)(const void*) memcpy::destination#0 memcpy::@2/(byte*) memcpy::dst#1 )
[223] (byte*) memcpy::src#2 ← phi( memcpy/(byte*)(const void*) memcpy::source#0 memcpy::@2/(byte*) memcpy::src#1 )
[224] if((byte*) memcpy::src#2!=(const byte*) memcpy::src_end#0) goto memcpy::@2
to:memcpy::@return
memcpy::@return: scope:[memcpy] from memcpy::@1
[225] return
to:@return
memcpy::@2: scope:[memcpy] from memcpy::@1
[226] *((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#2)
[227] (byte*) memcpy::dst#1 ← ++ (byte*) memcpy::dst#2
[228] (byte*) memcpy::src#1 ← ++ (byte*) memcpy::src#2
to:memcpy::@1
(void()) printf_uint((word) printf_uint::uvalue , (byte) printf_uint::format_min_length , (byte) printf_uint::format_justify_left , (byte) printf_uint::format_sign_always , (byte) printf_uint::format_zero_padding , (byte) printf_uint::format_radix)
printf_uint: scope:[printf_uint] from main::@70 main::@72 main::@74 main::@76 main::@81 main::@83 main::@85 main::@87
[229] (byte) printf_uint::format_radix#10 ← phi( main::@70/(const byte) OCTAL main::@72/(const byte) OCTAL main::@74/(const byte) OCTAL main::@76/(const byte) OCTAL main::@81/(const byte) HEXADECIMAL main::@83/(const byte) HEXADECIMAL main::@85/(const byte) HEXADECIMAL main::@87/(const byte) HEXADECIMAL )
[229] (word) printf_uint::uvalue#10 ← phi( main::@70/(byte) 1 main::@72/(byte) $b main::@74/(byte) $6f main::@76/(word) $457 main::@81/(byte) 1 main::@83/(byte) $b main::@85/(byte) $6f main::@87/(word) $457 )
to:printf_uint::@1
printf_uint::@1: scope:[printf_uint] from printf_uint
[230] *((byte*)&(struct printf_buffer_number) printf_buffer) ← (byte) 0
[231] (word) utoa::value#2 ← (word) printf_uint::uvalue#10
[232] (byte) utoa::radix#1 ← (byte) printf_uint::format_radix#10
[233] call utoa
to:printf_uint::@2
printf_uint::@2: scope:[printf_uint] from printf_uint::@1
[234] (byte) printf_number_buffer::buffer_sign#1 ← *((byte*)&(struct printf_buffer_number) printf_buffer)
[235] call printf_number_buffer
to:printf_uint::@return
printf_uint::@return: scope:[printf_uint] from printf_uint::@2
[236] return
to:@return
(void()) printf_number_buffer((byte) printf_number_buffer::buffer_sign , (byte*) printf_number_buffer::buffer_digits , (byte) printf_number_buffer::format_min_length , (byte) printf_number_buffer::format_justify_left , (byte) printf_number_buffer::format_sign_always , (byte) printf_number_buffer::format_zero_padding , (byte) printf_number_buffer::format_radix)
printf_number_buffer: scope:[printf_number_buffer] from printf_sint::@5 printf_uint::@2
[237] (byte) printf_number_buffer::buffer_sign#10 ← phi( printf_sint::@5/(byte) printf_number_buffer::buffer_sign#0 printf_uint::@2/(byte) printf_number_buffer::buffer_sign#1 )
[237] (byte*) printf_number_buffer::buffer_digits#10 ← phi( printf_sint::@5/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS printf_uint::@2/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS )
[237] (byte) printf_number_buffer::format_zero_padding#10 ← phi( printf_sint::@5/(byte) printf_number_buffer::format_zero_padding#0 printf_uint::@2/(byte) 0 )
[237] (byte) printf_number_buffer::format_justify_left#10 ← phi( printf_sint::@5/(byte) printf_number_buffer::format_justify_left#0 printf_uint::@2/(byte) 0 )
[237] (byte) printf_number_buffer::format_min_length#2 ← phi( printf_sint::@5/(byte) 3 printf_uint::@2/(byte) 0 )
[238] if((byte) 0==(byte) printf_number_buffer::format_min_length#2) goto printf_number_buffer::@1
to:printf_number_buffer::@5
printf_number_buffer::@5: scope:[printf_number_buffer] from printf_number_buffer
[239] (byte*) strlen::str#1 ← (byte*) printf_number_buffer::buffer_digits#10
[240] call strlen
[241] (word) strlen::return#2 ← (word) strlen::len#2
to:printf_number_buffer::@12
printf_number_buffer::@12: scope:[printf_number_buffer] from printf_number_buffer::@5
[242] (word~) printf_number_buffer::$18 ← (word) strlen::return#2
[243] (signed byte) printf_number_buffer::len#0 ← (signed byte)(word~) printf_number_buffer::$18
[244] if((byte) 0==(byte) printf_number_buffer::buffer_sign#10) goto printf_number_buffer::@11
to:printf_number_buffer::@6
printf_number_buffer::@6: scope:[printf_number_buffer] from printf_number_buffer::@12
[245] (signed byte) printf_number_buffer::len#1 ← ++ (signed byte) printf_number_buffer::len#0
to:printf_number_buffer::@11
printf_number_buffer::@11: scope:[printf_number_buffer] from printf_number_buffer::@12 printf_number_buffer::@6
[246] (signed byte) printf_number_buffer::len#2 ← phi( printf_number_buffer::@12/(signed byte) printf_number_buffer::len#0 printf_number_buffer::@6/(signed byte) printf_number_buffer::len#1 )
[247] (signed byte) printf_number_buffer::padding#1 ← (signed byte)(byte) printf_number_buffer::format_min_length#2 - (signed byte) printf_number_buffer::len#2
[248] if((signed byte) printf_number_buffer::padding#1>=(signed byte) 0) goto printf_number_buffer::@19
to:printf_number_buffer::@1
printf_number_buffer::@19: scope:[printf_number_buffer] from printf_number_buffer::@11
[249] phi()
to:printf_number_buffer::@1
printf_number_buffer::@1: scope:[printf_number_buffer] from printf_number_buffer printf_number_buffer::@11 printf_number_buffer::@19
[250] (signed byte) printf_number_buffer::padding#10 ← phi( printf_number_buffer/(signed byte) 0 printf_number_buffer::@19/(signed byte) printf_number_buffer::padding#1 printf_number_buffer::@11/(signed byte) 0 )
[251] if((byte) 0!=(byte) printf_number_buffer::format_justify_left#10) goto printf_number_buffer::@2
to:printf_number_buffer::@15
printf_number_buffer::@15: scope:[printf_number_buffer] from printf_number_buffer::@1
[252] if((byte) 0!=(byte) printf_number_buffer::format_zero_padding#10) goto printf_number_buffer::@2
to:printf_number_buffer::@14
printf_number_buffer::@14: scope:[printf_number_buffer] from printf_number_buffer::@15
[253] if((signed byte) 0!=(signed byte) printf_number_buffer::padding#10) goto printf_number_buffer::@7
to:printf_number_buffer::@2
printf_number_buffer::@7: scope:[printf_number_buffer] from printf_number_buffer::@14
[254] (byte) printf_padding::length#0 ← (byte)(signed byte) printf_number_buffer::padding#10
[255] call printf_padding
to:printf_number_buffer::@2
printf_number_buffer::@2: scope:[printf_number_buffer] from printf_number_buffer::@1 printf_number_buffer::@14 printf_number_buffer::@15 printf_number_buffer::@7
[256] if((byte) 0==(byte) printf_number_buffer::buffer_sign#10) goto printf_number_buffer::@3
to:printf_number_buffer::@8
printf_number_buffer::@8: scope:[printf_number_buffer] from printf_number_buffer::@2
[257] (byte) printf_char::ch#2 ← (byte) printf_number_buffer::buffer_sign#10
[258] call printf_char
to:printf_number_buffer::@3
printf_number_buffer::@3: scope:[printf_number_buffer] from printf_number_buffer::@2 printf_number_buffer::@8
[259] if((byte) 0==(byte) printf_number_buffer::format_zero_padding#10) goto printf_number_buffer::@4
to:printf_number_buffer::@16
printf_number_buffer::@16: scope:[printf_number_buffer] from printf_number_buffer::@3
[260] if((signed byte) 0!=(signed byte) printf_number_buffer::padding#10) goto printf_number_buffer::@9
to:printf_number_buffer::@4
printf_number_buffer::@9: scope:[printf_number_buffer] from printf_number_buffer::@16
[261] (byte) printf_padding::length#1 ← (byte)(signed byte) printf_number_buffer::padding#10
[262] call printf_padding
to:printf_number_buffer::@4
printf_number_buffer::@4: scope:[printf_number_buffer] from printf_number_buffer::@16 printf_number_buffer::@3 printf_number_buffer::@9
[263] (byte*) printf_str::str#1 ← (byte*) printf_number_buffer::buffer_digits#10
[264] call printf_str
to:printf_number_buffer::@13
printf_number_buffer::@13: scope:[printf_number_buffer] from printf_number_buffer::@4
[265] if((byte) 0==(byte) printf_number_buffer::format_justify_left#10) goto printf_number_buffer::@return
to:printf_number_buffer::@18
printf_number_buffer::@18: scope:[printf_number_buffer] from printf_number_buffer::@13
[266] if((byte) 0!=(byte) printf_number_buffer::format_zero_padding#10) goto printf_number_buffer::@return
to:printf_number_buffer::@17
printf_number_buffer::@17: scope:[printf_number_buffer] from printf_number_buffer::@18
[267] if((signed byte) 0!=(signed byte) printf_number_buffer::padding#10) goto printf_number_buffer::@10
to:printf_number_buffer::@return
printf_number_buffer::@10: scope:[printf_number_buffer] from printf_number_buffer::@17
[268] (byte) printf_padding::length#2 ← (byte)(signed byte) printf_number_buffer::padding#10
[269] call printf_padding
to:printf_number_buffer::@return
printf_number_buffer::@return: scope:[printf_number_buffer] from printf_number_buffer::@10 printf_number_buffer::@13 printf_number_buffer::@17 printf_number_buffer::@18
[270] return
to:@return
(void()) printf_padding((byte) printf_padding::pad , (byte) printf_padding::length)
printf_padding: scope:[printf_padding] from printf_number_buffer::@10 printf_number_buffer::@7 printf_number_buffer::@9 printf_string::@4 printf_string::@5
[271] (byte) printf_padding::pad#7 ← phi( printf_number_buffer::@9/(byte) '0' printf_number_buffer::@10/(byte) ' ' printf_number_buffer::@7/(byte) ' ' printf_string::@4/(byte) ' ' printf_string::@5/(byte) ' ' )
[271] (byte) printf_padding::length#6 ← phi( printf_number_buffer::@9/(byte) printf_padding::length#1 printf_number_buffer::@10/(byte) printf_padding::length#2 printf_number_buffer::@7/(byte) printf_padding::length#0 printf_string::@4/(byte) printf_padding::length#3 printf_string::@5/(byte) printf_padding::length#4 )
to:printf_padding::@1
printf_padding::@1: scope:[printf_padding] from printf_padding printf_padding::@3
[272] (byte) printf_padding::i#2 ← phi( printf_padding/(byte) 0 printf_padding::@3/(byte) printf_padding::i#1 )
[273] if((byte) printf_padding::i#2<(byte) printf_padding::length#6) goto printf_padding::@2
to:printf_padding::@return
printf_padding::@return: scope:[printf_padding] from printf_padding::@1
[274] return
to:@return
printf_padding::@2: scope:[printf_padding] from printf_padding::@1
[275] (byte) printf_char::ch#0 ← (byte) printf_padding::pad#7
[276] call printf_char
to:printf_padding::@3
printf_padding::@3: scope:[printf_padding] from printf_padding::@2
[277] (byte) printf_padding::i#1 ← ++ (byte) printf_padding::i#2
to:printf_padding::@1
(word()) strlen((byte*) strlen::str)
strlen: scope:[strlen] from printf_number_buffer::@5 printf_string::@3
[278] (byte*) strlen::str#5 ← phi( printf_number_buffer::@5/(byte*) strlen::str#1 printf_string::@3/(byte*) strlen::str#2 )
to:strlen::@1
strlen::@1: scope:[strlen] from strlen strlen::@2
[279] (word) strlen::len#2 ← phi( strlen/(word) 0 strlen::@2/(word) strlen::len#1 )
[279] (byte*) strlen::str#3 ← phi( strlen/(byte*) strlen::str#5 strlen::@2/(byte*) strlen::str#0 )
[280] if((byte) 0!=*((byte*) strlen::str#3)) goto strlen::@2
to:strlen::@return
strlen::@return: scope:[strlen] from strlen::@1
[281] return
to:@return
strlen::@2: scope:[strlen] from strlen::@1
[282] (word) strlen::len#1 ← ++ (word) strlen::len#2
[283] (byte*) strlen::str#0 ← ++ (byte*) strlen::str#3
to:strlen::@1
(void()) utoa((word) utoa::value , (byte*) utoa::buffer , (byte) utoa::radix)
utoa: scope:[utoa] from printf_sint::@2 printf_uint::@1
[284] (byte*) utoa::buffer#11 ← phi( printf_sint::@2/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS printf_uint::@1/(byte*)&(struct printf_buffer_number) printf_buffer+(const byte) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS )
[284] (word) utoa::value#10 ← phi( printf_sint::@2/(word) utoa::value#1 printf_uint::@1/(word) utoa::value#2 )
[284] (byte) utoa::radix#2 ← phi( printf_sint::@2/(const byte) DECIMAL printf_uint::@1/(byte) utoa::radix#1 )
[285] if((byte) utoa::radix#2==(const byte) DECIMAL) goto utoa::@1
to:utoa::@2
utoa::@2: scope:[utoa] from utoa
[286] if((byte) utoa::radix#2==(const byte) HEXADECIMAL) goto utoa::@1
to:utoa::@3
utoa::@3: scope:[utoa] from utoa::@2
[287] if((byte) utoa::radix#2==(const byte) OCTAL) goto utoa::@1
to:utoa::@4
utoa::@4: scope:[utoa] from utoa::@3
[288] if((byte) utoa::radix#2==(const byte) BINARY) goto utoa::@1
to:utoa::@5
utoa::@5: scope:[utoa] from utoa::@4
[289] *((byte*) utoa::buffer#11) ← (byte) 'e'
[290] (byte*) utoa::buffer#0 ← ++ (byte*) utoa::buffer#11
[291] *((byte*) utoa::buffer#0) ← (byte) 'r'
[292] (byte*) utoa::buffer#1 ← ++ (byte*) utoa::buffer#0
[293] *((byte*) utoa::buffer#1) ← (byte) 'r'
[294] (byte*) utoa::buffer#2 ← ++ (byte*) utoa::buffer#1
[295] *((byte*) utoa::buffer#2) ← (byte) 0
to:utoa::@return
utoa::@return: scope:[utoa] from utoa::@5 utoa::@8
[296] return
to:@return
utoa::@1: scope:[utoa] from utoa utoa::@2 utoa::@3 utoa::@4
[297] (word*) utoa::digit_values#8 ← phi( utoa/(const word*) RADIX_DECIMAL_VALUES utoa::@2/(const word*) RADIX_HEXADECIMAL_VALUES utoa::@3/(const word*) RADIX_OCTAL_VALUES utoa::@4/(const word*) RADIX_BINARY_VALUES )
[297] (byte) utoa::max_digits#7 ← phi( utoa/(byte) 5 utoa::@2/(byte) 4 utoa::@3/(byte) 6 utoa::@4/(byte) $10 )
to:utoa::@6
utoa::@6: scope:[utoa] from utoa::@1 utoa::@9
[298] (byte*) utoa::buffer#10 ← phi( utoa::@9/(byte*) utoa::buffer#15 utoa::@1/(byte*) utoa::buffer#11 )
[298] (byte) utoa::started#2 ← phi( utoa::@9/(byte) utoa::started#4 utoa::@1/(byte) 0 )
[298] (word) utoa::value#3 ← phi( utoa::@9/(word) utoa::value#7 utoa::@1/(word) utoa::value#10 )
[298] (byte) utoa::digit#2 ← phi( utoa::@9/(byte) utoa::digit#1 utoa::@1/(byte) 0 )
[299] (byte~) utoa::$4 ← (byte) utoa::max_digits#7 - (byte) 1
[300] if((byte) utoa::digit#2<(byte~) utoa::$4) goto utoa::@7
to:utoa::@8
utoa::@8: scope:[utoa] from utoa::@6
[301] (byte~) utoa::$11 ← (byte)(word) utoa::value#3
[302] *((byte*) utoa::buffer#10) ← *((const byte*) DIGITS + (byte~) utoa::$11)
[303] (byte*) utoa::buffer#3 ← ++ (byte*) utoa::buffer#10
[304] *((byte*) utoa::buffer#3) ← (byte) 0
to:utoa::@return
utoa::@7: scope:[utoa] from utoa::@6
[305] (byte~) utoa::$10 ← (byte) utoa::digit#2 << (byte) 1
[306] (word) utoa::digit_value#0 ← *((word*) utoa::digit_values#8 + (byte~) utoa::$10)
[307] if((byte) 0!=(byte) utoa::started#2) goto utoa::@10
to:utoa::@12
utoa::@12: scope:[utoa] from utoa::@7
[308] if((word) utoa::value#3>=(word) utoa::digit_value#0) goto utoa::@10
to:utoa::@9
utoa::@9: scope:[utoa] from utoa::@11 utoa::@12
[309] (byte*) utoa::buffer#15 ← phi( utoa::@12/(byte*) utoa::buffer#10 utoa::@11/(byte*) utoa::buffer#4 )
[309] (byte) utoa::started#4 ← phi( utoa::@12/(byte) utoa::started#2 utoa::@11/(byte) 1 )
[309] (word) utoa::value#7 ← phi( utoa::@12/(word) utoa::value#3 utoa::@11/(word) utoa::value#0 )
[310] (byte) utoa::digit#1 ← ++ (byte) utoa::digit#2
to:utoa::@6
utoa::@10: scope:[utoa] from utoa::@12 utoa::@7
[311] (byte*) utoa_append::buffer#0 ← (byte*) utoa::buffer#10
[312] (word) utoa_append::value#0 ← (word) utoa::value#3
[313] (word) utoa_append::sub#0 ← (word) utoa::digit_value#0
[314] call utoa_append
[315] (word) utoa_append::return#0 ← (word) utoa_append::value#2
to:utoa::@11
utoa::@11: scope:[utoa] from utoa::@10
[316] (word) utoa::value#0 ← (word) utoa_append::return#0
[317] (byte*) utoa::buffer#4 ← ++ (byte*) utoa::buffer#10
to:utoa::@9
(word()) utoa_append((byte*) utoa_append::buffer , (word) utoa_append::value , (word) utoa_append::sub)
utoa_append: scope:[utoa_append] from utoa::@10
[318] phi()
to:utoa_append::@1
utoa_append::@1: scope:[utoa_append] from utoa_append utoa_append::@2
[319] (byte) utoa_append::digit#2 ← phi( utoa_append/(byte) 0 utoa_append::@2/(byte) utoa_append::digit#1 )
[319] (word) utoa_append::value#2 ← phi( utoa_append/(word) utoa_append::value#0 utoa_append::@2/(word) utoa_append::value#1 )
[320] if((word) utoa_append::value#2>=(word) utoa_append::sub#0) goto utoa_append::@2
to:utoa_append::@3
utoa_append::@3: scope:[utoa_append] from utoa_append::@1
[321] *((byte*) utoa_append::buffer#0) ← *((const byte*) DIGITS + (byte) utoa_append::digit#2)
to:utoa_append::@return
utoa_append::@return: scope:[utoa_append] from utoa_append::@3
[322] return
to:@return
utoa_append::@2: scope:[utoa_append] from utoa_append::@1
[323] (byte) utoa_append::digit#1 ← ++ (byte) utoa_append::digit#2
[324] (word) utoa_append::value#1 ← (word) utoa_append::value#2 - (word) utoa_append::sub#0
to:utoa_append::@1
(void()) printf_sint((signed word) printf_sint::value , (byte) printf_sint::format_min_length , (byte) printf_sint::format_justify_left , (byte) printf_sint::format_sign_always , (byte) printf_sint::format_zero_padding , (byte) printf_sint::format_radix)
printf_sint: scope:[printf_sint] from main::@26 main::@28 main::@30 main::@32 main::@37 main::@39 main::@41 main::@43 main::@48 main::@50 main::@52 main::@54 main::@59 main::@61 main::@63 main::@65
[325] (byte) printf_sint::format_zero_padding#16 ← phi( main::@26/(byte) 0 main::@28/(byte) 0 main::@30/(byte) 0 main::@32/(byte) 0 main::@37/(byte) 0 main::@39/(byte) 0 main::@41/(byte) 0 main::@43/(byte) 0 main::@48/(byte) 0 main::@50/(byte) 0 main::@52/(byte) 0 main::@54/(byte) 0 main::@59/(byte) 1 main::@61/(byte) 1 main::@63/(byte) 1 main::@65/(byte) 0 )
[325] (byte) printf_sint::format_justify_left#16 ← phi( main::@26/(byte) 0 main::@28/(byte) 0 main::@30/(byte) 0 main::@32/(byte) 0 main::@37/(byte) 1 main::@39/(byte) 1 main::@41/(byte) 1 main::@43/(byte) 1 main::@48/(byte) 0 main::@50/(byte) 0 main::@52/(byte) 0 main::@54/(byte) 0 main::@59/(byte) 0 main::@61/(byte) 0 main::@63/(byte) 0 main::@65/(byte) 0 )
[325] (byte) printf_sint::format_sign_always#16 ← phi( main::@26/(byte) 0 main::@28/(byte) 0 main::@30/(byte) 0 main::@32/(byte) 0 main::@37/(byte) 0 main::@39/(byte) 0 main::@41/(byte) 0 main::@43/(byte) 0 main::@48/(byte) 1 main::@50/(byte) 1 main::@52/(byte) 1 main::@54/(byte) 1 main::@59/(byte) 0 main::@61/(byte) 0 main::@63/(byte) 0 main::@65/(byte) 0 )
[325] (signed word) printf_sint::value#17 ← phi( main::@26/(signed byte) 1 main::@28/(signed byte) $b main::@30/(signed byte) $6f main::@32/(signed word) $457 main::@37/(signed byte) -2 main::@39/(signed byte) -$16 main::@41/(signed word) -$de main::@43/(signed word) -$8ae main::@48/(signed byte) 3 main::@50/(signed byte) -$2c main::@52/(signed word) $22b main::@54/(signed word) -$1a0a main::@59/(signed byte) 1 main::@61/(signed byte) $b main::@63/(signed byte) $6f main::@65/(signed word) $457 )
[326] *((byte*)&(struct printf_buffer_number) printf_buffer) ← (byte) 0
[327] if((signed word) printf_sint::value#17<(signed byte) 0) goto printf_sint::@1
to:printf_sint::@3
printf_sint::@3: scope:[printf_sint] from printf_sint
[328] if((byte) 0==(byte) printf_sint::format_sign_always#16) goto printf_sint::@2
to:printf_sint::@4
printf_sint::@4: scope:[printf_sint] from printf_sint::@3
[329] *((byte*)&(struct printf_buffer_number) printf_buffer) ← (byte) '+'
to:printf_sint::@2
printf_sint::@2: scope:[printf_sint] from printf_sint::@1 printf_sint::@3 printf_sint::@4
[330] (signed word) printf_sint::value#19 ← phi( printf_sint::@1/(signed word) printf_sint::value#0 printf_sint::@3/(signed word) printf_sint::value#17 printf_sint::@4/(signed word) printf_sint::value#17 )
[331] (word) utoa::value#1 ← (word)(signed word) printf_sint::value#19
[332] call utoa
to:printf_sint::@5
printf_sint::@5: scope:[printf_sint] from printf_sint::@2
[333] (byte) printf_number_buffer::buffer_sign#0 ← *((byte*)&(struct printf_buffer_number) printf_buffer)
[334] (byte) printf_number_buffer::format_justify_left#0 ← (byte) printf_sint::format_justify_left#16
[335] (byte) printf_number_buffer::format_zero_padding#0 ← (byte) printf_sint::format_zero_padding#16
[336] call printf_number_buffer
to:printf_sint::@return
printf_sint::@return: scope:[printf_sint] from printf_sint::@5
[337] return
to:@return
printf_sint::@1: scope:[printf_sint] from printf_sint
[338] (signed word) printf_sint::value#0 ← - (signed word) printf_sint::value#17
[339] *((byte*)&(struct printf_buffer_number) printf_buffer) ← (byte) '-'
to:printf_sint::@2
(void()) printf_string((byte*) printf_string::str , (byte) printf_string::format_min_length , (byte) printf_string::format_justify_left)
printf_string: scope:[printf_string] from main::@10 main::@15 main::@17 main::@19 main::@21 main::@4 main::@6 main::@8
[340] (byte*) printf_string::str#10 ← phi( main::@10/(const byte*) main::str8 main::@15/(const byte*) main::str2 main::@17/(const byte*) main::str4 main::@19/(const byte*) main::str6 main::@21/(const byte*) main::str8 main::@4/(const byte*) main::str2 main::@6/(const byte*) main::str4 main::@8/(const byte*) main::str6 )
[340] (byte) printf_string::format_justify_left#10 ← phi( main::@10/(byte) 0 main::@15/(byte) 1 main::@17/(byte) 1 main::@19/(byte) 1 main::@21/(byte) 1 main::@4/(byte) 0 main::@6/(byte) 0 main::@8/(byte) 0 )
to:printf_string::@3
printf_string::@3: scope:[printf_string] from printf_string
[341] (byte*) strlen::str#2 ← (byte*) printf_string::str#10
[342] call strlen
[343] (word) strlen::return#3 ← (word) strlen::len#2
to:printf_string::@6
printf_string::@6: scope:[printf_string] from printf_string::@3
[344] (word~) printf_string::$9 ← (word) strlen::return#3
[345] (signed byte) printf_string::len#0 ← (signed byte)(word~) printf_string::$9
[346] (signed byte) printf_string::padding#1 ← (signed byte) 3 - (signed byte) printf_string::len#0
[347] if((signed byte) printf_string::padding#1>=(signed byte) 0) goto printf_string::@10
to:printf_string::@1
printf_string::@10: scope:[printf_string] from printf_string::@6
[348] phi()
to:printf_string::@1
printf_string::@1: scope:[printf_string] from printf_string::@10 printf_string::@6
[349] (signed byte) printf_string::padding#3 ← phi( printf_string::@6/(signed byte) 0 printf_string::@10/(signed byte) printf_string::padding#1 )
[350] if((byte) 0!=(byte) printf_string::format_justify_left#10) goto printf_string::@2
to:printf_string::@8
printf_string::@8: scope:[printf_string] from printf_string::@1
[351] if((signed byte) 0!=(signed byte) printf_string::padding#3) goto printf_string::@4
to:printf_string::@2
printf_string::@4: scope:[printf_string] from printf_string::@8
[352] (byte) printf_padding::length#3 ← (byte)(signed byte) printf_string::padding#3
[353] call printf_padding
to:printf_string::@2
printf_string::@2: scope:[printf_string] from printf_string::@1 printf_string::@4 printf_string::@8
[354] (byte*) printf_str::str#2 ← (byte*) printf_string::str#10
[355] call printf_str
to:printf_string::@7
printf_string::@7: scope:[printf_string] from printf_string::@2
[356] if((byte) 0==(byte) printf_string::format_justify_left#10) goto printf_string::@return
to:printf_string::@9
printf_string::@9: scope:[printf_string] from printf_string::@7
[357] if((signed byte) 0!=(signed byte) printf_string::padding#3) goto printf_string::@5
to:printf_string::@return
printf_string::@5: scope:[printf_string] from printf_string::@9
[358] (byte) printf_padding::length#4 ← (byte)(signed byte) printf_string::padding#3
[359] call printf_padding
to:printf_string::@return
printf_string::@return: scope:[printf_string] from printf_string::@5 printf_string::@7 printf_string::@9
[360] return
to:@return
(void()) printf_cls()
printf_cls: scope:[printf_cls] from main
[361] phi()
[362] call memset
to:printf_cls::@1
printf_cls::@1: scope:[printf_cls] from printf_cls
[363] (byte*) printf_line_cursor ← (const byte*) printf_screen
[364] (byte*) printf_char_cursor ← (byte*) printf_line_cursor
to:printf_cls::@return
printf_cls::@return: scope:[printf_cls] from printf_cls::@1
[365] return
to:@return

14942
src/test/ref/printf-13.log Normal file

File diff suppressed because one or more lines are too long

441
src/test/ref/printf-13.sym Normal file

@ -0,0 +1,441 @@
(label) @1
(label) @2
(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) OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS = (byte) 1
(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 word*) RADIX_BINARY_VALUES[] = { (word) $8000, (word) $4000, (word) $2000, (word) $1000, (word) $800, (word) $400, (word) $200, (word) $100, (word) $80, (word) $40, (word) $20, (word) $10, (word) 8, (word) 4, (word) 2 }
(const word*) RADIX_DECIMAL_VALUES[] = { (word) $2710, (word) $3e8, (word) $64, (word) $a }
(const word*) RADIX_HEXADECIMAL_VALUES[] = { (word) $1000, (word) $100, (word) $10 }
(const word*) RADIX_OCTAL_VALUES[] = { (word) $8000, (word) $1000, (word) $200, (word) $40, (word) 8 }
(const byte) SIZEOF_STRUCT_PRINTF_BUFFER_NUMBER = (byte) $c
(void()) main()
(label) main::@1
(label) main::@10
(label) main::@11
(label) main::@12
(label) main::@13
(label) main::@14
(label) main::@15
(label) main::@16
(label) main::@17
(label) main::@18
(label) main::@19
(label) main::@2
(label) main::@20
(label) main::@21
(label) main::@22
(label) main::@23
(label) main::@24
(label) main::@25
(label) main::@26
(label) main::@27
(label) main::@28
(label) main::@29
(label) main::@3
(label) main::@30
(label) main::@31
(label) main::@32
(label) main::@33
(label) main::@34
(label) main::@35
(label) main::@36
(label) main::@37
(label) main::@38
(label) main::@39
(label) main::@4
(label) main::@40
(label) main::@41
(label) main::@42
(label) main::@43
(label) main::@44
(label) main::@45
(label) main::@46
(label) main::@47
(label) main::@48
(label) main::@49
(label) main::@5
(label) main::@50
(label) main::@51
(label) main::@52
(label) main::@53
(label) main::@54
(label) main::@55
(label) main::@56
(label) main::@57
(label) main::@58
(label) main::@59
(label) main::@6
(label) main::@60
(label) main::@61
(label) main::@62
(label) main::@63
(label) main::@64
(label) main::@65
(label) main::@66
(label) main::@67
(label) main::@68
(label) main::@69
(label) main::@7
(label) main::@70
(label) main::@71
(label) main::@72
(label) main::@73
(label) main::@74
(label) main::@75
(label) main::@76
(label) main::@77
(label) main::@78
(label) main::@79
(label) main::@8
(label) main::@80
(label) main::@81
(label) main::@82
(label) main::@83
(label) main::@84
(label) main::@85
(label) main::@86
(label) main::@87
(label) main::@88
(label) main::@9
(label) main::@return
(const byte*) main::str[(byte) 1] = (byte*) ""
(const byte*) main::str1[(byte) 6] = (byte*) "3s '"
(const byte*) main::str11[(byte) 6] = (byte*) "-3s '"
(const byte*) main::str2[(byte) 2] = (byte*) "x"
(const byte*) main::str21[(byte) 6] = (byte*) "3d '"
(const byte*) main::str27[(byte) 6] = (byte*) "-3d '"
(const byte*) main::str3[(byte) 4] = (byte*) "' '"
(const byte*) main::str33[(byte) 7] = (byte*) "+3d '"
(const byte*) main::str39[(byte) 6] = (byte*) "03d '"
(const byte*) main::str4[(byte) 3] = (byte*) "xx"
(const byte*) main::str45[(byte) 6] = (byte*) "o '"
(const byte*) main::str51[(byte) 6] = (byte*) "x '"
(const byte*) main::str6[(byte) 4] = (byte*) "xxx"
(const byte*) main::str8[(byte) 5] = (byte*) "xxxx"
(const byte*) main::str9[(byte) 3] = (byte*) "'
"
(void*()) memcpy((void*) memcpy::destination , (void*) memcpy::source , (word) memcpy::num)
(label) memcpy::@1
(label) memcpy::@2
(label) memcpy::@return
(void*) memcpy::destination
(const void*) memcpy::destination#0 destination = (void*)(const byte*) printf_screen
(byte*) memcpy::dst
(byte*) memcpy::dst#1 dst zp[2]:11 1.000000001E9
(byte*) memcpy::dst#2 dst zp[2]:11 1.000000001E9
(word) memcpy::num
(const word) memcpy::num#0 num = (word)(number) $28*(number) $19-(number) $28
(void*) memcpy::return
(void*) memcpy::source
(const void*) memcpy::source#0 source = (void*)(const byte*) printf_screen+(byte) $28
(byte*) memcpy::src
(byte*) memcpy::src#1 src zp[2]:8 2.000000002E9
(byte*) memcpy::src#2 src zp[2]:8 1.000000001E9
(byte*) memcpy::src_end
(const byte*) memcpy::src_end#0 src_end = (byte*)(const void*) memcpy::source#0+(const word) memcpy::num#0
(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num)
(label) memset::@1
(label) memset::@2
(label) memset::@3
(label) memset::@return
(byte) memset::c
(byte) memset::c#4 reg byte x 1.25000000125E8
(byte*) memset::dst
(byte*) memset::dst#1 dst zp[2]:11 2.000000002E9
(byte*) memset::dst#2 dst zp[2]:11 1.3366666683333335E9
(byte*) memset::dst#4 dst zp[2]:11 2.0000002E7
(byte*) memset::end
(byte*) memset::end#0 end zp[2]:8 1.683333336666667E8
(word) memset::num
(word) memset::num#2 num zp[2]:8 1.0000001E7
(void*) memset::return
(void*) memset::str
(void*) memset::str#3 str zp[2]:11
(struct printf_buffer_number) printf_buffer loadstore mem[12] = {}
(const byte*) printf_buffer_number::digits[(number) $b] = { fill( $b, 0) }
(byte) printf_buffer_number::sign
(void()) printf_char((byte) printf_char::ch)
(byte*~) printf_char::$8 zp[2]:17 2000002.0
(label) printf_char::@1
(label) printf_char::@2
(label) printf_char::@3
(label) printf_char::@return
(byte) printf_char::ch
(byte) printf_char::ch#0 reg byte a 200002.0
(byte) printf_char::ch#1 reg byte a 200002.0
(byte) printf_char::ch#11 reg byte a 1201004.0
(byte) printf_char::ch#2 reg byte a 2002.0
(byte*) printf_char_cursor loadstore zp[2]:17 372414.17931034486
(void()) printf_cls()
(label) printf_cls::@1
(label) printf_cls::@return
(byte) printf_format_number::justify_left
(byte) printf_format_number::min_length
(byte) printf_format_number::radix
(byte) printf_format_number::sign_always
(byte) printf_format_number::zero_padding
(byte) printf_format_string::justify_left
(byte) printf_format_string::min_length
(byte*) printf_line_cursor loadstore zp[2]:15 1055944.7867132865
(void()) printf_ln()
(label) printf_ln::@1
(label) printf_ln::@2
(label) printf_ln::@return
(void()) printf_number_buffer((byte) printf_number_buffer::buffer_sign , (byte*) printf_number_buffer::buffer_digits , (byte) printf_number_buffer::format_min_length , (byte) printf_number_buffer::format_justify_left , (byte) printf_number_buffer::format_sign_always , (byte) printf_number_buffer::format_zero_padding , (byte) printf_number_buffer::format_radix)
(word~) printf_number_buffer::$18 zp[2]:11 1001.0
(label) printf_number_buffer::@1
(label) printf_number_buffer::@10
(label) printf_number_buffer::@11
(label) printf_number_buffer::@12
(label) printf_number_buffer::@13
(label) printf_number_buffer::@14
(label) printf_number_buffer::@15
(label) printf_number_buffer::@16
(label) printf_number_buffer::@17
(label) printf_number_buffer::@18
(label) printf_number_buffer::@19
(label) printf_number_buffer::@2
(label) printf_number_buffer::@3
(label) printf_number_buffer::@4
(label) printf_number_buffer::@5
(label) printf_number_buffer::@6
(label) printf_number_buffer::@7
(label) printf_number_buffer::@8
(label) printf_number_buffer::@9
(label) printf_number_buffer::@return
(struct printf_buffer_number) printf_number_buffer::buffer
(byte*) printf_number_buffer::buffer_digits
(byte*) printf_number_buffer::buffer_digits#10 buffer_digits zp[2]:2 77.0
(byte) printf_number_buffer::buffer_sign
(byte) printf_number_buffer::buffer_sign#0 buffer_sign zp[1]:7 67.33333333333333
(byte) printf_number_buffer::buffer_sign#1 buffer_sign zp[1]:7 202.0
(byte) printf_number_buffer::buffer_sign#10 buffer_sign zp[1]:7 160.25
(struct printf_format_number) printf_number_buffer::format
(byte) printf_number_buffer::format_justify_left
(byte) printf_number_buffer::format_justify_left#0 format_justify_left zp[1]:13 101.0
(byte) printf_number_buffer::format_justify_left#10 format_justify_left zp[1]:13 75.10714285714286
(byte) printf_number_buffer::format_min_length
(byte) printf_number_buffer::format_min_length#2 reg byte x 100.1
(byte) printf_number_buffer::format_radix
(byte) printf_number_buffer::format_sign_always
(byte) printf_number_buffer::format_zero_padding
(byte) printf_number_buffer::format_zero_padding#0 format_zero_padding zp[1]:14 202.0
(byte) printf_number_buffer::format_zero_padding#10 format_zero_padding zp[1]:14 107.0344827586207
(signed byte) printf_number_buffer::len
(signed byte) printf_number_buffer::len#0 reg byte y 1501.5
(signed byte) printf_number_buffer::len#1 reg byte y 2002.0
(signed byte) printf_number_buffer::len#2 reg byte y 3003.0
(signed byte) printf_number_buffer::padding
(signed byte) printf_number_buffer::padding#1 padding zp[1]:10 1001.0
(signed byte) printf_number_buffer::padding#10 padding zp[1]:10 222.44444444444446
(void()) printf_padding((byte) printf_padding::pad , (byte) printf_padding::length)
(label) printf_padding::@1
(label) printf_padding::@2
(label) printf_padding::@3
(label) printf_padding::@return
(byte) printf_padding::i
(byte) printf_padding::i#1 i zp[1]:6 200002.0
(byte) printf_padding::i#2 i zp[1]:6 75000.75
(byte) printf_padding::length
(byte) printf_padding::length#0 length zp[1]:4 2002.0
(byte) printf_padding::length#1 length zp[1]:4 2002.0
(byte) printf_padding::length#2 length zp[1]:4 2002.0
(byte) printf_padding::length#3 length zp[1]:4 202.0
(byte) printf_padding::length#4 length zp[1]:4 202.0
(byte) printf_padding::length#6 length zp[1]:4 17201.0
(byte) printf_padding::pad
(byte) printf_padding::pad#7 pad zp[1]:5 16666.833333333332
(const byte*) printf_screen = (byte*) 1024
(void()) printf_sint((signed word) printf_sint::value , (byte) printf_sint::format_min_length , (byte) printf_sint::format_justify_left , (byte) printf_sint::format_sign_always , (byte) printf_sint::format_zero_padding , (byte) printf_sint::format_radix)
(label) printf_sint::@1
(label) printf_sint::@2
(label) printf_sint::@3
(label) printf_sint::@4
(label) printf_sint::@5
(label) printf_sint::@return
(struct printf_format_number) printf_sint::format
(byte) printf_sint::format_justify_left
(byte) printf_sint::format_justify_left#16 format_justify_left zp[1]:13 9.181818181818182
(byte) printf_sint::format_min_length
(byte) printf_sint::format_radix
(byte) printf_sint::format_sign_always
(byte) printf_sint::format_sign_always#16 reg byte x 33.666666666666664
(byte) printf_sint::format_zero_padding
(byte) printf_sint::format_zero_padding#16 format_zero_padding zp[1]:14 8.416666666666666
(word) printf_sint::uvalue
(signed word) printf_sint::value
(signed word) printf_sint::value#0 value zp[2]:2 101.0
(signed word) printf_sint::value#17 value zp[2]:2 80.8
(signed word) printf_sint::value#19 value zp[2]:2 303.0
(void()) printf_str((byte*) printf_str::str)
(label) printf_str::@1
(label) printf_str::@2
(label) printf_str::@3
(label) printf_str::@4
(label) printf_str::@5
(label) printf_str::@return
(byte) printf_str::ch
(byte) printf_str::ch#0 reg byte a 100001.0
(byte*) printf_str::str
(byte*) printf_str::str#0 str zp[2]:2 42857.57142857143
(byte*) printf_str::str#1 str zp[2]:2 2002.0
(byte*) printf_str::str#2 str zp[2]:2 202.0
(byte*) printf_str::str#51 str zp[2]:2 205002.5
(byte*) printf_str::str#53 str zp[2]:2 11103.0
(void()) printf_string((byte*) printf_string::str , (byte) printf_string::format_min_length , (byte) printf_string::format_justify_left)
(word~) printf_string::$9 zp[2]:11 101.0
(label) printf_string::@1
(label) printf_string::@10
(label) printf_string::@2
(label) printf_string::@3
(label) printf_string::@4
(label) printf_string::@5
(label) printf_string::@6
(label) printf_string::@7
(label) printf_string::@8
(label) printf_string::@9
(label) printf_string::@return
(struct printf_format_string) printf_string::format
(byte) printf_string::format_justify_left
(byte) printf_string::format_justify_left#10 format_justify_left zp[1]:13 12.625
(byte) printf_string::format_min_length
(signed byte) printf_string::len
(signed byte) printf_string::len#0 reg byte a 202.0
(signed byte) printf_string::padding
(signed byte) printf_string::padding#1 padding zp[1]:14 101.0
(signed byte) printf_string::padding#3 padding zp[1]:14 33.666666666666664
(byte*) printf_string::str
(byte*) printf_string::str#10 str zp[2]:2 14.428571428571429
(void()) printf_uint((word) printf_uint::uvalue , (byte) printf_uint::format_min_length , (byte) printf_uint::format_justify_left , (byte) printf_uint::format_sign_always , (byte) printf_uint::format_zero_padding , (byte) printf_uint::format_radix)
(label) printf_uint::@1
(label) printf_uint::@2
(label) printf_uint::@return
(struct printf_format_number) printf_uint::format
(byte) printf_uint::format_justify_left
(byte) printf_uint::format_min_length
(byte) printf_uint::format_radix
(byte) printf_uint::format_radix#10 reg byte x 33.666666666666664
(byte) printf_uint::format_sign_always
(byte) printf_uint::format_zero_padding
(word) printf_uint::uvalue
(word) printf_uint::uvalue#10 uvalue zp[2]:2 50.5
(word()) strlen((byte*) strlen::str)
(label) strlen::@1
(label) strlen::@2
(label) strlen::@return
(word) strlen::len
(word) strlen::len#1 len zp[2]:11 100001.0
(word) strlen::len#2 len zp[2]:11 40220.8
(word) strlen::return
(word) strlen::return#2 return zp[2]:11 2002.0
(word) strlen::return#3 return zp[2]:11 202.0
(byte*) strlen::str
(byte*) strlen::str#0 str zp[2]:8 200002.0
(byte*) strlen::str#1 str zp[2]:8 2002.0
(byte*) strlen::str#2 str zp[2]:8 202.0
(byte*) strlen::str#3 str zp[2]:8 103334.66666666666
(byte*) strlen::str#5 str zp[2]:8 11103.0
(void()) utoa((word) utoa::value , (byte*) utoa::buffer , (byte) utoa::radix)
(byte~) utoa::$10 reg byte a 20002.0
(byte~) utoa::$11 reg byte a 2002.0
(byte~) utoa::$4 reg byte a 20002.0
(label) utoa::@1
(label) utoa::@10
(label) utoa::@11
(label) utoa::@12
(label) utoa::@2
(label) utoa::@3
(label) utoa::@4
(label) utoa::@5
(label) utoa::@6
(label) utoa::@7
(label) utoa::@8
(label) utoa::@9
(label) utoa::@return
(byte*) utoa::buffer
(byte*) utoa::buffer#0 buffer zp[2]:11 1501.5
(byte*) utoa::buffer#1 buffer zp[2]:11 1501.5
(byte*) utoa::buffer#10 buffer zp[2]:11 2867.133333333333
(byte*) utoa::buffer#11 buffer zp[2]:11 429.0
(byte*) utoa::buffer#15 buffer zp[2]:11 15001.5
(byte*) utoa::buffer#2 buffer zp[2]:11 2002.0
(byte*) utoa::buffer#3 buffer zp[2]:11 2002.0
(byte*) utoa::buffer#4 buffer zp[2]:11 20002.0
(byte) utoa::digit
(byte) utoa::digit#1 digit zp[1]:10 20002.0
(byte) utoa::digit#2 digit zp[1]:10 2666.9333333333334
(word) utoa::digit_value
(word) utoa::digit_value#0 digit_value zp[2]:19 6000.6
(word*) utoa::digit_values
(word*) utoa::digit_values#8 digit_values zp[2]:8 588.2941176470588
(byte) utoa::max_digits
(byte) utoa::max_digits#7 max_digits zp[1]:7 588.2941176470588
(byte) utoa::radix
(byte) utoa::radix#1 reg byte x 202.0
(byte) utoa::radix#2 reg byte x 1026.25
(byte) utoa::started
(byte) utoa::started#2 reg byte x 4286.142857142857
(byte) utoa::started#4 reg byte x 10001.0
(word) utoa::value
(word) utoa::value#0 value zp[2]:2 10001.0
(word) utoa::value#1 value zp[2]:2 202.0
(word) utoa::value#10 value zp[2]:2 200.5
(word) utoa::value#2 value zp[2]:2 101.0
(word) utoa::value#3 value zp[2]:2 5125.625
(word) utoa::value#7 value zp[2]:2 15001.5
(word()) utoa_append((byte*) utoa_append::buffer , (word) utoa_append::value , (word) utoa_append::sub)
(label) utoa_append::@1
(label) utoa_append::@2
(label) utoa_append::@3
(label) utoa_append::@return
(byte*) utoa_append::buffer
(byte*) utoa_append::buffer#0 buffer zp[2]:11 13750.25
(byte) utoa_append::digit
(byte) utoa_append::digit#1 reg byte x 1.0000001E7
(byte) utoa_append::digit#2 reg byte x 1.00500015E7
(word) utoa_append::return
(word) utoa_append::return#0 return zp[2]:2 20002.0
(word) utoa_append::sub
(word) utoa_append::sub#0 sub zp[2]:19 3335000.5
(word) utoa_append::value
(word) utoa_append::value#0 value zp[2]:2 36667.33333333333
(word) utoa_append::value#1 value zp[2]:2 2.0000002E7
(word) utoa_append::value#2 value zp[2]:2 5018334.166666666
reg byte a [ printf_char::ch#11 printf_char::ch#2 printf_char::ch#0 printf_char::ch#1 ]
reg byte x [ memset::c#4 ]
zp[2]:2 [ printf_uint::uvalue#10 utoa::value#3 utoa::value#7 utoa::value#10 utoa::value#1 utoa::value#2 utoa::value#0 utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 utoa_append::return#0 printf_sint::value#19 printf_sint::value#0 printf_sint::value#17 printf_str::str#51 printf_str::str#53 printf_str::str#1 printf_str::str#2 printf_str::str#0 printf_number_buffer::buffer_digits#10 printf_string::str#10 ]
reg byte x [ printf_uint::format_radix#10 ]
reg byte x [ printf_number_buffer::format_min_length#2 ]
reg byte y [ printf_number_buffer::len#2 printf_number_buffer::len#0 printf_number_buffer::len#1 ]
zp[1]:4 [ printf_padding::length#6 printf_padding::length#1 printf_padding::length#2 printf_padding::length#0 printf_padding::length#3 printf_padding::length#4 ]
zp[1]:5 [ printf_padding::pad#7 ]
zp[1]:6 [ printf_padding::i#2 printf_padding::i#1 ]
reg byte x [ utoa::radix#2 utoa::radix#1 ]
zp[1]:7 [ utoa::max_digits#7 printf_number_buffer::buffer_sign#10 printf_number_buffer::buffer_sign#0 printf_number_buffer::buffer_sign#1 ]
zp[2]:8 [ utoa::digit_values#8 strlen::str#3 strlen::str#5 strlen::str#1 strlen::str#2 strlen::str#0 memcpy::src#2 memcpy::src#1 memset::num#2 memset::end#0 ]
zp[1]:10 [ utoa::digit#2 utoa::digit#1 printf_number_buffer::padding#10 printf_number_buffer::padding#1 ]
reg byte x [ utoa::started#2 utoa::started#4 ]
zp[2]:11 [ utoa::buffer#10 utoa::buffer#15 utoa::buffer#11 utoa::buffer#4 utoa::buffer#0 utoa::buffer#3 utoa_append::buffer#0 utoa::buffer#1 utoa::buffer#2 strlen::len#2 strlen::len#1 strlen::return#2 strlen::return#3 printf_number_buffer::$18 printf_string::$9 memcpy::dst#2 memcpy::dst#1 memset::str#3 memset::dst#2 memset::dst#4 memset::dst#1 ]
reg byte x [ utoa_append::digit#2 utoa_append::digit#1 ]
reg byte x [ printf_sint::format_sign_always#16 ]
zp[1]:13 [ printf_string::format_justify_left#10 printf_number_buffer::format_justify_left#10 printf_number_buffer::format_justify_left#0 printf_sint::format_justify_left#16 ]
zp[1]:14 [ printf_string::padding#3 printf_string::padding#1 printf_number_buffer::format_zero_padding#10 printf_number_buffer::format_zero_padding#0 printf_sint::format_zero_padding#16 ]
zp[2]:15 [ printf_line_cursor ]
zp[2]:17 [ printf_char_cursor printf_char::$8 ]
reg byte a [ printf_str::ch#0 ]
reg byte a [ utoa::$4 ]
reg byte a [ utoa::$11 ]
reg byte a [ utoa::$10 ]
zp[2]:19 [ utoa::digit_value#0 utoa_append::sub#0 ]
reg byte a [ printf_string::len#0 ]
mem[12] [ printf_buffer ]