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