diff mc-code-ia32.c @ 725:3f1f6c0610c1

goto with enviornment syntax changed.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 20 Aug 2009 16:39:02 +0900
parents e60c3d8dadd6
children 116d4701d097
line wrap: on
line diff
--- a/mc-code-ia32.c	Sat Nov 08 15:11:06 2008 +0900
+++ b/mc-code-ia32.c	Thu Aug 20 16:39:02 2009 +0900
@@ -2550,10 +2550,32 @@
         control=0;
 }
 
+static void 
+make_return_continuation()
+{
+    int ty = cadr(fnptr->ty);
+    fwddef(retcont);
+    if (ty==FLOAT||ty==DOUBLE) {
+	printf("\tfldl %d(%%ebp)\n",-SIZE_OF_DOUBLE);
+	printf("\tmovl %s,%%ebp\n",reg_name[REG_ESI]);
+    } else if (ty==LONGLONG||ty==ULONGLONG) {
+	set_lreg(RET_LREGISTER,0);
+	printf("\tmovl %d(%%ebp),%%ebp\n",disp-SIZE_OF_INT);
+    } else if (ty>0&&( car(ty)==STRUCT || car(ty)==UNION)) {
+	set_ireg(RET_REGISTER,0);
+	printf("\tmovl %d(%%ebp),%s\n",disp-SIZE_OF_INT,
+	    register_name(creg,0));
+	printf("\tmovl %s,%%ebp\n",reg_name[REG_EDI]);
+    } else if (ty!=VOID) {
+	set_ireg(RET_REGISTER,0);
+	printf("\tmovl %s,%s\n",reg_name[REG_ESI],register_name(creg,0));
+	printf("\tmovl %s,%%ebp\n",reg_name[REG_EDI]);
+    }
+}
+
 void
 leave(int control, char *name)
 {
-    int sz;
 
 #ifdef __APPLE__
     disp &= -(SIZE_OF_INT*4); // 16byte alignment
@@ -2566,21 +2588,7 @@
     if (retcont) {
 	if (control)
 	    jmp(retlabel);
-	fwddef(retcont);
-        if (cadr(fnptr->ty)==FLOAT||cadr(fnptr->ty)==DOUBLE) {
-	    printf("\tfldl %d(%%ebp)\n",-SIZE_OF_DOUBLE);
-        } else if (cadr(fnptr->ty)>0&&(
-            car(cadr(fnptr->ty))==STRUCT ||
-            car(cadr(fnptr->ty))==UNION)) {
-            sz = size(cadr(fnptr->ty));
-	    set_ireg(RET_REGISTER,0);
-            printf("\tmovl %d(%%ebp),%s\n",disp-SIZE_OF_INT,
-		register_name(creg,0));
-            // emit_copy(dreg,creg,sz,0,1,1);
-        } else if (cadr(fnptr->ty)!=VOID) {
-	    set_ireg(RET_REGISTER,0);
-	    printf("\tmovl %s,%s\n",reg_name[REG_ESI],register_name(creg,0));
-        }
+	make_return_continuation();
     }
     fwddef(retlabel);
     code_offset_set(fnptr);