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