Added function to set a register to a particular value + tests.
[llvm-core.git] / tools / llvm-exegesis / lib / AArch64 / Target.cpp
blobfe9d253f80f40d05e7c40ced4f203b38a97d926b
1 //===-- 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 #include "../Latency.h"
11 #include "AArch64.h"
13 namespace exegesis {
15 namespace {
17 class AArch64LatencyBenchmarkRunner : public LatencyBenchmarkRunner {
18 public:
19 AArch64LatencyBenchmarkRunner(const LLVMState &State)
20 : LatencyBenchmarkRunner(State) {}
22 private:
23 const char *getCounterName() const override {
24 // All AArch64 subtargets have CPU_CYCLES as the cycle counter name
25 return "CPU_CYCLES";
29 class ExegesisAArch64Target : public ExegesisTarget {
30 std::vector<llvm::MCInst> setRegTo(const llvm::MCSubtargetInfo &STI,
31 const llvm::APInt &Value,
32 unsigned Reg) const override {
33 llvm_unreachable("Not yet implemented");
36 unsigned getScratchMemoryRegister(const llvm::Triple &) const override {
37 llvm_unreachable("Not yet implemented");
40 void fillMemoryOperands(InstructionBuilder &IB, unsigned Reg,
41 unsigned Offset) const override {
42 llvm_unreachable("Not yet implemented");
45 unsigned getMaxMemoryAccessSize() const override {
46 llvm_unreachable("Not yet implemented");
49 bool matchesArch(llvm::Triple::ArchType Arch) const override {
50 return Arch == llvm::Triple::aarch64 || Arch == llvm::Triple::aarch64_be;
52 void addTargetSpecificPasses(llvm::PassManagerBase &PM) const override {
53 // Function return is a pseudo-instruction that needs to be expanded
54 PM.add(llvm::createAArch64ExpandPseudoPass());
56 std::unique_ptr<BenchmarkRunner>
57 createLatencyBenchmarkRunner(const LLVMState &State) const override {
58 return llvm::make_unique<AArch64LatencyBenchmarkRunner>(State);
62 } // namespace
64 static ExegesisTarget *getTheExegesisAArch64Target() {
65 static ExegesisAArch64Target Target;
66 return &Target;
69 void InitializeAArch64ExegesisTarget() {
70 ExegesisTarget::registerTarget(getTheExegesisAArch64Target());
73 } // namespace exegesis