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 */
|
||||
#define TCG_REG_CALL_STACK TCG_REG_SP
|
||||
#define TCG_TARGET_STACK_ALIGN 16
|
||||
#define TCG_TARGET_CALL_ALIGN_ARGS 1
|
||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||
|
||||
/* optional instructions */
|
||||
#define TCG_TARGET_HAS_div_i32 1
|
||||
|
|
|
@ -88,8 +88,8 @@ extern bool use_neon_instructions;
|
|||
|
||||
/* used for function call generation */
|
||||
#define TCG_TARGET_STACK_ALIGN 8
|
||||
#define TCG_TARGET_CALL_ALIGN_ARGS 1
|
||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
|
||||
|
||||
/* optional instructions */
|
||||
#define TCG_TARGET_HAS_ext8s_i32 1
|
||||
|
|
|
@ -98,6 +98,7 @@ typedef enum {
|
|||
#else
|
||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||
#endif
|
||||
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||
|
||||
extern bool have_bmi1;
|
||||
extern bool have_popcnt;
|
||||
|
|
|
@ -92,8 +92,8 @@ typedef enum {
|
|||
/* used for function call generation */
|
||||
#define TCG_REG_CALL_STACK TCG_REG_SP
|
||||
#define TCG_TARGET_STACK_ALIGN 16
|
||||
#define TCG_TARGET_CALL_ALIGN_ARGS 1
|
||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||
|
||||
/* optional instructions */
|
||||
#define TCG_TARGET_HAS_movcond_i32 0
|
||||
|
|
|
@ -83,10 +83,11 @@ typedef enum {
|
|||
#define TCG_TARGET_STACK_ALIGN 16
|
||||
#if _MIPS_SIM == _ABIO32
|
||||
# define TCG_TARGET_CALL_STACK_OFFSET 16
|
||||
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
|
||||
#else
|
||||
# define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||
#endif
|
||||
#define TCG_TARGET_CALL_ALIGN_ARGS 1
|
||||
|
||||
/* MOVN/MOVZ instructions detection */
|
||||
#if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \
|
||||
|
|
|
@ -45,7 +45,9 @@
|
|||
#endif
|
||||
|
||||
#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
|
||||
|
||||
/* 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;
|
||||
hi = lb->addrhi_reg;
|
||||
if (TCG_TARGET_REG_BITS < TARGET_LONG_BITS) {
|
||||
#ifdef TCG_TARGET_CALL_ALIGN_ARGS
|
||||
arg |= 1;
|
||||
#endif
|
||||
arg |= (TCG_TARGET_CALL_ARG_I64 == TCG_CALL_ARG_EVEN);
|
||||
tcg_out_mov(s, TCG_TYPE_I32, arg++, hi);
|
||||
tcg_out_mov(s, TCG_TYPE_I32, arg++, lo);
|
||||
} else {
|
||||
|
@ -2250,9 +2250,7 @@ static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
|||
lo = lb->addrlo_reg;
|
||||
hi = lb->addrhi_reg;
|
||||
if (TCG_TARGET_REG_BITS < TARGET_LONG_BITS) {
|
||||
#ifdef TCG_TARGET_CALL_ALIGN_ARGS
|
||||
arg |= 1;
|
||||
#endif
|
||||
arg |= (TCG_TARGET_CALL_ARG_I64 == TCG_CALL_ARG_EVEN);
|
||||
tcg_out_mov(s, TCG_TYPE_I32, arg++, hi);
|
||||
tcg_out_mov(s, TCG_TYPE_I32, arg++, lo);
|
||||
} else {
|
||||
|
@ -2266,9 +2264,7 @@ static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
|||
if (TCG_TARGET_REG_BITS == 32) {
|
||||
switch (s_bits) {
|
||||
case MO_64:
|
||||
#ifdef TCG_TARGET_CALL_ALIGN_ARGS
|
||||
arg |= 1;
|
||||
#endif
|
||||
arg |= (TCG_TARGET_CALL_ARG_I64 == TCG_CALL_ARG_EVEN);
|
||||
tcg_out_mov(s, TCG_TYPE_I32, arg++, hi);
|
||||
/* FALLTHRU */
|
||||
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) {
|
||||
TCGReg arg = TCG_REG_R4;
|
||||
#ifdef TCG_TARGET_CALL_ALIGN_ARGS
|
||||
arg |= 1;
|
||||
#endif
|
||||
|
||||
arg |= (TCG_TARGET_CALL_ARG_I64 == TCG_CALL_ARG_EVEN);
|
||||
if (l->addrlo_reg != arg) {
|
||||
tcg_out_mov(s, TCG_TYPE_I32, arg, l->addrhi_reg);
|
||||
tcg_out_mov(s, TCG_TYPE_I32, arg + 1, l->addrlo_reg);
|
||||
|
|
|
@ -81,8 +81,12 @@ typedef enum {
|
|||
/* used for function call generation */
|
||||
#define TCG_REG_CALL_STACK TCG_REG_SP
|
||||
#define TCG_TARGET_STACK_ALIGN 16
|
||||
#define TCG_TARGET_CALL_ALIGN_ARGS 1
|
||||
#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 */
|
||||
#define TCG_TARGET_HAS_movcond_i32 0
|
||||
|
|
|
@ -166,6 +166,7 @@ extern uint64_t s390_facilities[3];
|
|||
/* used for function call generation */
|
||||
#define TCG_TARGET_STACK_ALIGN 8
|
||||
#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_HAS_MEMORY_BSWAP 1
|
||||
|
|
|
@ -72,6 +72,7 @@ typedef enum {
|
|||
#define TCG_TARGET_STACK_ALIGN 16
|
||||
#define TCG_TARGET_CALL_STACK_OFFSET (128 + 6*8 + TCG_TARGET_STACK_BIAS)
|
||||
#define TCG_TARGET_EXTEND_ARGS 1
|
||||
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
|
||||
|
||||
#if defined(__VIS__) && __VIS__ >= 0x300
|
||||
#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.
|
||||
*/
|
||||
want_align = true;
|
||||
#elif defined(TCG_TARGET_CALL_ALIGN_ARGS)
|
||||
#else
|
||||
/* 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
|
||||
|
||||
if (TCG_TARGET_REG_BITS < 64 && want_align && (real_args & 1)) {
|
||||
|
|
|
@ -158,6 +158,11 @@ typedef enum {
|
|||
/* Used for function call generation. */
|
||||
#define TCG_TARGET_CALL_STACK_OFFSET 0
|
||||
#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 TCG_TARGET_NEED_POOL_LABELS
|
||||
|
|
Loading…
Reference in New Issue