]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Target/Sparc/LeonPasses.h
Update to ELF Tool Chain snapshot at r3561
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Target / Sparc / LeonPasses.h
1 //===------- LeonPasses.h - Define passes specific to LEON ----------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //
11 //===----------------------------------------------------------------------===//
12
13 #ifndef LLVM_LIB_TARGET_SPARC_LEON_PASSES_H
14 #define LLVM_LIB_TARGET_SPARC_LEON_PASSES_H
15
16 #include "llvm/CodeGen/MachineBasicBlock.h"
17 #include "llvm/CodeGen/MachineFunctionPass.h"
18 #include "llvm/CodeGen/Passes.h"
19
20 #include "Sparc.h"
21 #include "SparcSubtarget.h"
22
23 namespace llvm {
24 class LLVM_LIBRARY_VISIBILITY LEONMachineFunctionPass
25     : public MachineFunctionPass {
26 protected:
27   const SparcSubtarget *Subtarget;
28   const int LAST_OPERAND = -1;
29
30   // this vector holds free registers that we allocate in groups for some of the
31   // LEON passes
32   std::vector<int> UsedRegisters;
33
34 protected:
35   LEONMachineFunctionPass(TargetMachine &tm, char &ID);
36   LEONMachineFunctionPass(char &ID);
37
38   int GetRegIndexForOperand(MachineInstr &MI, int OperandIndex);
39   void clearUsedRegisterList() { UsedRegisters.clear(); }
40
41   void markRegisterUsed(int registerIndex) {
42     UsedRegisters.push_back(registerIndex);
43   }
44   int getUnusedFPRegister(MachineRegisterInfo &MRI);
45 };
46
47 class LLVM_LIBRARY_VISIBILITY InsertNOPLoad : public LEONMachineFunctionPass {
48 public:
49   static char ID;
50
51   InsertNOPLoad(TargetMachine &tm);
52   bool runOnMachineFunction(MachineFunction &MF) override;
53
54   StringRef getPassName() const override {
55     return "InsertNOPLoad: Erratum Fix LBR35: insert a NOP instruction after "
56            "every single-cycle load instruction when the next instruction is "
57            "another load/store instruction";
58   }
59 };
60
61 class LLVM_LIBRARY_VISIBILITY FixFSMULD : public LEONMachineFunctionPass {
62 public:
63   static char ID;
64
65   FixFSMULD(TargetMachine &tm);
66   bool runOnMachineFunction(MachineFunction &MF) override;
67
68   StringRef getPassName() const override {
69     return "FixFSMULD: Erratum Fix LBR31: do not select FSMULD";
70   }
71 };
72
73 class LLVM_LIBRARY_VISIBILITY ReplaceFMULS : public LEONMachineFunctionPass {
74 public:
75   static char ID;
76
77   ReplaceFMULS(TargetMachine &tm);
78   bool runOnMachineFunction(MachineFunction &MF) override;
79
80   StringRef getPassName() const override {
81     return "ReplaceFMULS: Erratum Fix LBR32: replace FMULS instruction with a "
82            "routine using conversions/double precision operations to replace "
83            "FMULS";
84   }
85 };
86
87 class LLVM_LIBRARY_VISIBILITY DetectRoundChange
88     : public LEONMachineFunctionPass {
89 public:
90   static char ID;
91
92   DetectRoundChange(TargetMachine &tm);
93   bool runOnMachineFunction(MachineFunction &MF) override;
94
95   StringRef getPassName() const override {
96     return "DetectRoundChange: Leon erratum detection: detect any rounding "
97            "mode change request: use only the round-to-nearest rounding mode";
98   }
99 };
100
101 class LLVM_LIBRARY_VISIBILITY FixAllFDIVSQRT : public LEONMachineFunctionPass {
102 public:
103   static char ID;
104
105   FixAllFDIVSQRT(TargetMachine &tm);
106   bool runOnMachineFunction(MachineFunction &MF) override;
107
108   StringRef getPassName() const override {
109     return "FixAllFDIVSQRT: Erratum Fix LBR34: fix FDIVS/FDIVD/FSQRTS/FSQRTD "
110            "instructions with NOPs and floating-point store";
111   }
112 };
113 } // namespace llvm
114
115 #endif // LLVM_LIB_TARGET_SPARC_LEON_PASSES_H