| Jia Liu | 31d157a | 2012-02-18 12:03:15 +0000 | [diff] [blame] | 1 | //===-- PPCInstrInfo.h - PowerPC Instruction Information --------*- C++ -*-===// | 
| Misha Brukman | b5f662f | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 2 | // | 
| Misha Brukman | f2ccb77 | 2004-08-17 04:55:41 +0000 | [diff] [blame] | 3 | //                     The LLVM Compiler Infrastructure | 
 | 4 | // | 
| Chris Lattner | 4ee451d | 2007-12-29 20:36:04 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source | 
 | 6 | // License. See LICENSE.TXT for details. | 
| Misha Brukman | b5f662f | 2005-04-21 23:30:14 +0000 | [diff] [blame] | 7 | // | 
| Misha Brukman | f2ccb77 | 2004-08-17 04:55:41 +0000 | [diff] [blame] | 8 | //===----------------------------------------------------------------------===// | 
 | 9 | // | 
 | 10 | // This file contains the PowerPC implementation of the TargetInstrInfo class. | 
 | 11 | // | 
 | 12 | //===----------------------------------------------------------------------===// | 
 | 13 |  | 
| Jia Liu | 31d157a | 2012-02-18 12:03:15 +0000 | [diff] [blame] | 14 | #ifndef POWERPC_INSTRUCTIONINFO_H | 
 | 15 | #define POWERPC_INSTRUCTIONINFO_H | 
| Misha Brukman | f2ccb77 | 2004-08-17 04:55:41 +0000 | [diff] [blame] | 16 |  | 
| Chris Lattner | 2668959 | 2005-10-14 23:51:18 +0000 | [diff] [blame] | 17 | #include "PPC.h" | 
| Chris Lattner | 16e71f2 | 2005-10-14 23:59:06 +0000 | [diff] [blame] | 18 | #include "PPCRegisterInfo.h" | 
| Craig Topper | 79aa341 | 2012-03-17 18:46:09 +0000 | [diff] [blame] | 19 | #include "llvm/Target/TargetInstrInfo.h" | 
| Misha Brukman | f2ccb77 | 2004-08-17 04:55:41 +0000 | [diff] [blame] | 20 |  | 
| Evan Cheng | 4db3cff | 2011-07-01 17:57:27 +0000 | [diff] [blame] | 21 | #define GET_INSTRINFO_HEADER | 
 | 22 | #include "PPCGenInstrInfo.inc" | 
 | 23 |  | 
