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