]> git.ipfire.org Git - thirdparty/gcc.git/commit
RISC-V: Support MASK_LEN_{LOAD_LANES,STORE_LANES}
authorJuzhe-Zhong <juzhe.zhong@rivai.ai>
Wed, 16 Aug 2023 01:45:19 +0000 (09:45 +0800)
committerPan Li <pan2.li@intel.com>
Wed, 16 Aug 2023 06:07:42 +0000 (14:07 +0800)
commitfe5788862ba8d5ac4551658d842f2d038bd8d363
tree92fffc361a5bb135abe0ac8641b1de78112b75e1
parentd5acdd62f090a472026c36fee3dfeb45f2de8429
RISC-V: Support MASK_LEN_{LOAD_LANES,STORE_LANES}

This patch allow us auto-vectorize this following case:

  void __attribute__ ((noinline, noclone))                                     \
  NAME##_8 (OUTTYPE *__restrict dest, INTYPE *__restrict src,                  \
    MASKTYPE *__restrict cond, intptr_t n)                             \
  {                                                                            \
    for (intptr_t i = 0; i < n; ++i)                                           \
      if (cond[i])                                                             \
dest[i] = (src[i * 8] + src[i * 8 + 1] + src[i * 8 + 2]                \
   + src[i * 8 + 3] + src[i * 8 + 4] + src[i * 8 + 5]          \
   + src[i * 8 + 6] + src[i * 8 + 7]);                         \
  }

  TEST_LOOP (NAME##_f32, OUTTYPE, INTYPE, int32_t)                               \

  TEST2 (NAME##_i32, OUTTYPE, int32_t)                                         \

  TEST1 (NAME##_i32, int32_t)                                                  \

TEST (test)

ASM:

test_i32_i32_f32_8:
ble a3,zero,.L5
.L3:
vsetvli a4,a3,e8,mf4,ta,ma
vle32.v v0,0(a2)
vsetvli a5,zero,e32,m1,ta,ma
vmsne.vi v0,v0,0
vsetvli zero,a4,e32,m1,ta,ma
vlseg8e32.v v8,(a1),v0.t
vsetvli a5,zero,e32,m1,ta,ma
slli a6,a4,2
vadd.vv v1,v9,v8
slli a7,a4,5
vadd.vv v1,v1,v10
sub a3,a3,a4
vadd.vv v1,v1,v11
vadd.vv v1,v1,v12
vadd.vv v1,v1,v13
vadd.vv v1,v1,v14
vadd.vv v1,v1,v15
vsetvli zero,a4,e32,m1,ta,ma
vse32.v v1,0(a0),v0.t
add a2,a2,a6
add a1,a1,a7
add a0,a0,a6
bne a3,zero,.L3
.L5:
ret

gcc/ChangeLog:

* config/riscv/autovec.md (vec_mask_len_load_lanes<mode><vsingle>):
New pattern.
(vec_mask_len_store_lanes<mode><vsingle>): Ditto.
* config/riscv/riscv-protos.h (expand_lanes_load_store): New function.
* config/riscv/riscv-v.cc (get_mask_mode): Add tuple mask mode.
(expand_lanes_load_store): New function.
* config/riscv/vector-iterators.md: New iterator.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/rvv/autovec/gather-scatter/strided_load-2.c:
Adapt test.
* gcc.target/riscv/rvv/autovec/partial/slp-1.c: Ditto.
* gcc.target/riscv/rvv/autovec/partial/slp-16.c: Ditto.
* gcc.target/riscv/rvv/autovec/partial/slp-17.c: Ditto.
* gcc.target/riscv/rvv/autovec/partial/slp-18.c: Ditto.
* gcc.target/riscv/rvv/autovec/partial/slp-19.c: Ditto.
* gcc.target/riscv/rvv/autovec/partial/slp-2.c: Ditto.
* gcc.target/riscv/rvv/autovec/partial/slp-3.c: Ditto.
* gcc.target/riscv/rvv/autovec/partial/slp-4.c: Ditto.
* gcc.target/riscv/rvv/autovec/partial/slp-5.c: Ditto.
* gcc.target/riscv/rvv/autovec/partial/slp-6.c: Ditto.
* gcc.target/riscv/rvv/rvv.exp: Add lanes tests.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_load-1.c: New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_load-2.c: New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_load-3.c: New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_load-4.c: New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_load-5.c: New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_load-6.c: New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_load-7.c: New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_run-1.c:
New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_run-2.c:
New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_run-3.c:
New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_run-4.c:
New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_run-5.c:
New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_run-6.c:
New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_load_run-7.c:
New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_store-1.c: New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_store-2.c: New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_store-3.c: New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_store-4.c: New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_store-5.c: New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_store-6.c: New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_store-7.c: New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_run-1.c:
New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_run-2.c:
New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_run-3.c:
New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_run-4.c:
New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_run-5.c:
New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_run-6.c:
New test.
* gcc.target/riscv/rvv/autovec/struct/mask_struct_store_run-7.c:
New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-1.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-10.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-11.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-12.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-13.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-14.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-15.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-16.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-17.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-18.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-2.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-3.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-4.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-5.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-6.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-7.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-8.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect-9.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-1.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-10.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-11.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-12.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-13.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-14.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-15.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-16.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-17.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-18.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-2.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-3.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-4.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-5.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-6.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-7.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-8.c: New test.
* gcc.target/riscv/rvv/autovec/struct/struct_vect_run-9.c: New test.
80 files changed:
gcc/config/riscv/autovec.md
gcc/config/riscv/riscv-protos.h
gcc/config/riscv/riscv-v.cc
gcc/config/riscv/vector-iterators.md
gcc/testsuite/gcc.target/riscv/rvv/autovec/gather-scatter/strided_load-2.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/slp-1.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/slp-16.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/slp-17.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/slp-18.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/slp-19.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/slp-2.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/slp-3.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/slp-4.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/slp-5.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/partial/slp-6.c
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_load-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_load-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_load-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_load-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_load-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_load-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_load-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_load_run-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_load_run-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_load_run-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_load_run-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_load_run-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_load_run-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_load_run-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_store-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_store-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_store-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_store-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_store-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_store-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_store-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_store_run-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_store_run-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_store_run-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_store_run-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_store_run-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_store_run-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/mask_struct_store_run-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-10.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-11.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-12.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-13.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-14.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-15.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-17.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-18.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect-9.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-10.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-11.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-12.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-13.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-14.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-15.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-17.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-18.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/struct/struct_vect_run-9.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/rvv.exp