//===------- LeonPasses.h - Define passes specific to LEON ----------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_TARGET_SPARC_LEON_PASSES_H #define LLVM_LIB_TARGET_SPARC_LEON_PASSES_H #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/Passes.h" #include "Sparc.h" #include "SparcSubtarget.h" namespace llvm { class LLVM_LIBRARY_VISIBILITY LEONMachineFunctionPass : public MachineFunctionPass { protected: const SparcSubtarget *Subtarget = nullptr; const int LAST_OPERAND = -1; // this vector holds free registers that we allocate in groups for some of the // LEON passes std::vector UsedRegisters; protected: LEONMachineFunctionPass(char &ID); int GetRegIndexForOperand(MachineInstr &MI, int OperandIndex); void clearUsedRegisterList() { UsedRegisters.clear(); } void markRegisterUsed(int registerIndex) { UsedRegisters.push_back(registerIndex); } int getUnusedFPRegister(MachineRegisterInfo &MRI); }; class LLVM_LIBRARY_VISIBILITY InsertNOPLoad : public LEONMachineFunctionPass { public: static char ID; InsertNOPLoad(); bool runOnMachineFunction(MachineFunction &MF) override; StringRef getPassName() const override { return "InsertNOPLoad: Erratum Fix LBR35: insert a NOP instruction after " "every single-cycle load instruction when the next instruction is " "another load/store instruction"; } }; class LLVM_LIBRARY_VISIBILITY DetectRoundChange : public LEONMachineFunctionPass { public: static char ID; DetectRoundChange(); bool runOnMachineFunction(MachineFunction &MF) override; StringRef getPassName() const override { return "DetectRoundChange: Leon erratum detection: detect any rounding " "mode change request: use only the round-to-nearest rounding mode"; } }; class LLVM_LIBRARY_VISIBILITY FixAllFDIVSQRT : public LEONMachineFunctionPass { public: static char ID; FixAllFDIVSQRT(); bool runOnMachineFunction(MachineFunction &MF) override; StringRef getPassName() const override { return "FixAllFDIVSQRT: Erratum Fix LBR34: fix FDIVS/FDIVD/FSQRTS/FSQRTD " "instructions with NOPs and floating-point store"; } }; } // namespace llvm #endif // LLVM_LIB_TARGET_SPARC_LEON_PASSES_H