diff mc-inline.c @ 527:6b0fd56848e6 inline-asm

inline continue.... asm, lvar free
author kono
date Wed, 28 Dec 2005 21:21:57 +0900
parents 9ff5cd7afe2f
children d6fff671793a
line wrap: on
line diff
--- a/mc-inline.c	Wed Dec 28 15:45:39 2005 +0900
+++ b/mc-inline.c	Wed Dec 28 21:21:57 2005 +0900
@@ -14,6 +14,8 @@
 
 static int ret_register,ret_reg_mode;
 
+static int inline_lvars;
+
 /*
     Basic code generator from parse tree
  */
@@ -421,9 +423,11 @@
 {
     int sz = is_memory(e1);
     int d = cadr(e1);
-    int d1;
+    int d1,e;
     if ((d1=(heap[pdisp+d]))) return d1;
-    return (heap[pdisp+d]=list3(LVAR,new_lvar(sz),0));
+    e =  heap[pdisp+d]=list3(LVAR,new_lvar(sz),0);
+    inline_lvars = glist2(e,inline_lvars);
+    return e;
 }
 
 static int
@@ -458,6 +462,15 @@
 }
 
 static int
+pindirect(int e)
+{
+    int lvar;
+    if (car(lvar=cadr(e))==IVAR)
+	lvar=p_lvar(cadr(e)); // can be anything....
+    return list3(car(e),pexpr(cadr(e)),caddr(e));
+}
+
+static int
 paddress(int e)
 {
     return list2(car(e),pexpr(cadr(e)));
@@ -466,7 +479,7 @@
 static int
 p_conv(int e1,int e2)
 {
-    return list3(CONV,pexpr(e1),e2);
+    return list3(CONV,pexpr(e2),e1);
 }
 
 static int
@@ -595,6 +608,7 @@
     default:
 	v = list3(LVAR,new_lvar(size(n->ty)),(int)n);
     }
+    inline_lvars = glist2(v,inline_lvars);
     if (heap[pdisp+dsp]) error(-1);
     heap[pdisp+dsp]=v;
     return pexpr(cadr(e));
@@ -807,7 +821,7 @@
     case INLINE:
 	return p_inline(e1);
     case INDIRECT:
-	return prindirect(e1);
+	return pindirect(e1);
     case RINDIRECT:  case URINDIRECT:  
     case CRINDIRECT: case CURINDIRECT:
     case SRINDIRECT: case SURINDIRECT:
@@ -1016,6 +1030,7 @@
     int sdisp = pdisp;
     int sret_register = ret_register;
     int sret_reg_mode = ret_reg_mode;
+    int sinline_lvars = inline_lvars;
 
     int narg,arg;
     NMTBL *n = (NMTBL*)cadr(cadr(e));
@@ -1036,6 +1051,7 @@
     retpending = 0;
     ret_reg_mode = 0;
     ret_register = 5555;
+    inline_lvars = 0;
     retlabel = fwdlabel();
 
     enter_scope(); // to make label scope happy
@@ -1056,6 +1072,7 @@
 	    heap[pdisp+narg]=e4;
 	} else {
 	    arg = heap[pdisp+narg]=list3(LVAR,new_lvar(size(t)),0);
+	    inline_lvars = glist2(arg,inline_lvars);
 	    //  should contain correct argument variable name
 	    if (anptr)
 		printf("## var %s\n",anptr->nm);
@@ -1082,12 +1099,26 @@
     if (retcont) error(STERR); // inline can't handle return/environment
 
     leave_scope();
+    while(inline_lvars) {
+	int e;
+	int l = car(inline_lvars);
+	switch(car(l)) {
+	case LVAR: free_lvar(cadr(l)); break;
+	case REGISTER: case DREGISTER: 
+	case FREGISTER: case LREGISTER: 
+	    free_register(cadr(l));
+	}
+	e = cadr(inline_lvars); 
+	free_glist2(inline_lvars);
+	inline_lvars = e; 
+    }
     fnptr = sfnptr;
     retlabel = sretlabel;
     retcont = sretcont;
     cslabel = scslabel;
     ret_register = sret_register;
     ret_reg_mode = sret_reg_mode;
+    inline_lvars = sinline_lvars;
 
     return ret_type;
 }