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 %rbp
33; CHECK: subq    $64, %rsp
34; CHECK: .seh_stackalloc 64
35; CHECK: leaq    64(%rsp), %rbp
36; CHECK: .seh_setframe %rbp, 64
37; CHECK: movaps  %xmm6, -16(%rbp)        # 16-byte Spill
38; CHECK: .seh_savexmm %xmm6, 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; CHECK: # %catch
55; CHECK: movq    %rdx, 16(%rsp)
56; CHECK: pushq   %rbp
57; CHECK: .seh_pushreg %rbp
58; CHECK: subq    $48, %rsp
59; CHECK: .seh_stackalloc 48
60; CHECK: leaq    64(%rdx), %rbp
61; CHECK: movapd  %xmm6, 32(%rsp)
62; CHECK: .seh_savexmm %xmm6, 32
63; CHECK: .seh_endprologue
64; CHECK: movapd  32(%rsp), %xmm6
65; CHECK: leaq    .LBB0_1(%rip), %rax
66; CHECK: addq    $48, %rsp
67; CHECK: popq    %rbp
68; CHECK: retq # CATCHRET
69