636081f6b9a9081f12e81787a3a9c3d3d58f3075
[oota-llvm.git] / include / llvm / CodeGen / FastISel.h
1 //===-- FastISel.h - Definition of the FastISel class ---------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the FastISel class.
11 //  
12 //===----------------------------------------------------------------------===//
13   
14 #ifndef LLVM_CODEGEN_FASTISEL_H
15 #define LLVM_CODEGEN_FASTISEL_H
16
17 #include "llvm/BasicBlock.h"
18 #include "llvm/ADT/DenseMap.h"
19 #include "llvm/CodeGen/SelectionDAGNodes.h"
20
21 namespace llvm {
22
23 class MachineBasicBlock;
24 class MachineFunction;
25 class MachineRegisterInfo;
26 class TargetData;
27 class TargetInstrInfo;
28 class TargetLowering;
29 class TargetMachine;
30 class TargetRegisterClass;
31
32 /// FastISel - This is a fast-path instruction selection class that
33 /// generates poor code and doesn't support illegal types or non-trivial
34 /// lowering, but runs quickly.
35 class FastISel {
36 protected:
37   MachineBasicBlock *MBB;
38   MachineFunction &MF;
39   MachineRegisterInfo &MRI;
40   const TargetMachine &TM;
41   const TargetData &TD;
42   const TargetInstrInfo &TII;
43   const TargetLowering &TLI;
44
45 public:
46   /// SelectInstructions - Do "fast" instruction selection over the
47   /// LLVM IR instructions in the range [Begin, N) where N is either
48   /// End or the first unsupported instruction. Return N.
49   /// ValueMap is filled in with a mapping of LLVM IR Values to
50   /// virtual register numbers. MBB is a block to which to append
51   /// the generated MachineInstrs.
52   BasicBlock::iterator
53   SelectInstructions(BasicBlock::iterator Begin, BasicBlock::iterator End,
54                      DenseMap<const Value*, unsigned> &ValueMap,
55                      DenseMap<const BasicBlock*, MachineBasicBlock *> &MBBMap,
56                      MachineBasicBlock *MBB);
57
58   virtual ~FastISel();
59
60 protected:
61   explicit FastISel(MachineFunction &mf);
62
63   /// FastEmit_r - This method is called by target-independent code
64   /// to request that an instruction with the given type and opcode
65   /// be emitted.
66   virtual unsigned FastEmit_(MVT::SimpleValueType VT,
67                              ISD::NodeType Opcode);
68
69   /// FastEmit_r - This method is called by target-independent code
70   /// to request that an instruction with the given type, opcode, and
71   /// register operand be emitted.
72   ///
73   virtual unsigned FastEmit_r(MVT::SimpleValueType VT,
74                               ISD::NodeType Opcode, unsigned Op0);
75
76   /// FastEmit_rr - This method is called by target-independent code
77   /// to request that an instruction with the given type, opcode, and
78   /// register operands be emitted.
79   ///
80   virtual unsigned FastEmit_rr(MVT::SimpleValueType VT,
81                                ISD::NodeType Opcode,
82                                unsigned Op0, unsigned Op1);
83
84   /// FastEmit_i - This method is called by target-independent code
85   /// to request that an instruction with the given type which materialize
86   /// the specified immediate value.
87   virtual unsigned FastEmit_i(MVT::SimpleValueType VT, uint64_t Imm);
88
89   /// FastEmit_ri - This method is called by target-independent code
90   /// to request that an instruction with the given type, opcode, and
91   /// register and immediate operands be emitted.
92   ///
93   virtual unsigned FastEmit_ri(MVT::SimpleValueType VT,
94                                ISD::NodeType Opcode,
95                                unsigned Op0, uint64_t Imm);
96
97   /// FastEmit_rri - This method is called by target-independent code
98   /// to request that an instruction with the given type, opcode, and
99   /// register and immediate operands be emitted.
100   ///
101   virtual unsigned FastEmit_rri(MVT::SimpleValueType VT,
102                                 ISD::NodeType Opcode,
103                                 unsigned Op0, unsigned Op1, uint64_t Imm);
104
105   /// FastEmit_ri_ - This method is a wrapper of FastEmit_ri. It first tries
106   /// to emit an instruction with an immediate operand using FastEmit_ri.
107   /// If that fails, it materializes the immediate into a register and try
108   /// FastEmit_rr instead.
109   unsigned FastEmit_ri_(MVT::SimpleValueType VT,
110                         ISD::NodeType Opcode,
111                         unsigned Op0, uint64_t Imm,
112                         MVT::SimpleValueType ImmType);
113
114   /// FastEmitInst_ - Emit a MachineInstr with no operands and a
115   /// result register in the given register class.
116   ///
117   unsigned FastEmitInst_(unsigned MachineInstOpcode,
118                          const TargetRegisterClass *RC);
119
120   /// FastEmitInst_r - Emit a MachineInstr with one register operand
121   /// and a result register in the given register class.
122   ///
123   unsigned FastEmitInst_r(unsigned MachineInstOpcode,
124                           const TargetRegisterClass *RC,
125                           unsigned Op0);
126
127   /// FastEmitInst_rr - Emit a MachineInstr with two register operands
128   /// and a result register in the given register class.
129   ///
130   unsigned FastEmitInst_rr(unsigned MachineInstOpcode,
131                            const TargetRegisterClass *RC,
132                            unsigned Op0, unsigned Op1);
133
134   /// FastEmitInst_ri - Emit a MachineInstr with two register operands
135   /// and a result register in the given register class.
136   ///
137   unsigned FastEmitInst_ri(unsigned MachineInstOpcode,
138                            const TargetRegisterClass *RC,
139                            unsigned Op0, uint64_t Imm);
140
141   /// FastEmitInst_rri - Emit a MachineInstr with two register operands,
142   /// an immediate, and a result register in the given register class.
143   ///
144   unsigned FastEmitInst_rri(unsigned MachineInstOpcode,
145                             const TargetRegisterClass *RC,
146                             unsigned Op0, unsigned Op1, uint64_t Imm);
147
148 private:
149   unsigned createResultReg(const TargetRegisterClass *RC);
150
151   bool SelectBinaryOp(Instruction *I, ISD::NodeType ISDOpcode,
152                       DenseMap<const Value*, unsigned> &ValueMap);
153
154   bool SelectGetElementPtr(Instruction *I,
155                            DenseMap<const Value*, unsigned> &ValueMap);
156 };
157
158 }
159
160 #endif