ARM assembly parsing for ASR(immediate).
[oota-llvm.git] / lib / Target / PowerPC / PPCHazardRecognizers.cpp
1 //===-- PPCHazardRecognizers.cpp - PowerPC Hazard Recognizer Impls --------===//
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 implements hazard recognizers for scheduling on PowerPC processors.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #define DEBUG_TYPE "pre-RA-sched"
15 #include "PPCHazardRecognizers.h"
16 #include "PPC.h"
17 #include "PPCInstrInfo.h"
18 #include "llvm/CodeGen/ScheduleDAG.h"
19 #include "llvm/Support/Debug.h"
20 #include "llvm/Support/ErrorHandling.h"
21 #include "llvm/Support/raw_ostream.h"
22 using namespace llvm;
23
24 //===----------------------------------------------------------------------===//
25 // PowerPC 440 Hazard Recognizer
26 void PPCHazardRecognizer440::EmitInstruction(SUnit *SU) {
27   const MCInstrDesc *MCID = DAG->getInstrDesc(SU);
28   if (!MCID) {
29     // This is a PPC pseudo-instruction.
30     // FIXME: Should something else be done?
31     return;
32   }
33
34   ScoreboardHazardRecognizer::EmitInstruction(SU);
35 }
36
37 //===----------------------------------------------------------------------===//
38 // PowerPC 970 Hazard Recognizer
39 //
40 // This models the dispatch group formation of the PPC970 processor.  Dispatch
41 // groups are bundles of up to five instructions that can contain various mixes
42 // of instructions.  The PPC970 can dispatch a peak of 4 non-branch and one
43 // branch instruction per-cycle.
44 //
45 // There are a number of restrictions to dispatch group formation: some
46 // instructions can only be issued in the first slot of a dispatch group, & some
47 // instructions fill an entire dispatch group.  Additionally, only branches can
48 // issue in the 5th (last) slot.
49 //
50 // Finally, there are a number of "structural" hazards on the PPC970.  These
51 // conditions cause large performance penalties due to misprediction, recovery,
52 // and replay logic that has to happen.  These cases include setting a CTR and
53 // branching through it in the same dispatch group, and storing to an address,
54 // then loading from the same address within a dispatch group.  To avoid these
55 // conditions, we insert no-op instructions when appropriate.
56 //
57 // FIXME: This is missing some significant cases:
58 //   1. Modeling of microcoded instructions.
59 //   2. Handling of serialized operations.
60 //   3. Handling of the esoteric cases in "Resource-based Instruction Grouping".
61 //
62
63 PPCHazardRecognizer970::PPCHazardRecognizer970(const TargetInstrInfo &tii)
64   : TII(tii) {
65   EndDispatchGroup();
66 }
67
68 void PPCHazardRecognizer970::EndDispatchGroup() {
69   DEBUG(errs() << "=== Start of dispatch group\n");
70   NumIssued = 0;
71
72   // Structural hazard info.
73   HasCTRSet = false;
74   NumStores = 0;
75 }
76
77
78 PPCII::PPC970_Unit
79 PPCHazardRecognizer970::GetInstrType(unsigned Opcode,
80                                      bool &isFirst, bool &isSingle,
81                                      bool &isCracked,
82                                      bool &isLoad, bool &isStore) {
83   if ((int)Opcode >= 0) {
84     isFirst = isSingle = isCracked = isLoad = isStore = false;
85     return PPCII::PPC970_Pseudo;
86   }
87   Opcode = ~Opcode;
88
89   const MCInstrDesc &MCID = TII.get(Opcode);
90
91   isLoad  = MCID.mayLoad();
92   isStore = MCID.mayStore();
93
94   uint64_t TSFlags = MCID.TSFlags;
95
96   isFirst   = TSFlags & PPCII::PPC970_First;
97   isSingle  = TSFlags & PPCII::PPC970_Single;
98   isCracked = TSFlags & PPCII::PPC970_Cracked;
99   return (PPCII::PPC970_Unit)(TSFlags & PPCII::PPC970_Mask);
100 }
101
102 /// isLoadOfStoredAddress - If we have a load from the previously stored pointer
103 /// as indicated by StorePtr1/StorePtr2/StoreSize, return true.
104 bool PPCHazardRecognizer970::
105 isLoadOfStoredAddress(unsigned LoadSize, SDValue Ptr1, SDValue Ptr2) const {
106   for (unsigned i = 0, e = NumStores; i != e; ++i) {
107     // Handle exact and commuted addresses.
108     if (Ptr1 == StorePtr1[i] && Ptr2 == StorePtr2[i])
109       return true;
110     if (Ptr2 == StorePtr1[i] && Ptr1 == StorePtr2[i])
111       return true;
112
113     // Okay, we don't have an exact match, if this is an indexed offset, see if
114     // we have overlap (which happens during fp->int conversion for example).
115     if (StorePtr2[i] == Ptr2) {
116       if (ConstantSDNode *StoreOffset = dyn_cast<ConstantSDNode>(StorePtr1[i]))
117         if (ConstantSDNode *LoadOffset = dyn_cast<ConstantSDNode>(Ptr1)) {
118           // Okay the base pointers match, so we have [c1+r] vs [c2+r].  Check
119           // to see if the load and store actually overlap.
120           int StoreOffs = StoreOffset->getZExtValue();
121           int LoadOffs  = LoadOffset->getZExtValue();
122           if (StoreOffs < LoadOffs) {
123             if (int(StoreOffs+StoreSize[i]) > LoadOffs) return true;
124           } else {
125             if (int(LoadOffs+LoadSize) > StoreOffs) return true;
126           }
127         }
128     }
129   }
130   return false;
131 }
132
133 /// getHazardType - We return hazard for any non-branch instruction that would
134 /// terminate the dispatch group.  We turn NoopHazard for any
135 /// instructions that wouldn't terminate the dispatch group that would cause a
136 /// pipeline flush.
137 ScheduleHazardRecognizer::HazardType PPCHazardRecognizer970::
138 getHazardType(SUnit *SU, int Stalls) {
139   assert(Stalls == 0 && "PPC hazards don't support scoreboard lookahead");
140
141   const SDNode *Node = SU->getNode()->getGluedMachineNode();
142   bool isFirst, isSingle, isCracked, isLoad, isStore;
143   PPCII::PPC970_Unit InstrType =
144     GetInstrType(Node->getOpcode(), isFirst, isSingle, isCracked,
145                  isLoad, isStore);
146   if (InstrType == PPCII::PPC970_Pseudo) return NoHazard;
147   unsigned Opcode = Node->getMachineOpcode();
148
149   // We can only issue a PPC970_First/PPC970_Single instruction (such as
150   // crand/mtspr/etc) if this is the first cycle of the dispatch group.
151   if (NumIssued != 0 && (isFirst || isSingle))
152     return Hazard;
153
154   // If this instruction is cracked into two ops by the decoder, we know that
155   // it is not a branch and that it cannot issue if 3 other instructions are
156   // already in the dispatch group.
157   if (isCracked && NumIssued > 2)
158     return Hazard;
159
160   switch (InstrType) {
161   default: llvm_unreachable("Unknown instruction type!");
162   case PPCII::PPC970_FXU:
163   case PPCII::PPC970_LSU:
164   case PPCII::PPC970_FPU:
165   case PPCII::PPC970_VALU:
166   case PPCII::PPC970_VPERM:
167     // We can only issue a branch as the last instruction in a group.
168     if (NumIssued == 4) return Hazard;
169     break;
170   case PPCII::PPC970_CRU:
171     // We can only issue a CR instruction in the first two slots.
172     if (NumIssued >= 2) return Hazard;
173     break;
174   case PPCII::PPC970_BRU:
175     break;
176   }
177
178   // Do not allow MTCTR and BCTRL to be in the same dispatch group.
179   if (HasCTRSet && (Opcode == PPC::BCTRL_Darwin || Opcode == PPC::BCTRL_SVR4))
180     return NoopHazard;
181
182   // If this is a load following a store, make sure it's not to the same or
183   // overlapping address.
184   if (isLoad && NumStores) {
185     unsigned LoadSize;
186     switch (Opcode) {
187     default: llvm_unreachable("Unknown load!");
188     case PPC::LBZ:   case PPC::LBZU:
189     case PPC::LBZX:
190     case PPC::LBZ8:  case PPC::LBZU8:
191     case PPC::LBZX8:
192     case PPC::LVEBX:
193       LoadSize = 1;
194       break;
195     case PPC::LHA:   case PPC::LHAU:
196     case PPC::LHAX:
197     case PPC::LHZ:   case PPC::LHZU:
198     case PPC::LHZX:
199     case PPC::LVEHX:
200     case PPC::LHBRX:
201     case PPC::LHA8:   case PPC::LHAU8:
202     case PPC::LHAX8:
203     case PPC::LHZ8:   case PPC::LHZU8:
204     case PPC::LHZX8:
205       LoadSize = 2;
206       break;
207     case PPC::LFS:    case PPC::LFSU:
208     case PPC::LFSX:
209     case PPC::LWZ:    case PPC::LWZU:
210     case PPC::LWZX:
211     case PPC::LWA:
212     case PPC::LWAX:
213     case PPC::LVEWX:
214     case PPC::LWBRX:
215     case PPC::LWZ8:
216     case PPC::LWZX8:
217       LoadSize = 4;
218       break;
219     case PPC::LFD:    case PPC::LFDU:
220     case PPC::LFDX:
221     case PPC::LD:     case PPC::LDU:
222     case PPC::LDX:
223       LoadSize = 8;
224       break;
225     case PPC::LVX:
226     case PPC::LVXL:
227       LoadSize = 16;
228       break;
229     }
230
231     if (isLoadOfStoredAddress(LoadSize,
232                               Node->getOperand(0), Node->getOperand(1)))
233       return NoopHazard;
234   }
235
236   return NoHazard;
237 }
238
239 void PPCHazardRecognizer970::EmitInstruction(SUnit *SU) {
240   const SDNode *Node = SU->getNode()->getGluedMachineNode();
241   bool isFirst, isSingle, isCracked, isLoad, isStore;
242   PPCII::PPC970_Unit InstrType =
243     GetInstrType(Node->getOpcode(), isFirst, isSingle, isCracked,
244                  isLoad, isStore);
245   if (InstrType == PPCII::PPC970_Pseudo) return;
246   unsigned Opcode = Node->getMachineOpcode();
247
248   // Update structural hazard information.
249   if (Opcode == PPC::MTCTR || Opcode == PPC::MTCTR8) HasCTRSet = true;
250
251   // Track the address stored to.
252   if (isStore) {
253     unsigned ThisStoreSize;
254     switch (Opcode) {
255     default: llvm_unreachable("Unknown store instruction!");
256     case PPC::STB:    case PPC::STB8:
257     case PPC::STBU:   case PPC::STBU8:
258     case PPC::STBX:   case PPC::STBX8:
259     case PPC::STVEBX:
260       ThisStoreSize = 1;
261       break;
262     case PPC::STH:    case PPC::STH8:
263     case PPC::STHU:   case PPC::STHU8:
264     case PPC::STHX:   case PPC::STHX8:
265     case PPC::STVEHX:
266     case PPC::STHBRX:
267       ThisStoreSize = 2;
268       break;
269     case PPC::STFS:
270     case PPC::STFSU:
271     case PPC::STFSX:
272     case PPC::STWX:   case PPC::STWX8:
273     case PPC::STWUX:
274     case PPC::STW:    case PPC::STW8:
275     case PPC::STWU:
276     case PPC::STVEWX:
277     case PPC::STFIWX:
278     case PPC::STWBRX:
279       ThisStoreSize = 4;
280       break;
281     case PPC::STD_32:
282     case PPC::STDX_32:
283     case PPC::STD:
284     case PPC::STDU:
285     case PPC::STFD:
286     case PPC::STFDX:
287     case PPC::STDX:
288     case PPC::STDUX:
289       ThisStoreSize = 8;
290       break;
291     case PPC::STVX:
292     case PPC::STVXL:
293       ThisStoreSize = 16;
294       break;
295     }
296
297     StoreSize[NumStores] = ThisStoreSize;
298     StorePtr1[NumStores] = Node->getOperand(1);
299     StorePtr2[NumStores] = Node->getOperand(2);
300     ++NumStores;
301   }
302
303   if (InstrType == PPCII::PPC970_BRU || isSingle)
304     NumIssued = 4;  // Terminate a d-group.
305   ++NumIssued;
306
307   // If this instruction is cracked into two ops by the decoder, remember that
308   // we issued two pieces.
309   if (isCracked)
310     ++NumIssued;
311
312   if (NumIssued == 5)
313     EndDispatchGroup();
314 }
315
316 void PPCHazardRecognizer970::AdvanceCycle() {
317   assert(NumIssued < 5 && "Illegal dispatch group!");
318   ++NumIssued;
319   if (NumIssued == 5)
320     EndDispatchGroup();
321 }