blob: a8b348784759e7733242621a6732d78d38d87b27 [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
Clement Courbetd939f6d2018-09-13 07:40:53 +000039std::unique_ptr<SnippetGenerator>
40ExegesisTarget::createSnippetGenerator(InstructionBenchmark::ModeE Mode,
41 const LLVMState &State) const {
42 switch (Mode) {
43 case InstructionBenchmark::Unknown:
44 return nullptr;
45 case InstructionBenchmark::Latency:
46 return createLatencySnippetGenerator(State);
47 case InstructionBenchmark::Uops:
48 return createUopsSnippetGenerator(State);
49 }
50 return nullptr;
51}
52
Clement Courbet4860b982018-06-26 08:49:30 +000053std::unique_ptr<BenchmarkRunner>
54ExegesisTarget::createBenchmarkRunner(InstructionBenchmark::ModeE Mode,
55 const LLVMState &State) const {
56 switch (Mode) {
57 case InstructionBenchmark::Unknown:
58 return nullptr;
59 case InstructionBenchmark::Latency:
60 return createLatencyBenchmarkRunner(State);
61 case InstructionBenchmark::Uops:
62 return createUopsBenchmarkRunner(State);
63 }
64 return nullptr;
65}
66
Clement Courbetd939f6d2018-09-13 07:40:53 +000067std::unique_ptr<SnippetGenerator>
68ExegesisTarget::createLatencySnippetGenerator(const LLVMState &State) const {
69 return llvm::make_unique<LatencySnippetGenerator>(State);
70}
71
72std::unique_ptr<SnippetGenerator>
73ExegesisTarget::createUopsSnippetGenerator(const LLVMState &State) const {
74 return llvm::make_unique<UopsSnippetGenerator>(State);
75}
76
Clement Courbet4860b982018-06-26 08:49:30 +000077std::unique_ptr<BenchmarkRunner>
78ExegesisTarget::createLatencyBenchmarkRunner(const LLVMState &State) const {
79 return llvm::make_unique<LatencyBenchmarkRunner>(State);
80}
81
82std::unique_ptr<BenchmarkRunner>
83ExegesisTarget::createUopsBenchmarkRunner(const LLVMState &State) const {
84 return llvm::make_unique<UopsBenchmarkRunner>(State);
85}
86
87namespace {
88
89// Default implementation.
90class ExegesisDefaultTarget : public ExegesisTarget {
91private:
92 bool matchesArch(llvm::Triple::ArchType Arch) const override {
93 llvm_unreachable("never called");
94 return false;
95 }
96};
97
98} // namespace
99
100const ExegesisTarget &ExegesisTarget::getDefault() {
101 static ExegesisDefaultTarget Target;
102 return Target;
103}
104
Clement Courbetcff2caa2018-06-25 11:22:23 +0000105} // namespace exegesis