Mercurial > hg > CbC > old > device
changeset 430:ba5faa547607 bitfield-reorganize
ARM bitfield done.
author | kono |
---|---|
date | Sun, 31 Oct 2004 00:49:51 +0900 |
parents | 7733da111bd6 |
children | 800a5e3e6a17 |
files | .gdbinit Changes mc-code-arm.c mc-code.h mc-codegen.c |
diffstat | 5 files changed, 41 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/.gdbinit Sat Oct 30 22:25:27 2004 +0900 +++ b/.gdbinit Sun Oct 31 00:49:51 2004 +0900 @@ -1,5 +1,5 @@ tb main -run -s test/bitfield1.c +run -s test/bitfield.c # run -s mc-parse.c # run -s mc-codegen.c # run -s nkf203/nkf.c
--- a/Changes Sat Oct 30 22:25:27 2004 +0900 +++ b/Changes Sun Oct 31 00:49:51 2004 +0900 @@ -6396,3 +6396,8 @@ MIPS の$4,$5,$6,$7 は引数渡しに使われるわけだけど、 6,7にlong long が入るときには、$5 には、$6 と同じ値が入る? いや、bitfield1.c の printf の %lld が %d になっていただけでした。 + +ARM の lreg でregsiter が lost するのを止められない... + +use_input_reg(int reg,int mode) ってやっぱり、おかしいよね。 +
--- a/mc-code-arm.c Sat Oct 30 22:25:27 2004 +0900 +++ b/mc-code-arm.c Sun Oct 31 00:49:51 2004 +0900 @@ -129,7 +129,6 @@ #define LREG_V 3 /* mark for virtual long long/double register */ #define REGS_MAX (REAL_MAX_REGISTER+REAL_MAX_FREGISTER+REAL_MAX_LREGISTER+LREG_V) static int arm_regs[REGS_MAX]; -static int regs_use[REGS_MAX]; static int regv_h0[REAL_MAX_LREGISTER+LREG_V]; static int regv_l0[REAL_MAX_LREGISTER+LREG_V]; #define regv_h(i) regv_h0[(i)-LREG_OFFSET] @@ -187,10 +186,12 @@ #define lregister_name_low(i) reg_name[regv_l(i)] #define lregister_name_high(i) reg_name[regv_h(i)] -char *r(i) { return register_name(i); } -char *f(i) { return fregister_name(i); } -char *ll(i) { return lregister_name_low(i); } -char *lh(i) { return lregister_name_high(i); } +char *rn(i) { return register_name(i); } +char *fn(i) { return fregister_name(i); } +char *lln(i) { return lregister_name_low(i); } +char *lhn(i) { return lregister_name_high(i); } +int ll(i) { return regv_l(i); } +int lh(i) { return regv_h(i); } #define is_int_reg(i) (0<=i&&i<REAL_MAX_REGISTER) #define is_float_reg(i) (arch_mode&UseFPP?(REAL_MAX_REGISTER<=i&&i<REAL_MAX_FREGISTER+REAL_MAX_REGISTER):is_int_reg(i)) @@ -564,7 +565,7 @@ void code_gexpr(int e){ if (is_int_reg(creg) && creg!=ireg) error(-1); - register_usage("code_gexpr"); +// register_usage("code_gexpr"); } @@ -2266,6 +2267,7 @@ free_register(regv_h(lreg)); } if (creg==lreg) creg = ireg; + free_register(lreg); lreg = 0; } else if (regv_h(lreg)==reg) { regs[lreg]=0; @@ -2276,6 +2278,7 @@ free_register(regv_l(lreg)); } if (creg==lreg) creg = ireg; + free_register(lreg); lreg = 0; } } @@ -5867,8 +5870,6 @@ { int sign=0,bitsz; int align,l=0; - *pbitpos = cadr(caddr(type)); - *pbitsize = caddr(caddr(type)); switch(cadr(type)) { /* value type */ case INT: sign=1; break; case UNSIGNED: break; @@ -5897,6 +5898,8 @@ default: error(-1); } } + *pbitpos = cadr(caddr(type)); + *pbitsize = caddr(caddr(type)); *psign = sign; *pbitsz = bitsz; *palign = align; @@ -5964,7 +5967,7 @@ i = l+bitsize; *bfd = (i==bitsz)?0:i; *sz = (i+7)/8; -// printf("# %d: bitpos=%d bitsize=%d bitsz=%d offset=%d\n",lineno,bitpos,bitsize,bitsz,*poffset); + printf("# %d: bitpos=%d bitsize=%d bitsz=%d offset=%d\n",lineno,bitpos,bitsize,bitsz,*poffset); return l; } } @@ -5979,7 +5982,7 @@ *bfd = (bitsize==bitsz)?0:bitsize; *sz = (bitsize+7)/8; -// printf("# %d: bitpos=%d bitsize=%d bitsz=%d offset=%d\n",lineno,bitpos,bitsize,bitsz,*poffset); + printf("# %d: bitpos=%d bitsize=%d bitsz=%d offset=%d\n",lineno,bitpos,bitsize,bitsz,*poffset); return bitpos; } @@ -5990,8 +5993,8 @@ code_bit_field(int type,int adr,int reg) { int sign,bitsz,l,align; - int bitsize,bitpos; - int i,size,adhoc=-1; + int bitsize,bitpos,lvalue; + int i,size; set_bitsz(type,&bitpos,&bitsize,&sign,&bitsz,&align,&l); size = bitsz/8; // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); @@ -6009,6 +6012,8 @@ } else if (l==2) { use_int(adr); use_longlong(reg); + lvalue = get_register(); + code_register(adr,lvalue); adr = lvalue; /* <-----bitsize---------------> @@ -6024,10 +6029,6 @@ (64+32-bitsize -bitpos - (bitsz-bitsize)) = 64+32 -bitsz -bitbpos */ - if (adr==regv_h(reg)||adr==regv_l(reg)) { -// adhoc = get_register(); adhoc=1; -// code_register(adr,adhoc); - } /* load hhhhh */ code_ld(cload(0,0),regv_h(reg),SIZE_OF_INT*2,adr,cext_at(0,0)); /* load mmmmmm */ @@ -6048,11 +6049,11 @@ i = 64-bitsize; loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i)); if (i<0||64<=i) error(-1); - if (adhoc>0) free_register(adhoc); + free_register(adr); } else { use_int(adr); use_int(reg); - code_ld(cload(0,0),reg,SIZE_OF_INT,adr,cext_at(0,0)); + code_ld(cload(0,0),reg,0,adr,cext_at(0,0)); /* shift left */ if ((i=32-bitsize-bitpos)) oprtc(LSHIFT,reg,list2(CONST,i)); @@ -6086,7 +6087,7 @@ int sign,bitsz,l,align,i; int bitsize,bitpos; int mask = 0; - int tmp = -1,lvalue,size; + int tmp = -1,tmp2,lvalue,size; int tmpvar = -1; char *crn,*lrn,*trn; set_bitsz(type,&bitpos,&bitsize,&sign,&bitsz,&align,&l); @@ -6095,6 +6096,8 @@ if (l==1) { use_int(adr); lvalue = get_lregister(); + tmp2 = get_register(); + code_register(adr,tmp2); adr = tmp2; lload(adr,lvalue,0); use_longlong(value); crn = lregister_name_high(value); @@ -6117,9 +6120,12 @@ } code_lassign(adr,value); free_register(lvalue); + free_register(adr); } else if (l==2) { use_int(adr); use_longlong(value); + lvalue = get_register(); + code_register(adr,lvalue); adr = lvalue; tmpvar=new_lvar(SIZE_OF_LONGLONG); code_lassign_lvar(tmpvar,value); trn = register_name(tmp = get_register()); @@ -6155,13 +6161,14 @@ printf("\t%s\t%s, [%s, #4]\n",cstore(0),crn,register_name(adr)); /* make and-mask lower */ - code_ld(cload(0,0),regv_l(value),SIZE_OF_INT*2,adr,cext_at(0,0)); + code_ld(cload(0,0),regv_l(value),8,adr,cext_at(0,0)); if (i<0||64<=i) error(-1); mask = make_mask(bitsz-bitpos-bitsize,31); make_mask_and_or(mask,tmp,trn,lrn,crn); inc_inst(1); printf("\t%s\t%s, [%s, #8]\n",cstore(0),lrn,register_name(adr)); free_lvar(tmpvar); + free_register(adr); } else { use_int(adr); use_int(value); @@ -6257,6 +6264,8 @@ mask = make_mask(bitpos+bitsize>=32?0:32-bitpos-bitsize,31-bitpos); make_mask_and_or_const(mask,crn,(int)lc); } + code_lassign(adr,lvalue); + free_register(adr); free_register(lvalue); } else if (l==2) { /* @@ -6280,7 +6289,7 @@ inc_inst(1); printf("\t%s\t%s, [%s, #4]\n",cstore(0),trn,crn); /* make and-mask lower */ - code_ld(cload(0,0),tmp,SIZE_OF_INT*2,adr,cext_at(0,0)); + code_ld(cload(0,0),tmp,8,adr,cext_at(0,0)); mask = make_mask(bitsz-bitpos-bitsize,31); make_mask_and_or_const(mask,trn,(int)(lc>>(64-bitpos))); inc_inst(1); @@ -6290,7 +6299,7 @@ } else { use_int(adr); lvalue = get_register(); - code_ld(cload(size,sign),lvalue,SIZE_OF_INT*2,adr,cext_at(0,0)); + code_ld(cload(size,sign),lvalue,0,adr,cext_at(0,0)); crn = register_name(lvalue); /* shift left */ c = cadr(value);
--- a/mc-code.h Sat Oct 30 22:25:27 2004 +0900 +++ b/mc-code.h Sun Oct 31 00:49:51 2004 +0900 @@ -235,9 +235,9 @@ extern void code_alloca(int e,int reg); extern void code_arg_register(NMTBL *fnptr); -extern int get_register(void); -extern int get_dregister(int); -extern int get_lregister(void); +extern int get_register(); +extern int get_dregister(); +extern int get_lregister(); extern void free_register(int i) ; extern int pop_register(void); extern void emit_pop_free(int xreg);
--- a/mc-codegen.c Sat Oct 30 22:25:27 2004 +0900 +++ b/mc-codegen.c Sun Oct 31 00:49:51 2004 +0900 @@ -3835,7 +3835,7 @@ } else error(-1); } - r = get_register(); // some ptr cache may remove by this + r = get_register(0); // some ptr cache may remove by this caddr(p = cadr(ptr_cache_last)) = r; car(p) = g; use_ptr_cache(r);