| ; 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 |
| } |
| |