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