mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-25 13:20:57 +00:00

Function computeProcResourceMasks is used by the ResourceManager (owned by the Scheduler) to compute resource masks for processor resources. Before this refactoring, there was an implicit dependency between the Scheduler and the InstrBuilder. That is because InstrBuilder has to know about resource masks when computing the set of processor resources consumed by a new instruction. With this patch, the functionality that computes resource masks has been extracted from the ResourceManager, and moved to a separate file (Support.h). This helps removing the dependency between the Scheduler and the InstrBuilder. No functional change intended. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327973 91177308-0d34-0410-b5e6-96231b3b80d8
85 lines
2.3 KiB
C++
85 lines
2.3 KiB
C++
//===--------------------- Backend.cpp --------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
/// \file
|
|
///
|
|
/// Implementation of class Backend which emulates an hardware OoO backend.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "Backend.h"
|
|
#include "HWEventListener.h"
|
|
#include "llvm/CodeGen/TargetSchedule.h"
|
|
#include "llvm/Support/Debug.h"
|
|
|
|
namespace mca {
|
|
|
|
#define DEBUG_TYPE "llvm-mca"
|
|
|
|
using namespace llvm;
|
|
|
|
void Backend::addEventListener(HWEventListener *Listener) {
|
|
if (Listener)
|
|
Listeners.insert(Listener);
|
|
}
|
|
|
|
void Backend::runCycle(unsigned Cycle) {
|
|
notifyCycleBegin(Cycle);
|
|
|
|
while (SM.hasNext()) {
|
|
InstRef IR = SM.peekNext();
|
|
std::unique_ptr<Instruction> NewIS(
|
|
IB->createInstruction(IR.first, *IR.second));
|
|
const InstrDesc &Desc = NewIS->getDesc();
|
|
if (!DU->isAvailable(Desc.NumMicroOps) ||
|
|
!DU->canDispatch(IR.first, *NewIS))
|
|
break;
|
|
|
|
Instruction *IS = NewIS.get();
|
|
Instructions[IR.first] = std::move(NewIS);
|
|
IS->setRCUTokenID(DU->dispatch(IR.first, IS, STI));
|
|
SM.updateNext();
|
|
}
|
|
|
|
notifyCycleEnd(Cycle);
|
|
}
|
|
|
|
void Backend::notifyCycleBegin(unsigned Cycle) {
|
|
DEBUG(dbgs() << "[E] Cycle begin: " << Cycle << '\n');
|
|
for (HWEventListener *Listener : Listeners)
|
|
Listener->onCycleBegin(Cycle);
|
|
|
|
DU->cycleEvent(Cycle);
|
|
HWS->cycleEvent(Cycle);
|
|
}
|
|
|
|
void Backend::notifyInstructionEvent(const HWInstructionEvent &Event) {
|
|
for (HWEventListener *Listener : Listeners)
|
|
Listener->onInstructionEvent(Event);
|
|
}
|
|
|
|
void Backend::notifyStallEvent(const HWStallEvent &Event) {
|
|
for (HWEventListener *Listener : Listeners)
|
|
Listener->onStallEvent(Event);
|
|
}
|
|
|
|
void Backend::notifyResourceAvailable(const ResourceRef &RR) {
|
|
DEBUG(dbgs() << "[E] Resource Available: [" << RR.first << '.' << RR.second
|
|
<< "]\n");
|
|
for (HWEventListener *Listener : Listeners)
|
|
Listener->onResourceAvailable(RR);
|
|
}
|
|
|
|
void Backend::notifyCycleEnd(unsigned Cycle) {
|
|
DEBUG(dbgs() << "[E] Cycle end: " << Cycle << "\n\n");
|
|
for (HWEventListener *Listener : Listeners)
|
|
Listener->onCycleEnd(Cycle);
|
|
}
|
|
|
|
} // namespace mca.
|