Mercurial > hg > CbC > old > device
comparison mc-code-mips.c @ 279:3e8ba7024d25 mips-almost-done
MIPS struct fix (all test except 2 passed.)
author | kono |
---|---|
date | Sat, 22 May 2004 13:00:03 +0900 |
parents | 5b50813d0c45 |
children | affb054fe920 |
comparison
equal
deleted
inserted
replaced
278:5b50813d0c45 | 279:3e8ba7024d25 |
---|---|
1539 } | 1539 } |
1540 } | 1540 } |
1541 free_register(dreg); | 1541 free_register(dreg); |
1542 } | 1542 } |
1543 | 1543 |
1544 static int | 1544 int |
1545 struct_push(int e4,int t,int arg) | 1545 struct_push(int e4,int t,int arg) |
1546 { | 1546 { |
1547 int length,count; | 1547 int length,count; |
1548 int dreg,sreg; char *drn,*crn,*srn; | 1548 int dreg,sreg; char *drn,*crn,*srn; |
1549 g_expr(e4); | 1549 g_expr(e4); |
1550 if (!is_int_reg(creg)) error(-1); | 1550 if (!is_int_reg(creg)) error(-1); |
1551 length=size(t); | 1551 length=size(t); |
1552 if(length%SIZE_OF_INT) { | 1552 if(length%SIZE_OF_INT) { |
1553 length += SIZE_OF_INT - (length%SIZE_OF_INT); | 1553 length += SIZE_OF_INT - (length%SIZE_OF_INT); |
1554 } | 1554 } |
1555 dreg = get_register(); if (!dreg) error(-1); | 1555 dreg = get_register(); if (!dreg) error(-1); |
1556 drn = register_name(dreg); | 1556 drn = register_name(dreg); |
1557 crn = register_name(creg); | 1557 crn = register_name(creg); |
1558 if (length<MAX_COPY_LEN) { | 1558 if (length<MAX_COPY_LEN) { |
1559 sreg = get_register(); if (!sreg) error(-1); | 1559 sreg = get_register(); if (!sreg) error(-1); |
1560 srn = register_name(sreg); | 1560 srn = register_name(sreg); |
1561 code_lvar(cadr(arg),sreg); | 1561 code_lvar(cadr(arg),dreg); |
1562 for(count=0;length<MAX_COPY_LEN;count++,length-=SIZE_OF_INT) { | 1562 for(count=0;count<length;count+=SIZE_OF_INT) { |
1563 if (length==0) { | 1563 printf("\tlw %s,%d(%s)\n",srn,count,crn); |
1564 free_register(sreg); | 1564 printf("\tsw %s,%d(%s)\n",srn,count,drn); |
1565 free_register(dreg); | 1565 } |
1566 return count; | 1566 free_register(sreg); |
1567 } else { | 1567 free_register(dreg); |
1568 printf("\tlw %s,%d(%s)\n",drn,length-SIZE_OF_INT,crn); | 1568 return length/SIZE_OF_INT; |
1569 printf("\tsw %s,%d(%s)\n",drn,-SIZE_OF_INT,srn); | 1569 } else { |
1570 } | 1570 code_lvar(cadr(arg),dreg); |
1571 } | 1571 /* downward direction copy */ |
1572 } | 1572 emit_copy(creg,dreg,length,0,0,1); |
1573 code_lvar(cadr(arg),dreg); | 1573 } |
1574 /* downward direction copy */ | 1574 free_register(dreg); |
1575 emit_copy(creg,dreg,length,0,0,1); | |
1576 if (dreg) free_register(dreg); | |
1577 return length/SIZE_OF_INT; | 1575 return length/SIZE_OF_INT; |
1578 } | 1576 } |
1579 | 1577 |
1580 static void | 1578 static void |
1581 set_ireg(int reg,int mode) | 1579 set_ireg(int reg,int mode) |
1860 if (car(e1)!=REGISTER) { error(-1); return; } | 1858 if (car(e1)!=REGISTER) { error(-1); return; } |
1861 frn = register_name(cadr(e1)); | 1859 frn = register_name(cadr(e1)); |
1862 switch(car(e2)) { | 1860 switch(car(e2)) { |
1863 case FCONST: | 1861 case FCONST: |
1864 value = dcadr(e2); | 1862 value = dcadr(e2); |
1865 printf("\tli.s %s,%g\n",frn,value); | 1863 printf("\tli.s %s,%12.12g\n",frn,value); |
1866 break; | 1864 break; |
1867 case FRGVAR: | 1865 case FRGVAR: |
1868 r = get_ptr_cache((NMTBL*)cadr(e2)); | 1866 r = get_ptr_cache((NMTBL*)cadr(e2)); |
1869 printf("\tlw %s,0(%s)\n",frn,register_name(r)); | 1867 printf("\tlw %s,0(%s)\n",frn,register_name(r)); |
1870 break; | 1868 break; |
3055 gpc += SIZE_OF_INT; | 3053 gpc += SIZE_OF_INT; |
3056 } | 3054 } |
3057 #if LONGLONG_CODE | 3055 #if LONGLONG_CODE |
3058 } else if(t==LONGLONG||t==ULONGLONG) { | 3056 } else if(t==LONGLONG||t==ULONGLONG) { |
3059 ll = lcadr(e); | 3057 ll = lcadr(e); |
3058 #if (ENDIAN==0) | |
3059 printf("\t.long\t0x%x,0x%x\n",code_l1(ll),code_l2(ll)); | |
3060 #else | |
3060 printf("\t.long\t0x%x,0x%x\n",code_l2(ll),code_l1(ll)); | 3061 printf("\t.long\t0x%x,0x%x\n",code_l2(ll),code_l1(ll)); |
3062 #endif | |
3061 #endif | 3063 #endif |
3062 #if FLOAT_CODE | 3064 #if FLOAT_CODE |
3063 } else if(t==DOUBLE) { | 3065 } else if(t==DOUBLE) { |
3064 d = dcadr(e); | 3066 d = dcadr(e); |
3065 printf("\t.long\t0x%x,0x%x\n",code_d2(d),code_d1(d)); | 3067 printf("\t.long\t0x%x,0x%x\n",code_d2(d),code_d1(d)); |
3197 | 3199 |
3198 /* floating point */ | 3200 /* floating point */ |
3199 | 3201 |
3200 #define set_double(freg) if (regs[freg]) {regs[freg]=USING_DREG;} | 3202 #define set_double(freg) if (regs[freg]) {regs[freg]=USING_DREG;} |
3201 | 3203 |
3204 static void dconst(int l,int h,double value); | |
3205 | |
3202 void | 3206 void |
3203 code_cmp_dregister(int e2,int d) | 3207 code_cmp_dregister(int e2,int d) |
3204 { | 3208 { |
3205 char *grn,*frn; | 3209 char *grn,*frn; |
3206 int greg; | 3210 int greg; |
3207 use_float(d,e2); | 3211 use_float(d,e2); |
3208 | 3212 |
3209 if (d) { | 3213 if (d) { |
3210 code_save_stacks(); | 3214 code_save_stacks(); |
3211 clear_ptr_cache(); | 3215 clear_ptr_cache(); |
3212 set_dreg(RET_DREGISTER,1); | 3216 set_dreg(DREGISTER_OPERAND,0); |
3213 printf("\tli.d $6,%10.10g\n",0.0); | 3217 dconst(DREGISTER_OPERAND_1_L,DREGISTER_OPERAND_1_H,0.0); |
3214 extern_conv("dpcmp"); | 3218 extern_conv("dpcmp"); |
3219 set_dreg(RET_DREGISTER,0); | |
3215 cmpreg = 2; | 3220 cmpreg = 2; |
3216 return; | 3221 return; |
3217 } | 3222 } |
3218 grn = register_name(greg = get_dregister(d)); | 3223 grn = register_name(greg = get_dregister(d)); |
3219 frn = register_name(e2); | 3224 frn = register_name(e2); |
3304 float f = d; | 3309 float f = d; |
3305 int *j = (int *)&f; | 3310 int *j = (int *)&f; |
3306 return *j; | 3311 return *j; |
3307 } | 3312 } |
3308 | 3313 |
3309 void | 3314 static void |
3310 | 3315 dconst(int l,int h,double value) |
3316 { | |
3317 #if ENDIAN==0 | |
3318 printf("\tli %s,0x%x\n",register_name(l),code_d1(value)); | |
3319 printf("\tli %s,0x%x\n",register_name(h),code_d2(value)); | |
3320 #else | |
3321 printf("\tli %s,0x%x\n",register_name(h),code_d1(value)); | |
3322 printf("\tli %s,0x%x\n",register_name(l),code_d2(value)); | |
3323 #endif | |
3324 } | |
3325 | |
3326 void | |
3311 code_dconst(int e2,int freg,int d) | 3327 code_dconst(int e2,int freg,int d) |
3312 { | 3328 { |
3313 double value = dcadr(e2); | 3329 double value = dcadr(e2); |
3314 char *frn; | 3330 char *frn; |
3315 | 3331 |
3316 use_float(d,freg); | 3332 use_float(d,freg); |
3317 if (d) { | 3333 if (d) { |
3318 #if ENDIAN==0 | 3334 dconst(regv_l(freg),regv_h(freg),value); |
3319 printf("\tli %s,0x%x\n",lregister_name_low(freg),code_d1(value)); | |
3320 printf("\tli %s,0x%x\n",lregister_name_high(freg),code_d2(value)); | |
3321 #else | |
3322 printf("\tli %s,0x%x\n",lregister_name_high(freg),code_d1(value)); | |
3323 printf("\tli %s,0x%x\n",lregister_name_low(freg),code_d2(value)); | |
3324 #endif | |
3325 } else { | 3335 } else { |
3326 frn = fregister_name(freg); | 3336 frn = fregister_name(freg); |
3327 printf("\tli.s %s,%g\n",frn,value); | 3337 printf("\tli.s %s,%10.10g\n",frn,value); |
3328 } | 3338 } |
3329 } | 3339 } |
3330 | 3340 |
3331 | 3341 |
3332 void | 3342 void |
3394 code_save_stacks(); | 3404 code_save_stacks(); |
3395 clear_ptr_cache(); | 3405 clear_ptr_cache(); |
3396 extern_conv("litodp"); | 3406 extern_conv("litodp"); |
3397 code_rlvar(tmp,REGISTER_OPERAND); | 3407 code_rlvar(tmp,REGISTER_OPERAND); |
3398 printf("\tbgez\t%s,1f\n",register_name(REGISTER_OPERAND)); | 3408 printf("\tbgez\t%s,1f\n",register_name(REGISTER_OPERAND)); |
3399 code_double_lib_c("dpadd",RET_DREGISTER,RET_DREGISTER,4.294967296e9); | 3409 code_double_lib_c("dpadd",RET_DREGISTER,RET_DREGISTER,4.29496729600000000000e9); |
3400 printf("1:\n"); | 3410 printf("1:\n"); |
3401 set_dreg(RET_DREGISTER,0); | 3411 set_dreg(RET_DREGISTER,0); |
3402 if (reg!=USE_CREG) { | 3412 if (reg!=USE_CREG) { |
3403 use_float(1,reg); | 3413 use_float(1,reg); |
3404 if (reg!=RET_DREGISTER) { | 3414 if (reg!=RET_DREGISTER) { |
3626 code_double_lib_c(char *lib,int from,int to,double value) | 3636 code_double_lib_c(char *lib,int from,int to,double value) |
3627 { | 3637 { |
3628 code_save_stacks(); | 3638 code_save_stacks(); |
3629 clear_ptr_cache(); | 3639 clear_ptr_cache(); |
3630 set_dreg_operand(from,1); | 3640 set_dreg_operand(from,1); |
3631 printf("\tli.d $6,%10.10g\n",value); | 3641 dconst(DREGISTER_OPERAND_1_L,DREGISTER_OPERAND_1_H,value); |
3632 extern_conv(lib); | 3642 extern_conv(lib); |
3633 set_dreg(RET_DREGISTER,0); | 3643 set_dreg(RET_DREGISTER,0); |
3634 if (to!=RET_DREGISTER) { | 3644 if (to!=RET_DREGISTER) { |
3635 lmove(to,RET_DREGISTER); | 3645 lmove(to,RET_DREGISTER); |
3636 } | 3646 } |
4815 char *drn = register_name(dx = get_register()); | 4825 char *drn = register_name(dx = get_register()); |
4816 if (v<0) { | 4826 if (v<0) { |
4817 printf("\tsubu %s,%s,%d\n",rrn_l,crn_l,-v); | 4827 printf("\tsubu %s,%s,%d\n",rrn_l,crn_l,-v); |
4818 printf("\tsltu %s,%s,%d\n",drn,rrn_l,v); | 4828 printf("\tsltu %s,%s,%d\n",drn,rrn_l,v); |
4819 printf("\tsubu %s,%s,1\n",rrn_h,crn_h); | 4829 printf("\tsubu %s,%s,1\n",rrn_h,crn_h); |
4820 printf("\tsubu %s,%s,%s\n",rrn_h,rrn_h,drn); | 4830 printf("\taddu %s,%s,%s\n",rrn_h,rrn_h,drn); |
4821 } else { | 4831 } else { |
4822 printf("\taddu %s,%s,%d\n",rrn_l,crn_l,v); | 4832 printf("\taddu %s,%s,%d\n",rrn_l,crn_l,v); |
4823 printf("\tsltu %s,%s,%d\n",drn,rrn_l,v); | 4833 printf("\tsltu %s,%s,%d\n",drn,rrn_l,v); |
4824 printf("\taddu %s,%s,%s\n",rrn_h,crn_h,drn); | 4834 printf("\taddu %s,%s,%s\n",rrn_h,crn_h,drn); |
4825 } | 4835 } |