| Misha Brukman | f2ccb77 | 2004-08-17 04:55:41 +0000 | [diff] [blame] | 24 | namespace llvm { | 
| Chris Lattner | 88d211f | 2006-03-12 09:13:49 +0000 | [diff] [blame] | 25 |  | 
 | 26 | /// PPCII - This namespace holds all of the PowerPC target-specific | 
 | 27 | /// per-instruction flags.  These must match the corresponding definitions in | 
 | 28 | /// PPC.td and PPCInstrFormats.td. | 
 | 29 | namespace PPCII { | 
 | 30 | enum { | 
 | 31 |   // PPC970 Instruction Flags.  These flags describe the characteristics of the | 
 | 32 |   // PowerPC 970 (aka G5) dispatch groups and how they are formed out of | 
 | 33 |   // raw machine instructions. | 
 | 34 |  | 
 | 35 |   /// PPC970_First - This instruction starts a new dispatch group, so it will | 
 | 36 |   /// always be the first one in the group. | 
 | 37 |   PPC970_First = 0x1, | 
| Andrew Trick | 6e8f4c4 | 2010-12-24 04:28:06 +0000 | [diff] [blame] | 38 |  | 
| Chris Lattner | 88d211f | 2006-03-12 09:13:49 +0000 | [diff] [blame] | 39 |   /// PPC970_Single - This instruction starts a new dispatch group and | 
 | 40 |   /// terminates it, so it will be the sole instruction in the group. | 
 | 41 |   PPC970_Single = 0x2, | 
 | 42 |  | 
| Chris Lattner | fd97734 | 2006-03-13 05:15:10 +0000 | [diff] [blame] | 43 |   /// PPC970_Cracked - This instruction is cracked into two pieces, requiring | 
 | 44 |   /// two dispatch pipes to be available to issue. | 
 | 45 |   PPC970_Cracked = 0x4, | 
| Andrew Trick | 6e8f4c4 | 2010-12-24 04:28:06 +0000 | [diff] [blame] | 46 |  | 
| Chris Lattner | 88d211f | 2006-03-12 09:13:49 +0000 | [diff] [blame] | 47 |   /// PPC970_Mask/Shift - This is a bitmask that selects the pipeline type that | 
 | 48 |   /// an instruction is issued to. | 
| Chris Lattner | fd97734 | 2006-03-13 05:15:10 +0000 | [diff] [blame] | 49 |   PPC970_Shift = 3, | 
| Chris Lattner | d74ea2b | 2006-05-24 17:04:05 +0000 | [diff] [blame] | 50 |   PPC970_Mask = 0x07 << PPC970_Shift | 
| Chris Lattner | 88d211f | 2006-03-12 09:13:49 +0000 | [diff] [blame] | 51 | }; | 
 | 52 | enum PPC970_Unit { | 
 | 53 |   /// These are the various PPC970 execution unit pipelines.  Each instruction | 
 | 54 |   /// is one of these. | 
 | 55 |   PPC970_Pseudo = 0 << PPC970_Shift,   // Pseudo instruction | 
 | 56 |   PPC970_FXU    = 1 << PPC970_Shift,   // Fixed Point (aka Integer/ALU) Unit | 
 | 57 |   PPC970_LSU    = 2 << PPC970_Shift,   // Load Store Unit | 
 | 58 |   PPC970_FPU    = 3 << PPC970_Shift,   // Floating Point Unit | 
 | 59 |   PPC970_CRU    = 4 << PPC970_Shift,   // Control Register Unit | 
 | 60 |   PPC970_VALU   = 5 << PPC970_Shift,   // Vector ALU | 
 | 61 |   PPC970_VPERM  = 6 << PPC970_Shift,   // Vector Permute Unit | 
| Chris Lattner | d74ea2b | 2006-05-24 17:04:05 +0000 | [diff] [blame] | 62 |   PPC970_BRU    = 7 << PPC970_Shift    // Branch Unit | 
| Chris Lattner | 88d211f | 2006-03-12 09:13:49 +0000 | [diff] [blame] | 63 | }; | 
| Chris Lattner | b908258 | 2010-11-14 23:42:06 +0000 | [diff] [blame] | 64 | } // end namespace PPCII | 
| Andrew Trick | 6e8f4c4 | 2010-12-24 04:28:06 +0000 | [diff] [blame] | 65 |  | 
 | 66 |  | 
| Evan Cheng | 4db3cff | 2011-07-01 17:57:27 +0000 | [diff] [blame] | 67 | class PPCInstrInfo : public PPCGenInstrInfo { | 
| Chris Lattner | b1d26f6 | 2006-06-17 00:01:04 +0000 | [diff] [blame] | 68 |   PPCTargetMachine &TM; | 
| Nate Begeman | 21e463b | 2005-10-16 05:39:50 +0000 | [diff] [blame] | 69 |   const PPCRegisterInfo RI; | 
| Bill Wendling | 4a66e9a | 2008-03-10 22:49:16 +0000 | [diff] [blame] | 70 |  | 
| Dan Gohman | 8e5f2c6 | 2008-07-07 23:14:23 +0000 | [diff] [blame] | 71 |   bool StoreRegToStackSlot(MachineFunction &MF, | 
 | 72 |                            unsigned SrcReg, bool isKill, int FrameIdx, | 
| Bill Wendling | 4a66e9a | 2008-03-10 22:49:16 +0000 | [diff] [blame] | 73 |                            const TargetRegisterClass *RC, | 
| Hal Finkel | 3249729 | 2013-03-17 04:43:44 +0000 | [diff] [blame] | 74 |                            SmallVectorImpl<MachineInstr*> &NewMIs, | 
| Hal Finkel | 3f2c047 | 2013-03-23 22:06:03 +0000 | [diff] [blame] | 75 |                            bool &NonRI, bool &SpillsVRS) const; | 
| Hal Finkel | d21e930 | 2011-12-06 20:55:36 +0000 | [diff] [blame] | 76 |   bool LoadRegFromStackSlot(MachineFunction &MF, DebugLoc DL, | 
| Dan Gohman | 8e5f2c6 | 2008-07-07 23:14:23 +0000 | [diff] [blame] | 77 |                             unsigned DestReg, int FrameIdx, | 
| Bill Wendling | 4a66e9a | 2008-03-10 22:49:16 +0000 | [diff] [blame] | 78 |                             const TargetRegisterClass *RC, | 
| Hal Finkel | 3249729 | 2013-03-17 04:43:44 +0000 | [diff] [blame] | 79 |                             SmallVectorImpl<MachineInstr*> &NewMIs, | 
| Hal Finkel | 3f2c047 | 2013-03-23 22:06:03 +0000 | [diff] [blame] | 80 |                             bool &NonRI, bool &SpillsVRS) const; | 
| Juergen Ributzka | 3543625 | 2013-11-19 00:57:56 +0000 | [diff] [blame] | 81 |   virtual void anchor(); | 
| Misha Brukman | f2ccb77 | 2004-08-17 04:55:41 +0000 | [diff] [blame] | 82 | public: | 
| Dan Gohman | 950a4c4 | 2008-03-25 22:06:05 +0000 | [diff] [blame] | 83 |   explicit PPCInstrInfo(PPCTargetMachine &TM); | 
| Misha Brukman | f2ccb77 | 2004-08-17 04:55:41 +0000 | [diff] [blame] | 84 |  | 
 | 85 |   /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info.  As | 
 | 86 |   /// such, whenever a client has an instance of instruction info, it should | 
 | 87 |   /// always be able to get register info as well (through this method). | 
 | 88 |   /// | 
| Dan Gohman | c9f5f3f | 2008-05-14 01:58:56 +0000 | [diff] [blame] | 89 |   virtual const PPCRegisterInfo &getRegisterInfo() const { return RI; } | 
| Misha Brukman | f2ccb77 | 2004-08-17 04:55:41 +0000 | [diff] [blame] | 90 |  | 
| Andrew Trick | 2da8bc8 | 2010-12-24 05:03:26 +0000 | [diff] [blame] | 91 |   ScheduleHazardRecognizer * | 
 | 92 |   CreateTargetHazardRecognizer(const TargetMachine *TM, | 
 | 93 |                                const ScheduleDAG *DAG) const; | 
| Hal Finkel | 64c34e2 | 2011-12-02 04:58:02 +0000 | [diff] [blame] | 94 |   ScheduleHazardRecognizer * | 
 | 95 |   CreateTargetPostRAHazardRecognizer(const InstrItineraryData *II, | 
 | 96 |                                      const ScheduleDAG *DAG) const; | 
| Andrew Trick | 2da8bc8 | 2010-12-24 05:03:26 +0000 | [diff] [blame] | 97 |  | 
| Stephen Hines | 36b5688 | 2014-04-23 16:57:46 -0700 | [diff] [blame] | 98 |   virtual | 
 | 99 |   int getOperandLatency(const InstrItineraryData *ItinData, | 
 | 100 |                         const MachineInstr *DefMI, unsigned DefIdx, | 
 | 101 |                         const MachineInstr *UseMI, unsigned UseIdx) const; | 
 | 102 |   virtual | 
 | 103 |   int getOperandLatency(const InstrItineraryData *ItinData, | 
 | 104 |                         SDNode *DefNode, unsigned DefIdx, | 
 | 105 |                         SDNode *UseNode, unsigned UseIdx) const { | 
 | 106 |     return PPCGenInstrInfo::getOperandLatency(ItinData, DefNode, DefIdx, | 
 | 107 |                                               UseNode, UseIdx); | 
 | 108 |   } | 
 | 109 |  | 
| Jakob Stoklund Olesen | 7164288 | 2012-06-19 21:14:34 +0000 | [diff] [blame] | 110 |   bool isCoalescableExtInstr(const MachineInstr &MI, | 
 | 111 |                              unsigned &SrcReg, unsigned &DstReg, | 
 | 112 |                              unsigned &SubIdx) const; | 
| Dan Gohman | cbad42c | 2008-11-18 19:49:32 +0000 | [diff] [blame] | 113 |   unsigned isLoadFromStackSlot(const MachineInstr *MI, | 
 | 114 |                                int &FrameIndex) const; | 
 | 115 |   unsigned isStoreToStackSlot(const MachineInstr *MI, | 
 | 116 |                               int &FrameIndex) const; | 
| Chris Lattner | 4083960 | 2006-02-02 20:12:32 +0000 | [diff] [blame] | 117 |  | 
| Chris Lattner | 043870d | 2005-09-09 18:17:41 +0000 | [diff] [blame] | 118 |   // commuteInstruction - We can commute rlwimi instructions, but only if the | 
 | 119 |   // rotate amt is zero.  We also have to munge the immediates a bit. | 
| Evan Cheng | 58dcb0e | 2008-06-16 07:33:11 +0000 | [diff] [blame] | 120 |   virtual MachineInstr *commuteInstruction(MachineInstr *MI, bool NewMI) const; | 
| Andrew Trick | 6e8f4c4 | 2010-12-24 04:28:06 +0000 | [diff] [blame] | 121 |  | 
| Stephen Hines | 36b5688 | 2014-04-23 16:57:46 -0700 | [diff] [blame] | 122 |   virtual bool findCommutedOpIndices(MachineInstr *MI, unsigned &SrcOpIdx1, | 
 | 123 |                                      unsigned &SrcOpIdx2) const; | 
 | 124 |  | 
| Andrew Trick | 6e8f4c4 | 2010-12-24 04:28:06 +0000 | [diff] [blame] | 125 |   virtual void insertNoop(MachineBasicBlock &MBB, | 
| Chris Lattner | bbf1c72 | 2006-03-05 23:49:55 +0000 | [diff] [blame] | 126 |                           MachineBasicBlock::iterator MI) const; | 
 | 127 |  | 
| Chris Lattner | c50e2bc | 2006-10-13 21:21:17 +0000 | [diff] [blame] | 128 |  | 
 | 129 |   // Branch analysis. | 
 | 130 |   virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, | 
 | 131 |                              MachineBasicBlock *&FBB, | 
| Evan Cheng | dc54d31 | 2009-02-09 07:14:22 +0000 | [diff] [blame] | 132 |                              SmallVectorImpl<MachineOperand> &Cond, | 
 | 133 |                              bool AllowModify) const; | 
| Evan Cheng | b5cdaa2 | 2007-05-18 00:05:48 +0000 | [diff] [blame] | 134 |   virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const; | 
 | 135 |   virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, | 
 | 136 |                                 MachineBasicBlock *FBB, | 
| Stuart Hastings | 3bf9125 | 2010-06-17 22:43:56 +0000 | [diff] [blame] | 137 |                                 const SmallVectorImpl<MachineOperand> &Cond, | 
 | 138 |                                 DebugLoc DL) const; | 
