mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 19:12:56 +02:00
[cleanup] Hoist an if-else chain on ISD opcodes (really designed for
switches) into a switch, and sink them into a dispatch function that can return the result rather than awkward variable setting with breaks. llvm-svn: 212166
This commit is contained in:
parent
0418802b47
commit
d3bf1762bd
@ -59,6 +59,12 @@ class VectorLegalizer {
|
||||
/// \brief Implements unrolling a VSETCC.
|
||||
SDValue UnrollVSETCC(SDValue Op);
|
||||
|
||||
/// \brief Implement expand-based legalization of vector operations.
|
||||
///
|
||||
/// This is just a high-level routine to dispatch to specific code paths for
|
||||
/// operations to legalize them.
|
||||
SDValue Expand(SDValue Op);
|
||||
|
||||
/// \brief Implements expansion for FNEG; falls back to UnrollVectorOp if
|
||||
/// FSUB isn't legal.
|
||||
///
|
||||
@ -295,23 +301,7 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) {
|
||||
// FALL THROUGH
|
||||
}
|
||||
case TargetLowering::Expand:
|
||||
if (Node->getOpcode() == ISD::SIGN_EXTEND_INREG)
|
||||
Result = ExpandSEXTINREG(Op);
|
||||
else if (Node->getOpcode() == ISD::BSWAP)
|
||||
Result = ExpandBSWAP(Op);
|
||||
else if (Node->getOpcode() == ISD::VSELECT)
|
||||
Result = ExpandVSELECT(Op);
|
||||
else if (Node->getOpcode() == ISD::SELECT)
|
||||
Result = ExpandSELECT(Op);
|
||||
else if (Node->getOpcode() == ISD::UINT_TO_FP)
|
||||
Result = ExpandUINT_TO_FLOAT(Op);
|
||||
else if (Node->getOpcode() == ISD::FNEG)
|
||||
Result = ExpandFNEG(Op);
|
||||
else if (Node->getOpcode() == ISD::SETCC)
|
||||
Result = UnrollVSETCC(Op);
|
||||
else
|
||||
Result = DAG.UnrollVectorOp(Op.getNode());
|
||||
break;
|
||||
Result = Expand(Op);
|
||||
}
|
||||
|
||||
// Make sure that the generated code is itself legal.
|
||||
@ -620,6 +610,27 @@ SDValue VectorLegalizer::ExpandStore(SDValue Op) {
|
||||
return TF;
|
||||
}
|
||||
|
||||
SDValue VectorLegalizer::Expand(SDValue Op) {
|
||||
switch (Op->getOpcode()) {
|
||||
case ISD::SIGN_EXTEND_INREG:
|
||||
return ExpandSEXTINREG(Op);
|
||||
case ISD::BSWAP:
|
||||
return ExpandBSWAP(Op);
|
||||
case ISD::VSELECT:
|
||||
return ExpandVSELECT(Op);
|
||||
case ISD::SELECT:
|
||||
return ExpandSELECT(Op);
|
||||
case ISD::UINT_TO_FP:
|
||||
return ExpandUINT_TO_FLOAT(Op);
|
||||
case ISD::FNEG:
|
||||
return ExpandFNEG(Op);
|
||||
case ISD::SETCC:
|
||||
return UnrollVSETCC(Op);
|
||||
default:
|
||||
return DAG.UnrollVectorOp(Op.getNode());
|
||||
}
|
||||
}
|
||||
|
||||
SDValue VectorLegalizer::ExpandSELECT(SDValue Op) {
|
||||
// Lower a select instruction where the condition is a scalar and the
|
||||
// operands are vectors. Lower this select to VSELECT and implement it
|
||||
|
Loading…
Reference in New Issue
Block a user