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 clearUsedRegisterList()33 void clearUsedRegisterList() { UsedRegisters.clear(); } 34 markRegisterUsed(int registerIndex)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 getPassName()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 getPassName()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 getPassName()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