changeset 230:d60c6c31f63a

*** empty log message ***
author kono
date Wed, 28 Apr 2004 15:06:01 +0900
parents d793c84b3679
children f5efe15629d4
files Changes mc-code-ia32.c mc-code-powerpc.c mc-codegen.c
diffstat 4 files changed, 74 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Wed Apr 28 00:02:59 2004 +0900
+++ b/Changes	Wed Apr 28 15:06:01 2004 +0900
@@ -4059,3 +4059,15 @@
 
 あぁ、そうか、long の引数の渡し方は、
 r10 はレジスタ、残りはメモリに入るわけね。
+
+Wed Apr 28 13:01:13 JST 2004
+
+だいぶ、通りました。ltosop は、終り。
+
+drexpr, lrexpr で cond を処理してなかった。
+
+浮動小数点の誤差はどうしようもないの? printf の問題?
+
+あぁ、なんか、まだ、printf が局所変数を壊しているね。
+
+そういえば、局所変数のアライメントは合わせてないけどいいの?
--- a/mc-code-ia32.c	Wed Apr 28 00:02:59 2004 +0900
+++ b/mc-code-ia32.c	Wed Apr 28 15:06:01 2004 +0900
@@ -1976,8 +1976,28 @@
 }
 
 void
-drexpr(int e1, int e2,int l1, int op)
+drexpr(int e1, int e2,int l1, int op,int cond)
 {       
+    if (cond) {
+	switch(op) {
+	    case DOP+GE:
+		drexpr(e2,e1,l1,DOP+GT,0); break;
+	    case FOP+GE:
+		drexpr(e2,e1,l1,FOP+GT,0); break;
+	    case DOP+GT:
+		drexpr(e2,e1,l1,DOP+GE,0); break;
+	    case FOP+GT:
+		drexpr(e2,e1,l1,FOP+GE,0); break;
+	    case DOP+EQ:
+		op = DOP+NEQ; break;
+	    case FOP+EQ:
+		op = FOP+NEQ; break;
+	    case DOP+NEQ:
+		op = DOP+EQ; break;
+	    case FOP+NEQ:
+		op = FOP+EQ; break;
+	}
+    }
     g_expr(list3(DCMP,e1,e2));
     switch(op) {
 	case DOP+GE:
@@ -2104,7 +2124,7 @@
 
 /* 64bit int part */
 
-void lrexpr(int e1, int e2,int l1, int op)
+void lrexpr(int e1, int e2,int l1, int op,int cond)
 {
 }
 
--- a/mc-code-powerpc.c	Wed Apr 28 00:02:59 2004 +0900
+++ b/mc-code-powerpc.c	Wed Apr 28 15:06:01 2004 +0900
@@ -261,7 +261,8 @@
 
  */
 int arg_offset = 24; int arg_offset1 = 24; int disp_offset = -12;
-#define func_disp_offset 60
+// #define func_disp_offset 60
+#define func_disp_offset 68
 #define r1_offset func_disp_offset+12 
 int code_disp_offset = 0; int jump_offset = 0;
 #define CODE_LVAR l+code_disp_offset
@@ -1011,7 +1012,24 @@
 
 static char *cload(int sz) { return sz==1?"lbz":sz==size_of_short?"lhz":"lwz"; }
 static char *cstore(int sz) { return sz==1?"stb":sz==size_of_short?"sth":"stw"; }
-static char *cext(int sz)  { return sz==size_of_short?"extsh":"extsb"; }
+
+static void
+cext(int sign,int sz,int reg)
+{
+    char *crn = register_name(reg);
+    if (sign) {
+	if (sz==1) 
+	    printf("\textsb %s,%s\n",crn,crn);
+	else if (sz==size_of_short)
+	    printf("\textsh %s,%s\n",crn,crn);
+    } else {
+	if (sz==1) 
+	    printf("\trlwinm %s,%s,0,0xff\n",crn,crn);
+	else if (sz==size_of_short)
+	    printf("\trlwinm %s,%s,0,0xffff\n",crn,crn);
+    }
+}
+
 
 void
 code_label(int labelno)
@@ -1044,8 +1062,7 @@
     crn = register_name(reg);
     printf("\t%s %s,0(%s)\n",cload(sz),crn,
                              register_name(get_ptr_cache((NMTBL*)cadr(e1))));
-    if (sign)
-	printf("\t%s %s,%s\n",cext(sz),crn,crn);
+    cext(sign,sz,reg);
 }
 
 
@@ -1072,14 +1089,9 @@
     lvar_intro(e2);
     printf("\t%s %s,",cload(sz),register_name(reg));
     lvar(e2);
-    if (sign)
-	printf("\t%s %s,%s\n",cext(sz),register_name(reg),register_name(reg));
+    cext(sign,sz,reg);
 }
 
-
-
-
-
 void
 code_fname(NMTBL *n,int reg) {
     int r;
@@ -1150,8 +1162,7 @@
 	drn = register_name(reg);
     }
     printf("\t%s %s,0(%s)\n",cload(sz),drn,xrn);
