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