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 */
standard_caller(void)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))
vpcs_caller(void)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 */
sve_caller(svbool_t p0)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
standard_caller_ptr(int (* fn)(__SVInt16_t))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))
vpcs_caller_ptr(int (* fn)(__SVInt16_t))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
sve_caller_ptr(svbool_t pg,int (* fn)(svint16_t))89 sve_caller_ptr (svbool_t pg, int (*fn) (svint16_t))
90 {
91   return fn (svdup_s16 (1)) + 1;
92 }
93