target/arm: Tidy handle_vec_simd_shri

Now that we've converted all cases to gvec, there is quite a bit
of dead code at the end of the function. Remove it.

Sink the call to gen_gvec_fn2i to the end, loading a function
pointer within the switch statement.

Backports commit 3f08f0bce841e7857ec98ce7909629d0c335005e from qemu
This commit is contained in:
Richard Henderson 2020-05-15 20:47:45 -04:00 committed by Lioncash
parent 7a1750d691
commit e08c2b8ece

View file

@ -10442,16 +10442,7 @@ static void handle_vec_simd_shri(DisasContext *s, bool is_q, bool is_u,
int size = 32 - clz32(immh) - 1;
int immhb = immh << 3 | immb;
int shift = 2 * (8 << size) - immhb;
bool accumulate = false;
int dsize = is_q ? 128 : 64;
int esize = 8 << size;
int elements = dsize/esize;
MemOp memop = size | (is_u ? 0 : MO_SIGN);
TCGv_i64 tcg_rn = new_tmp_a64(s);
TCGv_i64 tcg_rd = new_tmp_a64(s);
TCGv_i64 tcg_round;
uint64_t round_const;
int i;
GVecGen2iFn *gvec_fn;
if (extract32(immh, 3, 1) && !is_q) {
unallocated_encoding(s);
@ -10465,13 +10456,12 @@ static void handle_vec_simd_shri(DisasContext *s, bool is_q, bool is_u,
switch (opcode) {
case 0x02: /* SSRA / USRA (accumulate) */
gen_gvec_fn2i(s, is_q, rd, rn, shift,
is_u ? gen_gvec_usra : gen_gvec_ssra, size);
return;
gvec_fn = is_u ? gen_gvec_usra : gen_gvec_ssra;
break;
case 0x08: /* SRI */
gen_gvec_fn2i(s, is_q, rd, rn, shift, gen_gvec_sri, size);
return;
gvec_fn = gen_gvec_sri;
break;
case 0x00: /* SSHR / USHR */
if (is_u) {
@ -10479,49 +10469,31 @@ static void handle_vec_simd_shri(DisasContext *s, bool is_q, bool is_u,
/* Shift count the same size as element size produces zero. */
tcg_gen_gvec_dup_imm(tcg_ctx, size, vec_full_reg_offset(s, rd),
is_q ? 16 : 8, vec_full_reg_size(s), 0);
} else {
gen_gvec_fn2i(s, is_q, rd, rn, shift, tcg_gen_gvec_shri, size);
return;
}
gvec_fn = tcg_gen_gvec_shri;
} else {
/* Shift count the same size as element size produces all sign. */
if (shift == 8 << size) {
shift -= 1;
}
gen_gvec_fn2i(s, is_q, rd, rn, shift, tcg_gen_gvec_sari, size);
gvec_fn = tcg_gen_gvec_sari;
}
return;
break;
case 0x04: /* SRSHR / URSHR (rounding) */
gen_gvec_fn2i(s, is_q, rd, rn, shift,
is_u ? gen_gvec_urshr : gen_gvec_srshr, size);
return;
gvec_fn = is_u ? gen_gvec_urshr : gen_gvec_srshr;
break;
case 0x06: /* SRSRA / URSRA (accum + rounding) */
gen_gvec_fn2i(s, is_q, rd, rn, shift,
is_u ? gen_gvec_ursra : gen_gvec_srsra, size);
return;
gvec_fn = is_u ? gen_gvec_ursra : gen_gvec_srsra;
break;
default:
g_assert_not_reached();
}
round_const = 1ULL << (shift - 1);
tcg_round = tcg_const_i64(tcg_ctx, round_const);
for (i = 0; i < elements; i++) {
read_vec_element(s, tcg_rn, rn, i, memop);
if (accumulate) {
read_vec_element(s, tcg_rd, rd, i, memop);
}
handle_shri_with_rndacc(s, tcg_rd, tcg_rn, tcg_round,
accumulate, is_u, size, shift);
write_vec_element(s, tcg_rd, rd, i, size);
}
tcg_temp_free_i64(tcg_ctx, tcg_round);
clear_vec_high(s, is_q, rd);
gen_gvec_fn2i(s, is_q, rd, rn, shift, gvec_fn, size);
}
/* SHL/SLI - Vector shift left */