| Hal Finkel | ff56d1a | 2013-04-05 23:29:01 +0000 | [diff] [blame] | 139 |  | 
 | 140 |   // Select analysis. | 
 | 141 |   virtual bool canInsertSelect(const MachineBasicBlock&, | 
 | 142 |                                const SmallVectorImpl<MachineOperand> &Cond, | 
 | 143 |                                unsigned, unsigned, int&, int&, int&) const; | 
 | 144 |   virtual void insertSelect(MachineBasicBlock &MBB, | 
 | 145 |                             MachineBasicBlock::iterator MI, DebugLoc DL, | 
 | 146 |                             unsigned DstReg, | 
 | 147 |                             const SmallVectorImpl<MachineOperand> &Cond, | 
 | 148 |                             unsigned TrueReg, unsigned FalseReg) const; | 
 | 149 |  | 
| Jakob Stoklund Olesen | 27689b0 | 2010-07-11 07:31:00 +0000 | [diff] [blame] | 150 |   virtual void copyPhysReg(MachineBasicBlock &MBB, | 
 | 151 |                            MachineBasicBlock::iterator I, DebugLoc DL, | 
 | 152 |                            unsigned DestReg, unsigned SrcReg, | 
 | 153 |                            bool KillSrc) const; | 
| Andrew Trick | 6e8f4c4 | 2010-12-24 04:28:06 +0000 | [diff] [blame] | 154 |  | 
| Owen Anderson | f6372aa | 2008-01-01 21:11:32 +0000 | [diff] [blame] | 155 |   virtual void storeRegToStackSlot(MachineBasicBlock &MBB, | 
 | 156 |                                    MachineBasicBlock::iterator MBBI, | 
 | 157 |                                    unsigned SrcReg, bool isKill, int FrameIndex, | 
| Evan Cheng | 746ad69 | 2010-05-06 19:06:44 +0000 | [diff] [blame] | 158 |                                    const TargetRegisterClass *RC, | 
 | 159 |                                    const TargetRegisterInfo *TRI) const; | 
