Mercurial > hg > CbC > old > device
comparison mc-code-mips.c @ 338:7fe7ce0a791f bit-field-done
bit-field done for IA32, PowerPC, MIPS.
bit-field assop.
No bit-field global init.
author | kono |
---|---|
date | Fri, 25 Jun 2004 14:30:43 +0900 |
parents | 694cdf15c5bd |
children | 0150de6a3244 |
comparison
equal
deleted
inserted
replaced
337:694cdf15c5bd | 338:7fe7ce0a791f |
---|---|
178 #define use_int(reg) if (reg==USE_CREG) reg=use_int0() | 178 #define use_int(reg) if (reg==USE_CREG) reg=use_int0() |
179 static | 179 static |
180 int use_int0() { | 180 int use_int0() { |
181 int i = creg; | 181 int i = creg; |
182 if (!i||!ireg||!is_int_reg(i)) { | 182 if (!i||!ireg||!is_int_reg(i)) { |
183 if (lreg) { free_register(lreg); lreg = 0; } | 183 if (lreg) { if (regs[lreg]) free_register(lreg); lreg = 0; } |
184 if (!ireg) ireg = get_register(); | 184 if (!ireg) ireg = get_register(); |
185 // else if (ireg!=i) free_register(i); | 185 // else if (ireg!=i) free_register(i); |
186 i = ireg; | 186 i = ireg; |
187 } | 187 } |
188 if (!regs[i]) regs[i]=USING_REG; | 188 if (!regs[i]) regs[i]=USING_REG; |
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 | |
5552 int i; | |
5553 #endif | |
5554 char *crn,*lrn,*trn; | 5551 char *crn,*lrn,*trn; |
5555 set_bitsz(type,&sign,&bitsz,&align,&l); | 5552 set_bitsz(type,&sign,&bitsz,&align,&l); |
5556 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); | 5553 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); |
5557 if (l) { | 5554 if (l) { |
5558 use_longlong(value); | 5555 use_longlong(value); |
5559 #if 0 | |
5560 crn = lregister_name_low(value); | |
5561 lrn = lregister_name_low(lvalue); | |
5562 /* shift left */ | |
5563 if ((i=bitsz-bitsize-bitpos)) | |
5564 loprtc(LLSHIFT,value,list2(CONST,i)); | |
5565 trn = register_name(tmp = get_register()); | |
5566 if (bitpos+bitsize>=32) { | |
5567 /* make and-mask lower */ | |
5568 mask = make_mask(bitpos>=32?bitpos-32:0,bitpos+bitsize-32-1); | |
5569 make_mask_and_or(mask,tmp,trn,crn,lrn); | |
5570 } | |
5571 crn = lregister_name_high(value); | |
5572 lrn = lregister_name_high(lvalue); | |
5573 if (bitpos<32) { | |
5574 /* make and-mask upper */ | |
5575 mask = make_mask(bitpos,bitpos+bitsize>=32?31:bitpos+bitsize-1); | |
5576 make_mask_and_or(mask,tmp,trn,crn,lrn); | |
5577 } | |
5578 #else | |
5579 crn = lregister_name_high(value); | 5556 crn = lregister_name_high(value); |
5580 lrn = lregister_name_high(lvalue); | 5557 lrn = lregister_name_high(lvalue); |
5581 /* shift left */ | 5558 /* shift left */ |
5582 if (bitpos) | 5559 if (bitpos) |
5583 loprtc(LLSHIFT,value,list2(CONST,bitpos)); | 5560 loprtc(LLSHIFT,value,list2(CONST,bitpos)); |
5592 if (bitpos<32) { | 5569 if (bitpos<32) { |
5593 /* make and-mask lower */ | 5570 /* make and-mask lower */ |
5594 mask = make_mask(bitpos+bitsize>=32?0:32-bitpos-bitsize,31-bitpos); | 5571 mask = make_mask(bitpos+bitsize>=32?0:32-bitpos-bitsize,31-bitpos); |
5595 make_mask_and_or(mask,tmp,trn,crn,lrn); | 5572 make_mask_and_or(mask,tmp,trn,crn,lrn); |
5596 } | 5573 } |
5597 #endif | |
5598 } else { | 5574 } else { |
5599 use_int(value); | 5575 use_int(value); |
5600 crn = register_name(value); | 5576 crn = register_name(value); |
5601 lrn = register_name(lvalue); | 5577 lrn = register_name(lvalue); |
5602 /* shift left */ | 5578 /* shift left */ |
5603 #if 0 | |
5604 if ((i=bitsz-bitsize-bitpos)) | |
5605 oprtc(LSHIFT,value,list2(CONST,i)); | |
5606 trn = register_name(tmp = get_register()); | |
5607 /* make and-mask */ | |
5608 mask = make_mask(bitpos+(32-bitsz),bitpos+bitsize-1+(32-bitsz)); | |
5609 #else | |
5610 if (bitpos) | 5579 if (bitpos) |
5611 oprtc(LSHIFT,value,list2(CONST,bitpos)); | 5580 oprtc(LSHIFT,value,list2(CONST,bitpos)); |
5612 trn = register_name(tmp = get_register()); | 5581 trn = register_name(tmp = get_register()); |
5613 /* make and-mask */ | 5582 /* make and-mask */ |
5614 mask = make_mask(32-bitpos-bitsize,31-bitpos); | 5583 mask = make_mask(32-bitpos-bitsize,31-bitpos); |
5584 make_mask_and_or(mask,tmp,trn,crn,lrn); | |
5585 } | |
5586 if (tmp!=-1) free_register(tmp); | |
5587 } | |
5588 | |
5615 #endif | 5589 #endif |
5616 make_mask_and_or(mask,tmp,trn,crn,lrn); | |
5617 } | |
5618 if (tmp!=-1) free_register(tmp); | |
5619 } | |
5620 | |
5621 #endif | |
5622 | 5590 |
5623 /* end */ | 5591 /* end */ |