mirror of https://github.com/xqemu/xqemu.git
tci: Fix for AREG0 free mode
Support for helper functions with 5 arguments was missing in the code generator and in the interpreter. There is no need to pass the constant TCG_AREG0 from the code generator to the interpreter. Remove that code for the INDEX_op_qemu_st* opcodes. Signed-off-by: Stefan Weil <sw@weilnetz.de> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
ac05f34924
commit
6673f47da2
|
@ -300,7 +300,7 @@ static const int tcg_target_reg_alloc_order[] = {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#if MAX_OPC_PARAM_IARGS != 4
|
#if MAX_OPC_PARAM_IARGS != 5
|
||||||
# error Fix needed, number of supported input arguments changed!
|
# error Fix needed, number of supported input arguments changed!
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -309,16 +309,18 @@ static const int tcg_target_call_iarg_regs[] = {
|
||||||
TCG_REG_R1,
|
TCG_REG_R1,
|
||||||
TCG_REG_R2,
|
TCG_REG_R2,
|
||||||
TCG_REG_R3,
|
TCG_REG_R3,
|
||||||
#if TCG_TARGET_REG_BITS == 32
|
|
||||||
/* 32 bit hosts need 2 * MAX_OPC_PARAM_IARGS registers. */
|
|
||||||
#if 0 /* used for TCG_REG_CALL_STACK */
|
#if 0 /* used for TCG_REG_CALL_STACK */
|
||||||
TCG_REG_R4,
|
TCG_REG_R4,
|
||||||
#endif
|
#endif
|
||||||
TCG_REG_R5,
|
TCG_REG_R5,
|
||||||
|
#if TCG_TARGET_REG_BITS == 32
|
||||||
|
/* 32 bit hosts need 2 * MAX_OPC_PARAM_IARGS registers. */
|
||||||
TCG_REG_R6,
|
TCG_REG_R6,
|
||||||
TCG_REG_R7,
|
TCG_REG_R7,
|
||||||
#if TCG_TARGET_NB_REGS >= 16
|
#if TCG_TARGET_NB_REGS >= 16
|
||||||
TCG_REG_R8,
|
TCG_REG_R8,
|
||||||
|
TCG_REG_R9,
|
||||||
|
TCG_REG_R10,
|
||||||
#else
|
#else
|
||||||
# error Too few input registers available
|
# error Too few input registers available
|
||||||
#endif
|
#endif
|
||||||
|
@ -798,7 +800,6 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
|
||||||
case INDEX_op_qemu_st8:
|
case INDEX_op_qemu_st8:
|
||||||
case INDEX_op_qemu_st16:
|
case INDEX_op_qemu_st16:
|
||||||
case INDEX_op_qemu_st32:
|
case INDEX_op_qemu_st32:
|
||||||
tcg_out_r(s, TCG_AREG0);
|
|
||||||
tcg_out_r(s, *args++);
|
tcg_out_r(s, *args++);
|
||||||
tcg_out_r(s, *args++);
|
tcg_out_r(s, *args++);
|
||||||
#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
|
#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
|
||||||
|
@ -809,7 +810,6 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case INDEX_op_qemu_st64:
|
case INDEX_op_qemu_st64:
|
||||||
tcg_out_r(s, TCG_AREG0);
|
|
||||||
tcg_out_r(s, *args++);
|
tcg_out_r(s, *args++);
|
||||||
#if TCG_TARGET_REG_BITS == 32
|
#if TCG_TARGET_REG_BITS == 32
|
||||||
tcg_out_r(s, *args++);
|
tcg_out_r(s, *args++);
|
||||||
|
|
13
tci.c
13
tci.c
|
@ -36,17 +36,19 @@
|
||||||
tcg_abort(); \
|
tcg_abort(); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#if MAX_OPC_PARAM_IARGS != 4
|
#if MAX_OPC_PARAM_IARGS != 5
|
||||||
# error Fix needed, number of supported input arguments changed!
|
# error Fix needed, number of supported input arguments changed!
|
||||||
#endif
|
#endif
|
||||||
#if TCG_TARGET_REG_BITS == 32
|
#if TCG_TARGET_REG_BITS == 32
|
||||||
typedef uint64_t (*helper_function)(tcg_target_ulong, tcg_target_ulong,
|
typedef uint64_t (*helper_function)(tcg_target_ulong, tcg_target_ulong,
|
||||||
|
tcg_target_ulong, tcg_target_ulong,
|
||||||
tcg_target_ulong, tcg_target_ulong,
|
tcg_target_ulong, tcg_target_ulong,
|
||||||
tcg_target_ulong, tcg_target_ulong,
|
tcg_target_ulong, tcg_target_ulong,
|
||||||
tcg_target_ulong, tcg_target_ulong);
|
tcg_target_ulong, tcg_target_ulong);
|
||||||
#else
|
#else
|
||||||
typedef uint64_t (*helper_function)(tcg_target_ulong, tcg_target_ulong,
|
typedef uint64_t (*helper_function)(tcg_target_ulong, tcg_target_ulong,
|
||||||
tcg_target_ulong, tcg_target_ulong);
|
tcg_target_ulong, tcg_target_ulong,
|
||||||
|
tcg_target_ulong);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* TCI can optionally use a global register variable for env. */
|
/* TCI can optionally use a global register variable for env. */
|
||||||
|
@ -489,14 +491,17 @@ tcg_target_ulong tcg_qemu_tb_exec(CPUArchState *cpustate, uint8_t *tb_ptr)
|
||||||
tci_read_reg(TCG_REG_R5),
|
tci_read_reg(TCG_REG_R5),
|
||||||
tci_read_reg(TCG_REG_R6),
|
tci_read_reg(TCG_REG_R6),
|
||||||
tci_read_reg(TCG_REG_R7),
|
tci_read_reg(TCG_REG_R7),
|
||||||
tci_read_reg(TCG_REG_R8));
|
tci_read_reg(TCG_REG_R8),
|
||||||
|
tci_read_reg(TCG_REG_R9),
|
||||||
|
tci_read_reg(TCG_REG_R10));
|
||||||
tci_write_reg(TCG_REG_R0, tmp64);
|
tci_write_reg(TCG_REG_R0, tmp64);
|
||||||
tci_write_reg(TCG_REG_R1, tmp64 >> 32);
|
tci_write_reg(TCG_REG_R1, tmp64 >> 32);
|
||||||
#else
|
#else
|
||||||
tmp64 = ((helper_function)t0)(tci_read_reg(TCG_REG_R0),
|
tmp64 = ((helper_function)t0)(tci_read_reg(TCG_REG_R0),
|
||||||
tci_read_reg(TCG_REG_R1),
|
tci_read_reg(TCG_REG_R1),
|
||||||
tci_read_reg(TCG_REG_R2),
|
tci_read_reg(TCG_REG_R2),
|
||||||
tci_read_reg(TCG_REG_R3));
|
tci_read_reg(TCG_REG_R3),
|
||||||
|
tci_read_reg(TCG_REG_R5));
|
||||||
tci_write_reg(TCG_REG_R0, tmp64);
|
tci_write_reg(TCG_REG_R0, tmp64);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue