Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- MC/MCRegisterInfo.h - Target Register Description --------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file describes an abstract interface used to get information about a
10
// target machines register file.  This information is used for a variety of
11
// purposed, especially register allocation.
12
//
13
//===----------------------------------------------------------------------===//
14
 
15
#ifndef LLVM_MC_MCREGISTERINFO_H
16
#define LLVM_MC_MCREGISTERINFO_H
17
 
18
#include "llvm/ADT/DenseMap.h"
19
#include "llvm/ADT/iterator.h"
20
#include "llvm/ADT/iterator_range.h"
21
#include "llvm/MC/LaneBitmask.h"
22
#include "llvm/MC/MCRegister.h"
23
#include <cassert>
24
#include <cstdint>
25
#include <iterator>
26
#include <utility>
27
 
28
namespace llvm {
29
 
30
/// MCRegisterClass - Base class of TargetRegisterClass.
31
class MCRegisterClass {
32
public:
33
  using iterator = const MCPhysReg*;
34
  using const_iterator = const MCPhysReg*;
35
 
36
  const iterator RegsBegin;
37
  const uint8_t *const RegSet;
38
  const uint32_t NameIdx;
39
  const uint16_t RegsSize;
40
  const uint16_t RegSetSize;
41
  const uint16_t ID;
42
  const uint16_t RegSizeInBits;
43
  const int8_t CopyCost;
44
  const bool Allocatable;
45
 
46
  /// getID() - Return the register class ID number.
47
  ///
48
  unsigned getID() const { return ID; }
49
 
50
  /// begin/end - Return all of the registers in this class.
51
  ///
52
  iterator       begin() const { return RegsBegin; }
53
  iterator         end() const { return RegsBegin + RegsSize; }
54
 
55
  /// getNumRegs - Return the number of registers in this class.
56
  ///
57
  unsigned getNumRegs() const { return RegsSize; }
58
 
59
  /// getRegister - Return the specified register in the class.
60
  ///
61
  unsigned getRegister(unsigned i) const {
62
    assert(i < getNumRegs() && "Register number out of range!");
63
    return RegsBegin[i];
64
  }
65
 
66
  /// contains - Return true if the specified register is included in this
67
  /// register class.  This does not include virtual registers.
68
  bool contains(MCRegister Reg) const {
69
    unsigned RegNo = unsigned(Reg);
70
    unsigned InByte = RegNo % 8;
71
    unsigned Byte = RegNo / 8;
72
    if (Byte >= RegSetSize)
73
      return false;
74
    return (RegSet[Byte] & (1 << InByte)) != 0;
75
  }
76
 
77
  /// contains - Return true if both registers are in this class.
78
  bool contains(MCRegister Reg1, MCRegister Reg2) const {
79
    return contains(Reg1) && contains(Reg2);
80
  }
81
 
82
  /// Return the size of the physical register in bits if we are able to
83
  /// determine it. This always returns zero for registers of targets that use
84
  /// HW modes, as we need more information to determine the size of registers
85
  /// in such cases. Use TargetRegisterInfo to cover them.
86
  unsigned getSizeInBits() const { return RegSizeInBits; }
87
 
88
  /// getCopyCost - Return the cost of copying a value between two registers in
89
  /// this class. A negative number means the register class is very expensive
90
  /// to copy e.g. status flag register classes.
91
  int getCopyCost() const { return CopyCost; }
92
 
93
  /// isAllocatable - Return true if this register class may be used to create
94
  /// virtual registers.
95
  bool isAllocatable() const { return Allocatable; }
96
};
97
 
98
/// MCRegisterDesc - This record contains information about a particular
99
/// register.  The SubRegs field is a zero terminated array of registers that
100
/// are sub-registers of the specific register, e.g. AL, AH are sub-registers
101
/// of AX. The SuperRegs field is a zero terminated array of registers that are
102
/// super-registers of the specific register, e.g. RAX, EAX, are
103
/// super-registers of AX.
104
///
105
struct MCRegisterDesc {
106
  uint32_t Name;      // Printable name for the reg (for debugging)
107
  uint32_t SubRegs;   // Sub-register set, described above
108
  uint32_t SuperRegs; // Super-register set, described above
109
 
110
  // Offset into MCRI::SubRegIndices of a list of sub-register indices for each
111
  // sub-register in SubRegs.
112
  uint32_t SubRegIndices;
113
 
114
  // RegUnits - Points to the list of register units. The low 4 bits holds the
115
  // Scale, the high bits hold an offset into DiffLists. See MCRegUnitIterator.
116
  uint32_t RegUnits;
117
 
118
  /// Index into list with lane mask sequences. The sequence contains a lanemask
119
  /// for every register unit.
120
  uint16_t RegUnitLaneMasks;
121
};
122
 
123
/// MCRegisterInfo base class - We assume that the target defines a static
124
/// array of MCRegisterDesc objects that represent all of the machine
125
/// registers that the target has.  As such, we simply have to track a pointer
126
/// to this array so that we can turn register number into a register
127
/// descriptor.
128
///
129
/// Note this class is designed to be a base class of TargetRegisterInfo, which
130
/// is the interface used by codegen. However, specific targets *should never*
131
/// specialize this class. MCRegisterInfo should only contain getters to access
132
/// TableGen generated physical register data. It must not be extended with
133
/// virtual methods.
134
///
135
class MCRegisterInfo {
136
public:
137
  using regclass_iterator = const MCRegisterClass *;
138
 
139
  /// DwarfLLVMRegPair - Emitted by tablegen so Dwarf<->LLVM reg mappings can be
140
  /// performed with a binary search.
141
  struct DwarfLLVMRegPair {
142
    unsigned FromReg;
143
    unsigned ToReg;
144
 
145
    bool operator<(DwarfLLVMRegPair RHS) const { return FromReg < RHS.FromReg; }
146
  };
147
 
148
  /// SubRegCoveredBits - Emitted by tablegen: bit range covered by a subreg
149
  /// index, -1 in any being invalid.
150
  struct SubRegCoveredBits {
151
    uint16_t Offset;
152
    uint16_t Size;
153
  };
154
 
155
private:
156
  const MCRegisterDesc *Desc;                 // Pointer to the descriptor array
157
  unsigned NumRegs;                           // Number of entries in the array
158
  MCRegister RAReg;                           // Return address register
159
  MCRegister PCReg;                           // Program counter register
160
  const MCRegisterClass *Classes;             // Pointer to the regclass array
161
  unsigned NumClasses;                        // Number of entries in the array
162
  unsigned NumRegUnits;                       // Number of regunits.
163
  const MCPhysReg (*RegUnitRoots)[2];         // Pointer to regunit root table.
164
  const MCPhysReg *DiffLists;                 // Pointer to the difflists array
165
  const LaneBitmask *RegUnitMaskSequences;    // Pointer to lane mask sequences
166
                                              // for register units.
167
  const char *RegStrings;                     // Pointer to the string table.
168
  const char *RegClassStrings;                // Pointer to the class strings.
169
  const uint16_t *SubRegIndices;              // Pointer to the subreg lookup
170
                                              // array.
171
  const SubRegCoveredBits *SubRegIdxRanges;   // Pointer to the subreg covered
172
                                              // bit ranges array.
173
  unsigned NumSubRegIndices;                  // Number of subreg indices.
174
  const uint16_t *RegEncodingTable;           // Pointer to array of register
175
                                              // encodings.
176
 
177
  unsigned L2DwarfRegsSize;
178
  unsigned EHL2DwarfRegsSize;
179
  unsigned Dwarf2LRegsSize;
180
  unsigned EHDwarf2LRegsSize;
181
  const DwarfLLVMRegPair *L2DwarfRegs;        // LLVM to Dwarf regs mapping
182
  const DwarfLLVMRegPair *EHL2DwarfRegs;      // LLVM to Dwarf regs mapping EH
183
  const DwarfLLVMRegPair *Dwarf2LRegs;        // Dwarf to LLVM regs mapping
184
  const DwarfLLVMRegPair *EHDwarf2LRegs;      // Dwarf to LLVM regs mapping EH
185
  DenseMap<MCRegister, int> L2SEHRegs;        // LLVM to SEH regs mapping
186
  DenseMap<MCRegister, int> L2CVRegs;         // LLVM to CV regs mapping
187
 
188
public:
189
  // Forward declaration to become a friend class of DiffListIterator.
190
  template <class SubT> class mc_difflist_iterator;
191
 
192
  /// DiffListIterator - Base iterator class that can traverse the
193
  /// differentially encoded register and regunit lists in DiffLists.
194
  /// Don't use this class directly, use one of the specialized sub-classes
195
  /// defined below.
196
  class DiffListIterator {
197
    uint16_t Val = 0;
198
    const MCPhysReg *List = nullptr;
199
 
200
  protected:
201
    /// Create an invalid iterator. Call init() to point to something useful.
202
    DiffListIterator() = default;
203
 
204
    /// init - Point the iterator to InitVal, decoding subsequent values from
205
    /// DiffList. The iterator will initially point to InitVal, sub-classes are
206
    /// responsible for skipping the seed value if it is not part of the list.
207
    void init(MCPhysReg InitVal, const MCPhysReg *DiffList) {
208
      Val = InitVal;
209
      List = DiffList;
210
    }
211
 
212
    /// advance - Move to the next list position, return the applied
213
    /// differential. This function does not detect the end of the list, that
214
    /// is the caller's responsibility (by checking for a 0 return value).
215
    MCRegister advance() {
216
      assert(isValid() && "Cannot move off the end of the list.");
217
      MCPhysReg D = *List++;
218
      Val += D;
219
      return D;
220
    }
221
 
222
  public:
223
    /// isValid - returns true if this iterator is not yet at the end.
224
    bool isValid() const { return List; }
225
 
226
    /// Dereference the iterator to get the value at the current position.
227
    MCRegister operator*() const { return Val; }
228
 
229
    /// Pre-increment to move to the next position.
230
    void operator++() {
231
      // The end of the list is encoded as a 0 differential.
232
      if (!advance())
233
        List = nullptr;
234
    }
235
 
236
    template <class SubT> friend class MCRegisterInfo::mc_difflist_iterator;
237
  };
238
 
239
  /// Forward iterator using DiffListIterator.
240
  template <class SubT>
241
  class mc_difflist_iterator
242
      : public iterator_facade_base<mc_difflist_iterator<SubT>,
243
                                    std::forward_iterator_tag, MCPhysReg> {
244
    MCRegisterInfo::DiffListIterator Iter;
245
    /// Current value as MCPhysReg, so we can return a reference to it.
246
    MCPhysReg Val;
247
 
248
  protected:
249
    mc_difflist_iterator(MCRegisterInfo::DiffListIterator Iter) : Iter(Iter) {}
250
 
251
    // Allow conversion between instantiations where valid.
252
    mc_difflist_iterator(MCRegister Reg, const MCPhysReg *DiffList) {
253
      Iter.init(Reg, DiffList);
254
      Val = *Iter;
255
    }
256
 
257
  public:
258
    // Allow default construction to build variables, but this doesn't build
259
    // a useful iterator.
260
    mc_difflist_iterator() = default;
261
 
262
    /// Return an iterator past the last element.
263
    static SubT end() {
264
      SubT End;
265
      End.Iter.List = nullptr;
266
      return End;
267
    }
268
 
269
    bool operator==(const mc_difflist_iterator &Arg) const {
270
      return Iter.List == Arg.Iter.List;
271
    }
272
 
273
    const MCPhysReg &operator*() const { return Val; }
274
 
275
    using mc_difflist_iterator::iterator_facade_base::operator++;
276
    void operator++() {
277
      assert(Iter.List && "Cannot increment the end iterator!");
278
      ++Iter;
279
      Val = *Iter;
280
    }
281
  };
282
 
283
  /// Forward iterator over all sub-registers.
284
  /// TODO: Replace remaining uses of MCSubRegIterator.
285
  class mc_subreg_iterator : public mc_difflist_iterator<mc_subreg_iterator> {
286
  public:
287
    mc_subreg_iterator(MCRegisterInfo::DiffListIterator Iter)
288
        : mc_difflist_iterator(Iter) {}
289
    mc_subreg_iterator() = default;
290
    mc_subreg_iterator(MCRegister Reg, const MCRegisterInfo *MCRI)
291
        : mc_difflist_iterator(Reg, MCRI->DiffLists + MCRI->get(Reg).SubRegs) {}
292
  };
293
 
294
  /// Forward iterator over all super-registers.
295
  /// TODO: Replace remaining uses of MCSuperRegIterator.
296
  class mc_superreg_iterator
297
      : public mc_difflist_iterator<mc_superreg_iterator> {
298
  public:
299
    mc_superreg_iterator(MCRegisterInfo::DiffListIterator Iter)
300
        : mc_difflist_iterator(Iter) {}
301
    mc_superreg_iterator() = default;
302
    mc_superreg_iterator(MCRegister Reg, const MCRegisterInfo *MCRI)
303
        : mc_difflist_iterator(Reg,
304
                               MCRI->DiffLists + MCRI->get(Reg).SuperRegs) {}
305
  };
306
 
307
  /// Return an iterator range over all sub-registers of \p Reg, excluding \p
308
  /// Reg.
309
  iterator_range<mc_subreg_iterator> subregs(MCRegister Reg) const {
310
    return make_range(std::next(mc_subreg_iterator(Reg, this)),
311
                      mc_subreg_iterator::end());
312
  }
313
 
314
  /// Return an iterator range over all sub-registers of \p Reg, including \p
315
  /// Reg.
316
  iterator_range<mc_subreg_iterator> subregs_inclusive(MCRegister Reg) const {
317
    return make_range({Reg, this}, mc_subreg_iterator::end());
318
  }
319
 
320
  /// Return an iterator range over all super-registers of \p Reg, excluding \p
321
  /// Reg.
322
  iterator_range<mc_superreg_iterator> superregs(MCRegister Reg) const {
323
    return make_range(std::next(mc_superreg_iterator(Reg, this)),
324
                      mc_superreg_iterator::end());
325
  }
326
 
327
  /// Return an iterator range over all super-registers of \p Reg, including \p
328
  /// Reg.
329
  iterator_range<mc_superreg_iterator>
330
  superregs_inclusive(MCRegister Reg) const {
331
    return make_range({Reg, this}, mc_superreg_iterator::end());
332
  }
333
 
334
  /// Return an iterator range over all sub- and super-registers of \p Reg,
335
  /// including \p Reg.
336
  detail::concat_range<const MCPhysReg, iterator_range<mc_subreg_iterator>,
337
                       iterator_range<mc_superreg_iterator>>
338
  sub_and_superregs_inclusive(MCRegister Reg) const {
339
    return concat<const MCPhysReg>(subregs_inclusive(Reg), superregs(Reg));
340
  }
341
 
342
  // These iterators are allowed to sub-class DiffListIterator and access
343
  // internal list pointers.
344
  friend class MCSubRegIterator;
345
  friend class MCSubRegIndexIterator;
346
  friend class MCSuperRegIterator;
347
  friend class MCRegUnitIterator;
348
  friend class MCRegUnitMaskIterator;
349
  friend class MCRegUnitRootIterator;
350
 
351
  /// Initialize MCRegisterInfo, called by TableGen
352
  /// auto-generated routines. *DO NOT USE*.
353
  void InitMCRegisterInfo(const MCRegisterDesc *D, unsigned NR, unsigned RA,
354
                          unsigned PC,
355
                          const MCRegisterClass *C, unsigned NC,
356
                          const MCPhysReg (*RURoots)[2],
357
                          unsigned NRU,
358
                          const MCPhysReg *DL,
359
                          const LaneBitmask *RUMS,
360
                          const char *Strings,
361
                          const char *ClassStrings,
362
                          const uint16_t *SubIndices,
363
                          unsigned NumIndices,
364
                          const SubRegCoveredBits *SubIdxRanges,
365
                          const uint16_t *RET) {
366
    Desc = D;
367
    NumRegs = NR;
368
    RAReg = RA;
369
    PCReg = PC;
370
    Classes = C;
371
    DiffLists = DL;
372
    RegUnitMaskSequences = RUMS;
373
    RegStrings = Strings;
374
    RegClassStrings = ClassStrings;
375
    NumClasses = NC;
376
    RegUnitRoots = RURoots;
377
    NumRegUnits = NRU;
378
    SubRegIndices = SubIndices;
379
    NumSubRegIndices = NumIndices;
380
    SubRegIdxRanges = SubIdxRanges;
381
    RegEncodingTable = RET;
382
 
383
    // Initialize DWARF register mapping variables
384
    EHL2DwarfRegs = nullptr;
385
    EHL2DwarfRegsSize = 0;
386
    L2DwarfRegs = nullptr;
387
    L2DwarfRegsSize = 0;
388
    EHDwarf2LRegs = nullptr;
389
    EHDwarf2LRegsSize = 0;
390
    Dwarf2LRegs = nullptr;
391
    Dwarf2LRegsSize = 0;
392
  }
393
 
394
  /// Used to initialize LLVM register to Dwarf
395
  /// register number mapping. Called by TableGen auto-generated routines.
396
  /// *DO NOT USE*.
397
  void mapLLVMRegsToDwarfRegs(const DwarfLLVMRegPair *Map, unsigned Size,
398
                              bool isEH) {
399
    if (isEH) {
400
      EHL2DwarfRegs = Map;
401
      EHL2DwarfRegsSize = Size;
402
    } else {
403
      L2DwarfRegs = Map;
404
      L2DwarfRegsSize = Size;
405
    }
406
  }
407
 
408
  /// Used to initialize Dwarf register to LLVM
409
  /// register number mapping. Called by TableGen auto-generated routines.
410
  /// *DO NOT USE*.
411
  void mapDwarfRegsToLLVMRegs(const DwarfLLVMRegPair *Map, unsigned Size,
412
                              bool isEH) {
413
    if (isEH) {
414
      EHDwarf2LRegs = Map;
415
      EHDwarf2LRegsSize = Size;
416
    } else {
417
      Dwarf2LRegs = Map;
418
      Dwarf2LRegsSize = Size;
419
    }
420
  }
421
 
422
  /// mapLLVMRegToSEHReg - Used to initialize LLVM register to SEH register
423
  /// number mapping. By default the SEH register number is just the same
424
  /// as the LLVM register number.
425
  /// FIXME: TableGen these numbers. Currently this requires target specific
426
  /// initialization code.
427
  void mapLLVMRegToSEHReg(MCRegister LLVMReg, int SEHReg) {
428
    L2SEHRegs[LLVMReg] = SEHReg;
429
  }
430
 
431
  void mapLLVMRegToCVReg(MCRegister LLVMReg, int CVReg) {
432
    L2CVRegs[LLVMReg] = CVReg;
433
  }
434
 
435
  /// This method should return the register where the return
436
  /// address can be found.
437
  MCRegister getRARegister() const {
438
    return RAReg;
439
  }
440
 
441
  /// Return the register which is the program counter.
442
  MCRegister getProgramCounter() const {
443
    return PCReg;
444
  }
445
 
446
  const MCRegisterDesc &operator[](MCRegister RegNo) const {
447
    assert(RegNo < NumRegs &&
448
           "Attempting to access record for invalid register number!");
449
    return Desc[RegNo];
450
  }
451
 
452
  /// Provide a get method, equivalent to [], but more useful with a
453
  /// pointer to this object.
454
  const MCRegisterDesc &get(MCRegister RegNo) const {
455
    return operator[](RegNo);
456
  }
457
 
458
  /// Returns the physical register number of sub-register "Index"
459
  /// for physical register RegNo. Return zero if the sub-register does not
460
  /// exist.
461
  MCRegister getSubReg(MCRegister Reg, unsigned Idx) const;
462
 
463
  /// Return a super-register of the specified register
464
  /// Reg so its sub-register of index SubIdx is Reg.
465
  MCRegister getMatchingSuperReg(MCRegister Reg, unsigned SubIdx,
466
                                 const MCRegisterClass *RC) const;
467
 
468
  /// For a given register pair, return the sub-register index
469
  /// if the second register is a sub-register of the first. Return zero
470
  /// otherwise.
471
  unsigned getSubRegIndex(MCRegister RegNo, MCRegister SubRegNo) const;
472
 
473
  /// Get the size of the bit range covered by a sub-register index.
474
  /// If the index isn't continuous, return the sum of the sizes of its parts.
475
  /// If the index is used to access subregisters of different sizes, return -1.
476
  unsigned getSubRegIdxSize(unsigned Idx) const;
477
 
478
  /// Get the offset of the bit range covered by a sub-register index.
479
  /// If an Offset doesn't make sense (the index isn't continuous, or is used to
480
  /// access sub-registers at different offsets), return -1.
481
  unsigned getSubRegIdxOffset(unsigned Idx) const;
482
 
483
  /// Return the human-readable symbolic target-specific name for the
484
  /// specified physical register.
485
  const char *getName(MCRegister RegNo) const {
486
    return RegStrings + get(RegNo).Name;
487
  }
488
 
489
  /// Return the number of registers this target has (useful for
490
  /// sizing arrays holding per register information)
491
  unsigned getNumRegs() const {
492
    return NumRegs;
493
  }
494
 
495
  /// Return the number of sub-register indices
496
  /// understood by the target. Index 0 is reserved for the no-op sub-register,
497
  /// while 1 to getNumSubRegIndices() - 1 represent real sub-registers.
498
  unsigned getNumSubRegIndices() const {
499
    return NumSubRegIndices;
500
  }
501
 
502
  /// Return the number of (native) register units in the
503
  /// target. Register units are numbered from 0 to getNumRegUnits() - 1. They
504
  /// can be accessed through MCRegUnitIterator defined below.
505
  unsigned getNumRegUnits() const {
506
    return NumRegUnits;
507
  }
508
 
509
  /// Map a target register to an equivalent dwarf register
510
  /// number.  Returns -1 if there is no equivalent value.  The second
511
  /// parameter allows targets to use different numberings for EH info and
512
  /// debugging info.
513
  int getDwarfRegNum(MCRegister RegNum, bool isEH) const;
514
 
515
  /// Map a dwarf register back to a target register. Returns std::nullopt is
516
  /// there is no mapping.
517
  std::optional<unsigned> getLLVMRegNum(unsigned RegNum, bool isEH) const;
518
 
519
  /// Map a target EH register number to an equivalent DWARF register
520
  /// number.
521
  int getDwarfRegNumFromDwarfEHRegNum(unsigned RegNum) const;
522
 
523
  /// Map a target register to an equivalent SEH register
524
  /// number.  Returns LLVM register number if there is no equivalent value.
525
  int getSEHRegNum(MCRegister RegNum) const;
526
 
527
  /// Map a target register to an equivalent CodeView register
528
  /// number.
529
  int getCodeViewRegNum(MCRegister RegNum) const;
530
 
531
  regclass_iterator regclass_begin() const { return Classes; }
532
  regclass_iterator regclass_end() const { return Classes+NumClasses; }
533
  iterator_range<regclass_iterator> regclasses() const {
534
    return make_range(regclass_begin(), regclass_end());
535
  }
536
 
537
  unsigned getNumRegClasses() const {
538
    return (unsigned)(regclass_end()-regclass_begin());
539
  }
540
 
541
  /// Returns the register class associated with the enumeration
542
  /// value.  See class MCOperandInfo.
543
  const MCRegisterClass& getRegClass(unsigned i) const {
544
    assert(i < getNumRegClasses() && "Register Class ID out of range");
545
    return Classes[i];
546
  }
547
 
548
  const char *getRegClassName(const MCRegisterClass *Class) const {
549
    return RegClassStrings + Class->NameIdx;
550
  }
551
 
552
   /// Returns the encoding for RegNo
553
  uint16_t getEncodingValue(MCRegister RegNo) const {
554
    assert(RegNo < NumRegs &&
555
           "Attempting to get encoding for invalid register number!");
556
    return RegEncodingTable[RegNo];
557
  }
558
 
559
  /// Returns true if RegB is a sub-register of RegA.
560
  bool isSubRegister(MCRegister RegA, MCRegister RegB) const {
561
    return isSuperRegister(RegB, RegA);
562
  }
563
 
564
  /// Returns true if RegB is a super-register of RegA.
565
  bool isSuperRegister(MCRegister RegA, MCRegister RegB) const;
566
 
567
  /// Returns true if RegB is a sub-register of RegA or if RegB == RegA.
568
  bool isSubRegisterEq(MCRegister RegA, MCRegister RegB) const {
569
    return isSuperRegisterEq(RegB, RegA);
570
  }
571
 
572
  /// Returns true if RegB is a super-register of RegA or if
573
  /// RegB == RegA.
574
  bool isSuperRegisterEq(MCRegister RegA, MCRegister RegB) const {
575
    return RegA == RegB || isSuperRegister(RegA, RegB);
576
  }
577
 
578
  /// Returns true if RegB is a super-register or sub-register of RegA
579
  /// or if RegB == RegA.
580
  bool isSuperOrSubRegisterEq(MCRegister RegA, MCRegister RegB) const {
581
    return isSubRegisterEq(RegA, RegB) || isSuperRegister(RegA, RegB);
582
  }
583
 
584
  /// Returns true if the two registers are equal or alias each other.
585
  bool regsOverlap(MCRegister RegA, MCRegister RegB) const;
586
};
587
 
588
//===----------------------------------------------------------------------===//
589
//                          Register List Iterators
590
//===----------------------------------------------------------------------===//
591
 
592
// MCRegisterInfo provides lists of super-registers, sub-registers, and
593
// aliasing registers. Use these iterator classes to traverse the lists.
594
 
595
/// MCSubRegIterator enumerates all sub-registers of Reg.
596
/// If IncludeSelf is set, Reg itself is included in the list.
597
class MCSubRegIterator : public MCRegisterInfo::DiffListIterator {
598
public:
599
  MCSubRegIterator(MCRegister Reg, const MCRegisterInfo *MCRI,
600
                   bool IncludeSelf = false) {
601
    init(Reg, MCRI->DiffLists + MCRI->get(Reg).SubRegs);
602
    // Initially, the iterator points to Reg itself.
603
    if (!IncludeSelf)
604
      ++*this;
605
  }
606
};
607
 
608
/// Iterator that enumerates the sub-registers of a Reg and the associated
609
/// sub-register indices.
610
class MCSubRegIndexIterator {
611
  MCSubRegIterator SRIter;
612
  const uint16_t *SRIndex;
613
 
614
public:
615
  /// Constructs an iterator that traverses subregisters and their
616
  /// associated subregister indices.
617
  MCSubRegIndexIterator(MCRegister Reg, const MCRegisterInfo *MCRI)
618
    : SRIter(Reg, MCRI) {
619
    SRIndex = MCRI->SubRegIndices + MCRI->get(Reg).SubRegIndices;
620
  }
621
 
622
  /// Returns current sub-register.
623
  MCRegister getSubReg() const {
624
    return *SRIter;
625
  }
626
 
627
  /// Returns sub-register index of the current sub-register.
628
  unsigned getSubRegIndex() const {
629
    return *SRIndex;
630
  }
631
 
632
  /// Returns true if this iterator is not yet at the end.
633
  bool isValid() const { return SRIter.isValid(); }
634
 
635
  /// Moves to the next position.
636
  void operator++() {
637
    ++SRIter;
638
    ++SRIndex;
639
  }
640
};
641
 
642
/// MCSuperRegIterator enumerates all super-registers of Reg.
643
/// If IncludeSelf is set, Reg itself is included in the list.
644
class MCSuperRegIterator : public MCRegisterInfo::DiffListIterator {
645
public:
646
  MCSuperRegIterator() = default;
647
 
648
  MCSuperRegIterator(MCRegister Reg, const MCRegisterInfo *MCRI,
649
                     bool IncludeSelf = false) {
650
    init(Reg, MCRI->DiffLists + MCRI->get(Reg).SuperRegs);
651
    // Initially, the iterator points to Reg itself.
652
    if (!IncludeSelf)
653
      ++*this;
654
  }
655
};
656
 
657
// Definition for isSuperRegister. Put it down here since it needs the
658
// iterator defined above in addition to the MCRegisterInfo class itself.
659
inline bool MCRegisterInfo::isSuperRegister(MCRegister RegA, MCRegister RegB) const{
660
  for (MCSuperRegIterator I(RegA, this); I.isValid(); ++I)
661
    if (*I == RegB)
662
      return true;
663
  return false;
664
}
665
 
666
//===----------------------------------------------------------------------===//
667
//                               Register Units
668
//===----------------------------------------------------------------------===//
669
 
670
// Register units are used to compute register aliasing. Every register has at
671
// least one register unit, but it can have more. Two registers overlap if and
672
// only if they have a common register unit.
673
//
674
// A target with a complicated sub-register structure will typically have many
675
// fewer register units than actual registers. MCRI::getNumRegUnits() returns
676
// the number of register units in the target.
677
 
678
// MCRegUnitIterator enumerates a list of register units for Reg. The list is
679
// in ascending numerical order.
680
class MCRegUnitIterator : public MCRegisterInfo::DiffListIterator {
681
public:
682
  /// MCRegUnitIterator - Create an iterator that traverses the register units
683
  /// in Reg.
684
  MCRegUnitIterator() = default;
685
 
686
  MCRegUnitIterator(MCRegister Reg, const MCRegisterInfo *MCRI) {
687
    assert(Reg && "Null register has no regunits");
688
    assert(MCRegister::isPhysicalRegister(Reg.id()));
689
    // Decode the RegUnits MCRegisterDesc field.
690
    unsigned RU = MCRI->get(Reg).RegUnits;
691
    unsigned Scale = RU & 15;
692
    unsigned Offset = RU >> 4;
693
 
694
    // Initialize the iterator to Reg * Scale, and the List pointer to
695
    // DiffLists + Offset.
696
    init(Reg * Scale, MCRI->DiffLists + Offset);
697
 
698
    // That may not be a valid unit, we need to advance by one to get the real
699
    // unit number. The first differential can be 0 which would normally
700
    // terminate the list, but since we know every register has at least one
701
    // unit, we can allow a 0 differential here.
702
    advance();
703
  }
704
 
705
  MCRegUnitIterator &operator++() {
706
    MCRegisterInfo::DiffListIterator::operator++();
707
    return *this;
708
  }
709
};
710
 
711
/// MCRegUnitMaskIterator enumerates a list of register units and their
712
/// associated lane masks for Reg. The register units are in ascending
713
/// numerical order.
714
class MCRegUnitMaskIterator {
715
  MCRegUnitIterator RUIter;
716
  const LaneBitmask *MaskListIter;
717
 
718
public:
719
  MCRegUnitMaskIterator() = default;
720
 
721
  /// Constructs an iterator that traverses the register units and their
722
  /// associated LaneMasks in Reg.
723
  MCRegUnitMaskIterator(MCRegister Reg, const MCRegisterInfo *MCRI)
724
    : RUIter(Reg, MCRI) {
725
      uint16_t Idx = MCRI->get(Reg).RegUnitLaneMasks;
726
      MaskListIter = &MCRI->RegUnitMaskSequences[Idx];
727
  }
728
 
729
  /// Returns a (RegUnit, LaneMask) pair.
730
  std::pair<unsigned,LaneBitmask> operator*() const {
731
    return std::make_pair(*RUIter, *MaskListIter);
732
  }
733
 
734
  /// Returns true if this iterator is not yet at the end.
735
  bool isValid() const { return RUIter.isValid(); }
736
 
737
  /// Moves to the next position.
738
  void operator++() {
739
    ++MaskListIter;
740
    ++RUIter;
741
  }
742
};
743
 
744
// Each register unit has one or two root registers. The complete set of
745
// registers containing a register unit is the union of the roots and their
746
// super-registers. All registers aliasing Unit can be visited like this:
747
//
748
//   for (MCRegUnitRootIterator RI(Unit, MCRI); RI.isValid(); ++RI) {
749
//     for (MCSuperRegIterator SI(*RI, MCRI, true); SI.isValid(); ++SI)
750
//       visit(*SI);
751
//    }
752
 
753
/// MCRegUnitRootIterator enumerates the root registers of a register unit.
754
class MCRegUnitRootIterator {
755
  uint16_t Reg0 = 0;
756
  uint16_t Reg1 = 0;
757
 
758
public:
759
  MCRegUnitRootIterator() = default;
760
 
761
  MCRegUnitRootIterator(unsigned RegUnit, const MCRegisterInfo *MCRI) {
762
    assert(RegUnit < MCRI->getNumRegUnits() && "Invalid register unit");
763
    Reg0 = MCRI->RegUnitRoots[RegUnit][0];
764
    Reg1 = MCRI->RegUnitRoots[RegUnit][1];
765
  }
766
 
767
  /// Dereference to get the current root register.
768
  unsigned operator*() const {
769
    return Reg0;
770
  }
771
 
772
  /// Check if the iterator is at the end of the list.
773
  bool isValid() const {
774
    return Reg0;
775
  }
776
 
777
  /// Preincrement to move to the next root register.
778
  void operator++() {
779
    assert(isValid() && "Cannot move off the end of the list.");
780
    Reg0 = Reg1;
781
    Reg1 = 0;
782
  }
783
};
784
 
785
/// MCRegAliasIterator enumerates all registers aliasing Reg.  If IncludeSelf is
786
/// set, Reg itself is included in the list.  This iterator does not guarantee
787
/// any ordering or that entries are unique.
788
class MCRegAliasIterator {
789
private:
790
  MCRegister Reg;
791
  const MCRegisterInfo *MCRI;
792
  bool IncludeSelf;
793
 
794
  MCRegUnitIterator RI;
795
  MCRegUnitRootIterator RRI;
796
  MCSuperRegIterator SI;
797
 
798
public:
799
  MCRegAliasIterator(MCRegister Reg, const MCRegisterInfo *MCRI,
800
                     bool IncludeSelf)
801
    : Reg(Reg), MCRI(MCRI), IncludeSelf(IncludeSelf) {
802
    // Initialize the iterators.
803
    for (RI = MCRegUnitIterator(Reg, MCRI); RI.isValid(); ++RI) {
804
      for (RRI = MCRegUnitRootIterator(*RI, MCRI); RRI.isValid(); ++RRI) {
805
        for (SI = MCSuperRegIterator(*RRI, MCRI, true); SI.isValid(); ++SI) {
806
          if (!(!IncludeSelf && Reg == *SI))
807
            return;
808
        }
809
      }
810
    }
811
  }
812
 
813
  bool isValid() const { return RI.isValid(); }
814
 
815
  MCRegister operator*() const {
816
    assert(SI.isValid() && "Cannot dereference an invalid iterator.");
817
    return *SI;
818
  }
819
 
820
  void advance() {
821
    // Assuming SI is valid.
822
    ++SI;
823
    if (SI.isValid()) return;
824
 
825
    ++RRI;
826
    if (RRI.isValid()) {
827
      SI = MCSuperRegIterator(*RRI, MCRI, true);
828
      return;
829
    }
830
 
831
    ++RI;
832
    if (RI.isValid()) {
833
      RRI = MCRegUnitRootIterator(*RI, MCRI);
834
      SI = MCSuperRegIterator(*RRI, MCRI, true);
835
    }
836
  }
837
 
838
  void operator++() {
839
    assert(isValid() && "Cannot move off the end of the list.");
840
    do advance();
841
    while (!IncludeSelf && isValid() && *SI == Reg);
842
  }
843
};
844
 
845
} // end namespace llvm
846
 
847
#endif // LLVM_MC_MCREGISTERINFO_H