summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-exegesis/lib/Uops.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-exegesis/lib/Uops.h')
-rw-r--r--llvm/tools/llvm-exegesis/lib/Uops.h31
1 files changed, 30 insertions, 1 deletions
diff --git a/llvm/tools/llvm-exegesis/lib/Uops.h b/llvm/tools/llvm-exegesis/lib/Uops.h
index c7b5709f7d9..103c1783975 100644
--- a/llvm/tools/llvm-exegesis/lib/Uops.h
+++ b/llvm/tools/llvm-exegesis/lib/Uops.h
@@ -28,12 +28,41 @@ public:
llvm::Expected<SnippetPrototype>
generatePrototype(unsigned Opcode) const override;
+ static constexpr const size_t kMinNumDifferentAddresses = 6;
+
private:
llvm::Error isInfeasible(const llvm::MCInstrDesc &MCInstrDesc) const;
std::vector<BenchmarkMeasure>
- runMeasurements(const ExecutableFunction &EF,
+ runMeasurements(const ExecutableFunction &EF, ScratchSpace &Scratch,
const unsigned NumRepetitions) const override;
+
+ // Instantiates memory operands within a snippet.
+ // To make computations as parallel as possible, we generate independant
+ // memory locations for instructions that load and store. If there are less
+ // than kMinNumDifferentAddresses in the original snippet, we duplicate
+ // instructions until there are this number of instructions.
+ // For example, assuming kMinNumDifferentAddresses=5 and
+ // getMaxMemoryAccessSize()=64, if the original snippet is:
+ // mov eax, [memory]
+ // we might generate:
+ // mov eax, [rdi]
+ // mov eax, [rdi + 64]
+ // mov eax, [rdi + 128]
+ // mov eax, [rdi + 192]
+ // mov eax, [rdi + 256]
+ // If the original snippet is:
+ // mov eax, [memory]
+ // add eax, [memory]
+ // we might generate:
+ // mov eax, [rdi]
+ // add eax, [rdi + 64]
+ // mov eax, [rdi + 128]
+ // add eax, [rdi + 192]
+ // mov eax, [rdi + 256]
+ void
+ instantiateMemoryOperands(unsigned ScratchSpaceReg,
+ std::vector<InstructionInstance> &Snippet) const;
};
} // namespace exegesis
OpenPOWER on IntegriCloud