blob: 44156c815dbec662afe2ad6f366515e707daf4e9 [file] [log] [blame]
Clement Courbet44b4c542018-06-19 11:28:59 +00001//===-- 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
Clement Courbet4860b982018-06-26 08:49:30 +000011#include "Latency.h"
12#include "Uops.h"
13
Clement Courbet44b4c542018-06-19 11:28:59 +000014namespace exegesis {
15
Clement Courbetcff2caa2018-06-25 11:22:23 +000016ExegesisTarget::~ExegesisTarget() {} // anchor.
Clement Courbet44b4c542018-06-19 11:28:59 +000017
Clement Courbetcff2caa2018-06-25 11:22:23 +000018static ExegesisTarget *FirstTarget = nullptr;
Clement Courbet44b4c542018-06-19 11:28:59 +000019
Clement Courbet6fd00e32018-06-20 11:54:35 +000020const ExegesisTarget *ExegesisTarget::lookup(llvm::Triple TT) {
Clement Courbetcff2caa2018-06-25 11:22:23 +000021 for (const ExegesisTarget *T = FirstTarget; T != nullptr; T = T->Next) {
Clement Courbet6fd00e32018-06-20 11:54:35 +000022 if (T->matchesArch(TT.getArch()))
23 return T;
Clement Courbet44b4c542018-06-19 11:28:59 +000024 }
25 return nullptr;
26}
27
Clement Courbetcff2caa2018-06-25 11:22:23 +000028void ExegesisTarget::registerTarget(ExegesisTarget *Target) {
Clement Courbet44b4c542018-06-19 11:28:59 +000029 if (FirstTarget == nullptr) {
30 FirstTarget = Target;
31 return;
32 }
33 assert(Target->Next == nullptr && "target has already been registered");
34 if (Target->Next != nullptr)
35 return;
36 Target->Next = FirstTarget;
37 FirstTarget = Target;
38}
Clement Courbet4860b982018-06-26 08:49:30 +000039
40std::unique_ptr<BenchmarkRunner>
41ExegesisTarget::createBenchmarkRunner(InstructionBenchmark::ModeE Mode,
42 const LLVMState &State) const {
43 switch (Mode) {
44 case InstructionBenchmark::Unknown:
45 return nullptr;
46 case InstructionBenchmark::Latency:
47 return createLatencyBenchmarkRunner(State);
48 case InstructionBenchmark::Uops:
49 return createUopsBenchmarkRunner(State);
50 }
51 return nullptr;
52}
53
54std::unique_ptr<BenchmarkRunner>
55ExegesisTarget::createLatencyBenchmarkRunner(const LLVMState &State) const {
56 return llvm::make_unique<LatencyBenchmarkRunner>(State);
57}
58
59std::unique_ptr<BenchmarkRunner>
60ExegesisTarget::createUopsBenchmarkRunner(const LLVMState &State) const {
61 return llvm::make_unique<UopsBenchmarkRunner>(State);
62}
63
64namespace {
65
66// Default implementation.
67class ExegesisDefaultTarget : public ExegesisTarget {
68private:
69 bool matchesArch(llvm::Triple::ArchType Arch) const override {
70 llvm_unreachable("never called");
71 return false;
72 }
73};
74
75} // namespace
76
77const ExegesisTarget &ExegesisTarget::getDefault() {
78 static ExegesisDefaultTarget Target;
79 return Target;
80}
81
Clement Courbetcff2caa2018-06-25 11:22:23 +000082} // namespace exegesis