comparison mc-code-mips.c @ 287:a0779a414855

*** empty log message ***
author kono
date Wed, 02 Jun 2004 14:29:30 +0900
parents 912b54949344
children 55e611476cba
comparison
equal deleted inserted replaced
286:179e22f166ef 287:a0779a414855
279 static int my_func_args; 279 static int my_func_args;
280 static unsigned int code_mask(); 280 static unsigned int code_mask();
281 static int code_mask_offset(); 281 static int code_mask_offset();
282 static unsigned int code_fmask(); 282 static unsigned int code_fmask();
283 static int code_fmask_offset(); 283 static int code_fmask_offset();
284
285 static void jcond(int l, char cond);
284 286
285 #define ARG_LVAR_OFFSET 0x10000000 287 #define ARG_LVAR_OFFSET 0x10000000
286 288
287 #define round16(i) ((i+0xf)&~0xf) 289 #define round16(i) ((i+0xf)&~0xf)
288 #define round4(i) ((i+3)&~3) 290 #define round4(i) ((i+3)&~3)
1362 return cond?"":0; 1364 return cond?"":0;
1363 } 1365 }
1364 1366
1365 1367
1366 void 1368 void
1367 code_cmp_crgvar(int e1,int reg,int sz) { 1369 code_cmp_crgvar(int e1,int reg,int sz,int label,int cond) {
1368 int r; 1370 int r;
1369 char *crn; 1371 char *crn;
1370 use_int(reg); 1372 use_int(reg);
1371 crn = register_name(reg); 1373 crn = register_name(reg);
1372 r = get_ptr_cache((NMTBL*)cadr(e1)); 1374 r = get_ptr_cache((NMTBL*)cadr(e1));
1373 printf("\t%s %s,0(%s)\n",cload(sz,0),crn,register_name(r)); 1375 printf("\t%s %s,0(%s)\n",cload(sz,0),crn,register_name(r));
1374 cext(0,sz,r); 1376 cext(0,sz,r);
1375 cmpreg = reg; 1377 cmpreg = reg;
1376 // printf("\tcmpwi cr0,%s,0\n",crn); 1378 // printf("\tcmpwi cr0,%s,0\n",crn);
1377 } 1379 jcond(label,cond);
1378 1380 }
1379 1381
1380 void 1382
1381 code_cmp_crlvar(int e2,int reg, int sz) { 1383 void
1384 code_cmp_crlvar(int e2,int reg, int sz,int label,int cond) {
1382 char *crn; 1385 char *crn;
1383 use_int(reg); 1386 use_int(reg);
1384 crn = register_name(reg); 1387 crn = register_name(reg);
1385 lvar_intro(e2); 1388 lvar_intro(e2);
1386 printf("\t%s %s,",cload(sz,0),crn); 1389 printf("\t%s %s,",cload(sz,0),crn);
1387 lvar(e2); 1390 lvar(e2);
1388 cext(0,sz,reg); 1391 cext(0,sz,reg);
1389 code_cmp_register(reg); 1392 code_cmp_register(reg,label,cond);
1390 } 1393 }
1391 1394
1392 1395
1393 void 1396 void
1394 code_cmp_rgvar(int e1,int reg) { 1397 code_cmp_rgvar(int e1,int reg,int label,int cond) {
1395 int r; 1398 int r;
1396 char *crn; 1399 char *crn;
1397 use_int(reg); 1400 use_int(reg);
1398 crn = register_name(reg); 1401 crn = register_name(reg);
1399 r = get_ptr_cache((NMTBL*)cadr(e1)); 1402 r = get_ptr_cache((NMTBL*)cadr(e1));
1400 printf("\tlw %s,0(%s)\n",crn,register_name(r)); 1403 printf("\tlw %s,0(%s)\n",crn,register_name(r));
1401 code_cmp_register(reg); 1404 code_cmp_register(reg,label,cond);
1402 } 1405 }
1403 1406
1404 1407
1405 void 1408 void
1406 code_cmp_rlvar(int e2,int reg) { 1409 code_cmp_rlvar(int e2,int reg,int label,int cond) {
1407 char *crn; 1410 char *crn;
1408 use_int(reg); 1411 use_int(reg);
1409 crn = register_name(reg); 1412 crn = register_name(reg);
1410 lvar_intro(e2); 1413 lvar_intro(e2);
1411 printf("\tlw %s,",crn); 1414 printf("\tlw %s,",crn);
1412 lvar(e2); 1415 lvar(e2);
1413 code_cmp_register(reg); 1416 code_cmp_register(reg,label,cond);
1414 } 1417 }
1415 1418
1416 1419
1417 void 1420 void
1418 code_cmp_register(int e2) { 1421 code_cmp_register(int e2,int label,int cond) {
1419 use_int(e2); 1422 use_int(e2);
1420 cmpreg = e2; // used by jcond, beq $reg,$0,L_xx 1423 cmpreg = e2; // used by jcond, beq $reg,$0,L_xx
1424 jcond(label,cond);
1421 } 1425 }
1422 1426
1423 1427
1424 void 1428 void
1425 ascii(char *s) 1429 ascii(char *s)
2660 #define CMP_IMM (-2) 2664 #define CMP_IMM (-2)
2661 static char * cmpreg_1; 2665 static char * cmpreg_1;
2662 static char * cmpreg_2; 2666 static char * cmpreg_2;
2663 2667
2664 void 2668 void
2665 code_cmpdimm(int e, int csreg) 2669 code_cmpdimm(int e, int csreg,int label,int cond)
2666 { 2670 {
2667 /* used in dosiwtch() */ 2671 /* used in dosiwtch() */
2668 int reg; 2672 int reg;
2669 char *rn; 2673 char *rn;
2670 if(chk) return; 2674 if(chk) return;
2673 printf("\tli %s,%d\n",rn,e); 2677 printf("\tli %s,%d\n",rn,e);
2674 cmpreg_1 = rn; 2678 cmpreg_1 = rn;
2675 cmpreg_2 = register_name(csreg); 2679 cmpreg_2 = register_name(csreg);
2676 cmpreg=CMP_IMM; 2680 cmpreg=CMP_IMM;
2677 free_register(reg); 2681 free_register(reg);
2682 jcond(label,cond);
2678 } 2683 }
2679 2684
2680 void 2685 void
2681 code_opening(char *filename) 2686 code_opening(char *filename)
2682 { 2687 {
2779 emit_pop_free(e2); 2784 emit_pop_free(e2);
2780 } 2785 }
2781 2786
2782 #define CMP_C1T (-1) 2787 #define CMP_C1T (-1)
2783 2788
2784 void 2789 static void
2785 jcond(int l, char cond) 2790 jcond(int l, char cond)
2786 { 2791 {
2787 if (chk) return; 2792 if (chk) return;
2788 if (cmpreg==CMP_C1T) { 2793 if (cmpreg==CMP_C1T) {
2789 printf("\tbc1%s $L_%d\n",cond?"f":"t",l); 2794 printf("\tbc1%s $L_%d\n",cond?"f":"t",l);
3321 #define set_double(freg) if (regs[freg]) {regs[freg]=USING_DREG;} 3326 #define set_double(freg) if (regs[freg]) {regs[freg]=USING_DREG;}
3322 3327
3323 static void dconst(int l,int h,double value); 3328 static void dconst(int l,int h,double value);
3324 3329
3325 void 3330 void
3326 code_cmp_dregister(int e2,int d) 3331 code_cmp_dregister(int e2,int d,int label,int cond)
3327 { 3332 {
3328 char *grn,*frn; 3333 char *grn,*frn;
3329 int greg; 3334 int greg;
3330 use_float(d,e2); 3335 use_float(d,e2);
3331 3336
3335 set_dreg(DREGISTER_OPERAND,0); 3340 set_dreg(DREGISTER_OPERAND,0);
3336 dconst(DREGISTER_OPERAND_1_L,DREGISTER_OPERAND_1_H,0.0); 3341 dconst(DREGISTER_OPERAND_1_L,DREGISTER_OPERAND_1_H,0.0);
3337 extern_conv("dpcmp"); 3342 extern_conv("dpcmp");
3338 set_dreg(RET_DREGISTER,0); 3343 set_dreg(RET_DREGISTER,0);
3339 cmpreg = 2; 3344 cmpreg = 2;
3340 return; 3345 } else {
3341 } 3346 grn = register_name(greg = get_dregister(d));
3342 grn = register_name(greg = get_dregister(d)); 3347 frn = register_name(e2);
3343 frn = register_name(e2); 3348 printf("\tmtc1 $0,%s\n",grn);
3344 printf("\tmtc1 $0,%s\n",grn); 3349 printf("\tc.eq.s %s,%s\n",grn,frn);
3345 printf("\tc.eq.s %s,%s\n",grn,frn); 3350 free_register(greg);
3346 free_register(greg); 3351 cmpreg = CMP_C1T;
3347 cmpreg = CMP_C1T; 3352 }
3353 jcond(label,cond);
3348 return; 3354 return;
3349 } 3355 }
3350 3356
3351 void 3357 void
3352 code_dregister(int e2,int freg,int d) 3358 code_dregister(int e2,int freg,int d)
3682 lvar_intro(e2); 3688 lvar_intro(e2);
3683 printf("\tl.s %s,",fregister_name(freg)); lvar(e2); 3689 printf("\tl.s %s,",fregister_name(freg)); lvar(e2);
3684 } 3690 }
3685 3691
3686 void 3692 void
3687 code_cmp_drgvar(int e2,int reg,int d) 3693 code_cmp_drgvar(int e2,int reg,int d,int label,int cond)
3688 { 3694 {
3689 int r; 3695 int r;
3690 char *frn,*fr1; 3696 char *frn,*fr1;
3691 int g; 3697 int g;
3692 use_float(d,reg); 3698 use_float(d,reg);
3709 printf("\tmtc1 $0,%s\n",fr1); 3715 printf("\tmtc1 $0,%s\n",fr1);
3710 printf("\tfc.eq.s %s,%s\n",frn,fr1); 3716 printf("\tfc.eq.s %s,%s\n",frn,fr1);
3711 cmpreg = CMP_C1T; 3717 cmpreg = CMP_C1T;
3712 free_register(g); 3718 free_register(g);
3713 } 3719 }
3714 } 3720 jcond(label,cond);
3715 3721 }
3716 void 3722
3717 code_cmp_drlvar(int e2,int reg,int d) 3723 void
3724 code_cmp_drlvar(int e2,int reg,int d,int label,int cond)
3718 { 3725 {
3719 char *frn,*fr1; 3726 char *frn,*fr1;
3720 int g; 3727 int g;
3721 use_float(d,reg); 3728 use_float(d,reg);
3722 3729
3736 printf("\tmtc1 $0,%s\n",fr1); 3743 printf("\tmtc1 $0,%s\n",fr1);
3737 printf("\tfc.eq.s %s,%s\n",frn,fr1); 3744 printf("\tfc.eq.s %s,%s\n",frn,fr1);
3738 cmpreg = CMP_C1T; 3745 cmpreg = CMP_C1T;
3739 free_register(g); 3746 free_register(g);
3740 } 3747 }
3748 jcond(label,cond);
3741 } 3749 }
3742 3750
3743 static void 3751 static void
3744 code_double_lib(char *lib,int to,int reg,int oreg) 3752 code_double_lib(char *lib,int to,int reg,int oreg)
3745 { 3753 {
4238 lmove(reg,e2); 4246 lmove(reg,e2);
4239 } 4247 }
4240 } 4248 }
4241 4249
4242 void 4250 void
4243 code_cmp_lregister(int reg) 4251 code_cmp_lregister(int reg,int label,int cond)
4244 { 4252 {
4245 use_longlong(reg); 4253 use_longlong(reg);
4246 printf("\tor %s,%s,%s\n", 4254 printf("\tor %s,%s,%s\n",
4247 lregister_name_low(reg), 4255 lregister_name_low(reg),
4248 lregister_name_low(reg), 4256 lregister_name_low(reg),
4249 lregister_name_high(reg)); 4257 lregister_name_high(reg));
4250 code_cmp_register(regv_l(reg)); 4258 code_cmp_register(regv_l(reg),label,cond);
4251 } 4259 }
4252 4260
4253 void 4261 void
4254 code_cmp_lrgvar(int e1,int creg) 4262 code_cmp_lrgvar(int e1,int creg,int label,int cond)
4255 { 4263 {
4256 use_longlong(creg); 4264 use_longlong(creg);
4257 code_lrgvar(e1,creg); 4265 code_lrgvar(e1,creg);
4258 code_cmp_lregister(creg); 4266 code_cmp_lregister(creg,label,cond);
4259 } 4267 }
4260 4268
4261 void 4269 void
4262 code_cmp_lrlvar(int e1,int creg) 4270 code_cmp_lrlvar(int e1,int creg,int label,int cond)
4263 { 4271 {
4264 use_longlong(creg); 4272 use_longlong(creg);
4265 code_lrlvar(e1,creg); 4273 code_lrlvar(e1,creg);
4266 code_cmp_lregister(creg); 4274 code_cmp_lregister(creg,label,cond);
4267 } 4275 }
4268 4276
4269 void 4277 void
4270 code_lassign(int e2,int creg) 4278 code_lassign(int e2,int creg)
4271 { 4279 {
4647 code_lconst_op_p(int op,int e) 4655 code_lconst_op_p(int op,int e)
4648 { 4656 {
4649 int v; 4657 int v;
4650 if (car(e)==LCONST) { 4658 if (car(e)==LCONST) {
4651 if (!(-32766<lcadr(e)&&lcadr(e)<32767)) return 0; 4659 if (!(-32766<lcadr(e)&&lcadr(e)<32767)) return 0;
4652 v = lcaddr(e); 4660 v = lcadr(e);
4653 } else if (car(e)==CONST) { 4661 } else if (car(e)==CONST) {
4654 if (!(-32766<cadr(e)&&cadr(e)<32767)) return 0; 4662 if (!(-32766<cadr(e)&&cadr(e)<32767)) return 0;
4655 v = caddr(e); 4663 v = cadr(e);
4656 } else return 0; 4664 } else return 0;
4657 4665
4658 switch(op) { 4666 switch(op) {
4659 case LLSHIFT: 4667 case LLSHIFT:
4660 case LULSHIFT: 4668 case LULSHIFT:
4689 4697
4690 switch(op) { 4698 switch(op) {
4691 case LLSHIFT: 4699 case LLSHIFT:
4692 case LULSHIFT: 4700 case LULSHIFT:
4693 greg = get_register(); 4701 greg = get_register();
4694 use_reg(greg);
4695 grn = register_name(greg); 4702 grn = register_name(greg);
4696 printf("\tsll %s,%s,%d\n",grn,crn_l,32-v); 4703 printf("\tsll %s,%s,%d\n",crn_h,crn_h,v);
4697 printf("\tsrl %s,%s,%d\n",crn_h,crn_h,v); 4704 printf("\tsrl %s,%s,%d\n",grn,crn_l,32-v);
4698 printf("\tor %s,%s,%s\n",crn_h,grn,crn_h); 4705 printf("\tor %s,%s,%s\n",crn_h,crn_h,grn);
4699 printf("\tsll %s,%s,%d\n",crn_l,crn_l,v); 4706 printf("\tsll %s,%s,%d\n",crn_l,crn_l,v);
4700 free_register(greg); 4707 free_register(greg);
4701 return; 4708 return;
4702 case LRSHIFT: 4709 case LRSHIFT:
4703 greg = get_register(); 4710 greg = get_register();
4704 use_reg(greg);
4705 grn = register_name(greg); 4711 grn = register_name(greg);
4706 printf("\tsrl %s,%s,%d\n",grn,crn_l,v); 4712 printf("\tsrl %s,%s,%d\n",crn_l,crn_l,v);
4707 printf("\tsll %s,%s,%d\n",grn,crn_h,32-v); 4713 printf("\tsll %s,%s,%d\n",grn,crn_h,32-v);
4708 printf("\tor %s,%s,%s\n",grn,grn,grn); 4714 printf("\tor %s,%s,%s\n",crn_l,crn_l,grn);
4709 printf("\tsra %s,%s,%d\n",crn_h,crn_h,v); 4715 printf("\tsra %s,%s,%d\n",crn_h,crn_h,v);
4710 free_register(greg); 4716 free_register(greg);
4711 return; 4717 return;
4712 case LURSHIFT: 4718 case LURSHIFT:
4713 greg = get_register(); 4719 greg = get_register();
4714 use_reg(greg);
4715 grn = register_name(greg); 4720 grn = register_name(greg);
4716 printf("\tsll %s,%s,%d\n",grn,crn_h,32-v); 4721 printf("\tsll %s,%s,%d\n",grn,crn_h,32-v);
4717 printf("\tsrl %s,%s,%d\n",crn_l,crn_l,v); 4722 printf("\tsrl %s,%s,%d\n",crn_l,crn_l,v);
4718 printf("\tor %s,%s,%s\n",crn_l,grn,crn_l); 4723 printf("\tor %s,%s,%s\n",crn_l,grn,crn_l);
4719 printf("\tsrl %s,%s,%d\n",crn_h,crn_h,v); 4724 printf("\tsrl %s,%s,%d\n",crn_h,crn_h,v);
4733 printf("\taddu %s,%s,%d\n",crn_l,crn_l,v); 4738 printf("\taddu %s,%s,%d\n",crn_l,crn_l,v);
4734 printf("\taddu %s,%s,%s\n",crn_h,crn_h,drn); 4739 printf("\taddu %s,%s,%s\n",crn_h,crn_h,drn);
4735 } 4740 }
4736 break; 4741 break;
4737 case LBOR: 4742 case LBOR:
4738 printf("\tori %s,%s,lo16(%d)\n",crn_l,crn_l,v); 4743 printf("\tori %s,%s,%d\n",crn_l,crn_l,v);
4739 break; 4744 break;
4740 default: 4745 default:
4741 error(-1); 4746 error(-1);
4742 } 4747 }
4743 if (dx!=-1) free_register(dx); 4748 if (dx!=-1) free_register(dx);