PPCHazardRecognizers.cpp revision c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2
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//===----------------------------------------------------------------------===//
25c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel// PowerPC 440 Hazard Recognizer
26c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkelvoid PPCHazardRecognizer440::EmitInstruction(SUnit *SU) {
27c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel  const MCInstrDesc *MCID = DAG->getInstrDesc(SU);
28c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel  if (!MCID) {
29c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel    // This is a PPC pseudo-instruction.
30c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel    // FIXME: Should something else be done?
31c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel    return;
32c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel  }
33c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel
34c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel  ScoreboardHazardRecognizer::EmitInstruction(SU);
35c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel}
36c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel
37c6d08f10bf797cc78068ef30bd0e8812a5bdc9a2Hal Finkel//===----------------------------------------------------------------------===//
38c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner// PowerPC 970 Hazard Recognizer
39c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//
407ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// This models the dispatch group formation of the PPC970 processor.  Dispatch
4188d211f82304e53694ece666d4a2507b170e4582Chris Lattner// groups are bundles of up to five instructions that can contain various mixes
426e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick// of instructions.  The PPC970 can dispatch a peak of 4 non-branch and one
4388d211f82304e53694ece666d4a2507b170e4582Chris Lattner// branch instruction per-cycle.
447ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner//
4588d211f82304e53694ece666d4a2507b170e4582Chris Lattner// There are a number of restrictions to dispatch group formation: some
4688d211f82304e53694ece666d4a2507b170e4582Chris Lattner// instructions can only be issued in the first slot of a dispatch group, & some
4788d211f82304e53694ece666d4a2507b170e4582Chris Lattner// instructions fill an entire dispatch group.  Additionally, only branches can
4888d211f82304e53694ece666d4a2507b170e4582Chris Lattner// issue in the 5th (last) slot.
497ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner//
507ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// Finally, there are a number of "structural" hazards on the PPC970.  These
517ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// conditions cause large performance penalties due to misprediction, recovery,
527ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// and replay logic that has to happen.  These cases include setting a CTR and
537ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// branching through it in the same dispatch group, and storing to an address,
547ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// then loading from the same address within a dispatch group.  To avoid these
557ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// conditions, we insert no-op instructions when appropriate.
567ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner//
57c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner// FIXME: This is missing some significant cases:
58c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//   1. Modeling of microcoded instructions.
593faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner//   2. Handling of serialized operations.
603faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner//   3. Handling of the esoteric cases in "Resource-based Instruction Grouping".
61c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner//
62c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
6388d211f82304e53694ece666d4a2507b170e4582Chris LattnerPPCHazardRecognizer970::PPCHazardRecognizer970(const TargetInstrInfo &tii)
6488d211f82304e53694ece666d4a2507b170e4582Chris Lattner  : TII(tii) {
65b0d21ef20c29f4ea46d21b488f17feaa6a8760e1Chris Lattner  EndDispatchGroup();
66b0d21ef20c29f4ea46d21b488f17feaa6a8760e1Chris Lattner}
67b0d21ef20c29f4ea46d21b488f17feaa6a8760e1Chris Lattner
68c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnervoid PPCHazardRecognizer970::EndDispatchGroup() {
69893e1c90a03a53cf13f73849324e83612688428aChris Lattner  DEBUG(errs() << "=== Start of dispatch group\n");
70c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  NumIssued = 0;
716e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
72c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Structural hazard info.
73c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  HasCTRSet = false;
7488d211f82304e53694ece666d4a2507b170e4582Chris Lattner  NumStores = 0;
75c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
76c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
77c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
786e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew TrickPPCII::PPC970_Unit
7988d211f82304e53694ece666d4a2507b170e4582Chris LattnerPPCHazardRecognizer970::GetInstrType(unsigned Opcode,
8088d211f82304e53694ece666d4a2507b170e4582Chris Lattner                                     bool &isFirst, bool &isSingle,
813faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                                     bool &isCracked,
823faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                                     bool &isLoad, bool &isStore) {
83e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  if ((int)Opcode >= 0) {
843faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    isFirst = isSingle = isCracked = isLoad = isStore = false;
8588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    return PPCII::PPC970_Pseudo;
8688d211f82304e53694ece666d4a2507b170e4582Chris Lattner  }
87e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  Opcode = ~Opcode;
886e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
89e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  const MCInstrDesc &MCID = TII.get(Opcode);
906e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
91e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  isLoad  = MCID.mayLoad();
92e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  isStore = MCID.mayStore();
936e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
94e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  uint64_t TSFlags = MCID.TSFlags;
956e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
963faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  isFirst   = TSFlags & PPCII::PPC970_First;
973faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  isSingle  = TSFlags & PPCII::PPC970_Single;
983faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  isCracked = TSFlags & PPCII::PPC970_Cracked;
9988d211f82304e53694ece666d4a2507b170e4582Chris Lattner  return (PPCII::PPC970_Unit)(TSFlags & PPCII::PPC970_Mask);
100c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
101c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
102c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// isLoadOfStoredAddress - If we have a load from the previously stored pointer
103c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// as indicated by StorePtr1/StorePtr2/StoreSize, return true.
104c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnerbool PPCHazardRecognizer970::
105475871a144eb604ddaf37503397ba0941442e5fbDan GohmanisLoadOfStoredAddress(unsigned LoadSize, SDValue Ptr1, SDValue Ptr2) const {
10688d211f82304e53694ece666d4a2507b170e4582Chris Lattner  for (unsigned i = 0, e = NumStores; i != e; ++i) {
10788d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // Handle exact and commuted addresses.
10888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (Ptr1 == StorePtr1[i] && Ptr2 == StorePtr2[i])
10988d211f82304e53694ece666d4a2507b170e4582Chris Lattner      return true;
11088d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (Ptr2 == StorePtr1[i] && Ptr1 == StorePtr2[i])
11188d211f82304e53694ece666d4a2507b170e4582Chris Lattner      return true;
1126e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
11388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // Okay, we don't have an exact match, if this is an indexed offset, see if
11488d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // we have overlap (which happens during fp->int conversion for example).
11588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (StorePtr2[i] == Ptr2) {
11688d211f82304e53694ece666d4a2507b170e4582Chris Lattner      if (ConstantSDNode *StoreOffset = dyn_cast<ConstantSDNode>(StorePtr1[i]))
11788d211f82304e53694ece666d4a2507b170e4582Chris Lattner        if (ConstantSDNode *LoadOffset = dyn_cast<ConstantSDNode>(Ptr1)) {
11888d211f82304e53694ece666d4a2507b170e4582Chris Lattner          // Okay the base pointers match, so we have [c1+r] vs [c2+r].  Check
11988d211f82304e53694ece666d4a2507b170e4582Chris Lattner          // to see if the load and store actually overlap.
120f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman          int StoreOffs = StoreOffset->getZExtValue();
121f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman          int LoadOffs  = LoadOffset->getZExtValue();
12288d211f82304e53694ece666d4a2507b170e4582Chris Lattner          if (StoreOffs < LoadOffs) {
12364ce964673ca5c71f46933d8699aa557fbc5f15aChris Lattner            if (int(StoreOffs+StoreSize[i]) > LoadOffs) return true;
12488d211f82304e53694ece666d4a2507b170e4582Chris Lattner          } else {
12588d211f82304e53694ece666d4a2507b170e4582Chris Lattner            if (int(LoadOffs+LoadSize) > StoreOffs) return true;
12688d211f82304e53694ece666d4a2507b170e4582Chris Lattner          }
127c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner        }
12888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    }
129c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
130c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  return false;
131c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
132c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
133c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// getHazardType - We return hazard for any non-branch instruction that would
134f451cb870efcf9e0302d25ed05f4cac6bb494e42Dan Gohman/// terminate the dispatch group.  We turn NoopHazard for any
135c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// instructions that wouldn't terminate the dispatch group that would cause a
136c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// pipeline flush.
137fc54c552963545a81e4ea38e60460590afb2d5aeDan GohmanScheduleHazardRecognizer::HazardType PPCHazardRecognizer970::
1382da8bc8a5f7705ac131184cd247f48500da0d74eAndrew TrickgetHazardType(SUnit *SU, int Stalls) {
1392da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  assert(Stalls == 0 && "PPC hazards don't support scoreboard lookahead");
1402da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick
14129d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  const SDNode *Node = SU->getNode()->getGluedMachineNode();
1423faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  bool isFirst, isSingle, isCracked, isLoad, isStore;
1436e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick  PPCII::PPC970_Unit InstrType =
1443faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    GetInstrType(Node->getOpcode(), isFirst, isSingle, isCracked,
1453faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                 isLoad, isStore);
1466e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick  if (InstrType == PPCII::PPC970_Pseudo) return NoHazard;
147e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  unsigned Opcode = Node->getMachineOpcode();
148c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
14988d211f82304e53694ece666d4a2507b170e4582Chris Lattner  // We can only issue a PPC970_First/PPC970_Single instruction (such as
15088d211f82304e53694ece666d4a2507b170e4582Chris Lattner  // crand/mtspr/etc) if this is the first cycle of the dispatch group.
1513faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  if (NumIssued != 0 && (isFirst || isSingle))
15288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    return Hazard;
1536e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
1543faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // If this instruction is cracked into two ops by the decoder, we know that
1553faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // it is not a branch and that it cannot issue if 3 other instructions are
1563faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // already in the dispatch group.
1573faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  if (isCracked && NumIssued > 2)
1583faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    return Hazard;
1596e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
160c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  switch (InstrType) {
161c23197a26f34f559ea9797de51e187087c039c42Torok Edwin  default: llvm_unreachable("Unknown instruction type!");
16288d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_FXU:
16388d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_LSU:
16488d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_FPU:
16588d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_VALU:
16688d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_VPERM:
16788d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // We can only issue a branch as the last instruction in a group.
16888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (NumIssued == 4) return Hazard;
16988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    break;
17088d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_CRU:
17188d211f82304e53694ece666d4a2507b170e4582Chris Lattner    // We can only issue a CR instruction in the first two slots.
17288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    if (NumIssued >= 2) return Hazard;
17388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    break;
17488d211f82304e53694ece666d4a2507b170e4582Chris Lattner  case PPCII::PPC970_BRU:
17588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    break;
176c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
1776e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
178c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Do not allow MTCTR and BCTRL to be in the same dispatch group.
1792a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller  if (HasCTRSet && (Opcode == PPC::BCTRL_Darwin || Opcode == PPC::BCTRL_SVR4))
180c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    return NoopHazard;
1816e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
182c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // If this is a load following a store, make sure it's not to the same or
183c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // overlapping address.
18464ce964673ca5c71f46933d8699aa557fbc5f15aChris Lattner  if (isLoad && NumStores) {
185c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    unsigned LoadSize;
186c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    switch (Opcode) {
187c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    default: llvm_unreachable("Unknown load!");
188c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LBZ:   case PPC::LBZU:
18988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LBZX:
190c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LBZ8:  case PPC::LBZU8:
191518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner    case PPC::LBZX8:
19288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LVEBX:
19388d211f82304e53694ece666d4a2507b170e4582Chris Lattner      LoadSize = 1;
19488d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
195c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LHA:   case PPC::LHAU:
19688d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LHAX:
197c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LHZ:   case PPC::LHZU:
19888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LHZX:
19988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LVEHX:
200d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner    case PPC::LHBRX:
201c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LHA8:   case PPC::LHAU8:
202518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner    case PPC::LHAX8:
203c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LHZ8:   case PPC::LHZU8:
204518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner    case PPC::LHZX8:
20588d211f82304e53694ece666d4a2507b170e4582Chris Lattner      LoadSize = 2;
20688d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
207c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LFS:    case PPC::LFSU:
20888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LFSX:
209c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LWZ:    case PPC::LWZU:
2102046371e70e90d4435fcdf1b2ebeb64a2e5b2626Chris Lattner    case PPC::LWZX:
21188d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LWA:
21288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LWAX:
21388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LVEWX:
214d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner    case PPC::LWBRX:
215518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner    case PPC::LWZ8:
216518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner    case PPC::LWZX8:
21788d211f82304e53694ece666d4a2507b170e4582Chris Lattner      LoadSize = 4;
21888d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
219c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LFD:    case PPC::LFDU:
22088d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LFDX:
221c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner    case PPC::LD:     case PPC::LDU:
22288d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LDX:
22388d211f82304e53694ece666d4a2507b170e4582Chris Lattner      LoadSize = 8;
22488d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
22588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::LVX:
226399ea50dc3321b4cc16e0a5ea7c41495c55a01baBill Wendling    case PPC::LVXL:
22788d211f82304e53694ece666d4a2507b170e4582Chris Lattner      LoadSize = 16;
22888d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
229c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    }
2306e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
2316e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick    if (isLoadOfStoredAddress(LoadSize,
232c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner                              Node->getOperand(0), Node->getOperand(1)))
233c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner      return NoopHazard;
234c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
2356e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
236c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  return NoHazard;
237c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
238c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
239fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohmanvoid PPCHazardRecognizer970::EmitInstruction(SUnit *SU) {
24029d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner  const SDNode *Node = SU->getNode()->getGluedMachineNode();
2413faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  bool isFirst, isSingle, isCracked, isLoad, isStore;
2426e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick  PPCII::PPC970_Unit InstrType =
2433faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    GetInstrType(Node->getOpcode(), isFirst, isSingle, isCracked,
2443faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner                 isLoad, isStore);
2456e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick  if (InstrType == PPCII::PPC970_Pseudo) return;
246e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman  unsigned Opcode = Node->getMachineOpcode();
247c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
248c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Update structural hazard information.
2490c9b559bfd0b476c2dde787285a1195f3142c423Roman Divacky  if (Opcode == PPC::MTCTR || Opcode == PPC::MTCTR8) HasCTRSet = true;
2506e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
251c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  // Track the address stored to.
25288d211f82304e53694ece666d4a2507b170e4582Chris Lattner  if (isStore) {
25388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    unsigned ThisStoreSize;
254c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    switch (Opcode) {
255c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    default: llvm_unreachable("Unknown store instruction!");
25680df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STB:    case PPC::STB8:
25780df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STBU:   case PPC::STBU8:
25880df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STBX:   case PPC::STBX8:
25988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STVEBX:
26088d211f82304e53694ece666d4a2507b170e4582Chris Lattner      ThisStoreSize = 1;
26188d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
26280df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STH:    case PPC::STH8:
26380df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STHU:   case PPC::STHU8:
26480df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STHX:   case PPC::STHX8:
26588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STVEHX:
266d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner    case PPC::STHBRX:
26788d211f82304e53694ece666d4a2507b170e4582Chris Lattner      ThisStoreSize = 2;
26888d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
26980df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STFS:
27080df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STFSU:
27188d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STFSX:
27280df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STWX:   case PPC::STWX8:
27388d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STWUX:
27480df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STW:    case PPC::STW8:
2759fa200d2a2360412465bbd6cfb485af2e9d5b1b4Chris Lattner    case PPC::STWU:
27688d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STVEWX:
27788d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STFIWX:
278d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner    case PPC::STWBRX:
27988d211f82304e53694ece666d4a2507b170e4582Chris Lattner      ThisStoreSize = 4;
28088d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
281ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner    case PPC::STD_32:
282ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner    case PPC::STDX_32:
28380df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STD:
28480df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner    case PPC::STDU:
28588d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STFD:
28688d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STFDX:
28788d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STDX:
28888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STDUX:
28988d211f82304e53694ece666d4a2507b170e4582Chris Lattner      ThisStoreSize = 8;
29088d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
29188d211f82304e53694ece666d4a2507b170e4582Chris Lattner    case PPC::STVX:
292399ea50dc3321b4cc16e0a5ea7c41495c55a01baBill Wendling    case PPC::STVXL:
29388d211f82304e53694ece666d4a2507b170e4582Chris Lattner      ThisStoreSize = 16;
29488d211f82304e53694ece666d4a2507b170e4582Chris Lattner      break;
295c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    }
2966e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
29788d211f82304e53694ece666d4a2507b170e4582Chris Lattner    StoreSize[NumStores] = ThisStoreSize;
29888d211f82304e53694ece666d4a2507b170e4582Chris Lattner    StorePtr1[NumStores] = Node->getOperand(1);
29988d211f82304e53694ece666d4a2507b170e4582Chris Lattner    StorePtr2[NumStores] = Node->getOperand(2);
30088d211f82304e53694ece666d4a2507b170e4582Chris Lattner    ++NumStores;
301c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  }
3026e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
30388d211f82304e53694ece666d4a2507b170e4582Chris Lattner  if (InstrType == PPCII::PPC970_BRU || isSingle)
30488d211f82304e53694ece666d4a2507b170e4582Chris Lattner    NumIssued = 4;  // Terminate a d-group.
305c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  ++NumIssued;
3066e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
3073faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // If this instruction is cracked into two ops by the decoder, remember that
3083faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  // we issued two pieces.
3093faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner  if (isCracked)
3103faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner    ++NumIssued;
3116e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
312c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  if (NumIssued == 5)
313c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    EndDispatchGroup();
314c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
315c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner
316c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnervoid PPCHazardRecognizer970::AdvanceCycle() {
317c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  assert(NumIssued < 5 && "Illegal dispatch group!");
318c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  ++NumIssued;
319c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner  if (NumIssued == 5)
320c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner    EndDispatchGroup();
321c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner}
322