mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
Prepare LowerVECTOR_SHUFFLEv8i16 to use x86 target specific nodes directly
llvm-svn: 111704
This commit is contained in:
parent
c3856a5130
commit
1998fbbf1a
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user