diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 16 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.h | 3 | 
2 files changed, 12 insertions, 7 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index bff1ce5a54a..a2e2806c2e6 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -4151,10 +4151,10 @@ X86TargetLowering::LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const {  // 2. [ssse3] 1 x pshufb  // 3. [ssse3] 2 x pshufb + 1 x por  // 4. [all]   mov + pshuflw + pshufhw + N x (pextrw + pinsrw) -static -SDValue LowerVECTOR_SHUFFLEv8i16(ShuffleVectorSDNode *SVOp, -                                 SelectionDAG &DAG, -                                 const X86TargetLowering &TLI) { +SDValue +X86TargetLowering::LowerVECTOR_SHUFFLEv8i16(SDValue Op, +                                            SelectionDAG &DAG) const { +  ShuffleVectorSDNode *SVOp = cast<ShuffleVectorSDNode>(Op);    SDValue V1 = SVOp->getOperand(0);    SDValue V2 = SVOp->getOperand(1);    DebugLoc dl = SVOp->getDebugLoc(); @@ -4205,7 +4205,7 @@ SDValue LowerVECTOR_SHUFFLEv8i16(ShuffleVectorSDNode *SVOp,    // quads, disable the next transformation since it does not help SSSE3.    bool V1Used = InputQuads[0] || InputQuads[1];    bool V2Used = InputQuads[2] || InputQuads[3]; -  if (TLI.getSubtarget()->hasSSSE3()) { +  if (Subtarget->hasSSSE3()) {      if (InputQuads.count() == 2 && V1Used && V2Used) {        BestLoQuad = InputQuads.find_first();        BestHiQuad = InputQuads.find_next(BestLoQuad); @@ -4227,6 +4227,8 @@ SDValue LowerVECTOR_SHUFFLEv8i16(ShuffleVectorSDNode *SVOp,      NewV = DAG.getVectorShuffle(MVT::v2i64, dl,                    DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2i64, V1),                    DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2i64, V2), &MaskV[0]); +    if (NewV.getOpcode() == ISD::VECTOR_SHUFFLE) +      NewV = LowerVECTOR_SHUFFLE(NewV, DAG);      NewV = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v8i16, NewV);      // Rewrite the MaskVals and assign NewV to V1 if NewV now contains all the @@ -4272,7 +4274,7 @@ SDValue LowerVECTOR_SHUFFLEv8i16(ShuffleVectorSDNode *SVOp,    // If we have SSSE3, and all words of the result are from 1 input vector,    // case 2 is generated, otherwise case 3 is generated.  If no SSSE3    // is present, fall back to case 4. -  if (TLI.getSubtarget()->hasSSSE3()) { +  if (Subtarget->hasSSSE3()) {      SmallVector<SDValue,16> pshufbMask;      // If we have elements from both input vectors, set the high bit of the @@ -4942,7 +4944,7 @@ X86TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const {    // Handle v8i16 specifically since SSE can do byte extraction and insertion.    if (VT == MVT::v8i16) { -    SDValue NewOp = LowerVECTOR_SHUFFLEv8i16(SVOp, DAG, *this); +    SDValue NewOp = LowerVECTOR_SHUFFLEv8i16(Op, DAG);      if (NewOp.getNode())        return NewOp;    } diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h index 7791f9aed13..c2f5349d76a 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -771,6 +771,9 @@ namespace llvm {      SDValue LowerREADCYCLECOUNTER(SDValue Op, SelectionDAG &DAG) const;      SDValue LowerMEMBARRIER(SDValue Op, SelectionDAG &DAG) const; +    // Utility functions to help LowerVECTOR_SHUFFLE +    SDValue LowerVECTOR_SHUFFLEv8i16(SDValue Op, SelectionDAG &DAG) const; +      virtual SDValue        LowerFormalArguments(SDValue Chain,                             CallingConv::ID CallConv, bool isVarArg,  | 

