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,