#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/VectorUtils.h"
#include "llvm/CodeGen/ISDOpcodes.h"
#include "llvm/CodeGen/SelectionDAG.h"
#include "llvm/CodeGen/SelectionDAGNodes.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/ValueTypes.h"
#include "llvm/CodeGenTypes/MachineValueType.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include <cassert>
#include <cstdint>
#include <iterator>
#include <utility>
usingnamespacellvm;
#define DEBUG_TYPE …
namespace {
class VectorLegalizer { … };
}
bool VectorLegalizer::Run() { … }
SDValue VectorLegalizer::TranslateLegalizeResults(SDValue Op, SDNode *Result) { … }
SDValue
VectorLegalizer::RecursivelyLegalizeResults(SDValue Op,
MutableArrayRef<SDValue> Results) { … }
SDValue VectorLegalizer::LegalizeOp(SDValue Op) { … }
bool VectorLegalizer::LowerOperationWrapper(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
void VectorLegalizer::PromoteSETCC(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
void VectorLegalizer::PromoteSTRICT(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
void VectorLegalizer::Promote(SDNode *Node, SmallVectorImpl<SDValue> &Results) { … }
void VectorLegalizer::PromoteINT_TO_FP(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
void VectorLegalizer::PromoteFP_TO_INT(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
std::pair<SDValue, SDValue> VectorLegalizer::ExpandLoad(SDNode *N) { … }
SDValue VectorLegalizer::ExpandStore(SDNode *N) { … }
void VectorLegalizer::Expand(SDNode *Node, SmallVectorImpl<SDValue> &Results) { … }
SDValue VectorLegalizer::ExpandSELECT(SDNode *Node) { … }
SDValue VectorLegalizer::ExpandSEXTINREG(SDNode *Node) { … }
SDValue VectorLegalizer::ExpandANY_EXTEND_VECTOR_INREG(SDNode *Node) { … }
SDValue VectorLegalizer::ExpandSIGN_EXTEND_VECTOR_INREG(SDNode *Node) { … }
SDValue VectorLegalizer::ExpandZERO_EXTEND_VECTOR_INREG(SDNode *Node) { … }
static void createBSWAPShuffleMask(EVT VT, SmallVectorImpl<int> &ShuffleMask) { … }
SDValue VectorLegalizer::ExpandBSWAP(SDNode *Node) { … }
void VectorLegalizer::ExpandBITREVERSE(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
SDValue VectorLegalizer::ExpandVSELECT(SDNode *Node) { … }
SDValue VectorLegalizer::ExpandVP_SELECT(SDNode *Node) { … }
SDValue VectorLegalizer::ExpandVP_MERGE(SDNode *Node) { … }
SDValue VectorLegalizer::ExpandVP_REM(SDNode *Node) { … }
SDValue VectorLegalizer::ExpandVP_FNEG(SDNode *Node) { … }
SDValue VectorLegalizer::ExpandVP_FABS(SDNode *Node) { … }
SDValue VectorLegalizer::ExpandVP_FCOPYSIGN(SDNode *Node) { … }
void VectorLegalizer::ExpandFP_TO_UINT(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
void VectorLegalizer::ExpandUINT_TO_FLOAT(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
SDValue VectorLegalizer::ExpandFNEG(SDNode *Node) { … }
SDValue VectorLegalizer::ExpandFABS(SDNode *Node) { … }
SDValue VectorLegalizer::ExpandFCOPYSIGN(SDNode *Node) { … }
void VectorLegalizer::ExpandFSUB(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
void VectorLegalizer::ExpandSETCC(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
void VectorLegalizer::ExpandUADDSUBO(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
void VectorLegalizer::ExpandSADDSUBO(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
void VectorLegalizer::ExpandMULO(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
void VectorLegalizer::ExpandFixedPointDiv(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
void VectorLegalizer::ExpandStrictFPOp(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
void VectorLegalizer::ExpandREM(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
bool VectorLegalizer::tryExpandVecMathCall(SDNode *Node, RTLIB::Libcall LC,
SmallVectorImpl<SDValue> &Results) { … }
bool VectorLegalizer::tryExpandVecMathCall(
SDNode *Node, RTLIB::Libcall Call_F32, RTLIB::Libcall Call_F64,
RTLIB::Libcall Call_F80, RTLIB::Libcall Call_F128,
RTLIB::Libcall Call_PPCF128, SmallVectorImpl<SDValue> &Results) { … }
void VectorLegalizer::UnrollStrictFPOp(SDNode *Node,
SmallVectorImpl<SDValue> &Results) { … }
SDValue VectorLegalizer::UnrollVSETCC(SDNode *Node) { … }
bool SelectionDAG::LegalizeVectors() { … }