blob: 8baa8499c9263b30fab62bcbac5cb59c27de8fde [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:
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000092 std::vector<llvm::MCInst> setRegTo(const llvm::MCSubtargetInfo &STI,
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000093 unsigned Reg,
94 const llvm::APInt &Value) const override {
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000095 llvm_unreachable("Not yet implemented");
96 }
97
Clement Courbet4860b982018-06-26 08:49:30 +000098 bool matchesArch(llvm::Triple::ArchType Arch) const override {
99 llvm_unreachable("never called");
100 return false;
101 }
102};
103
104} // namespace
105
106const ExegesisTarget &ExegesisTarget::getDefault() {
107 static ExegesisDefaultTarget Target;
108 return Target;
109}
110
Clement Courbetcff2caa2018-06-25 11:22:23 +0000111} // namespace exegesis