| ; RUN: llc -mtriple aarch64-unknown-windows-msvc -filetype asm -o - %s | FileCheck %s |
| ; RUN: llc -mtriple aarch64-unknown-windows-msvc -filetype obj -o - %s | llvm-readobj -u - | FileCheck %s -check-prefix CHECK-UNWIND |
| |
| declare dso_local void @g(ptr noundef) |
| define dso_local preserve_mostcc void @f(ptr noundef %p) #0 { |
| entry: |
| %p.addr = alloca ptr, align 8 |
| store ptr %p, ptr %p.addr, align 8 |
| %0 = load ptr, ptr %p.addr, align 8 |
| call void @g(ptr noundef %0) |
| ret void |
| } |
| |
| attributes #0 = { nounwind uwtable(sync) } |
| |
| ; CHECK: str x30, [sp, #16] |
| ; CHECK-NEXT: .seh_save_reg x30, 16 |
| ; CHECK: str x9, [sp, #24] |
| ; CHECK-NEXT: .seh_save_any_reg x9, 24 |
| ; CHECK: stp x10, x11, [sp, #32 |
| ; CHECK-NEXT: .seh_save_any_reg_p x10, 32 |
| ; CHECK: stp x12, x13, [sp, #48] |
| ; CHECK-NEXT: .seh_save_any_reg_p x12, 48 |
| ; CHECK: stp x14, x15, [sp, #64] |
| ; CHECK-NEXT: .seh_save_any_reg_p x14, 64 |
| ; CHECK: .seh_endprologue |
| |
| ; CHECK: .seh_startepilogue |
| ; CHECK: ldp x14, x15, [sp, #64] |
| ; CHECK-NEXT: .seh_save_any_reg_p x14, 64 |
| ; CHECK: ldp x12, x13, [sp, #48] |
| ; CHECK-NEXT: .seh_save_any_reg_p x12, 48 |
| ; CHECK: ldp x10, x11, [sp, #32 |
| ; CHECK-NEXT: .seh_save_any_reg_p x10, 32 |
| ; CHECK: ldr x9, [sp, #24] |
| ; CHECK-NEXT: .seh_save_any_reg x9, 24 |
| ; CHECK: ldr x30, [sp, #16] |
| ; CHECK-NEXT: .seh_save_reg x30, 16 |
| |
| ; CHECK: .seh_endepilogue |
| |
| ; CHECK-UNWIND: Prologue [ |
| ; CHECK-UNWIND: 0xe74e04 ; stp x14, x15, [sp, #64] |
| ; CHECK-UNWIND: 0xe74c03 ; stp x12, x13, [sp, #48] |
| ; CHECK-UNWIND: 0xe74a02 ; stp x10, x11, [sp, #32] |
| ; CHECK-UNWIND: 0xe70903 ; str x9, [sp, #24] |
| ; CHECK-UNWIND: 0xd2c2 ; str x30, [sp, #16] |
| ; CHECK-UNWIND: 0x05 ; sub sp, #80 |
| ; CHECK-UNWIND: 0xe4 ; end |
| ; CHECK-UNWIND: ] |