Compiler projects using llvm
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq | FileCheck %s

define dso_local void @gather_mask_dps(<16 x i32> %ind, <16 x float> %src, i16 %mask, ptr %base, ptr %stbuf) {
; CHECK-LABEL: gather_mask_dps:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %edi, %k1
; CHECK-NEXT:    kmovq %k1, %k2
; CHECK-NEXT:    vgatherdps (%rsi,%zmm0,4), %zmm1 {%k2}
; CHECK-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
; CHECK-NEXT:    vscatterdps %zmm1, (%rdx,%zmm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i16 %mask to <16 x i1>
  %x = call <16 x float> @llvm.x86.avx512.mask.gather.dps.512(<16 x float> %src, ptr %base, <16 x i32> %ind, <16 x i1> %1, i32 4)
  %ind2 = add <16 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
  call void @llvm.x86.avx512.mask.scatter.dps.512(ptr %stbuf, <16 x i1> %1, <16 x i32> %ind2, <16 x float> %x, i32 4)
  ret void
}

define dso_local void @gather_mask_dpd(<8 x i32> %ind, <8 x double> %src, i8 %mask, ptr %base, ptr %stbuf) {
; CHECK-LABEL: gather_mask_dpd:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %edi, %k1
; CHECK-NEXT:    kmovq %k1, %k2
; CHECK-NEXT:    vgatherdpd (%rsi,%ymm0,4), %zmm1 {%k2}
; CHECK-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
; CHECK-NEXT:    vscatterdpd %zmm1, (%rdx,%ymm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %mask to <8 x i1>
  %x = call <8 x double> @llvm.x86.avx512.mask.gather.dpd.512(<8 x double> %src, ptr %base, <8 x i32> %ind, <8 x i1> %1, i32 4)
  %ind2 = add <8 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
  call void @llvm.x86.avx512.mask.scatter.dpd.512(ptr %stbuf, <8 x i1> %1, <8 x i32> %ind2, <8 x double> %x, i32 4)
  ret void
}

define dso_local void @gather_mask_qps(<8 x i64> %ind, <8 x float> %src, i8 %mask, ptr %base, ptr %stbuf) {
; CHECK-LABEL: gather_mask_qps:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %edi, %k1
; CHECK-NEXT:    kmovq %k1, %k2
; CHECK-NEXT:    vgatherqps (%rsi,%zmm0,4), %ymm1 {%k2}
; CHECK-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
; CHECK-NEXT:    vscatterqps %ymm1, (%rdx,%zmm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %mask to <8 x i1>
  %x = call <8 x float> @llvm.x86.avx512.mask.gather.qps.512(<8 x float> %src, ptr %base, <8 x i64> %ind, <8 x i1> %1, i32 4)
  %ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
  call void @llvm.x86.avx512.mask.scatter.qps.512(ptr %stbuf, <8 x i1> %1, <8 x i64> %ind2, <8 x float> %x, i32 4)
  ret void
}

define dso_local void @gather_mask_qpd(<8 x i64> %ind, <8 x double> %src, i8 %mask, ptr %base, ptr %stbuf) {
; CHECK-LABEL: gather_mask_qpd:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %edi, %k1
; CHECK-NEXT:    kmovq %k1, %k2
; CHECK-NEXT:    vgatherqpd (%rsi,%zmm0,4), %zmm1 {%k2}
; CHECK-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
; CHECK-NEXT:    vscatterqpd %zmm1, (%rdx,%zmm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %mask to <8 x i1>
  %x = call <8 x double> @llvm.x86.avx512.mask.gather.qpd.512(<8 x double> %src, ptr %base, <8 x i64> %ind, <8 x i1> %1, i32 4)
  %ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
  call void @llvm.x86.avx512.mask.scatter.qpd.512(ptr %stbuf, <8 x i1> %1, <8 x i64> %ind2, <8 x double> %x, i32 4)
  ret void
}
;;
;; Integer Gather/Scatter
;;

define dso_local void @gather_mask_dd(<16 x i32> %ind, <16 x i32> %src, i16 %mask, ptr %base, ptr %stbuf) {
; CHECK-LABEL: gather_mask_dd:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %edi, %k1
; CHECK-NEXT:    kmovq %k1, %k2
; CHECK-NEXT:    vpgatherdd (%rsi,%zmm0,4), %zmm1 {%k2}
; CHECK-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
; CHECK-NEXT:    vpscatterdd %zmm1, (%rdx,%zmm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i16 %mask to <16 x i1>
  %x = call <16 x i32> @llvm.x86.avx512.mask.gather.dpi.512(<16 x i32> %src, ptr %base, <16 x i32> %ind, <16 x i1> %1, i32 4)
  %ind2 = add <16 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
  call void @llvm.x86.avx512.mask.scatter.dpi.512(ptr %stbuf, <16 x i1> %1, <16 x i32> %ind2, <16 x i32> %x, i32 4)
  ret void
}

define dso_local void @gather_mask_qd(<8 x i64> %ind, <8 x i32> %src, i8 %mask, ptr %base, ptr %stbuf) {
; CHECK-LABEL: gather_mask_qd:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %edi, %k1
; CHECK-NEXT:    kmovq %k1, %k2
; CHECK-NEXT:    vpgatherqd (%rsi,%zmm0,4), %ymm1 {%k2}
; CHECK-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
; CHECK-NEXT:    vpscatterqd %ymm1, (%rdx,%zmm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %mask to <8 x i1>
  %x = call <8 x i32> @llvm.x86.avx512.mask.gather.qpi.512(<8 x i32> %src, ptr %base, <8 x i64> %ind, <8 x i1> %1, i32 4)
  %ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
  call void @llvm.x86.avx512.mask.scatter.qpi.512(ptr %stbuf, <8 x i1> %1, <8 x i64> %ind2, <8 x i32> %x, i32 4)
  ret void
}

define dso_local void @gather_mask_qq(<8 x i64> %ind, <8 x i64> %src, i8 %mask, ptr %base, ptr %stbuf) {
; CHECK-LABEL: gather_mask_qq:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %edi, %k1
; CHECK-NEXT:    kmovq %k1, %k2
; CHECK-NEXT:    vpgatherqq (%rsi,%zmm0,4), %zmm1 {%k2}
; CHECK-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
; CHECK-NEXT:    vpscatterqq %zmm1, (%rdx,%zmm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %mask to <8 x i1>
  %x = call <8 x i64> @llvm.x86.avx512.mask.gather.qpq.512(<8 x i64> %src, ptr %base, <8 x i64> %ind, <8 x i1> %1, i32 4)
  %ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
  call void @llvm.x86.avx512.mask.scatter.qpq.512(ptr %stbuf, <8 x i1> %1, <8 x i64> %ind2, <8 x i64> %x, i32 4)
  ret void
}

define dso_local void @gather_mask_dq(<8 x i32> %ind, <8 x i64> %src, i8 %mask, ptr %base, ptr %stbuf) {
; CHECK-LABEL: gather_mask_dq:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %edi, %k1
; CHECK-NEXT:    kmovq %k1, %k2
; CHECK-NEXT:    vpgatherdq (%rsi,%ymm0,4), %zmm1 {%k2}
; CHECK-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
; CHECK-NEXT:    vpscatterdq %zmm1, (%rdx,%ymm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %mask to <8 x i1>
  %x = call <8 x i64> @llvm.x86.avx512.mask.gather.dpq.512(<8 x i64> %src, ptr %base, <8 x i32> %ind, <8 x i1> %1, i32 4)
  %ind2 = add <8 x i32> %ind, <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
  call void @llvm.x86.avx512.mask.scatter.dpq.512(ptr %stbuf, <8 x i1> %1, <8 x i32> %ind2, <8 x i64> %x, i32 4)
  ret void
}

define dso_local void @gather_mask_dpd_execdomain(<8 x i32> %ind, <8 x double> %src, i8 %mask, ptr %base, ptr %stbuf) {
; CHECK-LABEL: gather_mask_dpd_execdomain:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %edi, %k1
; CHECK-NEXT:    vgatherdpd (%rsi,%ymm0,4), %zmm1 {%k1}
; CHECK-NEXT:    vmovapd %zmm1, (%rdx)
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %mask to <8 x i1>
  %x = call <8 x double> @llvm.x86.avx512.mask.gather.dpd.512(<8 x double> %src, ptr %base, <8 x i32> %ind, <8 x i1> %1, i32 4)
  store <8 x double> %x, ptr %stbuf
  ret void
}

define dso_local void @gather_mask_qpd_execdomain(<8 x i64> %ind, <8 x double> %src, i8 %mask, ptr %base, ptr %stbuf) {
; CHECK-LABEL: gather_mask_qpd_execdomain:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %edi, %k1
; CHECK-NEXT:    vgatherqpd (%rsi,%zmm0,4), %zmm1 {%k1}
; CHECK-NEXT:    vmovapd %zmm1, (%rdx)
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %mask to <8 x i1>
  %x = call <8 x double> @llvm.x86.avx512.mask.gather.qpd.512(<8 x double> %src, ptr %base, <8 x i64> %ind, <8 x i1> %1, i32 4)
  store <8 x double> %x, ptr %stbuf
  ret void
}

define <16 x float> @gather_mask_dps_execdomain(<16 x i32> %ind, <16 x float> %src, i16 %mask, ptr %base) {
; CHECK-LABEL: gather_mask_dps_execdomain:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %edi, %k1
; CHECK-NEXT:    vgatherdps (%rsi,%zmm0,4), %zmm1 {%k1}
; CHECK-NEXT:    vmovaps %zmm1, %zmm0
; CHECK-NEXT:    retq
  %1 = bitcast i16 %mask to <16 x i1>
  %res = call <16 x float> @llvm.x86.avx512.mask.gather.dps.512(<16 x float> %src, ptr %base, <16 x i32> %ind, <16 x i1> %1, i32 4)
  ret <16 x float> %res
}

define <8 x float> @gather_mask_qps_execdomain(<8 x i64> %ind, <8 x float> %src, i8 %mask, ptr %base) {
; CHECK-LABEL: gather_mask_qps_execdomain:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %edi, %k1
; CHECK-NEXT:    vgatherqps (%rsi,%zmm0,4), %ymm1 {%k1}
; CHECK-NEXT:    vmovaps %ymm1, %ymm0
; CHECK-NEXT:    retq
  %1 = bitcast i8 %mask to <8 x i1>
  %res = call <8 x float> @llvm.x86.avx512.mask.gather.qps.512(<8 x float> %src, ptr %base, <8 x i64> %ind, <8 x i1> %1, i32 4)
  ret <8 x float> %res
}

define dso_local void @scatter_mask_dpd_execdomain(<8 x i32> %ind, ptr %src, i8 %mask, ptr %base, ptr %stbuf) {
; CHECK-LABEL: scatter_mask_dpd_execdomain:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vmovapd (%rdi), %zmm1
; CHECK-NEXT:    vscatterdpd %zmm1, (%rcx,%ymm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %mask to <8 x i1>
  %x = load <8 x double>, ptr %src, align 64
  call void @llvm.x86.avx512.mask.scatter.dpd.512(ptr %stbuf, <8 x i1> %1, <8 x i32>%ind, <8 x double> %x, i32 4)
  ret void
}

define dso_local void @scatter_mask_qpd_execdomain(<8 x i64> %ind, ptr %src, i8 %mask, ptr %base, ptr %stbuf)  {
; CHECK-LABEL: scatter_mask_qpd_execdomain:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vmovapd (%rdi), %zmm1
; CHECK-NEXT:    vscatterqpd %zmm1, (%rcx,%zmm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %mask to <8 x i1>
  %x = load <8 x double>, ptr %src, align 64
  call void @llvm.x86.avx512.mask.scatter.qpd.512(ptr %stbuf, <8 x i1> %1, <8 x i64>%ind, <8 x double> %x, i32 4)
  ret void
}

define dso_local void @scatter_mask_dps_execdomain(<16 x i32> %ind, ptr %src, i16 %mask, ptr %base, ptr %stbuf)  {
; CHECK-LABEL: scatter_mask_dps_execdomain:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vmovaps (%rdi), %zmm1
; CHECK-NEXT:    vscatterdps %zmm1, (%rcx,%zmm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i16 %mask to <16 x i1>
  %x = load <16 x float>, ptr %src, align 64
  call void @llvm.x86.avx512.mask.scatter.dps.512(ptr %stbuf, <16 x i1> %1, <16 x i32>%ind, <16 x float> %x, i32 4)
  ret void
}

define dso_local void @scatter_mask_qps_execdomain(<8 x i64> %ind, ptr %src, i8 %mask, ptr %base, ptr %stbuf)  {
; CHECK-LABEL: scatter_mask_qps_execdomain:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vmovaps (%rdi), %ymm1
; CHECK-NEXT:    vscatterqps %ymm1, (%rcx,%zmm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %mask to <8 x i1>
  %x = load <8 x float>, ptr %src, align 32
  call void @llvm.x86.avx512.mask.scatter.qps.512(ptr %stbuf, <8 x i1> %1, <8 x i64>%ind, <8 x float> %x, i32 4)
  ret void
}

define dso_local void @gather_qps(<8 x i64> %ind, <8 x float> %src, ptr %base, ptr %stbuf) {
; CHECK-LABEL: gather_qps:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1
; CHECK-NEXT:    kxnorw %k0, %k0, %k2
; CHECK-NEXT:    vgatherqps (%rdi,%zmm0,4), %ymm1 {%k2}
; CHECK-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
; CHECK-NEXT:    vscatterqps %ymm1, (%rsi,%zmm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %x = call <8 x float> @llvm.x86.avx512.mask.gather.qps.512(<8 x float> %src, ptr %base, <8 x i64> %ind, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, i32 4)
  %ind2 = add <8 x i64> %ind, <i64 0, i64 1, i64 2, i64 3, i64 0, i64 1, i64 2, i64 3>
  call void @llvm.x86.avx512.mask.scatter.qps.512(ptr %stbuf, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i64> %ind2, <8 x float> %x, i32 4)
  ret void
}

declare  void @llvm.x86.avx512.gatherpf.qps.512(i8, <8 x i64>, ptr , i32, i32);
declare  void @llvm.x86.avx512.scatterpf.qps.512(i8, <8 x i64>, ptr , i32, i32);
define dso_local void @prefetch(<8 x i64> %ind, ptr %base) {
; CHECK-LABEL: prefetch:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vgatherpf0qps (%rdi,%zmm0,4) {%k1}
; CHECK-NEXT:    kxorw %k0, %k0, %k1
; CHECK-NEXT:    vgatherpf1qps (%rdi,%zmm0,4) {%k1}
; CHECK-NEXT:    movb $1, %al
; CHECK-NEXT:    kmovd %eax, %k1
; CHECK-NEXT:    vscatterpf0qps (%rdi,%zmm0,2) {%k1}
; CHECK-NEXT:    movb $120, %al
; CHECK-NEXT:    kmovd %eax, %k1
; CHECK-NEXT:    vscatterpf1qps (%rdi,%zmm0,2) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  call void @llvm.x86.avx512.gatherpf.qps.512(i8 -1, <8 x i64> %ind, ptr %base, i32 4, i32 3)
  call void @llvm.x86.avx512.gatherpf.qps.512(i8 0, <8 x i64> %ind, ptr %base, i32 4, i32 2)
  call void @llvm.x86.avx512.scatterpf.qps.512(i8 1, <8 x i64> %ind, ptr %base, i32 2, i32 3)
  call void @llvm.x86.avx512.scatterpf.qps.512(i8 120, <8 x i64> %ind, ptr %base, i32 2, i32 2)
  ret void
}

define <2 x double> @test_int_x86_avx512_mask_gather3div2_df(<2 x double> %x0, ptr %x1, <2 x i64> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3div2_df:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vgatherqpd (%rdi,%xmm1,4), %xmm0 {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
; CHECK-NEXT:    vgatherqpd (%rdi,%xmm1,2), %xmm2 {%k1}
; CHECK-NEXT:    vaddpd %xmm2, %xmm0, %xmm0
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x3 to <8 x i1>
  %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <2 x i32> <i32 0, i32 1>
  %res = call <2 x double> @llvm.x86.avx512.mask.gather3div2.df(<2 x double> %x0, ptr %x1, <2 x i64> %x2, <2 x i1> %extract, i32 4)
  %res1 = call <2 x double> @llvm.x86.avx512.mask.gather3div2.df(<2 x double> %x0, ptr %x1, <2 x i64> %x2, <2 x i1> <i1 true, i1 true>, i32 2)
  %res2 = fadd <2 x double> %res, %res1
  ret <2 x double> %res2
}

define <2 x i64> @test_int_x86_avx512_mask_gather3div2_di(<2 x i64> %x0, ptr %x1, <2 x i64> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3div2_di:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vpgatherqq (%rdi,%xmm1,8), %xmm0 {%k1}
; CHECK-NEXT:    vpaddq %xmm0, %xmm0, %xmm0
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x3 to <8 x i1>
  %extract1 = shufflevector <8 x i1> %1, <8 x i1> %1, <2 x i32> <i32 0, i32 1>
  %res = call <2 x i64> @llvm.x86.avx512.mask.gather3div2.di(<2 x i64> %x0, ptr %x1, <2 x i64> %x2, <2 x i1> %extract1, i32 8)
  %2 = bitcast i8 %x3 to <8 x i1>
  %extract = shufflevector <8 x i1> %2, <8 x i1> %2, <2 x i32> <i32 0, i32 1>
  %res1 = call <2 x i64> @llvm.x86.avx512.mask.gather3div2.di(<2 x i64> %x0, ptr %x1, <2 x i64> %x2, <2 x i1> %extract, i32 8)
  %res2 = add <2 x i64> %res, %res1
  ret <2 x i64> %res2
}

define <4 x double> @test_int_x86_avx512_mask_gather3div4_df(<4 x double> %x0, ptr %x1, <4 x i64> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3div4_df:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vgatherqpd (%rdi,%ymm1,4), %ymm0 {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
; CHECK-NEXT:    vgatherqpd (%rdi,%ymm1,2), %ymm2 {%k1}
; CHECK-NEXT:    vaddpd %ymm2, %ymm0, %ymm0
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x3 to <8 x i1>
  %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  %res = call <4 x double> @llvm.x86.avx512.mask.gather3div4.df(<4 x double> %x0, ptr %x1, <4 x i64> %x2, <4 x i1> %extract, i32 4)
  %res1 = call <4 x double> @llvm.x86.avx512.mask.gather3div4.df(<4 x double> %x0, ptr %x1, <4 x i64> %x2, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, i32 2)
  %res2 = fadd <4 x double> %res, %res1
  ret <4 x double> %res2
}

define <4 x i64> @test_int_x86_avx512_mask_gather3div4_di(<4 x i64> %x0, ptr %x1, <4 x i64> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3div4_di:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vpgatherqq (%rdi,%ymm1,8), %ymm0 {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vpxor %xmm2, %xmm2, %xmm2
; CHECK-NEXT:    vpgatherqq (%rdi,%ymm1,8), %ymm2 {%k1}
; CHECK-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x3 to <8 x i1>
  %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  %res = call <4 x i64> @llvm.x86.avx512.mask.gather3div4.di(<4 x i64> %x0, ptr %x1, <4 x i64> %x2, <4 x i1> %extract, i32 8)
  %res1 = call <4 x i64> @llvm.x86.avx512.mask.gather3div4.di(<4 x i64> %x0, ptr %x1, <4 x i64> %x2, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, i32 8)
  %res2 = add <4 x i64> %res, %res1
  ret <4 x i64> %res2
}

define <4 x float> @test_int_x86_avx512_mask_gather3div4_sf(<4 x float> %x0, ptr %x1, <2 x i64> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3div4_sf:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vgatherqps (%rdi,%xmm1,4), %xmm0 {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vxorps %xmm2, %xmm2, %xmm2
; CHECK-NEXT:    vgatherqps (%rdi,%xmm1,2), %xmm2 {%k1}
; CHECK-NEXT:    vaddps %xmm2, %xmm0, %xmm0
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x3 to <8 x i1>
  %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <2 x i32> <i32 0, i32 1>
  %res = call <4 x float> @llvm.x86.avx512.mask.gather3div4.sf(<4 x float> %x0, ptr %x1, <2 x i64> %x2, <2 x i1> %extract, i32 4)
  %res1 = call <4 x float> @llvm.x86.avx512.mask.gather3div4.sf(<4 x float> %x0, ptr %x1, <2 x i64> %x2, <2 x i1> <i1 true, i1 true>, i32 2)
  %res2 = fadd <4 x float> %res, %res1
  ret <4 x float> %res2
}

define <4 x i32> @test_int_x86_avx512_mask_gather3div4_si(<4 x i32> %x0, ptr %x1, <2 x i64> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3div4_si:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vpxor %xmm2, %xmm2, %xmm2
; CHECK-NEXT:    vpgatherqd (%rdi,%xmm1,4), %xmm2 {%k1}
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vpgatherqd (%rdi,%xmm1,4), %xmm0 {%k1}
; CHECK-NEXT:    vpaddd %xmm0, %xmm2, %xmm0
; CHECK-NEXT:    retq
  %res = call <4 x i32> @llvm.x86.avx512.mask.gather3div4.si(<4 x i32> %x0, ptr %x1, <2 x i64> %x2, <2 x i1> <i1 true, i1 true>, i32 4)
  %1 = bitcast i8 %x3 to <8 x i1>
  %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <2 x i32> <i32 0, i32 1>
  %res1 = call <4 x i32> @llvm.x86.avx512.mask.gather3div4.si(<4 x i32> %x0, ptr %x1, <2 x i64> %x2, <2 x i1> %extract, i32 4)
  %res2 = add <4 x i32> %res, %res1
  ret <4 x i32> %res2
}

define <4 x float> @test_int_x86_avx512_mask_gather3div8_sf(<4 x float> %x0, ptr %x1, <4 x i64> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3div8_sf:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vgatherqps (%rdi,%ymm1,4), %xmm0 {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vxorps %xmm2, %xmm2, %xmm2
; CHECK-NEXT:    vgatherqps (%rdi,%ymm1,2), %xmm2 {%k1}
; CHECK-NEXT:    vaddps %xmm2, %xmm0, %xmm0
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x3 to <8 x i1>
  %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  %res = call <4 x float> @llvm.x86.avx512.mask.gather3div8.sf(<4 x float> %x0, ptr %x1, <4 x i64> %x2, <4 x i1> %extract, i32 4)
  %res1 = call <4 x float> @llvm.x86.avx512.mask.gather3div8.sf(<4 x float> %x0, ptr %x1, <4 x i64> %x2, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, i32 2)
  %res2 = fadd <4 x float> %res, %res1
  ret <4 x float> %res2
}

define <4 x i32> @test_int_x86_avx512_mask_gather3div8_si(<4 x i32> %x0, ptr %x1, <4 x i64> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3div8_si:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vmovdqa %xmm0, %xmm2
; CHECK-NEXT:    kmovq %k1, %k2
; CHECK-NEXT:    vpgatherqd (%rdi,%ymm1,4), %xmm2 {%k2}
; CHECK-NEXT:    vpgatherqd (%rdi,%ymm1,2), %xmm0 {%k1}
; CHECK-NEXT:    vpaddd %xmm0, %xmm2, %xmm0
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x3 to <8 x i1>
  %extract1 = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  %res = call <4 x i32> @llvm.x86.avx512.mask.gather3div8.si(<4 x i32> %x0, ptr %x1, <4 x i64> %x2, <4 x i1> %extract1, i32 4)
  %2 = bitcast i8 %x3 to <8 x i1>
  %extract = shufflevector <8 x i1> %2, <8 x i1> %2, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  %res1 = call <4 x i32> @llvm.x86.avx512.mask.gather3div8.si(<4 x i32> %x0, ptr %x1, <4 x i64> %x2, <4 x i1> %extract, i32 2)
  %res2 = add <4 x i32> %res, %res1
  ret <4 x i32> %res2
}

define <2 x double> @test_int_x86_avx512_mask_gather3siv2_df(<2 x double> %x0, ptr %x1, <4 x i32> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv2_df:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vgatherdpd (%rdi,%xmm1,4), %xmm0 {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
; CHECK-NEXT:    vgatherdpd (%rdi,%xmm1,2), %xmm2 {%k1}
; CHECK-NEXT:    vaddpd %xmm2, %xmm0, %xmm0
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x3 to <8 x i1>
  %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <2 x i32> <i32 0, i32 1>
  %res = call <2 x double> @llvm.x86.avx512.mask.gather3siv2.df(<2 x double> %x0, ptr %x1, <4 x i32> %x2, <2 x i1> %extract, i32 4)
  %res1 = call <2 x double> @llvm.x86.avx512.mask.gather3siv2.df(<2 x double> %x0, ptr %x1, <4 x i32> %x2, <2 x i1> <i1 true, i1 true>, i32 2)
  %res2 = fadd <2 x double> %res, %res1
  ret <2 x double> %res2
}

define <2 x i64> @test_int_x86_avx512_mask_gather3siv2_di(<2 x i64> %x0, ptr %x1, <4 x i32> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv2_di:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vpgatherdq (%rdi,%xmm1,8), %xmm0 {%k1}
; CHECK-NEXT:    vpaddq %xmm0, %xmm0, %xmm0
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x3 to <8 x i1>
  %extract1 = shufflevector <8 x i1> %1, <8 x i1> %1, <2 x i32> <i32 0, i32 1>
  %res = call <2 x i64> @llvm.x86.avx512.mask.gather3siv2.di(<2 x i64> %x0, ptr %x1, <4 x i32> %x2, <2 x i1> %extract1, i32 8)
  %2 = bitcast i8 %x3 to <8 x i1>
  %extract = shufflevector <8 x i1> %2, <8 x i1> %2, <2 x i32> <i32 0, i32 1>
  %res1 = call <2 x i64> @llvm.x86.avx512.mask.gather3siv2.di(<2 x i64> %x0, ptr %x1, <4 x i32> %x2, <2 x i1> %extract, i32 8)
  %res2 = add <2 x i64> %res, %res1
  ret <2 x i64> %res2
}

define <4 x double> @test_int_x86_avx512_mask_gather3siv4_df(<4 x double> %x0, ptr %x1, <4 x i32> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv4_df:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vgatherdpd (%rdi,%xmm1,4), %ymm0 {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
; CHECK-NEXT:    vgatherdpd (%rdi,%xmm1,2), %ymm2 {%k1}
; CHECK-NEXT:    vaddpd %ymm2, %ymm0, %ymm0
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x3 to <8 x i1>
  %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  %res = call <4 x double> @llvm.x86.avx512.mask.gather3siv4.df(<4 x double> %x0, ptr %x1, <4 x i32> %x2, <4 x i1> %extract, i32 4)
  %res1 = call <4 x double> @llvm.x86.avx512.mask.gather3siv4.df(<4 x double> %x0, ptr %x1, <4 x i32> %x2, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, i32 2)
  %res2 = fadd <4 x double> %res, %res1
  ret <4 x double> %res2
}

define <4 x i64> @test_int_x86_avx512_mask_gather3siv4_di(<4 x i64> %x0, ptr %x1, <4 x i32> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv4_di:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vpgatherdq (%rdi,%xmm1,8), %ymm0 {%k1}
; CHECK-NEXT:    vpaddq %ymm0, %ymm0, %ymm0
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x3 to <8 x i1>
  %extract1 = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  %res = call <4 x i64> @llvm.x86.avx512.mask.gather3siv4.di(<4 x i64> %x0, ptr %x1, <4 x i32> %x2, <4 x i1> %extract1, i32 8)
  %2 = bitcast i8 %x3 to <8 x i1>
  %extract = shufflevector <8 x i1> %2, <8 x i1> %2, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  %res1 = call <4 x i64> @llvm.x86.avx512.mask.gather3siv4.di(<4 x i64> %x0, ptr %x1, <4 x i32> %x2, <4 x i1> %extract, i32 8)
  %res2 = add <4 x i64> %res, %res1
  ret <4 x i64> %res2
}

define <4 x float> @test_int_x86_avx512_mask_gather3siv4_sf(<4 x float> %x0, ptr %x1, <4 x i32> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv4_sf:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vgatherdps (%rdi,%xmm1,4), %xmm0 {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vxorps %xmm2, %xmm2, %xmm2
; CHECK-NEXT:    vgatherdps (%rdi,%xmm1,2), %xmm2 {%k1}
; CHECK-NEXT:    vaddps %xmm2, %xmm0, %xmm0
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x3 to <8 x i1>
  %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  %res = call <4 x float> @llvm.x86.avx512.mask.gather3siv4.sf(<4 x float> %x0, ptr %x1, <4 x i32> %x2, <4 x i1> %extract, i32 4)
  %res1 = call <4 x float> @llvm.x86.avx512.mask.gather3siv4.sf(<4 x float> %x0, ptr %x1, <4 x i32> %x2, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, i32 2)
  %res2 = fadd <4 x float> %res, %res1
  ret <4 x float> %res2
}

define <4 x i32> @test_int_x86_avx512_mask_gather3siv4_si(<4 x i32> %x0, ptr %x1, <4 x i32> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv4_si:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vpxor %xmm2, %xmm2, %xmm2
; CHECK-NEXT:    vpgatherdd (%rdi,%xmm1,4), %xmm2 {%k1}
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vpgatherdd (%rdi,%xmm1,2), %xmm0 {%k1}
; CHECK-NEXT:    vpaddd %xmm0, %xmm2, %xmm0
; CHECK-NEXT:    retq
  %res = call <4 x i32> @llvm.x86.avx512.mask.gather3siv4.si(<4 x i32> %x0, ptr %x1, <4 x i32> %x2, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, i32 4)
  %1 = bitcast i8 %x3 to <8 x i1>
  %extract = shufflevector <8 x i1> %1, <8 x i1> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  %res1 = call <4 x i32> @llvm.x86.avx512.mask.gather3siv4.si(<4 x i32> %x0, ptr %x1, <4 x i32> %x2, <4 x i1> %extract, i32 2)
  %res2 = add <4 x i32> %res, %res1
  ret <4 x i32> %res2
}

define <8 x float> @test_int_x86_avx512_mask_gather3siv8_sf(<8 x float> %x0, ptr %x1, <8 x i32> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv8_sf:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vgatherdps (%rdi,%ymm1,4), %ymm0 {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vxorps %xmm2, %xmm2, %xmm2
; CHECK-NEXT:    vgatherdps (%rdi,%ymm1,2), %ymm2 {%k1}
; CHECK-NEXT:    vaddps %ymm2, %ymm0, %ymm0
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x3 to <8 x i1>
  %res = call <8 x float> @llvm.x86.avx512.mask.gather3siv8.sf(<8 x float> %x0, ptr %x1, <8 x i32> %x2, <8 x i1> %1, i32 4)
  %res1 = call <8 x float> @llvm.x86.avx512.mask.gather3siv8.sf(<8 x float> %x0, ptr %x1, <8 x i32> %x2, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, i32 2)
  %res2 = fadd <8 x float> %res, %res1
  ret <8 x float> %res2
}

define <8 x i32> @test_int_x86_avx512_mask_gather3siv8_si(<8 x i32> %x0, ptr %x1, <8 x i32> %x2, i8 %x3) {
; CHECK-LABEL: test_int_x86_avx512_mask_gather3siv8_si:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vmovdqa %ymm0, %ymm2
; CHECK-NEXT:    kmovq %k1, %k2
; CHECK-NEXT:    vpgatherdd (%rdi,%ymm1,4), %ymm2 {%k2}
; CHECK-NEXT:    vpgatherdd (%rdi,%ymm1,2), %ymm0 {%k1}
; CHECK-NEXT:    vpaddd %ymm0, %ymm2, %ymm0
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x3 to <8 x i1>
  %res = call <8 x i32> @llvm.x86.avx512.mask.gather3siv8.si(<8 x i32> %x0, ptr %x1, <8 x i32> %x2, <8 x i1> %1, i32 4)
  %2 = bitcast i8 %x3 to <8 x i1>
  %res1 = call <8 x i32> @llvm.x86.avx512.mask.gather3siv8.si(<8 x i32> %x0, ptr %x1, <8 x i32> %x2, <8 x i1> %2, i32 2)
  %res2 = add <8 x i32> %res, %res1
  ret <8 x i32> %res2
}

define dso_local void@test_int_x86_avx512_scatterdiv2_df(ptr %x0, i8 %x1, <2 x i64> %x2, <2 x double> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scatterdiv2_df:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    kxnorw %k0, %k0, %k2
; CHECK-NEXT:    vscatterqpd %xmm1, (%rdi,%xmm0,2) {%k2}
; CHECK-NEXT:    vscatterqpd %xmm1, (%rdi,%xmm0,4) {%k1}
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  %2 = shufflevector <8 x i1> %1, <8 x i1> undef, <2 x i32> <i32 0, i32 1>
  call void @llvm.x86.avx512.mask.scatterdiv2.df(ptr %x0, <2 x i1> <i1 true, i1 true>, <2 x i64> %x2, <2 x double> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scatterdiv2.df(ptr %x0, <2 x i1> %2, <2 x i64> %x2, <2 x double> %x3, i32 4)
  ret void
}

define dso_local void@test_int_x86_avx512_scatterdiv2_di(ptr %x0, i8 %x1, <2 x i64> %x2, <2 x i64> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scatterdiv2_di:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vpscatterqq %xmm1, (%rdi,%xmm0,2) {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vpscatterqq %xmm1, (%rdi,%xmm0,4) {%k1}
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  %2 = shufflevector <8 x i1> %1, <8 x i1> undef, <2 x i32> <i32 0, i32 1>
  call void @llvm.x86.avx512.mask.scatterdiv2.di(ptr %x0, <2 x i1> %2, <2 x i64> %x2, <2 x i64> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scatterdiv2.di(ptr %x0, <2 x i1> <i1 true, i1 true>, <2 x i64> %x2, <2 x i64> %x3, i32 4)
  ret void
}

define dso_local void@test_int_x86_avx512_scatterdiv4_df(ptr %x0, i8 %x1, <4 x i64> %x2, <4 x double> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scatterdiv4_df:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vscatterqpd %ymm1, (%rdi,%ymm0,2) {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vscatterqpd %ymm1, (%rdi,%ymm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  %2 = shufflevector <8 x i1> %1, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  call void @llvm.x86.avx512.mask.scatterdiv4.df(ptr %x0, <4 x i1> %2, <4 x i64> %x2, <4 x double> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scatterdiv4.df(ptr %x0, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i64> %x2, <4 x double> %x3, i32 4)
  ret void
}

define dso_local void@test_int_x86_avx512_scatterdiv4_di(ptr %x0, i8 %x1, <4 x i64> %x2, <4 x i64> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scatterdiv4_di:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vpscatterqq %ymm1, (%rdi,%ymm0,2) {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vpscatterqq %ymm1, (%rdi,%ymm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  %2 = shufflevector <8 x i1> %1, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  call void @llvm.x86.avx512.mask.scatterdiv4.di(ptr %x0, <4 x i1> %2, <4 x i64> %x2, <4 x i64> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scatterdiv4.di(ptr %x0, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i64> %x2, <4 x i64> %x3, i32 4)
  ret void
}

define dso_local void@test_int_x86_avx512_scatterdiv4_sf(ptr %x0, i8 %x1, <2 x i64> %x2, <4 x float> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scatterdiv4_sf:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vscatterqps %xmm1, (%rdi,%xmm0,2) {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vscatterqps %xmm1, (%rdi,%xmm0,4) {%k1}
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  %2 = shufflevector <8 x i1> %1, <8 x i1> undef, <2 x i32> <i32 0, i32 1>
  call void @llvm.x86.avx512.mask.scatterdiv4.sf(ptr %x0, <2 x i1> %2, <2 x i64> %x2, <4 x float> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scatterdiv4.sf(ptr %x0, <2 x i1> <i1 true, i1 true>, <2 x i64> %x2, <4 x float> %x3, i32 4)
  ret void
}

define dso_local void@test_int_x86_avx512_scatterdiv4_si(ptr %x0, i8 %x1, <2 x i64> %x2, <4 x i32> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scatterdiv4_si:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    kxnorw %k0, %k0, %k2
; CHECK-NEXT:    vpscatterqd %xmm1, (%rdi,%xmm0,2) {%k2}
; CHECK-NEXT:    vpscatterqd %xmm1, (%rdi,%xmm0,4) {%k1}
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  %2 = shufflevector <8 x i1> %1, <8 x i1> undef, <2 x i32> <i32 0, i32 1>
  call void @llvm.x86.avx512.mask.scatterdiv4.si(ptr %x0, <2 x i1> <i1 true, i1 true>, <2 x i64> %x2, <4 x i32> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scatterdiv4.si(ptr %x0, <2 x i1> %2, <2 x i64> %x2, <4 x i32> %x3, i32 4)
  ret void
}

define dso_local void@test_int_x86_avx512_scatterdiv8_sf(ptr %x0, i8 %x1, <4 x i64> %x2, <4 x float> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scatterdiv8_sf:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vscatterqps %xmm1, (%rdi,%ymm0,2) {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vscatterqps %xmm1, (%rdi,%ymm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  %2 = shufflevector <8 x i1> %1, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  call void @llvm.x86.avx512.mask.scatterdiv8.sf(ptr %x0, <4 x i1> %2, <4 x i64> %x2, <4 x float> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scatterdiv8.sf(ptr %x0, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i64> %x2, <4 x float> %x3, i32 4)
  ret void
}

define dso_local void@test_int_x86_avx512_scatterdiv8_si(ptr %x0, i8 %x1, <4 x i64> %x2, <4 x i32> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scatterdiv8_si:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vpscatterqd %xmm1, (%rdi,%ymm0,2) {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vpscatterqd %xmm1, (%rdi,%ymm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  %2 = shufflevector <8 x i1> %1, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  call void @llvm.x86.avx512.mask.scatterdiv8.si(ptr %x0, <4 x i1> %2, <4 x i64> %x2, <4 x i32> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scatterdiv8.si(ptr %x0, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i64> %x2, <4 x i32> %x3, i32 4)
  ret void
}

define dso_local void@test_int_x86_avx512_scattersiv2_df(ptr %x0, i8 %x1, <4 x i32> %x2, <2 x double> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scattersiv2_df:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    kxnorw %k0, %k0, %k2
; CHECK-NEXT:    vscatterdpd %xmm1, (%rdi,%xmm0,2) {%k2}
; CHECK-NEXT:    vscatterdpd %xmm1, (%rdi,%xmm0,4) {%k1}
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  %2 = shufflevector <8 x i1> %1, <8 x i1> undef, <2 x i32> <i32 0, i32 1>
  call void @llvm.x86.avx512.mask.scattersiv2.df(ptr %x0, <2 x i1> <i1 true, i1 true>, <4 x i32> %x2, <2 x double> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scattersiv2.df(ptr %x0, <2 x i1> %2, <4 x i32> %x2, <2 x double> %x3, i32 4)
  ret void
}

define dso_local void@test_int_x86_avx512_scattersiv2_di(ptr %x0, i8 %x1, <4 x i32> %x2, <2 x i64> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scattersiv2_di:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    kxnorw %k0, %k0, %k2
; CHECK-NEXT:    vpscatterdq %xmm1, (%rdi,%xmm0,2) {%k2}
; CHECK-NEXT:    vpscatterdq %xmm1, (%rdi,%xmm0,4) {%k1}
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  %2 = shufflevector <8 x i1> %1, <8 x i1> undef, <2 x i32> <i32 0, i32 1>
  call void @llvm.x86.avx512.mask.scattersiv2.di(ptr %x0, <2 x i1> <i1 true, i1 true>, <4 x i32> %x2, <2 x i64> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scattersiv2.di(ptr %x0, <2 x i1> %2, <4 x i32> %x2, <2 x i64> %x3, i32 4)
  ret void
}

define dso_local void@test_int_x86_avx512_scattersiv4_df(ptr %x0, i8 %x1, <4 x i32> %x2, <4 x double> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scattersiv4_df:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vscatterdpd %ymm1, (%rdi,%xmm0,2) {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vscatterdpd %ymm1, (%rdi,%xmm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  %2 = shufflevector <8 x i1> %1, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  call void @llvm.x86.avx512.mask.scattersiv4.df(ptr %x0, <4 x i1> %2, <4 x i32> %x2, <4 x double> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scattersiv4.df(ptr %x0, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> %x2, <4 x double> %x3, i32 4)
  ret void
}

define dso_local void@test_int_x86_avx512_scattersiv4_di(ptr %x0, i8 %x1, <4 x i32> %x2, <4 x i64> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scattersiv4_di:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    kxnorw %k0, %k0, %k2
; CHECK-NEXT:    vpscatterdq %ymm1, (%rdi,%xmm0,2) {%k2}
; CHECK-NEXT:    vpscatterdq %ymm1, (%rdi,%xmm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  %2 = shufflevector <8 x i1> %1, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  call void @llvm.x86.avx512.mask.scattersiv4.di(ptr %x0, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> %x2, <4 x i64> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scattersiv4.di(ptr %x0, <4 x i1> %2, <4 x i32> %x2, <4 x i64> %x3, i32 4)
  ret void
}

define dso_local void@test_int_x86_avx512_scattersiv4_sf(ptr %x0, i8 %x1, <4 x i32> %x2, <4 x float> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scattersiv4_sf:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vscatterdps %xmm1, (%rdi,%xmm0,2) {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vscatterdps %xmm1, (%rdi,%xmm0,4) {%k1}
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  %2 = shufflevector <8 x i1> %1, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  call void @llvm.x86.avx512.mask.scattersiv4.sf(ptr %x0, <4 x i1> %2, <4 x i32> %x2, <4 x float> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scattersiv4.sf(ptr %x0, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> %x2, <4 x float> %x3, i32 4)
  ret void
}

define dso_local void@test_int_x86_avx512_scattersiv4_si(ptr %x0, i8 %x1, <4 x i32> %x2, <4 x i32> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scattersiv4_si:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vpscatterdd %xmm1, (%rdi,%xmm0,2) {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vpscatterdd %xmm1, (%rdi,%xmm0,4) {%k1}
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  %2 = shufflevector <8 x i1> %1, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
  call void @llvm.x86.avx512.mask.scattersiv4.si(ptr %x0, <4 x i1> %2, <4 x i32> %x2, <4 x i32> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scattersiv4.si(ptr %x0, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> %x2, <4 x i32> %x3, i32 4)
  ret void
}

define dso_local void@test_int_x86_avx512_scattersiv8_sf(ptr %x0, i8 %x1, <8 x i32> %x2, <8 x float> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scattersiv8_sf:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vscatterdps %ymm1, (%rdi,%ymm0,2) {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vscatterdps %ymm1, (%rdi,%ymm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  call void @llvm.x86.avx512.mask.scattersiv8.sf(ptr %x0, <8 x i1> %1, <8 x i32> %x2, <8 x float> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scattersiv8.sf(ptr %x0, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i32> %x2, <8 x float> %x3, i32 4)
  ret void
}

define dso_local void@test_int_x86_avx512_scattersiv8_si(ptr %x0, i8 %x1, <8 x i32> %x2, <8 x i32> %x3) {
; CHECK-LABEL: test_int_x86_avx512_scattersiv8_si:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kmovd %esi, %k1
; CHECK-NEXT:    vpscatterdd %ymm1, (%rdi,%ymm0,2) {%k1}
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vpscatterdd %ymm1, (%rdi,%ymm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  %1 = bitcast i8 %x1 to <8 x i1>
  call void @llvm.x86.avx512.mask.scattersiv8.si(ptr %x0, <8 x i1> %1, <8 x i32> %x2, <8 x i32> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scattersiv8.si(ptr %x0, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i32> %x2, <8 x i32> %x3, i32 4)
  ret void
}

define dso_local void @scatter_mask_test(ptr %x0, <8 x i32> %x2, <8 x i32> %x3) {
; CHECK-LABEL: scatter_mask_test:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vpscatterdd %ymm1, (%rdi,%ymm0,2) {%k1}
; CHECK-NEXT:    kxorw %k0, %k0, %k1
; CHECK-NEXT:    vpscatterdd %ymm1, (%rdi,%ymm0,4) {%k1}
; CHECK-NEXT:    movb $1, %al
; CHECK-NEXT:    kmovd %eax, %k1
; CHECK-NEXT:    vpscatterdd %ymm1, (%rdi,%ymm0,2) {%k1}
; CHECK-NEXT:    movb $96, %al
; CHECK-NEXT:    kmovd %eax, %k1
; CHECK-NEXT:    vpscatterdd %ymm1, (%rdi,%ymm0,4) {%k1}
; CHECK-NEXT:    vzeroupper
; CHECK-NEXT:    retq
  call void @llvm.x86.avx512.mask.scattersiv8.si(ptr %x0, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i32> %x2, <8 x i32> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scattersiv8.si(ptr %x0, <8 x i1> zeroinitializer, <8 x i32> %x2, <8 x i32> %x3, i32 4)
  call void @llvm.x86.avx512.mask.scattersiv8.si(ptr %x0, <8 x i1> bitcast (<1 x i8> <i8 1> to <8 x i1>), <8 x i32> %x2, <8 x i32> %x3, i32 2)
  call void @llvm.x86.avx512.mask.scattersiv8.si(ptr %x0, <8 x i1> bitcast (<1 x i8> <i8 96> to <8 x i1>), <8 x i32> %x2, <8 x i32> %x3, i32 4)
  ret void
}

define <16 x float> @gather_mask_test(<16 x i32> %ind, <16 x float> %src, ptr %base) {
; CHECK-LABEL: gather_mask_test:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vxorps %xmm2, %xmm2, %xmm2
; CHECK-NEXT:    vgatherdps (%rdi,%zmm0,4), %zmm2 {%k1}
; CHECK-NEXT:    kxorw %k0, %k0, %k1
; CHECK-NEXT:    vmovaps %zmm1, %zmm3
; CHECK-NEXT:    vgatherdps (%rdi,%zmm0,4), %zmm3 {%k1}
; CHECK-NEXT:    vaddps %zmm3, %zmm2, %zmm2
; CHECK-NEXT:    movw $1, %ax
; CHECK-NEXT:    kmovd %eax, %k1
; CHECK-NEXT:    vmovaps %zmm1, %zmm3
; CHECK-NEXT:    vgatherdps (%rdi,%zmm0,4), %zmm3 {%k1}
; CHECK-NEXT:    movw $220, %ax
; CHECK-NEXT:    kmovd %eax, %k1
; CHECK-NEXT:    vgatherdps (%rdi,%zmm0,4), %zmm1 {%k1}
; CHECK-NEXT:    vaddps %zmm3, %zmm1, %zmm0
; CHECK-NEXT:    vaddps %zmm2, %zmm0, %zmm0
; CHECK-NEXT:    retq
  %res = call <16 x float> @llvm.x86.avx512.mask.gather.dps.512(<16 x float> %src, ptr %base, <16 x i32> %ind, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, i32 4)
  %res1 = call <16 x float> @llvm.x86.avx512.mask.gather.dps.512(<16 x float> %src, ptr %base, <16 x i32> %ind, <16 x i1> zeroinitializer, i32 4)
  %res2 = call <16 x float> @llvm.x86.avx512.mask.gather.dps.512(<16 x float> %src, ptr %base, <16 x i32> %ind, <16 x i1> bitcast (<1 x i16> <i16 1> to <16 x i1>), i32 4)
  %res3 = call <16 x float> @llvm.x86.avx512.mask.gather.dps.512(<16 x float> %src, ptr %base, <16 x i32> %ind, <16 x i1> bitcast (<1 x i16> <i16 220> to <16 x i1>), i32 4)
  %res4 = fadd <16 x float> %res, %res1
  %res5 = fadd <16 x float> %res3, %res2
  %res6 = fadd <16 x float> %res5, %res4
  ret <16 x float> %res6
}

@x = dso_local global [1024 x float] zeroinitializer, align 16

define <8 x float> @gather_global(<8 x i64>, ptr nocapture readnone) {
; CHECK-LABEL: gather_global:
; CHECK:       # %bb.0:
; CHECK-NEXT:    kxnorw %k0, %k0, %k1
; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1
; CHECK-NEXT:    vgatherqps x(,%zmm0,4), %ymm1 {%k1}
; CHECK-NEXT:    vmovaps %ymm1, %ymm0
; CHECK-NEXT:    retq
  %3 = tail call <8 x float> @llvm.x86.avx512.mask.gather.qps.512(<8 x float> zeroinitializer, ptr @x, <8 x i64> %0, <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, i32 4)
  ret <8 x float> %3
}

declare <16 x float> @llvm.x86.avx512.mask.gather.dps.512(<16 x float>, ptr, <16 x i32>, <16 x i1>, i32)
declare <8 x double> @llvm.x86.avx512.mask.gather.dpd.512(<8 x double>, ptr, <8 x i32>, <8 x i1>, i32)
declare <8 x float> @llvm.x86.avx512.mask.gather.qps.512(<8 x float>, ptr, <8 x i64>, <8 x i1>, i32)
declare <8 x double> @llvm.x86.avx512.mask.gather.qpd.512(<8 x double>, ptr, <8 x i64>, <8 x i1>, i32)
declare <16 x i32> @llvm.x86.avx512.mask.gather.dpi.512(<16 x i32>, ptr, <16 x i32>, <16 x i1>, i32)
declare <8 x i64> @llvm.x86.avx512.mask.gather.dpq.512(<8 x i64>, ptr, <8 x i32>, <8 x i1>, i32)
declare <8 x i32> @llvm.x86.avx512.mask.gather.qpi.512(<8 x i32>, ptr, <8 x i64>, <8 x i1>, i32)
declare <8 x i64> @llvm.x86.avx512.mask.gather.qpq.512(<8 x i64>, ptr, <8 x i64>, <8 x i1>, i32)
declare <2 x double> @llvm.x86.avx512.mask.gather3div2.df(<2 x double>, ptr, <2 x i64>, <2 x i1>, i32)
declare <2 x i64> @llvm.x86.avx512.mask.gather3div2.di(<2 x i64>, ptr, <2 x i64>, <2 x i1>, i32)
declare <4 x double> @llvm.x86.avx512.mask.gather3div4.df(<4 x double>, ptr, <4 x i64>, <4 x i1>, i32)
declare <4 x i64> @llvm.x86.avx512.mask.gather3div4.di(<4 x i64>, ptr, <4 x i64>, <4 x i1>, i32)
declare <4 x float> @llvm.x86.avx512.mask.gather3div4.sf(<4 x float>, ptr, <2 x i64>, <2 x i1>, i32)
declare <4 x i32> @llvm.x86.avx512.mask.gather3div4.si(<4 x i32>, ptr, <2 x i64>, <2 x i1>, i32)
declare <4 x float> @llvm.x86.avx512.mask.gather3div8.sf(<4 x float>, ptr, <4 x i64>, <4 x i1>, i32)
declare <4 x i32> @llvm.x86.avx512.mask.gather3div8.si(<4 x i32>, ptr, <4 x i64>, <4 x i1>, i32)
declare <2 x double> @llvm.x86.avx512.mask.gather3siv2.df(<2 x double>, ptr, <4 x i32>, <2 x i1>, i32)
declare <2 x i64> @llvm.x86.avx512.mask.gather3siv2.di(<2 x i64>, ptr, <4 x i32>, <2 x i1>, i32)
declare <4 x double> @llvm.x86.avx512.mask.gather3siv4.df(<4 x double>, ptr, <4 x i32>, <4 x i1>, i32)
declare <4 x i64> @llvm.x86.avx512.mask.gather3siv4.di(<4 x i64>, ptr, <4 x i32>, <4 x i1>, i32)
declare <4 x float> @llvm.x86.avx512.mask.gather3siv4.sf(<4 x float>, ptr, <4 x i32>, <4 x i1>, i32)
declare <4 x i32> @llvm.x86.avx512.mask.gather3siv4.si(<4 x i32>, ptr, <4 x i32>, <4 x i1>, i32)
declare <8 x float> @llvm.x86.avx512.mask.gather3siv8.sf(<8 x float>, ptr, <8 x i32>, <8 x i1>, i32)
declare <8 x i32> @llvm.x86.avx512.mask.gather3siv8.si(<8 x i32>, ptr, <8 x i32>, <8 x i1>, i32)
declare void @llvm.x86.avx512.mask.scatter.dps.512(ptr, <16 x i1>, <16 x i32>, <16 x float>, i32)
declare void @llvm.x86.avx512.mask.scatter.dpd.512(ptr, <8 x i1>, <8 x i32>, <8 x double>, i32)
declare void @llvm.x86.avx512.mask.scatter.qps.512(ptr, <8 x i1>, <8 x i64>, <8 x float>, i32)
declare void @llvm.x86.avx512.mask.scatter.qpd.512(ptr, <8 x i1>, <8 x i64>, <8 x double>, i32)
declare void @llvm.x86.avx512.mask.scatter.dpi.512(ptr, <16 x i1>, <16 x i32>, <16 x i32>, i32)
declare void @llvm.x86.avx512.mask.scatter.dpq.512(ptr, <8 x i1>, <8 x i32>, <8 x i64>, i32)
declare void @llvm.x86.avx512.mask.scatter.qpi.512(ptr, <8 x i1>, <8 x i64>, <8 x i32>, i32)
declare void @llvm.x86.avx512.mask.scatter.qpq.512(ptr, <8 x i1>, <8 x i64>, <8 x i64>, i32)
declare void @llvm.x86.avx512.mask.scatterdiv2.df(ptr, <2 x i1>, <2 x i64>, <2 x double>, i32)
declare void @llvm.x86.avx512.mask.scatterdiv2.di(ptr, <2 x i1>, <2 x i64>, <2 x i64>, i32)
declare void @llvm.x86.avx512.mask.scatterdiv4.df(ptr, <4 x i1>, <4 x i64>, <4 x double>, i32)
declare void @llvm.x86.avx512.mask.scatterdiv4.di(ptr, <4 x i1>, <4 x i64>, <4 x i64>, i32)
declare void @llvm.x86.avx512.mask.scatterdiv4.sf(ptr, <2 x i1>, <2 x i64>, <4 x float>, i32)
declare void @llvm.x86.avx512.mask.scatterdiv4.si(ptr, <2 x i1>, <2 x i64>, <4 x i32>, i32)
declare void @llvm.x86.avx512.mask.scatterdiv8.sf(ptr, <4 x i1>, <4 x i64>, <4 x float>, i32)
declare void @llvm.x86.avx512.mask.scatterdiv8.si(ptr, <4 x i1>, <4 x i64>, <4 x i32>, i32)
declare void @llvm.x86.avx512.mask.scattersiv2.df(ptr, <2 x i1>, <4 x i32>, <2 x double>, i32)
declare void @llvm.x86.avx512.mask.scattersiv2.di(ptr, <2 x i1>, <4 x i32>, <2 x i64>, i32)
declare void @llvm.x86.avx512.mask.scattersiv4.df(ptr, <4 x i1>, <4 x i32>, <4 x double>, i32)
declare void @llvm.x86.avx512.mask.scattersiv4.di(ptr, <4 x i1>, <4 x i32>, <4 x i64>, i32)
declare void @llvm.x86.avx512.mask.scattersiv4.sf(ptr, <4 x i1>, <4 x i32>, <4 x float>, i32)
declare void @llvm.x86.avx512.mask.scattersiv4.si(ptr, <4 x i1>, <4 x i32>, <4 x i32>, i32)
declare void @llvm.x86.avx512.mask.scattersiv8.sf(ptr, <8 x i1>, <8 x i32>, <8 x float>, i32)
declare void @llvm.x86.avx512.mask.scattersiv8.si(ptr, <8 x i1>, <8 x i32>, <8 x i32>, i32)