1 //===-- Target.cpp ----------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
16 ExegesisTarget::~ExegesisTarget() {} // anchor.
18 static ExegesisTarget
*FirstTarget
= nullptr;
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()))
28 void ExegesisTarget::registerTarget(ExegesisTarget
*Target
) {
29 if (FirstTarget
== nullptr) {
33 if (Target
->Next
!= nullptr)
34 return; // Already registered.
35 Target
->Next
= FirstTarget
;
39 std::unique_ptr
<SnippetGenerator
>
40 ExegesisTarget::createSnippetGenerator(InstructionBenchmark::ModeE Mode
,
41 const LLVMState
&State
) const {
43 case InstructionBenchmark::Unknown
:
45 case InstructionBenchmark::Latency
:
46 return createLatencySnippetGenerator(State
);
47 case InstructionBenchmark::Uops
:
48 return createUopsSnippetGenerator(State
);
53 std::unique_ptr
<BenchmarkRunner
>
54 ExegesisTarget::createBenchmarkRunner(InstructionBenchmark::ModeE Mode
,
55 const LLVMState
&State
) const {
57 case InstructionBenchmark::Unknown
:
59 case InstructionBenchmark::Latency
:
60 return createLatencyBenchmarkRunner(State
);
61 case InstructionBenchmark::Uops
:
62 return createUopsBenchmarkRunner(State
);
67 std::unique_ptr
<SnippetGenerator
>
68 ExegesisTarget::createLatencySnippetGenerator(const LLVMState
&State
) const {
69 return llvm::make_unique
<LatencySnippetGenerator
>(State
);
72 std::unique_ptr
<SnippetGenerator
>
73 ExegesisTarget::createUopsSnippetGenerator(const LLVMState
&State
) const {
74 return llvm::make_unique
<UopsSnippetGenerator
>(State
);
77 std::unique_ptr
<BenchmarkRunner
>
78 ExegesisTarget::createLatencyBenchmarkRunner(const LLVMState
&State
) const {
79 return llvm::make_unique
<LatencyBenchmarkRunner
>(State
);
82 std::unique_ptr
<BenchmarkRunner
>
83 ExegesisTarget::createUopsBenchmarkRunner(const LLVMState
&State
) const {
84 return llvm::make_unique
<UopsBenchmarkRunner
>(State
);
89 // Default implementation.
90 class ExegesisDefaultTarget
: public ExegesisTarget
{
92 std::vector
<llvm::MCInst
> setRegTo(const llvm::MCSubtargetInfo
&STI
,
94 const llvm::APInt
&Value
) const override
{
95 llvm_unreachable("Not yet implemented");
98 bool matchesArch(llvm::Triple::ArchType Arch
) const override
{
99 llvm_unreachable("never called");
106 const ExegesisTarget
&ExegesisTarget::getDefault() {
107 static ExegesisDefaultTarget Target
;
111 } // namespace exegesis