diff options
author | John Brawn <john.brawn@arm.com> | 2018-07-03 10:10:29 +0000 |
---|---|---|
committer | John Brawn <john.brawn@arm.com> | 2018-07-03 10:10:29 +0000 |
commit | a5c6980ab7a12899995e35a21561d22fe22147b7 (patch) | |
tree | 074e0077654fe46469d4e79fbc6081e22ba103c4 /tools/llvm-exegesis | |
parent | 3095ea4ec7efde0792f8a25e5db6262eff273094 (diff) |
[llvm-exegesis] Add an AArch64 target
The target does just enough to be able to run llvm-exegesis in latency mode for
at least some opcodes.
Differential Revision: https://reviews.llvm.org/D48780
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@336187 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-exegesis')
-rw-r--r-- | tools/llvm-exegesis/lib/AArch64/CMakeLists.txt | 18 | ||||
-rw-r--r-- | tools/llvm-exegesis/lib/AArch64/LLVMBuild.txt | 22 | ||||
-rw-r--r-- | tools/llvm-exegesis/lib/AArch64/Target.cpp | 54 | ||||
-rw-r--r-- | tools/llvm-exegesis/lib/CMakeLists.txt | 4 |
4 files changed, 98 insertions, 0 deletions
diff --git a/tools/llvm-exegesis/lib/AArch64/CMakeLists.txt b/tools/llvm-exegesis/lib/AArch64/CMakeLists.txt new file mode 100644 index 00000000000..a251b8ff683 --- /dev/null +++ b/tools/llvm-exegesis/lib/AArch64/CMakeLists.txt @@ -0,0 +1,18 @@ +include_directories( + ${LLVM_MAIN_SRC_DIR}/lib/Target/AArch64 + ${LLVM_BINARY_DIR}/lib/Target/AArch64 + ) + +add_library(LLVMExegesisAArch64 + STATIC + Target.cpp + ) + +llvm_update_compile_flags(LLVMExegesisAArch64) +llvm_map_components_to_libnames(libs + AArch64 + Exegesis + ) + +target_link_libraries(LLVMExegesisAArch64 ${libs}) +set_target_properties(LLVMExegesisAArch64 PROPERTIES FOLDER "Libraries") diff --git a/tools/llvm-exegesis/lib/AArch64/LLVMBuild.txt b/tools/llvm-exegesis/lib/AArch64/LLVMBuild.txt new file mode 100644 index 00000000000..886fcb22749 --- /dev/null +++ b/tools/llvm-exegesis/lib/AArch64/LLVMBuild.txt @@ -0,0 +1,22 @@ +;===- ./tools/llvm-exegesis/lib/AArch64/LLVMBuild.txt ----------*- Conf -*--===; +; +; The LLVM Compiler Infrastructure +; +; This file is distributed under the University of Illinois Open Source +; License. See LICENSE.TXT for details. +; +;===------------------------------------------------------------------------===; +; +; This is an LLVMBuild description file for the components in this subdirectory. +; +; For more information on the LLVMBuild system, please see: +; +; http://llvm.org/docs/LLVMBuild.html +; +;===------------------------------------------------------------------------===; + +[component_0] +type = Library +name = ExegesisAArch64 +parent = Libraries +required_libraries = AArch64 diff --git a/tools/llvm-exegesis/lib/AArch64/Target.cpp b/tools/llvm-exegesis/lib/AArch64/Target.cpp new file mode 100644 index 00000000000..88df44bd94c --- /dev/null +++ b/tools/llvm-exegesis/lib/AArch64/Target.cpp @@ -0,0 +1,54 @@ +//===-- Target.cpp ----------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#include "../Target.h" +#include "../Latency.h" +#include "AArch64.h" + +namespace exegesis { + +namespace { + +class AArch64LatencyBenchmarkRunner : public LatencyBenchmarkRunner { +public: + AArch64LatencyBenchmarkRunner(const LLVMState &State) + : LatencyBenchmarkRunner(State) {} + +private: + const char *getCounterName() const override { + // All AArch64 subtargets have CPU_CYCLES as the cycle counter name + return "CPU_CYCLES"; + } +}; + +class ExegesisAArch64Target : public ExegesisTarget { + bool matchesArch(llvm::Triple::ArchType Arch) const override { + return Arch == llvm::Triple::aarch64 || Arch == llvm::Triple::aarch64_be; + } + void addTargetSpecificPasses(llvm::PassManagerBase &PM) const override { + // Function return is a pseudo-instruction that needs to be expanded + PM.add(llvm::createAArch64ExpandPseudoPass()); + } + std::unique_ptr<BenchmarkRunner> + createLatencyBenchmarkRunner(const LLVMState &State) const override { + return llvm::make_unique<AArch64LatencyBenchmarkRunner>(State); + } +}; + +} // namespace + +static ExegesisTarget *getTheExegesisAArch64Target() { + static ExegesisAArch64Target Target; + return &Target; +} + +void InitializeAArch64ExegesisTarget() { + ExegesisTarget::registerTarget(getTheExegesisAArch64Target()); +} + +} // namespace exegesis diff --git a/tools/llvm-exegesis/lib/CMakeLists.txt b/tools/llvm-exegesis/lib/CMakeLists.txt index 3c69dea7e24..175c2adf9de 100644 --- a/tools/llvm-exegesis/lib/CMakeLists.txt +++ b/tools/llvm-exegesis/lib/CMakeLists.txt @@ -2,6 +2,10 @@ if (LLVM_TARGETS_TO_BUILD MATCHES "X86") add_subdirectory(X86) set(LLVM_EXEGESIS_TARGETS "${LLVM_EXEGESIS_TARGETS} X86" PARENT_SCOPE) endif() +if (LLVM_TARGETS_TO_BUILD MATCHES "AArch64") + add_subdirectory(AArch64) + set(LLVM_EXEGESIS_TARGETS "${LLVM_EXEGESIS_TARGETS} AArch64" PARENT_SCOPE) +endif() add_library(LLVMExegesis STATIC |