Index: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -275,6 +275,7 @@ SDValue visitSIGN_EXTEND(SDNode *N); SDValue visitZERO_EXTEND(SDNode *N); SDValue visitANY_EXTEND(SDNode *N); + SDValue visitAssertZext(SDNode *N); SDValue visitSIGN_EXTEND_INREG(SDNode *N); SDValue visitSIGN_EXTEND_VECTOR_INREG(SDNode *N); SDValue visitZERO_EXTEND_VECTOR_INREG(SDNode *N); @@ -1438,6 +1439,7 @@ case ISD::SIGN_EXTEND: return visitSIGN_EXTEND(N); case ISD::ZERO_EXTEND: return visitZERO_EXTEND(N); case ISD::ANY_EXTEND: return visitANY_EXTEND(N); + case ISD::AssertZext: return visitAssertZext(N); case ISD::SIGN_EXTEND_INREG: return visitSIGN_EXTEND_INREG(N); case ISD::SIGN_EXTEND_VECTOR_INREG: return visitSIGN_EXTEND_VECTOR_INREG(N); case ISD::ZERO_EXTEND_VECTOR_INREG: return visitZERO_EXTEND_VECTOR_INREG(N); @@ -7303,6 +7305,19 @@ return SDValue(); } +SDValue DAGCombiner::visitAssertZext(SDNode *N) { + SDValue N0 = N->getOperand(0); + SDValue N1 = N->getOperand(1); + EVT EVT = cast(N1)->getVT(); + + // fold (assertzext (assertzext x, vt), vt) -> (assertzext x, vt) + if (N0.getOpcode() == ISD::AssertZext && + EVT == cast(N0.getOperand(1))->getVT()) + return N0; + + return SDValue(); +} + /// See if the specified operand can be simplified with the knowledge that only /// the bits specified by Mask are used. If so, return the simpler operand, /// otherwise return a null SDValue. Index: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp =================================================================== --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp @@ -28884,6 +28884,87 @@ Extract->getOperand(1)); } +// Attempt to peek through a target shuffle and extract the scalar from the +// source. +static SDValue combineExtractWithShuffle(SDNode *N, SelectionDAG &DAG, + TargetLowering::DAGCombinerInfo &DCI, + const X86Subtarget &Subtarget) { + if (DCI.isBeforeLegalizeOps()) + return SDValue(); + + SDValue Src = N->getOperand(0); + SDValue Idx = N->getOperand(1); + + EVT SrcVT = Src.getValueType(); + EVT SrcSVT = SrcVT.getVectorElementType(); + EVT VT = N->getValueType(0); + + // Don't attempt this for boolean mask vectors or unknown extraction indices. + if (SrcSVT == MVT::i1 || !isa(Idx)) + return SDValue(); + + // Resolve the target shuffle inputs and mask. + SmallVector Mask; + SmallVector Ops; + if (!resolveTargetShuffleInputs(peekThroughBitcasts(Src), Ops, Mask)) + return SDValue(); + + // At the moment we can only narrow a shuffle mask to handle extractions + // of smaller scalars. + // TODO - investigate support for wider shuffle masks with known upper + // undef/zero elements for implicit zero-extension. + unsigned NumMaskElts = Mask.size(); + if ((SrcVT.getVectorNumElements() % NumMaskElts) != 0) + return SDValue(); + + int Scale = SrcVT.getVectorNumElements() / NumMaskElts; + if (Scale != 1) { + SmallVector ScaledMask; + scaleShuffleMask(Scale, Mask, ScaledMask); + Mask = ScaledMask; + } + + int SrcIdx = Mask[N->getConstantOperandVal(1)]; + SDLoc dl(N); + + // If the shuffle source element is undef/zero then we can just accept it. + if (SrcIdx == SM_SentinelUndef) + return DAG.getUNDEF(VT); + + if (SrcIdx == SM_SentinelZero) + return VT.isFloatingPoint() ? DAG.getConstantFP(0.0, dl, VT) + : DAG.getConstant(0, dl, VT); + + SDValue SrcOp = Ops[SrcIdx / Mask.size()]; + SrcOp = DAG.getBitcast(SrcVT, SrcOp); + SrcIdx = SrcIdx % Mask.size(); + + // We can only extract other elements from 128-bit vectors and in certain + // circumstances, depending on SSE-level. + // TODO: Investigate using extract_subvector for larger vectors. + // TODO: Investigate float/double extraction if it will be just stored. + if ((SrcVT == MVT::v4i32 || SrcVT == MVT::v2i64) && + ((SrcIdx == 0 && Subtarget.hasSSE2()) || Subtarget.hasSSE41())) { + assert(SrcSVT == VT && "Unexpected extraction type"); + return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, SrcSVT, SrcOp, + DAG.getIntPtrConstant(SrcIdx, dl)); + } + + if ((SrcVT == MVT::v8i16 && Subtarget.hasSSE2()) || + (SrcVT == MVT::v16i8 && Subtarget.hasSSE41())) { + assert(VT.getSizeInBits() >= SrcSVT.getSizeInBits() && + "Unexpected extraction type"); + unsigned OpCode = (SrcVT == MVT::v8i16 ? X86ISD::PEXTRW : X86ISD::PEXTRB); + SDValue ExtOp = DAG.getNode(OpCode, dl, MVT::i32, SrcOp, + DAG.getIntPtrConstant(SrcIdx, dl)); + SDValue Assert = DAG.getNode(ISD::AssertZext, dl, MVT::i32, ExtOp, + DAG.getValueType(SrcSVT)); + return DAG.getZExtOrTrunc(Assert, dl, VT); + } + + return SDValue(); +} + /// Detect vector gather/scatter index generation and convert it from being a /// bunch of shuffles and extracts into a somewhat faster sequence. /// For i686, the best sequence is apparently storing the value and loading @@ -28894,6 +28975,9 @@ if (SDValue NewOp = XFormVExtractWithShuffleIntoLoad(N, DAG, DCI)) return NewOp; + if (SDValue NewOp = combineExtractWithShuffle(N, DAG, DCI, Subtarget)) + return NewOp; + SDValue InputVector = N->getOperand(0); SDValue EltIdx = N->getOperand(1); @@ -29028,6 +29112,16 @@ return SDValue(); } +// TODO - merge with combineExtractVectorElt once it can handle the implicit +// zero-extension of X86ISD::PINSRW/X86ISD::PINSRB in: +// XFormVExtractWithShuffleIntoLoad, combineHorizontalPredicateResult and +// combineBasicSADPattern. +static SDValue combineExtractVectorElt_SSE(SDNode *N, SelectionDAG &DAG, + TargetLowering::DAGCombinerInfo &DCI, + const X86Subtarget &Subtarget) { + return combineExtractWithShuffle(N, DAG, DCI, Subtarget); +} + /// If a vector select has an operand that is -1 or 0, try to simplify the /// select to a bitwise logic operation. static SDValue @@ -34368,6 +34462,9 @@ default: break; case ISD::EXTRACT_VECTOR_ELT: return combineExtractVectorElt(N, DAG, DCI, Subtarget); + case X86ISD::PEXTRW: + case X86ISD::PEXTRB: + return combineExtractVectorElt_SSE(N, DAG, DCI, Subtarget); case ISD::INSERT_SUBVECTOR: return combineInsertSubvector(N, DAG, DCI, Subtarget); case ISD::VSELECT: Index: llvm/trunk/test/CodeGen/X86/2011-12-8-bitcastintprom.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/2011-12-8-bitcastintprom.ll +++ llvm/trunk/test/CodeGen/X86/2011-12-8-bitcastintprom.ll @@ -18,7 +18,6 @@ ; SSE41-LABEL: prom_bug: ; SSE41: ## BB#0: ; SSE41-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] -; SSE41-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero ; SSE41-NEXT: pextrw $0, %xmm0, (%rdi) ; SSE41-NEXT: retq %r = bitcast <4 x i8> %t to <2 x i16> Index: llvm/trunk/test/CodeGen/X86/dagcombine-cse.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/dagcombine-cse.ll +++ llvm/trunk/test/CodeGen/X86/dagcombine-cse.ll @@ -13,9 +13,7 @@ ; X32-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero ; X32-NEXT: movd %edx, %xmm1 ; X32-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] -; X32-NEXT: pxor %xmm1, %xmm1 ; X32-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,1,2,4,5,6,7] -; X32-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] ; X32-NEXT: movd %xmm0, %eax ; X32-NEXT: retl ; Index: llvm/trunk/test/CodeGen/X86/oddshuffles.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/oddshuffles.ll +++ llvm/trunk/test/CodeGen/X86/oddshuffles.ll @@ -244,40 +244,34 @@ ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255] ; SSE2-NEXT: pand %xmm2, %xmm0 ; SSE2-NEXT: packuswb %xmm0, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,1,3] -; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] ; SSE2-NEXT: movdqa %xmm2, -{{[0-9]+}}(%rsp) ; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al ; SSE2-NEXT: movb %al, 6(%rdi) -; SSE2-NEXT: movd %xmm1, (%rdi) -; SSE2-NEXT: pextrw $4, %xmm0, %eax +; SSE2-NEXT: movd %xmm0, (%rdi) +; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movw %ax, 4(%rdi) ; SSE2-NEXT: retq ; ; SSE42-LABEL: v7i8: ; SSE42: # BB#0: ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,3,1,3] +; SSE42-NEXT: pextrb $0, %xmm1, 6(%rdi) ; SSE42-NEXT: pshufb {{.*#+}} xmm1 = xmm1[8,9,8,9,4,5,8,9,0,1,12,13,0,1,14,15] ; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5,6,7] -; SSE42-NEXT: pextrb $12, %xmm1, 6(%rdi) ; SSE42-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] -; SSE42-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero -; SSE42-NEXT: pmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero -; SSE42-NEXT: pextrw $4, %xmm1, 4(%rdi) -; SSE42-NEXT: movd %xmm0, (%rdi) +; SSE42-NEXT: pextrw $2, %xmm1, 4(%rdi) +; SSE42-NEXT: movd %xmm1, (%rdi) ; SSE42-NEXT: retq ; ; AVX-LABEL: v7i8: ; AVX: # BB#0: ; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,3,1,3] -; AVX-NEXT: vpshufb {{.*#+}} xmm1 = xmm1[8,9,8,9,4,5,8,9,0,1,12,13,0,1,14,15] -; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5,6,7] -; AVX-NEXT: vpshufb {{.*#+}} xmm1 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] -; AVX-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero -; AVX-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero -; AVX-NEXT: vpextrb $12, %xmm0, 6(%rdi) -; AVX-NEXT: vpextrw $4, %xmm1, 4(%rdi) -; AVX-NEXT: vmovd %xmm2, (%rdi) +; AVX-NEXT: vpshufb {{.*#+}} xmm2 = xmm1[8,9,8,9,4,5,8,9,0,1,12,13,0,1,14,15] +; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5,6,7] +; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] +; AVX-NEXT: vpextrb $0, %xmm1, 6(%rdi) +; AVX-NEXT: vpextrw $2, %xmm0, 4(%rdi) +; AVX-NEXT: vmovd %xmm0, (%rdi) ; AVX-NEXT: retq %r = shufflevector <4 x i8> %a, <4 x i8> %b, <7 x i32> store <7 x i8> %r, <7 x i8>* %p Index: llvm/trunk/test/CodeGen/X86/promote-vec3.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/promote-vec3.ll +++ llvm/trunk/test/CodeGen/X86/promote-vec3.ll @@ -15,10 +15,10 @@ ; SSE3-NEXT: movzbl {{[0-9]+}}(%esp), %eax ; SSE3-NEXT: pinsrw $2, %eax, %xmm0 ; SSE3-NEXT: pxor %xmm1, %xmm1 +; SSE3-NEXT: pextrw $1, %xmm0, %edx +; SSE3-NEXT: pextrw $2, %xmm0, %ecx ; SSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] ; SSE3-NEXT: movd %xmm0, %eax -; SSE3-NEXT: pextrw $2, %xmm0, %edx -; SSE3-NEXT: pextrw $4, %xmm0, %ecx ; SSE3-NEXT: # kill: %AX %AX %EAX ; SSE3-NEXT: # kill: %DX %DX %EDX ; SSE3-NEXT: # kill: %CX %CX %ECX Index: llvm/trunk/test/CodeGen/X86/vec_extract-mmx.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/vec_extract-mmx.ll +++ llvm/trunk/test/CodeGen/X86/vec_extract-mmx.ll @@ -16,9 +16,7 @@ ; X32-NEXT: movl %ecx, (%esp) ; X32-NEXT: pshufw $238, (%esp), %mm0 # mm0 = mem[2,3,2,3] ; X32-NEXT: movq %mm0, {{[0-9]+}}(%esp) -; X32-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero -; X32-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1,1,3] -; X32-NEXT: movd %xmm0, %eax +; X32-NEXT: movl {{[0-9]+}}(%esp), %eax ; X32-NEXT: addl $32, %eax ; X32-NEXT: movl %ebp, %esp ; X32-NEXT: popl %ebp @@ -55,9 +53,7 @@ ; X32-NEXT: movd (%eax), %mm0 ; X32-NEXT: pshufw $232, %mm0, %mm0 # mm0 = mm0[0,2,2,3] ; X32-NEXT: movq %mm0, (%esp) -; X32-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero -; X32-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1,1,3] -; X32-NEXT: movd %xmm0, %eax +; X32-NEXT: movl (%esp), %eax ; X32-NEXT: emms ; X32-NEXT: movl %ebp, %esp ; X32-NEXT: popl %ebp @@ -98,9 +94,7 @@ ; X32-NEXT: movl 8(%ebp), %eax ; X32-NEXT: pshufw $232, (%eax), %mm0 # mm0 = mem[0,2,2,3] ; X32-NEXT: movq %mm0, (%esp) -; X32-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero -; X32-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1,1,3] -; X32-NEXT: movd %xmm0, %eax +; X32-NEXT: movl (%esp), %eax ; X32-NEXT: emms ; X32-NEXT: movl %ebp, %esp ; X32-NEXT: popl %ebp Index: llvm/trunk/test/CodeGen/X86/vec_shift7.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/vec_shift7.ll +++ llvm/trunk/test/CodeGen/X86/vec_shift7.ll @@ -10,17 +10,14 @@ ; X32-NEXT: movdqa %xmm0, %xmm1 ; X32-NEXT: psllq $2, %xmm1 ; X32-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] -; X32-NEXT: movd %xmm1, %eax -; X32-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] -; X32-NEXT: movd %xmm0, %edx +; X32-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,2,3] +; X32-NEXT: movd %xmm1, %edx +; X32-NEXT: movd %xmm0, %eax ; X32-NEXT: retl ; ; X64-LABEL: test1: ; X64: # BB#0: # %entry -; X64-NEXT: movdqa %xmm0, %xmm1 -; X64-NEXT: psllq $2, %xmm1 -; X64-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] -; X64-NEXT: movd %xmm1, %rax +; X64-NEXT: movd %xmm0, %rax ; X64-NEXT: retq entry: %c = shl <2 x i64> %a, Index: llvm/trunk/test/CodeGen/X86/vector-compare-results.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/vector-compare-results.ll +++ llvm/trunk/test/CodeGen/X86/vector-compare-results.ll @@ -980,108 +980,101 @@ ; ; SSE42-LABEL: test_cmp_v32i16: ; SSE42: # BB#0: -; SSE42-NEXT: pcmpgtw %xmm5, %xmm1 -; SSE42-NEXT: movdqa {{.*#+}} xmm5 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> -; SSE42-NEXT: pshufb %xmm5, %xmm1 ; SSE42-NEXT: pcmpgtw %xmm4, %xmm0 -; SSE42-NEXT: pshufb %xmm5, %xmm0 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] -; SSE42-NEXT: pcmpgtw %xmm7, %xmm3 -; SSE42-NEXT: pshufb %xmm5, %xmm3 +; SSE42-NEXT: pcmpgtw %xmm5, %xmm1 ; SSE42-NEXT: pcmpgtw %xmm6, %xmm2 -; SSE42-NEXT: pshufb %xmm5, %xmm2 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] -; SSE42-NEXT: pextrb $15, %xmm2, %eax +; SSE42-NEXT: pcmpgtw %xmm7, %xmm3 +; SSE42-NEXT: pextrb $14, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $14, %xmm2, %eax +; SSE42-NEXT: pextrb $12, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $13, %xmm2, %eax +; SSE42-NEXT: pextrb $10, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $12, %xmm2, %eax +; SSE42-NEXT: pextrb $8, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $11, %xmm2, %eax +; SSE42-NEXT: pextrb $6, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $10, %xmm2, %eax +; SSE42-NEXT: pextrb $4, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $9, %xmm2, %eax +; SSE42-NEXT: pextrb $2, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $8, %xmm2, %eax +; SSE42-NEXT: pextrb $0, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $7, %xmm2, %eax +; SSE42-NEXT: pextrb $14, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $6, %xmm2, %eax +; SSE42-NEXT: pextrb $12, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $5, %xmm2, %eax +; SSE42-NEXT: pextrb $10, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $4, %xmm2, %eax +; SSE42-NEXT: pextrb $8, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $3, %xmm2, %eax +; SSE42-NEXT: pextrb $6, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $2, %xmm2, %eax +; SSE42-NEXT: pextrb $4, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $1, %xmm2, %eax +; SSE42-NEXT: pextrb $2, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) ; SSE42-NEXT: pextrb $0, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $15, %xmm0, %eax +; SSE42-NEXT: pextrb $14, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $14, %xmm0, %eax +; SSE42-NEXT: pextrb $12, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $13, %xmm0, %eax +; SSE42-NEXT: pextrb $10, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $12, %xmm0, %eax +; SSE42-NEXT: pextrb $8, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $11, %xmm0, %eax +; SSE42-NEXT: pextrb $6, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $10, %xmm0, %eax +; SSE42-NEXT: pextrb $4, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $9, %xmm0, %eax +; SSE42-NEXT: pextrb $2, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $8, %xmm0, %eax +; SSE42-NEXT: pextrb $0, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $7, %xmm0, %eax +; SSE42-NEXT: pextrb $14, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $6, %xmm0, %eax +; SSE42-NEXT: pextrb $12, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $5, %xmm0, %eax +; SSE42-NEXT: pextrb $10, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $4, %xmm0, %eax +; SSE42-NEXT: pextrb $8, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $3, %xmm0, %eax +; SSE42-NEXT: pextrb $6, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $2, %xmm0, %eax +; SSE42-NEXT: pextrb $4, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $1, %xmm0, %eax +; SSE42-NEXT: pextrb $2, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) ; SSE42-NEXT: pextrb $0, %xmm0, %eax @@ -2573,141 +2566,134 @@ ; ; SSE42-LABEL: test_cmp_v32f32: ; SSE42: # BB#0: -; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm9 ; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm11 -; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm10 ; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm12 -; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm8 -; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm14 +; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm10 ; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm13 +; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm9 +; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm14 +; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm8 ; SSE42-NEXT: movaps {{[0-9]+}}(%rsp), %xmm15 -; SSE42-NEXT: cmpltps %xmm3, %xmm15 -; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] -; SSE42-NEXT: pshufb %xmm3, %xmm15 -; SSE42-NEXT: cmpltps %xmm2, %xmm13 -; SSE42-NEXT: pshufb %xmm3, %xmm13 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm13 = xmm13[0],xmm15[0] -; SSE42-NEXT: psllw $15, %xmm13 -; SSE42-NEXT: psraw $15, %xmm13 -; SSE42-NEXT: movdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> -; SSE42-NEXT: pshufb %xmm2, %xmm13 -; SSE42-NEXT: cmpltps %xmm1, %xmm14 -; SSE42-NEXT: pshufb %xmm3, %xmm14 +; SSE42-NEXT: cmpltps %xmm1, %xmm15 +; SSE42-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] +; SSE42-NEXT: pshufb %xmm1, %xmm15 ; SSE42-NEXT: cmpltps %xmm0, %xmm8 -; SSE42-NEXT: pshufb %xmm3, %xmm8 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm8 = xmm8[0],xmm14[0] +; SSE42-NEXT: pshufb %xmm1, %xmm8 +; SSE42-NEXT: punpcklqdq {{.*#+}} xmm8 = xmm8[0],xmm15[0] ; SSE42-NEXT: psllw $15, %xmm8 ; SSE42-NEXT: psraw $15, %xmm8 -; SSE42-NEXT: pshufb %xmm2, %xmm8 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm8 = xmm8[0],xmm13[0] -; SSE42-NEXT: cmpltps %xmm7, %xmm12 -; SSE42-NEXT: pshufb %xmm3, %xmm12 -; SSE42-NEXT: cmpltps %xmm6, %xmm10 -; SSE42-NEXT: pshufb %xmm3, %xmm10 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm10 = xmm10[0],xmm12[0] -; SSE42-NEXT: psllw $15, %xmm10 -; SSE42-NEXT: psraw $15, %xmm10 -; SSE42-NEXT: pshufb %xmm2, %xmm10 -; SSE42-NEXT: cmpltps %xmm5, %xmm11 -; SSE42-NEXT: pshufb %xmm3, %xmm11 -; SSE42-NEXT: cmpltps %xmm4, %xmm9 -; SSE42-NEXT: pshufb %xmm3, %xmm9 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm9 = xmm9[0],xmm11[0] +; SSE42-NEXT: cmpltps %xmm3, %xmm14 +; SSE42-NEXT: pshufb %xmm1, %xmm14 +; SSE42-NEXT: cmpltps %xmm2, %xmm9 +; SSE42-NEXT: pshufb %xmm1, %xmm9 +; SSE42-NEXT: punpcklqdq {{.*#+}} xmm9 = xmm9[0],xmm14[0] ; SSE42-NEXT: psllw $15, %xmm9 ; SSE42-NEXT: psraw $15, %xmm9 -; SSE42-NEXT: pshufb %xmm2, %xmm9 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm9 = xmm9[0],xmm10[0] -; SSE42-NEXT: pextrb $15, %xmm9, %eax +; SSE42-NEXT: cmpltps %xmm5, %xmm13 +; SSE42-NEXT: pshufb %xmm1, %xmm13 +; SSE42-NEXT: cmpltps %xmm4, %xmm10 +; SSE42-NEXT: pshufb %xmm1, %xmm10 +; SSE42-NEXT: punpcklqdq {{.*#+}} xmm10 = xmm10[0],xmm13[0] +; SSE42-NEXT: psllw $15, %xmm10 +; SSE42-NEXT: psraw $15, %xmm10 +; SSE42-NEXT: cmpltps %xmm7, %xmm12 +; SSE42-NEXT: pshufb %xmm1, %xmm12 +; SSE42-NEXT: cmpltps %xmm6, %xmm11 +; SSE42-NEXT: pshufb %xmm1, %xmm11 +; SSE42-NEXT: punpcklqdq {{.*#+}} xmm11 = xmm11[0],xmm12[0] +; SSE42-NEXT: psllw $15, %xmm11 +; SSE42-NEXT: psraw $15, %xmm11 +; SSE42-NEXT: pextrb $14, %xmm11, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $14, %xmm9, %eax +; SSE42-NEXT: pextrb $12, %xmm11, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $13, %xmm9, %eax +; SSE42-NEXT: pextrb $10, %xmm11, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $12, %xmm9, %eax +; SSE42-NEXT: pextrb $8, %xmm11, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $11, %xmm9, %eax +; SSE42-NEXT: pextrb $6, %xmm11, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $10, %xmm9, %eax +; SSE42-NEXT: pextrb $4, %xmm11, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $9, %xmm9, %eax +; SSE42-NEXT: pextrb $2, %xmm11, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $8, %xmm9, %eax +; SSE42-NEXT: pextrb $0, %xmm11, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $7, %xmm9, %eax +; SSE42-NEXT: pextrb $14, %xmm10, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $6, %xmm9, %eax +; SSE42-NEXT: pextrb $12, %xmm10, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $5, %xmm9, %eax +; SSE42-NEXT: pextrb $10, %xmm10, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $4, %xmm9, %eax +; SSE42-NEXT: pextrb $8, %xmm10, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $3, %xmm9, %eax +; SSE42-NEXT: pextrb $6, %xmm10, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $2, %xmm9, %eax +; SSE42-NEXT: pextrb $4, %xmm10, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $1, %xmm9, %eax +; SSE42-NEXT: pextrb $2, %xmm10, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $0, %xmm9, %eax +; SSE42-NEXT: pextrb $0, %xmm10, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $15, %xmm8, %eax +; SSE42-NEXT: pextrb $14, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $14, %xmm8, %eax +; SSE42-NEXT: pextrb $12, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $13, %xmm8, %eax +; SSE42-NEXT: pextrb $10, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $12, %xmm8, %eax +; SSE42-NEXT: pextrb $8, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $11, %xmm8, %eax +; SSE42-NEXT: pextrb $6, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $10, %xmm8, %eax +; SSE42-NEXT: pextrb $4, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $9, %xmm8, %eax +; SSE42-NEXT: pextrb $2, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $8, %xmm8, %eax +; SSE42-NEXT: pextrb $0, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $7, %xmm8, %eax +; SSE42-NEXT: pextrb $14, %xmm8, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $6, %xmm8, %eax +; SSE42-NEXT: pextrb $12, %xmm8, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $5, %xmm8, %eax +; SSE42-NEXT: pextrb $10, %xmm8, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $4, %xmm8, %eax +; SSE42-NEXT: pextrb $8, %xmm8, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $3, %xmm8, %eax +; SSE42-NEXT: pextrb $6, %xmm8, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $2, %xmm8, %eax +; SSE42-NEXT: pextrb $4, %xmm8, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $1, %xmm8, %eax +; SSE42-NEXT: pextrb $2, %xmm8, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) ; SSE42-NEXT: pextrb $0, %xmm8, %eax @@ -4076,33 +4062,21 @@ ; ; SSE42-LABEL: test_cmp_v32i32: ; SSE42: # BB#0: -; SSE42-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm3 -; SSE42-NEXT: movdqa {{.*#+}} xmm8 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] -; SSE42-NEXT: pshufb %xmm8, %xmm3 -; SSE42-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm2 -; SSE42-NEXT: pshufb %xmm8, %xmm2 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] -; SSE42-NEXT: psllw $15, %xmm2 -; SSE42-NEXT: psraw $15, %xmm2 -; SSE42-NEXT: movdqa {{.*#+}} xmm3 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> -; SSE42-NEXT: pshufb %xmm3, %xmm2 ; SSE42-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm1 +; SSE42-NEXT: movdqa {{.*#+}} xmm8 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] ; SSE42-NEXT: pshufb %xmm8, %xmm1 ; SSE42-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm0 ; SSE42-NEXT: pshufb %xmm8, %xmm0 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] ; SSE42-NEXT: psllw $15, %xmm0 ; SSE42-NEXT: psraw $15, %xmm0 -; SSE42-NEXT: pshufb %xmm3, %xmm0 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] -; SSE42-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm7 -; SSE42-NEXT: pshufb %xmm8, %xmm7 -; SSE42-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm6 -; SSE42-NEXT: pshufb %xmm8, %xmm6 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm7[0] -; SSE42-NEXT: psllw $15, %xmm6 -; SSE42-NEXT: psraw $15, %xmm6 -; SSE42-NEXT: pshufb %xmm3, %xmm6 +; SSE42-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm3 +; SSE42-NEXT: pshufb %xmm8, %xmm3 +; SSE42-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm2 +; SSE42-NEXT: pshufb %xmm8, %xmm2 +; SSE42-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] +; SSE42-NEXT: psllw $15, %xmm2 +; SSE42-NEXT: psraw $15, %xmm2 ; SSE42-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm5 ; SSE42-NEXT: pshufb %xmm8, %xmm5 ; SSE42-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm4 @@ -4110,99 +4084,104 @@ ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm5[0] ; SSE42-NEXT: psllw $15, %xmm4 ; SSE42-NEXT: psraw $15, %xmm4 -; SSE42-NEXT: pshufb %xmm3, %xmm4 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm6[0] -; SSE42-NEXT: pextrb $15, %xmm4, %eax +; SSE42-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm7 +; SSE42-NEXT: pshufb %xmm8, %xmm7 +; SSE42-NEXT: pcmpgtd {{[0-9]+}}(%rsp), %xmm6 +; SSE42-NEXT: pshufb %xmm8, %xmm6 +; SSE42-NEXT: punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm7[0] +; SSE42-NEXT: psllw $15, %xmm6 +; SSE42-NEXT: psraw $15, %xmm6 +; SSE42-NEXT: pextrb $14, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $14, %xmm4, %eax +; SSE42-NEXT: pextrb $12, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $13, %xmm4, %eax +; SSE42-NEXT: pextrb $10, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $12, %xmm4, %eax +; SSE42-NEXT: pextrb $8, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $11, %xmm4, %eax +; SSE42-NEXT: pextrb $6, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $10, %xmm4, %eax +; SSE42-NEXT: pextrb $4, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $9, %xmm4, %eax +; SSE42-NEXT: pextrb $2, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $8, %xmm4, %eax +; SSE42-NEXT: pextrb $0, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $7, %xmm4, %eax +; SSE42-NEXT: pextrb $14, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $6, %xmm4, %eax +; SSE42-NEXT: pextrb $12, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $5, %xmm4, %eax +; SSE42-NEXT: pextrb $10, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $4, %xmm4, %eax +; SSE42-NEXT: pextrb $8, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $3, %xmm4, %eax +; SSE42-NEXT: pextrb $6, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $2, %xmm4, %eax +; SSE42-NEXT: pextrb $4, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $1, %xmm4, %eax +; SSE42-NEXT: pextrb $2, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) ; SSE42-NEXT: pextrb $0, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $15, %xmm0, %eax +; SSE42-NEXT: pextrb $14, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $14, %xmm0, %eax +; SSE42-NEXT: pextrb $12, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $13, %xmm0, %eax +; SSE42-NEXT: pextrb $10, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $12, %xmm0, %eax +; SSE42-NEXT: pextrb $8, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $11, %xmm0, %eax +; SSE42-NEXT: pextrb $6, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $10, %xmm0, %eax +; SSE42-NEXT: pextrb $4, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $9, %xmm0, %eax +; SSE42-NEXT: pextrb $2, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $8, %xmm0, %eax +; SSE42-NEXT: pextrb $0, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $7, %xmm0, %eax +; SSE42-NEXT: pextrb $14, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $6, %xmm0, %eax +; SSE42-NEXT: pextrb $12, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $5, %xmm0, %eax +; SSE42-NEXT: pextrb $10, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $4, %xmm0, %eax +; SSE42-NEXT: pextrb $8, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $3, %xmm0, %eax +; SSE42-NEXT: pextrb $6, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $2, %xmm0, %eax +; SSE42-NEXT: pextrb $4, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $1, %xmm0, %eax +; SSE42-NEXT: pextrb $2, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) ; SSE42-NEXT: pextrb $0, %xmm0, %eax @@ -5135,214 +5114,201 @@ ; ; SSE42-LABEL: test_cmp_v64i16: ; SSE42: # BB#0: -; SSE42-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm1 -; SSE42-NEXT: movdqa {{.*#+}} xmm8 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> -; SSE42-NEXT: pshufb %xmm8, %xmm1 ; SSE42-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm0 -; SSE42-NEXT: pshufb %xmm8, %xmm0 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] -; SSE42-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm3 -; SSE42-NEXT: pshufb %xmm8, %xmm3 +; SSE42-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm1 ; SSE42-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm2 -; SSE42-NEXT: pshufb %xmm8, %xmm2 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] -; SSE42-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm5 -; SSE42-NEXT: pshufb %xmm8, %xmm5 +; SSE42-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm3 ; SSE42-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm4 -; SSE42-NEXT: pshufb %xmm8, %xmm4 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm5[0] -; SSE42-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm7 -; SSE42-NEXT: pshufb %xmm8, %xmm7 +; SSE42-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm5 ; SSE42-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm6 -; SSE42-NEXT: pshufb %xmm8, %xmm6 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm7[0] -; SSE42-NEXT: pextrb $15, %xmm6, %eax +; SSE42-NEXT: pcmpgtw {{[0-9]+}}(%rsp), %xmm7 +; SSE42-NEXT: pextrb $14, %xmm7, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) -; SSE42-NEXT: pextrb $14, %xmm6, %eax +; SSE42-NEXT: pextrb $12, %xmm7, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) -; SSE42-NEXT: pextrb $13, %xmm6, %eax +; SSE42-NEXT: pextrb $10, %xmm7, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) -; SSE42-NEXT: pextrb $12, %xmm6, %eax +; SSE42-NEXT: pextrb $8, %xmm7, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) -; SSE42-NEXT: pextrb $11, %xmm6, %eax +; SSE42-NEXT: pextrb $6, %xmm7, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) -; SSE42-NEXT: pextrb $10, %xmm6, %eax +; SSE42-NEXT: pextrb $4, %xmm7, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) -; SSE42-NEXT: pextrb $9, %xmm6, %eax +; SSE42-NEXT: pextrb $2, %xmm7, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) -; SSE42-NEXT: pextrb $8, %xmm6, %eax +; SSE42-NEXT: pextrb $0, %xmm7, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) -; SSE42-NEXT: pextrb $7, %xmm6, %eax +; SSE42-NEXT: pextrb $14, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) -; SSE42-NEXT: pextrb $6, %xmm6, %eax +; SSE42-NEXT: pextrb $12, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) -; SSE42-NEXT: pextrb $5, %xmm6, %eax +; SSE42-NEXT: pextrb $10, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) -; SSE42-NEXT: pextrb $4, %xmm6, %eax +; SSE42-NEXT: pextrb $8, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) -; SSE42-NEXT: pextrb $3, %xmm6, %eax +; SSE42-NEXT: pextrb $6, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) -; SSE42-NEXT: pextrb $2, %xmm6, %eax +; SSE42-NEXT: pextrb $4, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) -; SSE42-NEXT: pextrb $1, %xmm6, %eax +; SSE42-NEXT: pextrb $2, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) ; SSE42-NEXT: pextrb $0, %xmm6, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 6(%rdi) -; SSE42-NEXT: pextrb $15, %xmm4, %eax +; SSE42-NEXT: pextrb $14, %xmm5, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) -; SSE42-NEXT: pextrb $14, %xmm4, %eax +; SSE42-NEXT: pextrb $12, %xmm5, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) -; SSE42-NEXT: pextrb $13, %xmm4, %eax +; SSE42-NEXT: pextrb $10, %xmm5, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) -; SSE42-NEXT: pextrb $12, %xmm4, %eax +; SSE42-NEXT: pextrb $8, %xmm5, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) -; SSE42-NEXT: pextrb $11, %xmm4, %eax +; SSE42-NEXT: pextrb $6, %xmm5, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) -; SSE42-NEXT: pextrb $10, %xmm4, %eax +; SSE42-NEXT: pextrb $4, %xmm5, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) -; SSE42-NEXT: pextrb $9, %xmm4, %eax +; SSE42-NEXT: pextrb $2, %xmm5, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) -; SSE42-NEXT: pextrb $8, %xmm4, %eax +; SSE42-NEXT: pextrb $0, %xmm5, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) -; SSE42-NEXT: pextrb $7, %xmm4, %eax +; SSE42-NEXT: pextrb $14, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) -; SSE42-NEXT: pextrb $6, %xmm4, %eax +; SSE42-NEXT: pextrb $12, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) -; SSE42-NEXT: pextrb $5, %xmm4, %eax +; SSE42-NEXT: pextrb $10, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) -; SSE42-NEXT: pextrb $4, %xmm4, %eax +; SSE42-NEXT: pextrb $8, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) -; SSE42-NEXT: pextrb $3, %xmm4, %eax +; SSE42-NEXT: pextrb $6, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) -; SSE42-NEXT: pextrb $2, %xmm4, %eax +; SSE42-NEXT: pextrb $4, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) -; SSE42-NEXT: pextrb $1, %xmm4, %eax +; SSE42-NEXT: pextrb $2, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) ; SSE42-NEXT: pextrb $0, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 4(%rdi) -; SSE42-NEXT: pextrb $15, %xmm2, %eax +; SSE42-NEXT: pextrb $14, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $14, %xmm2, %eax +; SSE42-NEXT: pextrb $12, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $13, %xmm2, %eax +; SSE42-NEXT: pextrb $10, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $12, %xmm2, %eax +; SSE42-NEXT: pextrb $8, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $11, %xmm2, %eax +; SSE42-NEXT: pextrb $6, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $10, %xmm2, %eax +; SSE42-NEXT: pextrb $4, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $9, %xmm2, %eax +; SSE42-NEXT: pextrb $2, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $8, %xmm2, %eax +; SSE42-NEXT: pextrb $0, %xmm3, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $7, %xmm2, %eax +; SSE42-NEXT: pextrb $14, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $6, %xmm2, %eax +; SSE42-NEXT: pextrb $12, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $5, %xmm2, %eax +; SSE42-NEXT: pextrb $10, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $4, %xmm2, %eax +; SSE42-NEXT: pextrb $8, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $3, %xmm2, %eax +; SSE42-NEXT: pextrb $6, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $2, %xmm2, %eax +; SSE42-NEXT: pextrb $4, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $1, %xmm2, %eax +; SSE42-NEXT: pextrb $2, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) ; SSE42-NEXT: pextrb $0, %xmm2, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $15, %xmm0, %eax +; SSE42-NEXT: pextrb $14, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $14, %xmm0, %eax +; SSE42-NEXT: pextrb $12, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $13, %xmm0, %eax +; SSE42-NEXT: pextrb $10, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $12, %xmm0, %eax +; SSE42-NEXT: pextrb $8, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $11, %xmm0, %eax +; SSE42-NEXT: pextrb $6, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $10, %xmm0, %eax +; SSE42-NEXT: pextrb $4, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $9, %xmm0, %eax +; SSE42-NEXT: pextrb $2, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $8, %xmm0, %eax +; SSE42-NEXT: pextrb $0, %xmm1, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $7, %xmm0, %eax +; SSE42-NEXT: pextrb $14, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $6, %xmm0, %eax +; SSE42-NEXT: pextrb $12, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $5, %xmm0, %eax +; SSE42-NEXT: pextrb $10, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $4, %xmm0, %eax +; SSE42-NEXT: pextrb $8, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $3, %xmm0, %eax +; SSE42-NEXT: pextrb $6, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $2, %xmm0, %eax +; SSE42-NEXT: pextrb $4, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $1, %xmm0, %eax +; SSE42-NEXT: pextrb $2, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) ; SSE42-NEXT: pextrb $0, %xmm0, %eax @@ -8690,185 +8656,178 @@ ; SSE42-NEXT: pushq %r12 ; SSE42-NEXT: pushq %rbx ; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm8 -; SSE42-NEXT: cmpltpd %xmm7, %xmm8 -; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm7 -; SSE42-NEXT: cmpltpd %xmm6, %xmm7 -; SSE42-NEXT: shufps {{.*#+}} xmm7 = xmm7[0,2],xmm8[0,2] -; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm6 -; SSE42-NEXT: cmpltpd %xmm5, %xmm6 -; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm5 -; SSE42-NEXT: cmpltpd %xmm4, %xmm5 -; SSE42-NEXT: pslld $31, %xmm7 -; SSE42-NEXT: psrad $31, %xmm7 -; SSE42-NEXT: shufps {{.*#+}} xmm5 = xmm5[0,2],xmm6[0,2] -; SSE42-NEXT: movdqa {{.*#+}} xmm4 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] -; SSE42-NEXT: pshufb %xmm4, %xmm7 -; SSE42-NEXT: pslld $31, %xmm5 -; SSE42-NEXT: psrad $31, %xmm5 -; SSE42-NEXT: pshufb %xmm4, %xmm5 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm7[0] -; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm6 -; SSE42-NEXT: cmpltpd %xmm3, %xmm6 +; SSE42-NEXT: cmpltpd %xmm3, %xmm8 ; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm3 ; SSE42-NEXT: cmpltpd %xmm2, %xmm3 +; SSE42-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm8[0,2] ; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm2 -; SSE42-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm6[0,2] -; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm6 -; SSE42-NEXT: cmpltpd %xmm1, %xmm6 +; SSE42-NEXT: cmpltpd %xmm1, %xmm2 ; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm1 ; SSE42-NEXT: cmpltpd %xmm0, %xmm1 -; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm0 -; SSE42-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm6[0,2] -; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm6 -; SSE42-NEXT: psllw $15, %xmm5 -; SSE42-NEXT: psraw $15, %xmm5 ; SSE42-NEXT: pslld $31, %xmm3 ; SSE42-NEXT: psrad $31, %xmm3 -; SSE42-NEXT: pshufb %xmm4, %xmm3 +; SSE42-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2] +; SSE42-NEXT: movdqa {{.*#+}} xmm8 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] +; SSE42-NEXT: pshufb %xmm8, %xmm3 ; SSE42-NEXT: pslld $31, %xmm1 ; SSE42-NEXT: psrad $31, %xmm1 -; SSE42-NEXT: pshufb %xmm4, %xmm1 +; SSE42-NEXT: pshufb %xmm8, %xmm1 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0] -; SSE42-NEXT: movdqa {{.*#+}} xmm3 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> -; SSE42-NEXT: pshufb %xmm3, %xmm5 -; SSE42-NEXT: psllw $15, %xmm1 -; SSE42-NEXT: psraw $15, %xmm1 -; SSE42-NEXT: pshufb %xmm3, %xmm1 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm5[0] +; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm0 +; SSE42-NEXT: cmpltpd %xmm7, %xmm0 +; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm7 +; SSE42-NEXT: cmpltpd %xmm6, %xmm7 +; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm3 +; SSE42-NEXT: shufps {{.*#+}} xmm7 = xmm7[0,2],xmm0[0,2] +; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm6 +; SSE42-NEXT: cmpltpd %xmm5, %xmm6 +; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm0 +; SSE42-NEXT: cmpltpd %xmm4, %xmm0 +; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm2 +; SSE42-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm6[0,2] +; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm4 +; SSE42-NEXT: pslld $31, %xmm7 +; SSE42-NEXT: psrad $31, %xmm7 +; SSE42-NEXT: pshufb %xmm8, %xmm7 +; SSE42-NEXT: pslld $31, %xmm0 +; SSE42-NEXT: psrad $31, %xmm0 +; SSE42-NEXT: pshufb %xmm8, %xmm0 +; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm7[0] ; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm5 ; SSE42-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm5 -; SSE42-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm6 -; SSE42-NEXT: shufps {{.*#+}} xmm6 = xmm6[0,2],xmm5[0,2] +; SSE42-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm4 +; SSE42-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2] ; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm5 ; SSE42-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm5 -; SSE42-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm0 -; SSE42-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2] +; SSE42-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm2 +; SSE42-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm5[0,2] ; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm5 -; SSE42-NEXT: pslld $31, %xmm6 -; SSE42-NEXT: psrad $31, %xmm6 -; SSE42-NEXT: pshufb %xmm4, %xmm6 -; SSE42-NEXT: pslld $31, %xmm0 -; SSE42-NEXT: psrad $31, %xmm0 -; SSE42-NEXT: pshufb %xmm4, %xmm0 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm6[0] -; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm6 -; SSE42-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm6 +; SSE42-NEXT: pslld $31, %xmm4 +; SSE42-NEXT: psrad $31, %xmm4 +; SSE42-NEXT: pshufb %xmm8, %xmm4 +; SSE42-NEXT: pslld $31, %xmm2 +; SSE42-NEXT: psrad $31, %xmm2 +; SSE42-NEXT: pshufb %xmm8, %xmm2 +; SSE42-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm4[0] +; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm4 +; SSE42-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm4 ; SSE42-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm5 -; SSE42-NEXT: shufps {{.*#+}} xmm5 = xmm5[0,2],xmm6[0,2] -; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm6 -; SSE42-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm6 -; SSE42-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm2 -; SSE42-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm6[0,2] +; SSE42-NEXT: shufps {{.*#+}} xmm5 = xmm5[0,2],xmm4[0,2] +; SSE42-NEXT: movapd {{[0-9]+}}(%rsp), %xmm4 +; SSE42-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm4 +; SSE42-NEXT: cmpltpd {{[0-9]+}}(%rsp), %xmm3 +; SSE42-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm4[0,2] ; SSE42-NEXT: pslld $31, %xmm5 ; SSE42-NEXT: psrad $31, %xmm5 -; SSE42-NEXT: pshufb %xmm4, %xmm5 -; SSE42-NEXT: pslld $31, %xmm2 -; SSE42-NEXT: psrad $31, %xmm2 -; SSE42-NEXT: pshufb %xmm4, %xmm2 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm5[0] -; SSE42-NEXT: psllw $15, %xmm0 -; SSE42-NEXT: psraw $15, %xmm0 -; SSE42-NEXT: pshufb %xmm3, %xmm0 +; SSE42-NEXT: pshufb %xmm8, %xmm5 +; SSE42-NEXT: pslld $31, %xmm3 +; SSE42-NEXT: psrad $31, %xmm3 +; SSE42-NEXT: pshufb %xmm8, %xmm3 +; SSE42-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm5[0] +; SSE42-NEXT: psllw $15, %xmm3 +; SSE42-NEXT: psraw $15, %xmm3 +; SSE42-NEXT: pextrb $14, %xmm3, %ecx +; SSE42-NEXT: pextrb $12, %xmm3, %edx +; SSE42-NEXT: pextrb $10, %xmm3, %r8d +; SSE42-NEXT: pextrb $8, %xmm3, %r10d +; SSE42-NEXT: pextrb $6, %xmm3, %r14d +; SSE42-NEXT: pextrb $4, %xmm3, %r12d +; SSE42-NEXT: pextrb $2, %xmm3, %ebx +; SSE42-NEXT: pextrb $0, %xmm3, %eax ; SSE42-NEXT: psllw $15, %xmm2 ; SSE42-NEXT: psraw $15, %xmm2 -; SSE42-NEXT: pshufb %xmm3, %xmm2 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0] -; SSE42-NEXT: pextrb $15, %xmm2, %eax -; SSE42-NEXT: andb $1, %al -; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $14, %xmm2, %eax -; SSE42-NEXT: andb $1, %al -; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $13, %xmm2, %r8d -; SSE42-NEXT: pextrb $12, %xmm2, %r9d -; SSE42-NEXT: pextrb $11, %xmm2, %r10d -; SSE42-NEXT: pextrb $10, %xmm2, %r11d -; SSE42-NEXT: pextrb $9, %xmm2, %r14d -; SSE42-NEXT: pextrb $8, %xmm2, %r15d -; SSE42-NEXT: pextrb $7, %xmm2, %r12d -; SSE42-NEXT: pextrb $6, %xmm2, %r13d -; SSE42-NEXT: pextrb $5, %xmm2, %ebx -; SSE42-NEXT: pextrb $4, %xmm2, %ebp -; SSE42-NEXT: pextrb $3, %xmm2, %eax -; SSE42-NEXT: pextrb $2, %xmm2, %ecx -; SSE42-NEXT: pextrb $1, %xmm2, %edx -; SSE42-NEXT: pextrb $0, %xmm2, %esi +; SSE42-NEXT: andb $1, %cl +; SSE42-NEXT: movb %cl, 2(%rdi) +; SSE42-NEXT: andb $1, %dl +; SSE42-NEXT: movb %dl, 2(%rdi) +; SSE42-NEXT: pextrb $14, %xmm2, %edx +; SSE42-NEXT: pextrb $12, %xmm2, %esi +; SSE42-NEXT: pextrb $10, %xmm2, %r9d +; SSE42-NEXT: pextrb $8, %xmm2, %r11d +; SSE42-NEXT: pextrb $6, %xmm2, %r15d +; SSE42-NEXT: pextrb $4, %xmm2, %r13d +; SSE42-NEXT: pextrb $2, %xmm2, %ebp +; SSE42-NEXT: pextrb $0, %xmm2, %ecx +; SSE42-NEXT: psllw $15, %xmm0 +; SSE42-NEXT: psraw $15, %xmm0 ; SSE42-NEXT: andb $1, %r8b ; SSE42-NEXT: movb %r8b, 2(%rdi) -; SSE42-NEXT: andb $1, %r9b -; SSE42-NEXT: movb %r9b, 2(%rdi) ; SSE42-NEXT: andb $1, %r10b ; SSE42-NEXT: movb %r10b, 2(%rdi) -; SSE42-NEXT: andb $1, %r11b -; SSE42-NEXT: movb %r11b, 2(%rdi) ; SSE42-NEXT: andb $1, %r14b ; SSE42-NEXT: movb %r14b, 2(%rdi) -; SSE42-NEXT: andb $1, %r15b -; SSE42-NEXT: movb %r15b, 2(%rdi) ; SSE42-NEXT: andb $1, %r12b ; SSE42-NEXT: movb %r12b, 2(%rdi) -; SSE42-NEXT: andb $1, %r13b -; SSE42-NEXT: movb %r13b, 2(%rdi) ; SSE42-NEXT: andb $1, %bl ; SSE42-NEXT: movb %bl, 2(%rdi) -; SSE42-NEXT: andb $1, %bpl -; SSE42-NEXT: movb %bpl, 2(%rdi) ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: andb $1, %cl -; SSE42-NEXT: movb %cl, 2(%rdi) ; SSE42-NEXT: andb $1, %dl ; SSE42-NEXT: movb %dl, 2(%rdi) ; SSE42-NEXT: andb $1, %sil ; SSE42-NEXT: movb %sil, 2(%rdi) -; SSE42-NEXT: pextrb $15, %xmm1, %eax -; SSE42-NEXT: andb $1, %al -; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $14, %xmm1, %eax -; SSE42-NEXT: andb $1, %al -; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $13, %xmm1, %r8d -; SSE42-NEXT: pextrb $12, %xmm1, %r9d -; SSE42-NEXT: pextrb $11, %xmm1, %r10d -; SSE42-NEXT: pextrb $10, %xmm1, %r11d -; SSE42-NEXT: pextrb $9, %xmm1, %r14d -; SSE42-NEXT: pextrb $8, %xmm1, %r15d -; SSE42-NEXT: pextrb $7, %xmm1, %r12d -; SSE42-NEXT: pextrb $6, %xmm1, %r13d -; SSE42-NEXT: pextrb $5, %xmm1, %ebx -; SSE42-NEXT: pextrb $4, %xmm1, %ebp -; SSE42-NEXT: pextrb $3, %xmm1, %eax -; SSE42-NEXT: pextrb $2, %xmm1, %ecx -; SSE42-NEXT: pextrb $1, %xmm1, %edx -; SSE42-NEXT: pextrb $0, %xmm1, %esi +; SSE42-NEXT: pextrb $14, %xmm0, %esi +; SSE42-NEXT: pextrb $12, %xmm0, %edx +; SSE42-NEXT: pextrb $10, %xmm0, %r8d +; SSE42-NEXT: pextrb $8, %xmm0, %r10d +; SSE42-NEXT: pextrb $6, %xmm0, %r14d +; SSE42-NEXT: pextrb $4, %xmm0, %r12d +; SSE42-NEXT: pextrb $2, %xmm0, %ebx +; SSE42-NEXT: pextrb $0, %xmm0, %eax +; SSE42-NEXT: psllw $15, %xmm1 +; SSE42-NEXT: psraw $15, %xmm1 +; SSE42-NEXT: andb $1, %r9b +; SSE42-NEXT: movb %r9b, 2(%rdi) +; SSE42-NEXT: andb $1, %r11b +; SSE42-NEXT: movb %r11b, 2(%rdi) +; SSE42-NEXT: andb $1, %r15b +; SSE42-NEXT: movb %r15b, 2(%rdi) +; SSE42-NEXT: andb $1, %r13b +; SSE42-NEXT: movb %r13b, 2(%rdi) +; SSE42-NEXT: andb $1, %bpl +; SSE42-NEXT: movb %bpl, 2(%rdi) +; SSE42-NEXT: andb $1, %cl +; SSE42-NEXT: movb %cl, 2(%rdi) +; SSE42-NEXT: andb $1, %sil +; SSE42-NEXT: movb %sil, (%rdi) +; SSE42-NEXT: andb $1, %dl +; SSE42-NEXT: movb %dl, (%rdi) +; SSE42-NEXT: pextrb $14, %xmm1, %r9d +; SSE42-NEXT: pextrb $12, %xmm1, %r11d +; SSE42-NEXT: pextrb $10, %xmm1, %r15d +; SSE42-NEXT: pextrb $8, %xmm1, %r13d +; SSE42-NEXT: pextrb $6, %xmm1, %ecx +; SSE42-NEXT: pextrb $4, %xmm1, %edx +; SSE42-NEXT: pextrb $2, %xmm1, %esi +; SSE42-NEXT: pextrb $0, %xmm1, %ebp ; SSE42-NEXT: andb $1, %r8b ; SSE42-NEXT: movb %r8b, (%rdi) -; SSE42-NEXT: andb $1, %r9b -; SSE42-NEXT: movb %r9b, (%rdi) ; SSE42-NEXT: andb $1, %r10b ; SSE42-NEXT: movb %r10b, (%rdi) -; SSE42-NEXT: andb $1, %r11b -; SSE42-NEXT: movb %r11b, (%rdi) ; SSE42-NEXT: andb $1, %r14b ; SSE42-NEXT: movb %r14b, (%rdi) -; SSE42-NEXT: andb $1, %r15b -; SSE42-NEXT: movb %r15b, (%rdi) ; SSE42-NEXT: andb $1, %r12b ; SSE42-NEXT: movb %r12b, (%rdi) -; SSE42-NEXT: andb $1, %r13b -; SSE42-NEXT: movb %r13b, (%rdi) ; SSE42-NEXT: andb $1, %bl ; SSE42-NEXT: movb %bl, (%rdi) -; SSE42-NEXT: andb $1, %bpl -; SSE42-NEXT: movb %bpl, (%rdi) ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) +; SSE42-NEXT: andb $1, %r9b +; SSE42-NEXT: movb %r9b, (%rdi) +; SSE42-NEXT: andb $1, %r11b +; SSE42-NEXT: movb %r11b, (%rdi) +; SSE42-NEXT: andb $1, %r15b +; SSE42-NEXT: movb %r15b, (%rdi) +; SSE42-NEXT: andb $1, %r13b +; SSE42-NEXT: movb %r13b, (%rdi) ; SSE42-NEXT: andb $1, %cl ; SSE42-NEXT: movb %cl, (%rdi) ; SSE42-NEXT: andb $1, %dl ; SSE42-NEXT: movb %dl, (%rdi) ; SSE42-NEXT: andb $1, %sil ; SSE42-NEXT: movb %sil, (%rdi) +; SSE42-NEXT: andb $1, %bpl +; SSE42-NEXT: movb %bpl, (%rdi) ; SSE42-NEXT: movq %rdi, %rax ; SSE42-NEXT: popq %rbx ; SSE42-NEXT: popq %r12 @@ -10006,173 +9965,166 @@ ; ; SSE42-LABEL: test_cmp_v32i64: ; SSE42: # BB#0: -; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8 +; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9 ; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm11 ; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm10 ; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm12 -; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm9 +; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm8 ; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm14 ; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm13 ; SSE42-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm15 -; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm7 -; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm6 -; SSE42-NEXT: shufps {{.*#+}} xmm6 = xmm6[0,2],xmm7[0,2] -; SSE42-NEXT: pslld $31, %xmm6 -; SSE42-NEXT: psrad $31, %xmm6 -; SSE42-NEXT: movdqa {{.*#+}} xmm7 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] -; SSE42-NEXT: pshufb %xmm7, %xmm6 -; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm5 -; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm4 -; SSE42-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2] -; SSE42-NEXT: pslld $31, %xmm4 -; SSE42-NEXT: psrad $31, %xmm4 -; SSE42-NEXT: pshufb %xmm7, %xmm4 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm6[0] -; SSE42-NEXT: psllw $15, %xmm4 -; SSE42-NEXT: psraw $15, %xmm4 -; SSE42-NEXT: movdqa {{.*#+}} xmm5 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> -; SSE42-NEXT: pshufb %xmm5, %xmm4 ; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm3 ; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm2 ; SSE42-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2] ; SSE42-NEXT: pslld $31, %xmm2 ; SSE42-NEXT: psrad $31, %xmm2 -; SSE42-NEXT: pshufb %xmm7, %xmm2 +; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] +; SSE42-NEXT: pshufb %xmm3, %xmm2 ; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm1 ; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm0 ; SSE42-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] ; SSE42-NEXT: pslld $31, %xmm0 ; SSE42-NEXT: psrad $31, %xmm0 -; SSE42-NEXT: pshufb %xmm7, %xmm0 +; SSE42-NEXT: pshufb %xmm3, %xmm0 ; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] ; SSE42-NEXT: psllw $15, %xmm0 ; SSE42-NEXT: psraw $15, %xmm0 -; SSE42-NEXT: pshufb %xmm5, %xmm0 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm4[0] +; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm7 +; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm6 +; SSE42-NEXT: shufps {{.*#+}} xmm6 = xmm6[0,2],xmm7[0,2] +; SSE42-NEXT: pslld $31, %xmm6 +; SSE42-NEXT: psrad $31, %xmm6 +; SSE42-NEXT: pshufb %xmm3, %xmm6 +; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm5 +; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm4 +; SSE42-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2] +; SSE42-NEXT: pslld $31, %xmm4 +; SSE42-NEXT: psrad $31, %xmm4 +; SSE42-NEXT: pshufb %xmm3, %xmm4 +; SSE42-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm6[0] +; SSE42-NEXT: psllw $15, %xmm4 +; SSE42-NEXT: psraw $15, %xmm4 ; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm15 ; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm13 ; SSE42-NEXT: shufps {{.*#+}} xmm13 = xmm13[0,2],xmm15[0,2] ; SSE42-NEXT: pslld $31, %xmm13 ; SSE42-NEXT: psrad $31, %xmm13 -; SSE42-NEXT: pshufb %xmm7, %xmm13 +; SSE42-NEXT: pshufb %xmm3, %xmm13 ; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm14 -; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm9 -; SSE42-NEXT: shufps {{.*#+}} xmm9 = xmm9[0,2],xmm14[0,2] -; SSE42-NEXT: pslld $31, %xmm9 -; SSE42-NEXT: psrad $31, %xmm9 -; SSE42-NEXT: pshufb %xmm7, %xmm9 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm9 = xmm9[0],xmm13[0] -; SSE42-NEXT: psllw $15, %xmm9 -; SSE42-NEXT: psraw $15, %xmm9 -; SSE42-NEXT: pshufb %xmm5, %xmm9 +; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm8 +; SSE42-NEXT: shufps {{.*#+}} xmm8 = xmm8[0,2],xmm14[0,2] +; SSE42-NEXT: pslld $31, %xmm8 +; SSE42-NEXT: psrad $31, %xmm8 +; SSE42-NEXT: pshufb %xmm3, %xmm8 +; SSE42-NEXT: punpcklqdq {{.*#+}} xmm8 = xmm8[0],xmm13[0] +; SSE42-NEXT: psllw $15, %xmm8 +; SSE42-NEXT: psraw $15, %xmm8 ; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm12 ; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm10 ; SSE42-NEXT: shufps {{.*#+}} xmm10 = xmm10[0,2],xmm12[0,2] ; SSE42-NEXT: pslld $31, %xmm10 ; SSE42-NEXT: psrad $31, %xmm10 -; SSE42-NEXT: pshufb %xmm7, %xmm10 +; SSE42-NEXT: pshufb %xmm3, %xmm10 ; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm11 -; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm8 -; SSE42-NEXT: shufps {{.*#+}} xmm8 = xmm8[0,2],xmm11[0,2] -; SSE42-NEXT: pslld $31, %xmm8 -; SSE42-NEXT: psrad $31, %xmm8 -; SSE42-NEXT: pshufb %xmm7, %xmm8 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm8 = xmm8[0],xmm10[0] -; SSE42-NEXT: psllw $15, %xmm8 -; SSE42-NEXT: psraw $15, %xmm8 -; SSE42-NEXT: pshufb %xmm5, %xmm8 -; SSE42-NEXT: punpcklqdq {{.*#+}} xmm8 = xmm8[0],xmm9[0] -; SSE42-NEXT: pextrb $15, %xmm8, %eax +; SSE42-NEXT: pcmpgtq {{[0-9]+}}(%rsp), %xmm9 +; SSE42-NEXT: shufps {{.*#+}} xmm9 = xmm9[0,2],xmm11[0,2] +; SSE42-NEXT: pslld $31, %xmm9 +; SSE42-NEXT: psrad $31, %xmm9 +; SSE42-NEXT: pshufb %xmm3, %xmm9 +; SSE42-NEXT: punpcklqdq {{.*#+}} xmm9 = xmm9[0],xmm10[0] +; SSE42-NEXT: psllw $15, %xmm9 +; SSE42-NEXT: psraw $15, %xmm9 +; SSE42-NEXT: pextrb $14, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $14, %xmm8, %eax +; SSE42-NEXT: pextrb $12, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $13, %xmm8, %eax +; SSE42-NEXT: pextrb $10, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $12, %xmm8, %eax +; SSE42-NEXT: pextrb $8, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $11, %xmm8, %eax +; SSE42-NEXT: pextrb $6, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $10, %xmm8, %eax +; SSE42-NEXT: pextrb $4, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $9, %xmm8, %eax +; SSE42-NEXT: pextrb $2, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $8, %xmm8, %eax +; SSE42-NEXT: pextrb $0, %xmm9, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $7, %xmm8, %eax +; SSE42-NEXT: pextrb $14, %xmm8, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $6, %xmm8, %eax +; SSE42-NEXT: pextrb $12, %xmm8, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $5, %xmm8, %eax +; SSE42-NEXT: pextrb $10, %xmm8, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $4, %xmm8, %eax +; SSE42-NEXT: pextrb $8, %xmm8, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $3, %xmm8, %eax +; SSE42-NEXT: pextrb $6, %xmm8, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $2, %xmm8, %eax +; SSE42-NEXT: pextrb $4, %xmm8, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $1, %xmm8, %eax +; SSE42-NEXT: pextrb $2, %xmm8, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) ; SSE42-NEXT: pextrb $0, %xmm8, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, 2(%rdi) -; SSE42-NEXT: pextrb $15, %xmm0, %eax +; SSE42-NEXT: pextrb $14, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $14, %xmm0, %eax +; SSE42-NEXT: pextrb $12, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $13, %xmm0, %eax +; SSE42-NEXT: pextrb $10, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $12, %xmm0, %eax +; SSE42-NEXT: pextrb $8, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $11, %xmm0, %eax +; SSE42-NEXT: pextrb $6, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $10, %xmm0, %eax +; SSE42-NEXT: pextrb $4, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $9, %xmm0, %eax +; SSE42-NEXT: pextrb $2, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $8, %xmm0, %eax +; SSE42-NEXT: pextrb $0, %xmm4, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $7, %xmm0, %eax +; SSE42-NEXT: pextrb $14, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $6, %xmm0, %eax +; SSE42-NEXT: pextrb $12, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $5, %xmm0, %eax +; SSE42-NEXT: pextrb $10, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $4, %xmm0, %eax +; SSE42-NEXT: pextrb $8, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $3, %xmm0, %eax +; SSE42-NEXT: pextrb $6, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $2, %xmm0, %eax +; SSE42-NEXT: pextrb $4, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) -; SSE42-NEXT: pextrb $1, %xmm0, %eax +; SSE42-NEXT: pextrb $2, %xmm0, %eax ; SSE42-NEXT: andb $1, %al ; SSE42-NEXT: movb %al, (%rdi) ; SSE42-NEXT: pextrb $0, %xmm0, %eax Index: llvm/trunk/test/CodeGen/X86/widen_conv-1.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/widen_conv-1.ll +++ llvm/trunk/test/CodeGen/X86/widen_conv-1.ll @@ -38,7 +38,6 @@ ; X86-NEXT: paddd {{\.LCPI.*}}, %xmm0 ; X86-NEXT: pextrb $8, %xmm0, 2(%eax) ; X86-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] -; X86-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero ; X86-NEXT: pextrw $0, %xmm0, (%eax) ; X86-NEXT: popl %eax ; X86-NEXT: retl @@ -49,7 +48,6 @@ ; X64-NEXT: paddd {{.*}}(%rip), %xmm0 ; X64-NEXT: pextrb $8, %xmm0, 2(%rdi) ; X64-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] -; X64-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero ; X64-NEXT: pextrw $0, %xmm0, (%rdi) ; X64-NEXT: retq entry: @@ -75,7 +73,6 @@ ; X86-NEXT: paddw {{\.LCPI.*}}, %xmm0 ; X86-NEXT: pextrb $8, %xmm0, 4(%eax) ; X86-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] -; X86-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero ; X86-NEXT: movd %xmm0, (%eax) ; X86-NEXT: movl %ebp, %esp ; X86-NEXT: popl %ebp @@ -87,7 +84,6 @@ ; X64-NEXT: paddw {{.*}}(%rip), %xmm0 ; X64-NEXT: pextrb $8, %xmm0, 4(%rdi) ; X64-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] -; X64-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero ; X64-NEXT: movd %xmm0, (%rdi) ; X64-NEXT: retq entry: Index: llvm/trunk/test/CodeGen/X86/widen_load-2.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/widen_load-2.ll +++ llvm/trunk/test/CodeGen/X86/widen_load-2.ll @@ -164,8 +164,7 @@ ; X86-NEXT: paddd %xmm0, %xmm1 ; X86-NEXT: pextrw $4, %xmm1, 4(%eax) ; X86-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] -; X86-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero -; X86-NEXT: movd %xmm0, (%eax) +; X86-NEXT: movd %xmm1, (%eax) ; X86-NEXT: movl %ebp, %esp ; X86-NEXT: popl %ebp ; X86-NEXT: retl $4 @@ -177,8 +176,7 @@ ; X64-NEXT: paddd %xmm0, %xmm1 ; X64-NEXT: pextrw $4, %xmm1, 4(%rdi) ; X64-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] -; X64-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero -; X64-NEXT: movd %xmm0, (%rdi) +; X64-NEXT: movd %xmm1, (%rdi) ; X64-NEXT: movq %rdi, %rax ; X64-NEXT: retq %a = load %i16vec3, %i16vec3* %ap, align 16 @@ -301,8 +299,7 @@ ; X86-NEXT: paddd %xmm0, %xmm1 ; X86-NEXT: pextrb $8, %xmm1, 2(%eax) ; X86-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] -; X86-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero -; X86-NEXT: pextrw $0, %xmm0, (%eax) +; X86-NEXT: pextrw $0, %xmm1, (%eax) ; X86-NEXT: addl $12, %esp ; X86-NEXT: retl $4 ; @@ -313,8 +310,7 @@ ; X64-NEXT: paddd %xmm0, %xmm1 ; X64-NEXT: pextrb $8, %xmm1, 2(%rdi) ; X64-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] -; X64-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero -; X64-NEXT: pextrw $0, %xmm0, (%rdi) +; X64-NEXT: pextrw $0, %xmm1, (%rdi) ; X64-NEXT: movq %rdi, %rax ; X64-NEXT: retq %a = load %i8vec3, %i8vec3* %ap, align 16 @@ -381,10 +377,9 @@ ; X86-NEXT: pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero ; X86-NEXT: movdqa %xmm0, %xmm1 ; X86-NEXT: psrld $1, %xmm1 -; X86-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,5],xmm0[6,7] +; X86-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5],xmm0[6,7] +; X86-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] ; X86-NEXT: pextrb $8, %xmm1, 2(%eax) -; X86-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] -; X86-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero ; X86-NEXT: pextrw $0, %xmm0, (%eax) ; X86-NEXT: addl $16, %esp ; X86-NEXT: retl $4 @@ -400,10 +395,9 @@ ; X64-NEXT: pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero ; X64-NEXT: movdqa %xmm0, %xmm1 ; X64-NEXT: psrld $1, %xmm1 -; X64-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,5],xmm0[6,7] +; X64-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5],xmm0[6,7] +; X64-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] ; X64-NEXT: pextrb $8, %xmm1, 2(%rdi) -; X64-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] -; X64-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero ; X64-NEXT: pextrw $0, %xmm0, (%rdi) ; X64-NEXT: movq %rdi, %rax ; X64-NEXT: retq