xref: /llvm-project/llvm/test/MC/AArch64/seh-packed-unwind.s (revision d98f74a470d6b1bf57f3ad4e8e2c1a18ddfed491)
1// Check that we generate the packed unwind info format whe possible.
2
3// For tests that don't generate packed unwind info, we still check that
4// the epilog was packed (so that the testcase otherwise had all other
5// preconditions for possibly making packed unwind info).
6
7// REQUIRES: aarch64-registered-target
8// RUN: llvm-mc -filetype=obj -triple aarch64-windows %s -o %t.o
9// RUN: llvm-readobj --unwind %t.o | FileCheck %s
10
11// CHECK:      UnwindInformation [
12// CHECK-NEXT:   RuntimeFunction {
13// CHECK-NEXT:     Function: func1
14// CHECK-NEXT:     Fragment: No
15// CHECK-NEXT:     FunctionLength: 88
16// CHECK-NEXT:     RegF: 7
17// CHECK-NEXT:     RegI: 10
18// CHECK-NEXT:     HomedParameters: No
19// CHECK-NEXT:     CR: 0
20// CHECK-NEXT:     FrameSize: 160
21// CHECK-NEXT:     Prologue [
22// CHECK-NEXT:       sub sp, sp, #16
23// CHECK-NEXT:       stp d14, d15, [sp, #128]
24// CHECK-NEXT:       stp d12, d13, [sp, #112]
25// CHECK-NEXT:       stp d10, d11, [sp, #96]
26// CHECK-NEXT:       stp d8, d9, [sp, #80]
27// CHECK-NEXT:       stp x27, x28, [sp, #64]
28// CHECK-NEXT:       stp x25, x26, [sp, #48]
29// CHECK-NEXT:       stp x23, x24, [sp, #32]
30// CHECK-NEXT:       stp x21, x22, [sp, #16]
31// CHECK-NEXT:       stp x19, x20, [sp, #-144]!
32// CHECK-NEXT:       end
33// CHECK-NEXT:     ]
34// CHECK-NEXT:   }
35// CHECK-NEXT:   RuntimeFunction {
36// CHECK-NEXT:     Function: func2
37// CHECK-NEXT:     Fragment: No
38// CHECK-NEXT:     FunctionLength: 48
39// CHECK-NEXT:     RegF: 2
40// CHECK-NEXT:     RegI: 3
41// CHECK-NEXT:     HomedParameters: No
42// CHECK-NEXT:     CR: 0
43// CHECK-NEXT:     FrameSize: 48
44// CHECK-NEXT:     Prologue [
45// CHECK-NEXT:       str d10, [sp, #40]
46// CHECK-NEXT:       stp d8, d9, [sp, #24]
47// CHECK-NEXT:       str x21, [sp, #16]
48// CHECK-NEXT:       stp x19, x20, [sp, #-48]!
49// CHECK-NEXT:       end
50// CHECK-NEXT:     ]
51// CHECK-NEXT:   }
52// CHECK-NEXT:   RuntimeFunction {
53// CHECK-NEXT:     Function: func3
54// CHECK-NEXT:     Fragment: No
55// CHECK-NEXT:     FunctionLength: 32
56// CHECK-NEXT:     RegF: 3
57// CHECK-NEXT:     RegI: 1
58// CHECK-NEXT:     HomedParameters: No
59// CHECK-NEXT:     CR: 0
60// CHECK-NEXT:     FrameSize: 48
61// CHECK-NEXT:     Prologue [
62// CHECK-NEXT:       stp d10, d11, [sp, #24]
63// CHECK-NEXT:       stp d8, d9, [sp, #8]
64// CHECK-NEXT:       str x19, [sp, #-48]!
65// CHECK-NEXT:       end
66// CHECK-NEXT:     ]
67// CHECK-NEXT:   }
68// CHECK-NEXT:   RuntimeFunction {
69// CHECK-NEXT:     Function: func4
70// CHECK-NEXT:     Fragment: No
71// CHECK-NEXT:     FunctionLength: 24
72// CHECK-NEXT:     RegF: 1
73// CHECK-NEXT:     RegI: 0
74// CHECK-NEXT:     HomedParameters: No
75// CHECK-NEXT:     CR: 0
76// CHECK-NEXT:     FrameSize: 48
77// CHECK-NEXT:     Prologue [
78// CHECK-NEXT:       sub sp, sp, #32
79// CHECK-NEXT:       stp d8, d9, [sp, #-16]!
80// CHECK-NEXT:       end
81// CHECK-NEXT:     ]
82// CHECK-NEXT:   }
83// CHECK-NEXT:   RuntimeFunction {
84// CHECK-NEXT:     Function: notpacked_func5
85// CHECK-NEXT:     ExceptionRecord:
86// CHECK-NEXT:     ExceptionData {
87// CHECK:        RuntimeFunction {
88// CHECK-NEXT:     Function: func6
89// CHECK-NEXT:     Fragment: No
90// CHECK-NEXT:     FunctionLength: 24
91// CHECK-NEXT:     RegF: 0
92// CHECK-NEXT:     RegI: 0
93// CHECK-NEXT:     HomedParameters: No
94// CHECK-NEXT:     CR: 1
95// CHECK-NEXT:     FrameSize: 32
96// CHECK-NEXT:     Prologue [
97// CHECK-NEXT:       sub sp, sp, #16
98// CHECK-NEXT:       str lr, [sp, #-16]!
99// CHECK-NEXT:       end
100// CHECK-NEXT:     ]
101// CHECK-NEXT:   }
102// CHECK-NEXT:   RuntimeFunction {
103// CHECK-NEXT:     Function: func7
104// CHECK-NEXT:     Fragment: No
105// CHECK-NEXT:     FunctionLength: 24
106// CHECK-NEXT:     RegF: 0
107// CHECK-NEXT:     RegI: 2
108// CHECK-NEXT:     HomedParameters: No
109// CHECK-NEXT:     CR: 1
110// CHECK-NEXT:     FrameSize: 32
111// CHECK-NEXT:     Prologue [
112// CHECK-NEXT:       str lr, [sp, #16]
113// CHECK-NEXT:       stp x19, x20, [sp, #-32]!
114// CHECK-NEXT:       end
115// CHECK-NEXT:     ]
116// CHECK-NEXT:   }
117// CHECK-NEXT:   RuntimeFunction {
118// CHECK-NEXT:     Function: func8
119// CHECK-NEXT:     Fragment: No
120// CHECK-NEXT:     FunctionLength: 32
121// CHECK-NEXT:     RegF: 0
122// CHECK-NEXT:     RegI: 3
123// CHECK-NEXT:     HomedParameters: No
124// CHECK-NEXT:     CR: 1
125// CHECK-NEXT:     FrameSize: 48
126// CHECK-NEXT:     Prologue [
127// CHECK-NEXT:       sub sp, sp, #16
128// CHECK-NEXT:       stp x21, lr, [sp, #16]
129// CHECK-NEXT:       stp x19, x20, [sp, #-32]!
130// CHECK-NEXT:       end
131// CHECK-NEXT:     ]
132// CHECK-NEXT:   }
133// CHECK-NEXT:   RuntimeFunction {
134// CHECK-NEXT:     Function: func9
135// CHECK-NEXT:     Fragment: No
136// CHECK-NEXT:     FunctionLength: 32
137// CHECK-NEXT:     RegF: 0
138// CHECK-NEXT:     RegI: 2
139// CHECK-NEXT:     HomedParameters: No
140// CHECK-NEXT:     CR: 3
141// CHECK-NEXT:     FrameSize: 48
142// CHECK-NEXT:     Prologue [
143// CHECK-NEXT:       mov x29, sp
144// CHECK-NEXT:       stp x29, lr, [sp, #-32]!
145// CHECK-NEXT:       stp x19, x20, [sp, #-16]!
146// CHECK-NEXT:       end
147// CHECK-NEXT:     ]
148// CHECK-NEXT:   }
149// CHECK-NEXT:   RuntimeFunction {
150// CHECK-NEXT:     Function: func10
151// CHECK-NEXT:     Fragment: No
152// CHECK-NEXT:     FunctionLength: 24
153// CHECK-NEXT:     RegF: 0
154// CHECK-NEXT:     RegI: 0
155// CHECK-NEXT:     HomedParameters: No
156// CHECK-NEXT:     CR: 3
157// CHECK-NEXT:     FrameSize: 32
158// CHECK-NEXT:     Prologue [
159// CHECK-NEXT:       mov x29, sp
160// CHECK-NEXT:       stp x29, lr, [sp, #-32]!
161// CHECK-NEXT:       end
162// CHECK-NEXT:     ]
163// CHECK-NEXT:   }
164// CHECK-NEXT:   RuntimeFunction {
165// CHECK-NEXT:     Function: func11
166// CHECK-NEXT:     Fragment: No
167// CHECK-NEXT:     FunctionLength: 40
168// CHECK-NEXT:     RegF: 0
169// CHECK-NEXT:     RegI: 2
170// CHECK-NEXT:     HomedParameters: No
171// CHECK-NEXT:     CR: 3
172// CHECK-NEXT:     FrameSize: 544
173// CHECK-NEXT:     Prologue [
174// CHECK-NEXT:       mov x29, sp
175// CHECK-NEXT:       stp x29, lr, [sp, #0]
176// CHECK-NEXT:       sub sp, sp, #528
177// CHECK-NEXT:       stp x19, x20, [sp, #-16]!
178// CHECK-NEXT:       end
179// CHECK-NEXT:     ]
180// CHECK-NEXT:   }
181// CHECK-NEXT:   RuntimeFunction {
182// CHECK-NEXT:     Function: func12
183// CHECK-NEXT:     Fragment: No
184// CHECK-NEXT:     FunctionLength: 48
185// CHECK-NEXT:     RegF: 0
186// CHECK-NEXT:     RegI: 2
187// CHECK-NEXT:     HomedParameters: No
188// CHECK-NEXT:     CR: 3
189// CHECK-NEXT:     FrameSize: 4112
190// CHECK-NEXT:     Prologue [
191// CHECK-NEXT:       mov x29, sp
192// CHECK-NEXT:       stp x29, lr, [sp, #0]
193// CHECK-NEXT:       sub sp, sp, #16
194// CHECK-NEXT:       sub sp, sp, #4080
195// CHECK-NEXT:       stp x19, x20, [sp, #-16]!
196// CHECK-NEXT:       end
197// CHECK-NEXT:     ]
198// CHECK-NEXT:   }
199// CHECK-NEXT:   RuntimeFunction {
200// CHECK-NEXT:     Function: func13
201// CHECK-NEXT:     Fragment: No
202// CHECK-NEXT:     FunctionLength: 32
203// CHECK-NEXT:     RegF: 0
204// CHECK-NEXT:     RegI: 2
205// CHECK-NEXT:     HomedParameters: No
206// CHECK-NEXT:     CR: 0
207// CHECK-NEXT:     FrameSize: 4112
208// CHECK-NEXT:     Prologue [
209// CHECK-NEXT:       sub sp, sp, #16
210// CHECK-NEXT:       sub sp, sp, #4080
211// CHECK-NEXT:       stp x19, x20, [sp, #-16]!
212// CHECK-NEXT:       end
213// CHECK-NEXT:     ]
214// CHECK-NEXT:   }
215// CHECK-NEXT:   RuntimeFunction {
216// CHECK-NEXT:     Function: func14
217// CHECK-NEXT:     Fragment: No
218// CHECK-NEXT:     FunctionLength: 32
219// CHECK-NEXT:     RegF: 2
220// CHECK-NEXT:     RegI: 0
221// CHECK-NEXT:     HomedParameters: No
222// CHECK-NEXT:     CR: 1
223// CHECK-NEXT:     FrameSize: 32
224// CHECK-NEXT:     Prologue [
225// CHECK-NEXT:       str d10, [sp, #24]
226// CHECK-NEXT:       stp d8, d9, [sp, #8]
227// CHECK-NEXT:       str lr, [sp, #-32]!
228// CHECK-NEXT:       end
229// CHECK-NEXT:     ]
230// CHECK-NEXT:   }
231// CHECK-NEXT:   RuntimeFunction {
232// CHECK-NEXT:     Function: func15
233// CHECK-NEXT:     Fragment: No
234// CHECK-NEXT:     FunctionLength: 20
235// CHECK-NEXT:     RegF: 0
236// CHECK-NEXT:     RegI: 0
237// CHECK-NEXT:     HomedParameters: No
238// CHECK-NEXT:     CR: 3
239// CHECK-NEXT:     FrameSize: 32
240// CHECK-NEXT:     Prologue [
241// CHECK-NEXT:       mov x29, sp
242// CHECK-NEXT:       stp x29, lr, [sp, #-32]!
243// CHECK-NEXT:       end
244// CHECK-NEXT:     ]
245// CHECK-NEXT:   }
246// CHECK-NEXT:   RuntimeFunction {
247// CHECK-NEXT:     Function: func16
248// CHECK-NEXT:     Fragment: No
249// CHECK-NEXT:     FunctionLength: 28
250// CHECK-NEXT:     RegF: 0
251// CHECK-NEXT:     RegI: 0
252// CHECK-NEXT:     HomedParameters: No
253// CHECK-NEXT:     CR: 2
254// CHECK-NEXT:     FrameSize: 32
255// CHECK-NEXT:     Prologue [
256// CHECK-NEXT:       mov x29, sp
257// CHECK-NEXT:       stp x29, lr, [sp, #-32]!
258// CHECK-NEXT:       pacibsp
259// CHECK-NEXT:       end
260// CHECK-NEXT:     ]
261// CHECK-NEXT:   }
262// CHECK-NEXT:   RuntimeFunction {
263// CHECK-NEXT:     Function: func17
264// CHECK-NEXT:     Fragment: No
265// CHECK-NEXT:     FunctionLength: 40
266// CHECK-NEXT:     RegF: 0
267// CHECK-NEXT:     RegI: 2
268// CHECK-NEXT:     HomedParameters: No
269// CHECK-NEXT:     CR: 2
270// CHECK-NEXT:     FrameSize: 48
271// CHECK-NEXT:     Prologue [
272// CHECK-NEXT:       mov x29, sp
273// CHECK-NEXT:       stp x29, lr, [sp, #-32]!
274// CHECK-NEXT:       stp x19, x20, [sp, #-16]!
275// CHECK-NEXT:       pacibsp
276// CHECK-NEXT:       end
277// CHECK-NEXT:     ]
278// CHECK-NEXT:   }
279// CHECK-NEXT:   RuntimeFunction {
280// CHECK-NEXT:     Function: func18
281// CHECK-NEXT:     Fragment: No
282// CHECK-NEXT:     FunctionLength: 56
283// CHECK-NEXT:     RegF: 0
284// CHECK-NEXT:     RegI: 2
285// CHECK-NEXT:     HomedParameters: No
286// CHECK-NEXT:     CR: 2
287// CHECK-NEXT:     FrameSize: 4112
288// CHECK-NEXT:     Prologue [
289// CHECK-NEXT:       mov x29, sp
290// CHECK-NEXT:       stp x29, lr, [sp, #0]
291// CHECK-NEXT:       sub sp, sp, #16
292// CHECK-NEXT:       sub sp, sp, #4080
293// CHECK-NEXT:       stp x19, x20, [sp, #-16]!
294// CHECK-NEXT:       pacibsp
295// CHECK-NEXT:       end
296// CHECK-NEXT:     ]
297// CHECK-NEXT:   }
298// CHECK:        RuntimeFunction {
299// CHECK-NEXT:     Function: nonpacked1
300// CHECK-NEXT:     ExceptionRecord:
301// CHECK-NEXT:     ExceptionData {
302// CHECK:            EpiloguePacked: Yes
303// CHECK:        RuntimeFunction {
304// CHECK-NEXT:     Function: nonpacked2
305// CHECK-NEXT:     ExceptionRecord:
306// CHECK-NEXT:     ExceptionData {
307// CHECK:            EpiloguePacked: Yes
308// CHECK:        RuntimeFunction {
309// CHECK-NEXT:     Function: nonpacked3
310// CHECK-NEXT:     ExceptionRecord:
311// CHECK-NEXT:     ExceptionData {
312// CHECK:            EpiloguePacked: Yes
313// CHECK:        RuntimeFunction {
314// CHECK-NEXT:     Function: nonpacked4
315// CHECK-NEXT:     ExceptionRecord:
316// CHECK-NEXT:     ExceptionData {
317// CHECK:            EpiloguePacked: Yes
318// CHECK:        RuntimeFunction {
319// CHECK-NEXT:     Function: nonpacked5
320// CHECK-NEXT:     ExceptionRecord:
321// CHECK-NEXT:     ExceptionData {
322// CHECK:            EpiloguePacked: Yes
323// CHECK:        RuntimeFunction {
324// CHECK-NEXT:     Function: nonpacked6
325// CHECK-NEXT:     ExceptionRecord:
326// CHECK-NEXT:     ExceptionData {
327// CHECK:            EpiloguePacked: Yes
328// CHECK:        RuntimeFunction {
329// CHECK-NEXT:     Function: nonpacked7
330// CHECK-NEXT:     ExceptionRecord:
331// CHECK-NEXT:     ExceptionData {
332// CHECK:            EpiloguePacked: Yes
333// CHECK:        RuntimeFunction {
334// CHECK-NEXT:     Function: nonpacked8
335// CHECK-NEXT:     ExceptionRecord:
336// CHECK-NEXT:     ExceptionData {
337// CHECK:            EpiloguePacked: Yes
338// CHECK:        RuntimeFunction {
339// CHECK-NEXT:     Function: nonpacked9
340// CHECK-NEXT:     ExceptionRecord:
341// CHECK-NEXT:     ExceptionData {
342// CHECK:            EpiloguePacked: Yes
343// CHECK:        RuntimeFunction {
344// CHECK-NEXT:     Function: nonpacked10
345// CHECK-NEXT:     ExceptionRecord:
346// CHECK-NEXT:     ExceptionData {
347// CHECK:            EpiloguePacked: Yes
348// CHECK:        RuntimeFunction {
349// CHECK-NEXT:     Function: nonpacked11
350// CHECK-NEXT:     ExceptionRecord:
351// CHECK-NEXT:     ExceptionData {
352// CHECK:            EpiloguePacked: Yes
353// CHECK:        RuntimeFunction {
354// CHECK-NEXT:     Function: nonpacked12
355// CHECK-NEXT:     ExceptionRecord:
356// CHECK-NEXT:     ExceptionData {
357// CHECK:            EpiloguePacked: Yes
358// CHECK:        RuntimeFunction {
359// CHECK-NEXT:     Function: nonpacked13
360// CHECK-NEXT:     ExceptionRecord:
361// CHECK-NEXT:     ExceptionData {
362// CHECK:            EpiloguePacked: Yes
363// CHECK:        RuntimeFunction {
364// CHECK-NEXT:     Function: nonpacked14
365// CHECK-NEXT:     ExceptionRecord:
366// CHECK-NEXT:     ExceptionData {
367// CHECK:            EpiloguePacked: Yes
368// CHECK:        RuntimeFunction {
369// CHECK-NEXT:     Function: nonpacked15
370// CHECK-NEXT:     ExceptionRecord:
371// CHECK-NEXT:     ExceptionData {
372// CHECK:            EpiloguePacked: Yes
373// CHECK:        RuntimeFunction {
374// CHECK-NEXT:     Function: nonpacked16
375// CHECK-NEXT:     ExceptionRecord:
376// CHECK-NEXT:     ExceptionData {
377// CHECK:            EpiloguePacked: Yes
378
379
380    .text
381func1:
382    .seh_proc func1
383    stp x19, x20, [sp, #-144]!
384    .seh_save_r19r20_x 144
385    stp x21, x22, [sp, #16]
386    .seh_save_regp x21, 16
387    stp x23, x24, [sp, #32]
388    .seh_save_next
389    stp x25, x26, [sp, #48]
390    .seh_save_next
391    stp x27, x28, [sp, #64]
392    .seh_save_next
393    stp d8,  d9,  [sp, #80]
394    .seh_save_fregp d8, 80
395    stp d10, d11, [sp, #96]
396    .seh_save_fregp d10, 96
397    stp d12, d13, [sp, #112]
398    .seh_save_fregp d12, 112
399    stp d14, d15, [sp, #128]
400    .seh_save_fregp d14, 128
401    sub sp,  sp,  #16
402    .seh_stackalloc 16
403    .seh_endprologue
404    nop
405    .seh_startepilogue
406    add sp,  sp,  #16
407    .seh_stackalloc 16
408    ldp d14, d15, [sp, #128]
409    .seh_save_fregp d14, 128
410    ldp d12, d13, [sp, #112]
411    .seh_save_fregp d12, 112
412    ldp d10, d11, [sp, #96]
413    .seh_save_fregp d10, 96
414    ldp d8,  d9,  [sp, #80]
415    .seh_save_fregp d8, 80
416    ldp x27, x28, [sp, #64]
417    .seh_save_next
418    ldp x25, x26, [sp, #48]
419    .seh_save_next
420    ldp x23, x24, [sp, #32]
421    .seh_save_next
422    ldp x21, x22, [sp, #16]
423    .seh_save_next
424    ldp x19, x20, [sp], #144
425    .seh_save_regp_x x19, 144
426    .seh_endepilogue
427    ret
428    .seh_endproc
429
430func2:
431    .seh_proc func2
432    stp x19, x20, [sp, #-48]!
433    .seh_save_r19r20_x 48
434    str x21,      [sp, #16]
435    .seh_save_reg x21, 16
436    stp d8,  d9,  [sp, #24]
437    .seh_save_fregp d8, 24
438    str d10,      [sp, #40]
439    .seh_save_freg d10, 40
440    sub sp,  sp,  #0
441    .seh_stackalloc 0
442    .seh_endprologue
443    nop
444    .seh_startepilogue
445    add sp,  sp,  #0
446    .seh_stackalloc 0
447    ldr d10,      [sp, #40]
448    .seh_save_freg d10, 40
449    ldp d8,  d9,  [sp, #24]
450    .seh_save_fregp d8, 24
451    ldr x21,      [sp, #16]
452    .seh_save_reg x21, 16
453    ldp x19, x20, [sp], #48
454    .seh_save_r19r20_x 48
455    .seh_endepilogue
456    ret
457    .seh_endproc
458
459func3:
460    .seh_proc func3
461    str x19,      [sp, #-48]!
462    .seh_save_reg_x x19, 48
463    stp d8,  d9,  [sp, #8]
464    .seh_save_fregp d8, 8
465    stp d10, d11, [sp, #24]
466    .seh_save_fregp d10, 24
467    .seh_endprologue
468    nop
469    .seh_startepilogue
470    ldp d10, d11, [sp, #24]
471    .seh_save_fregp d10, 24
472    ldp d8,  d9,  [sp, #8]
473    .seh_save_fregp d8, 8
474    ldr x19,      [sp], #48
475    .seh_save_reg_x x19, 48
476    .seh_endepilogue
477    ret
478    .seh_endproc
479
480func4:
481    .seh_proc func4
482    stp d8,  d9,  [sp, #-16]!
483    .seh_save_fregp_x d8, 16
484    sub sp,  sp,  #32
485    .seh_stackalloc 32
486    .seh_endprologue
487    nop
488    .seh_startepilogue
489    add sp,  sp,  #32
490    .seh_stackalloc 32
491    ldp d8,  d9,  [sp], #16
492    .seh_save_fregp_x d8, 16
493    .seh_endepilogue
494    ret
495    .seh_endproc
496
497notpacked_func5:
498    .seh_proc notpacked_func5
499    str x19, [sp, #-80]!
500    .seh_save_reg_x x19, 80
501    stp x0,  x1,  [sp, #16]
502    .seh_nop
503    stp x2,  x3,  [sp, #32]
504    .seh_nop
505    stp x4,  x5,  [sp, #48]
506    .seh_nop
507    stp x6,  x7,  [sp, #64]
508    .seh_nop
509    sub sp,  sp,  #32
510    .seh_stackalloc 32
511    .seh_endprologue
512    nop
513    .seh_startepilogue
514    add sp,  sp,  #32
515    .seh_stackalloc 32
516    nop
517    .seh_nop
518    nop
519    .seh_nop
520    nop
521    .seh_nop
522    nop
523    .seh_nop
524    ldr x19, [sp], #80
525    .seh_save_reg_x x19, 80
526    .seh_endepilogue
527    ret
528    .seh_endproc
529
530func6:
531    .seh_proc func6
532    str lr,       [sp, #-16]!
533    .seh_save_reg_x lr, 16
534    sub sp,  sp,  #16
535    .seh_stackalloc 16
536    .seh_endprologue
537    nop
538    .seh_startepilogue
539    add sp,  sp,  #16
540    .seh_stackalloc 16
541    ldr lr,       [sp], #16
542    .seh_save_reg_x lr, 16
543    .seh_endepilogue
544    ret
545    .seh_endproc
546
547func7:
548    .seh_proc func7
549    stp x19, x20, [sp, #-32]!
550    .seh_save_r19r20_x 32
551    str lr,       [sp, #16]
552    .seh_save_reg lr, 16
553    .seh_endprologue
554    nop
555    .seh_startepilogue
556    ldr lr,       [sp, #16]
557    .seh_save_reg lr, 16
558    ldp x19, x20, [sp], #32
559    .seh_save_r19r20_x 32
560    .seh_endepilogue
561    ret
562    .seh_endproc
563
564func8:
565    .seh_proc func8
566    stp x19, x20, [sp, #-32]!
567    .seh_save_r19r20_x 32
568    stp x21, lr,  [sp, #16]
569    .seh_save_lrpair x21, 16
570    sub sp,  sp,  #16
571    .seh_stackalloc 16
572    .seh_endprologue
573    nop
574    .seh_startepilogue
575    add sp,  sp,  #16
576    .seh_stackalloc 16
577    ldp x21, lr,  [sp, #16]
578    .seh_save_lrpair x21, 16
579    ldp x19, x20, [sp], #32
580    .seh_save_r19r20_x 32
581    .seh_endepilogue
582    ret
583    .seh_endproc
584
585func9:
586    .seh_proc func9
587    stp x19, x20, [sp, #-16]!
588    .seh_save_r19r20_x 16
589    stp x29, lr,  [sp, #-32]!
590    .seh_save_fplr_x 32
591    mov x29, sp
592    .seh_set_fp
593    .seh_endprologue
594    nop
595    .seh_startepilogue
596    mov sp,  x29
597    .seh_set_fp
598    ldp x29, lr,  [sp], #32
599    .seh_save_fplr_x 32
600    ldp x19, x20, [sp], #16
601    .seh_save_r19r20_x 16
602    .seh_endepilogue
603    ret
604    .seh_endproc
605
606func10:
607    .seh_proc func10
608    stp x29, lr,  [sp, #-32]!
609    .seh_save_fplr_x 32
610    mov x29, sp
611    .seh_set_fp
612    .seh_endprologue
613    nop
614    .seh_startepilogue
615    mov sp,  x29
616    .seh_set_fp
617    ldp x29, lr,  [sp], #32
618    .seh_save_fplr_x 32
619    .seh_endepilogue
620    ret
621    .seh_endproc
622
623func11:
624    .seh_proc func11
625    stp x19, x20, [sp, #-16]!
626    .seh_save_r19r20_x 16
627    sub sp,  sp,  #528
628    .seh_stackalloc 528
629    stp x29, lr,  [sp, #0]
630    .seh_save_fplr 0
631    mov x29, sp
632    .seh_set_fp
633    .seh_endprologue
634    nop
635    .seh_startepilogue
636    mov sp,  x29
637    .seh_set_fp
638    ldp x29, lr,  [sp, #0]
639    .seh_save_fplr 0
640    add sp,  sp,  #528
641    .seh_stackalloc 528
642    ldp x19, x20, [sp], #16
643    .seh_save_r19r20_x 16
644    .seh_endepilogue
645    ret
646    .seh_endproc
647
648func12:
649    .seh_proc func12
650    stp x19, x20, [sp, #-16]!
651    .seh_save_r19r20_x 16
652    sub sp,  sp,  #4080
653    .seh_stackalloc 4080
654    sub sp,  sp,  #16
655    .seh_stackalloc 16
656    stp x29, lr,  [sp, #0]
657    .seh_save_fplr 0
658    mov x29, sp
659    .seh_set_fp
660    .seh_endprologue
661    nop
662    .seh_startepilogue
663    mov sp,  x29
664    .seh_set_fp
665    ldp x29, lr,  [sp, #0]
666    .seh_save_fplr 0
667    add sp,  sp,  #16
668    .seh_stackalloc 16
669    add sp,  sp,  #4080
670    .seh_stackalloc 4080
671    ldp x19, x20, [sp], #16
672    .seh_save_r19r20_x 16
673    .seh_endepilogue
674    ret
675    .seh_endproc
676
677func13:
678    .seh_proc func13
679    stp x19, x20, [sp, #-16]!
680    .seh_save_r19r20_x 16
681    sub sp,  sp,  #4080
682    .seh_stackalloc 4080
683    sub sp,  sp,  #16
684    .seh_stackalloc 16
685    .seh_endprologue
686    nop
687    .seh_startepilogue
688    add sp,  sp,  #16
689    .seh_stackalloc 16
690    add sp,  sp,  #4080
691    .seh_stackalloc 4080
692    ldp x19, x20, [sp], #16
693    .seh_save_r19r20_x 16
694    .seh_endepilogue
695    ret
696    .seh_endproc
697
698func14:
699    .seh_proc func14
700    str lr,       [sp, #-32]!
701    .seh_save_reg_x lr, 32
702    stp d8,  d9,  [sp, #8]
703    .seh_save_fregp d8, 8
704    str d10,      [sp, #24]
705    .seh_save_freg d10, 24
706    .seh_endprologue
707    nop
708    .seh_startepilogue
709    ldr d10,      [sp, #24]
710    .seh_save_freg d10, 24
711    ldp d8,  d9,  [sp, #8]
712    .seh_save_fregp d8, 8
713    ldr lr,       [sp], #32
714    .seh_save_reg_x lr, 32
715    .seh_endepilogue
716    ret
717    .seh_endproc
718
719func15:
720    .seh_proc func15
721    stp x29, lr,  [sp, #-32]!
722    .seh_save_fplr_x 32
723    mov x29, sp
724    .seh_set_fp
725    .seh_endprologue
726    nop
727    .seh_startepilogue
728    // Epilogue missing the .seh_set_fp, but still generating packed info.
729    ldp x29, lr,  [sp], #32
730    .seh_save_fplr_x 32
731    .seh_endepilogue
732    ret
733    .seh_endproc
734
735func16:
736    .seh_proc func16
737    pacibsp
738    .seh_pac_sign_lr
739    stp x29, lr,  [sp, #-32]!
740    .seh_save_fplr_x 32
741    mov x29, sp
742    .seh_set_fp
743    .seh_endprologue
744    nop
745    .seh_startepilogue
746    ldp x29, lr, [sp], #32
747    .seh_save_fplr_x 32
748    autibsp
749    .seh_pac_sign_lr
750    .seh_endepilogue
751    ret
752    .seh_endproc
753
754func17:
755    .seh_proc func17
756    pacibsp
757    .seh_pac_sign_lr
758    stp x19, x20, [sp, #-16]!
759    .seh_save_r19r20_x 16
760    stp x29, lr,  [sp, #-32]!
761    .seh_save_fplr_x 32
762    mov x29, sp
763    .seh_set_fp
764    .seh_endprologue
765    nop
766    .seh_startepilogue
767    mov sp,  x29
768    .seh_set_fp
769    ldp x29, lr,  [sp], #32
770    .seh_save_fplr_x 32
771    ldp x19, x20, [sp], #16
772    .seh_save_r19r20_x 16
773    autibsp
774    .seh_pac_sign_lr
775    .seh_endepilogue
776    ret
777    .seh_endproc
778
779func18:
780    .seh_proc func18
781    pacibsp
782    .seh_pac_sign_lr
783    stp x19, x20, [sp, #-16]!
784    .seh_save_r19r20_x 16
785    sub sp,  sp,  #4080
786    .seh_stackalloc 4080
787    sub sp,  sp,  #16
788    .seh_stackalloc 16
789    stp x29, lr,  [sp, #0]
790    .seh_save_fplr 0
791    mov x29, sp
792    .seh_set_fp
793    .seh_endprologue
794    nop
795    .seh_startepilogue
796    mov sp,  x29
797    .seh_set_fp
798    ldp x29, lr,  [sp, #0]
799    .seh_save_fplr 0
800    add sp,  sp,  #16
801    .seh_stackalloc 16
802    add sp,  sp,  #4080
803    .seh_stackalloc 4080
804    ldp x19, x20, [sp], #16
805    .seh_save_r19r20_x 16
806    autibsp
807    .seh_pac_sign_lr
808    .seh_endepilogue
809    ret
810    .seh_endproc
811
812nonpacked1:
813    .seh_proc nonpacked1
814    // Can't be packed; can't save integer registers after float registers.
815    stp d8,  d9,  [sp, #-32]!
816    .seh_save_fregp_x d8, 32
817    stp x19, x20, [sp, #16]!
818    .seh_save_regp x19, 16
819    .seh_endprologue
820    nop
821    .seh_startepilogue
822    ldp x19, x20, [sp, #16]
823    .seh_save_regp x19, 16
824    ldp d8,  d9,  [sp], #32
825    .seh_save_fregp_x d8, 32
826    .seh_endepilogue
827    ret
828    .seh_endproc
829
830nonpacked2:
831    .seh_proc nonpacked2
832    // Can't be packed; x21/x22 aren't saved in the expected spot
833    stp x19, x20, [sp, #-48]!
834    .seh_save_r19r20_x 48
835    stp x21, x22, [sp, #32]
836    .seh_save_regp x21, 32
837    .seh_endprologue
838    nop
839    .seh_startepilogue
840    ldp x21, x22, [sp, #32]
841    .seh_save_regp x21, 32
842    ldp x19, x20, [sp], #48
843    .seh_save_r19r20_x 48
844    .seh_endepilogue
845    ret
846    .seh_endproc
847
848nonpacked3:
849    .seh_proc nonpacked3
850    // Can't be packed; x29/x30 can't be treated as the other saved registers
851    stp x19, x20, [sp, #-96]!
852    .seh_save_r19r20_x 96
853    stp x21, x22, [sp, #16]
854    .seh_save_next
855    stp x23, x24, [sp, #32]
856    .seh_save_next
857    stp x25, x26, [sp, #48]
858    .seh_save_next
859    stp x27, x28, [sp, #64]
860    .seh_save_next
861    stp x29, x30, [sp, #80]
862    .seh_save_next
863    .seh_endprologue
864    nop
865    .seh_startepilogue
866    ldp x29, x30, [sp, #80]
867    .seh_save_next
868    ldp x27, x28, [sp, #64]
869    .seh_save_next
870    ldp x25, x26, [sp, #48]
871    .seh_save_next
872    ldp x23, x24, [sp, #32]
873    .seh_save_next
874    ldp x21, x22, [sp, #16]
875    .seh_save_next
876    ldp x19, x20, [sp], #96
877    .seh_save_r19r20_x 96
878    .seh_endepilogue
879    ret
880    .seh_endproc
881
882nonpacked4:
883    .seh_proc nonpacked4
884    // Can't be packed; more predecrement for x19/x20 than used for
885    // corresponding RegI/RegF/LR saves
886    stp x19, x20, [sp, #-32]!
887    .seh_save_r19r20_x 32
888    .seh_endprologue
889    nop
890    .seh_startepilogue
891    ldp x19, x20, [sp], #32
892    .seh_save_r19r20_x 32
893    .seh_endepilogue
894    ret
895    .seh_endproc
896
897nonpacked5:
898    .seh_proc nonpacked5
899    // Can't be packed; can't save LR twice
900    stp x19, x20, [sp, #-32]!
901    .seh_save_r19r20_x 32
902    str lr, [sp, #16]
903    .seh_save_reg lr, 16
904    str lr, [sp, #24]
905    .seh_save_reg lr, 24
906    .seh_endprologue
907    nop
908    .seh_startepilogue
909    ldr lr, [sp, #24]
910    .seh_save_reg lr, 24
911    ldr lr, [sp, #16]
912    .seh_save_reg lr, 16
913    ldp x19, x20, [sp], #32
914    .seh_save_r19r20_x 32
915    .seh_endepilogue
916    ret
917    .seh_endproc
918
919nonpacked6:
920    .seh_proc nonpacked6
921    // Can't be packed; can't save LR both standalone (CR 1) and as FPLR (CR 3)
922    stp x19, x20, [sp, #-32]!
923    .seh_save_r19r20_x 32
924    str lr, [sp, #16]
925    .seh_save_reg lr, 16
926    stp x29, lr,  [sp, #-16]!
927    .seh_save_fplr_x 16
928    mov x29, sp
929    .seh_set_fp
930    .seh_endprologue
931    nop
932    .seh_startepilogue
933    mov sp,  x29
934    .seh_set_fp
935    ldp x29, lr,  [sp], #32
936    .seh_save_fplr_x 16
937    ldr lr, [sp, #16]
938    .seh_save_reg lr, 16
939    ldp x19, x20, [sp], #32
940    .seh_save_r19r20_x 32
941    .seh_endepilogue
942    ret
943    .seh_endproc
944
945nonpacked7:
946    .seh_proc nonpacked7
947    // Can't be packed; too many saved FP regs
948    stp d8,  d9,  [sp, #-80]!
949    .seh_save_fregp_x d8, 80
950    stp d10, d11, [sp, #16]
951    .seh_save_fregp d10, 16
952    stp d12, d13, [sp, #32]
953    .seh_save_fregp d12, 32
954    stp d14, d15, [sp, #48]
955    .seh_save_fregp d14, 48
956    stp d16, d17, [sp, #64]
957    .seh_save_next
958    .seh_endprologue
959    nop
960    .seh_startepilogue
961    ldp d16, d17, [sp, #64]
962    .seh_save_next
963    ldp d14, d15, [sp, #48]
964    .seh_save_fregp d14, 48
965    ldp d12, d13, [sp, #32]
966    .seh_save_fregp d12, 32
967    ldp d10, d11, [sp, #16]
968    .seh_save_fregp d10, 16
969    ldp d8,  d9,  [sp], #80
970    .seh_save_fregp_x d8, 80
971    .seh_endepilogue
972    ret
973    .seh_endproc
974
975nonpacked8:
976    .seh_proc nonpacked8
977    // Can't be packed; Can't handle only a single FP reg
978    str d8,  [sp, #-16]!
979    .seh_save_freg_x d8, 16
980    .seh_endprologue
981    nop
982    .seh_startepilogue
983    ldr d8,  [sp], #16
984    .seh_save_freg_x d8, 16
985    .seh_endepilogue
986    ret
987    .seh_endproc
988
989nonpacked9:
990    .seh_proc nonpacked9
991    // Can't be packed; can't have a separate stack adjustment with save_fplr_x
992    sub sp, sp, #32
993    .seh_stackalloc 32
994    stp x29, lr,  [sp, #-16]!
995    .seh_save_fplr_x 16
996    mov x29, sp
997    .seh_set_fp
998    .seh_endprologue
999    nop
1000    .seh_startepilogue
1001    mov sp,  x29
1002    .seh_set_fp
1003    ldp x29, lr,  [sp], #32
1004    .seh_save_fplr_x 16
1005    add sp, sp, #32
1006    .seh_stackalloc 32
1007    .seh_endepilogue
1008    ret
1009    .seh_endproc
1010
1011nonpacked10:
1012    .seh_proc nonpacked10
1013    // Can't be packed; wrong predecrement
1014    stp x19, x20, [sp, #-16]!
1015    .seh_save_r19r20_x 16
1016    stp x21, x22, [sp, #16]
1017    .seh_save_next
1018    .seh_endprologue
1019    nop
1020    .seh_startepilogue
1021    ldp x21, x22, [sp, #16]
1022    .seh_save_next
1023    ldp x19, x20, [sp], #16
1024    .seh_save_r19r20_x 16
1025    .seh_endepilogue
1026    ret
1027    .seh_endproc
1028
1029nonpacked11:
1030    .seh_proc nonpacked11
1031    // Can't be packed; too big stack allocation
1032    sub sp, sp, #4080
1033    .seh_stackalloc 4080
1034    sub sp, sp, #8192
1035    .seh_stackalloc 8192
1036    .seh_endprologue
1037    nop
1038    .seh_startepilogue
1039    add sp, sp, #8192
1040    .seh_stackalloc 8192
1041    add sp, sp, #4080
1042    .seh_stackalloc 4080
1043    .seh_endepilogue
1044    ret
1045    .seh_endproc
1046
1047nonpacked12:
1048    .seh_proc nonpacked12
1049    // Can't be packed; missing .seh_set_fp
1050    stp x29, lr,  [sp, #-32]!
1051    .seh_save_fplr_x 32
1052    .seh_endprologue
1053    nop
1054    .seh_startepilogue
1055    ldp x29, lr,  [sp], #32
1056    .seh_save_fplr_x 32
1057    .seh_endepilogue
1058    ret
1059    .seh_endproc
1060
1061nonpacked13:
1062    .seh_proc nonpacked13
1063    // Can't be packed; not doing a packed info if .seh_handlerdata is used
1064    sub sp, sp, #16
1065    .seh_stackalloc 16
1066    .seh_endprologue
1067    nop
1068    .seh_startepilogue
1069    add sp, sp, #16
1070    .seh_stackalloc 16
1071    .seh_endepilogue
1072    ret
1073    .seh_endfunclet
1074    .seh_handlerdata
1075    .long 0
1076    .text
1077    .seh_endproc
1078
1079nonpacked14:
1080    .seh_proc nonpacked14
1081    // Can't be packed; a signed return address can only be expressed if
1082    // we save both x29 and lr on the stack.
1083    pacibsp
1084    .seh_pac_sign_lr
1085    str lr,       [sp, #-32]!
1086    .seh_save_reg_x lr, 32
1087    .seh_endprologue
1088    nop
1089    .seh_startepilogue
1090    ldr lr,       [sp], #32
1091    .seh_save_reg_x lr, 32
1092    autibsp
1093    .seh_pac_sign_lr
1094    .seh_endepilogue
1095    ret
1096    .seh_endproc
1097
1098nonpacked15:
1099    .seh_proc nonpacked15
1100    // Can't be packed; a signed return address can only be expressed if
1101    // we save both x29 and lr on the stack.
1102    pacibsp
1103    .seh_pac_sign_lr
1104    stp x19, x20, [sp, #-32]!
1105    .seh_save_r19r20_x 32
1106    stp x21, lr,  [sp, #16]
1107    .seh_save_lrpair x21, 16
1108    sub sp,  sp,  #16
1109    .seh_stackalloc 16
1110    .seh_endprologue
1111    nop
1112    .seh_startepilogue
1113    add sp,  sp,  #16
1114    .seh_stackalloc 16
1115    ldp x21, lr,  [sp, #16]
1116    .seh_save_lrpair x21, 16
1117    ldp x19, x20, [sp], #32
1118    .seh_save_r19r20_x 32
1119    autibsp
1120    .seh_pac_sign_lr
1121    .seh_endepilogue
1122    ret
1123    .seh_endproc
1124
1125nonpacked16:
1126    .seh_proc nonpacked16
1127    // Make sure we correctly analyze .seh_save_any_reg_p
1128    stp     x29, x30, [sp, #-176]!
1129    .seh_save_fplr_x        176
1130    stp     q6, q7, [sp, #16]
1131    .seh_save_any_reg_p     q6, 16
1132    stp     q8, q9, [sp, #48]
1133    .seh_save_any_reg_p     q8, 48
1134    stp     q10, q11, [sp, #80]
1135    .seh_save_any_reg_p     q10, 80
1136    stp     q12, q13, [sp, #112]
1137    .seh_save_any_reg_p     q12, 112
1138    stp     q14, q15, [sp, #144]
1139    .seh_save_any_reg_p     q14, 144
1140    mov     x29, sp
1141    .seh_set_fp
1142    .seh_endprologue
1143    nop
1144    .seh_startepilogue
1145    ldp     q14, q15, [sp, #144]
1146    .seh_save_any_reg_p     q14, 144
1147    ldp     q12, q13, [sp, #112]
1148    .seh_save_any_reg_p     q12, 112
1149    ldp     q10, q11, [sp, #80]
1150    .seh_save_any_reg_p     q10, 80
1151    ldp     q8, q9, [sp, #48]
1152    .seh_save_any_reg_p     q8, 48
1153    ldp     q6, q7, [sp, #16]
1154    .seh_save_any_reg_p     q6, 16
1155    ldp     x29, x30, [sp], #176
1156    .seh_save_fplr_x        176
1157    .seh_endepilogue
1158    br      x9
1159    .seh_endproc
1160