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