PPCHazardRecognizers.cpp revision 475871a144eb604ddaf37503397ba0941442e5fb
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"
18c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner#include "llvm/Support/Debug.h"
19c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnerusing namespace llvm;
20c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
21c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//===----------------------------------------------------------------------===//
22c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner// PowerPC 970 Hazard Recognizer
23c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//
247ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// This models the dispatch group formation of the PPC970 processor.  Dispatch
2588d211f82304e53694ece666d4a2507b170e4582Chris Lattner// groups are bundles of up to five instructions that can contain various mixes
2688d211f82304e53694ece666d4a2507b170e4582Chris Lattner// of instructions.  The PPC970 can dispatch a peak of 4 non-branch and one
2788d211f82304e53694ece666d4a2507b170e4582Chris Lattner// branch instruction per-cycle.
287ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner//
2988d211f82304e53694ece666d4a2507b170e4582Chris Lattner// There are a number of restrictions to dispatch group formation: some
3088d211f82304e53694ece666d4a2507b170e4582Chris Lattner// instructions can only be issued in the first slot of a dispatch group, & some
3188d211f82304e53694ece666d4a2507b170e4582Chris Lattner// instructions fill an entire dispatch group.  Additionally, only branches can
3288d211f82304e53694ece666d4a2507b170e4582Chris Lattner// issue in the 5th (last) slot.
337ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner//
347ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// Finally, there are a number of "structural" hazards on the PPC970.  These
357ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// conditions cause large performance penalties due to misprediction, recovery,
367ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// and replay logic that has to happen.  These cases include setting a CTR and
377ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// branching through it in the same dispatch group, and storing to an address,
387ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// then loading from the same address within a dispatch group.  To avoid these
397ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// conditions, we insert no-op instructions when appropriate.
407ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner//
41c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner// FIXME: This is missing some significant cases:
42c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//   1. Modeling of microcoded instructions.
433faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner//   2. Handling of serialized operations.
443faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner//   3. Handling of the esoteric cases in "Resource-based Instruction Grouping".
45c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//
46c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
4788d211f82304e53694ece666d4a2507b170e4582Chris LattnerPPCHazardRecognizer970::PPCHazardRecognizer970(const TargetInstrInfo &tii)
4888d211f82304e53694ece666d4a2507b170e4582Chris Lattner  : TII(tii) {
49b0d21ef20c29f4ea46d21b488f17feaa6a8760e1Chris Lattner  EndDispatchGroup();
50b0d21ef20c29f4ea46d21b488f17feaa6a8760e1Chris Lattner}
51b0d21ef20c29f4ea46d21b488f17feaa6a8760e1Chris Lattner
52c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnervoid PPCHazardRecognizer970::EndDispatchGroup() {
53f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling  DOUT << "=== Start of dispatch group\n";
54c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  NumIssued = 0;
55c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
56c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Structural hazard info.
57c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  HasCTRSet = false;
5888d211f82304e53694ece666d4a2507b170e4582Chris Lattner  NumStores = 0;
59c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
60c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
61c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
6288d211f82304e53694ece666d4a2507b170e4582Chris LattnerPPCII::PPC970_Unit
6388d211f82304e53694ece666d4a2507b170e4582Chris LattnerPPCHazardRecognizer970::GetInstrType(unsigned Opcode,
6488d211f82304e53694ece666d4a2507b170e4582Chris Lattner                                     bool &isFirst, bool &isSingle,
653faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                                     bool &isCracked,
663faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                                     bool &isLoad, bool &isStore) {
67e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  if ((int)Opcode >= 0) {
683faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    isFirst = isSingle = isCracked = isLoad = isStore = false;
6988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    return PPCII::PPC970_Pseudo;
7088d211f82304e53694ece666d4a2507b170e4582Chris Lattner  }
71e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  Opcode = ~Opcode;
72c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
73749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner  const TargetInstrDesc &TID = TII.get(Opcode);
7488d211f82304e53694ece666d4a2507b170e4582Chris Lattner
75834f1ce0312e3d00d836f9560cb63182c2c4570fChris Lattner  isLoad  = TID.isSimpleLoad();
76c17d69fa1e084668d6bb27441dbb505e2024f579Chris Lattner  isStore = TID.mayStore();
77c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
7888d211f82304e53694ece666d4a2507b170e4582Chris Lattner  unsigned TSFlags = TID.TSFlags;
7988d211f82304e53694ece666d4a2507b170e4582Chris Lattner
803faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  isFirst   = TSFlags & PPCII::PPC970_First;
813faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  isSingle  = TSFlags & PPCII::PPC970_Single;
823faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  isCracked = TSFlags & PPCII::PPC970_Cracked;
8388d211f82304e53694ece666d4a2507b170e4582Chris Lattner  return (PPCII::PPC970_Unit)(TSFlags & PPCII::PPC970_Mask);
84c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
85c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
86c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// isLoadOfStoredAddress - If we have a load from the previously stored pointer
87c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// as indicated by StorePtr1/StorePtr2/StoreSize, return true.
88c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnerbool PPCHazardRecognizer970::
89475871a144eb604ddaf37503397ba0941442e5fbDan GohmanisLoadOfStoredAddress(unsigned LoadSize, SDValue Ptr1, SDValue Ptr2) const {
9088d211f82304e53694ece666d4a2507b170e4582Chris Lattner  for (unsigned i = 0, e = NumStores; i != e; ++i) {
9188d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // Handle exact and commuted addresses.
9288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (Ptr1 == StorePtr1[i] && Ptr2 == StorePtr2[i])
9388d211f82304e53694ece666d4a2507b170e4582Chris Lattner      return true;
9488d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (Ptr2 == StorePtr1[i] && Ptr1 == StorePtr2[i])
9588d211f82304e53694ece666d4a2507b170e4582Chris Lattner      return true;
9688d211f82304e53694ece666d4a2507b170e4582Chris Lattner
9788d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // Okay, we don't have an exact match, if this is an indexed offset, see if
9888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // we have overlap (which happens during fp->int conversion for example).
9988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (StorePtr2[i] == Ptr2) {
10088d211f82304e53694ece666d4a2507b170e4582Chris Lattner      if (ConstantSDNode *StoreOffset = dyn_cast<ConstantSDNode>(StorePtr1[i]))
10188d211f82304e53694ece666d4a2507b170e4582Chris Lattner        if (ConstantSDNode *LoadOffset = dyn_cast<ConstantSDNode>(Ptr1)) {
10288d211f82304e53694ece666d4a2507b170e4582Chris Lattner          // Okay the base pointers match, so we have [c1+r] vs [c2+r].  Check
10388d211f82304e53694ece666d4a2507b170e4582Chris Lattner          // to see if the load and store actually overlap.
10488d211f82304e53694ece666d4a2507b170e4582Chris Lattner          int StoreOffs = StoreOffset->getValue();
10588d211f82304e53694ece666d4a2507b170e4582Chris Lattner          int LoadOffs  = LoadOffset->getValue();
10688d211f82304e53694ece666d4a2507b170e4582Chris Lattner          if (StoreOffs < LoadOffs) {
10764ce964673ca5c71f46933d8699aa557fbc5f15aChris Lattner            if (int(StoreOffs+StoreSize[i]) > LoadOffs) return true;
10888d211f82304e53694ece666d4a2507b170e4582Chris Lattner          } else {
10988d211f82304e53694ece666d4a2507b170e4582Chris Lattner            if (int(LoadOffs+LoadSize) > StoreOffs) return true;
11088d211f82304e53694ece666d4a2507b170e4582Chris Lattner          }
111c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner        }
11288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    }
113c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
114c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  return false;
115c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
116c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
117c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// getHazardType - We return hazard for any non-branch instruction that would
118c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// terminate terminate the dispatch group.  We turn NoopHazard for any
119c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// instructions that wouldn't terminate the dispatch group that would cause a
120c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// pipeline flush.
121c6644188208d4aee9a9d6c428710ec1f69837944Chris LattnerHazardRecognizer::HazardType PPCHazardRecognizer970::
122c6644188208d4aee9a9d6c428710ec1f69837944Chris LattnergetHazardType(SDNode *Node) {
1233faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  bool isFirst, isSingle, isCracked, isLoad, isStore;
12488d211f82304e53694ece666d4a2507b170e4582Chris Lattner  PPCII::PPC970_Unit InstrType =
1253faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    GetInstrType(Node->getOpcode(), isFirst, isSingle, isCracked,
1263faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                 isLoad, isStore);
12788d211f82304e53694ece666d4a2507b170e4582Chris Lattner  if (InstrType == PPCII::PPC970_Pseudo) return NoHazard;
128e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  unsigned Opcode = Node->getMachineOpcode();
129c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
13088d211f82304e53694ece666d4a2507b170e4582Chris Lattner  // We can only issue a PPC970_First/PPC970_Single instruction (such as
13188d211f82304e53694ece666d4a2507b170e4582Chris Lattner  // crand/mtspr/etc) if this is the first cycle of the dispatch group.
1323faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  if (NumIssued != 0 && (isFirst || isSingle))
13388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    return Hazard;
13488d211f82304e53694ece666d4a2507b170e4582Chris Lattner
1353faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // If this instruction is cracked into two ops by the decoder, we know that
1363faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // it is not a branch and that it cannot issue if 3 other instructions are
1373faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // already in the dispatch group.
1383faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  if (isCracked && NumIssued > 2)
1393faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    return Hazard;
1403faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner
141c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  switch (InstrType) {
142c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  default: assert(0 && "Unknown instruction type!");
14388d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_FXU:
14488d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_LSU:
14588d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_FPU:
14688d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_VALU:
14788d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_VPERM:
14888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // We can only issue a branch as the last instruction in a group.
14988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (NumIssued == 4) return Hazard;
15088d211f82304e53694ece666d4a2507b170e4582Chris Lattner    break;
15188d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_CRU:
15288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // We can only issue a CR instruction in the first two slots.
15388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (NumIssued >= 2) return Hazard;
15488d211f82304e53694ece666d4a2507b170e4582Chris Lattner    break;
15588d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_BRU:
15688d211f82304e53694ece666d4a2507b170e4582Chris Lattner    break;
157c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
1583faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner
159c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Do not allow MTCTR and BCTRL to be in the same dispatch group.
16005c180b34763c2891a2bf467c48bcf2a96f7e660Nicolas Geoffray  if (HasCTRSet && (Opcode == PPC::BCTRL_Macho || Opcode == PPC::BCTRL_ELF))
161c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    return NoopHazard;
162c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
163c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // If this is a load following a store, make sure it's not to the same or
164c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // overlapping address.
16564ce964673ca5c71f46933d8699aa557fbc5f15aChris Lattner  if (isLoad && NumStores) {
166c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    unsigned LoadSize;
167c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    switch (Opcode) {
168c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    default: assert(0 && "Unknown load!");
169c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LBZ:   case PPC::LBZU:
17088d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LBZX:
171c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LBZ8:  case PPC::LBZU8:
172518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner    case PPC::LBZX8:
17388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LVEBX:
17488d211f82304e53694ece666d4a2507b170e4582Chris Lattner      LoadSize = 1;
17588d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
176c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LHA:   case PPC::LHAU:
17788d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LHAX:
178c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LHZ:   case PPC::LHZU:
17988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LHZX:
18088d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LVEHX:
181d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner    case PPC::LHBRX:
182c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LHA8:   case PPC::LHAU8:
183518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner    case PPC::LHAX8:
184c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LHZ8:   case PPC::LHZU8:
185518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner    case PPC::LHZX8:
18688d211f82304e53694ece666d4a2507b170e4582Chris Lattner      LoadSize = 2;
18788d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
188c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LFS:    case PPC::LFSU:
18988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LFSX:
190c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LWZ:    case PPC::LWZU:
1912046371e70e90d4435fcdf1b2ebeb64a2e5b2626Chris Lattner    case PPC::LWZX:
19288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LWA:
19388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LWAX:
19488d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LVEWX:
195d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner    case PPC::LWBRX:
196518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner    case PPC::LWZ8:
197518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner    case PPC::LWZX8:
19888d211f82304e53694ece666d4a2507b170e4582Chris Lattner      LoadSize = 4;
19988d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
200c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LFD:    case PPC::LFDU:
20188d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LFDX:
202c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LD:     case PPC::LDU:
20388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LDX:
20488d211f82304e53694ece666d4a2507b170e4582Chris Lattner      LoadSize = 8;
20588d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
20688d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LVX:
207399ea50dc3321b4cc16e0a5ea7c41495c55a01baBill Wendling    case PPC::LVXL:
20888d211f82304e53694ece666d4a2507b170e4582Chris Lattner      LoadSize = 16;
20988d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
210c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    }
211c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
212c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    if (isLoadOfStoredAddress(LoadSize,
213c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner                              Node->getOperand(0), Node->getOperand(1)))
214c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner      return NoopHazard;
215c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
216c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
217c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  return NoHazard;
218c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
219c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
220c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnervoid PPCHazardRecognizer970::EmitInstruction(SDNode *Node) {
2213faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  bool isFirst, isSingle, isCracked, isLoad, isStore;
22288d211f82304e53694ece666d4a2507b170e4582Chris Lattner  PPCII::PPC970_Unit InstrType =
2233faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    GetInstrType(Node->getOpcode(), isFirst, isSingle, isCracked,
2243faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                 isLoad, isStore);
22588d211f82304e53694ece666d4a2507b170e4582Chris Lattner  if (InstrType == PPCII::PPC970_Pseudo) return;
226e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  unsigned Opcode = Node->getMachineOpcode();
227c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
228c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Update structural hazard information.
229c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  if (Opcode == PPC::MTCTR) HasCTRSet = true;
230c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
231c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Track the address stored to.
23288d211f82304e53694ece666d4a2507b170e4582Chris Lattner  if (isStore) {
23388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    unsigned ThisStoreSize;
234c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    switch (Opcode) {
235c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    default: assert(0 && "Unknown store instruction!");
23680df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STB:    case PPC::STB8:
23780df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STBU:   case PPC::STBU8:
23880df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STBX:   case PPC::STBX8:
23988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STVEBX:
24088d211f82304e53694ece666d4a2507b170e4582Chris Lattner      ThisStoreSize = 1;
24188d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
24280df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STH:    case PPC::STH8:
24380df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STHU:   case PPC::STHU8:
24480df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STHX:   case PPC::STHX8:
24588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STVEHX:
246d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner    case PPC::STHBRX:
24788d211f82304e53694ece666d4a2507b170e4582Chris Lattner      ThisStoreSize = 2;
24888d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
24980df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STFS:
25080df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STFSU:
25188d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STFSX:
25280df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STWX:   case PPC::STWX8:
25388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STWUX:
25480df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STW:    case PPC::STW8:
25580df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STWU:   case PPC::STWU8:
25688d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STVEWX:
25788d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STFIWX:
258d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner    case PPC::STWBRX:
25988d211f82304e53694ece666d4a2507b170e4582Chris Lattner      ThisStoreSize = 4;
26088d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
261ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner    case PPC::STD_32:
262ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner    case PPC::STDX_32:
26380df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STD:
26480df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STDU:
26588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STFD:
26688d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STFDX:
26788d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STDX:
26888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STDUX:
26988d211f82304e53694ece666d4a2507b170e4582Chris Lattner      ThisStoreSize = 8;
27088d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
27188d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STVX:
272399ea50dc3321b4cc16e0a5ea7c41495c55a01baBill Wendling    case PPC::STVXL:
27388d211f82304e53694ece666d4a2507b170e4582Chris Lattner      ThisStoreSize = 16;
27488d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
275c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    }
27688d211f82304e53694ece666d4a2507b170e4582Chris Lattner
27788d211f82304e53694ece666d4a2507b170e4582Chris Lattner    StoreSize[NumStores] = ThisStoreSize;
27888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    StorePtr1[NumStores] = Node->getOperand(1);
27988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    StorePtr2[NumStores] = Node->getOperand(2);
28088d211f82304e53694ece666d4a2507b170e4582Chris Lattner    ++NumStores;
281c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
282c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
28388d211f82304e53694ece666d4a2507b170e4582Chris Lattner  if (InstrType == PPCII::PPC970_BRU || isSingle)
28488d211f82304e53694ece666d4a2507b170e4582Chris Lattner    NumIssued = 4;  // Terminate a d-group.
285c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  ++NumIssued;
286c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
2873faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // If this instruction is cracked into two ops by the decoder, remember that
2883faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // we issued two pieces.
2893faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  if (isCracked)
2903faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    ++NumIssued;
2913faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner
292c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  if (NumIssued == 5)
293c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    EndDispatchGroup();
294c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
295c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
296c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnervoid PPCHazardRecognizer970::AdvanceCycle() {
297c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  assert(NumIssued < 5 && "Illegal dispatch group!");
298c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  ++NumIssued;
299c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  if (NumIssued == 5)
300c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    EndDispatchGroup();
301c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
302c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
303c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnervoid PPCHazardRecognizer970::EmitNoop() {
304c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  AdvanceCycle();
305c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
306