//===--------------------- 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 "FetchStage.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::run() { while (Fetch->isReady() || !Dispatch->isReady()) runCycle(Cycles++); } void Backend::runCycle(unsigned Cycle) { notifyCycleBegin(Cycle); // Update the stages before we do any processing for this cycle. InstRef IR; Retire->preExecute(IR); Dispatch->preExecute(IR); Execute->preExecute(IR); // Fetch instructions and dispatch them to the hardware. while (Fetch->execute(IR)) { if (!Dispatch->execute(IR)) break; Execute->execute(IR); Fetch->postExecute(IR); } notifyCycleEnd(Cycle); } void Backend::notifyCycleBegin(unsigned Cycle) { LLVM_DEBUG(dbgs() << "[E] Cycle begin: " << Cycle << '\n'); for (HWEventListener *Listener : Listeners) Listener->onCycleBegin(); } 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) { LLVM_DEBUG(dbgs() << "[E] Resource Available: [" << RR.first << '.' << RR.second << "]\n"); for (HWEventListener *Listener : Listeners) Listener->onResourceAvailable(RR); } void Backend::notifyReservedBuffers(ArrayRef Buffers) { for (HWEventListener *Listener : Listeners) Listener->onReservedBuffers(Buffers); } void Backend::notifyReleasedBuffers(ArrayRef Buffers) { for (HWEventListener *Listener : Listeners) Listener->onReleasedBuffers(Buffers); } void Backend::notifyCycleEnd(unsigned Cycle) { LLVM_DEBUG(dbgs() << "[E] Cycle end: " << Cycle << "\n\n"); for (HWEventListener *Listener : Listeners) Listener->onCycleEnd(); } } // namespace mca.