mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 10:34:58 -06:00
target/xtensa: only rotate window in the retw helper
Move return address calculation and WINDOW_START adjustment out of the retw helper to simplify logic a bit and avoid using registers directly. Pass a0 as a parameter to the helper. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
This commit is contained in:
parent
8df3fd3596
commit
c949009bc0
3 changed files with 10 additions and 9 deletions
|
@ -7,7 +7,7 @@ DEF_HELPER_1(sync_windowbase, void, env)
|
||||||
DEF_HELPER_4(entry, void, env, i32, i32, i32)
|
DEF_HELPER_4(entry, void, env, i32, i32, i32)
|
||||||
DEF_HELPER_2(test_ill_retw, void, env, i32)
|
DEF_HELPER_2(test_ill_retw, void, env, i32)
|
||||||
DEF_HELPER_2(test_underflow_retw, void, env, i32)
|
DEF_HELPER_2(test_underflow_retw, void, env, i32)
|
||||||
DEF_HELPER_2(retw, i32, env, i32)
|
DEF_HELPER_2(retw, void, env, i32)
|
||||||
DEF_HELPER_3(window_check, noreturn, env, i32, i32)
|
DEF_HELPER_3(window_check, noreturn, env, i32, i32)
|
||||||
DEF_HELPER_1(restore_owb, void, env)
|
DEF_HELPER_1(restore_owb, void, env)
|
||||||
DEF_HELPER_2(movsp, void, env, i32)
|
DEF_HELPER_2(movsp, void, env, i32)
|
||||||
|
|
|
@ -2227,8 +2227,13 @@ static bool test_ill_retw(DisasContext *dc, const uint32_t arg[],
|
||||||
static void translate_retw(DisasContext *dc, const uint32_t arg[],
|
static void translate_retw(DisasContext *dc, const uint32_t arg[],
|
||||||
const uint32_t par[])
|
const uint32_t par[])
|
||||||
{
|
{
|
||||||
TCGv_i32 tmp = tcg_const_i32(dc->pc);
|
TCGv_i32 tmp = tcg_const_i32(1);
|
||||||
gen_helper_retw(tmp, cpu_env, tmp);
|
tcg_gen_shl_i32(tmp, tmp, cpu_SR[WINDOW_BASE]);
|
||||||
|
tcg_gen_andc_i32(cpu_SR[WINDOW_START],
|
||||||
|
cpu_SR[WINDOW_START], tmp);
|
||||||
|
tcg_gen_movi_i32(tmp, dc->pc);
|
||||||
|
tcg_gen_deposit_i32(tmp, tmp, cpu_R[0], 0, 30);
|
||||||
|
gen_helper_retw(cpu_env, cpu_R[0]);
|
||||||
gen_jump(dc, tmp);
|
gen_jump(dc, tmp);
|
||||||
tcg_temp_free(tmp);
|
tcg_temp_free(tmp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -184,15 +184,11 @@ void HELPER(test_underflow_retw)(CPUXtensaState *env, uint32_t pc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t HELPER(retw)(CPUXtensaState *env, uint32_t pc)
|
void HELPER(retw)(CPUXtensaState *env, uint32_t a0)
|
||||||
{
|
{
|
||||||
int n = (env->regs[0] >> 30) & 0x3;
|
int n = (a0 >> 30) & 0x3;
|
||||||
uint32_t windowbase = windowbase_bound(env->sregs[WINDOW_BASE], env);
|
|
||||||
uint32_t ret_pc = (pc & 0xc0000000) | (env->regs[0] & 0x3fffffff);
|
|
||||||
|
|
||||||
xtensa_rotate_window(env, -n);
|
xtensa_rotate_window(env, -n);
|
||||||
env->sregs[WINDOW_START] &= ~windowstart_bit(windowbase, env);
|
|
||||||
return ret_pc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void xtensa_restore_owb(CPUXtensaState *env)
|
void xtensa_restore_owb(CPUXtensaState *env)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue