forked from OSchip/llvm-project
[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:
parent
629c63b528
commit
bc707d04a4
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue