[AVX512] add PSLLD and PSLLQ Intrinsic
[oota-llvm.git] / test / CodeGen / X86 / cleanuppad-realign.ll
1 ; RUN: llc -mtriple=i686-pc-windows-msvc < %s | FileCheck --check-prefix=X86 %s
2 ; RUN: llc -mtriple=x86_64-pc-windows-msvc < %s | FileCheck --check-prefix=X64 %s
3
4 declare i32 @__CxxFrameHandler3(...)
5 declare void @Dtor(i64* %o)
6 declare void @f(i32)
7
8 define void @realigned_cleanup() personality i32 (...)* @__CxxFrameHandler3 {
9 entry:
10   ; Overalign %o to cause stack realignment.
11   %o = alloca i64, align 32
12   invoke void @f(i32 1)
13           to label %invoke.cont unwind label %ehcleanup
14
15 invoke.cont:                                      ; preds = %entry
16   call void @Dtor(i64* %o)
17   ret void
18
19 ehcleanup:                                        ; preds = %entry
20   %0 = cleanuppad within none []
21   call void @Dtor(i64* %o) [ "funclet"(token %0) ]
22   cleanupret from %0 unwind to caller
23 }
24
25 ; X86-LABEL: _realigned_cleanup: # @realigned_cleanup
26 ; X86:         pushl   %ebp
27 ; X86:         movl    %esp, %ebp
28 ; X86:         pushl   %ebx
29 ; X86:         pushl   %edi
30 ; X86:         pushl   %esi
31 ; X86:         andl    $-32, %esp
32 ; X86:         subl    $96, %esp
33 ; X86:         movl    %esp, %esi
34 ;       EBP will reload from this offset.
35 ; X86:         movl    %ebp, 28(%esi)
36 ;       The last EH reg field is the state number, so dtor adjust is this +4.
37 ; X86:         movl    $-1, 72(%esi)
38
39 ; X86-LABEL: "?dtor$2@?0?realigned_cleanup@4HA":
40 ; X86:         pushl   %ebp
41 ; X86:         leal    -76(%ebp), %esi
42 ; X86:         movl    28(%esi), %ebp
43 ;       We used to have a bug where we clobbered ESI after the prologue.
44 ; X86-NOT:      movl {{.*}}, %esi
45 ; X86:         popl    %ebp
46 ; X86:         retl                            # CLEANUPRET
47
48 ; X64-LABEL: realigned_cleanup: # @realigned_cleanup
49 ; X64:         pushq   %rbp
50 ; X64:         .seh_pushreg 5
51 ; X64:         pushq   %rbx
52 ; X64:         .seh_pushreg 3
53 ; X64:         subq    $104, %rsp
54 ; X64:         .seh_stackalloc 104
55 ; X64:         leaq    96(%rsp), %rbp
56 ; X64:         .seh_setframe 5, 96
57 ; X64:         .seh_endprologue
58 ; X64:         andq    $-32, %rsp
59 ; X64:         movq    %rsp, %rbx
60 ;       RBP will reload from this offset.
61 ; X64:         movq    %rbp, 56(%rbx)
62 ; X64:         movq    $-2, (%rbp)
63
64 ; X64-LABEL: "?dtor$2@?0?realigned_cleanup@4HA":
65 ; X64:         movq    %rdx, 16(%rsp)
66 ; X64:         pushq   %rbp
67 ; X64:         .seh_pushreg 5
68 ; X64:         pushq   %rbx
69 ; X64:         .seh_pushreg 3
70 ; X64:         subq    $40, %rsp
71 ; X64:         .seh_stackalloc 40
72 ; X64:         leaq    96(%rdx), %rbp
73 ; X64:         .seh_endprologue
74 ; X64:         andq    $-32, %rdx
75 ; X64:         movq    %rdx, %rbx
76 ; X64-NOT:      mov{{.*}}, %rbx
77 ; X64:         popq    %rbp
78 ; X64:         retq                            # CLEANUPRET