diff mc-code-powerpc.c @ 288:ce7b4d90bc24

PowerPC code bool
author kono
date Thu, 03 Jun 2004 13:15:05 +0900 (2004-06-03)
parents a0779a414855
children 55e611476cba
line wrap: on
line diff
--- a/mc-code-powerpc.c	Wed Jun 02 14:29:30 2004 +0900
+++ b/mc-code-powerpc.c	Thu Jun 03 13:15:05 2004 +0900
@@ -1300,10 +1300,34 @@
 #endif
 }
 
+static int rexpr_bool(int e1,int reg);
+
+#if FLOAT_CODE
+static int drexpr_bool(int e1,int reg);
+#endif
+
+#if LONGLONG_CODE
+static int lrexpr_bool(int e1,int reg)
+{
+    return 0;
+}
+#endif
+
+
+
 void
 code_bool(int e1,int reg) {
     char *xrn;
     int e2,e3;
+
+    if (rexpr_bool(e1,reg)) return;
+#if FLOAT_CODE
+    else if (drexpr_bool(e1,reg)) return;
+#endif
+#if LONGLONG_CODE
+    else if (lrexpr_bool(e1,reg)) return;
+#endif
+
     b_expr(e1,1,e2=fwdlabel(),1);  /* including > < ... */
     use_int(reg);
     xrn = register_name(reg);
@@ -2531,6 +2555,39 @@
     printf(".text\n");
 }
 
+#define CRBITSIZ 4
+
+static int
+rexpr_bool(int e1,int reg)
+{
+    int t,flag=-1,eq=-1,neg=-1;
+    char *rn;
+    switch(car(e1)) {
+    case GT:  t=INT; flag = 2; break;
+    case UGT: t=0;   flag = 2; break;
+    case GE:  t=INT; flag = 2; eq=3; break;
+    case UGE: t=0;   flag = 2; eq=3; break;
+    case LT:  t=INT; flag = 1; break;
+    case ULT: t=0;   flag = 1; break;
+    case LE:  t=INT; flag = 1; eq=3; break;
+    case ULE: t=0;   flag = 1; eq=3; break;
+    case EQ:  t=INT; flag = 3; break;
+    case NEQ: t=INT; flag = 3; neg=1; break;
+    default: return 0;
+    }
+    g_expr(list3((t==INT?CMP:UCMP),cadr(e1),caddr(e1)));
+    use_int(reg);
+    rn = register_name(reg);
+    if (eq>0) {
+	printf("\tcror %d,%d,%d\n",CRBITSIZ*cmpflag+flag-1,
+	    CRBITSIZ*cmpflag+eq-1,CRBITSIZ*cmpflag+flag-1);
+    }
+    printf("\tmfcr %s\n",rn);
+    printf("\trlwinm %s,%s,%d,1\n",rn,rn,CRBITSIZ*cmpflag+flag);
+    if (neg>0) code_lnot(reg);
+    return 1;
+}
+
 void
 rexpr(int e1, int l1, int cond,int t)
 {       
@@ -2552,7 +2609,6 @@
     printf("\tb%s cr%d,L_%d\n",s,cmpflag,l1);
 }
 
-
 static void
 jcond(int l, char cond)
 {       
@@ -3422,12 +3478,12 @@
     case DMUL: opn="fmul"; break;
     case FCMP:
     case DCMP: 
-	printf("\tfcmpu cr7,%s,%s\n",frn,grn);
+	printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn);
 	if (ox!=-1) free_register(ox);
 	return;
     case FCMPGE: 
     case DCMPGE: 
-	printf("\tfcmpu cr7,%s,%s\n",frn,grn);
+	printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn);
 	if (ox!=-1) free_register(ox);
 	return;
     default:
@@ -3543,6 +3599,33 @@
     free_register(g);
 }
 
+static int
+drexpr_bool(int e1,int reg)
+{
+    int flag=-1,eq=-1,neg=-1;
+    char *rn;
+    switch(car(e1)) {
+    case DOP+GT: case FOP+GT:  flag = 2; break;
+    case DOP+GE: case FOP+GE:  flag = 2; eq=3; break;
+    case DOP+LT: case FOP+LT:  flag = 1; break;
+    case DOP+LE: case FOP+LE:  flag = 1; eq=3; break;
+    case DOP+EQ: case FOP+EQ:  flag = 3; break;
+    case DOP+NEQ: case FOP+NEQ: flag = 3; neg=1; break;
+    default: return 0;
+    }
+    g_expr(list3(DCMP,cadr(e1),caddr(e1)));
+    use_int(reg);
+    rn = register_name(reg);
+    if (eq>0) {
+	printf("\tcror %d,%d,%d\n",CRBITSIZ*cmpflag+flag-1,
+	    CRBITSIZ*cmpflag+eq-1,CRBITSIZ*cmpflag+flag-1);
+    }
+    printf("\tmfcr %s\n",rn);
+    printf("\trlwinm %s,%s,%d,1\n",rn,rn,CRBITSIZ*cmpflag+flag);
+    if (neg>0) code_lnot(reg);
+    return 1;
+}
+
 void
 drexpr(int e1, int e2,int l1, int op,int cond)
 {
@@ -3566,26 +3649,19 @@
 		op=DOP+EQ; break;
 	}
     }
-    // g_expr(list3( ((op==DOP+GE||op==FOP+GE)?DCMPGE:DCMP), e2,e1));
     g_expr(list3(DCMP, e1,e2));
     switch(op) {
-	case DOP+GT:
-	case FOP+GT:
-	    printf("\tbgt\tcr7,L_%d\n",l1);
+	case DOP+GT: case FOP+GT:
+	    printf("\tbgt\tcr%d,L_%d\n",cmpflag,l1);
+	    break;
+	case DOP+GE: case FOP+GE:
+	    printf("\tbge\tcr%d,L_%d\n",cmpflag,l1);
 	    break;
-	case DOP+GE:
-	case FOP+GE:
-	    // printf("\tcrnor 30,29,30\n");
-	    // printf("\tbeq\tcr7,L_%d\n",l1);
-	    printf("\tbge\tcr7,L_%d\n",l1);
+	case DOP+EQ: case FOP+EQ:
+	    printf("\tbeq\tcr%d,L_%d\n",cmpflag,l1);
 	    break;
-	case DOP+EQ:
-	case FOP+EQ:
-	    printf("\tbeq\tcr7,L_%d\n",l1);
-	    break;
-	case DOP+NEQ:
-	case FOP+NEQ:
-	    printf("\tbne\tcr7,L_%d\n",l1);
+	case DOP+NEQ: case FOP+NEQ:
+	    printf("\tbne\tcr%d,L_%d\n",cmpflag,l1);
 	    break;
     }
 }