target/arm: Use tcg_gen_extract2_i64 for EXT
The extract2 tcg op performs the same operation as the do_ext64 function. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20240912024114.1097832-6-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
ee36a772c0
commit
88f26451c9
@ -8890,23 +8890,6 @@ static void disas_data_proc_fp(DisasContext *s, uint32_t insn)
|
||||
}
|
||||
}
|
||||
|
||||
static void do_ext64(DisasContext *s, TCGv_i64 tcg_left, TCGv_i64 tcg_right,
|
||||
int pos)
|
||||
{
|
||||
/* Extract 64 bits from the middle of two concatenated 64 bit
|
||||
* vector register slices left:right. The extracted bits start
|
||||
* at 'pos' bits into the right (least significant) side.
|
||||
* We return the result in tcg_right, and guarantee not to
|
||||
* trash tcg_left.
|
||||
*/
|
||||
TCGv_i64 tcg_tmp = tcg_temp_new_i64();
|
||||
assert(pos > 0 && pos < 64);
|
||||
|
||||
tcg_gen_shri_i64(tcg_right, tcg_right, pos);
|
||||
tcg_gen_shli_i64(tcg_tmp, tcg_left, 64 - pos);
|
||||
tcg_gen_or_i64(tcg_right, tcg_right, tcg_tmp);
|
||||
}
|
||||
|
||||
/* EXT
|
||||
* 31 30 29 24 23 22 21 20 16 15 14 11 10 9 5 4 0
|
||||
* +---+---+-------------+-----+---+------+---+------+---+------+------+
|
||||
@ -8944,7 +8927,7 @@ static void disas_simd_ext(DisasContext *s, uint32_t insn)
|
||||
read_vec_element(s, tcg_resl, rn, 0, MO_64);
|
||||
if (pos != 0) {
|
||||
read_vec_element(s, tcg_resh, rm, 0, MO_64);
|
||||
do_ext64(s, tcg_resh, tcg_resl, pos);
|
||||
tcg_gen_extract2_i64(tcg_resl, tcg_resl, tcg_resh, pos);
|
||||
}
|
||||
} else {
|
||||
TCGv_i64 tcg_hh;
|
||||
@ -8965,10 +8948,10 @@ static void disas_simd_ext(DisasContext *s, uint32_t insn)
|
||||
read_vec_element(s, tcg_resh, elt->reg, elt->elt, MO_64);
|
||||
elt++;
|
||||
if (pos != 0) {
|
||||
do_ext64(s, tcg_resh, tcg_resl, pos);
|
||||
tcg_gen_extract2_i64(tcg_resl, tcg_resl, tcg_resh, pos);
|
||||
tcg_hh = tcg_temp_new_i64();
|
||||
read_vec_element(s, tcg_hh, elt->reg, elt->elt, MO_64);
|
||||
do_ext64(s, tcg_hh, tcg_resh, pos);
|
||||
tcg_gen_extract2_i64(tcg_resh, tcg_resh, tcg_hh, pos);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user