Index: lib/Target/X86/InstPrinter/X86InstComments.cpp =================================================================== --- lib/Target/X86/InstPrinter/X86InstComments.cpp +++ lib/Target/X86/InstPrinter/X86InstComments.cpp @@ -199,6 +199,44 @@ DecodeMOVSHDUPMask(MVT::v4f32, ShuffleMask); break; + case X86::PSLLDQri: + case X86::VPSLLDQri: + Src1Name = getRegName(MI->getOperand(1).getReg()); + DestName = getRegName(MI->getOperand(0).getReg()); + if(MI->getOperand(MI->getNumOperands()-1).isImm()) + DecodePSLLDQMask(MVT(MVT::v16i8).getSizeInBits(), + MI->getOperand(MI->getNumOperands()-1).getImm(), + ShuffleMask); + break; + + case X86::VPSLLDQYri: + Src1Name = getRegName(MI->getOperand(1).getReg()); + DestName = getRegName(MI->getOperand(0).getReg()); + if(MI->getOperand(MI->getNumOperands()-1).isImm()) + DecodePSLLDQMask(MVT(MVT::v32i8).getSizeInBits(), + MI->getOperand(MI->getNumOperands()-1).getImm(), + ShuffleMask); + break; + + case X86::PSRLDQri: + case X86::VPSRLDQri: + Src1Name = getRegName(MI->getOperand(1).getReg()); + DestName = getRegName(MI->getOperand(0).getReg()); + if(MI->getOperand(MI->getNumOperands()-1).isImm()) + DecodePSRLDQMask(MVT(MVT::v16i8).getSizeInBits(), + MI->getOperand(MI->getNumOperands()-1).getImm(), + ShuffleMask); + break; + + case X86::VPSRLDQYri: + Src1Name = getRegName(MI->getOperand(1).getReg()); + DestName = getRegName(MI->getOperand(0).getReg()); + if(MI->getOperand(MI->getNumOperands()-1).isImm()) + DecodePSRLDQMask(MVT(MVT::v32i8).getSizeInBits(), + MI->getOperand(MI->getNumOperands()-1).getImm(), + ShuffleMask); + break; + case X86::PALIGNR128rr: case X86::VPALIGNR128rr: Src1Name = getRegName(MI->getOperand(2).getReg()); Index: lib/Target/X86/Utils/X86ShuffleDecode.h =================================================================== --- lib/Target/X86/Utils/X86ShuffleDecode.h +++ lib/Target/X86/Utils/X86ShuffleDecode.h @@ -40,6 +40,10 @@ void DecodeMOVSHDUPMask(MVT VT, SmallVectorImpl &ShuffleMask); +void DecodePSLLDQMask(unsigned VectorSizeInBits, unsigned Imm, SmallVectorImpl &ShuffleMask); + +void DecodePSRLDQMask(unsigned VectorSizeInBits, unsigned Imm, SmallVectorImpl &ShuffleMask); + void DecodePALIGNRMask(MVT VT, unsigned Imm, SmallVectorImpl &ShuffleMask); void DecodePSHUFMask(MVT VT, unsigned Imm, SmallVectorImpl &ShuffleMask); Index: lib/Target/X86/Utils/X86ShuffleDecode.cpp =================================================================== --- lib/Target/X86/Utils/X86ShuffleDecode.cpp +++ lib/Target/X86/Utils/X86ShuffleDecode.cpp @@ -79,6 +79,35 @@ } } +void DecodePSLLDQMask(unsigned VectorSizeInBits, unsigned Imm, SmallVectorImpl &ShuffleMask) { + unsigned NumElts = VectorSizeInBits / 8; + unsigned NumLanes = VectorSizeInBits / 128; + unsigned NumLaneElts = NumElts / NumLanes; + + for (unsigned l = 0; l != NumElts; l += NumLaneElts) { + for (unsigned i = 0; i != NumLaneElts; ++i) { + int M = SM_SentinelZero; + if (i >= Imm) M = i - Imm + l; + ShuffleMask.push_back(M); + } + } +} + +void DecodePSRLDQMask(unsigned VectorSizeInBits, unsigned Imm, SmallVectorImpl &ShuffleMask) { + unsigned NumElts = VectorSizeInBits / 8; + unsigned NumLanes = VectorSizeInBits / 128; + unsigned NumLaneElts = NumElts / NumLanes; + + for (unsigned l = 0; l != NumElts; l += NumLaneElts) { + for (unsigned i = 0; i != NumLaneElts; ++i) { + unsigned Base = i + Imm; + int M = Base + l; + if (Base >= NumLaneElts) M = SM_SentinelZero; + ShuffleMask.push_back(M); + } + } +} + void DecodePALIGNRMask(MVT VT, unsigned Imm, SmallVectorImpl &ShuffleMask) { unsigned NumElts = VT.getVectorNumElements(); Index: test/CodeGen/X86/vector-shuffle-128-v8.ll =================================================================== --- test/CodeGen/X86/vector-shuffle-128-v8.ll +++ test/CodeGen/X86/vector-shuffle-128-v8.ll @@ -1400,7 +1400,7 @@ ; SSE: # BB#0: ; SSE-NEXT: movzwl %di, %eax ; SSE-NEXT: movd %eax, %xmm0 -; SSE-NEXT: pslldq $2, %xmm0 +; SSE-NEXT: pslldq $2, %xmm0 {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13] ; SSE-NEXT: retq ; ; AVX-LABEL: shuffle_v8i16_z8zzzzzz: @@ -1407,7 +1407,7 @@ ; AVX: # BB#0: ; AVX-NEXT: movzwl %di, %eax ; AVX-NEXT: vmovd %eax, %xmm0 -; AVX-NEXT: vpslldq $2, %xmm0, %xmm0 +; AVX-NEXT: vpslldq $2, %xmm0, %xmm0 {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13] ; AVX-NEXT: retq %a = insertelement <8 x i16> undef, i16 %i, i32 0 %shuffle = shufflevector <8 x i16> zeroinitializer, <8 x i16> %a, <8 x i32> @@ -1419,7 +1419,7 @@ ; SSE: # BB#0: ; SSE-NEXT: movzwl %di, %eax ; SSE-NEXT: movd %eax, %xmm0 -; SSE-NEXT: pslldq $10, %xmm0 +; SSE-NEXT: pslldq $10, %xmm0 {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5] ; SSE-NEXT: retq ; ; AVX-LABEL: shuffle_v8i16_zzzzz8zz: @@ -1426,7 +1426,7 @@ ; AVX: # BB#0: ; AVX-NEXT: movzwl %di, %eax ; AVX-NEXT: vmovd %eax, %xmm0 -; AVX-NEXT: vpslldq $10, %xmm0, %xmm0 +; AVX-NEXT: vpslldq $10, %xmm0, %xmm0 {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5] ; AVX-NEXT: retq %a = insertelement <8 x i16> undef, i16 %i, i32 0 %shuffle = shufflevector <8 x i16> zeroinitializer, <8 x i16> %a, <8 x i32> @@ -1438,7 +1438,7 @@ ; SSE: # BB#0: ; SSE-NEXT: movzwl %di, %eax ; SSE-NEXT: movd %eax, %xmm0 -; SSE-NEXT: pslldq $14, %xmm0 +; SSE-NEXT: pslldq $14, %xmm0 {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1] ; SSE-NEXT: retq ; ; AVX-LABEL: shuffle_v8i16_zuuzuuz8: @@ -1445,7 +1445,7 @@ ; AVX: # BB#0: ; AVX-NEXT: movzwl %di, %eax ; AVX-NEXT: vmovd %eax, %xmm0 -; AVX-NEXT: vpslldq $14, %xmm0, %xmm0 +; AVX-NEXT: vpslldq $14, %xmm0, %xmm0 {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1] ; AVX-NEXT: retq %a = insertelement <8 x i16> undef, i16 %i, i32 0 %shuffle = shufflevector <8 x i16> zeroinitializer, <8 x i16> %a, <8 x i32> @@ -1457,7 +1457,7 @@ ; SSE: # BB#0: ; SSE-NEXT: movzwl %di, %eax ; SSE-NEXT: movd %eax, %xmm0 -; SSE-NEXT: pslldq $4, %xmm0 +; SSE-NEXT: pslldq $4, %xmm0 {{.*#+}} xmm0 = zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11] ; SSE-NEXT: retq ; ; AVX-LABEL: shuffle_v8i16_zzBzzzzz: @@ -1464,7 +1464,7 @@ ; AVX: # BB#0: ; AVX-NEXT: movzwl %di, %eax ; AVX-NEXT: vmovd %eax, %xmm0 -; AVX-NEXT: vpslldq $4, %xmm0, %xmm0 +; AVX-NEXT: vpslldq $4, %xmm0, %xmm0 {{.*#+}} xmm0 = zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11] ; AVX-NEXT: retq %a = insertelement <8 x i16> undef, i16 %i, i32 3 %shuffle = shufflevector <8 x i16> zeroinitializer, <8 x i16> %a, <8 x i32>