Mercurial > hg > CbC > old > device
changeset 761:684dcbd0e170
i64 basic
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 17 Nov 2010 12:16:08 +0900 |
parents | ac471ccd1cc8 |
children | 236d49777503 |
files | .gdbinit mc-code-i64.c |
diffstat | 2 files changed, 25 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/.gdbinit Wed Nov 17 11:34:55 2010 +0900 +++ b/.gdbinit Wed Nov 17 12:16:08 2010 +0900 @@ -18,10 +18,10 @@ # r -s test/call.c # r -s test/static.c # r -s test/tmpa.c -r -s test/code-gen-all.c +# r -s test/code-gen-all.c # r -s mc-code-powerpc.c # r -s test/macro.c -# r -s test/basic.c +r -s test/basic.c # r -s test/strinit.c # r -s test/arg.c # r -s -DINLINE=inline test/strinit.c
--- a/mc-code-i64.c Wed Nov 17 11:34:55 2010 +0900 +++ b/mc-code-i64.c Wed Nov 17 12:16:08 2010 +0900 @@ -272,9 +272,9 @@ int MAX_INPUT_REGISTER_VAR = 6; int MAX_CODE_INPUT_REGISTER_VAR = 6; -int MAX_INPUT_DREGISTER_VAR = 6; +int MAX_INPUT_DREGISTER_VAR = 8; // static int MAX_INPUT_FREGISTER_VAR = 0; -int MAX_CODE_INPUT_DREGISTER_VAR = 6; +int MAX_CODE_INPUT_DREGISTER_VAR = 8; static int reg_sp; /* REGister Stack-Pointer */ static int reg_stack[MAX_MAX]; /* 実際のレジスタの領域 */ @@ -515,7 +515,7 @@ #define code_disp_offset (16) #define arg_offset (16) -#define arg_offset1 (-48) +#define arg_offset1 (0) #define ARG_LVAR_OFFSET 0x10000000 #define code_disp_offset0 (-16) @@ -969,7 +969,7 @@ if(!(i<MAX_INPUT_DREGISTER_VAR)) return 0; i = FREG_OFFSET+i; } - return list3n(FREGISTER,i,nptr); + return list3n(d?DREGISTER:FREGISTER,i,nptr); } int @@ -1186,7 +1186,7 @@ } } else if (type==FLOAT) { if ((reg = get_input_dregister_var(freg_var,n,is_code0,0))) { - n->sc = DREGISTER; + n->sc = FREGISTER; n->dsp = cadr(reg); regs[n->dsp]= INPUT_REG; freg_var++; @@ -2040,6 +2040,8 @@ static int get_input_arg(int t,int mode,int nargs,int reg_arg,int freg_arg) { + int arg = nargs - (reg_arg>MAX_INPUT_REGISTER_VAR?MAX_INPUT_REGISTER_VAR:reg_arg)*2 + - (freg_arg>MAX_INPUT_DREGISTER_VAR?MAX_INPUT_DREGISTER_VAR:freg_arg)*2 ; t = type_value(t); if (t>=0&&(car(t)==BIT_FIELD)) { t = type_value(cadr(t)); @@ -2048,35 +2050,35 @@ if (mode==AS_SAVE) { return get_register_var(0); } else if (reg_arg>=MAX_INPUT_REGISTER_VAR) { - return list3n(LVAR,caller_arg_offset_v(nargs),0); + return list3n(LVAR,caller_arg_offset_v(arg),0); } else return get_input_register_var(reg_arg,0,0); } else if (t==LONGLONG||t==ULONGLONG) { if (mode==AS_SAVE) { return get_lregister_var(0); } else if (reg_arg>=MAX_INPUT_REGISTER_VAR) { - return list3n(LVAR,caller_arg_offset_v(nargs),0); + return list3n(LVAR,caller_arg_offset_v(arg),0); } else return get_input_lregister_var(reg_arg,0,0); } else if (t==FLOAT) { if (mode==AS_SAVE) { return get_dregister_var(0,0); } else if (freg_arg>=MAX_INPUT_DREGISTER_VAR) { - return list3n(LVAR,caller_arg_offset_v(nargs),0); + return list3n(LVAR,caller_arg_offset_v(arg),0); } else return get_input_dregister_var(freg_arg,0,0,0); } else if (t==DOUBLE) { if (mode==AS_SAVE) { return get_dregister_var(0,1); } else if (freg_arg>=MAX_INPUT_DREGISTER_VAR) { - return list3n(LVAR,caller_arg_offset_v(nargs),0); + return list3n(LVAR,caller_arg_offset_v(arg),0); } else return get_input_dregister_var(freg_arg,0,0,1); } else if (t>=0&&(car(t)==STRUCT||car(t)==UNION)) { if (mode==AS_SAVE) { return get_register_var(0); } else - return list3n(LVAR,caller_arg_offset_v(nargs),0); + return list3n(LVAR,caller_arg_offset_v(arg),0); } else { error(-1); return get_register_var(0); @@ -2272,7 +2274,7 @@ g_expr_u(assign_expr0(arg,e4,t,t)); } else if (t==DOUBLE||t==FLOAT) { reg_arg_list = list2(arg,reg_arg_list); - if (car(arg)==DREGISTER) { + if (car(arg)==DREGISTER||car(arg)==FREGISTER) { use_input_reg(cadr(arg),1); /* protect from input register free */ max_freg ++; } @@ -3562,7 +3564,7 @@ } static int -code_dload_1(int d); +code_dload_1(int d, int reg); static double d0 = 1.0; @@ -3587,11 +3589,11 @@ { int lb; double value = dcadr(e2); + use_float(d,freg); if (value==1.0) { - set_freg(code_dload_1(d),0); + code_dload_1(d,freg); return; } - use_float(d,freg); if (value==0.0) { char *f = fregister_name(freg); if (d) { @@ -3890,9 +3892,9 @@ } static int -code_dload_1(int d) +code_dload_1(int d, int g) { - int r,g; + int r; char *drn,*grn; NMTBL *one; // load 1 @@ -3905,7 +3907,7 @@ } r = get_ptr_cache(one); drn=register_name(r,0); - grn=fregister_name(g=get_dregister(d)); + grn=fregister_name(g); printf("\tmovs%s 0(%s),%s\n",d?"d":"s",drn,grn); return g; } @@ -3918,7 +3920,7 @@ if (car(e2)==DREGISTER||car(e2)==FREGISTER) { crn=fregister_name(cadr(e2)); - grn = fregister_name(g = code_dload_1(d)); + grn = fregister_name(g = code_dload_1(d,get_dregister(d))); if (reg==USE_CREG) { reg=get_dregister(d); if (!reg) error(-1); set_freg(reg,0); @@ -3936,7 +3938,7 @@ set_freg(reg,0); } frn=fregister_name(reg); - grn = fregister_name(g = code_dload_1(d)); + grn = fregister_name(g = code_dload_1(d,get_dregister(d))); printf("\t%s %s,0(%s)\n",fload(d),frn,crn); printf("\t%s %s,%s\n",ops,grn,frn); printf("\t%s %s,0(%s)\n",fstore(d),frn,crn); @@ -3952,7 +3954,7 @@ if (car(e2)==DREGISTER||car(e2)==FREGISTER) { crn=fregister_name(cadr(e2)); - grn = fregister_name(g = code_dload_1(d)); + grn = fregister_name(g = code_dload_1(d,get_dregister(d))); if (reg==USE_CREG) { reg=get_dregister(d); if (!reg) error(-1); set_freg(reg,0); @@ -3970,7 +3972,7 @@ set_freg(reg,0); } frn=fregister_name(reg); - grn = fregister_name(g = code_dload_1(d)); + grn = fregister_name(g = code_dload_1(d,get_dregister(d))); printf("\t%s %s,0(%s)\n",fload(d),frn,crn); printf("\t%s %s,%s\n",ops,grn,frn); printf("\t%s %s,0(%s)\n",fstore(d),grn,crn);