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);