Mercurial > hg > CbC > old > device
changeset 122:b884271bcab2 long-argument
input registers (long arguments )
author | kono |
---|---|
date | Mon, 24 Mar 2003 01:28:02 +0900 |
parents | 00df510bc116 |
children | 5f180dc8d84e |
files | Makefile mc-code-powerpc.c test/basic.c |
diffstat | 3 files changed, 26 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile Sun Mar 23 23:10:48 2003 +0900 +++ b/Makefile Mon Mar 24 01:28:02 2003 +0900 @@ -47,7 +47,7 @@ make check TARGET=test/tmp8 make check TARGET=test/tmp9 -check: +check: $(MC) -gcc $(TARGET).c -o b.out -b.out > $(TARGET).gcc.out -$(MC) -s $(TARGET).c
--- a/mc-code-powerpc.c Sun Mar 23 23:10:48 2003 +0900 +++ b/mc-code-powerpc.c Mon Mar 24 01:28:02 2003 +0900 @@ -53,14 +53,14 @@ #define RET_FREGISTER 1 int MAX_REGISTER=30; /* PowerPCのレジスタを10個まで使う*/ -int MAX_FREGISTER=30; +int MAX_FREGISTER=31; #define REAL_MAX_REGISTER 32 /* PowerPCのレジスタが32ということ*/ #define REAL_MAX_FREGISTER 32 /* PowerPCのレジスタが32ということ*/ -int MAX_INPUT_REGISTER_VAR = 10-MIN_TMP_REG; -int MAX_CODE_INPUT_REGISTER_VAR = 10-MIN_TMP_REG; -int MAX_INPUT_DREGISTER_VAR = 13-MIN_TMP_FREG; -int MAX_CODE_INPUT_DREGISTER_VAR = 13-MIN_TMP_FREG; +int MAX_INPUT_REGISTER_VAR = 11-MIN_TMP_REG; +int MAX_CODE_INPUT_REGISTER_VAR = 11-MIN_TMP_REG; +int MAX_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG; +int MAX_CODE_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG; #define CREG_REGISTER MAX_TMP_REG #define FREG_FREGISTER MAX_TMP_FREG @@ -146,13 +146,13 @@ <------r1_offset------------------------------> <------------lvar_offset-------> r+ +------------+---+---------------+----------+--------------+----+ - - caller arg xx register save local callee arg xx + callee arg xx register save local caller arg xx reg_save disp max_func_args*size_of_int lvar>0 lvar<0 lvar>0x1000 0000 */ -int arg_offset = 44; int arg_offset1 = 24; int disp_offset = -12; -#define r1_offset 60 -#define func_disp_offset (r1_offset-12) +int arg_offset = 24; int arg_offset1 = 24; int disp_offset = -12; +#define func_disp_offset 60 +#define r1_offset func_disp_offset+12 int code_disp_offset = 0; int jump_offset = 0; #define CODE_LVAR l+code_disp_offset #define FUNC_LVAR l+disp_offset @@ -171,9 +171,9 @@ l = ARG_LVAR_OFFSET; printf("# offset call0\t%d\n",CALLER_ARG); l = ARG_LVAR_OFFSET+max_func_args*size_of_int; -printf("# offset calln\t%d\n",CALLER_ARG); +printf("# offset calln\t%d %d\n",CALLER_ARG,max_func_args*size_of_int); l = disp; -printf("# offset lvarn\t%d\n",FUNC_LVAR+lvar_offsetv); +printf("# offset lvarn\t%d %d\n",FUNC_LVAR+lvar_offsetv,disp); l = 0; printf("# offset lvar0\t%d\n",FUNC_LVAR+lvar_offsetv); l = -reg_save; @@ -182,7 +182,7 @@ l = 0; printf("# offset carg0\t%d\n",CALLEE_ARG+r1_offsetv); l = my_func_args; -printf("# offset cargn\t%d\n",CALLEE_ARG+r1_offsetv); +printf("# offset cargn\t%d %d\n",CALLEE_ARG+r1_offsetv,my_func_args); } @@ -487,8 +487,8 @@ regs[REG_VAR_BASE-i]=USING_REG; /* そのレジスタを使うことを宣言し */ regv[REG_VAR_BASE-i]=0; if (i>max_reg_var) max_reg_var=i; - /* その場所を表す番号を返す */ - return list3(REGISTER,REG_VAR_BASE-i,(int)n); + /* その場所を表す番号を返す */ + return list3(REGISTER,REG_VAR_BASE-i,(int)n); } } return list2(LVAR,new_lvar(size_of_int)); @@ -508,7 +508,8 @@ regs[FREG_VAR_BASE-i]=USING_REG; /*そのレジスタを使うことを宣言し*/ regv[FREG_VAR_BASE-i]=0; if (i>max_freg_var) max_freg_var=i; - return list3(DREGISTER,i,(int)n); /* その場所を表す番号を返す */ + /* その場所を表す番号を返す */ + return list3(DREGISTER,FREG_VAR_BASE-i,(int)n); } } return list2(LVAR,new_lvar(size_of_double)); @@ -1246,8 +1247,10 @@ if(t==FLOAT) { offset+=size_of_float; reg_offset+=1; } else if(t==DOUBLE) { offset+=size_of_double; reg_offset+=2; } else error(-1); - } else + } else { + offset += size(n->ty); continue; + } n->sc = LVAR; lvar = list2(LVAR,n->dsp); g_expr_u(assign_expr0(list2(LVAR,n->dsp),list3(tag,reg,(int)n),n->ty,t)); @@ -1312,7 +1315,7 @@ t=caddr(e3); e4 = car(e3); if(scalar(t)) { - if (reg_arg>MAX_INPUT_REGISTER_VAR) { + if (reg_arg>=MAX_INPUT_REGISTER_VAR) { arg = list2(LVAR,caller_arg_offset_v(nargs)); } else if (!simple_args(e3) && cadr(e3)) { arg = get_register_var(0); @@ -1328,7 +1331,7 @@ nargs ++ ; reg_arg++; continue; } else if (t==DOUBLE||t==FLOAT) { - if (reg_arg<MAX_INPUT_REGISTER_VAR+1) { + if (reg_arg<MAX_INPUT_REGISTER_VAR) { /* sigh... printf requies floating value in integer registers */ @@ -1355,7 +1358,7 @@ INT,INT), arg_assign); reg_arg += 2; } - if (freg_arg>=4 && freg_arg<=MAX_INPUT_DREGISTER_VAR) { + if (freg_arg>=4 && freg_arg<MAX_INPUT_DREGISTER_VAR) { /* oh my god! it requies integer register and floating register and stack value. You are crazy. @@ -1365,7 +1368,7 @@ get_input_fregister_var(freg_arg,0),t,t), arg_assign); } - if (freg_arg>MAX_INPUT_DREGISTER_VAR) { + if (freg_arg>=MAX_INPUT_DREGISTER_VAR) { arg = list2(LVAR,caller_arg_offset_v(nargs)); } else if (!simple_args(e3)) { arg = get_fregister_var(0); @@ -1379,7 +1382,7 @@ reg_arg_list = list2(arg,reg_arg_list); g_expr_u(assign_expr0(arg,e4,t,t)); /* XXX */ freg_arg++; - nargs += size_of_double/size_of_int; + nargs += size(t)/size_of_int; continue; } else if (car(t)==STRUCT||car(t)==UNION) { arg = list2(LVAR,caller_arg_offset_v(nargs));