target/arm: Fix 128-bit element ZIP, UZP, TRN
We missed the instructions UDEF when the vector size is too small.
We missed marking the instructions non-streaming with SME.
Cc: qemu-stable@nongnu.org
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20250704142112.1018902-4-richard.henderson@linaro.org
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
(cherry picked from commit e6ffd009c7)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
This commit is contained in:
parent
0e5f0d87f8
commit
c76ec8d575
1 changed files with 30 additions and 13 deletions
|
|
@ -2352,6 +2352,23 @@ TRANS_FEAT(PUNPKHI, aa64_sve, do_perm_pred2, a, 1, gen_helper_sve_punpk_p)
|
|||
*** SVE Permute - Interleaving Group
|
||||
*/
|
||||
|
||||
static bool do_interleave_q(DisasContext *s, gen_helper_gvec_3 *fn,
|
||||
arg_rrr_esz *a, int data)
|
||||
{
|
||||
if (sve_access_check(s)) {
|
||||
unsigned vsz = vec_full_reg_size(s);
|
||||
if (vsz < 32) {
|
||||
unallocated_encoding(s);
|
||||
} else {
|
||||
tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
|
||||
vec_full_reg_offset(s, a->rn),
|
||||
vec_full_reg_offset(s, a->rm),
|
||||
vsz, vsz, data, fn);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static gen_helper_gvec_3 * const zip_fns[4] = {
|
||||
gen_helper_sve_zip_b, gen_helper_sve_zip_h,
|
||||
gen_helper_sve_zip_s, gen_helper_sve_zip_d,
|
||||
|
|
@ -2361,11 +2378,11 @@ TRANS_FEAT(ZIP1_z, aa64_sve, gen_gvec_ool_arg_zzz,
|
|||
TRANS_FEAT(ZIP2_z, aa64_sve, gen_gvec_ool_arg_zzz,
|
||||
zip_fns[a->esz], a, vec_full_reg_size(s) / 2)
|
||||
|
||||
TRANS_FEAT(ZIP1_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
|
||||
gen_helper_sve2_zip_q, a, 0)
|
||||
TRANS_FEAT(ZIP2_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
|
||||
gen_helper_sve2_zip_q, a,
|
||||
QEMU_ALIGN_DOWN(vec_full_reg_size(s), 32) / 2)
|
||||
TRANS_FEAT_NONSTREAMING(ZIP1_q, aa64_sve_f64mm, do_interleave_q,
|
||||
gen_helper_sve2_zip_q, a, 0)
|
||||
TRANS_FEAT_NONSTREAMING(ZIP2_q, aa64_sve_f64mm, do_interleave_q,
|
||||
gen_helper_sve2_zip_q, a,
|
||||
QEMU_ALIGN_DOWN(vec_full_reg_size(s), 32) / 2)
|
||||
|
||||
static gen_helper_gvec_3 * const uzp_fns[4] = {
|
||||
gen_helper_sve_uzp_b, gen_helper_sve_uzp_h,
|
||||
|
|
@ -2377,10 +2394,10 @@ TRANS_FEAT(UZP1_z, aa64_sve, gen_gvec_ool_arg_zzz,
|
|||
TRANS_FEAT(UZP2_z, aa64_sve, gen_gvec_ool_arg_zzz,
|
||||
uzp_fns[a->esz], a, 1 << a->esz)
|
||||
|
||||
TRANS_FEAT(UZP1_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
|
||||
gen_helper_sve2_uzp_q, a, 0)
|
||||
TRANS_FEAT(UZP2_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
|
||||
gen_helper_sve2_uzp_q, a, 16)
|
||||
TRANS_FEAT_NONSTREAMING(UZP1_q, aa64_sve_f64mm, do_interleave_q,
|
||||
gen_helper_sve2_uzp_q, a, 0)
|
||||
TRANS_FEAT_NONSTREAMING(UZP2_q, aa64_sve_f64mm, do_interleave_q,
|
||||
gen_helper_sve2_uzp_q, a, 16)
|
||||
|
||||
static gen_helper_gvec_3 * const trn_fns[4] = {
|
||||
gen_helper_sve_trn_b, gen_helper_sve_trn_h,
|
||||
|
|
@ -2392,10 +2409,10 @@ TRANS_FEAT(TRN1_z, aa64_sve, gen_gvec_ool_arg_zzz,
|
|||
TRANS_FEAT(TRN2_z, aa64_sve, gen_gvec_ool_arg_zzz,
|
||||
trn_fns[a->esz], a, 1 << a->esz)
|
||||
|
||||
TRANS_FEAT(TRN1_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
|
||||
gen_helper_sve2_trn_q, a, 0)
|
||||
TRANS_FEAT(TRN2_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
|
||||
gen_helper_sve2_trn_q, a, 16)
|
||||
TRANS_FEAT_NONSTREAMING(TRN1_q, aa64_sve_f64mm, do_interleave_q,
|
||||
gen_helper_sve2_trn_q, a, 0)
|
||||
TRANS_FEAT_NONSTREAMING(TRN2_q, aa64_sve_f64mm, do_interleave_q,
|
||||
gen_helper_sve2_trn_q, a, 16)
|
||||
|
||||
/*
|
||||
*** SVE Permute Vector - Predicated Group
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue