Mercurial > hg > CbC > old > device
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);