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