mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-30 04:56:49 +00:00
Add shuffle splat pattern for x86 sse shifts.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63193 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
57cd67f693
commit
3becd093cc
@ -7678,28 +7678,32 @@ static SDValue PerformShiftCombine(SDNode* N, SelectionDAG &DAG,
|
|||||||
if (VT != MVT::v2i64 && VT != MVT::v4i32 && VT != MVT::v8i16)
|
if (VT != MVT::v2i64 && VT != MVT::v4i32 && VT != MVT::v8i16)
|
||||||
return SDValue();
|
return SDValue();
|
||||||
|
|
||||||
SDValue ShAmtOp = N->getOperand(1);
|
SDValue ShAmtOp = N->getOperand(1);
|
||||||
if (ShAmtOp.getOpcode() != ISD::BUILD_VECTOR)
|
MVT EltVT = VT.getVectorElementType();
|
||||||
|
SDValue BaseShAmt;
|
||||||
|
if (ShAmtOp.getOpcode() == ISD::BUILD_VECTOR) {
|
||||||
|
unsigned NumElts = VT.getVectorNumElements();
|
||||||
|
unsigned i = 0;
|
||||||
|
for (; i != NumElts; ++i) {
|
||||||
|
SDValue Arg = ShAmtOp.getOperand(i);
|
||||||
|
if (Arg.getOpcode() == ISD::UNDEF) continue;
|
||||||
|
BaseShAmt = Arg;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (; i != NumElts; ++i) {
|
||||||
|
SDValue Arg = ShAmtOp.getOperand(i);
|
||||||
|
if (Arg.getOpcode() == ISD::UNDEF) continue;
|
||||||
|
if (Arg != BaseShAmt) {
|
||||||
|
return SDValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (ShAmtOp.getOpcode() == ISD::VECTOR_SHUFFLE &&
|
||||||
|
isSplatMask(ShAmtOp.getOperand(2).getNode())) {
|
||||||
|
BaseShAmt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, EltVT, ShAmtOp,
|
||||||
|
DAG.getIntPtrConstant(0));
|
||||||
|
} else
|
||||||
return SDValue();
|
return SDValue();
|
||||||
|
|
||||||
unsigned NumElts = VT.getVectorNumElements();
|
|
||||||
unsigned i = 0;
|
|
||||||
SDValue BaseShAmt;
|
|
||||||
for (; i != NumElts; ++i) {
|
|
||||||
SDValue Arg = ShAmtOp.getOperand(i);
|
|
||||||
if (Arg.getOpcode() == ISD::UNDEF) continue;
|
|
||||||
BaseShAmt = Arg;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
for (; i != NumElts; ++i) {
|
|
||||||
SDValue Arg = ShAmtOp.getOperand(i);
|
|
||||||
if (Arg.getOpcode() == ISD::UNDEF) continue;
|
|
||||||
if (Arg != BaseShAmt) {
|
|
||||||
return SDValue();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MVT EltVT = VT.getVectorElementType();
|
|
||||||
if (EltVT.bitsGT(MVT::i32))
|
if (EltVT.bitsGT(MVT::i32))
|
||||||
BaseShAmt = DAG.getNode(ISD::TRUNCATE, MVT::i32, BaseShAmt);
|
BaseShAmt = DAG.getNode(ISD::TRUNCATE, MVT::i32, BaseShAmt);
|
||||||
else if (EltVT.bitsLT(MVT::i32))
|
else if (EltVT.bitsLT(MVT::i32))
|
||||||
|
Loading…
Reference in New Issue
Block a user