Mercurial > hg > CbC > old > device
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; } }