; RUN: llc -mtriple=x86_64-pc-windows-msvc -mattr=+avx < %s | FileCheck %s

; void foo(void)
; {
;   __asm("nop" ::: "bx", "cx", "xmm5", "xmm6", "ymm7");
;   try {
;     throw;
;   }
;   catch (int x) {
;   }
; }

%rtti.TypeDescriptor2 = type { i8**, i8*, [3 x i8] }
%eh.ThrowInfo = type { i32, i8*, i8*, i8* }

$"??_R0H@8" = comdat any

@"??_7type_info@@6B@" = external constant i8*
@"??_R0H@8" = linkonce_odr global %rtti.TypeDescriptor2 { i8** @"??_7type_info@@6B@", i8* null, [3 x i8] c".H\00" }, comdat

declare dso_local i32 @__CxxFrameHandler3(...)
declare dso_local x86_stdcallcc void @_CxxThrowException(i8*, %eh.ThrowInfo*)

define dso_local void @"?foo@@YAXXZ"() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
entry:
  %x = alloca i32, align 4
  call void asm sideeffect "nop", "~{bx},~{cx},~{xmm5},~{xmm6},~{ymm7}"()
  invoke void @_CxxThrowException(i8* null, %eh.ThrowInfo* null)
          to label %unreachable unwind label %catch.dispatch

catch.dispatch:                                   ; preds = %entry
  %0 = catchswitch within none [label %catch] unwind to caller

catch:                                            ; preds = %catch.dispatch
  %1 = catchpad within %0 [%rtti.TypeDescriptor2* @"??_R0H@8", i32 0, i32* %x]
  catchret from %1 to label %catchret.dest

catchret.dest:                                    ; preds = %catch
  br label %try.cont

try.cont:                                         ; preds = %catchret.dest
  ret void

unreachable:                                      ; preds = %entry
  unreachable
}

; CHECK: # %catch
; CHECK: movq    %rdx, 16(%rsp)
; CHECK: pushq   %rbp
; CHECK: .seh_pushreg 5
; CHECK: pushq   %rbx
; CHECK: .seh_pushreg 3
; CHECK: subq    $72, %rsp
; CHECK: .seh_stackalloc 72
; CHECK: leaq    80(%rdx), %rbp
; CHECK: vmovaps %xmm7, 48(%rsp)
; CHECK: .seh_savexmm 7, 48
; CHECK: vmovaps %xmm6, 32(%rsp)
; CHECK: .seh_savexmm 6, 32
; CHECK: .seh_endprologue
; CHECK: vmovaps 32(%rsp), %xmm6
; CHECK: vmovaps 48(%rsp), %xmm7
; CHECK: leaq    .LBB0_3(%rip), %rax
; CHECK: addq    $72, %rsp
; CHECK: popq    %rbx
; CHECK: popq    %rbp
; CHECK: retq # CATCHRET

; CHECK-LABEL: "$handlerMap$0$?foo@@YAXXZ":
; CHECK-NEXT: .long   0                       # Adjectives
; CHECK-NEXT: .long   "??_R0H@8"@IMGREL       # Type
; CHECK-NEXT: .long   44                      # CatchObjOffset
; CHECK-NEXT: .long   "?catch${{.*}}??foo@@YAXXZ@4HA"@IMGREL # Handler
; Sum of:
;   16 RDX store offset
;   16 two pushes
;   72 stack alloc
; CHECK-NEXT: .long   104                     # ParentFrameOffset
