blob: 67a9ea651956f5b274dbc04267ef56c557e7e0ba [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 }
Clement Courbet44b4c542018-06-19 11:28:59 +000033 if (Target->Next != nullptr)
Guillaume Chateletfb943542018-08-01 14:41:45 +000034 return; // Already registered.
Clement Courbet44b4c542018-06-19 11:28:59 +000035 Target->Next = FirstTarget;
36 FirstTarget = Target;
37}
Clement Courbet4860b982018-06-26 08:49:30 +000038
39std::unique_ptr<BenchmarkRunner>
40ExegesisTarget::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
53std::unique_ptr<BenchmarkRunner>
54ExegesisTarget::createLatencyBenchmarkRunner(const LLVMState &State) const {
55 return llvm::make_unique<LatencyBenchmarkRunner>(State);
56}
57
58std::unique_ptr<BenchmarkRunner>
59ExegesisTarget::createUopsBenchmarkRunner(const LLVMState &State) const {
60 return llvm::make_unique<UopsBenchmarkRunner>(State);
61}
62
63namespace {
64
65// Default implementation.
66class ExegesisDefaultTarget : public ExegesisTarget {
67private:
68 bool matchesArch(llvm::Triple::ArchType Arch) const override {
69 llvm_unreachable("never called");
70 return false;
71 }
72};
73
74} // namespace
75
76const ExegesisTarget &ExegesisTarget::getDefault() {
77 static ExegesisDefaultTarget Target;
78 return Target;
79}
80
Clement Courbetcff2caa2018-06-25 11:22:23 +000081} // namespace exegesis