diff mc-codegen.c @ 133:7d436c08e949

separate float / double flow
author kono
date Fri, 02 May 2003 14:26:54 +0900
parents 07eb1249f07a
children 4cfd24d1b929
line wrap: on
line diff
--- a/mc-codegen.c	Fri Apr 11 14:04:40 2003 +0900
+++ b/mc-codegen.c	Fri May 02 14:26:54 2003 +0900
@@ -80,7 +80,7 @@
 int
 g_expr0(int e1)
 {
-    int e2,e3,t;
+    int e2,e3,t,d;
     NMTBL *n;
 
     e2 = cadr(e1);
@@ -130,6 +130,9 @@
     case DCONST:
 	code_dconst(e1,freg);
 	return DOUBLE;
+    case FCONST:
+	code_fconst(e1,freg);
+	return FLOAT;
     case STRING:
 	code_string(e1,creg);
 	return ADDRESS;
@@ -155,21 +158,22 @@
     case DMINUS: 
 	g_expr0(e2); code_dneg(freg);
 	return DOUBLE;
+    case FMINUS: 
+	g_expr0(e2); code_fneg(freg);
+	return FLOAT;
     case CONV: 
 	g_expr0(e2); 
 	switch(caddr(e1)) {
-	case I2D: 
-	    code_i2d(creg,freg);
-	    return DOUBLE;
-	case D2I: 
-	    code_d2i(freg,creg);
-	    return INT;
-	case U2D: 
-	    code_u2d(creg,freg);
-	    return DOUBLE;
-	case D2U: 
-	    code_d2u(freg,creg);
-	    return UNSIGNED;
+	case I2D: code_i2d(creg,freg); return DOUBLE;
+	case D2I: code_d2i(freg,creg); return INT;
+	case U2D: code_u2d(creg,freg); return DOUBLE;
+	case F2U: code_f2u(freg,creg); return UNSIGNED;
+	case I2F: code_i2f(creg,freg); return FLOAT;
+	case F2I: code_f2i(freg,creg); return INT;
+	case U2F: code_u2f(creg,freg); return FLOAT;
+	case D2U: code_d2u(freg,creg); return UNSIGNED;
+	case D2F: code_d2f(freg); return FLOAT;
+	case F2D: code_f2d(freg); return DOUBLE;
 	default:
 	    error(-1); return INT;
 	}
@@ -220,8 +224,13 @@
     case DMUL: case DDIV:
     case DADD: case DSUB:
     case DCMP: case DCMPGE:
-	dmachinop(e1);
+	dmachinop(e1,1);
 	return DOUBLE;
+    case FMUL: case FDIV:
+    case FADD: case FSUB:
+    case FCMP: case FCMPGE:
+	dmachinop(e1,0);
+	return FLOAT;
     case COND:
 	e2=fwdlabel();
 	b_expr(cadr(e1),0,e2,0);
@@ -236,14 +245,16 @@
 	fwddef(e3);
 	return t;
     case DCOND:
+    case FCOND:
+	d = car(e1)==DCOND?DOUBLE:FLOAT;
 	e2=fwdlabel();
 	b_expr(cadr(e1),0,e2,0);
-	code_set_fixed_creg(0,DOUBLE);
+	code_set_fixed_creg(0,d);
 	t = g_expr0(caddr(e1));
 	code_set_fixed_creg(1,t);
 	jmp(e3=fwdlabel());
 	fwddef(e2);
-	code_set_fixed_creg(0,DOUBLE);
+	code_set_fixed_creg(0,d);
 	t = g_expr0(cadddr(e1));
 	code_set_fixed_creg(1,t);
 	fwddef(e3);
@@ -877,7 +888,7 @@
 }
 
 void
-dmachinop(int e1)
+dmachinop(int e1,int d)
 {
     int e2,e3,op;
 
@@ -885,15 +896,14 @@
     op = car(e1);
     e3 = caddr(e1);
     g_expr(e3);
-    emit_dpush();
+    emit_dpush(d);
     g_expr(e2);
-    dtosop(car(e1),(e2=emit_dpop(1)));
+    dtosop(car(e1),(e2=emit_dpop(d)));
     emit_dpop_free(e2);
     fregv[freg]=1;
     return;
 }
 
-
 void
 sassign(int e1)
 {
@@ -1051,7 +1061,8 @@
     d = (car(e1)==LASS)?2:(car(e1)==DASS)?1:0;
     if (!use && (
 	    (e5==DREGISTER) ||
-	    (car(e2)==DREGISTER&&(e5==DRGVAR||e5==DRLVAR||e5==DCONST))
+	    (car(e2)==DREGISTER&&(e5==DRGVAR||e5==DRLVAR||e5==DCONST))||
+	    (car(e2)==DREGISTER&&(e5==FRGVAR||e5==FRLVAR||e5==FCONST))
 	)) {
 	dassign_opt(e5,e2,e4,d);
 	return;
@@ -1118,7 +1129,7 @@
     op = cadddr(e1);
 
     g_expr(e3);
-    emit_dpush();
+    emit_dpush(d);
     g_expr(e2);
     code_dassop(op,d);
     regv[creg]=1;
@@ -1240,13 +1251,14 @@
 	case LSHIFT: case ULSHIFT: case RSHIFT: case URSHIFT:
 	case ADD: case SUB: case BAND: case EOR: case BOR: case CMP:
 	case DMUL: case DDIV: case DADD: case DSUB: case DCMP: case DCMPGE:
+	case FMUL: case FDIV: case FADD: case FSUB: case FCMP: case FCMPGE:
 	case SASS: case ASS: case CASS: case FASS: case DASS: case LASS: 
 	case ASSOP: case CASSOP: case DASSOP: case FASSOP: case COMMA:
 	    if (contains(cadr(e),type)) return 1;
 	    e = caddr(e);
 	    continue;
         /* tarary operators */
-	case COND:
+	case COND: case DCOND: case FCOND:
 	    if (contains(cadr(e), type)) return 1;
 	    if (contains(caddr(e),type)) return 1;
 	    e = cadddr(e);