PPCHazardRecognizers.cpp revision 0c9b559bfd0b476c2dde787285a1195f3142c423
1c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//===-- PPCHazardRecognizers.cpp - PowerPC Hazard Recognizer Impls --------===//
2c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//
3c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//                     The LLVM Compiler Infrastructure
4c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//
8c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//===----------------------------------------------------------------------===//
9c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//
10c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner// This file implements hazard recognizers for scheduling on PowerPC processors.
11c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//
12c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//===----------------------------------------------------------------------===//
13c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
14e7e7d0d7e39d0c7c659d26b97e8081fce0fcd749Dale Johannesen#define DEBUG_TYPE "pre-RA-sched"
15c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner#include "PPCHazardRecognizers.h"
16c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner#include "PPC.h"
1788d211f82304e53694ece666d4a2507b170e4582Chris Lattner#include "PPCInstrInfo.h"
18fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohman#include "llvm/CodeGen/ScheduleDAG.h"
19c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner#include "llvm/Support/Debug.h"
20c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h"
21893e1c90a03a53cf13f73849324e83612688428aChris Lattner#include "llvm/Support/raw_ostream.h"
22c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnerusing namespace llvm;
23c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
24c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//===----------------------------------------------------------------------===//
25c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner// PowerPC 970 Hazard Recognizer
26c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//
277ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// This models the dispatch group formation of the PPC970 processor.  Dispatch
2888d211f82304e53694ece666d4a2507b170e4582Chris Lattner// groups are bundles of up to five instructions that can contain various mixes
296e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick// of instructions.  The PPC970 can dispatch a peak of 4 non-branch and one
3088d211f82304e53694ece666d4a2507b170e4582Chris Lattner// branch instruction per-cycle.
317ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner//
3288d211f82304e53694ece666d4a2507b170e4582Chris Lattner// There are a number of restrictions to dispatch group formation: some
3388d211f82304e53694ece666d4a2507b170e4582Chris Lattner// instructions can only be issued in the first slot of a dispatch group, & some
3488d211f82304e53694ece666d4a2507b170e4582Chris Lattner// instructions fill an entire dispatch group.  Additionally, only branches can
3588d211f82304e53694ece666d4a2507b170e4582Chris Lattner// issue in the 5th (last) slot.
367ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner//
377ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// Finally, there are a number of "structural" hazards on the PPC970.  These
387ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// conditions cause large performance penalties due to misprediction, recovery,
397ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// and replay logic that has to happen.  These cases include setting a CTR and
407ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// branching through it in the same dispatch group, and storing to an address,
417ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// then loading from the same address within a dispatch group.  To avoid these
427ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// conditions, we insert no-op instructions when appropriate.
437ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner//
44c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner// FIXME: This is missing some significant cases:
45c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//   1. Modeling of microcoded instructions.
463faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner//   2. Handling of serialized operations.
473faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner//   3. Handling of the esoteric cases in "Resource-based Instruction Grouping".
48c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//
49c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
5088d211f82304e53694ece666d4a2507b170e4582Chris LattnerPPCHazardRecognizer970::PPCHazardRecognizer970(const TargetInstrInfo &tii)
5188d211f82304e53694ece666d4a2507b170e4582Chris Lattner  : TII(tii) {
52b0d21ef20c29f4ea46d21b488f17feaa6a8760e1Chris Lattner  EndDispatchGroup();
53b0d21ef20c29f4ea46d21b488f17feaa6a8760e1Chris Lattner}
54b0d21ef20c29f4ea46d21b488f17feaa6a8760e1Chris Lattner
55c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnervoid PPCHazardRecognizer970::EndDispatchGroup() {
56893e1c90a03a53cf13f73849324e83612688428aChris Lattner  DEBUG(errs() << "=== Start of dispatch group\n");
57c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  NumIssued = 0;
586e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
59c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Structural hazard info.
60c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  HasCTRSet = false;
6188d211f82304e53694ece666d4a2507b170e4582Chris Lattner  NumStores = 0;
62c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
63c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
64c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
656e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew TrickPPCII::PPC970_Unit
6688d211f82304e53694ece666d4a2507b170e4582Chris LattnerPPCHazardRecognizer970::GetInstrType(unsigned Opcode,
6788d211f82304e53694ece666d4a2507b170e4582Chris Lattner                                     bool &isFirst, bool &isSingle,
683faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                                     bool &isCracked,
693faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                                     bool &isLoad, bool &isStore) {
70e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  if ((int)Opcode >= 0) {
713faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    isFirst = isSingle = isCracked = isLoad = isStore = false;
7288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    return PPCII::PPC970_Pseudo;
7388d211f82304e53694ece666d4a2507b170e4582Chris Lattner  }
74e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  Opcode = ~Opcode;
756e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
76749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner  const TargetInstrDesc &TID = TII.get(Opcode);
776e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
7841474baac839da410302950305722cb0e026a094Dan Gohman  isLoad  = TID.mayLoad();
79c17d69fa1e084668d6bb27441dbb505e2024f579Chris Lattner  isStore = TID.mayStore();
806e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
8199405df044f2c584242e711cc9023ec90356da82Bruno Cardoso Lopes  uint64_t TSFlags = TID.TSFlags;
826e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
833faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  isFirst   = TSFlags & PPCII::PPC970_First;
843faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  isSingle  = TSFlags & PPCII::PPC970_Single;
853faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  isCracked = TSFlags & PPCII::PPC970_Cracked;
8688d211f82304e53694ece666d4a2507b170e4582Chris Lattner  return (PPCII::PPC970_Unit)(TSFlags & PPCII::PPC970_Mask);
87c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
88c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
89c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// isLoadOfStoredAddress - If we have a load from the previously stored pointer
90c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// as indicated by StorePtr1/StorePtr2/StoreSize, return true.
91c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnerbool PPCHazardRecognizer970::
92475871a144eb604ddaf37503397ba0941442e5fbDan GohmanisLoadOfStoredAddress(unsigned LoadSize, SDValue Ptr1, SDValue Ptr2) const {
9388d211f82304e53694ece666d4a2507b170e4582Chris Lattner  for (unsigned i = 0, e = NumStores; i != e; ++i) {
9488d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // Handle exact and commuted addresses.
9588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (Ptr1 == StorePtr1[i] && Ptr2 == StorePtr2[i])
9688d211f82304e53694ece666d4a2507b170e4582Chris Lattner      return true;
9788d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (Ptr2 == StorePtr1[i] && Ptr1 == StorePtr2[i])
9888d211f82304e53694ece666d4a2507b170e4582Chris Lattner      return true;
996e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
10088d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // Okay, we don't have an exact match, if this is an indexed offset, see if
10188d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // we have overlap (which happens during fp->int conversion for example).
10288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (StorePtr2[i] == Ptr2) {
10388d211f82304e53694ece666d4a2507b170e4582Chris Lattner      if (ConstantSDNode *StoreOffset = dyn_cast<ConstantSDNode>(StorePtr1[i]))
10488d211f82304e53694ece666d4a2507b170e4582Chris Lattner        if (ConstantSDNode *LoadOffset = dyn_cast<ConstantSDNode>(Ptr1)) {
10588d211f82304e53694ece666d4a2507b170e4582Chris Lattner          // Okay the base pointers match, so we have [c1+r] vs [c2+r].  Check
10688d211f82304e53694ece666d4a2507b170e4582Chris Lattner          // to see if the load and store actually overlap.
107f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman          int StoreOffs = StoreOffset->getZExtValue();
108f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman          int LoadOffs  = LoadOffset->getZExtValue();
10988d211f82304e53694ece666d4a2507b170e4582Chris Lattner          if (StoreOffs < LoadOffs) {
11064ce964673ca5c71f46933d8699aa557fbc5f15aChris Lattner            if (int(StoreOffs+StoreSize[i]) > LoadOffs) return true;
11188d211f82304e53694ece666d4a2507b170e4582Chris Lattner          } else {
11288d211f82304e53694ece666d4a2507b170e4582Chris Lattner            if (int(LoadOffs+LoadSize) > StoreOffs) return true;
11388d211f82304e53694ece666d4a2507b170e4582Chris Lattner          }
114c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner        }
11588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    }
116c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
117c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  return false;
118c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
119c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
120c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// getHazardType - We return hazard for any non-branch instruction that would
121f451cb870efcf9e0302d25ed05f4cac6bb494e42Dan Gohman/// terminate the dispatch group.  We turn NoopHazard for any
122c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// instructions that wouldn't terminate the dispatch group that would cause a
123c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// pipeline flush.
124fc54c552963545a81e4ea38e60460590afb2d5aeDan GohmanScheduleHazardRecognizer::HazardType PPCHazardRecognizer970::
1252da8bc8a5f7705ac131184cd247f48500da0d74eAndrew TrickgetHazardType(SUnit *SU, int Stalls) {
1262da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  assert(Stalls == 0 && "PPC hazards don't support scoreboard lookahead");
1272da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick
12829d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  const SDNode *Node = SU->getNode()->getGluedMachineNode();
1293faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  bool isFirst, isSingle, isCracked, isLoad, isStore;
1306e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick  PPCII::PPC970_Unit InstrType =
1313faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    GetInstrType(Node->getOpcode(), isFirst, isSingle, isCracked,
1323faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                 isLoad, isStore);
1336e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick  if (InstrType == PPCII::PPC970_Pseudo) return NoHazard;
134e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  unsigned Opcode = Node->getMachineOpcode();
135c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
13688d211f82304e53694ece666d4a2507b170e4582Chris Lattner  // We can only issue a PPC970_First/PPC970_Single instruction (such as
13788d211f82304e53694ece666d4a2507b170e4582Chris Lattner  // crand/mtspr/etc) if this is the first cycle of the dispatch group.
1383faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  if (NumIssued != 0 && (isFirst || isSingle))
13988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    return Hazard;
1406e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
1413faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // If this instruction is cracked into two ops by the decoder, we know that
1423faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // it is not a branch and that it cannot issue if 3 other instructions are
1433faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // already in the dispatch group.
1443faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  if (isCracked && NumIssued > 2)
1453faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    return Hazard;
1466e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
147c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  switch (InstrType) {
148c23197a26f34f559ea9797de51e187087c039c42Torok Edwin  default: llvm_unreachable("Unknown instruction type!");
14988d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_FXU:
15088d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_LSU:
15188d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_FPU:
15288d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_VALU:
15388d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_VPERM:
15488d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // We can only issue a branch as the last instruction in a group.
15588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (NumIssued == 4) return Hazard;
15688d211f82304e53694ece666d4a2507b170e4582Chris Lattner    break;
15788d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_CRU:
15888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // We can only issue a CR instruction in the first two slots.
15988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (NumIssued >= 2) return Hazard;
16088d211f82304e53694ece666d4a2507b170e4582Chris Lattner    break;
16188d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_BRU:
16288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    break;
163c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
1646e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
165c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Do not allow MTCTR and BCTRL to be in the same dispatch group.
1662a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  if (HasCTRSet && (Opcode == PPC::BCTRL_Darwin || Opcode == PPC::BCTRL_SVR4))
167c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    return NoopHazard;
1686e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
169c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // If this is a load following a store, make sure it's not to the same or
170c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // overlapping address.
17164ce964673ca5c71f46933d8699aa557fbc5f15aChris Lattner  if (isLoad && NumStores) {
172c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    unsigned LoadSize;
173c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    switch (Opcode) {
174c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    default: llvm_unreachable("Unknown load!");
175c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LBZ:   case PPC::LBZU:
17688d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LBZX:
177c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LBZ8:  case PPC::LBZU8:
178518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner    case PPC::LBZX8:
17988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LVEBX:
18088d211f82304e53694ece666d4a2507b170e4582Chris Lattner      LoadSize = 1;
18188d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
182c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LHA:   case PPC::LHAU:
18388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LHAX:
184c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LHZ:   case PPC::LHZU:
18588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LHZX:
18688d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LVEHX:
187d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner    case PPC::LHBRX:
188c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LHA8:   case PPC::LHAU8:
189518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner    case PPC::LHAX8:
190c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LHZ8:   case PPC::LHZU8:
191518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner    case PPC::LHZX8:
19288d211f82304e53694ece666d4a2507b170e4582Chris Lattner      LoadSize = 2;
19388d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
194c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LFS:    case PPC::LFSU:
19588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LFSX:
196c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LWZ:    case PPC::LWZU:
1972046371e70e90d4435fcdf1b2ebeb64a2e5b2626Chris Lattner    case PPC::LWZX:
19888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LWA:
19988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LWAX:
20088d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LVEWX:
201d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner    case PPC::LWBRX:
202518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner    case PPC::LWZ8:
203518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner    case PPC::LWZX8:
20488d211f82304e53694ece666d4a2507b170e4582Chris Lattner      LoadSize = 4;
20588d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
206c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LFD:    case PPC::LFDU:
20788d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LFDX:
208c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LD:     case PPC::LDU:
20988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LDX:
21088d211f82304e53694ece666d4a2507b170e4582Chris Lattner      LoadSize = 8;
21188d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
21288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LVX:
213399ea50dc3321b4cc16e0a5ea7c41495c55a01baBill Wendling    case PPC::LVXL:
21488d211f82304e53694ece666d4a2507b170e4582Chris Lattner      LoadSize = 16;
21588d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
216c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    }
2176e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
2186e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick    if (isLoadOfStoredAddress(LoadSize,
219c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner                              Node->getOperand(0), Node->getOperand(1)))
220c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner      return NoopHazard;
221c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
2226e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
223c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  return NoHazard;
224c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
225c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
226fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohmanvoid PPCHazardRecognizer970::EmitInstruction(SUnit *SU) {
22729d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  const SDNode *Node = SU->getNode()->getGluedMachineNode();
2283faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  bool isFirst, isSingle, isCracked, isLoad, isStore;
2296e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick  PPCII::PPC970_Unit InstrType =
2303faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    GetInstrType(Node->getOpcode(), isFirst, isSingle, isCracked,
2313faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                 isLoad, isStore);
2326e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick  if (InstrType == PPCII::PPC970_Pseudo) return;
233e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  unsigned Opcode = Node->getMachineOpcode();
234c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
235c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Update structural hazard information.
2360c9b559bfd0b476c2dde787285a1195f3142c423Roman Divacky  if (Opcode == PPC::MTCTR || Opcode == PPC::MTCTR8) HasCTRSet = true;
2376e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
238c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Track the address stored to.
23988d211f82304e53694ece666d4a2507b170e4582Chris Lattner  if (isStore) {
24088d211f82304e53694ece666d4a2507b170e4582Chris Lattner    unsigned ThisStoreSize;
241c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    switch (Opcode) {
242c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    default: llvm_unreachable("Unknown store instruction!");
24380df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STB:    case PPC::STB8:
24480df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STBU:   case PPC::STBU8:
24580df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STBX:   case PPC::STBX8:
24688d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STVEBX:
24788d211f82304e53694ece666d4a2507b170e4582Chris Lattner      ThisStoreSize = 1;
24888d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
24980df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STH:    case PPC::STH8:
25080df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STHU:   case PPC::STHU8:
25180df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STHX:   case PPC::STHX8:
25288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STVEHX:
253d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner    case PPC::STHBRX:
25488d211f82304e53694ece666d4a2507b170e4582Chris Lattner      ThisStoreSize = 2;
25588d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
25680df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STFS:
25780df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STFSU:
25888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STFSX:
25980df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STWX:   case PPC::STWX8:
26088d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STWUX:
26180df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STW:    case PPC::STW8:
2629fa200d2a2360412465bbd6cfb485af2e9d5b1b4Chris Lattner    case PPC::STWU:
26388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STVEWX:
26488d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STFIWX:
265d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner    case PPC::STWBRX:
26688d211f82304e53694ece666d4a2507b170e4582Chris Lattner      ThisStoreSize = 4;
26788d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
268ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner    case PPC::STD_32:
269ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner    case PPC::STDX_32:
27080df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STD:
27180df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STDU:
27288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STFD:
27388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STFDX:
27488d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STDX:
27588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STDUX:
27688d211f82304e53694ece666d4a2507b170e4582Chris Lattner      ThisStoreSize = 8;
27788d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
27888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STVX:
279399ea50dc3321b4cc16e0a5ea7c41495c55a01baBill Wendling    case PPC::STVXL:
28088d211f82304e53694ece666d4a2507b170e4582Chris Lattner      ThisStoreSize = 16;
28188d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
282c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    }
2836e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
28488d211f82304e53694ece666d4a2507b170e4582Chris Lattner    StoreSize[NumStores] = ThisStoreSize;
28588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    StorePtr1[NumStores] = Node->getOperand(1);
28688d211f82304e53694ece666d4a2507b170e4582Chris Lattner    StorePtr2[NumStores] = Node->getOperand(2);
28788d211f82304e53694ece666d4a2507b170e4582Chris Lattner    ++NumStores;
288c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
2896e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
29088d211f82304e53694ece666d4a2507b170e4582Chris Lattner  if (InstrType == PPCII::PPC970_BRU || isSingle)
29188d211f82304e53694ece666d4a2507b170e4582Chris Lattner    NumIssued = 4;  // Terminate a d-group.
292c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  ++NumIssued;
2936e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
2943faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // If this instruction is cracked into two ops by the decoder, remember that
2953faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // we issued two pieces.
2963faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  if (isCracked)
2973faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    ++NumIssued;
2986e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
299c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  if (NumIssued == 5)
300c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    EndDispatchGroup();
301c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
302c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
303c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnervoid PPCHazardRecognizer970::AdvanceCycle() {
304c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  assert(NumIssued < 5 && "Illegal dispatch group!");
305c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  ++NumIssued;
306c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  if (NumIssued == 5)
307c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    EndDispatchGroup();
308c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
309