diff options
Diffstat (limited to 'llvm/tools/llvm-exegesis/lib/CodeTemplate.h')
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/CodeTemplate.h | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/llvm/tools/llvm-exegesis/lib/CodeTemplate.h b/llvm/tools/llvm-exegesis/lib/CodeTemplate.h index e5006eb74c9..734992f0afa 100644 --- a/llvm/tools/llvm-exegesis/lib/CodeTemplate.h +++ b/llvm/tools/llvm-exegesis/lib/CodeTemplate.h @@ -17,6 +17,7 @@ #define LLVM_TOOLS_LLVM_EXEGESIS_CODETEMPLATE_H #include "MCInstrDescView.h" +#include "llvm/ADT/BitmaskEnum.h" namespace exegesis { @@ -45,9 +46,65 @@ struct InstructionTemplate { llvm::SmallVector<llvm::MCOperand, 4> VariableValues; }; +enum class ExecutionMode : uint8_t { + UNKNOWN = 0U, + // The instruction is always serial because implicit Use and Def alias. + // e.g. AAA (alias via EFLAGS) + ALWAYS_SERIAL_IMPLICIT_REGS_ALIAS = 1u << 0, + + // The instruction is always serial because one Def is tied to a Use. + // e.g. AND32ri (alias via tied GR32) + ALWAYS_SERIAL_TIED_REGS_ALIAS = 1u << 1, + + // The execution can be made serial by inserting a second instruction that + // clobbers/reads memory. + // e.g. MOV8rm + SERIAL_VIA_MEMORY_INSTR = 1u << 2, + + // The execution can be made serial by picking one Def that aliases with one + // Use. + // e.g. VXORPSrr XMM1, XMM1, XMM2 + SERIAL_VIA_EXPLICIT_REGS = 1u << 3, + + // The execution can be made serial by inserting a second instruction that + // uses one of the Defs and defs one of the Uses. + // e.g. + // 1st instruction: MMX_PMOVMSKBrr ECX, MM7 + // 2nd instruction: MMX_MOVD64rr MM7, ECX + // or instruction: MMX_MOVD64to64rr MM7, ECX + // or instruction: MMX_PINSRWrr MM7, MM7, ECX, 1 + SERIAL_VIA_NON_MEMORY_INSTR = 1u << 4, + + // The execution is always parallel because the instruction is missing Use or + // Def operands. + ALWAYS_PARALLEL_MISSING_USE_OR_DEF = 1u << 5, + + // The execution can be made parallel by repeating the same instruction but + // making sure that Defs of one instruction do not alias with Uses of the + // second one. + PARALLEL_VIA_EXPLICIT_REGS = 1u << 6, + + LLVM_MARK_AS_BITMASK_ENUM(/*Largest*/ PARALLEL_VIA_EXPLICIT_REGS) +}; + +// Returns whether Execution is one of the values defined in the enum above. +bool isEnumValue(ExecutionMode Execution); + +// Returns a human readable string for the enum. +llvm::StringRef getName(ExecutionMode Execution); + +// Returns a sequence of increasing powers of two corresponding to all the +// Execution flags. +llvm::ArrayRef<ExecutionMode> getAllExecutionBits(); + +// Decomposes Execution into individual set bits. +llvm::SmallVector<ExecutionMode, 4> getExecutionModeBits(ExecutionMode); + +LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); + // A CodeTemplate is a set of InstructionTemplates that may not be fully // specified (i.e. some variables are not yet set). This allows the -// BenchmarkRunner to instantiate it many times with specific values to study +// SnippetGenerator to instantiate it many times with specific values to study // their impact on instruction's performance. struct CodeTemplate { CodeTemplate() = default; @@ -57,6 +114,7 @@ struct CodeTemplate { CodeTemplate(const CodeTemplate &) = delete; CodeTemplate &operator=(const CodeTemplate &) = delete; + ExecutionMode Execution = ExecutionMode::UNKNOWN; // Some information about how this template has been created. std::string Info; // The list of the instructions for this template. |