Mercurial > hg > CbC > old > device
diff mc-code-i64.c @ 772:37e27e0c77d0
code-gen-all test passed.
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 18 Nov 2010 17:02:54 +0900 |
parents | 5e07b9804aea |
children | be917edcb671 |
line wrap: on
line diff
--- a/mc-code-i64.c Thu Nov 18 12:08:55 2010 +0900 +++ b/mc-code-i64.c Thu Nov 18 17:02:54 2010 +0900 @@ -3704,6 +3704,8 @@ use_int(reg); int c = reg; set_freg(get_dregister(1),0); + printf("\tsalq $32,%s\n",register_name(c,0)); + printf("\tsarq $32,%s\n",register_name(c,0)); printf("\tcvtsi2sd %s,%s\n",register_name(c,0),fregister_name(freg)); } @@ -3777,6 +3779,8 @@ use_int(reg); int c = reg; set_freg(get_dregister(0),0); + printf("\tsalq $32,%s\n",register_name(c,0)); + printf("\tsarq $32,%s\n",register_name(c,0)); printf("\tcvtsi2ss %s,%s\n",register_name(c,0),fregister_name(creg)); } void code_u2f(int reg) { @@ -3870,7 +3874,7 @@ printf("\tucomiss "); lvar(oreg); printf(",%s\n",frn); } else { - printf("\tucomiss %s,%s\n",frn,grn); + printf("\tucomiss %s,%s\n",grn,frn); } if (ox!=-1) free_register(ox); return; @@ -3879,7 +3883,7 @@ printf("\tucomisd "); lvar(oreg); printf(",%s\n",frn); } else { - printf("\tucomisd %s,%s\n",frn,grn); + printf("\tucomisd %s,%s\n",grn,frn); } if (ox!=-1) free_register(ox); return; @@ -3950,7 +3954,7 @@ code_dpreinc(int e1,int e2,int d,int reg) { char *frn,*crn,*grn; int g; - char *ops = (caddr(e1)>0)?(d?"addsd":"addss"):(d?"subsd":"addss"); + char *ops = (caddr(e1)>0)?(d?"addsd":"addss"):(d?"subsd":"subss"); if (car(e2)==DREGISTER||car(e2)==FREGISTER) { crn=fregister_name(cadr(e2)); @@ -3983,8 +3987,8 @@ void code_dpostinc(int e1,int e2,int d,int reg) { char *frn,*crn,*grn; - int g; - char *ops = (caddr(e1)>0)?(d?"addsd":"addss"):(d?"subsd":"addss"); + int g,t; + char *ops = (caddr(e1)>0)?(d?"addsd":"addss"):(d?"subsd":"subss"); if (car(e2)==DREGISTER||car(e2)==FREGISTER) { crn=fregister_name(cadr(e2)); @@ -4008,8 +4012,15 @@ frn=fregister_name(reg); grn = fregister_name(g = code_dload_1(d,get_dregister(d))); printf("\t%s 0(%s),%s\n",fload(d),crn,frn); - printf("\t%s %s,%s\n",ops,frn,grn); - printf("\t%s %s,0(%s)\n",fstore(d),grn,crn); + if (use) { + t = get_dregister(d); + printf("\tmovap%s %s,%s\n",d?"d":"s",frn,fregister_name(t)); + } + printf("\t%s %s,%s\n",ops,grn,frn); + printf("\t%s %s,0(%s)\n",fstore(d),frn,crn); + if (use) { + set_freg(t,0); + } } free_register(g); } @@ -4024,20 +4035,20 @@ drexpr0(int e1, int e2,int l1, int op,int cond,int reg,int mode) { char *s; - if (cond) { + if (!cond) { switch(op) { case FOP+GT: - return drexpr0(e2,e1,l1,FOP+GE,0,reg,mode); + return drexpr0(e2,e1,l1,FOP+GE,1,reg,mode); case FOP+GE: - return drexpr0(e2,e1,l1,FOP+GT,0,reg,mode); + return drexpr0(e2,e1,l1,FOP+GT,1,reg,mode); case FOP+EQ: op=FOP+NEQ; break; case FOP+NEQ: op=FOP+EQ; break; case DOP+GT: - return drexpr0(e2,e1,l1,DOP+GE,0,reg,mode); + return drexpr0(e2,e1,l1,DOP+GE,1,reg,mode); case DOP+GE: - return drexpr0(e2,e1,l1,DOP+GT,0,reg,mode); + return drexpr0(e2,e1,l1,DOP+GT,1,reg,mode); case DOP+EQ: op=DOP+NEQ; break; case DOP+NEQ: @@ -4045,14 +4056,14 @@ default: return 0; } } - s = "b"; + s = "a"; int cmp = FCMP; switch(op) { case DOP+GE: cmp = DCMP; case FOP+GE: g_expr(list3(cmp,e1,e2)); - s = "be"; + s = "ae"; break; case DOP+GT: cmp = DCMP; @@ -4088,14 +4099,14 @@ int drexpr(int e1, int e2,int l1, int op,int cond) { - drexpr0(e1, e2,l1, op,!cond,USE_CREG,COND_BRANCH); + drexpr0(e1, e2,l1, op,cond,USE_CREG,COND_BRANCH); return l1; } static int drexpr_bool(int e1, int reg) { - return drexpr0(cadr(e1), caddr(e1),0, car(e1),0,reg,COND_VALUE); + return drexpr0(cadr(e1), caddr(e1),0, car(e1),1,reg,COND_VALUE); } @@ -4447,7 +4458,10 @@ void code_ll2f(int reg) { - code_ll2d(reg); + use_longlong(reg); + char *f = register_name(reg,0); + set_freg(get_dregister(1),0); + printf("\tcvtsi2ssq %s,%s\n",f,fregister_name(freg)); } void code_ull2d(int reg) @@ -4457,7 +4471,7 @@ void code_ull2f(int reg) { - code_ll2d(reg); + code_ll2f(reg); } #endif @@ -4527,7 +4541,7 @@ code_register_lassop(int reg,int op) { use_longlong(reg); int xreg = emit_lpop(); - ltosop(op,xreg,reg); + ltosop(op,reg,xreg); emit_lpop_free(xreg); }