Commit 6673f47d authored by Stefan Weil's avatar Stefan Weil Committed by Aurelien Jarno

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: default avatarStefan Weil <sw@weilnetz.de>
Signed-off-by: default avatarAurelien Jarno <aurelien@aurel32.net>
parent ac05f349
...@@ -300,7 +300,7 @@ static const int tcg_target_reg_alloc_order[] = { ...@@ -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[] = { ...@@ -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, ...@@ -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, ...@@ -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++);
......
...@@ -36,17 +36,19 @@ ...@@ -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) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment