1  /* { dg-do compile } */
       2  /* { dg-options "-O2 -fno-stack-clash-protection -g" } */
       3  /* { dg-final { check-function-bodies "**" "" "" { target lp64 } } } */
       4  
       5  #include <arm_sve.h>
       6  #include <stdarg.h>
       7  
       8  /*
       9  ** callee_0:
      10  **	...
      11  **	ld1w	(z[0-9]+\.s), (p[0-7])/z, \[x1\]
      12  **	...
      13  **	st1w	\1, \2, \[x0\]
      14  **	...
      15  **	ret
      16  */
      17  void __attribute__((noipa))
      18  callee_0 (int32_t *ptr, ...)
      19  {
      20    va_list va;
      21    svint32_t vec;
      22  
      23    va_start (va, ptr);
      24    vec = va_arg (va, svint32_t);
      25    va_end (va);
      26    svst1 (svptrue_b8 (), ptr, vec);
      27  }
      28  
      29  /*
      30  ** caller_0:
      31  **	...
      32  **	mov	(z[0-9]+\.s), #42
      33  **	...
      34  **	st1w	\1, p[0-7], \[x1\]
      35  **	...
      36  **	ret
      37  */
      38  void __attribute__((noipa))
      39  caller_0 (int32_t *ptr)
      40  {
      41    callee_0 (ptr, svdup_u32 (42));
      42  }
      43  
      44  /*
      45  ** callee_1:
      46  **	...
      47  **	ld1w	(z[0-9]+\.s), (p[0-7])/z, \[x2\]
      48  **	...
      49  **	st1w	\1, p[0-7], \[x0\]
      50  **	...
      51  **	ret
      52  */
      53  void __attribute__((noipa))
      54  callee_1 (int32_t *ptr, ...)
      55  {
      56    va_list va;
      57    svint32_t vec;
      58  
      59    va_start (va, ptr);
      60    va_arg (va, int);
      61    vec = va_arg (va, svint32_t);
      62    va_end (va);
      63    svst1 (svptrue_b8 (), ptr, vec);
      64  }
      65  
      66  /*
      67  ** caller_1:
      68  **	...
      69  **	mov	(z[0-9]+\.s), #42
      70  **	...
      71  **	st1w	\1, p[0-7], \[x2\]
      72  **	...
      73  **	ret
      74  */
      75  void __attribute__((noipa))
      76  caller_1 (int32_t *ptr)
      77  {
      78    callee_1 (ptr, 1, svdup_u32 (42));
      79  }
      80  
      81  /*
      82  ** callee_7:
      83  **	...
      84  **	ld1w	(z[0-9]+\.s), (p[0-7])/z, \[x7\]
      85  **	...
      86  **	st1w	\1, p[0-7], \[x0\]
      87  **	...
      88  **	ret
      89  */
      90  void __attribute__((noipa))
      91  callee_7 (int32_t *ptr, ...)
      92  {
      93    va_list va;
      94    svint32_t vec;
      95  
      96    va_start (va, ptr);
      97    va_arg (va, int);
      98    va_arg (va, int);
      99    va_arg (va, int);
     100    va_arg (va, int);
     101    va_arg (va, int);
     102    va_arg (va, int);
     103    vec = va_arg (va, svint32_t);
     104    va_end (va);
     105    svst1 (svptrue_b8 (), ptr, vec);
     106  }
     107  
     108  /*
     109  ** caller_7:
     110  **	...
     111  **	mov	(z[0-9]+\.s), #42
     112  **	...
     113  **	st1w	\1, p[0-7], \[x7\]
     114  **	...
     115  **	ret
     116  */
     117  void __attribute__((noipa))
     118  caller_7 (int32_t *ptr)
     119  {
     120    callee_7 (ptr, 1, 2, 3, 4, 5, 6, svdup_u32 (42));
     121  }
     122  
     123  /* FIXME: We should be able to get rid of the va_list object.  */
     124  /*
     125  ** callee_8:
     126  **	sub	sp, sp, #([0-9]+)
     127  **	...
     128  **	ldr	(x[0-9]+), \[sp, \1\]
     129  **	...
     130  **	ld1w	(z[0-9]+\.s), (p[0-7])/z, \[\2\]
     131  **	...
     132  **	st1w	\3, \4, \[x0\]
     133  **	...
     134  **	ret
     135  */
     136  void __attribute__((noipa))
     137  callee_8 (int32_t *ptr, ...)
     138  {
     139    va_list va;
     140    svint32_t vec;
     141  
     142    va_start (va, ptr);
     143    va_arg (va, int);
     144    va_arg (va, int);
     145    va_arg (va, int);
     146    va_arg (va, int);
     147    va_arg (va, int);
     148    va_arg (va, int);
     149    va_arg (va, int);
     150    vec = va_arg (va, svint32_t);
     151    va_end (va);
     152    svst1 (svptrue_b8 (), ptr, vec);
     153  }
     154  
     155  /*
     156  ** caller_8:
     157  **	...
     158  **	mov	(z[0-9]+\.s), #42
     159  **	...
     160  **	st1w	\1, p[0-7], \[(x[0-9]+)\]
     161  **	...
     162  **	str	\2, \[sp\]
     163  **	...
     164  **	ret
     165  */
     166  void __attribute__((noipa))
     167  caller_8 (int32_t *ptr)
     168  {
     169    callee_8 (ptr, 1, 2, 3, 4, 5, 6, 7, svdup_u32 (42));
     170  }