diff --git a/i386-gen.c b/i386-gen.c index 3a26f7a..946e42d 100644 --- a/i386-gen.c +++ b/i386-gen.c @@ -79,7 +79,7 @@ enum { #include "tcc.h" /* define to 1/0 to [not] have EBX as 4th register */ -#define USE_EBX 1 +#define USE_EBX 0 ST_DATA const int reg_classes[NB_REGS] = { /* eax */ RC_INT | RC_EAX, @@ -636,7 +636,15 @@ ST_FUNC void gfunc_epilog(void) o(0x585a); /* restore returned value, if any */ } #endif - o(0x5b * USE_EBX); /* pop ebx */ + + /* align local size to word & save local variables */ + v = (-loc + 3) & -4; + +#if USE_EBX + o(0x8b); + gen_modrm(TREG_EBX, VT_LOCAL, NULL, -(v+4)); +#endif + o(0xc9); /* leave */ if (func_ret_sub == 0) { o(0xc3); /* ret */ @@ -645,9 +653,6 @@ ST_FUNC void gfunc_epilog(void) g(func_ret_sub); g(func_ret_sub >> 8); } - /* align local size to word & save local variables */ - - v = (-loc + 3) & -4; saved_ind = ind; ind = func_sub_sp_offset - FUNC_PROLOG_SIZE; #ifdef TCC_TARGET_PE diff --git a/tccgen.c b/tccgen.c index dddeea1..8281d1e 100644 --- a/tccgen.c +++ b/tccgen.c @@ -5164,8 +5164,8 @@ static void expr_cond(void) #endif } else rc = RC_INT; - save_regs(1); gv(rc); + save_regs(1); if (g) gv_dup(); tt = gvtst(1, 0);