diff mc-codegen.c @ 81:f94ca1168520

float first try...
author kono
date Mon, 03 Mar 2003 20:59:51 +0900
parents 83d901658ce9
children 25654dc29ecc
line wrap: on
line diff
--- a/mc-codegen.c	Mon Mar 03 05:41:10 2003 +0900
+++ b/mc-codegen.c	Mon Mar 03 20:59:51 2003 +0900
@@ -10,6 +10,8 @@
 int  dreg;     /* temporary register */
 int  reg_sp;   /* REGister Stack-Pointer */
 
+int  freg;     /* current floating point register */
+
 /*
     creg   currrent virtual register
     dreg   spare virtual register
@@ -275,6 +277,22 @@
 	code_crlvar(lvar(e2));
 	regv[creg]=1;
 	return;
+    case FRLVAR:
+	code_frlvar(lvar(e2));
+	regv[creg]=1;
+	return;
+    case FRGVAR:
+	code_frgvar(lvar(e2));
+	regv[creg]=1;
+	return;
+    case DRLVAR:
+	code_drlvar(lvar(e2));
+	regv[creg]=1;
+	return;
+    case DRGVAR:
+	code_drgvar(lvar(e2));
+	regv[creg]=1;
+	return;
     case FNAME:
 	code_fname(((NMTBL *)(e2))->nm);
 	regv[creg]=1;
@@ -283,6 +301,10 @@
 	code_const(e2);
 	regv[creg]=1;
 	return;
+    case DCONST:
+	code_dconst(e2);
+	regv[creg]=1;
+	return;
     case STRING:
 	string(e1);
 	regv[creg]=1;
@@ -297,7 +319,8 @@
     case INDIRECT:
 	g_expr(e2);
 	return;
-    case RINDIRECT: case CRINDIRECT:
+    case RINDIRECT:  case CRINDIRECT:
+    case DRINDIRECT: case FRINDIRECT:
 	rindirect(e1);
 	return;
     case ADDRESS:
@@ -307,6 +330,10 @@
 	g_expr(e2);
 	code_neg();
 	return;
+    case DMINUS: 
+	g_expr(e2);
+	code_dneg();
+	return;
     case BNOT:   /* ~ */
 	g_expr(e2);
 	code_not();
@@ -341,6 +368,10 @@
     case ADD: case SUB: case BAND: case EOR: case BOR:
 	machinop(e1);
 	return;
+    case DMUL: case DDIV:
+    case DADD: case DSUB:
+	dmachinop(e1);
+	return;
     case COND:
 	e2=fwdlabel();
 	b_expr(cadr(e1),0,e2,0);
@@ -358,12 +389,18 @@
     case SASS: 
 	sassign(e1);
 	return;
-    case ASS: case CASS:
+    case ASS: case CASS: case FASS:
 	assign(e1);
 	return;
+    case DASS: case LASS: 
+	dassign(e1);
+	return;
     case ASSOP: case CASSOP:
 	assop(e1);
 	return;
+    case DASSOP: case FASSOP:
+	dassop(e1);
+	return;
     case RSTRUCT:
 	g_expr(e2);
 	return;
@@ -461,6 +498,14 @@
 	code_cmp_rlvar(lvar(e2));
 	jcond(l1,cond);
 	return;
+    case DRLVAR:
+	code_cmp_drlvar(lvar(e2));
+	jcond(l1,cond);
+	return;
+    case DRGVAR:
+	code_cmp_drgvar(lvar(e2));
+	jcond(l1,cond);
+	return;
     case REGISTER:
 	code_cmp_register(e2);
 	jcond(l1,cond);
@@ -468,9 +513,13 @@
     case CONST:
 	if((cond&&e2)||(!cond&&!e2)) jmp(l1);
 	return;
+    case DCONST:
+	if((dcadr(e2)!=0.0)^cond) jmp(l1);
+	return;
     default:
+	/* type ? */
 	if(err) {
-	    error(-1); return; /* recursice g_expr/b_expr */
+	    error(-1); return; /* recursive g_expr/b_expr */
 	}
 	g_expr(e1);
 	code_cmp_register(creg);
