1 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -stop-after=finalize-isel < %s | FileCheck %s
2 ; RUN: llc -mtriple=aarch64-apple-darwin -mattr=+sve -stop-after=finalize-isel < %s | FileCheck %s --check-prefix=DARWIN
3 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -stop-after=prologepilog < %s | FileCheck %s --check-prefix=CHECKCSR
4 ; RUN: llc -mtriple=aarch64-apple-darwin -mattr=+sve -stop-after=prologepilog < %s | FileCheck %s --check-prefix=CHECKCSR
6 ; CHECK-LABEL: name: nosve_signature
7 ; DARWIN-LABEL: name: nosve_signature
8 define i32 @nosve_signature() nounwind {
12 ; CHECK-LABEL: name: sve_signature_ret_vec
13 ; DARWIN-LABEL: name: sve_signature_ret_vec
14 define <vscale x 4 x i32> @sve_signature_ret_vec() nounwind {
15 ret <vscale x 4 x i32> undef
18 ; CHECK-LABEL: name: sve_signature_ret_pred
19 ; DARWIN-LABEL: name: sve_signature_ret_pred
20 define <vscale x 4 x i1> @sve_signature_ret_pred() nounwind {
21 ret <vscale x 4 x i1> undef
24 ; CHECK-LABEL: name: sve_signature_arg_vec
25 ; DARWIN-LABEL: name: sve_signature_arg_vec
26 define void @sve_signature_arg_vec(<vscale x 4 x i32> %arg) nounwind {
30 ; CHECK-LABEL: name: sve_signature_arg_pred
31 ; DARWIN-LABEL: name: sve_signature_arg_pred
32 define void @sve_signature_arg_pred(<vscale x 4 x i1> %arg) nounwind {
36 ; CHECK-LABEL: name: caller_nosve_signature
37 ; CHECK: BL @nosve_signature, csr_aarch64_aapcs
38 ; DARWIN-LABEL: name: caller_nosve_signature
39 ; DARWIN: BL @nosve_signature, csr_darwin_aarch64_aapcs
40 define i32 @caller_nosve_signature() nounwind {
41 %res = call i32 @nosve_signature()
45 ; CHECK-LABEL: name: caller_nosve_signature_fastcc
46 ; CHECK: BL @nosve_signature, csr_aarch64_aapcs
47 ; DARWIN-LABEL: name: caller_nosve_signature_fastcc
48 ; DARWIN: BL @nosve_signature, csr_darwin_aarch64_aapcs
49 define i32 @caller_nosve_signature_fastcc() nounwind {
50 %res = call fastcc i32 @nosve_signature()
54 ; CHECK-LABEL: name: sve_signature_ret_vec_caller
55 ; CHECK: BL @sve_signature_ret_vec, csr_aarch64_sve_aapcs
56 ; DARWIN-LABEL: name: sve_signature_ret_vec_caller
57 ; DARWIN: BL @sve_signature_ret_vec, csr_darwin_aarch64_sve_aapcs
58 define <vscale x 4 x i32> @sve_signature_ret_vec_caller() nounwind {
59 %res = call <vscale x 4 x i32> @sve_signature_ret_vec()
60 ret <vscale x 4 x i32> %res
63 ; CHECK-LABEL: name: sve_signature_ret_vec_caller_fastcc
64 ; CHECK: BL @sve_signature_ret_vec, csr_aarch64_sve_aapcs
65 ; DARWIN-LABEL: name: sve_signature_ret_vec_caller_fastcc
66 ; DARWIN: BL @sve_signature_ret_vec, csr_darwin_aarch64_sve_aapcs
67 define <vscale x 4 x i32> @sve_signature_ret_vec_caller_fastcc() nounwind {
68 %res = call fastcc <vscale x 4 x i32> @sve_signature_ret_vec()
69 ret <vscale x 4 x i32> %res
72 ; CHECK-LABEL: name: sve_signature_ret_pred_caller
73 ; CHECK: BL @sve_signature_ret_pred, csr_aarch64_sve_aapcs
74 ; DARWIN-LABEL: name: sve_signature_ret_pred_caller
75 ; DARWIN: BL @sve_signature_ret_pred, csr_darwin_aarch64_sve_aapcs
76 define <vscale x 4 x i1> @sve_signature_ret_pred_caller() nounwind {
77 %res = call <vscale x 4 x i1> @sve_signature_ret_pred()
78 ret <vscale x 4 x i1> %res
81 ; CHECK-LABEL: name: sve_signature_ret_pred_caller_fastcc
82 ; CHECK: BL @sve_signature_ret_pred, csr_aarch64_sve_aapcs
83 ; DARWIN-LABEL: name: sve_signature_ret_pred_caller_fastcc
84 ; DARWIN: BL @sve_signature_ret_pred, csr_darwin_aarch64_sve_aapcs
85 define <vscale x 4 x i1> @sve_signature_ret_pred_caller_fastcc() nounwind {
86 %res = call fastcc <vscale x 4 x i1> @sve_signature_ret_pred()
87 ret <vscale x 4 x i1> %res
90 ; CHECK-LABEL: name: sve_signature_arg_vec_caller
91 ; CHECK: BL @sve_signature_arg_vec, csr_aarch64_sve_aapcs
92 ; DARWIN-LABEL: name: sve_signature_arg_vec_caller
93 ; DARWIN: BL @sve_signature_arg_vec, csr_darwin_aarch64_sve_aapcs
94 define void @sve_signature_arg_vec_caller(<vscale x 4 x i32> %arg) nounwind {
95 call void @sve_signature_arg_vec(<vscale x 4 x i32> %arg)
99 ; CHECK-LABEL: name: sve_signature_arg_vec_caller_fastcc
100 ; CHECK: BL @sve_signature_arg_vec, csr_aarch64_sve_aapcs
101 ; DARWIN-LABEL: name: sve_signature_arg_vec_caller_fastcc
102 ; DARWIN: BL @sve_signature_arg_vec, csr_darwin_aarch64_sve_aapcs
103 define void @sve_signature_arg_vec_caller_fastcc(<vscale x 4 x i32> %arg) nounwind {
104 call fastcc void @sve_signature_arg_vec(<vscale x 4 x i32> %arg)
108 ; CHECK-LABEL: name: sve_signature_arg_pred_caller
109 ; CHECK: BL @sve_signature_arg_pred, csr_aarch64_sve_aapcs
110 ; DARWIN-LABEL: name: sve_signature_arg_pred_caller
111 ; DARWIN: BL @sve_signature_arg_pred, csr_darwin_aarch64_sve_aapcs
112 define void @sve_signature_arg_pred_caller(<vscale x 4 x i1> %arg) nounwind {
113 call void @sve_signature_arg_pred(<vscale x 4 x i1> %arg)
117 ; CHECK-LABEL: name: sve_signature_arg_pred_caller_fastcc
118 ; CHECK: BL @sve_signature_arg_pred, csr_aarch64_sve_aapcs
119 ; DARWIN-LABEL: name: sve_signature_arg_pred_caller_fastcc
120 ; DARWIN: BL @sve_signature_arg_pred, csr_darwin_aarch64_sve_aapcs
121 define void @sve_signature_arg_pred_caller_fastcc(<vscale x 4 x i1> %arg) nounwind {
122 call fastcc void @sve_signature_arg_pred(<vscale x 4 x i1> %arg)
126 ; CHECK-LABEL: name: sve_signature_many_arg_vec
127 ; CHECK: [[RES:%[0-9]+]]:zpr = COPY $z7
128 ; CHECK: $z0 = COPY [[RES]]
129 ; CHECK: RET_ReallyLR implicit $z0
130 ; DARWIN-LABEL: name: sve_signature_many_arg_vec
131 ; DARWIN: [[RES:%[0-9]+]]:zpr = COPY $z7
132 ; DARWIN: $z0 = COPY [[RES]]
133 ; DARWIN: RET_ReallyLR implicit $z0
134 define <vscale x 4 x i32> @sve_signature_many_arg_vec(<vscale x 4 x i32> %arg1, <vscale x 4 x i32> %arg2, <vscale x 4 x i32> %arg3, <vscale x 4 x i32> %arg4, <vscale x 4 x i32> %arg5, <vscale x 4 x i32> %arg6, <vscale x 4 x i32> %arg7, <vscale x 4 x i32> %arg8) nounwind {
135 ret <vscale x 4 x i32> %arg8
138 ; CHECK-LABEL: name: sve_signature_many_arg_pred
139 ; CHECK: [[RES:%[0-9]+]]:ppr = COPY $p3
140 ; CHECK: $p0 = COPY [[RES]]
141 ; CHECK: RET_ReallyLR implicit $p0
142 ; DARWIN-LABEL: name: sve_signature_many_arg_pred
143 ; DARWIN: [[RES:%[0-9]+]]:ppr = COPY $p3
144 ; DARWIN: $p0 = COPY [[RES]]
145 ; DARWIN: RET_ReallyLR implicit $p0
146 define <vscale x 4 x i1> @sve_signature_many_arg_pred(<vscale x 4 x i1> %arg1, <vscale x 4 x i1> %arg2, <vscale x 4 x i1> %arg3, <vscale x 4 x i1> %arg4) nounwind {
147 ret <vscale x 4 x i1> %arg4
150 ; CHECK-LABEL: name: sve_signature_vec
151 ; CHECK: [[RES:%[0-9]+]]:zpr = COPY $z1
152 ; CHECK: $z0 = COPY [[RES]]
153 ; CHECK: RET_ReallyLR implicit $z0
154 ; DARWIN-LABEL: name: sve_signature_vec
155 ; DARWIN: [[RES:%[0-9]+]]:zpr = COPY $z1
156 ; DARWIN: $z0 = COPY [[RES]]
157 ; DARWIN: RET_ReallyLR implicit $z0
158 define <vscale x 4 x i32> @sve_signature_vec(<vscale x 4 x i32> %arg1, <vscale x 4 x i32> %arg2) nounwind {
159 ret <vscale x 4 x i32> %arg2
162 ; CHECK-LABEL: name: sve_signature_pred
163 ; CHECK: [[RES:%[0-9]+]]:ppr = COPY $p1
164 ; CHECK: $p0 = COPY [[RES]]
165 ; CHECK: RET_ReallyLR implicit $p0
166 ; DARWIN-LABEL: name: sve_signature_pred
167 ; DARWIN: [[RES:%[0-9]+]]:ppr = COPY $p1
168 ; DARWIN: $p0 = COPY [[RES]]
169 ; DARWIN: RET_ReallyLR implicit $p0
170 define <vscale x 4 x i1> @sve_signature_pred(<vscale x 4 x i1> %arg1, <vscale x 4 x i1> %arg2) nounwind {
171 ret <vscale x 4 x i1> %arg2
174 ; Test that scalable predicate argument in [1 x <vscale x 4 x i1>] type are properly assigned to P registers.
175 ; CHECK-LABEL: name: sve_signature_pred_1xv4i1
176 ; CHECK: [[RES:%[0-9]+]]:ppr = COPY $p1
177 ; CHECK: $p0 = COPY [[RES]]
178 ; CHECK: RET_ReallyLR implicit $p0
179 define [1 x <vscale x 4 x i1>] @sve_signature_pred_1xv4i1([1 x <vscale x 4 x i1>] %arg1, [1 x <vscale x 4 x i1>] %arg2) nounwind {
180 ret [1 x <vscale x 4 x i1>] %arg2
183 ; Test that upto to two scalable predicate arguments in [2 x <vscale x 4 x i1>] type can be assigned to P registers.
184 ; CHECK-LABEL: name: sve_signature_pred_2xv4i1
185 ; CHECK: [[RES1:%[0-9]+]]:ppr = COPY $p3
186 ; CHECK: [[RES0:%[0-9]+]]:ppr = COPY $p2
187 ; CHECK: $p0 = COPY [[RES0]]
188 ; CHECK: $p1 = COPY [[RES1]]
189 ; CHECK: RET_ReallyLR implicit $p0, implicit $p1
190 define [2 x <vscale x 4 x i1>] @sve_signature_pred_2xv4i1([2 x <vscale x 4 x i1>] %arg1, [2 x <vscale x 4 x i1>] %arg2) nounwind {
191 ret [2 x <vscale x 4 x i1>] %arg2
194 ; Test that a scalable predicate argument in [1 x <vscale x 32 x i1>] type is assigned to two P registers.
195 ; CHECK-LABLE: name: sve_signature_pred_1xv32i1
196 ; CHECK: [[RES1:%[0-9]+]]:ppr = COPY $p3
197 ; CHECK: [[RES0:%[0-9]+]]:ppr = COPY $p2
198 ; CHECK: $p0 = COPY [[RES0]]
199 ; CHECK: $p1 = COPY [[RES1]]
200 ; CHECK: RET_ReallyLR implicit $p0, implicit $p1
201 define [1 x <vscale x 32 x i1>] @sve_signature_pred_1xv32i1([1 x <vscale x 32 x i1>] %arg1, [1 x <vscale x 32 x i1>] %arg2) nounwind {
202 ret [1 x <vscale x 32 x i1>] %arg2
205 ; Test that a scalable predicate argument in [2 x <vscale x 32 x i1>] type is assigned to four P registers.
206 ; CHECK-LABLE: name: sve_signature_pred_2xv32i1
207 ; CHECK: [[RES3:%[0-9]+]]:ppr = COPY $p3
208 ; CHECK: [[RES2:%[0-9]+]]:ppr = COPY $p2
209 ; CHECK: [[RES1:%[0-9]+]]:ppr = COPY $p1
210 ; CHECK: [[RES0:%[0-9]+]]:ppr = COPY $p0
211 ; CHECK: $p0 = COPY [[RES0]]
212 ; CHECK: $p1 = COPY [[RES1]]
213 ; CHECK: $p2 = COPY [[RES2]]
214 ; CHECK: $p3 = COPY [[RES3]]
215 ; CHECK: RET_ReallyLR implicit $p0, implicit $p1, implicit $p2, implicit $p3
216 define [2 x <vscale x 32 x i1>] @sve_signature_pred_2xv32i1([2 x <vscale x 32 x i1>] %arg1) nounwind {
217 ret [2 x <vscale x 32 x i1>] %arg1
220 ; CHECK-LABEL: name: sve_signature_vec_caller
221 ; CHECK-DAG: [[ARG2:%[0-9]+]]:zpr = COPY $z1
222 ; CHECK-DAG: [[ARG1:%[0-9]+]]:zpr = COPY $z0
223 ; CHECK-DAG: $z0 = COPY [[ARG2]]
224 ; CHECK-DAG: $z1 = COPY [[ARG1]]
225 ; CHECK-NEXT: BL @sve_signature_vec, csr_aarch64_sve_aapcs
226 ; CHECK: [[RES:%[0-9]+]]:zpr = COPY $z0
227 ; CHECK: $z0 = COPY [[RES]]
228 ; CHECK: RET_ReallyLR implicit $z0
229 ; DARWIN-LABEL: name: sve_signature_vec_caller
230 ; DARWIN-DAG: [[ARG2:%[0-9]+]]:zpr = COPY $z1
231 ; DARWIN-DAG: [[ARG1:%[0-9]+]]:zpr = COPY $z0
232 ; DARWIN-DAG: $z0 = COPY [[ARG2]]
233 ; DARWIN-DAG: $z1 = COPY [[ARG1]]
234 ; DARWIN-NEXT: BL @sve_signature_vec, csr_darwin_aarch64_sve_aapcs
235 ; DARWIN: [[RES:%[0-9]+]]:zpr = COPY $z0
236 ; DARWIN: $z0 = COPY [[RES]]
237 ; DARWIN: RET_ReallyLR implicit $z0
238 define <vscale x 4 x i32> @sve_signature_vec_caller(<vscale x 4 x i32> %arg1, <vscale x 4 x i32> %arg2) nounwind {
239 %res = call <vscale x 4 x i32> @sve_signature_vec(<vscale x 4 x i32> %arg2, <vscale x 4 x i32> %arg1)
240 ret <vscale x 4 x i32> %res
243 ; CHECK-LABEL: name: sve_signature_pred_caller
244 ; CHECK-DAG: [[ARG2:%[0-9]+]]:ppr = COPY $p1
245 ; CHECK-DAG: [[ARG1:%[0-9]+]]:ppr = COPY $p0
246 ; CHECK-DAG: $p0 = COPY [[ARG2]]
247 ; CHECK-DAG: $p1 = COPY [[ARG1]]
248 ; CHECK-NEXT: BL @sve_signature_pred, csr_aarch64_sve_aapcs
249 ; CHECK: [[RES:%[0-9]+]]:ppr = COPY $p0
250 ; CHECK: $p0 = COPY [[RES]]
251 ; CHECK: RET_ReallyLR implicit $p0
252 ; DARWIN-LABEL: name: sve_signature_pred_caller
253 ; DARWIN-DAG: [[ARG2:%[0-9]+]]:ppr = COPY $p1
254 ; DARWIN-DAG: [[ARG1:%[0-9]+]]:ppr = COPY $p0
255 ; DARWIN-DAG: $p0 = COPY [[ARG2]]
256 ; DARWIN-DAG: $p1 = COPY [[ARG1]]
257 ; DARWIN-NEXT: BL @sve_signature_pred, csr_darwin_aarch64_sve_aapcs
258 ; DARWIN: [[RES:%[0-9]+]]:ppr = COPY $p0
259 ; DARWIN: $p0 = COPY [[RES]]
260 ; DARWIN: RET_ReallyLR implicit $p0
261 define <vscale x 4 x i1> @sve_signature_pred_caller(<vscale x 4 x i1> %arg1, <vscale x 4 x i1> %arg2) nounwind {
262 %res = call <vscale x 4 x i1> @sve_signature_pred(<vscale x 4 x i1> %arg2, <vscale x 4 x i1> %arg1)
263 ret <vscale x 4 x i1> %res
266 ; CHECK-LABEL: name: sve_signature_pred_1xv4i1_caller
267 ; CHECK-DAG: [[ARG2:%[0-9]+]]:ppr = COPY $p1
268 ; CHECK-DAG: [[ARG1:%[0-9]+]]:ppr = COPY $p0
269 ; CHECK-DAG: $p0 = COPY [[ARG2]]
270 ; CHECK-DAG: $p1 = COPY [[ARG1]]
271 ; CHECK-NEXT: BL @sve_signature_pred_1xv4i1, csr_aarch64_sve_aapcs
272 ; CHECK: [[RES:%[0-9]+]]:ppr = COPY $p0
273 ; CHECK: $p0 = COPY [[RES]]
274 ; CHECK: RET_ReallyLR implicit $p0
275 define [1 x <vscale x 4 x i1>] @sve_signature_pred_1xv4i1_caller([1 x <vscale x 4 x i1>] %arg1, [1 x <vscale x 4 x i1>] %arg2) nounwind {
276 %res = call [1 x <vscale x 4 x i1>] @sve_signature_pred_1xv4i1([1 x <vscale x 4 x i1>] %arg2, [1 x <vscale x 4 x i1>] %arg1)
277 ret [1 x <vscale x 4 x i1>] %res
280 ; CHECK-LABEL: name: sve_signature_pred_2xv4i1_caller
281 ; CHECK-DAG: [[ARG2_2:%[0-9]+]]:ppr = COPY $p3
282 ; CHECK-DAG: [[ARG2_1:%[0-9]+]]:ppr = COPY $p2
283 ; CHECK-DAG: [[ARG1_2:%[0-9]+]]:ppr = COPY $p1
284 ; CHECK-DAG: [[ARG1_1:%[0-9]+]]:ppr = COPY $p0
285 ; CHECK-DAG: $p0 = COPY [[ARG2_1]]
286 ; CHECK-DAG: $p1 = COPY [[ARG2_2]]
287 ; CHECK-DAG: $p2 = COPY [[ARG1_1]]
288 ; CHECK-DAG: $p3 = COPY [[ARG1_2]]
289 ; CHECK-NEXT: BL @sve_signature_pred_2xv4i1, csr_aarch64_sve_aapcs
290 ; CHECK: [[RES0:%[0-9]+]]:ppr = COPY $p0
291 ; CHECK: [[RES1:%[0-9]+]]:ppr = COPY $p1
292 ; CHECK: $p0 = COPY [[RES0]]
293 ; CHECK: $p1 = COPY [[RES1]]
294 ; CHECK: RET_ReallyLR implicit $p0, implicit $p1
295 define [2 x <vscale x 4 x i1>] @sve_signature_pred_2xv4i1_caller([2 x <vscale x 4 x i1>] %arg1, [2 x <vscale x 4 x i1>] %arg2) nounwind {
296 %res = call [2 x <vscale x 4 x i1>] @sve_signature_pred_2xv4i1([2 x <vscale x 4 x i1>] %arg2, [2 x <vscale x 4 x i1>] %arg1)
297 ret [2 x <vscale x 4 x i1>] %res
300 ; CHECK-LABEL: name: sve_signature_pred_1xv32i1_caller
301 ; CHECK-DAG: [[ARG2_2:%[0-9]+]]:ppr = COPY $p3
302 ; CHECK-DAG: [[ARG2_1:%[0-9]+]]:ppr = COPY $p2
303 ; CHECK-DAG: [[ARG1_2:%[0-9]+]]:ppr = COPY $p1
304 ; CHECK-DAG: [[ARG1_1:%[0-9]+]]:ppr = COPY $p0
305 ; CHECK-DAG: $p0 = COPY [[ARG2_1]]
306 ; CHECK-DAG: $p1 = COPY [[ARG2_2]]
307 ; CHECK-DAG: $p2 = COPY [[ARG1_1]]
308 ; CHECK-DAG: $p3 = COPY [[ARG1_2]]
309 ; CHECK-NEXT: BL @sve_signature_pred_1xv32i1, csr_aarch64_sve_aapcs
310 ; CHECK: [[RES0:%[0-9]+]]:ppr = COPY $p0
311 ; CHECK: [[RES1:%[0-9]+]]:ppr = COPY $p1
312 ; CHECK: $p0 = COPY [[RES0]]
313 ; CHECK: $p1 = COPY [[RES1]]
314 ; CHECK: RET_ReallyLR implicit $p0, implicit $p1
315 define [1 x <vscale x 32 x i1>] @sve_signature_pred_1xv32i1_caller([1 x <vscale x 32 x i1>] %arg1, [1 x <vscale x 32 x i1>] %arg2) nounwind {
316 %res = call [1 x <vscale x 32 x i1>] @sve_signature_pred_1xv32i1([1 x <vscale x 32 x i1>] %arg2, [1 x <vscale x 32 x i1>] %arg1)
317 ret [1 x <vscale x 32 x i1>] %res
320 ; CHECK-LABEL: name: sve_signature_pred_2xv32i1_caller
321 ; CHECK-DAG: [[ARG3:%[0-9]+]]:ppr = COPY $p3
322 ; CHECK-DAG: [[ARG2:%[0-9]+]]:ppr = COPY $p2
323 ; CHECK-DAG: [[ARG1:%[0-9]+]]:ppr = COPY $p1
324 ; CHECK-DAG: [[ARG0:%[0-9]+]]:ppr = COPY $p0
325 ; CHECK-DAG: $p0 = COPY [[ARG0]]
326 ; CHECK-DAG: $p1 = COPY [[ARG1]]
327 ; CHECK-DAG: $p2 = COPY [[ARG2]]
328 ; CHECK-DAG: $p3 = COPY [[ARG3]]
329 ; CHECK-NEXT: BL @sve_signature_pred_2xv32i1, csr_aarch64_sve_aapcs
330 ; CHECK: [[RES0:%[0-9]+]]:ppr = COPY $p0
331 ; CHECK: [[RES1:%[0-9]+]]:ppr = COPY $p1
332 ; CHECK: [[RES2:%[0-9]+]]:ppr = COPY $p2
333 ; CHECK: [[RES3:%[0-9]+]]:ppr = COPY $p3
334 ; CHECK: $p0 = COPY [[RES0]]
335 ; CHECK: $p1 = COPY [[RES1]]
336 ; CHECK: $p2 = COPY [[RES2]]
337 ; CHECK: $p3 = COPY [[RES3]]
338 ; CHECK: RET_ReallyLR implicit $p0, implicit $p1
339 define [2 x <vscale x 32 x i1>] @sve_signature_pred_2xv32i1_caller([2 x <vscale x 32 x i1>] %arg1) {
340 %res = call [2 x <vscale x 32 x i1>] @sve_signature_pred_2xv32i1([2 x <vscale x 32 x i1>] %arg1)
341 ret [2 x <vscale x 32 x i1>] %res
344 ; Test that functions returning or taking SVE arguments use the correct
345 ; callee-saved set when using the default C calling convention (as opposed
346 ; to aarch64_sve_vector_pcs)
348 ; CHECKCSR-LABEL: name: sve_signature_vec_ret_callee
349 ; CHECKCSR: callee-saved-register: '$z8'
350 ; CHECKCSR: callee-saved-register: '$p4'
351 ; CHECKCSR: RET_ReallyLR
352 define <vscale x 4 x i32> @sve_signature_vec_ret_callee() nounwind {
353 call void asm sideeffect "nop", "~{z8},~{p4}"()
354 ret <vscale x 4 x i32> zeroinitializer
357 ; CHECKCSR-LABEL: name: sve_signature_vec_arg_callee
358 ; CHECKCSR: callee-saved-register: '$z8'
359 ; CHECKCSR: callee-saved-register: '$p4'
360 ; CHECKCSR: RET_ReallyLR
361 define void @sve_signature_vec_arg_callee(<vscale x 4 x i32> %v) nounwind {
362 call void asm sideeffect "nop", "~{z8},~{p4}"()