@samitouri / QOSamiQemu / commits / d25cfd2216

target/arm: Implement SVE integer unary operations (predicated, zeroing)

This includes ABS, NEG, SXT{B,H,W}. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20260604234852.573178-6-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Jun 4, 2026 at 16:48 UTC d25cfd22169290278787c49600359b3e413e8e55
2 files changed +24
target/arm/tcg/sve.decode
+9
@@ -411,6 +411,15 @@ UXTH_m 00000100 .. 010 011 101 ... ..... ..... @rd_pg_rn
411 SXTW_m 00000100 .. 010 100 101 ... ..... ..... @rd_pg_rn
412 UXTW_m 00000100 .. 010 101 101 ... ..... ..... @rd_pg_rn
413
414 +ABS_z 00000100 .. 000 110 101 ... ..... ..... @rd_pg_rn
415 +NEG_z 00000100 .. 000 111 101 ... ..... ..... @rd_pg_rn
416 +SXTB_z 00000100 .. 000 000 101 ... ..... ..... @rd_pg_rn
417 +UXTB_z 00000100 .. 000 001 101 ... ..... ..... @rd_pg_rn
418 +SXTH_z 00000100 .. 000 010 101 ... ..... ..... @rd_pg_rn
419 +UXTH_z 00000100 .. 000 011 101 ... ..... ..... @rd_pg_rn
420 +SXTW_z 00000100 .. 000 100 101 ... ..... ..... @rd_pg_rn
421 +UXTW_z 00000100 .. 000 101 101 ... ..... ..... @rd_pg_rn
422 +
423 ### SVE Floating Point Compare - Vectors Group
424
425 # SVE floating-point compare vectors
target/arm/tcg/translate-sve.c
+15
@@ -811,12 +811,14 @@ static gen_helper_gvec_3 * const sve_abs_fns[4] = {
811 gen_helper_sve_abs_s, gen_helper_sve_abs_d,
812 };
813 TRANS_FEAT(ABS_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz, sve_abs_fns[a->esz], a, 0)
814 +TRANS_FEAT(ABS_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz, sve_abs_fns[a->esz], a, 1)
815
816 static gen_helper_gvec_3 * const sve_neg_fns[4] = {
817 gen_helper_sve_neg_b, gen_helper_sve_neg_h,
818 gen_helper_sve_neg_s, gen_helper_sve_neg_d,
819 };
820 TRANS_FEAT(NEG_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz, sve_neg_fns[a->esz], a, 0)
821 +TRANS_FEAT(NEG_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz, sve_neg_fns[a->esz], a, 1)
822
823 static gen_helper_gvec_3 * const sve_rbit_fns[4] = {
824 gen_helper_sve_rbit_b, gen_helper_sve_rbit_h,
@@ -873,6 +875,8 @@ static gen_helper_gvec_3 * const sxtb_fns[4] = {
875 };
876 TRANS_FEAT(SXTB_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz,
877 sxtb_fns[a->esz], a, 0)
878 +TRANS_FEAT(SXTB_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz,
879 + sxtb_fns[a->esz], a, 1)
880
881 static gen_helper_gvec_3 * const uxtb_fns[4] = {
882 NULL, gen_helper_sve_uxtb_h,
@@ -880,23 +884,34 @@ static gen_helper_gvec_3 * const uxtb_fns[4] = {
884 };
885 TRANS_FEAT(UXTB_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz,
886 uxtb_fns[a->esz], a, 0)
887 +TRANS_FEAT(UXTB_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz,
888 + uxtb_fns[a->esz], a, 1)
889
890 static gen_helper_gvec_3 * const sxth_fns[4] = {
891 NULL, NULL, gen_helper_sve_sxth_s, gen_helper_sve_sxth_d
892 };
893 TRANS_FEAT(SXTH_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz,
894 sxth_fns[a->esz], a, 0)
895 +TRANS_FEAT(SXTH_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz,
896 + sxth_fns[a->esz], a, 1)
897
898 static gen_helper_gvec_3 * const uxth_fns[4] = {
899 NULL, NULL, gen_helper_sve_uxth_s, gen_helper_sve_uxth_d
900 };
901 TRANS_FEAT(UXTH_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz,
902 uxth_fns[a->esz], a, 0)
903 +TRANS_FEAT(UXTH_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz,
904 + uxth_fns[a->esz], a, 1)
905
906 TRANS_FEAT(SXTW_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz,
907 a->esz == 3 ? gen_helper_sve_sxtw_d : NULL, a, 0)
908 +TRANS_FEAT(SXTW_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz,
909 + a->esz == 3 ? gen_helper_sve_sxtw_d : NULL, a, 1)
910 +
911 TRANS_FEAT(UXTW_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz,
912 a->esz == 3 ? gen_helper_sve_uxtw_d : NULL, a, 0)
913 +TRANS_FEAT(UXTW_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz,
914 + a->esz == 3 ? gen_helper_sve_uxtw_d : NULL, a, 1)
915
916 static gen_helper_gvec_3 * const addqv_fns[4] = {
917 gen_helper_sve2p1_addqv_b, gen_helper_sve2p1_addqv_h,