changeset 337:694cdf15c5bd

MIPS bit-field done.
author kono
date Fri, 25 Jun 2004 05:37:09 +0900
parents d488b72254fb
children 7fe7ce0a791f
files Changes mc-code-mips.c test/bitfield1.c
diffstat 3 files changed, 57 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Fri Jun 25 03:56:48 2004 +0900
+++ b/Changes	Fri Jun 25 05:37:09 2004 +0900
@@ -5144,3 +5144,5 @@
 Union は、間違ってました。
 
 bit field はできました。
+
+なんか MIPS のgccは、bit field にバグあるみたいだね。
--- a/mc-code-mips.c	Fri Jun 25 03:56:48 2004 +0900
+++ b/mc-code-mips.c	Fri Jun 25 05:37:09 2004 +0900
@@ -5432,8 +5432,8 @@
     case UCHAR: 		bitsz= 8; align=1;break; 
     case SHORT:         sign=1; bitsz=16; align=2;break; 
     case USHORT:        sign=1; bitsz=16; align=2;break; 
-    case LONGLONG:      sign=1; bitsz=64; align=4;l=1; break; 
-    case ULONGLONG:            	bitsz=64; align=4;l=1; break; 
+    case LONGLONG:      sign=1; bitsz=64; align=8;l=1; break; 
+    case ULONGLONG:            	bitsz=64; align=8;l=1; break; 
     default: error(-1);
     }
     *psign = sign;
@@ -5508,18 +5508,18 @@
     if (l==1) {
 	use_longlong(reg);
 	/* shift left */
-	if (bitpos) 
-	    loprtc(LLSHIFT,reg,list2(CONST,bitpos));
+	if ((i=bitsz-bitsize-bitpos)) 
+	    loprtc(LLSHIFT,reg,list2(CONST,i));
 	/* shift right */
 	if ((i=bitsz-bitsize)) 
 	    loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i));
     } else {
 	use_int(reg);
 	/* shift left */
-	if ((i=bitpos+(32-bitsz))) 
+	if ((i=32-bitsize-bitpos)) 
 	    oprtc(LSHIFT,reg,list2(CONST,i));
 	/* shift right */
-	if ((i=bitsz-bitsize+(32-bitsz))) 
+	if ((i=32-bitsize)) 
 	    oprtc(sign?RSHIFT:URSHIFT,reg,list2(CONST,i));
     }
 }
@@ -5548,12 +5548,15 @@
     int bitsize = cadddr(type);
     int mask = 0;
     int tmp = -1;
+#if 0
     int i;
+#endif
     char *crn,*lrn,*trn;
     set_bitsz(type,&sign,&bitsz,&align,&l);
 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
     if (l) {
 	use_longlong(value);
+#if 0
 	crn = lregister_name_low(value);
 	lrn = lregister_name_low(lvalue);
 	/* shift left */
@@ -5572,16 +5575,44 @@
 	    mask = make_mask(bitpos,bitpos+bitsize>=32?31:bitpos+bitsize-1);
 	    make_mask_and_or(mask,tmp,trn,crn,lrn);
 	}
+#else
+	crn = lregister_name_high(value);
+	lrn = lregister_name_high(lvalue);
+	/* shift left */
+	if (bitpos) 
+	    loprtc(LLSHIFT,value,list2(CONST,bitpos));
+	trn = register_name(tmp = get_register());
+	if (bitpos+bitsize>=32) {
+	    /* make and-mask upper */
+	    mask = make_mask(64-bitpos-bitsize,bitpos>=32?63-bitpos:31);
+	    make_mask_and_or(mask,tmp,trn,crn,lrn);
+	}
+	crn = lregister_name_low(value);
+	lrn = lregister_name_low(lvalue);
+	if (bitpos<32) {
+	    /* make and-mask lower */
+	    mask = make_mask(bitpos+bitsize>=32?0:32-bitpos-bitsize,31-bitpos);
+	    make_mask_and_or(mask,tmp,trn,crn,lrn);
+	}
+#endif
     } else {
 	use_int(value);
 	crn = register_name(value);
 	lrn = register_name(lvalue);
 	/* shift left */
+#if 0
 	if ((i=bitsz-bitsize-bitpos)) 
 	    oprtc(LSHIFT,value,list2(CONST,i));
 	trn = register_name(tmp = get_register());
 	/* make and-mask */
 	mask = make_mask(bitpos+(32-bitsz),bitpos+bitsize-1+(32-bitsz));
+#else
+	if (bitpos) 
+	    oprtc(LSHIFT,value,list2(CONST,bitpos));
+	trn = register_name(tmp = get_register());
+	/* make and-mask */
+	mask = make_mask(32-bitpos-bitsize,31-bitpos);
+#endif
 	make_mask_and_or(mask,tmp,trn,crn,lrn);
     }
     if (tmp!=-1) free_register(tmp);
--- a/test/bitfield1.c	Fri Jun 25 03:56:48 2004 +0900
+++ b/test/bitfield1.c	Fri Jun 25 05:37:09 2004 +0900
@@ -18,7 +18,7 @@
    } a11 ;
 
 union ll1 {
-   int a[8];
+   unsigned char a[32];
    struct {
         char a:4;
 	long long v:33;
@@ -28,7 +28,7 @@
 } ll1;
 
 union ll0 {
-   int a[8];
+   unsigned char a[32];
    struct {
         char a:4;
 	long long v:48;
@@ -39,7 +39,7 @@
 
 
 union ll {
-   int a[8];
+   unsigned char a[32];
    struct {
         char a:4;
 	long long v:56;
@@ -74,64 +74,38 @@
 
 main()
 {
+    int i;
     printf("%d\n",a.i);
 
      ll1.b.v = -1;
      printf("01:%llx\n",ll1.b.v);
-     printf("02:%08x %08x %08x %08x %08x %08x %08x %08x\n",
-	ll1.a[0],ll1.a[1],ll1.a[2],ll1.a[3],
-	ll1.a[4],ll1.a[5],ll1.a[6],ll1.a[7]
-      );
+     printf("02:"); for(i=0;i<32;i++) printf("%02x",ll1.a[i]); printf("\n");
      ll1.b.v = 0;
      ll1.b.w = -1;
-     printf("02:%08x %08x %08x %08x %08x %08x %08x %08x\n",
-	ll1.a[0],ll1.a[1],ll1.a[2],ll1.a[3],
-	ll1.a[4],ll1.a[5],ll1.a[6],ll1.a[7]
-      );
+     printf("02:"); for(i=0;i<32;i++) printf("%02x",ll1.a[i]); printf("\n");
      ll1.b.w = 0;
      ll1.b.x = -1;
-     printf("02:%08x %08x %08x %08x %08x %08x %08x %08x\n",
-	ll1.a[0],ll1.a[1],ll1.a[2],ll1.a[3],
-	ll1.a[4],ll1.a[5],ll1.a[6],ll1.a[7]
-      );
+     printf("02:"); for(i=0;i<32;i++) printf("%02x",ll1.a[i]); printf("\n");
 
      ll0.b.v = -1;
      printf("01:%llx\n",ll0.b.v);
-     printf("02:%08x %08x %08x %08x %08x %08x %08x %08x\n",
-	ll0.a[0],ll0.a[1],ll0.a[2],ll0.a[3],
-	ll0.a[4],ll0.a[5],ll0.a[6],ll0.a[7]
-      );
+     printf("02:"); for(i=0;i<32;i++) printf("%02x",ll0.a[i]); printf("\n");
      ll0.b.v = 0;
      ll0.b.w = -1;
-     printf("02:%08x %08x %08x %08x %08x %08x %08x %08x\n",
-	ll0.a[0],ll0.a[1],ll0.a[2],ll0.a[3],
-	ll0.a[4],ll0.a[5],ll0.a[6],ll0.a[7]
-      );
+     printf("02:"); for(i=0;i<32;i++) printf("%02x",ll0.a[i]); printf("\n");
      ll0.b.w = 0;
      ll0.b.x = -1;
-     printf("02:%08x %08x %08x %08x %08x %08x %08x %08x\n",
-	ll0.a[0],ll0.a[1],ll0.a[2],ll0.a[3],
-	ll0.a[4],ll0.a[5],ll0.a[6],ll0.a[7]
-      );
+     printf("02:"); for(i=0;i<32;i++) printf("%02x",ll0.a[i]); printf("\n");
 
      ll.b.v = -1;
      printf("1:%llx\n",ll.b.v);
-     printf("2:%08x %08x %08x %08x %08x %08x %08x %08x\n",
-	ll.a[0],ll.a[1],ll.a[2],ll.a[3],
-	ll.a[4],ll.a[5],ll.a[6],ll.a[7]
-      );
+     printf("02:"); for(i=0;i<32;i++) printf("%02x",ll.a[i]); printf("\n");
      ll.b.v = 0;
      ll.b.w = -1;
-     printf("2:%08x %08x %08x %08x %08x %08x %08x %08x\n",
-	ll.a[0],ll.a[1],ll.a[2],ll.a[3],
-	ll.a[4],ll.a[5],ll.a[6],ll.a[7]
-      );
+     printf("02:"); for(i=0;i<32;i++) printf("%02x",ll.a[i]); printf("\n");
      ll.b.w = 0;
      ll.b.x = -1;
-     printf("2:%08x %08x %08x %08x %08x %08x %08x %08x\n",
-	ll.a[0],ll.a[1],ll.a[2],ll.a[3],
-	ll.a[4],ll.a[5],ll.a[6],ll.a[7]
-      );
+     printf("02:"); for(i=0;i<32;i++) printf("%02x",ll.a[i]); printf("\n");
 
      printf("char a:1; char b:4; char c:7; char d:4; char e:4; char f:4;\n");
      cc.b.a = -1;
@@ -218,16 +192,18 @@
 	printf("%08x:cc.b.a=%d cc.b.b=%d cc.b.c=%d cc.b.d=%d cc.b.e=%d cc.b.f=%d\n",bit,
 		cc.b.a,cc.b.b,cc.b.c,cc.b.d,cc.b.e,cc.b.f);
     }
-    for(i=0;i<8;i++) {
+    ll.a[0]=ll.a[1]=ll.a[2]=ll.a[3]= ll.a[4]=ll.a[5]=ll.a[6]=ll.a[7]=0;
+    for(i=7;i>=0;i--) {
     bit=1;
 	for(j=0;j<32;j++,bit<<=1) {
 	    ll.a[i] = bit;
-	     printf("02:%08x %08x %08x %08x %08x %08x %08x %08x ",
+	     printf("02:%08x %08x %08x %08x %08x %08x %08x %08x\n",
 		ll.a[0],ll.a[1],ll.a[2],ll.a[3],
 		ll.a[4],ll.a[5],ll.a[6],ll.a[7]
 	      );
-	    printf("ll.b.v=%d ll.b.w=%d ll.b.x=%d\n",ll.b.v,ll.b.w,ll.b.x);
+	    printf(" ll.b.v=%d ll.b.w=%d ll.b.x=%d\n",ll.b.v,ll.b.w,ll.b.x);
 	}
+	ll.a[i]=0;
     }
 }