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 |