diff mc-code-ia32.c @ 280:affb054fe920

lrexpr fix. rexpr in MIPS fix.
author kono
date Sun, 23 May 2004 15:27:25 +0900
parents c922bade771d
children 179e22f166ef
line wrap: on
line diff
--- a/mc-code-ia32.c	Sat May 22 13:00:03 2004 +0900
+++ b/mc-code-ia32.c	Sun May 23 15:27:25 2004 +0900
@@ -1593,8 +1593,22 @@
 }
 
 void
-rexpr(int e1, int l1, char *s,int t)
-{       
+rexpr(int e1, int l1, int cond,int t)
+{
+    char *s;
+    switch(car(e1)) {
+    case GT:  s=code_gt(cond);	break;
+    case UGT: s=code_ugt(cond);	break;
+    case GE:  s=code_ge(cond);	break;
+    case UGE: s=code_uge(cond);	break;
+    case LT:  s=code_ge(!cond);	break;
+    case ULT: s=code_uge(!cond);break;
+    case LE:  s=code_gt(!cond);	break;
+    case ULE: s=code_ugt(!cond);break;
+    case EQ:  s=code_eq(cond);	break;
+    case NEQ: s=code_eq(!cond);	break;
+    default: error(-1);
+    }
     g_expr(list3(CMP,cadr(e1),caddr(e1)));
     printf("\tj%s\t_%d\n",s,l1);
 }
@@ -2329,32 +2343,47 @@
 void
 lrexpr(int e1, int e2,int l1, int op,int cond)
 {
-    int e3;
+    int l2;
+    code_save_stacks();
     g_expr(e1);
     emit_lpush();
     g_expr(e2);
-    ltosop(LSUB,USE_CREG,(e3==emit_lpop()));
-//    printf("\tpopl %%eax\n\tpopl %%edx\n");  // emit_pop_free
+    // we are sure %ecx,%ebx is free
+    printf("\tpopl %%ecx\n");   // LSW
+    printf("\tpopl %%ebx\n");   // MSW
+    printf("\tsubl %%edx,%%ebx\n");
+    l2 = fwdlabel();
+    // cond==0 jump on false condtion   ( if(x) => rexpr(..  cond=0 ...) )
     switch(op) {
     case LOP+GT:
-        pcond(code_gt(cond),l1); break;
     case LOP+GE:
-        pcond(code_ge(cond),l1); break;
+        pcond(code_gt(1),cond?l1:l2);
+        pcond(code_eq(0),cond?l2:l1);
+        break;
+    case LOP+UGT:
+    case LOP+UGE:
+        pcond(code_ugt(1),cond?l1:l2);
+        pcond(code_eq(0), cond?l2:l1);
+        break;
     case LOP+EQ:
-        pcond(code_eq(cond),l1); break;
+        pcond(code_eq(0),(cond?l2:l1));
+        pcond(code_eq(cond),l1);
+        break;
     case LOP+NEQ:
-        pcond(code_eq(!cond),l1); break;
-    case LOP+LT:
-        pcond(code_ge(!cond),l1); break;
-    case LOP+LE:
-        pcond(code_gt(!cond),l1); break;
-    case LOP+UGT:
-        pcond(code_ugt(cond),l1); break;
-    case LOP+UGE:
-        pcond(code_uge(cond),l1); break;
+        pcond(code_eq(0),(cond?l1:l2));
+        pcond(code_eq(!cond),l1);
+        break;
     default:
         error(-1);
     }
+    printf("\tsubl %%eax,%%ecx\n");
+    switch(op) {
+    case LOP+GT:  pcond(code_gt(cond),  l1); break;
+    case LOP+GE:  pcond(code_ge(cond),  l1); break;
+    case LOP+UGT: pcond(code_ugt(cond), l1); break;  
+    case LOP+UGE: pcond(code_uge(cond), l1); break;  
+    }  
+    fwddef(l2); 
 }
 
 int emit_lpop()