i386-gen: fix USE_EBX

Restore ebx from *ebp because alloca might change esp.

Also disable USE_EBX for upcoming release.

Actually the benefit is less than one would expect, it
appears that tcc can't do much with more than 3 registers
except with extensive use of long longs where the disassembly
looks much prettier (and shorter also).

Also: tccgen/expr_cond() : fix wrong gv/save_regs order
This commit is contained in:
grischka 2016-12-19 00:27:08 +01:00
parent d2332396e4
commit 559ee1e940
2 changed files with 11 additions and 6 deletions

View File

@ -79,7 +79,7 @@ enum {
#include "tcc.h" #include "tcc.h"
/* define to 1/0 to [not] have EBX as 4th register */ /* 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] = { ST_DATA const int reg_classes[NB_REGS] = {
/* eax */ RC_INT | RC_EAX, /* eax */ RC_INT | RC_EAX,
@ -636,7 +636,15 @@ ST_FUNC void gfunc_epilog(void)
o(0x585a); /* restore returned value, if any */ o(0x585a); /* restore returned value, if any */
} }
#endif #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 */ o(0xc9); /* leave */
if (func_ret_sub == 0) { if (func_ret_sub == 0) {
o(0xc3); /* ret */ o(0xc3); /* ret */
@ -645,9 +653,6 @@ ST_FUNC void gfunc_epilog(void)
g(func_ret_sub); g(func_ret_sub);
g(func_ret_sub >> 8); g(func_ret_sub >> 8);
} }
/* align local size to word & save local variables */
v = (-loc + 3) & -4;
saved_ind = ind; saved_ind = ind;
ind = func_sub_sp_offset - FUNC_PROLOG_SIZE; ind = func_sub_sp_offset - FUNC_PROLOG_SIZE;
#ifdef TCC_TARGET_PE #ifdef TCC_TARGET_PE

View File

@ -5164,8 +5164,8 @@ static void expr_cond(void)
#endif #endif
} else } else
rc = RC_INT; rc = RC_INT;
save_regs(1);
gv(rc); gv(rc);
save_regs(1);
if (g) if (g)
gv_dup(); gv_dup();
tt = gvtst(1, 0); tt = gvtst(1, 0);