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//===----------------------------------------------------------------------===//
255b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkel// PowerPC Scoreboard Hazard Recognizer
265b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkelvoid PPCScoreboardHazardRecognizer::EmitInstruction(SUnit *SU) {
27c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel  const MCInstrDesc *MCID = DAG->getInstrDesc(SU);
285b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkel  if (!MCID)
29c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel    // This is a PPC pseudo-instruction.
30c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel    return;
31c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel
32c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel  ScoreboardHazardRecognizer::EmitInstruction(SU);
33c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel}
34c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel
355b00ceaeeabff8c25abb09926343c3fcb06053d8Hal FinkelScheduleHazardRecognizer::HazardType
365b00ceaeeabff8c25abb09926343c3fcb06053d8Hal FinkelPPCScoreboardHazardRecognizer::getHazardType(SUnit *SU, int Stalls) {
375b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkel  return ScoreboardHazardRecognizer::getHazardType(SU, Stalls);
385b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkel}
395b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkel
405b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkelvoid PPCScoreboardHazardRecognizer::AdvanceCycle() {
415b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkel  ScoreboardHazardRecognizer::AdvanceCycle();
425b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkel}
435b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkel
445b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkelvoid PPCScoreboardHazardRecognizer::Reset() {
455b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkel  ScoreboardHazardRecognizer::Reset();
465b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkel}
475b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkel
48c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel//===----------------------------------------------------------------------===//
49c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner// PowerPC 970 Hazard Recognizer
50c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//
517ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// This models the dispatch group formation of the PPC970 processor.  Dispatch
5288d211f82304e53694ece666d4a2507b170e4582Chris Lattner// groups are bundles of up to five instructions that can contain various mixes
536e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick// of instructions.  The PPC970 can dispatch a peak of 4 non-branch and one
5488d211f82304e53694ece666d4a2507b170e4582Chris Lattner// branch instruction per-cycle.
557ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner//
5688d211f82304e53694ece666d4a2507b170e4582Chris Lattner// There are a number of restrictions to dispatch group formation: some
5788d211f82304e53694ece666d4a2507b170e4582Chris Lattner// instructions can only be issued in the first slot of a dispatch group, & some
5888d211f82304e53694ece666d4a2507b170e4582Chris Lattner// instructions fill an entire dispatch group.  Additionally, only branches can
5988d211f82304e53694ece666d4a2507b170e4582Chris Lattner// issue in the 5th (last) slot.
607ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner//
617ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// Finally, there are a number of "structural" hazards on the PPC970.  These
627ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// conditions cause large performance penalties due to misprediction, recovery,
637ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// and replay logic that has to happen.  These cases include setting a CTR and
647ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// branching through it in the same dispatch group, and storing to an address,
657ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// then loading from the same address within a dispatch group.  To avoid these
667ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// conditions, we insert no-op instructions when appropriate.
677ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner//
68c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner// FIXME: This is missing some significant cases:
69c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//   1. Modeling of microcoded instructions.
703faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner//   2. Handling of serialized operations.
713faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner//   3. Handling of the esoteric cases in "Resource-based Instruction Grouping".
72c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//
73c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
7488d211f82304e53694ece666d4a2507b170e4582Chris LattnerPPCHazardRecognizer970::PPCHazardRecognizer970(const TargetInstrInfo &tii)
7588d211f82304e53694ece666d4a2507b170e4582Chris Lattner  : TII(tii) {
76b0d21ef20c29f4ea46d21b488f17feaa6a8760e1Chris Lattner  EndDispatchGroup();
77b0d21ef20c29f4ea46d21b488f17feaa6a8760e1Chris Lattner}
78b0d21ef20c29f4ea46d21b488f17feaa6a8760e1Chris Lattner
79c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnervoid PPCHazardRecognizer970::EndDispatchGroup() {
80893e1c90a03a53cf13f73849324e83612688428aChris Lattner  DEBUG(errs() << "=== Start of dispatch group\n");
81c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  NumIssued = 0;
826e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
83c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Structural hazard info.
84c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  HasCTRSet = false;
8588d211f82304e53694ece666d4a2507b170e4582Chris Lattner  NumStores = 0;
86c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
87c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
88c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
896e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew TrickPPCII::PPC970_Unit
9088d211f82304e53694ece666d4a2507b170e4582Chris LattnerPPCHazardRecognizer970::GetInstrType(unsigned Opcode,
9188d211f82304e53694ece666d4a2507b170e4582Chris Lattner                                     bool &isFirst, bool &isSingle,
923faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                                     bool &isCracked,
933faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                                     bool &isLoad, bool &isStore) {
94e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  const MCInstrDesc &MCID = TII.get(Opcode);
956e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
96e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  isLoad  = MCID.mayLoad();
97e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  isStore = MCID.mayStore();
986e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
99e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  uint64_t TSFlags = MCID.TSFlags;
1006e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
1013faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  isFirst   = TSFlags & PPCII::PPC970_First;
1023faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  isSingle  = TSFlags & PPCII::PPC970_Single;
1033faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  isCracked = TSFlags & PPCII::PPC970_Cracked;
10488d211f82304e53694ece666d4a2507b170e4582Chris Lattner  return (PPCII::PPC970_Unit)(TSFlags & PPCII::PPC970_Mask);
105c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
106c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
107c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// isLoadOfStoredAddress - If we have a load from the previously stored pointer
108c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// as indicated by StorePtr1/StorePtr2/StoreSize, return true.
109c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnerbool PPCHazardRecognizer970::
11064c34e253563a8ba6b41fbce2bb020632cf65961Hal FinkelisLoadOfStoredAddress(uint64_t LoadSize, int64_t LoadOffset,
11164c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel  const Value *LoadValue) const {
11288d211f82304e53694ece666d4a2507b170e4582Chris Lattner  for (unsigned i = 0, e = NumStores; i != e; ++i) {
11388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // Handle exact and commuted addresses.
11464c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel    if (LoadValue == StoreValue[i] && LoadOffset == StoreOffset[i])
11588d211f82304e53694ece666d4a2507b170e4582Chris Lattner      return true;
1166e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
11788d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // Okay, we don't have an exact match, if this is an indexed offset, see if
11888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // we have overlap (which happens during fp->int conversion for example).
11964c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel    if (StoreValue[i] == LoadValue) {
12064c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel      // Okay the base pointers match, so we have [c1+r] vs [c2+r].  Check
12164c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel      // to see if the load and store actually overlap.
12264c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel      if (StoreOffset[i] < LoadOffset) {
12364c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel        if (int64_t(StoreOffset[i]+StoreSize[i]) > LoadOffset) return true;
12464c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel      } else {
12564c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel        if (int64_t(LoadOffset+LoadSize) > StoreOffset[i]) return true;
12664c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel      }
12788d211f82304e53694ece666d4a2507b170e4582Chris Lattner    }
128c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
129c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  return false;
130c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
131c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
132c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// getHazardType - We return hazard for any non-branch instruction that would
133f451cb870efcf9e0302d25ed05f4cac6bb494e42Dan Gohman/// terminate the dispatch group.  We turn NoopHazard for any
134c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// instructions that wouldn't terminate the dispatch group that would cause a
135c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// pipeline flush.
136fc54c552963545a81e4ea38e60460590afb2d5aeDan GohmanScheduleHazardRecognizer::HazardType PPCHazardRecognizer970::
1372da8bc8a5f7705ac131184cd247f48500da0d74eAndrew TrickgetHazardType(SUnit *SU, int Stalls) {
1382da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  assert(Stalls == 0 && "PPC hazards don't support scoreboard lookahead");
1392da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick
14064c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel  MachineInstr *MI = SU->getInstr();
14164c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel
14264c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel  if (MI->isDebugValue())
14364c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel    return NoHazard;
14464c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel
14564c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel  unsigned Opcode = MI->getOpcode();
1463faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  bool isFirst, isSingle, isCracked, isLoad, isStore;
1476e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick  PPCII::PPC970_Unit InstrType =
14864c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel    GetInstrType(Opcode, isFirst, isSingle, isCracked,
1493faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                 isLoad, isStore);
1506e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick  if (InstrType == PPCII::PPC970_Pseudo) return NoHazard;
151c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
15288d211f82304e53694ece666d4a2507b170e4582Chris Lattner  // We can only issue a PPC970_First/PPC970_Single instruction (such as
15388d211f82304e53694ece666d4a2507b170e4582Chris Lattner  // crand/mtspr/etc) if this is the first cycle of the dispatch group.
1543faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  if (NumIssued != 0 && (isFirst || isSingle))
15588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    return Hazard;
1566e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
1573faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // If this instruction is cracked into two ops by the decoder, we know that
1583faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // it is not a branch and that it cannot issue if 3 other instructions are
1593faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // already in the dispatch group.
1603faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  if (isCracked && NumIssued > 2)
1613faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    return Hazard;
1626e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
163c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  switch (InstrType) {
164c23197a26f34f559ea9797de51e187087c039c42Torok Edwin  default: llvm_unreachable("Unknown instruction type!");
16588d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_FXU:
16688d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_LSU:
16788d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_FPU:
16888d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_VALU:
16988d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_VPERM:
17088d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // We can only issue a branch as the last instruction in a group.
17188d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (NumIssued == 4) return Hazard;
17288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    break;
17388d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_CRU:
17488d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // We can only issue a CR instruction in the first two slots.
17588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (NumIssued >= 2) return Hazard;
17688d211f82304e53694ece666d4a2507b170e4582Chris Lattner    break;
17788d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_BRU:
17888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    break;
179c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
1806e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
181c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Do not allow MTCTR and BCTRL to be in the same dispatch group.
1822a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  if (HasCTRSet && (Opcode == PPC::BCTRL_Darwin || Opcode == PPC::BCTRL_SVR4))
183c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    return NoopHazard;
1846e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
185c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // If this is a load following a store, make sure it's not to the same or
186c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // overlapping address.
18764c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel  if (isLoad && NumStores && !MI->memoperands_empty()) {
18864c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel    MachineMemOperand *MO = *MI->memoperands_begin();
18964c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel    if (isLoadOfStoredAddress(MO->getSize(),
19064c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel                              MO->getOffset(), MO->getValue()))
191c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner      return NoopHazard;
192c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
1936e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
194c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  return NoHazard;
195c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
196c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
197fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohmanvoid PPCHazardRecognizer970::EmitInstruction(SUnit *SU) {
19864c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel  MachineInstr *MI = SU->getInstr();
19964c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel
20064c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel  if (MI->isDebugValue())
20164c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel    return;
20264c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel
20364c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel  unsigned Opcode = MI->getOpcode();
2043faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  bool isFirst, isSingle, isCracked, isLoad, isStore;
2056e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick  PPCII::PPC970_Unit InstrType =
20664c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel    GetInstrType(Opcode, isFirst, isSingle, isCracked,
2073faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                 isLoad, isStore);
2086e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick  if (InstrType == PPCII::PPC970_Pseudo) return;
209c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
210c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Update structural hazard information.
2110c9b559bfd0b476c2dde787285a1195f3142c423Roman Divacky  if (Opcode == PPC::MTCTR || Opcode == PPC::MTCTR8) HasCTRSet = true;
2126e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
213c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Track the address stored to.
21464c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel  if (isStore && NumStores < 4 && !MI->memoperands_empty()) {
21564c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel    MachineMemOperand *MO = *MI->memoperands_begin();
21664c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel    StoreSize[NumStores] = MO->getSize();
21764c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel    StoreOffset[NumStores] = MO->getOffset();
21864c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel    StoreValue[NumStores] = MO->getValue();
21988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    ++NumStores;
220c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
2216e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
22288d211f82304e53694ece666d4a2507b170e4582Chris Lattner  if (InstrType == PPCII::PPC970_BRU || isSingle)
22388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    NumIssued = 4;  // Terminate a d-group.
224c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  ++NumIssued;
2256e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
2263faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // If this instruction is cracked into two ops by the decoder, remember that
2273faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // we issued two pieces.
2283faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  if (isCracked)
2293faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    ++NumIssued;
2306e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
231c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  if (NumIssued == 5)
232c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    EndDispatchGroup();
233c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
234c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
235c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnervoid PPCHazardRecognizer970::AdvanceCycle() {
236c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  assert(NumIssued < 5 && "Illegal dispatch group!");
237c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  ++NumIssued;
238c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  if (NumIssued == 5)
239c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    EndDispatchGroup();
240c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
24164c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel
24264c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkelvoid PPCHazardRecognizer970::Reset() {
24364c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel  EndDispatchGroup();
24464c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel}
24564c34e253563a8ba6b41fbce2bb020632cf65961Hal Finkel
246