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 ** ld1h (z[0-9]+\.h), (p[0-7])/z, \[x1\]
12 ** ...
13 ** st1h \1, \2, \[x0\]
14 ** ...
15 ** ret
16 */
17 void __attribute__((noipa))
callee_0(int16_t * ptr,...)18 callee_0 (int16_t *ptr, ...)
19 {
20 va_list va;
21 svint16_t vec;
22
23 va_start (va, ptr);
24 vec = va_arg (va, svint16_t);
25 va_end (va);
26 svst1 (svptrue_b8 (), ptr, vec);
27 }
28
29 /*
30 ** caller_0:
31 ** ...
32 ** mov (z[0-9]+\.h), #42
33 ** ...
34 ** st1h \1, p[0-7], \[x1\]
35 ** ...
36 ** ret
37 */
38 void __attribute__((noipa))
caller_0(int16_t * ptr)39 caller_0 (int16_t *ptr)
40 {
41 callee_0 (ptr, svdup_s16 (42));
42 }
43
44 /*
45 ** callee_1:
46 ** ...
47 ** ld1h (z[0-9]+\.h), (p[0-7])/z, \[x2\]
48 ** ...
49 ** st1h \1, p[0-7], \[x0\]
50 ** ...
51 ** ret
52 */
53 void __attribute__((noipa))
callee_1(int16_t * ptr,...)54 callee_1 (int16_t *ptr, ...)
55 {
56 va_list va;
57 svint16_t vec;
58
59 va_start (va, ptr);
60 va_arg (va, int);
61 vec = va_arg (va, svint16_t);
62 va_end (va);
63 svst1 (svptrue_b8 (), ptr, vec);
64 }
65
66 /*
67 ** caller_1:
68 ** ...
69 ** mov (z[0-9]+\.h), #42
70 ** ...
71 ** st1h \1, p[0-7], \[x2\]
72 ** ...
73 ** ret
74 */
75 void __attribute__((noipa))
caller_1(int16_t * ptr)76 caller_1 (int16_t *ptr)
77 {
78 callee_1 (ptr, 1, svdup_s16 (42));
79 }
80
81 /*
82 ** callee_7:
83 ** ...
84 ** ld1h (z[0-9]+\.h), (p[0-7])/z, \[x7\]
85 ** ...
86 ** st1h \1, p[0-7], \[x0\]
87 ** ...
88 ** ret
89 */
90 void __attribute__((noipa))
callee_7(int16_t * ptr,...)91 callee_7 (int16_t *ptr, ...)
92 {
93 va_list va;
94 svint16_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, svint16_t);
104 va_end (va);
105 svst1 (svptrue_b8 (), ptr, vec);
106 }
107
108 /*
109 ** caller_7:
110 ** ...
111 ** mov (z[0-9]+\.h), #42
112 ** ...
113 ** st1h \1, p[0-7], \[x7\]
114 ** ...
115 ** ret
116 */
117 void __attribute__((noipa))
caller_7(int16_t * ptr)118 caller_7 (int16_t *ptr)
119 {
120 callee_7 (ptr, 1, 2, 3, 4, 5, 6, svdup_s16 (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 ** ld1h (z[0-9]+\.h), (p[0-7])/z, \[\2\]
131 ** ...
132 ** st1h \3, \4, \[x0\]
133 ** ...
134 ** ret
135 */
136 void __attribute__((noipa))
callee_8(int16_t * ptr,...)137 callee_8 (int16_t *ptr, ...)
138 {
139 va_list va;
140 svint16_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, svint16_t);
151 va_end (va);
152 svst1 (svptrue_b8 (), ptr, vec);
153 }
154
155 /*
156 ** caller_8:
157 ** ...
158 ** mov (z[0-9]+\.h), #42
159 ** ...
160 ** st1h \1, p[0-7], \[(x[0-9]+)\]
161 ** ...
162 ** str \2, \[sp\]
163 ** ...
164 ** ret
165 */
166 void __attribute__((noipa))
caller_8(int16_t * ptr)167 caller_8 (int16_t *ptr)
168 {
169 callee_8 (ptr, 1, 2, 3, 4, 5, 6, 7, svdup_s16 (42));
170 }
171