1 # RUN: llc -mattr=+sve -mtriple=aarch64-none-linux-gnu -run-pass=prologepilog %s -o - | FileCheck %s
2 # RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+sve -start-before=prologepilog %s -o - | FileCheck %s --check-prefix=ASM
3 # RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+sve -start-before=prologepilog %s -filetype=obj -o %t
4 # RUN: llvm-objdump --dwarf=frames %t | FileCheck %s --check-prefix=UNWINDINFO
7 # Test allocation and deallocation of SVE objects on the stack,
8 # as well as using a combination of scalable and non-scalable
9 # offsets to access the SVE on the stack.
11 # SVE objects are allocated below the (scalar) callee saves,
12 # and above spills/locals and the alignment gap, e.g.
16 # +-------------+ <- SP before call
18 # | Frame record| (if available)
19 # |-------------| <- FP (if available)
22 # |/////////////| alignment gap.
26 # +-------------+ <- SP after call and frame-setup
30 define void @test_allocate_sve() uwtable { entry: unreachable }
31 define void @test_allocate_sve_gpr_callee_saves() uwtable { entry: unreachable }
32 define void @test_allocate_sve_gpr_realigned() uwtable { entry: unreachable }
33 define void @test_address_sve() uwtable { entry: unreachable }
34 define void @test_address_sve_fp() uwtable { entry: unreachable }
35 define void @test_stack_arg_sve() uwtable { entry: unreachable }
36 define void @test_address_sve_out_of_range() uwtable { entry: unreachable }
37 define void @test_address_gpr_vla() uwtable { entry: unreachable }
38 define aarch64_sve_vector_pcs void @save_restore_pregs_sve() uwtable { entry: unreachable }
39 define aarch64_sve_vector_pcs void @save_restore_zregs_sve() uwtable { entry: unreachable }
40 define aarch64_sve_vector_pcs void @save_restore_sve() uwtable { entry: unreachable }
41 define aarch64_sve_vector_pcs void @save_restore_sve_realign() uwtable { entry: unreachable }
42 define aarch64_sve_vector_pcs void @frame_layout() uwtable { entry: unreachable }
43 define void @fp_relative_index_with_float_save() uwtable { entry: unreachable }
44 define void @fp_relative_that_is_not_a_multiple_of_VLx16() uwtable { entry: unreachable }
48 # |scratchreg| // x29 is used as scratch reg.
50 # | %stack.0 | // scalable SVE object of n * 18 bytes, aligned to 16 bytes,
51 # | | // to be materialized with 2*ADDVL (<=> 2 * n * 16bytes)
53 # | %stack.1 | // not scalable
56 # CHECK-LABEL: name: test_allocate_sve
57 # CHECK: stackSize: 32
61 # CHECK: early-clobber $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -16
62 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
63 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
64 # CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
65 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 32
66 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2
67 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22
69 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2
70 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 32
71 # CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
72 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16
73 # CHECK-NEXT: $sp, $[[SCRATCH]] = frame-destroy LDRXpost $sp, 16
74 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
75 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
76 # CHECK-NEXT: RET_ReallyLR
78 # ASM-LABEL: test_allocate_sve:
79 # ASM: .cfi_def_cfa_offset 16
80 # ASM-NEXT: .cfi_offset w29, -16
81 # ASM: .cfi_def_cfa_offset 32
82 # ASM: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 32 + 16 * VG
83 # ASM: .cfi_def_cfa wsp, 32
84 # ASM: .cfi_def_cfa_offset 16
85 # ASM: .cfi_def_cfa_offset 0
86 # ASM-NEXT: .cfi_restore w29
89 # UNWINDINFO: DW_CFA_def_cfa_offset: +16
90 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
91 # UNWINDINFO: DW_CFA_def_cfa_offset: +32
92 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +32, DW_OP_plus, DW_OP_consts +16, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
93 # UNWINDINFO: DW_CFA_def_cfa: reg31 +32
94 # UNWINDINFO: DW_CFA_def_cfa_offset: +16
95 # UNWINDINFO: DW_CFA_def_cfa_offset: +0
96 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
99 name: test_allocate_sve
101 - { id: 0, stack-id: scalable-vector, size: 18, alignment: 2 }
102 - { id: 1, stack-id: default, size: 16, alignment: 8 }
109 # | x20, x21 | // callee saves
110 # |scratchreg| // x29 is used as scratch reg.
112 # | %stack.0 | // scalable objects
114 # | %stack.1 | // not scalable
117 # CHECK-LABEL: name: test_allocate_sve_gpr_callee_saves
118 # CHECK: stackSize: 48
121 # CHECK-NEXT: liveins:
123 # CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -32
124 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 32
125 # CHECK-NEXT: frame-setup STPXi killed $x21, killed $x20, $sp, 2
126 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w20, -8
127 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w21, -16
128 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -32
129 # CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
130 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 48
131 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2
132 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x30, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22
135 # CHECK-NEXT: $x20 = IMPLICIT_DEF
136 # CHECK-NEXT: $x21 = IMPLICIT_DEF
137 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2
138 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 48
139 # CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
140 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 32
141 # CHECK-NEXT: $x21, $x20 = frame-destroy LDPXi $sp, 2
142 # CHECK-NEXT: $sp, $[[SCRATCH]] = frame-destroy LDRXpost $sp, 32
143 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
144 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w20
145 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w21
146 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
147 # CHECK-NEXT: RET_ReallyLR
149 # ASM-LABEL: test_allocate_sve_gpr_callee_saves:
150 # ASM: .cfi_def_cfa_offset 32
151 # ASM: .cfi_offset w20, -8
152 # ASM-NEXT: .cfi_offset w21, -16
153 # ASM-NEXT: .cfi_offset w29, -32
154 # ASM: .cfi_def_cfa_offset 48
155 # ASM: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x30, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 48 + 16 * VG
157 # ASM: .cfi_def_cfa wsp, 48
158 # ASM: .cfi_def_cfa_offset 32
159 # ASM: .cfi_def_cfa_offset 0
160 # ASM-NEXT: .cfi_restore w20
161 # ASM-NEXT: .cfi_restore w21
162 # ASM-NEXT: .cfi_restore w29
165 # UNWINDINFO: DW_CFA_def_cfa_offset: +32
166 # UNWINDINFO: DW_CFA_offset: reg20 -8
167 # UNWINDINFO-NEXT: DW_CFA_offset: reg21 -16
168 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -32
169 # UNWINDINFO: DW_CFA_def_cfa_offset: +48
170 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +48, DW_OP_plus, DW_OP_consts +16, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
172 # UNWINDINFO: DW_CFA_def_cfa: reg31 +48
173 # UNWINDINFO: DW_CFA_def_cfa_offset: +32
174 # UNWINDINFO: DW_CFA_def_cfa_offset: +0
175 # UNWINDINFO-NEXT: DW_CFA_restore: reg20
176 # UNWINDINFO-NEXT: DW_CFA_restore: reg21
177 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
179 name: test_allocate_sve_gpr_callee_saves
181 - { id: 0, stack-id: scalable-vector, size: 18, alignment: 2 }
182 - { id: 1, stack-id: default, size: 16, alignment: 8 }
191 # | lr, fp | // frame record
193 # | %stack.0 | // scalable objects
195 # |//////////| // alignment gap
196 # | %stack.1 | // not scalable
198 # CHECK-LABEL: name: test_allocate_sve_gpr_realigned
199 # CHECK: stackSize: 32
202 # CHECK-NEXT: liveins:
204 # CHECK-NEXT: $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2
205 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
206 # CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0
207 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w29, 16
208 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -8
209 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
210 # CHECK-NEXT: $[[TMP:x[0-9]+]] = frame-setup SUBXri $sp, 16, 0
211 # CHECK-NEXT: $[[TMP]] = frame-setup ADDVL_XXI $[[TMP]], -2
212 # CHECK-NEXT: $sp = frame-setup ANDXri killed $[[TMP]]
213 # CHECK-NEXT: $sp = frame-destroy ADDXri $fp, 0, 0
214 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
215 # CHECK-NEXT: $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2
216 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
217 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30
218 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
219 # CHECK-NEXT: RET_ReallyLR
221 # ASM-LABEL: test_allocate_sve_gpr_realigned:
222 # ASM: .cfi_def_cfa_offset 16
223 # ASM: .cfi_def_cfa w29, 16
224 # ASM-NEXT: .cfi_offset w30, -8
225 # ASM-NEXT: .cfi_offset w29, -16
227 # ASM: .cfi_def_cfa wsp, 16
228 # ASM: .cfi_def_cfa_offset 0
229 # ASM-NEXT: .cfi_restore w30
230 # ASM-NEXT: .cfi_restore w29
233 # UNWINDINFO: DW_CFA_def_cfa_offset: +16
234 # UNWINDINFO: DW_CFA_def_cfa: reg29 +16
235 # UNWINDINFO-NEXT: DW_CFA_offset: reg30 -8
236 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
238 # UNWINDINFO: DW_CFA_def_cfa: reg31 +16
239 # UNWINDINFO: DW_CFA_def_cfa_offset: +0
240 # UNWINDINFO-NEXT: DW_CFA_restore: reg30
241 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
244 name: test_allocate_sve_gpr_realigned
246 - { id: 0, stack-id: scalable-vector, size: 18, alignment: 2 }
247 - { id: 1, stack-id: default, size: 16, alignment: 32 }
254 # | x20, x21 | // callee saves
256 # | %stack.0 | // scalable @ SP + 16b + 32 scalable bytes
257 # | %stack.1 | // scalable @ SP + 16b + 16 scalable bytes
258 # | %stack.2 | // scalable @ SP + 16b + 14 scalable bytes
260 # | %stack.3 | // not scalable
263 # CHECK-LABEL: name: test_address_sve
264 # CHECK: stackSize: 32
267 # CHECK-NEXT: liveins:
269 # CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -16
270 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
271 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
272 # CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
273 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 32
274 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3
275 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22
277 # CHECK-NEXT: $[[TMP:x[0-9]+]] = ADDXri $sp, 16
278 # CHECK-NEXT: STR_ZXI $z0, killed $[[TMP]], 2
279 # CHECK-NEXT: $[[TMP:x[0-9]+]] = ADDXri $sp, 16
280 # CHECK-NEXT: STR_ZXI $z1, killed $[[TMP]], 1
281 # CHECK-NEXT: $[[TMP:x[0-9]+]] = ADDXri $sp, 16
282 # CHECK-NEXT: STR_PXI $p0, killed $[[TMP]], 7
284 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3
285 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 32
287 # CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
288 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16
289 # CHECK-NEXT: $sp, $[[SCRATCH]] = frame-destroy LDRXpost $sp, 16
290 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
291 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
292 # CHECK-NEXT: RET_ReallyLR
294 # ASM-LABEL: test_address_sve:
295 # ASM: .cfi_def_cfa_offset 16
296 # ASM-NEXT: .cfi_offset w29, -16
297 # ASM: .cfi_def_cfa_offset 32
298 # ASM: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 32 + 24 * VG
300 # ASM: .cfi_def_cfa wsp, 32
301 # ASM: .cfi_def_cfa_offset 16
302 # ASM: .cfi_def_cfa_offset 0
303 # ASM-NEXT: .cfi_restore w29
305 # UNWINDINFO: DW_CFA_def_cfa_offset: +16
306 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
307 # UNWINDINFO: DW_CFA_def_cfa_offset: +32
308 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +32, DW_OP_plus, DW_OP_consts +24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
310 # UNWINDINFO: DW_CFA_def_cfa: reg31 +32
311 # UNWINDINFO: DW_CFA_def_cfa_offset: +16
312 # UNWINDINFO: DW_CFA_def_cfa_offset: +0
313 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
316 name: test_address_sve
320 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 8 }
321 - { id: 1, stack-id: scalable-vector, size: 16, alignment: 8 }
322 - { id: 2, stack-id: scalable-vector, size: 2, alignment: 2 }
323 - { id: 3, stack-id: default, size: 16, alignment: 8 }
326 liveins: $z0, $z1, $p0
328 STR_ZXI $z0, %stack.0, 0
329 STR_ZXI $z1, %stack.1, 0
330 STR_PXI $p0, %stack.2, 0
336 # | x20, x21 | // callee saves
337 # | lr, fp | // frame record
338 # +-----------+ <- FP
339 # | %stack.0 | // scalable @ FP - 16 scalable bytes
340 # | %stack.1 | // scalable @ FP - 32 scalable bytes
341 # | %stack.2 | // scalable @ FP - 34 scalable bytes
343 # | %stack.3 | // not scalable
344 # +-----------+ <- SP
346 # CHECK-LABEL: name: test_address_sve_fp
347 # CHECK: stackSize: 32
350 # CHECK-NEXT: liveins:
352 # CHECK-NEXT: $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2
353 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
354 # CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0
355 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w29, 16
356 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -8
357 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
358 # CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
359 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3
361 # CHECK-NEXT: STR_ZXI $z0, $fp, -1
362 # CHECK-NEXT: STR_ZXI $z1, $fp, -2
363 # CHECK-NEXT: STR_PXI $p0, $fp, -17
365 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3
366 # CHECK: $sp = frame-destroy ADDXri $sp, 16, 0
367 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
368 # CHECK-NEXT: $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2
369 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
370 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30
371 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
372 # CHECK-NEXT: RET_ReallyLR
374 # ASM-LABEL: test_address_sve_fp:
375 # ASM: .cfi_def_cfa_offset 16
376 # ASM: .cfi_def_cfa w29, 16
377 # ASM-NEXT: .cfi_offset w30, -8
378 # ASM-NEXT: .cfi_offset w29, -16
380 # ASM: .cfi_def_cfa wsp, 16
381 # ASM: .cfi_def_cfa_offset 0
382 # ASM-NEXT: .cfi_restore w30
383 # ASM-NEXT: .cfi_restore w29
385 # UNWINDINFO: DW_CFA_def_cfa_offset: +16
386 # UNWINDINFO: DW_CFA_def_cfa: reg29 +16
387 # UNWINDINFO-NEXT: DW_CFA_offset: reg30 -8
388 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
390 # UNWINDINFO: DW_CFA_def_cfa: reg31 +16
391 # UNWINDINFO: DW_CFA_def_cfa_offset: +0
392 # UNWINDINFO-NEXT: DW_CFA_restore: reg30
393 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
395 name: test_address_sve_fp
398 isFrameAddressTaken: true
400 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 8 }
401 - { id: 1, stack-id: scalable-vector, size: 16, alignment: 8 }
402 - { id: 2, stack-id: scalable-vector, size: 2, alignment: 2 }
403 - { id: 3, stack-id: default, size: 16, alignment: 8 }
406 liveins: $z0, $z1, $p0
408 STR_ZXI $z0, %stack.0, 0
409 STR_ZXI $z1, %stack.1, 0
410 STR_PXI $p0, %stack.2, 0
416 # | %fstack.1 | // stack arg @ SP + 16 scalable bytes + 32 bytes.
418 # |callee save| // register saved as scratch reg.
420 # | %stack.0 | // vector of 16 scalable bytes
422 # | %stack.1 | // not scalable, 16 bytes
423 # +-----------+ <- SP
424 # CHECK-LABEL: name: test_stack_arg_sve
425 # CHECK: stackSize: 32
428 # CHECK-NEXT: liveins:
430 # CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -16
431 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
432 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
434 # CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
435 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 32
436 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1
437 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22
438 # CHECK: $[[TMP:x[0-9]+]] = ADDVL_XXI $sp, 1
439 # CHECK-NEXT: $x0 = LDRXui killed $[[TMP]], 4
441 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1
442 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 32
443 # CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
444 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16
445 # CHECK-NEXT: $sp, $[[SCRATCH]] = frame-destroy LDRXpost $sp, 16
446 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
447 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
448 # CHECK-NEXT: RET_ReallyLR
450 # ASM-LABEL: test_stack_arg_sve:
451 # ASM: .cfi_def_cfa_offset 16
452 # ASM-NEXT: .cfi_offset w29, -16
453 # ASM: .cfi_def_cfa_offset 32
454 # ASM: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 32 + 8 * VG
456 # ASM: .cfi_def_cfa wsp, 32
457 # ASM: .cfi_def_cfa_offset 16
458 # ASM: .cfi_def_cfa_offset 0
459 # ASM-NEXT: .cfi_restore w29
461 # UNWINDINFO: DW_CFA_def_cfa_offset: +16
462 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
463 # UNWINDINFO: DW_CFA_def_cfa_offset: +32
464 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +32, DW_OP_plus, DW_OP_consts +8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
466 # UNWINDINFO: DW_CFA_def_cfa: reg31 +32
467 # UNWINDINFO: DW_CFA_def_cfa_offset: +16
468 # UNWINDINFO: DW_CFA_def_cfa_offset: +0
469 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
471 name: test_stack_arg_sve
473 - { id: 0, stack-id: default, size: 16, alignment: 16, offset: 0 }
475 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }
476 - { id: 1, stack-id: default, size: 16, alignment: 16 }
481 $x0 = LDRXui %fixed-stack.0, 0
485 # Test that the address to access an SVE data vector at an offset that
486 # does not fit its immediate, is correctly materialized.
488 # |calleesave| // register saved as scratch reg.
490 # | %stack.0 | // one SVE data object @ SP + 256 scalable bytes.
493 # |:%stack.1:| // Large object
497 # CHECK-LABEL: name: test_address_sve_out_of_range
498 # CHECK: stackSize: 16
501 # CHECK-NEXT: liveins:
503 # CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -16
504 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
505 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
506 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
507 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x02, 0x92, 0x2e, 0x00, 0x1e, 0x22
508 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
509 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x04, 0x92, 0x2e, 0x00, 0x1e, 0x22
510 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
511 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x06, 0x92, 0x2e, 0x00, 0x1e, 0x22
512 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
513 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22
514 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
515 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x0a, 0x92, 0x2e, 0x00, 0x1e, 0x22
516 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
517 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x0c, 0x92, 0x2e, 0x00, 0x1e, 0x22
518 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
519 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x0e, 0x92, 0x2e, 0x00, 0x1e, 0x22
520 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
521 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22
522 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1
523 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x88, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22
525 # CHECK-NEXT: $[[TMP2:x[0-9]+]] = ADDVL_XXI $sp, 1
526 # CHECK-NEXT: STR_ZXI $z0, killed $[[TMP2]], 255
528 # CHECK-NEXT: $[[TMP2:x[0-9]+]] = ADDPL_XXI $sp, 1
529 # CHECK-NEXT: STR_PXI $p0, killed $[[TMP2]], 255
531 # CHECK: $sp = frame-destroy ADDVL_XXI $sp, 31
532 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x90, 0x0e, 0x92, 0x2e, 0x00, 0x1e, 0x22
533 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31
534 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x98, 0x0c, 0x92, 0x2e, 0x00, 0x1e, 0x22
535 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31
536 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xa0, 0x0a, 0x92, 0x2e, 0x00, 0x1e, 0x22
537 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31
538 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xa8, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22
539 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31
540 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xb0, 0x06, 0x92, 0x2e, 0x00, 0x1e, 0x22
541 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31
542 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xb8, 0x04, 0x92, 0x2e, 0x00, 0x1e, 0x22
543 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31
544 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xc0, 0x02, 0x92, 0x2e, 0x00, 0x1e, 0x22
545 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31
546 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xc8, 0x00, 0x92, 0x2e, 0x00, 0x1e, 0x22
547 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 9
548 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
549 # CHECK-NEXT: $sp, $[[SCRATCH]] = frame-destroy LDRXpost $sp, 16
550 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
551 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
552 # CHECK-NEXT: RET_ReallyLR
554 # ASM-LABEL: test_address_sve_out_of_range:
555 # ASM: .cfi_def_cfa_offset 16
556 # ASM-NEXT: .cfi_offset w29, -16
557 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x02, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 256 * VG
558 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x04, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 512 * VG
559 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x06, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 768 * VG
560 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1024 * VG
561 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x0a, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1280 * VG
562 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x0c, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1536 * VG
563 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x0e, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1792 * VG
564 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 2048 * VG
565 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x88, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 2056 * VG
567 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x90, 0x0e, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1808 * VG
568 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x98, 0x0c, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1560 * VG
569 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xa0, 0x0a, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1312 * VG
570 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xa8, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1064 * VG
571 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xb0, 0x06, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 816 * VG
572 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xb8, 0x04, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 568 * VG
573 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xc0, 0x02, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 320 * VG
574 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xc8, 0x00, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 72 * VG
575 # ASM: .cfi_def_cfa wsp, 16
576 # ASM: .cfi_def_cfa_offset 0
577 # ASM-NEXT: .cfi_restore w29
579 # UNWINDINFO: DW_CFA_def_cfa_offset: +16
580 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
581 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +256, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
582 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +512, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
583 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +768, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
584 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1024, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
585 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1280, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
586 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1536, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
587 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1792, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
588 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +2048, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
589 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +2056, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
591 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1808, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
592 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1560, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
593 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1312, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
594 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1064, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
595 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +816, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
596 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +568, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
597 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +320, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
598 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +72, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
599 # UNWINDINFO: DW_CFA_def_cfa: reg31 +16
600 # UNWINDINFO: DW_CFA_def_cfa_offset: +0
601 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
603 name: test_address_sve_out_of_range
607 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }
608 - { id: 1, stack-id: scalable-vector, size: 3584, alignment: 16 }
609 - { id: 2, stack-id: scalable-vector, size: 512, alignment: 16 }
615 STR_ZXI $z0, %stack.0, 0
616 STR_PXI $p0, %stack.1, 0
621 # Test that non-SVE objects are accessed from BP when there are
622 # variable length arrays, because it will be more expensive to
623 # access from the FP when there are also SVE objects on the stack.
626 # | %stack.0 | // 16 scalable bytes
627 # +----------+ <- @FP - 16 scalable bytes
628 # | %stack.1 | // 16 bytes
629 # +----------+ <- @BP
630 # : %stack.2 : // variable length
633 # CHECK-LABEL: name: test_address_gpr_vla
635 # CHECK-NEXT: liveins:
637 # CHECK-NEXT: early-clobber $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -4
638 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 32
639 # CHECK-NEXT: frame-setup STRXui killed $x19, $sp, 2
640 # CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0
641 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w29, 32
642 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w19, -16
643 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -24
644 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -32
645 # CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
646 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1
647 # CHECK-NEXT: $x19 = ADDXri $sp, 0, 0
648 # CHECK-NEXT: STRXui $xzr, $x19, 0
649 # CHECK-NEXT: $sp = frame-destroy ADDXri $fp, 0, 0
650 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 32
651 # CHECK-NEXT: $x19 = frame-destroy LDRXui $sp, 2
652 # CHECK-NEXT: early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 4
653 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
654 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w19
655 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30
656 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
657 # CHECK-NEXT: RET_ReallyLR
659 # ASM-LABEL: test_address_gpr_vla:
660 # ASM: .cfi_def_cfa_offset 32
661 # ASM: .cfi_def_cfa w29, 32
662 # ASM-NEXT: .cfi_offset w19, -16
663 # ASM-NEXT: .cfi_offset w30, -24
664 # ASM-NEXT: .cfi_offset w29, -32
666 # ASM: .cfi_def_cfa wsp, 32
667 # ASM: .cfi_def_cfa_offset 0
668 # ASM-NEXT: .cfi_restore w19
669 # ASM-NEXT: .cfi_restore w30
670 # ASM-NEXT: .cfi_restore w29
672 # UNWINDINFO: DW_CFA_def_cfa_offset: +32
673 # UNWINDINFO: DW_CFA_def_cfa: reg29 +32
674 # UNWINDINFO-NEXT: DW_CFA_offset: reg19 -16
675 # UNWINDINFO-NEXT: DW_CFA_offset: reg30 -24
676 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -32
678 # UNWINDINFO: DW_CFA_def_cfa: reg31 +32
679 # UNWINDINFO: DW_CFA_def_cfa_offset: +0
680 # UNWINDINFO-NEXT: DW_CFA_restore: reg19
681 # UNWINDINFO-NEXT: DW_CFA_restore: reg30
682 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
684 name: test_address_gpr_vla
688 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 8 }
689 - { id: 1, stack-id: default, size: 16, alignment: 8 }
690 - { id: 2, stack-id: default, type: variable-sized }
695 STRXui $xzr, %stack.1, 0
700 # CHECK-LABEL: name: save_restore_pregs_sve
701 # CHECK: $sp = frame-setup STRXpre killed $fp, $sp, -16
702 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
703 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
704 # CHECK: $sp = frame-setup ADDVL_XXI $sp, -1
705 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22
706 # CHECK: frame-setup STR_PXI killed $p6, $sp, 5
707 # CHECK: frame-setup STR_PXI killed $p5, $sp, 6
708 # CHECK: frame-setup STR_PXI killed $p4, $sp, 7
709 # CHECK: $sp = frame-setup SUBXri $sp, 32, 0
710 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x30, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22
712 # CHECK: $sp = frame-destroy ADDXri $sp, 32, 0
713 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22
714 # CHECK: $p6 = frame-destroy LDR_PXI $sp, 5
715 # CHECK: $p5 = frame-destroy LDR_PXI $sp, 6
716 # CHECK: $p4 = frame-destroy LDR_PXI $sp, 7
717 # CHECK: $sp = frame-destroy ADDVL_XXI $sp, 1
718 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
719 # CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.4)
720 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
721 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
722 # CHECK-NEXT: RET_ReallyLR
725 # ASM-LABEL: save_restore_pregs_sve:
726 # ASM: .cfi_def_cfa_offset 16
727 # ASM-NEXT: .cfi_offset w29, -16
728 # ASM: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 8 * VG
729 # ASM: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x30, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 48 + 8 * VG
731 # ASM: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 8 * VG
732 # ASM: .cfi_def_cfa wsp, 16
733 # ASM: .cfi_def_cfa_offset 0
734 # ASM-NEXT: .cfi_restore w29
736 # UNWINDINFO: DW_CFA_def_cfa_offset: +16
737 # UNWINDINFO: DW_CFA_offset: reg29 -16
738 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
739 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +48, DW_OP_plus, DW_OP_consts +8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
741 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
742 # UNWINDINFO: DW_CFA_def_cfa: reg31 +16
743 # UNWINDINFO: DW_CFA_def_cfa_offset: +0
744 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
746 name: save_restore_pregs_sve
748 - { id: 0, stack-id: default, size: 32, alignment: 16 }
759 # CHECK-LABEL: name: save_restore_zregs_sve
760 # CHECK: $sp = frame-setup STRXpre killed $fp, $sp, -16
761 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
762 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
763 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3
764 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22
765 # CHECK-NEXT: frame-setup STR_ZXI killed $z10, $sp, 0
766 # CHECK-NEXT: frame-setup STR_ZXI killed $z9, $sp, 1
767 # CHECK-NEXT: frame-setup STR_ZXI killed $z8, $sp, 2
768 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22
769 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22
770 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22
771 # CHECK-NEXT: $sp = frame-setup SUBXri $sp, 32, 0
772 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x30, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22
774 # CHECK: $sp = frame-destroy ADDXri $sp, 32, 0
775 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22
776 # CHECK-NEXT: $z10 = frame-destroy LDR_ZXI $sp, 0
777 # CHECK-NEXT: $z9 = frame-destroy LDR_ZXI $sp, 1
778 # CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 2
779 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3
780 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
781 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z8
782 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z9
783 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z10
784 # CHECK-NEXT: $sp, $fp = frame-destroy LDRXpost $sp, 16
785 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
786 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
787 # CHECK-NEXT: RET_ReallyLR
789 # ASM-LABEL: save_restore_zregs_sve:
790 # ASM: .cfi_def_cfa_offset 16
791 # ASM-NEXT: .cfi_offset w29, -16
792 # ASM: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 24 * VG
793 # ASM: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 16 - 8 * VG
794 # ASM-NEXT: .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9 @ cfa - 16 - 16 * VG
795 # ASM-NEXT: .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10 @ cfa - 16 - 24 * VG
796 # ASM: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x30, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 48 + 24 * VG
798 # ASM: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 24 * VG
799 # ASM: .cfi_def_cfa wsp, 16
800 # ASM-NEXT: .cfi_restore z8
801 # ASM-NEXT: .cfi_restore z9
802 # ASM-NEXT: .cfi_restore z10
803 # ASM: .cfi_def_cfa_offset 0
804 # ASM-NEXT: .cfi_restore w29
806 # UNWINDINFO: DW_CFA_def_cfa_offset: +16
807 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
808 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
809 # UNWINDINFO: DW_CFA_expression: reg72 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
810 # UNWINDINFO-NEXT: DW_CFA_expression: reg73 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -16, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
811 # UNWINDINFO-NEXT: DW_CFA_expression: reg74 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
812 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +48, DW_OP_plus, DW_OP_consts +24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
814 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
815 # UNWINDINFO: DW_CFA_def_cfa: reg31 +16
816 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg104
817 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg105
818 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg106
819 # UNWINDINFO: DW_CFA_def_cfa_offset: +0
820 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
822 name: save_restore_zregs_sve
824 - { id: 0, stack-id: default, size: 32, alignment: 16 }
835 # Test allocation/deallocation of the stack frame together with the
836 # saving/restoring of callee save registers. Fixed-stack objects
837 # are allocated before the callee-saves.
838 # This also adds some non-SVE callee-saves, to ensure that those are
841 # CHECK-LABEL: name: save_restore_sve
842 # CHECK: $sp = frame-setup STPXpre killed ${{[a-z0-9]+}}, killed $x21, $sp, -4
843 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 32
844 # CHECK-NEXT: frame-setup STPXi killed $x20, killed $x19, $sp, 2
845 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w19, -8
846 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w20, -16
847 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w21, -24
848 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -32
850 # CHECK: $sp = frame-setup ADDVL_XXI $sp, -18
851 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x90, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22
852 # CHECK: frame-setup STR_PXI killed $p15, $sp, 4
853 # CHECK: frame-setup STR_PXI killed $p14, $sp, 5
854 # CHECK: frame-setup STR_PXI killed $p5, $sp, 14
855 # CHECK: frame-setup STR_PXI killed $p4, $sp, 15
856 # CHECK: frame-setup STR_ZXI killed $z23, $sp, 2
857 # CHECK: frame-setup STR_ZXI killed $z22, $sp, 3
858 # CHECK: frame-setup STR_ZXI killed $z9, $sp, 16
859 # CHECK: frame-setup STR_ZXI killed $z8, $sp, 17
860 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x48, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22
861 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x49, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22
862 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4a, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22
863 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4b, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x60, 0x92, 0x2e, 0x00, 0x1e, 0x22
864 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4c, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x58, 0x92, 0x2e, 0x00, 0x1e, 0x22
865 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4d, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x50, 0x92, 0x2e, 0x00, 0x1e, 0x22
866 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4e, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x48, 0x92, 0x2e, 0x00, 0x1e, 0x22
867 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4f, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x40, 0x92, 0x2e, 0x00, 0x1e, 0x22
868 # CHECK: $sp = frame-setup SUBXri $sp, 32, 0
869 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0e, 0x8f, 0x00, 0x11, 0xc0, 0x00, 0x22, 0x11, 0x90, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22
870 # CHECK: $sp = frame-setup ADDVL_XXI $sp, -1
871 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0e, 0x8f, 0x00, 0x11, 0xc0, 0x00, 0x22, 0x11, 0x98, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22
873 # CHECK: $sp = frame-destroy ADDXri $sp, 32, 0
874 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x98, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22
875 # CHECK: $sp = frame-destroy ADDVL_XXI $sp, 1
876 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x90, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22
877 # CHECK: $z23 = frame-destroy LDR_ZXI $sp, 2
878 # CHECK: $z22 = frame-destroy LDR_ZXI $sp, 3
879 # CHECK: $z9 = frame-destroy LDR_ZXI $sp, 16
880 # CHECK: $z8 = frame-destroy LDR_ZXI $sp, 17
881 # CHECK: $p15 = frame-destroy LDR_PXI $sp, 4
882 # CHECK: $p14 = frame-destroy LDR_PXI $sp, 5
883 # CHECK: $p5 = frame-destroy LDR_PXI $sp, 14
884 # CHECK: $p4 = frame-destroy LDR_PXI $sp, 15
885 # CHECK: $sp = frame-destroy ADDVL_XXI $sp, 18
886 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 32
887 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z8
888 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z9
889 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z10
890 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z11
891 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z12
892 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z13
893 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z14
894 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z15
896 # CHECK: $x20, $x19 = frame-destroy LDPXi $sp, 2
897 # CHECK: $sp, ${{[a-z0-9]+}}, $x21 = frame-destroy LDPXpost $sp, 4
898 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
899 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w19
900 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w20
901 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w21
902 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
904 # CHECK-NEXT: RET_ReallyLR
906 # ASM-LABEL: save_restore_sve:
907 # ASM: .cfi_def_cfa_offset 32
908 # ASM: .cfi_offset w19, -8
909 # ASM-NEXT: .cfi_offset w20, -16
910 # ASM-NEXT: .cfi_offset w21, -24
911 # ASM-NEXT: .cfi_offset w29, -32
912 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x90, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 32 + 144 * VG
913 # ASM: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 32 - 8 * VG
914 # ASM-NEXT: .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9 @ cfa - 32 - 16 * VG
915 # ASM-NEXT: .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10 @ cfa - 32 - 24 * VG
916 # ASM-NEXT: .cfi_escape 0x10, 0x4b, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x60, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d11 @ cfa - 32 - 32 * VG
917 # ASM-NEXT: .cfi_escape 0x10, 0x4c, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x58, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d12 @ cfa - 32 - 40 * VG
918 # ASM-NEXT: .cfi_escape 0x10, 0x4d, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x50, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d13 @ cfa - 32 - 48 * VG
919 # ASM-NEXT: .cfi_escape 0x10, 0x4e, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x48, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d14 @ cfa - 32 - 56 * VG
920 # ASM-NEXT: .cfi_escape 0x10, 0x4f, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x40, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d15 @ cfa - 32 - 64 * VG
921 # ASM: .cfi_escape 0x0f, 0x0e, 0x8f, 0x00, 0x11, 0xc0, 0x00, 0x22, 0x11, 0x90, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 64 + 144 * VG
922 # ASM: .cfi_escape 0x0f, 0x0e, 0x8f, 0x00, 0x11, 0xc0, 0x00, 0x22, 0x11, 0x98, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 64 + 152 * VG
924 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x98, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 32 + 152 * VG
925 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x90, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 32 + 144 * VG
926 # ASM: .cfi_def_cfa wsp, 32
927 # ASM-NEXT: .cfi_restore z8
928 # ASM-NEXT: .cfi_restore z9
929 # ASM-NEXT: .cfi_restore z10
930 # ASM-NEXT: .cfi_restore z11
931 # ASM-NEXT: .cfi_restore z12
932 # ASM-NEXT: .cfi_restore z13
933 # ASM-NEXT: .cfi_restore z14
934 # ASM-NEXT: .cfi_restore z15
935 # ASM: .cfi_def_cfa_offset 0
936 # ASM-NEXT: .cfi_restore w19
937 # ASM-NEXT: .cfi_restore w20
938 # ASM-NEXT: .cfi_restore w21
939 # ASM-NEXT: .cfi_restore w29
941 # UNWINDINFO: DW_CFA_def_cfa_offset: +32
942 # UNWINDINFO: DW_CFA_offset: reg19 -8
943 # UNWINDINFO-NEXT: DW_CFA_offset: reg20 -16
944 # UNWINDINFO-NEXT: DW_CFA_offset: reg21 -24
945 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -32
946 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +32, DW_OP_plus, DW_OP_consts +144, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
947 # UNWINDINFO: DW_CFA_expression: reg72 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
948 # UNWINDINFO-NEXT: DW_CFA_expression: reg73 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -16, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
949 # UNWINDINFO-NEXT: DW_CFA_expression: reg74 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
950 # UNWINDINFO-NEXT: DW_CFA_expression: reg75 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -32, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
951 # UNWINDINFO-NEXT: DW_CFA_expression: reg76 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -40, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
952 # UNWINDINFO-NEXT: DW_CFA_expression: reg77 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -48, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
953 # UNWINDINFO-NEXT: DW_CFA_expression: reg78 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -56, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
954 # UNWINDINFO-NEXT: DW_CFA_expression: reg79 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -64, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
955 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +64, DW_OP_plus, DW_OP_consts +144, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
956 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +64, DW_OP_plus, DW_OP_consts +152, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
958 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +32, DW_OP_plus, DW_OP_consts +152, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
959 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +32, DW_OP_plus, DW_OP_consts +144, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
960 # UNWINDINFO: DW_CFA_def_cfa: reg31 +32
961 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg104
962 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg105
963 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg106
964 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg107
965 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg108
966 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg109
967 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg110
968 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg111
969 # UNWINDINFO: DW_CFA_def_cfa_offset: +0
970 # UNWINDINFO-NEXT: DW_CFA_restore: reg19
971 # UNWINDINFO-NEXT: DW_CFA_restore: reg20
972 # UNWINDINFO-NEXT: DW_CFA_restore: reg21
973 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
975 name: save_restore_sve
977 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }
978 - { id: 1, stack-id: default, size: 32, alignment: 16 }
982 $z8_z9_z10_z11 = IMPLICIT_DEF
983 $z12_z13_z14_z15 = IMPLICIT_DEF
984 $z16_z17_z18_z19 = IMPLICIT_DEF
985 $z20_z21_z22_z23 = IMPLICIT_DEF
986 $z24_z25_z26_z27 = IMPLICIT_DEF
987 $z28_z29_z30_z31 = IMPLICIT_DEF
1008 # Test allocation/deallocation of the stack frame together with the
1009 # saving/restoring of callee save registers. Fixed-stack objects
1010 # are allocated before the callee-saves.
1012 # CHECK-LABEL: name: save_restore_sve_realign
1013 # CHECK: $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2
1014 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
1015 # CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0
1016 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w29, 16
1017 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -8
1018 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
1019 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -18
1020 # CHECK-NEXT: STR_PXI killed $p15, $sp, 4
1021 # CHECK-NEXT: STR_PXI killed $p14, $sp, 5
1022 # CHECK: STR_PXI killed $p5, $sp, 14
1023 # CHECK-NEXT: STR_PXI killed $p4, $sp, 15
1024 # CHECK-NEXT: STR_ZXI killed $z23, $sp, 2
1025 # CHECK-NEXT: STR_ZXI killed $z22, $sp, 3
1026 # CHECK: STR_ZXI killed $z9, $sp, 16
1027 # CHECK-NEXT: STR_ZXI killed $z8, $sp, 17
1028 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22
1029 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22
1030 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22
1031 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4b, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x60, 0x92, 0x2e, 0x00, 0x1e, 0x22
1032 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4c, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x58, 0x92, 0x2e, 0x00, 0x1e, 0x22
1033 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4d, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x50, 0x92, 0x2e, 0x00, 0x1e, 0x22
1034 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4e, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x48, 0x92, 0x2e, 0x00, 0x1e, 0x22
1035 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4f, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x40, 0x92, 0x2e, 0x00, 0x1e, 0x22
1036 # CHECK-NEXT: $[[TMP:x[0-9]+]] = frame-setup SUBXri $sp, 16, 0
1037 # CHECK-NEXT: $[[TMP]] = frame-setup ADDVL_XXI $[[TMP]], -1
1038 # CHECK-NEXT: $sp = frame-setup ANDXri killed $[[TMP]]
1040 # CHECK: $sp = frame-destroy ADDVL_XXI $fp, -18
1041 # CHECK: $z23 = frame-destroy LDR_ZXI $sp, 2
1042 # CHECK-NEXT: $z22 = frame-destroy LDR_ZXI $sp, 3
1043 # CHECK: $z9 = frame-destroy LDR_ZXI $sp, 16
1044 # CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 17
1045 # CHECK-NEXT: $p15 = frame-destroy LDR_PXI $sp, 4
1046 # CHECK-NEXT: $p14 = frame-destroy LDR_PXI $sp, 5
1047 # CHECK: $p5 = frame-destroy LDR_PXI $sp, 14
1048 # CHECK-NEXT: $p4 = frame-destroy LDR_PXI $sp, 15
1049 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z8
1050 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z9
1051 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z10
1052 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z11
1053 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z12
1054 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z13
1055 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z14
1056 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z15
1057 # CHECK-NEXT: $sp = frame-destroy ADDXri $fp, 0, 0
1058 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
1059 # CHECK-NEXT: $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2
1060 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
1061 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30
1062 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
1063 # CHECK-NEXT: RET_ReallyLR
1065 # ASM-LABEL: save_restore_sve_realign:
1066 # ASM: .cfi_def_cfa_offset 16
1067 # ASM: .cfi_def_cfa w29, 16
1068 # ASM-NEXT: .cfi_offset w30, -8
1069 # ASM-NEXT: .cfi_offset w29, -16
1070 # ASM: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 16 - 8 * VG
1071 # ASM-NEXT: .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9 @ cfa - 16 - 16 * VG
1072 # ASM-NEXT: .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10 @ cfa - 16 - 24 * VG
1073 # ASM-NEXT: .cfi_escape 0x10, 0x4b, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x60, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d11 @ cfa - 16 - 32 * VG
1074 # ASM-NEXT: .cfi_escape 0x10, 0x4c, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x58, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d12 @ cfa - 16 - 40 * VG
1075 # ASM-NEXT: .cfi_escape 0x10, 0x4d, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x50, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d13 @ cfa - 16 - 48 * VG
1076 # ASM-NEXT: .cfi_escape 0x10, 0x4e, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x48, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d14 @ cfa - 16 - 56 * VG
1077 # ASM-NEXT: .cfi_escape 0x10, 0x4f, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x40, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d15 @ cfa - 16 - 64 * VG
1079 # ASM: .cfi_restore z8
1080 # ASM-NEXT: .cfi_restore z9
1081 # ASM-NEXT: .cfi_restore z10
1082 # ASM-NEXT: .cfi_restore z11
1083 # ASM-NEXT: .cfi_restore z12
1084 # ASM-NEXT: .cfi_restore z13
1085 # ASM-NEXT: .cfi_restore z14
1086 # ASM-NEXT: .cfi_restore z15
1087 # ASM: .cfi_def_cfa wsp, 16
1088 # ASM: .cfi_def_cfa_offset 0
1089 # ASM-NEXT: .cfi_restore w30
1090 # ASM-NEXT: .cfi_restore w29
1092 # UNWINDINFO: DW_CFA_def_cfa_offset: +16
1093 # UNWINDINFO: DW_CFA_def_cfa: reg29 +16
1094 # UNWINDINFO-NEXT: DW_CFA_offset: reg30 -8
1095 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
1096 # UNWINDINFO: DW_CFA_expression: reg72 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1097 # UNWINDINFO-NEXT: DW_CFA_expression: reg73 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -16, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1098 # UNWINDINFO-NEXT: DW_CFA_expression: reg74 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1099 # UNWINDINFO-NEXT: DW_CFA_expression: reg75 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -32, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1100 # UNWINDINFO-NEXT: DW_CFA_expression: reg76 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -40, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1101 # UNWINDINFO-NEXT: DW_CFA_expression: reg77 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -48, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1102 # UNWINDINFO-NEXT: DW_CFA_expression: reg78 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -56, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1103 # UNWINDINFO-NEXT: DW_CFA_expression: reg79 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -64, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1105 # UNWINDINFO: DW_CFA_restore_extended: reg104
1106 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg105
1107 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg106
1108 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg107
1109 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg108
1110 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg109
1111 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg110
1112 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg111
1113 # UNWINDINFO: DW_CFA_def_cfa: reg31 +16
1114 # UNWINDINFO: DW_CFA_def_cfa_offset: +0
1115 # UNWINDINFO-NEXT: DW_CFA_restore: reg30
1116 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
1118 name: save_restore_sve_realign
1120 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }
1121 - { id: 1, stack-id: default, size: 16, alignment: 32 }
1125 $z8_z9_z10_z11 = IMPLICIT_DEF
1126 $z12_z13_z14_z15 = IMPLICIT_DEF
1127 $z16_z17_z18_z19 = IMPLICIT_DEF
1128 $z20_z21_z22_z23 = IMPLICIT_DEF
1129 $z24_z25_z26_z27 = IMPLICIT_DEF
1130 $z28_z29_z30_z31 = IMPLICIT_DEF
1146 # Frame layout should be:
1147 # +---------------------+ <- Old SP
1148 # | callee save z8 |@ -16
1149 # | callee save z23 |@ -32
1150 # | callee save p4 |@ -34
1151 # | callee save p15 |@ -48
1152 # | id #0 (size 32) |@ -80
1153 # | id #1 (size 4) |@ -84
1154 # | id #2 (size 16) |@ -112
1155 # | id #3 (size 2) |@ -114
1156 # | id #4 (size 16) |@ -144
1157 # | id #5 (size 2) |@ -146
1158 # +- - - - - - - - - - -+ <- New SP @-160
1159 # CHECK-LABEL: name: frame_layout
1161 # CHECK: - { id: 0, name: '', type: default, offset: -80, size: 32, alignment: 16,
1162 # CHECK-NEXT: stack-id: scalable-vector,
1163 # CHECK: - { id: 1, name: '', type: default, offset: -84, size: 4, alignment: 2,
1164 # CHECK-NEXT: stack-id: scalable-vector,
1165 # CHECK: - { id: 2, name: '', type: default, offset: -112, size: 16, alignment: 16,
1166 # CHECK-NEXT: stack-id: scalable-vector,
1167 # CHECK: - { id: 3, name: '', type: default, offset: -114, size: 2, alignment: 2,
1168 # CHECK-NEXT: stack-id: scalable-vector,
1169 # CHECK: - { id: 4, name: '', type: spill-slot, offset: -144, size: 16, alignment: 16,
1170 # CHECK-NEXT: stack-id: scalable-vector,
1171 # CHECK: - { id: 5, name: '', type: spill-slot, offset: -146, size: 2, alignment: 2,
1172 # CHECK-NEXT: stack-id: scalable-vector,
1173 # CHECK: - { id: 6, name: '', type: spill-slot, offset: -16, size: 16, alignment: 16,
1174 # CHECK-NEXT: stack-id: scalable-vector, callee-saved-register: '$z8',
1175 # CHECK: - { id: 7, name: '', type: spill-slot, offset: -32, size: 16, alignment: 16,
1176 # CHECK-NEXT: stack-id: scalable-vector, callee-saved-register: '$z23',
1177 # CHECK: - { id: 8, name: '', type: spill-slot, offset: -34, size: 2, alignment: 2,
1178 # CHECK-NEXT: stack-id: scalable-vector, callee-saved-register: '$p4',
1179 # CHECK: - { id: 9, name: '', type: spill-slot, offset: -36, size: 2, alignment: 2,
1180 # CHECK-NEXT: stack-id: scalable-vector, callee-saved-register: '$p15',
1181 # CHECK: - { id: 10, name: '', type: spill-slot, offset: -16, size: 8, alignment: 16,
1182 # CHECK-NEXT: stack-id: default, callee-saved-register: '$fp',
1184 # CHECK: bb.0.entry:
1185 # CHECK-NEXT: liveins:
1186 # CHECK-NEXT: {{ $}}
1187 # CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -16
1188 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
1189 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
1190 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3
1191 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22
1192 # CHECK-NEXT: STR_PXI killed $p15, $sp, 6
1193 # CHECK-NEXT: STR_PXI killed $p4, $sp, 7
1194 # CHECK-NEXT: STR_ZXI killed $z23, $sp, 1
1195 # CHECK-NEXT: STR_ZXI killed $z8, $sp, 2
1196 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22
1197 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -7
1198 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xd0, 0x00, 0x92, 0x2e, 0x00, 0x1e, 0x22
1200 # CHECK: $sp = frame-destroy ADDVL_XXI $sp, 7
1201 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22
1202 # CHECK-NEXT: $z23 = frame-destroy LDR_ZXI $sp, 1
1203 # CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 2
1204 # CHECK-NEXT: $p15 = frame-destroy LDR_PXI $sp, 6
1205 # CHECK-NEXT: $p4 = frame-destroy LDR_PXI $sp, 7
1206 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3
1207 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
1208 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z8
1209 # CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.10)
1210 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
1211 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
1212 # CHECK-NEXT: RET_ReallyLR
1214 # ASM-LABEL: frame_layout:
1215 # ASM: .cfi_def_cfa_offset 16
1216 # ASM-NEXT: .cfi_offset w29, -16
1217 # ASM: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 24 * VG
1218 # ASM: .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 16 - 8 * VG
1219 # ASM: .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xd0, 0x00, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 80 * VG
1221 # ASM: .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 24 * VG
1222 # ASM: .cfi_def_cfa wsp, 16
1223 # ASM-NEXT: .cfi_restore z8
1224 # ASM: .cfi_def_cfa_offset 0
1225 # ASM-NEXT: .cfi_restore w29
1227 # UNWINDINFO: DW_CFA_def_cfa_offset: +16
1228 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
1229 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1230 # UNWINDINFO: DW_CFA_expression: reg72 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1231 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +80, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1233 # UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1234 # UNWINDINFO: DW_CFA_def_cfa: reg31 +16
1235 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg104
1236 # UNWINDINFO: DW_CFA_def_cfa_offset: +0
1237 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
1241 - { id: 0, type: default, size: 32, alignment: 16, stack-id: scalable-vector }
1242 - { id: 1, type: default, size: 4, alignment: 2, stack-id: scalable-vector }
1243 - { id: 2, type: default, size: 16, alignment: 16, stack-id: scalable-vector }
1244 - { id: 3, type: default, size: 2, alignment: 2, stack-id: scalable-vector }
1245 - { id: 4, type: spill-slot, size: 16, alignment: 16, stack-id: scalable-vector }
1246 - { id: 5, type: spill-slot, size: 2, alignment: 2, stack-id: scalable-vector }
1250 ; Trigger some callee saves
1259 # Make sure we account for the offset between the fp and the sve area, if it exists.
1260 # FIXME: Should there be an offset?
1261 # CHECK-LABEL: name: fp_relative_index_with_float_save
1262 # CHECK: - { id: 0, name: '', type: default, offset: -16, size: 16, alignment: 16,
1263 # CHECK-NEXT: stack-id: scalable-vector
1264 # CHECK: - { id: 1, name: '', type: default, offset: -64, size: 16, alignment: 32,
1265 # CHECK-NEXT: stack-id: default
1266 # CHECK: - { id: 2, name: '', type: spill-slot, offset: -8, size: 8, alignment: 8,
1267 # CHECK-NEXT: stack-id: default, callee-saved-register: '$lr'
1268 # CHECK: - { id: 3, name: '', type: spill-slot, offset: -16, size: 8, alignment: 8,
1269 # CHECK-NEXT: stack-id: default, callee-saved-register: '$fp'
1270 # CHECK: - { id: 4, name: '', type: spill-slot, offset: -32, size: 8, alignment: 16,
1271 # CHECK-NEXT: stack-id: default, callee-saved-register: '$d8'
1273 # CHECK: $x8 = SUBXri $fp, 16, 0
1274 # CHECK: STR_ZXI $z0, killed $x8, -1
1276 name: fp_relative_index_with_float_save
1278 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }
1279 - { id: 1, stack-id: default, size: 16, alignment: 32 }
1282 isFrameAddressTaken: true
1289 STR_ZXI $z0, %stack.0, 0
1294 # CHECK-LABEL: name: fp_relative_that_is_not_a_multiple_of_VLx16
1295 # CHECK: - { id: 0, name: '', type: default, offset: -156, size: 156, alignment: 1,
1296 # CHECK-NEXT: stack-id: scalable-vector
1297 # CHECK: - { id: 1, name: '', type: variable-sized, offset: -32, alignment: 1,
1298 # CHECK-NEXT: stack-id: default
1300 # CHECK: $x8 = ADDPL_XXI $fp, -14
1301 # CHECK-NEXT: $z0 = LD1W_IMM killed renamable $p0, killed $x8, -8
1303 name: fp_relative_that_is_not_a_multiple_of_VLx16
1305 - { id: 0, stack-id: scalable-vector, size: 156, alignment: 1 }
1306 - { id: 1, stack-id: default, type: variable-sized, alignment: 1 }
1311 renamable $z0 = LD1W_IMM killed renamable $p0, %stack.0, 0