Mercurial > hg > CbC > old > device
diff mc-code-mips.c @ 287:a0779a414855
*** empty log message ***
author | kono |
---|---|
date | Wed, 02 Jun 2004 14:29:30 +0900 |
parents | 912b54949344 |
children | 55e611476cba |
line wrap: on
line diff
--- a/mc-code-mips.c Wed Jun 02 13:19:13 2004 +0900 +++ b/mc-code-mips.c Wed Jun 02 14:29:30 2004 +0900 @@ -282,6 +282,8 @@ static unsigned int code_fmask(); static int code_fmask_offset(); +static void jcond(int l, char cond); + #define ARG_LVAR_OFFSET 0x10000000 #define round16(i) ((i+0xf)&~0xf) @@ -1364,7 +1366,7 @@ void -code_cmp_crgvar(int e1,int reg,int sz) { +code_cmp_crgvar(int e1,int reg,int sz,int label,int cond) { int r; char *crn; use_int(reg); @@ -1374,11 +1376,12 @@ cext(0,sz,r); cmpreg = reg; // printf("\tcmpwi cr0,%s,0\n",crn); + jcond(label,cond); } void -code_cmp_crlvar(int e2,int reg, int sz) { +code_cmp_crlvar(int e2,int reg, int sz,int label,int cond) { char *crn; use_int(reg); crn = register_name(reg); @@ -1386,38 +1389,39 @@ printf("\t%s %s,",cload(sz,0),crn); lvar(e2); cext(0,sz,reg); - code_cmp_register(reg); + code_cmp_register(reg,label,cond); } void -code_cmp_rgvar(int e1,int reg) { +code_cmp_rgvar(int e1,int reg,int label,int cond) { int r; char *crn; use_int(reg); crn = register_name(reg); r = get_ptr_cache((NMTBL*)cadr(e1)); printf("\tlw %s,0(%s)\n",crn,register_name(r)); - code_cmp_register(reg); + code_cmp_register(reg,label,cond); } void -code_cmp_rlvar(int e2,int reg) { +code_cmp_rlvar(int e2,int reg,int label,int cond) { char *crn; use_int(reg); crn = register_name(reg); lvar_intro(e2); printf("\tlw %s,",crn); lvar(e2); - code_cmp_register(reg); + code_cmp_register(reg,label,cond); } void -code_cmp_register(int e2) { +code_cmp_register(int e2,int label,int cond) { use_int(e2); cmpreg = e2; // used by jcond, beq $reg,$0,L_xx + jcond(label,cond); } @@ -2662,7 +2666,7 @@ static char * cmpreg_2; void -code_cmpdimm(int e, int csreg) +code_cmpdimm(int e, int csreg,int label,int cond) { /* used in dosiwtch() */ int reg; @@ -2675,6 +2679,7 @@ cmpreg_2 = register_name(csreg); cmpreg=CMP_IMM; free_register(reg); + jcond(label,cond); } void @@ -2781,7 +2786,7 @@ #define CMP_C1T (-1) -void +static void jcond(int l, char cond) { if (chk) return; @@ -3323,7 +3328,7 @@ static void dconst(int l,int h,double value); void -code_cmp_dregister(int e2,int d) +code_cmp_dregister(int e2,int d,int label,int cond) { char *grn,*frn; int greg; @@ -3337,14 +3342,15 @@ extern_conv("dpcmp"); set_dreg(RET_DREGISTER,0); cmpreg = 2; - return; + } else { + grn = register_name(greg = get_dregister(d)); + frn = register_name(e2); + printf("\tmtc1 $0,%s\n",grn); + printf("\tc.eq.s %s,%s\n",grn,frn); + free_register(greg); + cmpreg = CMP_C1T; } - grn = register_name(greg = get_dregister(d)); - frn = register_name(e2); - printf("\tmtc1 $0,%s\n",grn); - printf("\tc.eq.s %s,%s\n",grn,frn); - free_register(greg); - cmpreg = CMP_C1T; + jcond(label,cond); return; } @@ -3684,7 +3690,7 @@ } void -code_cmp_drgvar(int e2,int reg,int d) +code_cmp_drgvar(int e2,int reg,int d,int label,int cond) { int r; char *frn,*fr1; @@ -3711,10 +3717,11 @@ cmpreg = CMP_C1T; free_register(g); } + jcond(label,cond); } void -code_cmp_drlvar(int e2,int reg,int d) +code_cmp_drlvar(int e2,int reg,int d,int label,int cond) { char *frn,*fr1; int g; @@ -3738,6 +3745,7 @@ cmpreg = CMP_C1T; free_register(g); } + jcond(label,cond); } static void @@ -4240,30 +4248,30 @@ } void -code_cmp_lregister(int reg) +code_cmp_lregister(int reg,int label,int cond) { use_longlong(reg); printf("\tor %s,%s,%s\n", lregister_name_low(reg), lregister_name_low(reg), lregister_name_high(reg)); - code_cmp_register(regv_l(reg)); + code_cmp_register(regv_l(reg),label,cond); } void -code_cmp_lrgvar(int e1,int creg) +code_cmp_lrgvar(int e1,int creg,int label,int cond) { use_longlong(creg); code_lrgvar(e1,creg); - code_cmp_lregister(creg); + code_cmp_lregister(creg,label,cond); } void -code_cmp_lrlvar(int e1,int creg) +code_cmp_lrlvar(int e1,int creg,int label,int cond) { use_longlong(creg); code_lrlvar(e1,creg); - code_cmp_lregister(creg); + code_cmp_lregister(creg,label,cond); } void @@ -4649,10 +4657,10 @@ int v; if (car(e)==LCONST) { if (!(-32766<lcadr(e)&&lcadr(e)<32767)) return 0; - v = lcaddr(e); + v = lcadr(e); } else if (car(e)==CONST) { if (!(-32766<cadr(e)&&cadr(e)<32767)) return 0; - v = caddr(e); + v = cadr(e); } else return 0; switch(op) { @@ -4691,27 +4699,24 @@ case LLSHIFT: case LULSHIFT: greg = get_register(); - use_reg(greg); grn = register_name(greg); - printf("\tsll %s,%s,%d\n",grn,crn_l,32-v); - printf("\tsrl %s,%s,%d\n",crn_h,crn_h,v); - printf("\tor %s,%s,%s\n",crn_h,grn,crn_h); + printf("\tsll %s,%s,%d\n",crn_h,crn_h,v); + printf("\tsrl %s,%s,%d\n",grn,crn_l,32-v); + printf("\tor %s,%s,%s\n",crn_h,crn_h,grn); printf("\tsll %s,%s,%d\n",crn_l,crn_l,v); free_register(greg); return; case LRSHIFT: greg = get_register(); - use_reg(greg); grn = register_name(greg); - printf("\tsrl %s,%s,%d\n",grn,crn_l,v); + printf("\tsrl %s,%s,%d\n",crn_l,crn_l,v); printf("\tsll %s,%s,%d\n",grn,crn_h,32-v); - printf("\tor %s,%s,%s\n",grn,grn,grn); + printf("\tor %s,%s,%s\n",crn_l,crn_l,grn); printf("\tsra %s,%s,%d\n",crn_h,crn_h,v); free_register(greg); return; case LURSHIFT: greg = get_register(); - use_reg(greg); grn = register_name(greg); printf("\tsll %s,%s,%d\n",grn,crn_h,32-v); printf("\tsrl %s,%s,%d\n",crn_l,crn_l,v); @@ -4735,7 +4740,7 @@ } break; case LBOR: - printf("\tori %s,%s,lo16(%d)\n",crn_l,crn_l,v); + printf("\tori %s,%s,%d\n",crn_l,crn_l,v); break; default: error(-1);