[X86] Lower SEXTLOAD using SIGN_EXTEND_VECTOR_INREG. NCI.

The custom lowering in LowerExtendedLoad is doing the equivalent shuffle, so make use of existing lowering code to reduce duplication.

llvm-svn: 249243
This commit is contained in:
Simon Pilgrim 2015-10-03 18:55:43 +00:00
parent 629c63b528
commit bc707d04a4
1 changed files with 5 additions and 22 deletions

View File

@ -15057,29 +15057,12 @@ static SDValue LowerExtendedLoad(SDValue Op, const X86Subtarget *Subtarget,
return Sext;
}
// Otherwise we'll shuffle the small elements in the high bits of the
// larger type and perform an arithmetic shift. If the shift is not legal
// it's better to scalarize.
assert(TLI.isOperationLegalOrCustom(ISD::SRA, RegVT) &&
"We can't implement a sext load without an arithmetic right shift!");
// Redistribute the loaded elements into the different locations.
SmallVector<int, 16> ShuffleVec(NumElems * SizeRatio, -1);
for (unsigned i = 0; i != NumElems; ++i)
ShuffleVec[i * SizeRatio + SizeRatio - 1] = i;
SDValue Shuff = DAG.getVectorShuffle(
WideVecVT, dl, SlicedVec, DAG.getUNDEF(WideVecVT), &ShuffleVec[0]);
Shuff = DAG.getBitcast(RegVT, Shuff);
// Build the arithmetic shift.
unsigned Amt = RegVT.getVectorElementType().getSizeInBits() -
MemVT.getVectorElementType().getSizeInBits();
Shuff =
DAG.getNode(ISD::SRA, dl, RegVT, Shuff,
DAG.getConstant(Amt, dl, RegVT));
// Otherwise we'll use SIGN_EXTEND_VECTOR_INREG to sign extend the lowest
// lanes.
assert(TLI.isOperationLegalOrCustom(ISD::SIGN_EXTEND_VECTOR_INREG, RegVT) &&
"We can't implement a sext load without SIGN_EXTEND_VECTOR_INREG!");
SDValue Shuff = DAG.getSignExtendVectorInReg(SlicedVec, dl, RegVT);
DAG.ReplaceAllUsesOfValueWith(SDValue(Ld, 1), TF);
return Shuff;
}