| Owen Anderson | f6372aa | 2008-01-01 21:11:32 +0000 | [diff] [blame] | 160 |  | 
| Owen Anderson | f6372aa | 2008-01-01 21:11:32 +0000 | [diff] [blame] | 161 |   virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, | 
 | 162 |                                     MachineBasicBlock::iterator MBBI, | 
 | 163 |                                     unsigned DestReg, int FrameIndex, | 
| Evan Cheng | 746ad69 | 2010-05-06 19:06:44 +0000 | [diff] [blame] | 164 |                                     const TargetRegisterClass *RC, | 
 | 165 |                                     const TargetRegisterInfo *TRI) const; | 
| Andrew Trick | 6e8f4c4 | 2010-12-24 04:28:06 +0000 | [diff] [blame] | 166 |  | 
| Owen Anderson | 44eb65c | 2008-08-14 22:49:33 +0000 | [diff] [blame] | 167 |   virtual | 
 | 168 |   bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const; | 
| Andrew Trick | 6e8f4c4 | 2010-12-24 04:28:06 +0000 | [diff] [blame] | 169 |  | 
| Hal Finkel | 839b909 | 2013-04-06 19:30:30 +0000 | [diff] [blame] | 170 |   virtual bool FoldImmediate(MachineInstr *UseMI, MachineInstr *DefMI, | 
 | 171 |                              unsigned Reg, MachineRegisterInfo *MRI) const; | 
 | 172 |  | 
| Hal Finkel | 7eb0d81 | 2013-04-09 22:58:37 +0000 | [diff] [blame] | 173 |   // If conversion by predication (only supported by some branch instructions). | 
 | 174 |   // All of the profitability checks always return true; it is always | 
 | 175 |   // profitable to use the predicated branches. | 
 | 176 |   virtual bool isProfitableToIfCvt(MachineBasicBlock &MBB, | 
 | 177 |                                    unsigned NumCycles, unsigned ExtraPredCycles, | 
 | 178 |                                    const BranchProbability &Probability) const { | 
 | 179 |     return true; | 
 | 180 |   } | 
 | 181 |  | 
 | 182 |   virtual bool isProfitableToIfCvt(MachineBasicBlock &TMBB, | 
 | 183 |                                    unsigned NumT, unsigned ExtraT, | 
 | 184 |                                    MachineBasicBlock &FMBB, | 
 | 185 |                                    unsigned NumF, unsigned ExtraF, | 
| Hal Finkel | da47e17 | 2013-04-10 18:30:16 +0000 | [diff] [blame] | 186 |                                    const BranchProbability &Probability) const; | 
| Hal Finkel | 7eb0d81 | 2013-04-09 22:58:37 +0000 | [diff] [blame] | 187 |  | 
 | 188 |   virtual bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB, | 
 | 189 |                                          unsigned NumCycles, | 
 | 190 |                                          const BranchProbability | 
 | 191 |                                          &Probability) const { | 
 | 192 |     return true; | 
 | 193 |   } | 
 | 194 |  | 
 | 195 |   virtual bool isProfitableToUnpredicate(MachineBasicBlock &TMBB, | 
 | 196 |                                          MachineBasicBlock &FMBB) const { | 
 | 197 |     return false; | 
 | 198 |   } | 
 | 199 |  | 
 | 200 |   // Predication support. | 
 | 201 |   bool isPredicated(const MachineInstr *MI) const; | 
 | 202 |  | 
 | 203 |   virtual bool isUnpredicatedTerminator(const MachineInstr *MI) const; | 
 | 204 |  | 
 | 205 |   virtual | 
 | 206 |   bool PredicateInstruction(MachineInstr *MI, | 
 | 207 |                             const SmallVectorImpl<MachineOperand> &Pred) const; | 
 | 208 |  | 
 | 209 |   virtual | 
 | 210 |   bool SubsumesPredicate(const SmallVectorImpl<MachineOperand> &Pred1, | 
 | 211 |                          const SmallVectorImpl<MachineOperand> &Pred2) const; | 
 | 212 |  | 
 | 213 |   virtual bool DefinesPredicate(MachineInstr *MI, | 
 | 214 |                                 std::vector<MachineOperand> &Pred) const; | 
 | 215 |  | 
 | 216 |   virtual bool isPredicable(MachineInstr *MI) const; | 
 | 217 |  | 
