target-alpha: Merge HW_REI and HW_RET implementations.

Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
Richard Henderson 2011-05-20 13:21:15 -07:00 committed by Richard Henderson
parent 8417845ee9
commit 508b43eaf3
3 changed files with 8 additions and 22 deletions

View file

@ -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)

View file

@ -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)

View file

@ -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;