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 */