| Hal Finkel | 860c08c | 2013-04-18 22:15:08 +0000 | [diff] [blame] | 218 |   // Comparison optimization. | 
 | 219 |  | 
 | 220 |  | 
 | 221 |   virtual bool analyzeCompare(const MachineInstr *MI, | 
 | 222 |                               unsigned &SrcReg, unsigned &SrcReg2, | 
 | 223 |                               int &Mask, int &Value) const; | 
 | 224 |  | 
 | 225 |   virtual bool optimizeCompareInstr(MachineInstr *CmpInstr, | 
 | 226 |                                     unsigned SrcReg, unsigned SrcReg2, | 
 | 227 |                                     int Mask, int Value, | 
 | 228 |                                     const MachineRegisterInfo *MRI) const; | 
 | 229 |  | 
| Nicolas Geoffray | 52e724a | 2008-04-16 20:10:13 +0000 | [diff] [blame] | 230 |   /// GetInstSize - Return the number of bytes of code the specified | 
 | 231 |   /// instruction may be.  This returns the maximum number of bytes. | 
 | 232 |   /// | 
 | 233 |   virtual unsigned GetInstSizeInBytes(const MachineInstr *MI) const; | 
| Misha Brukman | f2ccb77 | 2004-08-17 04:55:41 +0000 | [diff] [blame] | 234 | }; | 
 | 235 |  | 
 | 236 | } | 
 | 237 |  | 
 | 238 | #endif |