LLVM API Documentation

TargetRegisterInfo.h

Go to the documentation of this file.
00001 //=== Target/TargetRegisterInfo.h - Target Register Information -*- C++ -*-===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This file describes an abstract interface used to get information about a
00011 // target machines register file.  This information is used for a variety of
00012 // purposed, especially register allocation.
00013 //
00014 //===----------------------------------------------------------------------===//
00015 
00016 #ifndef LLVM_TARGET_TARGETREGISTERINFO_H
00017 #define LLVM_TARGET_TARGETREGISTERINFO_H
00018 
00019 #include "llvm/CodeGen/MachineBasicBlock.h"
00020 #include "llvm/CodeGen/ValueTypes.h"
00021 #include <cassert>
00022 #include <functional>
00023 
00024 namespace llvm {
00025 
00026 class BitVector;
00027 class MachineFunction;
00028 class MachineMove;
00029 class RegScavenger;
00030 
00031 /// TargetRegisterDesc - This record contains all of the information known about
00032 /// a particular register.  The AliasSet field (if not null) contains a pointer
00033 /// to a Zero terminated array of registers that this register aliases.  This is
00034 /// needed for architectures like X86 which have AL alias AX alias EAX.
00035 /// Registers that this does not apply to simply should set this to null.
00036 /// The SubRegs field is a zero terminated array of registers that are
00037 /// sub-registers of the specific register, e.g. AL, AH are sub-registers of AX.
00038 /// The SuperRegs field is a zero terminated array of registers that are
00039 /// super-registers of the specific register, e.g. RAX, EAX, are super-registers
00040 /// of AX.
00041 ///
00042 struct TargetRegisterDesc {
00043   const char     *AsmName;      // Assembly language name for the register
00044   const char     *Name;         // Printable name for the reg (for debugging)
00045   const unsigned *AliasSet;     // Register Alias Set, described above
00046   const unsigned *SubRegs;      // Sub-register set, described above
00047   const unsigned *SuperRegs;    // Super-register set, described above
00048 };
00049 
00050 class TargetRegisterClass {
00051 public:
00052   typedef const unsigned* iterator;
00053   typedef const unsigned* const_iterator;
00054 
00055   typedef const MVT* vt_iterator;
00056   typedef const TargetRegisterClass* const * sc_iterator;
00057 private:
00058   unsigned ID;
00059   bool  isSubClass;
00060   const vt_iterator VTs;
00061   const sc_iterator SubClasses;
00062   const sc_iterator SuperClasses;
00063   const sc_iterator SubRegClasses;
00064   const sc_iterator SuperRegClasses;
00065   const unsigned RegSize, Alignment;    // Size & Alignment of register in bytes
00066   const int CopyCost;
00067   const iterator RegsBegin, RegsEnd;
00068 public:
00069   TargetRegisterClass(unsigned id,
00070                       const MVT *vts,
00071                       const TargetRegisterClass * const *subcs,
00072                       const TargetRegisterClass * const *supcs,
00073                       const TargetRegisterClass * const *subregcs,
00074                       const TargetRegisterClass * const *superregcs,
00075                       unsigned RS, unsigned Al, int CC,
00076                       iterator RB, iterator RE)
00077     : ID(id), VTs(vts), SubClasses(subcs), SuperClasses(supcs),
00078     SubRegClasses(subregcs), SuperRegClasses(superregcs),
00079     RegSize(RS), Alignment(Al), CopyCost(CC), RegsBegin(RB), RegsEnd(RE) {}
00080   virtual ~TargetRegisterClass() {}     // Allow subclasses
00081   
00082   /// getID() - Return the register class ID number.
00083   ///
00084   unsigned getID() const { return ID; }
00085   
00086   /// begin/end - Return all of the registers in this class.
00087   ///
00088   iterator       begin() const { return RegsBegin; }
00089   iterator         end() const { return RegsEnd; }
00090 
00091   /// getNumRegs - Return the number of registers in this class.
00092   ///
00093   unsigned getNumRegs() const { return (unsigned)(RegsEnd-RegsBegin); }
00094 
00095   /// getRegister - Return the specified register in the class.
00096   ///
00097   unsigned getRegister(unsigned i) const {
00098     assert(i < getNumRegs() && "Register number out of range!");
00099     return RegsBegin[i];
00100   }
00101 
00102   /// contains - Return true if the specified register is included in this
00103   /// register class.
00104   bool contains(unsigned Reg) const {
00105     for (iterator I = begin(), E = end(); I != E; ++I)
00106       if (*I == Reg) return true;
00107     return false;
00108   }
00109 
00110   /// hasType - return true if this TargetRegisterClass has the ValueType vt.
00111   ///
00112   bool hasType(MVT vt) const {
00113     for(int i = 0; VTs[i] != MVT::Other; ++i)
00114       if (VTs[i] == vt)
00115         return true;
00116     return false;
00117   }
00118   
00119   /// vt_begin / vt_end - Loop over all of the value types that can be
00120   /// represented by values in this register class.
00121   vt_iterator vt_begin() const {
00122     return VTs;
00123   }
00124 
00125   vt_iterator vt_end() const {
00126     vt_iterator I = VTs;
00127     while (*I != MVT::Other) ++I;
00128     return I;
00129   }
00130 
00131   /// hasSubClass - return true if the specified TargetRegisterClass is a
00132   /// sub-register class of this TargetRegisterClass.
00133   bool hasSubClass(const TargetRegisterClass *cs) const {
00134     for (int i = 0; SubClasses[i] != NULL; ++i) 
00135       if (SubClasses[i] == cs)
00136         return true;
00137     return false;
00138   }
00139 
00140   /// subclasses_begin / subclasses_end - Loop over all of the sub-classes of
00141   /// this register class.
00142   sc_iterator subclasses_begin() const {
00143     return SubClasses;
00144   }
00145   
00146   sc_iterator subclasses_end() const {
00147     sc_iterator I = SubClasses;
00148     while (*I != NULL) ++I;
00149     return I;
00150   }
00151   
00152   /// hasSuperClass - return true if the specified TargetRegisterClass is a
00153   /// super-register class of this TargetRegisterClass.
00154   bool hasSuperClass(const TargetRegisterClass *cs) const {
00155     for (int i = 0; SuperClasses[i] != NULL; ++i) 
00156       if (SuperClasses[i] == cs)
00157         return true;
00158     return false;
00159   }
00160 
00161   /// superclasses_begin / superclasses_end - Loop over all of the super-classes
00162   /// of this register class.
00163   sc_iterator superclasses_begin() const {
00164     return SuperClasses;
00165   }
00166   
00167   sc_iterator superclasses_end() const {
00168     sc_iterator I = SuperClasses;
00169     while (*I != NULL) ++I;
00170     return I;
00171   }
00172   
00173   /// subregclasses_begin / subregclasses_end - Loop over all of
00174   /// the subregister classes of this register class.
00175   sc_iterator subregclasses_begin() const {
00176     return SubRegClasses;
00177   }
00178   
00179   sc_iterator subregclasses_end() const {
00180     sc_iterator I = SubRegClasses;
00181     while (*I != NULL) ++I;
00182     return I;
00183   }
00184   
00185   /// superregclasses_begin / superregclasses_end - Loop over all of
00186   /// the superregister classes of this register class.
00187   sc_iterator superregclasses_begin() const {
00188     return SuperRegClasses;
00189   }
00190   
00191   sc_iterator superregclasses_end() const {
00192     sc_iterator I = SuperRegClasses;
00193     while (*I != NULL) ++I;
00194     return I;
00195   }
00196   
00197   /// allocation_order_begin/end - These methods define a range of registers
00198   /// which specify the registers in this class that are valid to register
00199   /// allocate, and the preferred order to allocate them in.  For example,
00200   /// callee saved registers should be at the end of the list, because it is
00201   /// cheaper to allocate caller saved registers.
00202   ///
00203   /// These methods take a MachineFunction argument, which can be used to tune
00204   /// the allocatable registers based on the characteristics of the function.
00205   /// One simple example is that the frame pointer register can be used if
00206   /// frame-pointer-elimination is performed.
00207   ///
00208   /// By default, these methods return all registers in the class.
00209   ///
00210   virtual iterator allocation_order_begin(const MachineFunction &MF) const {
00211     return begin();
00212   }
00213   virtual iterator allocation_order_end(const MachineFunction &MF)   const {
00214     return end();
00215   }
00216 
00217 
00218 
00219   /// getSize - Return the size of the register in bytes, which is also the size
00220   /// of a stack slot allocated to hold a spilled copy of this register.
00221   unsigned getSize() const { return RegSize; }
00222 
00223   /// getAlignment - Return the minimum required alignment for a register of
00224   /// this class.
00225   unsigned getAlignment() const { return Alignment; }
00226 
00227   /// getCopyCost - Return the cost of copying a value between two registers in
00228   /// this class.
00229   int getCopyCost() const { return CopyCost; }
00230 };
00231 
00232 
00233 /// TargetRegisterInfo base class - We assume that the target defines a static
00234 /// array of TargetRegisterDesc objects that represent all of the machine
00235 /// registers that the target has.  As such, we simply have to track a pointer
00236 /// to this array so that we can turn register number into a register
00237 /// descriptor.
00238 ///
00239 class TargetRegisterInfo {
00240 protected:
00241   const unsigned* SubregHash;
00242   const unsigned SubregHashSize;
00243 public:
00244   typedef const TargetRegisterClass * const * regclass_iterator;
00245 private:
00246   const TargetRegisterDesc *Desc;             // Pointer to the descriptor array
00247   unsigned NumRegs;                           // Number of entries in the array
00248 
00249   regclass_iterator RegClassBegin, RegClassEnd;   // List of regclasses
00250 
00251   int CallFrameSetupOpcode, CallFrameDestroyOpcode;
00252 protected:
00253   TargetRegisterInfo(const TargetRegisterDesc *D, unsigned NR,
00254                      regclass_iterator RegClassBegin,
00255                      regclass_iterator RegClassEnd,
00256                      int CallFrameSetupOpcode = -1,
00257                      int CallFrameDestroyOpcode = -1,
00258                      const unsigned* subregs = 0,
00259                      const unsigned subregsize = 0);
00260   virtual ~TargetRegisterInfo();
00261 public:
00262 
00263   enum {                        // Define some target independent constants
00264     /// NoRegister - This physical register is not a real target register.  It
00265     /// is useful as a sentinal.
00266     NoRegister = 0,
00267 
00268     /// FirstVirtualRegister - This is the first register number that is
00269     /// considered to be a 'virtual' register, which is part of the SSA
00270     /// namespace.  This must be the same for all targets, which means that each
00271     /// target is limited to 1024 registers.
00272     FirstVirtualRegister = 1024
00273   };
00274 
00275   /// isPhysicalRegister - Return true if the specified register number is in
00276   /// the physical register namespace.
00277   static bool isPhysicalRegister(unsigned Reg) {
00278     assert(Reg && "this is not a register!");
00279     return Reg < FirstVirtualRegister;
00280   }
00281 
00282   /// isVirtualRegister - Return true if the specified register number is in
00283   /// the virtual register namespace.
00284   static bool isVirtualRegister(unsigned Reg) {
00285     assert(Reg && "this is not a register!");
00286     return Reg >= FirstVirtualRegister;
00287   }
00288 
00289   /// getPhysicalRegisterRegClass - Returns the Register Class of a physical
00290   /// register of the given type. If type is MVT::Other, then just return any
00291   /// register class the register belongs to.
00292   const TargetRegisterClass *getPhysicalRegisterRegClass(unsigned Reg,
00293                                           MVT VT = MVT::Other) const;
00294 
00295   /// getAllocatableSet - Returns a bitset indexed by register number
00296   /// indicating if a register is allocatable or not. If a register class is
00297   /// specified, returns the subset for the class.
00298   BitVector getAllocatableSet(MachineFunction &MF,
00299                               const TargetRegisterClass *RC = NULL) const;
00300 
00301   const TargetRegisterDesc &operator[](unsigned RegNo) const {
00302     assert(RegNo < NumRegs &&
00303            "Attempting to access record for invalid register number!");
00304     return Desc[RegNo];
00305   }
00306 
00307   /// Provide a get method, equivalent to [], but more useful if we have a
00308   /// pointer to this object.
00309   ///
00310   const TargetRegisterDesc &get(unsigned RegNo) const {
00311     return operator[](RegNo);
00312   }
00313 
00314   /// getAliasSet - Return the set of registers aliased by the specified
00315   /// register, or a null list of there are none.  The list returned is zero
00316   /// terminated.
00317   ///
00318   const unsigned *getAliasSet(unsigned RegNo) const {
00319     return get(RegNo).AliasSet;
00320   }
00321 
00322   /// getSubRegisters - Return the list of registers that are sub-registers of
00323   /// the specified register, or a null list of there are none. The list
00324   /// returned is zero terminated and sorted according to super-sub register
00325   /// relations. e.g. X86::RAX's sub-register list is EAX, AX, AL, AH.
00326   ///
00327   const unsigned *getSubRegisters(unsigned RegNo) const {
00328     return get(RegNo).SubRegs;
00329   }
00330 
00331   /// getSuperRegisters - Return the list of registers that are super-registers
00332   /// of the specified register, or a null list of there are none. The list
00333   /// returned is zero terminated and sorted according to super-sub register
00334   /// relations. e.g. X86::AL's super-register list is RAX, EAX, AX.
00335   ///
00336   const unsigned *getSuperRegisters(unsigned RegNo) const {
00337     return get(RegNo).SuperRegs;
00338   }
00339 
00340   /// getAsmName - Return the symbolic target-specific name for the
00341   /// specified physical register.
00342   const char *getAsmName(unsigned RegNo) const {
00343     return get(RegNo).AsmName;
00344   }
00345 
00346   /// getName - Return the human-readable symbolic target-specific name for the
00347   /// specified physical register.
00348   const char *getName(unsigned RegNo) const {
00349     return get(RegNo).Name;
00350   }
00351 
00352   /// getNumRegs - Return the number of registers this target has (useful for
00353   /// sizing arrays holding per register information)
00354   unsigned getNumRegs() const {
00355     return NumRegs;
00356   }
00357 
00358   /// areAliases - Returns true if the two registers alias each other, false
00359   /// otherwise
00360   bool areAliases(unsigned regA, unsigned regB) const {
00361     for (const unsigned *Alias = getAliasSet(regA); *Alias; ++Alias)
00362       if (*Alias == regB) return true;
00363     return false;
00364   }
00365 
00366   /// regsOverlap - Returns true if the two registers are equal or alias each
00367   /// other. The registers may be virtual register.
00368   bool regsOverlap(unsigned regA, unsigned regB) const {
00369     if (regA == regB)
00370       return true;
00371 
00372     if (isVirtualRegister(regA) || isVirtualRegister(regB))
00373       return false;
00374     return areAliases(regA, regB);
00375   }
00376 
00377   /// isSubRegister - Returns true if regB is a sub-register of regA.
00378   ///
00379   bool isSubRegister(unsigned regA, unsigned regB) const {
00380     // SubregHash is a simple quadratically probed hash table.
00381     size_t index = (regA + regB * 37) & (SubregHashSize-1);
00382     unsigned ProbeAmt = 2;
00383     while (SubregHash[index*2] != 0 &&
00384            SubregHash[index*2+1] != 0) {
00385       if (SubregHash[index*2] == regA && SubregHash[index*2+1] == regB)
00386         return true;
00387       
00388       index = (index + ProbeAmt) & (SubregHashSize-1);
00389       ProbeAmt += 2;
00390     }
00391     
00392     return false;
00393   }
00394 
00395   /// isSuperRegister - Returns true if regB is a super-register of regA.
00396   ///
00397   bool isSuperRegister(unsigned regA, unsigned regB) const {
00398     for (const unsigned *SR = getSuperRegisters(regA); *SR; ++SR)
00399       if (*SR == regB) return true;
00400     return false;
00401   }
00402 
00403   /// getCalleeSavedRegs - Return a null-terminated list of all of the
00404   /// callee saved registers on this target. The register should be in the
00405   /// order of desired callee-save stack frame offset. The first register is
00406   /// closed to the incoming stack pointer if stack grows down, and vice versa.
00407   virtual const unsigned* getCalleeSavedRegs(const MachineFunction *MF = 0)
00408                                                                       const = 0;
00409 
00410   /// getCalleeSavedRegClasses - Return a null-terminated list of the preferred
00411   /// register classes to spill each callee saved register with.  The order and
00412   /// length of this list match the getCalleeSaveRegs() list.
00413   virtual const TargetRegisterClass* const *getCalleeSavedRegClasses(
00414                                             const MachineFunction *MF) const =0;
00415 
00416   /// getReservedRegs - Returns a bitset indexed by physical register number
00417   /// indicating if a register is a special register that has particular uses
00418   /// and should be considered unavailable at all times, e.g. SP, RA. This is
00419   /// used by register scavenger to determine what registers are free.
00420   virtual BitVector getReservedRegs(const MachineFunction &MF) const = 0;
00421 
00422   /// getSubReg - Returns the physical register number of sub-register "Index"
00423   /// for physical register RegNo. Return zero if the sub-register does not
00424   /// exist.
00425   virtual unsigned getSubReg(unsigned RegNo, unsigned Index) const = 0;
00426 
00427   //===--------------------------------------------------------------------===//
00428   // Register Class Information
00429   //
00430 
00431   /// Register class iterators
00432   ///
00433   regclass_iterator regclass_begin() const { return RegClassBegin; }
00434   regclass_iterator regclass_end() const { return RegClassEnd; }
00435 
00436   unsigned getNumRegClasses() const {
00437     return (unsigned)(regclass_end()-regclass_begin());
00438   }
00439   
00440   /// getRegClass - Returns the register class associated with the enumeration
00441   /// value.  See class TargetOperandInfo.
00442   const TargetRegisterClass *getRegClass(unsigned i) const {
00443     assert(i <= getNumRegClasses() && "Register Class ID out of range");
00444     return i ? RegClassBegin[i - 1] : NULL;
00445   }
00446 
00447   //===--------------------------------------------------------------------===//
00448   // Interfaces used by the register allocator and stack frame
00449   // manipulation passes to move data around between registers,
00450   // immediates and memory.  FIXME: Move these to TargetInstrInfo.h.
00451   //
00452 
00453   /// getCrossCopyRegClass - Returns a legal register class to copy a register
00454   /// in the specified class to or from. Returns NULL if it is possible to copy
00455   /// between a two registers of the specified class.
00456   virtual const TargetRegisterClass *
00457   getCrossCopyRegClass(const TargetRegisterClass *RC) const {
00458     return NULL;
00459   }
00460 
00461   /// targetHandlesStackFrameRounding - Returns true if the target is
00462   /// responsible for rounding up the stack frame (probably at emitPrologue
00463   /// time).
00464   virtual bool targetHandlesStackFrameRounding() const {
00465     return false;
00466   }
00467 
00468   /// requiresRegisterScavenging - returns true if the target requires (and can
00469   /// make use of) the register scavenger.
00470   virtual bool requiresRegisterScavenging(const MachineFunction &MF) const {
00471     return false;
00472   }
00473   
00474   /// hasFP - Return true if the specified function should have a dedicated
00475   /// frame pointer register. For most targets this is true only if the function
00476   /// has variable sized allocas or if frame pointer elimination is disabled.
00477   virtual bool hasFP(const MachineFunction &MF) const = 0;
00478 
00479   // hasReservedCallFrame - Under normal circumstances, when a frame pointer is
00480   // not required, we reserve argument space for call sites in the function
00481   // immediately on entry to the current function. This eliminates the need for
00482   // add/sub sp brackets around call sites. Returns true if the call frame is
00483   // included as part of the stack frame.
00484   virtual bool hasReservedCallFrame(MachineFunction &MF) const {
00485     return !hasFP(MF);
00486   }
00487 
00488   // needsStackRealignment - true if storage within the function requires the
00489   // stack pointer to be aligned more than the normal calling convention calls
00490   // for.
00491   virtual bool needsStackRealignment(const MachineFunction &MF) const {
00492     return false;
00493   }
00494 
00495   /// getCallFrameSetup/DestroyOpcode - These methods return the opcode of the
00496   /// frame setup/destroy instructions if they exist (-1 otherwise).  Some
00497   /// targets use pseudo instructions in order to abstract away the difference
00498   /// between operating with a frame pointer and operating without, through the
00499   /// use of these two instructions.
00500   ///
00501   int getCallFrameSetupOpcode() const { return CallFrameSetupOpcode; }
00502   int getCallFrameDestroyOpcode() const { return CallFrameDestroyOpcode; }
00503 
00504 
00505   /// eliminateCallFramePseudoInstr - This method is called during prolog/epilog
00506   /// code insertion to eliminate call frame setup and destroy pseudo
00507   /// instructions (but only if the Target is using them).  It is responsible
00508   /// for eliminating these instructions, replacing them with concrete
00509   /// instructions.  This method need only be implemented if using call frame
00510   /// setup/destroy pseudo instructions.
00511   ///
00512   virtual void
00513   eliminateCallFramePseudoInstr(MachineFunction &MF,
00514                                 MachineBasicBlock &MBB,
00515                                 MachineBasicBlock::iterator MI) const {
00516     assert(getCallFrameSetupOpcode()== -1 && getCallFrameDestroyOpcode()== -1 &&
00517            "eliminateCallFramePseudoInstr must be implemented if using"
00518            " call frame setup/destroy pseudo instructions!");
00519     assert(0 && "Call Frame Pseudo Instructions do not exist on this target!");
00520   }
00521 
00522   /// processFunctionBeforeCalleeSavedScan - This method is called immediately
00523   /// before PrologEpilogInserter scans the physical registers used to determine
00524   /// what callee saved registers should be spilled. This method is optional.
00525   virtual void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
00526                                                 RegScavenger *RS = NULL) const {
00527 
00528   }
00529 
00530   /// processFunctionBeforeFrameFinalized - This method is called immediately
00531   /// before the specified functions frame layout (MF.getFrameInfo()) is
00532   /// finalized.  Once the frame is finalized, MO_FrameIndex operands are
00533   /// replaced with direct constants.  This method is optional.
00534   ///
00535   virtual void processFunctionBeforeFrameFinalized(MachineFunction &MF) const {
00536   }
00537 
00538   /// eliminateFrameIndex - This method must be overriden to eliminate abstract
00539   /// frame indices from instructions which may use them.  The instruction
00540   /// referenced by the iterator contains an MO_FrameIndex operand which must be
00541   /// eliminated by this method.  This method may modify or replace the
00542   /// specified instruction, as long as it keeps the iterator pointing the the
00543   /// finished product. SPAdj is the SP adjustment due to call frame setup
00544   /// instruction.
00545   virtual void eliminateFrameIndex(MachineBasicBlock::iterator MI,
00546                                    int SPAdj, RegScavenger *RS=NULL) const = 0;
00547 
00548   /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
00549   /// the function.
00550   virtual void emitPrologue(MachineFunction &MF) const = 0;
00551   virtual void emitEpilogue(MachineFunction &MF,
00552                             MachineBasicBlock &MBB) const = 0;
00553                             
00554   //===--------------------------------------------------------------------===//
00555   /// Debug information queries.
00556   
00557   /// getDwarfRegNum - Map a target register to an equivalent dwarf register
00558   /// number.  Returns -1 if there is no equivalent value.  The second
00559   /// parameter allows targets to use different numberings for EH info and
00560   /// debugging info.
00561   virtual int getDwarfRegNum(unsigned RegNum, bool isEH) const = 0;
00562 
00563   /// getFrameRegister - This method should return the register used as a base
00564   /// for values allocated in the current stack frame.
00565   virtual unsigned getFrameRegister(MachineFunction &MF) const = 0;
00566 
00567   /// getFrameIndexOffset - Returns the displacement from the frame register to
00568   /// the stack frame of the specified index.
00569   virtual int getFrameIndexOffset(MachineFunction &MF, int FI) const;
00570                            
00571   /// getRARegister - This method should return the register where the return
00572   /// address can be found.
00573   virtual unsigned getRARegister() const = 0;
00574   
00575   /// getInitialFrameState - Returns a list of machine moves that are assumed
00576   /// on entry to all functions.  Note that LabelID is ignored (assumed to be
00577   /// the beginning of the function.)
00578   virtual void getInitialFrameState(std::vector<MachineMove> &Moves) const;
00579 };
00580 
00581 // This is useful when building IndexedMaps keyed on virtual registers
00582 struct VirtReg2IndexFunctor : std::unary_function<unsigned, unsigned> {
00583   unsigned operator()(unsigned Reg) const {
00584     return Reg - TargetRegisterInfo::FirstVirtualRegister;
00585   }
00586 };
00587 
00588 } // End llvm namespace
00589 
00590 #endif



This web site is hosted by the Computer Science Department at the University of Illinois at Urbana-Champaign.