changeset 142:de272ad4ddce

mips continue
author kono
date Sun, 18 May 2003 21:03:39 +0900
parents b70018bb3c0e
children 66ddda268ac5
files Changes mc-code-mips.c
diffstat 2 files changed, 38 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Mon May 12 00:39:57 2003 +0900
+++ b/Changes	Sun May 18 21:03:39 2003 +0900
@@ -2958,6 +2958,25 @@
 り当てられるから、そのあたりでテストすることは可能だろうね。
 まぁ、これ自体は難しくはないが... 
 
+code segment では浮動小数点レジスタに割り振られてしまうので、
+実はエラーが出ていたんじゃないかな。これはテストプログラム
+を書くべきでしょうね。
+
 あるいは#define REG register でテストする必要があるわけね。
 
 MIPSでは、$4,$5,$6,$7 は、本当に特別扱いしないとだめだね。
+
+Thu May 15 21:25:45 JST 2003
+
+fregv は、やっぱりサブルーチン・コールにするんだろ?
+(さすがに授業が始まってしまうと、なかなか進まない...)
+
+Sat May 17 13:57:12 JST 2003
+
+$4,$5 を常に creg または、double のfregとして使う。
+$f12 はfloating 用。
+
+もちろん、emit_pushすればずれちゃうけどね。rename するべきか?
+そもそもrenameは必要ないんじゃないの?
+
+あともう少しなんだけどねぇ。やる気がでん...
--- a/mc-code-mips.c	Mon May 12 00:39:57 2003 +0900
+++ b/mc-code-mips.c	Sun May 18 21:03:39 2003 +0900
@@ -2286,15 +2286,19 @@
 }
 
 void code_f2i(int freg,int creg) {
+    printf("\ttrunc.w.s %s,%s,%s\n",freg,freg,creg);
 }
 
 void code_f2u(int freg,int creg) {
+    printf("\ttrunc.w.s %s,%s,%s\n",freg,freg,creg);
 }
 
 void code_i2f(int creg,int freg) {
+    printf("\tcvt.s.w %s,%s\n",freg,freg);
 }
 
 void code_u2f(int creg,int freg) {
+    printf("\tcvt.s.w %s,%s\n",freg,freg);
 }
 
 void code_drgvar(int e2,int d,int freg)
@@ -2412,7 +2416,7 @@
     case DMUL: dtosop0("dpmul",e1,1,0); return;
     case DCMPGE: 
     case DCMP:  dtosop0("dpcmp",e1,1,1); return;
-    case FCMPGE: 
+    case FCMPGE: dtosop0("c.le.s",e1,0,1); return;
     case FCMP: dtosop0("c.eq.s",e1,0,1); return;
     default:
 	error(-1); return;
@@ -2536,23 +2540,31 @@
 void
 drexpr(int e1, int e2,int l1, int op)
 {       
-    g_expr(list3(((op==DOP+GE)?DCMPGE:DCMP),e1,e2));
+    g_expr(list3(((op==FOP+EQ||op==FOP+NEQ)?DCMP:FCMPGE),e1,e2));
     switch(op) {
 	case DOP+GE:
-	case FOP+GE:
 	    printf("\tbgez\tL_%d\n",l1);
 	    break;
 	case DOP+GT:
-	case FOP+GT:
 	    printf("\tbltz\tL_%d\n",l1);
 	    break;
 	case DOP+EQ:
-	case FOP+EQ:
 	    printf("\tbeq\tL_%d\n",l1);
 	    break;
 	case DOP+NEQ:
+	    printf("\tbne\tL_%d\n",l1);
+	    break;
+	case FOP+GE:
+	    printf("\tbc1tl\tL_%d\n",l1);
+	    break;
+	case FOP+GT:
+	    printf("\tbc1tl\tL_%d\n",l1);
+	    break;
+	case FOP+EQ:
+	    printf("\tbc1f\tL_%d\n",l1);
+	    break;
 	case FOP+NEQ:
-	    printf("\tbne\tL_%d\n",l1);
+	    printf("\tbc1f\tL_%d\n",l1);
 	    break;
     }
 }
@@ -2563,7 +2575,7 @@
     xreg=pop_fregister();
     if (xreg<= -REG_LVAR_OFFSET) {
 	reg = get_dregister(d);
-        code_drlvar(REG_LVAR_OFFSET+xreg,1,reg);
+        code_drlvar(REG_LVAR_OFFSET+xreg,d,reg);
 	free_lvar(REG_LVAR_OFFSET+xreg);
 	fregv[reg]=1; xreg=reg;
     }