Mercurial > hg > CbC > old > device
changeset 93:8f5d61239b93
*** empty log message ***
author | kono |
---|---|
date | Sun, 09 Mar 2003 18:31:00 +0900 |
parents | e7f8515ba882 |
children | 1ad7045741a7 |
files | Changes Makefile mc-code-ia32.c mc-code-powerpc.c mc-code.h |
diffstat | 5 files changed, 135 insertions(+), 112 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Fri Mar 07 06:10:41 2003 +0900 +++ b/Changes Sun Mar 09 18:31:00 2003 +0900 @@ -2016,3 +2016,53 @@ label があると、code_base cache はclearしないといけない。 それを判断するには fwddef をhookする必要があるけど。 + +Fri Mar 7 09:17:10 JST 2003 + +問題は、 + register allocation +と + function call/goto call +の構成だな。goto の方は machine dependentなところは +ほとんどない。register のsaveさえ必要ないから。 + +register allocation だけど。 + r0 + r1 frame pointer (or stack pointer ) + r30 jj + r31 relocation register + r0,r1,r2 システムで使う + r0-r10 引数 + 引数でないところは優先的に使う + r20-r29 セーブして使う領域 + +r10-r19 はどうなんだろう? セーブしないのか? + +ia32 の方でもfppのスタックを関数呼び出しのときに吐き出した方が +良い。 + +r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 +r10 r11 r12 r13 r14 r15 r16 +r28 r29 r30 r31 + +なので、もののみごとに、17-27 までが使われてないね。 + +ということは、関す呼出し時には、保存されるレジスタはないと +思った方が良いってこと? あるいは、r17-r28 は保存されると +思って良いのかな。 + +Sat Mar 8 19:28:42 JST 2003 + +関数呼び出し時のレジスタセーブを避けるためには、関数呼び出し +を優先して実行してやれば良い。関数呼び出しの結果は局所変数に +セーブする。 + f(g(h(a)+1)+2) +は、 + a1=h(a) + a2=g(a1+1) + f(a1+2) +となる。そうすれば、関数呼び出しのときのスタックはかならず0になる。 + +でも、結局、引数は関数呼び出しの前にセーブするのね。だったら、 +そんなことしないで、セーブすれば良いのか。 +
--- a/Makefile Fri Mar 07 06:10:41 2003 +0900 +++ b/Makefile Sun Mar 09 18:31:00 2003 +0900 @@ -8,10 +8,13 @@ CONVERTER=conv/c.o conv/null.o # conv/c2cbc.o conv/cbc2c.o +# CODE=mc-code-ia32.o +CODE=mc-code-powerpc.o + all: mc -mc : mc-parse.o mc-codegen.o mc-code-ia32.o mc-tree.o $(CONVERTER) - $(CC) -g mc-parse.o mc-codegen.o mc-code-ia32.o \ +mc : mc-parse.o mc-codegen.o $(CODE) mc-tree.o $(CONVERTER) + $(CC) -g mc-parse.o mc-codegen.o $(CODE) \ mc-tree.o $(CONVERTER) -o $@ conv/conv.h: conv_func.tbl conv_func.pl @@ -29,7 +32,8 @@ makedepend mc-code-ia32.c mc-code.h mc-codegen.c mc-codegen.h \ mc-parse.c mc-tree.c mc.h \ conv/c.c conv/c.h conv/c2cbc.c conv/c2cbc.h conv/cbc2c.c \ - conv/cbc2c.h conv/conv.h conv/convdef.h conv/null.c conv/null.h + conv/cbc2c.h conv/conv.h conv/convdef.h conv/null.c conv/null.h \ + mc-code-powerpc.c clean : -rm -f *.bak *.s *.o *.cc mc mc1 a.out *~ core* */*.o *.bak test/*.s test/*.cc test/*.o test/*.bak test/*~ conv/*.s conv/*.cc conv/*.o conv/*.bak conv/*~ @@ -56,52 +60,57 @@ mc-code-ia32.o: /usr/include/machine/types.h /usr/include/ppc/types.h mc-code-ia32.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h mc-code-ia32.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h -mc-code-ia32.o: conv/conv.h conv/c.h mc-codegen.h +mc-code-ia32.o: conv/conv.h mc-codegen.h mc-codegen.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h mc-codegen.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h mc-codegen.o: /usr/include/machine/types.h /usr/include/ppc/types.h mc-codegen.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h mc-codegen.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h -mc-codegen.o: conv/conv.h conv/c.h mc-codegen.h mc-code.h +mc-codegen.o: conv/conv.h mc-codegen.h mc-code.h mc-parse.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h mc-parse.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h mc-parse.o: /usr/include/machine/types.h /usr/include/ppc/types.h mc-parse.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h mc-parse.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h -mc-parse.o: conv/conv.h conv/c.h mc-codegen.h +mc-parse.o: conv/conv.h mc-codegen.h mc-tree.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h mc-tree.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h mc-tree.o: /usr/include/machine/types.h /usr/include/ppc/types.h mc-tree.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h mc-tree.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h -mc-tree.o: conv/conv.h conv/c.h +mc-tree.o: conv/conv.h mc.o: /usr/include/stdio.h /usr/include/sys/types.h mc.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h mc.o: /usr/include/machine/types.h /usr/include/ppc/types.h mc.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h mc.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h conv/conv.h -mc.o: conv/c.h conv/c.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h conv/c.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h conv/c.o: /usr/include/machine/types.h /usr/include/ppc/types.h conv/c.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h conv/c.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h conv/conv.h -conv/c.o: conv/c.h conv/convdef.h +conv/c.o: conv/convdef.h conv/c.h conv/c2cbc.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h conv/c2cbc.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h conv/c2cbc.o: /usr/include/machine/types.h /usr/include/ppc/types.h conv/c2cbc.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h conv/c2cbc.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h -conv/c2cbc.o: conv/conv.h conv/c.h +conv/c2cbc.o: conv/conv.h conv/cbc2c.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h conv/cbc2c.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h conv/cbc2c.o: /usr/include/machine/types.h /usr/include/ppc/types.h conv/cbc2c.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h conv/cbc2c.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h -conv/cbc2c.o: conv/conv.h conv/c.h +conv/cbc2c.o: conv/conv.h conv/null.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h conv/null.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h conv/null.o: /usr/include/machine/types.h /usr/include/ppc/types.h conv/null.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h conv/null.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h -conv/null.o: conv/conv.h conv/c.h +conv/null.o: conv/conv.h conv/convdef.h conv/null.h +mc-code-powerpc.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h +mc-code-powerpc.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +mc-code-powerpc.o: /usr/include/machine/types.h /usr/include/ppc/types.h +mc-code-powerpc.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +mc-code-powerpc.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +mc-code-powerpc.o: conv/conv.h mc-codegen.h
--- a/mc-code-ia32.c Fri Mar 07 06:10:41 2003 +0900 +++ b/mc-code-ia32.c Sun Mar 09 18:31:00 2003 +0900 @@ -4,6 +4,7 @@ #define EXTERN extern #include "mc.h" #include "mc-codegen.h" +#include "mc-code.h" #define TEXT_EMIT_MODE 0 #define DATA_EMIT_MODE 1 @@ -67,43 +68,18 @@ static char *reg_name_l[4]; static char *reg_name_w[4]; -void use_register(int virt, int real, int move); -void code_preinc(int e1,int e2) ; -void code_cmp_register(int e2) ; -void code_assign_gvar(int e2,int byte) ; -void tosop(int op,int oreg); -void edx_cleanup(); -void shift(char *op, int reg); -void ld_indexx(int byte, int n, int xreg); -void jmp(int l); -void local_table(void); -void text_mode(void); -void data_mode(char *name); - -char *register_name(int i,int byte); -int register_var(int r); -int get_register_var(void); -void emit_push(void); -int emit_pop(int type); -void code_crlvar(int e2); -void code_preinc(int e1,int e2); -void code_postinc(int e1,int e2); -void code_bool(int e1); -void string(int e1); -void emit_copy(int from,int to,int length,int offset,int value,int det); -int struct_push(int e4,int t); -void function(int e1); -void code_assop(int op,int byte); -int edx_setup(); -void code_opening(char *filename); -void code_closing(); -void code_leave(char *name); -int lvar(int l); -void global_table(void); -int virtual(int real); -char * fload(int d); -int code_d1(double d); -int code_d2(double d); +static void use_register(int virt, int real, int move); +static void use_register_var(int i); +static int virtual(int real); +static void shift(char *op, int reg); +static void ld_indexx(int byte, int n, int xreg); +static void data_mode(char *name); +static int edx_setup(); +static void edx_cleanup(); +static void local_table(void); +static char * fload(int d); +static int code_d1(double d); +static int code_d2(double d); void code_init(void)
--- a/mc-code-powerpc.c Fri Mar 07 06:10:41 2003 +0900 +++ b/mc-code-powerpc.c Sun Mar 09 18:31:00 2003 +0900 @@ -3,12 +3,21 @@ #define EXTERN extern #include "mc.h" +#include "mc-code.h" #include "mc-codegen.h" #define TEXT_EMIT_MODE 0 #define DATA_EMIT_MODE 1 #define RODATA_EMIT_MODE 2 +static void data_mode(char *name); +static void init_ptr_cache(); +static void ld_indexx(int byte, int n, int xreg); +static void local_table(void); +static void shift(char *op, int reg); +static void use_register(int virt, int real, int move); +static void use_register_var(int i); + static int output_mode = TEXT_EMIT_MODE; static int data_alignment = 0; @@ -80,46 +89,6 @@ "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7" }; -void use_register(int virt, int real, int move); -void code_preinc(int e1,int e2) ; -void code_cmp_register(int e2) ; -void code_assign_gvar(int e2,int byte) ; -void tosop(int op,int oreg); -void edx_cleanup(); -void shift(char *op, int reg); -void ld_indexx(int byte, int n, int xreg); -void jmp(int l); -void local_table(void); -void text_mode(void); -void data_mode(char *name); -int init_ptr_cache(); - -char *register_name(int i,int byte); -int register_var(int r); -int get_register_var(void); -void emit_push(void); -int emit_pop(int type); -void code_crlvar(int e2); -void code_preinc(int e1,int e2); -void code_postinc(int e1,int e2); -void code_bool(int e1); -void string(int e1); -void emit_copy(int from,int to,int length,int offset,int value,int det); -int struct_push(int e4,int t); -void function(int e1); -void code_assop(int op,int byte); -int edx_setup(); -void code_opening(char *filename); -void code_closing(); -void code_leave(char *name); -int lvar(int l); -void global_table(void); - -char * fstore(int d); -char * fload(int d); -int code_d1(double d); -int code_d2(double d); - void code_init(void) { @@ -156,6 +125,27 @@ return -1; /* 空いている場所がないなら、それを表す -1 を返す */ } +int +pop_register(void) +{ /* レジスタから値を取り出す */ + return reg_stack[--reg_sp]; +} + +int +stack_used(void) { + return reg_stack[--reg_sp]<0; +} + +void +emit_pop_free(int xreg) +{ + if (xreg==dreg) { + regv[dreg]=0; + } else if (xreg!=-1) { + free_register(xreg); + } +} + void free_register(int i) { /* いらなくなったレジスタを開放 */ regv[i]=regs[i]=0; @@ -229,7 +219,7 @@ int i; if (chk) return; printf("# %d: %s:",lineno,s); - printf(" creg=%s dreg=%s ",register_name(creg,0),register_name(dreg,0)); + printf(" creg=%s dreg=%s ",register_name(creg),register_name(dreg)); for(i=0;i<MAX_REGISTER;i++) { printf("%d",regs[i]); } @@ -238,7 +228,7 @@ printf("%d",regv[i]); } #if 0 - printf(" regs_stack",register_name(creg,0),register_name(dreg,0)); + printf(" regs_stack",register_name(creg),register_name(dreg)); for(i=reg_sp;i>=0;i--) { if(reg_stack[i]>=0) printf(" %s",register_name(reg_stack[i],0)); @@ -280,11 +270,11 @@ { int i; for(i=0;i<MAX_REGISTGER_VAR;i++) { - if (REG_VAR_Base-i<=REG_ARG_MAX) + if (REG_VAR_BASE-i<=REG_ARG_MAX) return -1; - if (! regs[REG_VAR_Base-i]) { /* 使われていないなら */ - regs[REG_VAR_Base-i]=1; /* そのレジスタを使うことを宣言し */ - regv[REG_VAR_Base-i]=0; + if (! regs[REG_VAR_BASE-i]) { /* 使われていないなら */ + regs[REG_VAR_BASE-i]=1; /* そのレジスタを使うことを宣言し */ + regv[REG_VAR_BASE-i]=0; return i; /* その場所を表す番号を返す */ } } @@ -310,15 +300,15 @@ } int -emit_pop() +emit_pop(int type) { int xreg; if ((xreg=pop_register())==-1) { xreg=get_register(); if(!xreg) error(-1); - printf("\tlwz %s,(%s)\n",register_name(xreg),register_name(reg_sp); + printf("\tlwz %s,(%s)\n",register_name(xreg),register_name(reg_sp)); printf("\taddis %s,%s,%d\n", - register_name(reg_sp),register_name(reg_sp),size_of_int; + register_name(reg_sp),register_name(reg_sp),size_of_int); regv[xreg]=1; } return xreg; @@ -330,7 +320,7 @@ int ptr_cache=0; -int +void init_ptr_cache() { int i; @@ -372,7 +362,7 @@ cadr(p) = ptr_cache; /* connect current queue to the last one */ ptr_cache = p; /* now the last one is the top */ if (!caddr(p)) { - if((r=get_register())) { + if((r=get_register())) caddr(p)=r; else r=creg; @@ -464,7 +454,7 @@ void code_neg() { - printf("\tneg %s,%s\n", register_name(creg), register_name(creg); + printf("\tneg %s,%s\n", register_name(creg), register_name(creg)); } @@ -865,8 +855,8 @@ printf("\tstwu %s,%d(%s)\n",drn,-size_of_int,srn); } } - printf("\taddis %s,%s,ha16(%d)\n",srn,,srn,length); - printf("\taddi %s,%s,lo16(%d)\n",srn,,srn,length); + printf("\taddis %s,%s,ha16(%d)\n",srn,srn,length); + printf("\taddi %s,%s,lo16(%d)\n",srn,srn,length); /* downward direction copy */ printf("\tmr %s,%s\n",drn,srn); emit_copy(creg,dreg,length,0,0,1); @@ -955,7 +945,7 @@ void code_frame_pointer(int e3) { - printf("\tmovl %s,r1\n",register_name(e3,0)); + printf("\tmovl %s,r1\n",register_name(e3)); } @@ -964,7 +954,6 @@ printf("\tla r1,%d(r1)\n",disp_offset); } - void code_jmp(char *s) { printf("\tb L_%s$stub\n",s); @@ -1058,9 +1047,9 @@ char *xrn,*crn,*drn; int xreg; int edx = get_register(); if(!edx) error(-1); - xrn = register_name(xreg = emit_pop(0),0); /* pop e3 value */ + xrn = register_name(xreg = emit_pop(0)); /* pop e3 value */ regv[xreg]=regs[xreg]=1; - printf("\tmovl %s,%s # assop \n",register_name(creg),register_name(edx,0)); + printf("\tmovl %s,%s # assop \n",register_name(creg),register_name(edx)); regv[edx]=1; ld_indexx(byte,0,edx); tosop(op,xreg); @@ -1094,7 +1083,7 @@ shift("sraw",oreg); return; } - orn = register_name(oreg,0); + orn = register_name(oreg); crn = register_name(creg); switch(op) { case ADD: @@ -1148,8 +1137,8 @@ void shift(char *op, int reg) { - char *crn = register_name(creg)); - char *rrn = register_name(reg)); + char *crn = register_name(creg); + char *rrn = register_name(reg); printf("\t%s %s,%s,%s\n",op,crn,rrn,crn); } @@ -1563,7 +1552,7 @@ { char *frn = register_name(freg); disp-=size_of_double; - printf("\tfctiwz %s,%s\n",); + printf("\tfctiwz %s,%s\n",frn,frn); printf("\tstfd %s,%d(r1)\n",disp); printf("\tlwz %s,%d(r1)\n",crn,disp+size_of_double-size_of_int); fregs[freg]=0;