123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- //===-- Target.cpp ----------------------------------------------*- C++ -*-===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- #include "Target.h"
- #include "Latency.h"
- #include "ROBSize.h"
- #include "Uops.h"
- namespace llvm {
- namespace exegesis {
- ExegesisTarget::~ExegesisTarget() {} // anchor.
- static ExegesisTarget *FirstTarget = nullptr;
- const ExegesisTarget *ExegesisTarget::lookup(llvm::Triple TT) {
- for (const ExegesisTarget *T = FirstTarget; T != nullptr; T = T->Next) {
- if (T->matchesArch(TT.getArch()))
- return T;
- }
- return nullptr;
- }
- void ExegesisTarget::registerTarget(ExegesisTarget *Target) {
- if (FirstTarget == nullptr) {
- FirstTarget = Target;
- return;
- }
- if (Target->Next != nullptr)
- return; // Already registered.
- Target->Next = FirstTarget;
- FirstTarget = Target;
- }
- std::unique_ptr<SnippetGenerator>
- ExegesisTarget::createLatencySnippetGenerator(const LLVMState &State) const {
- return llvm::make_unique<LatencySnippetGenerator>(State);
- }
- std::unique_ptr<SnippetGenerator>
- ExegesisTarget::createUopsSnippetGenerator(const LLVMState &State) const {
- return llvm::make_unique<UopsSnippetGenerator>(State);
- }
- std::unique_ptr<SnippetGenerator>
- static createROBSizeSnippetGenerator(const LLVMState &State) {
- return llvm::make_unique<ROBSizeSnippetGenerator>(State);
- }
- std::unique_ptr<BenchmarkRunner>
- ExegesisTarget::createLatencyBenchmarkRunner(const LLVMState &State) const {
- return llvm::make_unique<LatencyBenchmarkRunner>(State);
- }
- std::unique_ptr<BenchmarkRunner>
- ExegesisTarget::createUopsBenchmarkRunner(const LLVMState &State) const {
- return llvm::make_unique<UopsBenchmarkRunner>(State);
- }
- std::unique_ptr<SnippetGenerator>
- ExegesisTarget::createSnippetGenerator(InstructionBenchmark::ModeE Mode,
- const LLVMState &State) const {
- switch (Mode) {
- case InstructionBenchmark::Unknown:
- return nullptr;
- case InstructionBenchmark::Latency:
- return createLatencySnippetGenerator(State);
- case InstructionBenchmark::Uops:
- return createUopsSnippetGenerator(State);
- case InstructionBenchmark::ROBSize:
- return createROBSizeSnippetGenerator(State);
- }
- return nullptr;
- }
- std::unique_ptr<BenchmarkRunner>
- ExegesisTarget::createBenchmarkRunner(InstructionBenchmark::ModeE Mode,
- const LLVMState &State) const {
- switch (Mode) {
- case InstructionBenchmark::Unknown:
- return nullptr;
- case InstructionBenchmark::Latency:
- case InstructionBenchmark::ROBSize:
- return createLatencyBenchmarkRunner(State);
- case InstructionBenchmark::Uops:
- return createUopsBenchmarkRunner(State);
- }
- return nullptr;
- }
- static_assert(std::is_pod<PfmCountersInfo>::value,
- "We shouldn't have dynamic initialization here");
- const PfmCountersInfo PfmCountersInfo::Default = {nullptr, nullptr, nullptr, 0u};
- const PfmCountersInfo &
- ExegesisTarget::getPfmCounters(llvm::StringRef CpuName) const {
- assert(std::is_sorted(
- CpuPfmCounters.begin(), CpuPfmCounters.end(),
- [](const CpuAndPfmCounters &LHS, const CpuAndPfmCounters &RHS) {
- return strcmp(LHS.CpuName, RHS.CpuName) < 0;
- }) &&
- "CpuPfmCounters table is not sorted");
- // Find entry
- auto Found =
- std::lower_bound(CpuPfmCounters.begin(), CpuPfmCounters.end(), CpuName);
- if (Found == CpuPfmCounters.end() ||
- llvm::StringRef(Found->CpuName) != CpuName) {
- return PfmCountersInfo::Default;
- }
- assert(Found->PCI && "Missing counters");
- return *Found->PCI;
- }
- namespace {
- // Default implementation.
- class ExegesisDefaultTarget : public ExegesisTarget {
- public:
- ExegesisDefaultTarget() : ExegesisTarget({}) {}
- private:
- std::vector<llvm::MCInst> setRegTo(const llvm::MCSubtargetInfo &STI,
- unsigned Reg,
- const llvm::APInt &Value) const override {
- llvm_unreachable("Not yet implemented");
- }
- std::vector<llvm::MCInst> copyReg(const llvm::MCSubtargetInfo &STI,
- unsigned ToReg, unsigned FromReg) const override {
- llvm_unreachable("Not yet implemented");
- }
- bool matchesArch(llvm::Triple::ArchType Arch) const override {
- llvm_unreachable("never called");
- return false;
- }
- };
- } // namespace
- const ExegesisTarget &ExegesisTarget::getDefault() {
- static ExegesisDefaultTarget Target;
- return Target;
- }
- } // namespace exegesis
- } // namespace llvm
|