diff options
author | Max Filippov <jcmvbkbc@gmail.com> | 2019-02-11 12:22:29 -0800 |
---|---|---|
committer | Max Filippov <jcmvbkbc@gmail.com> | 2019-02-28 04:43:22 -0800 |
commit | c949009bc0612cbfc7bc5b80c3e9ea3e24313434 (patch) | |
tree | f9db6c6424c5ccc8a7b6309edc7da6e7268ec19c | |
parent | 8df3fd359697d68095c5f1ba47e83e8e237a3055 (diff) | |
download | qemu-c949009bc0612cbfc7bc5b80c3e9ea3e24313434.zip qemu-c949009bc0612cbfc7bc5b80c3e9ea3e24313434.tar.gz qemu-c949009bc0612cbfc7bc5b80c3e9ea3e24313434.tar.bz2 |
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>
-rw-r--r-- | target/xtensa/helper.h | 2 | ||||
-rw-r--r-- | target/xtensa/translate.c | 9 | ||||
-rw-r--r-- | target/xtensa/win_helper.c | 8 |
3 files changed, 10 insertions, 9 deletions
diff --git a/target/xtensa/helper.h b/target/xtensa/helper.h index b6529a8..0b9ec67 100644 --- a/target/xtensa/helper.h +++ b/target/xtensa/helper.h @@ -7,7 +7,7 @@ DEF_HELPER_1(sync_windowbase, void, env) DEF_HELPER_4(entry, void, env, i32, i32, i32) DEF_HELPER_2(test_ill_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_1(restore_owb, void, env) DEF_HELPER_2(movsp, void, env, i32) diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c index cbb8d87..e63a5f5 100644 --- a/target/xtensa/translate.c +++ b/target/xtensa/translate.c @@ -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[], const uint32_t par[]) { - TCGv_i32 tmp = tcg_const_i32(dc->pc); - gen_helper_retw(tmp, cpu_env, tmp); + TCGv_i32 tmp = tcg_const_i32(1); + 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); tcg_temp_free(tmp); } diff --git a/target/xtensa/win_helper.c b/target/xtensa/win_helper.c index d7a4e27..f6f96a6 100644 --- a/target/xtensa/win_helper.c +++ b/target/xtensa/win_helper.c @@ -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; - uint32_t windowbase = windowbase_bound(env->sregs[WINDOW_BASE], env); - uint32_t ret_pc = (pc & 0xc0000000) | (env->regs[0] & 0x3fffffff); + int n = (a0 >> 30) & 0x3; xtensa_rotate_window(env, -n); - env->sregs[WINDOW_START] &= ~windowstart_bit(windowbase, env); - return ret_pc; } void xtensa_restore_owb(CPUXtensaState *env) |