| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: llc -mtriple=x86_64-unknown-unknown -O2 -mcpu=skylake-avx512 < %s -o - | FileCheck %s --check-prefixes=X64 |
| |
| define <16 x i8> @interleave_masked_select(ptr %mask, ptr %src) nounwind { |
| ; X64-LABEL: interleave_masked_select: |
| ; X64: # %bb.0: |
| ; X64-NEXT: kmovw (%rdi), %k1 |
| ; X64-NEXT: vpxor %xmm0, %xmm0, %xmm0 |
| ; X64-NEXT: vpunpcklbw {{.*#+}} xmm0 {%k1} {z} = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3],xmm0[4],mem[4],xmm0[5],mem[5],xmm0[6],mem[6],xmm0[7],mem[7] |
| ; X64-NEXT: retq |
| %mask_vec = load <16 x i1>, ptr %mask |
| %vec2 = load <16 x i8>, ptr %src |
| %selected = select <16 x i1> %mask_vec, <16 x i8> %vec2, <16 x i8> splat (i8 1) |
| %interleaved = shufflevector <16 x i8> zeroinitializer, <16 x i8> %selected, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> |
| %masked = select <16 x i1> %mask_vec, <16 x i8> %interleaved, <16 x i8> zeroinitializer |
| ret <16 x i8> %masked |
| } |
| |
| define <16 x i1> @interleave_masked_blend(i16 %mask, ptr %src1, ptr %src2) nounwind { |
| ; X64-LABEL: interleave_masked_blend: |
| ; X64: # %bb.0: |
| ; X64-NEXT: vmovdqa (%rsi), %xmm0 |
| ; X64-NEXT: kmovd %edi, %k1 |
| ; X64-NEXT: vpxor %xmm1, %xmm1, %xmm1 |
| ; X64-NEXT: vpunpcklbw {{.*#+}} xmm2 {%k1} {z} = xmm1[0],mem[0],xmm1[1],mem[1],xmm1[2],mem[2],xmm1[3],mem[3],xmm1[4],mem[4],xmm1[5],mem[5],xmm1[6],mem[6],xmm1[7],mem[7] |
| ; X64-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] |
| ; X64-NEXT: vpcmpeqb %xmm0, %xmm2, %xmm0 |
| ; X64-NEXT: retq |
| %mask_vec = bitcast i16 %mask to <16 x i1> |
| %vec1 = load <16 x i8>, ptr %src1 |
| %vec2 = load <16 x i8>, ptr %src2 |
| %blended = select <16 x i1> %mask_vec, <16 x i8> %vec2, <16 x i8> %vec1 |
| %interleaved1 = shufflevector <16 x i8> zeroinitializer, <16 x i8> %blended, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> |
| %masked = select <16 x i1> %mask_vec, <16 x i8> %interleaved1, <16 x i8> zeroinitializer |
| %interleaved2 = shufflevector <16 x i8> zeroinitializer, <16 x i8> %vec1, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> |
| %cmp = icmp eq <16 x i8> %masked, %interleaved2 |
| ret <16 x i1> %cmp |
| } |