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