//===--------------------- Instruction.h ------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// \file /// /// This file defines abstractions used by the Pipeline to model register reads, /// register writes and instructions. /// //===----------------------------------------------------------------------===// #ifndef LLVM_MCA_INSTRUCTION_H #define LLVM_MCA_INSTRUCTION_H #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/MC/MCRegister.h" // definition of MCPhysReg. #include "llvm/Support/MathExtras.h" #ifndef NDEBUG #include "llvm/Support/raw_ostream.h" #endif #include <memory> namespace llvm { namespace mca { constexpr int UNKNOWN_CYCLES = …; /// A representation of an mca::Instruction operand /// for use in mca::CustomBehaviour. class MCAOperand { … }; /// A register write descriptor. struct WriteDescriptor { … }; /// A register read descriptor. struct ReadDescriptor { … }; class ReadState; /// A critical data dependency descriptor. /// /// Field RegID is set to the invalid register for memory dependencies. struct CriticalDependency { … }; /// Tracks uses of a register definition (e.g. register write). /// /// Each implicit/explicit register write is associated with an instance of /// this class. A WriteState object tracks the dependent users of a /// register write. It also tracks how many cycles are left before the write /// back stage. class WriteState { … }; /// Tracks register operand latency in cycles. /// /// A read may be dependent on more than one write. This occurs when some /// writes only partially update the register associated to this read. class ReadState { … }; /// A sequence of cycles. /// /// This class can be used as a building block to construct ranges of cycles. class CycleSegment { … }; /// Helper used by class InstrDesc to describe how hardware resources /// are used. /// /// This class describes how many resource units of a specific resource kind /// (and how many cycles) are "used" by an instruction. struct ResourceUsage { … }; /// An instruction descriptor struct InstrDesc { … }; /// Base class for instructions consumed by the simulation pipeline. /// /// This class tracks data dependencies as well as generic properties /// of the instruction. class InstructionBase { … }; /// An instruction propagated through the simulated instruction pipeline. /// /// This class is used to monitor changes to the internal state of instructions /// that are sent to the various components of the simulated hardware pipeline. class Instruction : public InstructionBase { … }; /// An InstRef contains both a SourceMgr index and Instruction pair. The index /// is used as a unique identifier for the instruction. MCA will make use of /// this index as a key throughout MCA. class InstRef { … }; #ifndef NDEBUG inline raw_ostream &operator<<(raw_ostream &OS, const InstRef &IR) { IR.print(OS); return OS; } #endif } // namespace mca } // namespace llvm #endif // LLVM_MCA_INSTRUCTION_H