# HG changeset patch # User kono # Date 1099631279 -32400 # Node ID 6bf66c125dbc10c86f65d76aba339cfd213f0e6e Initial revision diff -r 000000000000 -r 6bf66c125dbc .DS_Store Binary file .DS_Store has changed diff -r 000000000000 -r 6bf66c125dbc .gdbinit --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.gdbinit Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,4 @@ +b expr +b aexpr +b mexpr +b term diff -r 000000000000 -r 6bf66c125dbc Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Makefile Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,175 @@ +TEST = s-intel-r + +CC = gcc +CFLAGS = -g +# COMPILER = s-compile.o s-token.o +# COMPILER = s-tree-compile.o s-token.o +COMPILER = s-yacc.o s-token.o + +TARGET = token calc s-calc s-prefix s-rpn s-09 s-intel s-intel-r s-sparc s-rs6k s-m68k +all: $(TARGET) + +token: token.o s-token.o + $(CC) $(CFLAGS) -o $@ $^ + +calc: calc.c + $(CC) $(CFLAGS) -o $@ $^ + +s-calc: s-calc.c s-token.o + $(CC) $(CFLAGS) -o $@ $^ + +s-tree: s-tree.c s-token.o + $(CC) $(CFLAGS) -o $@ $^ + +s-prefix: s-prefix.o s-code-print.o s-token.o + $(CC) $(CFLAGS) -o $@ $^ +s-rpn: $(COMPILER) s-code-print.o + $(CC) $(CFLAGS) -o $@ $^ +s-09: $(COMPILER) s-code-09.o + $(CC) $(CFLAGS) -o $@ $^ +s-intel: $(COMPILER) s-code-intel.o + $(CC) $(CFLAGS) -o $@ $^ +s-intel-r: $(COMPILER) s-code-intel-r.o + $(CC) $(CFLAGS) -o $@ $^ +s-sparc: $(COMPILER) s-code-sparc.o + $(CC) $(CFLAGS) -o $@ $^ +s-rs6k: $(COMPILER) s-code-rs6k.o + $(CC) $(CFLAGS) -o $@ $^ +s-rs6k-r: $(COMPILER) s-code-rs6k-r.o + $(CC) $(CFLAGS) -o $@ $^ +s-m68k: $(COMPILER) s-code-m68k.o + $(CC) $(CFLAGS) -o $@ $^ +s-yacc.o: s-yacc.y + $(YACC) s-yacc.y + mv y.tab.c s-yacc.c + $(CC) -c s-yacc.c + +test: $(TEST) + ./$(TEST) < s-input.txt > s-output.s + $(CC) s-output.s + ./a.out + +MC09EMU = ../emulator/util09/v09 +MC09ASM = ../emulator/util09/a09 +test-09: s-09 + ./s-09 < s-input.txt > s-output.a09 + $(MC09ASM) s-output.a09 + $(MC09EMU) s-output + +clean: + rm -f *.o $(TARGET) a.out s-output.s s-output.a09 s-output + rm -f s-yacc.c y.tab.c y.tab.h + +# DO NOT DELETE + +calc.o: /usr/include/stdio.h /usr/include/sys/types.h +calc.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +calc.o: /usr/include/machine/types.h /usr/include/ppc/types.h +calc.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +calc.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +compile-m68k.o: /usr/include/stdio.h /usr/include/sys/types.h +compile-m68k.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +compile-m68k.o: /usr/include/machine/types.h /usr/include/ppc/types.h +compile-m68k.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +compile-m68k.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +compile.o: /usr/include/stdio.h /usr/include/sys/types.h +compile.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +compile.o: /usr/include/machine/types.h /usr/include/ppc/types.h +compile.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +compile.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-calc-r.o: /usr/include/stdio.h /usr/include/sys/types.h +s-calc-r.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-calc-r.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-calc-r.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-calc-r.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-calc.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +s-calc.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-calc.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-calc.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-calc.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-code-09.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +s-code-09.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-code-09.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-code-09.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-code-09.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-code-intel-r.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +s-code-intel-r.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-code-intel-r.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-code-intel-r.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-code-intel-r.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-code-intel.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +s-code-intel.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-code-intel.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-code-intel.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-code-intel.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-code-m68k.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +s-code-m68k.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-code-m68k.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-code-m68k.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-code-m68k.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-code-print.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +s-code-print.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-code-print.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-code-print.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-code-print.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-code-rs6k-r.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +s-code-rs6k-r.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-code-rs6k-r.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-code-rs6k-r.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-code-rs6k-r.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-code-rs6k.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +s-code-rs6k.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-code-rs6k.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-code-rs6k.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-code-rs6k.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-code-sparc.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +s-code-sparc.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-code-sparc.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-code-sparc.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-code-sparc.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-compile.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +s-compile.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-compile.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-compile.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-compile.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-prefix.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +s-prefix.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-prefix.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-prefix.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-prefix.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-token.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +s-token.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-token.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-token.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-token.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-tree-compile.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +s-tree-compile.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-tree-compile.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-tree-compile.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-tree-compile.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-tree.o: /usr/include/stdio.h /usr/include/sys/types.h +s-tree.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-tree.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-tree.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-tree.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-yacc.o: /usr/include/stdlib.h /usr/include/machine/ansi.h +s-yacc.o: /usr/include/ppc/ansi.h /usr/include/machine/types.h +s-yacc.o: /usr/include/ppc/types.h /usr/include/sys/cdefs.h s-compile.h +s-yacc.o: /usr/include/stdio.h /usr/include/sys/types.h +s-yacc.o: /usr/include/sys/appleapiopts.h /usr/include/machine/endian.h +s-yacc.o: /usr/include/ppc/endian.h +token.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +token.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +token.o: /usr/include/machine/types.h /usr/include/ppc/types.h +token.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +token.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +y.tab.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +y.tab.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +y.tab.o: /usr/include/machine/types.h /usr/include/ppc/types.h +y.tab.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +y.tab.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +s-yacc.o: s-compile.h /usr/include/stdio.h /usr/include/sys/types.h +s-yacc.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +s-yacc.o: /usr/include/machine/types.h /usr/include/ppc/types.h +s-yacc.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +s-yacc.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h diff -r 000000000000 -r 6bf66c125dbc calc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calc.c Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,318 @@ +/* + Simple Calculator + $Id$ + */ + +#include + +char *ptr,*last_ptr; +int value,lvalue; +int last_token; +int variable[48]; + +static int expr(); +static int aexpr(); +static int mexpr(); +static int term(); + + +#define T_EQUAL (0x100|'=') +#define T_NEQUAL (0x100|'!') +#define T_LSHIFT (0x100|'<') +#define T_RSHIFT (0x100|'>') + +static void +line_skip() +{ + while(*ptr++); + last_ptr = ptr; + last_token = EOF; +} + +static void +error(description) +char *description; +{ + fprintf(stderr,"%s on %s\n",description,last_ptr); + line_skip(); +} + +static int +token() +{ + int c,d; + + last_ptr = ptr; /* for error position */ + c= *ptr; + while(c<=' ' && c) { + c = *++ptr; + } + if(!c) { + last_token = EOF; + return last_token; + } + ptr++; + if ('/'==c && ('/'== *ptr || '*'== *ptr)) { /* comment */ + line_skip(); + return EOF; + } + if('1'<=c && c<='9') { /* Decimal */ + d = c-'0'; + while(c= *ptr++) { + if('0'<=c && c<='9') { + d = d*10 + (c - '0'); + } else { + break; + } + } + c && ptr--; + value = d; + last_token = '0'; + return last_token; + } else if ('0'==c && 'x'== *ptr) { /* Hex */ + ptr++; + d = 0; + while(c= *ptr++) { + if('0'<=c && c<='9') { + d = d*16 + (c - '0'); + } else if('a'<=c && c<='f') { + d = d*16 + (c - 'a' + 10); + } else if('A'<=c && c<='F') { + d = d*16 + (c - 'a' + 10); + } else { + break; + } + } + c && ptr--; + value = d; + last_token = '0'; + return last_token; + } else if ('0'==c) { /* Octal */ + d = c-'0'; + while(c= *ptr++) { + if('0'<=c && c<='7') { + d = d*8 + (c - '0'); + } else { + break; + } + } + c && ptr--; + value = d; + last_token = '0'; + return last_token; + } else if ('\''==c) { /* Ascii */ + d = 0; + while(c= *ptr++) { + if('\''!=c && c<=0x7f) { + d = d*256 + c; + } else if(c>=0x80 && *ptr) { + d = d*256*256 + c*256 + *ptr++; + } else { + break; + } + } + c && ptr--; + value = d; + last_token = '0'; + return last_token; + } else if (('a'<=c && c<='z') || /* variable */ + ('A'<=c && c<='Z')) { + value = ((c>'Z')?c-'a'+'Z'-'A'+1:c-'A'); + last_token = 'v'; + return last_token; + } else if ('='==c && '='== *ptr) { /* equal */ + ptr++; + last_token = T_EQUAL; + return last_token; + } else if ('!'==c && '='== *ptr) { /* equal */ + ptr++; + last_token = T_NEQUAL; + } else if ('<'==c && '<'== *ptr) { /* shift */ + ptr++; + last_token = T_LSHIFT; + return last_token; + } else if ('>'==c && '>'== *ptr) { /* shift */ + ptr++; + last_token = T_RSHIFT; + return last_token; + } else { + last_token = c; + return last_token; + return c; + } +} + +static int +expr() +{ + int d,assign; + + d = aexpr(); + assign = lvalue; + while(last_token!=EOF) { + switch(last_token) { + case '<': + d = (d < aexpr()); + break; + case '>': + d = (d > aexpr()); + break; + case T_EQUAL: + d = (d == aexpr()); + break; + case T_NEQUAL: + d = (d != aexpr()); + break; + case T_LSHIFT: + d <<= aexpr(); + break; + case T_RSHIFT: + d >>= aexpr(); + break; + case '?': + { + int true; + true = expr(); + if(last_token != ':') { + error("? expression not terminated with :"); + return true; + } + if(d) { + expr(); + return true; + } else { + return expr(); + } + } + break; + case '=': + if(assign>=0) { + d = expr(); + variable[assign] = d; + return d; + } else { + error("Bad assignment"); + return 0; + } + break; + case ':': + case ')': + return d; + default: + error("Bad expression"); + token(); + } + } + last_token = EOF; + return d; +} + +static int +aexpr() +{ + int d; + + d = mexpr(); + while(last_token!=EOF) { + switch(last_token) { + case '^': + d ^= mexpr(); + break; + case '|': + d |= mexpr(); + break; + case '&': + d &= mexpr(); + break; + case '-': + d -= mexpr(); + break; + case '+': + d += mexpr(); + break; + default: + return d; + } + } + return d; +} + +static int +mexpr() +{ + int d; + + d = term(); + while(last_token!=EOF) { + switch(last_token) { + case '*': + d *= term(); + break; + case '/': + d /= term(); + break; + case '%': + d %= term(); + break; + case '^': + d ^= term(); + break; + default: + return d; + } + } + return d; +} + +static int term() +{ + int d; + + lvalue= -1; + token(); + if(last_token==EOF) { + error("Term expected"); + } + switch(last_token) { + case '0': + d = value; + token(); + return d; + case 'v': + d = lvalue = value; + token(); + return variable[d]; + case '-': + return - term(); + case '!': + return ! term(); + case '(': + d = expr(); + if(last_token != ')') { + error("Unbalanced parenthsis"); + } + token(); + return d; + default: + token(); + error("Unknown term"); + return 0; + } +} + +int +main(int ac,char *av[]) +{ + int d; + char buf[BUFSIZ]; + + while (fgets(buf,BUFSIZ,stdin)) { + ptr = buf; + d = expr(); + printf("%s = 0x%08x = %d\n",buf,d,d); + fflush(stdout); + } + return 0; +} + +/* end */ diff -r 000000000000 -r 6bf66c125dbc calc.s --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calc.s Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,982 @@ +.text + .align 2 +_line_skip: + mflr r0 + bcl 20,31,L1$pb +L1$pb: + mflr r10 + mtlr r0 + addis r9,r10,ha16(L_ptr$non_lazy_ptr-L1$pb) + lwz r11,lo16(L_ptr$non_lazy_ptr-L1$pb)(r9) +L2: + lwz r9,0(r11) + lbz r0,0(r9) + addi r9,r9,1 + stw r9,0(r11) + cmpwi cr0,r0,0 + bne+ cr0,L2 + addis r9,r10,ha16(L_ptr$non_lazy_ptr-L1$pb) + lwz r9,lo16(L_ptr$non_lazy_ptr-L1$pb)(r9) + lwz r0,0(r9) + addis r9,r10,ha16(L_last_ptr$non_lazy_ptr-L1$pb) + lwz r9,lo16(L_last_ptr$non_lazy_ptr-L1$pb)(r9) + stw r0,0(r9) + li r0,-1 + addis r9,r10,ha16(L_last_token$non_lazy_ptr-L1$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L1$pb)(r9) + stw r0,0(r9) + blr +.data +.cstring + .align 2 +LC0: + .ascii "%s on %s\12\0" +.text + .align 2 +_error: + mflr r0 + stw r31,-4(r1) + stw r0,8(r1) + stwu r1,-80(r1) + bcl 20,31,L2$pb +L2$pb: + mflr r31 + mr r5,r3 + addis r3,r31,ha16(L___sF$non_lazy_ptr-L2$pb) + lwz r3,lo16(L___sF$non_lazy_ptr-L2$pb)(r3) + addi r3,r3,176 + addis r4,r31,ha16(LC0-L2$pb) + la r4,lo16(LC0-L2$pb)(r4) + addis r9,r31,ha16(L_last_ptr$non_lazy_ptr-L2$pb) + lwz r9,lo16(L_last_ptr$non_lazy_ptr-L2$pb)(r9) + lwz r6,0(r9) + bl L_fprintf$stub + bl _line_skip + lwz r0,88(r1) + addi r1,r1,80 + mtlr r0 + lwz r31,-4(r1) + blr + .align 2 +_token: + mflr r0 + stw r31,-4(r1) + stw r0,8(r1) + stwu r1,-80(r1) + bcl 20,31,L3$pb +L3$pb: + mflr r31 + addis r9,r31,ha16(L_ptr$non_lazy_ptr-L3$pb) + lwz r9,lo16(L_ptr$non_lazy_ptr-L3$pb)(r9) + lwz r11,0(r9) + addis r9,r31,ha16(L_last_ptr$non_lazy_ptr-L3$pb) + lwz r9,lo16(L_last_ptr$non_lazy_ptr-L3$pb)(r9) + stw r11,0(r9) + lbz r0,0(r11) + extsb r3,r0 + cmpwi cr0,r3,32 + bgt- cr0,L8 + cmpwi cr0,r3,0 + beq- cr0,L8 + addis r9,r31,ha16(L_ptr$non_lazy_ptr-L3$pb) + lwz r11,lo16(L_ptr$non_lazy_ptr-L3$pb)(r9) +L11: + lwz r9,0(r11) + addi r0,r9,1 + stw r0,0(r11) + lbz r0,1(r9) + extsb r3,r0 + cmpwi cr0,r3,32 + bgt- cr0,L8 + cmpwi cr0,r3,0 + bne+ cr0,L11 +L8: + cmpwi cr0,r3,0 + bne- cr0,L12 + li r0,-1 + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L3$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L3$pb)(r9) + stw r0,0(r9) + b L77 +L12: + addis r9,r31,ha16(L_ptr$non_lazy_ptr-L3$pb) + lwz r9,lo16(L_ptr$non_lazy_ptr-L3$pb)(r9) + lwz r11,0(r9) + addi r0,r11,1 + stw r0,0(r9) + cmpwi cr0,r3,47 + bne+ cr0,L13 + lbz r0,1(r11) + extsb r0,r0 + cmpwi cr0,r0,47 + beq- cr0,L14 + cmpwi cr0,r0,42 + bne+ cr0,L13 +L14: + bl _line_skip +L77: + li r3,-1 + b L6 +L13: + addi r0,r3,-49 + cmplwi cr0,r0,8 + bgt- cr0,L15 + addi r10,r3,-48 + addis r11,r31,ha16(L_ptr$non_lazy_ptr-L3$pb) + lwz r11,lo16(L_ptr$non_lazy_ptr-L3$pb)(r11) + lwz r9,0(r11) + lbz r0,0(r9) + addi r9,r9,1 + stw r9,0(r11) + extsb. r3,r0 + beq- cr0,L48 +L21: + addi r0,r3,-48 + cmplwi cr0,r0,9 + bgt- cr0,L48 + mulli r9,r10,10 + add r9,r9,r3 + addi r10,r9,-48 + lwz r9,0(r11) + lbz r0,0(r9) + addi r9,r9,1 + stw r9,0(r11) + extsb. r3,r0 + bne+ cr0,L21 + b L48 +L15: + cmpwi cr0,r3,48 + bne+ cr0,L24 + addis r9,r31,ha16(L_ptr$non_lazy_ptr-L3$pb) + lwz r8,lo16(L_ptr$non_lazy_ptr-L3$pb)(r9) + lwz r11,0(r8) + lbz r0,0(r11) + cmpwi cr0,r0,120 + bne+ cr0,L24 + addi r9,r11,1 + stw r9,0(r8) + li r10,0 + lbz r0,1(r11) + addi r9,r9,1 + stw r9,0(r8) + extsb. r3,r0 + beq- cr0,L48 + mr r11,r8 +L34: + addi r0,r3,-48 + cmplwi cr0,r0,9 + bgt- cr0,L28 + slwi r9,r10,4 + add r9,r9,r3 + addi r10,r9,-48 + b L25 +L28: + addi r0,r3,-97 + cmplwi cr0,r0,5 + ble- cr0,L76 + addi r0,r3,-65 + cmplwi cr0,r0,5 + bgt- cr0,L48 +L76: + slwi r9,r10,4 + add r9,r9,r3 + addi r10,r9,-87 +L25: + lwz r9,0(r11) + lbz r0,0(r9) + addi r9,r9,1 + stw r9,0(r11) + extsb. r3,r0 + bne+ cr0,L34 + b L48 +L24: + cmpwi cr0,r3,48 + bne+ cr0,L37 + li r10,0 + addis r11,r31,ha16(L_ptr$non_lazy_ptr-L3$pb) + lwz r11,lo16(L_ptr$non_lazy_ptr-L3$pb)(r11) + lwz r9,0(r11) + lbz r0,0(r9) + addi r9,r9,1 + stw r9,0(r11) + extsb. r3,r0 + beq- cr0,L48 +L43: + addi r0,r3,-48 + cmplwi cr0,r0,7 + bgt- cr0,L48 + slwi r9,r10,3 + add r9,r9,r3 + addi r10,r9,-48 + lwz r9,0(r11) + lbz r0,0(r9) + addi r9,r9,1 + stw r9,0(r11) + extsb. r3,r0 + bne+ cr0,L43 + b L48 +L37: + cmpwi cr0,r3,39 + bne+ cr0,L46 + li r10,0 + addis r11,r31,ha16(L_ptr$non_lazy_ptr-L3$pb) + lwz r11,lo16(L_ptr$non_lazy_ptr-L3$pb)(r11) + lwz r9,0(r11) + lbz r0,0(r9) + addi r9,r9,1 + stw r9,0(r11) + extsb. r3,r0 + beq- cr0,L48 + addis r6,r31,ha16(L_ptr$non_lazy_ptr-L3$pb) + mr r7,r11 +L54: + cmpwi cr0,r3,39 + beq- cr0,L50 + cmpwi cr0,r3,127 + bgt- cr0,L50 + slwi r0,r10,8 + add r10,r0,r3 + b L47 +L50: + cmpwi cr0,r3,127 + ble- cr0,L48 + lwz r8,lo16(L_ptr$non_lazy_ptr-L3$pb)(r6) + lwz r11,0(r8) + lbz r0,0(r11) + extsb. r9,r0 + beq- cr0,L48 + slwi r0,r10,8 + add r0,r0,r3 + slwi r0,r0,8 + add r10,r0,r9 + addi r0,r11,1 + stw r0,0(r8) +L47: + lwz r9,0(r7) + lbz r0,0(r9) + addi r9,r9,1 + stw r9,0(r7) + extsb. r3,r0 + bne+ cr0,L54 +L48: + cmpwi cr0,r3,0 + beq- cr0,L55 + addis r11,r31,ha16(L_ptr$non_lazy_ptr-L3$pb) + lwz r11,lo16(L_ptr$non_lazy_ptr-L3$pb)(r11) + lwz r9,0(r11) + addi r9,r9,-1 + stw r9,0(r11) +L55: + addis r9,r31,ha16(L_value$non_lazy_ptr-L3$pb) + lwz r9,lo16(L_value$non_lazy_ptr-L3$pb)(r9) + stw r10,0(r9) + li r0,48 + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L3$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L3$pb)(r9) + stw r0,0(r9) + li r3,48 + b L6 +L46: + addi r0,r3,-97 + cmplwi cr0,r0,25 + ble- cr0,L58 + addi r0,r3,-65 + cmplwi cr0,r0,25 + bgt- cr0,L57 +L58: + addi r0,r3,-71 + cmpwi cr0,r3,90 + bgt- cr0,L60 + addi r0,r3,-65 +L60: + addis r9,r31,ha16(L_value$non_lazy_ptr-L3$pb) + lwz r9,lo16(L_value$non_lazy_ptr-L3$pb)(r9) + stw r0,0(r9) + li r0,118 + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L3$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L3$pb)(r9) + stw r0,0(r9) + li r3,118 + b L6 +L57: + cmpwi cr0,r3,61 + bne+ cr0,L62 + addis r9,r31,ha16(L_ptr$non_lazy_ptr-L3$pb) + lwz r11,lo16(L_ptr$non_lazy_ptr-L3$pb)(r9) + lwz r9,0(r11) + lbz r0,0(r9) + cmpwi cr0,r0,61 + bne+ cr0,L62 + addi r0,r9,1 + stw r0,0(r11) + li r0,317 + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L3$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L3$pb)(r9) + stw r0,0(r9) + li r3,317 + b L6 +L62: + cmpwi cr0,r3,33 + bne+ cr0,L64 + addis r9,r31,ha16(L_ptr$non_lazy_ptr-L3$pb) + lwz r9,lo16(L_ptr$non_lazy_ptr-L3$pb)(r9) + lwz r9,0(r9) + lbz r0,0(r9) + cmpwi cr0,r0,61 + beq- cr0,L70 +L64: + cmpwi cr0,r3,60 + bne+ cr0,L66 + addis r9,r31,ha16(L_ptr$non_lazy_ptr-L3$pb) + lwz r11,lo16(L_ptr$non_lazy_ptr-L3$pb)(r9) + lwz r9,0(r11) + lbz r0,0(r9) + cmpwi cr0,r0,60 + bne+ cr0,L66 + addi r0,r9,1 + stw r0,0(r11) + li r0,316 + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L3$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L3$pb)(r9) + stw r0,0(r9) + li r3,316 + b L6 +L66: + cmpwi cr0,r3,62 + bne+ cr0,L68 + addis r9,r31,ha16(L_ptr$non_lazy_ptr-L3$pb) + lwz r11,lo16(L_ptr$non_lazy_ptr-L3$pb)(r9) + lwz r9,0(r11) + lbz r0,0(r9) + cmpwi cr0,r0,62 + bne+ cr0,L68 + addi r0,r9,1 + stw r0,0(r11) + li r0,318 + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L3$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L3$pb)(r9) + stw r0,0(r9) + li r3,318 + b L6 +L68: + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L3$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L3$pb)(r9) + stw r3,0(r9) + b L6 +L70: + addis r11,r31,ha16(L_ptr$non_lazy_ptr-L3$pb) + lwz r11,lo16(L_ptr$non_lazy_ptr-L3$pb)(r11) + lwz r9,0(r11) + addi r9,r9,1 + stw r9,0(r11) + li r0,289 + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L3$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L3$pb)(r9) + stw r0,0(r9) +L6: + lwz r0,88(r1) + addi r1,r1,80 + mtlr r0 + lwz r31,-4(r1) + blr +.data +.cstring + .align 2 +LC1: + .ascii "? expression not terminated with :\0" + .align 2 +LC2: + .ascii "Bad assignment\0" + .align 2 +LC3: + .ascii "Bad expression\0" +.text + .align 2 +_expr: + mflr r0 + stmw r28,-16(r1) + stw r0,8(r1) + stwu r1,-80(r1) + bcl 20,31,L4$pb +L4$pb: + mflr r31 + bl L_aexpr$stub + mr r30,r3 + addis r9,r31,ha16(L_lvalue$non_lazy_ptr-L4$pb) + lwz r9,lo16(L_lvalue$non_lazy_ptr-L4$pb)(r9) + lwz r28,0(r9) + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L4$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L4$pb)(r9) + lwz r0,0(r9) + cmpwi cr0,r0,-1 + beq- cr0,L108 + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L4$pb) + lwz r29,lo16(L_last_token$non_lazy_ptr-L4$pb)(r9) +L106: + lwz r0,0(r29) + cmpwi cr0,r0,62 + beq- cr0,L86 + bgt- cr0,L103 + cmpwi cr0,r0,58 + beq- cr0,L110 + bgt- cr0,L104 + cmpwi cr0,r0,41 + beq- cr0,L110 + b L101 +L104: + cmpwi cr0,r0,60 + beq- cr0,L84 + cmpwi cr0,r0,61 + beq- cr0,L96 + b L101 +L103: + cmpwi cr0,r0,316 + beq- cr0,L90 + bgt- cr0,L105 + cmpwi cr0,r0,63 + beq- cr0,L92 + cmpwi cr0,r0,289 + beq- cr0,L89 + b L101 +L105: + cmpwi cr0,r0,317 + beq- cr0,L88 + cmpwi cr0,r0,318 + beq- cr0,L91 + b L101 +L84: + bl L_aexpr$stub + li r0,1 + cmpw cr0,r30,r3 + blt- cr0,L109 + b L112 +L86: + bl L_aexpr$stub + li r0,1 + cmpw cr0,r30,r3 + bgt- cr0,L109 +L112: + li r0,0 + b L109 +L88: + bl L_aexpr$stub + xor r30,r30,r3 + subfic r0,r30,0 + adde r30,r0,r30 + b L80 +L89: + bl L_aexpr$stub + xor r30,r30,r3 + addic r9,r30,-1 + subfe r0,r9,r30 +L109: + mr r30,r0 + b L80 +L90: + bl L_aexpr$stub + slw r30,r30,r3 + b L80 +L91: + bl L_aexpr$stub + sraw r30,r30,r3 + b L80 +L92: + bl _expr + mr r28,r3 + lwz r0,0(r29) + cmpwi cr0,r0,58 + beq- cr0,L93 + addis r3,r31,ha16(LC1-L4$pb) + la r3,lo16(LC1-L4$pb)(r3) + bl _error + b L111 +L93: + cmpwi cr0,r30,0 + beq- cr0,L94 + bl _expr +L111: + mr r3,r28 + b L79 +L94: + bl _expr + b L79 +L96: + cmpwi cr0,r28,0 + blt- cr0,L97 + bl _expr + slwi r0,r28,2 + addis r9,r31,ha16(L_variable$non_lazy_ptr-L4$pb) + lwz r9,lo16(L_variable$non_lazy_ptr-L4$pb)(r9) + stwx r3,r9,r0 + b L79 +L97: + addis r3,r31,ha16(LC2-L4$pb) + la r3,lo16(LC2-L4$pb)(r3) + bl _error + li r3,0 + b L79 +L101: + addis r3,r31,ha16(LC3-L4$pb) + la r3,lo16(LC3-L4$pb)(r3) + bl _error + bl _token +L80: + lwz r0,0(r29) + cmpwi cr0,r0,-1 + bne+ cr0,L106 +L108: + li r0,-1 + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L4$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L4$pb)(r9) + stw r0,0(r9) +L110: + mr r3,r30 +L79: + lwz r0,88(r1) + addi r1,r1,80 + mtlr r0 + lmw r28,-16(r1) + blr + .align 2 +_aexpr: + mflr r0 + stmw r29,-12(r1) + stw r0,8(r1) + stwu r1,-80(r1) + bcl 20,31,L5$pb +L5$pb: + mflr r31 + bl L_mexpr$stub + mr r30,r3 + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L5$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L5$pb)(r9) + lwz r0,0(r9) + cmpwi cr0,r0,-1 + beq- cr0,L128 + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L5$pb) + lwz r29,lo16(L_last_token$non_lazy_ptr-L5$pb)(r9) +L126: + lwz r0,0(r29) + cmpwi cr0,r0,45 + beq- cr0,L121 + bgt- cr0,L125 + cmpwi cr0,r0,38 + beq- cr0,L120 + cmpwi cr0,r0,43 + beq+ cr0,L122 + b L128 +L125: + cmpwi cr0,r0,94 + beq- cr0,L118 + cmpwi cr0,r0,124 + beq+ cr0,L119 + b L128 +L118: + bl L_mexpr$stub + xor r30,r30,r3 + b L114 +L119: + bl L_mexpr$stub + or r30,r30,r3 + b L114 +L120: + bl L_mexpr$stub + and r30,r30,r3 + b L114 +L121: + bl L_mexpr$stub + subf r30,r3,r30 + b L114 +L122: + bl L_mexpr$stub + add r30,r30,r3 +L114: + lwz r0,0(r29) + cmpwi cr0,r0,-1 + bne+ cr0,L126 +L128: + mr r3,r30 + lwz r0,88(r1) + addi r1,r1,80 + mtlr r0 + lmw r29,-12(r1) + blr + .align 2 +_mexpr: + mflr r0 + stmw r29,-12(r1) + stw r0,8(r1) + stwu r1,-80(r1) + bcl 20,31,L6$pb +L6$pb: + mflr r31 + bl L_term$stub + mr r30,r3 + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L6$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L6$pb)(r9) + lwz r0,0(r9) + cmpwi cr0,r0,-1 + beq- cr0,L143 + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L6$pb) + lwz r29,lo16(L_last_token$non_lazy_ptr-L6$pb)(r9) +L141: + lwz r0,0(r29) + cmpwi cr0,r0,42 + beq- cr0,L134 + bgt- cr0,L140 + cmpwi cr0,r0,37 + beq+ cr0,L136 + b L143 +L140: + cmpwi cr0,r0,47 + beq- cr0,L135 + cmpwi cr0,r0,94 + beq+ cr0,L137 + b L143 +L134: + bl L_term$stub + mullw r30,r30,r3 + b L130 +L135: + bl L_term$stub + divw r30,r30,r3 + b L130 +L136: + bl L_term$stub + divw r0,r30,r3 + mullw r0,r0,r3 + subf r30,r0,r30 + b L130 +L137: + bl L_term$stub + xor r30,r30,r3 +L130: + lwz r0,0(r29) + cmpwi cr0,r0,-1 + bne+ cr0,L141 +L143: + mr r3,r30 + lwz r0,88(r1) + addi r1,r1,80 + mtlr r0 + lmw r29,-12(r1) + blr +.data +.cstring + .align 2 +LC4: + .ascii "Term expected\0" + .align 2 +LC5: + .ascii "Unbalanced parenthsis\0" + .align 2 +LC6: + .ascii "Unknown term\0" +.text + .align 2 +_term: + mflr r0 + stmw r30,-8(r1) + stw r0,8(r1) + stwu r1,-80(r1) + bcl 20,31,L7$pb +L7$pb: + mflr r31 + li r0,-1 + addis r9,r31,ha16(L_lvalue$non_lazy_ptr-L7$pb) + lwz r9,lo16(L_lvalue$non_lazy_ptr-L7$pb)(r9) + stw r0,0(r9) + bl _token + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L7$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L7$pb)(r9) + lwz r0,0(r9) + cmpwi cr0,r0,-1 + bne+ cr0,L145 + addis r3,r31,ha16(LC4-L7$pb) + la r3,lo16(LC4-L7$pb)(r3) + bl _error +L145: + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L7$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L7$pb)(r9) + lwz r9,0(r9) + cmpwi cr0,r9,48 + beq- cr0,L147 + bgt- cr0,L155 + cmpwi cr0,r9,40 + beq- cr0,L151 + bgt- cr0,L156 + cmpwi cr0,r9,33 + beq- cr0,L150 + b L153 +L156: + cmpwi cr0,r9,45 + beq- cr0,L149 + b L153 +L155: + cmpwi cr0,r9,118 + beq- cr0,L148 + b L153 +L147: + addis r9,r31,ha16(L_value$non_lazy_ptr-L7$pb) + lwz r9,lo16(L_value$non_lazy_ptr-L7$pb)(r9) + lwz r30,0(r9) + b L152 +L148: + addis r9,r31,ha16(L_value$non_lazy_ptr-L7$pb) + lwz r9,lo16(L_value$non_lazy_ptr-L7$pb)(r9) + lwz r0,0(r9) + addis r9,r31,ha16(L_lvalue$non_lazy_ptr-L7$pb) + lwz r9,lo16(L_lvalue$non_lazy_ptr-L7$pb)(r9) + stw r0,0(r9) + mr r30,r0 + bl _token + slwi r0,r30,2 + addis r9,r31,ha16(L_variable$non_lazy_ptr-L7$pb) + lwz r9,lo16(L_variable$non_lazy_ptr-L7$pb)(r9) + lwzx r0,r9,r0 + b L144 +L149: + bl _term + neg r0,r3 + b L144 +L150: + bl _term + subfic r9,r3,0 + adde r0,r9,r3 + b L144 +L151: + bl _expr + mr r30,r3 + addis r9,r31,ha16(L_last_token$non_lazy_ptr-L7$pb) + lwz r9,lo16(L_last_token$non_lazy_ptr-L7$pb)(r9) + lwz r0,0(r9) + cmpwi cr0,r0,41 + beq- cr0,L152 + addis r3,r31,ha16(LC5-L7$pb) + la r3,lo16(LC5-L7$pb)(r3) + bl _error +L152: + bl _token + mr r0,r30 + b L144 +L153: + bl _token + addis r3,r31,ha16(LC6-L7$pb) + la r3,lo16(LC6-L7$pb)(r3) + bl _error + li r0,0 +L144: + mr r3,r0 + lwz r0,88(r1) + addi r1,r1,80 + mtlr r0 + lmw r30,-8(r1) + blr +.data +.cstring + .align 2 +LC7: + .ascii "%s = 0x%08x = %d\12\0" +.text + .align 2 + .globl _main +_main: + mflr r0 + stmw r28,-16(r1) + stw r0,8(r1) + stwu r1,-1104(r1) + bcl 20,31,L8$pb +L8$pb: + mflr r31 + addis r29,r31,ha16(L___sF$non_lazy_ptr-L8$pb) + addis r9,r31,ha16(L_ptr$non_lazy_ptr-L8$pb) + lwz r28,lo16(L_ptr$non_lazy_ptr-L8$pb)(r9) + addi r30,r1,64 + b L158 +L161: + stw r30,0(r28) + bl _expr + mr r6,r3 + addis r3,r31,ha16(LC7-L8$pb) + la r3,lo16(LC7-L8$pb)(r3) + mr r4,r30 + mr r5,r6 + bl L_printf$stub + lwz r3,lo16(L___sF$non_lazy_ptr-L8$pb)(r29) + addi r3,r3,88 + bl L_fflush$stub +L158: + addi r3,r1,64 + li r4,1024 + lwz r5,lo16(L___sF$non_lazy_ptr-L8$pb)(r29) + bl L_fgets$stub + cmpwi cr0,r3,0 + bne+ cr0,L161 + li r3,0 + lwz r0,1112(r1) + addi r1,r1,1104 + mtlr r0 + lmw r28,-16(r1) + blr +.comm _ptr,4 +.comm _last_ptr,4 +.comm _value,4 +.comm _lvalue,4 +.comm _last_token,4 +.comm _variable,192 +.data +.picsymbol_stub +L_fflush$stub: + .indirect_symbol _fflush + mflr r0 + bcl 20,31,L0$_fflush +L0$_fflush: + mflr r11 + addis r11,r11,ha16(L_fflush$lazy_ptr-L0$_fflush) + mtlr r0 + lwz r12,lo16(L_fflush$lazy_ptr-L0$_fflush)(r11) + mtctr r12 + addi r11,r11,lo16(L_fflush$lazy_ptr-L0$_fflush) + bctr +.data +.lazy_symbol_pointer +L_fflush$lazy_ptr: + .indirect_symbol _fflush + .long dyld_stub_binding_helper +.data +.picsymbol_stub +L_printf$stub: + .indirect_symbol _printf + mflr r0 + bcl 20,31,L0$_printf +L0$_printf: + mflr r11 + addis r11,r11,ha16(L_printf$lazy_ptr-L0$_printf) + mtlr r0 + lwz r12,lo16(L_printf$lazy_ptr-L0$_printf)(r11) + mtctr r12 + addi r11,r11,lo16(L_printf$lazy_ptr-L0$_printf) + bctr +.data +.lazy_symbol_pointer +L_printf$lazy_ptr: + .indirect_symbol _printf + .long dyld_stub_binding_helper +.data +.picsymbol_stub +L_fgets$stub: + .indirect_symbol _fgets + mflr r0 + bcl 20,31,L0$_fgets +L0$_fgets: + mflr r11 + addis r11,r11,ha16(L_fgets$lazy_ptr-L0$_fgets) + mtlr r0 + lwz r12,lo16(L_fgets$lazy_ptr-L0$_fgets)(r11) + mtctr r12 + addi r11,r11,lo16(L_fgets$lazy_ptr-L0$_fgets) + bctr +.data +.lazy_symbol_pointer +L_fgets$lazy_ptr: + .indirect_symbol _fgets + .long dyld_stub_binding_helper +.data +.picsymbol_stub +L_term$stub: + .indirect_symbol _term + mflr r0 + bcl 20,31,L0$_term +L0$_term: + mflr r11 + addis r11,r11,ha16(L_term$lazy_ptr-L0$_term) + mtlr r0 + lwz r12,lo16(L_term$lazy_ptr-L0$_term)(r11) + mtctr r12 + addi r11,r11,lo16(L_term$lazy_ptr-L0$_term) + bctr +.data +.lazy_symbol_pointer +L_term$lazy_ptr: + .indirect_symbol _term + .long dyld_stub_binding_helper +.data +.picsymbol_stub +L_mexpr$stub: + .indirect_symbol _mexpr + mflr r0 + bcl 20,31,L0$_mexpr +L0$_mexpr: + mflr r11 + addis r11,r11,ha16(L_mexpr$lazy_ptr-L0$_mexpr) + mtlr r0 + lwz r12,lo16(L_mexpr$lazy_ptr-L0$_mexpr)(r11) + mtctr r12 + addi r11,r11,lo16(L_mexpr$lazy_ptr-L0$_mexpr) + bctr +.data +.lazy_symbol_pointer +L_mexpr$lazy_ptr: + .indirect_symbol _mexpr + .long dyld_stub_binding_helper +.data +.picsymbol_stub +L_aexpr$stub: + .indirect_symbol _aexpr + mflr r0 + bcl 20,31,L0$_aexpr +L0$_aexpr: + mflr r11 + addis r11,r11,ha16(L_aexpr$lazy_ptr-L0$_aexpr) + mtlr r0 + lwz r12,lo16(L_aexpr$lazy_ptr-L0$_aexpr)(r11) + mtctr r12 + addi r11,r11,lo16(L_aexpr$lazy_ptr-L0$_aexpr) + bctr +.data +.lazy_symbol_pointer +L_aexpr$lazy_ptr: + .indirect_symbol _aexpr + .long dyld_stub_binding_helper +.data +.picsymbol_stub +L_fprintf$stub: + .indirect_symbol _fprintf + mflr r0 + bcl 20,31,L0$_fprintf +L0$_fprintf: + mflr r11 + addis r11,r11,ha16(L_fprintf$lazy_ptr-L0$_fprintf) + mtlr r0 + lwz r12,lo16(L_fprintf$lazy_ptr-L0$_fprintf)(r11) + mtctr r12 + addi r11,r11,lo16(L_fprintf$lazy_ptr-L0$_fprintf) + bctr +.data +.lazy_symbol_pointer +L_fprintf$lazy_ptr: + .indirect_symbol _fprintf + .long dyld_stub_binding_helper +.data +.non_lazy_symbol_pointer +L_variable$non_lazy_ptr: + .indirect_symbol _variable + .long 0 +L_lvalue$non_lazy_ptr: + .indirect_symbol _lvalue + .long 0 +L_value$non_lazy_ptr: + .indirect_symbol _value + .long 0 +L___sF$non_lazy_ptr: + .indirect_symbol ___sF + .long 0 +L_last_token$non_lazy_ptr: + .indirect_symbol _last_token + .long 0 +L_last_ptr$non_lazy_ptr: + .indirect_symbol _last_ptr + .long 0 +L_ptr$non_lazy_ptr: + .indirect_symbol _ptr + .long 0 diff -r 000000000000 -r 6bf66c125dbc calc.s.gcc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calc.s.gcc Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,1466 @@ + .file "calc.c" +.toc +.csect .text[PR] +gcc2_compiled.: +__gnu_compiled_c: +.toc +LC..0: + .tc ptr[TC],ptr +LC..1: + .tc last_ptr[TC],last_ptr +LC..2: + .tc last_token[TC],last_token +.csect .text[PR] + .align 2 + .globl line_skip + .globl .line_skip +.csect line_skip[DS] +line_skip: + .long .line_skip, TOC[tc0], 0 +.csect .text[PR] +.line_skip: + st 31,-4(1) + stu 1,-32(1) + mr 31,1 + cror 0,0,0 +L..2: + l 9,LC..0(2) + l 11,0(9) + cal 0,1(11) + st 0,0(9) + lbz 9,0(11) + rlinm 0,9,0,0xff + cmpi 1,0,0 + bc 12,6,$+8 + b L..4 + b L..3 +L..4: + b L..2 +L..3: + l 9,LC..1(2) + l 11,LC..0(2) + l 0,0(11) + st 0,0(9) + l 9,LC..2(2) + lil 0,-1 + st 0,0(9) +L..1: + l 1,0(1) + l 31,-4(1) + br +LT..line_skip: + .long 0 + .byte 0,0,32,96,128,1,0,1 + .long LT..line_skip-.line_skip + .short 9 + .byte "line_skip" + .byte 31 + .extern fprintf[DS] + .extern .fprintf + .extern _iob[RW] +.csect _calc.rw_c[RO] + .align 2 +LC..3: + .byte "%s on %s" + .byte 10, 0 +.toc +LC..4: + .tc last_ptr[TC],last_ptr +LC..5: + .tc _iob.P64[TC],_iob[RW]+64 +LC..6: + .tc LC..3[TC],LC..3 +.csect .text[PR] + .align 2 + .globl error + .globl .error +.csect error[DS] +error: + .long .error, TOC[tc0], 0 +.csect .text[PR] +.error: + mflr 0 + st 31,-4(1) + st 0,8(1) + stu 1,-64(1) + mr 31,1 + st 3,88(31) + l 9,LC..4(2) + l 3,LC..5(2) + l 4,LC..6(2) + l 5,88(31) + l 6,0(9) + bl .fprintf + cror 31,31,31 + bl .line_skip + cror 31,31,31 +L..5: + l 1,0(1) + l 0,8(1) + mtlr 0 + l 31,-4(1) + br +LT..error: + .long 0 + .byte 0,0,32,97,128,1,1,1 + .long 0 + .long LT..error-.error + .short 5 + .byte "error" + .byte 31 +.toc +LC..7: + .tc last_ptr[TC],last_ptr +LC..8: + .tc ptr[TC],ptr +LC..9: + .tc last_token[TC],last_token +LC..10: + .tc value[TC],value +.csect .text[PR] + .align 2 + .globl token + .globl .token +.csect token[DS] +token: + .long .token, TOC[tc0], 0 +.csect .text[PR] +.token: + mflr 0 + st 31,-4(1) + st 0,8(1) + stu 1,-72(1) + mr 31,1 + l 9,LC..7(2) + l 11,LC..8(2) + l 0,0(11) + st 0,0(9) + l 11,LC..8(2) + l 9,0(11) + lbz 0,0(9) + rlinm 9,0,0,0xff + st 9,56(31) +L..7: + l 0,56(31) + cmpi 1,0,32 + bc 4,5,$+8 + b L..10 + l 0,56(31) + cmpi 1,0,0 + bc 12,6,$+8 + b L..9 + b L..10 +L..10: + b L..8 +L..9: + l 0,LC..8(2) + l 9,LC..8(2) + l 11,LC..8(2) + l 10,0(11) + cal 0,1(10) + mr 11,0 + st 11,0(9) + lbz 0,0(11) + rlinm 9,0,0,0xff + st 9,56(31) + b L..7 +L..8: + l 0,56(31) + cmpi 1,0,0 + bc 12,6,$+8 + b L..11 + l 9,LC..9(2) + lil 0,-1 + st 0,0(9) + l 9,LC..9(2) + l 3,0(9) + b L..6 +L..11: + l 0,LC..8(2) + l 9,LC..8(2) + l 11,LC..8(2) + l 10,0(11) + cal 0,1(10) + mr 11,0 + st 11,0(9) + l 0,56(31) + cmpi 1,0,47 + bc 12,6,$+8 + b L..12 + l 11,LC..8(2) + l 9,0(11) + lbz 11,0(9) + rlinm 0,11,0,0xff + cmpi 1,0,47 + bc 4,6,$+8 + b L..13 + l 11,LC..8(2) + l 9,0(11) + lbz 11,0(9) + rlinm 0,11,0,0xff + cmpi 1,0,42 + bc 4,6,$+8 + b L..13 + b L..12 +L..13: + bl .line_skip + cror 31,31,31 + lil 3,-1 + b L..6 +L..12: + l 0,56(31) + cmpi 1,0,48 + bc 12,5,$+8 + b L..14 + l 0,56(31) + cmpi 1,0,57 + bc 4,5,$+8 + b L..14 + l 0,56(31) + ai 9,0,-48 + st 9,60(31) +L..15: + l 9,LC..8(2) + l 11,0(9) + cal 0,1(11) + st 0,0(9) + lbz 9,0(11) + rlinm 0,9,0,0xff + mr 9,0 + st 9,56(31) + cmpi 1,9,0 + bc 12,6,$+8 + b L..17 + b L..16 +L..17: + l 0,56(31) + cmpi 1,0,47 + bc 12,5,$+8 + b L..18 + l 0,56(31) + cmpi 1,0,57 + bc 4,5,$+8 + b L..18 + l 9,60(31) + muli 0,9,10 + ai 9,0,-48 + l 0,56(31) + cax 9,9,0 + st 9,60(31) + b L..19 +L..18: + b L..16 +L..19: + b L..15 +L..16: + l 0,56(31) + cmpi 1,0,0 + bc 4,6,$+8 + b L..20 + l 0,LC..8(2) + l 9,LC..8(2) + l 11,LC..8(2) + l 0,0(11) + ai 11,0,-1 + mr 0,11 + st 0,0(9) + lil 9,-1 + cmp 1,0,9 + bc 4,6,$+8 + b L..20 +L..20: + l 9,LC..10(2) + l 0,60(31) + st 0,0(9) + l 9,LC..9(2) + lil 0,48 + st 0,0(9) + l 9,LC..9(2) + l 3,0(9) + b L..6 + b L..21 +L..14: + l 0,56(31) + cmpi 1,0,48 + bc 12,6,$+8 + b L..22 + l 11,LC..8(2) + l 9,0(11) + lbz 11,0(9) + rlinm 0,11,0,0xff + cmpi 1,0,120 + bc 12,6,$+8 + b L..22 + l 0,LC..8(2) + l 9,LC..8(2) + l 11,LC..8(2) + l 10,0(11) + cal 0,1(10) + mr 11,0 + st 11,0(9) + lil 0,0 + st 0,60(31) +L..23: + l 9,LC..8(2) + l 11,0(9) + cal 0,1(11) + st 0,0(9) + lbz 9,0(11) + rlinm 0,9,0,0xff + mr 9,0 + st 9,56(31) + cmpi 1,9,0 + bc 12,6,$+8 + b L..25 + b L..24 +L..25: + l 0,56(31) + cmpi 1,0,47 + bc 12,5,$+8 + b L..26 + l 0,56(31) + cmpi 1,0,57 + bc 4,5,$+8 + b L..26 + l 0,60(31) + mr 9,0 + sli 0,9,4 + ai 9,0,-48 + l 0,56(31) + cax 9,9,0 + st 9,60(31) + b L..27 +L..26: + l 0,56(31) + cmpi 1,0,96 + bc 12,5,$+8 + b L..28 + l 0,56(31) + cmpi 1,0,102 + bc 4,5,$+8 + b L..28 + l 0,60(31) + mr 9,0 + sli 0,9,4 + ai 9,0,-87 + l 0,56(31) + cax 9,9,0 + st 9,60(31) + b L..29 +L..28: + l 0,56(31) + cmpi 1,0,64 + bc 12,5,$+8 + b L..30 + l 0,56(31) + cmpi 1,0,70 + bc 4,5,$+8 + b L..30 + l 0,60(31) + mr 9,0 + sli 0,9,4 + ai 9,0,-87 + l 0,56(31) + cax 9,9,0 + st 9,60(31) + b L..31 +L..30: + b L..24 +L..31: +L..29: +L..27: + b L..23 +L..24: + l 0,56(31) + cmpi 1,0,0 + bc 4,6,$+8 + b L..32 + l 0,LC..8(2) + l 9,LC..8(2) + l 11,LC..8(2) + l 0,0(11) + ai 11,0,-1 + mr 0,11 + st 0,0(9) + lil 9,-1 + cmp 1,0,9 + bc 4,6,$+8 + b L..32 +L..32: + l 9,LC..10(2) + l 0,60(31) + st 0,0(9) + l 9,LC..9(2) + lil 0,48 + st 0,0(9) + l 9,LC..9(2) + l 3,0(9) + b L..6 + b L..33 +L..22: + l 0,56(31) + cmpi 1,0,48 + bc 12,6,$+8 + b L..34 + l 0,56(31) + ai 9,0,-48 + st 9,60(31) +L..35: + l 9,LC..8(2) + l 11,0(9) + cal 0,1(11) + st 0,0(9) + lbz 9,0(11) + rlinm 0,9,0,0xff + mr 9,0 + st 9,56(31) + cmpi 1,9,0 + bc 12,6,$+8 + b L..37 + b L..36 +L..37: + l 0,56(31) + cmpi 1,0,47 + bc 12,5,$+8 + b L..38 + l 0,56(31) + cmpi 1,0,55 + bc 4,5,$+8 + b L..38 + l 0,60(31) + mr 9,0 + sli 0,9,3 + ai 9,0,-48 + l 0,56(31) + cax 9,9,0 + st 9,60(31) + b L..39 +L..38: + b L..36 +L..39: + b L..35 +L..36: + l 0,56(31) + cmpi 1,0,0 + bc 4,6,$+8 + b L..40 + l 0,LC..8(2) + l 9,LC..8(2) + l 11,LC..8(2) + l 0,0(11) + ai 11,0,-1 + mr 0,11 + st 0,0(9) + lil 9,-1 + cmp 1,0,9 + bc 4,6,$+8 + b L..40 +L..40: + l 9,LC..10(2) + l 0,60(31) + st 0,0(9) + l 9,LC..9(2) + lil 0,48 + st 0,0(9) + l 9,LC..9(2) + l 3,0(9) + b L..6 + b L..41 +L..34: + l 0,56(31) + cmpi 1,0,39 + bc 12,6,$+8 + b L..42 + lil 0,0 + st 0,60(31) +L..43: + l 9,LC..8(2) + l 11,0(9) + cal 0,1(11) + st 0,0(9) + lbz 9,0(11) + rlinm 0,9,0,0xff + mr 9,0 + st 9,56(31) + cmpi 1,9,0 + bc 12,6,$+8 + b L..45 + b L..44 +L..45: + l 0,56(31) + cmpi 1,0,39 + bc 4,6,$+8 + b L..46 + l 0,56(31) + cmpi 1,0,127 + bc 4,5,$+8 + b L..46 + l 0,60(31) + mr 9,0 + sli 0,9,8 + l 9,56(31) + cax 0,0,9 + st 0,60(31) + b L..47 +L..46: + l 0,56(31) + cmpi 1,0,127 + bc 12,5,$+8 + b L..48 + l 11,LC..8(2) + l 9,0(11) + lbz 11,0(9) + rlinm 0,11,0,0xff + cmpi 1,0,0 + bc 4,6,$+8 + b L..48 + l 0,60(31) + mr 9,0 + sli 0,9,16 + l 9,56(31) + mr 11,9 + sli 9,11,8 + cax 0,0,9 + l 9,LC..8(2) + l 11,0(9) + cal 10,1(11) + st 10,0(9) + lbz 11,0(11) + rlinm 9,11,0,0xff + cax 0,0,9 + st 0,60(31) + b L..49 +L..48: + b L..44 +L..49: +L..47: + b L..43 +L..44: + l 0,56(31) + cmpi 1,0,0 + bc 4,6,$+8 + b L..50 + l 0,LC..8(2) + l 9,LC..8(2) + l 11,LC..8(2) + l 0,0(11) + ai 11,0,-1 + mr 0,11 + st 0,0(9) + lil 9,-1 + cmp 1,0,9 + bc 4,6,$+8 + b L..50 +L..50: + l 9,LC..10(2) + l 0,60(31) + st 0,0(9) + l 9,LC..9(2) + lil 0,48 + st 0,0(9) + l 9,LC..9(2) + l 3,0(9) + b L..6 + b L..51 +L..42: + l 0,56(31) + cmpi 1,0,96 + bc 12,5,$+8 + b L..54 + l 0,56(31) + cmpi 1,0,122 + bc 12,5,$+8 + b L..53 + b L..54 +L..54: + l 0,56(31) + cmpi 1,0,64 + bc 12,5,$+8 + b L..52 + l 0,56(31) + cmpi 1,0,90 + bc 12,5,$+8 + b L..53 + b L..52 +L..53: + l 9,LC..10(2) + l 0,56(31) + cmpi 1,0,90 + bc 12,5,$+8 + b L..55 + l 11,56(31) + cal 0,-71(11) + b L..56 +L..55: + l 11,56(31) + cal 0,-65(11) +L..56: + st 0,0(9) + l 9,LC..9(2) + lil 0,118 + st 0,0(9) + l 9,LC..9(2) + l 3,0(9) + b L..6 + b L..57 +L..52: + l 0,56(31) + cmpi 1,0,61 + bc 12,6,$+8 + b L..58 + l 11,LC..8(2) + l 9,0(11) + lbz 11,0(9) + rlinm 0,11,0,0xff + cmpi 1,0,61 + bc 12,6,$+8 + b L..58 + l 0,LC..8(2) + l 9,LC..8(2) + l 11,LC..8(2) + l 10,0(11) + cal 0,1(10) + mr 11,0 + st 11,0(9) + l 9,LC..9(2) + lil 0,317 + st 0,0(9) + l 9,LC..9(2) + l 3,0(9) + b L..6 + b L..59 +L..58: + l 0,56(31) + cmpi 1,0,33 + bc 12,6,$+8 + b L..60 + l 11,LC..8(2) + l 9,0(11) + lbz 11,0(9) + rlinm 0,11,0,0xff + cmpi 1,0,61 + bc 12,6,$+8 + b L..60 + l 0,LC..8(2) + l 9,LC..8(2) + l 11,LC..8(2) + l 10,0(11) + cal 0,1(10) + mr 11,0 + st 11,0(9) + l 9,LC..9(2) + lil 0,289 + st 0,0(9) + b L..61 +L..60: + l 0,56(31) + cmpi 1,0,60 + bc 12,6,$+8 + b L..62 + l 11,LC..8(2) + l 9,0(11) + lbz 11,0(9) + rlinm 0,11,0,0xff + cmpi 1,0,60 + bc 12,6,$+8 + b L..62 + l 0,LC..8(2) + l 9,LC..8(2) + l 11,LC..8(2) + l 10,0(11) + cal 0,1(10) + mr 11,0 + st 11,0(9) + l 9,LC..9(2) + lil 0,316 + st 0,0(9) + l 9,LC..9(2) + l 3,0(9) + b L..6 + b L..63 +L..62: + l 0,56(31) + cmpi 1,0,62 + bc 12,6,$+8 + b L..64 + l 11,LC..8(2) + l 9,0(11) + lbz 11,0(9) + rlinm 0,11,0,0xff + cmpi 1,0,62 + bc 12,6,$+8 + b L..64 + l 0,LC..8(2) + l 9,LC..8(2) + l 11,LC..8(2) + l 10,0(11) + cal 0,1(10) + mr 11,0 + st 11,0(9) + l 9,LC..9(2) + lil 0,318 + st 0,0(9) + l 9,LC..9(2) + l 3,0(9) + b L..6 + b L..65 +L..64: + l 9,LC..9(2) + l 0,56(31) + st 0,0(9) + l 9,LC..9(2) + l 3,0(9) + b L..6 + l 3,56(31) + b L..6 +L..65: +L..63: +L..61: +L..59: +L..57: +L..51: +L..41: +L..33: +L..21: +L..6: + l 1,0(1) + l 0,8(1) + mtlr 0 + l 31,-4(1) + br +LT..token: + .long 0 + .byte 0,0,32,97,128,1,0,1 + .long LT..token-.token + .short 5 + .byte "token" + .byte 31 + .extern aexpr[DS] + .extern .aexpr +.csect _calc.rw_c[RO] + .align 2 +LC..13: + .byte "? expression not terminated with :" + .byte 0 + .align 2 +LC..16: + .byte "Bad assignment" + .byte 0 + .align 2 +LC..18: + .byte "Bad expression" + .byte 0 +.toc +LC..11: + .tc lvalue[TC],lvalue +LC..12: + .tc last_token[TC],last_token +LC..14: + .tc LC..13[TC],LC..13 +LC..15: + .tc variable[TC],variable +LC..17: + .tc LC..16[TC],LC..16 +LC..19: + .tc LC..18[TC],LC..18 +.csect .text[PR] + .align 2 + .globl expr + .globl .expr +.csect expr[DS] +expr: + .long .expr, TOC[tc0], 0 +.csect .text[PR] +.expr: + mflr 0 + st 31,-4(1) + st 0,8(1) + stu 1,-80(1) + mr 31,1 + bl .aexpr + cror 31,31,31 + mr 0,3 + st 0,56(31) + l 9,LC..11(2) + l 0,0(9) + st 0,60(31) +L..67: + l 9,LC..12(2) + l 0,0(9) + lil 9,-1 + cmp 1,0,9 + bc 12,6,$+8 + b L..69 + b L..68 +L..69: + l 9,LC..12(2) + l 0,0(9) + cmpi 1,0,62 + bc 4,6,$+8 + b L..72 + cmpi 1,0,62 + bc 4,5,$+8 + b L..88 + cmpi 1,0,58 + bc 4,6,$+8 + b L..84 + cmpi 1,0,58 + bc 4,5,$+8 + b L..89 + cmpi 1,0,41 + bc 4,6,$+8 + b L..85 + b L..86 +L..89: + cmpi 1,0,60 + bc 4,6,$+8 + b L..71 + cmpi 1,0,61 + bc 4,6,$+8 + b L..81 + b L..86 +L..88: + cmpi 1,0,316 + bc 4,6,$+8 + b L..75 + cmpi 1,0,316 + bc 4,5,$+8 + b L..90 + cmpi 1,0,63 + bc 4,6,$+8 + b L..77 + cmpi 1,0,289 + bc 4,6,$+8 + b L..74 + b L..86 +L..90: + cmpi 1,0,317 + bc 4,6,$+8 + b L..73 + cmpi 1,0,318 + bc 4,6,$+8 + b L..76 + b L..86 +L..71: + bl .aexpr + cror 31,31,31 + mr 0,3 + l 9,56(31) + cmp 1,9,0 + mfcr 0 + rlinm 0,0,5,1 + st 0,56(31) + b L..70 +L..72: + bl .aexpr + cror 31,31,31 + mr 0,3 + l 9,56(31) + cmp 1,9,0 + mfcr 0 + rlinm 0,0,6,1 + st 0,56(31) + b L..70 +L..73: + bl .aexpr + cror 31,31,31 + mr 0,3 + l 9,56(31) + cmp 1,9,0 + mfcr 0 + rlinm 0,0,7,1 + st 0,56(31) + b L..70 +L..74: + bl .aexpr + cror 31,31,31 + mr 0,3 + l 9,56(31) + xor 0,9,0 + abs 9,0 + neg 0,9 + sri 0,0,31 + st 0,56(31) + b L..70 +L..75: + bl .aexpr + cror 31,31,31 + mr 0,3 + l 9,56(31) + sle 0,9,0 + st 0,56(31) + b L..70 +L..76: + bl .aexpr + cror 31,31,31 + mr 0,3 + l 9,56(31) + srea 0,9,0 + st 0,56(31) + b L..70 +L..77: + bl .expr + mr 0,3 + st 0,64(31) + l 9,LC..12(2) + l 0,0(9) + cmpi 1,0,58 + bc 4,6,$+8 + b L..78 + l 3,LC..14(2) + bl .error + cror 31,31,31 + l 3,64(31) + b L..66 +L..78: + l 0,56(31) + cmpi 1,0,0 + bc 4,6,$+8 + b L..79 + bl .expr + l 3,64(31) + b L..66 + b L..80 +L..79: + bl .expr + mr 0,3 + mr 3,0 + b L..66 +L..80: + b L..70 +L..81: + l 0,60(31) + cmpi 1,0,0 + bc 4,4,$+8 + b L..82 + bl .expr + mr 0,3 + st 0,56(31) + l 0,60(31) + mr 9,0 + sli 0,9,2 + l 9,LC..15(2) + cax 0,0,9 + mr 9,0 + l 0,56(31) + st 0,0(9) + l 3,56(31) + b L..66 + b L..83 +L..82: + l 3,LC..17(2) + bl .error + cror 31,31,31 + lil 3,0 + b L..66 +L..83: + b L..70 +L..84: +L..85: + l 3,56(31) + b L..66 +L..86: + l 3,LC..19(2) + bl .error + cror 31,31,31 + bl .token + cror 31,31,31 +L..70: + b L..67 +L..68: + l 9,LC..12(2) + lil 0,-1 + st 0,0(9) + l 3,56(31) + b L..66 +L..66: + l 1,0(1) + l 0,8(1) + mtlr 0 + l 31,-4(1) + br +LT..expr: + .long 0 + .byte 0,0,32,97,128,1,0,1 + .long LT..expr-.expr + .short 4 + .byte "expr" + .byte 31 + .extern mexpr[DS] + .extern .mexpr +.toc +LC..20: + .tc last_token[TC],last_token +.csect .text[PR] + .align 2 + .globl aexpr + .globl .aexpr +.csect aexpr[DS] +aexpr: + .long .aexpr, TOC[tc0], 0 +.csect .text[PR] +.aexpr: + mflr 0 + st 31,-4(1) + st 0,8(1) + stu 1,-72(1) + mr 31,1 + bl .mexpr + cror 31,31,31 + mr 0,3 + st 0,56(31) +L..92: + l 9,LC..20(2) + l 0,0(9) + lil 9,-1 + cmp 1,0,9 + bc 12,6,$+8 + b L..94 + b L..93 +L..94: + l 9,LC..20(2) + l 0,0(9) + cmpi 1,0,45 + bc 4,6,$+8 + b L..99 + cmpi 1,0,45 + bc 4,5,$+8 + b L..103 + cmpi 1,0,38 + bc 4,6,$+8 + b L..98 + cmpi 1,0,43 + bc 4,6,$+8 + b L..100 + b L..101 +L..103: + cmpi 1,0,94 + bc 4,6,$+8 + b L..96 + cmpi 1,0,124 + bc 4,6,$+8 + b L..97 + b L..101 +L..96: + bl .mexpr + cror 31,31,31 + mr 0,3 + l 9,56(31) + xor 0,9,0 + st 0,56(31) + b L..95 +L..97: + bl .mexpr + cror 31,31,31 + mr 0,3 + l 9,56(31) + or 0,9,0 + st 0,56(31) + b L..95 +L..98: + bl .mexpr + cror 31,31,31 + mr 0,3 + l 9,56(31) + and 0,9,0 + st 0,56(31) + b L..95 +L..99: + bl .mexpr + cror 31,31,31 + mr 0,3 + l 9,56(31) + sf 0,0,9 + st 0,56(31) + b L..95 +L..100: + bl .mexpr + cror 31,31,31 + mr 0,3 + l 9,56(31) + cax 0,9,0 + st 0,56(31) + b L..95 +L..101: + l 3,56(31) + b L..91 +L..95: + b L..92 +L..93: + l 3,56(31) + b L..91 +L..91: + l 1,0(1) + l 0,8(1) + mtlr 0 + l 31,-4(1) + br +LT..aexpr: + .long 0 + .byte 0,0,32,97,128,1,0,1 + .long LT..aexpr-.aexpr + .short 5 + .byte "aexpr" + .byte 31 + .extern term[DS] + .extern .term +.toc +LC..21: + .tc last_token[TC],last_token +.csect .text[PR] + .align 2 + .globl mexpr + .globl .mexpr +.csect mexpr[DS] +mexpr: + .long .mexpr, TOC[tc0], 0 +.csect .text[PR] +.mexpr: + mflr 0 + st 31,-4(1) + st 0,8(1) + stu 1,-72(1) + mr 31,1 + bl .term + cror 31,31,31 + mr 0,3 + st 0,56(31) +L..105: + l 9,LC..21(2) + l 0,0(9) + lil 9,-1 + cmp 1,0,9 + bc 12,6,$+8 + b L..107 + b L..106 +L..107: + l 9,LC..21(2) + l 0,0(9) + cmpi 1,0,42 + bc 4,6,$+8 + b L..109 + cmpi 1,0,42 + bc 4,5,$+8 + b L..115 + cmpi 1,0,37 + bc 4,6,$+8 + b L..111 + b L..113 +L..115: + cmpi 1,0,47 + bc 4,6,$+8 + b L..110 + cmpi 1,0,94 + bc 4,6,$+8 + b L..112 + b L..113 +L..109: + bl .mexpr + mr 0,3 + l 9,56(31) + muls 0,9,0 + st 0,56(31) + b L..108 +L..110: + bl .mexpr + mr 0,3 + l 9,56(31) + divs 0,9,0 + mfmq 11 + st 11,60(31) + st 0,56(31) + b L..108 +L..111: + bl .mexpr + mr 0,3 + l 9,56(31) + divs 0,9,0 + mfmq 11 + st 11,60(31) + l 11,60(31) + st 11,56(31) + b L..108 +L..112: + bl .mexpr + mr 0,3 + l 9,56(31) + xor 0,9,0 + st 0,56(31) + b L..108 +L..113: + l 3,56(31) + b L..104 +L..108: + b L..105 +L..106: + l 3,56(31) + b L..104 +L..104: + l 1,0(1) + l 0,8(1) + mtlr 0 + l 31,-4(1) + br +LT..mexpr: + .long 0 + .byte 0,0,32,97,128,1,0,1 + .long LT..mexpr-.mexpr + .short 5 + .byte "mexpr" + .byte 31 +.csect _calc.rw_c[RO] + .align 2 +LC..24: + .byte "Term expected" + .byte 0 + .align 2 +LC..28: + .byte "Unbalanced parenthsis" + .byte 0 + .align 2 +LC..30: + .byte "Unknown term" + .byte 0 +.toc +LC..22: + .tc lvalue[TC],lvalue +LC..23: + .tc last_token[TC],last_token +LC..25: + .tc LC..24[TC],LC..24 +LC..26: + .tc value[TC],value +LC..27: + .tc variable[TC],variable +LC..29: + .tc LC..28[TC],LC..28 +LC..31: + .tc LC..30[TC],LC..30 +.csect .text[PR] + .align 2 + .globl term + .globl .term +.csect term[DS] +term: + .long .term, TOC[tc0], 0 +.csect .text[PR] +.term: + mflr 0 + st 31,-4(1) + st 0,8(1) + stu 1,-72(1) + mr 31,1 + l 9,LC..22(2) + lil 0,-1 + st 0,0(9) + bl .token + cror 31,31,31 + l 9,LC..23(2) + l 0,0(9) + lil 9,-1 + cmp 1,0,9 + bc 12,6,$+8 + b L..117 + l 3,LC..25(2) + bl .error + cror 31,31,31 +L..117: + l 9,LC..23(2) + l 0,0(9) + cmpi 1,0,48 + bc 4,6,$+8 + b L..119 + cmpi 1,0,48 + bc 4,5,$+8 + b L..127 + cmpi 1,0,40 + bc 4,6,$+8 + b L..123 + cmpi 1,0,40 + bc 4,5,$+8 + b L..128 + cmpi 1,0,33 + bc 4,6,$+8 + b L..122 + b L..125 +L..128: + cmpi 1,0,45 + bc 4,6,$+8 + b L..121 + b L..125 +L..127: + cmpi 1,0,118 + bc 4,6,$+8 + b L..120 + b L..125 +L..119: + l 9,LC..26(2) + l 0,0(9) + st 0,56(31) + bl .token + cror 31,31,31 + l 3,56(31) + b L..116 +L..120: + l 9,LC..22(2) + l 11,LC..26(2) + l 0,0(11) + st 0,0(9) + st 0,56(31) + bl .token + cror 31,31,31 + l 0,56(31) + mr 9,0 + sli 0,9,2 + l 9,LC..27(2) + cax 0,0,9 + mr 9,0 + l 3,0(9) + b L..116 +L..121: + bl .term + mr 0,3 + neg 9,0 + mr 3,9 + b L..116 +L..122: + bl .term + mr 0,3 + cmpi 1,0,0 + mfcr 0 + rlinm 0,0,7,1 + mr 3,0 + b L..116 +L..123: + bl .expr + cror 31,31,31 + mr 0,3 + st 0,56(31) + l 9,LC..23(2) + l 0,0(9) + cmpi 1,0,41 + bc 4,6,$+8 + b L..124 + l 3,LC..29(2) + bl .error + cror 31,31,31 +L..124: + bl .token + cror 31,31,31 + l 3,56(31) + b L..116 +L..125: + bl .token + cror 31,31,31 + l 3,LC..31(2) + bl .error + cror 31,31,31 + lil 3,0 + b L..116 +L..118: +L..116: + l 1,0(1) + l 0,8(1) + mtlr 0 + l 31,-4(1) + br +LT..term: + .long 0 + .byte 0,0,32,97,128,1,0,1 + .long LT..term-.term + .short 4 + .byte "term" + .byte 31 + .extern .__main + .extern fgets[DS] + .extern .fgets + .extern printf[DS] + .extern .printf +.csect _calc.rw_c[RO] + .align 2 +LC..34: + .byte "%s = 0x%08x = %d" + .byte 10, 0 + .extern fflush[DS] + .extern .fflush +.toc +LC..32: + .tc _iob[TC],_iob[RW] +LC..33: + .tc ptr[TC],ptr +LC..35: + .tc LC..34[TC],LC..34 +LC..36: + .tc _iob.P32[TC],_iob[RW]+32 +.csect .text[PR] + .align 2 + .globl main + .globl .main +.csect main[DS] +main: + .long .main, TOC[tc0], 0 +.csect .text[PR] +.main: + mflr 0 + st 31,-4(1) + st 0,8(1) + stu 1,-4168(1) + mr 31,1 + bl .__main + cror 31,31,31 +L..130: + cal 0,60(31) + mr 3,0 + lil 4,4096 + l 5,LC..32(2) + bl .fgets + cror 31,31,31 + mr 0,3 + cmpi 1,0,0 + bc 12,6,$+8 + b L..132 + b L..131 +L..132: + l 9,LC..33(2) + cal 0,60(31) + st 0,0(9) + bl .expr + cror 31,31,31 + mr 0,3 + st 0,56(31) + cal 0,60(31) + l 3,LC..35(2) + mr 4,0 + l 5,56(31) + l 6,56(31) + bl .printf + cror 31,31,31 + l 3,LC..36(2) + bl .fflush + cror 31,31,31 + b L..130 +L..131: + lil 3,0 + b L..129 +L..129: + l 1,0(1) + l 0,8(1) + mtlr 0 + l 31,-4(1) + br +LT..main: + .long 0 + .byte 0,0,32,97,128,1,0,1 + .long LT..main-.main + .short 4 + .byte "main" + .byte 31 +.comm ptr,4 +.comm last_ptr,4 +.comm value,4 +.comm lvalue,4 +.comm last_token,4 +.comm variable,192 +_section_.text: +.csect .data[RW] + .long _section_.text diff -r 000000000000 -r 6bf66c125dbc calc.s.rs6k --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calc.s.rs6k Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,1181 @@ +.set r0,0; .set SP,1; .set RTOC,2; .set r3,3; .set r4,4 +.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9 +.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14 +.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19 +.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24 +.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29 +.set r30,30; .set r31,31 +.set fp0,0; .set fp1,1; .set fp2,2; .set fp3,3; .set fp4,4 +.set fp5,5; .set fp6,6; .set fp7,7; .set fp8,8; .set fp9,9 +.set fp10,10; .set fp11,11; .set fp12,12; .set fp13,13; .set fp14,14 +.set fp15,15; .set fp16,16; .set fp17,17; .set fp18,18; .set fp19,19 +.set fp20,20; .set fp21,21; .set fp22,22; .set fp23,23; .set fp24,24 +.set fp25,25; .set fp26,26; .set fp27,27; .set fp28,28; .set fp29,29 +.set fp30,30; .set fp31,31 +.set MQ,0; .set XER,1; .set FROM_RTCU,4; .set FROM_RTCL,5; .set FROM_DEC,6 +.set LR,8; .set CTR,9; .set TID,17; .set DSISR,18; .set DAR,19; .set TO_RTCU,20 +.set TO_RTCL,21; .set TO_DEC,22; .set SDR_0,24; .set SDR_1,25; .set SRR_0,26 +.set SRR_1,27 +.set BO_dCTR_NZERO_AND_NOT,0; .set BO_dCTR_NZERO_AND_NOT_1,1 +.set BO_dCTR_ZERO_AND_NOT,2; .set BO_dCTR_ZERO_AND_NOT_1,3 +.set BO_IF_NOT,4; .set BO_IF_NOT_1,5; .set BO_IF_NOT_2,6 +.set BO_IF_NOT_3,7; .set BO_dCTR_NZERO_AND,8; .set BO_dCTR_NZERO_AND_1,9 +.set BO_dCTR_ZERO_AND,10; .set BO_dCTR_ZERO_AND_1,11; .set BO_IF,12 +.set BO_IF_1,13; .set BO_IF_2,14; .set BO_IF_3,15; .set BO_dCTR_NZERO,16 +.set BO_dCTR_NZERO_1,17; .set BO_dCTR_ZERO,18; .set BO_dCTR_ZERO_1,19 +.set BO_ALWAYS,20; .set BO_ALWAYS_1,21; .set BO_ALWAYS_2,22 +.set BO_ALWAYS_3,23; .set BO_dCTR_NZERO_8,24; .set BO_dCTR_NZERO_9,25 +.set BO_dCTR_ZERO_8,26; .set BO_dCTR_ZERO_9,27; .set BO_ALWAYS_8,28 +.set BO_ALWAYS_9,29; .set BO_ALWAYS_10,30; .set BO_ALWAYS_11,31 +.set CR0_LT,0; .set CR0_GT,1; .set CR0_EQ,2; .set CR0_SO,3 +.set CR1_FX,4; .set CR1_FEX,5; .set CR1_VX,6; .set CR1_OX,7 +.set CR2_LT,8; .set CR2_GT,9; .set CR2_EQ,10; .set CR2_SO,11 +.set CR3_LT,12; .set CR3_GT,13; .set CR3_EQ,14; .set CR3_SO,15 +.set CR4_LT,16; .set CR4_GT,17; .set CR4_EQ,18; .set CR4_SO,19 +.set CR5_LT,20; .set CR5_GT,21; .set CR5_EQ,22; .set CR5_SO,23 +.set CR6_LT,24; .set CR6_GT,25; .set CR6_EQ,26; .set CR6_SO,27 +.set CR7_LT,28; .set CR7_GT,29; .set CR7_EQ,30; .set CR7_SO,31 +.set TO_LT,16; .set TO_GT,8; .set TO_EQ,4; .set TO_LLT,2; .set TO_LGT,1 + + .rename H.10.NO_SYMBOL{PR},"" + .rename E.30._calc_c_{RW},"_calc$c$" + .rename H.32._calc_c_{TC},"_calc$c$" + .rename H.36.line_skip{TC},"line_skip" + .rename H.40.ptr{TC},"ptr" + .rename H.44.last_ptr{TC},"last_ptr" + .rename H.48.last_token{TC},"last_token" + .rename H.52.error{TC},"error" + .rename H.56._iob{TC},"_iob" + .rename H.60.token{TC},"token" + .rename H.64.value{TC},"value" + .rename H.68.expr{TC},"expr" + .rename H.72.lvalue{TC},"lvalue" + .rename H.76.variable{TC},"variable" + .rename H.80.aexpr{TC},"aexpr" + .rename H.84.mexpr{TC},"mexpr" + .rename H.88.term{TC},"term" + .rename H.92.main{TC},"main" + + .lglobl H.10.NO_SYMBOL{PR} + .globl .line_skip + .globl .error + .globl .token + .globl .expr + .globl .aexpr + .globl .mexpr + .globl .term + .globl .main + .lglobl E.30._calc_c_{RW} + .globl line_skip{DS} + .globl ptr{RW} + .globl last_ptr{RW} + .globl last_token{RW} + .globl error{DS} + .extern _iob{UA} + .globl token{DS} + .globl value{RW} + .globl expr{DS} + .globl lvalue{RW} + .globl variable{RW} + .globl aexpr{DS} + .globl mexpr{DS} + .globl term{DS} + .globl main{DS} + .extern .fprintf{PR} + .extern .fgets{PR} + .extern .printf{PR} + .extern .fflush{PR} + + +# .text section + + + .csect H.10.NO_SYMBOL{PR} +.line_skip: # 0x00000000 (H.10.NO_SYMBOL) + .file "calc.c" + l r4,T.40.ptr(RTOC) + cal r0,-1(r0) + l r3,0(r4) + l r5,T.44.last_ptr(RTOC) + lbz r6,0(r3) + cal r8,0(r3) + cmpi 0,r6,0 + ai r3,r3,1 + st r3,0(r4) + l r6,T.48.last_token(RTOC) + bc BO_IF,CR0_EQ,__L54 + lbzu r7,1(r8) + ai r3,r3,1 + cmpi 1,r7,0 + st r3,0(r4) +__L3c: # 0x0000003c (H.10.NO_SYMBOL+0x3c) + bc BO_IF,CR1_VX,__L54 + lbzu r7,1(r8) + ai r3,r3,1 + cmpi 1,r7,0 + st r3,0(r4) + b __L3c +__L54: # 0x00000054 (H.10.NO_SYMBOL+0x54) + st r3,0(r5) + st r0,0(r6) + bcr BO_ALWAYS,CR0_LT +# traceback table + .long 0x00000000 + .byte 0x00 # VERSION=0 + .byte 0x00 # LANG=TB_C + .byte 0x20 # IS_GL=0,IS_EPROL=0,HAS_TBOFF=1 + # INT_PROC=0,HAS_CTL=0,TOCLESS=0 + # FP_PRESENT=0,LOG_ABORT=0 + .byte 0x40 # INT_HNDL=0,NAME_PRESENT=1 + # USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND + # SAVES_CR=0,SAVES_LR=0 + .byte 0x00 # STORES_BC=0,FPR_SAVED=0 + .byte 0x00 # GPR_SAVED=0 + .byte 0x00 # FIXEDPARMS=0 + .byte 0x00 # FLOATPARMS=0,PARMSONSTK=0 + .long 0x00000060 # TB_OFFSET + .short 9 # NAME_LEN + .byte "line_skip" + .byte 0 # padding +# End of traceback table +.error: # 0x0000007c (H.10.NO_SYMBOL+0x7c) + cal r5,0(r3) + l r4,T.44.last_ptr(RTOC) + mfspr r0,LR + stu SP,-64(SP) + l r3,T.56._iob(RTOC) + l r6,0(r4) + st r0,72(SP) + ai r3,r3,64 + l r4,T.32._calc_c_(RTOC) + bl .fprintf{PR} + cror CR3_SO,CR3_SO,CR3_SO + bl .line_skip + l r12,72(SP) + ai SP,SP,64 + mtspr LR,r12 + bcr BO_ALWAYS,CR0_LT +# traceback table + .long 0x00000000 + .byte 0x00 # VERSION=0 + .byte 0x00 # LANG=TB_C + .byte 0x20 # IS_GL=0,IS_EPROL=0,HAS_TBOFF=1 + # INT_PROC=0,HAS_CTL=0,TOCLESS=0 + # FP_PRESENT=0,LOG_ABORT=0 + .byte 0x41 # INT_HNDL=0,NAME_PRESENT=1 + # USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND + # SAVES_CR=0,SAVES_LR=1 + .byte 0x80 # STORES_BC=1,FPR_SAVED=0 + .byte 0x00 # GPR_SAVED=0 + .byte 0x01 # FIXEDPARMS=1 + .byte 0x00 # FLOATPARMS=0,PARMSONSTK=0 + .long 0x00000000 # + .long 0x00000040 # TB_OFFSET + .short 5 # NAME_LEN + .byte "error" + .byte 0 # padding +# End of traceback table +.token: # 0x000000d8 (H.10.NO_SYMBOL+0xd8) + l r6,T.40.ptr(RTOC) + l r4,T.44.last_ptr(RTOC) + l r5,0(r6) + mfspr r0,LR + st r5,0(r4) + lbz r3,0(r5) + stu SP,-64(SP) + cmpi 0,r3,32 + cmpi 1,r3,0 + st r0,72(SP) + ai r4,r5,1 + bc BO_IF,CR0_GT,__L150 + bc BO_IF,CR1_VX,__L158 + ai r7,r5,2 + cal r5,0(r4) + st r5,0(r6) + lbz r3,0(r4) + ai r4,r7,1 + cmpi 0,r3,32 + cmpi 1,r3,0 +__L128: # 0x00000128 (H.10.NO_SYMBOL+0x128) + bc BO_IF,CR0_GT,__L150 + bc BO_IF,CR1_VX,__L158 + ai r5,r5,1 + st r5,0(r6) + lbz r3,0(r7) + cal r7,0(r4) + cmpi 0,r3,32 + cmpi 1,r3,0 + ai r4,r4,1 + b __L128 +__L150: # 0x00000150 (H.10.NO_SYMBOL+0x150) + cmpi 1,r3,0 + bc BO_IF_NOT,CR1_VX,__L16c +__L158: # 0x00000158 (H.10.NO_SYMBOL+0x158) + ai SP,SP,64 + l r4,T.48.last_token(RTOC) + cal r3,-1(r0) + st r3,0(r4) + bcr BO_ALWAYS,CR0_LT +__L16c: # 0x0000016c (H.10.NO_SYMBOL+0x16c) + cmpi 0,r3,47 + ai r4,r5,1 + st r4,0(r6) + bc BO_IF_NOT,CR0_EQ,__L1a8 + lbz r4,1(r5) + cmpli 1,r4,0x002f + cmpli 0,r4,0x002a + bc BO_IF,CR1_VX,__L190 + bc BO_IF_NOT,CR0_EQ,__L1a8 +__L190: # 0x00000190 (H.10.NO_SYMBOL+0x190) + bl .line_skip + cal r3,-1(r0) + l r12,72(SP) + ai SP,SP,64 + mtspr LR,r12 + bcr BO_ALWAYS,CR0_LT +__L1a8: # 0x000001a8 (H.10.NO_SYMBOL+0x1a8) + cmpi 1,r3,49 + cmpi 0,r3,57 + cmpi 7,r3,48 + cmpi 6,r3,39 + ai r8,r3,-48 + bc BO_IF,CR1_FX,__L258 + bc BO_IF,CR0_GT,__L258 + lbz r3,1(r5) + ai r4,r5,1 + cmpi 0,r3,0 + ai r5,r5,2 + st r5,0(r6) + bc BO_IF,CR0_EQ,__L22c + rlinm r0,r8,3,0,28 + cmpi 1,r3,48 + cmpi 0,r3,57 + ai r7,r3,-48 + a r0,r8,r0 +__L1f0: # 0x000001f0 (H.10.NO_SYMBOL+0x1f0) + bc BO_IF,CR1_FX,__L22c + a r0,r8,r0 + bc BO_IF,CR0_GT,__L22c + lbzu r3,1(r4) + ai r5,r5,1 + cmpi 6,r3,0 + a r8,r7,r0 + st r5,0(r6) + ai r7,r3,-48 + bc BO_IF,CR6_EQ,__L22c + rlinm r0,r8,3,0,28 + cmpi 1,r3,48 + cmpi 0,r3,57 + a r0,r8,r0 + b __L1f0 +__L22c: # 0x0000022c (H.10.NO_SYMBOL+0x22c) + cmpi 0,r3,0 + bc BO_IF,CR0_EQ,__L23c + ai r4,r5,-1 + st r4,0(r6) +__L23c: # 0x0000023c (H.10.NO_SYMBOL+0x23c) + l r3,T.64.value(RTOC) + ai SP,SP,64 + l r4,T.48.last_token(RTOC) +__L248: # 0x00000248 (H.10.NO_SYMBOL+0x248) + st r8,0(r3) + cal r3,48(r0) + st r3,0(r4) + bcr BO_ALWAYS,CR0_LT +__L258: # 0x00000258 (H.10.NO_SYMBOL+0x258) + cmpi 0,r3,97 + bc BO_IF_NOT,CR7_EQ,__L3c8 + lbz r4,1(r5) + cal r0,0(r8) + cmpli 1,r4,0x0078 + bc BO_IF_NOT,CR1_VX,__L344 + ai r4,r5,2 + st r4,0(r6) + lbz r3,2(r5) + ai r0,r5,3 + cmpi 0,r3,0 + st r0,0(r6) + cal r8,0(r0) + bc BO_IF,CR0_EQ,__L324 + cmpi 6,r3,48 + cmpi 0,r3,57 + cmpi 1,r3,97 + cmpi 7,r3,102 +__L2a0: # 0x000002a0 (H.10.NO_SYMBOL+0x2a0) + rlinm r5,r8,4,0,27 + cror CR0_EQ,CR6_LT,CR0_GT + bc BO_IF,CR0_EQ,__L2c4 + ai r3,r3,-48 + a r8,r3,r5 + lbzu r3,1(r4) + ai r0,r0,1 + cmpi 0,r3,0 + b __L308 +__L2c4: # 0x000002c4 (H.10.NO_SYMBOL+0x2c4) + cmpi 0,r3,65 + cmpi 6,r3,70 + cror CR1_VX,CR1_FX,CR7_GT + bc BO_IF,CR1_VX,__L2ec + ai r3,r3,-87 + a r8,r5,r3 + lbzu r3,1(r4) + ai r0,r0,1 + cmpi 0,r3,0 + b __L308 +__L2ec: # 0x000002ec (H.10.NO_SYMBOL+0x2ec) + ai r7,r3,-87 + bc BO_IF,CR0_LT,__L324 + bc BO_IF,CR6_GT,__L324 + a r8,r5,r7 + lbzu r3,1(r4) + ai r0,r0,1 + cmpi 0,r3,0 +__L308: # 0x00000308 (H.10.NO_SYMBOL+0x308) + st r0,0(r6) + bc BO_IF,CR0_EQ,__L324 + cmpi 6,r3,48 + cmpi 0,r3,57 + cmpi 1,r3,97 + cmpi 7,r3,102 + b __L2a0 +__L324: # 0x00000324 (H.10.NO_SYMBOL+0x324) + cmpi 1,r3,0 + bc BO_IF,CR1_VX,__L23c + ai r4,r0,-1 + st r4,0(r6) + l r3,T.64.value(RTOC) + ai SP,SP,64 + l r4,T.48.last_token(RTOC) + b __L248 +__L344: # 0x00000344 (H.10.NO_SYMBOL+0x344) + cmpi 0,r4,0 + ai r3,r5,1 + ai r5,r5,2 + st r5,0(r6) + bc BO_IF,CR0_EQ,__L39c + cmpi 6,r4,48 + cmpi 0,r4,55 + ai r8,r4,-48 + rlinm r7,r0,3,0,28 +__L368: # 0x00000368 (H.10.NO_SYMBOL+0x368) + bc BO_IF,CR6_LT,__L39c + bc BO_IF,CR0_GT,__L39c + lbzu r4,1(r3) + ai r5,r5,1 + cmpi 1,r4,0 + a r0,r8,r7 + st r5,0(r6) + ai r8,r4,-48 + bc BO_IF,CR1_VX,__L39c + cmpi 6,r4,48 + cmpi 0,r4,55 + rlinm r7,r0,3,0,28 + b __L368 +__L39c: # 0x0000039c (H.10.NO_SYMBOL+0x39c) + cmpi 0,r4,0 + bc BO_IF,CR0_EQ,__L3ac + ai r4,r5,-1 + st r4,0(r6) +__L3ac: # 0x000003ac (H.10.NO_SYMBOL+0x3ac) + l r3,T.64.value(RTOC) + ai SP,SP,64 + l r4,T.48.last_token(RTOC) + st r0,0(r3) + cal r3,48(r0) + st r3,0(r4) + bcr BO_ALWAYS,CR0_LT +__L3c8: # 0x000003c8 (H.10.NO_SYMBOL+0x3c8) + cmpi 1,r3,122 + cal r4,0(r0) + bc BO_IF_NOT,CR6_EQ,__L490 + lbz r0,1(r5) + ai r3,r5,2 + cmpi 0,r0,0 + st r3,0(r6) + bc BO_IF,CR0_EQ,__L464 + cmpi 1,r0,39 + cmpi 6,r0,127 + cmpi 0,r0,128 + rlinm r5,r4,8,0,23 +__L3f8: # 0x000003f8 (H.10.NO_SYMBOL+0x3f8) + cror CR1_VX,CR1_VX,CR6_GT + rlinm r7,r4,16,0,15 + bc BO_IF,CR1_VX,__L418 + a r4,r0,r5 + lbz r0,0(r3) + ai r3,r3,1 + cmpi 0,r0,0 + b __L448 +__L418: # 0x00000418 (H.10.NO_SYMBOL+0x418) + rlinm r5,r0,8,0,23 + a r7,r7,r5 + bc BO_IF,CR0_LT,__L464 + lbz r5,0(r3) + cmpi 1,r5,0 + bc BO_IF,CR1_VX,__L464 + ai r3,r3,1 + a r4,r5,r7 + st r3,0(r6) + lbz r0,0(r3) + ai r3,r3,1 + cmpi 0,r0,0 +__L448: # 0x00000448 (H.10.NO_SYMBOL+0x448) + cmpi 1,r0,39 + cmpi 6,r0,127 + st r3,0(r6) + bc BO_IF,CR0_EQ,__L464 + cmpi 0,r0,128 + rlinm r5,r4,8,0,23 + b __L3f8 +__L464: # 0x00000464 (H.10.NO_SYMBOL+0x464) + cmpi 0,r0,0 + bc BO_IF,CR0_EQ,__L474 + ai r3,r3,-1 + st r3,0(r6) +__L474: # 0x00000474 (H.10.NO_SYMBOL+0x474) + l r3,T.64.value(RTOC) + ai SP,SP,64 + l r5,T.48.last_token(RTOC) + st r4,0(r3) + cal r3,48(r0) + st r3,0(r5) + bcr BO_ALWAYS,CR0_LT +__L490: # 0x00000490 (H.10.NO_SYMBOL+0x490) + cmpi 6,r3,65 + cmpi 7,r3,90 + bc BO_IF,CR0_LT,__L4a0 + bc BO_IF_NOT,CR1_FEX,__L4b0 +__L4a0: # 0x000004a0 (H.10.NO_SYMBOL+0x4a0) + cmpi 1,r3,61 + cmpi 0,r3,33 + cror CR6_EQ,CR6_LT,CR7_GT + bc BO_IF,CR6_EQ,__L4dc +__L4b0: # 0x000004b0 (H.10.NO_SYMBOL+0x4b0) + bc BO_IF_NOT,CR7_GT,__L4bc + ai r5,r3,-71 + b __L4c0 +__L4bc: # 0x000004bc (H.10.NO_SYMBOL+0x4bc) + ai r5,r3,-65 +__L4c0: # 0x000004c0 (H.10.NO_SYMBOL+0x4c0) + l r3,T.64.value(RTOC) + ai SP,SP,64 + l r4,T.48.last_token(RTOC) + st r5,0(r3) + cal r3,118(r0) + st r3,0(r4) + bcr BO_ALWAYS,CR0_LT +__L4dc: # 0x000004dc (H.10.NO_SYMBOL+0x4dc) + cmpi 6,r3,60 + bc BO_IF_NOT,CR1_VX,__L50c + lbz r0,1(r5) + ai r4,r5,2 + cmpli 1,r0,0x003d + bc BO_IF_NOT,CR1_VX,__L50c + st r4,0(r6) + ai SP,SP,64 + l r4,T.48.last_token(RTOC) + cal r3,317(r0) + st r3,0(r4) + bcr BO_ALWAYS,CR0_LT +__L50c: # 0x0000050c (H.10.NO_SYMBOL+0x50c) + cmpi 1,r3,62 + bc BO_IF_NOT,CR0_EQ,__L53c + lbz r4,1(r5) + ai r0,r5,2 + cmpli 0,r4,0x003d + bc BO_IF_NOT,CR0_EQ,__L53c + ai SP,SP,64 + l r4,T.48.last_token(RTOC) + cal r3,289(r0) + st r0,0(r6) + st r3,0(r4) + bcr BO_ALWAYS,CR0_LT +__L53c: # 0x0000053c (H.10.NO_SYMBOL+0x53c) + bc BO_IF_NOT,CR6_EQ,__L568 + lbz r0,1(r5) + ai r4,r5,2 + cmpli 0,r0,0x003c + bc BO_IF_NOT,CR0_EQ,__L568 + st r4,0(r6) + ai SP,SP,64 + l r4,T.48.last_token(RTOC) + cal r3,316(r0) + st r3,0(r4) + bcr BO_ALWAYS,CR0_LT +__L568: # 0x00000568 (H.10.NO_SYMBOL+0x568) + bc BO_IF_NOT,CR1_VX,__L594 + lbz r4,1(r5) + ai r5,r5,2 + cmpli 0,r4,0x003e + bc BO_IF_NOT,CR0_EQ,__L594 + ai SP,SP,64 + l r4,T.48.last_token(RTOC) + cal r3,318(r0) + st r5,0(r6) + st r3,0(r4) + bcr BO_ALWAYS,CR0_LT +__L594: # 0x00000594 (H.10.NO_SYMBOL+0x594) + l r4,T.48.last_token(RTOC) + ai SP,SP,64 + st r3,0(r4) + bcr BO_ALWAYS,CR0_LT +# traceback table + .long 0x00000000 + .byte 0x00 # VERSION=0 + .byte 0x00 # LANG=TB_C + .byte 0x20 # IS_GL=0,IS_EPROL=0,HAS_TBOFF=1 + # INT_PROC=0,HAS_CTL=0,TOCLESS=0 + # FP_PRESENT=0,LOG_ABORT=0 + .byte 0x41 # INT_HNDL=0,NAME_PRESENT=1 + # USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND + # SAVES_CR=0,SAVES_LR=1 + .byte 0x80 # STORES_BC=1,FPR_SAVED=0 + .byte 0x00 # GPR_SAVED=0 + .byte 0x00 # FIXEDPARMS=0 + .byte 0x00 # FLOATPARMS=0,PARMSONSTK=0 + .long 0x000004cc # TB_OFFSET + .short 5 # NAME_LEN + .byte "token" + .byte 0 # padding +# End of traceback table +.expr: # 0x000005bc (H.10.NO_SYMBOL+0x5bc) + mfspr r0,LR + stm r27,-20(SP) + mfcr r12 + st r0,8(SP) + l r0,T.32._calc_c_(RTOC) + st r12,4(SP) + stu SP,-96(SP) + l r30,T.72.lvalue(RTOC) + ai r31,r0,64 + l r29,T.48.last_token(RTOC) + bl .aexpr +__L5e8: # 0x000005e8 (H.10.NO_SYMBOL+0x5e8) + l r0,0(r29) + cal r28,0(r3) + cmpi 0,r0,-1 + l r27,0(r30) + bc BO_IF,CR0_EQ,__L7a4 + cmpi 0,r0,289 + cmpi 7,r0,63 + cmpi 1,r0,60 + cmpi 4,r0,41 +__L60c: # 0x0000060c (H.10.NO_SYMBOL+0x60c) + bc BO_IF,CR7_EQ,__L730 + cmpi 3,r0,317 + cmpi 6,r0,61 + cmpi 5,r0,316 + bc BO_IF,CR7_GT,__L6d4 + bc BO_IF,CR1_VX,__L6b4 + cmpi 0,r0,62 + cmpi 7,r0,58 + bc BO_IF,CR1_FEX,__L648 + bc BO_IF,CR4_EQ,__L638 + bc BO_IF_NOT,CR7_EQ,__L778 +__L638: # 0x00000638 (H.10.NO_SYMBOL+0x638) + cal r3,0(r28) + l r0,104(SP) + l r12,100(SP) + b __L7b8 +__L648: # 0x00000648 (H.10.NO_SYMBOL+0x648) + bc BO_IF,CR6_EQ,__L674 + bc BO_IF_NOT,CR0_EQ,__L778 + bl .aexpr + cmp 0,r28,r3 + cal r28,1(r0) + bc BO_IF,CR0_GT,__L784 + cal r28,0(r0) + l r0,0(r29) + cmpi 0,r0,-1 +__L66c: # 0x0000066c (H.10.NO_SYMBOL+0x66c) + bc BO_IF,CR0_EQ,__L7a4 + b __L790 +__L674: # 0x00000674 (H.10.NO_SYMBOL+0x674) + cmpi 0,r27,0 + bc BO_IF,CR0_LT,__L6a0 + bl .expr + l r9,T.76.variable(RTOC) + rlinm r10,r27,2,0,29 + stx r3,r9,r10 + l r0,104(SP) + l r12,100(SP) + ai SP,SP,96 + mtcrf 24,r12 + b __L7c0 +__L6a0: # 0x000006a0 (H.10.NO_SYMBOL+0x6a0) + l r0,T.32._calc_c_(RTOC) + ai r3,r0,48 + bl .error + cal r3,0(r0) + b __L7b0 +__L6b4: # 0x000006b4 (H.10.NO_SYMBOL+0x6b4) + bl .aexpr + cmp 0,r28,r3 + cal r28,1(r0) + bc BO_IF,CR0_LT,__L784 + cal r28,0(r0) + l r0,0(r29) + cmpi 0,r0,-1 + b __L66c +__L6d4: # 0x000006d4 (H.10.NO_SYMBOL+0x6d4) + cmpi 1,r0,318 + bc BO_IF,CR0_EQ,__L718 + bc BO_IF,CR5_EQ,__L70c + bc BO_IF,CR3_EQ,__L6f8 + bc BO_IF_NOT,CR1_VX,__L778 + bl .aexpr + sra r28,r28,r3 + l r0,0(r29) + b __L788 +__L6f8: # 0x000006f8 (H.10.NO_SYMBOL+0x6f8) + bl .aexpr + sf r0,r3,r28 + cntlz r0,r0 + rlinm r28,r0,27,5,31 + b __L784 +__L70c: # 0x0000070c (H.10.NO_SYMBOL+0x70c) + bl .aexpr + sl r28,r28,r3 + b __L784 +__L718: # 0x00000718 (H.10.NO_SYMBOL+0x718) + bl .aexpr + sf r0,r3,r28 + cntlz r0,r0 + ai r0,r0,-32 + rlinm r28,r0,1,31,31 + b __L784 +__L730: # 0x00000730 (H.10.NO_SYMBOL+0x730) + bl .expr + l r0,0(r29) + cmpi 0,r28,0 + cmpi 1,r0,58 + st r3,56(SP) + bc BO_IF,CR1_VX,__L760 + l r0,T.32._calc_c_(RTOC) + ai r3,r0,12 + bl .error + l r3,56(SP) + l r0,104(SP) + b __L7b4 +__L760: # 0x00000760 (H.10.NO_SYMBOL+0x760) + bc BO_IF_NOT,CR0_EQ,__L76c + bl .aexpr + b __L5e8 +__L76c: # 0x0000076c (H.10.NO_SYMBOL+0x76c) + bl .expr + l r3,56(SP) + b __L7b0 +__L778: # 0x00000778 (H.10.NO_SYMBOL+0x778) + cal r3,0(r31) + bl .error + bl .token +__L784: # 0x00000784 (H.10.NO_SYMBOL+0x784) + l r0,0(r29) +__L788: # 0x00000788 (H.10.NO_SYMBOL+0x788) + cmpi 0,r0,-1 + bc BO_IF,CR0_EQ,__L7a4 +__L790: # 0x00000790 (H.10.NO_SYMBOL+0x790) + cmpi 0,r0,289 + cmpi 7,r0,63 + cmpi 1,r0,60 + cmpi 4,r0,41 + b __L60c +__L7a4: # 0x000007a4 (H.10.NO_SYMBOL+0x7a4) + cal r0,-1(r0) + cal r3,0(r28) + st r0,0(r29) +__L7b0: # 0x000007b0 (H.10.NO_SYMBOL+0x7b0) + l r0,104(SP) +__L7b4: # 0x000007b4 (H.10.NO_SYMBOL+0x7b4) + l r12,100(SP) +__L7b8: # 0x000007b8 (H.10.NO_SYMBOL+0x7b8) + ai SP,SP,96 + mtcrf 24,r12 +__L7c0: # 0x000007c0 (H.10.NO_SYMBOL+0x7c0) + mtspr LR,r0 + lm r27,-20(SP) + bcr BO_ALWAYS,CR0_LT +# traceback table + .long 0x00000000 + .byte 0x00 # VERSION=0 + .byte 0x00 # LANG=TB_C + .byte 0x20 # IS_GL=0,IS_EPROL=0,HAS_TBOFF=1 + # INT_PROC=0,HAS_CTL=0,TOCLESS=0 + # FP_PRESENT=0,LOG_ABORT=0 + .byte 0x43 # INT_HNDL=0,NAME_PRESENT=1 + # USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND + # SAVES_CR=1,SAVES_LR=1 + .byte 0x80 # STORES_BC=1,FPR_SAVED=0 + .byte 0x05 # GPR_SAVED=5 + .byte 0x00 # FIXEDPARMS=0 + .byte 0x00 # FLOATPARMS=0,PARMSONSTK=0 + .long 0x00000210 # TB_OFFSET + .short 4 # NAME_LEN + .byte "expr" + .byte 0 # padding + .byte 0 # padding +# End of traceback table +.aexpr: # 0x000007e4 (H.10.NO_SYMBOL+0x7e4) + mfspr r0,LR + stm r30,-8(SP) + st r0,8(SP) + stu SP,-80(SP) + bl .mexpr + l r31,T.48.last_token(RTOC) + cal r30,0(r3) + l r0,0(r31) + cmpi 0,r0,-1 + bc BO_IF,CR0_EQ,__L86c + cmpi 5,r0,45 + cmpi 6,r0,38 + cmpi 0,r0,94 +__L818: # 0x00000818 (H.10.NO_SYMBOL+0x818) + bc BO_IF,CR5_EQ,__L890 + cmpi 1,r0,124 + cmpi 7,r0,43 + bc BO_IF,CR5_GT,__L850 + bc BO_IF,CR6_EQ,__L844 + bc BO_IF_NOT,CR7_EQ,__L86c + bl .mexpr + a r30,r30,r3 + l r0,0(r31) + cmpi 0,r0,-1 + b __L8a0 +__L844: # 0x00000844 (H.10.NO_SYMBOL+0x844) + bl .mexpr + and r30,r30,r3 + b __L898 +__L850: # 0x00000850 (H.10.NO_SYMBOL+0x850) + bc BO_IF,CR0_EQ,__L884 + bc BO_IF_NOT,CR1_VX,__L86c + bl .mexpr + or r30,r30,r3 + l r0,0(r31) + cmpi 0,r0,-1 + bc BO_IF_NOT,CR0_EQ,__L8a4 +__L86c: # 0x0000086c (H.10.NO_SYMBOL+0x86c) + cal r3,0(r30) + l r12,88(SP) + ai SP,SP,80 + mtspr LR,r12 + lm r30,-8(SP) + bcr BO_ALWAYS,CR0_LT +__L884: # 0x00000884 (H.10.NO_SYMBOL+0x884) + bl .mexpr + xor r30,r3,r30 + b __L898 +__L890: # 0x00000890 (H.10.NO_SYMBOL+0x890) + bl .mexpr + sf r30,r3,r30 +__L898: # 0x00000898 (H.10.NO_SYMBOL+0x898) + l r0,0(r31) + cmpi 0,r0,-1 +__L8a0: # 0x000008a0 (H.10.NO_SYMBOL+0x8a0) + bc BO_IF,CR0_EQ,__L86c +__L8a4: # 0x000008a4 (H.10.NO_SYMBOL+0x8a4) + cmpi 5,r0,45 + cmpi 6,r0,38 + cmpi 0,r0,94 + b __L818 +# traceback table + .long 0x00000000 + .byte 0x00 # VERSION=0 + .byte 0x00 # LANG=TB_C + .byte 0x20 # IS_GL=0,IS_EPROL=0,HAS_TBOFF=1 + # INT_PROC=0,HAS_CTL=0,TOCLESS=0 + # FP_PRESENT=0,LOG_ABORT=0 + .byte 0x41 # INT_HNDL=0,NAME_PRESENT=1 + # USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND + # SAVES_CR=0,SAVES_LR=1 + .byte 0x80 # STORES_BC=1,FPR_SAVED=0 + .byte 0x02 # GPR_SAVED=2 + .byte 0x00 # FIXEDPARMS=0 + .byte 0x00 # FLOATPARMS=0,PARMSONSTK=0 + .long 0x000000d0 # TB_OFFSET + .short 5 # NAME_LEN + .byte "aexpr" + .byte 0 # padding +# End of traceback table +.mexpr: # 0x000008cc (H.10.NO_SYMBOL+0x8cc) + mfspr r0,LR + stm r30,-8(SP) + st r0,8(SP) + stu SP,-80(SP) + bl .term + l r31,T.48.last_token(RTOC) + cal r30,0(r3) + l r0,0(r31) + cmpi 0,r0,-1 + bc BO_IF,CR0_EQ,__L940 + cmpi 7,r0,37 + cmpi 1,r0,94 + cmpi 0,r0,42 + cmpi 6,r0,47 + bc BO_IF,CR7_EQ,__L970 +__L908: # 0x00000908 (H.10.NO_SYMBOL+0x908) + bc BO_IF,CR0_EQ,__L964 + bc BO_IF,CR6_EQ,__L958 + bc BO_IF_NOT,CR1_VX,__L940 + bl .mexpr + xor r30,r30,r3 +__L91c: # 0x0000091c (H.10.NO_SYMBOL+0x91c) + l r0,0(r31) + cmpi 0,r0,-1 + bc BO_IF,CR0_EQ,__L940 + cmpi 7,r0,37 + cmpi 1,r0,94 + cmpi 0,r0,42 + cmpi 6,r0,47 + bc BO_IF,CR7_EQ,__L970 + b __L908 +__L940: # 0x00000940 (H.10.NO_SYMBOL+0x940) + cal r3,0(r30) + l r12,88(SP) + ai SP,SP,80 + mtspr LR,r12 + lm r30,-8(SP) + bcr BO_ALWAYS,CR0_LT +__L958: # 0x00000958 (H.10.NO_SYMBOL+0x958) + bl .mexpr + divs r30,r30,r3 + b __L91c +__L964: # 0x00000964 (H.10.NO_SYMBOL+0x964) + bl .mexpr + muls r30,r3,r30 + b __L91c +__L970: # 0x00000970 (H.10.NO_SYMBOL+0x970) + bl .mexpr + divs r0,r30,r3 + mfspr r30,MQ + b __L91c +# traceback table + .long 0x00000000 + .byte 0x00 # VERSION=0 + .byte 0x00 # LANG=TB_C + .byte 0x20 # IS_GL=0,IS_EPROL=0,HAS_TBOFF=1 + # INT_PROC=0,HAS_CTL=0,TOCLESS=0 + # FP_PRESENT=0,LOG_ABORT=0 + .byte 0x41 # INT_HNDL=0,NAME_PRESENT=1 + # USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND + # SAVES_CR=0,SAVES_LR=1 + .byte 0x80 # STORES_BC=1,FPR_SAVED=0 + .byte 0x02 # GPR_SAVED=2 + .byte 0x00 # FIXEDPARMS=0 + .byte 0x00 # FLOATPARMS=0,PARMSONSTK=0 + .long 0x000000b4 # TB_OFFSET + .short 5 # NAME_LEN + .byte "mexpr" + .byte 0 # padding +# End of traceback table +.term: # 0x00000998 (H.10.NO_SYMBOL+0x998) + mfspr r0,LR + stm r30,-8(SP) + l r31,T.72.lvalue(RTOC) + st r0,8(SP) + cal r0,-1(r0) + stu SP,-80(SP) + st r0,0(r31) + bl .token + l r30,T.48.last_token(RTOC) + l r3,T.32._calc_c_(RTOC) + l r0,0(r30) + ai r3,r3,80 + cmpi 0,r0,-1 + bc BO_IF_NOT,CR0_EQ,__L9d8 + bl .error + l r0,0(r30) +__L9d8: # 0x000009d8 (H.10.NO_SYMBOL+0x9d8) + cmpi 6,r0,45 + cmpi 0,r0,33 + cmpi 1,r0,48 + bc BO_IF,CR6_EQ,__La40 + cmpi 5,r0,118 + cmpi 7,r0,40 + bc BO_IF,CR6_GT,__La04 + bc BO_IF,CR0_EQ,__La4c + bc BO_IF,CR7_EQ,__La5c + bl .token + b __La84 +__La04: # 0x00000a04 (H.10.NO_SYMBOL+0xa04) + l r3,T.64.value(RTOC) + l r9,0(r3) + bc BO_IF,CR1_VX,__La1c + bc BO_IF,CR5_EQ,__La28 + bl .token + b __La84 +__La1c: # 0x00000a1c (H.10.NO_SYMBOL+0xa1c) + bl .token + cal r3,0(r9) + b __La94 +__La28: # 0x00000a28 (H.10.NO_SYMBOL+0xa28) + st r9,0(r31) + bl .token + l r3,T.76.variable(RTOC) + rlinm r4,r9,2,0,29 + lx r3,r3,r4 + b __La94 +__La40: # 0x00000a40 (H.10.NO_SYMBOL+0xa40) + bl .term + neg r3,r3 + b __La94 +__La4c: # 0x00000a4c (H.10.NO_SYMBOL+0xa4c) + bl .term + cntlz r0,r3 + rlinm r3,r0,27,5,31 + b __La94 +__La5c: # 0x00000a5c (H.10.NO_SYMBOL+0xa5c) + bl .expr + l r0,0(r30) + st r3,56(SP) + cmpi 0,r0,41 + l r0,T.32._calc_c_(RTOC) + ai r3,r0,96 + bcl BO_IF_NOT,CR0_EQ,.error + bl .token + l r3,56(SP) + b __La94 +__La84: # 0x00000a84 (H.10.NO_SYMBOL+0xa84) + l r0,T.32._calc_c_(RTOC) + ai r3,r0,120 + bl .error + cal r3,0(r0) +__La94: # 0x00000a94 (H.10.NO_SYMBOL+0xa94) + l r12,88(SP) + ai SP,SP,80 + mtspr LR,r12 + lm r30,-8(SP) + bcr BO_ALWAYS,CR0_LT +# traceback table + .long 0x00000000 + .byte 0x00 # VERSION=0 + .byte 0x00 # LANG=TB_C + .byte 0x20 # IS_GL=0,IS_EPROL=0,HAS_TBOFF=1 + # INT_PROC=0,HAS_CTL=0,TOCLESS=0 + # FP_PRESENT=0,LOG_ABORT=0 + .byte 0x41 # INT_HNDL=0,NAME_PRESENT=1 + # USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND + # SAVES_CR=0,SAVES_LR=1 + .byte 0x80 # STORES_BC=1,FPR_SAVED=0 + .byte 0x02 # GPR_SAVED=2 + .byte 0x00 # FIXEDPARMS=0 + .byte 0x00 # FLOATPARMS=0,PARMSONSTK=0 + .long 0x00000110 # TB_OFFSET + .short 4 # NAME_LEN + .byte "term" + .byte 0 # padding + .byte 0 # padding +# End of traceback table +.main: # 0x00000ac0 (H.10.NO_SYMBOL+0xac0) + mfspr r0,LR + stm r27,-20(SP) + l r30,T.56._iob(RTOC) + st r0,8(SP) + stu SP,-4192(SP) + ai r31,SP,56 + cal r5,0(r30) + cal r3,0(r31) + cal r4,4096(r0) + bl .fgets{PR} + cror CR3_SO,CR3_SO,CR3_SO + cmpi 0,r3,0 + l r0,T.32._calc_c_(RTOC) + l r27,T.40.ptr(RTOC) + ai r28,r0,136 + bc BO_IF,CR0_EQ,__Lb58 + ai r29,r30,32 + st r31,0(r27) + bl .expr +__Lb0c: # 0x00000b0c (H.10.NO_SYMBOL+0xb0c) + cal r6,0(r3) + cal r5,0(r3) + cal r3,0(r28) + ai r4,SP,56 + bl .printf{PR} + cror CR3_SO,CR3_SO,CR3_SO + cal r3,0(r29) + bl .fflush{PR} + cror CR3_SO,CR3_SO,CR3_SO + ai r3,SP,56 + cal r4,4096(r0) + cal r5,0(r30) + bl .fgets{PR} + cror CR3_SO,CR3_SO,CR3_SO + cmpi 0,r3,0 + bc BO_IF,CR0_EQ,__Lb58 + st r31,0(r27) + bl .expr + b __Lb0c +__Lb58: # 0x00000b58 (H.10.NO_SYMBOL+0xb58) + cal r3,0(r0) + l r12,4200(SP) + ai SP,SP,4192 + mtspr LR,r12 + lm r27,-20(SP) + bcr BO_ALWAYS,CR0_LT +# traceback table + .long 0x00000000 + .byte 0x00 # VERSION=0 + .byte 0x00 # LANG=TB_C + .byte 0x20 # IS_GL=0,IS_EPROL=0,HAS_TBOFF=1 + # INT_PROC=0,HAS_CTL=0,TOCLESS=0 + # FP_PRESENT=0,LOG_ABORT=0 + .byte 0x41 # INT_HNDL=0,NAME_PRESENT=1 + # USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND + # SAVES_CR=0,SAVES_LR=1 + .byte 0x80 # STORES_BC=1,FPR_SAVED=0 + .byte 0x05 # GPR_SAVED=5 + .byte 0x00 # FIXEDPARMS=0 + .byte 0x00 # FLOATPARMS=0,PARMSONSTK=0 + .long 0x000000b0 # TB_OFFSET + .short 4 # NAME_LEN + .byte "main" + .byte 0 # padding + .byte 0 # padding +# End of traceback table +# End csect H.10.NO_SYMBOL{PR} + +# .data section + + + .toc # 0x00000b88 +T.36.line_skip: + .tc H.36.line_skip{TC},line_skip{DS} +T.40.ptr: + .tc H.40.ptr{TC},ptr +T.44.last_ptr: + .tc H.44.last_ptr{TC},last_ptr +T.48.last_token: + .tc H.48.last_token{TC},last_token +T.52.error: + .tc H.52.error{TC},error{DS} +T.56._iob: + .tc H.56._iob{TC},_iob{UA} +T.32._calc_c_: + .tc H.32._calc_c_{TC},E.30._calc_c_{RW} +T.60.token: + .tc H.60.token{TC},token{DS} +T.64.value: + .tc H.64.value{TC},value +T.68.expr: + .tc H.68.expr{TC},expr{DS} +T.72.lvalue: + .tc H.72.lvalue{TC},lvalue +T.76.variable: + .tc H.76.variable{TC},variable +T.80.aexpr: + .tc H.80.aexpr{TC},aexpr{DS} +T.84.mexpr: + .tc H.84.mexpr{TC},mexpr{DS} +T.88.term: + .tc H.88.term{TC},term{DS} +T.92.main: + .tc H.92.main{TC},main{DS} + + + .csect line_skip{DS} + .long .line_skip # "\0\0\0\0" + .long TOC{TC0} # "\0\0\v\210" + .long 0x00000000 # "\0\0\0\0" +# End csect line_skip{DS} + + + .csect error{DS} + .long .error # "\0\0\0|" + .long TOC{TC0} # "\0\0\v\210" + .long 0x00000000 # "\0\0\0\0" +# End csect error{DS} + + + .csect token{DS} + .long .token # "\0\0\0\330" + .long TOC{TC0} # "\0\0\v\210" + .long 0x00000000 # "\0\0\0\0" +# End csect token{DS} + + + .csect expr{DS} + .long .expr # "\0\0\005\274" + .long TOC{TC0} # "\0\0\v\210" + .long 0x00000000 # "\0\0\0\0" +# End csect expr{DS} + + + .csect aexpr{DS} + .long .aexpr # "\0\0\a\344" + .long TOC{TC0} # "\0\0\v\210" + .long 0x00000000 # "\0\0\0\0" +# End csect aexpr{DS} + + + .csect mexpr{DS} + .long .mexpr # "\0\0\b\314" + .long TOC{TC0} # "\0\0\v\210" + .long 0x00000000 # "\0\0\0\0" +# End csect mexpr{DS} + + + .csect term{DS} + .long .term # "\0\0\t\230" + .long TOC{TC0} # "\0\0\v\210" + .long 0x00000000 # "\0\0\0\0" +# End csect term{DS} + + + .csect main{DS} + .long .main # "\0\0\n\300" + .long TOC{TC0} # "\0\0\v\210" + .long 0x00000000 # "\0\0\0\0" +# End csect main{DS} + + + .csect E.30._calc_c_{RW}, 3 + .long 0x2573206f # "%s o" + .long 0x6e202573 # "n %s" + .long 0x0a000000 # "\n\0\0\0" + .long 0x3f206578 # "? ex" + .long 0x70726573 # "pres" + .long 0x73696f6e # "sion" + .long 0x206e6f74 # " not" + .long 0x20746572 # " ter" + .long 0x6d696e61 # "mina" + .long 0x74656420 # "ted " + .long 0x77697468 # "with" + .long 0x203a0000 # " :\0\0" + .long 0x42616420 # "Bad " + .long 0x61737369 # "assi" + .long 0x676e6d65 # "gnme" + .long 0x6e740000 # "nt\0\0" + .long 0x42616420 # "Bad " + .long 0x65787072 # "expr" + .long 0x65737369 # "essi" + .long 0x6f6e0000 # "on\0\0" + .long 0x5465726d # "Term" + .long 0x20657870 # " exp" + .long 0x65637465 # "ecte" + .long 0x64000000 # "d\0\0\0" + .long 0x556e6261 # "Unba" + .long 0x6c616e63 # "lanc" + .long 0x65642070 # "ed p" + .long 0x6172656e # "aren" + .long 0x74687369 # "thsi" + .long 0x73000000 # "s\0\0\0" + .long 0x556e6b6e # "Unkn" + .long 0x6f776e20 # "own " + .long 0x7465726d # "term" + .long 0x00000000 # "\0\0\0\0" + .long 0x2573203d # "%s =" + .long 0x20307825 # " 0x%" + .long 0x30387820 # "08x " + .long 0x3d202564 # "= %d" +# End csect E.30._calc_c_{RW} + .long 0x0a000000 # "\n\0\0\0" + + + +# .bss section + .comm ptr, 4 # 0x00000cc4 + .comm last_ptr, 4 # 0x00000cc8 + .comm last_token, 4 # 0x00000ccc + .comm value, 4 # 0x00000cd0 + .comm lvalue, 4 # 0x00000cd4 + .comm variable, 192, 3 # 0x00000cd8 diff -r 000000000000 -r 6bf66c125dbc compile-m68k.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/compile-m68k.c Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,576 @@ +/* + Simple Compiler + $Id$ + */ + +#include + +char *ptr,*last_ptr,*before; +int value,lvalue; +int last_token; +int label; + +const int T_EQUAL = (0x100|'='); +const int T_NEQUAL = (0x100|'!'); +const int T_LSHIFT = (0x100|'<'); +const int T_RSHIFT = (0x100|'>'); + +enum opcode { + O_SUB = 1; + O_ADD = 2; + O_MUL = 3; + O_DIV = 4; + O_AND = 5; + O_OR = 6; + O_XOR = 7; + O_ASL = 8; + O_ASR = 9; + O_MOD = 10; + O_LT = 11; + O_GT = 12; + O_EQ = 13; + O_NE = 14; +}; + +static void error(char *); +static void expr(); +static void aexpr(); +static void mexpr(); +static void term(); +static int token(); + +static void emit_push(); +static void emit_compare() ; +static void emit_store(int); +static void emit_push(); +static void emit_calc(enum opcode); +static void emit_value(int) ; +static void emit_load(int); +static void emit_comment(); +static void emit_neg(); +static void emit_not(); +static void emit_label(int); +static void emit_jump(int); +static void emit_cond(int); + + +static void +line_skip() +{ + while(*ptr++); + ptr--; + last_ptr = ptr; + last_token = EOF; +} + +static void +error(description) +char *description; +{ + fprintf(stderr,"%s on %s\n",description,last_ptr); + line_skip(); +} + +static int +token() +{ + int c,d; + + last_ptr = ptr; /* for error position */ + c= *ptr; + while(c<=' ' && c) { + c = *++ptr; + } + if(!c) { + last_token = EOF; + return last_token; + } + ptr++; + if ('/'==c && ('/'== *ptr || '*'== *ptr)) { /* comment */ + line_skip(); + return EOF; + } + if('1'<=c && c<='9') { /* Decimal */ + d = c-'0'; + while(c= *ptr++) { + if('0'<=c && c<='9') { + d = d*10 + (c - '0'); + } else { + break; + } + } + c && ptr--; + value = d; + last_token = '0'; + return last_token; + } else if ('0'==c && 'x'== *ptr) { /* Hex */ + ptr++; + d = 0; + while(c= *ptr++) { + if('0'<=c && c<='9') { + d = d*16 + (c - '0'); + } else if('a'<=c && c<='f') { + d = d*16 + (c - 'a' + 10); + } else if('A'<=c && c<='F') { + d = d*16 + (c - 'a' + 10); + } else { + break; + } + } + c && ptr--; + value = d; + last_token = '0'; + return last_token; + } else if ('0'==c) { /* Octal */ + d = c-'0'; + while(c= *ptr++) { + if('0'<=c && c<='7') { + d = d*8 + (c - '0'); + } else { + break; + } + } + c && ptr--; + value = d; + last_token = '0'; + return last_token; + } else if ('\''==c) { /* Ascii */ + d = 0; + while(c= *ptr++) { + if('\''!=c && c<=0x7f) { + d = d*256 + c; + } else if(c>=0x80 && *ptr) { + d = d*256*256 + c*256 + *ptr++; + } else { + break; + } + } + if(c!='\''|| c==0) { ptr--; } + value = d; + last_token = '0'; + return last_token; + } else if (('a'<=c && c<='z') || /* variable */ + ('A'<=c && c<='Z')) { + value = ((c>'Z')?c-'a'+'Z'-'A'+1:c-'A'); + last_token = 'v'; + return last_token; + } else if ('='==c && '='== *ptr) { /* equal */ + ptr++; + last_token = T_EQUAL; + return last_token; + } else if ('!'==c && '='== *ptr) { /* equal */ + ptr++; + last_token = T_NEQUAL; + } else if ('<'==c && '<'== *ptr) { /* shift */ + ptr++; + last_token = T_LSHIFT; + return last_token; + } else if ('>'==c && '>'== *ptr) { /* shift */ + ptr++; + last_token = T_RSHIFT; + return last_token; + } else { + last_token = c; + return last_token; + return c; + } +} + +static void +expr() +{ + int d,assign; + + emit_comment(); + aexpr(); + assign = lvalue; + while(last_token!=EOF) { + switch(last_token) { + case '<': + emit_push(); + aexpr(); + emit_compare(O_LT); + break; + case '>': + emit_push(); + aexpr(); + emit_compare(O_GT); + break; + case T_EQUAL: + emit_push(); + aexpr(); + emit_compare(O_EQ); + break; + case T_NEQUAL: + emit_push(); + aexpr(); + emit_compare(O_NE); + break; + case T_LSHIFT: + emit_push(); + aexpr(); + emit_calc(O_ASL); + break; + case T_RSHIFT: + emit_push(); + aexpr(); + emit_calc(O_ASR); + break; + case '?': + { + int l_false,l_end; + l_false = label++; + l_end = label++; + emit_cond(l_false); + expr(); + if(last_token != ':') { + error("? expression not terminated with :"); + return; + } + emit_jump(l_end); + emit_label(l_false); + expr(); + emit_label(l_end); + return; + } + break; + case '=': + if(assign>=0) { + expr(); + emit_store(assign); + return; + } else { + error("Bad assignment"); + return; + } + break; + case ':': + case ')': + return; + default: + error("Bad expression"); + token(); + } + } + last_token = EOF; + return; +} + +static void +aexpr() +{ + int d; + + emit_comment(); + mexpr(); + while(last_token!=EOF) { + switch(last_token) { + case '^': + emit_push(); + mexpr(); + emit_calc(O_XOR); + break; + case '|': + emit_push(); + mexpr(); + emit_calc(O_OR); + break; + case '&': + emit_push(); + mexpr(); + emit_calc(O_AND); + break; + case '-': + emit_push(); + mexpr(); + emit_calc(O_SUB); + break; + case '+': + emit_push(); + mexpr(); + emit_calc(O_ADD); + break; + default: + return; + } + } + return; +} + +static void +mexpr() +{ + int d; + + emit_comment(); + term(); + while(last_token!=EOF) { + switch(last_token) { + case '*': + emit_push(); + term(); + emit_calc(O_MUL); + break; + case '/': + emit_push(); + term(); + emit_calc(O_DIV); + break; + case '%': + emit_push(); + term(); + emit_calc(O_MOD); + break; + default: + return; + } + } + return; +} + +static void +term() +{ + int d; + + lvalue= -1; + emit_comment(); + + token(); + if(last_token==EOF) { + error("Term expected"); + } + switch(last_token) { + case '0': + d = value; + emit_value(d); + token(); + return; + case 'v': + d = lvalue = value; + emit_load(d); + token(); + return; + case '-': + term(); + emit_neg(); + return; + case '!': + term(); + emit_not(); + return; + case '(': + expr(); + if(last_token != ')') { + error("Unbalanced parenthsis"); + } + token(); + return; + default: + token(); + error("Unknown term"); + return; + } +} + +static +char *intro[] = { + "#APP\n", /* To process comments by GNU as */ + "\t.file \"output.s\"\n", + ".text\n", + "\t.align 1\n", + ".globl _main\n_main:\n", + "\tlink a6,#0\n", + NULL +}; + +static +char *ending[] = { + "\tunlk a6\n", + "\trts\n", + "_print:\n", + "\tlink a6,#0\n", + "\tmovel d0,sp@-\n", + "\tmovel d0,sp@-\n", + "\tpea _format\n", + "\tjbsr _printf\n", + "\taddqw #8,sp\n", + "\tunlk a6\n", + "\trts\n", + "_format:\n", + "\t.ascii \" = %08x %d\\12\\0\"\n", + "\t.align 2\n", + ".comm _variable,192\n", + NULL +}; + +static +char *opcode[] = { + "", + "subl", + "addl", + "mulsl", + "divsl", + "andl", + "orl", + "eorl", + "asll", + "asrl", + "idiv", + "slt", + "sgt", + "seq", + "sne", +}; + +static void +emit_push() +{ + printf("\tmovel d0,sp@-\n"); +} + +static void +emit_not() +{ + printf("\ttstl d0\n"); + printf("\tsne d0\n"); + printf("\textbl d0\n"); +} + +static void +emit_compare(op) +enum opcode op; +{ + printf("\tmovel sp@,d1\n"); + printf("\taddql #4,sp\n"); + printf("\tcmpl d1,d0\n"); + printf("\t%s d0\n",opcode[op]); + printf("\textbl d0\n"); + printf("\tnegl d0\n"); +} + +static void +emit_store(assign) +int assign; +{ + printf("\tmovel d0,_variable+%d\n",assign*4); +} + + +static void +emit_calc(op) +int op; +{ + if(op==O_DIV) { + printf("\tmovel d0,d1\n"); + printf("\tmovel sp@,d0\n"); + printf("\taddql #4,sp\n"); + printf("\tdivsl d1,d0\n"); + } else if(op==O_MOD) { + printf("\tmovel d0,d2\n"); + printf("\tmovel sp@,d0\n"); + printf("\taddql #4,sp\n"); + printf("\tdivsll d2,d0:d1\n"); + } else if(op==O_ADD||op==O_MUL||op==O_AND||op==O_OR||op==O_XOR) { + /* commutable operator */ + printf("\tmovel sp@,d1\n"); + printf("\taddql #4,sp\n"); + printf("\t%s d1,d0\n",opcode[op]); + } else { + printf("\tmovel d0,d1\n"); + printf("\tmovel sp@,d0\n"); + printf("\taddql #4,sp\n"); + printf("\t%s d1,d0\n",opcode[op]); + } +} + +static void +emit_neg() +{ + printf("\tnegl d0\n"); +} + +static void +emit_value(d) +int d; +{ + if(-127<=d && d<=127) { + printf("\tmoveq #%d,d0\n",d); + } else { + printf("\tmovel #%d,d0\n",d); + } +} + +static void +emit_load(d) +int d; +{ + printf("\tmovel _variable+%d,d0\n",d*4); +} + +static void +emit_cond(lbl) +{ + printf("\ttstl d0\n"); + printf("\tjeq L%d\n",lbl); +} + +static void +emit_jump(lbl) +{ + printf("\tjra L%d\n",lbl); +} + +static void +emit_label(lbl) +{ + printf("L%d:\n",lbl); +} + +static void +emit_comment() +{ + if (before < ptr) { + putchar('#'); putchar('#'); putchar(' '); + while (before < ptr) { + if(*before && *before!='\n') { + putchar(*before); + } + before++; + } + putchar('\n'); + } +} + +static void +emit_print() +{ + printf("\tjbsr _print\n"); +} + +int +main(int ac,char *av[]) +{ + int d; + char **iptr,buf[BUFSIZ]; + + for(iptr=intro;*iptr;iptr++) { + printf("%s",*iptr); + } + while (fgets(buf,BUFSIZ,stdin)) { + ptr = buf; + before = buf; + printf("##### %s",buf); + fflush(stdout); + expr(); + emit_print(); + emit_comment(); + } + for(iptr=ending;*iptr;iptr++) { + printf("%s",*iptr); + } + return 0; +} + + +/* end */ diff -r 000000000000 -r 6bf66c125dbc compile.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/compile.c Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,566 @@ +/* + Simple Compiler + $Id$ + */ + +#include + +char *ptr,*last_ptr,*before; +int value,lvalue; +int last_token; +int label; + +#define T_EQUAL (0x100|'=') +#define T_NEQUAL (0x100|'!') +#define T_LSHIFT (0x100|'<') +#define T_RSHIFT (0x100|'>') + +static void error(char *); +static void expr(); +static void aexpr(); +static void mexpr(); +static void term(); +static int token(); + +enum opcode { + O_SUB = 1, + O_ADD = 2, + O_MUL = 3, + O_DIV = 4, + O_AND = 5, + O_OR = 6, + O_XOR = 7, + O_ASL = 8, + O_ASR = 9, + O_MOD = 10, + O_LT = 11, + O_GT = 12, + O_EQ = 13, + O_NE = 14, +}; + +static void emit_push(); +static void emit_compare() ; +static void emit_store(int); +static void emit_push(); +static void emit_calc(enum opcode); +static void emit_value(int) ; +static void emit_load(int); +static void emit_comment(); +static void emit_neg(); +static void emit_not(); +static void emit_label(int); +static void emit_jump(int); +static void emit_cond(int); + + +static void +line_skip() +{ + while(*ptr++); + ptr--; + last_ptr = ptr; + last_token = EOF; +} + +static void +error(description) +char *description; +{ + fprintf(stderr,"%s on %s\n",description,last_ptr); + line_skip(); +} + +static int +token() +{ + int c,d; + + last_ptr = ptr; /* for error position */ + c= *ptr; + while(c<=' ' && c) { + c = *++ptr; + } + if(!c) { + last_token = EOF; + return last_token; + } + ptr++; + if ('/'==c && ('/'== *ptr || '*'== *ptr)) { /* comment */ + line_skip(); + return EOF; + } + if('1'<=c && c<='9') { /* Decimal */ + d = c-'0'; + while(c= *ptr++) { + if('0'<=c && c<='9') { + d = d*10 + (c - '0'); + } else { + break; + } + } + c && ptr--; + value = d; + last_token = '0'; + return last_token; + } else if ('0'==c && 'x'== *ptr) { /* Hex */ + ptr++; + d = 0; + while(c= *ptr++) { + if('0'<=c && c<='9') { + d = d*16 + (c - '0'); + } else if('a'<=c && c<='f') { + d = d*16 + (c - 'a' + 10); + } else if('A'<=c && c<='F') { + d = d*16 + (c - 'a' + 10); + } else { + break; + } + } + c && ptr--; + value = d; + last_token = '0'; + return last_token; + } else if ('0'==c) { /* Octal */ + d = c-'0'; + while(c= *ptr++) { + if('0'<=c && c<='7') { + d = d*8 + (c - '0'); + } else { + break; + } + } + c && ptr--; + value = d; + last_token = '0'; + return last_token; + } else if ('\''==c) { /* Ascii */ + d = 0; + while(c= *ptr++) { + if('\''!=c && c<=0x7f) { + d = d*256 + c; + } else if(c>=0x80 && *ptr) { + d = d*256*256 + c*256 + *ptr++; + } else { + break; + } + } + if(c!='\''|| c==0) { ptr--; } + value = d; + last_token = '0'; + return last_token; + } else if (('a'<=c && c<='z') || /* variable */ + ('A'<=c && c<='Z')) { + value = ((c>'Z')?c-'a'+'Z'-'A'+1:c-'A'); + last_token = 'v'; + return last_token; + } else if ('='==c && '='== *ptr) { /* equal */ + ptr++; + last_token = T_EQUAL; + return last_token; + } else if ('!'==c && '='== *ptr) { /* equal */ + ptr++; + last_token = T_NEQUAL; + } else if ('<'==c && '<'== *ptr) { /* shift */ + ptr++; + last_token = T_LSHIFT; + return last_token; + } else if ('>'==c && '>'== *ptr) { /* shift */ + ptr++; + last_token = T_RSHIFT; + return last_token; + } else { + last_token = c; + return last_token; + return c; + } +} + +static void +expr() +{ + int d,assign; + + emit_comment(); + aexpr(); + assign = lvalue; + while(last_token!=EOF) { + switch(last_token) { + case '<': + emit_push(); + aexpr(); + emit_compare(O_LT); + break; + case '>': + emit_push(); + aexpr(); + emit_compare(O_GT); + break; + case T_EQUAL: + emit_push(); + aexpr(); + emit_compare(O_EQ); + break; + case T_NEQUAL: + emit_push(); + aexpr(); + emit_compare(O_NE); + break; + case T_LSHIFT: + emit_push(); + aexpr(); + emit_calc(O_ASL); + break; + case T_RSHIFT: + emit_push(); + aexpr(); + emit_calc(O_ASR); + break; + case '?': + { + int l_false,l_end; + l_false = label++; + l_end = label++; + emit_cond(l_false); + expr(); + if(last_token != ':') { + error("? expression not terminated with :"); + return; + } + emit_jump(l_end); + emit_label(l_false); + expr(); + emit_label(l_end); + return; + } + break; + case '=': + if(assign>=0) { + expr(); + emit_store(assign); + return; + } else { + error("Bad assignment"); + return; + } + break; + case ':': + case ')': + return; + default: + error("Bad expression"); + token(); + } + } + last_token = EOF; + return; +} + +static void +aexpr() +{ + int d; + + emit_comment(); + mexpr(); + while(last_token!=EOF) { + switch(last_token) { + case '^': + emit_push(); + mexpr(); + emit_calc(O_XOR); + break; + case '|': + emit_push(); + mexpr(); + emit_calc(O_OR); + break; + case '&': + emit_push(); + mexpr(); + emit_calc(O_AND); + break; + case '-': + emit_push(); + mexpr(); + emit_calc(O_SUB); + break; + case '+': + emit_push(); + mexpr(); + emit_calc(O_ADD); + break; + default: + return; + } + } + return; +} + +static void +mexpr() +{ + int d; + + emit_comment(); + term(); + while(last_token!=EOF) { + switch(last_token) { + case '*': + emit_push(); + term(); + emit_calc(O_MUL); + break; + case '/': + emit_push(); + term(); + emit_calc(O_DIV); + break; + case '%': + emit_push(); + term(); + emit_calc(O_MOD); + break; + default: + return; + } + } + return; +} + +static void +term() +{ + int d; + + lvalue= -1; + emit_comment(); + + token(); + if(last_token==EOF) { + error("Term expected"); + } + switch(last_token) { + case '0': + d = value; + emit_value(d); + token(); + return; + case 'v': + d = lvalue = value; + emit_load(d); + token(); + return; + case '-': + term(); + emit_neg(); + return; + case '!': + term(); + emit_not(); + return; + case '(': + expr(); + if(last_token != ')') { + error("Unbalanced parenthsis"); + } + token(); + return; + default: + token(); + error("Unknown term"); + return; + } +} + +static +char *intro[] = { + "#APP\n", /* To process comments by GNU as */ + "\t.file \"s-calc.c\"\n", + ".text\n", + "\t.align 2\n", + ".globl _main\n_main:\n", + "\tpushl %ebp\n", + "\tmovl %esp,%ebp\n", + "\tsubl $1028,%esp\n", + "\tcall ___main\n", + NULL +}; + +static +char *ending[] = { + "\tleave\n", + "\tret\n", + "_print:\n", + "\tpushl %ebp\n", + "\tmovl %esp,%ebp\n", + "\tpushl %eax\n", + "\tpushl %eax\n", + "\tpushl $_format\n", + "\tcall _printf\n", + "\tleave\n", + "\tret\n", + "_format:\n", + "\t.ascii \" = %08x %d\\12\\0\"\n", + "\t.align 2\n", + ".comm _variable,192\n", + NULL +}; + +static +char *opcode[] = { + "", + "subl", + "addl", + "imull", + "idiv", + "andl", + "orl", + "xorl", + "sall", + "sarl", + "idiv", + "setl", + "setg", + "sete", + "setne", +}; + +static void +emit_push() +{ + printf("\tpushl %%eax\n"); +} + +static void +emit_not() +{ + printf("\ttestl %%eax,%%eax\n"); + printf("\tsete %%al\n"); + printf("\tmovzbl %%al,%%edx\n"); + printf("\tmovl %%edx,%%eax\n"); +} + +static void +emit_compare(op) +int op; +{ + printf("\tcmpl %%eax,(%%esp)\n"); + printf("\t%s %%al\n",opcode[op]); + printf("\tmovzbl %%al,%%eax\n"); + printf("\taddl %%esp,4\n"); +} + +static void +emit_store(assign) +int assign; +{ + printf("\tmovl %%eax,_variable+%d\n",assign*4); +} + + +static void +emit_calc(enum opcode op) { + if(op==O_DIV) { + printf("\tmovl %%eax,%%ebx\n"); + printf("\tpopl %%eax\n"); + printf("\tcltd\n"); + printf("\tidiv %%ebx\n",op); + } else if(op==O_MOD) { + printf("\tmovl %%eax,%%ebx\n"); + printf("\tpopl %%eax\n"); + printf("\tcltd\n"); + printf("\tidiv %%ebx\n",op); + printf("\tmovl %%edx,%%eax\n"); + } else if(op==O_ASL||op==O_ASR) { + printf("\tmovl %%eax,%%ecx\n"); + printf("\tpopl %%eax\n"); + printf("\t%s %%cl,%%eax\n",opcode[op]); + } else { + printf("\tpopl %%ebx\n"); + printf("\t%s %%ebx,%%eax\n",opcode[op]); + } +} + +static void +emit_neg() +{ + printf("\tnegl %%eax\n"); +} + +static void +emit_value(int d) { + printf("\tmovl $%d,%%eax\n",d); +} + +static void +emit_load(int d) { + printf("\tmovl _variable+%d,%%eax\n",d*4); +} + +static void +emit_cond(int lbl) +{ + printf("\ttestl %%ax,%%ax\n"); + printf("\tje L%d\n",lbl); +} + +static void +emit_jump(int lbl) +{ + printf("\tjmp L%d\n",lbl); +} + +static void +emit_label(int lbl) +{ + printf("L%d:\n",lbl); +} + +static void +emit_comment() +{ + if (before < ptr) { + putchar('#'); putchar('#'); putchar(' '); + while (before < ptr) { + if(*before && *before!='\n') { + putchar(*before); + } + before++; + } + putchar('\n'); + } +} + +static void +emit_print() +{ + printf("\tcall _print\n"); +} + +int +main() +{ + int d; + char **iptr,buf[BUFSIZ]; + + for(iptr=intro;*iptr;iptr++) { + printf("%s",*iptr); + } + while (fgets(buf,BUFSIZ,stdin)) { + ptr = buf; + before = buf; + printf("##### %s",buf); + fflush(stdout); + expr(); + emit_print(); + emit_comment(); + } + for(iptr=ending;*iptr;iptr++) { + printf("%s",*iptr); + } + return 0; +} + + +/* end */ diff -r 000000000000 -r 6bf66c125dbc ending.09 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ending.09 Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,259 @@ + +* +* micro-C driver for v09 emulator +* +* 12-Dec-81 M.Ohta,H.Tezuka +* Shinji Kono +* + +___CONST + FCW 10000,1000 + FCW 100,10 + FCW 1,0 + +PRINT PSHS D,X,Y,U + LEAS -10,S + LEAU ,S + LEAX 2,S + STD ,U + TSTA Minus? + BPL ___P0 + LDA #'- + STA ,X+ + LDA 10,S + NEGB Negate + NEGA + SBCA #0 +___P0 + LEAY ___CONST-___P5,PCR +___P5 + STD ,U + BNE ___P6 + LDA #'0 Zero case + STA ,X+ + BRA ___P4 +___P6 + CMPD ,Y Zero Suppress + BGE ___P1 + LEAY 2,Y + BRA ___P6 +___P1 + LDA #'0 Outer loop + STA ,X + LDD ,U +___P2 + SUBD ,Y Digit loop + BLT ___P3 + INC ,X + BRA ___P2 +___P3 + ADDD ,Y Recovery + STD ,U + LEAX 1,X Next char + LEAY 2,Y Next divider + LDD ,Y + BNE ___P1 +___P4 + LDA #$0A + STA ,X+ + CLR ,X Line terminator + LEAX 2,S + TFR X,D + BSR PUTS + LEAS 10,S + PULS D,X,Y,U,PC + +PUTS PSHS D,X,Y,U + TFR D,X +___LOOP + LDB ,X+ + BEQ ___LAST + SWI2 + BRA ___LOOP +___LAST + PULS D,X,Y,U,PC + +* +_MULTI PSHS D,X,Y multiply + + LDA ,S + LDB 3,S + MUL + STB 4,S + + LDD 1,S + MUL + STB 5,S + + LDA 1,S + LDB 3,S + MUL + ADDA 4,S + ADDA 5,S + + LEAS 6,S + RTS +* +_DIVIDE CLR ,-S signed divide D/X -> D? + + CMPX #0 + BPL _02000 + + COM ,S + + EXG D,X + LBSR _00020 + EXG D,X + +_02000 TSTA + BPL _02001 + + COM ,S + + LBSR _00020 + +_02001 LBSR _00010 + TFR X,D + TST ,S+ + BPL _02002 + + LBSR _00020 + +_02002 RTS +* +_00003 LBSR _00010 unsigned divide + TFR X,D + RTS +* +_00004 CLR ,-S signed modulous + + CMPX #0 + BPL _04000 + + EXG D,X + BSR _00020 + EXG D,X + +_04000 TSTA + BPL _04001 + + COM ,S + BSR _00020 + +_04001 BSR _00010 + + TST ,S+ + BPL _04002 + + BSR _00020 + +_04002 RTS +* +_00005 BSR _00010 unsigned modulous + + RTS +* +_00006 CMPX #0 signed left shift + BMI _06001 + +_06000 BEQ _06009 + LSLB + ROLA + LEAX -1,X + BRA _06000 + +_06001 BEQ _06009 + ASRA + RORB + LEAX 1,X + BRA _06001 + +_06009 RTS +* +_00007 CMPX #0 unsined left shift + BMI _07001 + +_07000 BEQ _07009 + LSLB + ROLA + LEAX -1,X + BRA _07000 + +_07001 BEQ _07009 + LSRA + RORB + LEAX 1,X + BRA _07001 + +_07009 RTS +* +_00008 CMPX #0 sined right shift + BMI _08001 + +_08000 BEQ _08009 + ASRA + RORB + LEAX -1,X + BRA _08000 + +_08001 BEQ _08009 + LSLB + ROLA + LEAX 1,X + BRA _08001 + +_08009 RTS +* +_00009 CMPX #0 unsined right shift + BMI _09001 + +_09000 BEQ _09009 + LSRA + RORB + LEAX -1,X + BRA _09000 + +_09001 BEQ _09009 + LSLB + ROLA + LEAX 1,X + BRA _09001 + +_09009 RTS +* +_00020 NEGA negate D reg + NEGB + SBCA #0 + RTS +* +_00010 PSHS D,X divide subroutine + + CLRA + CLRB + + LDX #17 + +_00011 SUBD 2,S + BCC _00012 + + ADDD 2,S + +_00012 ROL 1,S + ROL ,S + ROLB + ROLA + + LEAX -1,X + BNE _00011 + + RORA + RORB + + COM 1,S + COM ,S + PULS X + + LEAS 2,S + RTS + + END diff -r 000000000000 -r 6bf66c125dbc ending.rs6k --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ending.rs6k Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,105 @@ + cal r3,0(r0) + l r31,76(SP) + l r0,88(SP) + mtspr LR,r0 + ai SP,SP,80 + bcr BO_ALWAYS,CR0_LT +# traceback table + .long 0x00000000 + .byte 0x00 # VERSION=0 + .byte 0x00 # LANG=TB_C + .byte 0x20 # IS_GL=0,IS_EPROL=0,HAS_TBOFF=1 + # INT_PROC=0,HAS_CTL=0,TOCLESS=0 + # FP_PRESENT=0,LOG_ABORT=0 + .byte 0x41 # INT_HNDL=0,NAME_PRESENT=1 + # USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND + # SAVES_CR=0,SAVES_LR=1 + .byte 0x80 # STORES_BC=1,FPR_SAVED=0 + .byte 0x01 # GPR_SAVED=1 + .byte 0x00 # FIXEDPARMS=0 + .byte 0x01 # FLOATPARMS=0,PARMSONSTK=1 + .long 0x00000048 # TB_OFFSET + .short 4 # NAME_LEN + .byte "main" + .byte 0 # padding + .byte 0 # padding +# End of traceback table +.print: # 0x00000060 (H.10.NO_SYMBOL+0x60) + mfspr r0,LR + st r31,-4(SP) + st r0,8(SP) + stu SP,-80(SP) + l r31,T.20._test0_c_(RTOC) + st r3,104(SP) + cal r3,0(r31) + l r5,104(SP) + cal r4,0(r5) + bl .printf{PR} + cror CR3_SO,CR3_SO,CR3_SO + l r31,76(SP) + l r0,88(SP) + mtspr LR,r0 + ai SP,SP,80 + bcr BO_ALWAYS,CR0_LT +# traceback table + .long 0x00000000 + .byte 0x00 # VERSION=0 + .byte 0x00 # LANG=TB_C + .byte 0x20 # IS_GL=0,IS_EPROL=0,HAS_TBOFF=1 + # INT_PROC=0,HAS_CTL=0,TOCLESS=0 + # FP_PRESENT=0,LOG_ABORT=0 + .byte 0x41 # INT_HNDL=0,NAME_PRESENT=1 + # USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND + # SAVES_CR=0,SAVES_LR=1 + .byte 0x80 # STORES_BC=1,FPR_SAVED=0 + .byte 0x01 # GPR_SAVED=1 + .byte 0x01 # FIXEDPARMS=1 + .byte 0x01 # FLOATPARMS=0,PARMSONSTK=1 + .long 0x00000000 # + .long 0x00000040 # TB_OFFSET + .short 5 # NAME_LEN + .byte "print" + .byte 0 # padding +# End of traceback table + .long 0x00000000 # "\0\0\0\0" +# End csect H.10.NO_SYMBOL{PR} + +# .data section + + + .toc # 0x000000c0 +T.24.main: + .tc H.24.main{TC},main{DS} +T.28.variable: + .tc H.28.variable{TC},variable +T.32.print: + .tc H.32.print{TC},print{DS} +T.20._test0_c_: + .tc H.20._test0_c_{TC},E.18._test0_c_{RW} + + + .csect main{DS} + .long .main # "\0\0\0\0" + .long TOC{TC0} # "\0\0\0\300" + .long 0x00000000 # "\0\0\0\0" +# End csect main{DS} + + + .csect print{DS} + .long .print # "\0\0\0`" + .long TOC{TC0} # "\0\0\0\300" + .long 0x00000000 # "\0\0\0\0" +# End csect print{DS} + + + .csect E.18._test0_c_{RW}, 3 + .long 0x30782530 # "0x%0" + .long 0x3878203d # "8x =" + .long 0x2025640a # " %d\n" +# End csect E.18._test0_c_{RW} + .long 0x00000000 # "\0\0\0\0" + + + +# .bss section + .comm variable, 256, 3 # 0x000000f8 diff -r 000000000000 -r 6bf66c125dbc error.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/error.txt Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,1 @@ +!(b+1>1 +b +1==1 +1==0x10 +b==a +b==a?-a:b+1 +b!=a?-a:b+1 +!(b+1>a)?-a:b+1 +!(b+11 + l r4,T.28.variable(RTOC) + l r3,0(r4) + stu r3,-4(SP) + cal r3,1(r0) + l r4,0(SP) + cmp 0,r4,r3 + ai SP,SP,4 + cal r3,1(r0) + bc BO_IF,CR0_GT,__L0 + cal r3,0(r0) +__L0: + bl .print +## a>1 +##### b + l r4,T.28.variable(RTOC) + l r3,4(r4) + bl .print +## b +##### b>a + l r4,T.28.variable(RTOC) + l r3,4(r4) + stu r3,-4(SP) + l r4,T.28.variable(RTOC) + l r3,0(r4) + l r4,0(SP) + cmp 0,r4,r3 + ai SP,SP,4 + cal r3,1(r0) + bc BO_IF,CR0_GT,__L1 + cal r3,0(r0) +__L1: + bl .print +## b>a + cal r3,0(r0) + l r31,76(SP) + l r0,88(SP) + mtspr LR,r0 + ai SP,SP,80 + bcr BO_ALWAYS,CR0_LT +# traceback table + .long 0x00000000 + .byte 0x00 # VERSION=0 + .byte 0x00 # LANG=TB_C + .byte 0x20 # IS_GL=0,IS_EPROL=0,HAS_TBOFF=1 + # INT_PROC=0,HAS_CTL=0,TOCLESS=0 + # FP_PRESENT=0,LOG_ABORT=0 + .byte 0x41 # INT_HNDL=0,NAME_PRESENT=1 + # USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND + # SAVES_CR=0,SAVES_LR=1 + .byte 0x80 # STORES_BC=1,FPR_SAVED=0 + .byte 0x01 # GPR_SAVED=1 + .byte 0x00 # FIXEDPARMS=0 + .byte 0x01 # FLOATPARMS=0,PARMSONSTK=1 + .long 0x00000048 # TB_OFFSET + .short 4 # NAME_LEN + .byte "main" + .byte 0 # padding + .byte 0 # padding +# End of traceback table +.print: # 0x00000060 (H.10.NO_SYMBOL+0x60) + mfspr r0,LR + st r31,-4(SP) + st r0,8(SP) + stu SP,-80(SP) + l r31,T.20._test0_c_(RTOC) + st r3,104(SP) + cal r3,0(r31) + l r5,104(SP) + cal r4,0(r5) + bl .printf{PR} + cror CR3_SO,CR3_SO,CR3_SO + l r31,76(SP) + l r0,88(SP) + mtspr LR,r0 + ai SP,SP,80 + bcr BO_ALWAYS,CR0_LT +# traceback table + .long 0x00000000 + .byte 0x00 # VERSION=0 + .byte 0x00 # LANG=TB_C + .byte 0x20 # IS_GL=0,IS_EPROL=0,HAS_TBOFF=1 + # INT_PROC=0,HAS_CTL=0,TOCLESS=0 + # FP_PRESENT=0,LOG_ABORT=0 + .byte 0x41 # INT_HNDL=0,NAME_PRESENT=1 + # USES_ALLOCA=0,CL_DIS_INV=WALK_ONCOND + # SAVES_CR=0,SAVES_LR=1 + .byte 0x80 # STORES_BC=1,FPR_SAVED=0 + .byte 0x01 # GPR_SAVED=1 + .byte 0x01 # FIXEDPARMS=1 + .byte 0x01 # FLOATPARMS=0,PARMSONSTK=1 + .long 0x00000000 # + .long 0x00000040 # TB_OFFSET + .short 5 # NAME_LEN + .byte "print" + .byte 0 # padding +# End of traceback table + .long 0x00000000 # "\0\0\0\0" +# End csect H.10.NO_SYMBOL{PR} + +# .data section + + + .toc # 0x000000c0 +T.24.main: + .tc H.24.main{TC},main{DS} +T.28.variable: + .tc H.28.variable{TC},variable +T.32.print: + .tc H.32.print{TC},print{DS} +T.20._test0_c_: + .tc H.20._test0_c_{TC},E.18._test0_c_{RW} + + + .csect main{DS} + .long .main # "\0\0\0\0" + .long TOC{TC0} # "\0\0\0\300" + .long 0x00000000 # "\0\0\0\0" +# End csect main{DS} + + + .csect print{DS} + .long .print # "\0\0\0`" + .long TOC{TC0} # "\0\0\0\300" + .long 0x00000000 # "\0\0\0\0" +# End csect print{DS} + + + .csect E.18._test0_c_{RW}, 3 + .long 0x30782530 # "0x%0" + .long 0x3878203d # "8x =" + .long 0x2025640a # " %d\n" +# End csect E.18._test0_c_{RW} + .long 0x00000000 # "\0\0\0\0" + + + +# .bss section + .comm variable, 256, 3 # 0x000000f8 diff -r 000000000000 -r 6bf66c125dbc project --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,26 @@ +Thu Oct 3 16:41:31 JST 1996 + +Simple Interpreter + Label & Goto statement? (Using fseek) + While statement? + Function call? + +Simple Compiler + One path code generator + In core compile (Cache handling?) + +Semantic Dictionalry Generation ( for Runtime code generation ) + For Object Oriented Language + For Reflective language + +Very long compile, Code refinement of Semantic dictionary + Keeping refinement information + Global optimization + Code size control + +Functional Unit + Array gaming ... + +Input type, Output type + +Aliasing diff -r 000000000000 -r 6bf66c125dbc s-calc-r.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-calc-r.c Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,177 @@ +/* + Very Simple Calculator + $Id$ + */ + +#include + +static char *ptr,*last_ptr; +static int value,lvalue; +static int last_token; +static int variable[48]; + +static int expr(); +static int aexpr(); +static int mexpr(); +static int term(); +static int token(); + + +static int +token() +{ + int c,d; + + last_ptr = ptr; /* for error position */ + c= *ptr; + if(!c) { + last_token = EOF; + return last_token; + } + ptr++; + if (c<=' ') { /* comment */ + while(*ptr++); + ptr--; + last_token = EOF; + last_ptr = ptr; + return last_token; + } + if('0'<=c && c<='9') { /* Decimal */ + d = c-'0'; + while(c= *ptr++) { + if('0'<=c && c<='9') { + d = d*10 + (c - '0'); + } else { + break; + } + } + c && ptr--; + value = d; + last_token = '0'; + return last_token; + } else if ('a'<=c && c<='z') { /* variable */ + value = c-'a'; /* return variable reference */ + last_token = 'v'; + return last_token; + } else { + last_token = c; + return last_token; + return c; + } +} + +static int +expr() +{ + int d,assign; + + d = aexpr(); + assign = lvalue; + switch(last_token) { + case '>': + d = (d > aexpr()); + return d; + case '=': + if(assign>=0) { + d = expr(); + variable[assign] = d; + return d; + } else { + error("Bad assignment"); + return 0; + } + case ')': + return d; + case EOF: + return d; + default: + error("Bad expression"); + return d; + } +} + +static int +aexpr() +{ + int d; + + d = mexpr(); + switch(last_token) { + case '-': + d -= aexpr(); + return d; + case '+': + d += aexpr(); + return d; + default: + return d; + } +} + +static int +mexpr() +{ + int d; + + d = term(); + switch(last_token) { + case '*': + d *= mexpr(); + return d; + case '/': + d /= mexpr(); + return d; + default: + return d; + } +} + +static int +term() +{ + int d; + + lvalue= -1; + token(); + if(last_token==EOF) { + error("Term expected"); + } + switch(last_token) { + case '0': + d = value; + token(); + return d; + case 'v': + d = lvalue = value; + token(); + return variable[d]; + case '(': + d = expr(); + if(last_token != ')') { + error("Unbalanced parenthsis"); + } + token(); + return d; + default: + token(); + error("Unknown term"); + return 0; + } +} + +int +main() +{ + int d; + char buf[BUFSIZ]; + + while (fgets(buf,BUFSIZ,stdin)) { + ptr = buf; + d = expr(); + printf("%s = 0x%08x = %d\n",buf,d,d); + fflush(stdout); + } + return 0; +} + +/* end */ diff -r 000000000000 -r 6bf66c125dbc s-calc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-calc.c Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,137 @@ +/* + Very Simple Calculator + $Id$ + */ + +#include "s-compile.h" + +int variable[48]; + +static int expr(); +static int aexpr(); +static int mexpr(); +static int term(); + + +static int +expr() +{ + int d,assign; + + d = aexpr(); + assign = lvalue; + while(last_token!=EOF) { + switch(last_token) { + case '>': + d = (d > aexpr()); + break; + case '=': + if(assign>=0) { + d = expr(); + variable[assign] = d; + break; + } else { + error("Bad assignment"); + break; + } + case ')': + return d; + default: + error("Bad expression"); + return d; + } + } + return d; +} + +static int +aexpr() +{ + int d; + + d = mexpr(); + while(last_token!=EOF) { + switch(last_token) { + case '-': + d -= mexpr(); + break; + case '+': + d += mexpr(); + break; + default: + return d; + } + } + return d; +} + +static int +mexpr() +{ + int d; + + d = term(); + while(last_token!=EOF) { + switch(last_token) { + case '*': + d *= term(); + break; + case '/': + d /= term(); + break; + default: + return d; + } + } + return d; +} + +static int +term() +{ + int d; + + lvalue= -1; + token(); + if(last_token==EOF) { + error("Term expected"); + } + switch(last_token) { + case '0': + d = value; + token(); + return d; + case 'v': + d = lvalue = value; + token(); + return variable[d]; + case '(': + d = expr(); + if(last_token != ')') { + error("Unbalanced parenthsis"); + } + token(); + return d; + default: + token(); + error("Unknown term"); + return 0; + } +} + +int +main() +{ + int d; + char buf[BUFSIZ]; + + while (fgets(buf,BUFSIZ,stdin)) { + ptr = buf; + d = expr(); + printf("%s = 0x%08x = %d\n",buf,d,d); + fflush(stdout); + } + return 0; +} + +/* end */ diff -r 000000000000 -r 6bf66c125dbc s-calc.s --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-calc.s Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,431 @@ +gcc2_compiled.: +___gnu_compiled_c: +.text + .align 4 + .global _token + .proc 04 +_token: + !#PROLOGUE# 0 + !#PROLOGUE# 1 + sethi %hi(_last_ptr),%g2 + sethi %hi(_ptr),%g3 + ld [%g3+%lo(_ptr)],%g3 + st %g3,[%g2+%lo(_last_ptr)] + ldsb [%g3],%o0 + cmp %o0,0 + bne L2 + sethi %hi(_ptr),%o1 + sethi %hi(_last_token),%g3 + mov -1,%g2 + st %g2,[%g3+%lo(_last_token)] + b L19 + mov -1,%o0 +L2: + ld [%o1+%lo(_ptr)],%g3 + add %g3,1,%g2 + cmp %o0,32 + bg L3 + st %g2,[%o1+%lo(_ptr)] + add %g3,2,%g2 + st %g2,[%o1+%lo(_ptr)] + ldsb [%g3+1],%g2 + cmp %g2,0 + be L20 + sethi %hi(_ptr),%g2 + sethi %hi(_ptr),%o0 + ld [%o0+%lo(_ptr)],%g2 +L21: + add %g2,1,%g3 + st %g3,[%o0+%lo(_ptr)] + ldsb [%g2],%g2 + cmp %g2,0 + bne L21 + ld [%o0+%lo(_ptr)],%g2 + sethi %hi(_ptr),%g2 +L20: + ld [%g2+%lo(_ptr)],%g3 + add %g3,-1,%g3 + st %g3,[%g2+%lo(_ptr)] + sethi %hi(_last_token),%o0 + mov -1,%g2 + st %g2,[%o0+%lo(_last_token)] + sethi %hi(_last_ptr),%g2 + st %g3,[%g2+%lo(_last_ptr)] + b L19 + mov -1,%o0 +L3: + add %o0,-48,%g2 + cmp %g2,9 + bgu L8 + mov %g2,%o1 + sethi %hi(_ptr),%g2 + ld [%g2+%lo(_ptr)],%o0 + add %o0,1,%g3 + st %g3,[%g2+%lo(_ptr)] + ldsb [%o0],%o0 + cmp %o0,0 + be L23 + mov %g2,%o2 + add %o0,-48,%g2 +L22: + cmp %g2,9 + bgu L10 + sll %o1,2,%g2 + add %g2,%o1,%g2 + sll %g2,1,%g2 + add %g2,-48,%g2 + add %g2,%o0,%o1 + ld [%o2+%lo(_ptr)],%g3 + add %g3,1,%g2 + st %g2,[%o2+%lo(_ptr)] + ldsb [%g3],%o0 + cmp %o0,0 + bne L22 + add %o0,-48,%g2 +L10: + cmp %o0,0 +L23: + be L15 + sethi %hi(_ptr),%g3 + ld [%g3+%lo(_ptr)],%g2 + add %g2,-1,%g2 + st %g2,[%g3+%lo(_ptr)] +L15: + sethi %hi(_value),%g2 + st %o1,[%g2+%lo(_value)] + sethi %hi(_last_token),%g3 + mov 48,%g2 + st %g2,[%g3+%lo(_last_token)] + b L19 + mov 48,%o0 +L8: + add %o0,-97,%g2 + cmp %g2,25 + bleu L17 + sethi %hi(_last_token),%g2 + b L19 + st %o0,[%g2+%lo(_last_token)] +L17: + sethi %hi(_value),%g3 + add %o0,-97,%g2 + st %g2,[%g3+%lo(_value)] + sethi %hi(_last_token),%g3 + mov 118,%g2 + st %g2,[%g3+%lo(_last_token)] + mov 118,%o0 +L19: + retl + nop + .align 8 +LC0: + .ascii "Bad assignment\0" + .align 8 +LC1: + .ascii "Bad expression\0" + .align 4 + .global _expr + .proc 04 +_expr: + !#PROLOGUE# 0 + save %sp,-104,%sp + !#PROLOGUE# 1 + call _aexpr,0 + nop + mov %o0,%i0 + sethi %hi(_lvalue),%o0 + ld [%o0+%lo(_lvalue)],%l0 + sethi %hi(_last_token),%o0 + mov %o0,%o1 + ld [%o0+%lo(_last_token)],%o0 + cmp %o0,-1 + be L26 + sethi %hi(_variable),%o0 + or %o0,%lo(_variable),%l4 + sll %l0,2,%l1 + sethi %hi(LC0),%l3 + sethi %hi(LC1),%l2 + ld [%o1+%lo(_last_token)],%o0 + cmp %o0,61 +L40: + be,a L30 + cmp %l0,0 + bg L36 + cmp %o0,62 + cmp %o0,41 + be L38 + nop + b,a L34 +L36: + bne L34 + nop + call _aexpr,0 + nop + cmp %i0,%o0 + bg,a L41 + mov 1,%i0 + mov 0,%i0 +L41: + b L39 + sethi %hi(_last_token),%o1 +L30: + bl L31 + nop + call _expr,0 + nop + mov %o0,%i0 + b L38 + st %i0,[%l1+%l4] +L31: + call _error,0 + or %l3,%lo(LC0),%o0 + b L38 + mov 0,%i0 +L34: + call _error,0 + or %l2,%lo(LC1),%o0 + call _token,0 + nop + sethi %hi(_last_token),%o1 +L39: + ld [%o1+%lo(_last_token)],%o0 + cmp %o0,-1 + bne L40 + cmp %o0,61 +L26: + sethi %hi(_last_token),%o1 + mov -1,%o0 + st %o0,[%o1+%lo(_last_token)] +L38: + ret + restore + .align 4 + .global _aexpr + .proc 04 +_aexpr: + !#PROLOGUE# 0 + save %sp,-104,%sp + !#PROLOGUE# 1 + call _mexpr,0 + nop + mov %o0,%i0 + sethi %hi(_last_token),%o0 + mov %o0,%o1 + ld [%o0+%lo(_last_token)],%o0 + cmp %o0,-1 + be L52 + ld [%o1+%lo(_last_token)],%o0 + cmp %o0,43 +L53: + be L48 + cmp %o0,45 + bne L52 + nop + call _mexpr,0 + nop + b L43 + sub %i0,%o0,%i0 +L48: + call _mexpr,0 + nop + add %i0,%o0,%i0 +L43: + sethi %hi(_last_token),%o1 + ld [%o1+%lo(_last_token)],%o0 + cmp %o0,-1 + bne L53 + cmp %o0,43 +L52: + ret + restore + .align 4 + .global _mexpr + .proc 04 +_mexpr: + !#PROLOGUE# 0 + save %sp,-104,%sp + !#PROLOGUE# 1 + call _term,0 + nop + mov %o0,%i0 + sethi %hi(_last_token),%o0 + mov %o0,%o1 + ld [%o0+%lo(_last_token)],%o0 + cmp %o0,-1 + be L64 + ld [%o1+%lo(_last_token)],%o0 + cmp %o0,42 +L67: + be L59 + cmp %o0,47 + be L60 + nop + b,a L64 +L59: + call _mexpr,0 + nop + mov %o0,%o1 + call .umul,0 + mov %i0,%o0 + b L66 + mov %o0,%i0 +L60: + call _mexpr,0 + nop + mov %o0,%o1 + call .div,0 + mov %i0,%o0 + mov %o0,%i0 +L66: + sethi %hi(_last_token),%o1 + ld [%o1+%lo(_last_token)],%o0 + cmp %o0,-1 + bne L67 + cmp %o0,42 +L64: + ret + restore + .align 8 +LC2: + .ascii "Term expected\0" + .align 8 +LC3: + .ascii "Unbalanced parenthsis\0" + .align 8 +LC4: + .ascii "Unknown term\0" + .align 4 + .global _term + .proc 04 +_term: + !#PROLOGUE# 0 + save %sp,-104,%sp + !#PROLOGUE# 1 + sethi %hi(_lvalue),%o1 + mov -1,%o0 + call _token,0 + st %o0,[%o1+%lo(_lvalue)] + sethi %hi(_last_token),%o0 + ld [%o0+%lo(_last_token)],%o0 + cmp %o0,-1 + bne,a L80 + sethi %hi(_last_token),%o0 + sethi %hi(LC2),%o0 + call _error,0 + or %o0,%lo(LC2),%o0 + sethi %hi(_last_token),%o0 +L80: + ld [%o0+%lo(_last_token)],%o0 + cmp %o0,48 + be,a L71 + sethi %hi(_value),%o0 + bg L77 + cmp %o0,118 + cmp %o0,40 + be L73 + nop + b,a L75 +L77: + be L72 + sethi %hi(_lvalue),%o1 + b,a L75 +L71: + ld [%o0+%lo(_value)],%i0 +L79: + call _token,0 + add %o7,(L78-.-4),%o7 +L72: + sethi %hi(_value),%o0 + ld [%o0+%lo(_value)],%o0 + st %o0,[%o1+%lo(_lvalue)] + call _token,0 + mov %o0,%i0 + sethi %hi(_variable),%o0 + or %o0,%lo(_variable),%o0 + sll %i0,2,%o1 + b L78 + ld [%o1+%o0],%i0 +L73: + call _expr,0 + nop + mov %o0,%i0 + sethi %hi(_last_token),%o0 + ld [%o0+%lo(_last_token)],%o0 + cmp %o0,41 + be L79 + sethi %hi(LC3),%o0 + call _error,0 + or %o0,%lo(LC3),%o0 + b,a L79 +L75: + call _token,0 + mov 0,%i0 + sethi %hi(LC4),%o0 + call _error,0 + or %o0,%lo(LC4),%o0 +L78: + ret + restore + .align 8 +LC5: + .ascii "%s = 0x%08x = %d\12\0" + .align 4 + .global _main + .proc 04 +_main: + !#PROLOGUE# 0 + save %sp,-1128,%sp + !#PROLOGUE# 1 + call ___main,0 + sethi %hi(_ptr),%l2 + add %fp,-1032,%i0 + sethi %hi(__iob),%o0 + or %o0,%lo(__iob),%l0 + sethi %hi(LC5),%l1 + mov %i0,%o0 +L85: + mov 1024,%o1 + call _fgets,0 + mov %l0,%o2 + cmp %o0,0 + be L83 + nop + call _expr,0 + st %i0,[%l2+%lo(_ptr)] + mov %o0,%o3 + or %l1,%lo(LC5),%o0 + mov %i0,%o1 + call _printf,0 + mov %o3,%o2 + call _fflush,0 + add %l0,20,%o0 + b L85 + mov %i0,%o0 +L83: + ret + restore %g0,0,%o0 + .align 8 +LC6: + .ascii "%s on %s\12\0" + .align 4 + .global _error + .proc 020 +_error: + !#PROLOGUE# 0 + save %sp,-104,%sp + !#PROLOGUE# 1 + sethi %hi(_last_ptr),%o3 + sethi %hi(__iob+40),%o0 + or %o0,%lo(__iob+40),%o0 + sethi %hi(LC6),%o1 + or %o1,%lo(LC6),%o1 + mov %i0,%o2 + call _fprintf,0 + ld [%o3+%lo(_last_ptr)],%o3 + ret + restore + .common _ptr,4,"bss" + .common _last_ptr,4,"bss" + .common _value,4,"bss" + .common _lvalue,4,"bss" + .common _last_token,4,"bss" + .common _variable,192,"bss" diff -r 000000000000 -r 6bf66c125dbc s-code-09.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-code-09.c Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,149 @@ +/* + Very Simple Code Generator for Motolora MC-6809 + $Id$ + */ + +#include "s-compile.h" + +int label = 0; +char *comments = "*****"; + +static char *intro[] = { + " ORG $100\n", + "variable EQU 0\n", + "main\n", + " LDS #$FF00\n", + " LDY #4096\n", + " PSHS U\n", + " LEAU ,S\n", + " LDD #3\n", + NULL +}; + +static +char *ending[] = { + " SYNC\n", + " LEAS 2,S\n", + " PULS U,PC\n", + "\n", + NULL +}; + +void +emit_push() +{ + printf("\tPSHS D\n"); +} + +void +emit_compare() +{ + printf("\tTFR D,X\n"); + printf("\tCLRA\n"); + printf("\tCLRB\n"); + printf("\tCMPX ,S++\n"); + printf("\tBGE L%d\n",label); + printf("\tINCB\n"); + printf("L%d\n",label); + label++; +} + +void +emit_store(assign) +int assign; +{ + printf("\tSTD %d,Y\n",assign*2); +} + +static +char *opcode[] = { + "", + "SUBD", + "ADDD", + "", /* no multiply for 6809 */ + "" /* no division for 6809 */ +}; + +void +emit_calc(enum opcode op) +{ + if(op==O_SUB) { + printf("\t%s ,S++\n",opcode[op]); + printf("\tNEGA\n"); + printf("\tNEGB\n"); + printf("\tSBCA #0\n"); + } else if(op==O_ADD) { + printf("\t%s ,S++\n",opcode[op]); + } else if(op==O_SUB_R) { + printf("\tsubd ,S++\n"); + } else if(op==O_MUL) { + printf("\tLDX ,S++\n",opcode[op]); + printf("\tLBSR _MULTI\n"); + } else if(op==O_DIV) { + printf("\tLDX ,S++\n",opcode[op]); + printf("\tEXG D,X\n"); + printf("\tLBSR _DIVIDE\n"); + } else if(op==O_DIV_R) { + printf("\tLDX ,S++\n",opcode[op]); + printf("\tLBSR _DIVIDE\n"); + } +} + +void +emit_value(d) +int d; +{ + printf("\tLDD #%d\n",d); +} + +void +emit_load(d) +int d; +{ + printf("\tLDD %d,Y\n",d*2); +} + +void +emit_comment() +{ + if (before < ptr) { + putchar('*'); putchar('*'); putchar(' '); + while (before < ptr) { + if(*before && *before!='\n') { + putchar(*before); + } + before++; + } + putchar('\n'); + } +} + +void +emit_print() +{ + printf("\tLBSR print\n"); +} + + +void +emit_intro() +{ + char **iptr; + for(iptr=intro;*iptr;iptr++) { + printf("%s",*iptr); + } +} + +void +emit_ending() +{ + char **iptr; + for(iptr=ending;*iptr;iptr++) { + printf("%s",*iptr); + } + fflush(stdout); + system("/bin/cat ending.09"); +} + + +/* end */ diff -r 000000000000 -r 6bf66c125dbc s-code-intel-r.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-code-intel-r.c Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,320 @@ +/* + Very Simple Code Generator for Intel x86 + Register Version + $Id$ + */ + +#include "s-compile.h" + +int label = 0; +char *comments = "#####"; + +static +char *intro[] = { + "#APP\n", /* To process comments by GNU as */ + "\t.file \"s-calc.c\"\n", + ".text\n", + "\t.align 2\n", + ".globl main\nmain:\n", + "\tpushl %ebp\n", + "\tmovl %esp,%ebp\n", + "\tsubl $1028,%esp\n", +/* +#ifndef NEXTSTEP + "\tcall ___main\n", +#endif + */ + NULL +}; + +static +char *ending[] = { + "\txorl %eax,%eax\n", + "\tleave\n", + "\tret\n", + "_print:\n", + "\tpushl %ebp\n", + "\tmovl %esp,%ebp\n", + "\tpushl %eax\n", + "\tpushl $_format\n", + "\tcall printf\n", + "\tleave\n", + "\tret\n", + "_format:\n", + "\t.ascii \" = %d\\12\\0\"\n", + "\t.align 2\n", + ".comm _variable,192\n", + NULL +}; + + +static int creg; /* current register */ +static char *crn; /* current register name */ +static int lreg; /* operand register */ +static char *lrn; /* operand register name */ +static int dreg; /* temporary register */ +static char *drn; /* temporary register name */ +static int xreg; /* operand register */ +static char *xrn; /* operand register name */ +static int reg_sp; /* REGister Stack-Pointer */ + + +const int REG_EAX = 0; +const int REG_EBX = 1; +const int REG_ECX = 2; +const int REG_EDX = 3; +const int REG_ESI = 4; +const int REG_EDI = 5; +const int REG_EBP = 6; +const int REG_ESP = 7; + + +const int DATA_REG = 0 ; +const int POINTER_REG = 3 ; + +/* + creg currrent register + lreg operand register + dreg spare register + + regs[] register usage + + reg_name[creg] register name + */ + +#define MAX_MAX 20 +static int regs[MAX_MAX]; /* 使われているレジスタを示すフラグ */ +static int reg_stack[MAX_MAX]; /* 実際のレジスタの領域 */ + +const int MAX_REGISTER=6; +const int MAX_DATA_REG=4; +const int MAX_POINTER=3; + +static char *reg_name[] = {"%eax","%ebx","%ecx","%edx","%esi", + "%edi","%ebp","%esp"}; +static char *reg_name_l[] = {"%al","%bl","%cl","%dl"}; + +static char * +regster(i) +int i; +{ + return reg_name[i]; +} + +static int +get_register() +{ /* 使われていないレジスタを調べる */ + int i; + for(i=0;i "); +} + +void +emit_store(assign) +int assign; +{ + printf("->%c ",assign+'a'); +} + + +char *opcode[] = { + "", + "-", + "+", + "*", + "/", + "", + "", + "", + "", + "-(r)", + "/(r)", +}; + +void +emit_calc(enum opcode op) +{ + printf("%s ",opcode[op]); +} + +void +emit_value(d) +int d; +{ + printf("%d ",d); +} + +void +emit_load(d) +int d; +{ + printf("%c\n",d+'a'); +} + +void +emit_comment() +{ +} + +void +emit_print() +{ + printf("print\n"); +} + + +void +emit_intro() +{ +} + +void +emit_ending() +{ +} + + +/* end */ diff -r 000000000000 -r 6bf66c125dbc s-code-rs6k-r.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-code-rs6k-r.c Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,181 @@ +/* + Very Simple Code Generator for IBM PowerPC (with register) + $Id$ + */ + +#include "s-compile.h" + +int label = 0; +char *comments = "#####"; + +static int current_register; +static int reg_sp; +static char *crn; /* current register name */ +static char *lrn; /* last register name */ + +static char *reg_name[] = { + "r0","r1","r2","r3","r4","r5","r6","r7", + "r8","r9","r10","r11","r12","r13","r14","r15", + "r16","r17","r18","r19","r20","r21","r22","r23", + "r24","r25","r26","r27","r28","r29","r30","r31" +}; +#define MAX_REGISTER 32 +static char regs[MAX_REGISTER]; +static char reg_stack[MAX_REGISTER]; + +static int +get_register() { + int i; + for(i=0;i>16); + } + +} + +void +emit_load(assign) +int assign; +{ + printf("\tl r4,T.28.variable(RTOC)\n"); + printf("\tl %s,%d(r4)\n",crn,assign*4); +} + +void +emit_comment() +{ + if (before < ptr) { + putchar('#'); putchar('#'); putchar(' '); + while (before < ptr) { + if(*before && *before!='\n') { + putchar(*before); + } + before++; + } + putchar('\n'); + } +} + +void +emit_print() +{ + if(current_register!=3) { + printf("\tcal r3,0(%s)\n",crn); + } + printf("\tbl .print\n"); +} + +void +emit_intro() +{ + int i; + + system("/bin/cat intro.rs6k"); + for(i=0;i>16); + } +} + +void +emit_load(d) +int d; +{ + printf("\tl r4,T.28.variable(RTOC)\n"); + printf("\tl r3,%d(r4)\n",d*4); +} + +void +emit_comment() +{ + if (before < ptr) { + putchar('#'); putchar('#'); putchar(' '); + while (before < ptr) { + if(*before && *before!='\n') { + putchar(*before); + } + before++; + } + putchar('\n'); + } +} + +void +emit_print() +{ + printf("\tbl .print\n"); +} + +void +emit_intro() +{ + system("/bin/cat intro.rs6k"); +} + +void +emit_ending() +{ + fflush(stdout); + system("/bin/cat ending.rs6k"); +} + + +/* end */ diff -r 000000000000 -r 6bf66c125dbc s-code-sparc.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-code-sparc.c Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,265 @@ +/* + Very Simple Code Generator for Sun SPARC + $Id$ + */ + +#include "s-compile.h" + +int label = 0; +char *comments = "#####"; + +static +char *reg_name[] = { + "%g0","%g1","%g2","%g3","%g4","%g5","%g6","%g7", + "%i0","%i1","%i2","%i3","%i4","%i5","%i6","%i7", + "%l0","%l1","%l2","%l3","%l4","%l5","%l6","%l7", + "%o0","%o1","%o2","%o3","%o4","%o5","%o6","%o7" +}; +#define O0RN 24 +#define MAX_REGISTER 32 + +static int current_register; +static char reg_stack[MAX_REGISTER]; +static int reg_sp; +static char *crn; /* current register name */ +static char *lrn; /* last register name */ + +static char regs[MAX_REGISTER]; + +static int +get_register() { + int i; + for(i=0;i': + emit_push(); + aexpr(); + emit_compare(); + break; + case '=': + if(assign>=0) { + expr(); + emit_store(assign); + return; + } else { + error("Bad assignment"); + return; + } + case ')': + return; + case EOF: + return; + default: + error("Bad expression"); + token(); + return; + } + } + return; +} + +static void +aexpr() +{ + + emit_comment(); + mexpr(); + while(last_token!=EOF) { + switch(last_token) { + case '-': + emit_push(); + mexpr(); + emit_calc(O_SUB); + break; + case '+': + emit_push(); + mexpr(); + emit_calc(O_ADD); + break; + default: + return; + } + } + return; +} + +static void +mexpr() +{ + int d; + + emit_comment(); + term(); + while(last_token!=EOF) { + switch(last_token) { + case '*': + emit_push(); + term(); +/*###88 [cc] `O_MUL' undeclared (first use in this function)%%%*/ + emit_calc(O_MUL); + break; + case '/': + emit_push(); + term(); +/*###93 [cc] `O_DIV' undeclared (first use in this function)%%%*/ + emit_calc(O_DIV); + break; + default: + return; + } + } + return; +} + +static void +term() +{ + int d; + + lvalue= -1; + emit_comment(); + token(); + if(last_token==EOF) { + error("Term expected"); + } + switch(last_token) { + case '0': + d = value; + emit_value(d); + token(); + return; + case 'v': + d = lvalue = value; + emit_load(d); + token(); + return; + case '(': + expr(); + if(last_token != ')') { + error("Unbalanced parenthsis"); + } + token(); + return; + default: + token(); + error("Unknown term"); + return; + } +} + + +int +main() +{ + int d; + char buf[BUFSIZ]; + + emit_intro(); + while (fgets(buf,BUFSIZ,stdin)) { + ptr = buf; + before = buf; + printf("%s %s",comments,buf); + expr(); + emit_print(); + emit_comment(); + } + emit_ending(); + return 0; +} + + +/* end */ diff -r 000000000000 -r 6bf66c125dbc s-compile.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-compile.h Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,41 @@ +/* + Very Simple Compiler + $Id$ + */ + +#include + +extern char *ptr,*last_ptr,*before; +extern int value,lvalue; +extern int last_token; +extern int label; +extern char *comments; + +enum opcode { + O_SUB = 1, + O_ADD = 2, + O_MUL = 3, + O_DIV = 4, + + O_MOD = 5, + O_AND = 6, + O_OR = 7, + O_XOR = 8, + + O_SUB_R = 9, + O_DIV_R = 10, +} ; + +extern void error(char *); + +extern void emit_push(); +extern void emit_compare() ; +extern void emit_store(int); +extern void emit_push(); +extern void emit_calc(enum opcode); +extern void emit_value(int) ; +extern void emit_load(int); +extern void emit_comment(); +extern void emit_intro(); +extern void emit_ending(); + diff -r 000000000000 -r 6bf66c125dbc s-input.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-input.txt Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,20 @@ +1 +1+2 // expr +2*3 // mexpr +1+(2*3) // term +1-(2-3) // association +1-2-3 // association +1+2*3 // expr order +3*2-3 // expr order +1+10*10 // token +(2+1030/2)-2 +(255*07)+256 // logical expression +0+(1+(2+(3+(4+(5+(6+(7+8)))))))-(0+(1+(2+(3+(4+(5+(6+(7+8)))))))) +100/10 +a=1*3 +b=2*3 +a+b +a=(b=3*2) +a>1 +b +b>a diff -r 000000000000 -r 6bf66c125dbc s-prefix.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-prefix.c Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,152 @@ +/* + Very Simple Compiler (Prefix form generator) + Parser part + $Id$ + */ + +#include "s-compile.h" + +static void expr(); +static void aexpr(); +static void mexpr(); +static void term(); + +static void +expr() +{ + int assign; + + emit_comment(); + aexpr(); + assign = lvalue; + while(last_token!=EOF) { + switch(last_token) { + case '>': + emit_compare(); + aexpr(); + break; + case '=': + if(assign>=0) { + expr(); + emit_store(assign); + return; + } else { + error("Bad assignment"); + return; + } + break; + case ')': + return; + default: + error("Bad expression"); + token(); + } + } + last_token = EOF; +} + +static void +aexpr() +{ + + emit_comment(); + mexpr(); + while(last_token!=EOF) { + switch(last_token) { + case '-': + emit_calc(O_SUB); + mexpr(); + break; + case '+': + emit_calc(O_ADD); + mexpr(); + break; + default: + return; + } + } + return; +} + +static void +mexpr() +{ + int d; + + emit_comment(); + term(); + while(last_token!=EOF) { + switch(last_token) { + case '*': + emit_calc(O_MUL); + mexpr(); + break; + case '/': + emit_calc(O_DIV); + mexpr(); + break; + default: + return; + } + } + return; +} + +static void +term() +{ + int d; + + lvalue= -1; + emit_comment(); + token(); + if(last_token==EOF) { + error("Term expected"); + } + switch(last_token) { + case '0': + d = value; + emit_value(d); + token(); + return; + case 'v': + d = lvalue = value; + emit_load(d); + token(); + return; + case '(': + expr(); + if(last_token != ')') { + error("Unbalanced parenthsis"); + } + token(); + return; + default: + token(); + error("Unknown term"); + return; + } +} + + +int +main() +{ + int d; + char buf[BUFSIZ]; + + emit_intro(); + while (fgets(buf,BUFSIZ,stdin)) { + ptr = buf; + before = buf; + printf("%s %s",comments,buf); + expr(); + emit_print(); + emit_comment(); + } + emit_ending(); + return 0; +} + + +/* end */ diff -r 000000000000 -r 6bf66c125dbc s-token.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-token.c Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,67 @@ +/* + Very Simple Compiler (Tokenizer part) + $Id$ + */ + +#include "s-compile.h" + +void error(char *); +int token(); + +char *ptr,*last_ptr,*before; +int value,lvalue; +int last_token; + +int +token() +{ + int c,d; + + last_ptr = ptr; /* for error position */ + c= *ptr; + if(!c) { + last_token = EOF; + return last_token; + } + ptr++; + if (c<=' ') { /* comment */ + while(*ptr++); + ptr--; + last_token = EOF; + last_ptr = ptr; + return last_token; + } + if('0'<=c && c<='9') { /* Decimal */ + d = c-'0'; + while(c= *ptr++) { + if('0'<=c && c<='9') { + d = d*10 + (c - '0'); + } else { + break; + } + } + c && ptr--; + value = d; + last_token = '0'; + return last_token; + } else if ('a'<=c && c<='z') { /* variable */ + value = c-'a'; /* return variable reference */ + last_token = 'v'; + return last_token; + } else { + last_token = c; + return last_token; + return c; + } +} + +void +error(s) +char *s; +{ + fprintf(stderr,"%s on %s\n",s,last_ptr); +} + + + +/* end */ diff -r 000000000000 -r 6bf66c125dbc s-tree-compile.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-tree-compile.c Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,248 @@ +/* + Very Simple Compiler (Parser part, Tree Genertor) + $Id$ + */ + +#include "s-compile.h" + +static int variable[48]; + +typedef struct node { + struct node *left; + struct node *right; + int type; + int value; +} node; + +static node *expr(); +static node *aexpr(); +static node *mexpr(); +static node *term(); +static node *new_node(); +static void print_node(); + +static node * +new_node(type,value,left,right) +int type; +int value; +node *left; +node *right; +{ + node *d; + if ((left && left->type =='0') && + (right && right->type =='0')) { + switch(type) { + case '>': + right->value = (left->value > right->value); + free(left); return right; + break; + case '+': + right->value = left->value + right->value; + free(left); return right; + break; + case '-': + right->value = left->value - right->value; + free(left); return right; + break; + case '*': + right->value = right->value * left->value; + free(left); return right; + break; + case '/': + if(right->value==0) { + error("zero divide in compile time"); + } else { + right->value = left->value / right->value; + } + free(left); return right; + } + } + d = (node *)malloc(sizeof(node)); + d->type = type; + d->value = value; + d->left = left; + d->right = right; + return d; +} + +static void +free_node(d) +node *d; +{ + if(d->left) { + free_node(d->left); + } + if(d->right) { + free_node(d->right); + } + free(d); +} + +static void +code_generate(d) +node *d; +{ + int assign; + switch(d->type) { + case '0': + emit_value(d->value); + return; + case 'v': + emit_load(d->value); + return; + case '=': + if(!d->left || d->left->type != 'v') { + error("Bad assignment"); + code_generate(d->right); + return; + } + assign = d->left->value; + code_generate(d->right); + emit_store(assign); + return; + case '>': + code_generate(d->left); + emit_push(); + code_generate(d->right); + emit_compare(); + break; + default: /* calculation */ + code_generate(d->right); + emit_push(); + code_generate(d->left); + switch(d->type) { + case '+': emit_calc(O_ADD); break; + case '-': emit_calc(O_SUB_R); break; + case '/': emit_calc(O_DIV_R); break; + case '*': emit_calc(O_MUL); break; + default: + error("Internal Error, unknown opecode"); + } + return; + } +} + +static node * +expr() +{ + int assign; + node *d; + + d = aexpr(); + while(last_token!=EOF) { + switch(last_token) { + case '>': + d = new_node('>',0,d,aexpr()); + break; + case '=': + d = new_node('=',0,d,aexpr()); + break; + case ')': + return d; + default: + error("Bad expression"); + return d; + } + } + return d; +} + +static node * +aexpr() +{ + node *d; + + d = mexpr(); + while(last_token!=EOF) { + switch(last_token) { + case '-': + d = new_node('-',0,d,mexpr()); + break; + case '+': + d = new_node('+',0,d,mexpr()); + break; + default: + return d; + } + } + return d; +} + +static node * +mexpr() +{ + node *d; + + d = term(); + while(last_token!=EOF) { + switch(last_token) { + case '*': + d = new_node('*',0,d,term()); + break; + case '/': + d = new_node('/',0,d,term()); + break; + default: + return d; + } + } + return d; +} + +static node * +term() +{ + node *d; + + lvalue= -1; + token(); + if(last_token==EOF) { + error("Term expected"); + } + switch(last_token) { + case '0': + d = new_node('0',value,NULL,NULL); + token(); + return d; + case 'v': + d = new_node('v',value,NULL,NULL); + token(); + return d; + case '(': + d = expr(); + if(last_token != ')') { + error("Unbalanced parenthsis"); + } + token(); + return d; + default: + token(); + error("Unknown term"); + return 0; + } +} + + +int +main() +{ + node *d; + char buf[BUFSIZ]; + + emit_intro(); + while (fgets(buf,BUFSIZ,stdin)) { + ptr = buf; + before = buf; + printf("%s %s",comments,buf); + d = expr(); + code_generate(d); + free_node(d); + emit_print(); + emit_comment(); + } + emit_ending(); + return 0; +} + + +/* end */ diff -r 000000000000 -r 6bf66c125dbc s-tree.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-tree.c Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,192 @@ +/* + Very Simple Calculator (Parser Part, Tree Printer) + $Id$ + */ + +#include + +int variable[48]; + +typedef struct node { + struct node *left; + struct node *right; + int type; + int value; +} node; + +static node *free; + +static node *expr(); +static node *aexpr(); +static node *mexpr(); +static node *term(); +static node *new_node(); +static void print_node(); + +static node * +new_node(type,value,left,right) +int type; +int value; +node *left; +node *right; +{ + node *d; + d = (node *)malloc(sizeof(node)); + d->type = type; + d->value = value; + d->left = left; + d->right = right; + return d; +} + +static int tree_level = 0; + +static void +print_node(d) +node *d; +{ + int i; + for(i=0;itype) { + case '0': + printf("value(%d",d->value); + break; + case 'v': + printf("variable(%c",d->value+'a'); + break; + default: + printf("node(%c",d->type); + } + if(d->left) { + tree_level++; + printf(",(\n"); print_node(d->left); printf(")"); + tree_level--; + } + if(d->right) { + tree_level++; + printf(",(\n"); print_node(d->right); printf(")"); + tree_level--; + } + printf(")"); +} + +static node * +expr() +{ + int assign; + node *d; + + d = aexpr(); + while(last_token!=EOF) { + switch(last_token) { + case '>': + d = new_node('>',0,d,aexpr()); + break; + case '=': + d = new_node('=',0,d,aexpr()); + break; + case ')': + return d; + default: + error("Bad expression"); + return d; + } + } + return d; +} + +static node * +aexpr() +{ + node *d; + + d = mexpr(); + while(last_token!=EOF) { + switch(last_token) { + case '-': + d = new_node('-',0,d,mexpr()); + break; + case '+': + d = new_node('+',0,d,mexpr()); + break; + default: + return d; + } + } + return d; +} + +static node * +mexpr() +{ + node *d; + + d = term(); + while(last_token!=EOF) { + switch(last_token) { + case '*': + d = new_node('*',0,d,term()); + break; + case '/': + d = new_node('/',0,d,term()); + break; + default: + return d; + } + } + return d; +} + +static node * +term() +{ + node *d; + + lvalue= -1; + token(); + if(last_token==EOF) { + error("Term expected"); + } + switch(last_token) { + case '0': + d = new_node('0',value,NULL,NULL); + token(); + return d; + case 'v': + d = new_node('v',value,NULL,NULL); + token(); + return d; + case '(': + d = expr(); + if(last_token != ')') { + error("Unbalanced parenthsis"); + } + token(); + return d; + default: + token(); + error("Unknown term"); + return 0; + } +} + +int +main() +{ + node *d; + char buf[BUFSIZ]; + + while (fgets(buf,BUFSIZ,stdin)) { + printf("%s\n",buf); + ptr = buf; + d = expr(); + tree_level = 0; + print_node(d); + printf(".\n\n"); + fflush(stdout); + } + return 0; +} + + +/* end */ diff -r 000000000000 -r 6bf66c125dbc s-yacc.y --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-yacc.y Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,191 @@ +/* + Very Simple Compiler (Parser Part) + Parser part + $Id$ + */ + +%{ +#include "s-compile.h" + +void yyerror(char *); + +typedef struct node { + struct node *left; + struct node *right; + int type; + int value; +} node,*nodeptr; + +#define YYSTYPE nodeptr + +static node *new_node(); +%} + +%% + +top : expr { + code_generate($1); + free_node($1); + emit_print(); + emit_comment(); + } + ; + +expr : expr '>' aexpr { $$ = new_node('>',0,$1,$3); } + | expr '=' aexpr { $$ = new_node('=',0,$1,$3); } + | aexpr {$$ = $1; } + ; + +aexpr : aexpr '+' mexpr { $$ = new_node('+',0,$1,$3); } + | aexpr '-' mexpr { $$ = new_node('-',0,$1,$3); } + | mexpr {$$ = $1; } + ; + +mexpr : mexpr '*' term { $$ = new_node('*',0,$1,$3); } + | mexpr '/' term { $$ = new_node('/',0,$1,$3); } + | term {$$ = $1; } + ; + +term : '0' { $$ = new_node('0',value,NULL,NULL); } + | 'v' { $$ = new_node('v',value,NULL,NULL); } + | '(' expr ')' {$$ = $2; } + ; + +%% + +static void print_node(); +int variable[48]; + +static node * +new_node(type,value,left,right) +int type; +int value; +node *left; +node *right; +{ + node *d; + if ((left && left->type =='0') && + (right && right->type =='0')) { + switch(type) { + case '>': + right->value = (left->value > right->value); + free(left); return right; + break; + case '+': + right->value = left->value + right->value; + free(left); return right; + break; + case '-': + right->value = left->value - right->value; + free(left); return right; + break; + case '*': + right->value = right->value * left->value; + free(left); return right; + break; + case '/': + if(right->value==0) { + error("zero divide in compile time"); + } else { + right->value = left->value / right->value; + } + free(left); return right; + } + } + d = (node *)malloc(sizeof(node)); + d->type = type; + d->value = value; + d->left = left; + d->right = right; + return d; +} + +static void +free_node(d) +node *d; +{ + if(d->left) { + free_node(d->left); + } + if(d->right) { + free_node(d->right); + } + free(d); +} + +static void +code_generate(d) +node *d; +{ + int assign; + if(!d) return; /* compiler internal error.. */ + switch(d->type) { + case '0': + emit_value(d->value); + return; + case 'v': + emit_load(d->value); + return; + case '=': + if(!d->left || d->left->type != 'v') { + error("Bad assignment"); + code_generate(d->right); + return; + } + assign = d->left->value; + code_generate(d->right); + emit_store(assign); + return; + case '>': + code_generate(d->left); + emit_push(); + code_generate(d->right); + emit_compare(); + break; + default: /* calculation */ + code_generate(d->right); + emit_push(); + code_generate(d->left); + switch(d->type) { + case '+': emit_calc(O_ADD); break; + case '-': emit_calc(O_SUB_R); break; + case '/': emit_calc(O_DIV_R); break; + case '*': emit_calc(O_MUL); break; + default: + error("Internal Error, unknown opecode"); + } + return; + } +} + +int +yylex() { + return token(); +} + +int +main() +{ + nodeptr d; + char buf[BUFSIZ]; + + emit_intro(); + while (fgets(buf,BUFSIZ,stdin)) { + ptr = buf; + before = buf; + printf("%s %s",comments,buf); + yyparse(); + } + emit_ending(); + return 0; +} + +void +yyerror(s) +char *s; +{ + error(s?s:"error"); +} + + +/* end */ diff -r 000000000000 -r 6bf66c125dbc test0.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test0.c Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,14 @@ +int variable[64]; + +main() { + print(variable[20]=0x80000001); + print(1+variable[20]); + return 0; +} + +print(i) +int i; +{ + printf("0x%08x = %d\n",i,i); +} + diff -r 000000000000 -r 6bf66c125dbc test0.s --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test0.s Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,43 @@ +.text + .align 2,0x90 +.globl _main +_main: + pushl %ebp + movl %esp,%ebp + movl $-2147483647,_variable+80 + pushl $-2147483647 + call _print + addl $4,%esp + movl _variable+80,%eax + incl %eax + pushl %eax + call _print + addl $4,%esp + xorl %eax,%eax + jmp L1 + .align 2,0x90 +L1: + movl %ebp,%esp + popl %ebp + ret +.cstring +LC0: + .ascii "0x%08x = %d\12\0" +.text + .align 2,0x90 +.globl _print +_print: + pushl %ebp + movl %esp,%ebp + movl 8(%ebp),%edx + pushl %edx + movl 8(%ebp),%edx + pushl %edx + pushl $LC0 + call _printf + addl $12,%esp +L2: + movl %ebp,%esp + popl %ebp + ret +.comm _variable,256 diff -r 000000000000 -r 6bf66c125dbc tmp.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tmp.pl Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,12 @@ + +while(<>) { + s/([\200-\376])(.)/sprintf("\\%o\\%o",ord($1),ord($2))/ego; + s/\033\$.[^\033]*\033\(./&convert($&)/ego; + print; +} + +sub convert { + $tmp = $_[0]; + $tmp=~s/./sprintf("\\%o",ord($&))/ego; + return $tmp; +} diff -r 000000000000 -r 6bf66c125dbc tmptmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tmptmp Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,2 @@ +a=1 +(2+1030/a)-2 diff -r 000000000000 -r 6bf66c125dbc token.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/token.c Fri Nov 05 14:07:59 2004 +0900 @@ -0,0 +1,41 @@ +/* + Very Simple Compiler + Tokenizer Tester + $Id$ + */ + +#include "s-compile.h" + +int +main() +{ + int d; + char buf[BUFSIZ]; + + while (fgets(buf,BUFSIZ,stdin)) { + ptr = buf; + before = buf; + printf("#### %s",buf); + do { + token(); + switch(last_token) { + case '0': + printf("%d\tvalue\n",value); + break; + case 'v': + printf("%c\tvariable\n",value+'a'); + break; + case EOF: + break; + default: + printf("%c\ttoken\n",last_token); + break; + } + } while(last_token!=EOF); + } + return 0; +} + + + +/* end */