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