changeset 677:83459d1afa0d

adhoc fix of statement expression in ia32.
author kono
date Sun, 06 May 2007 20:31:42 +0900
parents 5e71527f9fd6
children 9b29f529743f
files Changes Makefile mc-code-ia32.c mc-parse.c
diffstat 4 files changed, 46 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Sun May 06 18:48:13 2007 +0900
+++ b/Changes	Sun May 06 20:31:42 2007 +0900
@@ -9354,3 +9354,21 @@
 
 というタイミングか。それよりは、その時点でparse treeを展開した方が
 まだ、ましか...
+
+あるいは、docomp する時に、全てのレジスタ変数を使ったことに
+しておくか... それでも、ia32 ではだめだけど。
+
+inmode==INLINE+1 の時に、若干展開が異なる。gen_inline()
+する方がいいのか?
+
+うーん、それも、いろいろ面倒なようだね。どうせ、やらなきゃ
+いけないんだが。
+
+とりあえず、ad-hoc に直したが、あとで、ちゃんと直さないと。
+(get_input_arg AS_SAVE で、register variable  を使わなければ良い...)
+
+展開するしかないんだろうなぁ。
+
+
+
+
--- a/Makefile	Sun May 06 18:48:13 2007 +0900
+++ b/Makefile	Sun May 06 20:31:42 2007 +0900
@@ -1,5 +1,5 @@
-# CC = gcc -std=c99
-CC = cc 
+CC = gcc -std=c99
+# CC = cc 
 # -O3
 MCFLAGS = -DUSE_CODE_KEYWORD
 CFLAGS = -g -O -Wall -I. $(MCFLAGS)
--- a/mc-code-ia32.c	Sun May 06 18:48:13 2007 +0900
+++ b/mc-code-ia32.c	Sun May 06 20:31:42 2007 +0900
@@ -1708,32 +1708,38 @@
 {
     if(scalar(t)) {
         if (mode==AS_SAVE) {
-            return get_register_var(0);
+	    return list3(LVAR,new_lvar(size(t)),0);
+            // return get_register_var(0);
         } else 
             return list3(LVAR,caller_arg_offset_v(nargs),0);
     } else if (t==LONGLONG||t==ULONGLONG) {
         if (mode==AS_SAVE) {
-            return get_lregister_var(0);
+	    return list3(LVAR,new_lvar(size(t)),0);
+            // return get_lregister_var(0);
         } else 
             return list3(LVAR,caller_arg_offset_v(nargs),0);
     } else if (t==FLOAT) {
         if (mode==AS_SAVE) {
-            return get_dregister_var(0,0);
+	    return list3(LVAR,new_lvar(size(t)),0);
+            // return get_dregister_var(0,0);
         } else
             return list3(LVAR,caller_arg_offset_v(nargs),0);
     } else if (t==DOUBLE) {
         if (mode==AS_SAVE) {
-            return get_dregister_var(0,1);
+	    return list3(LVAR,new_lvar(size(t)),0);
+            // return get_dregister_var(0,1);
         } else
             return list3(LVAR,caller_arg_offset_v(nargs),0);
     } else if (t>=0&&(car(t)==STRUCT||car(t)==UNION)) {
         if (mode==AS_SAVE) {
-            return get_register_var(0);
+	    return list3(LVAR,new_lvar(size(t)),0);
+            // return get_register_var(0);
         } else
             return list3(LVAR,caller_arg_offset_v(nargs),0);
     } else {
         error(-1);
-        return get_register_var(0);
+	return list3(LVAR,new_lvar(size(t)),0);
+        // return get_register_var(0);
     }
 }
 
--- a/mc-parse.c	Sun May 06 18:48:13 2007 +0900
+++ b/mc-parse.c	Sun May 06 20:31:42 2007 +0900
@@ -926,7 +926,7 @@
     } else {
 	conv->return_type_(type,n,sd);
 	n = def(n,ctmode);
-	if (inmode && (mode==LDECL||mode==LLDECL)) { 
+	if (inmode==INLINE && (mode==LDECL||mode==LLDECL)) { 
 	    parse = list4(ST_DECL,parse,(int)n,list3(mode,stmode,ctmode));
 	}
 	if (sym==ASS && n!=&null_nptr) { 
@@ -946,7 +946,7 @@
 	    }
 	    conv->return_type_(type,n,1);
 	    def(n,ctmode);
-	    if (inmode && mode==LDECL) {
+	    if (inmode==INLINE && mode==LDECL) {
 		parse = list4(ST_DECL,parse,(int)n,list3(mode,stmode,ctmode));
 	    }
 	    if (sym==ASS && n!=&null_nptr) {
@@ -2287,7 +2287,8 @@
 	pparse = parse; parse = 0;
 	l1 = if0 = expr(0);
     } else {
-	l1 = bexpr((if0 = expr(0)),0,fwdlabel());
+	if0 = expr(0);
+	l1 = bexpr(if0,0,fwdlabel());
     }
     set_lfree(slfree);
     conv->if_then_(if0);
@@ -3529,7 +3530,7 @@
 	e=expr0();
 	checksym(RPAR);
 	type=INT;
-	if (inmode)
+	if (inmode==INLINE)
 	    return list2(BUILTINP,rvalue(e));  /* evalue it later */
 	else 
 	    return list2(CONST,is_const(e));
@@ -3687,7 +3688,7 @@
             nptr1->sc=EMPTY;
             nptr1=l_top_search(nptr->nm,0);
             nptr1->sc = FLABEL;
-	    if (inmode!=INLINE)
+	    if (!inmode)
 		nptr1->dsp = fwdlabel();
 	    else
 		nptr1->dsp = --disp;
@@ -3962,7 +3963,7 @@
 		    nptr0->attr = 0;
 		    type = nptr0->ty = t;
 		    def(nptr0,0);
-		    if (inmode) { 
+		    if (inmode==INLINE) { 
 			parse = list4(ST_DECL,parse,(int)nptr0,
 			    list3(mode,0,0));
 		    }
@@ -4011,20 +4012,24 @@
 		} else l2 = 0;
 		// make it a simple call (by jmp)
 		// register stack save now
+		//   we cannot trust register variable (used as temorary)
+		//   either, save these register is necessary...
 		e1 = list3(COMMA,list3(LCALL,b,l2),lastexp);
 		lastexp = 0;
 		if (l) fwddef(l);
 		control=cntl;
 #else
+		int smode=mode;
 		// we already have parse tree mode, why don't we?
 		int sparse = parse; parse=0;
 		inmode = INLINE+1;
 		// this does not work well... we need some work later
 		docomp(1);
-		e1 = list3(COMMA,reverse0(parse),lastexp);
+		inmode = 0; mode=GDECL;
+		e1 = list3(COMMA,pexpr(reverse0(parse)),lastexp);
+		mode = smode;
 		parse = sparse;
 		lastexp = 0;
-		inmode = 0;
 #endif
 	    }
 	} else {
@@ -4109,7 +4114,7 @@
 	}
     } else {
 	tmp_struct = def(0,0);
-	if (inmode) {
+	if (inmode==INLINE) {
 	    set_attr(tmp_struct,HAS_ADDRESS,1);
 	    parse = list4(ST_DECL,parse,(int)tmp_struct,list3(LDECL,0,0));
 	}