changeset 187:dffcccf8b1cb

nested COND
author kono
date Mon, 01 Dec 2003 19:06:30 +0900
parents 6391432ca002
children 4303255fc3cf
files Changes mc-code-ia32.c mc-code-powerpc.c mc-code.h mc-codegen.c mc-parse.c
diffstat 6 files changed, 60 insertions(+), 51 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Mon Dec 01 15:36:22 2003 +0900
+++ b/Changes	Mon Dec 01 19:06:30 2003 +0900
@@ -3674,4 +3674,29 @@
 結構、実装が変わるから、code-$(ARCH) に移した方がいいかな。
 
 
-
+なんか、arg_reording() が、
+    PowerPC
+	   fnptr->dsp = arg_reorder(reverse0(sarg),reverse0(fnptr->dsp));
+    IA32
+	   fnptr->dsp = arg_reorder(sarg,fnptr->dsp);
+ということになっているみたい。おんなじ順序じゃないのね。どうしようかな。
+これは、わかりました。
+
+    case COND:        /* a?0:1 should consider non-brach instruction */
+    case DCOND:
+    case FCOND:
+        d = (car(e1)==COND?INT:car(e1)==DCOND?DOUBLE:FLOAT);
+        e2=fwdlabel();
+        b_expr(cadr(e1),0,e2,0);
+        g_expr0(caddr(e1));
+        t = creg;
+        jmp(e3=fwdlabel());
+        fwddef(e2);
+        g_expr0(cadddr(e1));
+        code_set_fixed_creg(t,1,d);
+        fwddef(e3);
+        return d;
+
+なんだけど、t のcregが、ia32 ではvirtual register なので、変更される
+ことがある。(こまったもんだね)
+
--- a/mc-code-ia32.c	Mon Dec 01 15:36:22 2003 +0900
+++ b/mc-code-ia32.c	Mon Dec 01 19:06:30 2003 +0900
@@ -557,7 +557,7 @@
         xreg = freg_stack[freg_sp];
         if (xreg<= -REG_LVAR_OFFSET) {
             return list2(LVAR,REG_LVAR_OFFSET+xreg);
-        else {
+        } else {
             return list2(DREGISTER,xreg);
         }
     }
@@ -565,28 +565,6 @@
 }
 
 
-int
-stack_top(int type)
-{
-    int xreg;
-    if (type==INT) {
-        xreg = reg_stack[reg_sp];
-        if (xreg<= -REG_LVAR_OFFSET) {
-            return list2(LVAR,REG_LVAR_OFFSET+xreg);
-        } else {
-            return list2(REGISTER,xreg);
-        }
-    } else {
-        xreg = freg_stack[freg_sp];
-        if (xreg<= -REG_LVAR_OFFSET) {
-            return list2(LVAR,REG_LVAR_OFFSET+xreg);
-        else {
-            return list2(DREGISTER,xreg);
-        }
-    }
-    return xreg;
-}
-
 
 void 
 code_label(int labelno)
@@ -1507,12 +1485,21 @@
     free_all_register();
 }
 
+int
+code_get_fixed_creg(int reg,int type) {
+    if (type==FLOAT||type==DOUBLE) {
+	return 0;
+    } else {
+	return rname[reg];
+    }
+}
 
 void
-code_set_fixed_creg(int mode,int type) {
+code_set_fixed_creg(int reg,int mode,int type) {
     if (type==FLOAT||type==DOUBLE) {
-    } else
-	use_register(creg,REG_EAX,mode);
+    } else {
+	use_register(creg,reg,mode);
+    }
 }
 
 void
--- a/mc-code-powerpc.c	Mon Dec 01 15:36:22 2003 +0900
+++ b/mc-code-powerpc.c	Mon Dec 01 19:06:30 2003 +0900
@@ -1999,20 +1999,17 @@
     }
 }
 
+int
+code_get_fixed_creg(int reg,int type) {
+    return creg;
+}
+
 void
-code_set_fixed_creg(int mode,int type) {
+code_set_fixed_creg(int reg,int mode,int type) {
     if (type==FLOAT||type==DOUBLE) {
-	if (cond_freg== -1) {
-	    cond_freg = get_dregister_var(0,1);
-	    if(car(cond_freg)!=DREGISTER) error(-1);
-	}
-	set_freg(cadr(cond_freg),mode);
+	set_freg(reg,mode);
     } else {
-	if (cond_reg== -1) {
-	    cond_reg = get_register_var(0);
-	    if(car(cond_reg)!=REGISTER) error(-1);
-	}
-	set_creg(cadr(cond_reg),mode);
+	set_creg(reg,mode);
     }
 }
 
--- a/mc-code.h	Mon Dec 01 15:36:22 2003 +0900
+++ b/mc-code.h	Mon Dec 01 19:06:30 2003 +0900
@@ -88,7 +88,8 @@
 extern void drexpr(int e1, int e2,int l1, int op);
 extern void jcond(int l, char cond);
 extern void jmp(int l);
-extern void code_set_fixed_creg(int mode,int type);
+extern int code_get_fixed_creg(int reg,int type);
+extern void code_set_fixed_creg(int reg,int mode,int type);
 extern void code_set_return_register(int mode);
 extern void text_mode(void);
 extern void global_table(void);
--- a/mc-codegen.c	Mon Dec 01 15:36:22 2003 +0900
+++ b/mc-codegen.c	Mon Dec 01 19:06:30 2003 +0900
@@ -287,16 +287,14 @@
         d = (car(e1)==COND?INT:car(e1)==DCOND?DOUBLE:FLOAT);
 	e2=fwdlabel();
 	b_expr(cadr(e1),0,e2,0);
-        code_set_fixed_creg(0,d);
-        t = g_expr0(caddr(e1));
-        code_set_fixed_creg(1,t);
+        g_expr0(caddr(e1));
+	t = code_get_fixed_creg(creg,d);
 	jmp(e3=fwdlabel());
 	fwddef(e2);
-        code_set_fixed_creg(0,d);
-        t = g_expr0(cadddr(e1));
-        code_set_fixed_creg(1,t);
+        g_expr0(cadddr(e1));
+	code_set_fixed_creg(t,1,d);
 	fwddef(e3);
-	return t;
+	return d;
     case STASS: 
 	sassign(e1);
 	return RSTRUCT;
--- a/mc-parse.c	Mon Dec 01 15:36:22 2003 +0900
+++ b/mc-parse.c	Mon Dec 01 19:06:30 2003 +0900
@@ -1411,7 +1411,7 @@
 fdecl(NMTBL *n)
 {
     int sd = stypedecl;
-    int sarg;
+    int arglist;
     if(!chk) enter(n->nm);
     fnptr=n;
     retlabel=fwdlabel();
@@ -1424,15 +1424,16 @@
     n->sc = FUNCTION;
     mode=ADECL;
     if (sym!=LC) {
-	sarg = fnptr->dsp;
+	arglist = fnptr->dsp;
 	fnptr->dsp =args=0; 
 	while (sym!=LC) { /* argument declaration !ANSI */
 	    stmode=0;
 	    decl(); getsym(0);
 	}
-	fnptr->dsp = arg_reorder(reverse0(sarg),reverse0(fnptr->dsp));
-    } else
-	fnptr->dsp=reverse0(fnptr->dsp);
+	// arglist is set by adecl() and is reversed.
+	fnptr->dsp = arg_reorder(arglist,fnptr->dsp);
+    }
+    fnptr->dsp=reverse0(fnptr->dsp);
     fdecl_struct(fnptr->ty); /* insert extra argument for struct passing */
     disp=0;
     arg_register(fnptr);