PPCHazardRecognizers.cpp revision 0c9b559bfd0b476c2dde787285a1195f3142c423
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//===----------------------------------------------------------------------===// 25c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner// PowerPC 970 Hazard Recognizer 26c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner// 277ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// This models the dispatch group formation of the PPC970 processor. Dispatch 2888d211f82304e53694ece666d4a2507b170e4582Chris Lattner// groups are bundles of up to five instructions that can contain various mixes 296e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick// of instructions. The PPC970 can dispatch a peak of 4 non-branch and one 3088d211f82304e53694ece666d4a2507b170e4582Chris Lattner// branch instruction per-cycle. 317ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// 3288d211f82304e53694ece666d4a2507b170e4582Chris Lattner// There are a number of restrictions to dispatch group formation: some 3388d211f82304e53694ece666d4a2507b170e4582Chris Lattner// instructions can only be issued in the first slot of a dispatch group, & some 3488d211f82304e53694ece666d4a2507b170e4582Chris Lattner// instructions fill an entire dispatch group. Additionally, only branches can 3588d211f82304e53694ece666d4a2507b170e4582Chris Lattner// issue in the 5th (last) slot. 367ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// 377ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// Finally, there are a number of "structural" hazards on the PPC970. These 387ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// conditions cause large performance penalties due to misprediction, recovery, 397ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// and replay logic that has to happen. These cases include setting a CTR and 407ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// branching through it in the same dispatch group, and storing to an address, 417ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// then loading from the same address within a dispatch group. To avoid these 427ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// conditions, we insert no-op instructions when appropriate. 437ce64852e8fc260f8a7434217c1b57b85a70a1c8Chris Lattner// 44c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner// FIXME: This is missing some significant cases: 45c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner// 1. Modeling of microcoded instructions. 463faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner// 2. Handling of serialized operations. 473faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner// 3. Handling of the esoteric cases in "Resource-based Instruction Grouping". 48c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner// 49c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner 5088d211f82304e53694ece666d4a2507b170e4582Chris LattnerPPCHazardRecognizer970::PPCHazardRecognizer970(const TargetInstrInfo &tii) 5188d211f82304e53694ece666d4a2507b170e4582Chris Lattner : TII(tii) { 52b0d21ef20c29f4ea46d21b488f17feaa6a8760e1Chris Lattner EndDispatchGroup(); 53b0d21ef20c29f4ea46d21b488f17feaa6a8760e1Chris Lattner} 54b0d21ef20c29f4ea46d21b488f17feaa6a8760e1Chris Lattner 55c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnervoid PPCHazardRecognizer970::EndDispatchGroup() { 56893e1c90a03a53cf13f73849324e83612688428aChris Lattner DEBUG(errs() << "=== Start of dispatch group\n"); 57c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner NumIssued = 0; 586e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 59c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner // Structural hazard info. 60c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner HasCTRSet = false; 6188d211f82304e53694ece666d4a2507b170e4582Chris Lattner NumStores = 0; 62c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner} 63c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner 64c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner 656e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew TrickPPCII::PPC970_Unit 6688d211f82304e53694ece666d4a2507b170e4582Chris LattnerPPCHazardRecognizer970::GetInstrType(unsigned Opcode, 6788d211f82304e53694ece666d4a2507b170e4582Chris Lattner bool &isFirst, bool &isSingle, 683faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner bool &isCracked, 693faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner bool &isLoad, bool &isStore) { 70e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman if ((int)Opcode >= 0) { 713faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner isFirst = isSingle = isCracked = isLoad = isStore = false; 7288d211f82304e53694ece666d4a2507b170e4582Chris Lattner return PPCII::PPC970_Pseudo; 7388d211f82304e53694ece666d4a2507b170e4582Chris Lattner } 74e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman Opcode = ~Opcode; 756e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 76749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner const TargetInstrDesc &TID = TII.get(Opcode); 776e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 7841474baac839da410302950305722cb0e026a094Dan Gohman isLoad = TID.mayLoad(); 79c17d69fa1e084668d6bb27441dbb505e2024f579Chris Lattner isStore = TID.mayStore(); 806e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 8199405df044f2c584242e711cc9023ec90356da82Bruno Cardoso Lopes uint64_t TSFlags = TID.TSFlags; 826e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 833faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner isFirst = TSFlags & PPCII::PPC970_First; 843faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner isSingle = TSFlags & PPCII::PPC970_Single; 853faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner isCracked = TSFlags & PPCII::PPC970_Cracked; 8688d211f82304e53694ece666d4a2507b170e4582Chris Lattner return (PPCII::PPC970_Unit)(TSFlags & PPCII::PPC970_Mask); 87c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner} 88c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner 89c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// isLoadOfStoredAddress - If we have a load from the previously stored pointer 90c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// as indicated by StorePtr1/StorePtr2/StoreSize, return true. 91c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnerbool PPCHazardRecognizer970:: 92475871a144eb604ddaf37503397ba0941442e5fbDan GohmanisLoadOfStoredAddress(unsigned LoadSize, SDValue Ptr1, SDValue Ptr2) const { 9388d211f82304e53694ece666d4a2507b170e4582Chris Lattner for (unsigned i = 0, e = NumStores; i != e; ++i) { 9488d211f82304e53694ece666d4a2507b170e4582Chris Lattner // Handle exact and commuted addresses. 9588d211f82304e53694ece666d4a2507b170e4582Chris Lattner if (Ptr1 == StorePtr1[i] && Ptr2 == StorePtr2[i]) 9688d211f82304e53694ece666d4a2507b170e4582Chris Lattner return true; 9788d211f82304e53694ece666d4a2507b170e4582Chris Lattner if (Ptr2 == StorePtr1[i] && Ptr1 == StorePtr2[i]) 9888d211f82304e53694ece666d4a2507b170e4582Chris Lattner return true; 996e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 10088d211f82304e53694ece666d4a2507b170e4582Chris Lattner // Okay, we don't have an exact match, if this is an indexed offset, see if 10188d211f82304e53694ece666d4a2507b170e4582Chris Lattner // we have overlap (which happens during fp->int conversion for example). 10288d211f82304e53694ece666d4a2507b170e4582Chris Lattner if (StorePtr2[i] == Ptr2) { 10388d211f82304e53694ece666d4a2507b170e4582Chris Lattner if (ConstantSDNode *StoreOffset = dyn_cast<ConstantSDNode>(StorePtr1[i])) 10488d211f82304e53694ece666d4a2507b170e4582Chris Lattner if (ConstantSDNode *LoadOffset = dyn_cast<ConstantSDNode>(Ptr1)) { 10588d211f82304e53694ece666d4a2507b170e4582Chris Lattner // Okay the base pointers match, so we have [c1+r] vs [c2+r]. Check 10688d211f82304e53694ece666d4a2507b170e4582Chris Lattner // to see if the load and store actually overlap. 107f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman int StoreOffs = StoreOffset->getZExtValue(); 108f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman int LoadOffs = LoadOffset->getZExtValue(); 10988d211f82304e53694ece666d4a2507b170e4582Chris Lattner if (StoreOffs < LoadOffs) { 11064ce964673ca5c71f46933d8699aa557fbc5f15aChris Lattner if (int(StoreOffs+StoreSize[i]) > LoadOffs) return true; 11188d211f82304e53694ece666d4a2507b170e4582Chris Lattner } else { 11288d211f82304e53694ece666d4a2507b170e4582Chris Lattner if (int(LoadOffs+LoadSize) > StoreOffs) return true; 11388d211f82304e53694ece666d4a2507b170e4582Chris Lattner } 114c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner } 11588d211f82304e53694ece666d4a2507b170e4582Chris Lattner } 116c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner } 117c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner return false; 118c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner} 119c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner 120c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// getHazardType - We return hazard for any non-branch instruction that would 121f451cb870efcf9e0302d25ed05f4cac6bb494e42Dan Gohman/// terminate the dispatch group. We turn NoopHazard for any 122c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// instructions that wouldn't terminate the dispatch group that would cause a 123c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner/// pipeline flush. 124fc54c552963545a81e4ea38e60460590afb2d5aeDan GohmanScheduleHazardRecognizer::HazardType PPCHazardRecognizer970:: 1252da8bc8a5f7705ac131184cd247f48500da0d74eAndrew TrickgetHazardType(SUnit *SU, int Stalls) { 1262da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick assert(Stalls == 0 && "PPC hazards don't support scoreboard lookahead"); 1272da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick 12829d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner const SDNode *Node = SU->getNode()->getGluedMachineNode(); 1293faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner bool isFirst, isSingle, isCracked, isLoad, isStore; 1306e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick PPCII::PPC970_Unit InstrType = 1313faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner GetInstrType(Node->getOpcode(), isFirst, isSingle, isCracked, 1323faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner isLoad, isStore); 1336e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick if (InstrType == PPCII::PPC970_Pseudo) return NoHazard; 134e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman unsigned Opcode = Node->getMachineOpcode(); 135c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner 13688d211f82304e53694ece666d4a2507b170e4582Chris Lattner // We can only issue a PPC970_First/PPC970_Single instruction (such as 13788d211f82304e53694ece666d4a2507b170e4582Chris Lattner // crand/mtspr/etc) if this is the first cycle of the dispatch group. 1383faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner if (NumIssued != 0 && (isFirst || isSingle)) 13988d211f82304e53694ece666d4a2507b170e4582Chris Lattner return Hazard; 1406e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 1413faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner // If this instruction is cracked into two ops by the decoder, we know that 1423faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner // it is not a branch and that it cannot issue if 3 other instructions are 1433faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner // already in the dispatch group. 1443faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner if (isCracked && NumIssued > 2) 1453faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner return Hazard; 1466e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 147c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner switch (InstrType) { 148c23197a26f34f559ea9797de51e187087c039c42Torok Edwin default: llvm_unreachable("Unknown instruction type!"); 14988d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPCII::PPC970_FXU: 15088d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPCII::PPC970_LSU: 15188d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPCII::PPC970_FPU: 15288d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPCII::PPC970_VALU: 15388d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPCII::PPC970_VPERM: 15488d211f82304e53694ece666d4a2507b170e4582Chris Lattner // We can only issue a branch as the last instruction in a group. 15588d211f82304e53694ece666d4a2507b170e4582Chris Lattner if (NumIssued == 4) return Hazard; 15688d211f82304e53694ece666d4a2507b170e4582Chris Lattner break; 15788d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPCII::PPC970_CRU: 15888d211f82304e53694ece666d4a2507b170e4582Chris Lattner // We can only issue a CR instruction in the first two slots. 15988d211f82304e53694ece666d4a2507b170e4582Chris Lattner if (NumIssued >= 2) return Hazard; 16088d211f82304e53694ece666d4a2507b170e4582Chris Lattner break; 16188d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPCII::PPC970_BRU: 16288d211f82304e53694ece666d4a2507b170e4582Chris Lattner break; 163c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner } 1646e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 165c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner // Do not allow MTCTR and BCTRL to be in the same dispatch group. 1662a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller if (HasCTRSet && (Opcode == PPC::BCTRL_Darwin || Opcode == PPC::BCTRL_SVR4)) 167c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner return NoopHazard; 1686e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 169c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner // If this is a load following a store, make sure it's not to the same or 170c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner // overlapping address. 17164ce964673ca5c71f46933d8699aa557fbc5f15aChris Lattner if (isLoad && NumStores) { 172c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner unsigned LoadSize; 173c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner switch (Opcode) { 174c23197a26f34f559ea9797de51e187087c039c42Torok Edwin default: llvm_unreachable("Unknown load!"); 175c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner case PPC::LBZ: case PPC::LBZU: 17688d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::LBZX: 177c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner case PPC::LBZ8: case PPC::LBZU8: 178518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner case PPC::LBZX8: 17988d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::LVEBX: 18088d211f82304e53694ece666d4a2507b170e4582Chris Lattner LoadSize = 1; 18188d211f82304e53694ece666d4a2507b170e4582Chris Lattner break; 182c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner case PPC::LHA: case PPC::LHAU: 18388d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::LHAX: 184c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner case PPC::LHZ: case PPC::LHZU: 18588d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::LHZX: 18688d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::LVEHX: 187d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner case PPC::LHBRX: 188c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner case PPC::LHA8: case PPC::LHAU8: 189518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner case PPC::LHAX8: 190c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner case PPC::LHZ8: case PPC::LHZU8: 191518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner case PPC::LHZX8: 19288d211f82304e53694ece666d4a2507b170e4582Chris Lattner LoadSize = 2; 19388d211f82304e53694ece666d4a2507b170e4582Chris Lattner break; 194c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner case PPC::LFS: case PPC::LFSU: 19588d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::LFSX: 196c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner case PPC::LWZ: case PPC::LWZU: 1972046371e70e90d4435fcdf1b2ebeb64a2e5b2626Chris Lattner case PPC::LWZX: 19888d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::LWA: 19988d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::LWAX: 20088d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::LVEWX: 201d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner case PPC::LWBRX: 202518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner case PPC::LWZ8: 203518f9c7ad0566a69886a4db1b76e995df22bca0fChris Lattner case PPC::LWZX8: 20488d211f82304e53694ece666d4a2507b170e4582Chris Lattner LoadSize = 4; 20588d211f82304e53694ece666d4a2507b170e4582Chris Lattner break; 206c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner case PPC::LFD: case PPC::LFDU: 20788d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::LFDX: 208c9dcf289557017742fb507f985b3bf9f44982031Chris Lattner case PPC::LD: case PPC::LDU: 20988d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::LDX: 21088d211f82304e53694ece666d4a2507b170e4582Chris Lattner LoadSize = 8; 21188d211f82304e53694ece666d4a2507b170e4582Chris Lattner break; 21288d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::LVX: 213399ea50dc3321b4cc16e0a5ea7c41495c55a01baBill Wendling case PPC::LVXL: 21488d211f82304e53694ece666d4a2507b170e4582Chris Lattner LoadSize = 16; 21588d211f82304e53694ece666d4a2507b170e4582Chris Lattner break; 216c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner } 2176e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 2186e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick if (isLoadOfStoredAddress(LoadSize, 219c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner Node->getOperand(0), Node->getOperand(1))) 220c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner return NoopHazard; 221c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner } 2226e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 223c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner return NoHazard; 224c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner} 225c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner 226fc54c552963545a81e4ea38e60460590afb2d5aeDan Gohmanvoid PPCHazardRecognizer970::EmitInstruction(SUnit *SU) { 22729d8f0cae425f1bba583565227eaebf58f26ce73Chris Lattner const SDNode *Node = SU->getNode()->getGluedMachineNode(); 2283faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner bool isFirst, isSingle, isCracked, isLoad, isStore; 2296e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick PPCII::PPC970_Unit InstrType = 2303faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner GetInstrType(Node->getOpcode(), isFirst, isSingle, isCracked, 2313faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner isLoad, isStore); 2326e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick if (InstrType == PPCII::PPC970_Pseudo) return; 233e8be6c63915e0389f1eef6b53c64300d13b2ce99Dan Gohman unsigned Opcode = Node->getMachineOpcode(); 234c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner 235c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner // Update structural hazard information. 2360c9b559bfd0b476c2dde787285a1195f3142c423Roman Divacky if (Opcode == PPC::MTCTR || Opcode == PPC::MTCTR8) HasCTRSet = true; 2376e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 238c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner // Track the address stored to. 23988d211f82304e53694ece666d4a2507b170e4582Chris Lattner if (isStore) { 24088d211f82304e53694ece666d4a2507b170e4582Chris Lattner unsigned ThisStoreSize; 241c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner switch (Opcode) { 242c23197a26f34f559ea9797de51e187087c039c42Torok Edwin default: llvm_unreachable("Unknown store instruction!"); 24380df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner case PPC::STB: case PPC::STB8: 24480df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner case PPC::STBU: case PPC::STBU8: 24580df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner case PPC::STBX: case PPC::STBX8: 24688d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::STVEBX: 24788d211f82304e53694ece666d4a2507b170e4582Chris Lattner ThisStoreSize = 1; 24888d211f82304e53694ece666d4a2507b170e4582Chris Lattner break; 24980df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner case PPC::STH: case PPC::STH8: 25080df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner case PPC::STHU: case PPC::STHU8: 25180df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner case PPC::STHX: case PPC::STHX8: 25288d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::STVEHX: 253d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner case PPC::STHBRX: 25488d211f82304e53694ece666d4a2507b170e4582Chris Lattner ThisStoreSize = 2; 25588d211f82304e53694ece666d4a2507b170e4582Chris Lattner break; 25680df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner case PPC::STFS: 25780df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner case PPC::STFSU: 25888d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::STFSX: 25980df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner case PPC::STWX: case PPC::STWX8: 26088d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::STWUX: 26180df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner case PPC::STW: case PPC::STW8: 2629fa200d2a2360412465bbd6cfb485af2e9d5b1b4Chris Lattner case PPC::STWU: 26388d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::STVEWX: 26488d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::STFIWX: 265d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner case PPC::STWBRX: 26688d211f82304e53694ece666d4a2507b170e4582Chris Lattner ThisStoreSize = 4; 26788d211f82304e53694ece666d4a2507b170e4582Chris Lattner break; 268ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner case PPC::STD_32: 269ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner case PPC::STDX_32: 27080df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner case PPC::STD: 27180df01d2cf68b680b1c90eb0d3b0f2defcdf202bChris Lattner case PPC::STDU: 27288d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::STFD: 27388d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::STFDX: 27488d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::STDX: 27588d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::STDUX: 27688d211f82304e53694ece666d4a2507b170e4582Chris Lattner ThisStoreSize = 8; 27788d211f82304e53694ece666d4a2507b170e4582Chris Lattner break; 27888d211f82304e53694ece666d4a2507b170e4582Chris Lattner case PPC::STVX: 279399ea50dc3321b4cc16e0a5ea7c41495c55a01baBill Wendling case PPC::STVXL: 28088d211f82304e53694ece666d4a2507b170e4582Chris Lattner ThisStoreSize = 16; 28188d211f82304e53694ece666d4a2507b170e4582Chris Lattner break; 282c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner } 2836e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 28488d211f82304e53694ece666d4a2507b170e4582Chris Lattner StoreSize[NumStores] = ThisStoreSize; 28588d211f82304e53694ece666d4a2507b170e4582Chris Lattner StorePtr1[NumStores] = Node->getOperand(1); 28688d211f82304e53694ece666d4a2507b170e4582Chris Lattner StorePtr2[NumStores] = Node->getOperand(2); 28788d211f82304e53694ece666d4a2507b170e4582Chris Lattner ++NumStores; 288c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner } 2896e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 29088d211f82304e53694ece666d4a2507b170e4582Chris Lattner if (InstrType == PPCII::PPC970_BRU || isSingle) 29188d211f82304e53694ece666d4a2507b170e4582Chris Lattner NumIssued = 4; // Terminate a d-group. 292c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner ++NumIssued; 2936e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 2943faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner // If this instruction is cracked into two ops by the decoder, remember that 2953faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner // we issued two pieces. 2963faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner if (isCracked) 2973faad495bc5c23de4852e7a3a13c25203cabfc3eChris Lattner ++NumIssued; 2986e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 299c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner if (NumIssued == 5) 300c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner EndDispatchGroup(); 301c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner} 302c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner 303c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattnervoid PPCHazardRecognizer970::AdvanceCycle() { 304c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner assert(NumIssued < 5 && "Illegal dispatch group!"); 305c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner ++NumIssued; 306c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner if (NumIssued == 5) 307c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner EndDispatchGroup(); 308c6644188208d4aee9a9d6c428710ec1f69837944Chris Lattner} 309