@@ -636,7 +685,8 @@
 {
     return (
 	e1==CONST || e1==FNAME || e1==LVAR || e1==REGISTER ||
-	e1==GVAR || e1==RGVAR || e1==RLVAR || e1==CRLVAR || e1==CRGVAR
+	e1==GVAR || e1==RGVAR || e1==RLVAR || e1==CRLVAR || e1==CRGVAR ||
+	e1==DRLVAR || e1==FRLVAR 
     );
 }
 
@@ -646,10 +696,10 @@
     int ce1=car(e1);
     int ce2=car(e2);
     return (   
-         (ce1==LVAR && (ce2==RLVAR||ce2==CRLVAR))
-      || (ce2==LVAR && (ce1==RLVAR||ce1==CRLVAR))
-      || (ce1==GVAR && (ce2==RGVAR||ce2==CRGVAR))
-      || (ce2==GVAR && (ce1==RGVAR||ce1==CRGVAR))
+         (ce1==LVAR && (ce2==RLVAR||ce2==CRLVAR||ce2==FRLVAR||ce2==DRLVAR))
+      || (ce2==LVAR && (ce1==RLVAR||ce1==CRLVAR||ce1==FRLVAR||ce1==DRLVAR))
+      || (ce1==GVAR && (ce2==RGVAR||ce2==CRGVAR||ce2==FRGVAR||ce2==DRGVAR))
+      || (ce2==GVAR && (ce1==RGVAR||ce1==CRGVAR||ce1==FRGVAR||ce1==DRGVAR))
     );
 }
 
@@ -658,8 +708,8 @@
 {
     int ce1=car(e1);
     return (   
-         ce1==LVAR ||ce1==RLVAR||ce1==CRLVAR ||
-         ce1==GVAR ||ce1==RGVAR||ce1==CRGVAR ||
+         ce1==LVAR ||ce1==RLVAR||ce1==CRLVAR || ce1==DRLVAR ||
+         ce1==GVAR ||ce1==RGVAR||ce1==CRGVAR || ce1==DRGVAR ||
          ce1==REGISTER
     );
 }
@@ -792,6 +842,23 @@
     return;
 }
 
+void
+dmachinop(int e1)
+{
+    int e2,e3,op;
+
+    e2 = cadr(e1);
+    op = car(e1);
+    e3 = caddr(e1);
+    g_expr(e3);
+    emit_dpush();
+    g_expr(e2);
+    dtosop(car(e1),(e2=dpop_register()));
+    emit_dpop_free(e2);
+    regv[freg]=1;
+    return;
+}
+
 
 void
 sassign(int e1)
@@ -827,6 +894,9 @@
     int e2,e3,e4,byte;
 
     byte=(car(e1) == CASS);
+    if(car(e1) == FASS) {
+	/* move float to creg */
+    }
     /*    e2=e4 */
     e2 = cadr(e1);
     e3 = cadr(e2);
@@ -859,6 +929,34 @@
 }
 
 void
+dassign(int e1)
+{
+    int e2,e3,e4,byte;
+
+    /*    e2=e4 */
+    e2 = cadr(e1);
+    e3 = cadr(e2);
+    e4 = caddr(e1);
+    switch(car(e2)) {
+    case GVAR:      /*   i=3 */
+            g_expr(e4);
+	    code_dassign_gvar(e2,byte);
+            return;
+    case LVAR:
+            g_expr(e4);
+	    code_dassign_lvar(lvar(cadr(e2)),byte);
+            return;
+    }
+    g_expr(e2);
+    emit_dpush();
+    g_expr(e4);
+    e2 = emit_dpop(0);
+    code_dassign(e2,byte);
+    emit_dpop_free(e2);
+    return;
+}
+
+void
 assop(int e1)
 {
     int e2,e3,byte,op;
@@ -883,6 +981,15 @@
     return;
 }
 
+void
+dassop(int e1)
+{
+}
+
+void
+fassop(int e1)
+{
+}
 
 int
 fwdlabel(void)