Index: tools/llvm-exegesis/lib/AArch64/CMakeLists.txt =================================================================== --- /dev/null +++ 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") Index: tools/llvm-exegesis/lib/AArch64/LLVMBuild.txt =================================================================== --- /dev/null +++ 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 Index: tools/llvm-exegesis/lib/AArch64/Target.cpp =================================================================== --- /dev/null +++ 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 + createLatencyBenchmarkRunner(const LLVMState &State) const override { + return llvm::make_unique(State); + } +}; + +} // namespace + +static ExegesisTarget *getTheExegesisAArch64Target() { + static ExegesisAArch64Target Target; + return &Target; +} + +void InitializeAArch64ExegesisTarget() { + ExegesisTarget::registerTarget(getTheExegesisAArch64Target()); +} + +} // namespace exegesis Index: tools/llvm-exegesis/lib/CMakeLists.txt =================================================================== --- tools/llvm-exegesis/lib/CMakeLists.txt +++ tools/llvm-exegesis/lib/CMakeLists.txt @@ -2,6 +2,10 @@ 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