mirror of https://github.com/xemu-project/xemu.git
tcg: Replace TCG_TARGET_CALL_ALIGN_ARGS with TCG_TARGET_CALL_ARG_I64
For 32-bit hosts when TCG_TARGET_CALL_ALIGN_ARGS was set, use TCG_CALL_ARG_EVEN. For 64-bit hosts, TCG_TARGET_CALL_ALIGN_ARGS was silently ignored, so always use TCG_CALL_ARG_NORMAL. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
18ff36ab71
commit
c8eef96046
|
@ -51,8 +51,8 @@ typedef enum {
|
||||||
/* used for function call generation */
|
/* used for function call generation */
|
||||||
#define TCG_REG_CALL_STACK TCG_REG_SP
|
#define TCG_REG_CALL_STACK TCG_REG_SP
|
||||||
#define TCG_TARGET_STACK_ALIGN 16
|
#define TCG_TARGET_STACK_ALIGN 16
|
||||||
#define TCG_TARGET_CALL_ALIGN_ARGS 1
|
|
||||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||||
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
|
|
||||||
/* optional instructions */
|
/* optional instructions */
|
||||||
#define TCG_TARGET_HAS_div_i32 1
|
#define TCG_TARGET_HAS_div_i32 1
|
||||||
|
|
|
@ -88,8 +88,8 @@ extern bool use_neon_instructions;
|
||||||
|
|
||||||
/* used for function call generation */
|
/* used for function call generation */
|
||||||
#define TCG_TARGET_STACK_ALIGN 8
|
#define TCG_TARGET_STACK_ALIGN 8
|
||||||
#define TCG_TARGET_CALL_ALIGN_ARGS 1
|
|
||||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||||
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
|
||||||
|
|
||||||
/* optional instructions */
|
/* optional instructions */
|
||||||
#define TCG_TARGET_HAS_ext8s_i32 1
|
#define TCG_TARGET_HAS_ext8s_i32 1
|
||||||
|
|
|
@ -98,6 +98,7 @@ typedef enum {
|
||||||
#else
|
#else
|
||||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||||
#endif
|
#endif
|
||||||
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
|
|
||||||
extern bool have_bmi1;
|
extern bool have_bmi1;
|
||||||
extern bool have_popcnt;
|
extern bool have_popcnt;
|
||||||
|
|
|
@ -92,8 +92,8 @@ typedef enum {
|
||||||
/* used for function call generation */
|
/* used for function call generation */
|
||||||
#define TCG_REG_CALL_STACK TCG_REG_SP
|
#define TCG_REG_CALL_STACK TCG_REG_SP
|
||||||
#define TCG_TARGET_STACK_ALIGN 16
|
#define TCG_TARGET_STACK_ALIGN 16
|
||||||
#define TCG_TARGET_CALL_ALIGN_ARGS 1
|
|
||||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||||
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
|
|
||||||
/* optional instructions */
|
/* optional instructions */
|
||||||
#define TCG_TARGET_HAS_movcond_i32 0
|
#define TCG_TARGET_HAS_movcond_i32 0
|
||||||
|
|
|
@ -83,10 +83,11 @@ typedef enum {
|
||||||
#define TCG_TARGET_STACK_ALIGN 16
|
#define TCG_TARGET_STACK_ALIGN 16
|
||||||
#if _MIPS_SIM == _ABIO32
|
#if _MIPS_SIM == _ABIO32
|
||||||
# define TCG_TARGET_CALL_STACK_OFFSET 16
|
# define TCG_TARGET_CALL_STACK_OFFSET 16
|
||||||
|
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
|
||||||
#else
|
#else
|
||||||
# define TCG_TARGET_CALL_STACK_OFFSET 0
|
# define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||||
|
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
#endif
|
#endif
|
||||||
#define TCG_TARGET_CALL_ALIGN_ARGS 1
|
|
||||||
|
|
||||||
/* MOVN/MOVZ instructions detection */
|
/* MOVN/MOVZ instructions detection */
|
||||||
#if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \
|
#if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \
|
||||||
|
|
|
@ -45,7 +45,9 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _CALL_SYSV
|
#ifdef _CALL_SYSV
|
||||||
# define TCG_TARGET_CALL_ALIGN_ARGS 1
|
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
|
||||||
|
#else
|
||||||
|
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* For some memory operations, we need a scratch that isn't R0. For the AIX
|
/* For some memory operations, we need a scratch that isn't R0. For the AIX
|
||||||
|
@ -2202,9 +2204,7 @@ static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
||||||
lo = lb->addrlo_reg;
|
lo = lb->addrlo_reg;
|
||||||
hi = lb->addrhi_reg;
|
hi = lb->addrhi_reg;
|
||||||
if (TCG_TARGET_REG_BITS < TARGET_LONG_BITS) {
|
if (TCG_TARGET_REG_BITS < TARGET_LONG_BITS) {
|
||||||
#ifdef TCG_TARGET_CALL_ALIGN_ARGS
|
arg |= (TCG_TARGET_CALL_ARG_I64 == TCG_CALL_ARG_EVEN);
|
||||||
arg |= 1;
|
|
||||||
#endif
|
|
||||||
tcg_out_mov(s, TCG_TYPE_I32, arg++, hi);
|
tcg_out_mov(s, TCG_TYPE_I32, arg++, hi);
|
||||||
tcg_out_mov(s, TCG_TYPE_I32, arg++, lo);
|
tcg_out_mov(s, TCG_TYPE_I32, arg++, lo);
|
||||||
} else {
|
} else {
|
||||||
|
@ -2250,9 +2250,7 @@ static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
||||||
lo = lb->addrlo_reg;
|
lo = lb->addrlo_reg;
|
||||||
hi = lb->addrhi_reg;
|
hi = lb->addrhi_reg;
|
||||||
if (TCG_TARGET_REG_BITS < TARGET_LONG_BITS) {
|
if (TCG_TARGET_REG_BITS < TARGET_LONG_BITS) {
|
||||||
#ifdef TCG_TARGET_CALL_ALIGN_ARGS
|
arg |= (TCG_TARGET_CALL_ARG_I64 == TCG_CALL_ARG_EVEN);
|
||||||
arg |= 1;
|
|
||||||
#endif
|
|
||||||
tcg_out_mov(s, TCG_TYPE_I32, arg++, hi);
|
tcg_out_mov(s, TCG_TYPE_I32, arg++, hi);
|
||||||
tcg_out_mov(s, TCG_TYPE_I32, arg++, lo);
|
tcg_out_mov(s, TCG_TYPE_I32, arg++, lo);
|
||||||
} else {
|
} else {
|
||||||
|
@ -2266,9 +2264,7 @@ static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
||||||
if (TCG_TARGET_REG_BITS == 32) {
|
if (TCG_TARGET_REG_BITS == 32) {
|
||||||
switch (s_bits) {
|
switch (s_bits) {
|
||||||
case MO_64:
|
case MO_64:
|
||||||
#ifdef TCG_TARGET_CALL_ALIGN_ARGS
|
arg |= (TCG_TARGET_CALL_ARG_I64 == TCG_CALL_ARG_EVEN);
|
||||||
arg |= 1;
|
|
||||||
#endif
|
|
||||||
tcg_out_mov(s, TCG_TYPE_I32, arg++, hi);
|
tcg_out_mov(s, TCG_TYPE_I32, arg++, hi);
|
||||||
/* FALLTHRU */
|
/* FALLTHRU */
|
||||||
case MO_32:
|
case MO_32:
|
||||||
|
@ -2324,9 +2320,8 @@ static bool tcg_out_fail_alignment(TCGContext *s, TCGLabelQemuLdst *l)
|
||||||
|
|
||||||
if (TCG_TARGET_REG_BITS < TARGET_LONG_BITS) {
|
if (TCG_TARGET_REG_BITS < TARGET_LONG_BITS) {
|
||||||
TCGReg arg = TCG_REG_R4;
|
TCGReg arg = TCG_REG_R4;
|
||||||
#ifdef TCG_TARGET_CALL_ALIGN_ARGS
|
|
||||||
arg |= 1;
|
arg |= (TCG_TARGET_CALL_ARG_I64 == TCG_CALL_ARG_EVEN);
|
||||||
#endif
|
|
||||||
if (l->addrlo_reg != arg) {
|
if (l->addrlo_reg != arg) {
|
||||||
tcg_out_mov(s, TCG_TYPE_I32, arg, l->addrhi_reg);
|
tcg_out_mov(s, TCG_TYPE_I32, arg, l->addrhi_reg);
|
||||||
tcg_out_mov(s, TCG_TYPE_I32, arg + 1, l->addrlo_reg);
|
tcg_out_mov(s, TCG_TYPE_I32, arg + 1, l->addrlo_reg);
|
||||||
|
|
|
@ -81,8 +81,12 @@ typedef enum {
|
||||||
/* used for function call generation */
|
/* used for function call generation */
|
||||||
#define TCG_REG_CALL_STACK TCG_REG_SP
|
#define TCG_REG_CALL_STACK TCG_REG_SP
|
||||||
#define TCG_TARGET_STACK_ALIGN 16
|
#define TCG_TARGET_STACK_ALIGN 16
|
||||||
#define TCG_TARGET_CALL_ALIGN_ARGS 1
|
|
||||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||||
|
#if TCG_TARGET_REG_BITS == 32
|
||||||
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
|
||||||
|
#else
|
||||||
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
|
#endif
|
||||||
|
|
||||||
/* optional instructions */
|
/* optional instructions */
|
||||||
#define TCG_TARGET_HAS_movcond_i32 0
|
#define TCG_TARGET_HAS_movcond_i32 0
|
||||||
|
|
|
@ -166,6 +166,7 @@ extern uint64_t s390_facilities[3];
|
||||||
/* used for function call generation */
|
/* used for function call generation */
|
||||||
#define TCG_TARGET_STACK_ALIGN 8
|
#define TCG_TARGET_STACK_ALIGN 8
|
||||||
#define TCG_TARGET_CALL_STACK_OFFSET 160
|
#define TCG_TARGET_CALL_STACK_OFFSET 160
|
||||||
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
|
|
||||||
#define TCG_TARGET_EXTEND_ARGS 1
|
#define TCG_TARGET_EXTEND_ARGS 1
|
||||||
#define TCG_TARGET_HAS_MEMORY_BSWAP 1
|
#define TCG_TARGET_HAS_MEMORY_BSWAP 1
|
||||||
|
|
|
@ -72,6 +72,7 @@ typedef enum {
|
||||||
#define TCG_TARGET_STACK_ALIGN 16
|
#define TCG_TARGET_STACK_ALIGN 16
|
||||||
#define TCG_TARGET_CALL_STACK_OFFSET (128 + 6*8 + TCG_TARGET_STACK_BIAS)
|
#define TCG_TARGET_CALL_STACK_OFFSET (128 + 6*8 + TCG_TARGET_STACK_BIAS)
|
||||||
#define TCG_TARGET_EXTEND_ARGS 1
|
#define TCG_TARGET_EXTEND_ARGS 1
|
||||||
|
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
|
|
||||||
#if defined(__VIS__) && __VIS__ >= 0x300
|
#if defined(__VIS__) && __VIS__ >= 0x300
|
||||||
#define use_vis3_instructions 1
|
#define use_vis3_instructions 1
|
||||||
|
|
|
@ -1542,9 +1542,11 @@ void tcg_gen_callN(void *func, TCGTemp *ret, int nargs, TCGTemp **args)
|
||||||
* for passing off to ffi_call.
|
* for passing off to ffi_call.
|
||||||
*/
|
*/
|
||||||
want_align = true;
|
want_align = true;
|
||||||
#elif defined(TCG_TARGET_CALL_ALIGN_ARGS)
|
#else
|
||||||
/* Some targets want aligned 64 bit args */
|
/* Some targets want aligned 64 bit args */
|
||||||
want_align = is_64bit;
|
if (is_64bit) {
|
||||||
|
want_align = TCG_TARGET_CALL_ARG_I64 == TCG_CALL_ARG_EVEN;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (TCG_TARGET_REG_BITS < 64 && want_align && (real_args & 1)) {
|
if (TCG_TARGET_REG_BITS < 64 && want_align && (real_args & 1)) {
|
||||||
|
|
|
@ -158,6 +158,11 @@ typedef enum {
|
||||||
/* Used for function call generation. */
|
/* Used for function call generation. */
|
||||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||||
#define TCG_TARGET_STACK_ALIGN 8
|
#define TCG_TARGET_STACK_ALIGN 8
|
||||||
|
#if TCG_TARGET_REG_BITS == 32
|
||||||
|
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
|
||||||
|
#else
|
||||||
|
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||||
|
#endif
|
||||||
|
|
||||||
#define HAVE_TCG_QEMU_TB_EXEC
|
#define HAVE_TCG_QEMU_TB_EXEC
|
||||||
#define TCG_TARGET_NEED_POOL_LABELS
|
#define TCG_TARGET_NEED_POOL_LABELS
|
||||||
|
|
Loading…
Reference in New Issue