1249259Sdim//===-- MipsSEISelDAGToDAG.h - A Dag to Dag Inst Selector for MipsSE -----===// 2249259Sdim// 3249259Sdim// The LLVM Compiler Infrastructure 4249259Sdim// 5249259Sdim// This file is distributed under the University of Illinois Open Source 6249259Sdim// License. See LICENSE.TXT for details. 7249259Sdim// 8249259Sdim//===----------------------------------------------------------------------===// 9249259Sdim// 10249259Sdim// Subclass of MipsDAGToDAGISel specialized for mips32/64. 11249259Sdim// 12249259Sdim//===----------------------------------------------------------------------===// 13249259Sdim 14280031Sdim#ifndef LLVM_LIB_TARGET_MIPS_MIPSSEISELDAGTODAG_H 15280031Sdim#define LLVM_LIB_TARGET_MIPS_MIPSSEISELDAGTODAG_H 16249259Sdim 17249259Sdim#include "MipsISelDAGToDAG.h" 18249259Sdim 19249259Sdimnamespace llvm { 20249259Sdim 21249259Sdimclass MipsSEDAGToDAGISel : public MipsDAGToDAGISel { 22249259Sdim 23249259Sdimpublic: 24249259Sdim explicit MipsSEDAGToDAGISel(MipsTargetMachine &TM) : MipsDAGToDAGISel(TM) {} 25249259Sdim 26249259Sdimprivate: 27251662Sdim 28276479Sdim bool runOnMachineFunction(MachineFunction &MF) override; 29251662Sdim 30251662Sdim void addDSPCtrlRegOperands(bool IsDef, MachineInstr &MI, 31251662Sdim MachineFunction &MF); 32251662Sdim 33261991Sdim unsigned getMSACtrlReg(const SDValue RegIdx) const; 34261991Sdim 35249259Sdim bool replaceUsesWithZeroReg(MachineRegisterInfo *MRI, const MachineInstr&); 36249259Sdim 37261991Sdim std::pair<SDNode*, SDNode*> selectMULT(SDNode *N, unsigned Opc, SDLoc dl, 38249259Sdim EVT Ty, bool HasLo, bool HasHi); 39249259Sdim 40249259Sdim SDNode *selectAddESubE(unsigned MOp, SDValue InFlag, SDValue CmpLHS, 41261991Sdim SDLoc DL, SDNode *Node) const; 42249259Sdim 43276479Sdim bool selectAddrFrameIndex(SDValue Addr, SDValue &Base, SDValue &Offset) const; 44276479Sdim bool selectAddrFrameIndexOffset(SDValue Addr, SDValue &Base, SDValue &Offset, 45276479Sdim unsigned OffsetBits) const; 46249259Sdim 47276479Sdim bool selectAddrRegImm(SDValue Addr, SDValue &Base, 48276479Sdim SDValue &Offset) const override; 49261991Sdim 50276479Sdim bool selectAddrRegReg(SDValue Addr, SDValue &Base, 51276479Sdim SDValue &Offset) const override; 52249259Sdim 53276479Sdim bool selectAddrDefault(SDValue Addr, SDValue &Base, 54276479Sdim SDValue &Offset) const override; 55249259Sdim 56276479Sdim bool selectIntAddr(SDValue Addr, SDValue &Base, 57276479Sdim SDValue &Offset) const override; 58261991Sdim 59288943Sdim bool selectAddrRegImm9(SDValue Addr, SDValue &Base, 60288943Sdim SDValue &Offset) const; 61288943Sdim 62276479Sdim bool selectAddrRegImm10(SDValue Addr, SDValue &Base, 63276479Sdim SDValue &Offset) const; 64261991Sdim 65276479Sdim bool selectAddrRegImm12(SDValue Addr, SDValue &Base, 66276479Sdim SDValue &Offset) const; 67276479Sdim 68288943Sdim bool selectAddrRegImm16(SDValue Addr, SDValue &Base, 69288943Sdim SDValue &Offset) const; 70288943Sdim 71276479Sdim bool selectIntAddrMM(SDValue Addr, SDValue &Base, 72276479Sdim SDValue &Offset) const override; 73276479Sdim 74288943Sdim bool selectIntAddrLSL2MM(SDValue Addr, SDValue &Base, 75288943Sdim SDValue &Offset) const override; 76288943Sdim 77276479Sdim bool selectIntAddrMSA(SDValue Addr, SDValue &Base, 78276479Sdim SDValue &Offset) const override; 79276479Sdim 80261991Sdim /// \brief Select constant vector splats. 81288943Sdim bool selectVSplat(SDNode *N, APInt &Imm, 82288943Sdim unsigned MinSizeInBits) const override; 83261991Sdim /// \brief Select constant vector splats whose value fits in a given integer. 84276479Sdim bool selectVSplatCommon(SDValue N, SDValue &Imm, bool Signed, 85261991Sdim unsigned ImmBitSize) const; 86261991Sdim /// \brief Select constant vector splats whose value fits in a uimm1. 87276479Sdim bool selectVSplatUimm1(SDValue N, SDValue &Imm) const override; 88261991Sdim /// \brief Select constant vector splats whose value fits in a uimm2. 89276479Sdim bool selectVSplatUimm2(SDValue N, SDValue &Imm) const override; 90261991Sdim /// \brief Select constant vector splats whose value fits in a uimm3. 91276479Sdim bool selectVSplatUimm3(SDValue N, SDValue &Imm) const override; 92261991Sdim /// \brief Select constant vector splats whose value fits in a uimm4. 93276479Sdim bool selectVSplatUimm4(SDValue N, SDValue &Imm) const override; 94261991Sdim /// \brief Select constant vector splats whose value fits in a uimm5. 95276479Sdim bool selectVSplatUimm5(SDValue N, SDValue &Imm) const override; 96261991Sdim /// \brief Select constant vector splats whose value fits in a uimm6. 97276479Sdim bool selectVSplatUimm6(SDValue N, SDValue &Imm) const override; 98261991Sdim /// \brief Select constant vector splats whose value fits in a uimm8. 99276479Sdim bool selectVSplatUimm8(SDValue N, SDValue &Imm) const override; 100261991Sdim /// \brief Select constant vector splats whose value fits in a simm5. 101276479Sdim bool selectVSplatSimm5(SDValue N, SDValue &Imm) const override; 102261991Sdim /// \brief Select constant vector splats whose value is a power of 2. 103276479Sdim bool selectVSplatUimmPow2(SDValue N, SDValue &Imm) const override; 104261991Sdim /// \brief Select constant vector splats whose value is the inverse of a 105261991Sdim /// power of 2. 106276479Sdim bool selectVSplatUimmInvPow2(SDValue N, SDValue &Imm) const override; 107261991Sdim /// \brief Select constant vector splats whose value is a run of set bits 108261991Sdim /// ending at the most significant bit 109276479Sdim bool selectVSplatMaskL(SDValue N, SDValue &Imm) const override; 110261991Sdim /// \brief Select constant vector splats whose value is a run of set bits 111261991Sdim /// starting at bit zero. 112276479Sdim bool selectVSplatMaskR(SDValue N, SDValue &Imm) const override; 113261991Sdim 114276479Sdim std::pair<bool, SDNode*> selectNode(SDNode *Node) override; 115249259Sdim 116276479Sdim void processFunctionAfterISel(MachineFunction &MF) override; 117249259Sdim 118249259Sdim // Insert instructions to initialize the global base register in the 119249259Sdim // first MBB of the function. 120249259Sdim void initGlobalBaseReg(MachineFunction &MF); 121288943Sdim 122288943Sdim bool SelectInlineAsmMemoryOperand(const SDValue &Op, 123288943Sdim unsigned ConstraintID, 124288943Sdim std::vector<SDValue> &OutOps) override; 125249259Sdim}; 126249259Sdim 127249259SdimFunctionPass *createMipsSEISelDag(MipsTargetMachine &TM); 128249259Sdim 129249259Sdim} 130249259Sdim 131249259Sdim#endif 132