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 6 declare void @g() 7 declare i32 @__CxxFrameHandler3(...) 8 9 @fp_global = global double 0.0 10 11 define 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 19 return: 20 ret void 21 22 catch.dispatch: 23 %cs1 = catchswitch within none [label %catch] unwind to caller 24 25 catch: 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