This patch continues the work of making ACLE intrinsics use VNx16BI for svbool_t results. It deals with the svpnext* intrinsics.
gcc/ * config/aarch64/iterators.md (PNEXT_ONLY): New int iterator. * config/aarch64/aarch64-sve.md (@aarch64_sve_<sve_pred_op><mode>): Restrict SVE_PITER pattern to VNx16BI_ONLY. (@aarch64_sve_<sve_pred_op><mode>): New PNEXT_ONLY pattern for PRED_HSD. (*aarch64_sve_<sve_pred_op><mode>): Likewise. (*aarch64_sve_<sve_pred_op><mode>_cc): Likewise. gcc/testsuite/ * gcc.target/aarch64/sve/acle/general/pnext_3.c: New test. --- gcc/config/aarch64/aarch64-sve.md | 77 ++++++++++- gcc/config/aarch64/iterators.md | 2 + .../aarch64/sve/acle/general/pnext_3.c | 130 ++++++++++++++++++ 3 files changed, 204 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/acle/general/pnext_3.c diff --git a/gcc/config/aarch64/aarch64-sve.md b/gcc/config/aarch64/aarch64-sve.md index b881ba851b6..8011227e2d9 100644 --- a/gcc/config/aarch64/aarch64-sve.md +++ b/gcc/config/aarch64/aarch64-sve.md @@ -11171,14 +11171,49 @@ (define_insn "*aarch64_brk<brk_op>_ptest" ;; ------------------------------------------------------------------------- (define_insn "@aarch64_sve_<sve_pred_op><mode>" - [(set (match_operand:PRED_ALL 0 "register_operand" "=Upa") - (unspec:PRED_ALL - [(match_operand:PRED_ALL 1 "register_operand" "Upa") + [(set (match_operand:VNx16BI_ONLY 0 "register_operand" "=Upa") + (unspec:VNx16BI_ONLY + [(match_operand:VNx16BI_ONLY 1 "register_operand" "Upa") (match_operand:SI 2 "aarch64_sve_ptrue_flag") - (match_operand:PRED_ALL 3 "register_operand" "0")] + (match_operand:VNx16BI_ONLY 3 "register_operand" "0")] SVE_PITER)) (clobber (reg:CC_NZC CC_REGNUM))] - "TARGET_SVE && <max_elem_bits> >= <elem_bits>" + "TARGET_SVE" + "<sve_pred_op>\t%0.<Vetype>, %1, %0.<Vetype>" +) + +(define_expand "@aarch64_sve_<sve_pred_op><mode>" + [(parallel + [(set (match_operand:VNx16BI 0 "register_operand" "=Upa") + (and:VNx16BI + (subreg:VNx16BI + (unspec:PRED_HSD + [(match_operand:PRED_HSD 1 "register_operand" "Upa") + (match_operand:SI 2 "aarch64_sve_ptrue_flag") + (match_operand:PRED_HSD 3 "register_operand" "0")] + PNEXT_ONLY) + 0) + (match_dup 4))) + (clobber (reg:CC_NZC CC_REGNUM))])] + "TARGET_SVE" + { + operands[4] = aarch64_ptrue_all (<data_bytes>); + } +) + +(define_insn "*aarch64_sve_<sve_pred_op><mode>" + [(set (match_operand:VNx16BI 0 "register_operand" "=Upa") + (and:VNx16BI + (subreg:VNx16BI + (unspec:PRED_HSD + [(match_operand:PRED_HSD 1 "register_operand" "Upa") + (match_operand:SI 2 "aarch64_sve_ptrue_flag") + (match_operand:PRED_HSD 3 "register_operand" "0")] + PNEXT_ONLY) + 0) + (match_operand:PRED_HSD 4 "aarch64_ptrue_all_operand"))) + (clobber (reg:CC_NZC CC_REGNUM))] + "TARGET_SVE" "<sve_pred_op>\t%0.<Vetype>, %1, %0.<Vetype>" ) @@ -11212,6 +11247,38 @@ (define_insn_and_rewrite "*aarch64_sve_<sve_pred_op><mode>_cc" } ) +(define_insn_and_rewrite "*aarch64_sve_<sve_pred_op><mode>_cc" + [(set (reg:CC_NZC CC_REGNUM) + (unspec:CC_NZC + [(match_operand:VNx16BI 1 "register_operand" "Upa") + (match_operand 2) + (match_operand:SI 3 "aarch64_sve_ptrue_flag") + (unspec:PRED_HSD + [(match_operand 4) + (match_operand:SI 5 "aarch64_sve_ptrue_flag") + (match_operand:PRED_HSD 6 "register_operand" "0")] + PNEXT_ONLY)] + UNSPEC_PTEST)) + (set (match_operand:VNx16BI 0 "register_operand" "=Upa") + (and:VNx16BI + (subreg:VNx16BI + (unspec:PRED_HSD + [(match_dup 4) + (match_dup 5) + (match_dup 6)] + PNEXT_ONLY) + 0) + (match_operand:PRED_HSD 7 "aarch64_ptrue_all_operand")))] + "TARGET_SVE + && aarch64_sve_same_pred_for_ptest_p (&operands[2], &operands[4])" + "<sve_pred_op>\t%0.<Vetype>, %1, %0.<Vetype>" + "&& !rtx_equal_p (operands[2], operands[4])" + { + operands[4] = operands[2]; + operands[5] = operands[3]; + } +) + ;; Same, but with only the flags result being interesting. (define_insn_and_rewrite "*aarch64_sve_<sve_pred_op><mode>_ptest" [(set (reg:CC_NZC CC_REGNUM) diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md index e619af14928..8f8237edf6c 100644 --- a/gcc/config/aarch64/iterators.md +++ b/gcc/config/aarch64/iterators.md @@ -3880,6 +3880,8 @@ (define_int_iterator SVE_BRK_BINARY [UNSPEC_BRKN UNSPEC_BRKPA UNSPEC_BRKPB]) (define_int_iterator SVE_PITER [UNSPEC_PFIRST UNSPEC_PNEXT]) +(define_int_iterator PNEXT_ONLY [UNSPEC_PNEXT]) + (define_int_iterator MATMUL [UNSPEC_SMATMUL UNSPEC_UMATMUL UNSPEC_USMATMUL]) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/pnext_3.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/pnext_3.c new file mode 100644 index 00000000000..d9c009062d7 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/pnext_3.c @@ -0,0 +1,130 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-final { check-function-bodies "**" "" } } */ + +#include <arm_sve.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** test1: +** pnext p0\.h, p1, p0\.h +** ret +*/ +svbool_t +test1 (svbool_t pg, svbool_t prev) +{ + return svand_z (svptrue_b8 (), + svpnext_b16 (prev, pg), + svptrue_b16 ()); +} + +/* +** test2: +** pnext p0\.h, p1, p0\.h +** ret +*/ +svbool_t +test2 (svbool_t pg, svbool_t prev) +{ + return svand_z (svptrue_b16 (), + svpnext_b16 (prev, pg), + svptrue_b8 ()); +} + +/* +** test3: +** pnext p0\.h, p1, p0\.h +** ret +*/ +svbool_t +test3 (svbool_t pg, svbool_t prev) +{ + return svand_z (svptrue_b16 (), + svpnext_b16 (prev, pg), + svptrue_b16 ()); +} + +/* +** test4: +** pnext p0\.s, p1, p0\.s +** ret +*/ +svbool_t +test4 (svbool_t pg, svbool_t prev) +{ + return svand_z (svptrue_b32 (), + svpnext_b32 (prev, pg), + svptrue_b8 ()); +} + +/* +** test5: +** pnext p0\.s, p1, p0\.s +** ret +*/ +svbool_t +test5 (svbool_t pg, svbool_t prev) +{ + return svand_z (svptrue_b16 (), + svpnext_b32 (prev, pg), + svptrue_b8 ()); +} + +/* +** test6: +** pnext p0\.s, p1, p0\.s +** ret +*/ +svbool_t +test6 (svbool_t pg, svbool_t prev) +{ + return svand_z (svptrue_b8 (), + svpnext_b32 (prev, pg), + svptrue_b32 ()); +} + +/* +** test7: +** pnext p0\.d, p1, p0\.d +** ret +*/ +svbool_t +test7 (svbool_t pg, svbool_t prev) +{ + return svand_z (svptrue_b16 (), + svpnext_b64 (prev, pg), + svptrue_b8 ()); +} + +/* +** test8: +** pnext p0\.d, p1, p0\.d +** ret +*/ +svbool_t +test8 (svbool_t pg, svbool_t prev) +{ + return svand_z (svptrue_b32 (), + svpnext_b64 (prev, pg), + svptrue_b8 ()); +} + +/* +** test9: +** pnext p0\.d, p1, p0\.d +** ret +*/ +svbool_t +test9 (svbool_t pg, svbool_t prev) +{ + return svand_z (svptrue_b8 (), + svpnext_b64 (prev, pg), + svptrue_b64 ()); +} + +#ifdef __cplusplus +} +#endif -- 2.43.0