blob: 16cfc28cf476c7d27f751189e0fcde78ae1c6ba8 [file] [edit]
; 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,SSE2
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=SSE,SSE2
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v2 -mattr=+pclmul | FileCheck %s --check-prefixes=SSE,PCLMUL
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 -mattr=+vpclmulqdq | FileCheck %s --check-prefixes=AVX2,AVX2-FAST
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 -mattr=+vpclmulqdq,+slow-pext | FileCheck %s --check-prefixes=AVX2,AVX2-SLOW
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 -mattr=+vpclmulqdq | FileCheck %s --check-prefixes=AVX512
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
;
; AVX2-LABEL: pext_v16i8:
; AVX2: # %bb.0:
; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm3
; AVX2-NEXT: vpaddb %xmm3, %xmm3, %xmm4
; AVX2-NEXT: vpaddb %xmm4, %xmm4, %xmm5
; AVX2-NEXT: vpxor %xmm5, %xmm4, %xmm4
; AVX2-NEXT: vpaddb %xmm4, %xmm4, %xmm5
; AVX2-NEXT: vpaddb %xmm5, %xmm5, %xmm5
; AVX2-NEXT: vpxor %xmm5, %xmm4, %xmm4
; AVX2-NEXT: vpsllw $4, %xmm4, %xmm5
; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm6 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
; AVX2-NEXT: vpand %xmm6, %xmm5, %xmm5
; AVX2-NEXT: vpxor %xmm5, %xmm4, %xmm4
; AVX2-NEXT: vpsubb %xmm3, %xmm1, %xmm3
; AVX2-NEXT: vpor %xmm4, %xmm3, %xmm3
; AVX2-NEXT: vpxor %xmm2, %xmm3, %xmm2
; AVX2-NEXT: vpaddb %xmm2, %xmm2, %xmm3
; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm3
; AVX2-NEXT: vpaddb %xmm3, %xmm3, %xmm5
; AVX2-NEXT: vpaddb %xmm5, %xmm5, %xmm5
; AVX2-NEXT: vpxor %xmm5, %xmm3, %xmm3
; AVX2-NEXT: vpsllw $4, %xmm3, %xmm5
; AVX2-NEXT: vpand %xmm6, %xmm5, %xmm5
; AVX2-NEXT: vpxor %xmm5, %xmm3, %xmm3
; AVX2-NEXT: vpandn %xmm2, %xmm3, %xmm2
; AVX2-NEXT: vpaddb %xmm2, %xmm2, %xmm5
; AVX2-NEXT: vpxor %xmm5, %xmm2, %xmm2
; AVX2-NEXT: vpaddb %xmm2, %xmm2, %xmm5
; AVX2-NEXT: vpaddb %xmm5, %xmm5, %xmm5
; AVX2-NEXT: vpxor %xmm5, %xmm2, %xmm2
; AVX2-NEXT: vpsllw $4, %xmm2, %xmm5
; AVX2-NEXT: vpand %xmm6, %xmm5, %xmm5
; AVX2-NEXT: vpxor %xmm5, %xmm2, %xmm2
; AVX2-NEXT: vpand %xmm1, %xmm4, %xmm4
; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm5
; AVX2-NEXT: vpsrlw $1, %xmm4, %xmm6
; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
; AVX2-NEXT: vpand %xmm7, %xmm6, %xmm6
; AVX2-NEXT: vpor %xmm6, %xmm5, %xmm5
; AVX2-NEXT: vpand %xmm5, %xmm3, %xmm3
; AVX2-NEXT: vpxor %xmm3, %xmm5, %xmm5
; AVX2-NEXT: vpsrlw $2, %xmm3, %xmm6
; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm8 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
; AVX2-NEXT: vpand %xmm6, %xmm8, %xmm6
; AVX2-NEXT: vpor %xmm6, %xmm5, %xmm5
; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpand %xmm4, %xmm0, %xmm1
; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpsrlw $1, %xmm1, %xmm1
; AVX2-NEXT: vpand %xmm7, %xmm1, %xmm1
; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm1
; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpsrlw $2, %xmm1, %xmm1
; AVX2-NEXT: vpand %xmm1, %xmm8, %xmm1
; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpand %xmm5, %xmm0, %xmm1
; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm1
; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: pext_v16i8:
; AVX512: # %bb.0:
; AVX512-NEXT: vmovdqa %xmm1, %xmm2
; AVX512-NEXT: vpternlogq {{.*#+}} xmm2 = ~xmm2
; AVX512-NEXT: vpaddb %xmm2, %xmm2, %xmm3
; AVX512-NEXT: vpaddb %xmm3, %xmm3, %xmm4
; AVX512-NEXT: vpxor %xmm4, %xmm3, %xmm3
; AVX512-NEXT: vpaddb %xmm3, %xmm3, %xmm4
; AVX512-NEXT: vpaddb %xmm4, %xmm4, %xmm4
; AVX512-NEXT: vpxor %xmm4, %xmm3, %xmm3
; AVX512-NEXT: vpsllw $4, %xmm3, %xmm4
; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm5 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
; AVX512-NEXT: vpternlogq {{.*#+}} xmm4 = xmm3 ^ (xmm4 & xmm5)
; AVX512-NEXT: vpsubb %xmm2, %xmm1, %xmm2
; AVX512-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
; AVX512-NEXT: vpternlogq {{.*#+}} xmm3 = xmm3 ^ (xmm2 | xmm4)
; AVX512-NEXT: vpaddb %xmm3, %xmm3, %xmm2
; AVX512-NEXT: vpxor %xmm2, %xmm3, %xmm2
; AVX512-NEXT: vpaddb %xmm2, %xmm2, %xmm6
; AVX512-NEXT: vpaddb %xmm6, %xmm6, %xmm6
; AVX512-NEXT: vpxor %xmm6, %xmm2, %xmm2
; AVX512-NEXT: vpsllw $4, %xmm2, %xmm6
; AVX512-NEXT: vpternlogq {{.*#+}} xmm6 = xmm2 ^ (xmm6 & xmm5)
; AVX512-NEXT: vpandn %xmm3, %xmm6, %xmm2
; AVX512-NEXT: vpaddb %xmm2, %xmm2, %xmm3
; AVX512-NEXT: vpxor %xmm3, %xmm2, %xmm2
; AVX512-NEXT: vpaddb %xmm2, %xmm2, %xmm3
; AVX512-NEXT: vpaddb %xmm3, %xmm3, %xmm3
; AVX512-NEXT: vpxor %xmm3, %xmm2, %xmm2
; AVX512-NEXT: vpsllw $4, %xmm2, %xmm3
; AVX512-NEXT: vpternlogq {{.*#+}} xmm3 = xmm2 ^ (xmm3 & xmm5)
; AVX512-NEXT: vpand %xmm1, %xmm4, %xmm2
; AVX512-NEXT: vpxor %xmm2, %xmm1, %xmm4
; AVX512-NEXT: vpsrlw $1, %xmm2, %xmm5
; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
; AVX512-NEXT: vpternlogq {{.*#+}} xmm5 = (xmm5 & xmm7) | xmm4
; AVX512-NEXT: vpand %xmm5, %xmm6, %xmm4
; AVX512-NEXT: vpxor %xmm4, %xmm5, %xmm5
; AVX512-NEXT: vpsrlw $2, %xmm4, %xmm6
; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm8 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
; AVX512-NEXT: vpternlogq {{.*#+}} xmm6 = (xmm6 & xmm8) | xmm5
; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX512-NEXT: vpand %xmm2, %xmm0, %xmm1
; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX512-NEXT: vpsrlw $1, %xmm1, %xmm1
; AVX512-NEXT: vpternlogq {{.*#+}} xmm1 = (xmm1 & xmm7) | xmm0
; AVX512-NEXT: vpand %xmm4, %xmm1, %xmm0
; AVX512-NEXT: vpxor %xmm0, %xmm1, %xmm1
; AVX512-NEXT: vpsrlw $2, %xmm0, %xmm0
; AVX512-NEXT: vpternlogq {{.*#+}} xmm0 = (xmm0 & xmm8) | xmm1
; AVX512-NEXT: vpternlogq {{.*#+}} xmm6 = xmm6 & xmm0 & xmm3
; AVX512-NEXT: vpxor %xmm6, %xmm0, %xmm1
; AVX512-NEXT: vpsrlw $4, %xmm6, %xmm0
; AVX512-NEXT: vpternlogd {{.*#+}} xmm0 = (xmm0 & m32bcst) | xmm1
; AVX512-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
;
; AVX2-LABEL: pext_v8i16:
; AVX2: # %bb.0:
; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm2
; AVX2-NEXT: vpaddw %xmm2, %xmm2, %xmm6
; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm3 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero
; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]
; AVX2-NEXT: vpclmulqdq $17, %ymm2, %ymm3, %ymm4
; AVX2-NEXT: vpclmulqdq $0, %ymm2, %ymm3, %ymm5
; AVX2-NEXT: vpsrlq $32, %ymm3, %ymm7
; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [255,255,0,0,0,0,0,0,255,255,0,0,0,0,0,0,255,255,0,0,0,0,0,0,255,255,0,0,0,0,0,0]
; AVX2-NEXT: vpclmulqdq $17, %ymm3, %ymm7, %ymm8
; AVX2-NEXT: vpclmulqdq $0, %ymm3, %ymm7, %ymm7
; AVX2-NEXT: vpunpckldq {{.*#+}} ymm4 = ymm5[0],ymm4[0],ymm5[1],ymm4[1],ymm5[4],ymm4[4],ymm5[5],ymm4[5]
; AVX2-NEXT: vpunpckldq {{.*#+}} ymm5 = ymm7[0],ymm8[0],ymm7[1],ymm8[1],ymm7[4],ymm8[4],ymm7[5],ymm8[5]
; AVX2-NEXT: vpunpckldq {{.*#+}} ymm4 = ymm4[0],ymm5[0],ymm4[1],ymm5[1],ymm4[4],ymm5[4],ymm4[5],ymm5[5]
; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
; AVX2-NEXT: vpshufb %ymm5, %ymm4, %ymm4
; AVX2-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,2,2,3]
; AVX2-NEXT: vpandn %xmm6, %xmm4, %xmm7
; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm6 = xmm7[0],zero,xmm7[1],zero,xmm7[2],zero,xmm7[3],zero,xmm7[4],zero,xmm7[5],zero,xmm7[6],zero,xmm7[7],zero
; AVX2-NEXT: vpclmulqdq $17, %ymm2, %ymm6, %ymm8
; AVX2-NEXT: vpclmulqdq $0, %ymm2, %ymm6, %ymm9
; AVX2-NEXT: vpunpckldq {{.*#+}} ymm8 = ymm9[0],ymm8[0],ymm9[1],ymm8[1],ymm9[4],ymm8[4],ymm9[5],ymm8[5]
; AVX2-NEXT: vpsrlq $32, %ymm6, %ymm6
; AVX2-NEXT: vpclmulqdq $17, %ymm3, %ymm6, %ymm9
; AVX2-NEXT: vpclmulqdq $0, %ymm3, %ymm6, %ymm6
; AVX2-NEXT: vpunpckldq {{.*#+}} ymm6 = ymm6[0],ymm9[0],ymm6[1],ymm9[1],ymm6[4],ymm9[4],ymm6[5],ymm9[5]
; AVX2-NEXT: vpunpckldq {{.*#+}} ymm6 = ymm8[0],ymm6[0],ymm8[1],ymm6[1],ymm8[4],ymm6[4],ymm8[5],ymm6[5]
; AVX2-NEXT: vpshufb %ymm5, %ymm6, %ymm6
; AVX2-NEXT: vpermq {{.*#+}} ymm6 = ymm6[0,2,2,3]
; AVX2-NEXT: vpandn %xmm7, %xmm6, %xmm7
; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm8 = xmm7[0],zero,xmm7[1],zero,xmm7[2],zero,xmm7[3],zero,xmm7[4],zero,xmm7[5],zero,xmm7[6],zero,xmm7[7],zero
; AVX2-NEXT: vpclmulqdq $17, %ymm2, %ymm8, %ymm9
; AVX2-NEXT: vpclmulqdq $0, %ymm2, %ymm8, %ymm10
; AVX2-NEXT: vpunpckldq {{.*#+}} ymm9 = ymm10[0],ymm9[0],ymm10[1],ymm9[1],ymm10[4],ymm9[4],ymm10[5],ymm9[5]
; AVX2-NEXT: vpsrlq $32, %ymm8, %ymm8
; AVX2-NEXT: vpclmulqdq $17, %ymm3, %ymm8, %ymm10
; AVX2-NEXT: vpclmulqdq $0, %ymm3, %ymm8, %ymm8
; AVX2-NEXT: vpunpckldq {{.*#+}} ymm8 = ymm8[0],ymm10[0],ymm8[1],ymm10[1],ymm8[4],ymm10[4],ymm8[5],ymm10[5]
; AVX2-NEXT: vpunpckldq {{.*#+}} ymm8 = ymm9[0],ymm8[0],ymm9[1],ymm8[1],ymm9[4],ymm8[4],ymm9[5],ymm8[5]
; AVX2-NEXT: vpshufb %ymm5, %ymm8, %ymm8
; AVX2-NEXT: vpermq {{.*#+}} ymm8 = ymm8[0,2,2,3]
; AVX2-NEXT: vpandn %xmm7, %xmm8, %xmm7
; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm7 = xmm7[0],zero,xmm7[1],zero,xmm7[2],zero,xmm7[3],zero,xmm7[4],zero,xmm7[5],zero,xmm7[6],zero,xmm7[7],zero
; AVX2-NEXT: vpclmulqdq $17, %ymm2, %ymm7, %ymm9
; AVX2-NEXT: vpclmulqdq $0, %ymm2, %ymm7, %ymm2
; AVX2-NEXT: vpsrlq $32, %ymm7, %ymm7
; AVX2-NEXT: vpclmulqdq $17, %ymm3, %ymm7, %ymm10
; AVX2-NEXT: vpclmulqdq $0, %ymm3, %ymm7, %ymm3
; AVX2-NEXT: vpunpckldq {{.*#+}} ymm2 = ymm2[0],ymm9[0],ymm2[1],ymm9[1],ymm2[4],ymm9[4],ymm2[5],ymm9[5]
; AVX2-NEXT: vpunpckldq {{.*#+}} ymm3 = ymm3[0],ymm10[0],ymm3[1],ymm10[1],ymm3[4],ymm10[4],ymm3[5],ymm10[5]
; AVX2-NEXT: vpunpckldq {{.*#+}} ymm2 = ymm2[0],ymm3[0],ymm2[1],ymm3[1],ymm2[4],ymm3[4],ymm2[5],ymm3[5]
; AVX2-NEXT: vpshufb %ymm5, %ymm2, %ymm2
; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
; AVX2-NEXT: vpand %xmm1, %xmm4, %xmm3
; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm4
; AVX2-NEXT: vpsrlw $1, %xmm3, %xmm5
; AVX2-NEXT: vpor %xmm5, %xmm4, %xmm4
; AVX2-NEXT: vpand %xmm4, %xmm6, %xmm5
; AVX2-NEXT: vpxor %xmm5, %xmm4, %xmm4
; AVX2-NEXT: vpsrlw $2, %xmm5, %xmm6
; AVX2-NEXT: vpor %xmm6, %xmm4, %xmm4
; AVX2-NEXT: vpand %xmm4, %xmm8, %xmm6
; AVX2-NEXT: vpxor %xmm6, %xmm4, %xmm4
; AVX2-NEXT: vpsrlw $4, %xmm6, %xmm7
; AVX2-NEXT: vpor %xmm7, %xmm4, %xmm4
; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpand %xmm3, %xmm0, %xmm1
; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpsrlw $1, %xmm1, %xmm1
; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpand %xmm5, %xmm0, %xmm1
; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpsrlw $2, %xmm1, %xmm1
; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpand %xmm6, %xmm0, %xmm1
; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpsrlw $4, %xmm1, %xmm1
; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpand %xmm4, %xmm0, %xmm1
; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vpsrlw $8, %xmm1, %xmm1
; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vzeroupper
; AVX2-NEXT: retq
;
; AVX512-LABEL: pext_v8i16:
; AVX512: # %bb.0:
; AVX512-NEXT: vmovdqa %xmm1, %xmm2
; AVX512-NEXT: vpternlogq {{.*#+}} xmm2 = ~xmm2
; AVX512-NEXT: vpaddw %xmm2, %xmm2, %xmm2
; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm3 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
; AVX512-NEXT: vpbroadcastd {{.*#+}} ymm4 = [65535,65535,65535,65535,65535,65535,65535,65535]
; AVX512-NEXT: vpclmulqdq $17, %ymm4, %ymm3, %ymm5
; AVX512-NEXT: vpclmulqdq $0, %ymm4, %ymm3, %ymm6
; AVX512-NEXT: vpunpckldq {{.*#+}} ymm5 = ymm6[0],ymm5[0],ymm6[1],ymm5[1],ymm6[4],ymm5[4],ymm6[5],ymm5[5]
; AVX512-NEXT: vpsrlq $32, %ymm3, %ymm3
; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm6 = [255,255,0,0,0,0,0,0,255,255,0,0,0,0,0,0,255,255,0,0,0,0,0,0,255,255,0,0,0,0,0,0]
; AVX512-NEXT: vpclmulqdq $17, %ymm6, %ymm3, %ymm7
; AVX512-NEXT: vpclmulqdq $0, %ymm6, %ymm3, %ymm3
; AVX512-NEXT: vpunpckldq {{.*#+}} ymm3 = ymm3[0],ymm7[0],ymm3[1],ymm7[1],ymm3[4],ymm7[4],ymm3[5],ymm7[5]
; AVX512-NEXT: vpunpckldq {{.*#+}} ymm3 = ymm5[0],ymm3[0],ymm5[1],ymm3[1],ymm5[4],ymm3[4],ymm5[5],ymm3[5]
; AVX512-NEXT: vpmovdw %ymm3, %xmm3
; AVX512-NEXT: vpandn %xmm2, %xmm3, %xmm2
; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
; AVX512-NEXT: vpclmulqdq $17, %ymm4, %ymm5, %ymm7
; AVX512-NEXT: vpclmulqdq $0, %ymm4, %ymm5, %ymm8
; AVX512-NEXT: vpunpckldq {{.*#+}} ymm7 = ymm8[0],ymm7[0],ymm8[1],ymm7[1],ymm8[4],ymm7[4],ymm8[5],ymm7[5]
; AVX512-NEXT: vpsrlq $32, %ymm5, %ymm5
; AVX512-NEXT: vpclmulqdq $17, %ymm6, %ymm5, %ymm8
; AVX512-NEXT: vpclmulqdq $0, %ymm6, %ymm5, %ymm5
; AVX512-NEXT: vpunpckldq {{.*#+}} ymm5 = ymm5[0],ymm8[0],ymm5[1],ymm8[1],ymm5[4],ymm8[4],ymm5[5],ymm8[5]
; AVX512-NEXT: vpunpckldq {{.*#+}} ymm5 = ymm7[0],ymm5[0],ymm7[1],ymm5[1],ymm7[4],ymm5[4],ymm7[5],ymm5[5]
; AVX512-NEXT: vpmovdw %ymm5, %xmm5
; AVX512-NEXT: vpandn %xmm2, %xmm5, %xmm2
; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm7 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
; AVX512-NEXT: vpclmulqdq $17, %ymm4, %ymm7, %ymm8
; AVX512-NEXT: vpclmulqdq $0, %ymm4, %ymm7, %ymm9
; AVX512-NEXT: vpunpckldq {{.*#+}} ymm8 = ymm9[0],ymm8[0],ymm9[1],ymm8[1],ymm9[4],ymm8[4],ymm9[5],ymm8[5]
; AVX512-NEXT: vpsrlq $32, %ymm7, %ymm7
; AVX512-NEXT: vpclmulqdq $17, %ymm6, %ymm7, %ymm9
; AVX512-NEXT: vpclmulqdq $0, %ymm6, %ymm7, %ymm7
; AVX512-NEXT: vpunpckldq {{.*#+}} ymm7 = ymm7[0],ymm9[0],ymm7[1],ymm9[1],ymm7[4],ymm9[4],ymm7[5],ymm9[5]
; AVX512-NEXT: vpunpckldq {{.*#+}} ymm7 = ymm8[0],ymm7[0],ymm8[1],ymm7[1],ymm8[4],ymm7[4],ymm8[5],ymm7[5]
; AVX512-NEXT: vpmovdw %ymm7, %xmm7
; AVX512-NEXT: vpandn %xmm2, %xmm7, %xmm2
; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
; AVX512-NEXT: vpclmulqdq $17, %ymm4, %ymm2, %ymm8
; AVX512-NEXT: vpclmulqdq $0, %ymm4, %ymm2, %ymm4
; AVX512-NEXT: vpunpckldq {{.*#+}} ymm4 = ymm4[0],ymm8[0],ymm4[1],ymm8[1],ymm4[4],ymm8[4],ymm4[5],ymm8[5]
; AVX512-NEXT: vpsrlq $32, %ymm2, %ymm2
; AVX512-NEXT: vpclmulqdq $17, %ymm6, %ymm2, %ymm8
; AVX512-NEXT: vpclmulqdq $0, %ymm6, %ymm2, %ymm2
; AVX512-NEXT: vpunpckldq {{.*#+}} ymm2 = ymm2[0],ymm8[0],ymm2[1],ymm8[1],ymm2[4],ymm8[4],ymm2[5],ymm8[5]
; AVX512-NEXT: vpunpckldq {{.*#+}} ymm2 = ymm4[0],ymm2[0],ymm4[1],ymm2[1],ymm4[4],ymm2[4],ymm4[5],ymm2[5]
; AVX512-NEXT: vpmovdw %ymm2, %xmm2
; AVX512-NEXT: vpand %xmm1, %xmm3, %xmm3
; AVX512-NEXT: vpsrlw $1, %xmm3, %xmm4
; AVX512-NEXT: vpternlogq {{.*#+}} xmm4 = xmm4 | (xmm1 ^ xmm3)
; AVX512-NEXT: vpand %xmm4, %xmm5, %xmm5
; AVX512-NEXT: vpsrlw $2, %xmm5, %xmm6
; AVX512-NEXT: vpternlogq {{.*#+}} xmm6 = xmm6 | (xmm4 ^ xmm5)
; AVX512-NEXT: vpand %xmm6, %xmm7, %xmm4
; AVX512-NEXT: vpsrlw $4, %xmm4, %xmm7
; AVX512-NEXT: vpternlogq {{.*#+}} xmm7 = xmm7 | (xmm6 ^ xmm4)
; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX512-NEXT: vpand %xmm3, %xmm0, %xmm1
; AVX512-NEXT: vpsrlw $1, %xmm1, %xmm3
; AVX512-NEXT: vpternlogq {{.*#+}} xmm3 = xmm3 | (xmm0 ^ xmm1)
; AVX512-NEXT: vpand %xmm5, %xmm3, %xmm0
; AVX512-NEXT: vpsrlw $2, %xmm0, %xmm1
; AVX512-NEXT: vpternlogq {{.*#+}} xmm1 = xmm1 | (xmm3 ^ xmm0)
; AVX512-NEXT: vpand %xmm4, %xmm1, %xmm0
; AVX512-NEXT: vpsrlw $4, %xmm0, %xmm3
; AVX512-NEXT: vpternlogq {{.*#+}} xmm3 = xmm3 | (xmm1 ^ xmm0)
; AVX512-NEXT: vpternlogq {{.*#+}} xmm7 = xmm7 & xmm3 & xmm2
; AVX512-NEXT: vpsrlw $8, %xmm7, %xmm0
; AVX512-NEXT: vpternlogq {{.*#+}} xmm0 = xmm0 | (xmm3 ^ xmm7)
; AVX512-NEXT: vzeroupper
; AVX512-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 {
; SSE2-LABEL: pext_v4i32:
; SSE2: # %bb.0:
; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
; SSE2-NEXT: pxor %xmm1, %xmm3
; SSE2-NEXT: movdqa %xmm3, %xmm2
; SSE2-NEXT: pslld $2, %xmm2
; SSE2-NEXT: paddd %xmm3, %xmm3
; SSE2-NEXT: pxor %xmm3, %xmm2
; SSE2-NEXT: movdqa %xmm2, %xmm4
; SSE2-NEXT: pslld $2, %xmm4
; SSE2-NEXT: pxor %xmm2, %xmm4
; SSE2-NEXT: movdqa %xmm4, %xmm2
; SSE2-NEXT: pslld $4, %xmm2
; SSE2-NEXT: pxor %xmm4, %xmm2
; SSE2-NEXT: movdqa %xmm2, %xmm4
; SSE2-NEXT: pslld $8, %xmm4
; SSE2-NEXT: pxor %xmm2, %xmm4
; SSE2-NEXT: movdqa %xmm4, %xmm2
; SSE2-NEXT: pslld $16, %xmm2
; SSE2-NEXT: pxor %xmm4, %xmm2
; SSE2-NEXT: movdqa %xmm2, %xmm4
; SSE2-NEXT: pandn %xmm3, %xmm4
; SSE2-NEXT: movdqa %xmm4, %xmm3
; SSE2-NEXT: paddd %xmm3, %xmm3
; SSE2-NEXT: pxor %xmm4, %xmm3
; SSE2-NEXT: movdqa %xmm3, %xmm5
; SSE2-NEXT: pslld $2, %xmm5
; SSE2-NEXT: pxor %xmm3, %xmm5
; SSE2-NEXT: movdqa %xmm5, %xmm3
; SSE2-NEXT: pslld $4, %xmm3
; SSE2-NEXT: pxor %xmm5, %xmm3
; SSE2-NEXT: movdqa %xmm3, %xmm5
; SSE2-NEXT: pslld $8, %xmm5
; SSE2-NEXT: pxor %xmm3, %xmm5
; SSE2-NEXT: movdqa %xmm5, %xmm3
; SSE2-NEXT: pslld $16, %xmm3
; SSE2-NEXT: pxor %xmm5, %xmm3
; SSE2-NEXT: movdqa %xmm3, %xmm5
; SSE2-NEXT: pandn %xmm4, %xmm5
; SSE2-NEXT: movdqa %xmm5, %xmm4
; SSE2-NEXT: paddd %xmm4, %xmm4
; SSE2-NEXT: pxor %xmm5, %xmm4
; SSE2-NEXT: movdqa %xmm4, %xmm6
; SSE2-NEXT: pslld $2, %xmm6
; SSE2-NEXT: pxor %xmm4, %xmm6
; SSE2-NEXT: movdqa %xmm6, %xmm4
; SSE2-NEXT: pslld $4, %xmm4
; SSE2-NEXT: pxor %xmm6, %xmm4
; SSE2-NEXT: movdqa %xmm4, %xmm6
; SSE2-NEXT: pslld $8, %xmm6
; SSE2-NEXT: pxor %xmm4, %xmm6
; SSE2-NEXT: movdqa %xmm6, %xmm4
; SSE2-NEXT: pslld $16, %xmm4
; SSE2-NEXT: pxor %xmm6, %xmm4
; SSE2-NEXT: movdqa %xmm4, %xmm6
; SSE2-NEXT: pandn %xmm5, %xmm6
; SSE2-NEXT: movdqa %xmm6, %xmm5
; SSE2-NEXT: paddd %xmm5, %xmm5
; SSE2-NEXT: pxor %xmm6, %xmm5
; SSE2-NEXT: movdqa %xmm5, %xmm7
; SSE2-NEXT: pslld $2, %xmm7
; SSE2-NEXT: pxor %xmm5, %xmm7
; SSE2-NEXT: movdqa %xmm7, %xmm5
; SSE2-NEXT: pslld $4, %xmm5
; SSE2-NEXT: pxor %xmm7, %xmm5
; SSE2-NEXT: movdqa %xmm5, %xmm7
; SSE2-NEXT: pslld $8, %xmm7
; SSE2-NEXT: pxor %xmm5, %xmm7
; SSE2-NEXT: movdqa %xmm7, %xmm5
; SSE2-NEXT: pslld $16, %xmm5
; SSE2-NEXT: pxor %xmm7, %xmm5
; SSE2-NEXT: movdqa %xmm5, %xmm7
; SSE2-NEXT: pandn %xmm6, %xmm7
; SSE2-NEXT: movdqa %xmm7, %xmm6
; SSE2-NEXT: paddd %xmm6, %xmm6
; SSE2-NEXT: pxor %xmm7, %xmm6
; SSE2-NEXT: movdqa %xmm6, %xmm7
; SSE2-NEXT: pslld $2, %xmm7
; SSE2-NEXT: pxor %xmm6, %xmm7
; SSE2-NEXT: movdqa %xmm7, %xmm6
; SSE2-NEXT: pslld $4, %xmm6
; SSE2-NEXT: pxor %xmm7, %xmm6
; SSE2-NEXT: movdqa %xmm6, %xmm7
; SSE2-NEXT: pslld $8, %xmm7
; SSE2-NEXT: pxor %xmm6, %xmm7
; SSE2-NEXT: movdqa %xmm7, %xmm6
; SSE2-NEXT: pslld $16, %xmm6
; SSE2-NEXT: pxor %xmm7, %xmm6
; SSE2-NEXT: pand %xmm1, %xmm2
; SSE2-NEXT: pand %xmm1, %xmm0
; SSE2-NEXT: pxor %xmm2, %xmm1
; SSE2-NEXT: movdqa %xmm2, %xmm7
; SSE2-NEXT: psrld $1, %xmm7
; SSE2-NEXT: por %xmm1, %xmm7
; SSE2-NEXT: pand %xmm7, %xmm3
; SSE2-NEXT: pxor %xmm3, %xmm7
; SSE2-NEXT: movdqa %xmm3, %xmm1
; SSE2-NEXT: psrld $2, %xmm1
; SSE2-NEXT: por %xmm7, %xmm1
; SSE2-NEXT: pand %xmm1, %xmm4
; SSE2-NEXT: pxor %xmm4, %xmm1
; SSE2-NEXT: movdqa %xmm4, %xmm7
; SSE2-NEXT: psrld $4, %xmm7
; SSE2-NEXT: por %xmm1, %xmm7
; SSE2-NEXT: pand %xmm7, %xmm5
; SSE2-NEXT: pxor %xmm5, %xmm7
; SSE2-NEXT: movdqa %xmm5, %xmm1
; SSE2-NEXT: psrld $8, %xmm1
; SSE2-NEXT: por %xmm7, %xmm1
; SSE2-NEXT: pand %xmm0, %xmm2
; SSE2-NEXT: pxor %xmm2, %xmm0
; SSE2-NEXT: psrld $1, %xmm2
; SSE2-NEXT: por %xmm2, %xmm0
; SSE2-NEXT: pand %xmm0, %xmm3
; SSE2-NEXT: pxor %xmm3, %xmm0
; SSE2-NEXT: psrld $2, %xmm3
; SSE2-NEXT: por %xmm3, %xmm0
; SSE2-NEXT: pand %xmm0, %xmm4
; SSE2-NEXT: pxor %xmm4, %xmm0
; SSE2-NEXT: psrld $4, %xmm4
; SSE2-NEXT: por %xmm4, %xmm0
; SSE2-NEXT: pand %xmm0, %xmm5
; SSE2-NEXT: pxor %xmm5, %xmm0
; SSE2-NEXT: psrld $8, %xmm5
; SSE2-NEXT: por %xmm5, %xmm0
; SSE2-NEXT: pand %xmm0, %xmm1
; SSE2-NEXT: pand %xmm6, %xmm1
; SSE2-NEXT: pxor %xmm1, %xmm0
; SSE2-NEXT: psrld $16, %xmm1
; SSE2-NEXT: por %xmm1, %xmm0
; SSE2-NEXT: retq
;
; PCLMUL-LABEL: pext_v4i32:
; PCLMUL: # %bb.0:
; PCLMUL-NEXT: pcmpeqd %xmm2, %xmm2
; PCLMUL-NEXT: movdqa %xmm1, %xmm4
; PCLMUL-NEXT: pxor %xmm2, %xmm4
; PCLMUL-NEXT: paddd %xmm4, %xmm4
; PCLMUL-NEXT: movdqa %xmm4, %xmm5
; PCLMUL-NEXT: pclmulqdq $17, %xmm2, %xmm5
; PCLMUL-NEXT: movdqa %xmm4, %xmm3
; PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm3
; PCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1]
; PCLMUL-NEXT: movdqa %xmm4, %xmm5
; PCLMUL-NEXT: psrlq $32, %xmm5
; PCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]
; PCLMUL-NEXT: movdqa %xmm5, %xmm6
; PCLMUL-NEXT: pclmulqdq $17, %xmm7, %xmm6
; PCLMUL-NEXT: pclmulqdq $0, %xmm7, %xmm5
; PCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm6[0],xmm5[1],xmm6[1]
; PCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1]
; PCLMUL-NEXT: movdqa %xmm3, %xmm5
; PCLMUL-NEXT: pandn %xmm4, %xmm5
; PCLMUL-NEXT: movdqa %xmm5, %xmm6
; PCLMUL-NEXT: pclmulqdq $17, %xmm2, %xmm6
; PCLMUL-NEXT: movdqa %xmm5, %xmm4
; PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm4
; PCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
; PCLMUL-NEXT: movdqa %xmm5, %xmm6
; PCLMUL-NEXT: psrlq $32, %xmm6
; PCLMUL-NEXT: movdqa %xmm6, %xmm8
; PCLMUL-NEXT: pclmulqdq $17, %xmm7, %xmm8
; PCLMUL-NEXT: pclmulqdq $0, %xmm7, %xmm6
; PCLMUL-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm8[0],xmm6[1],xmm8[1]
; PCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
; PCLMUL-NEXT: movdqa %xmm4, %xmm6
; PCLMUL-NEXT: pandn %xmm5, %xmm6
; PCLMUL-NEXT: movdqa %xmm6, %xmm8
; PCLMUL-NEXT: pclmulqdq $17, %xmm2, %xmm8
; PCLMUL-NEXT: movdqa %xmm6, %xmm5
; PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm5
; PCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm8[0],xmm5[1],xmm8[1]
; PCLMUL-NEXT: movdqa %xmm6, %xmm8
; PCLMUL-NEXT: psrlq $32, %xmm8
; PCLMUL-NEXT: movdqa %xmm8, %xmm9
; PCLMUL-NEXT: pclmulqdq $17, %xmm7, %xmm9
; PCLMUL-NEXT: pclmulqdq $0, %xmm7, %xmm8
; PCLMUL-NEXT: punpckldq {{.*#+}} xmm8 = xmm8[0],xmm9[0],xmm8[1],xmm9[1]
; PCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm8[0],xmm5[1],xmm8[1]
; PCLMUL-NEXT: movdqa %xmm5, %xmm8
; PCLMUL-NEXT: pandn %xmm6, %xmm8
; PCLMUL-NEXT: movdqa %xmm8, %xmm9
; PCLMUL-NEXT: pclmulqdq $17, %xmm2, %xmm9
; PCLMUL-NEXT: movdqa %xmm8, %xmm6
; PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm6
; PCLMUL-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm9[0],xmm6[1],xmm9[1]
; PCLMUL-NEXT: movdqa %xmm8, %xmm9
; PCLMUL-NEXT: psrlq $32, %xmm9
; PCLMUL-NEXT: movdqa %xmm9, %xmm10
; PCLMUL-NEXT: pclmulqdq $17, %xmm7, %xmm10
; PCLMUL-NEXT: pclmulqdq $0, %xmm7, %xmm9
; PCLMUL-NEXT: punpckldq {{.*#+}} xmm9 = xmm9[0],xmm10[0],xmm9[1],xmm10[1]
; PCLMUL-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm9[0],xmm6[1],xmm9[1]
; PCLMUL-NEXT: movdqa %xmm6, %xmm9
; PCLMUL-NEXT: pandn %xmm8, %xmm9
; PCLMUL-NEXT: movdqa %xmm9, %xmm8
; PCLMUL-NEXT: pclmulqdq $17, %xmm2, %xmm8
; PCLMUL-NEXT: pclmulqdq $0, %xmm9, %xmm2
; PCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm8[0],xmm2[1],xmm8[1]
; PCLMUL-NEXT: psrlq $32, %xmm9
; PCLMUL-NEXT: movdqa %xmm9, %xmm8
; PCLMUL-NEXT: pclmulqdq $17, %xmm7, %xmm8
; PCLMUL-NEXT: pclmulqdq $0, %xmm7, %xmm9
; PCLMUL-NEXT: punpckldq {{.*#+}} xmm9 = xmm9[0],xmm8[0],xmm9[1],xmm8[1]
; PCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm9[0],xmm2[1],xmm9[1]
; PCLMUL-NEXT: pand %xmm1, %xmm3
; PCLMUL-NEXT: pand %xmm1, %xmm0
; PCLMUL-NEXT: pxor %xmm3, %xmm1
; PCLMUL-NEXT: movdqa %xmm3, %xmm7
; PCLMUL-NEXT: psrld $1, %xmm7
; PCLMUL-NEXT: por %xmm1, %xmm7
; PCLMUL-NEXT: pand %xmm7, %xmm4
; PCLMUL-NEXT: pxor %xmm4, %xmm7
; PCLMUL-NEXT: movdqa %xmm4, %xmm1
; PCLMUL-NEXT: psrld $2, %xmm1
; PCLMUL-NEXT: por %xmm7, %xmm1
; PCLMUL-NEXT: pand %xmm1, %xmm5
; PCLMUL-NEXT: pxor %xmm5, %xmm1
; PCLMUL-NEXT: movdqa %xmm5, %xmm7
; PCLMUL-NEXT: psrld $4, %xmm7
; PCLMUL-NEXT: por %xmm1, %xmm7
; PCLMUL-NEXT: pand %xmm7, %xmm6
; PCLMUL-NEXT: pxor %xmm6, %xmm7
; PCLMUL-NEXT: movdqa %xmm6, %xmm1
; PCLMUL-NEXT: psrld $8, %xmm1
; PCLMUL-NEXT: por %xmm7, %xmm1
; PCLMUL-NEXT: pand %xmm0, %xmm3
; PCLMUL-NEXT: pxor %xmm3, %xmm0
; PCLMUL-NEXT: psrld $1, %xmm3
; PCLMUL-NEXT: por %xmm3, %xmm0
; PCLMUL-NEXT: pand %xmm0, %xmm4
; PCLMUL-NEXT: pxor %xmm4, %xmm0
; PCLMUL-NEXT: psrld $2, %xmm4
; PCLMUL-NEXT: por %xmm4, %xmm0
; PCLMUL-NEXT: pand %xmm0, %xmm5
; PCLMUL-NEXT: pxor %xmm5, %xmm0
; PCLMUL-NEXT: psrld $4, %xmm5
; PCLMUL-NEXT: por %xmm5, %xmm0
; PCLMUL-NEXT: pand %xmm0, %xmm6
; PCLMUL-NEXT: pxor %xmm6, %xmm0
; PCLMUL-NEXT: psrld $8, %xmm6
; PCLMUL-NEXT: por %xmm6, %xmm0
; PCLMUL-NEXT: pand %xmm0, %xmm1
; PCLMUL-NEXT: pand %xmm2, %xmm1
; PCLMUL-NEXT: pxor %xmm1, %xmm0
; PCLMUL-NEXT: psrld $16, %xmm1
; PCLMUL-NEXT: por %xmm1, %xmm0
; PCLMUL-NEXT: retq
;
; AVX2-FAST-LABEL: pext_v4i32:
; AVX2-FAST: # %bb.0:
; AVX2-FAST-NEXT: vpextrd $1, %xmm1, %eax
; AVX2-FAST-NEXT: vpextrd $1, %xmm0, %ecx
; AVX2-FAST-NEXT: pextl %eax, %ecx, %eax
; AVX2-FAST-NEXT: vmovd %xmm1, %ecx
; AVX2-FAST-NEXT: vmovd %xmm0, %edx
; AVX2-FAST-NEXT: pextl %ecx, %edx, %ecx
; AVX2-FAST-NEXT: vmovd %ecx, %xmm2
; AVX2-FAST-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2
; AVX2-FAST-NEXT: vpextrd $2, %xmm1, %eax
; AVX2-FAST-NEXT: vpextrd $2, %xmm0, %ecx
; AVX2-FAST-NEXT: pextl %eax, %ecx, %eax
; AVX2-FAST-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2
; AVX2-FAST-NEXT: vpextrd $3, %xmm1, %eax
; AVX2-FAST-NEXT: vpextrd $3, %xmm0, %ecx
; AVX2-FAST-NEXT: pextl %eax, %ecx, %eax
; AVX2-FAST-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0
; AVX2-FAST-NEXT: retq
;
; AVX2-SLOW-LABEL: pext_v4i32:
; AVX2-SLOW: # %bb.0:
; AVX2-SLOW-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
; AVX2-SLOW-NEXT: vpxor %xmm2, %xmm1, %xmm3
; AVX2-SLOW-NEXT: vpaddd %xmm3, %xmm3, %xmm5
; AVX2-SLOW-NEXT: vpclmulqdq $17, %xmm2, %xmm5, %xmm4
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm2, %xmm5, %xmm6
; AVX2-SLOW-NEXT: vpsrlq $32, %xmm5, %xmm7
; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} xmm3 = [255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0]
; AVX2-SLOW-NEXT: vpclmulqdq $17, %xmm3, %xmm7, %xmm8
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm3, %xmm7, %xmm7
; AVX2-SLOW-NEXT: vpunpckldq {{.*#+}} xmm4 = xmm6[0],xmm4[0],xmm6[1],xmm4[1]
; AVX2-SLOW-NEXT: vpunpckldq {{.*#+}} xmm6 = xmm7[0],xmm8[0],xmm7[1],xmm8[1]
; AVX2-SLOW-NEXT: vpunpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
; AVX2-SLOW-NEXT: vpandn %xmm5, %xmm4, %xmm6
; AVX2-SLOW-NEXT: vpclmulqdq $17, %xmm2, %xmm6, %xmm5
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm2, %xmm6, %xmm7
; AVX2-SLOW-NEXT: vpsrlq $32, %xmm6, %xmm8
; AVX2-SLOW-NEXT: vpclmulqdq $17, %xmm3, %xmm8, %xmm9
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm3, %xmm8, %xmm8
; AVX2-SLOW-NEXT: vpunpckldq {{.*#+}} xmm5 = xmm7[0],xmm5[0],xmm7[1],xmm5[1]
; AVX2-SLOW-NEXT: vpunpckldq {{.*#+}} xmm7 = xmm8[0],xmm9[0],xmm8[1],xmm9[1]
; AVX2-SLOW-NEXT: vpunpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
; AVX2-SLOW-NEXT: vpandn %xmm6, %xmm5, %xmm6
; AVX2-SLOW-NEXT: vpclmulqdq $17, %xmm2, %xmm6, %xmm7
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm2, %xmm6, %xmm8
; AVX2-SLOW-NEXT: vpsrlq $32, %xmm6, %xmm9
; AVX2-SLOW-NEXT: vpclmulqdq $17, %xmm3, %xmm9, %xmm10
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm3, %xmm9, %xmm9
; AVX2-SLOW-NEXT: vpunpckldq {{.*#+}} xmm7 = xmm8[0],xmm7[0],xmm8[1],xmm7[1]
; AVX2-SLOW-NEXT: vpunpckldq {{.*#+}} xmm8 = xmm9[0],xmm10[0],xmm9[1],xmm10[1]
; AVX2-SLOW-NEXT: vpunpckldq {{.*#+}} xmm7 = xmm7[0],xmm8[0],xmm7[1],xmm8[1]
; AVX2-SLOW-NEXT: vpandn %xmm6, %xmm7, %xmm6
; AVX2-SLOW-NEXT: vpclmulqdq $17, %xmm2, %xmm6, %xmm8
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm2, %xmm6, %xmm9
; AVX2-SLOW-NEXT: vpsrlq $32, %xmm6, %xmm10
; AVX2-SLOW-NEXT: vpclmulqdq $17, %xmm3, %xmm10, %xmm11
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm3, %xmm10, %xmm10
; AVX2-SLOW-NEXT: vpunpckldq {{.*#+}} xmm8 = xmm9[0],xmm8[0],xmm9[1],xmm8[1]
; AVX2-SLOW-NEXT: vpunpckldq {{.*#+}} xmm9 = xmm10[0],xmm11[0],xmm10[1],xmm11[1]
; AVX2-SLOW-NEXT: vpunpckldq {{.*#+}} xmm8 = xmm8[0],xmm9[0],xmm8[1],xmm9[1]
; AVX2-SLOW-NEXT: vpandn %xmm6, %xmm8, %xmm6
; AVX2-SLOW-NEXT: vpclmulqdq $17, %xmm2, %xmm6, %xmm9
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm2, %xmm6, %xmm2
; AVX2-SLOW-NEXT: vpsrlq $32, %xmm6, %xmm6
; AVX2-SLOW-NEXT: vpclmulqdq $17, %xmm3, %xmm6, %xmm10
; AVX2-SLOW-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm2[0],xmm9[0],xmm2[1],xmm9[1]
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm3, %xmm6, %xmm3
; AVX2-SLOW-NEXT: vpunpckldq {{.*#+}} xmm3 = xmm3[0],xmm10[0],xmm3[1],xmm10[1]
; AVX2-SLOW-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
; AVX2-SLOW-NEXT: vpand %xmm1, %xmm4, %xmm3
; AVX2-SLOW-NEXT: vpxor %xmm3, %xmm1, %xmm4
; AVX2-SLOW-NEXT: vpsrld $1, %xmm3, %xmm6
; AVX2-SLOW-NEXT: vpor %xmm6, %xmm4, %xmm4
; AVX2-SLOW-NEXT: vpand %xmm4, %xmm5, %xmm5
; AVX2-SLOW-NEXT: vpxor %xmm5, %xmm4, %xmm4
; AVX2-SLOW-NEXT: vpsrld $2, %xmm5, %xmm6
; AVX2-SLOW-NEXT: vpor %xmm6, %xmm4, %xmm4
; AVX2-SLOW-NEXT: vpand %xmm4, %xmm7, %xmm6
; AVX2-SLOW-NEXT: vpxor %xmm6, %xmm4, %xmm4
; AVX2-SLOW-NEXT: vpsrld $4, %xmm6, %xmm7
; AVX2-SLOW-NEXT: vpor %xmm7, %xmm4, %xmm4
; AVX2-SLOW-NEXT: vpand %xmm4, %xmm8, %xmm7
; AVX2-SLOW-NEXT: vpxor %xmm7, %xmm4, %xmm4
; AVX2-SLOW-NEXT: vpsrld $8, %xmm7, %xmm8
; AVX2-SLOW-NEXT: vpor %xmm4, %xmm8, %xmm4
; AVX2-SLOW-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpand %xmm3, %xmm0, %xmm1
; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpsrld $1, %xmm1, %xmm1
; AVX2-SLOW-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpand %xmm5, %xmm0, %xmm1
; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpsrld $2, %xmm1, %xmm1
; AVX2-SLOW-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpand %xmm6, %xmm0, %xmm1
; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpsrld $4, %xmm1, %xmm1
; AVX2-SLOW-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpand %xmm7, %xmm0, %xmm1
; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpsrld $8, %xmm1, %xmm1
; AVX2-SLOW-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpand %xmm4, %xmm0, %xmm1
; AVX2-SLOW-NEXT: vpand %xmm2, %xmm1, %xmm1
; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpsrld $16, %xmm1, %xmm1
; AVX2-SLOW-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: retq
;
; AVX512-LABEL: pext_v4i32:
; AVX512: # %bb.0:
; AVX512-NEXT: vpextrd $1, %xmm1, %eax
; AVX512-NEXT: vpextrd $1, %xmm0, %ecx
; AVX512-NEXT: pextl %eax, %ecx, %eax
; AVX512-NEXT: vmovd %xmm1, %ecx
; AVX512-NEXT: vmovd %xmm0, %edx
; AVX512-NEXT: pextl %ecx, %edx, %ecx
; AVX512-NEXT: vmovd %ecx, %xmm2
; AVX512-NEXT: vpinsrd $1, %eax, %xmm2, %xmm2
; AVX512-NEXT: vpextrd $2, %xmm1, %eax
; AVX512-NEXT: vpextrd $2, %xmm0, %ecx
; AVX512-NEXT: pextl %eax, %ecx, %eax
; AVX512-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2
; AVX512-NEXT: vpextrd $3, %xmm1, %eax
; AVX512-NEXT: vpextrd $3, %xmm0, %ecx
; AVX512-NEXT: pextl %eax, %ecx, %eax
; AVX512-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0
; AVX512-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 {
; SSE2-LABEL: pext_v2i64:
; SSE2: # %bb.0:
; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
; SSE2-NEXT: pxor %xmm1, %xmm3
; SSE2-NEXT: movdqa %xmm3, %xmm2
; SSE2-NEXT: psllq $2, %xmm2
; SSE2-NEXT: paddq %xmm3, %xmm3
; SSE2-NEXT: pxor %xmm3, %xmm2
; SSE2-NEXT: movdqa %xmm2, %xmm4
; SSE2-NEXT: psllq $2, %xmm4
; SSE2-NEXT: pxor %xmm2, %xmm4
; SSE2-NEXT: movdqa %xmm4, %xmm2
; SSE2-NEXT: psllq $4, %xmm2
; SSE2-NEXT: pxor %xmm4, %xmm2
; SSE2-NEXT: movdqa %xmm2, %xmm4
; SSE2-NEXT: psllq $8, %xmm4
; SSE2-NEXT: pxor %xmm2, %xmm4
; SSE2-NEXT: movdqa %xmm4, %xmm5
; SSE2-NEXT: psllq $16, %xmm5
; SSE2-NEXT: pxor %xmm4, %xmm5
; SSE2-NEXT: movdqa %xmm5, %xmm2
; SSE2-NEXT: psllq $32, %xmm2
; SSE2-NEXT: pxor %xmm5, %xmm2
; SSE2-NEXT: movdqa %xmm2, %xmm4
; SSE2-NEXT: pandn %xmm3, %xmm4
; SSE2-NEXT: movdqa %xmm4, %xmm3
; SSE2-NEXT: paddq %xmm3, %xmm3
; SSE2-NEXT: pxor %xmm4, %xmm3
; SSE2-NEXT: movdqa %xmm3, %xmm5
; SSE2-NEXT: psllq $2, %xmm5
; SSE2-NEXT: pxor %xmm3, %xmm5
; SSE2-NEXT: movdqa %xmm5, %xmm3
; SSE2-NEXT: psllq $4, %xmm3
; SSE2-NEXT: pxor %xmm5, %xmm3
; SSE2-NEXT: movdqa %xmm3, %xmm5
; SSE2-NEXT: psllq $8, %xmm5
; SSE2-NEXT: pxor %xmm3, %xmm5
; SSE2-NEXT: movdqa %xmm5, %xmm6
; SSE2-NEXT: psllq $16, %xmm6
; SSE2-NEXT: pxor %xmm5, %xmm6
; SSE2-NEXT: movdqa %xmm6, %xmm3
; SSE2-NEXT: psllq $32, %xmm3
; SSE2-NEXT: pxor %xmm6, %xmm3
; SSE2-NEXT: movdqa %xmm3, %xmm5
; SSE2-NEXT: pandn %xmm4, %xmm5
; SSE2-NEXT: movdqa %xmm5, %xmm4
; SSE2-NEXT: paddq %xmm4, %xmm4
; SSE2-NEXT: pxor %xmm5, %xmm4
; SSE2-NEXT: movdqa %xmm4, %xmm6
; SSE2-NEXT: psllq $2, %xmm6
; SSE2-NEXT: pxor %xmm4, %xmm6
; SSE2-NEXT: movdqa %xmm6, %xmm4
; SSE2-NEXT: psllq $4, %xmm4
; SSE2-NEXT: pxor %xmm6, %xmm4
; SSE2-NEXT: movdqa %xmm4, %xmm6
; SSE2-NEXT: psllq $8, %xmm6
; SSE2-NEXT: pxor %xmm4, %xmm6
; SSE2-NEXT: movdqa %xmm6, %xmm7
; SSE2-NEXT: psllq $16, %xmm7
; SSE2-NEXT: pxor %xmm6, %xmm7
; SSE2-NEXT: movdqa %xmm7, %xmm4
; SSE2-NEXT: psllq $32, %xmm4
; SSE2-NEXT: pxor %xmm7, %xmm4
; SSE2-NEXT: movdqa %xmm4, %xmm6
; SSE2-NEXT: pandn %xmm5, %xmm6
; SSE2-NEXT: movdqa %xmm6, %xmm5
; SSE2-NEXT: paddq %xmm5, %xmm5
; SSE2-NEXT: pxor %xmm6, %xmm5
; SSE2-NEXT: movdqa %xmm5, %xmm7
; SSE2-NEXT: psllq $2, %xmm7
; SSE2-NEXT: pxor %xmm5, %xmm7
; SSE2-NEXT: movdqa %xmm7, %xmm5
; SSE2-NEXT: psllq $4, %xmm5
; SSE2-NEXT: pxor %xmm7, %xmm5
; SSE2-NEXT: movdqa %xmm5, %xmm7
; SSE2-NEXT: psllq $8, %xmm7
; SSE2-NEXT: pxor %xmm5, %xmm7
; SSE2-NEXT: movdqa %xmm7, %xmm8
; SSE2-NEXT: psllq $16, %xmm8
; SSE2-NEXT: pxor %xmm7, %xmm8
; SSE2-NEXT: movdqa %xmm8, %xmm5
; SSE2-NEXT: psllq $32, %xmm5
; SSE2-NEXT: pxor %xmm8, %xmm5
; SSE2-NEXT: movdqa %xmm5, %xmm7
; SSE2-NEXT: pandn %xmm6, %xmm7
; SSE2-NEXT: movdqa %xmm7, %xmm6
; SSE2-NEXT: paddq %xmm6, %xmm6
; SSE2-NEXT: pxor %xmm7, %xmm6
; SSE2-NEXT: movdqa %xmm6, %xmm8
; SSE2-NEXT: psllq $2, %xmm8
; SSE2-NEXT: pxor %xmm6, %xmm8
; SSE2-NEXT: movdqa %xmm8, %xmm6
; SSE2-NEXT: psllq $4, %xmm6
; SSE2-NEXT: pxor %xmm8, %xmm6
; SSE2-NEXT: movdqa %xmm6, %xmm8
; SSE2-NEXT: psllq $8, %xmm8
; SSE2-NEXT: pxor %xmm6, %xmm8
; SSE2-NEXT: movdqa %xmm8, %xmm9
; SSE2-NEXT: psllq $16, %xmm9
; SSE2-NEXT: pxor %xmm8, %xmm9
; SSE2-NEXT: movdqa %xmm9, %xmm6
; SSE2-NEXT: psllq $32, %xmm6
; SSE2-NEXT: pxor %xmm9, %xmm6
; SSE2-NEXT: movdqa %xmm6, %xmm8
; SSE2-NEXT: pandn %xmm7, %xmm8
; SSE2-NEXT: movdqa %xmm8, %xmm7
; SSE2-NEXT: paddq %xmm7, %xmm7
; SSE2-NEXT: pxor %xmm8, %xmm7
; SSE2-NEXT: movdqa %xmm7, %xmm8
; SSE2-NEXT: psllq $2, %xmm8
; SSE2-NEXT: pxor %xmm7, %xmm8
; SSE2-NEXT: movdqa %xmm8, %xmm7
; SSE2-NEXT: psllq $4, %xmm7
; SSE2-NEXT: pxor %xmm8, %xmm7
; SSE2-NEXT: movdqa %xmm7, %xmm8
; SSE2-NEXT: psllq $8, %xmm8
; SSE2-NEXT: pxor %xmm7, %xmm8
; SSE2-NEXT: movdqa %xmm8, %xmm9
; SSE2-NEXT: psllq $16, %xmm9
; SSE2-NEXT: pxor %xmm8, %xmm9
; SSE2-NEXT: movdqa %xmm9, %xmm7
; SSE2-NEXT: psllq $32, %xmm7
; SSE2-NEXT: pxor %xmm9, %xmm7
; SSE2-NEXT: pand %xmm1, %xmm2
; SSE2-NEXT: pand %xmm1, %xmm0
; SSE2-NEXT: pxor %xmm2, %xmm1
; SSE2-NEXT: movdqa %xmm2, %xmm8
; SSE2-NEXT: psrlq $1, %xmm8
; SSE2-NEXT: por %xmm1, %xmm8
; SSE2-NEXT: pand %xmm8, %xmm3
; SSE2-NEXT: pxor %xmm3, %xmm8
; SSE2-NEXT: movdqa %xmm3, %xmm1
; SSE2-NEXT: psrlq $2, %xmm1
; SSE2-NEXT: por %xmm8, %xmm1
; SSE2-NEXT: pand %xmm1, %xmm4
; SSE2-NEXT: pxor %xmm4, %xmm1
; SSE2-NEXT: movdqa %xmm4, %xmm8
; SSE2-NEXT: psrlq $4, %xmm8
; SSE2-NEXT: por %xmm1, %xmm8
; SSE2-NEXT: pand %xmm8, %xmm5
; SSE2-NEXT: pxor %xmm5, %xmm8
; SSE2-NEXT: movdqa %xmm5, %xmm9
; SSE2-NEXT: psrlq $8, %xmm9
; SSE2-NEXT: por %xmm8, %xmm9
; SSE2-NEXT: pand %xmm9, %xmm6
; SSE2-NEXT: pxor %xmm6, %xmm9
; SSE2-NEXT: movdqa %xmm6, %xmm1
; SSE2-NEXT: psrlq $16, %xmm1
; SSE2-NEXT: por %xmm9, %xmm1
; SSE2-NEXT: pand %xmm0, %xmm2
; SSE2-NEXT: pxor %xmm2, %xmm0
; SSE2-NEXT: psrlq $1, %xmm2
; SSE2-NEXT: por %xmm2, %xmm0
; SSE2-NEXT: pand %xmm0, %xmm3
; SSE2-NEXT: pxor %xmm3, %xmm0
; SSE2-NEXT: psrlq $2, %xmm3
; SSE2-NEXT: por %xmm3, %xmm0
; SSE2-NEXT: pand %xmm0, %xmm4
; SSE2-NEXT: pxor %xmm4, %xmm0
; SSE2-NEXT: psrlq $4, %xmm4
; SSE2-NEXT: por %xmm4, %xmm0
; SSE2-NEXT: pand %xmm0, %xmm5
; SSE2-NEXT: pxor %xmm5, %xmm0
; SSE2-NEXT: psrlq $8, %xmm5
; SSE2-NEXT: por %xmm5, %xmm0
; SSE2-NEXT: pand %xmm0, %xmm6
; SSE2-NEXT: pxor %xmm6, %xmm0
; SSE2-NEXT: psrlq $16, %xmm6
; SSE2-NEXT: por %xmm6, %xmm0
; SSE2-NEXT: pand %xmm0, %xmm1
; SSE2-NEXT: pand %xmm7, %xmm1
; SSE2-NEXT: pxor %xmm1, %xmm0
; SSE2-NEXT: psrlq $32, %xmm1
; SSE2-NEXT: por %xmm1, %xmm0
; SSE2-NEXT: retq
;
; PCLMUL-LABEL: pext_v2i64:
; PCLMUL: # %bb.0:
; PCLMUL-NEXT: pcmpeqd %xmm5, %xmm5
; PCLMUL-NEXT: pxor %xmm1, %xmm5
; PCLMUL-NEXT: paddq %xmm5, %xmm5
; PCLMUL-NEXT: movq $-1, %rax
; PCLMUL-NEXT: movq %rax, %xmm2
; PCLMUL-NEXT: movdqa %xmm5, %xmm3
; PCLMUL-NEXT: pclmulqdq $1, %xmm2, %xmm3
; PCLMUL-NEXT: movdqa %xmm5, %xmm4
; PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm4
; PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm3[0]
; PCLMUL-NEXT: movdqa %xmm4, %xmm3
; PCLMUL-NEXT: pand %xmm1, %xmm3
; PCLMUL-NEXT: pand %xmm1, %xmm0
; PCLMUL-NEXT: pxor %xmm3, %xmm1
; PCLMUL-NEXT: movdqa %xmm3, %xmm7
; PCLMUL-NEXT: psrlq $1, %xmm7
; PCLMUL-NEXT: por %xmm1, %xmm7
; PCLMUL-NEXT: pandn %xmm5, %xmm4
; PCLMUL-NEXT: movdqa %xmm4, %xmm1
; PCLMUL-NEXT: pclmulqdq $1, %xmm2, %xmm1
; PCLMUL-NEXT: movdqa %xmm4, %xmm5
; PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm5
; PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm1[0]
; PCLMUL-NEXT: movdqa %xmm5, %xmm8
; PCLMUL-NEXT: pand %xmm7, %xmm8
; PCLMUL-NEXT: pxor %xmm8, %xmm7
; PCLMUL-NEXT: movdqa %xmm8, %xmm6
; PCLMUL-NEXT: psrlq $2, %xmm6
; PCLMUL-NEXT: por %xmm7, %xmm6
; PCLMUL-NEXT: pandn %xmm4, %xmm5
; PCLMUL-NEXT: movdqa %xmm5, %xmm4
; PCLMUL-NEXT: pclmulqdq $1, %xmm2, %xmm4
; PCLMUL-NEXT: movdqa %xmm5, %xmm1
; PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm1
; PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm4[0]
; PCLMUL-NEXT: movdqa %xmm1, %xmm4
; PCLMUL-NEXT: pand %xmm6, %xmm4
; PCLMUL-NEXT: pand %xmm0, %xmm3
; PCLMUL-NEXT: pxor %xmm3, %xmm0
; PCLMUL-NEXT: psrlq $1, %xmm3
; PCLMUL-NEXT: por %xmm3, %xmm0
; PCLMUL-NEXT: pand %xmm0, %xmm8
; PCLMUL-NEXT: pxor %xmm8, %xmm0
; PCLMUL-NEXT: psrlq $2, %xmm8
; PCLMUL-NEXT: por %xmm8, %xmm0
; PCLMUL-NEXT: movdqa %xmm0, %xmm3
; PCLMUL-NEXT: pand %xmm4, %xmm3
; PCLMUL-NEXT: pxor %xmm3, %xmm0
; PCLMUL-NEXT: psrlq $4, %xmm3
; PCLMUL-NEXT: por %xmm3, %xmm0
; PCLMUL-NEXT: pxor %xmm4, %xmm6
; PCLMUL-NEXT: psrlq $4, %xmm4
; PCLMUL-NEXT: por %xmm6, %xmm4
; PCLMUL-NEXT: pandn %xmm5, %xmm1
; PCLMUL-NEXT: movdqa %xmm1, %xmm5
; PCLMUL-NEXT: pclmulqdq $1, %xmm2, %xmm5
; PCLMUL-NEXT: movdqa %xmm1, %xmm3
; PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm3
; PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm5[0]
; PCLMUL-NEXT: movdqa %xmm3, %xmm5
; PCLMUL-NEXT: pand %xmm4, %xmm5
; PCLMUL-NEXT: movdqa %xmm0, %xmm6
; PCLMUL-NEXT: pand %xmm5, %xmm6
; PCLMUL-NEXT: pxor %xmm6, %xmm0
; PCLMUL-NEXT: psrlq $8, %xmm6
; PCLMUL-NEXT: por %xmm6, %xmm0
; PCLMUL-NEXT: pxor %xmm5, %xmm4
; PCLMUL-NEXT: psrlq $8, %xmm5
; PCLMUL-NEXT: por %xmm4, %xmm5
; PCLMUL-NEXT: pandn %xmm1, %xmm3
; PCLMUL-NEXT: movdqa %xmm3, %xmm1
; PCLMUL-NEXT: pclmulqdq $1, %xmm2, %xmm1
; PCLMUL-NEXT: movdqa %xmm3, %xmm4
; PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm4
; PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm1[0]
; PCLMUL-NEXT: movdqa %xmm4, %xmm1
; PCLMUL-NEXT: pand %xmm5, %xmm1
; PCLMUL-NEXT: movdqa %xmm0, %xmm6
; PCLMUL-NEXT: pand %xmm1, %xmm6
; PCLMUL-NEXT: pxor %xmm6, %xmm0
; PCLMUL-NEXT: psrlq $16, %xmm6
; PCLMUL-NEXT: por %xmm6, %xmm0
; PCLMUL-NEXT: pxor %xmm1, %xmm5
; PCLMUL-NEXT: psrlq $16, %xmm1
; PCLMUL-NEXT: por %xmm5, %xmm1
; PCLMUL-NEXT: pandn %xmm3, %xmm4
; PCLMUL-NEXT: movdqa %xmm4, %xmm3
; PCLMUL-NEXT: pclmulqdq $1, %xmm2, %xmm3
; PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm4
; PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm3[0]
; PCLMUL-NEXT: pand %xmm0, %xmm1
; PCLMUL-NEXT: pand %xmm4, %xmm1
; PCLMUL-NEXT: pxor %xmm1, %xmm0
; PCLMUL-NEXT: psrlq $32, %xmm1
; PCLMUL-NEXT: por %xmm1, %xmm0
; PCLMUL-NEXT: retq
;
; AVX2-FAST-LABEL: pext_v2i64:
; AVX2-FAST: # %bb.0:
; AVX2-FAST-NEXT: vpextrq $1, %xmm1, %rax
; AVX2-FAST-NEXT: vpextrq $1, %xmm0, %rcx
; AVX2-FAST-NEXT: pextq %rax, %rcx, %rax
; AVX2-FAST-NEXT: vmovq %rax, %xmm2
; AVX2-FAST-NEXT: vmovq %xmm1, %rax
; AVX2-FAST-NEXT: vmovq %xmm0, %rcx
; AVX2-FAST-NEXT: pextq %rax, %rcx, %rax
; AVX2-FAST-NEXT: vmovq %rax, %xmm0
; AVX2-FAST-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
; AVX2-FAST-NEXT: retq
;
; AVX2-SLOW-LABEL: pext_v2i64:
; AVX2-SLOW: # %bb.0:
; AVX2-SLOW-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
; AVX2-SLOW-NEXT: vpxor %xmm2, %xmm1, %xmm2
; AVX2-SLOW-NEXT: vpaddq %xmm2, %xmm2, %xmm3
; AVX2-SLOW-NEXT: movq $-1, %rax
; AVX2-SLOW-NEXT: vmovq %rax, %xmm2
; AVX2-SLOW-NEXT: vpclmulqdq $1, %xmm2, %xmm3, %xmm4
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm2, %xmm3, %xmm5
; AVX2-SLOW-NEXT: vpunpcklqdq {{.*#+}} xmm4 = xmm5[0],xmm4[0]
; AVX2-SLOW-NEXT: vpand %xmm1, %xmm4, %xmm5
; AVX2-SLOW-NEXT: vpxor %xmm5, %xmm1, %xmm6
; AVX2-SLOW-NEXT: vpandn %xmm3, %xmm4, %xmm3
; AVX2-SLOW-NEXT: vpclmulqdq $1, %xmm2, %xmm3, %xmm4
; AVX2-SLOW-NEXT: vpsrlq $1, %xmm5, %xmm7
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm2, %xmm3, %xmm8
; AVX2-SLOW-NEXT: vpor %xmm7, %xmm6, %xmm6
; AVX2-SLOW-NEXT: vpunpcklqdq {{.*#+}} xmm4 = xmm8[0],xmm4[0]
; AVX2-SLOW-NEXT: vpand %xmm6, %xmm4, %xmm7
; AVX2-SLOW-NEXT: vpxor %xmm7, %xmm6, %xmm6
; AVX2-SLOW-NEXT: vpandn %xmm3, %xmm4, %xmm3
; AVX2-SLOW-NEXT: vpclmulqdq $1, %xmm2, %xmm3, %xmm4
; AVX2-SLOW-NEXT: vpsrlq $2, %xmm7, %xmm8
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm2, %xmm3, %xmm9
; AVX2-SLOW-NEXT: vpor %xmm6, %xmm8, %xmm6
; AVX2-SLOW-NEXT: vpunpcklqdq {{.*#+}} xmm4 = xmm9[0],xmm4[0]
; AVX2-SLOW-NEXT: vpand %xmm6, %xmm4, %xmm8
; AVX2-SLOW-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpand %xmm5, %xmm0, %xmm1
; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpsrlq $1, %xmm1, %xmm1
; AVX2-SLOW-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpand %xmm7, %xmm0, %xmm1
; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpsrlq $2, %xmm1, %xmm1
; AVX2-SLOW-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpand %xmm0, %xmm8, %xmm1
; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpsrlq $4, %xmm1, %xmm1
; AVX2-SLOW-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpandn %xmm3, %xmm4, %xmm1
; AVX2-SLOW-NEXT: vpclmulqdq $1, %xmm2, %xmm1, %xmm3
; AVX2-SLOW-NEXT: vpxor %xmm6, %xmm8, %xmm4
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm2, %xmm1, %xmm5
; AVX2-SLOW-NEXT: vpsrlq $4, %xmm8, %xmm6
; AVX2-SLOW-NEXT: vpor %xmm6, %xmm4, %xmm4
; AVX2-SLOW-NEXT: vpunpcklqdq {{.*#+}} xmm3 = xmm5[0],xmm3[0]
; AVX2-SLOW-NEXT: vpand %xmm4, %xmm3, %xmm5
; AVX2-SLOW-NEXT: vpand %xmm5, %xmm0, %xmm6
; AVX2-SLOW-NEXT: vpxor %xmm6, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpsrlq $8, %xmm6, %xmm6
; AVX2-SLOW-NEXT: vpor %xmm6, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpandn %xmm1, %xmm3, %xmm1
; AVX2-SLOW-NEXT: vpclmulqdq $1, %xmm2, %xmm1, %xmm3
; AVX2-SLOW-NEXT: vpxor %xmm5, %xmm4, %xmm4
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm2, %xmm1, %xmm6
; AVX2-SLOW-NEXT: vpsrlq $8, %xmm5, %xmm5
; AVX2-SLOW-NEXT: vpor %xmm5, %xmm4, %xmm4
; AVX2-SLOW-NEXT: vpunpcklqdq {{.*#+}} xmm3 = xmm6[0],xmm3[0]
; AVX2-SLOW-NEXT: vpand %xmm4, %xmm3, %xmm5
; AVX2-SLOW-NEXT: vpand %xmm5, %xmm0, %xmm6
; AVX2-SLOW-NEXT: vpxor %xmm6, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpsrlq $16, %xmm6, %xmm6
; AVX2-SLOW-NEXT: vpor %xmm6, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpandn %xmm1, %xmm3, %xmm1
; AVX2-SLOW-NEXT: vpclmulqdq $1, %xmm2, %xmm1, %xmm3
; AVX2-SLOW-NEXT: vpxor %xmm5, %xmm4, %xmm4
; AVX2-SLOW-NEXT: vpclmulqdq $0, %xmm2, %xmm1, %xmm1
; AVX2-SLOW-NEXT: vpsrlq $16, %xmm5, %xmm2
; AVX2-SLOW-NEXT: vpor %xmm2, %xmm4, %xmm2
; AVX2-SLOW-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
; AVX2-SLOW-NEXT: vpand %xmm2, %xmm0, %xmm2
; AVX2-SLOW-NEXT: vpand %xmm1, %xmm2, %xmm1
; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: vpsrlq $32, %xmm1, %xmm1
; AVX2-SLOW-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-SLOW-NEXT: retq
;
; AVX512-LABEL: pext_v2i64:
; AVX512: # %bb.0:
; AVX512-NEXT: vpextrq $1, %xmm1, %rax
; AVX512-NEXT: vpextrq $1, %xmm0, %rcx
; AVX512-NEXT: pextq %rax, %rcx, %rax
; AVX512-NEXT: vmovq %rax, %xmm2
; AVX512-NEXT: vmovq %xmm1, %rax
; AVX512-NEXT: vmovq %xmm0, %rcx
; AVX512-NEXT: pextq %rax, %rcx, %rax
; AVX512-NEXT: vmovq %rax, %xmm0
; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
; AVX512-NEXT: retq
%res = call <2 x i64> @llvm.pext.v2i64(<2 x i64> %val, <2 x i64> %mask)
ret <2 x i64> %res
}