TargetRegisterInfo.h revision 34cd4a484e532cc463fd5a4bf59b88d13c5467c1
16f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman//=== Target/TargetRegisterInfo.h - Target Register Information -*- C++ -*-===//
234695381d626485a560594f162701088079589dfMisha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
734695381d626485a560594f162701088079589dfMisha Brukman//
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===//
93d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner//
103d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner// This file describes an abstract interface used to get information about a
113d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner// target machines register file.  This information is used for a variety of
123d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner// purposed, especially register allocation.
133d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner//
143d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner//===----------------------------------------------------------------------===//
153d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
166f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman#ifndef LLVM_TARGET_TARGETREGISTERINFO_H
176f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman#define LLVM_TARGET_TARGETREGISTERINFO_H
183d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
1966f0f640820b61cf9db814b6d187bae9faf7279cEvan Cheng#include "llvm/ADT/SmallVector.h"
20024126ee23e6e4430a77025b61d0e713180f03d3Alkis Evlogimenos#include "llvm/CodeGen/MachineBasicBlock.h"
21a385bf7b6dc9b71024aa4c7bb7026bab3c7ebe91Chris Lattner#include "llvm/CodeGen/ValueTypes.h"
224d0d864be3d9a698c4edfe36961a22126f041298Alkis Evlogimenos#include <cassert>
234d0d864be3d9a698c4edfe36961a22126f041298Alkis Evlogimenos#include <functional>
243d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
27171eed533408a23de0b141af17475fd6b4da72e0Evan Chengclass BitVector;
28198ab640bbb0b8e1cdda518b7f8b348764e4402cChris Lattnerclass MachineFunction;
29c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenosclass MachineInstr;
304188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskeyclass MachineMove;
31171eed533408a23de0b141af17475fd6b4da72e0Evan Chengclass RegScavenger;
3266f0f640820b61cf9db814b6d187bae9faf7279cEvan Chengclass SDNode;
3366f0f640820b61cf9db814b6d187bae9faf7279cEvan Chengclass SelectionDAG;
342f9dbe8ee6ebe8ec2d72d66dcbd6018918eab018Chris Lattnerclass TargetRegisterClass;
35171eed533408a23de0b141af17475fd6b4da72e0Evan Chengclass Type;
36282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman
370f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner/// TargetRegisterDesc - This record contains all of the information known about
380f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner/// a particular register.  The AliasSet field (if not null) contains a pointer
390f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner/// to a Zero terminated array of registers that this register aliases.  This is
4000032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner/// needed for architectures like X86 which have AL alias AX alias EAX.
4100032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner/// Registers that this does not apply to simply should set this to null.
42a92d62c15fa2bf84453489716323b0159912c55dEvan Cheng/// The SubRegs field is a zero terminated array of registers that are
43a92d62c15fa2bf84453489716323b0159912c55dEvan Cheng/// sub-registers of the specific register, e.g. AL, AH are sub-registers of AX.
44c33aa471300ceaa34870c6ca4973da916dbbfe3aEvan Cheng/// The ImmsubRegs field is a subset of SubRegs. It includes only the immediate
45c33aa471300ceaa34870c6ca4973da916dbbfe3aEvan Cheng/// sub-registers. e.g. EAX has only one immediate sub-register of AX, not AH,
46c33aa471300ceaa34870c6ca4973da916dbbfe3aEvan Cheng/// AL which are immediate sub-registers of AX. The SuperRegs field is a zero
47c33aa471300ceaa34870c6ca4973da916dbbfe3aEvan Cheng/// terminated array of registers that are super-registers of the specific
48c33aa471300ceaa34870c6ca4973da916dbbfe3aEvan Cheng/// register, e.g. RAX, EAX, are super-registers of AX.
493d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner///
500f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattnerstruct TargetRegisterDesc {
5174ab84c31ef64538a1b56e1f282e49303412ad17Bill Wendling  const char     *AsmName;      // Assembly language name for the register
52e6d088acc90e422451e098555d383d4d65b6ce6bBill Wendling  const char     *Name;         // Printable name for the reg (for debugging)
53303603f75876c1cb407002f0a3a110fe4c202b31Chris Lattner  const unsigned *AliasSet;     // Register Alias Set, described above
54a92d62c15fa2bf84453489716323b0159912c55dEvan Cheng  const unsigned *SubRegs;      // Sub-register set, described above
55c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng  const unsigned *ImmSubRegs;   // Immediate sub-register set, described above
5650aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng  const unsigned *SuperRegs;    // Super-register set, described above
573d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner};
583d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
59282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukmanclass TargetRegisterClass {
60282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukmanpublic:
610f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  typedef const unsigned* iterator;
620f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  typedef const unsigned* const_iterator;
63282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman
6416d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner  typedef const MVT::ValueType* vt_iterator;
653b0c0148ed9ec752b240dbea767ad4a9f0a682caEvan Cheng  typedef const TargetRegisterClass* const * sc_iterator;
660f24e33b73542bd7b280550aec6cff32d808e724Chris Lattnerprivate:
6760f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey  unsigned ID;
68c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  bool  isSubClass;
6916d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner  const vt_iterator VTs;
70696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  const sc_iterator SubClasses;
71c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  const sc_iterator SuperClasses;
72a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  const sc_iterator SubRegClasses;
731367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  const sc_iterator SuperRegClasses;
74f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  const unsigned RegSize, Alignment;    // Size & Alignment of register in bytes
75a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng  const int CopyCost;
760f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  const iterator RegsBegin, RegsEnd;
770f24e33b73542bd7b280550aec6cff32d808e724Chris Lattnerpublic:
7860f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey  TargetRegisterClass(unsigned id,
7960f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey                      const MVT::ValueType *vts,
803b0c0148ed9ec752b240dbea767ad4a9f0a682caEvan Cheng                      const TargetRegisterClass * const *subcs,
813b0c0148ed9ec752b240dbea767ad4a9f0a682caEvan Cheng                      const TargetRegisterClass * const *supcs,
82a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb                      const TargetRegisterClass * const *subregcs,
831367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb                      const TargetRegisterClass * const *superregcs,
84a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng                      unsigned RS, unsigned Al, int CC,
85a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng                      iterator RB, iterator RE)
8660f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey    : ID(id), VTs(vts), SubClasses(subcs), SuperClasses(supcs),
871367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb    SubRegClasses(subregcs), SuperRegClasses(superregcs),
88a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng    RegSize(RS), Alignment(Al), CopyCost(CC), RegsBegin(RB), RegsEnd(RE) {}
890f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  virtual ~TargetRegisterClass() {}     // Allow subclasses
9060f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey
916c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  /// getID() - Return the register class ID number.
926c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  ///
9360f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey  unsigned getID() const { return ID; }
9460f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey
956c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  /// begin/end - Return all of the registers in this class.
966c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  ///
970f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  iterator       begin() const { return RegsBegin; }
980f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  iterator         end() const { return RegsEnd; }
99282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman
1006c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  /// getNumRegs - Return the number of registers in this class.
1016c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  ///
10234cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  unsigned getNumRegs() const { return (unsigned)(RegsEnd-RegsBegin); }
103f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
1046c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  /// getRegister - Return the specified register in the class.
1056c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  ///
1060f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  unsigned getRegister(unsigned i) const {
1070f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner    assert(i < getNumRegs() && "Register number out of range!");
1080f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner    return RegsBegin[i];
1090f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  }
110282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman
111f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner  /// contains - Return true if the specified register is included in this
112f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner  /// register class.
113f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner  bool contains(unsigned Reg) const {
114f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner    for (iterator I = begin(), E = end(); I != E; ++I)
115f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner      if (*I == Reg) return true;
116f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner    return false;
117f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner  }
118f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner
1196510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman  /// hasType - return true if this TargetRegisterClass has the ValueType vt.
1206510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman  ///
1216510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman  bool hasType(MVT::ValueType vt) const {
1226510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman    for(int i = 0; VTs[i] != MVT::Other; ++i)
1236510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman      if (VTs[i] == vt)
1246510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman        return true;
1256510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman    return false;
1266510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman  }
1276510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman
128696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  /// vt_begin / vt_end - Loop over all of the value types that can be
129696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  /// represented by values in this register class.
13016d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner  vt_iterator vt_begin() const {
13116d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner    return VTs;
13216d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner  }
13316d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner
13416d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner  vt_iterator vt_end() const {
13516d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner    vt_iterator I = VTs;
13616d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner    while (*I != MVT::Other) ++I;
13716d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner    return I;
13816d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner  }
139696736be8b80fe3946f73605b46359345afdf57aEvan Cheng
1401367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  /// hasSubClass - return true if the specified TargetRegisterClass is a
141696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  /// sub-register class of this TargetRegisterClass.
1421367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  bool hasSubClass(const TargetRegisterClass *cs) const {
143696736be8b80fe3946f73605b46359345afdf57aEvan Cheng    for (int i = 0; SubClasses[i] != NULL; ++i)
144696736be8b80fe3946f73605b46359345afdf57aEvan Cheng      if (SubClasses[i] == cs)
145696736be8b80fe3946f73605b46359345afdf57aEvan Cheng        return true;
146696736be8b80fe3946f73605b46359345afdf57aEvan Cheng    return false;
147696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  }
148696736be8b80fe3946f73605b46359345afdf57aEvan Cheng
149696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  /// subclasses_begin / subclasses_end - Loop over all of the sub-classes of
150696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  /// this register class.
151696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  sc_iterator subclasses_begin() const {
152696736be8b80fe3946f73605b46359345afdf57aEvan Cheng    return SubClasses;
153696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  }
15416d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner
155696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  sc_iterator subclasses_end() const {
156696736be8b80fe3946f73605b46359345afdf57aEvan Cheng    sc_iterator I = SubClasses;
157696736be8b80fe3946f73605b46359345afdf57aEvan Cheng    while (*I != NULL) ++I;
158696736be8b80fe3946f73605b46359345afdf57aEvan Cheng    return I;
159696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  }
16016d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner
1611367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  /// hasSuperClass - return true if the specified TargetRegisterClass is a
162c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  /// super-register class of this TargetRegisterClass.
1631367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  bool hasSuperClass(const TargetRegisterClass *cs) const {
164c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng    for (int i = 0; SuperClasses[i] != NULL; ++i)
165c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng      if (SuperClasses[i] == cs)
166c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng        return true;
167c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng    return false;
168c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  }
169c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng
170c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  /// superclasses_begin / superclasses_end - Loop over all of the super-classes
171c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  /// of this register class.
172c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  sc_iterator superclasses_begin() const {
173c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng    return SuperClasses;
174c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  }
175c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng
176c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  sc_iterator superclasses_end() const {
177c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng    sc_iterator I = SuperClasses;
178c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng    while (*I != NULL) ++I;
179c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng    return I;
180c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  }
181c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng
1821367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  /// hasSubRegClass - return true if the specified TargetRegisterClass is a
183a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  /// class of a sub-register class for this TargetRegisterClass.
1841367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  bool hasSubRegClass(const TargetRegisterClass *cs) const {
185a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb    for (int i = 0; SubRegClasses[i] != NULL; ++i)
186a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb      if (SubRegClasses[i] == cs)
187a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb        return true;
188a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb    return false;
189a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  }
190a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb
191a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  /// hasClassForSubReg - return true if the specified TargetRegisterClass is a
192a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  /// class of a sub-register class for this TargetRegisterClass.
193a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  bool hasClassForSubReg(unsigned SubReg) const {
194a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb    --SubReg;
195a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb    for (unsigned i = 0; SubRegClasses[i] != NULL; ++i)
196a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb      if (i == SubReg)
197a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb        return true;
198a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb    return false;
199a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  }
200a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb
201a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  /// getClassForSubReg - return theTargetRegisterClass for the sub-register
202a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  /// at idx for this TargetRegisterClass.
203a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  sc_iterator getClassForSubReg(unsigned SubReg) const {
204a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb    --SubReg;
205a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb    for (unsigned i = 0; SubRegClasses[i] != NULL; ++i)
206a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb      if (i == SubReg)
207a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb        return &SubRegClasses[i];
2081367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb    assert(0 && "Invalid subregister index for register class");
209a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb    return NULL;
210a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  }
211a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb
212a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  /// subregclasses_begin / subregclasses_end - Loop over all of
213a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  /// the subregister classes of this register class.
214a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  sc_iterator subregclasses_begin() const {
215a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb    return SubRegClasses;
216a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  }
217a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb
218a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  sc_iterator subregclasses_end() const {
219a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb    sc_iterator I = SubRegClasses;
220a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb    while (*I != NULL) ++I;
221a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb    return I;
222a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb  }
223a321125e8b7e50d427d86b8053de2e6793b5df5bChristopher Lamb
2241367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  /// superregclasses_begin / superregclasses_end - Loop over all of
2251367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  /// the superregister classes of this register class.
2261367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  sc_iterator superregclasses_begin() const {
2271367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb    return SuperRegClasses;
2281367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  }
2291367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb
2301367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  sc_iterator superregclasses_end() const {
2311367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb    sc_iterator I = SuperRegClasses;
2321367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb    while (*I != NULL) ++I;
2331367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb    return I;
2341367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  }
2351367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb
236f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// allocation_order_begin/end - These methods define a range of registers
237f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// which specify the registers in this class that are valid to register
238f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// allocate, and the preferred order to allocate them in.  For example,
239f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// callee saved registers should be at the end of the list, because it is
240f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// cheaper to allocate caller saved registers.
241f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  ///
242f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// These methods take a MachineFunction argument, which can be used to tune
243f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// the allocatable registers based on the characteristics of the function.
244f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// One simple example is that the frame pointer register can be used if
245f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// frame-pointer-elimination is performed.
246f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  ///
247f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// By default, these methods return all registers in the class.
248f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  ///
2495ea64fd9eb0027ad20a66ea29211eef79d8842a0Chris Lattner  virtual iterator allocation_order_begin(const MachineFunction &MF) const {
250f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner    return begin();
251f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  }
2525ea64fd9eb0027ad20a66ea29211eef79d8842a0Chris Lattner  virtual iterator allocation_order_end(const MachineFunction &MF)   const {
253f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner    return end();
254f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  }
25534695381d626485a560594f162701088079589dfMisha Brukman
256f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
257f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
258f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// getSize - Return the size of the register in bytes, which is also the size
259f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// of a stack slot allocated to hold a spilled copy of this register.
260f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  unsigned getSize() const { return RegSize; }
261f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
262f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// getAlignment - Return the minimum required alignment for a register of
263f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// this class.
264f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  unsigned getAlignment() const { return Alignment; }
265a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng
266a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng  /// getCopyCost - Return the cost of copying a value between two registers in
267a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng  /// this class.
268a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng  int getCopyCost() const { return CopyCost; }
269282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman};
270282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman
271282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman
2726f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman/// TargetRegisterInfo base class - We assume that the target defines a static
2736f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman/// array of TargetRegisterDesc objects that represent all of the machine
2746f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman/// registers that the target has.  As such, we simply have to track a pointer
2756f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman/// to this array so that we can turn register number into a register
2766f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman/// descriptor.
2773d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner///
2786f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohmanclass TargetRegisterInfo {
2798797caac84c3012416e933c9c05ad34d75bf4029Chris Lattnerpublic:
2808797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  typedef const TargetRegisterClass * const * regclass_iterator;
2818797caac84c3012416e933c9c05ad34d75bf4029Chris Lattnerprivate:
2820f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner  const TargetRegisterDesc *Desc;             // Pointer to the descriptor array
2838797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  unsigned NumRegs;                           // Number of entries in the array
2848797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
2858797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  regclass_iterator RegClassBegin, RegClassEnd;   // List of regclasses
2868797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
287f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  int CallFrameSetupOpcode, CallFrameDestroyOpcode;
2883d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattnerprotected:
2896f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman  TargetRegisterInfo(const TargetRegisterDesc *D, unsigned NR,
2906f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman                     regclass_iterator RegClassBegin,
2916f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman                     regclass_iterator RegClassEnd,
2926f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman                     int CallFrameSetupOpcode = -1,
2936f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman                     int CallFrameDestroyOpcode = -1);
2946f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman  virtual ~TargetRegisterInfo();
2953d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattnerpublic:
2963d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
297ef6a6a69ff1e1b709d0acb315b9f6c926c67a778Misha Brukman  enum {                        // Define some target independent constants
2981eaf0ac1dc470fb846c16c966d1ffff8213b33efChris Lattner    /// NoRegister - This physical register is not a real target register.  It
2991eaf0ac1dc470fb846c16c966d1ffff8213b33efChris Lattner    /// is useful as a sentinal.
3003d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner    NoRegister = 0,
3013d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
3023d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner    /// FirstVirtualRegister - This is the first register number that is
3033d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner    /// considered to be a 'virtual' register, which is part of the SSA
3043d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner    /// namespace.  This must be the same for all targets, which means that each
3053d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner    /// target is limited to 1024 registers.
306410354fe0c052141dadeca939395743f8dd58e38Chris Lattner    FirstVirtualRegister = 1024
3073d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner  };
3083d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
309bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  /// isPhysicalRegister - Return true if the specified register number is in
310bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  /// the physical register namespace.
311bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  static bool isPhysicalRegister(unsigned Reg) {
31271e353ed3530a5da48c3dd3257c410f6c4ce2e3eAlkis Evlogimenos    assert(Reg && "this is not a register!");
313bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner    return Reg < FirstVirtualRegister;
314bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  }
315bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner
316bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  /// isVirtualRegister - Return true if the specified register number is in
317bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  /// the virtual register namespace.
318bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  static bool isVirtualRegister(unsigned Reg) {
31971e353ed3530a5da48c3dd3257c410f6c4ce2e3eAlkis Evlogimenos    assert(Reg && "this is not a register!");
320bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner    return Reg >= FirstVirtualRegister;
321bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  }
322bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner
323ff110265753c19daf0468ee1facf357460497b7eEvan Cheng  /// getPhysicalRegisterRegClass - Returns the Register Class of a physical
324676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  /// register of the given type. If type is MVT::Other, then just return any
325676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  /// register class the register belongs to.
326676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  const TargetRegisterClass *getPhysicalRegisterRegClass(unsigned Reg,
327676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng                                          MVT::ValueType VT = MVT::Other) const;
328ff110265753c19daf0468ee1facf357460497b7eEvan Cheng
329bb4bdf4fe4c931e45d0a37e24ec79accd815c1d8Alkis Evlogimenos  /// getAllocatableSet - Returns a bitset indexed by register number
330eff03db46d5d1df315cf2aa020ccd7f50ab3848eEvan Cheng  /// indicating if a register is allocatable or not. If a register class is
331eff03db46d5d1df315cf2aa020ccd7f50ab3848eEvan Cheng  /// specified, returns the subset for the class.
332eff03db46d5d1df315cf2aa020ccd7f50ab3848eEvan Cheng  BitVector getAllocatableSet(MachineFunction &MF,
333eff03db46d5d1df315cf2aa020ccd7f50ab3848eEvan Cheng                              const TargetRegisterClass *RC = NULL) const;
334bb4bdf4fe4c931e45d0a37e24ec79accd815c1d8Alkis Evlogimenos
3350f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner  const TargetRegisterDesc &operator[](unsigned RegNo) const {
3363d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner    assert(RegNo < NumRegs &&
3373d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner           "Attempting to access record for invalid register number!");
3383d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner    return Desc[RegNo];
3393d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner  }
3403d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
3413d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner  /// Provide a get method, equivalent to [], but more useful if we have a
3423d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner  /// pointer to this object.
3433d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner  ///
3440f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner  const TargetRegisterDesc &get(unsigned RegNo) const {
3450f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner    return operator[](RegNo);
3460f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner  }
3473d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
34800032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner  /// getAliasSet - Return the set of registers aliased by the specified
34900032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner  /// register, or a null list of there are none.  The list returned is zero
35000032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner  /// terminated.
35100032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner  ///
35200032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner  const unsigned *getAliasSet(unsigned RegNo) const {
35300032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner    return get(RegNo).AliasSet;
35400032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner  }
355282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman
3568102703d708e5d399926c6ba71ffa49bbd31fc8aEvan Cheng  /// getSubRegisters - Return the list of registers that are sub-registers of
35750aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng  /// the specified register, or a null list of there are none. The list
3588102703d708e5d399926c6ba71ffa49bbd31fc8aEvan Cheng  /// returned is zero terminated and sorted according to super-sub register
3598102703d708e5d399926c6ba71ffa49bbd31fc8aEvan Cheng  /// relations. e.g. X86::RAX's sub-register list is EAX, AX, AL, AH.
360e3e31c22bf7ebed9e8e00ede4f4aa87ce2225528Evan Cheng  ///
361e3e31c22bf7ebed9e8e00ede4f4aa87ce2225528Evan Cheng  const unsigned *getSubRegisters(unsigned RegNo) const {
362e3e31c22bf7ebed9e8e00ede4f4aa87ce2225528Evan Cheng    return get(RegNo).SubRegs;
363e3e31c22bf7ebed9e8e00ede4f4aa87ce2225528Evan Cheng  }
364e3e31c22bf7ebed9e8e00ede4f4aa87ce2225528Evan Cheng
365c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng  /// getImmediateSubRegisters - Return the set of registers that are immediate
366c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng  /// sub-registers of the specified register, or a null list of there are none.
367c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng  /// The list returned is zero terminated.
368c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng  ///
369c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng  const unsigned *getImmediateSubRegisters(unsigned RegNo) const {
370c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng    return get(RegNo).ImmSubRegs;
371c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng  }
372c4f2fe06946b9037ce82eca309d9f2c631050ceeEvan Cheng
3738102703d708e5d399926c6ba71ffa49bbd31fc8aEvan Cheng  /// getSuperRegisters - Return the list of registers that are super-registers
37450aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng  /// of the specified register, or a null list of there are none. The list
3758102703d708e5d399926c6ba71ffa49bbd31fc8aEvan Cheng  /// returned is zero terminated and sorted according to super-sub register
3768102703d708e5d399926c6ba71ffa49bbd31fc8aEvan Cheng  /// relations. e.g. X86::AL's super-register list is RAX, EAX, AX.
37750aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng  ///
37850aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng  const unsigned *getSuperRegisters(unsigned RegNo) const {
37950aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng    return get(RegNo).SuperRegs;
38050aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng  }
38150aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng
382e6d088acc90e422451e098555d383d4d65b6ce6bBill Wendling  /// getAsmName - Return the symbolic target-specific name for the
38374ab84c31ef64538a1b56e1f282e49303412ad17Bill Wendling  /// specified physical register.
38474ab84c31ef64538a1b56e1f282e49303412ad17Bill Wendling  const char *getAsmName(unsigned RegNo) const {
38574ab84c31ef64538a1b56e1f282e49303412ad17Bill Wendling    return get(RegNo).AsmName;
38609d4fd57de5ffa254808cc8ae71cd72ab2433911Chris Lattner  }
38709d4fd57de5ffa254808cc8ae71cd72ab2433911Chris Lattner
388e6d088acc90e422451e098555d383d4d65b6ce6bBill Wendling  /// getName - Return the human-readable symbolic target-specific name for the
389e6d088acc90e422451e098555d383d4d65b6ce6bBill Wendling  /// specified physical register.
390e6d088acc90e422451e098555d383d4d65b6ce6bBill Wendling  const char *getName(unsigned RegNo) const {
391e6d088acc90e422451e098555d383d4d65b6ce6bBill Wendling    return get(RegNo).Name;
392181eb737b28628adc4376b973610a02039385026Bill Wendling  }
393181eb737b28628adc4376b973610a02039385026Bill Wendling
3941c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// getNumRegs - Return the number of registers this target has (useful for
3951c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// sizing arrays holding per register information)
39693aa52a8a96c036454be9318bb1c78c9bfb5f390Alkis Evlogimenos  unsigned getNumRegs() const {
39793aa52a8a96c036454be9318bb1c78c9bfb5f390Alkis Evlogimenos    return NumRegs;
39893aa52a8a96c036454be9318bb1c78c9bfb5f390Alkis Evlogimenos  }
39993aa52a8a96c036454be9318bb1c78c9bfb5f390Alkis Evlogimenos
4001c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// areAliases - Returns true if the two registers alias each other, false
4011c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// otherwise
40204319bb2bda50d2ae7cc284cb1c4e742b44a466bAlkis Evlogimenos  bool areAliases(unsigned regA, unsigned regB) const {
40304319bb2bda50d2ae7cc284cb1c4e742b44a466bAlkis Evlogimenos    for (const unsigned *Alias = getAliasSet(regA); *Alias; ++Alias)
4044f02562ec18e4690d46ecbfdaf967806ad072bddChris Lattner      if (*Alias == regB) return true;
40504319bb2bda50d2ae7cc284cb1c4e742b44a466bAlkis Evlogimenos    return false;
40604319bb2bda50d2ae7cc284cb1c4e742b44a466bAlkis Evlogimenos  }
40704319bb2bda50d2ae7cc284cb1c4e742b44a466bAlkis Evlogimenos
4081c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// regsOverlap - Returns true if the two registers are equal or alias each
4091c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// other. The registers may be virtual register.
410b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  bool regsOverlap(unsigned regA, unsigned regB) const {
411b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    if (regA == regB)
412b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      return true;
413b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
414b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    if (isVirtualRegister(regA) || isVirtualRegister(regB))
415b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      return false;
416b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    return areAliases(regA, regB);
417b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  }
418b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
419b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  /// isSubRegister - Returns true if regB is a sub-register of regA.
420b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  ///
421b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  bool isSubRegister(unsigned regA, unsigned regB) const {
422b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng    for (const unsigned *SR = getSubRegisters(regA); *SR; ++SR)
423b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng      if (*SR == regB) return true;
424b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng    return false;
425b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  }
426b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng
427b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  /// isSuperRegister - Returns true if regB is a super-register of regA.
428b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  ///
429b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  bool isSuperRegister(unsigned regA, unsigned regB) const {
430b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng    for (const unsigned *SR = getSuperRegisters(regA); *SR; ++SR)
431b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng      if (*SR == regB) return true;
432b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng    return false;
433b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  }
434b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng
4350098b3e2b69e527ddcf2ebad7a3081898fa3b4f0Evan Cheng  /// getCalleeSavedRegs - Return a null-terminated list of all of the
4360098b3e2b69e527ddcf2ebad7a3081898fa3b4f0Evan Cheng  /// callee saved registers on this target. The register should be in the
43702569d7355b03155b32c1c0d0e46f6aa957f4802Evan Cheng  /// order of desired callee-save stack frame offset. The first register is
43802569d7355b03155b32c1c0d0e46f6aa957f4802Evan Cheng  /// closed to the incoming stack pointer if stack grows down, and vice versa.
4392365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov  virtual const unsigned* getCalleeSavedRegs(const MachineFunction *MF = 0)
4402365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov                                                                      const = 0;
4418797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
4420098b3e2b69e527ddcf2ebad7a3081898fa3b4f0Evan Cheng  /// getCalleeSavedRegClasses - Return a null-terminated list of the preferred
4430098b3e2b69e527ddcf2ebad7a3081898fa3b4f0Evan Cheng  /// register classes to spill each callee saved register with.  The order and
4442f9dbe8ee6ebe8ec2d72d66dcbd6018918eab018Chris Lattner  /// length of this list match the getCalleeSaveRegs() list.
4452365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov  virtual const TargetRegisterClass* const *getCalleeSavedRegClasses(
4462365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov                                            const MachineFunction *MF) const =0;
4478797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
448b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  /// getReservedRegs - Returns a bitset indexed by physical register number
4491c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// indicating if a register is a special register that has particular uses
4501c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// and should be considered unavailable at all times, e.g. SP, RA. This is
4511c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// used by register scavenger to determine what registers are free.
452b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  virtual BitVector getReservedRegs(const MachineFunction &MF) const = 0;
453b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
4547bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman  /// getSubReg - Returns the physical register number of sub-register "Index"
4557bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman  /// for physical register RegNo.
4567bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman  virtual unsigned getSubReg(unsigned RegNo, unsigned Index) const = 0;
4577bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman
4588797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  //===--------------------------------------------------------------------===//
4598797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  // Register Class Information
4608797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  //
4618797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
4628797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  /// Register class iterators
46392988ecdb6ca641ba39d1d1f8cbc57a89b63bbadChris Lattner  ///
4648797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  regclass_iterator regclass_begin() const { return RegClassBegin; }
4658797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  regclass_iterator regclass_end() const { return RegClassEnd; }
4668797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
4678797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  unsigned getNumRegClasses() const {
46834cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng    return (unsigned)(regclass_end()-regclass_begin());
4698797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  }
47060f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey
47160f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey  /// getRegClass - Returns the register class associated with the enumeration
47260f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey  /// value.  See class TargetOperandInfo.
47360f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey  const TargetRegisterClass *getRegClass(unsigned i) const {
47460f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey    assert(i <= getNumRegClasses() && "Register Class ID out of range");
47560f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey    return i ? RegClassBegin[i - 1] : NULL;
47660f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey  }
4778797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
4788797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  //===--------------------------------------------------------------------===//
4794dad76cea0a85f62e016636b5b59d0bc4a7411dcAlkis Evlogimenos  // Interfaces used by the register allocator and stack frame
4804dad76cea0a85f62e016636b5b59d0bc4a7411dcAlkis Evlogimenos  // manipulation passes to move data around between registers,
4813bca110dc35a930b28dd9e05105b52e9cd3c98eeChris Lattner  // immediates and memory.  FIXME: Move these to TargetInstrInfo.h.
4828797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  //
4838797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
484ff110265753c19daf0468ee1facf357460497b7eEvan Cheng  /// getCrossCopyRegClass - Returns a legal register class to copy a register
485ff110265753c19daf0468ee1facf357460497b7eEvan Cheng  /// in the specified class to or from. Returns NULL if it is possible to copy
486ff110265753c19daf0468ee1facf357460497b7eEvan Cheng  /// between a two registers of the specified class.
487ff110265753c19daf0468ee1facf357460497b7eEvan Cheng  virtual const TargetRegisterClass *
488ff110265753c19daf0468ee1facf357460497b7eEvan Cheng  getCrossCopyRegClass(const TargetRegisterClass *RC) const {
489ff110265753c19daf0468ee1facf357460497b7eEvan Cheng    return NULL;
490ff110265753c19daf0468ee1facf357460497b7eEvan Cheng  }
491ff110265753c19daf0468ee1facf357460497b7eEvan Cheng
4921c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// targetHandlesStackFrameRounding - Returns true if the target is
4931c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// responsible for rounding up the stack frame (probably at emitPrologue
4941c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// time).
49502a20291410a6814c657b69901a57103d4861a07Evan Cheng  virtual bool targetHandlesStackFrameRounding() const {
49602a20291410a6814c657b69901a57103d4861a07Evan Cheng    return false;
49702a20291410a6814c657b69901a57103d4861a07Evan Cheng  }
49802a20291410a6814c657b69901a57103d4861a07Evan Cheng
4991c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// requiresRegisterScavenging - returns true if the target requires (and can
5001c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// make use of) the register scavenger.
50136230cdda48edf6c634f2dcf69f9d78ac5a17377Evan Cheng  virtual bool requiresRegisterScavenging(const MachineFunction &MF) const {
50237f15a6d488d256d371f6c39ab83837bc9c0772dEvan Cheng    return false;
50337f15a6d488d256d371f6c39ab83837bc9c0772dEvan Cheng  }
50437f15a6d488d256d371f6c39ab83837bc9c0772dEvan Cheng
5051c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// hasFP - Return true if the specified function should have a dedicated
5061c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// frame pointer register. For most targets this is true only if the function
5071c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// has variable sized allocas or if frame pointer elimination is disabled.
508dc77540d9506dc151d79b94bae88bd841880ef37Evan Cheng  virtual bool hasFP(const MachineFunction &MF) const = 0;
509dc77540d9506dc151d79b94bae88bd841880ef37Evan Cheng
51014f1dd120fc13200697560680999c0efe7ecd714Evan Cheng  // hasReservedCallFrame - Under normal circumstances, when a frame pointer is
51114f1dd120fc13200697560680999c0efe7ecd714Evan Cheng  // not required, we reserve argument space for call sites in the function
51214f1dd120fc13200697560680999c0efe7ecd714Evan Cheng  // immediately on entry to the current function. This eliminates the need for
51314f1dd120fc13200697560680999c0efe7ecd714Evan Cheng  // add/sub sp brackets around call sites. Returns true if the call frame is
51414f1dd120fc13200697560680999c0efe7ecd714Evan Cheng  // included as part of the stack frame.
51514f1dd120fc13200697560680999c0efe7ecd714Evan Cheng  virtual bool hasReservedCallFrame(MachineFunction &MF) const {
51614f1dd120fc13200697560680999c0efe7ecd714Evan Cheng    return !hasFP(MF);
51714f1dd120fc13200697560680999c0efe7ecd714Evan Cheng  }
51814f1dd120fc13200697560680999c0efe7ecd714Evan Cheng
519f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// getCallFrameSetup/DestroyOpcode - These methods return the opcode of the
520f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// frame setup/destroy instructions if they exist (-1 otherwise).  Some
521f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// targets use pseudo instructions in order to abstract away the difference
522f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// between operating with a frame pointer and operating without, through the
523f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// use of these two instructions.
524f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  ///
525f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  int getCallFrameSetupOpcode() const { return CallFrameSetupOpcode; }
526f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  int getCallFrameDestroyOpcode() const { return CallFrameDestroyOpcode; }
527f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
528f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
529f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// eliminateCallFramePseudoInstr - This method is called during prolog/epilog
530f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// code insertion to eliminate call frame setup and destroy pseudo
531f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// instructions (but only if the Target is using them).  It is responsible
532f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// for eliminating these instructions, replacing them with concrete
533f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// instructions.  This method need only be implemented if using call frame
5348a1478b6d7aeaed8363316d2e0b90d9f53525c29Chris Lattner  /// setup/destroy pseudo instructions.
535f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  ///
53634695381d626485a560594f162701088079589dfMisha Brukman  virtual void
5378604e7572132e8728a1e20d53965bc4ab6986818Chris Lattner  eliminateCallFramePseudoInstr(MachineFunction &MF,
5388604e7572132e8728a1e20d53965bc4ab6986818Chris Lattner                                MachineBasicBlock &MBB,
5398604e7572132e8728a1e20d53965bc4ab6986818Chris Lattner                                MachineBasicBlock::iterator MI) const {
540f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner    assert(getCallFrameSetupOpcode()== -1 && getCallFrameDestroyOpcode()== -1 &&
54100876a2808f1a8061f7e0852c7949fc5074ecb04Misha Brukman           "eliminateCallFramePseudoInstr must be implemented if using"
54200876a2808f1a8061f7e0852c7949fc5074ecb04Misha Brukman           " call frame setup/destroy pseudo instructions!");
543f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner    assert(0 && "Call Frame Pseudo Instructions do not exist on this target!");
544f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  }
545f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
5460098b3e2b69e527ddcf2ebad7a3081898fa3b4f0Evan Cheng  /// processFunctionBeforeCalleeSavedScan - This method is called immediately
54702569d7355b03155b32c1c0d0e46f6aa957f4802Evan Cheng  /// before PrologEpilogInserter scans the physical registers used to determine
5480098b3e2b69e527ddcf2ebad7a3081898fa3b4f0Evan Cheng  /// what callee saved registers should be spilled. This method is optional.
54928b3c45109153bc50d3d9e97dccb25ffd043fa50Evan Cheng  virtual void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
55028b3c45109153bc50d3d9e97dccb25ffd043fa50Evan Cheng                                                RegScavenger *RS = NULL) const {
55128b3c45109153bc50d3d9e97dccb25ffd043fa50Evan Cheng
55202569d7355b03155b32c1c0d0e46f6aa957f4802Evan Cheng  }
55302569d7355b03155b32c1c0d0e46f6aa957f4802Evan Cheng
554f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// processFunctionBeforeFrameFinalized - This method is called immediately
555f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// before the specified functions frame layout (MF.getFrameInfo()) is
556f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// finalized.  Once the frame is finalized, MO_FrameIndex operands are
55702569d7355b03155b32c1c0d0e46f6aa957f4802Evan Cheng  /// replaced with direct constants.  This method is optional.
558f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  ///
5598604e7572132e8728a1e20d53965bc4ab6986818Chris Lattner  virtual void processFunctionBeforeFrameFinalized(MachineFunction &MF) const {
560e668dab5b339df01920b8bff890a70455b7dd27aAlkis Evlogimenos  }
561f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
562f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// eliminateFrameIndex - This method must be overriden to eliminate abstract
563f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// frame indices from instructions which may use them.  The instruction
564f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// referenced by the iterator contains an MO_FrameIndex operand which must be
565f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// eliminated by this method.  This method may modify or replace the
566f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// specified instruction, as long as it keeps the iterator pointing the the
56718b111bffe643b5ad52ae10a1d5728b0c1ac92f0Evan Cheng  /// finished product. SPAdj is the SP adjustment due to call frame setup
56818b111bffe643b5ad52ae10a1d5728b0c1ac92f0Evan Cheng  /// instruction. The return value is the number of instructions added to
56918b111bffe643b5ad52ae10a1d5728b0c1ac92f0Evan Cheng  /// (negative if removed from) the basic block.
570f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  ///
57137f15a6d488d256d371f6c39ab83837bc9c0772dEvan Cheng  virtual void eliminateFrameIndex(MachineBasicBlock::iterator MI,
57218b111bffe643b5ad52ae10a1d5728b0c1ac92f0Evan Cheng                                   int SPAdj, RegScavenger *RS=NULL) const = 0;
573f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
574f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
575e668dab5b339df01920b8bff890a70455b7dd27aAlkis Evlogimenos  /// the function. The return value is the number of instructions
5764dad76cea0a85f62e016636b5b59d0bc4a7411dcAlkis Evlogimenos  /// added to (negative if removed from) the basic block (entry for prologue).
5774dad76cea0a85f62e016636b5b59d0bc4a7411dcAlkis Evlogimenos  ///
5788604e7572132e8728a1e20d53965bc4ab6986818Chris Lattner  virtual void emitPrologue(MachineFunction &MF) const = 0;
5798604e7572132e8728a1e20d53965bc4ab6986818Chris Lattner  virtual void emitEpilogue(MachineFunction &MF,
5808604e7572132e8728a1e20d53965bc4ab6986818Chris Lattner                            MachineBasicBlock &MBB) const = 0;
581f1d78e83356a412e525c30ac90dabf090a8cfc99Jim Laskey
582a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey  //===--------------------------------------------------------------------===//
583a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey  /// Debug information queries.
5844188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey
5854188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  /// getDwarfRegNum - Map a target register to an equivalent dwarf register
586b97aec663b1591e71c9ddee6dbb327d1b827eda5Dale Johannesen  /// number.  Returns -1 if there is no equivalent value.  The second
587b97aec663b1591e71c9ddee6dbb327d1b827eda5Dale Johannesen  /// parameter allows targets to use different numberings for EH info and
588b97aec663b1591e71c9ddee6dbb327d1b827eda5Dale Johannesen  /// deubgging info.
589b97aec663b1591e71c9ddee6dbb327d1b827eda5Dale Johannesen  virtual int getDwarfRegNum(unsigned RegNum, bool isEH) const = 0;
590a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey
591a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey  /// getFrameRegister - This method should return the register used as a base
5924188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  /// for values allocated in the current stack frame.
593a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey  virtual unsigned getFrameRegister(MachineFunction &MF) const = 0;
59472bebb9205c1628601b052d25555aabe6e15e6f4Evan Cheng
59572bebb9205c1628601b052d25555aabe6e15e6f4Evan Cheng  /// getFrameIndexOffset - Returns the displacement from the frame register to
59672bebb9205c1628601b052d25555aabe6e15e6f4Evan Cheng  /// the stack frame of the specified index.
597b8033e821d9ccad10ba8770c4561600a3e9ce6ccEvan Cheng  virtual int getFrameIndexOffset(MachineFunction &MF, int FI) const;
59872bebb9205c1628601b052d25555aabe6e15e6f4Evan Cheng
5994188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  /// getRARegister - This method should return the register where the return
6004188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  /// address can be found.
6014188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  virtual unsigned getRARegister() const = 0;
60262819f31440fe1b1415473a89b8683b5b690d5faJim Laskey
6034188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  /// getInitialFrameState - Returns a list of machine moves that are assumed
6044188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  /// on entry to all functions.  Note that LabelID is ignored (assumed to be
6054188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  /// the beginning of the function.)
6065e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey  virtual void getInitialFrameState(std::vector<MachineMove> &Moves) const;
6073d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner};
6083d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
60994c002a190cd2e3a52b1510bc997e53d63af0b3bChris Lattner// This is useful when building IndexedMaps keyed on virtual registers
6104d0d864be3d9a698c4edfe36961a22126f041298Alkis Evlogimenosstruct VirtReg2IndexFunctor : std::unary_function<unsigned, unsigned> {
6114d0d864be3d9a698c4edfe36961a22126f041298Alkis Evlogimenos  unsigned operator()(unsigned Reg) const {
6126f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman    return Reg - TargetRegisterInfo::FirstVirtualRegister;
6134d0d864be3d9a698c4edfe36961a22126f041298Alkis Evlogimenos  }
6144d0d864be3d9a698c4edfe36961a22126f041298Alkis Evlogimenos};
6154d0d864be3d9a698c4edfe36961a22126f041298Alkis Evlogimenos
616d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
617d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
6183d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner#endif
619