comparison mc-code-mips.c @ 420:efbd420386c5

non aligned bitfield (not yet finished)
author kono
date Thu, 28 Oct 2004 21:20:52 +0900
parents 5fafb50df9d4
children 8b9136a06f56
comparison
equal deleted inserted replaced
419:5fafb50df9d4 420:efbd420386c5
2275 void 2275 void
2276 code_alloca(int e1,int reg) 2276 code_alloca(int e1,int reg)
2277 { 2277 {
2278 char *crn; 2278 char *crn;
2279 2279
2280 g_expr(list3(BAND,list3(ADD,e1,list2(CONST,15)),list2(CONST,~15))); 2280 g_expr(list3(BAND,list3(ADD,e1,list2(CONST,15+4)),list2(CONST,~15)));
2281 use_int(reg); 2281 use_int(reg);
2282 crn = register_name(reg); 2282 crn = register_name(reg);
2283 printf("\tsubu $sp,$sp,%s\n",crn); 2283 printf("\tsubu $sp,$sp,%s\n",crn);
2284 printf("\taddu %s,$sp,$L_%d\n",crn,cprestore_label); 2284 printf("\taddu %s,$sp,$L_%d+4\n",crn,cprestore_label);
2285 if (fnptr->sc==CODE) { 2285 if (fnptr->sc==CODE) {
2286 printf("\tsw\t$gp,$L_%d($sp)\n",cprestore_label); 2286 printf("\tsw\t$gp,$L_%d($sp)\n",cprestore_label);
2287 } 2287 }
2288 } 2288 }
2289 2289
5454 static void 5454 static void
5455 set_bitsz(int type,int *psign,int *pbitsz,int *palign,int *pl) 5455 set_bitsz(int type,int *psign,int *pbitsz,int *palign,int *pl)
5456 { 5456 {
5457 int sign=0,bitsz; 5457 int sign=0,bitsz;
5458 int align,l=0; 5458 int align,l=0;
5459 switch(cadr(type)) { 5459 switch(cadr(type)) { /* value type */
5460 case INT: sign=1; bitsz=32; align=4;break; 5460 case INT: sign=1; bitsz=32; align=4;break;
5461 case UNSIGNED: bitsz=32; align=4;break; 5461 case UNSIGNED: bitsz=32; align=4;break;
5462 case CHAR: sign=1; bitsz= 8; align=1;break; 5462 case CHAR: sign=1; bitsz= 8; align=1;break;
5463 case UCHAR: bitsz= 8; align=1;break; 5463 case UCHAR: bitsz= 8; align=1;break;
5464 case SHORT: sign=1; bitsz=16; align=2;break; 5464 case SHORT: sign=1; bitsz=16; align=2;break;
5484 int sign,bitsz,align; 5484 int sign,bitsz,align;
5485 int i; 5485 int i;
5486 int bitpos = *bfd; 5486 int bitpos = *bfd;
5487 int offset = *poffset; 5487 int offset = *poffset;
5488 int l; 5488 int l;
5489 int bitsize = cadddr(type); 5489 int bitsize = caddr(caddr(type));
5490 set_bitsz(type,&sign,&bitsz,&align,&l); 5490 set_bitsz(type,&sign,&bitsz,&align,&l);
5491 5491
5492 if (bitsize>bitsz) { error(BTERR); bitsize = i; } 5492 if (bitsize>bitsz) { error(BTERR); bitsize = i; }
5493 5493
5494 /* bfd means previous bit field bit offset */ 5494 /* bfd means previous bit field bit offset */
5529 /* reg contains container value, result should be in reg */ 5529 /* reg contains container value, result should be in reg */
5530 extern void 5530 extern void
5531 code_bit_field(int type,int bitpos,int reg) 5531 code_bit_field(int type,int bitpos,int reg)
5532 { 5532 {
5533 int sign,bitsz,l,align; 5533 int sign,bitsz,l,align;
5534 int bitsize = cadddr(type); 5534 int bitsize = caddr(caddr(type));
5535 int i; 5535 int i;
5536 set_bitsz(type,&sign,&bitsz,&align,&l); 5536 set_bitsz(type,&sign,&bitsz,&align,&l);
5537 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); 5537 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
5538 /* this implementation returns -1 for int i:1; */ 5538 /* this implementation returns -1 for int i:1; */
5539 if (l==1) { 5539 if (l==1) {
5574 5574
5575 extern void 5575 extern void
5576 code_bit_replace(int value,int lvalue,int type,int bitpos) 5576 code_bit_replace(int value,int lvalue,int type,int bitpos)
5577 { 5577 {
5578 int sign,bitsz,l,align; 5578 int sign,bitsz,l,align;
5579 int bitsize = cadddr(type); 5579 int bitsize = caddr(caddr(type));
5580 int mask = 0; 5580 int mask = 0;
5581 int tmp = -1; 5581 int tmp = -1;
5582 char *crn,*lrn,*trn; 5582 char *crn,*lrn,*trn;
5583 set_bitsz(type,&sign,&bitsz,&align,&l); 5583 set_bitsz(type,&sign,&bitsz,&align,&l);
5584 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); 5584 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
5648 5648
5649 extern void 5649 extern void
5650 code_bit_replace_const(int value,int lvalue,int type,int bitpos) 5650 code_bit_replace_const(int value,int lvalue,int type,int bitpos)
5651 { 5651 {
5652 int sign,bitsz,l,align; 5652 int sign,bitsz,l,align;
5653 int bitsize = cadddr(type); 5653 int bitsize = caddr(caddr(type));
5654 int mask = 0; 5654 int mask = 0;
5655 int c; 5655 int c;
5656 #if LONGLONG_CODE 5656 #if LONGLONG_CODE
5657 long long lc; 5657 long long lc;
5658 #endif 5658 #endif