1; RUN: llc -mtriple=x86_64-pc-windows-msvc -verify-machineinstrs < %s | FileCheck %s 2 3; We should store -2 into UnwindHelp in a slot immediately after the last XMM 4; CSR save. 5 6declare void @g() 7declare i32 @__CxxFrameHandler3(...) 8 9@fp_global = global double 0.0 10 11define void @f() personality i32 (...)* @__CxxFrameHandler3 { 12 %v = load double, double* @fp_global 13 call void @g() 14 %v1 = fadd double %v, 1.0 15 store double %v1, double* @fp_global 16 invoke void @g() 17 to label %return unwind label %catch.dispatch 18 19return: 20 ret void 21 22catch.dispatch: 23 %cs1 = catchswitch within none [label %catch] unwind to caller 24 25catch: 26 %p = catchpad within %cs1 [i8* null, i32 64, i8* null] 27 catchret from %p to label %return 28} 29 30; CHECK: f: # @f 31; CHECK: pushq %rbp 32; CHECK: .seh_pushreg 5 33; CHECK: subq $64, %rsp 34; CHECK: .seh_stackalloc 64 35; CHECK: leaq 64(%rsp), %rbp 36; CHECK: .seh_setframe 5, 64 37; CHECK: movaps %xmm6, -16(%rbp) # 16-byte Spill 38; CHECK: .seh_savexmm 6, 48 39; CHECK: .seh_endprologue 40; CHECK: movq $-2, -24(%rbp) 41; CHECK: movsd fp_global(%rip), %xmm6 # xmm6 = mem[0],zero 42; CHECK: callq g 43; CHECK: addsd __real@3ff0000000000000(%rip), %xmm6 44; CHECK: movsd %xmm6, fp_global(%rip) 45; CHECK: .Ltmp{{.*}} 46; CHECK: callq g 47; CHECK: .Ltmp{{.*}} 48; CHECK: .LBB{{.*}} # Block address taken 49; CHECK: movaps -16(%rbp), %xmm6 50; CHECK: addq $64, %rsp 51; CHECK: popq %rbp 52; CHECK: retq 53; CHECK: .seh_handlerdata 54