• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- ParallelSnippetGenerator.h ------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 ///
9 /// \file
10 /// A SnippetGenerator implementation to create parallel instruction snippets.
11 ///
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_TOOLS_LLVM_EXEGESIS_PARALLELSNIPPETGENERATOR_H
15 #define LLVM_TOOLS_LLVM_EXEGESIS_PARALLELSNIPPETGENERATOR_H
16 
17 #include "SnippetGenerator.h"
18 
19 namespace llvm {
20 namespace exegesis {
21 
22 class ParallelSnippetGenerator : public SnippetGenerator {
23 public:
24   using SnippetGenerator::SnippetGenerator;
25   ~ParallelSnippetGenerator() override;
26 
27   Expected<std::vector<CodeTemplate>>
28   generateCodeTemplates(InstructionTemplate Variant,
29                         const BitVector &ForbiddenRegisters) const override;
30 
31   static constexpr const size_t kMinNumDifferentAddresses = 6;
32 
33 private:
34   // Instantiates memory operands within a snippet.
35   // To make computations as parallel as possible, we generate independant
36   // memory locations for instructions that load and store. If there are less
37   // than kMinNumDifferentAddresses in the original snippet, we duplicate
38   // instructions until there are this number of instructions.
39   // For example, assuming kMinNumDifferentAddresses=5 and
40   // getMaxMemoryAccessSize()=64, if the original snippet is:
41   //   mov eax, [memory]
42   // we might generate:
43   //   mov eax, [rdi]
44   //   mov eax, [rdi + 64]
45   //   mov eax, [rdi + 128]
46   //   mov eax, [rdi + 192]
47   //   mov eax, [rdi + 256]
48   // If the original snippet is:
49   //   mov eax, [memory]
50   //   add eax, [memory]
51   // we might generate:
52   //   mov eax, [rdi]
53   //   add eax, [rdi + 64]
54   //   mov eax, [rdi + 128]
55   //   add eax, [rdi + 192]
56   //   mov eax, [rdi + 256]
57   void instantiateMemoryOperands(
58       unsigned ScratchSpaceReg,
59       std::vector<InstructionTemplate> &SnippetTemplate) const;
60 };
61 
62 } // namespace exegesis
63 } // namespace llvm
64 
65 #endif // LLVM_TOOLS_LLVM_EXEGESIS_PARALLELSNIPPETGENERATOR_H
66