changeset 229:d793c84b3679

*** empty log message ***
author kono
date Wed, 28 Apr 2004 00:02:59 +0900
parents 21b311266011
children d60c6c31f63a
files mc-code-powerpc.c mc-code.h mc-codegen.c test/code-gen.c
diffstat 4 files changed, 63 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/mc-code-powerpc.c	Tue Apr 27 23:16:02 2004 +0900
+++ b/mc-code-powerpc.c	Wed Apr 28 00:02:59 2004 +0900
@@ -3190,17 +3190,39 @@
 }
 
 void
-drexpr(int e1, int e2,int l1, int op)
-{       
-    g_expr(list3(((op==DOP+GE)?DCMPGE:DCMP),e1,e2));
+drexpr(int e1, int e2,int l1, int op,int cond)
+{
+    if (cond) {
+	switch(op) {
+	    case FOP+GT:
+		drexpr(e2,e1,l1,FOP+GE,0); break;
+	    case FOP+GE:
+		drexpr(e2,e1,l1,FOP+GT,0); break;
+	    case FOP+EQ:
+		op=FOP+NEQ; break;
+	    case FOP+NEQ:
+		op=FOP+EQ; break;
+	    case DOP+GT:
+		drexpr(e2,e1,l1,DOP+GE,0); break;
+	    case DOP+GE:
+		drexpr(e2,e1,l1,DOP+GT,0); break;
+	    case DOP+EQ:
+		op=DOP+NEQ; break;
+	    case DOP+NEQ:
+		op=DOP+EQ; break;
+	}
+    }
+    g_expr(list3(
+	((op==DOP+GT||op==DOP+GE||op==FOP+GT||op==FOP+GE)?DCMPGE:DCMP),
+	e2,e1));
     switch(op) {
+	case DOP+GT:
+	case FOP+GT:
+	    printf("\tcror 30,29,30\n");
+	    printf("\tbeq\tcr0,L_%d\n",l1);
+	    break;
 	case DOP+GE:
 	case FOP+GE:
-	    printf("\tcrnor 30,29,30\n");
-	    printf("\tbeq\tcr0,L_%d\n",l1);
-	    break;
-	case DOP+GT:
-	case FOP+GT:
 	    printf("\tble\tcr0,L_%d\n",l1);
 	    break;
 	case DOP+EQ:
@@ -3270,13 +3292,13 @@
 }
 
 static void
-cond(char *s,int l1)
+pcond(char *s,int l1)
 {
     printf("\tb%s cr0,L_%d\n",s,l1);
 }
 
 void
-lrexpr(int e1, int e2,int l1, int op)
+lrexpr(int e1, int e2,int l1, int op,int cond)
 {
     int reg;
     int e3;
@@ -3290,42 +3312,42 @@
     tosop(CMP,regv_h(reg),regv_h(e3));
     switch(op) {
     case LOP+GT:
-    	cond(code_gt(1),l1); break;
+    	pcond(code_gt(cond),l1); break;
     case LOP+GE:
-    	cond(code_ge(1),l1); break;
+    	pcond(code_ge(cond),l1); break;
     case LOP+EQ:
-    	cond(code_eq(1),l1); break;
+    	pcond(code_eq(cond),l1); break;
     case LOP+NEQ:
-    	cond(code_eq(0),l1); break;
+    	pcond(code_eq(!cond),l1); break;
     case LOP+LT:
-    	cond(code_ge(0),l1); break;
+    	pcond(code_ge(!cond),l1); break;
     case LOP+LE:
-    	cond(code_gt(0),l1); break;
+    	pcond(code_gt(!cond),l1); break;
     case LOP+UGT:
-    	cond(code_ugt(1),l1); break;
+    	pcond(code_ugt(cond),l1); break;
     case LOP+UGE:
-    	cond(code_uge(1),l1); break;
+    	pcond(code_uge(cond),l1); break;
     default:
 	error(-1);
     }
     tosop(CMP,regv_l(reg),regv_l(e3));
     switch(op) {
     case LOP+GT:
-    	cond(code_gt(1),l1); break;
+    	pcond(code_gt(cond),l1); break;
     case LOP+GE:
-    	cond(code_ge(1),l1); break;
+    	pcond(code_ge(cond),l1); break;
     case LOP+EQ:
-    	cond(code_eq(1),l1); break;
+    	pcond(code_eq(cond),l1); break;
     case LOP+NEQ:
-    	cond(code_eq(0),l1); break;
+    	pcond(code_eq(!cond),l1); break;
     case LOP+LT:
-    	cond(code_ge(0),l1); break;
+    	pcond(code_ge(!cond),l1); break;
     case LOP+LE:
-    	cond(code_gt(0),l1); break;
+    	pcond(code_gt(!cond),l1); break;
     case LOP+UGT:
-    	cond(code_ugt(1),l1); break;
+    	pcond(code_ugt(cond),l1); break;
     case LOP+UGE:
-    	cond(code_uge(1),l1); break;
+    	pcond(code_uge(cond),l1); break;
     default:
 	error(-1);
     }
--- a/mc-code.h	Tue Apr 27 23:16:02 2004 +0900
+++ b/mc-code.h	Wed Apr 28 00:02:59 2004 +0900
@@ -112,7 +112,7 @@
 #if FLOAT_CODE
 /* floating point part */
 
-extern void drexpr(int e1, int e2,int l1, int op);
+extern void drexpr(int e1, int e2,int l1, int op,int cond);
 extern int dpop_register();
 extern int emit_dpop(int);
 extern void code_dregister(int e2,int reg,int d);
@@ -152,7 +152,7 @@
 #if LONGLONG_CODE
 /* 64bit int part */
 
-extern void lrexpr(int e1, int e2,int l1, int op);
+extern void lrexpr(int e1, int e2,int l1, int op,int cond);
 extern int lpop_register();
 extern int emit_lpop();
 extern void code_lregister(int e2,int reg);
--- a/mc-codegen.c	Tue Apr 27 23:16:02 2004 +0900
+++ b/mc-codegen.c	Wed Apr 28 00:02:59 2004 +0900
@@ -528,19 +528,19 @@
     case FOP+GE:
     case FOP+EQ:
     case FOP+NEQ:
-	drexpr(cadr(e1),caddr(e1),l1,car(e1));
+	drexpr(cadr(e1),caddr(e1),l1,car(e1),cond);
 	return;
     case FOP+LT:
-	drexpr(caddr(e1),cadr(e1),l1,FOP+GT);
+	drexpr(caddr(e1),cadr(e1),l1,FOP+GT,cond);
 	return;
     case FOP+LE:
-	drexpr(caddr(e1),cadr(e1),l1,FOP+GE);
+	drexpr(caddr(e1),cadr(e1),l1,FOP+GE,cond);
 	return;
     case DOP+LT:
-	drexpr(caddr(e1),cadr(e1),l1,DOP+GT);
+	drexpr(caddr(e1),cadr(e1),l1,DOP+GT,cond);
 	return;
     case DOP+LE:
-	drexpr(caddr(e1),cadr(e1),l1,DOP+GE);
+	drexpr(caddr(e1),cadr(e1),l1,DOP+GE,cond);
 	return;
 #endif
 #if LONGLONG_CODE
@@ -548,23 +548,23 @@
     case LOP+GE:
     case LOP+EQ:
     case LOP+NEQ:
-	lrexpr(cadr(e1),caddr(e1),l1,car(e1));
+	lrexpr(cadr(e1),caddr(e1),l1,car(e1),cond);
 	return;
     case LOP+LT:
-	lrexpr(caddr(e1),cadr(e1),l1,LOP+GT);
+	lrexpr(caddr(e1),cadr(e1),l1,LOP+GT,cond);
 	return;
     case LOP+LE:
-	lrexpr(caddr(e1),cadr(e1),l1,LOP+GE);
+	lrexpr(caddr(e1),cadr(e1),l1,LOP+GE,cond);
 	return;
     case LOP+UGT:
     case LOP+UGE:
-	lrexpr(cadr(e1),caddr(e1),l1,car(e1));
+	lrexpr(cadr(e1),caddr(e1),l1,car(e1),cond);
 	return;
     case LOP+ULT:
-	lrexpr(caddr(e1),cadr(e1),l1,LOP+UGT);
+	lrexpr(caddr(e1),cadr(e1),l1,LOP+UGT,cond);
 	return;
     case LOP+ULE:
-	lrexpr(caddr(e1),cadr(e1),l1,LOP+UGE);
+	lrexpr(caddr(e1),cadr(e1),l1,LOP+UGE,cond);
 	return;
 #endif
     case LAND:
--- a/test/code-gen.c	Tue Apr 27 23:16:02 2004 +0900
+++ b/test/code-gen.c	Wed Apr 28 00:02:59 2004 +0900
@@ -1023,9 +1023,9 @@
 code_dgt()
 {
     if (d0>d1)
-	printf("code_gt 1\n");
+	printf("code_dgt 1\n");
     else
-	printf("code_gt 0\n");
+	printf("code_dgt 0\n");
 }
 
 // code_ugt(int cond)