https://gcc.gnu.org/g:36260f7a2be90ed27498a28c4d0490414db1491f
commit 36260f7a2be90ed27498a28c4d0490414db1491f Author: Robin Dapp <rd...@ventanamicro.com> Date: Wed May 15 17:41:07 2024 +0200 RISC-V: Add vector popcount, clz, ctz. This patch adds the zvbb vcpop, vclz and vctz to the autovec machinery as well as tests for them. gcc/ChangeLog: * config/riscv/autovec.md (ctz<mode>2): New expander. (clz<mode>2): Ditto. * config/riscv/generic-vector-ooo.md: Add bitmanip ops to insn reservation. * config/riscv/vector-crypto.md: Add VLS modes to insns. * config/riscv/vector.md: Add bitmanip ops to mode_idx and other attributes. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/unop/popcount-1.c: Adjust check for zvbb. * gcc.target/riscv/rvv/autovec/unop/popcount-run-1.c: Ditto. * gcc.target/riscv/rvv/autovec/unop/popcount-2.c: Ditto. * gcc.target/riscv/rvv/autovec/unop/popcount-3.c: New test. * gcc.target/riscv/rvv/autovec/unop/popcount-template.h: New test. * gcc.target/riscv/rvv/autovec/unop/clz-1.c: New test. * gcc.target/riscv/rvv/autovec/unop/clz-run.c: New test. * gcc.target/riscv/rvv/autovec/unop/clz-template.h: New test. * gcc.target/riscv/rvv/autovec/unop/ctz-1.c: New test. * gcc.target/riscv/rvv/autovec/unop/ctz-run.c: New test. * gcc.target/riscv/rvv/autovec/unop/ctz-template.h: New test. (cherry picked from commit 6fa4b0135439d64c0ea1816594d7dc830e836376) Diff: --- gcc/config/riscv/autovec.md | 30 ++++- gcc/config/riscv/generic-vector-ooo.md | 2 +- gcc/config/riscv/vector-crypto.md | 137 +++++++++++---------- gcc/config/riscv/vector.md | 14 +-- .../gcc.target/riscv/rvv/autovec/unop/clz-1.c | 8 ++ .../gcc.target/riscv/rvv/autovec/unop/clz-run.c | 36 ++++++ .../riscv/rvv/autovec/unop/clz-template.h | 21 ++++ .../gcc.target/riscv/rvv/autovec/unop/ctz-1.c | 8 ++ .../gcc.target/riscv/rvv/autovec/unop/ctz-run.c | 36 ++++++ .../riscv/rvv/autovec/unop/ctz-template.h | 21 ++++ .../gcc.target/riscv/rvv/autovec/unop/popcount-1.c | 4 +- .../gcc.target/riscv/rvv/autovec/unop/popcount-2.c | 4 +- .../gcc.target/riscv/rvv/autovec/unop/popcount-3.c | 8 ++ .../riscv/rvv/autovec/unop/popcount-run-1.c | 3 +- .../riscv/rvv/autovec/unop/popcount-template.h | 21 ++++ 15 files changed, 272 insertions(+), 81 deletions(-) diff --git a/gcc/config/riscv/autovec.md b/gcc/config/riscv/autovec.md index 87d4171bc89..15db26d52c6 100644 --- a/gcc/config/riscv/autovec.md +++ b/gcc/config/riscv/autovec.md @@ -1566,7 +1566,7 @@ }) ;; ------------------------------------------------------------------------------- -;; - [INT] POPCOUNT. +;; - [INT] POPCOUNT, CTZ and CLZ. ;; ------------------------------------------------------------------------------- (define_expand "popcount<mode>2" @@ -1574,10 +1574,36 @@ (match_operand:V_VLSI 1 "register_operand")] "TARGET_VECTOR" { - riscv_vector::expand_popcount (operands); + if (!TARGET_ZVBB) + riscv_vector::expand_popcount (operands); + else + { + riscv_vector::emit_vlmax_insn (code_for_pred_v (POPCOUNT, <MODE>mode), + riscv_vector::CPOP_OP, operands); + } DONE; }) +(define_expand "ctz<mode>2" + [(match_operand:V_VLSI 0 "register_operand") + (match_operand:V_VLSI 1 "register_operand")] + "TARGET_ZVBB" + { + riscv_vector::emit_vlmax_insn (code_for_pred_v (CTZ, <MODE>mode), + riscv_vector::CPOP_OP, operands); + DONE; +}) + +(define_expand "clz<mode>2" + [(match_operand:V_VLSI 0 "register_operand") + (match_operand:V_VLSI 1 "register_operand")] + "TARGET_ZVBB" + { + riscv_vector::emit_vlmax_insn (code_for_pred_v (CLZ, <MODE>mode), + riscv_vector::CPOP_OP, operands); + DONE; +}) + ;; ------------------------------------------------------------------------- ;; ---- [INT] Highpart multiplication diff --git a/gcc/config/riscv/generic-vector-ooo.md b/gcc/config/riscv/generic-vector-ooo.md index 96cb1a0be29..5e933c83841 100644 --- a/gcc/config/riscv/generic-vector-ooo.md +++ b/gcc/config/riscv/generic-vector-ooo.md @@ -74,7 +74,7 @@ ;; Vector crypto, assumed to be a generic operation for now. (define_insn_reservation "vec_crypto" 4 - (eq_attr "type" "crypto") + (eq_attr "type" "crypto,vclz,vctz,vcpop") "vxu_ooo_issue,vxu_ooo_alu") ;; Vector crypto, AES diff --git a/gcc/config/riscv/vector-crypto.md b/gcc/config/riscv/vector-crypto.md index 0ddc2f3f3c6..17432b15815 100755 --- a/gcc/config/riscv/vector-crypto.md +++ b/gcc/config/riscv/vector-crypto.md @@ -99,42 +99,43 @@ ;; vror.vv vror.vx vror.vi ;; vwsll.vv vwsll.vx vwsll.vi (define_insn "@pred_vandn<mode>" - [(set (match_operand:VI 0 "register_operand" "=vd, vr, vd, vr") - (if_then_else:VI + [(set (match_operand:V_VLSI 0 "register_operand" "=vd, vr, vd, vr") + (if_then_else:V_VLSI (unspec:<VM> - [(match_operand:<VM> 1 "vector_mask_operand" "vm,Wc1, vm,Wc1") - (match_operand 5 "vector_length_operand" "rK, rK, rK, rK") - (match_operand 6 "const_int_operand" " i, i, i, i") - (match_operand 7 "const_int_operand" " i, i, i, i") - (match_operand 8 "const_int_operand" " i, i, i, i") + [(match_operand:<VM> 1 "vector_mask_operand" "vm,Wc1, vm,Wc1") + (match_operand 5 "vector_length_operand" "rK, rK, rK, rK") + (match_operand 6 "const_int_operand" " i, i, i, i") + (match_operand 7 "const_int_operand" " i, i, i, i") + (match_operand 8 "const_int_operand" " i, i, i, i") (reg:SI VL_REGNUM) (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) - (and:VI - (not:VI (match_operand:VI 4 "register_operand" "vr, vr, vr, vr")) - (match_operand:VI 3 "register_operand" "vr, vr, vr, vr")) - (match_operand:VI 2 "vector_merge_operand" "vu, vu, 0, 0")))] + (and:V_VLSI + (not:V_VLSI + (match_operand:V_VLSI 4 "register_operand" "vr, vr, vr, vr")) + (match_operand:V_VLSI 3 "register_operand" "vr, vr, vr, vr")) + (match_operand:V_VLSI 2 "vector_merge_operand" "vu, vu, 0, 0")))] "TARGET_ZVBB || TARGET_ZVKB" "vandn.vv\t%0,%3,%4%p1" [(set_attr "type" "vandn") (set_attr "mode" "<MODE>")]) (define_insn "@pred_vandn<mode>_scalar" - [(set (match_operand:VI_QHS 0 "register_operand" "=vd, vr,vd, vr") - (if_then_else:VI_QHS + [(set (match_operand:V_VLSI_QHS 0 "register_operand" "=vd, vr,vd, vr") + (if_then_else:V_VLSI_QHS (unspec:<VM> - [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1,vm,Wc1") - (match_operand 5 "vector_length_operand" " rK, rK,rK, rK") - (match_operand 6 "const_int_operand" " i, i, i, i") - (match_operand 7 "const_int_operand" " i, i, i, i") - (match_operand 8 "const_int_operand" " i, i, i, i") + [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1,vm,Wc1") + (match_operand 5 "vector_length_operand" " rK, rK,rK, rK") + (match_operand 6 "const_int_operand" " i, i, i, i") + (match_operand 7 "const_int_operand" " i, i, i, i") + (match_operand 8 "const_int_operand" " i, i, i, i") (reg:SI VL_REGNUM) (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) - (and:VI_QHS - (not:VI_QHS - (vec_duplicate:VI_QHS - (match_operand:<VEL> 4 "register_operand" " r, r, r, r"))) - (match_operand:VI_QHS 3 "register_operand" "vr, vr,vr, vr")) - (match_operand:VI_QHS 2 "vector_merge_operand" "vu, vu, 0, 0")))] + (and:V_VLSI_QHS + (not:V_VLSI_QHS + (vec_duplicate:V_VLSI_QHS + (match_operand:<VEL> 4 "register_operand" " r, r, r, r"))) + (match_operand:V_VLSI_QHS 3 "register_operand" "vr, vr,vr, vr")) + (match_operand:V_VLSI_QHS 2 "vector_merge_operand" "vu, vu, 0, 0")))] "TARGET_ZVBB || TARGET_ZVKB" "vandn.vx\t%0,%3,%4%p1" [(set_attr "type" "vandn") @@ -143,8 +144,8 @@ ;; Handle GET_MODE_INNER (mode) = DImode. We need to split them since ;; we need to deal with SEW = 64 in RV32 system. (define_expand "@pred_vandn<mode>_scalar" - [(set (match_operand:VI_D 0 "register_operand") - (if_then_else:VI_D + [(set (match_operand:V_VLSI_D 0 "register_operand") + (if_then_else:V_VLSI_D (unspec:<VM> [(match_operand:<VM> 1 "vector_mask_operand") (match_operand 5 "vector_length_operand") @@ -153,12 +154,12 @@ (match_operand 8 "const_int_operand") (reg:SI VL_REGNUM) (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) - (and:VI_D - (not:VI_D - (vec_duplicate:VI_D + (and:V_VLSI_D + (not:V_VLSI_D + (vec_duplicate:V_VLSI_D (match_operand:<VEL> 4 "reg_or_int_operand"))) - (match_operand:VI_D 3 "register_operand")) - (match_operand:VI_D 2 "vector_merge_operand")))] + (match_operand:V_VLSI_D 3 "register_operand")) + (match_operand:V_VLSI_D 2 "vector_merge_operand")))] "TARGET_ZVBB || TARGET_ZVKB" { if (riscv_vector::sew64_scalar_helper ( @@ -177,30 +178,30 @@ }) (define_insn "*pred_vandn<mode>_scalar" - [(set (match_operand:VI_D 0 "register_operand" "=vd, vr,vd, vr") - (if_then_else:VI_D + [(set (match_operand:V_VLSI_D 0 "register_operand" "=vd, vr,vd, vr") + (if_then_else:V_VLSI_D (unspec:<VM> - [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1,vm,Wc1") - (match_operand 5 "vector_length_operand" " rK, rK,rK, rK") - (match_operand 6 "const_int_operand" " i, i, i, i") - (match_operand 7 "const_int_operand" " i, i, i, i") - (match_operand 8 "const_int_operand" " i, i, i, i") + [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1,vm,Wc1") + (match_operand 5 "vector_length_operand" " rK, rK,rK, rK") + (match_operand 6 "const_int_operand" " i, i, i, i") + (match_operand 7 "const_int_operand" " i, i, i, i") + (match_operand 8 "const_int_operand" " i, i, i, i") (reg:SI VL_REGNUM) (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) - (and:VI_D - (not:VI_D - (vec_duplicate:VI_D - (match_operand:<VEL> 4 "reg_or_0_operand" " rJ, rJ,rJ, rJ"))) - (match_operand:VI_D 3 "register_operand" " vr, vr,vr, vr")) - (match_operand:VI_D 2 "vector_merge_operand" " vu, vu, 0, 0")))] + (and:V_VLSI_D + (not:V_VLSI_D + (vec_duplicate:V_VLSI_D + (match_operand:<VEL> 4 "reg_or_0_operand" " rJ, rJ,rJ, rJ"))) + (match_operand:V_VLSI_D 3 "register_operand" " vr, vr,vr, vr")) + (match_operand:V_VLSI_D 2 "vector_merge_operand" " vu, vu, 0, 0")))] "TARGET_ZVBB || TARGET_ZVKB" "vandn.vx\t%0,%3,%z4%p1" [(set_attr "type" "vandn") (set_attr "mode" "<MODE>")]) (define_insn "*pred_vandn<mode>_extended_scalar" - [(set (match_operand:VI_D 0 "register_operand" "=vd, vr,vd, vr") - (if_then_else:VI_D + [(set (match_operand:V_VLSI_D 0 "register_operand" "=vd, vr,vd, vr") + (if_then_else:V_VLSI_D (unspec:<VM> [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1,vm,Wc1") (match_operand 5 "vector_length_operand" " rK, rK,rK, rK") @@ -209,13 +210,13 @@ (match_operand 8 "const_int_operand" " i, i, i, i") (reg:SI VL_REGNUM) (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) - (and:VI_D - (not:VI_D - (vec_duplicate:VI_D + (and:V_VLSI_D + (not:V_VLSI_D + (vec_duplicate:V_VLSI_D (sign_extend:<VEL> (match_operand:<VSUBEL> 4 "reg_or_0_operand" " rJ, rJ,rJ, rJ")))) - (match_operand:VI_D 3 "register_operand" " vr, vr,vr, vr")) - (match_operand:VI_D 2 "vector_merge_operand" " vu, vu, 0, 0")))] + (match_operand:V_VLSI_D 3 "register_operand" " vr, vr,vr, vr")) + (match_operand:V_VLSI_D 2 "vector_merge_operand" " vu, vu, 0, 0")))] "TARGET_ZVBB || TARGET_ZVKB" "vandn.vx\t%0,%3,%z4%p1" [(set_attr "type" "vandn") @@ -325,34 +326,34 @@ ;; vbrev.v vbrev8.v vrev8.v (define_insn "@pred_v<rev><mode>" - [(set (match_operand:VI 0 "register_operand" "=vd,vr,vd,vr") - (if_then_else:VI + [(set (match_operand:V_VLSI 0 "register_operand" "=vd,vr,vd,vr") + (if_then_else:V_VLSI (unspec:<VM> - [(match_operand:<VM> 1 "vector_mask_operand" "vm,Wc1,vm,Wc1") - (match_operand 4 "vector_length_operand" "rK,rK, rK, rK") - (match_operand 5 "const_int_operand" "i, i, i, i") - (match_operand 6 "const_int_operand" "i, i, i, i") - (match_operand 7 "const_int_operand" "i, i, i, i") + [(match_operand:<VM> 1 "vector_mask_operand" "vm,Wc1,vm,Wc1") + (match_operand 4 "vector_length_operand" "rK,rK, rK, rK") + (match_operand 5 "const_int_operand" "i, i, i, i") + (match_operand 6 "const_int_operand" "i, i, i, i") + (match_operand 7 "const_int_operand" "i, i, i, i") (reg:SI VL_REGNUM) (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) - (unspec:VI - [(match_operand:VI 3 "register_operand" "vr,vr, vr, vr")]UNSPEC_VRBB8) - (match_operand:VI 2 "vector_merge_operand" "vu,vu, 0, 0")))] + (unspec:V_VLSI + [(match_operand:V_VLSI 3 "register_operand" "vr,vr, vr, vr")]UNSPEC_VRBB8) + (match_operand:V_VLSI 2 "vector_merge_operand" "vu,vu, 0, 0")))] "TARGET_ZVBB || TARGET_ZVKB" "v<rev>.v\t%0,%3%p1" [(set_attr "type" "v<rev>") (set_attr "mode" "<MODE>")]) -;; vclz.v vctz.v +;; vclz.v vctz.v vcpop.v (define_insn "@pred_v<bitmanip_optab><mode>" - [(set (match_operand:VI 0 "register_operand" "=vd, vr") - (clz_ctz_pcnt:VI + [(set (match_operand:V_VLSI 0 "register_operand" "=vd, vr") + (clz_ctz_pcnt:V_VLSI (parallel - [(match_operand:VI 2 "register_operand" "vr, vr") + [(match_operand:V_VLSI 2 "register_operand" " vr, vr") (unspec:<VM> - [(match_operand:<VM> 1 "vector_mask_operand" "vm,Wc1") - (match_operand 3 "vector_length_operand" "rK, rK") - (match_operand 4 "const_int_operand" " i, i") + [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1") + (match_operand 3 "vector_length_operand" " rK, rK") + (match_operand 4 "const_int_operand" " i, i") (reg:SI VL_REGNUM) (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)])))] "TARGET_ZVBB" diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md index c15af17ec62..fbcdf96f038 100644 --- a/gcc/config/riscv/vector.md +++ b/gcc/config/riscv/vector.md @@ -52,7 +52,7 @@ vmalu,vmpop,vmffs,vmsfs,vmiota,vmidx,vimovvx,vimovxv,vfmovvf,vfmovfv,\ vslideup,vslidedown,vislide1up,vislide1down,vfslide1up,vfslide1down,\ vgather,vcompress,vlsegde,vssegte,vlsegds,vssegts,vlsegdux,vlsegdox,\ - vssegtux,vssegtox,vlsegdff,vandn,vbrev,vbrev8,vrev8,vclz,vctz,vrol,\ + vssegtux,vssegtox,vlsegdff,vandn,vbrev,vbrev8,vrev8,vcpop,vclz,vctz,vrol,\ vror,vwsll,vclmul,vclmulh,vghsh,vgmul,vaesef,vaesem,vaesdf,vaesdm,\ vaeskf1,vaeskf2,vaesz,vsha2ms,vsha2ch,vsha2cl,vsm4k,vsm4r,vsm3me,vsm3c") (const_string "true")] @@ -76,7 +76,7 @@ vmalu,vmpop,vmffs,vmsfs,vmiota,vmidx,vimovxv,vfmovfv,\ vslideup,vslidedown,vislide1up,vislide1down,vfslide1up,vfslide1down,\ vgather,vcompress,vlsegde,vssegte,vlsegds,vssegts,vlsegdux,vlsegdox,\ - vssegtux,vssegtox,vlsegdff,vandn,vbrev,vbrev8,vrev8,vclz,vctz,vrol,\ + vssegtux,vssegtox,vlsegdff,vandn,vbrev,vbrev8,vrev8,vcpop,vclz,vctz,vrol,\ vror,vwsll,vclmul,vclmulh,vghsh,vgmul,vaesef,vaesem,vaesdf,vaesdm,\ vaeskf1,vaeskf2,vaesz,vsha2ms,vsha2ch,vsha2cl,vsm4k,vsm4r,vsm3me,vsm3c") (const_string "true")] @@ -443,7 +443,7 @@ vimovxv,vfmovvf,vfmovfv,vslideup,vslidedown,\ vislide1up,vislide1down,vfslide1up,vfslide1down,\ vgather,vcompress,vlsegdux,vlsegdox,vssegtux,vssegtox,\ - vandn,vbrev,vbrev8,vrev8,vclz,vctz,vrol,vror,vwsll,\ + vandn,vbrev,vbrev8,vrev8,vcpop,vclz,vctz,vrol,vror,vwsll,\ vclmul,vclmulh,vghsh,vgmul,vaesef,vaesem,vaesdf,vaesdm,\ vaeskf1,vaeskf2,vaesz,vsha2ms,vsha2ch,vsha2cl,vsm4k,vsm4r,\ vsm3me,vsm3c") @@ -743,7 +743,7 @@ vfcmp,vfminmax,vfsgnj,vfclass,vfmerge,vfmov,\ vfcvtitof,vfncvtitof,vfncvtftoi,vfncvtftof,vmalu,vmiota,vmidx,\ vimovxv,vfmovfv,vslideup,vslidedown,vislide1up,vislide1down,vfslide1up,vfslide1down,\ - vgather,vcompress,vmov,vnclip,vnshift,vandn") + vgather,vcompress,vmov,vnclip,vnshift,vandn,vcpop,vclz,vctz") (const_int 0) (eq_attr "type" "vimovvx,vfmovvf") @@ -789,8 +789,8 @@ (eq_attr "type" "vicmp,vimuladd,vfcmp,vfmuladd") (const_int 6) - (eq_attr "type" "vmpop,vmffs,vmidx,vssegte,vclz,vctz,vgmul,vaesef,vaesem,vaesdf,vaesdm,\ - vaesz,vsm4r") + (eq_attr "type" "vmpop,vmffs,vmidx,vssegte,vcpop,vclz,vctz,vgmul,vaesef,vaesem,vaesdf,\ + vaesdm,vaesz,vsm4r") (const_int 3)] (const_int INVALID_ATTRIBUTE))) @@ -892,7 +892,7 @@ vsm4k,vsm3me,vsm3c") (const_int 6) - (eq_attr "type" "vmpop,vmffs,vssegte,vclz,vctz") + (eq_attr "type" "vmpop,vmffs,vssegte,vcpop,vclz,vctz") (const_int 4)] (const_int INVALID_ATTRIBUTE))) diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/clz-1.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/clz-1.c new file mode 100644 index 00000000000..c27d9d399b9 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/clz-1.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-add-options "riscv_v" } */ +/* { dg-add-options "riscv_zvbb" } */ +/* { dg-additional-options "-std=c99 -fno-vect-cost-model" } */ + +#include "clz-template.h" + +/* { dg-final { scan-assembler-times {\tvclz.v} 8 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/clz-run.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/clz-run.c new file mode 100644 index 00000000000..df6f893b8fb --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/clz-run.c @@ -0,0 +1,36 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 -fno-vect-cost-model -mrvv-vector-bits=zvl -ffast-math" } */ + +#include "clz-template.h" + +#include <assert.h> +#include <stdio.h> + +#define SZ 128 + +#define RUN(TYPE) \ + TYPE dst##TYPE[SZ]; \ + TYPE a##TYPE[SZ]; \ + for (int i = 0; i < SZ; i++) \ + { \ + dst##TYPE[i] = 0; \ + a##TYPE[i] = i; \ + } \ + vclz_##TYPE (dst##TYPE, a##TYPE, SZ); \ + for (int i = 0; i < SZ; i++) \ + assert (dst##TYPE[i] == __builtin_clz (a##TYPE[i])); + +#define RUN_ALL() \ + RUN (int8_t) \ + RUN (uint8_t) \ + RUN (int16_t) \ + RUN (uint16_t) \ + RUN (int32_t) \ + RUN (uint32_t) \ + RUN (int64_t) \ + RUN (uint64_t) + +int main () +{ + RUN_ALL() +} diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/clz-template.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/clz-template.h new file mode 100644 index 00000000000..1cde9fbc32c --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/clz-template.h @@ -0,0 +1,21 @@ +#include <stdint-gcc.h> + +#define TEST_TYPE(TYPE) \ + __attribute__ ((noipa)) void vclz_##TYPE (TYPE *restrict dst, \ + TYPE *restrict a, int n) \ + { \ + for (int i = 0; i < n; i++) \ + dst[i] = __builtin_clz (a[i]); \ + } + +#define TEST_ALL() \ + TEST_TYPE (int8_t) \ + TEST_TYPE (uint8_t) \ + TEST_TYPE (int16_t) \ + TEST_TYPE (uint16_t) \ + TEST_TYPE (int32_t) \ + TEST_TYPE (uint32_t) \ + TEST_TYPE (int64_t) \ + TEST_TYPE (uint64_t) + +TEST_ALL() diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/ctz-1.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/ctz-1.c new file mode 100644 index 00000000000..d5989bd5aad --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/ctz-1.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-add-options "riscv_v" } */ +/* { dg-add-options "riscv_zvbb" } */ +/* { dg-additional-options "-std=c99 -fno-vect-cost-model" } */ + +#include "ctz-template.h" + +/* { dg-final { scan-assembler-times {\tvctz.v} 8 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/ctz-run.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/ctz-run.c new file mode 100644 index 00000000000..9a74ba20a73 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/ctz-run.c @@ -0,0 +1,36 @@ +/* { dg-do run { target { riscv_v } } } */ +/* { dg-additional-options "-std=c99 -fno-vect-cost-model -mrvv-vector-bits=zvl -ffast-math" } */ + +#include "ctz-template.h" + +#include <assert.h> +#include <stdio.h> + +#define SZ 126 + +#define RUN(TYPE) \ + TYPE dst##TYPE[SZ]; \ + TYPE a##TYPE[SZ]; \ + for (int i = 0; i < SZ; i++) \ + { \ + dst##TYPE[i] = 0; \ + a##TYPE[i] = i + 1; \ + } \ + vctz_##TYPE (dst##TYPE, a##TYPE, SZ); \ + for (int i = 0; i < SZ; i++) \ + assert (dst##TYPE[i] == __builtin_ctz (a##TYPE[i]));\ + +#define RUN_ALL() \ + RUN (uint8_t) \ + RUN (int8_t) \ + RUN (int16_t) \ + RUN (uint16_t) \ + RUN (int32_t) \ + RUN (uint32_t) \ + //RUN (int64_t) \ + //RUN (uint64_t) + +int main () +{ + RUN_ALL() +} diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/ctz-template.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/ctz-template.h new file mode 100644 index 00000000000..c47fc19935d --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/ctz-template.h @@ -0,0 +1,21 @@ +#include <stdint-gcc.h> + +#define TEST_TYPE(TYPE) \ + __attribute__ ((noipa)) void vctz_##TYPE (TYPE *restrict dst, \ + TYPE *restrict a, int n) \ + { \ + for (int i = 0; i < n; i++) \ + dst[i] = __builtin_ctz (a[i]); \ + } + +#define TEST_ALL() \ + TEST_TYPE (int8_t) \ + TEST_TYPE (uint8_t) \ + TEST_TYPE (int16_t) \ + TEST_TYPE (uint16_t) \ + TEST_TYPE (int32_t) \ + TEST_TYPE (uint32_t) \ + TEST_TYPE (int64_t) \ + TEST_TYPE (uint64_t) + +TEST_ALL() diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-1.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-1.c index fad528a842e..1396e46ec8c 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-1.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-1.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ -/* { dg-additional-options "-march=rv64gcv -mabi=lp64d -mrvv-vector-bits=scalable -fno-vect-cost-model -fdump-tree-vect-details" } */ +/* { dg-add-options "riscv_v" } */ +/* { dg-additional-options "-mrvv-vector-bits=scalable -fno-vect-cost-model -fdump-tree-vect-details" } */ #include <stdint-gcc.h> @@ -18,3 +19,4 @@ popcount_64 (uint64_t *restrict dst, uint64_t *restrict src, int size) } /* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 2 "vect" } } */ +/* { dg-final { scan-assembler-times "vcpop.v" 2 { target { riscv_zvbb } } } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-2.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-2.c index 0199f8cb515..116cc304da3 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-2.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-2.c @@ -1,5 +1,6 @@ /* { dg-do compile } */ -/* { dg-additional-options "-march=rv64gcv -mabi=lp64d -mrvv-vector-bits=scalable -fno-vect-cost-model -fdump-tree-slp-details" } */ +/* { dg-add-options "riscv_v" } */ +/* { dg-additional-options "-mrvv-vector-bits=scalable -fno-vect-cost-model -fdump-tree-slp-details" } */ int x[8]; int y[8]; @@ -17,3 +18,4 @@ void foo () } /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "slp2" } } */ +/* { dg-final { scan-assembler "vcpop.v" { target { riscv_zvbb } } } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-3.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-3.c new file mode 100644 index 00000000000..00b87a07fd8 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-3.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-add-options "riscv_v" } */ +/* { dg-add-options "riscv_zvbb" } */ +/* { dg-additional-options "-std=c99 -fno-vect-cost-model" } */ + +#include "popcount-template.h" + +/* { dg-final { scan-assembler-times {\tvcpop.v} 8 } } */ diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-run-1.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-run-1.c index 38f1633da99..8ddb1783dd0 100644 --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-run-1.c +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-run-1.c @@ -1,4 +1,5 @@ -/* { dg-do run { target { riscv_v } } } */ +/* { dg-do run { target { riscv_v_ok } } } */ +/* { dg-add-options "riscv_v" } */ #include "popcount-1.c" diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-template.h b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-template.h new file mode 100644 index 00000000000..28399565bb3 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/popcount-template.h @@ -0,0 +1,21 @@ +#include <stdint-gcc.h> + +#define TEST_TYPE(TYPE) \ + __attribute__ ((noipa)) void vpopcount_##TYPE (TYPE *restrict dst, \ + TYPE *restrict a, int n) \ + { \ + for (int i = 0; i < n; i++) \ + dst[i] = __builtin_popcount (a[i]); \ + } + +#define TEST_ALL() \ + TEST_TYPE (int8_t) \ + TEST_TYPE (uint8_t) \ + TEST_TYPE (int16_t) \ + TEST_TYPE (uint16_t) \ + TEST_TYPE (int32_t) \ + TEST_TYPE (uint32_t) \ + TEST_TYPE (int64_t) \ + TEST_TYPE (uint64_t) + +TEST_ALL()