Mercurial > hg > CbC > old > device
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 |