changeset 388:245c6033683d

*** empty log message ***
author kono
date Tue, 24 Aug 2004 15:10:16 +0900
parents dc50ca364922
children 68fb244e0e3c
files Changes mc-code-arm.c mc-code-mips.c mc-codegen.c
diffstat 4 files changed, 56 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Sat Jul 31 01:03:04 2004 +0900
+++ b/Changes	Tue Aug 24 15:10:16 2004 +0900
@@ -5926,3 +5926,17 @@
 まぁ、でも、なんとなく戻って来たか。
 
 ぼろぼろだなぁ。論文も書かなきゃいけないのに。
+
+Thu Aug 12 14:15:40 JST 2004
+
+ちょっと間あいたね。ARMも、もう少しだけど、c2cbc の方を先に
+しないと。C++ からの変換はどうする? cfront って動くのかな?
+
+(あんな論文書いちゃって...)
+
+Mon Aug 16 17:27:17 JST 2004
+
+COND は、できるだけ CREG_REGISTER を使うようにしたけど、
+アドホックだね。(まぁねぇ)
+
+CONDのテストが入ってないなぁ。
--- a/mc-code-arm.c	Sat Jul 31 01:03:04 2004 +0900
+++ b/mc-code-arm.c	Tue Aug 24 15:10:16 2004 +0900
@@ -224,7 +224,8 @@
 
 #define dsuffix(d) (d?'d':'s')
 
-#define  use_float(d,reg) if (reg==USE_CREG) arch_mode&UseFPP?use_float0():(reg=d?use_double0():use_float0())
+#define  use_float(d,reg) if (reg==USE_CREG) { reg=(arch_mode&UseFPP)?use_float0():(d?use_double0():use_float0());}
+
 static
 int use_float0() { 
     int i = creg;
@@ -3187,7 +3188,20 @@
 
 int
 code_get_fixed_creg(int reg,int type) {
-    return creg;
+    switch(type) {
+    case DOUBLE: use_float(1,reg); break;
+    case FLOAT:  use_float(0,reg); break;
+    case LONGLONG:  case ULONGLONG:  use_longlong(reg); break;
+    default:
+        if (reg==USE_CREG) {
+            if (regs[CREG_REGISTER]==0||regs[CREG_REGISTER]==PTRC_REG) {
+                return CREG_REGISTER;
+            }
+        }
+        use_int(reg);
+        break;
+    }
+    return reg;
 }
 
 void
@@ -4142,7 +4156,7 @@
     int edx,edx0=-1;
     int reg0=reg;
 
-    xreg = d?emit_pop(0):emit_lpop(0);       /* pop e3 value */
+    xreg = d?emit_lpop(0):emit_pop(0);       /* pop e3 value */
     if (!is_int_reg(creg)) error(-1);
     edx = ireg;
     emit_push();
@@ -4217,7 +4231,7 @@
     if (!(arch_mode&UseFPP))
 	code_dassop_d(op,reg,d);
     else
-	code_dassop_d(op,reg,d);
+	code_dassop_f(op,reg,d);
 }
 
 void
@@ -4408,7 +4422,7 @@
     char *grn;
     int dir=caddr(e1);
 
-    if (car(e2)==DREGISTER) {
+    if (car(e2)==DREGISTER||car(e2)==FREGISTER) {
 	crn=register_name(cadr(e2));
 	grn=fregister_name(g=code_dload_1(d));
 	if (reg==USE_CREG) {
@@ -4452,7 +4466,7 @@
     char *grn;
     int dir=caddr(e1);
 
-    if (car(e2)==DREGISTER) {
+    if (car(e2)==DREGISTER||car(e2)==FREGISTER) {
 	crn=register_name(cadr(e2));
 	grn=fregister_name(g=code_dload_1(d));
 	if (reg==USE_CREG) {
--- a/mc-code-mips.c	Sat Jul 31 01:03:04 2004 +0900
+++ b/mc-code-mips.c	Tue Aug 24 15:10:16 2004 +0900
@@ -3158,7 +3158,20 @@
 
 int
 code_get_fixed_creg(int reg,int type) {
-    return creg;
+    switch(type) {
+    case DOUBLE: use_float(1,reg); break;
+    case FLOAT:  use_float(0,reg); break;
+    case LONGLONG:  case ULONGLONG:  use_longlong(reg); break;
+    default: 
+	if (reg==USE_CREG) {
+	    if (regs[CREG_REGISTER]==0||regs[CREG_REGISTER]==PTRC_REG) {
+		return CREG_REGISTER;
+	    }
+	}
+	use_int(reg); 
+	break;
+    }
+    return reg;
 }
 
 void
--- a/mc-codegen.c	Sat Jul 31 01:03:04 2004 +0900
+++ b/mc-codegen.c	Tue Aug 24 15:10:16 2004 +0900
@@ -422,7 +422,7 @@
 	if (caddr(e1)) {
 	    b_expr(cadr(e1),0,e2,0);
 	    g_expr0(caddr(e1));
-	} else {
+	} else {  // gcc extenstion  a?:DEF 
 	    bexpr(cadr(e1),0,e2); // value used
 	}
 	t = code_get_fixed_creg(USE_CREG,d);
@@ -1879,9 +1879,12 @@
 cond(int t,int e1,int e2,int e3)
 {
     if(car(e1)==CONST) {
-	if(cadr(e1)) {type=t;return e2;} else return e3;
+	if(cadr(e1)) {type=t;return e2?e2:e1;} else return e3;
     }
 #if FLOAT_CODE
+    if(car(e1)==DCONST) {
+	if(dcadr(e1)) {type=t;return e2?e2:e1;} else return e3;
+    }
     if(type==DOUBLE||t==DOUBLE) {
 	e3=double_value(e3);
 	type = t; if (e2) e2=double_value(e2);
@@ -1894,6 +1897,9 @@
     }
 #endif
 #if LONGLONG_CODE
+    if(car(e1)==LCONST) {
+	if(lcadr(e1)) {type=t;return e2?e2:e1;} else return e3;
+    }
     if(type==LONGLONG||t==LONGLONG) {
 	e3=longlong_value(e3);
 	type = t; if (e2) e2=longlong_value(e2);