1249259Sdim//===---- MipsISelDAGToDAG.h - A Dag to Dag Inst Selector for Mips --------===// 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// This file defines an instruction selector for the MIPS target. 11249259Sdim// 12249259Sdim//===----------------------------------------------------------------------===// 13249259Sdim 14249259Sdim#ifndef MIPSISELDAGTODAG_H 15249259Sdim#define MIPSISELDAGTODAG_H 16249259Sdim 17249259Sdim#include "Mips.h" 18249259Sdim#include "MipsSubtarget.h" 19249259Sdim#include "MipsTargetMachine.h" 20249259Sdim#include "llvm/CodeGen/SelectionDAGISel.h" 21249259Sdim 22249259Sdim//===----------------------------------------------------------------------===// 23249259Sdim// Instruction Selector Implementation 24249259Sdim//===----------------------------------------------------------------------===// 25249259Sdim 26249259Sdim//===----------------------------------------------------------------------===// 27249259Sdim// MipsDAGToDAGISel - MIPS specific code to select MIPS machine 28249259Sdim// instructions for SelectionDAG operations. 29249259Sdim//===----------------------------------------------------------------------===// 30249259Sdimnamespace llvm { 31249259Sdim 32249259Sdimclass MipsDAGToDAGISel : public SelectionDAGISel { 33249259Sdimpublic: 34249259Sdim explicit MipsDAGToDAGISel(MipsTargetMachine &TM) 35249259Sdim : SelectionDAGISel(TM), Subtarget(TM.getSubtarget<MipsSubtarget>()) {} 36249259Sdim 37249259Sdim // Pass Name 38249259Sdim virtual const char *getPassName() const { 39249259Sdim return "MIPS DAG->DAG Pattern Instruction Selection"; 40249259Sdim } 41249259Sdim 42249259Sdim virtual bool runOnMachineFunction(MachineFunction &MF); 43249259Sdim 44249259Sdimprotected: 45249259Sdim SDNode *getGlobalBaseReg(); 46249259Sdim 47249259Sdim /// Keep a pointer to the MipsSubtarget around so that we can make the right 48249259Sdim /// decision when generating code for different targets. 49249259Sdim const MipsSubtarget &Subtarget; 50249259Sdim 51249259Sdimprivate: 52249259Sdim // Include the pieces autogenerated from the target description. 53249259Sdim #include "MipsGenDAGISel.inc" 54249259Sdim 55249259Sdim // Complex Pattern. 56249259Sdim /// (reg + imm). 57249259Sdim virtual bool selectAddrRegImm(SDValue Addr, SDValue &Base, 58249259Sdim SDValue &Offset) const; 59249259Sdim 60263509Sdim // Complex Pattern. 61263509Sdim /// (reg + reg). 62263509Sdim virtual bool selectAddrRegReg(SDValue Addr, SDValue &Base, 63263509Sdim SDValue &Offset) const; 64263509Sdim 65249259Sdim /// Fall back on this function if all else fails. 66249259Sdim virtual bool selectAddrDefault(SDValue Addr, SDValue &Base, 67249259Sdim SDValue &Offset) const; 68249259Sdim 69249259Sdim /// Match integer address pattern. 70249259Sdim virtual bool selectIntAddr(SDValue Addr, SDValue &Base, 71249259Sdim SDValue &Offset) const; 72249259Sdim 73263509Sdim virtual bool selectIntAddrMM(SDValue Addr, SDValue &Base, 74263509Sdim SDValue &Offset) const; 75263509Sdim 76249259Sdim virtual bool selectAddr16(SDNode *Parent, SDValue N, SDValue &Base, 77249259Sdim SDValue &Offset, SDValue &Alias); 78249259Sdim 79263509Sdim /// \brief Select constant vector splats. 80263509Sdim virtual bool selectVSplat(SDNode *N, APInt &Imm) const; 81263509Sdim /// \brief Select constant vector splats whose value fits in a uimm1. 82263509Sdim virtual bool selectVSplatUimm1(SDValue N, SDValue &Imm) const; 83263509Sdim /// \brief Select constant vector splats whose value fits in a uimm2. 84263509Sdim virtual bool selectVSplatUimm2(SDValue N, SDValue &Imm) const; 85263509Sdim /// \brief Select constant vector splats whose value fits in a uimm3. 86263509Sdim virtual bool selectVSplatUimm3(SDValue N, SDValue &Imm) const; 87263509Sdim /// \brief Select constant vector splats whose value fits in a uimm4. 88263509Sdim virtual bool selectVSplatUimm4(SDValue N, SDValue &Imm) const; 89263509Sdim /// \brief Select constant vector splats whose value fits in a uimm5. 90263509Sdim virtual bool selectVSplatUimm5(SDValue N, SDValue &Imm) const; 91263509Sdim /// \brief Select constant vector splats whose value fits in a uimm6. 92263509Sdim virtual bool selectVSplatUimm6(SDValue N, SDValue &Imm) const; 93263509Sdim /// \brief Select constant vector splats whose value fits in a uimm8. 94263509Sdim virtual bool selectVSplatUimm8(SDValue N, SDValue &Imm) const; 95263509Sdim /// \brief Select constant vector splats whose value fits in a simm5. 96263509Sdim virtual bool selectVSplatSimm5(SDValue N, SDValue &Imm) const; 97263509Sdim /// \brief Select constant vector splats whose value is a power of 2. 98263509Sdim virtual bool selectVSplatUimmPow2(SDValue N, SDValue &Imm) const; 99263509Sdim /// \brief Select constant vector splats whose value is the inverse of a 100263509Sdim /// power of 2. 101263509Sdim virtual bool selectVSplatUimmInvPow2(SDValue N, SDValue &Imm) const; 102263509Sdim /// \brief Select constant vector splats whose value is a run of set bits 103263509Sdim /// ending at the most significant bit 104263509Sdim virtual bool selectVSplatMaskL(SDValue N, SDValue &Imm) const; 105263509Sdim /// \brief Select constant vector splats whose value is a run of set bits 106263509Sdim /// starting at bit zero. 107263509Sdim virtual bool selectVSplatMaskR(SDValue N, SDValue &Imm) const; 108263509Sdim 109249259Sdim virtual SDNode *Select(SDNode *N); 110249259Sdim 111249259Sdim virtual std::pair<bool, SDNode*> selectNode(SDNode *Node) = 0; 112249259Sdim 113249259Sdim // getImm - Return a target constant with the specified value. 114249259Sdim inline SDValue getImm(const SDNode *Node, uint64_t Imm) { 115249259Sdim return CurDAG->getTargetConstant(Imm, Node->getValueType(0)); 116249259Sdim } 117249259Sdim 118249259Sdim virtual void processFunctionAfterISel(MachineFunction &MF) = 0; 119249259Sdim 120249259Sdim virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op, 121249259Sdim char ConstraintCode, 122249259Sdim std::vector<SDValue> &OutOps); 123249259Sdim}; 124249259Sdim 125249259Sdim/// createMipsISelDag - This pass converts a legalized DAG into a 126249259Sdim/// MIPS-specific DAG, ready for instruction scheduling. 127249259SdimFunctionPass *createMipsISelDag(MipsTargetMachine &TM); 128249259Sdim 129249259Sdim} 130249259Sdim 131249259Sdim#endif 132