diff options
author | Clement Courbet <courbet@google.com> | 2018-04-04 08:13:32 +0000 |
---|---|---|
committer | Clement Courbet <courbet@google.com> | 2018-04-04 08:13:32 +0000 |
commit | 7287b2c1ec669791df8b1c704e2457338f6bee47 (patch) | |
tree | 43bc8f285b995f2f9bae92ce122bf0425c55a718 /llvm/tools/llvm-exegesis/lib/X86.cpp | |
parent | 4f98e0bc030dacf65af981968a8f4f8234f5f32f (diff) | |
download | bcm5719-llvm-7287b2c1ec669791df8b1c704e2457338f6bee47.tar.gz bcm5719-llvm-7287b2c1ec669791df8b1c704e2457338f6bee47.zip |
Add llvm-exegesis tool.
Summary:
[llvm-exegesis][RFC] Automatic Measurement of Instruction Latency/Uops
This is the code corresponding to the RFC "llvm-exegesis Automatic Measurement of Instruction Latency/Uops".
The RFC is available on the LLVM mailing lists as well as the following document
for easier reading:
https://docs.google.com/document/d/1QidaJMJUyQdRrFKD66vE1_N55whe0coQ3h1GpFzz27M/edit?usp=sharing
Subscribers: mgorny, gchatelet, orwant, llvm-commits
Differential Revision: https://reviews.llvm.org/D44519
llvm-svn: 329156
Diffstat (limited to 'llvm/tools/llvm-exegesis/lib/X86.cpp')
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/X86.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/llvm/tools/llvm-exegesis/lib/X86.cpp b/llvm/tools/llvm-exegesis/lib/X86.cpp new file mode 100644 index 00000000000..c9afece4a9f --- /dev/null +++ b/llvm/tools/llvm-exegesis/lib/X86.cpp @@ -0,0 +1,38 @@ +//===-- X86.cpp --------------------------------------------------*- C++-*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "X86.h" + +namespace exegesis { + +static llvm::Error makeError(llvm::Twine Msg) { + return llvm::make_error<llvm::StringError>(Msg, + llvm::inconvertibleErrorCode()); +} + +X86Filter::~X86Filter() = default; + +// Test whether we can generate a snippet for this instruction. +llvm::Error X86Filter::shouldRun(const LLVMState &State, + const unsigned Opcode) const { + const auto &InstrInfo = State.getInstrInfo(); + const llvm::MCInstrDesc &InstrDesc = InstrInfo.get(Opcode); + if (InstrDesc.isBranch() || InstrDesc.isIndirectBranch()) + return makeError("Unsupported opcode: isBranch/isIndirectBranch"); + if (InstrDesc.isCall() || InstrDesc.isReturn()) + return makeError("Unsupported opcode: isCall/isReturn"); + const auto OpcodeName = InstrInfo.getName(Opcode); + if (OpcodeName.startswith("POPF") || OpcodeName.startswith("PUSHF") || + OpcodeName.startswith("ADJCALLSTACK")) { + return makeError("Unsupported opcode: Push/Pop/AdjCallStack"); + } + return llvm::ErrorSuccess(); +} + +} // namespace exegesis |