mirror of https://github.com/xemu-project/xemu.git
target/sh4: Create superh_io_recompile_replay_branch
Move the code from accel/tcg/translate-all.c to target/sh4/cpu.c. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20210208233906.479571-5-richard.henderson@linaro.org> Message-Id: <20210213130325.14781-14-alex.bennee@linaro.org>
This commit is contained in:
parent
95ab7c2291
commit
eb56afdb15
|
@ -2418,9 +2418,6 @@ void tb_check_watchpoint(CPUState *cpu, uintptr_t retaddr)
|
||||||
*/
|
*/
|
||||||
void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr)
|
void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr)
|
||||||
{
|
{
|
||||||
#if defined(TARGET_SH4)
|
|
||||||
CPUArchState *env = cpu->env_ptr;
|
|
||||||
#endif
|
|
||||||
TranslationBlock *tb;
|
TranslationBlock *tb;
|
||||||
CPUClass *cc;
|
CPUClass *cc;
|
||||||
uint32_t n;
|
uint32_t n;
|
||||||
|
@ -2444,15 +2441,6 @@ void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr)
|
||||||
cpu_neg(cpu)->icount_decr.u16.low++;
|
cpu_neg(cpu)->icount_decr.u16.low++;
|
||||||
n = 2;
|
n = 2;
|
||||||
}
|
}
|
||||||
#if defined(TARGET_SH4)
|
|
||||||
if ((env->flags & ((DELAY_SLOT | DELAY_SLOT_CONDITIONAL))) != 0
|
|
||||||
&& env->pc != tb->pc) {
|
|
||||||
env->pc -= 2;
|
|
||||||
cpu_neg(cpu)->icount_decr.u16.low++;
|
|
||||||
env->flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL);
|
|
||||||
n = 2;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Generate a new TB executing the I/O insn. */
|
/* Generate a new TB executing the I/O insn. */
|
||||||
cpu->cflags_next_tb = curr_cflags() | CF_LAST_IO | n;
|
cpu->cflags_next_tb = curr_cflags() | CF_LAST_IO | n;
|
||||||
|
|
|
@ -43,6 +43,23 @@ static void superh_cpu_synchronize_from_tb(CPUState *cs,
|
||||||
cpu->env.flags = tb->flags & TB_FLAG_ENVFLAGS_MASK;
|
cpu->env.flags = tb->flags & TB_FLAG_ENVFLAGS_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
static bool superh_io_recompile_replay_branch(CPUState *cs,
|
||||||
|
const TranslationBlock *tb)
|
||||||
|
{
|
||||||
|
SuperHCPU *cpu = SUPERH_CPU(cs);
|
||||||
|
CPUSH4State *env = &cpu->env;
|
||||||
|
|
||||||
|
if ((env->flags & ((DELAY_SLOT | DELAY_SLOT_CONDITIONAL))) != 0
|
||||||
|
&& env->pc != tb->pc) {
|
||||||
|
env->pc -= 2;
|
||||||
|
env->flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool superh_cpu_has_work(CPUState *cs)
|
static bool superh_cpu_has_work(CPUState *cs)
|
||||||
{
|
{
|
||||||
return cs->interrupt_request & CPU_INTERRUPT_HARD;
|
return cs->interrupt_request & CPU_INTERRUPT_HARD;
|
||||||
|
@ -217,6 +234,7 @@ static struct TCGCPUOps superh_tcg_ops = {
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
.do_interrupt = superh_cpu_do_interrupt,
|
.do_interrupt = superh_cpu_do_interrupt,
|
||||||
.do_unaligned_access = superh_cpu_do_unaligned_access,
|
.do_unaligned_access = superh_cpu_do_unaligned_access,
|
||||||
|
.io_recompile_replay_branch = superh_io_recompile_replay_branch,
|
||||||
#endif /* !CONFIG_USER_ONLY */
|
#endif /* !CONFIG_USER_ONLY */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue