[llvm] b4c970c - [X86] Add pdep/pext vector test coverage (#215231)

via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 10 03:33:13 PDT 2026


Author: Simon Pilgrim
Date: 2026-08-10T10:33:07Z
New Revision: b4c970ca4db13275e3c52c16d0d2c1eaf5777337

URL: https://github.com/llvm/llvm-project/commit/b4c970ca4db13275e3c52c16d0d2c1eaf5777337
DIFF: https://github.com/llvm/llvm-project/commit/b4c970ca4db13275e3c52c16d0d2c1eaf5777337.diff

LOG: [X86] Add pdep/pext vector test coverage (#215231)

Baseline tests for #214508

Added: 
    llvm/test/CodeGen/X86/pdep-vector.ll
    llvm/test/CodeGen/X86/pext-vector.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/CodeGen/X86/pdep-vector.ll b/llvm/test/CodeGen/X86/pdep-vector.ll
new file mode 100644
index 0000000000000..e65aa8aaea04a
--- /dev/null
+++ b/llvm/test/CodeGen/X86/pdep-vector.ll
@@ -0,0 +1,889 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64    | FileCheck %s --check-prefixes=SSE
+; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=SSE
+; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=AVX
+; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=AVX
+
+define <16 x i8> @pdep_v16i8(<16 x i8> %val, <16 x i8> %mask) nounwind {
+; SSE-LABEL: pdep_v16i8:
+; SSE:       # %bb.0:
+; SSE-NEXT:    pcmpeqd %xmm5, %xmm5
+; SSE-NEXT:    movdqa %xmm1, %xmm3
+; SSE-NEXT:    pxor %xmm5, %xmm3
+; SSE-NEXT:    movdqa %xmm1, %xmm2
+; SSE-NEXT:    psubb %xmm3, %xmm2
+; SSE-NEXT:    paddb %xmm3, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm4
+; SSE-NEXT:    paddb %xmm3, %xmm4
+; SSE-NEXT:    pxor %xmm3, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm6
+; SSE-NEXT:    paddb %xmm4, %xmm6
+; SSE-NEXT:    paddb %xmm6, %xmm6
+; SSE-NEXT:    pxor %xmm4, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm3
+; SSE-NEXT:    psllw $4, %xmm3
+; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
+; SSE-NEXT:    pand %xmm4, %xmm3
+; SSE-NEXT:    pxor %xmm6, %xmm3
+; SSE-NEXT:    por %xmm3, %xmm2
+; SSE-NEXT:    pxor %xmm5, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm5
+; SSE-NEXT:    paddb %xmm2, %xmm5
+; SSE-NEXT:    pxor %xmm2, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm6
+; SSE-NEXT:    paddb %xmm5, %xmm6
+; SSE-NEXT:    paddb %xmm6, %xmm6
+; SSE-NEXT:    pxor %xmm5, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm5
+; SSE-NEXT:    psllw $4, %xmm5
+; SSE-NEXT:    pand %xmm4, %xmm5
+; SSE-NEXT:    pxor %xmm6, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm6
+; SSE-NEXT:    pandn %xmm2, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm2
+; SSE-NEXT:    paddb %xmm6, %xmm2
+; SSE-NEXT:    pxor %xmm6, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm6
+; SSE-NEXT:    paddb %xmm2, %xmm6
+; SSE-NEXT:    paddb %xmm6, %xmm6
+; SSE-NEXT:    pxor %xmm2, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm7
+; SSE-NEXT:    psllw $4, %xmm7
+; SSE-NEXT:    pand %xmm4, %xmm7
+; SSE-NEXT:    pxor %xmm6, %xmm7
+; SSE-NEXT:    pand %xmm1, %xmm3
+; SSE-NEXT:    movdqa %xmm1, %xmm2
+; SSE-NEXT:    pxor %xmm3, %xmm2
+; SSE-NEXT:    movdqa %xmm3, %xmm6
+; SSE-NEXT:    psrlw $1, %xmm6
+; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6
+; SSE-NEXT:    por %xmm2, %xmm6
+; SSE-NEXT:    pand %xmm6, %xmm5
+; SSE-NEXT:    pxor %xmm5, %xmm6
+; SSE-NEXT:    movdqa %xmm5, %xmm2
+; SSE-NEXT:    psrlw $2, %xmm2
+; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE-NEXT:    por %xmm6, %xmm2
+; SSE-NEXT:    pand %xmm7, %xmm2
+; SSE-NEXT:    movdqa %xmm0, %xmm6
+; SSE-NEXT:    psllw $4, %xmm6
+; SSE-NEXT:    pand %xmm4, %xmm6
+; SSE-NEXT:    pand %xmm2, %xmm6
+; SSE-NEXT:    pandn %xmm0, %xmm2
+; SSE-NEXT:    por %xmm6, %xmm2
+; SSE-NEXT:    movdqa %xmm5, %xmm0
+; SSE-NEXT:    pandn %xmm2, %xmm0
+; SSE-NEXT:    psllw $2, %xmm2
+; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE-NEXT:    pand %xmm5, %xmm2
+; SSE-NEXT:    por %xmm0, %xmm2
+; SSE-NEXT:    movdqa %xmm3, %xmm0
+; SSE-NEXT:    pandn %xmm2, %xmm0
+; SSE-NEXT:    paddb %xmm2, %xmm2
+; SSE-NEXT:    pand %xmm3, %xmm2
+; SSE-NEXT:    por %xmm0, %xmm2
+; SSE-NEXT:    pand %xmm1, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm0
+; SSE-NEXT:    retq
+;
+; AVX-LABEL: pdep_v16i8:
+; AVX:       # %bb.0:
+; AVX-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm1, %xmm4
+; AVX-NEXT:    vpaddb %xmm4, %xmm4, %xmm2
+; AVX-NEXT:    vpaddb %xmm2, %xmm2, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm2, %xmm2
+; AVX-NEXT:    vpaddb %xmm2, %xmm2, %xmm5
+; AVX-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm2, %xmm5
+; AVX-NEXT:    vpsllw $4, %xmm5, %xmm6
+; AVX-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
+; AVX-NEXT:    vpand %xmm2, %xmm6, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpsubb %xmm4, %xmm1, %xmm4
+; AVX-NEXT:    vpor %xmm5, %xmm4, %xmm4
+; AVX-NEXT:    vpxor %xmm3, %xmm4, %xmm3
+; AVX-NEXT:    vpaddb %xmm3, %xmm3, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm3, %xmm4
+; AVX-NEXT:    vpaddb %xmm4, %xmm4, %xmm6
+; AVX-NEXT:    vpaddb %xmm6, %xmm6, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm4, %xmm4
+; AVX-NEXT:    vpsllw $4, %xmm4, %xmm6
+; AVX-NEXT:    vpand %xmm2, %xmm6, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm4, %xmm4
+; AVX-NEXT:    vpandn %xmm3, %xmm4, %xmm3
+; AVX-NEXT:    vpaddb %xmm3, %xmm3, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm3, %xmm3
+; AVX-NEXT:    vpaddb %xmm3, %xmm3, %xmm6
+; AVX-NEXT:    vpaddb %xmm6, %xmm6, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm3, %xmm3
+; AVX-NEXT:    vpsllw $4, %xmm3, %xmm6
+; AVX-NEXT:    vpand %xmm2, %xmm6, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm3, %xmm3
+; AVX-NEXT:    vpand %xmm1, %xmm5, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm1, %xmm6
+; AVX-NEXT:    vpsrlw $1, %xmm5, %xmm7
+; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm7
+; AVX-NEXT:    vpor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpand %xmm6, %xmm4, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm6, %xmm6
+; AVX-NEXT:    vpsrlw $2, %xmm4, %xmm7
+; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm7
+; AVX-NEXT:    vpor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpand %xmm6, %xmm3, %xmm3
+; AVX-NEXT:    vpsllw $4, %xmm0, %xmm6
+; AVX-NEXT:    vpand %xmm2, %xmm6, %xmm2
+; AVX-NEXT:    vpand %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpandn %xmm0, %xmm3, %xmm0
+; AVX-NEXT:    vpor %xmm2, %xmm0, %xmm0
+; AVX-NEXT:    vpsllw $2, %xmm0, %xmm2
+; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
+; AVX-NEXT:    vpandn %xmm0, %xmm4, %xmm0
+; AVX-NEXT:    vpand %xmm4, %xmm2, %xmm2
+; AVX-NEXT:    vpor %xmm2, %xmm0, %xmm0
+; AVX-NEXT:    vpandn %xmm0, %xmm5, %xmm2
+; AVX-NEXT:    vpaddb %xmm0, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm5, %xmm0, %xmm0
+; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
+; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    retq
+  %res = call <16 x i8> @llvm.pdep.v16i8(<16 x i8> %val, <16 x i8> %mask)
+  ret <16 x i8> %res
+}
+
+define <8 x i16> @pdep_v8i16(<8 x i16> %val, <8 x i16> %mask) nounwind {
+; SSE-LABEL: pdep_v8i16:
+; SSE:       # %bb.0:
+; SSE-NEXT:    pcmpeqd %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm1, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm3
+; SSE-NEXT:    psllw $2, %xmm3
+; SSE-NEXT:    paddw %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm2, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm4
+; SSE-NEXT:    psllw $2, %xmm4
+; SSE-NEXT:    pxor %xmm3, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm5
+; SSE-NEXT:    psllw $4, %xmm5
+; SSE-NEXT:    pxor %xmm4, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm3
+; SSE-NEXT:    psllw $8, %xmm3
+; SSE-NEXT:    pxor %xmm5, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm5
+; SSE-NEXT:    pandn %xmm2, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm2
+; SSE-NEXT:    paddw %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm5, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm4
+; SSE-NEXT:    psllw $2, %xmm4
+; SSE-NEXT:    pxor %xmm2, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm2
+; SSE-NEXT:    psllw $4, %xmm2
+; SSE-NEXT:    pxor %xmm4, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm4
+; SSE-NEXT:    psllw $8, %xmm4
+; SSE-NEXT:    pxor %xmm2, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm2
+; SSE-NEXT:    pandn %xmm5, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm5
+; SSE-NEXT:    paddw %xmm5, %xmm5
+; SSE-NEXT:    pxor %xmm2, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm6
+; SSE-NEXT:    psllw $2, %xmm6
+; SSE-NEXT:    pxor %xmm5, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm7
+; SSE-NEXT:    psllw $4, %xmm7
+; SSE-NEXT:    pxor %xmm6, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm5
+; SSE-NEXT:    psllw $8, %xmm5
+; SSE-NEXT:    pxor %xmm7, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm6
+; SSE-NEXT:    pandn %xmm2, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm2
+; SSE-NEXT:    paddw %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm6, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm6
+; SSE-NEXT:    psllw $2, %xmm6
+; SSE-NEXT:    pxor %xmm2, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm2
+; SSE-NEXT:    psllw $4, %xmm2
+; SSE-NEXT:    pxor %xmm6, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm6
+; SSE-NEXT:    psllw $8, %xmm6
+; SSE-NEXT:    pxor %xmm2, %xmm6
+; SSE-NEXT:    pand %xmm1, %xmm3
+; SSE-NEXT:    movdqa %xmm1, %xmm2
+; SSE-NEXT:    pxor %xmm3, %xmm2
+; SSE-NEXT:    movdqa %xmm3, %xmm7
+; SSE-NEXT:    psrlw $1, %xmm7
+; SSE-NEXT:    por %xmm2, %xmm7
+; SSE-NEXT:    pand %xmm7, %xmm4
+; SSE-NEXT:    pxor %xmm4, %xmm7
+; SSE-NEXT:    movdqa %xmm4, %xmm8
+; SSE-NEXT:    psrlw $2, %xmm8
+; SSE-NEXT:    por %xmm7, %xmm8
+; SSE-NEXT:    pand %xmm8, %xmm5
+; SSE-NEXT:    pxor %xmm5, %xmm8
+; SSE-NEXT:    movdqa %xmm5, %xmm2
+; SSE-NEXT:    psrlw $4, %xmm2
+; SSE-NEXT:    por %xmm8, %xmm2
+; SSE-NEXT:    pand %xmm6, %xmm2
+; SSE-NEXT:    movdqa %xmm0, %xmm6
+; SSE-NEXT:    psllw $8, %xmm6
+; SSE-NEXT:    pand %xmm2, %xmm6
+; SSE-NEXT:    pandn %xmm0, %xmm2
+; SSE-NEXT:    por %xmm6, %xmm2
+; SSE-NEXT:    movdqa %xmm5, %xmm0
+; SSE-NEXT:    pandn %xmm2, %xmm0
+; SSE-NEXT:    psllw $4, %xmm2
+; SSE-NEXT:    pand %xmm5, %xmm2
+; SSE-NEXT:    por %xmm0, %xmm2
+; SSE-NEXT:    movdqa %xmm4, %xmm0
+; SSE-NEXT:    pandn %xmm2, %xmm0
+; SSE-NEXT:    psllw $2, %xmm2
+; SSE-NEXT:    pand %xmm4, %xmm2
+; SSE-NEXT:    por %xmm0, %xmm2
+; SSE-NEXT:    movdqa %xmm3, %xmm0
+; SSE-NEXT:    pandn %xmm2, %xmm0
+; SSE-NEXT:    paddw %xmm2, %xmm2
+; SSE-NEXT:    pand %xmm3, %xmm2
+; SSE-NEXT:    por %xmm0, %xmm2
+; SSE-NEXT:    pand %xmm1, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm0
+; SSE-NEXT:    retq
+;
+; AVX-LABEL: pdep_v8i16:
+; AVX:       # %bb.0:
+; AVX-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
+; AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm2
+; AVX-NEXT:    vpsllw $2, %xmm2, %xmm3
+; AVX-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm3
+; AVX-NEXT:    vpsllw $2, %xmm3, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm3, %xmm3
+; AVX-NEXT:    vpsllw $4, %xmm3, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm3, %xmm3
+; AVX-NEXT:    vpsllw $8, %xmm3, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm3, %xmm3
+; AVX-NEXT:    vpandn %xmm2, %xmm3, %xmm2
+; AVX-NEXT:    vpaddw %xmm2, %xmm2, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm2, %xmm4
+; AVX-NEXT:    vpsllw $2, %xmm4, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm4, %xmm4
+; AVX-NEXT:    vpsllw $4, %xmm4, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm4, %xmm4
+; AVX-NEXT:    vpsllw $8, %xmm4, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm4, %xmm4
+; AVX-NEXT:    vpandn %xmm2, %xmm4, %xmm2
+; AVX-NEXT:    vpaddw %xmm2, %xmm2, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm2, %xmm5
+; AVX-NEXT:    vpsllw $2, %xmm5, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpsllw $4, %xmm5, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpsllw $8, %xmm5, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpandn %xmm2, %xmm5, %xmm2
+; AVX-NEXT:    vpaddw %xmm2, %xmm2, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm2, %xmm2
+; AVX-NEXT:    vpsllw $2, %xmm2, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm2, %xmm2
+; AVX-NEXT:    vpsllw $4, %xmm2, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm2, %xmm2
+; AVX-NEXT:    vpsllw $8, %xmm2, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm2, %xmm2
+; AVX-NEXT:    vpand %xmm1, %xmm3, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm1, %xmm6
+; AVX-NEXT:    vpsrlw $1, %xmm3, %xmm7
+; AVX-NEXT:    vpor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpand %xmm6, %xmm4, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm6, %xmm6
+; AVX-NEXT:    vpsrlw $2, %xmm4, %xmm7
+; AVX-NEXT:    vpor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpand %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm6, %xmm6
+; AVX-NEXT:    vpsrlw $4, %xmm5, %xmm7
+; AVX-NEXT:    vpor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpand %xmm6, %xmm2, %xmm2
+; AVX-NEXT:    vpsllw $8, %xmm0, %xmm6
+; AVX-NEXT:    vpand %xmm2, %xmm6, %xmm6
+; AVX-NEXT:    vpandn %xmm0, %xmm2, %xmm0
+; AVX-NEXT:    vpor %xmm6, %xmm0, %xmm0
+; AVX-NEXT:    vpandn %xmm0, %xmm5, %xmm2
+; AVX-NEXT:    vpsllw $4, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm5, %xmm0, %xmm0
+; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
+; AVX-NEXT:    vpandn %xmm0, %xmm4, %xmm2
+; AVX-NEXT:    vpsllw $2, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm4, %xmm0, %xmm0
+; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
+; AVX-NEXT:    vpandn %xmm0, %xmm3, %xmm2
+; AVX-NEXT:    vpaddw %xmm0, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm3, %xmm0, %xmm0
+; AVX-NEXT:    vpor %xmm0, %xmm2, %xmm0
+; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    retq
+  %res = call <8 x i16> @llvm.pdep.v8i16(<8 x i16> %val, <8 x i16> %mask)
+  ret <8 x i16> %res
+}
+
+define <4 x i32> @pdep_v4i32(<4 x i32> %val, <4 x i32> %mask) nounwind {
+; SSE-LABEL: pdep_v4i32:
+; SSE:       # %bb.0:
+; SSE-NEXT:    pcmpeqd %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm1, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm3
+; SSE-NEXT:    pslld $2, %xmm3
+; SSE-NEXT:    paddd %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm2, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm4
+; SSE-NEXT:    pslld $2, %xmm4
+; SSE-NEXT:    pxor %xmm3, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm3
+; SSE-NEXT:    pslld $4, %xmm3
+; SSE-NEXT:    pxor %xmm4, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm4
+; SSE-NEXT:    pslld $8, %xmm4
+; SSE-NEXT:    pxor %xmm3, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm3
+; SSE-NEXT:    pslld $16, %xmm3
+; SSE-NEXT:    pxor %xmm4, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm5
+; SSE-NEXT:    pandn %xmm2, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm2
+; SSE-NEXT:    paddd %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm5, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm4
+; SSE-NEXT:    pslld $2, %xmm4
+; SSE-NEXT:    pxor %xmm2, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm2
+; SSE-NEXT:    pslld $4, %xmm2
+; SSE-NEXT:    pxor %xmm4, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm6
+; SSE-NEXT:    pslld $8, %xmm6
+; SSE-NEXT:    pxor %xmm2, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm4
+; SSE-NEXT:    pslld $16, %xmm4
+; SSE-NEXT:    pxor %xmm6, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm2
+; SSE-NEXT:    pandn %xmm5, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm5
+; SSE-NEXT:    paddd %xmm5, %xmm5
+; SSE-NEXT:    pxor %xmm2, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm6
+; SSE-NEXT:    pslld $2, %xmm6
+; SSE-NEXT:    pxor %xmm5, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm5
+; SSE-NEXT:    pslld $4, %xmm5
+; SSE-NEXT:    pxor %xmm6, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm6
+; SSE-NEXT:    pslld $8, %xmm6
+; SSE-NEXT:    pxor %xmm5, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm5
+; SSE-NEXT:    pslld $16, %xmm5
+; SSE-NEXT:    pxor %xmm6, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm7
+; SSE-NEXT:    pandn %xmm2, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm2
+; SSE-NEXT:    paddd %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm7, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm6
+; SSE-NEXT:    pslld $2, %xmm6
+; SSE-NEXT:    pxor %xmm2, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm2
+; SSE-NEXT:    pslld $4, %xmm2
+; SSE-NEXT:    pxor %xmm6, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm8
+; SSE-NEXT:    pslld $8, %xmm8
+; SSE-NEXT:    pxor %xmm2, %xmm8
+; SSE-NEXT:    movdqa %xmm8, %xmm6
+; SSE-NEXT:    pslld $16, %xmm6
+; SSE-NEXT:    pxor %xmm8, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm2
+; SSE-NEXT:    pandn %xmm7, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm7
+; SSE-NEXT:    paddd %xmm7, %xmm7
+; SSE-NEXT:    pxor %xmm2, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm2
+; SSE-NEXT:    pslld $2, %xmm2
+; SSE-NEXT:    pxor %xmm7, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm7
+; SSE-NEXT:    pslld $4, %xmm7
+; SSE-NEXT:    pxor %xmm2, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm2
+; SSE-NEXT:    pslld $8, %xmm2
+; SSE-NEXT:    pxor %xmm7, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm7
+; SSE-NEXT:    pslld $16, %xmm7
+; SSE-NEXT:    pxor %xmm2, %xmm7
+; SSE-NEXT:    pand %xmm1, %xmm3
+; SSE-NEXT:    movdqa %xmm1, %xmm2
+; SSE-NEXT:    pxor %xmm3, %xmm2
+; SSE-NEXT:    movdqa %xmm3, %xmm8
+; SSE-NEXT:    psrld $1, %xmm8
+; SSE-NEXT:    por %xmm2, %xmm8
+; SSE-NEXT:    pand %xmm8, %xmm4
+; SSE-NEXT:    pxor %xmm4, %xmm8
+; SSE-NEXT:    movdqa %xmm4, %xmm2
+; SSE-NEXT:    psrld $2, %xmm2
+; SSE-NEXT:    por %xmm8, %xmm2
+; SSE-NEXT:    pand %xmm2, %xmm5
+; SSE-NEXT:    pxor %xmm5, %xmm2
+; SSE-NEXT:    movdqa %xmm5, %xmm8
+; SSE-NEXT:    psrld $4, %xmm8
+; SSE-NEXT:    por %xmm2, %xmm8
+; SSE-NEXT:    pand %xmm8, %xmm6
+; SSE-NEXT:    pxor %xmm6, %xmm8
+; SSE-NEXT:    movdqa %xmm6, %xmm2
+; SSE-NEXT:    psrld $8, %xmm2
+; SSE-NEXT:    por %xmm8, %xmm2
+; SSE-NEXT:    pand %xmm7, %xmm2
+; SSE-NEXT:    movdqa %xmm0, %xmm7
+; SSE-NEXT:    pslld $16, %xmm7
+; SSE-NEXT:    pand %xmm2, %xmm7
+; SSE-NEXT:    pandn %xmm0, %xmm2
+; SSE-NEXT:    por %xmm7, %xmm2
+; SSE-NEXT:    movdqa %xmm6, %xmm0
+; SSE-NEXT:    pandn %xmm2, %xmm0
+; SSE-NEXT:    pslld $8, %xmm2
+; SSE-NEXT:    pand %xmm6, %xmm2
+; SSE-NEXT:    por %xmm0, %xmm2
+; SSE-NEXT:    movdqa %xmm5, %xmm0
+; SSE-NEXT:    pandn %xmm2, %xmm0
+; SSE-NEXT:    pslld $4, %xmm2
+; SSE-NEXT:    pand %xmm5, %xmm2
+; SSE-NEXT:    por %xmm0, %xmm2
+; SSE-NEXT:    movdqa %xmm4, %xmm0
+; SSE-NEXT:    pandn %xmm2, %xmm0
+; SSE-NEXT:    pslld $2, %xmm2
+; SSE-NEXT:    pand %xmm4, %xmm2
+; SSE-NEXT:    por %xmm0, %xmm2
+; SSE-NEXT:    movdqa %xmm3, %xmm0
+; SSE-NEXT:    pandn %xmm2, %xmm0
+; SSE-NEXT:    paddd %xmm2, %xmm2
+; SSE-NEXT:    pand %xmm3, %xmm2
+; SSE-NEXT:    por %xmm0, %xmm2
+; SSE-NEXT:    pand %xmm1, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm0
+; SSE-NEXT:    retq
+;
+; AVX-LABEL: pdep_v4i32:
+; AVX:       # %bb.0:
+; AVX-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
+; AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm2
+; AVX-NEXT:    vpslld $2, %xmm2, %xmm3
+; AVX-NEXT:    vpaddd %xmm2, %xmm2, %xmm4
+; AVX-NEXT:    vpxor %xmm3, %xmm4, %xmm2
+; AVX-NEXT:    vpslld $2, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpslld $4, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpslld $8, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpslld $16, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpandn %xmm4, %xmm2, %xmm4
+; AVX-NEXT:    vpaddd %xmm4, %xmm4, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm4, %xmm3
+; AVX-NEXT:    vpslld $2, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpslld $4, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpslld $8, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpslld $16, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpandn %xmm4, %xmm3, %xmm4
+; AVX-NEXT:    vpaddd %xmm4, %xmm4, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm4, %xmm5
+; AVX-NEXT:    vpslld $2, %xmm5, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpslld $4, %xmm5, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpslld $8, %xmm5, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpslld $16, %xmm5, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpandn %xmm4, %xmm5, %xmm4
+; AVX-NEXT:    vpaddd %xmm4, %xmm4, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm4, %xmm6
+; AVX-NEXT:    vpslld $2, %xmm6, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpslld $4, %xmm6, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpslld $8, %xmm6, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpslld $16, %xmm6, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpandn %xmm4, %xmm6, %xmm4
+; AVX-NEXT:    vpaddd %xmm4, %xmm4, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm4, %xmm4
+; AVX-NEXT:    vpslld $2, %xmm4, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm4, %xmm4
+; AVX-NEXT:    vpslld $4, %xmm4, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm4, %xmm4
+; AVX-NEXT:    vpslld $8, %xmm4, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm4, %xmm4
+; AVX-NEXT:    vpslld $16, %xmm4, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm4, %xmm4
+; AVX-NEXT:    vpand %xmm1, %xmm2, %xmm2
+; AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm7
+; AVX-NEXT:    vpsrld $1, %xmm2, %xmm8
+; AVX-NEXT:    vpor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpand %xmm7, %xmm3, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm7, %xmm7
+; AVX-NEXT:    vpsrld $2, %xmm3, %xmm8
+; AVX-NEXT:    vpor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpand %xmm7, %xmm5, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm7, %xmm7
+; AVX-NEXT:    vpsrld $4, %xmm5, %xmm8
+; AVX-NEXT:    vpor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpand %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm7, %xmm7
+; AVX-NEXT:    vpsrld $8, %xmm6, %xmm8
+; AVX-NEXT:    vpor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpand %xmm7, %xmm4, %xmm4
+; AVX-NEXT:    vpslld $16, %xmm0, %xmm7
+; AVX-NEXT:    vpand %xmm4, %xmm7, %xmm7
+; AVX-NEXT:    vpandn %xmm0, %xmm4, %xmm0
+; AVX-NEXT:    vpor %xmm7, %xmm0, %xmm0
+; AVX-NEXT:    vpandn %xmm0, %xmm6, %xmm4
+; AVX-NEXT:    vpslld $8, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm6, %xmm0, %xmm0
+; AVX-NEXT:    vpor %xmm0, %xmm4, %xmm0
+; AVX-NEXT:    vpandn %xmm0, %xmm5, %xmm4
+; AVX-NEXT:    vpslld $4, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm5, %xmm0, %xmm0
+; AVX-NEXT:    vpor %xmm0, %xmm4, %xmm0
+; AVX-NEXT:    vpandn %xmm0, %xmm3, %xmm4
+; AVX-NEXT:    vpslld $2, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm3, %xmm0, %xmm0
+; AVX-NEXT:    vpor %xmm0, %xmm4, %xmm0
+; AVX-NEXT:    vpandn %xmm0, %xmm2, %xmm3
+; AVX-NEXT:    vpaddd %xmm0, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm2, %xmm0, %xmm0
+; AVX-NEXT:    vpor %xmm0, %xmm3, %xmm0
+; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    retq
+  %res = call <4 x i32> @llvm.pdep.v4i32(<4 x i32> %val, <4 x i32> %mask)
+  ret <4 x i32> %res
+}
+
+define <2 x i64> @pdep_v2i64(<2 x i64> %val, <2 x i64> %mask) nounwind {
+; SSE-LABEL: pdep_v2i64:
+; SSE:       # %bb.0:
+; SSE-NEXT:    pcmpeqd %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm1, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm3
+; SSE-NEXT:    psllq $2, %xmm3
+; SSE-NEXT:    paddq %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm2, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm4
+; SSE-NEXT:    psllq $2, %xmm4
+; SSE-NEXT:    pxor %xmm3, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm3
+; SSE-NEXT:    psllq $4, %xmm3
+; SSE-NEXT:    pxor %xmm4, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm4
+; SSE-NEXT:    psllq $8, %xmm4
+; SSE-NEXT:    pxor %xmm3, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm5
+; SSE-NEXT:    psllq $16, %xmm5
+; SSE-NEXT:    pxor %xmm4, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm3
+; SSE-NEXT:    psllq $32, %xmm3
+; SSE-NEXT:    pxor %xmm5, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm5
+; SSE-NEXT:    pandn %xmm2, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm2
+; SSE-NEXT:    paddq %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm5, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm4
+; SSE-NEXT:    psllq $2, %xmm4
+; SSE-NEXT:    pxor %xmm2, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm2
+; SSE-NEXT:    psllq $4, %xmm2
+; SSE-NEXT:    pxor %xmm4, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm4
+; SSE-NEXT:    psllq $8, %xmm4
+; SSE-NEXT:    pxor %xmm2, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm2
+; SSE-NEXT:    psllq $16, %xmm2
+; SSE-NEXT:    pxor %xmm4, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm4
+; SSE-NEXT:    psllq $32, %xmm4
+; SSE-NEXT:    pxor %xmm2, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm2
+; SSE-NEXT:    pandn %xmm5, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm5
+; SSE-NEXT:    paddq %xmm5, %xmm5
+; SSE-NEXT:    pxor %xmm2, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm6
+; SSE-NEXT:    psllq $2, %xmm6
+; SSE-NEXT:    pxor %xmm5, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm5
+; SSE-NEXT:    psllq $4, %xmm5
+; SSE-NEXT:    pxor %xmm6, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm6
+; SSE-NEXT:    psllq $8, %xmm6
+; SSE-NEXT:    pxor %xmm5, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm7
+; SSE-NEXT:    psllq $16, %xmm7
+; SSE-NEXT:    pxor %xmm6, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm5
+; SSE-NEXT:    psllq $32, %xmm5
+; SSE-NEXT:    pxor %xmm7, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm7
+; SSE-NEXT:    pandn %xmm2, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm2
+; SSE-NEXT:    paddq %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm7, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm6
+; SSE-NEXT:    psllq $2, %xmm6
+; SSE-NEXT:    pxor %xmm2, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm2
+; SSE-NEXT:    psllq $4, %xmm2
+; SSE-NEXT:    pxor %xmm6, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm6
+; SSE-NEXT:    psllq $8, %xmm6
+; SSE-NEXT:    pxor %xmm2, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm2
+; SSE-NEXT:    psllq $16, %xmm2
+; SSE-NEXT:    pxor %xmm6, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm6
+; SSE-NEXT:    psllq $32, %xmm6
+; SSE-NEXT:    pxor %xmm2, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm2
+; SSE-NEXT:    pandn %xmm7, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm7
+; SSE-NEXT:    paddq %xmm7, %xmm7
+; SSE-NEXT:    pxor %xmm2, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm8
+; SSE-NEXT:    psllq $2, %xmm8
+; SSE-NEXT:    pxor %xmm7, %xmm8
+; SSE-NEXT:    movdqa %xmm8, %xmm7
+; SSE-NEXT:    psllq $4, %xmm7
+; SSE-NEXT:    pxor %xmm8, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm8
+; SSE-NEXT:    psllq $8, %xmm8
+; SSE-NEXT:    pxor %xmm7, %xmm8
+; SSE-NEXT:    movdqa %xmm8, %xmm9
+; SSE-NEXT:    psllq $16, %xmm9
+; SSE-NEXT:    pxor %xmm8, %xmm9
+; SSE-NEXT:    movdqa %xmm9, %xmm7
+; SSE-NEXT:    psllq $32, %xmm7
+; SSE-NEXT:    pxor %xmm9, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm8
+; SSE-NEXT:    pandn %xmm2, %xmm8
+; SSE-NEXT:    movdqa %xmm8, %xmm2
+; SSE-NEXT:    paddq %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm8, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm8
+; SSE-NEXT:    psllq $2, %xmm8
+; SSE-NEXT:    pxor %xmm2, %xmm8
+; SSE-NEXT:    movdqa %xmm8, %xmm2
+; SSE-NEXT:    psllq $4, %xmm2
+; SSE-NEXT:    pxor %xmm8, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm8
+; SSE-NEXT:    psllq $8, %xmm8
+; SSE-NEXT:    pxor %xmm2, %xmm8
+; SSE-NEXT:    movdqa %xmm8, %xmm2
+; SSE-NEXT:    psllq $16, %xmm2
+; SSE-NEXT:    pxor %xmm8, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm8
+; SSE-NEXT:    psllq $32, %xmm8
+; SSE-NEXT:    pxor %xmm2, %xmm8
+; SSE-NEXT:    pand %xmm1, %xmm3
+; SSE-NEXT:    movdqa %xmm1, %xmm2
+; SSE-NEXT:    pxor %xmm3, %xmm2
+; SSE-NEXT:    movdqa %xmm3, %xmm9
+; SSE-NEXT:    psrlq $1, %xmm9
+; SSE-NEXT:    por %xmm2, %xmm9
+; SSE-NEXT:    pand %xmm9, %xmm4
+; SSE-NEXT:    pxor %xmm4, %xmm9
+; SSE-NEXT:    movdqa %xmm4, %xmm2
+; SSE-NEXT:    psrlq $2, %xmm2
+; SSE-NEXT:    por %xmm9, %xmm2
+; SSE-NEXT:    pand %xmm2, %xmm5
+; SSE-NEXT:    pxor %xmm5, %xmm2
+; SSE-NEXT:    movdqa %xmm5, %xmm9
+; SSE-NEXT:    psrlq $4, %xmm9
+; SSE-NEXT:    por %xmm2, %xmm9
+; SSE-NEXT:    pand %xmm9, %xmm6
+; SSE-NEXT:    pxor %xmm6, %xmm9
+; SSE-NEXT:    movdqa %xmm6, %xmm10
+; SSE-NEXT:    psrlq $8, %xmm10
+; SSE-NEXT:    por %xmm9, %xmm10
+; SSE-NEXT:    pand %xmm10, %xmm7
+; SSE-NEXT:    pxor %xmm7, %xmm10
+; SSE-NEXT:    movdqa %xmm7, %xmm2
+; SSE-NEXT:    psrlq $16, %xmm2
+; SSE-NEXT:    por %xmm10, %xmm2
+; SSE-NEXT:    pand %xmm8, %xmm2
+; SSE-NEXT:    movdqa %xmm0, %xmm8
+; SSE-NEXT:    psllq $32, %xmm8
+; SSE-NEXT:    pand %xmm2, %xmm8
+; SSE-NEXT:    pandn %xmm0, %xmm2
+; SSE-NEXT:    por %xmm8, %xmm2
+; SSE-NEXT:    movdqa %xmm7, %xmm0
+; SSE-NEXT:    pandn %xmm2, %xmm0
+; SSE-NEXT:    psllq $16, %xmm2
+; SSE-NEXT:    pand %xmm7, %xmm2
+; SSE-NEXT:    por %xmm0, %xmm2
+; SSE-NEXT:    movdqa %xmm6, %xmm0
+; SSE-NEXT:    pandn %xmm2, %xmm0
+; SSE-NEXT:    psllq $8, %xmm2
+; SSE-NEXT:    pand %xmm6, %xmm2
+; SSE-NEXT:    por %xmm0, %xmm2
+; SSE-NEXT:    movdqa %xmm5, %xmm0
+; SSE-NEXT:    pandn %xmm2, %xmm0
+; SSE-NEXT:    psllq $4, %xmm2
+; SSE-NEXT:    pand %xmm5, %xmm2
+; SSE-NEXT:    por %xmm0, %xmm2
+; SSE-NEXT:    movdqa %xmm4, %xmm0
+; SSE-NEXT:    pandn %xmm2, %xmm0
+; SSE-NEXT:    psllq $2, %xmm2
+; SSE-NEXT:    pand %xmm4, %xmm2
+; SSE-NEXT:    por %xmm0, %xmm2
+; SSE-NEXT:    movdqa %xmm3, %xmm0
+; SSE-NEXT:    pandn %xmm2, %xmm0
+; SSE-NEXT:    paddq %xmm2, %xmm2
+; SSE-NEXT:    pand %xmm3, %xmm2
+; SSE-NEXT:    por %xmm0, %xmm2
+; SSE-NEXT:    pand %xmm1, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm0
+; SSE-NEXT:    retq
+;
+; AVX-LABEL: pdep_v2i64:
+; AVX:       # %bb.0:
+; AVX-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
+; AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm2
+; AVX-NEXT:    vpsllq $2, %xmm2, %xmm3
+; AVX-NEXT:    vpaddq %xmm2, %xmm2, %xmm4
+; AVX-NEXT:    vpxor %xmm3, %xmm4, %xmm2
+; AVX-NEXT:    vpsllq $2, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpsllq $4, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpsllq $8, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpsllq $16, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpsllq $32, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpandn %xmm4, %xmm2, %xmm4
+; AVX-NEXT:    vpaddq %xmm4, %xmm4, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm4, %xmm3
+; AVX-NEXT:    vpsllq $2, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpsllq $4, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpsllq $8, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpsllq $16, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpsllq $32, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpandn %xmm4, %xmm3, %xmm5
+; AVX-NEXT:    vpaddq %xmm5, %xmm5, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm5, %xmm4
+; AVX-NEXT:    vpsllq $2, %xmm4, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm4, %xmm4
+; AVX-NEXT:    vpsllq $4, %xmm4, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm4, %xmm4
+; AVX-NEXT:    vpsllq $8, %xmm4, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm4, %xmm4
+; AVX-NEXT:    vpsllq $16, %xmm4, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm4, %xmm4
+; AVX-NEXT:    vpsllq $32, %xmm4, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm4, %xmm4
+; AVX-NEXT:    vpandn %xmm5, %xmm4, %xmm6
+; AVX-NEXT:    vpaddq %xmm6, %xmm6, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm6, %xmm5
+; AVX-NEXT:    vpsllq $2, %xmm5, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm5, %xmm5
+; AVX-NEXT:    vpsllq $4, %xmm5, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm5, %xmm5
+; AVX-NEXT:    vpsllq $8, %xmm5, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm5, %xmm5
+; AVX-NEXT:    vpsllq $16, %xmm5, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm5, %xmm5
+; AVX-NEXT:    vpsllq $32, %xmm5, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm5, %xmm5
+; AVX-NEXT:    vpandn %xmm6, %xmm5, %xmm6
+; AVX-NEXT:    vpaddq %xmm6, %xmm6, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm6, %xmm7
+; AVX-NEXT:    vpsllq $2, %xmm7, %xmm8
+; AVX-NEXT:    vpxor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpsllq $4, %xmm7, %xmm8
+; AVX-NEXT:    vpxor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpsllq $8, %xmm7, %xmm8
+; AVX-NEXT:    vpxor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpsllq $16, %xmm7, %xmm8
+; AVX-NEXT:    vpxor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpsllq $32, %xmm7, %xmm8
+; AVX-NEXT:    vpxor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpandn %xmm6, %xmm7, %xmm6
+; AVX-NEXT:    vpaddq %xmm6, %xmm6, %xmm8
+; AVX-NEXT:    vpxor %xmm6, %xmm8, %xmm6
+; AVX-NEXT:    vpsllq $2, %xmm6, %xmm8
+; AVX-NEXT:    vpxor %xmm6, %xmm8, %xmm6
+; AVX-NEXT:    vpsllq $4, %xmm6, %xmm8
+; AVX-NEXT:    vpxor %xmm6, %xmm8, %xmm6
+; AVX-NEXT:    vpsllq $8, %xmm6, %xmm8
+; AVX-NEXT:    vpxor %xmm6, %xmm8, %xmm6
+; AVX-NEXT:    vpsllq $16, %xmm6, %xmm8
+; AVX-NEXT:    vpxor %xmm6, %xmm8, %xmm6
+; AVX-NEXT:    vpsllq $32, %xmm6, %xmm8
+; AVX-NEXT:    vpxor %xmm6, %xmm8, %xmm6
+; AVX-NEXT:    vpand %xmm1, %xmm2, %xmm2
+; AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm8
+; AVX-NEXT:    vpsrlq $1, %xmm2, %xmm9
+; AVX-NEXT:    vpor %xmm9, %xmm8, %xmm8
+; AVX-NEXT:    vpand %xmm3, %xmm8, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm8, %xmm8
+; AVX-NEXT:    vpsrlq $2, %xmm3, %xmm9
+; AVX-NEXT:    vpor %xmm9, %xmm8, %xmm8
+; AVX-NEXT:    vpand %xmm4, %xmm8, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm8, %xmm8
+; AVX-NEXT:    vpsrlq $4, %xmm4, %xmm9
+; AVX-NEXT:    vpor %xmm9, %xmm8, %xmm8
+; AVX-NEXT:    vpand %xmm5, %xmm8, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm8, %xmm8
+; AVX-NEXT:    vpsrlq $8, %xmm5, %xmm9
+; AVX-NEXT:    vpor %xmm9, %xmm8, %xmm8
+; AVX-NEXT:    vpand %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm8, %xmm8
+; AVX-NEXT:    vpsrlq $16, %xmm7, %xmm9
+; AVX-NEXT:    vpor %xmm9, %xmm8, %xmm8
+; AVX-NEXT:    vpand %xmm6, %xmm8, %xmm6
+; AVX-NEXT:    vpsllq $32, %xmm0, %xmm8
+; AVX-NEXT:    vpand %xmm6, %xmm8, %xmm8
+; AVX-NEXT:    vpandn %xmm0, %xmm6, %xmm0
+; AVX-NEXT:    vpor %xmm0, %xmm8, %xmm0
+; AVX-NEXT:    vpandn %xmm0, %xmm7, %xmm6
+; AVX-NEXT:    vpsllq $16, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm7, %xmm0, %xmm0
+; AVX-NEXT:    vpor %xmm0, %xmm6, %xmm0
+; AVX-NEXT:    vpandn %xmm0, %xmm5, %xmm6
+; AVX-NEXT:    vpsllq $8, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm5, %xmm0, %xmm0
+; AVX-NEXT:    vpor %xmm0, %xmm6, %xmm0
+; AVX-NEXT:    vpandn %xmm0, %xmm4, %xmm5
+; AVX-NEXT:    vpsllq $4, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm4, %xmm0, %xmm0
+; AVX-NEXT:    vpor %xmm0, %xmm5, %xmm0
+; AVX-NEXT:    vpandn %xmm0, %xmm3, %xmm4
+; AVX-NEXT:    vpsllq $2, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm3, %xmm0, %xmm0
+; AVX-NEXT:    vpor %xmm0, %xmm4, %xmm0
+; AVX-NEXT:    vpandn %xmm0, %xmm2, %xmm3
+; AVX-NEXT:    vpaddq %xmm0, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm2, %xmm0, %xmm0
+; AVX-NEXT:    vpor %xmm0, %xmm3, %xmm0
+; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    retq
+  %res = call <2 x i64> @llvm.pdep.v2i64(<2 x i64> %val, <2 x i64> %mask)
+  ret <2 x i64> %res
+}
+

diff  --git a/llvm/test/CodeGen/X86/pext-vector.ll b/llvm/test/CodeGen/X86/pext-vector.ll
new file mode 100644
index 0000000000000..2365e9a397b86
--- /dev/null
+++ b/llvm/test/CodeGen/X86/pext-vector.ll
@@ -0,0 +1,869 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64    | FileCheck %s --check-prefixes=SSE
+; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=SSE
+; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=AVX
+; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=AVX
+
+define <16 x i8> @pext_v16i8(<16 x i8> %val, <16 x i8> %mask) nounwind {
+; SSE-LABEL: pext_v16i8:
+; SSE:       # %bb.0:
+; SSE-NEXT:    pcmpeqd %xmm3, %xmm3
+; SSE-NEXT:    movdqa %xmm1, %xmm2
+; SSE-NEXT:    pxor %xmm3, %xmm2
+; SSE-NEXT:    movdqa %xmm1, %xmm4
+; SSE-NEXT:    psubb %xmm2, %xmm4
+; SSE-NEXT:    paddb %xmm2, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm5
+; SSE-NEXT:    paddb %xmm2, %xmm5
+; SSE-NEXT:    pxor %xmm2, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm6
+; SSE-NEXT:    paddb %xmm5, %xmm6
+; SSE-NEXT:    paddb %xmm6, %xmm6
+; SSE-NEXT:    pxor %xmm5, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm2
+; SSE-NEXT:    psllw $4, %xmm2
+; SSE-NEXT:    movdqa {{.*#+}} xmm5 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
+; SSE-NEXT:    pand %xmm5, %xmm2
+; SSE-NEXT:    pxor %xmm6, %xmm2
+; SSE-NEXT:    por %xmm2, %xmm4
+; SSE-NEXT:    pxor %xmm3, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm3
+; SSE-NEXT:    paddb %xmm4, %xmm3
+; SSE-NEXT:    pxor %xmm4, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm6
+; SSE-NEXT:    paddb %xmm3, %xmm6
+; SSE-NEXT:    paddb %xmm6, %xmm6
+; SSE-NEXT:    pxor %xmm3, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm3
+; SSE-NEXT:    psllw $4, %xmm3
+; SSE-NEXT:    pand %xmm5, %xmm3
+; SSE-NEXT:    pxor %xmm6, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm6
+; SSE-NEXT:    pandn %xmm4, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm4
+; SSE-NEXT:    paddb %xmm6, %xmm4
+; SSE-NEXT:    pxor %xmm6, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm6
+; SSE-NEXT:    paddb %xmm4, %xmm6
+; SSE-NEXT:    paddb %xmm6, %xmm6
+; SSE-NEXT:    pxor %xmm4, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm4
+; SSE-NEXT:    psllw $4, %xmm4
+; SSE-NEXT:    pand %xmm5, %xmm4
+; SSE-NEXT:    pxor %xmm6, %xmm4
+; SSE-NEXT:    pand %xmm1, %xmm2
+; SSE-NEXT:    pand %xmm1, %xmm0
+; SSE-NEXT:    pxor %xmm2, %xmm1
+; SSE-NEXT:    movdqa %xmm0, %xmm5
+; SSE-NEXT:    pand %xmm2, %xmm5
+; SSE-NEXT:    psrlw $1, %xmm2
+; SSE-NEXT:    movdqa {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
+; SSE-NEXT:    pand %xmm6, %xmm2
+; SSE-NEXT:    por %xmm1, %xmm2
+; SSE-NEXT:    pand %xmm2, %xmm3
+; SSE-NEXT:    pxor %xmm3, %xmm2
+; SSE-NEXT:    movdqa %xmm3, %xmm1
+; SSE-NEXT:    psrlw $2, %xmm1
+; SSE-NEXT:    movdqa {{.*#+}} xmm7 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
+; SSE-NEXT:    pand %xmm7, %xmm1
+; SSE-NEXT:    por %xmm2, %xmm1
+; SSE-NEXT:    pxor %xmm5, %xmm0
+; SSE-NEXT:    psrlw $1, %xmm5
+; SSE-NEXT:    pand %xmm6, %xmm5
+; SSE-NEXT:    por %xmm5, %xmm0
+; SSE-NEXT:    pand %xmm0, %xmm3
+; SSE-NEXT:    pxor %xmm3, %xmm0
+; SSE-NEXT:    psrlw $2, %xmm3
+; SSE-NEXT:    pand %xmm7, %xmm3
+; SSE-NEXT:    por %xmm3, %xmm0
+; SSE-NEXT:    pand %xmm0, %xmm1
+; SSE-NEXT:    pand %xmm4, %xmm1
+; SSE-NEXT:    pxor %xmm1, %xmm0
+; SSE-NEXT:    psrlw $4, %xmm1
+; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; SSE-NEXT:    por %xmm1, %xmm0
+; SSE-NEXT:    retq
+;
+; AVX-LABEL: pext_v16i8:
+; AVX:       # %bb.0:
+; AVX-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
+; AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm3
+; AVX-NEXT:    vpaddb %xmm3, %xmm3, %xmm4
+; AVX-NEXT:    vpaddb %xmm4, %xmm4, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm4, %xmm4
+; AVX-NEXT:    vpaddb %xmm4, %xmm4, %xmm5
+; AVX-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm4, %xmm4
+; AVX-NEXT:    vpsllw $4, %xmm4, %xmm5
+; AVX-NEXT:    vpbroadcastd {{.*#+}} xmm6 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
+; AVX-NEXT:    vpand %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm4, %xmm4
+; AVX-NEXT:    vpsubb %xmm3, %xmm1, %xmm3
+; AVX-NEXT:    vpor %xmm4, %xmm3, %xmm3
+; AVX-NEXT:    vpxor %xmm2, %xmm3, %xmm2
+; AVX-NEXT:    vpaddb %xmm2, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm3
+; AVX-NEXT:    vpaddb %xmm3, %xmm3, %xmm5
+; AVX-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpsllw $4, %xmm3, %xmm5
+; AVX-NEXT:    vpand %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpandn %xmm2, %xmm3, %xmm2
+; AVX-NEXT:    vpaddb %xmm2, %xmm2, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm2, %xmm2
+; AVX-NEXT:    vpaddb %xmm2, %xmm2, %xmm5
+; AVX-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm2, %xmm2
+; AVX-NEXT:    vpsllw $4, %xmm2, %xmm5
+; AVX-NEXT:    vpand %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm2, %xmm2
+; AVX-NEXT:    vpand %xmm1, %xmm4, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm1, %xmm5
+; AVX-NEXT:    vpsrlw $1, %xmm4, %xmm6
+; AVX-NEXT:    vpbroadcastd {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
+; AVX-NEXT:    vpand %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpand %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm5, %xmm5
+; AVX-NEXT:    vpsrlw $2, %xmm3, %xmm6
+; AVX-NEXT:    vpbroadcastd {{.*#+}} xmm8 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
+; AVX-NEXT:    vpand %xmm6, %xmm8, %xmm6
+; AVX-NEXT:    vpor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm4, %xmm0, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrlw $1, %xmm1, %xmm1
+; AVX-NEXT:    vpand %xmm7, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm3, %xmm0, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrlw $2, %xmm1, %xmm1
+; AVX-NEXT:    vpand %xmm1, %xmm8, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm5, %xmm0, %xmm1
+; AVX-NEXT:    vpand %xmm2, %xmm1, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrlw $4, %xmm1, %xmm1
+; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    retq
+  %res = call <16 x i8> @llvm.pext.v16i8(<16 x i8> %val, <16 x i8> %mask)
+  ret <16 x i8> %res
+}
+
+define <8 x i16> @pext_v8i16(<8 x i16> %val, <8 x i16> %mask) nounwind {
+; SSE-LABEL: pext_v8i16:
+; SSE:       # %bb.0:
+; SSE-NEXT:    pcmpeqd %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm1, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm3
+; SSE-NEXT:    psllw $2, %xmm3
+; SSE-NEXT:    paddw %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm2, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm4
+; SSE-NEXT:    psllw $2, %xmm4
+; SSE-NEXT:    pxor %xmm3, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm5
+; SSE-NEXT:    psllw $4, %xmm5
+; SSE-NEXT:    pxor %xmm4, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm3
+; SSE-NEXT:    psllw $8, %xmm3
+; SSE-NEXT:    pxor %xmm5, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm4
+; SSE-NEXT:    pandn %xmm2, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm2
+; SSE-NEXT:    paddw %xmm2, %xmm2
+; SSE-NEXT:    pxor %xmm4, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm5
+; SSE-NEXT:    psllw $2, %xmm5
+; SSE-NEXT:    pxor %xmm2, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm6
+; SSE-NEXT:    psllw $4, %xmm6
+; SSE-NEXT:    pxor %xmm5, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm2
+; SSE-NEXT:    psllw $8, %xmm2
+; SSE-NEXT:    pxor %xmm6, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm5
+; SSE-NEXT:    pandn %xmm4, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm4
+; SSE-NEXT:    paddw %xmm4, %xmm4
+; SSE-NEXT:    pxor %xmm5, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm6
+; SSE-NEXT:    psllw $2, %xmm6
+; SSE-NEXT:    pxor %xmm4, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm7
+; SSE-NEXT:    psllw $4, %xmm7
+; SSE-NEXT:    pxor %xmm6, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm4
+; SSE-NEXT:    psllw $8, %xmm4
+; SSE-NEXT:    pxor %xmm7, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm6
+; SSE-NEXT:    pandn %xmm5, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm5
+; SSE-NEXT:    paddw %xmm5, %xmm5
+; SSE-NEXT:    pxor %xmm6, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm6
+; SSE-NEXT:    psllw $2, %xmm6
+; SSE-NEXT:    pxor %xmm5, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm7
+; SSE-NEXT:    psllw $4, %xmm7
+; SSE-NEXT:    pxor %xmm6, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm5
+; SSE-NEXT:    psllw $8, %xmm5
+; SSE-NEXT:    pxor %xmm7, %xmm5
+; SSE-NEXT:    pand %xmm1, %xmm3
+; SSE-NEXT:    pand %xmm1, %xmm0
+; SSE-NEXT:    pxor %xmm3, %xmm1
+; SSE-NEXT:    movdqa %xmm0, %xmm6
+; SSE-NEXT:    pand %xmm3, %xmm6
+; SSE-NEXT:    psrlw $1, %xmm3
+; SSE-NEXT:    por %xmm1, %xmm3
+; SSE-NEXT:    pand %xmm3, %xmm2
+; SSE-NEXT:    pxor %xmm2, %xmm3
+; SSE-NEXT:    movdqa %xmm2, %xmm7
+; SSE-NEXT:    psrlw $2, %xmm7
+; SSE-NEXT:    por %xmm3, %xmm7
+; SSE-NEXT:    pand %xmm7, %xmm4
+; SSE-NEXT:    pxor %xmm4, %xmm7
+; SSE-NEXT:    movdqa %xmm4, %xmm1
+; SSE-NEXT:    psrlw $4, %xmm1
+; SSE-NEXT:    por %xmm7, %xmm1
+; SSE-NEXT:    pxor %xmm6, %xmm0
+; SSE-NEXT:    psrlw $1, %xmm6
+; SSE-NEXT:    por %xmm6, %xmm0
+; SSE-NEXT:    pand %xmm0, %xmm2
+; SSE-NEXT:    pxor %xmm2, %xmm0
+; SSE-NEXT:    psrlw $2, %xmm2
+; SSE-NEXT:    por %xmm2, %xmm0
+; SSE-NEXT:    pand %xmm0, %xmm4
+; SSE-NEXT:    pxor %xmm4, %xmm0
+; SSE-NEXT:    psrlw $4, %xmm4
+; SSE-NEXT:    por %xmm4, %xmm0
+; SSE-NEXT:    pand %xmm0, %xmm1
+; SSE-NEXT:    pand %xmm5, %xmm1
+; SSE-NEXT:    pxor %xmm1, %xmm0
+; SSE-NEXT:    psrlw $8, %xmm1
+; SSE-NEXT:    por %xmm1, %xmm0
+; SSE-NEXT:    retq
+;
+; AVX-LABEL: pext_v8i16:
+; AVX:       # %bb.0:
+; AVX-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
+; AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm2
+; AVX-NEXT:    vpsllw $2, %xmm2, %xmm3
+; AVX-NEXT:    vpaddw %xmm2, %xmm2, %xmm2
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm3
+; AVX-NEXT:    vpsllw $2, %xmm3, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm3, %xmm3
+; AVX-NEXT:    vpsllw $4, %xmm3, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm3, %xmm3
+; AVX-NEXT:    vpsllw $8, %xmm3, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm3, %xmm3
+; AVX-NEXT:    vpandn %xmm2, %xmm3, %xmm2
+; AVX-NEXT:    vpaddw %xmm2, %xmm2, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm2, %xmm4
+; AVX-NEXT:    vpsllw $2, %xmm4, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm4, %xmm4
+; AVX-NEXT:    vpsllw $4, %xmm4, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm4, %xmm4
+; AVX-NEXT:    vpsllw $8, %xmm4, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm4, %xmm4
+; AVX-NEXT:    vpandn %xmm2, %xmm4, %xmm2
+; AVX-NEXT:    vpaddw %xmm2, %xmm2, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm2, %xmm5
+; AVX-NEXT:    vpsllw $2, %xmm5, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpsllw $4, %xmm5, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpsllw $8, %xmm5, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpandn %xmm2, %xmm5, %xmm2
+; AVX-NEXT:    vpaddw %xmm2, %xmm2, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm2, %xmm2
+; AVX-NEXT:    vpsllw $2, %xmm2, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm2, %xmm2
+; AVX-NEXT:    vpsllw $4, %xmm2, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm2, %xmm2
+; AVX-NEXT:    vpsllw $8, %xmm2, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm2, %xmm2
+; AVX-NEXT:    vpand %xmm1, %xmm3, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm1, %xmm6
+; AVX-NEXT:    vpsrlw $1, %xmm3, %xmm7
+; AVX-NEXT:    vpor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpand %xmm6, %xmm4, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm6, %xmm6
+; AVX-NEXT:    vpsrlw $2, %xmm4, %xmm7
+; AVX-NEXT:    vpor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpand %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm6, %xmm6
+; AVX-NEXT:    vpsrlw $4, %xmm5, %xmm7
+; AVX-NEXT:    vpor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm3, %xmm0, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrlw $1, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm4, %xmm0, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrlw $2, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm5, %xmm0, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrlw $4, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm6, %xmm0, %xmm1
+; AVX-NEXT:    vpand %xmm2, %xmm1, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrlw $8, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    retq
+  %res = call <8 x i16> @llvm.pext.v8i16(<8 x i16> %val, <8 x i16> %mask)
+  ret <8 x i16> %res
+}
+
+define <4 x i32> @pext_v4i32(<4 x i32> %val, <4 x i32> %mask) nounwind {
+; SSE-LABEL: pext_v4i32:
+; SSE:       # %bb.0:
+; SSE-NEXT:    pcmpeqd %xmm3, %xmm3
+; SSE-NEXT:    pxor %xmm1, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm2
+; SSE-NEXT:    pslld $2, %xmm2
+; SSE-NEXT:    paddd %xmm3, %xmm3
+; SSE-NEXT:    pxor %xmm3, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm4
+; SSE-NEXT:    pslld $2, %xmm4
+; SSE-NEXT:    pxor %xmm2, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm2
+; SSE-NEXT:    pslld $4, %xmm2
+; SSE-NEXT:    pxor %xmm4, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm4
+; SSE-NEXT:    pslld $8, %xmm4
+; SSE-NEXT:    pxor %xmm2, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm2
+; SSE-NEXT:    pslld $16, %xmm2
+; SSE-NEXT:    pxor %xmm4, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm4
+; SSE-NEXT:    pandn %xmm3, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm3
+; SSE-NEXT:    paddd %xmm3, %xmm3
+; SSE-NEXT:    pxor %xmm4, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm5
+; SSE-NEXT:    pslld $2, %xmm5
+; SSE-NEXT:    pxor %xmm3, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm3
+; SSE-NEXT:    pslld $4, %xmm3
+; SSE-NEXT:    pxor %xmm5, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm5
+; SSE-NEXT:    pslld $8, %xmm5
+; SSE-NEXT:    pxor %xmm3, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm3
+; SSE-NEXT:    pslld $16, %xmm3
+; SSE-NEXT:    pxor %xmm5, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm5
+; SSE-NEXT:    pandn %xmm4, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm4
+; SSE-NEXT:    paddd %xmm4, %xmm4
+; SSE-NEXT:    pxor %xmm5, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm6
+; SSE-NEXT:    pslld $2, %xmm6
+; SSE-NEXT:    pxor %xmm4, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm4
+; SSE-NEXT:    pslld $4, %xmm4
+; SSE-NEXT:    pxor %xmm6, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm6
+; SSE-NEXT:    pslld $8, %xmm6
+; SSE-NEXT:    pxor %xmm4, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm4
+; SSE-NEXT:    pslld $16, %xmm4
+; SSE-NEXT:    pxor %xmm6, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm6
+; SSE-NEXT:    pandn %xmm5, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm5
+; SSE-NEXT:    paddd %xmm5, %xmm5
+; SSE-NEXT:    pxor %xmm6, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm7
+; SSE-NEXT:    pslld $2, %xmm7
+; SSE-NEXT:    pxor %xmm5, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm5
+; SSE-NEXT:    pslld $4, %xmm5
+; SSE-NEXT:    pxor %xmm7, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm7
+; SSE-NEXT:    pslld $8, %xmm7
+; SSE-NEXT:    pxor %xmm5, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm5
+; SSE-NEXT:    pslld $16, %xmm5
+; SSE-NEXT:    pxor %xmm7, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm7
+; SSE-NEXT:    pandn %xmm6, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm6
+; SSE-NEXT:    paddd %xmm6, %xmm6
+; SSE-NEXT:    pxor %xmm7, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm7
+; SSE-NEXT:    pslld $2, %xmm7
+; SSE-NEXT:    pxor %xmm6, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm6
+; SSE-NEXT:    pslld $4, %xmm6
+; SSE-NEXT:    pxor %xmm7, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm7
+; SSE-NEXT:    pslld $8, %xmm7
+; SSE-NEXT:    pxor %xmm6, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm6
+; SSE-NEXT:    pslld $16, %xmm6
+; SSE-NEXT:    pxor %xmm7, %xmm6
+; SSE-NEXT:    pand %xmm1, %xmm2
+; SSE-NEXT:    pand %xmm1, %xmm0
+; SSE-NEXT:    pxor %xmm2, %xmm1
+; SSE-NEXT:    movdqa %xmm2, %xmm7
+; SSE-NEXT:    psrld $1, %xmm7
+; SSE-NEXT:    por %xmm1, %xmm7
+; SSE-NEXT:    pand %xmm7, %xmm3
+; SSE-NEXT:    pxor %xmm3, %xmm7
+; SSE-NEXT:    movdqa %xmm3, %xmm1
+; SSE-NEXT:    psrld $2, %xmm1
+; SSE-NEXT:    por %xmm7, %xmm1
+; SSE-NEXT:    pand %xmm1, %xmm4
+; SSE-NEXT:    pxor %xmm4, %xmm1
+; SSE-NEXT:    movdqa %xmm4, %xmm7
+; SSE-NEXT:    psrld $4, %xmm7
+; SSE-NEXT:    por %xmm1, %xmm7
+; SSE-NEXT:    pand %xmm7, %xmm5
+; SSE-NEXT:    pxor %xmm5, %xmm7
+; SSE-NEXT:    movdqa %xmm5, %xmm1
+; SSE-NEXT:    psrld $8, %xmm1
+; SSE-NEXT:    por %xmm7, %xmm1
+; SSE-NEXT:    pand %xmm0, %xmm2
+; SSE-NEXT:    pxor %xmm2, %xmm0
+; SSE-NEXT:    psrld $1, %xmm2
+; SSE-NEXT:    por %xmm2, %xmm0
+; SSE-NEXT:    pand %xmm0, %xmm3
+; SSE-NEXT:    pxor %xmm3, %xmm0
+; SSE-NEXT:    psrld $2, %xmm3
+; SSE-NEXT:    por %xmm3, %xmm0
+; SSE-NEXT:    pand %xmm0, %xmm4
+; SSE-NEXT:    pxor %xmm4, %xmm0
+; SSE-NEXT:    psrld $4, %xmm4
+; SSE-NEXT:    por %xmm4, %xmm0
+; SSE-NEXT:    pand %xmm0, %xmm5
+; SSE-NEXT:    pxor %xmm5, %xmm0
+; SSE-NEXT:    psrld $8, %xmm5
+; SSE-NEXT:    por %xmm5, %xmm0
+; SSE-NEXT:    pand %xmm0, %xmm1
+; SSE-NEXT:    pand %xmm6, %xmm1
+; SSE-NEXT:    pxor %xmm1, %xmm0
+; SSE-NEXT:    psrld $16, %xmm1
+; SSE-NEXT:    por %xmm1, %xmm0
+; SSE-NEXT:    retq
+;
+; AVX-LABEL: pext_v4i32:
+; AVX:       # %bb.0:
+; AVX-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
+; AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm2
+; AVX-NEXT:    vpslld $2, %xmm2, %xmm3
+; AVX-NEXT:    vpaddd %xmm2, %xmm2, %xmm4
+; AVX-NEXT:    vpxor %xmm3, %xmm4, %xmm2
+; AVX-NEXT:    vpslld $2, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpslld $4, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpslld $8, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpslld $16, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpandn %xmm4, %xmm2, %xmm4
+; AVX-NEXT:    vpaddd %xmm4, %xmm4, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm4, %xmm3
+; AVX-NEXT:    vpslld $2, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpslld $4, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpslld $8, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpslld $16, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpandn %xmm4, %xmm3, %xmm4
+; AVX-NEXT:    vpaddd %xmm4, %xmm4, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm4, %xmm5
+; AVX-NEXT:    vpslld $2, %xmm5, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpslld $4, %xmm5, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpslld $8, %xmm5, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpslld $16, %xmm5, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm5
+; AVX-NEXT:    vpandn %xmm4, %xmm5, %xmm4
+; AVX-NEXT:    vpaddd %xmm4, %xmm4, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm4, %xmm6
+; AVX-NEXT:    vpslld $2, %xmm6, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpslld $4, %xmm6, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpslld $8, %xmm6, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpslld $16, %xmm6, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpandn %xmm4, %xmm6, %xmm4
+; AVX-NEXT:    vpaddd %xmm4, %xmm4, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm4, %xmm4
+; AVX-NEXT:    vpslld $2, %xmm4, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm4, %xmm4
+; AVX-NEXT:    vpslld $4, %xmm4, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm4, %xmm4
+; AVX-NEXT:    vpslld $8, %xmm4, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm4, %xmm4
+; AVX-NEXT:    vpslld $16, %xmm4, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm4, %xmm4
+; AVX-NEXT:    vpand %xmm1, %xmm2, %xmm2
+; AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm7
+; AVX-NEXT:    vpsrld $1, %xmm2, %xmm8
+; AVX-NEXT:    vpor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpand %xmm7, %xmm3, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm7, %xmm7
+; AVX-NEXT:    vpsrld $2, %xmm3, %xmm8
+; AVX-NEXT:    vpor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpand %xmm7, %xmm5, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm7, %xmm7
+; AVX-NEXT:    vpsrld $4, %xmm5, %xmm8
+; AVX-NEXT:    vpor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpand %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm7, %xmm7
+; AVX-NEXT:    vpsrld $8, %xmm6, %xmm8
+; AVX-NEXT:    vpor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm2, %xmm0, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrld $1, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm3, %xmm0, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrld $2, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm5, %xmm0, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrld $4, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm6, %xmm0, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrld $8, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm7, %xmm0, %xmm1
+; AVX-NEXT:    vpand %xmm4, %xmm1, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrld $16, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    retq
+  %res = call <4 x i32> @llvm.pext.v4i32(<4 x i32> %val, <4 x i32> %mask)
+  ret <4 x i32> %res
+}
+
+define <2 x i64> @pext_v2i64(<2 x i64> %val, <2 x i64> %mask) nounwind {
+; SSE-LABEL: pext_v2i64:
+; SSE:       # %bb.0:
+; SSE-NEXT:    pcmpeqd %xmm3, %xmm3
+; SSE-NEXT:    pxor %xmm1, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm2
+; SSE-NEXT:    psllq $2, %xmm2
+; SSE-NEXT:    paddq %xmm3, %xmm3
+; SSE-NEXT:    pxor %xmm3, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm4
+; SSE-NEXT:    psllq $2, %xmm4
+; SSE-NEXT:    pxor %xmm2, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm2
+; SSE-NEXT:    psllq $4, %xmm2
+; SSE-NEXT:    pxor %xmm4, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm4
+; SSE-NEXT:    psllq $8, %xmm4
+; SSE-NEXT:    pxor %xmm2, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm5
+; SSE-NEXT:    psllq $16, %xmm5
+; SSE-NEXT:    pxor %xmm4, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm2
+; SSE-NEXT:    psllq $32, %xmm2
+; SSE-NEXT:    pxor %xmm5, %xmm2
+; SSE-NEXT:    movdqa %xmm2, %xmm4
+; SSE-NEXT:    pandn %xmm3, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm3
+; SSE-NEXT:    paddq %xmm3, %xmm3
+; SSE-NEXT:    pxor %xmm4, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm5
+; SSE-NEXT:    psllq $2, %xmm5
+; SSE-NEXT:    pxor %xmm3, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm3
+; SSE-NEXT:    psllq $4, %xmm3
+; SSE-NEXT:    pxor %xmm5, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm5
+; SSE-NEXT:    psllq $8, %xmm5
+; SSE-NEXT:    pxor %xmm3, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm6
+; SSE-NEXT:    psllq $16, %xmm6
+; SSE-NEXT:    pxor %xmm5, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm3
+; SSE-NEXT:    psllq $32, %xmm3
+; SSE-NEXT:    pxor %xmm6, %xmm3
+; SSE-NEXT:    movdqa %xmm3, %xmm5
+; SSE-NEXT:    pandn %xmm4, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm4
+; SSE-NEXT:    paddq %xmm4, %xmm4
+; SSE-NEXT:    pxor %xmm5, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm6
+; SSE-NEXT:    psllq $2, %xmm6
+; SSE-NEXT:    pxor %xmm4, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm4
+; SSE-NEXT:    psllq $4, %xmm4
+; SSE-NEXT:    pxor %xmm6, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm6
+; SSE-NEXT:    psllq $8, %xmm6
+; SSE-NEXT:    pxor %xmm4, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm7
+; SSE-NEXT:    psllq $16, %xmm7
+; SSE-NEXT:    pxor %xmm6, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm4
+; SSE-NEXT:    psllq $32, %xmm4
+; SSE-NEXT:    pxor %xmm7, %xmm4
+; SSE-NEXT:    movdqa %xmm4, %xmm6
+; SSE-NEXT:    pandn %xmm5, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm5
+; SSE-NEXT:    paddq %xmm5, %xmm5
+; SSE-NEXT:    pxor %xmm6, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm7
+; SSE-NEXT:    psllq $2, %xmm7
+; SSE-NEXT:    pxor %xmm5, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm5
+; SSE-NEXT:    psllq $4, %xmm5
+; SSE-NEXT:    pxor %xmm7, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm7
+; SSE-NEXT:    psllq $8, %xmm7
+; SSE-NEXT:    pxor %xmm5, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm8
+; SSE-NEXT:    psllq $16, %xmm8
+; SSE-NEXT:    pxor %xmm7, %xmm8
+; SSE-NEXT:    movdqa %xmm8, %xmm5
+; SSE-NEXT:    psllq $32, %xmm5
+; SSE-NEXT:    pxor %xmm8, %xmm5
+; SSE-NEXT:    movdqa %xmm5, %xmm7
+; SSE-NEXT:    pandn %xmm6, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm6
+; SSE-NEXT:    paddq %xmm6, %xmm6
+; SSE-NEXT:    pxor %xmm7, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm8
+; SSE-NEXT:    psllq $2, %xmm8
+; SSE-NEXT:    pxor %xmm6, %xmm8
+; SSE-NEXT:    movdqa %xmm8, %xmm6
+; SSE-NEXT:    psllq $4, %xmm6
+; SSE-NEXT:    pxor %xmm8, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm8
+; SSE-NEXT:    psllq $8, %xmm8
+; SSE-NEXT:    pxor %xmm6, %xmm8
+; SSE-NEXT:    movdqa %xmm8, %xmm9
+; SSE-NEXT:    psllq $16, %xmm9
+; SSE-NEXT:    pxor %xmm8, %xmm9
+; SSE-NEXT:    movdqa %xmm9, %xmm6
+; SSE-NEXT:    psllq $32, %xmm6
+; SSE-NEXT:    pxor %xmm9, %xmm6
+; SSE-NEXT:    movdqa %xmm6, %xmm8
+; SSE-NEXT:    pandn %xmm7, %xmm8
+; SSE-NEXT:    movdqa %xmm8, %xmm7
+; SSE-NEXT:    paddq %xmm7, %xmm7
+; SSE-NEXT:    pxor %xmm8, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm8
+; SSE-NEXT:    psllq $2, %xmm8
+; SSE-NEXT:    pxor %xmm7, %xmm8
+; SSE-NEXT:    movdqa %xmm8, %xmm7
+; SSE-NEXT:    psllq $4, %xmm7
+; SSE-NEXT:    pxor %xmm8, %xmm7
+; SSE-NEXT:    movdqa %xmm7, %xmm8
+; SSE-NEXT:    psllq $8, %xmm8
+; SSE-NEXT:    pxor %xmm7, %xmm8
+; SSE-NEXT:    movdqa %xmm8, %xmm9
+; SSE-NEXT:    psllq $16, %xmm9
+; SSE-NEXT:    pxor %xmm8, %xmm9
+; SSE-NEXT:    movdqa %xmm9, %xmm7
+; SSE-NEXT:    psllq $32, %xmm7
+; SSE-NEXT:    pxor %xmm9, %xmm7
+; SSE-NEXT:    pand %xmm1, %xmm2
+; SSE-NEXT:    pand %xmm1, %xmm0
+; SSE-NEXT:    pxor %xmm2, %xmm1
+; SSE-NEXT:    movdqa %xmm2, %xmm8
+; SSE-NEXT:    psrlq $1, %xmm8
+; SSE-NEXT:    por %xmm1, %xmm8
+; SSE-NEXT:    pand %xmm8, %xmm3
+; SSE-NEXT:    pxor %xmm3, %xmm8
+; SSE-NEXT:    movdqa %xmm3, %xmm1
+; SSE-NEXT:    psrlq $2, %xmm1
+; SSE-NEXT:    por %xmm8, %xmm1
+; SSE-NEXT:    pand %xmm1, %xmm4
+; SSE-NEXT:    pxor %xmm4, %xmm1
+; SSE-NEXT:    movdqa %xmm4, %xmm8
+; SSE-NEXT:    psrlq $4, %xmm8
+; SSE-NEXT:    por %xmm1, %xmm8
+; SSE-NEXT:    pand %xmm8, %xmm5
+; SSE-NEXT:    pxor %xmm5, %xmm8
+; SSE-NEXT:    movdqa %xmm5, %xmm9
+; SSE-NEXT:    psrlq $8, %xmm9
+; SSE-NEXT:    por %xmm8, %xmm9
+; SSE-NEXT:    pand %xmm9, %xmm6
+; SSE-NEXT:    pxor %xmm6, %xmm9
+; SSE-NEXT:    movdqa %xmm6, %xmm1
+; SSE-NEXT:    psrlq $16, %xmm1
+; SSE-NEXT:    por %xmm9, %xmm1
+; SSE-NEXT:    pand %xmm0, %xmm2
+; SSE-NEXT:    pxor %xmm2, %xmm0
+; SSE-NEXT:    psrlq $1, %xmm2
+; SSE-NEXT:    por %xmm2, %xmm0
+; SSE-NEXT:    pand %xmm0, %xmm3
+; SSE-NEXT:    pxor %xmm3, %xmm0
+; SSE-NEXT:    psrlq $2, %xmm3
+; SSE-NEXT:    por %xmm3, %xmm0
+; SSE-NEXT:    pand %xmm0, %xmm4
+; SSE-NEXT:    pxor %xmm4, %xmm0
+; SSE-NEXT:    psrlq $4, %xmm4
+; SSE-NEXT:    por %xmm4, %xmm0
+; SSE-NEXT:    pand %xmm0, %xmm5
+; SSE-NEXT:    pxor %xmm5, %xmm0
+; SSE-NEXT:    psrlq $8, %xmm5
+; SSE-NEXT:    por %xmm5, %xmm0
+; SSE-NEXT:    pand %xmm0, %xmm6
+; SSE-NEXT:    pxor %xmm6, %xmm0
+; SSE-NEXT:    psrlq $16, %xmm6
+; SSE-NEXT:    por %xmm6, %xmm0
+; SSE-NEXT:    pand %xmm0, %xmm1
+; SSE-NEXT:    pand %xmm7, %xmm1
+; SSE-NEXT:    pxor %xmm1, %xmm0
+; SSE-NEXT:    psrlq $32, %xmm1
+; SSE-NEXT:    por %xmm1, %xmm0
+; SSE-NEXT:    retq
+;
+; AVX-LABEL: pext_v2i64:
+; AVX:       # %bb.0:
+; AVX-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
+; AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm2
+; AVX-NEXT:    vpsllq $2, %xmm2, %xmm3
+; AVX-NEXT:    vpaddq %xmm2, %xmm2, %xmm4
+; AVX-NEXT:    vpxor %xmm3, %xmm4, %xmm2
+; AVX-NEXT:    vpsllq $2, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpsllq $4, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpsllq $8, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpsllq $16, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpsllq $32, %xmm2, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX-NEXT:    vpandn %xmm4, %xmm2, %xmm4
+; AVX-NEXT:    vpaddq %xmm4, %xmm4, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm4, %xmm3
+; AVX-NEXT:    vpsllq $2, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpsllq $4, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpsllq $8, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpsllq $16, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpsllq $32, %xmm3, %xmm5
+; AVX-NEXT:    vpxor %xmm5, %xmm3, %xmm3
+; AVX-NEXT:    vpandn %xmm4, %xmm3, %xmm5
+; AVX-NEXT:    vpaddq %xmm5, %xmm5, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm5, %xmm4
+; AVX-NEXT:    vpsllq $2, %xmm4, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm4, %xmm4
+; AVX-NEXT:    vpsllq $4, %xmm4, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm4, %xmm4
+; AVX-NEXT:    vpsllq $8, %xmm4, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm4, %xmm4
+; AVX-NEXT:    vpsllq $16, %xmm4, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm4, %xmm4
+; AVX-NEXT:    vpsllq $32, %xmm4, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm4, %xmm4
+; AVX-NEXT:    vpandn %xmm5, %xmm4, %xmm5
+; AVX-NEXT:    vpaddq %xmm5, %xmm5, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm5, %xmm6
+; AVX-NEXT:    vpsllq $2, %xmm6, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpsllq $4, %xmm6, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpsllq $8, %xmm6, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpsllq $16, %xmm6, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpsllq $32, %xmm6, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm6, %xmm6
+; AVX-NEXT:    vpandn %xmm5, %xmm6, %xmm5
+; AVX-NEXT:    vpaddq %xmm5, %xmm5, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm5, %xmm7
+; AVX-NEXT:    vpsllq $2, %xmm7, %xmm8
+; AVX-NEXT:    vpxor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpsllq $4, %xmm7, %xmm8
+; AVX-NEXT:    vpxor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpsllq $8, %xmm7, %xmm8
+; AVX-NEXT:    vpxor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpsllq $16, %xmm7, %xmm8
+; AVX-NEXT:    vpxor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpsllq $32, %xmm7, %xmm8
+; AVX-NEXT:    vpxor %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpandn %xmm5, %xmm7, %xmm5
+; AVX-NEXT:    vpaddq %xmm5, %xmm5, %xmm8
+; AVX-NEXT:    vpxor %xmm5, %xmm8, %xmm5
+; AVX-NEXT:    vpsllq $2, %xmm5, %xmm8
+; AVX-NEXT:    vpxor %xmm5, %xmm8, %xmm5
+; AVX-NEXT:    vpsllq $4, %xmm5, %xmm8
+; AVX-NEXT:    vpxor %xmm5, %xmm8, %xmm5
+; AVX-NEXT:    vpsllq $8, %xmm5, %xmm8
+; AVX-NEXT:    vpxor %xmm5, %xmm8, %xmm5
+; AVX-NEXT:    vpsllq $16, %xmm5, %xmm8
+; AVX-NEXT:    vpxor %xmm5, %xmm8, %xmm5
+; AVX-NEXT:    vpsllq $32, %xmm5, %xmm8
+; AVX-NEXT:    vpxor %xmm5, %xmm8, %xmm5
+; AVX-NEXT:    vpand %xmm1, %xmm2, %xmm2
+; AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm8
+; AVX-NEXT:    vpsrlq $1, %xmm2, %xmm9
+; AVX-NEXT:    vpor %xmm9, %xmm8, %xmm8
+; AVX-NEXT:    vpand %xmm3, %xmm8, %xmm3
+; AVX-NEXT:    vpxor %xmm3, %xmm8, %xmm8
+; AVX-NEXT:    vpsrlq $2, %xmm3, %xmm9
+; AVX-NEXT:    vpor %xmm9, %xmm8, %xmm8
+; AVX-NEXT:    vpand %xmm4, %xmm8, %xmm4
+; AVX-NEXT:    vpxor %xmm4, %xmm8, %xmm8
+; AVX-NEXT:    vpsrlq $4, %xmm4, %xmm9
+; AVX-NEXT:    vpor %xmm9, %xmm8, %xmm8
+; AVX-NEXT:    vpand %xmm6, %xmm8, %xmm6
+; AVX-NEXT:    vpxor %xmm6, %xmm8, %xmm8
+; AVX-NEXT:    vpsrlq $8, %xmm6, %xmm9
+; AVX-NEXT:    vpor %xmm9, %xmm8, %xmm8
+; AVX-NEXT:    vpand %xmm7, %xmm8, %xmm7
+; AVX-NEXT:    vpxor %xmm7, %xmm8, %xmm8
+; AVX-NEXT:    vpsrlq $16, %xmm7, %xmm9
+; AVX-NEXT:    vpor %xmm9, %xmm8, %xmm8
+; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm2, %xmm0, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrlq $1, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm3, %xmm0, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrlq $2, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm4, %xmm0, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrlq $4, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm6, %xmm0, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrlq $8, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm7, %xmm0, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrlq $16, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpand %xmm0, %xmm8, %xmm1
+; AVX-NEXT:    vpand %xmm5, %xmm1, %xmm1
+; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    vpsrlq $32, %xmm1, %xmm1
+; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    retq
+  %res = call <2 x i64> @llvm.pext.v2i64(<2 x i64> %val, <2 x i64> %mask)
+  ret <2 x i64> %res
+}
+


        


More information about the llvm-commits mailing list