xref: /aosp_15_r20/external/llvm/lib/Target/Sparc/LeonPasses.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===------- LeonPasses.h - Define passes specific to LEON ----------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker //
11*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
12*9880d681SAndroid Build Coastguard Worker 
13*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_SPARC_LEON_PASSES_H
14*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_SPARC_LEON_PASSES_H
15*9880d681SAndroid Build Coastguard Worker 
16*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineBasicBlock.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFunctionPass.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/Passes.h"
19*9880d681SAndroid Build Coastguard Worker 
20*9880d681SAndroid Build Coastguard Worker #include "Sparc.h"
21*9880d681SAndroid Build Coastguard Worker #include "SparcSubtarget.h"
22*9880d681SAndroid Build Coastguard Worker 
23*9880d681SAndroid Build Coastguard Worker namespace llvm {
24*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY LEONMachineFunctionPass
25*9880d681SAndroid Build Coastguard Worker     : public MachineFunctionPass {
26*9880d681SAndroid Build Coastguard Worker protected:
27*9880d681SAndroid Build Coastguard Worker   const SparcSubtarget *Subtarget;
28*9880d681SAndroid Build Coastguard Worker   const int LAST_OPERAND = -1;
29*9880d681SAndroid Build Coastguard Worker 
30*9880d681SAndroid Build Coastguard Worker   // this vector holds free registers that we allocate in groups for some of the
31*9880d681SAndroid Build Coastguard Worker   // LEON passes
32*9880d681SAndroid Build Coastguard Worker   std::vector<int> UsedRegisters;
33*9880d681SAndroid Build Coastguard Worker 
34*9880d681SAndroid Build Coastguard Worker protected:
35*9880d681SAndroid Build Coastguard Worker   LEONMachineFunctionPass(TargetMachine &tm, char &ID);
36*9880d681SAndroid Build Coastguard Worker   LEONMachineFunctionPass(char &ID);
37*9880d681SAndroid Build Coastguard Worker 
38*9880d681SAndroid Build Coastguard Worker   int GetRegIndexForOperand(MachineInstr &MI, int OperandIndex);
clearUsedRegisterList()39*9880d681SAndroid Build Coastguard Worker   void clearUsedRegisterList() { UsedRegisters.clear(); }
40*9880d681SAndroid Build Coastguard Worker 
markRegisterUsed(int registerIndex)41*9880d681SAndroid Build Coastguard Worker   void markRegisterUsed(int registerIndex) {
42*9880d681SAndroid Build Coastguard Worker     UsedRegisters.push_back(registerIndex);
43*9880d681SAndroid Build Coastguard Worker   }
44*9880d681SAndroid Build Coastguard Worker   int getUnusedFPRegister(MachineRegisterInfo &MRI);
45*9880d681SAndroid Build Coastguard Worker };
46*9880d681SAndroid Build Coastguard Worker 
47*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY ReplaceSDIV : public LEONMachineFunctionPass {
48*9880d681SAndroid Build Coastguard Worker public:
49*9880d681SAndroid Build Coastguard Worker   static char ID;
50*9880d681SAndroid Build Coastguard Worker 
51*9880d681SAndroid Build Coastguard Worker   ReplaceSDIV();
52*9880d681SAndroid Build Coastguard Worker   ReplaceSDIV(TargetMachine &tm);
53*9880d681SAndroid Build Coastguard Worker   bool runOnMachineFunction(MachineFunction &MF) override;
54*9880d681SAndroid Build Coastguard Worker 
getPassName()55*9880d681SAndroid Build Coastguard Worker   const char *getPassName() const override {
56*9880d681SAndroid Build Coastguard Worker     return "ReplaceSDIV: Erratum Fix LBR25:  do not emit SDIV, but emit SDIVCC "
57*9880d681SAndroid Build Coastguard Worker            "instead";
58*9880d681SAndroid Build Coastguard Worker   }
59*9880d681SAndroid Build Coastguard Worker };
60*9880d681SAndroid Build Coastguard Worker 
61*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY FixCALL : public LEONMachineFunctionPass {
62*9880d681SAndroid Build Coastguard Worker public:
63*9880d681SAndroid Build Coastguard Worker   static char ID;
64*9880d681SAndroid Build Coastguard Worker 
65*9880d681SAndroid Build Coastguard Worker   FixCALL(TargetMachine &tm);
66*9880d681SAndroid Build Coastguard Worker   bool runOnMachineFunction(MachineFunction &MF) override;
67*9880d681SAndroid Build Coastguard Worker 
getPassName()68*9880d681SAndroid Build Coastguard Worker   const char *getPassName() const override {
69*9880d681SAndroid Build Coastguard Worker     return "FixCALL: Erratum Fix LBR26: restrict the size of the immediate "
70*9880d681SAndroid Build Coastguard Worker            "operand of the CALL instruction to 20 bits";
71*9880d681SAndroid Build Coastguard Worker   }
72*9880d681SAndroid Build Coastguard Worker };
73*9880d681SAndroid Build Coastguard Worker 
74*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY IgnoreZeroFlag : public LEONMachineFunctionPass {
75*9880d681SAndroid Build Coastguard Worker public:
76*9880d681SAndroid Build Coastguard Worker   static char ID;
77*9880d681SAndroid Build Coastguard Worker 
78*9880d681SAndroid Build Coastguard Worker   IgnoreZeroFlag(TargetMachine &tm);
79*9880d681SAndroid Build Coastguard Worker   bool runOnMachineFunction(MachineFunction &MF) override;
80*9880d681SAndroid Build Coastguard Worker 
getPassName()81*9880d681SAndroid Build Coastguard Worker   const char *getPassName() const override {
82*9880d681SAndroid Build Coastguard Worker     return "IgnoreZeroFlag: Erratum Fix LBR28: do not rely on the zero bit "
83*9880d681SAndroid Build Coastguard Worker            "flag on a divide overflow for SDIVCC and UDIVCC";
84*9880d681SAndroid Build Coastguard Worker   }
85*9880d681SAndroid Build Coastguard Worker };
86*9880d681SAndroid Build Coastguard Worker 
87*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY InsertNOPDoublePrecision
88*9880d681SAndroid Build Coastguard Worker     : public LEONMachineFunctionPass {
89*9880d681SAndroid Build Coastguard Worker public:
90*9880d681SAndroid Build Coastguard Worker   static char ID;
91*9880d681SAndroid Build Coastguard Worker 
92*9880d681SAndroid Build Coastguard Worker   InsertNOPDoublePrecision(TargetMachine &tm);
93*9880d681SAndroid Build Coastguard Worker   bool runOnMachineFunction(MachineFunction &MF) override;
94*9880d681SAndroid Build Coastguard Worker 
getPassName()95*9880d681SAndroid Build Coastguard Worker   const char *getPassName() const override {
96*9880d681SAndroid Build Coastguard Worker     return "InsertNOPDoublePrecision: Erratum Fix LBR30: insert a NOP before "
97*9880d681SAndroid Build Coastguard Worker            "the double precision floating point instruction";
98*9880d681SAndroid Build Coastguard Worker   }
99*9880d681SAndroid Build Coastguard Worker };
100*9880d681SAndroid Build Coastguard Worker 
101*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY FixFSMULD : public LEONMachineFunctionPass {
102*9880d681SAndroid Build Coastguard Worker public:
103*9880d681SAndroid Build Coastguard Worker   static char ID;
104*9880d681SAndroid Build Coastguard Worker 
105*9880d681SAndroid Build Coastguard Worker   FixFSMULD(TargetMachine &tm);
106*9880d681SAndroid Build Coastguard Worker   bool runOnMachineFunction(MachineFunction &MF) override;
107*9880d681SAndroid Build Coastguard Worker 
getPassName()108*9880d681SAndroid Build Coastguard Worker   const char *getPassName() const override {
109*9880d681SAndroid Build Coastguard Worker     return "FixFSMULD: Erratum Fix LBR31: do not select FSMULD";
110*9880d681SAndroid Build Coastguard Worker   }
111*9880d681SAndroid Build Coastguard Worker };
112*9880d681SAndroid Build Coastguard Worker 
113*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY ReplaceFMULS : public LEONMachineFunctionPass {
114*9880d681SAndroid Build Coastguard Worker public:
115*9880d681SAndroid Build Coastguard Worker   static char ID;
116*9880d681SAndroid Build Coastguard Worker 
117*9880d681SAndroid Build Coastguard Worker   ReplaceFMULS(TargetMachine &tm);
118*9880d681SAndroid Build Coastguard Worker   bool runOnMachineFunction(MachineFunction &MF) override;
119*9880d681SAndroid Build Coastguard Worker 
getPassName()120*9880d681SAndroid Build Coastguard Worker   const char *getPassName() const override {
121*9880d681SAndroid Build Coastguard Worker     return "ReplaceFMULS: Erratum Fix LBR32: replace FMULS instruction with a "
122*9880d681SAndroid Build Coastguard Worker            "routine using conversions/double precision operations to replace "
123*9880d681SAndroid Build Coastguard Worker            "FMULS";
124*9880d681SAndroid Build Coastguard Worker   }
125*9880d681SAndroid Build Coastguard Worker };
126*9880d681SAndroid Build Coastguard Worker 
127*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY PreventRoundChange
128*9880d681SAndroid Build Coastguard Worker     : public LEONMachineFunctionPass {
129*9880d681SAndroid Build Coastguard Worker public:
130*9880d681SAndroid Build Coastguard Worker   static char ID;
131*9880d681SAndroid Build Coastguard Worker 
132*9880d681SAndroid Build Coastguard Worker   PreventRoundChange(TargetMachine &tm);
133*9880d681SAndroid Build Coastguard Worker   bool runOnMachineFunction(MachineFunction &MF) override;
134*9880d681SAndroid Build Coastguard Worker 
getPassName()135*9880d681SAndroid Build Coastguard Worker   const char *getPassName() const override {
136*9880d681SAndroid Build Coastguard Worker     return "PreventRoundChange: Erratum Fix LBR33: prevent any rounding mode "
137*9880d681SAndroid Build Coastguard Worker            "change request: use only the round-to-nearest rounding mode";
138*9880d681SAndroid Build Coastguard Worker   }
139*9880d681SAndroid Build Coastguard Worker };
140*9880d681SAndroid Build Coastguard Worker 
141*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY FixAllFDIVSQRT : public LEONMachineFunctionPass {
142*9880d681SAndroid Build Coastguard Worker public:
143*9880d681SAndroid Build Coastguard Worker   static char ID;
144*9880d681SAndroid Build Coastguard Worker 
145*9880d681SAndroid Build Coastguard Worker   FixAllFDIVSQRT(TargetMachine &tm);
146*9880d681SAndroid Build Coastguard Worker   bool runOnMachineFunction(MachineFunction &MF) override;
147*9880d681SAndroid Build Coastguard Worker 
getPassName()148*9880d681SAndroid Build Coastguard Worker   const char *getPassName() const override {
149*9880d681SAndroid Build Coastguard Worker     return "FixAllFDIVSQRT: Erratum Fix LBR34: fix FDIVS/FDIVD/FSQRTS/FSQRTD "
150*9880d681SAndroid Build Coastguard Worker            "instructions with NOPs and floating-point store";
151*9880d681SAndroid Build Coastguard Worker   }
152*9880d681SAndroid Build Coastguard Worker };
153*9880d681SAndroid Build Coastguard Worker 
154*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY InsertNOPLoad : public LEONMachineFunctionPass {
155*9880d681SAndroid Build Coastguard Worker public:
156*9880d681SAndroid Build Coastguard Worker   static char ID;
157*9880d681SAndroid Build Coastguard Worker 
158*9880d681SAndroid Build Coastguard Worker   InsertNOPLoad(TargetMachine &tm);
159*9880d681SAndroid Build Coastguard Worker   bool runOnMachineFunction(MachineFunction &MF) override;
160*9880d681SAndroid Build Coastguard Worker 
getPassName()161*9880d681SAndroid Build Coastguard Worker   const char *getPassName() const override {
162*9880d681SAndroid Build Coastguard Worker     return "InsertNOPLoad: insert a NOP instruction after "
163*9880d681SAndroid Build Coastguard Worker            "every single-cycle load instruction when the next instruction is "
164*9880d681SAndroid Build Coastguard Worker            "another load/store instruction";
165*9880d681SAndroid Build Coastguard Worker   }
166*9880d681SAndroid Build Coastguard Worker };
167*9880d681SAndroid Build Coastguard Worker 
168*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY FlushCacheLineSWAP
169*9880d681SAndroid Build Coastguard Worker     : public LEONMachineFunctionPass {
170*9880d681SAndroid Build Coastguard Worker public:
171*9880d681SAndroid Build Coastguard Worker   static char ID;
172*9880d681SAndroid Build Coastguard Worker 
173*9880d681SAndroid Build Coastguard Worker   FlushCacheLineSWAP(TargetMachine &tm);
174*9880d681SAndroid Build Coastguard Worker   bool runOnMachineFunction(MachineFunction &MF) override;
175*9880d681SAndroid Build Coastguard Worker 
getPassName()176*9880d681SAndroid Build Coastguard Worker   const char *getPassName() const override {
177*9880d681SAndroid Build Coastguard Worker     return "FlushCacheLineSWAP: Erratum Fix LBR36: flush cache line containing "
178*9880d681SAndroid Build Coastguard Worker            "the lock before performing any of the atomic instructions SWAP and "
179*9880d681SAndroid Build Coastguard Worker            "LDSTUB";
180*9880d681SAndroid Build Coastguard Worker   }
181*9880d681SAndroid Build Coastguard Worker };
182*9880d681SAndroid Build Coastguard Worker 
183*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY InsertNOPsLoadStore
184*9880d681SAndroid Build Coastguard Worker     : public LEONMachineFunctionPass {
185*9880d681SAndroid Build Coastguard Worker public:
186*9880d681SAndroid Build Coastguard Worker   static char ID;
187*9880d681SAndroid Build Coastguard Worker 
188*9880d681SAndroid Build Coastguard Worker   InsertNOPsLoadStore(TargetMachine &tm);
189*9880d681SAndroid Build Coastguard Worker   bool runOnMachineFunction(MachineFunction &MF) override;
190*9880d681SAndroid Build Coastguard Worker 
getPassName()191*9880d681SAndroid Build Coastguard Worker   const char *getPassName() const override {
192*9880d681SAndroid Build Coastguard Worker     return "InsertNOPsLoadStore: Erratum Fix LBR37: insert NOPs between "
193*9880d681SAndroid Build Coastguard Worker            "single-precision loads and the store, so the number of "
194*9880d681SAndroid Build Coastguard Worker            "instructions between is 4";
195*9880d681SAndroid Build Coastguard Worker   }
196*9880d681SAndroid Build Coastguard Worker };
197*9880d681SAndroid Build Coastguard Worker } // namespace lllvm
198*9880d681SAndroid Build Coastguard Worker 
199*9880d681SAndroid Build Coastguard Worker #endif // LLVM_LIB_TARGET_SPARC_LEON_PASSES_H
200