-    if (use && sign && sz!=size_of_int) 
-	printf("\t%s %s,%s\n",cext(sz),drn,drn);
+    if (use) cext(sign,sz,dreg);
     printf("\taddi %s,%s,%d\n",drn,drn,dir);
     printf("\t%s %s,0(%s)\n",cstore(sz),drn,xrn);
 }
@@ -1181,8 +1192,7 @@
 	xrn = register_name(reg);
     }
     printf("\t%s %s,0(%s)\n",cload(sz),xrn,crn);
-    if (use && sign && sz!=size_of_int) 
-	printf("\t%s %s,%s\n",cext(sz),xrn,xrn);
+    if (use) cext(sign,sz,reg);
     printf("\taddi %s,%s,%d\n",nrn,xrn,dir);
     printf("\t%s %s,0(%s)\n",cstore(sz),nrn,crn);
     free_register(nreg);
@@ -1260,6 +1270,7 @@
     crn = register_name(reg);
     r = get_ptr_cache((NMTBL*)cadr(e1));
     printf("\t%s %s,0(%s)\n",cload(sz),crn,register_name(r));
+    cext(0,sz,r);
     printf("\tcmpwi cr0,%s,0\n",crn);
 }
 
@@ -1272,6 +1283,7 @@
     lvar_intro(e2);
     printf("\t%s %s,",cload(sz),crn);
     lvar(e2);
+    cext(0,sz,reg);
     code_cmp_register(reg);
 }
 
@@ -2814,6 +2826,7 @@
 	return;
     }
     rrn = register_name((r=get_register()));
+    use_reg(r); // to clear ptr cache
     printf(" \t.data\n\t.align 3\n");
     lb=fwdlabel();
     printf("L_%d:\n",lb);
@@ -3324,9 +3337,9 @@
     case LOP+LE:
     	pcond(code_gt(!cond),l1); break;
     case LOP+UGT:
-    	pcond(code_ugt(cond),l1); break;
+    	pcond(code_ugt(!cond),l1); break;
     case LOP+UGE:
-    	pcond(code_uge(cond),l1); break;
+    	pcond(code_uge(!cond),l1); break;
     default:
 	error(-1);
     }
@@ -3345,9 +3358,9 @@
     case LOP+LE:
     	pcond(code_gt(!cond),l1); break;
     case LOP+UGT:
-    	pcond(code_ugt(cond),l1); break;
+    	pcond(code_ugt(!cond),l1); break;
     case LOP+UGE:
-    	pcond(code_uge(cond),l1); break;
+    	pcond(code_uge(!cond),l1); break;
     default:
 	error(-1);
     }
--- a/mc-codegen.c	Wed Apr 28 00:02:59 2004 +0900
+++ b/mc-codegen.c	Wed Apr 28 15:06:01 2004 +0900
@@ -531,16 +531,16 @@
 	drexpr(cadr(e1),caddr(e1),l1,car(e1),cond);
 	return;
     case FOP+LT:
-	drexpr(caddr(e1),cadr(e1),l1,FOP+GT,cond);
+	drexpr(caddr(e1),cadr(e1),l1,FOP+GT,!cond);
 	return;
     case FOP+LE:
-	drexpr(caddr(e1),cadr(e1),l1,FOP+GE,cond);
+	drexpr(caddr(e1),cadr(e1),l1,FOP+GE,!cond);
 	return;
     case DOP+LT:
-	drexpr(caddr(e1),cadr(e1),l1,DOP+GT,cond);
+	drexpr(caddr(e1),cadr(e1),l1,DOP+GT,!cond);
 	return;
     case DOP+LE:
-	drexpr(caddr(e1),cadr(e1),l1,DOP+GE,cond);
+	drexpr(caddr(e1),cadr(e1),l1,DOP+GE,!cond);
 	return;
 #endif
 #if LONGLONG_CODE
@@ -551,20 +551,20 @@
 	lrexpr(cadr(e1),caddr(e1),l1,car(e1),cond);
 	return;
     case LOP+LT:
-	lrexpr(caddr(e1),cadr(e1),l1,LOP+GT,cond);
+	lrexpr(caddr(e1),cadr(e1),l1,LOP+GT,!cond);
 	return;
     case LOP+LE:
-	lrexpr(caddr(e1),cadr(e1),l1,LOP+GE,cond);
+	lrexpr(caddr(e1),cadr(e1),l1,LOP+GE,!cond);
 	return;
     case LOP+UGT:
     case LOP+UGE:
-	lrexpr(cadr(e1),caddr(e1),l1,car(e1),cond);
+	lrexpr(cadr(e1),caddr(e1),l1,car(e1),!cond);
 	return;
     case LOP+ULT:
-	lrexpr(caddr(e1),cadr(e1),l1,LOP+UGT,cond);
+	lrexpr(caddr(e1),cadr(e1),l1,LOP+UGT,!cond);
 	return;
     case LOP+ULE:
-	lrexpr(caddr(e1),cadr(e1),l1,LOP+UGE,cond);
+	lrexpr(caddr(e1),cadr(e1),l1,LOP+UGE,!cond);
 	return;
 #endif
     case LAND: