@samitouri / QOSamiQemu / commits / d0ea7d0259

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

This includes CLS, CLZ, CNT, CNOT, NOT, FABS, FNEG. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20260604234852.573178-7-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Jun 4, 2026 at 16:48 UTC d0ea7d02591b2f199eda006cbf88fd17a18566ea
2 files changed +26 -3
target/arm/tcg/sve.decode
+8
@@ -400,6 +400,14 @@ NOT_zpz_m 00000100 .. 011 110 101 ... ..... ..... @rd_pg_rn
400 FABS_m 00000100 .. 011 100 101 ... ..... ..... @rd_pg_rn
401 FNEG_m 00000100 .. 011 101 101 ... ..... ..... @rd_pg_rn
402
403 +CLS_z 00000100 .. 001 000 101 ... ..... ..... @rd_pg_rn
404 +CLZ_z 00000100 .. 001 001 101 ... ..... ..... @rd_pg_rn
405 +CNT_zpz_z 00000100 .. 001 010 101 ... ..... ..... @rd_pg_rn
406 +CNOT_z 00000100 .. 001 011 101 ... ..... ..... @rd_pg_rn
407 +NOT_zpz_z 00000100 .. 001 110 101 ... ..... ..... @rd_pg_rn
408 +FABS_z 00000100 .. 001 100 101 ... ..... ..... @rd_pg_rn
409 +FNEG_z 00000100 .. 001 101 101 ... ..... ..... @rd_pg_rn
410 +
411 # SVE integer unary operations (predicated)
412 # Note esz > original size for extensions.
413 ABS_m 00000100 .. 010 110 101 ... ..... ..... @rd_pg_rn
target/arm/tcg/translate-sve.c
+18 -3
@@ -781,30 +781,41 @@ static gen_helper_gvec_3 * const sve_cls_fns[4] = {
781 gen_helper_sve_cls_s, gen_helper_sve_cls_d,
782 };
783 TRANS_FEAT(CLS_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz, sve_cls_fns[a->esz], a, 0)
784 +TRANS_FEAT(CLS_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz, sve_cls_fns[a->esz], a, 1)
785
786 static gen_helper_gvec_3 * const sve_clz_fns[4] = {
787 gen_helper_sve_clz_b, gen_helper_sve_clz_h,
788 gen_helper_sve_clz_s, gen_helper_sve_clz_d,
789 };
790 TRANS_FEAT(CLZ_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz, sve_clz_fns[a->esz], a, 0)
791 +TRANS_FEAT(CLZ_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz, sve_clz_fns[a->esz], a, 1)
792
793 static gen_helper_gvec_3 * const sve_cnt_zpz_fns[4] = {
794 gen_helper_sve_cnt_zpz_b, gen_helper_sve_cnt_zpz_h,
795 gen_helper_sve_cnt_zpz_s, gen_helper_sve_cnt_zpz_d,
796 };
795 -TRANS_FEAT(CNT_zpz_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz, sve_cnt_zpz_fns[a->esz], a, 0)
797 +TRANS_FEAT(CNT_zpz_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz,
798 + sve_cnt_zpz_fns[a->esz], a, 0)
799 +TRANS_FEAT(CNT_zpz_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz,
800 + sve_cnt_zpz_fns[a->esz], a, 1)
801
802 static gen_helper_gvec_3 * const sve_cnot_fns[4] = {
803 gen_helper_sve_cnot_b, gen_helper_sve_cnot_h,
804 gen_helper_sve_cnot_s, gen_helper_sve_cnot_d,
805 };
801 -TRANS_FEAT(CNOT_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz, sve_cnot_fns[a->esz], a, 0)
806 +TRANS_FEAT(CNOT_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz,
807 + sve_cnot_fns[a->esz], a, 0)
808 +TRANS_FEAT(CNOT_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz,
809 + sve_cnot_fns[a->esz], a, 1)
810
811 static gen_helper_gvec_3 * const sve_not_zpz_fns[4] = {
812 gen_helper_sve_not_zpz_b, gen_helper_sve_not_zpz_h,
813 gen_helper_sve_not_zpz_s, gen_helper_sve_not_zpz_d,
814 };
807 -TRANS_FEAT(NOT_zpz_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz, sve_not_zpz_fns[a->esz], a, 0)
815 +TRANS_FEAT(NOT_zpz_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz,
816 + sve_not_zpz_fns[a->esz], a, 0)
817 +TRANS_FEAT(NOT_zpz_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz,
818 + sve_not_zpz_fns[a->esz], a, 1)
819
820 static gen_helper_gvec_3 * const sve_abs_fns[4] = {
821 gen_helper_sve_abs_b, gen_helper_sve_abs_h,
@@ -857,6 +868,8 @@ static gen_helper_gvec_3 * const fabs_ah_fns[4] = {
868 };
869 TRANS_FEAT(FABS_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz,
870 s->fpcr_ah ? fabs_ah_fns[a->esz] : fabs_fns[a->esz], a, 0)
871 +TRANS_FEAT(FABS_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz,
872 + s->fpcr_ah ? fabs_ah_fns[a->esz] : fabs_fns[a->esz], a, 1)
873
874 static gen_helper_gvec_3 * const fneg_fns[4] = {
875 NULL, gen_helper_sve_fneg_h,
@@ -868,6 +881,8 @@ static gen_helper_gvec_3 * const fneg_ah_fns[4] = {
881 };
882 TRANS_FEAT(FNEG_m, aa64_sme_or_sve, gen_gvec_ool_arg_zpz,
883 s->fpcr_ah ? fneg_ah_fns[a->esz] : fneg_fns[a->esz], a, 0)
884 +TRANS_FEAT(FNEG_z, aa64_sme2p2_or_sve2p2, gen_gvec_ool_arg_zpz,
885 + s->fpcr_ah ? fneg_ah_fns[a->esz] : fneg_fns[a->esz], a, 1)
886
887 static gen_helper_gvec_3 * const sxtb_fns[4] = {
888 NULL, gen_helper_sve_sxtb_h,