1  /* { dg-do compile } */
       2  /* { dg-options "-march=rv32gcv -mabi=ilp32d -O3 -fno-schedule-insns -fno-schedule-insns2" } */
       3  
       4  #include "riscv_vector.h"
       5  
       6  /*
       7  ** foo1:
       8  **	lw\t[a-x0-9]+,4\([a-x0-9]+\)
       9  **	lw\t[a-x0-9]+,0\([a-x0-9]+\)
      10  **	ret
      11  */
      12  int64_t foo (void *base, size_t vl)
      13  {
      14      vint64m1_t v = *(vint64m1_t*)base;
      15      int64_t scalar = __riscv_vmv_x_s_i64m1_i64 (v);
      16      return scalar;
      17  }
      18  
      19  /*
      20  ** foo2:
      21  **	lw\t[a-x0-9]+,12\([a-x0-9]+\)
      22  **	lw\t[a-x0-9]+,8\([a-x0-9]+\)
      23  **	ret
      24  */
      25  int64_t foo2 (int64_t *base, size_t vl)
      26  {
      27      vint64m1_t v = *(vint64m1_t*)(base+1);
      28      int64_t scalar = __riscv_vmv_x_s_i64m1_i64 (v);
      29      return scalar;
      30  }
      31  
      32  /*
      33  ** foo3:
      34  ** ...
      35  ** vsrl.vx\tv[0-9]+,\s*v[0-9]+,\s*[a-x0-9]+
      36  ** vmv.x.s\t[a-x0-9]+,\s*v[0-9]+
      37  ** vmv.x.s\t[a-x0-9]+,\s*v[0-9]+
      38  ** ret
      39  */
      40  int64_t foo3 (void *base, size_t vl)
      41  {
      42      vint64m1_t v = *(vint64m1_t*)base;
      43      v = __riscv_vadd_vv_i64m1 (v,v,vl);
      44      int64_t scalar = __riscv_vmv_x_s_i64m1_i64 (v);
      45      return scalar;
      46  }
      47  
      48  /*
      49  ** foo4:
      50  **	fld\t[a-x0-9]+,4\([a-x0-9]+\)
      51  **	ret
      52  */
      53  double foo4 (int64_t *base, size_t vl)
      54  {
      55      vint64m1_t v = *(vint64m1_t*)(base+1);
      56      int64_t scalar = __riscv_vmv_x_s_i64m1_i64 (v);
      57      return *(double*)&scalar;
      58  }