1 //===-- Target.cpp ----------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #include "Target.h" 10 11 #include "Latency.h" 12 #include "Uops.h" 13 14 namespace exegesis { 15 16 ExegesisTarget::~ExegesisTarget() {} // anchor. 17 18 static ExegesisTarget *FirstTarget = nullptr; 19 20 const ExegesisTarget *ExegesisTarget::lookup(llvm::Triple TT) { 21 for (const ExegesisTarget *T = FirstTarget; T != nullptr; T = T->Next) { 22 if (T->matchesArch(TT.getArch())) 23 return T; 24 } 25 return nullptr; 26 } 27 28 void ExegesisTarget::registerTarget(ExegesisTarget *Target) { 29 if (FirstTarget == nullptr) { 30 FirstTarget = Target; 31 return; 32 } 33 if (Target->Next != nullptr) 34 return; // Already registered. 35 Target->Next = FirstTarget; 36 FirstTarget = Target; 37 } 38 39 std::unique_ptr<BenchmarkRunner> 40 ExegesisTarget::createBenchmarkRunner(InstructionBenchmark::ModeE Mode, 41 const LLVMState &State) const { 42 switch (Mode) { 43 case InstructionBenchmark::Unknown: 44 return nullptr; 45 case InstructionBenchmark::Latency: 46 return createLatencyBenchmarkRunner(State); 47 case InstructionBenchmark::Uops: 48 return createUopsBenchmarkRunner(State); 49 } 50 return nullptr; 51 } 52 53 std::unique_ptr<BenchmarkRunner> 54 ExegesisTarget::createLatencyBenchmarkRunner(const LLVMState &State) const { 55 return llvm::make_unique<LatencyBenchmarkRunner>(State); 56 } 57 58 std::unique_ptr<BenchmarkRunner> 59 ExegesisTarget::createUopsBenchmarkRunner(const LLVMState &State) const { 60 return llvm::make_unique<UopsBenchmarkRunner>(State); 61 } 62 63 namespace { 64 65 // Default implementation. 66 class ExegesisDefaultTarget : public ExegesisTarget { 67 private: 68 bool matchesArch(llvm::Triple::ArchType Arch) const override { 69 llvm_unreachable("never called"); 70 return false; 71 } 72 }; 73 74 } // namespace 75 76 const ExegesisTarget &ExegesisTarget::getDefault() { 77 static ExegesisDefaultTarget Target; 78 return Target; 79 } 80 81 } // namespace exegesis 82