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