aboutsummaryrefslogtreecommitdiff
path: root/i386-gen.c
diff options
context:
space:
mode:
authorgrischka <grischka>2016-10-19 19:22:15 +0200
committergrischka <grischka>2016-10-19 19:22:15 +0200
commit3054a76249d1f0690984027db73a94995300cac2 (patch)
tree1186abbe2667f753908eb7d346be193e8db58d0d /i386-gen.c
parent02642bc94cb65a59a9eb95b8214bf66960ecde6e (diff)
downloadtinycc-3054a76249d1f0690984027db73a94995300cac2.tar.gz
tinycc-3054a76249d1f0690984027db73a94995300cac2.tar.bz2
i386-gen: use EBX as 4th register
May be enabled/disabled by changing this line: #define USE_EBX 1
Diffstat (limited to 'i386-gen.c')
-rw-r--r--i386-gen.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/i386-gen.c b/i386-gen.c
index eaea9a3..faac055 100644
--- a/i386-gen.c
+++ b/i386-gen.c
@@ -21,7 +21,7 @@
#ifdef TARGET_DEFS_ONLY
/* number of available registers */
-#define NB_REGS 4
+#define NB_REGS 5
#define NB_ASM_REGS 8
/* a register can belong to several classes. The classes must be
@@ -33,6 +33,8 @@
#define RC_ST0 0x0008
#define RC_ECX 0x0010
#define RC_EDX 0x0020
+#define RC_EBX 0x0040
+
#define RC_IRET RC_EAX /* function return: integer register */
#define RC_LRET RC_EDX /* function return: second integer register */
#define RC_FRET RC_ST0 /* function return: float register */
@@ -42,6 +44,7 @@ enum {
TREG_EAX = 0,
TREG_ECX,
TREG_EDX,
+ TREG_EBX,
TREG_ST0,
TREG_ESP = 4
};
@@ -89,10 +92,14 @@ enum {
/******************************************************/
#include "tcc.h"
+/* define to 1/0 to [not] have EBX as 4th register */
+#define USE_EBX 1
+
ST_DATA const int reg_classes[NB_REGS] = {
/* eax */ RC_INT | RC_EAX,
/* ecx */ RC_INT | RC_ECX,
/* edx */ RC_INT | RC_EDX,
+ /* ebx */ (RC_INT | RC_EBX) * USE_EBX,
/* st0 */ RC_FLOAT | RC_ST0,
};
@@ -518,9 +525,9 @@ ST_FUNC void gfunc_call(int nb_args)
}
#ifdef TCC_TARGET_PE
-#define FUNC_PROLOG_SIZE 10
+#define FUNC_PROLOG_SIZE (10 + USE_EBX)
#else
-#define FUNC_PROLOG_SIZE 9
+#define FUNC_PROLOG_SIZE (9 + USE_EBX)
#endif
/* generate function prolog of type 't' */
@@ -646,6 +653,7 @@ ST_FUNC void gfunc_epilog(void)
o(0x585a); /* restore returned value, if any */
}
#endif
+ o(0x5b * USE_EBX); /* pop ebx */
o(0xc9); /* leave */
if (func_ret_sub == 0) {
o(0xc3); /* ret */
@@ -669,10 +677,11 @@ ST_FUNC void gfunc_epilog(void)
o(0xe58955); /* push %ebp, mov %esp, %ebp */
o(0xec81); /* sub esp, stacksize */
gen_le32(v);
-#if FUNC_PROLOG_SIZE == 10
+#ifdef TCC_TARGET_PE
o(0x90); /* adjust to FUNC_PROLOG_SIZE */
#endif
}
+ o(0x53 * USE_EBX); /* push ebx */
ind = saved_ind;
}