changeset 232:8a23c20ac92d

*** empty log message ***
author kono
date Thu, 29 Apr 2004 03:47:07 +0900
parents f5efe15629d4
children 2208a18f3799
files Changes mc-code-powerpc.c mc-codegen.c stdio.h test/float.c test/long.c
diffstat 6 files changed, 63 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Wed Apr 28 21:33:45 2004 +0900
+++ b/Changes	Thu Apr 29 03:47:07 2004 +0900
@@ -4081,3 +4081,13 @@
 でもないか。
 
 なんか、いろいろ直した割に、進んでないな。
+
+code_bool がjmpを使うのはいかにもまずいよね。そうねぇ。
+
+しかし、float/double printf("%d",f0>f1) の真偽値だけが反転する
+バグが取れない。
+
+code-gen.c の方は動いたが、float.c の方がだめ。
+なんか、まるででたらめに動いているみたい....
+
+function() の中で、lreg がinput registerと重なってしまう。
--- a/mc-code-powerpc.c	Wed Apr 28 21:33:45 2004 +0900
+++ b/mc-code-powerpc.c	Thu Apr 29 03:47:07 2004 +0900
@@ -1711,19 +1711,21 @@
 		// put whole long long anyway
 		arg = list2(LVAR,caller_arg_offset_v(nargs));
 		arg_assign = list2(
-		    assign_expr0(get_input_register_var(reg_arg,0,0),
+		    assign_expr0(r0=get_input_register_var(reg_arg,0,0),
 			arg,INT,INT),
 		    arg_assign);
+		use_reg(cadr(r0));
 	    } else if (!simple_args(e3) && cadr(e3)) {
 		arg = get_lregister_var(0); 
 		arg_assign = list2(
-		    assign_expr0(get_input_lregister_var(reg_arg,0,0),
+		    assign_expr0(r0=get_input_lregister_var(reg_arg,0,0),
 			arg,t,t),
 		    arg_assign);
+		use_reg(cadr(r0));
 	    } else {
 		arg = get_input_lregister_var(reg_arg,0,0); 
+		use_reg(cadr(arg));
 	    }
-	    if (car(arg)==LREGISTER) use_reg(cadr(arg)); 
 	    reg_arg_list = list2(arg,reg_arg_list);
 	    g_expr_u(assign_expr0(arg,e4,t,t));
 	    nargs ++ ; reg_arg++;
@@ -3207,17 +3209,17 @@
     if (!cond) {
 	switch(op) {
 	    case FOP+GT:
-		drexpr(e2,e1,l1,FOP+GE,1); break;
+		drexpr(e2,e1,l1,FOP+GE,1); return;
 	    case FOP+GE:
-		drexpr(e2,e1,l1,FOP+GT,1); break;
+		drexpr(e2,e1,l1,FOP+GT,1); return;
 	    case FOP+EQ:
 		op=FOP+NEQ; break;
 	    case FOP+NEQ:
 		op=FOP+EQ; break;
 	    case DOP+GT:
-		drexpr(e2,e1,l1,DOP+GE,1); break;
+		drexpr(e2,e1,l1,DOP+GE,1); return;
 	    case DOP+GE:
-		drexpr(e2,e1,l1,DOP+GT,1); break;
+		drexpr(e2,e1,l1,DOP+GT,1); return;
 	    case DOP+EQ:
 		op=DOP+NEQ; break;
 	    case DOP+NEQ:
@@ -3225,17 +3227,17 @@
 	}
     }
     g_expr(list3(
-	((op==DOP+GT||op==DOP+GE||op==FOP+GT||op==FOP+GE)?DCMPGE:DCMP),
+	((op==DOP+GE||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);
+	    printf("\tble\tcr0,L_%d\n",l1);
 	    break;
 	case DOP+GE:
 	case FOP+GE:
-	    printf("\tble\tcr0,L_%d\n",l1);
+	    printf("\tcrnor 30,29,30\n");
+	    printf("\tbeq\tcr7,L_%d\n",l1);
 	    break;
 	case DOP+EQ:
 	case FOP+EQ:
--- a/mc-codegen.c	Wed Apr 28 21:33:45 2004 +0900
+++ b/mc-codegen.c	Thu Apr 29 03:47:07 2004 +0900
@@ -436,6 +436,7 @@
 int
 rop_dual(op)
 {
+    //   x op y => y dual(op) x
     switch(op) {
     case GT: return LT;
     case UGT: return ULT;
@@ -531,16 +532,10 @@
 	drexpr(cadr(e1),caddr(e1),l1,car(e1),cond);
 	return;
     case FOP+LT:
-	drexpr(caddr(e1),cadr(e1),l1,FOP+GE,!cond);
-	return;
     case FOP+LE:
-	drexpr(caddr(e1),cadr(e1),l1,FOP+GT,!cond);
-	return;
     case DOP+LT:
-	drexpr(caddr(e1),cadr(e1),l1,DOP+GE,!cond);
-	return;
     case DOP+LE:
-	drexpr(caddr(e1),cadr(e1),l1,DOP+GT,!cond);
+	drexpr(caddr(e1),cadr(e1),l1,rop_dual(car(e1)),cond);
 	return;
 #endif
 #if LONGLONG_CODE
@@ -548,23 +543,15 @@
     case LOP+GE:
     case LOP+EQ:
     case LOP+NEQ:
-	lrexpr(cadr(e1),caddr(e1),l1,car(e1),cond);
-	return;
-    case LOP+LT:
-	lrexpr(caddr(e1),cadr(e1),l1,LOP+GE,!cond);
-	return;
-    case LOP+LE:
-	lrexpr(caddr(e1),cadr(e1),l1,LOP+GT,!cond);
-	return;
     case LOP+UGT:
     case LOP+UGE:
 	lrexpr(cadr(e1),caddr(e1),l1,car(e1),cond);
 	return;
+    case LOP+LT:
+    case LOP+LE:
     case LOP+ULT:
-	lrexpr(caddr(e1),cadr(e1),l1,LOP+UGE,!cond);
-	return;
     case LOP+ULE:
-	lrexpr(caddr(e1),cadr(e1),l1,LOP+UGT,!cond);
+	lrexpr(caddr(e1),cadr(e1),l1,rop_dual(car(e1)),cond);
 	return;
 #endif
     case LAND:
--- a/stdio.h	Wed Apr 28 21:33:45 2004 +0900
+++ b/stdio.h	Thu Apr 29 03:47:07 2004 +0900
@@ -1,7 +1,9 @@
 #ifndef __micro_c__aaa 
 #include "/usr/include/stdio.h"
+long long strtoll(const char *, char **, int);
 #else
 
+
 #ifdef __APPLE__
 
 typedef	struct {
--- a/test/float.c	Wed Apr 28 21:33:45 2004 +0900
+++ b/test/float.c	Thu Apr 29 03:47:07 2004 +0900
@@ -46,22 +46,37 @@
 
    g = 1.0;
    g = -g;
-   printf("%g\ncond ",g);
-   if(f==f*1.0) printf("1 ");
-   if(d==f*1.0) printf("2 ");
-   if(f==f1) printf("3 ");
-   if(d==d1) printf("4 ");
-   if(d==d2) printf("-4 ");
-   if(d>d1) printf("5 ");
-   if(d>d2) printf("-5 ");
-   if(d>=d1) printf("6 ");
-   if(d>=d2) printf("-6 ");
-   if(d!=d1) printf("7 ");
-   if(d!=d2) printf("-7 ");
-   if(d<d1) printf("8 ");
-   if(d<d2) printf("-8 ");
-   if(d<=d1) printf("9 ");
-   if(d<=d2) printf("-9 ");
+   printf("%d\ncond0 ",1);
+   if(f==f*1.0) printf("t ");
+   printf("%d\ncond1 ",f==f*1.0);
+   if(d==f*1.0) printf("t ");
+   printf("%d\ncond2 ",d==f*1.0);
+   if(f==f1) printf("t ");
+   printf("%d\ncond3 ",f==f1);
+   if(d==d1) printf("t ");
+   printf("%d\ncond4 ",d==d2);
+   if(d==d2) printf("t ");
+   printf("%d\ncond5 ",(d==d2));
+   if(d>d1) printf("t ");
+   printf("%d\ncond6 ",d>d1);
+   if(d>d2) printf("t ");
+   printf("%d\ncond7 ",d>d2);
+   if(d>=d1) printf("t ");
+   printf("%d\ncond8 ",d>=d1);
+   if(d>=d2) printf("t ");
+   printf("%d\ncond9 ",d>=d2);
+   if(d!=d1) printf("t ");
+   printf("%d\ncond10 ",d!=d1);
+   if(d!=d2) printf("5 ");
+   printf("%d\ncond11 ",d!=d2);
+   if(d<d1) printf("t ");
+   printf("%d\ncond12 ",d<d1);
+   if(d<d2) printf("t ");
+   printf("%d\ncond13 ",d<d2);
+   if(d<=d1) printf("t ");
+   printf("%d\ncond14 ",d<=d1);
+   if(d<=d2) printf("t ");
+   printf("%d\ncond15 ",d<=d2);
    d = 123.4234; f=-234.333;
    i = d;
    d = i;
--- a/test/long.c	Wed Apr 28 21:33:45 2004 +0900
+++ b/test/long.c	Thu Apr 29 03:47:07 2004 +0900
@@ -160,6 +160,7 @@
      printf("*up-- = %lld\n",*up--);
      printf("*--up = %lld\n",*--up);
      
+    printf("f(%lld %llu %llu %lld %lld)\n",i,j,k,m,a[33]);
 
      ii = f(i,j,k,m,a[33]); 
      printf("f()=%lld\n",ii);
@@ -173,6 +174,7 @@
 
 long long f(long long i,unsigned long long j,unsigned long long k,long long m,long long a)
 {
+    printf("f(%lld %llu %llu %lld %lld)\n",i,j,k,m,a);
     return  i+j*k-m/a;
 }