TargetRegisterInfo.h revision 770bcc7b15adbc978800db70dbb1c3c22913b52c
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
19024126ee23e6e4430a77025b61d0e713180f03d3Alkis Evlogimenos#include "llvm/CodeGen/MachineBasicBlock.h"
20a385bf7b6dc9b71024aa4c7bb7026bab3c7ebe91Chris Lattner#include "llvm/CodeGen/ValueTypes.h"
214d0d864be3d9a698c4edfe36961a22126f041298Alkis Evlogimenos#include <cassert>
224d0d864be3d9a698c4edfe36961a22126f041298Alkis Evlogimenos#include <functional>
233d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
26171eed533408a23de0b141af17475fd6b4da72e0Evan Chengclass BitVector;
27198ab640bbb0b8e1cdda518b7f8b348764e4402cChris Lattnerclass MachineFunction;
284188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskeyclass MachineMove;
29171eed533408a23de0b141af17475fd6b4da72e0Evan Chengclass RegScavenger;
30282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman
310f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner/// TargetRegisterDesc - This record contains all of the information known about
320f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner/// a particular register.  The AliasSet field (if not null) contains a pointer
330f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner/// to a Zero terminated array of registers that this register aliases.  This is
3400032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner/// needed for architectures like X86 which have AL alias AX alias EAX.
3500032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner/// Registers that this does not apply to simply should set this to null.
36a92d62c15fa2bf84453489716323b0159912c55dEvan Cheng/// The SubRegs field is a zero terminated array of registers that are
37a92d62c15fa2bf84453489716323b0159912c55dEvan Cheng/// sub-registers of the specific register, e.g. AL, AH are sub-registers of AX.
382036835346ddf983d66b49505bd52db1d3f8b49dEvan Cheng/// The SuperRegs field is a zero terminated array of registers that are
392036835346ddf983d66b49505bd52db1d3f8b49dEvan Cheng/// super-registers of the specific register, e.g. RAX, EAX, are super-registers
402036835346ddf983d66b49505bd52db1d3f8b49dEvan Cheng/// of AX.
413d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner///
420f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattnerstruct TargetRegisterDesc {
4374ab84c31ef64538a1b56e1f282e49303412ad17Bill Wendling  const char     *AsmName;      // Assembly language name for the register
44e6d088acc90e422451e098555d383d4d65b6ce6bBill Wendling  const char     *Name;         // Printable name for the reg (for debugging)
45303603f75876c1cb407002f0a3a110fe4c202b31Chris Lattner  const unsigned *AliasSet;     // Register Alias Set, described above
46a92d62c15fa2bf84453489716323b0159912c55dEvan Cheng  const unsigned *SubRegs;      // Sub-register set, described above
4750aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng  const unsigned *SuperRegs;    // Super-register set, described above
483d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner};
493d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
50282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukmanclass TargetRegisterClass {
51282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukmanpublic:
520f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  typedef const unsigned* iterator;
530f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  typedef const unsigned* const_iterator;
54282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman
5583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  typedef const MVT* vt_iterator;
563b0c0148ed9ec752b240dbea767ad4a9f0a682caEvan Cheng  typedef const TargetRegisterClass* const * sc_iterator;
570f24e33b73542bd7b280550aec6cff32d808e724Chris Lattnerprivate:
5860f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey  unsigned ID;
59c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  bool  isSubClass;
6016d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner  const vt_iterator VTs;
61696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  const sc_iterator SubClasses;
62c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  const sc_iterator SuperClasses;
63f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  const unsigned RegSize, Alignment;    // Size & Alignment of register in bytes
64a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng  const int CopyCost;
650f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  const iterator RegsBegin, RegsEnd;
660f24e33b73542bd7b280550aec6cff32d808e724Chris Lattnerpublic:
6760f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey  TargetRegisterClass(unsigned id,
6883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                      const MVT *vts,
693b0c0148ed9ec752b240dbea767ad4a9f0a682caEvan Cheng                      const TargetRegisterClass * const *subcs,
703b0c0148ed9ec752b240dbea767ad4a9f0a682caEvan Cheng                      const TargetRegisterClass * const *supcs,
71a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng                      unsigned RS, unsigned Al, int CC,
72a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng                      iterator RB, iterator RE)
7360f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey    : ID(id), VTs(vts), SubClasses(subcs), SuperClasses(supcs),
74a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng    RegSize(RS), Alignment(Al), CopyCost(CC), RegsBegin(RB), RegsEnd(RE) {}
750f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  virtual ~TargetRegisterClass() {}     // Allow subclasses
7660f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey
776c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  /// getID() - Return the register class ID number.
786c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  ///
7960f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey  unsigned getID() const { return ID; }
8060f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey
816c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  /// begin/end - Return all of the registers in this class.
826c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  ///
830f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  iterator       begin() const { return RegsBegin; }
840f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  iterator         end() const { return RegsEnd; }
85282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman
866c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  /// getNumRegs - Return the number of registers in this class.
876c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  ///
8834cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  unsigned getNumRegs() const { return (unsigned)(RegsEnd-RegsBegin); }
89f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
906c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  /// getRegister - Return the specified register in the class.
916c8d90d65fa721d406c7a09a0045fa49254a9244Chris Lattner  ///
920f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  unsigned getRegister(unsigned i) const {
930f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner    assert(i < getNumRegs() && "Register number out of range!");
940f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner    return RegsBegin[i];
950f24e33b73542bd7b280550aec6cff32d808e724Chris Lattner  }
96282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman
97f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner  /// contains - Return true if the specified register is included in this
98f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner  /// register class.
99f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner  bool contains(unsigned Reg) const {
100f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner    for (iterator I = begin(), E = end(); I != E; ++I)
101f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner      if (*I == Reg) return true;
102f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner    return false;
103f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner  }
104f02b37da6f956dc9120a0da6ffa643b2753beb41Chris Lattner
1056510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman  /// hasType - return true if this TargetRegisterClass has the ValueType vt.
1066510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman  ///
10783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  bool hasType(MVT vt) const {
1086510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman    for(int i = 0; VTs[i] != MVT::Other; ++i)
1096510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman      if (VTs[i] == vt)
1106510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman        return true;
1116510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman    return false;
1126510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman  }
1136510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman
114696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  /// vt_begin / vt_end - Loop over all of the value types that can be
115696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  /// represented by values in this register class.
11616d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner  vt_iterator vt_begin() const {
11716d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner    return VTs;
11816d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner  }
11916d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner
12016d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner  vt_iterator vt_end() const {
12116d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner    vt_iterator I = VTs;
12216d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner    while (*I != MVT::Other) ++I;
12316d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner    return I;
12416d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner  }
125696736be8b80fe3946f73605b46359345afdf57aEvan Cheng
1261367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  /// hasSubClass - return true if the specified TargetRegisterClass is a
127696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  /// sub-register class of this TargetRegisterClass.
1281367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  bool hasSubClass(const TargetRegisterClass *cs) const {
129696736be8b80fe3946f73605b46359345afdf57aEvan Cheng    for (int i = 0; SubClasses[i] != NULL; ++i)
130696736be8b80fe3946f73605b46359345afdf57aEvan Cheng      if (SubClasses[i] == cs)
131696736be8b80fe3946f73605b46359345afdf57aEvan Cheng        return true;
132696736be8b80fe3946f73605b46359345afdf57aEvan Cheng    return false;
133696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  }
134696736be8b80fe3946f73605b46359345afdf57aEvan Cheng
135696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  /// subclasses_begin / subclasses_end - Loop over all of the sub-classes of
136696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  /// this register class.
137696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  sc_iterator subclasses_begin() const {
138696736be8b80fe3946f73605b46359345afdf57aEvan Cheng    return SubClasses;
139696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  }
14016d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner
141696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  sc_iterator subclasses_end() const {
142696736be8b80fe3946f73605b46359345afdf57aEvan Cheng    sc_iterator I = SubClasses;
143696736be8b80fe3946f73605b46359345afdf57aEvan Cheng    while (*I != NULL) ++I;
144696736be8b80fe3946f73605b46359345afdf57aEvan Cheng    return I;
145696736be8b80fe3946f73605b46359345afdf57aEvan Cheng  }
14616d597a20d405d8cb13f89f15b8c1fed20428808Chris Lattner
1471367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  /// hasSuperClass - return true if the specified TargetRegisterClass is a
148c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  /// super-register class of this TargetRegisterClass.
1491367fd09cb021bae61e7dd2ee208f76574c8e789Christopher Lamb  bool hasSuperClass(const TargetRegisterClass *cs) const {
150c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng    for (int i = 0; SuperClasses[i] != NULL; ++i)
151c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng      if (SuperClasses[i] == cs)
152c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng        return true;
153c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng    return false;
154c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  }
155c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng
156c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  /// superclasses_begin / superclasses_end - Loop over all of the super-classes
157c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  /// of this register class.
158c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  sc_iterator superclasses_begin() const {
159c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng    return SuperClasses;
160c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  }
161c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng
162c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  sc_iterator superclasses_end() const {
163c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng    sc_iterator I = SuperClasses;
164c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng    while (*I != NULL) ++I;
165c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng    return I;
166c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng  }
1678c08d8c77c45d4721e7d3ef746cca9e39b28e379Evan Cheng
1688c08d8c77c45d4721e7d3ef746cca9e39b28e379Evan Cheng  /// isASubClass - return true if this TargetRegisterClass is a sub-class of at
1698c08d8c77c45d4721e7d3ef746cca9e39b28e379Evan Cheng  /// least one other TargetRegisterClass.
1708c08d8c77c45d4721e7d3ef746cca9e39b28e379Evan Cheng  bool isASubClass() const {
1718c08d8c77c45d4721e7d3ef746cca9e39b28e379Evan Cheng    return SuperClasses[0] != 0;
1728c08d8c77c45d4721e7d3ef746cca9e39b28e379Evan Cheng  }
173c3580cace271b0f7d35a25eb285a1cc0d644c30cEvan Cheng
174f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// allocation_order_begin/end - These methods define a range of registers
175f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// which specify the registers in this class that are valid to register
176f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// allocate, and the preferred order to allocate them in.  For example,
177f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// callee saved registers should be at the end of the list, because it is
178f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// cheaper to allocate caller saved registers.
179f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  ///
180f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// These methods take a MachineFunction argument, which can be used to tune
181f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// the allocatable registers based on the characteristics of the function.
182f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// One simple example is that the frame pointer register can be used if
183f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// frame-pointer-elimination is performed.
184f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  ///
185f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// By default, these methods return all registers in the class.
186f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  ///
1875ea64fd9eb0027ad20a66ea29211eef79d8842a0Chris Lattner  virtual iterator allocation_order_begin(const MachineFunction &MF) const {
188f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner    return begin();
189f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  }
1905ea64fd9eb0027ad20a66ea29211eef79d8842a0Chris Lattner  virtual iterator allocation_order_end(const MachineFunction &MF)   const {
191f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner    return end();
192f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  }
19334695381d626485a560594f162701088079589dfMisha Brukman
194f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
195f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
196f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// getSize - Return the size of the register in bytes, which is also the size
197f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// of a stack slot allocated to hold a spilled copy of this register.
198f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  unsigned getSize() const { return RegSize; }
199f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
200f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// getAlignment - Return the minimum required alignment for a register of
201f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// this class.
202f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  unsigned getAlignment() const { return Alignment; }
203a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng
204a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng  /// getCopyCost - Return the cost of copying a value between two registers in
205b3a021cdb3d26ddb2985e326ba0cb96761b86f69Evan Cheng  /// this class. A negative number means the register class is very expensive
206b3a021cdb3d26ddb2985e326ba0cb96761b86f69Evan Cheng  /// to copy e.g. status flag register classes.
207a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng  int getCopyCost() const { return CopyCost; }
208282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman};
209282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman
210282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman
2116f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman/// TargetRegisterInfo base class - We assume that the target defines a static
2126f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman/// array of TargetRegisterDesc objects that represent all of the machine
2136f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman/// registers that the target has.  As such, we simply have to track a pointer
2146f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman/// to this array so that we can turn register number into a register
2156f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman/// descriptor.
2163d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner///
2176f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohmanclass TargetRegisterInfo {
218f4f9c4f1cf4d497c63e40e6c7ef545c8c716a5ceOwen Andersonprotected:
219605041e5a81fbb18769b0613dcd14e0cff32b5eeOwen Anderson  const unsigned* SubregHash;
220605041e5a81fbb18769b0613dcd14e0cff32b5eeOwen Anderson  const unsigned SubregHashSize;
2218797caac84c3012416e933c9c05ad34d75bf4029Chris Lattnerpublic:
2228797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  typedef const TargetRegisterClass * const * regclass_iterator;
2238797caac84c3012416e933c9c05ad34d75bf4029Chris Lattnerprivate:
2240f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner  const TargetRegisterDesc *Desc;             // Pointer to the descriptor array
2258797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  unsigned NumRegs;                           // Number of entries in the array
2268797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
2278797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  regclass_iterator RegClassBegin, RegClassEnd;   // List of regclasses
2288797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
229f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  int CallFrameSetupOpcode, CallFrameDestroyOpcode;
2303d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattnerprotected:
2316f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman  TargetRegisterInfo(const TargetRegisterDesc *D, unsigned NR,
2326f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman                     regclass_iterator RegClassBegin,
2336f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman                     regclass_iterator RegClassEnd,
2346f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman                     int CallFrameSetupOpcode = -1,
235605041e5a81fbb18769b0613dcd14e0cff32b5eeOwen Anderson                     int CallFrameDestroyOpcode = -1,
236605041e5a81fbb18769b0613dcd14e0cff32b5eeOwen Anderson                     const unsigned* subregs = 0,
237605041e5a81fbb18769b0613dcd14e0cff32b5eeOwen Anderson                     const unsigned subregsize = 0);
2386f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman  virtual ~TargetRegisterInfo();
2393d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattnerpublic:
2403d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
241ef6a6a69ff1e1b709d0acb315b9f6c926c67a778Misha Brukman  enum {                        // Define some target independent constants
2421eaf0ac1dc470fb846c16c966d1ffff8213b33efChris Lattner    /// NoRegister - This physical register is not a real target register.  It
2431eaf0ac1dc470fb846c16c966d1ffff8213b33efChris Lattner    /// is useful as a sentinal.
2443d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner    NoRegister = 0,
2453d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
2463d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner    /// FirstVirtualRegister - This is the first register number that is
2473d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner    /// considered to be a 'virtual' register, which is part of the SSA
2483d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner    /// namespace.  This must be the same for all targets, which means that each
2493d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner    /// target is limited to 1024 registers.
250410354fe0c052141dadeca939395743f8dd58e38Chris Lattner    FirstVirtualRegister = 1024
2513d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner  };
2523d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
253bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  /// isPhysicalRegister - Return true if the specified register number is in
254bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  /// the physical register namespace.
255bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  static bool isPhysicalRegister(unsigned Reg) {
25671e353ed3530a5da48c3dd3257c410f6c4ce2e3eAlkis Evlogimenos    assert(Reg && "this is not a register!");
257bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner    return Reg < FirstVirtualRegister;
258bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  }
259bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner
260bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  /// isVirtualRegister - Return true if the specified register number is in
261bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  /// the virtual register namespace.
262bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  static bool isVirtualRegister(unsigned Reg) {
26371e353ed3530a5da48c3dd3257c410f6c4ce2e3eAlkis Evlogimenos    assert(Reg && "this is not a register!");
264bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner    return Reg >= FirstVirtualRegister;
265bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner  }
266bd490d919bd36d2ab956031b524a55dd8519eb64Chris Lattner
267ff110265753c19daf0468ee1facf357460497b7eEvan Cheng  /// getPhysicalRegisterRegClass - Returns the Register Class of a physical
268676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  /// register of the given type. If type is MVT::Other, then just return any
269676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  /// register class the register belongs to.
270676dd7c80b6f91178452535ac45ca58feb23cc42Evan Cheng  const TargetRegisterClass *getPhysicalRegisterRegClass(unsigned Reg,
27183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                                          MVT VT = MVT::Other) const;
272ff110265753c19daf0468ee1facf357460497b7eEvan Cheng
273bb4bdf4fe4c931e45d0a37e24ec79accd815c1d8Alkis Evlogimenos  /// getAllocatableSet - Returns a bitset indexed by register number
274eff03db46d5d1df315cf2aa020ccd7f50ab3848eEvan Cheng  /// indicating if a register is allocatable or not. If a register class is
275eff03db46d5d1df315cf2aa020ccd7f50ab3848eEvan Cheng  /// specified, returns the subset for the class.
276eff03db46d5d1df315cf2aa020ccd7f50ab3848eEvan Cheng  BitVector getAllocatableSet(MachineFunction &MF,
277eff03db46d5d1df315cf2aa020ccd7f50ab3848eEvan Cheng                              const TargetRegisterClass *RC = NULL) const;
278bb4bdf4fe4c931e45d0a37e24ec79accd815c1d8Alkis Evlogimenos
2790f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner  const TargetRegisterDesc &operator[](unsigned RegNo) const {
2803d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner    assert(RegNo < NumRegs &&
2813d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner           "Attempting to access record for invalid register number!");
2823d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner    return Desc[RegNo];
2833d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner  }
2843d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
2853d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner  /// Provide a get method, equivalent to [], but more useful if we have a
2863d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner  /// pointer to this object.
2873d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner  ///
2880f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner  const TargetRegisterDesc &get(unsigned RegNo) const {
2890f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner    return operator[](RegNo);
2900f21fd5204a2627c613340269e2e39e2c8cca659Chris Lattner  }
2913d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
29200032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner  /// getAliasSet - Return the set of registers aliased by the specified
29300032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner  /// register, or a null list of there are none.  The list returned is zero
29400032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner  /// terminated.
29500032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner  ///
29600032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner  const unsigned *getAliasSet(unsigned RegNo) const {
29700032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner    return get(RegNo).AliasSet;
29800032bf6cc236b1fb534f74b1ac288f611a86804Chris Lattner  }
299282ec57c4cdd4574103922487b6f1563b5034fb4Misha Brukman
3008102703d708e5d399926c6ba71ffa49bbd31fc8aEvan Cheng  /// getSubRegisters - Return the list of registers that are sub-registers of
30150aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng  /// the specified register, or a null list of there are none. The list
3028102703d708e5d399926c6ba71ffa49bbd31fc8aEvan Cheng  /// returned is zero terminated and sorted according to super-sub register
3038102703d708e5d399926c6ba71ffa49bbd31fc8aEvan Cheng  /// relations. e.g. X86::RAX's sub-register list is EAX, AX, AL, AH.
304e3e31c22bf7ebed9e8e00ede4f4aa87ce2225528Evan Cheng  ///
305e3e31c22bf7ebed9e8e00ede4f4aa87ce2225528Evan Cheng  const unsigned *getSubRegisters(unsigned RegNo) const {
306e3e31c22bf7ebed9e8e00ede4f4aa87ce2225528Evan Cheng    return get(RegNo).SubRegs;
307e3e31c22bf7ebed9e8e00ede4f4aa87ce2225528Evan Cheng  }
308e3e31c22bf7ebed9e8e00ede4f4aa87ce2225528Evan Cheng
3098102703d708e5d399926c6ba71ffa49bbd31fc8aEvan Cheng  /// getSuperRegisters - Return the list of registers that are super-registers
31050aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng  /// of the specified register, or a null list of there are none. The list
3118102703d708e5d399926c6ba71ffa49bbd31fc8aEvan Cheng  /// returned is zero terminated and sorted according to super-sub register
3128102703d708e5d399926c6ba71ffa49bbd31fc8aEvan Cheng  /// relations. e.g. X86::AL's super-register list is RAX, EAX, AX.
31350aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng  ///
31450aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng  const unsigned *getSuperRegisters(unsigned RegNo) const {
31550aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng    return get(RegNo).SuperRegs;
31650aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng  }
31750aadb96932a0f81ed69f73da6e7c8f8a453ee75Evan Cheng
318e6d088acc90e422451e098555d383d4d65b6ce6bBill Wendling  /// getAsmName - Return the symbolic target-specific name for the
31974ab84c31ef64538a1b56e1f282e49303412ad17Bill Wendling  /// specified physical register.
32074ab84c31ef64538a1b56e1f282e49303412ad17Bill Wendling  const char *getAsmName(unsigned RegNo) const {
32174ab84c31ef64538a1b56e1f282e49303412ad17Bill Wendling    return get(RegNo).AsmName;
32209d4fd57de5ffa254808cc8ae71cd72ab2433911Chris Lattner  }
32309d4fd57de5ffa254808cc8ae71cd72ab2433911Chris Lattner
324e6d088acc90e422451e098555d383d4d65b6ce6bBill Wendling  /// getName - Return the human-readable symbolic target-specific name for the
325e6d088acc90e422451e098555d383d4d65b6ce6bBill Wendling  /// specified physical register.
326e6d088acc90e422451e098555d383d4d65b6ce6bBill Wendling  const char *getName(unsigned RegNo) const {
327e6d088acc90e422451e098555d383d4d65b6ce6bBill Wendling    return get(RegNo).Name;
328181eb737b28628adc4376b973610a02039385026Bill Wendling  }
329181eb737b28628adc4376b973610a02039385026Bill Wendling
3301c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// getNumRegs - Return the number of registers this target has (useful for
3311c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// sizing arrays holding per register information)
33293aa52a8a96c036454be9318bb1c78c9bfb5f390Alkis Evlogimenos  unsigned getNumRegs() const {
33393aa52a8a96c036454be9318bb1c78c9bfb5f390Alkis Evlogimenos    return NumRegs;
33493aa52a8a96c036454be9318bb1c78c9bfb5f390Alkis Evlogimenos  }
33593aa52a8a96c036454be9318bb1c78c9bfb5f390Alkis Evlogimenos
3361c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// areAliases - Returns true if the two registers alias each other, false
3371c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// otherwise
33804319bb2bda50d2ae7cc284cb1c4e742b44a466bAlkis Evlogimenos  bool areAliases(unsigned regA, unsigned regB) const {
33904319bb2bda50d2ae7cc284cb1c4e742b44a466bAlkis Evlogimenos    for (const unsigned *Alias = getAliasSet(regA); *Alias; ++Alias)
3404f02562ec18e4690d46ecbfdaf967806ad072bddChris Lattner      if (*Alias == regB) return true;
34104319bb2bda50d2ae7cc284cb1c4e742b44a466bAlkis Evlogimenos    return false;
34204319bb2bda50d2ae7cc284cb1c4e742b44a466bAlkis Evlogimenos  }
34304319bb2bda50d2ae7cc284cb1c4e742b44a466bAlkis Evlogimenos
3441c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// regsOverlap - Returns true if the two registers are equal or alias each
3451c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// other. The registers may be virtual register.
346b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  bool regsOverlap(unsigned regA, unsigned regB) const {
347b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    if (regA == regB)
348b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      return true;
349b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
350b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    if (isVirtualRegister(regA) || isVirtualRegister(regB))
351b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng      return false;
352b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    return areAliases(regA, regB);
353b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  }
354b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
355b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  /// isSubRegister - Returns true if regB is a sub-register of regA.
356b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  ///
357b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  bool isSubRegister(unsigned regA, unsigned regB) const {
358f4f9c4f1cf4d497c63e40e6c7ef545c8c716a5ceOwen Anderson    // SubregHash is a simple quadratically probed hash table.
35957ce0319b7eb4418aac910d9a094e57d983a64d2Owen Anderson    size_t index = (regA + regB * 37) & (SubregHashSize-1);
360f4f9c4f1cf4d497c63e40e6c7ef545c8c716a5ceOwen Anderson    unsigned ProbeAmt = 2;
361f4f9c4f1cf4d497c63e40e6c7ef545c8c716a5ceOwen Anderson    while (SubregHash[index*2] != 0 &&
362f4f9c4f1cf4d497c63e40e6c7ef545c8c716a5ceOwen Anderson           SubregHash[index*2+1] != 0) {
363f4f9c4f1cf4d497c63e40e6c7ef545c8c716a5ceOwen Anderson      if (SubregHash[index*2] == regA && SubregHash[index*2+1] == regB)
364f4f9c4f1cf4d497c63e40e6c7ef545c8c716a5ceOwen Anderson        return true;
365f4f9c4f1cf4d497c63e40e6c7ef545c8c716a5ceOwen Anderson
36657ce0319b7eb4418aac910d9a094e57d983a64d2Owen Anderson      index = (index + ProbeAmt) & (SubregHashSize-1);
367f4f9c4f1cf4d497c63e40e6c7ef545c8c716a5ceOwen Anderson      ProbeAmt += 2;
368f4f9c4f1cf4d497c63e40e6c7ef545c8c716a5ceOwen Anderson    }
369f4f9c4f1cf4d497c63e40e6c7ef545c8c716a5ceOwen Anderson
370f4f9c4f1cf4d497c63e40e6c7ef545c8c716a5ceOwen Anderson    return false;
371b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  }
372b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng
373b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  /// isSuperRegister - Returns true if regB is a super-register of regA.
374b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  ///
375b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  bool isSuperRegister(unsigned regA, unsigned regB) const {
376b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng    for (const unsigned *SR = getSuperRegisters(regA); *SR; ++SR)
377b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng      if (*SR == regB) return true;
378b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng    return false;
379b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng  }
380b2f2e64c0790db11aea7eb52e2d056527204ee9aEvan Cheng
3810098b3e2b69e527ddcf2ebad7a3081898fa3b4f0Evan Cheng  /// getCalleeSavedRegs - Return a null-terminated list of all of the
3820098b3e2b69e527ddcf2ebad7a3081898fa3b4f0Evan Cheng  /// callee saved registers on this target. The register should be in the
38302569d7355b03155b32c1c0d0e46f6aa957f4802Evan Cheng  /// order of desired callee-save stack frame offset. The first register is
38402569d7355b03155b32c1c0d0e46f6aa957f4802Evan Cheng  /// closed to the incoming stack pointer if stack grows down, and vice versa.
3852365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov  virtual const unsigned* getCalleeSavedRegs(const MachineFunction *MF = 0)
3862365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov                                                                      const = 0;
3878797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
3880098b3e2b69e527ddcf2ebad7a3081898fa3b4f0Evan Cheng  /// getCalleeSavedRegClasses - Return a null-terminated list of the preferred
3890098b3e2b69e527ddcf2ebad7a3081898fa3b4f0Evan Cheng  /// register classes to spill each callee saved register with.  The order and
3902f9dbe8ee6ebe8ec2d72d66dcbd6018918eab018Chris Lattner  /// length of this list match the getCalleeSaveRegs() list.
3912365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov  virtual const TargetRegisterClass* const *getCalleeSavedRegClasses(
3922365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov                                            const MachineFunction *MF) const =0;
3938797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
394b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  /// getReservedRegs - Returns a bitset indexed by physical register number
3951c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// indicating if a register is a special register that has particular uses
3961c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// and should be considered unavailable at all times, e.g. SP, RA. This is
3971c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// used by register scavenger to determine what registers are free.
398b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  virtual BitVector getReservedRegs(const MachineFunction &MF) const = 0;
399b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
4007bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman  /// getSubReg - Returns the physical register number of sub-register "Index"
401dd595c5998214c6ee07ed46f5db551b2abbfbbb3Evan Cheng  /// for physical register RegNo. Return zero if the sub-register does not
402dd595c5998214c6ee07ed46f5db551b2abbfbbb3Evan Cheng  /// exist.
4037bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman  virtual unsigned getSubReg(unsigned RegNo, unsigned Index) const = 0;
4047bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman
4058797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  //===--------------------------------------------------------------------===//
4068797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  // Register Class Information
4078797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  //
4088797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
4098797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  /// Register class iterators
41092988ecdb6ca641ba39d1d1f8cbc57a89b63bbadChris Lattner  ///
4118797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  regclass_iterator regclass_begin() const { return RegClassBegin; }
4128797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  regclass_iterator regclass_end() const { return RegClassEnd; }
4138797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
4148797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  unsigned getNumRegClasses() const {
41534cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng    return (unsigned)(regclass_end()-regclass_begin());
4168797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner  }
41760f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey
41860f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey  /// getRegClass - Returns the register class associated with the enumeration
41960f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey  /// value.  See class TargetOperandInfo.
42060f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey  const TargetRegisterClass *getRegClass(unsigned i) const {
42160f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey    assert(i <= getNumRegClasses() && "Register Class ID out of range");
42260f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey    return i ? RegClassBegin[i - 1] : NULL;
42360f09928a0d22d5927ff0a40fe9163cf1ba1014aJim Laskey  }
4248797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
425770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng  /// getPointerRegClass - Returns a TargetRegisterClass used for pointer
426770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng  /// values.
427770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng  virtual const TargetRegisterClass *getPointerRegClass() const {
428770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng    assert(0 && "Target didn't implement getPointerRegClass!");
429770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng    abort();
430770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng    return 0; // Must return a value in order to compile with VS 2005
431770bcc7b15adbc978800db70dbb1c3c22913b52cEvan Cheng  }
4328797caac84c3012416e933c9c05ad34d75bf4029Chris Lattner
433ff110265753c19daf0468ee1facf357460497b7eEvan Cheng  /// getCrossCopyRegClass - Returns a legal register class to copy a register
434ff110265753c19daf0468ee1facf357460497b7eEvan Cheng  /// in the specified class to or from. Returns NULL if it is possible to copy
435ff110265753c19daf0468ee1facf357460497b7eEvan Cheng  /// between a two registers of the specified class.
436ff110265753c19daf0468ee1facf357460497b7eEvan Cheng  virtual const TargetRegisterClass *
437ff110265753c19daf0468ee1facf357460497b7eEvan Cheng  getCrossCopyRegClass(const TargetRegisterClass *RC) const {
438ff110265753c19daf0468ee1facf357460497b7eEvan Cheng    return NULL;
439ff110265753c19daf0468ee1facf357460497b7eEvan Cheng  }
440ff110265753c19daf0468ee1facf357460497b7eEvan Cheng
4411c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// targetHandlesStackFrameRounding - Returns true if the target is
4421c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// responsible for rounding up the stack frame (probably at emitPrologue
4431c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// time).
44402a20291410a6814c657b69901a57103d4861a07Evan Cheng  virtual bool targetHandlesStackFrameRounding() const {
44502a20291410a6814c657b69901a57103d4861a07Evan Cheng    return false;
44602a20291410a6814c657b69901a57103d4861a07Evan Cheng  }
44702a20291410a6814c657b69901a57103d4861a07Evan Cheng
4481c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// requiresRegisterScavenging - returns true if the target requires (and can
4491c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// make use of) the register scavenger.
45036230cdda48edf6c634f2dcf69f9d78ac5a17377Evan Cheng  virtual bool requiresRegisterScavenging(const MachineFunction &MF) const {
45137f15a6d488d256d371f6c39ab83837bc9c0772dEvan Cheng    return false;
45237f15a6d488d256d371f6c39ab83837bc9c0772dEvan Cheng  }
45337f15a6d488d256d371f6c39ab83837bc9c0772dEvan Cheng
4541c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// hasFP - Return true if the specified function should have a dedicated
4551c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// frame pointer register. For most targets this is true only if the function
4561c08eba3fb44d59176ca1e3bfefce42e7f47d5ecBill Wendling  /// has variable sized allocas or if frame pointer elimination is disabled.
457dc77540d9506dc151d79b94bae88bd841880ef37Evan Cheng  virtual bool hasFP(const MachineFunction &MF) const = 0;
458dc77540d9506dc151d79b94bae88bd841880ef37Evan Cheng
45914f1dd120fc13200697560680999c0efe7ecd714Evan Cheng  // hasReservedCallFrame - Under normal circumstances, when a frame pointer is
46014f1dd120fc13200697560680999c0efe7ecd714Evan Cheng  // not required, we reserve argument space for call sites in the function
46114f1dd120fc13200697560680999c0efe7ecd714Evan Cheng  // immediately on entry to the current function. This eliminates the need for
46214f1dd120fc13200697560680999c0efe7ecd714Evan Cheng  // add/sub sp brackets around call sites. Returns true if the call frame is
46314f1dd120fc13200697560680999c0efe7ecd714Evan Cheng  // included as part of the stack frame.
46414f1dd120fc13200697560680999c0efe7ecd714Evan Cheng  virtual bool hasReservedCallFrame(MachineFunction &MF) const {
46514f1dd120fc13200697560680999c0efe7ecd714Evan Cheng    return !hasFP(MF);
46614f1dd120fc13200697560680999c0efe7ecd714Evan Cheng  }
46714f1dd120fc13200697560680999c0efe7ecd714Evan Cheng
468b5dae003252d8e650a32bfdf33cba5aed8e41e40Dale Johannesen  // needsStackRealignment - true if storage within the function requires the
469b5dae003252d8e650a32bfdf33cba5aed8e41e40Dale Johannesen  // stack pointer to be aligned more than the normal calling convention calls
470b5dae003252d8e650a32bfdf33cba5aed8e41e40Dale Johannesen  // for.
471b5dae003252d8e650a32bfdf33cba5aed8e41e40Dale Johannesen  virtual bool needsStackRealignment(const MachineFunction &MF) const {
472b5dae003252d8e650a32bfdf33cba5aed8e41e40Dale Johannesen    return false;
473b5dae003252d8e650a32bfdf33cba5aed8e41e40Dale Johannesen  }
474b5dae003252d8e650a32bfdf33cba5aed8e41e40Dale Johannesen
475f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// getCallFrameSetup/DestroyOpcode - These methods return the opcode of the
476f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// frame setup/destroy instructions if they exist (-1 otherwise).  Some
477f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// targets use pseudo instructions in order to abstract away the difference
478f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// between operating with a frame pointer and operating without, through the
479f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// use of these two instructions.
480f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  ///
481f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  int getCallFrameSetupOpcode() const { return CallFrameSetupOpcode; }
482f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  int getCallFrameDestroyOpcode() const { return CallFrameDestroyOpcode; }
483f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
484f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// eliminateCallFramePseudoInstr - This method is called during prolog/epilog
485f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// code insertion to eliminate call frame setup and destroy pseudo
486f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// instructions (but only if the Target is using them).  It is responsible
487f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// for eliminating these instructions, replacing them with concrete
488f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// instructions.  This method need only be implemented if using call frame
4898a1478b6d7aeaed8363316d2e0b90d9f53525c29Chris Lattner  /// setup/destroy pseudo instructions.
490f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  ///
49134695381d626485a560594f162701088079589dfMisha Brukman  virtual void
4928604e7572132e8728a1e20d53965bc4ab6986818Chris Lattner  eliminateCallFramePseudoInstr(MachineFunction &MF,
4938604e7572132e8728a1e20d53965bc4ab6986818Chris Lattner                                MachineBasicBlock &MBB,
4948604e7572132e8728a1e20d53965bc4ab6986818Chris Lattner                                MachineBasicBlock::iterator MI) const {
495f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner    assert(getCallFrameSetupOpcode()== -1 && getCallFrameDestroyOpcode()== -1 &&
49600876a2808f1a8061f7e0852c7949fc5074ecb04Misha Brukman           "eliminateCallFramePseudoInstr must be implemented if using"
49700876a2808f1a8061f7e0852c7949fc5074ecb04Misha Brukman           " call frame setup/destroy pseudo instructions!");
498f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner    assert(0 && "Call Frame Pseudo Instructions do not exist on this target!");
499f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  }
500f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
5010098b3e2b69e527ddcf2ebad7a3081898fa3b4f0Evan Cheng  /// processFunctionBeforeCalleeSavedScan - This method is called immediately
50202569d7355b03155b32c1c0d0e46f6aa957f4802Evan Cheng  /// before PrologEpilogInserter scans the physical registers used to determine
5030098b3e2b69e527ddcf2ebad7a3081898fa3b4f0Evan Cheng  /// what callee saved registers should be spilled. This method is optional.
50428b3c45109153bc50d3d9e97dccb25ffd043fa50Evan Cheng  virtual void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
50528b3c45109153bc50d3d9e97dccb25ffd043fa50Evan Cheng                                                RegScavenger *RS = NULL) const {
50628b3c45109153bc50d3d9e97dccb25ffd043fa50Evan Cheng
50702569d7355b03155b32c1c0d0e46f6aa957f4802Evan Cheng  }
50802569d7355b03155b32c1c0d0e46f6aa957f4802Evan Cheng
509f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// processFunctionBeforeFrameFinalized - This method is called immediately
510f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// before the specified functions frame layout (MF.getFrameInfo()) is
511f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// finalized.  Once the frame is finalized, MO_FrameIndex operands are
51202569d7355b03155b32c1c0d0e46f6aa957f4802Evan Cheng  /// replaced with direct constants.  This method is optional.
513f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  ///
5148604e7572132e8728a1e20d53965bc4ab6986818Chris Lattner  virtual void processFunctionBeforeFrameFinalized(MachineFunction &MF) const {
515e668dab5b339df01920b8bff890a70455b7dd27aAlkis Evlogimenos  }
516f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
517f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// eliminateFrameIndex - This method must be overriden to eliminate abstract
518f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// frame indices from instructions which may use them.  The instruction
519f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// referenced by the iterator contains an MO_FrameIndex operand which must be
520f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// eliminated by this method.  This method may modify or replace the
521f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// specified instruction, as long as it keeps the iterator pointing the the
52218b111bffe643b5ad52ae10a1d5728b0c1ac92f0Evan Cheng  /// finished product. SPAdj is the SP adjustment due to call frame setup
5231ad70c09c890c3abcc147503f2e23082f683790cMatthijs Kooijman  /// instruction.
52437f15a6d488d256d371f6c39ab83837bc9c0772dEvan Cheng  virtual void eliminateFrameIndex(MachineBasicBlock::iterator MI,
52518b111bffe643b5ad52ae10a1d5728b0c1ac92f0Evan Cheng                                   int SPAdj, RegScavenger *RS=NULL) const = 0;
526f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner
527f9b332b59d1c008268551572557dca6ab6028a4dChris Lattner  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
528854255361ed5a8f009d64c4869ed2a85cf0d8faeMatthijs Kooijman  /// the function.
5298604e7572132e8728a1e20d53965bc4ab6986818Chris Lattner  virtual void emitPrologue(MachineFunction &MF) const = 0;
5308604e7572132e8728a1e20d53965bc4ab6986818Chris Lattner  virtual void emitEpilogue(MachineFunction &MF,
5318604e7572132e8728a1e20d53965bc4ab6986818Chris Lattner                            MachineBasicBlock &MBB) const = 0;
532f1d78e83356a412e525c30ac90dabf090a8cfc99Jim Laskey
533a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey  //===--------------------------------------------------------------------===//
534a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey  /// Debug information queries.
5354188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey
5364188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  /// getDwarfRegNum - Map a target register to an equivalent dwarf register
537b97aec663b1591e71c9ddee6dbb327d1b827eda5Dale Johannesen  /// number.  Returns -1 if there is no equivalent value.  The second
538b97aec663b1591e71c9ddee6dbb327d1b827eda5Dale Johannesen  /// parameter allows targets to use different numberings for EH info and
5392bbeccdee1937f6cef9f8762595246f447162a4fMatthijs Kooijman  /// debugging info.
540b97aec663b1591e71c9ddee6dbb327d1b827eda5Dale Johannesen  virtual int getDwarfRegNum(unsigned RegNum, bool isEH) const = 0;
541a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey
542a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey  /// getFrameRegister - This method should return the register used as a base
5434188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  /// for values allocated in the current stack frame.
544a99791886d5d4af2b900cd8cc1c9ed1677b6f0f4Jim Laskey  virtual unsigned getFrameRegister(MachineFunction &MF) const = 0;
54572bebb9205c1628601b052d25555aabe6e15e6f4Evan Cheng
54672bebb9205c1628601b052d25555aabe6e15e6f4Evan Cheng  /// getFrameIndexOffset - Returns the displacement from the frame register to
54772bebb9205c1628601b052d25555aabe6e15e6f4Evan Cheng  /// the stack frame of the specified index.
548b8033e821d9ccad10ba8770c4561600a3e9ce6ccEvan Cheng  virtual int getFrameIndexOffset(MachineFunction &MF, int FI) const;
54972bebb9205c1628601b052d25555aabe6e15e6f4Evan Cheng
5504188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  /// getRARegister - This method should return the register where the return
5514188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  /// address can be found.
5524188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  virtual unsigned getRARegister() const = 0;
55362819f31440fe1b1415473a89b8683b5b690d5faJim Laskey
5544188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  /// getInitialFrameState - Returns a list of machine moves that are assumed
5554188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  /// on entry to all functions.  Note that LabelID is ignored (assumed to be
5564188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey  /// the beginning of the function.)
5575e73d5bd2e98afda12fa69a7ea83050c69be0d34Jim Laskey  virtual void getInitialFrameState(std::vector<MachineMove> &Moves) const;
5583d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner};
5593d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner
56094c002a190cd2e3a52b1510bc997e53d63af0b3bChris Lattner// This is useful when building IndexedMaps keyed on virtual registers
5614d0d864be3d9a698c4edfe36961a22126f041298Alkis Evlogimenosstruct VirtReg2IndexFunctor : std::unary_function<unsigned, unsigned> {
5624d0d864be3d9a698c4edfe36961a22126f041298Alkis Evlogimenos  unsigned operator()(unsigned Reg) const {
5636f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman    return Reg - TargetRegisterInfo::FirstVirtualRegister;
5644d0d864be3d9a698c4edfe36961a22126f041298Alkis Evlogimenos  }
5654d0d864be3d9a698c4edfe36961a22126f041298Alkis Evlogimenos};
5664d0d864be3d9a698c4edfe36961a22126f041298Alkis Evlogimenos
567d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
568d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
5693d7771a387d9476cfb25451ab95b72ce7b3e2532Chris Lattner#endif
570