1  /* { dg-do compile } */
       2  /* { dg-options "-march=rv32gcv -mabi=ilp32d -O3 -fno-schedule-insns -fno-schedule-insns2" } */
       3  /* { dg-final { check-function-bodies "**" "" } } */
       4  
       5  #include "riscv_vector.h"
       6  
       7  /*
       8  ** f1:
       9  **  ...
      10  **	vsetvli\t[a-x0-9]+,\s*[a-x0-9]+,e64,m1,tu,m[au]
      11  **  ...
      12  **	vsetvli\tzero,\s*[a-x0-9]+,e32,m1,tu,m[au]
      13  **  ...
      14  **	vslide1down\.vx\tv[0-9]+,\s*v[0-9]+,\s*[a-x0-9]+
      15  **  ...
      16  **	vslide1down\.vx\tv[0-9]+,\s*v[0-9]+,\s*[a-x0-9]+
      17  **  ...
      18  **	vslide1down\.vx\tv[0-9]+,\s*v[0-9]+,\s*[a-x0-9]+
      19  **  ...
      20  **	vslide1down\.vx\tv[0-9]+,\s*v[0-9]+,\s*[a-x0-9]+
      21  **  ...
      22  **	vslide1down\.vx\tv[0-9]+,\s*v[0-9]+,\s*[a-x0-9]+
      23  **  ...
      24  **	vslide1down\.vx\tv[0-9]+,\s*v[0-9]+,\s*[a-x0-9]+
      25  **  ...
      26  **	vmerge\.vvm\tv[0-9]+,\s*v[0-9]+,\s*v[0-9]+,\s*v[0-9]+
      27  **  ...
      28  **	ret
      29  */
      30  void f1 (void * in, void *out, int64_t x, int vl)
      31  {
      32    vbool64_t m = __riscv_vlm_v_b64 (in, vl);
      33    vint64m1_t v = __riscv_vle64_v_i64m1 (in + 1, vl);
      34    vint64m1_t v2 = __riscv_vle64_v_i64m1_tu (v, in + 2, vl);
      35    vint64m1_t v3 = __riscv_vslide1down_vx_i64m1 (v2, x, vl);
      36    vint64m1_t v4 = __riscv_vslide1down_vx_i64m1_tu (v3, v3, x, vl);
      37    vint64m1_t v5 = __riscv_vslide1down_vx_i64m1_tumu (m, v4, v4, x, vl);
      38    __riscv_vse64_v_i64m1 (out + 2, v5, vl);
      39  }
      40  
      41  /*
      42  ** f2:
      43  **  ...
      44  **	vsetvli\t[a-x0-9]+,\s*[a-x0-9]+,e64,m1,tu,m[au]
      45  **  ...
      46  **	vsetvli\tzero,\s*[a-x0-9]+,e32,m1,tu,m[au]
      47  **  ...
      48  **	vslide1up\.vx\tv[0-9]+,\s*v[0-9]+,\s*[a-x0-9]+
      49  **  ...
      50  **	vslide1up\.vx\tv[0-9]+,\s*v[0-9]+,\s*[a-x0-9]+
      51  **  ...
      52  **	vslide1up\.vx\tv[0-9]+,\s*v[0-9]+,\s*[a-x0-9]+
      53  **  ...
      54  **	vslide1up\.vx\tv[0-9]+,\s*v[0-9]+,\s*[a-x0-9]+
      55  **  ...
      56  **	vslide1up\.vx\tv[0-9]+,\s*v[0-9]+,\s*[a-x0-9]+
      57  **  ...
      58  **	vslide1up\.vx\tv[0-9]+,\s*v[0-9]+,\s*[a-x0-9]+
      59  **  ...
      60  **	vmerge\.vvm\tv[0-9]+,\s*v[0-9]+,\s*v[0-9]+,\s*v[0-9]+
      61  **  ...
      62  **	ret
      63  */
      64  void f2 (void * in, void *out, int64_t x, int vl)
      65  {
      66    vbool64_t m = __riscv_vlm_v_b64 (in, vl);
      67    vint64m1_t v = __riscv_vle64_v_i64m1 (in + 1, vl);
      68    vint64m1_t v2 = __riscv_vle64_v_i64m1_tu (v, in + 2, vl);
      69    vint64m1_t v3 = __riscv_vslide1up_vx_i64m1 (v2, x, vl);
      70    vint64m1_t v4 = __riscv_vslide1up_vx_i64m1_tu (v3, v3, x, vl);
      71    vint64m1_t v5 = __riscv_vslide1up_vx_i64m1_tumu (m, v4, v4, x, vl);
      72    __riscv_vse64_v_i64m1 (out + 2, v5, vl);
      73  }
      74  
      75  /* { dg-final { scan-assembler-times {vmv} 3 } } */