target/arm: Use pointers in neon tbl helper
Rather than passing a regno to the helper, pass pointers to the vector register directly. This eliminates the need to pass in the environment pointer and reduces the number of places that directly access env->vfp.regs[]. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20180119045438.28582-5-richard.henderson@linaro.org Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
b13708bbbd
commit
e7c06c4e4c
@ -188,7 +188,7 @@ DEF_HELPER_FLAGS_2(rsqrte_f32, TCG_CALL_NO_RWG, f32, f32, ptr)
|
||||
DEF_HELPER_FLAGS_2(rsqrte_f64, TCG_CALL_NO_RWG, f64, f64, ptr)
|
||||
DEF_HELPER_2(recpe_u32, i32, i32, ptr)
|
||||
DEF_HELPER_FLAGS_2(rsqrte_u32, TCG_CALL_NO_RWG, i32, i32, ptr)
|
||||
DEF_HELPER_5(neon_tbl, i32, env, i32, i32, i32, i32)
|
||||
DEF_HELPER_FLAGS_4(neon_tbl, TCG_CALL_NO_RWG, i32, i32, i32, ptr, i32)
|
||||
|
||||
DEF_HELPER_3(shl_cc, i32, env, i32, i32)
|
||||
DEF_HELPER_3(shr_cc, i32, env, i32, i32)
|
||||
|
@ -54,20 +54,17 @@ static int exception_target_el(CPUARMState *env)
|
||||
return target_el;
|
||||
}
|
||||
|
||||
uint32_t HELPER(neon_tbl)(CPUARMState *env, uint32_t ireg, uint32_t def,
|
||||
uint32_t rn, uint32_t maxindex)
|
||||
uint32_t HELPER(neon_tbl)(uint32_t ireg, uint32_t def, void *vn,
|
||||
uint32_t maxindex)
|
||||
{
|
||||
uint32_t val;
|
||||
uint32_t tmp;
|
||||
int index;
|
||||
int shift;
|
||||
uint64_t *table;
|
||||
table = (uint64_t *)&env->vfp.regs[rn];
|
||||
uint32_t val, shift;
|
||||
uint64_t *table = vn;
|
||||
|
||||
val = 0;
|
||||
for (shift = 0; shift < 32; shift += 8) {
|
||||
index = (ireg >> shift) & 0xff;
|
||||
uint32_t index = (ireg >> shift) & 0xff;
|
||||
if (index < maxindex) {
|
||||
tmp = (table[index >> 3] >> ((index & 7) << 3)) & 0xff;
|
||||
uint32_t tmp = (table[index >> 3] >> ((index & 7) << 3)) & 0xff;
|
||||
val |= tmp << shift;
|
||||
} else {
|
||||
val |= def & (0xff << shift);
|
||||
|
@ -7544,9 +7544,9 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
||||
tcg_gen_movi_i32(tmp, 0);
|
||||
}
|
||||
tmp2 = neon_load_reg(rm, 0);
|
||||
tmp4 = tcg_const_i32(rn);
|
||||
ptr1 = vfp_reg_ptr(true, rn);
|
||||
tmp5 = tcg_const_i32(n);
|
||||
gen_helper_neon_tbl(tmp2, cpu_env, tmp2, tmp, tmp4, tmp5);
|
||||
gen_helper_neon_tbl(tmp2, tmp2, tmp, ptr1, tmp5);
|
||||
tcg_temp_free_i32(tmp);
|
||||
if (insn & (1 << 6)) {
|
||||
tmp = neon_load_reg(rd, 1);
|
||||
@ -7555,9 +7555,9 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
||||
tcg_gen_movi_i32(tmp, 0);
|
||||
}
|
||||
tmp3 = neon_load_reg(rm, 1);
|
||||
gen_helper_neon_tbl(tmp3, cpu_env, tmp3, tmp, tmp4, tmp5);
|
||||
gen_helper_neon_tbl(tmp3, tmp3, tmp, ptr1, tmp5);
|
||||
tcg_temp_free_i32(tmp5);
|
||||
tcg_temp_free_i32(tmp4);
|
||||
tcg_temp_free_ptr(ptr1);
|
||||
neon_store_reg(rd, 0, tmp2);
|
||||
neon_store_reg(rd, 1, tmp3);
|
||||
tcg_temp_free_i32(tmp);
|
||||
|
Loading…
Reference in New Issue
Block a user