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:
parent
d2332396e4
commit
559ee1e940
2 changed files with 11 additions and 6 deletions
15
i386-gen.c
15
i386-gen.c
|
@ -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
|
||||||
|
|
2
tccgen.c
2
tccgen.c
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue