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