1  /* { dg-do compile } */
       2  /* { dg-options "-march=rv32gcv -mabi=ilp32 -mpreferred-stack-boundary=3 -O3 -fno-schedule-insns -fno-schedule-insns2" } */
       3  /* { dg-final { check-function-bodies "**" "" } } */
       4  
       5  #include "riscv_vector.h"
       6  #include "macro.h"
       7  
       8  /*
       9  ** spill:
      10  **  csrr\t[a-x0-9]+,vlenb
      11  **  slli\t[a-x0-9]+,[a-x0-9]+,4
      12  **  sub\tsp,[a-x0-9]+,[a-x0-9]+
      13  **  vsetvli\t[a-x0-9]+,zero,e8,mf8,ta,ma
      14  **  vle8.v\tv[0-9]+,0\([a-x0-9]+\)
      15  **  csrr\t[a-x0-9]+,vlenb
      16  **  srli\t[a-x0-9]+,[a-x0-9]+,3
      17  **  add\t[a-x0-9]+,[a-x0-9]+,[a-x0-9]+
      18  **  vse8.v\tv[0-9]+,0\([a-x0-9]+\)
      19  **  addi\t[a-x0-9]+,[a-x0-9]+,1
      20  **  vsetvli\t[a-x0-9]+,zero,e8,mf4,ta,ma
      21  **  vle8.v\tv[0-9]+,0\([a-x0-9]+\)
      22  **  csrr\t[a-x0-9]+,vlenb
      23  **  srli\t[a-x0-9]+,[a-x0-9]+,2
      24  **  add\t[a-x0-9]+,[a-x0-9]+,[a-x0-9]+
      25  **  vse8.v\tv[0-9]+,0\([a-x0-9]+\)
      26  **  addi\t[a-x0-9]+,[a-x0-9]+,2
      27  **  vsetvli\t[a-x0-9]+,zero,e8,mf2,ta,ma
      28  **  vle8.v\tv[0-9]+,0\([a-x0-9]+\)
      29  **  csrr\t[a-x0-9]+,vlenb
      30  **  srli\t[a-x0-9]+,[a-x0-9]+,1
      31  **  add\t[a-x0-9]+,[a-x0-9]+,[a-x0-9]+
      32  **  vse8.v\tv[0-9]+,0\([a-x0-9]+\)
      33  **  addi\t[a-x0-9]+,[a-x0-9]+,3
      34  **  vl1re8.v\tv[0-9]+,0\([a-x0-9]+\)
      35  **  csrr\t[a-x0-9]+,vlenb
      36  **  add\t[a-x0-9]+,[a-x0-9]+,[a-x0-9]+
      37  **  vs1r.v\tv[0-9]+,0\([a-x0-9]+\)
      38  **  addi\t[a-x0-9]+,[a-x0-9]+,4
      39  **  vl2re8.v\tv[0-9]+,0\([a-x0-9]+\)
      40  **  csrr\t[a-x0-9]+,vlenb
      41  **  slli\t[a-x0-9]+,[a-x0-9]+,1
      42  **  add\t[a-x0-9]+,[a-x0-9]+,[a-x0-9]+
      43  **  vs2r.v\tv[0-9]+,0\([a-x0-9]+\)
      44  **  addi\t[a-x0-9]+,[a-x0-9]+,5
      45  **  vl4re8.v\tv[0-9]+,0\([a-x0-9]+\)
      46  **  mv\t[a-x0-9]+,[a-x0-9]+
      47  **  slli\t[a-x0-9]+,[a-x0-9]+,2
      48  **  add\t[a-x0-9]+,[a-x0-9]+,[a-x0-9]+
      49  **  vs4r.v\tv[0-9]+,0\([a-x0-9]+\)
      50  **  addi\t[a-x0-9]+,[a-x0-9]+,6
      51  **  vl8re8.v\tv[0-9]+,0\([a-x0-9]+\)
      52  **  ...
      53  **  slli\t[a-x0-9]+,[a-x0-9]+,3
      54  **  add\t[a-x0-9]+,[a-x0-9]+,[a-x0-9]+
      55  **  vs8r.v\tv[0-9]+,0\([a-x0-9]+\)
      56  **  ...
      57  **  srli\t[a-x0-9]+,[a-x0-9]+,3
      58  **  add\t[a-x0-9]+,[a-x0-9]+,[a-x0-9]+
      59  **  ...
      60  **  vle8.v\tv[0-9]+,0\([a-x0-9]+\)
      61  **  vse8.v\tv[0-9]+,0\([a-x0-9]+\)
      62  **  addi\t[a-x0-9]+,[a-x0-9]+,1
      63  **  srli\t[a-x0-9]+,[a-x0-9]+,2
      64  **  add\t[a-x0-9]+,[a-x0-9]+,[a-x0-9]+
      65  **  ...
      66  **  vle8.v\tv[0-9]+,0\([a-x0-9]+\)
      67  **  vse8.v\tv[0-9]+,0\([a-x0-9]+\)
      68  **  addi\t[a-x0-9]+,[a-x0-9]+,2
      69  **  srli\t[a-x0-9]+,[a-x0-9]+,1
      70  **  add\t[a-x0-9]+,[a-x0-9]+,[a-x0-9]+
      71  **  ...
      72  **  vle8.v\tv[0-9]+,0\([a-x0-9]+\)
      73  **  vse8.v\tv[0-9]+,0\([a-x0-9]+\)
      74  **  addi\t[a-x0-9]+,[a-x0-9]+,3
      75  **  add\t[a-x0-9]+,[a-x0-9]+,[a-x0-9]+
      76  **  vl1re8.v\tv[0-9]+,0\([a-x0-9]+\)
      77  **  vs1r.v\tv[0-9]+,0\([a-x0-9]+\)
      78  **  addi\t[a-x0-9]+,[a-x0-9]+,4
      79  **  slli\t[a-x0-9]+,[a-x0-9]+,1
      80  **  add\t[a-x0-9]+,[a-x0-9]+,[a-x0-9]+
      81  **  vl2re8.v\tv[0-9]+,0\([a-x0-9]+\)
      82  **  vs2r.v\tv[0-9]+,0\([a-x0-9]+\)
      83  **  addi\t[a-x0-9]+,[a-x0-9]+,5
      84  **  slli\t[a-x0-9]+,[a-x0-9]+,2
      85  **  add\t[a-x0-9]+,[a-x0-9]+,[a-x0-9]+
      86  **  vl4re8.v\tv[0-9]+,0\([a-x0-9]+\)
      87  **  vs4r.v\tv[0-9]+,0\([a-x0-9]+\)
      88  **  addi\t[a-x0-9]+,[a-x0-9]+,6
      89  **  slli\t[a-x0-9]+,[a-x0-9]+,3
      90  **  add\t[a-x0-9]+,[a-x0-9]+,[a-x0-9]+
      91  **  vl8re8.v\tv[0-9]+,0\([a-x0-9]+\)
      92  **  vs8r.v\tv[0-9]+,0\([a-x0-9]+\)
      93  **  csrr\t[a-x0-9]+,vlenb
      94  **  slli\t[a-x0-9]+,[a-x0-9]+,4
      95  **  add\tsp,[a-x0-9]+,[a-x0-9]+
      96  **  ...
      97  **  jr\tra
      98  */
      99  void
     100  spill (int8_t *in, int8_t *out)
     101  {
     102    vint8mf8_t v0 = *(vint8mf8_t*)in;
     103    vint8mf4_t v1 = *(vint8mf4_t*)(in + 1);
     104    vint8mf2_t v2 = *(vint8mf2_t*)(in + 2);
     105    vint8m1_t v3 = *(vint8m1_t*)(in + 3);
     106    vint8m2_t v4 = *(vint8m2_t*)(in + 4);
     107    vint8m4_t v8 = *(vint8m4_t*)(in + 5);
     108    vint8m8_t v16 = *(vint8m8_t*)(in + 6);
     109    exhaust_vector_regs (); 
     110    *(vint8mf8_t*)out = v0;
     111    *(vint8mf4_t*)(out + 1) = v1; 
     112    *(vint8mf2_t*)(out + 2) = v2;
     113    *(vint8m1_t*)(out + 3) = v3;
     114    *(vint8m2_t*)(out + 4) = v4;
     115    *(vint8m4_t*)(out + 5) = v8;
     116    *(vint8m8_t*)(out + 6) = v16;
     117  }