mirror of https://github.com/xemu-project/xemu.git
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
|
/* EXT
|
||||||
* 31 30 29 24 23 22 21 20 16 15 14 11 10 9 5 4 0
|
* 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);
|
read_vec_element(s, tcg_resl, rn, 0, MO_64);
|
||||||
if (pos != 0) {
|
if (pos != 0) {
|
||||||
read_vec_element(s, tcg_resh, rm, 0, MO_64);
|
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 {
|
} else {
|
||||||
TCGv_i64 tcg_hh;
|
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);
|
read_vec_element(s, tcg_resh, elt->reg, elt->elt, MO_64);
|
||||||
elt++;
|
elt++;
|
||||||
if (pos != 0) {
|
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();
|
tcg_hh = tcg_temp_new_i64();
|
||||||
read_vec_element(s, tcg_hh, elt->reg, elt->elt, MO_64);
|
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