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 }