#ifndef LLVM_LIB_TARGET_MIPS_MIPSISELDAGTODAG_H
#define LLVM_LIB_TARGET_MIPS_MIPSISELDAGTODAG_H
#include "Mips.h"
#include "MipsSubtarget.h"
#include "MipsTargetMachine.h"
#include "llvm/CodeGen/SelectionDAGISel.h"
namespace llvm {
class MipsDAGToDAGISel : public SelectionDAGISel {
public:
explicit MipsDAGToDAGISel(MipsTargetMachine &TM, CodeGenOpt::Level OL)
: SelectionDAGISel(TM, OL), Subtarget(nullptr) {}
StringRef getPassName() const override {
return "MIPS DAG->DAG Pattern Instruction Selection";
}
bool runOnMachineFunction(MachineFunction &MF) override;
void getAnalysisUsage(AnalysisUsage &AU) const override;
protected:
SDNode *getGlobalBaseReg();
const MipsSubtarget *Subtarget;
private:
#include "MipsGenDAGISel.inc"
virtual bool selectAddrRegImm(SDValue Addr, SDValue &Base,
SDValue &Offset) const;
virtual bool selectAddrDefault(SDValue Addr, SDValue &Base,
SDValue &Offset) const;
virtual bool selectIntAddr(SDValue Addr, SDValue &Base,
SDValue &Offset) const;
virtual bool selectIntAddr11MM(SDValue Addr, SDValue &Base,
SDValue &Offset) const;
virtual bool selectIntAddr12MM(SDValue Addr, SDValue &Base,
SDValue &Offset) const;
virtual bool selectIntAddr16MM(SDValue Addr, SDValue &Base,
SDValue &Offset) const;
virtual bool selectIntAddrLSL2MM(SDValue Addr, SDValue &Base,
SDValue &Offset) const;
virtual bool selectIntAddrSImm10(SDValue Addr, SDValue &Base,
SDValue &Offset) const;
virtual bool selectIntAddrSImm10Lsl1(SDValue Addr, SDValue &Base,
SDValue &Offset) const;
virtual bool selectIntAddrSImm10Lsl2(SDValue Addr, SDValue &Base,
SDValue &Offset) const;
virtual bool selectIntAddrSImm10Lsl3(SDValue Addr, SDValue &Base,
SDValue &Offset) const;
virtual bool selectAddr16(SDValue Addr, SDValue &Base, SDValue &Offset);
virtual bool selectAddr16SP(SDValue Addr, SDValue &Base, SDValue &Offset);
virtual bool selectVSplat(SDNode *N, APInt &Imm,
unsigned MinSizeInBits) const;
virtual bool selectVSplatUimm1(SDValue N, SDValue &Imm) const;
virtual bool selectVSplatUimm2(SDValue N, SDValue &Imm) const;
virtual bool selectVSplatUimm3(SDValue N, SDValue &Imm) const;
virtual bool selectVSplatUimm4(SDValue N, SDValue &Imm) const;
virtual bool selectVSplatUimm5(SDValue N, SDValue &Imm) const;
virtual bool selectVSplatUimm6(SDValue N, SDValue &Imm) const;
virtual bool selectVSplatUimm8(SDValue N, SDValue &Imm) const;
virtual bool selectVSplatSimm5(SDValue N, SDValue &Imm) const;
virtual bool selectVSplatUimmPow2(SDValue N, SDValue &Imm) const;
virtual bool selectVSplatUimmInvPow2(SDValue N, SDValue &Imm) const;
virtual bool selectVSplatMaskL(SDValue N, SDValue &Imm) const;
virtual bool selectVSplatMaskR(SDValue N, SDValue &Imm) const;
bool selectVecAddAsVecSubIfProfitable(SDNode *Node);
void Select(SDNode *N) override;
virtual bool trySelect(SDNode *Node) = 0;
inline SDValue getImm(const SDNode *Node, uint64_t Imm) {
return CurDAG->getTargetConstant(Imm, SDLoc(Node), Node->getValueType(0));
}
virtual void processFunctionAfterISel(MachineFunction &MF) = 0;
bool SelectInlineAsmMemoryOperand(const SDValue &Op,
unsigned ConstraintID,
std::vector<SDValue> &OutOps) override;
};
}
#endif