mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-23 12:55:29 +00:00
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:
parent
7a1750d691
commit
e08c2b8ece
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue