1  /* { dg-do compile } */
       2  /* { dg-options "-O -g" } */
       3  /* { dg-final { check-function-bodies "**" "" "" { target lp64 } } } */
       4  
       5  #include <arm_sve.h>
       6  
       7  int sve_callee (svint8_t);
       8  
       9  /*
      10  ** standard_caller:
      11  **	stp	x29, x30, \[sp, -16\]!
      12  **	mov	x29, sp
      13  **	mov	z0\.b, #1
      14  **	bl	sve_callee
      15  **	add	w0, w0, #?1
      16  **	ldp	x29, x30, \[sp\], 16
      17  **	ret
      18  */
      19  int standard_caller (void) { return sve_callee (svdup_s8 (1)) + 1; }
      20  
      21  /*
      22  ** vpcs_caller:
      23  **	stp	x29, x30, \[sp, -16\]!
      24  **	mov	x29, sp
      25  **	mov	z0\.b, #1
      26  **	bl	sve_callee
      27  **	add	w0, w0, #?1
      28  **	ldp	x29, x30, \[sp\], 16
      29  **	ret
      30  */
      31  __attribute__((aarch64_vector_pcs))
      32  int vpcs_caller (void) { return sve_callee (svdup_s8 (1)) + 1; }
      33  
      34  /*
      35  ** sve_caller:
      36  **	stp	x29, x30, \[sp, -16\]!
      37  **	mov	x29, sp
      38  **	mov	z0\.b, #1
      39  **	bl	sve_callee
      40  **	add	w0, w0, #?1
      41  **	ldp	x29, x30, \[sp\], 16
      42  **	ret
      43  */
      44  int sve_caller (svbool_t p0) { return sve_callee (svdup_s8 (1)) + 1; }
      45  
      46  /*
      47  ** standard_caller_ptr:
      48  **	stp	x29, x30, \[sp, -16\]!
      49  **	mov	x29, sp
      50  **	mov	z0\.h, #1
      51  **	blr	x0
      52  **	add	w0, w0, #?1
      53  **	ldp	x29, x30, \[sp\], 16
      54  **	ret
      55  */
      56  int
      57  standard_caller_ptr (int (*fn) (__SVInt16_t))
      58  {
      59    return fn (svdup_s16 (1)) + 1;
      60  }
      61  
      62  /*
      63  ** vpcs_caller_ptr:
      64  **	stp	x29, x30, \[sp, -16\]!
      65  **	mov	x29, sp
      66  **	mov	z0\.h, #1
      67  **	blr	x0
      68  **	add	w0, w0, #?1
      69  **	ldp	x29, x30, \[sp\], 16
      70  **	ret
      71  */
      72  int __attribute__((aarch64_vector_pcs))
      73  vpcs_caller_ptr (int (*fn) (__SVInt16_t))
      74  {
      75    return fn (svdup_s16 (1)) + 1;
      76  }
      77  
      78  /*
      79  ** sve_caller_ptr:
      80  **	stp	x29, x30, \[sp, -16\]!
      81  **	mov	x29, sp
      82  **	mov	z0\.h, #1
      83  **	blr	x0
      84  **	add	w0, w0, #?1
      85  **	ldp	x29, x30, \[sp\], 16
      86  **	ret
      87  */
      88  int
      89  sve_caller_ptr (svbool_t pg, int (*fn) (svint16_t))
      90  {
      91    return fn (svdup_s16 (1)) + 1;
      92  }