tcg/ppc: Fix CONFIG_TCG_PASS_AREG0 mode
Adjust the tcg_out_qemu_{ld,st}() slow paths to pass AREG0 in r3, based on patches by malc. Also adjust the registers clobbered, based on patch by Alex. Signed-off-by: Andreas Färber <afaerber@suse.de> Acked-by: Alexander Graf <agraf@suse.de> [AF: Do not hardcode r3 for AREG0, requested by Alex] Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
a082615b07
commit
1b3e76ebd1
@ -244,8 +244,18 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str)
|
||||
tcg_regset_set32(ct->u.regs, 0, 0xffffffff);
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R3);
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R4);
|
||||
#ifdef CONFIG_TCG_PASS_AREG0
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R5);
|
||||
#if TARGET_LONG_BITS == 64
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R6);
|
||||
#ifdef TCG_TARGET_CALL_ALIGN_ARGS
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R7);
|
||||
#endif
|
||||
#endif
|
||||
#else /* !AREG0 */
|
||||
#if TARGET_LONG_BITS == 64
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R5);
|
||||
#endif
|
||||
#endif
|
||||
break;
|
||||
case 'K': /* qemu_st[8..32] constraint */
|
||||
@ -254,8 +264,18 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str)
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R3);
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R4);
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R5);
|
||||
#ifdef CONFIG_TCG_PASS_AREG0
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R6);
|
||||
#if TARGET_LONG_BITS == 64
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R7);
|
||||
#ifdef TCG_TARGET_CALL_ALIGN_ARGS
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R8);
|
||||
#endif
|
||||
#endif
|
||||
#else /* !AREG0 */
|
||||
#if TARGET_LONG_BITS == 64
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R6);
|
||||
#endif
|
||||
#endif
|
||||
break;
|
||||
case 'M': /* qemu_st64 constraint */
|
||||
@ -266,6 +286,12 @@ static int target_parse_constraint(TCGArgConstraint *ct, const char **pct_str)
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R5);
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R6);
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R7);
|
||||
#if defined(CONFIG_TCG_PASS_AREG0)
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R8);
|
||||
#ifdef TCG_TARGET_CALL_ALIGN_ARGS
|
||||
tcg_regset_reset_reg(ct->u.regs, TCG_REG_R9);
|
||||
#endif
|
||||
#endif
|
||||
break;
|
||||
#else
|
||||
case 'L':
|
||||
@ -512,7 +538,6 @@ static void tcg_out_call (TCGContext *s, tcg_target_long arg, int const_arg)
|
||||
#include "../../softmmu_defs.h"
|
||||
|
||||
#ifdef CONFIG_TCG_PASS_AREG0
|
||||
#error CONFIG_TCG_PASS_AREG0 is not supported
|
||||
/* helper signature: helper_ld_mmu(CPUState *env, target_ulong addr,
|
||||
int mmu_idx) */
|
||||
static const void * const qemu_ld_helpers[4] = {
|
||||
@ -618,6 +643,9 @@ static void tcg_out_qemu_ld (TCGContext *s, const TCGArg *args, int opc)
|
||||
|
||||
/* slow path */
|
||||
ir = 3;
|
||||
#ifdef CONFIG_TCG_PASS_AREG0
|
||||
tcg_out_mov (s, TCG_TYPE_I32, ir++, TCG_AREG0);
|
||||
#endif
|
||||
#if TARGET_LONG_BITS == 32
|
||||
tcg_out_mov (s, TCG_TYPE_I32, ir++, addr_reg);
|
||||
#else
|
||||
@ -817,6 +845,9 @@ static void tcg_out_qemu_st (TCGContext *s, const TCGArg *args, int opc)
|
||||
|
||||
/* slow path */
|
||||
ir = 3;
|
||||
#ifdef CONFIG_TCG_PASS_AREG0
|
||||
tcg_out_mov (s, TCG_TYPE_I32, ir++, TCG_AREG0);
|
||||
#endif
|
||||
#if TARGET_LONG_BITS == 32
|
||||
tcg_out_mov (s, TCG_TYPE_I32, ir++, addr_reg);
|
||||
#else
|
||||
|
Loading…
Reference in New Issue
Block a user