mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-26 03:21:50 -06:00
target-alpha: Merge HW_REI and HW_RET implementations.
Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
8417845ee9
commit
508b43eaf3
3 changed files with 8 additions and 22 deletions
|
@ -100,7 +100,6 @@ DEF_HELPER_1(ieee_input_cmp, i64, i64)
|
||||||
DEF_HELPER_1(ieee_input_s, i64, i64)
|
DEF_HELPER_1(ieee_input_s, i64, i64)
|
||||||
|
|
||||||
#if !defined (CONFIG_USER_ONLY)
|
#if !defined (CONFIG_USER_ONLY)
|
||||||
DEF_HELPER_0(hw_rei, void)
|
|
||||||
DEF_HELPER_1(hw_ret, void, i64)
|
DEF_HELPER_1(hw_ret, void, i64)
|
||||||
DEF_HELPER_2(mfpr, i64, int, i64)
|
DEF_HELPER_2(mfpr, i64, int, i64)
|
||||||
DEF_HELPER_2(mtpr, void, int, i64)
|
DEF_HELPER_2(mtpr, void, int, i64)
|
||||||
|
|
|
@ -1156,22 +1156,12 @@ uint64_t helper_cvtqg (uint64_t a)
|
||||||
|
|
||||||
/* PALcode support special instructions */
|
/* PALcode support special instructions */
|
||||||
#if !defined (CONFIG_USER_ONLY)
|
#if !defined (CONFIG_USER_ONLY)
|
||||||
void helper_hw_rei (void)
|
|
||||||
{
|
|
||||||
env->pc = env->ipr[IPR_EXC_ADDR] & ~3;
|
|
||||||
env->ipr[IPR_EXC_ADDR] = env->ipr[IPR_EXC_ADDR] & 1;
|
|
||||||
env->intr_flag = 0;
|
|
||||||
env->lock_addr = -1;
|
|
||||||
/* XXX: re-enable interrupts and memory mapping */
|
|
||||||
}
|
|
||||||
|
|
||||||
void helper_hw_ret (uint64_t a)
|
void helper_hw_ret (uint64_t a)
|
||||||
{
|
{
|
||||||
env->pc = a & ~3;
|
env->pc = a & ~3;
|
||||||
env->ipr[IPR_EXC_ADDR] = a & 1;
|
env->ipr[IPR_EXC_ADDR] = a & 1;
|
||||||
env->intr_flag = 0;
|
env->intr_flag = 0;
|
||||||
env->lock_addr = -1;
|
env->lock_addr = -1;
|
||||||
/* XXX: re-enable interrupts and memory mapping */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t helper_mfpr (int iprn, uint64_t val)
|
uint64_t helper_mfpr (int iprn, uint64_t val)
|
||||||
|
|
|
@ -2876,25 +2876,22 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case 0x1E:
|
case 0x1E:
|
||||||
/* HW_REI (PALcode) */
|
/* HW_RET (PALcode) */
|
||||||
#if defined (CONFIG_USER_ONLY)
|
#if defined (CONFIG_USER_ONLY)
|
||||||
goto invalid_opc;
|
goto invalid_opc;
|
||||||
#else
|
#else
|
||||||
if (!ctx->pal_mode)
|
if (!ctx->pal_mode)
|
||||||
goto invalid_opc;
|
goto invalid_opc;
|
||||||
if (rb == 31) {
|
if (rb == 31) {
|
||||||
/* "Old" alpha */
|
/* Pre-EV6 CPUs interpreted this as HW_REI, loading the return
|
||||||
gen_helper_hw_rei();
|
address from EXC_ADDR. This turns out to be useful for our
|
||||||
} else {
|
emulation PALcode, so continue to accept it. */
|
||||||
TCGv tmp;
|
TCGv tmp = tcg_temp_new();
|
||||||
|
tcg_gen_ld_i64(tmp, cpu_env, offsetof(CPUState, ipr[IPR_EXC_ADDR]));
|
||||||
if (ra != 31) {
|
|
||||||
tmp = tcg_temp_new();
|
|
||||||
tcg_gen_addi_i64(tmp, cpu_ir[rb], (((int64_t)insn << 51) >> 51));
|
|
||||||
} else
|
|
||||||
tmp = tcg_const_i64(((int64_t)insn << 51) >> 51);
|
|
||||||
gen_helper_hw_ret(tmp);
|
gen_helper_hw_ret(tmp);
|
||||||
tcg_temp_free(tmp);
|
tcg_temp_free(tmp);
|
||||||
|
} else {
|
||||||
|
gen_helper_hw_ret(cpu_ir[rb]);
|
||||||
}
|
}
|
||||||
ret = EXIT_PC_UPDATED;
|
ret = EXIT_PC_UPDATED;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue