1 //===------- LeonPasses.h - Define passes specific to LEON ----------------===//
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 //
10 //===----------------------------------------------------------------------===//
11 
12 #ifndef LLVM_LIB_TARGET_SPARC_LEON_PASSES_H
13 #define LLVM_LIB_TARGET_SPARC_LEON_PASSES_H
14 
15 #include "llvm/CodeGen/MachineFunctionPass.h"
16 
17 namespace llvm {
18 class SparcSubtarget;
19 
20 class LLVM_LIBRARY_VISIBILITY LEONMachineFunctionPass
21     : public MachineFunctionPass {
22 protected:
23   const SparcSubtarget *Subtarget = nullptr;
24   const int LAST_OPERAND = -1;
25 
26   // this vector holds free registers that we allocate in groups for some of the
27   // LEON passes
28   std::vector<int> UsedRegisters;
29 
30 protected:
31   LEONMachineFunctionPass(char &ID);
32 
33   void clearUsedRegisterList() { UsedRegisters.clear(); }
34 
35   void markRegisterUsed(int registerIndex) {
36     UsedRegisters.push_back(registerIndex);
37   }
38 };
39 
40 class LLVM_LIBRARY_VISIBILITY InsertNOPLoad : public LEONMachineFunctionPass {
41 public:
42   static char ID;
43 
44   InsertNOPLoad();
45   bool runOnMachineFunction(MachineFunction &MF) override;
46 
47   StringRef getPassName() const override {
48     return "InsertNOPLoad: Erratum Fix LBR35: insert a NOP instruction after "
49            "every single-cycle load instruction when the next instruction is "
50            "another load/store instruction";
51   }
52 };
53 
54 class LLVM_LIBRARY_VISIBILITY DetectRoundChange
55     : public LEONMachineFunctionPass {
56 public:
57   static char ID;
58 
59   DetectRoundChange();
60   bool runOnMachineFunction(MachineFunction &MF) override;
61 
62   StringRef getPassName() const override {
63     return "DetectRoundChange: Leon erratum detection: detect any rounding "
64            "mode change request: use only the round-to-nearest rounding mode";
65   }
66 };
67 
68 class LLVM_LIBRARY_VISIBILITY FixAllFDIVSQRT : public LEONMachineFunctionPass {
69 public:
70   static char ID;
71 
72   FixAllFDIVSQRT();
73   bool runOnMachineFunction(MachineFunction &MF) override;
74 
75   StringRef getPassName() const override {
76     return "FixAllFDIVSQRT: Erratum Fix LBR34: fix FDIVS/FDIVD/FSQRTS/FSQRTD "
77            "instructions with NOPs and floating-point store";
78   }
79 };
80 } // namespace llvm
81 
82 #endif // LLVM_LIB_TARGET_SPARC_LEON_PASSES_H
83