ARMBaseInstrInfo.h revision 48575f6ea7d5cd21ab29ca370f58fcf9ca31400b
1//===- ARMBaseInstrInfo.h - ARM Base Instruction Information ----*- C++ -*-===//
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// This file contains the Base ARM implementation of the TargetInstrInfo class.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef ARMBASEINSTRUCTIONINFO_H
15#define ARMBASEINSTRUCTIONINFO_H
16
17#include "ARM.h"
18#include "llvm/CodeGen/MachineInstrBuilder.h"
19#include "llvm/Target/TargetInstrInfo.h"
20#include "llvm/ADT/DenseMap.h"
21#include "llvm/ADT/SmallSet.h"
22
23namespace llvm {
24  class ARMSubtarget;
25  class ARMBaseRegisterInfo;
26
27/// ARMII - This namespace holds all of the target specific flags that
28/// instruction info tracks.
29///
30namespace ARMII {
31  enum {
32    //===------------------------------------------------------------------===//
33    // Instruction Flags.
34
35    //===------------------------------------------------------------------===//
36    // This four-bit field describes the addressing mode used.
37
38    AddrModeMask  = 0x1f,
39    AddrModeNone    = 0,
40    AddrMode1       = 1,
41    AddrMode2       = 2,
42    AddrMode3       = 3,
43    AddrMode4       = 4,
44    AddrMode5       = 5,
45    AddrMode6       = 6,
46    AddrModeT1_1    = 7,
47    AddrModeT1_2    = 8,
48    AddrModeT1_4    = 9,
49    AddrModeT1_s    = 10, // i8 * 4 for pc and sp relative data
50    AddrModeT2_i12  = 11,
51    AddrModeT2_i8   = 12,
52    AddrModeT2_so   = 13,
53    AddrModeT2_pc   = 14, // +/- i12 for pc relative data
54    AddrModeT2_i8s4 = 15, // i8 * 4
55    AddrMode_i12    = 16,
56
57    // Size* - Flags to keep track of the size of an instruction.
58    SizeShift     = 5,
59    SizeMask      = 7 << SizeShift,
60    SizeSpecial   = 1,   // 0 byte pseudo or special case.
61    Size8Bytes    = 2,
62    Size4Bytes    = 3,
63    Size2Bytes    = 4,
64
65    // IndexMode - Unindex, pre-indexed, or post-indexed are valid for load
66    // and store ops only.  Generic "updating" flag is used for ld/st multiple.
67    IndexModeShift = 8,
68    IndexModeMask  = 3 << IndexModeShift,
69    IndexModePre   = 1,
70    IndexModePost  = 2,
71    IndexModeUpd   = 3,
72
73    //===------------------------------------------------------------------===//
74    // Instruction encoding formats.
75    //
76    FormShift     = 10,
77    FormMask      = 0x3f << FormShift,
78
79    // Pseudo instructions
80    Pseudo        = 0  << FormShift,
81
82    // Multiply instructions
83    MulFrm        = 1  << FormShift,
84
85    // Branch instructions
86    BrFrm         = 2  << FormShift,
87    BrMiscFrm     = 3  << FormShift,
88
89    // Data Processing instructions
90    DPFrm         = 4  << FormShift,
91    DPSoRegFrm    = 5  << FormShift,
92
93    // Load and Store
94    LdFrm         = 6  << FormShift,
95    StFrm         = 7  << FormShift,
96    LdMiscFrm     = 8  << FormShift,
97    StMiscFrm     = 9  << FormShift,
98    LdStMulFrm    = 10 << FormShift,
99
100    LdStExFrm     = 11 << FormShift,
101
102    // Miscellaneous arithmetic instructions
103    ArithMiscFrm  = 12 << FormShift,
104    SatFrm        = 13 << FormShift,
105
106    // Extend instructions
107    ExtFrm        = 14 << FormShift,
108
109    // VFP formats
110    VFPUnaryFrm   = 15 << FormShift,
111    VFPBinaryFrm  = 16 << FormShift,
112    VFPConv1Frm   = 17 << FormShift,
113    VFPConv2Frm   = 18 << FormShift,
114    VFPConv3Frm   = 19 << FormShift,
115    VFPConv4Frm   = 20 << FormShift,
116    VFPConv5Frm   = 21 << FormShift,
117    VFPLdStFrm    = 22 << FormShift,
118    VFPLdStMulFrm = 23 << FormShift,
119    VFPMiscFrm    = 24 << FormShift,
120
121    // Thumb format
122    ThumbFrm      = 25 << FormShift,
123
124    // Miscelleaneous format
125    MiscFrm       = 26 << FormShift,
126
127    // NEON formats
128    NGetLnFrm     = 27 << FormShift,
129    NSetLnFrm     = 28 << FormShift,
130    NDupFrm       = 29 << FormShift,
131    NLdStFrm      = 30 << FormShift,
132    N1RegModImmFrm= 31 << FormShift,
133    N2RegFrm      = 32 << FormShift,
134    NVCVTFrm      = 33 << FormShift,
135    NVDupLnFrm    = 34 << FormShift,
136    N2RegVShLFrm  = 35 << FormShift,
137    N2RegVShRFrm  = 36 << FormShift,
138    N3RegFrm      = 37 << FormShift,
139    N3RegVShFrm   = 38 << FormShift,
140    NVExtFrm      = 39 << FormShift,
141    NVMulSLFrm    = 40 << FormShift,
142    NVTBLFrm      = 41 << FormShift,
143
144    //===------------------------------------------------------------------===//
145    // Misc flags.
146
147    // UnaryDP - Indicates this is a unary data processing instruction, i.e.
148    // it doesn't have a Rn operand.
149    UnaryDP       = 1 << 16,
150
151    // Xform16Bit - Indicates this Thumb2 instruction may be transformed into
152    // a 16-bit Thumb instruction if certain conditions are met.
153    Xform16Bit    = 1 << 17,
154
155    //===------------------------------------------------------------------===//
156    // Code domain.
157    DomainShift   = 18,
158    DomainMask    = 3 << DomainShift,
159    DomainGeneral = 0 << DomainShift,
160    DomainVFP     = 1 << DomainShift,
161    DomainNEON    = 2 << DomainShift,
162
163    //===------------------------------------------------------------------===//
164    // Field shifts - such shifts are used to set field while generating
165    // machine instructions.
166    //
167    // FIXME: This list will need adjusting/fixing as the MC code emitter
168    // takes shape and the ARMCodeEmitter.cpp bits go away.
169    ShiftTypeShift = 4,
170
171    M_BitShift     = 5,
172    ShiftImmShift  = 5,
173    ShiftShift     = 7,
174    N_BitShift     = 7,
175    ImmHiShift     = 8,
176    SoRotImmShift  = 8,
177    RegRsShift     = 8,
178    ExtRotImmShift = 10,
179    RegRdLoShift   = 12,
180    RegRdShift     = 12,
181    RegRdHiShift   = 16,
182    RegRnShift     = 16,
183    S_BitShift     = 20,
184    W_BitShift     = 21,
185    AM3_I_BitShift = 22,
186    D_BitShift     = 22,
187    U_BitShift     = 23,
188    P_BitShift     = 24,
189    I_BitShift     = 25,
190    CondShift      = 28
191  };
192}
193
194class ARMBaseInstrInfo : public TargetInstrInfoImpl {
195  const ARMSubtarget &Subtarget;
196
197protected:
198  // Can be only subclassed.
199  explicit ARMBaseInstrInfo(const ARMSubtarget &STI);
200
201public:
202  // Return the non-pre/post incrementing version of 'Opc'. Return 0
203  // if there is not such an opcode.
204  virtual unsigned getUnindexedOpcode(unsigned Opc) const =0;
205
206  virtual MachineInstr *convertToThreeAddress(MachineFunction::iterator &MFI,
207                                              MachineBasicBlock::iterator &MBBI,
208                                              LiveVariables *LV) const;
209
210  virtual const ARMBaseRegisterInfo &getRegisterInfo() const =0;
211  const ARMSubtarget &getSubtarget() const { return Subtarget; }
212
213  ScheduleHazardRecognizer *
214  CreateTargetPostRAHazardRecognizer(const InstrItineraryData *II) const;
215
216  // Branch analysis.
217  virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
218                             MachineBasicBlock *&FBB,
219                             SmallVectorImpl<MachineOperand> &Cond,
220                             bool AllowModify = false) const;
221  virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const;
222  virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
223                                MachineBasicBlock *FBB,
224                                const SmallVectorImpl<MachineOperand> &Cond,
225                                DebugLoc DL) const;
226
227  virtual
228  bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
229
230  // Predication support.
231  bool isPredicated(const MachineInstr *MI) const {
232    int PIdx = MI->findFirstPredOperandIdx();
233    return PIdx != -1 && MI->getOperand(PIdx).getImm() != ARMCC::AL;
234  }
235
236  ARMCC::CondCodes getPredicate(const MachineInstr *MI) const {
237    int PIdx = MI->findFirstPredOperandIdx();
238    return PIdx != -1 ? (ARMCC::CondCodes)MI->getOperand(PIdx).getImm()
239                      : ARMCC::AL;
240  }
241
242  virtual
243  bool PredicateInstruction(MachineInstr *MI,
244                            const SmallVectorImpl<MachineOperand> &Pred) const;
245
246  virtual
247  bool SubsumesPredicate(const SmallVectorImpl<MachineOperand> &Pred1,
248                         const SmallVectorImpl<MachineOperand> &Pred2) const;
249
250  virtual bool DefinesPredicate(MachineInstr *MI,
251                                std::vector<MachineOperand> &Pred) const;
252
253  virtual bool isPredicable(MachineInstr *MI) const;
254
255  /// GetInstSize - Returns the size of the specified MachineInstr.
256  ///
257  virtual unsigned GetInstSizeInBytes(const MachineInstr* MI) const;
258
259  virtual unsigned isLoadFromStackSlot(const MachineInstr *MI,
260                                       int &FrameIndex) const;
261  virtual unsigned isStoreToStackSlot(const MachineInstr *MI,
262                                      int &FrameIndex) const;
263
264  virtual void copyPhysReg(MachineBasicBlock &MBB,
265                           MachineBasicBlock::iterator I, DebugLoc DL,
266                           unsigned DestReg, unsigned SrcReg,
267                           bool KillSrc) const;
268
269  virtual void storeRegToStackSlot(MachineBasicBlock &MBB,
270                                   MachineBasicBlock::iterator MBBI,
271                                   unsigned SrcReg, bool isKill, int FrameIndex,
272                                   const TargetRegisterClass *RC,
273                                   const TargetRegisterInfo *TRI) const;
274
275  virtual void loadRegFromStackSlot(MachineBasicBlock &MBB,
276                                    MachineBasicBlock::iterator MBBI,
277                                    unsigned DestReg, int FrameIndex,
278                                    const TargetRegisterClass *RC,
279                                    const TargetRegisterInfo *TRI) const;
280
281  virtual MachineInstr *emitFrameIndexDebugValue(MachineFunction &MF,
282                                                 int FrameIx,
283                                                 uint64_t Offset,
284                                                 const MDNode *MDPtr,
285                                                 DebugLoc DL) const;
286
287  virtual void reMaterialize(MachineBasicBlock &MBB,
288                             MachineBasicBlock::iterator MI,
289                             unsigned DestReg, unsigned SubIdx,
290                             const MachineInstr *Orig,
291                             const TargetRegisterInfo &TRI) const;
292
293  MachineInstr *duplicate(MachineInstr *Orig, MachineFunction &MF) const;
294
295  virtual bool produceSameValue(const MachineInstr *MI0,
296                                const MachineInstr *MI1) const;
297
298  /// areLoadsFromSameBasePtr - This is used by the pre-regalloc scheduler to
299  /// determine if two loads are loading from the same base address. It should
300  /// only return true if the base pointers are the same and the only
301  /// differences between the two addresses is the offset. It also returns the
302  /// offsets by reference.
303  virtual bool areLoadsFromSameBasePtr(SDNode *Load1, SDNode *Load2,
304                                       int64_t &Offset1, int64_t &Offset2)const;
305
306  /// shouldScheduleLoadsNear - This is a used by the pre-regalloc scheduler to
307  /// determine (in conjuction with areLoadsFromSameBasePtr) if two loads should
308  /// be scheduled togther. On some targets if two loads are loading from
309  /// addresses in the same cache line, it's better if they are scheduled
310  /// together. This function takes two integers that represent the load offsets
311  /// from the common base address. It returns true if it decides it's desirable
312  /// to schedule the two loads together. "NumLoads" is the number of loads that
313  /// have already been scheduled after Load1.
314  virtual bool shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2,
315                                       int64_t Offset1, int64_t Offset2,
316                                       unsigned NumLoads) const;
317
318  virtual bool isSchedulingBoundary(const MachineInstr *MI,
319                                    const MachineBasicBlock *MBB,
320                                    const MachineFunction &MF) const;
321
322  virtual bool isProfitableToIfCvt(MachineBasicBlock &MBB,
323                                   unsigned NumCyles, unsigned ExtraPredCycles,
324                                   float Prob, float Confidence) const;
325
326  virtual bool isProfitableToIfCvt(MachineBasicBlock &TMBB,
327                                   unsigned NumT, unsigned ExtraT,
328                                   MachineBasicBlock &FMBB,
329                                   unsigned NumF, unsigned ExtraF,
330                                   float Probability, float Confidence) const;
331
332  virtual bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB,
333                                         unsigned NumCyles,
334                                         float Probability,
335                                         float Confidence) const {
336    return NumCyles == 1;
337  }
338
339  /// AnalyzeCompare - For a comparison instruction, return the source register
340  /// in SrcReg and the value it compares against in CmpValue. Return true if
341  /// the comparison instruction can be analyzed.
342  virtual bool AnalyzeCompare(const MachineInstr *MI, unsigned &SrcReg,
343                              int &CmpMask, int &CmpValue) const;
344
345  /// OptimizeCompareInstr - Convert the instruction to set the zero flag so
346  /// that we can remove a "comparison with zero".
347  virtual bool OptimizeCompareInstr(MachineInstr *CmpInstr, unsigned SrcReg,
348                                    int CmpMask, int CmpValue,
349                                    const MachineRegisterInfo *MRI) const;
350
351  /// FoldImmediate - 'Reg' is known to be defined by a move immediate
352  /// instruction, try to fold the immediate into the use instruction.
353  virtual bool FoldImmediate(MachineInstr *UseMI, MachineInstr *DefMI,
354                             unsigned Reg, MachineRegisterInfo *MRI) const;
355
356  virtual unsigned getNumMicroOps(const InstrItineraryData *ItinData,
357                                  const MachineInstr *MI) const;
358
359  virtual
360  int getOperandLatency(const InstrItineraryData *ItinData,
361                        const MachineInstr *DefMI, unsigned DefIdx,
362                        const MachineInstr *UseMI, unsigned UseIdx) const;
363  virtual
364  int getOperandLatency(const InstrItineraryData *ItinData,
365                        SDNode *DefNode, unsigned DefIdx,
366                        SDNode *UseNode, unsigned UseIdx) const;
367private:
368  int getVLDMDefCycle(const InstrItineraryData *ItinData,
369                      const TargetInstrDesc &DefTID,
370                      unsigned DefClass,
371                      unsigned DefIdx, unsigned DefAlign) const;
372  int getLDMDefCycle(const InstrItineraryData *ItinData,
373                     const TargetInstrDesc &DefTID,
374                     unsigned DefClass,
375                     unsigned DefIdx, unsigned DefAlign) const;
376  int getVSTMUseCycle(const InstrItineraryData *ItinData,
377                      const TargetInstrDesc &UseTID,
378                      unsigned UseClass,
379                      unsigned UseIdx, unsigned UseAlign) const;
380  int getSTMUseCycle(const InstrItineraryData *ItinData,
381                     const TargetInstrDesc &UseTID,
382                     unsigned UseClass,
383                     unsigned UseIdx, unsigned UseAlign) const;
384  int getOperandLatency(const InstrItineraryData *ItinData,
385                        const TargetInstrDesc &DefTID,
386                        unsigned DefIdx, unsigned DefAlign,
387                        const TargetInstrDesc &UseTID,
388                        unsigned UseIdx, unsigned UseAlign) const;
389
390  int getInstrLatency(const InstrItineraryData *ItinData,
391                      const MachineInstr *MI, unsigned *PredCost = 0) const;
392
393  int getInstrLatency(const InstrItineraryData *ItinData,
394                      SDNode *Node) const;
395
396  bool hasHighOperandLatency(const InstrItineraryData *ItinData,
397                             const MachineRegisterInfo *MRI,
398                             const MachineInstr *DefMI, unsigned DefIdx,
399                             const MachineInstr *UseMI, unsigned UseIdx) const;
400  bool hasLowDefLatency(const InstrItineraryData *ItinData,
401                        const MachineInstr *DefMI, unsigned DefIdx) const;
402
403private:
404  /// Modeling special VFP / NEON fp MLA / MLS hazards.
405
406  /// MLxEntryMap - Map fp MLA / MLS to the corresponding entry in the internal
407  /// MLx table.
408  DenseMap<unsigned, unsigned> MLxEntryMap;
409
410  /// MLxHazardOpcodes - Set of add / sub and multiply opcodes that would cause
411  /// stalls when scheduled together with fp MLA / MLS opcodes.
412  SmallSet<unsigned, 16> MLxHazardOpcodes;
413
414public:
415  /// isFpMLxInstruction - Return true if the specified opcode is a fp MLA / MLS
416  /// instruction.
417  bool isFpMLxInstruction(unsigned Opcode) const {
418    return MLxEntryMap.count(Opcode);
419  }
420
421  /// isFpMLxInstruction - This version also returns the multiply opcode and the
422  /// addition / subtraction opcode to expand to. Return true for 'HasLane' for
423  /// the MLX instructions with an extra lane operand.
424  bool isFpMLxInstruction(unsigned Opcode, unsigned &MulOpc,
425                          unsigned &AddSubOpc, bool &NegAcc,
426                          bool &HasLane) const;
427
428  /// canCauseFpMLxStall - Return true if an instruction of the specified opcode
429  /// will cause stalls when scheduled after (within 4-cycle window) a fp
430  /// MLA / MLS instruction.
431  bool canCauseFpMLxStall(unsigned Opcode) const {
432    return MLxHazardOpcodes.count(Opcode);
433  }
434};
435
436static inline
437const MachineInstrBuilder &AddDefaultPred(const MachineInstrBuilder &MIB) {
438  return MIB.addImm((int64_t)ARMCC::AL).addReg(0);
439}
440
441static inline
442const MachineInstrBuilder &AddDefaultCC(const MachineInstrBuilder &MIB) {
443  return MIB.addReg(0);
444}
445
446static inline
447const MachineInstrBuilder &AddDefaultT1CC(const MachineInstrBuilder &MIB,
448                                          bool isDead = false) {
449  return MIB.addReg(ARM::CPSR, getDefRegState(true) | getDeadRegState(isDead));
450}
451
452static inline
453const MachineInstrBuilder &AddNoT1CC(const MachineInstrBuilder &MIB) {
454  return MIB.addReg(0);
455}
456
457static inline
458bool isUncondBranchOpcode(int Opc) {
459  return Opc == ARM::B || Opc == ARM::tB || Opc == ARM::t2B;
460}
461
462static inline
463bool isCondBranchOpcode(int Opc) {
464  return Opc == ARM::Bcc || Opc == ARM::tBcc || Opc == ARM::t2Bcc;
465}
466
467static inline
468bool isJumpTableBranchOpcode(int Opc) {
469  return Opc == ARM::BR_JTr || Opc == ARM::BR_JTm || Opc == ARM::BR_JTadd ||
470    Opc == ARM::tBR_JTr || Opc == ARM::t2BR_JT;
471}
472
473static inline
474bool isIndirectBranchOpcode(int Opc) {
475  return Opc == ARM::BX || Opc == ARM::MOVPCRX || Opc == ARM::tBRIND;
476}
477
478/// getInstrPredicate - If instruction is predicated, returns its predicate
479/// condition, otherwise returns AL. It also returns the condition code
480/// register by reference.
481ARMCC::CondCodes getInstrPredicate(const MachineInstr *MI, unsigned &PredReg);
482
483int getMatchingCondBranchOpcode(int Opc);
484
485/// emitARMRegPlusImmediate / emitT2RegPlusImmediate - Emits a series of
486/// instructions to materializea destreg = basereg + immediate in ARM / Thumb2
487/// code.
488void emitARMRegPlusImmediate(MachineBasicBlock &MBB,
489                             MachineBasicBlock::iterator &MBBI, DebugLoc dl,
490                             unsigned DestReg, unsigned BaseReg, int NumBytes,
491                             ARMCC::CondCodes Pred, unsigned PredReg,
492                             const ARMBaseInstrInfo &TII);
493
494void emitT2RegPlusImmediate(MachineBasicBlock &MBB,
495                            MachineBasicBlock::iterator &MBBI, DebugLoc dl,
496                            unsigned DestReg, unsigned BaseReg, int NumBytes,
497                            ARMCC::CondCodes Pred, unsigned PredReg,
498                            const ARMBaseInstrInfo &TII);
499void emitThumbRegPlusImmediate(MachineBasicBlock &MBB,
500                               MachineBasicBlock::iterator &MBBI,
501                               unsigned DestReg, unsigned BaseReg,
502                               int NumBytes, const TargetInstrInfo &TII,
503                               const ARMBaseRegisterInfo& MRI,
504                               DebugLoc dl);
505
506
507/// rewriteARMFrameIndex / rewriteT2FrameIndex -
508/// Rewrite MI to access 'Offset' bytes from the FP. Return false if the
509/// offset could not be handled directly in MI, and return the left-over
510/// portion by reference.
511bool rewriteARMFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
512                          unsigned FrameReg, int &Offset,
513                          const ARMBaseInstrInfo &TII);
514
515bool rewriteT2FrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
516                         unsigned FrameReg, int &Offset,
517                         const ARMBaseInstrInfo &TII);
518
519} // End llvm namespace
520
521#endif
522