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);
 }