[llvm] [X86] Add pdep/pext vector test coverage (PR #215231)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 10 02:57:39 PDT 2026
https://github.com/RKSimon created https://github.com/llvm/llvm-project/pull/215231
Baseline tests for #214508
>From f6ebf4141b1cf87029560156d10f46f790bc63f9 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Mon, 10 Aug 2026 10:54:36 +0100
Subject: [PATCH] [X86] Add pdep/pext vector test coverage
Baseline tests for #214508
---
llvm/test/CodeGen/X86/pdep-vector.ll | 889 +++++++++++++++++++++++++++
llvm/test/CodeGen/X86/pext-vector.ll | 869 ++++++++++++++++++++++++++
2 files changed, 1758 insertions(+)
create mode 100644 llvm/test/CodeGen/X86/pdep-vector.ll
create mode 100644 llvm/test/CodeGen/X86/pext-vector.ll
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