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