Mercurial > hg > CbC > old > device
comparison mc-code-mips.c @ 337:694cdf15c5bd
MIPS bit-field done.
author | kono |
---|---|
date | Fri, 25 Jun 2004 05:37:09 +0900 (2004-06-24) |
parents | d488b72254fb |
children | 7fe7ce0a791f |
comparison
equal
deleted
inserted
replaced
336:d488b72254fb | 337:694cdf15c5bd |
---|---|
5430 case UNSIGNED: bitsz=32; align=4;break; | 5430 case UNSIGNED: bitsz=32; align=4;break; |
5431 case CHAR: sign=1; bitsz= 8; align=1;break; | 5431 case CHAR: sign=1; bitsz= 8; align=1;break; |
5432 case UCHAR: bitsz= 8; align=1;break; | 5432 case UCHAR: bitsz= 8; align=1;break; |
5433 case SHORT: sign=1; bitsz=16; align=2;break; | 5433 case SHORT: sign=1; bitsz=16; align=2;break; |
5434 case USHORT: sign=1; bitsz=16; align=2;break; | 5434 case USHORT: sign=1; bitsz=16; align=2;break; |
5435 case LONGLONG: sign=1; bitsz=64; align=4;l=1; break; | 5435 case LONGLONG: sign=1; bitsz=64; align=8;l=1; break; |
5436 case ULONGLONG: bitsz=64; align=4;l=1; break; | 5436 case ULONGLONG: bitsz=64; align=8;l=1; break; |
5437 default: error(-1); | 5437 default: error(-1); |
5438 } | 5438 } |
5439 *psign = sign; | 5439 *psign = sign; |
5440 *pbitsz = bitsz; | 5440 *pbitsz = bitsz; |
5441 *palign = align; | 5441 *palign = align; |
5506 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); | 5506 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); |
5507 /* this implementation returns -1 for int i:1; */ | 5507 /* this implementation returns -1 for int i:1; */ |
5508 if (l==1) { | 5508 if (l==1) { |
5509 use_longlong(reg); | 5509 use_longlong(reg); |
5510 /* shift left */ | 5510 /* shift left */ |
5511 if (bitpos) | 5511 if ((i=bitsz-bitsize-bitpos)) |
5512 loprtc(LLSHIFT,reg,list2(CONST,bitpos)); | 5512 loprtc(LLSHIFT,reg,list2(CONST,i)); |
5513 /* shift right */ | 5513 /* shift right */ |
5514 if ((i=bitsz-bitsize)) | 5514 if ((i=bitsz-bitsize)) |
5515 loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i)); | 5515 loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i)); |
5516 } else { | 5516 } else { |
5517 use_int(reg); | 5517 use_int(reg); |
5518 /* shift left */ | 5518 /* shift left */ |
5519 if ((i=bitpos+(32-bitsz))) | 5519 if ((i=32-bitsize-bitpos)) |
5520 oprtc(LSHIFT,reg,list2(CONST,i)); | 5520 oprtc(LSHIFT,reg,list2(CONST,i)); |
5521 /* shift right */ | 5521 /* shift right */ |
5522 if ((i=bitsz-bitsize+(32-bitsz))) | 5522 if ((i=32-bitsize)) |
5523 oprtc(sign?RSHIFT:URSHIFT,reg,list2(CONST,i)); | 5523 oprtc(sign?RSHIFT:URSHIFT,reg,list2(CONST,i)); |
5524 } | 5524 } |
5525 } | 5525 } |
5526 | 5526 |
5527 /* bit field replacement */ | 5527 /* bit field replacement */ |
5546 { | 5546 { |
5547 int sign,bitsz,l,align; | 5547 int sign,bitsz,l,align; |
5548 int bitsize = cadddr(type); | 5548 int bitsize = cadddr(type); |
5549 int mask = 0; | 5549 int mask = 0; |
5550 int tmp = -1; | 5550 int tmp = -1; |
5551 #if 0 | |
5551 int i; | 5552 int i; |
5553 #endif | |
5552 char *crn,*lrn,*trn; | 5554 char *crn,*lrn,*trn; |
5553 set_bitsz(type,&sign,&bitsz,&align,&l); | 5555 set_bitsz(type,&sign,&bitsz,&align,&l); |
5554 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); | 5556 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); |
5555 if (l) { | 5557 if (l) { |
5556 use_longlong(value); | 5558 use_longlong(value); |
5559 #if 0 | |
5557 crn = lregister_name_low(value); | 5560 crn = lregister_name_low(value); |
5558 lrn = lregister_name_low(lvalue); | 5561 lrn = lregister_name_low(lvalue); |
5559 /* shift left */ | 5562 /* shift left */ |
5560 if ((i=bitsz-bitsize-bitpos)) | 5563 if ((i=bitsz-bitsize-bitpos)) |
5561 loprtc(LLSHIFT,value,list2(CONST,i)); | 5564 loprtc(LLSHIFT,value,list2(CONST,i)); |
5570 if (bitpos<32) { | 5573 if (bitpos<32) { |
5571 /* make and-mask upper */ | 5574 /* make and-mask upper */ |
5572 mask = make_mask(bitpos,bitpos+bitsize>=32?31:bitpos+bitsize-1); | 5575 mask = make_mask(bitpos,bitpos+bitsize>=32?31:bitpos+bitsize-1); |
5573 make_mask_and_or(mask,tmp,trn,crn,lrn); | 5576 make_mask_and_or(mask,tmp,trn,crn,lrn); |
5574 } | 5577 } |
5578 #else | |
5579 crn = lregister_name_high(value); | |
5580 lrn = lregister_name_high(lvalue); | |
5581 /* shift left */ | |
5582 if (bitpos) | |
5583 loprtc(LLSHIFT,value,list2(CONST,bitpos)); | |
5584 trn = register_name(tmp = get_register()); | |
5585 if (bitpos+bitsize>=32) { | |
5586 /* make and-mask upper */ | |
5587 mask = make_mask(64-bitpos-bitsize,bitpos>=32?63-bitpos:31); | |
5588 make_mask_and_or(mask,tmp,trn,crn,lrn); | |
5589 } | |
5590 crn = lregister_name_low(value); | |
5591 lrn = lregister_name_low(lvalue); | |
5592 if (bitpos<32) { | |
5593 /* make and-mask lower */ | |
5594 mask = make_mask(bitpos+bitsize>=32?0:32-bitpos-bitsize,31-bitpos); | |
5595 make_mask_and_or(mask,tmp,trn,crn,lrn); | |
5596 } | |
5597 #endif | |
5575 } else { | 5598 } else { |
5576 use_int(value); | 5599 use_int(value); |
5577 crn = register_name(value); | 5600 crn = register_name(value); |
5578 lrn = register_name(lvalue); | 5601 lrn = register_name(lvalue); |
5579 /* shift left */ | 5602 /* shift left */ |
5603 #if 0 | |
5580 if ((i=bitsz-bitsize-bitpos)) | 5604 if ((i=bitsz-bitsize-bitpos)) |
5581 oprtc(LSHIFT,value,list2(CONST,i)); | 5605 oprtc(LSHIFT,value,list2(CONST,i)); |
5582 trn = register_name(tmp = get_register()); | 5606 trn = register_name(tmp = get_register()); |
5583 /* make and-mask */ | 5607 /* make and-mask */ |
5584 mask = make_mask(bitpos+(32-bitsz),bitpos+bitsize-1+(32-bitsz)); | 5608 mask = make_mask(bitpos+(32-bitsz),bitpos+bitsize-1+(32-bitsz)); |
5609 #else | |
5610 if (bitpos) | |
5611 oprtc(LSHIFT,value,list2(CONST,bitpos)); | |
5612 trn = register_name(tmp = get_register()); | |
5613 /* make and-mask */ | |
5614 mask = make_mask(32-bitpos-bitsize,31-bitpos); | |
5615 #endif | |
5585 make_mask_and_or(mask,tmp,trn,crn,lrn); | 5616 make_mask_and_or(mask,tmp,trn,crn,lrn); |
5586 } | 5617 } |
5587 if (tmp!=-1) free_register(tmp); | 5618 if (tmp!=-1) free_register(tmp); |
5588 } | 5619 } |
5589 | 5620 |