mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
[X86] Remove vector promotion handling from the ReplaceNodeResults ISD::MUL handling code.
We now widen illegal vector types so we don't need this anymore. llvm-svn: 368384
This commit is contained in:
parent
980f06a21f
commit
03c1f63231
@ -817,10 +817,7 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
|
||||
}
|
||||
|
||||
setOperationAction(ISD::MUL, MVT::v2i8, Custom);
|
||||
setOperationAction(ISD::MUL, MVT::v2i16, Custom);
|
||||
setOperationAction(ISD::MUL, MVT::v2i32, Custom);
|
||||
setOperationAction(ISD::MUL, MVT::v4i8, Custom);
|
||||
setOperationAction(ISD::MUL, MVT::v4i16, Custom);
|
||||
setOperationAction(ISD::MUL, MVT::v8i8, Custom);
|
||||
|
||||
setOperationAction(ISD::MUL, MVT::v16i8, Custom);
|
||||
@ -27489,31 +27486,20 @@ void X86TargetLowering::ReplaceNodeResults(SDNode *N,
|
||||
}
|
||||
case ISD::MUL: {
|
||||
EVT VT = N->getValueType(0);
|
||||
assert(VT.isVector() && "Unexpected VT");
|
||||
if (getTypeAction(*DAG.getContext(), VT) == TypePromoteInteger &&
|
||||
VT.getVectorNumElements() == 2) {
|
||||
// Promote to a pattern that will be turned into PMULUDQ.
|
||||
SDValue N0 = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::v2i64,
|
||||
N->getOperand(0));
|
||||
SDValue N1 = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::v2i64,
|
||||
N->getOperand(1));
|
||||
SDValue Mul = DAG.getNode(X86ISD::PMULUDQ, dl, MVT::v2i64, N0, N1);
|
||||
Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, VT, Mul));
|
||||
} else if (getTypeAction(*DAG.getContext(), VT) == TypeWidenVector &&
|
||||
VT.getVectorElementType() == MVT::i8) {
|
||||
// Pre-promote these to vXi16 to avoid op legalization thinking all 16
|
||||
// elements are needed.
|
||||
MVT MulVT = MVT::getVectorVT(MVT::i16, VT.getVectorNumElements());
|
||||
SDValue Op0 = DAG.getNode(ISD::ANY_EXTEND, dl, MulVT, N->getOperand(0));
|
||||
SDValue Op1 = DAG.getNode(ISD::ANY_EXTEND, dl, MulVT, N->getOperand(1));
|
||||
SDValue Res = DAG.getNode(ISD::MUL, dl, MulVT, Op0, Op1);
|
||||
Res = DAG.getNode(ISD::TRUNCATE, dl, VT, Res);
|
||||
unsigned NumConcats = 16 / VT.getVectorNumElements();
|
||||
SmallVector<SDValue, 8> ConcatOps(NumConcats, DAG.getUNDEF(VT));
|
||||
ConcatOps[0] = Res;
|
||||
Res = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v16i8, ConcatOps);
|
||||
Results.push_back(Res);
|
||||
}
|
||||
assert(getTypeAction(*DAG.getContext(), VT) == TypeWidenVector &&
|
||||
VT.getVectorElementType() == MVT::i8 && "Unexpected VT!");
|
||||
// Pre-promote these to vXi16 to avoid op legalization thinking all 16
|
||||
// elements are needed.
|
||||
MVT MulVT = MVT::getVectorVT(MVT::i16, VT.getVectorNumElements());
|
||||
SDValue Op0 = DAG.getNode(ISD::ANY_EXTEND, dl, MulVT, N->getOperand(0));
|
||||
SDValue Op1 = DAG.getNode(ISD::ANY_EXTEND, dl, MulVT, N->getOperand(1));
|
||||
SDValue Res = DAG.getNode(ISD::MUL, dl, MulVT, Op0, Op1);
|
||||
Res = DAG.getNode(ISD::TRUNCATE, dl, VT, Res);
|
||||
unsigned NumConcats = 16 / VT.getVectorNumElements();
|
||||
SmallVector<SDValue, 8> ConcatOps(NumConcats, DAG.getUNDEF(VT));
|
||||
ConcatOps[0] = Res;
|
||||
Res = DAG.getNode(ISD::CONCAT_VECTORS, dl, MVT::v16i8, ConcatOps);
|
||||
Results.push_back(Res);
|
||||
return;
|
||||
}
|
||||
case ISD::UADDSAT:
|
||||
|
Loading…
Reference in New Issue
Block a user