| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 |
| ; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64 | FileCheck %s --check-prefixes=SSE2 |
| ; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=SSE42 |
| ; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=AVX2 |
| ; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=AVX512 |
| |
| define <32 x i8> @PR162812(<32 x i8> %a, <32 x i8> %mask) { |
| ; SSE2-LABEL: PR162812: |
| ; SSE2: # %bb.0: |
| ; SSE2-NEXT: psrlw $2, %xmm2 |
| ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [8224,8224,8224,8224,8224,8224,8224,8224] |
| ; SSE2-NEXT: pand %xmm4, %xmm2 |
| ; SSE2-NEXT: paddb %xmm2, %xmm2 |
| ; SSE2-NEXT: paddb %xmm2, %xmm2 |
| ; SSE2-NEXT: pxor %xmm5, %xmm5 |
| ; SSE2-NEXT: pxor %xmm6, %xmm6 |
| ; SSE2-NEXT: pcmpgtb %xmm2, %xmm6 |
| ; SSE2-NEXT: movdqa %xmm6, %xmm2 |
| ; SSE2-NEXT: pandn %xmm0, %xmm2 |
| ; SSE2-NEXT: paddb %xmm0, %xmm0 |
| ; SSE2-NEXT: pand %xmm6, %xmm0 |
| ; SSE2-NEXT: por %xmm2, %xmm0 |
| ; SSE2-NEXT: psrlw $2, %xmm3 |
| ; SSE2-NEXT: pand %xmm4, %xmm3 |
| ; SSE2-NEXT: paddb %xmm3, %xmm3 |
| ; SSE2-NEXT: paddb %xmm3, %xmm3 |
| ; SSE2-NEXT: pcmpgtb %xmm3, %xmm5 |
| ; SSE2-NEXT: movdqa %xmm5, %xmm2 |
| ; SSE2-NEXT: pandn %xmm1, %xmm2 |
| ; SSE2-NEXT: paddb %xmm1, %xmm1 |
| ; SSE2-NEXT: pand %xmm5, %xmm1 |
| ; SSE2-NEXT: por %xmm2, %xmm1 |
| ; SSE2-NEXT: retq |
| ; |
| ; SSE42-LABEL: PR162812: |
| ; SSE42: # %bb.0: |
| ; SSE42-NEXT: movdqa %xmm0, %xmm4 |
| ; SSE42-NEXT: psrlw $2, %xmm2 |
| ; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [8224,8224,8224,8224,8224,8224,8224,8224] |
| ; SSE42-NEXT: pand %xmm5, %xmm2 |
| ; SSE42-NEXT: paddb %xmm2, %xmm2 |
| ; SSE42-NEXT: paddb %xmm2, %xmm2 |
| ; SSE42-NEXT: movdqa %xmm0, %xmm6 |
| ; SSE42-NEXT: paddb %xmm0, %xmm6 |
| ; SSE42-NEXT: movdqa %xmm2, %xmm0 |
| ; SSE42-NEXT: pblendvb %xmm0, %xmm6, %xmm4 |
| ; SSE42-NEXT: psrlw $2, %xmm3 |
| ; SSE42-NEXT: pand %xmm3, %xmm5 |
| ; SSE42-NEXT: paddb %xmm5, %xmm5 |
| ; SSE42-NEXT: paddb %xmm5, %xmm5 |
| ; SSE42-NEXT: movdqa %xmm1, %xmm2 |
| ; SSE42-NEXT: paddb %xmm1, %xmm2 |
| ; SSE42-NEXT: movdqa %xmm5, %xmm0 |
| ; SSE42-NEXT: pblendvb %xmm0, %xmm2, %xmm1 |
| ; SSE42-NEXT: movdqa %xmm4, %xmm0 |
| ; SSE42-NEXT: retq |
| ; |
| ; AVX2-LABEL: PR162812: |
| ; AVX2: # %bb.0: |
| ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2 |
| ; AVX2-NEXT: vpsrlw $2, %ymm1, %ymm1 |
| ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 |
| ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1 |
| ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1 |
| ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 |
| ; AVX2-NEXT: retq |
| ; |
| ; AVX512-LABEL: PR162812: |
| ; AVX512: # %bb.0: |
| ; AVX512-NEXT: vpaddb %ymm0, %ymm0, %ymm2 |
| ; AVX512-NEXT: vpsrlw $2, %ymm1, %ymm1 |
| ; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1 |
| ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1 |
| ; AVX512-NEXT: vpaddb %ymm1, %ymm1, %ymm1 |
| ; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0 |
| ; AVX512-NEXT: retq |
| %1 = lshr <32 x i8> %mask, splat (i8 7) |
| %ret = shl <32 x i8> %a, %1 |
| ret <32 x i8> %ret |
| } |