summaryrefslogtreecommitdiff
path: root/tools/llvm-exegesis
diff options
context:
space:
mode:
authorJohn Brawn <john.brawn@arm.com>2018-07-03 10:10:29 +0000
committerJohn Brawn <john.brawn@arm.com>2018-07-03 10:10:29 +0000
commita5c6980ab7a12899995e35a21561d22fe22147b7 (patch)
tree074e0077654fe46469d4e79fbc6081e22ba103c4 /tools/llvm-exegesis
parent3095ea4ec7efde0792f8a25e5db6262eff273094 (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.txt18
-rw-r--r--tools/llvm-exegesis/lib/AArch64/LLVMBuild.txt22
-rw-r--r--tools/llvm-exegesis/lib/AArch64/Target.cpp54
-rw-r--r--tools/llvm-exegesis/lib/CMakeLists.txt4
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