forked from OSchip/llvm-project
[VE][NFC] Factor out helper functions
Factor out some helper functions to cleanup VEISelLowering. Reviewed By: kaz7 Differential Revision: https://reviews.llvm.org/D117683
This commit is contained in:
parent
6a19cb837c
commit
7950010e49
|
@ -19,9 +19,39 @@
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
|
/// \returns the VVP_* SDNode opcode corresponsing to \p OC.
|
||||||
|
Optional<unsigned> getVVPOpcode(unsigned Opcode) {
|
||||||
|
switch (Opcode) {
|
||||||
|
#define HANDLE_VP_TO_VVP(VPOPC, VVPNAME) \
|
||||||
|
case ISD::VPOPC: \
|
||||||
|
return VEISD::VVPNAME;
|
||||||
|
#define ADD_VVP_OP(VVPNAME, SDNAME) \
|
||||||
|
case VEISD::VVPNAME: \
|
||||||
|
case ISD::SDNAME: \
|
||||||
|
return VEISD::VVPNAME;
|
||||||
|
#include "VVPNodes.def"
|
||||||
|
}
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isVVPBinaryOp(unsigned VVPOpcode) {
|
||||||
|
switch (VVPOpcode) {
|
||||||
|
#define ADD_BINARY_VVP_OP(VVPNAME, ...) \
|
||||||
|
case VEISD::VVPNAME: \
|
||||||
|
return true;
|
||||||
|
#include "VVPNodes.def"
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
SDValue VECustomDAG::getConstant(uint64_t Val, EVT VT, bool IsTarget,
|
SDValue VECustomDAG::getConstant(uint64_t Val, EVT VT, bool IsTarget,
|
||||||
bool IsOpaque) const {
|
bool IsOpaque) const {
|
||||||
return DAG.getConstant(Val, DL, VT, IsTarget, IsOpaque);
|
return DAG.getConstant(Val, DL, VT, IsTarget, IsOpaque);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDValue VECustomDAG::getBroadcast(EVT ResultVT, SDValue Scalar,
|
||||||
|
SDValue AVL) const {
|
||||||
|
return getNode(VEISD::VEC_BROADCAST, ResultVT, {Scalar, AVL});
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace llvm
|
} // namespace llvm
|
||||||
|
|
|
@ -21,6 +21,10 @@
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
|
Optional<unsigned> getVVPOpcode(unsigned Opcode);
|
||||||
|
|
||||||
|
bool isVVPBinaryOp(unsigned Opcode);
|
||||||
|
|
||||||
class VECustomDAG {
|
class VECustomDAG {
|
||||||
SelectionDAG &DAG;
|
SelectionDAG &DAG;
|
||||||
SDLoc DL;
|
SDLoc DL;
|
||||||
|
@ -64,6 +68,8 @@ public:
|
||||||
|
|
||||||
SDValue getConstant(uint64_t Val, EVT VT, bool IsTarget = false,
|
SDValue getConstant(uint64_t Val, EVT VT, bool IsTarget = false,
|
||||||
bool IsOpaque = false) const;
|
bool IsOpaque = false) const;
|
||||||
|
|
||||||
|
SDValue getBroadcast(EVT ResultVT, SDValue Scalar, SDValue AVL) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace llvm
|
} // namespace llvm
|
||||||
|
|
|
@ -1661,8 +1661,7 @@ SDValue VETargetLowering::lowerBUILD_VECTOR(SDValue Op,
|
||||||
MVT LegalResVT = MVT::getVectorVT(ElemVT, 256);
|
MVT LegalResVT = MVT::getVectorVT(ElemVT, 256);
|
||||||
|
|
||||||
auto AVL = CDAG.getConstant(NumEls, MVT::i32);
|
auto AVL = CDAG.getConstant(NumEls, MVT::i32);
|
||||||
return CDAG.getNode(VEISD::VEC_BROADCAST, LegalResVT,
|
return CDAG.getBroadcast(LegalResVT, Op.getOperand(0), AVL);
|
||||||
{Op.getOperand(0), AVL});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expand
|
// Expand
|
||||||
|
@ -2667,21 +2666,6 @@ bool VETargetLowering::hasAndNot(SDValue Y) const {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \returns the VVP_* SDNode opcode corresponsing to \p OC.
|
|
||||||
static Optional<unsigned> getVVPOpcode(unsigned Opcode) {
|
|
||||||
switch (Opcode) {
|
|
||||||
#define HANDLE_VP_TO_VVP(VPOPC, VVPNAME) \
|
|
||||||
case ISD::VPOPC: \
|
|
||||||
return VEISD::VVPNAME;
|
|
||||||
#define ADD_VVP_OP(VVPNAME, SDNAME) \
|
|
||||||
case VEISD::VVPNAME: \
|
|
||||||
case ISD::SDNAME: \
|
|
||||||
return VEISD::VVPNAME;
|
|
||||||
#include "VVPNodes.def"
|
|
||||||
}
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDValue VETargetLowering::lowerToVVP(SDValue Op, SelectionDAG &DAG) const {
|
SDValue VETargetLowering::lowerToVVP(SDValue Op, SelectionDAG &DAG) const {
|
||||||
// Can we represent this as a VVP node.
|
// Can we represent this as a VVP node.
|
||||||
const unsigned Opcode = Op->getOpcode();
|
const unsigned Opcode = Op->getOpcode();
|
||||||
|
@ -2711,26 +2695,15 @@ SDValue VETargetLowering::lowerToVVP(SDValue Op, SelectionDAG &DAG) const {
|
||||||
// Materialize the VL parameter.
|
// Materialize the VL parameter.
|
||||||
AVL = CDAG.getConstant(OpVecVT.getVectorNumElements(), MVT::i32);
|
AVL = CDAG.getConstant(OpVecVT.getVectorNumElements(), MVT::i32);
|
||||||
SDValue ConstTrue = CDAG.getConstant(1, MVT::i32);
|
SDValue ConstTrue = CDAG.getConstant(1, MVT::i32);
|
||||||
Mask = CDAG.getNode(VEISD::VEC_BROADCAST, MaskVT,
|
Mask = CDAG.getBroadcast(MaskVT, ConstTrue, AVL);
|
||||||
ConstTrue); // emit a VEISD::VEC_BROADCAST here.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Categories we are interested in.
|
if (isVVPBinaryOp(VVPOpcode)) {
|
||||||
bool IsBinaryOp = false;
|
|
||||||
|
|
||||||
switch (VVPOpcode) {
|
|
||||||
#define ADD_BINARY_VVP_OP(VVPNAME, ...) \
|
|
||||||
case VEISD::VVPNAME: \
|
|
||||||
IsBinaryOp = true; \
|
|
||||||
break;
|
|
||||||
#include "VVPNodes.def"
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IsBinaryOp) {
|
|
||||||
assert(LegalVecVT.isSimple());
|
assert(LegalVecVT.isSimple());
|
||||||
return CDAG.getNode(VVPOpcode, LegalVecVT,
|
return CDAG.getNode(VVPOpcode, LegalVecVT,
|
||||||
{Op->getOperand(0), Op->getOperand(1), Mask, AVL});
|
{Op->getOperand(0), Op->getOperand(1), Mask, AVL});
|
||||||
} else if (VVPOpcode == VEISD::VVP_SELECT) {
|
}
|
||||||
|
if (VVPOpcode == VEISD::VVP_SELECT) {
|
||||||
auto Mask = Op->getOperand(0);
|
auto Mask = Op->getOperand(0);
|
||||||
auto OnTrue = Op->getOperand(1);
|
auto OnTrue = Op->getOperand(1);
|
||||||
auto OnFalse = Op->getOperand(2);
|
auto OnFalse = Op->getOperand(2);
|
||||||
|
|
Loading…
Reference in New Issue