// Check that we generate the packed unwind info format whe possible. // For tests that don't generate packed unwind info, we still check that // the epilog was packed (so that the testcase otherwise had all other // preconditions for possibly making packed unwind info). // REQUIRES: aarch64-registered-target // RUN: llvm-mc -filetype=obj -triple aarch64-windows %s -o %t.o // RUN: llvm-readobj --unwind %t.o | FileCheck %s // CHECK: UnwindInformation [ // CHECK-NEXT: RuntimeFunction { // CHECK-NEXT: Function: func1 // CHECK-NEXT: Fragment: No // CHECK-NEXT: FunctionLength: 88 // CHECK-NEXT: RegF: 7 // CHECK-NEXT: RegI: 10 // CHECK-NEXT: HomedParameters: No // CHECK-NEXT: CR: 0 // CHECK-NEXT: FrameSize: 160 // CHECK-NEXT: Prologue [ // CHECK-NEXT: sub sp, sp, #16 // CHECK-NEXT: stp d14, d15, [sp, #128] // CHECK-NEXT: stp d12, d13, [sp, #112] // CHECK-NEXT: stp d10, d11, [sp, #96] // CHECK-NEXT: stp d8, d9, [sp, #80] // CHECK-NEXT: stp x27, x28, [sp, #64] // CHECK-NEXT: stp x25, x26, [sp, #48] // CHECK-NEXT: stp x23, x24, [sp, #32] // CHECK-NEXT: stp x21, x22, [sp, #16] // CHECK-NEXT: stp x19, x20, [sp, #-144]! // CHECK-NEXT: end // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: RuntimeFunction { // CHECK-NEXT: Function: func2 // CHECK-NEXT: Fragment: No // CHECK-NEXT: FunctionLength: 48 // CHECK-NEXT: RegF: 2 // CHECK-NEXT: RegI: 3 // CHECK-NEXT: HomedParameters: No // CHECK-NEXT: CR: 0 // CHECK-NEXT: FrameSize: 48 // CHECK-NEXT: Prologue [ // CHECK-NEXT: str d10, [sp, #40] // CHECK-NEXT: stp d8, d9, [sp, #24] // CHECK-NEXT: str x21, [sp, #16] // CHECK-NEXT: stp x19, x20, [sp, #-48]! // CHECK-NEXT: end // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: RuntimeFunction { // CHECK-NEXT: Function: func3 // CHECK-NEXT: Fragment: No // CHECK-NEXT: FunctionLength: 32 // CHECK-NEXT: RegF: 3 // CHECK-NEXT: RegI: 1 // CHECK-NEXT: HomedParameters: No // CHECK-NEXT: CR: 0 // CHECK-NEXT: FrameSize: 48 // CHECK-NEXT: Prologue [ // CHECK-NEXT: stp d10, d11, [sp, #24] // CHECK-NEXT: stp d8, d9, [sp, #8] // CHECK-NEXT: str x19, [sp, #-48]! // CHECK-NEXT: end // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: RuntimeFunction { // CHECK-NEXT: Function: func4 // CHECK-NEXT: Fragment: No // CHECK-NEXT: FunctionLength: 24 // CHECK-NEXT: RegF: 1 // CHECK-NEXT: RegI: 0 // CHECK-NEXT: HomedParameters: No // CHECK-NEXT: CR: 0 // CHECK-NEXT: FrameSize: 48 // CHECK-NEXT: Prologue [ // CHECK-NEXT: sub sp, sp, #32 // CHECK-NEXT: stp d8, d9, [sp, #-16]! // CHECK-NEXT: end // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: RuntimeFunction { // CHECK-NEXT: Function: func5 // CHECK-NEXT: Fragment: No // CHECK-NEXT: FunctionLength: 56 // CHECK-NEXT: RegF: 0 // CHECK-NEXT: RegI: 1 // CHECK-NEXT: HomedParameters: Yes // CHECK-NEXT: CR: 0 // CHECK-NEXT: FrameSize: 112 // CHECK-NEXT: Prologue [ // CHECK-NEXT: sub sp, sp, #32 // CHECK-NEXT: stp x6, x7, [sp, #56] // CHECK-NEXT: stp x4, x5, [sp, #40] // CHECK-NEXT: stp x2, x3, [sp, #24] // CHECK-NEXT: stp x0, x1, [sp, #8] // CHECK-NEXT: str x19, [sp, #-80]! // CHECK-NEXT: end // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: RuntimeFunction { // CHECK-NEXT: Function: func6 // CHECK-NEXT: Fragment: No // CHECK-NEXT: FunctionLength: 24 // CHECK-NEXT: RegF: 0 // CHECK-NEXT: RegI: 0 // CHECK-NEXT: HomedParameters: No // CHECK-NEXT: CR: 1 // CHECK-NEXT: FrameSize: 32 // CHECK-NEXT: Prologue [ // CHECK-NEXT: sub sp, sp, #16 // CHECK-NEXT: str lr, [sp, #-16]! // CHECK-NEXT: end // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: RuntimeFunction { // CHECK-NEXT: Function: func7 // CHECK-NEXT: Fragment: No // CHECK-NEXT: FunctionLength: 24 // CHECK-NEXT: RegF: 0 // CHECK-NEXT: RegI: 2 // CHECK-NEXT: HomedParameters: No // CHECK-NEXT: CR: 1 // CHECK-NEXT: FrameSize: 32 // CHECK-NEXT: Prologue [ // CHECK-NEXT: str lr, [sp, #16] // CHECK-NEXT: stp x19, x20, [sp, #-32]! // CHECK-NEXT: end // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: RuntimeFunction { // CHECK-NEXT: Function: func8 // CHECK-NEXT: Fragment: No // CHECK-NEXT: FunctionLength: 32 // CHECK-NEXT: RegF: 0 // CHECK-NEXT: RegI: 3 // CHECK-NEXT: HomedParameters: No // CHECK-NEXT: CR: 1 // CHECK-NEXT: FrameSize: 48 // CHECK-NEXT: Prologue [ // CHECK-NEXT: sub sp, sp, #16 // CHECK-NEXT: stp x21, lr, [sp, #16] // CHECK-NEXT: stp x19, x20, [sp, #-32]! // CHECK-NEXT: end // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: RuntimeFunction { // CHECK-NEXT: Function: func9 // CHECK-NEXT: Fragment: No // CHECK-NEXT: FunctionLength: 32 // CHECK-NEXT: RegF: 0 // CHECK-NEXT: RegI: 2 // CHECK-NEXT: HomedParameters: No // CHECK-NEXT: CR: 3 // CHECK-NEXT: FrameSize: 48 // CHECK-NEXT: Prologue [ // CHECK-NEXT: mov x29, sp // CHECK-NEXT: stp x29, lr, [sp, #-32]! // CHECK-NEXT: stp x19, x20, [sp, #-16]! // CHECK-NEXT: end // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: RuntimeFunction { // CHECK-NEXT: Function: func10 // CHECK-NEXT: Fragment: No // CHECK-NEXT: FunctionLength: 24 // CHECK-NEXT: RegF: 0 // CHECK-NEXT: RegI: 0 // CHECK-NEXT: HomedParameters: No // CHECK-NEXT: CR: 3 // CHECK-NEXT: FrameSize: 32 // CHECK-NEXT: Prologue [ // CHECK-NEXT: mov x29, sp // CHECK-NEXT: stp x29, lr, [sp, #-32]! // CHECK-NEXT: end // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: RuntimeFunction { // CHECK-NEXT: Function: func11 // CHECK-NEXT: Fragment: No // CHECK-NEXT: FunctionLength: 40 // CHECK-NEXT: RegF: 0 // CHECK-NEXT: RegI: 2 // CHECK-NEXT: HomedParameters: No // CHECK-NEXT: CR: 3 // CHECK-NEXT: FrameSize: 544 // CHECK-NEXT: Prologue [ // CHECK-NEXT: mov x29, sp // CHECK-NEXT: stp x29, lr, [sp, #0] // CHECK-NEXT: sub sp, sp, #528 // CHECK-NEXT: stp x19, x20, [sp, #-16]! // CHECK-NEXT: end // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: RuntimeFunction { // CHECK-NEXT: Function: func12 // CHECK-NEXT: Fragment: No // CHECK-NEXT: FunctionLength: 48 // CHECK-NEXT: RegF: 0 // CHECK-NEXT: RegI: 2 // CHECK-NEXT: HomedParameters: No // CHECK-NEXT: CR: 3 // CHECK-NEXT: FrameSize: 4112 // CHECK-NEXT: Prologue [ // CHECK-NEXT: mov x29, sp // CHECK-NEXT: stp x29, lr, [sp, #0] // CHECK-NEXT: sub sp, sp, #16 // CHECK-NEXT: sub sp, sp, #4080 // CHECK-NEXT: stp x19, x20, [sp, #-16]! // CHECK-NEXT: end // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: RuntimeFunction { // CHECK-NEXT: Function: func13 // CHECK-NEXT: Fragment: No // CHECK-NEXT: FunctionLength: 32 // CHECK-NEXT: RegF: 0 // CHECK-NEXT: RegI: 2 // CHECK-NEXT: HomedParameters: No // CHECK-NEXT: CR: 0 // CHECK-NEXT: FrameSize: 4112 // CHECK-NEXT: Prologue [ // CHECK-NEXT: sub sp, sp, #16 // CHECK-NEXT: sub sp, sp, #4080 // CHECK-NEXT: stp x19, x20, [sp, #-16]! // CHECK-NEXT: end // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: RuntimeFunction { // CHECK-NEXT: Function: func14 // CHECK-NEXT: Fragment: No // CHECK-NEXT: FunctionLength: 32 // CHECK-NEXT: RegF: 2 // CHECK-NEXT: RegI: 0 // CHECK-NEXT: HomedParameters: No // CHECK-NEXT: CR: 1 // CHECK-NEXT: FrameSize: 32 // CHECK-NEXT: Prologue [ // CHECK-NEXT: str d10, [sp, #24] // CHECK-NEXT: stp d8, d9, [sp, #8] // CHECK-NEXT: str lr, [sp, #-32]! // CHECK-NEXT: end // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK-NEXT: RuntimeFunction { // CHECK-NEXT: Function: func15 // CHECK-NEXT: Fragment: No // CHECK-NEXT: FunctionLength: 20 // CHECK-NEXT: RegF: 0 // CHECK-NEXT: RegI: 0 // CHECK-NEXT: HomedParameters: No // CHECK-NEXT: CR: 3 // CHECK-NEXT: FrameSize: 32 // CHECK-NEXT: Prologue [ // CHECK-NEXT: mov x29, sp // CHECK-NEXT: stp x29, lr, [sp, #-32]! // CHECK-NEXT: end // CHECK-NEXT: ] // CHECK-NEXT: } // CHECK: RuntimeFunction { // CHECK-NEXT: Function: nonpacked1 // CHECK-NEXT: ExceptionRecord: // CHECK-NEXT: ExceptionData { // CHECK: EpiloguePacked: Yes // CHECK: RuntimeFunction { // CHECK-NEXT: Function: nonpacked2 // CHECK-NEXT: ExceptionRecord: // CHECK-NEXT: ExceptionData { // CHECK: EpiloguePacked: Yes // CHECK: RuntimeFunction { // CHECK-NEXT: Function: nonpacked3 // CHECK-NEXT: ExceptionRecord: // CHECK-NEXT: ExceptionData { // CHECK: EpiloguePacked: Yes // CHECK: RuntimeFunction { // CHECK-NEXT: Function: nonpacked4 // CHECK-NEXT: ExceptionRecord: // CHECK-NEXT: ExceptionData { // CHECK: EpiloguePacked: Yes // CHECK: RuntimeFunction { // CHECK-NEXT: Function: nonpacked5 // CHECK-NEXT: ExceptionRecord: // CHECK-NEXT: ExceptionData { // CHECK: EpiloguePacked: Yes // CHECK: RuntimeFunction { // CHECK-NEXT: Function: nonpacked6 // CHECK-NEXT: ExceptionRecord: // CHECK-NEXT: ExceptionData { // CHECK: EpiloguePacked: Yes // CHECK: RuntimeFunction { // CHECK-NEXT: Function: nonpacked7 // CHECK-NEXT: ExceptionRecord: // CHECK-NEXT: ExceptionData { // CHECK: EpiloguePacked: Yes // CHECK: RuntimeFunction { // CHECK-NEXT: Function: nonpacked8 // CHECK-NEXT: ExceptionRecord: // CHECK-NEXT: ExceptionData { // CHECK: EpiloguePacked: Yes // CHECK: RuntimeFunction { // CHECK-NEXT: Function: nonpacked9 // CHECK-NEXT: ExceptionRecord: // CHECK-NEXT: ExceptionData { // CHECK: EpiloguePacked: Yes // CHECK: RuntimeFunction { // CHECK-NEXT: Function: nonpacked10 // CHECK-NEXT: ExceptionRecord: // CHECK-NEXT: ExceptionData { // CHECK: EpiloguePacked: Yes // CHECK: RuntimeFunction { // CHECK-NEXT: Function: nonpacked11 // CHECK-NEXT: ExceptionRecord: // CHECK-NEXT: ExceptionData { // CHECK: EpiloguePacked: Yes // CHECK: RuntimeFunction { // CHECK-NEXT: Function: nonpacked12 // CHECK-NEXT: ExceptionRecord: // CHECK-NEXT: ExceptionData { // CHECK: EpiloguePacked: Yes // CHECK: RuntimeFunction { // CHECK-NEXT: Function: nonpacked13 // CHECK-NEXT: ExceptionRecord: // CHECK-NEXT: ExceptionData { // CHECK: EpiloguePacked: Yes .text func1: .seh_proc func1 stp x19, x20, [sp, #-144]! .seh_save_r19r20_x 144 stp x21, x22, [sp, #16] .seh_save_regp x21, 16 stp x23, x24, [sp, #32] .seh_save_next stp x25, x26, [sp, #48] .seh_save_next stp x27, x28, [sp, #64] .seh_save_next stp d8, d9, [sp, #80] .seh_save_fregp d8, 80 stp d10, d11, [sp, #96] .seh_save_fregp d10, 96 stp d12, d13, [sp, #112] .seh_save_fregp d12, 112 stp d14, d15, [sp, #128] .seh_save_fregp d14, 128 sub sp, sp, #16 .seh_stackalloc 16 .seh_endprologue nop .seh_startepilogue add sp, sp, #16 .seh_stackalloc 16 ldp d14, d15, [sp, #128] .seh_save_fregp d14, 128 ldp d12, d13, [sp, #112] .seh_save_fregp d12, 112 ldp d10, d11, [sp, #96] .seh_save_fregp d10, 96 ldp d8, d9, [sp, #80] .seh_save_fregp d8, 80 ldp x27, x28, [sp, #64] .seh_save_next ldp x25, x26, [sp, #48] .seh_save_next ldp x23, x24, [sp, #32] .seh_save_next ldp x21, x22, [sp, #16] .seh_save_next ldp x19, x20, [sp], #144 .seh_save_regp_x x19, 144 .seh_endepilogue ret .seh_endproc func2: .seh_proc func2 stp x19, x20, [sp, #-48]! .seh_save_r19r20_x 48 str x21, [sp, #16] .seh_save_reg x21, 16 stp d8, d9, [sp, #24] .seh_save_fregp d8, 24 str d10, [sp, #40] .seh_save_freg d10, 40 sub sp, sp, #0 .seh_stackalloc 0 .seh_endprologue nop .seh_startepilogue add sp, sp, #0 .seh_stackalloc 0 ldr d10, [sp, #40] .seh_save_freg d10, 40 ldp d8, d9, [sp, #24] .seh_save_fregp d8, 24 ldr x21, [sp, #16] .seh_save_reg x21, 16 ldp x19, x20, [sp], #48 .seh_save_r19r20_x 48 .seh_endepilogue ret .seh_endproc func3: .seh_proc func3 str x19, [sp, #-48]! .seh_save_reg_x x19, 48 stp d8, d9, [sp, #8] .seh_save_fregp d8, 8 stp d10, d11, [sp, #24] .seh_save_fregp d10, 24 .seh_endprologue nop .seh_startepilogue ldp d10, d11, [sp, #24] .seh_save_fregp d10, 24 ldp d8, d9, [sp, #8] .seh_save_fregp d8, 8 ldr x19, [sp], #48 .seh_save_reg_x x19, 48 .seh_endepilogue ret .seh_endproc func4: .seh_proc func4 stp d8, d9, [sp, #-16]! .seh_save_fregp_x d8, 16 sub sp, sp, #32 .seh_stackalloc 32 .seh_endprologue nop .seh_startepilogue add sp, sp, #32 .seh_stackalloc 32 ldp d8, d9, [sp], #16 .seh_save_fregp_x d8, 16 .seh_endepilogue ret .seh_endproc func5: .seh_proc func5 str x19, [sp, #-80]! .seh_save_reg_x x19, 80 stp x0, x1, [sp, #8] .seh_nop stp x2, x3, [sp, #24] .seh_nop stp x4, x5, [sp, #40] .seh_nop stp x6, x7, [sp, #56] .seh_nop sub sp, sp, #32 .seh_stackalloc 32 .seh_endprologue nop .seh_startepilogue add sp, sp, #32 .seh_stackalloc 32 nop .seh_nop nop .seh_nop nop .seh_nop nop .seh_nop ldr x19, [sp], #80 .seh_save_reg_x x19, 80 .seh_endepilogue ret .seh_endproc func6: .seh_proc func6 str lr, [sp, #-16]! .seh_save_reg_x lr, 16 sub sp, sp, #16 .seh_stackalloc 16 .seh_endprologue nop .seh_startepilogue add sp, sp, #16 .seh_stackalloc 16 ldr lr, [sp], #16 .seh_save_reg_x lr, 16 .seh_endepilogue ret .seh_endproc func7: .seh_proc func7 stp x19, x20, [sp, #-32]! .seh_save_r19r20_x 32 str lr, [sp, #16] .seh_save_reg lr, 16 .seh_endprologue nop .seh_startepilogue ldr lr, [sp, #16] .seh_save_reg lr, 16 ldp x19, x20, [sp], #32 .seh_save_r19r20_x 32 .seh_endepilogue ret .seh_endproc func8: .seh_proc func8 stp x19, x20, [sp, #-32]! .seh_save_r19r20_x 32 stp x21, lr, [sp, #16] .seh_save_lrpair x21, 16 sub sp, sp, #16 .seh_stackalloc 16 .seh_endprologue nop .seh_startepilogue add sp, sp, #16 .seh_stackalloc 16 ldp x21, lr, [sp, #16] .seh_save_lrpair x21, 16 ldp x19, x20, [sp], #32 .seh_save_r19r20_x 32 .seh_endepilogue ret .seh_endproc func9: .seh_proc func9 stp x19, x20, [sp, #-16]! .seh_save_r19r20_x 16 stp x29, lr, [sp, #-32]! .seh_save_fplr_x 32 mov x29, sp .seh_set_fp .seh_endprologue nop .seh_startepilogue mov sp, x29 .seh_set_fp ldp x29, lr, [sp], #32 .seh_save_fplr_x 32 ldp x19, x20, [sp], #16 .seh_save_r19r20_x 16 .seh_endepilogue ret .seh_endproc func10: .seh_proc func10 stp x29, lr, [sp, #-32]! .seh_save_fplr_x 32 mov x29, sp .seh_set_fp .seh_endprologue nop .seh_startepilogue mov sp, x29 .seh_set_fp ldp x29, lr, [sp], #32 .seh_save_fplr_x 32 .seh_endepilogue ret .seh_endproc func11: .seh_proc func11 stp x19, x20, [sp, #-16]! .seh_save_r19r20_x 16 sub sp, sp, #528 .seh_stackalloc 528 stp x29, lr, [sp, #0] .seh_save_fplr 0 mov x29, sp .seh_set_fp .seh_endprologue nop .seh_startepilogue mov sp, x29 .seh_set_fp ldp x29, lr, [sp, #0] .seh_save_fplr 0 add sp, sp, #528 .seh_stackalloc 528 ldp x19, x20, [sp], #16 .seh_save_r19r20_x 16 .seh_endepilogue ret .seh_endproc func12: .seh_proc func12 stp x19, x20, [sp, #-16]! .seh_save_r19r20_x 16 sub sp, sp, #4080 .seh_stackalloc 4080 sub sp, sp, #16 .seh_stackalloc 16 stp x29, lr, [sp, #0] .seh_save_fplr 0 mov x29, sp .seh_set_fp .seh_endprologue nop .seh_startepilogue mov sp, x29 .seh_set_fp ldp x29, lr, [sp, #0] .seh_save_fplr 0 add sp, sp, #16 .seh_stackalloc 16 add sp, sp, #4080 .seh_stackalloc 4080 ldp x19, x20, [sp], #16 .seh_save_r19r20_x 16 .seh_endepilogue ret .seh_endproc func13: .seh_proc func13 stp x19, x20, [sp, #-16]! .seh_save_r19r20_x 16 sub sp, sp, #4080 .seh_stackalloc 4080 sub sp, sp, #16 .seh_stackalloc 16 .seh_endprologue nop .seh_startepilogue add sp, sp, #16 .seh_stackalloc 16 add sp, sp, #4080 .seh_stackalloc 4080 ldp x19, x20, [sp], #16 .seh_save_r19r20_x 16 .seh_endepilogue ret .seh_endproc func14: .seh_proc func14 str lr, [sp, #-32]! .seh_save_reg_x lr, 32 stp d8, d9, [sp, #8] .seh_save_fregp d8, 8 str d10, [sp, #24] .seh_save_freg d10, 24 .seh_endprologue nop .seh_startepilogue ldr d10, [sp, #24] .seh_save_freg d10, 24 ldp d8, d9, [sp, #8] .seh_save_fregp d8, 8 ldr lr, [sp], #32 .seh_save_reg_x lr, 32 .seh_endepilogue ret .seh_endproc func15: .seh_proc func15 stp x29, lr, [sp, #-32]! .seh_save_fplr_x 32 mov x29, sp .seh_set_fp .seh_endprologue nop .seh_startepilogue // Epilogue missing the .seh_set_fp, but still generating packed info. ldp x29, lr, [sp], #32 .seh_save_fplr_x 32 .seh_endepilogue ret .seh_endproc nonpacked1: .seh_proc nonpacked1 // Can't be packed; can't save integer registers after float registers. stp d8, d9, [sp, #-32]! .seh_save_fregp_x d8, 32 stp x19, x20, [sp, #16]! .seh_save_regp x19, 16 .seh_endprologue nop .seh_startepilogue ldp x19, x20, [sp, #16] .seh_save_regp x19, 16 ldp d8, d9, [sp], #32 .seh_save_fregp_x d8, 32 .seh_endepilogue ret .seh_endproc nonpacked2: .seh_proc nonpacked2 // Can't be packed; x21/x22 aren't saved in the expected spot stp x19, x20, [sp, #-48]! .seh_save_r19r20_x 48 stp x21, x22, [sp, #32] .seh_save_regp x21, 32 .seh_endprologue nop .seh_startepilogue ldp x21, x22, [sp, #32] .seh_save_regp x21, 32 ldp x19, x20, [sp], #48 .seh_save_r19r20_x 48 .seh_endepilogue ret .seh_endproc nonpacked3: .seh_proc nonpacked3 // Can't be packed; x29/x30 can't be treated as the other saved registers stp x19, x20, [sp, #-96]! .seh_save_r19r20_x 96 stp x21, x22, [sp, #16] .seh_save_next stp x23, x24, [sp, #32] .seh_save_next stp x25, x26, [sp, #48] .seh_save_next stp x27, x28, [sp, #64] .seh_save_next stp x29, x30, [sp, #80] .seh_save_next .seh_endprologue nop .seh_startepilogue ldp x29, x30, [sp, #80] .seh_save_next ldp x27, x28, [sp, #64] .seh_save_next ldp x25, x26, [sp, #48] .seh_save_next ldp x23, x24, [sp, #32] .seh_save_next ldp x21, x22, [sp, #16] .seh_save_next ldp x19, x20, [sp], #96 .seh_save_r19r20_x 96 .seh_endepilogue ret .seh_endproc nonpacked4: .seh_proc nonpacked4 // Can't be packed; more predecrement for x19/x20 than used for // corresponding RegI/RegF/LR saves stp x19, x20, [sp, #-32]! .seh_save_r19r20_x 32 .seh_endprologue nop .seh_startepilogue ldp x19, x20, [sp], #32 .seh_save_r19r20_x 32 .seh_endepilogue ret .seh_endproc nonpacked5: .seh_proc nonpacked5 // Can't be packed; can't save LR twice stp x19, x20, [sp, #-32]! .seh_save_r19r20_x 32 str lr, [sp, #16] .seh_save_reg lr, 16 str lr, [sp, #24] .seh_save_reg lr, 24 .seh_endprologue nop .seh_startepilogue ldr lr, [sp, #24] .seh_save_reg lr, 24 ldr lr, [sp, #16] .seh_save_reg lr, 16 ldp x19, x20, [sp], #32 .seh_save_r19r20_x 32 .seh_endepilogue ret .seh_endproc nonpacked6: .seh_proc nonpacked6 // Can't be packed; can't save LR both standalone (CR 1) and as FPLR (CR 3) stp x19, x20, [sp, #-32]! .seh_save_r19r20_x 32 str lr, [sp, #16] .seh_save_reg lr, 16 stp x29, lr, [sp, #-16]! .seh_save_fplr_x 16 mov x29, sp .seh_set_fp .seh_endprologue nop .seh_startepilogue mov sp, x29 .seh_set_fp ldp x29, lr, [sp], #32 .seh_save_fplr_x 16 ldr lr, [sp, #16] .seh_save_reg lr, 16 ldp x19, x20, [sp], #32 .seh_save_r19r20_x 32 .seh_endepilogue ret .seh_endproc nonpacked7: .seh_proc nonpacked7 // Can't be packed; too many saved FP regs stp d8, d9, [sp, #-80]! .seh_save_fregp_x d8, 80 stp d10, d11, [sp, #16] .seh_save_fregp d10, 16 stp d12, d13, [sp, #32] .seh_save_fregp d12, 32 stp d14, d15, [sp, #48] .seh_save_fregp d14, 48 stp d16, d17, [sp, #64] .seh_save_next .seh_endprologue nop .seh_startepilogue ldp d16, d17, [sp, #64] .seh_save_next ldp d14, d15, [sp, #48] .seh_save_fregp d14, 48 ldp d12, d13, [sp, #32] .seh_save_fregp d12, 32 ldp d10, d11, [sp, #16] .seh_save_fregp d10, 16 ldp d8, d9, [sp], #80 .seh_save_fregp_x d8, 80 .seh_endepilogue ret .seh_endproc nonpacked8: .seh_proc nonpacked8 // Can't be packed; Can't handle only a single FP reg str d8, [sp, #-16]! .seh_save_freg_x d8, 16 .seh_endprologue nop .seh_startepilogue ldr d8, [sp], #16 .seh_save_freg_x d8, 16 .seh_endepilogue ret .seh_endproc nonpacked9: .seh_proc nonpacked9 // Can't be packed; can't have a separate stack adjustment with save_fplr_x sub sp, sp, #32 .seh_stackalloc 32 stp x29, lr, [sp, #-16]! .seh_save_fplr_x 16 mov x29, sp .seh_set_fp .seh_endprologue nop .seh_startepilogue mov sp, x29 .seh_set_fp ldp x29, lr, [sp], #32 .seh_save_fplr_x 16 add sp, sp, #32 .seh_stackalloc 32 .seh_endepilogue ret .seh_endproc nonpacked10: .seh_proc nonpacked10 // Can't be packed; wrong predecrement stp x19, x20, [sp, #-16]! .seh_save_r19r20_x 16 stp x21, x22, [sp, #16] .seh_save_next .seh_endprologue nop .seh_startepilogue ldp x21, x22, [sp, #16] .seh_save_next ldp x19, x20, [sp], #16 .seh_save_r19r20_x 16 .seh_endepilogue ret .seh_endproc nonpacked11: .seh_proc nonpacked11 // Can't be packed; too big stack allocation sub sp, sp, #4080 .seh_stackalloc 4080 sub sp, sp, #8192 .seh_stackalloc 8192 .seh_endprologue nop .seh_startepilogue add sp, sp, #8192 .seh_stackalloc 8192 add sp, sp, #4080 .seh_stackalloc 4080 .seh_endepilogue ret .seh_endproc nonpacked12: .seh_proc nonpacked12 // Can't be packed; missing .seh_set_fp stp x29, lr, [sp, #-32]! .seh_save_fplr_x 32 .seh_endprologue nop .seh_startepilogue ldp x29, lr, [sp], #32 .seh_save_fplr_x 32 .seh_endepilogue ret .seh_endproc nonpacked13: .seh_proc nonpacked13 // Can't be packed; not doing a packed info if .seh_handlerdata is used sub sp, sp, #16 .seh_stackalloc 16 .seh_endprologue nop .seh_startepilogue add sp, sp, #16 .seh_stackalloc 16 .seh_endepilogue ret .seh_endfunclet .seh_handlerdata .long 0 .text .seh_endproc