CodeGenRegisters.h revision 655b8de7b2ab773a977e0c524307e71354d8af29
18dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner//===- CodeGenRegisters.h - Register and RegisterClass Info -----*- C++ -*-===// 23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 38dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner// The LLVM Compiler Infrastructure 48dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner// 53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source 63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details. 73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 88dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner//===----------------------------------------------------------------------===// 98dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner// 108dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner// This file defines structures to encapsulate information gleaned from the 118dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner// target register and register class definitions. 128dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner// 138dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner//===----------------------------------------------------------------------===// 148dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner 158dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner#ifndef CODEGEN_REGISTERS_H 168dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner#define CODEGEN_REGISTERS_H 178dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner 1859f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen#include "SetTheory.h" 197c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#include "llvm/TableGen/Record.h" 20ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov#include "llvm/CodeGen/ValueTypes.h" 21ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen#include "llvm/ADT/ArrayRef.h" 22203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen#include "llvm/ADT/BitVector.h" 2309bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen#include "llvm/ADT/DenseMap.h" 24026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen#include "llvm/ADT/SetVector.h" 25655b8de7b2ab773a977e0c524307e71354d8af29Craig Topper#include "llvm/Support/ErrorHandling.h" 26b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen#include <cstdlib> 27b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen#include <map> 288dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner#include <string> 29a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher#include <set> 30b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen#include <vector> 318dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner 328dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattnernamespace llvm { 33b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen class CodeGenRegBank; 348dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner 355fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen /// CodeGenSubRegIndex - Represents a sub-register index. 365fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen class CodeGenSubRegIndex { 375fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen Record *const TheDef; 385fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen const unsigned EnumValue; 395fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen 405fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen public: 415fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen CodeGenSubRegIndex(Record *R, unsigned Enum); 425fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen 435fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen const std::string &getName() const; 445fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen std::string getNamespace() const; 455fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen std::string getQualifiedName() const; 465fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen 475fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen // Order CodeGenSubRegIndex pointers by EnumValue. 485fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen struct Less { 495fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen bool operator()(const CodeGenSubRegIndex *A, 505fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen const CodeGenSubRegIndex *B) const { 515fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen assert(A && B); 525fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen return A->EnumValue < B->EnumValue; 535fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen } 545fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen }; 5590498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen 5690498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen // Map of composite subreg indices. 5790498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen typedef std::map<CodeGenSubRegIndex*, CodeGenSubRegIndex*, Less> CompMap; 5890498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen 5990498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen // Returns the subreg index that results from composing this with Idx. 6090498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen // Returns NULL if this and Idx don't compose. 6190498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen CodeGenSubRegIndex *compose(CodeGenSubRegIndex *Idx) const { 6290498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen CompMap::const_iterator I = Composed.find(Idx); 6390498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen return I == Composed.end() ? 0 : I->second; 6490498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen } 6590498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen 6690498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen // Add a composite subreg index: this+A = B. 6790498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen // Return a conflicting composite, or NULL 6890498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen CodeGenSubRegIndex *addComposite(CodeGenSubRegIndex *A, 6990498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen CodeGenSubRegIndex *B) { 7090498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen std::pair<CompMap::iterator, bool> Ins = 7190498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen Composed.insert(std::make_pair(A, B)); 7290498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen return (Ins.second || Ins.first->second == B) ? 0 : Ins.first->second; 7390498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen } 7490498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen 75b5af2d943ed568f2f4cac545b6dfb150ae9d73aaJakob Stoklund Olesen // Update the composite maps of components specified in 'ComposedOf'. 76b5af2d943ed568f2f4cac545b6dfb150ae9d73aaJakob Stoklund Olesen void updateComponents(CodeGenRegBank&); 77b5af2d943ed568f2f4cac545b6dfb150ae9d73aaJakob Stoklund Olesen 7890498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen // Clean out redundant composite mappings. 7990498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen void cleanComposites(); 8090498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen 8190498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen // Return the map of composites. 8290498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen const CompMap &getComposites() const { return Composed; } 8390498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen 8490498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen private: 8590498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen CompMap Composed; 865fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen }; 875fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen 888dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner /// CodeGenRegister - Represents a register definition. 898dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner struct CodeGenRegister { 908dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner Record *TheDef; 9117fad045cccf34822d3163ada9e70a8f4528746eJim Grosbach unsigned EnumValue; 926bfba2e5af163442a1c6b11fe14aa9df9101cfd7Jakob Stoklund Olesen unsigned CostPerUse; 9331867660cb81ea2b1d1a6ffa7d09c91acb754a8bJakob Stoklund Olesen bool CoveredBySubRegs; 94b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen 95b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // Map SubRegIndex -> Register. 965fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen typedef std::map<CodeGenSubRegIndex*, CodeGenRegister*, 975fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen CodeGenSubRegIndex::Less> SubRegMap; 98b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen 99b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen CodeGenRegister(Record *R, unsigned Enum); 100b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen 101b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen const std::string &getName() const; 102b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen 103b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // Get a map of sub-registers computed lazily. 104b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // This includes unique entries for all sub-sub-registers. 105b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen const SubRegMap &getSubRegs(CodeGenRegBank&); 106b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen 107b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen const SubRegMap &getSubRegs() const { 108b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen assert(SubRegsComplete && "Must precompute sub-registers"); 109b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen return SubRegs; 110b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen } 111b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen 112026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // Add sub-registers to OSet following a pre-order defined by the .td file. 1135fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen void addSubRegsPreOrder(SetVector<CodeGenRegister*> &OSet, 1145fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen CodeGenRegBank&) const; 115026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen 116026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // List of super-registers in topological order, small to large. 117026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen typedef std::vector<CodeGenRegister*> SuperRegList; 118026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen 119026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // Get the list of super-registers. 120026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // This is only valid after computeDerivedInfo has visited all registers. 121026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen const SuperRegList &getSuperRegs() const { 122026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen assert(SubRegsComplete && "Must precompute sub-registers"); 123026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen return SuperRegs; 124026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen } 125026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen 126026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // Order CodeGenRegister pointers by EnumValue. 127026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen struct Less { 128ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen bool operator()(const CodeGenRegister *A, 129ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen const CodeGenRegister *B) const { 130babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen assert(A && B); 131026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen return A->EnumValue < B->EnumValue; 132026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen } 133026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen }; 134026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen 135026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // Canonically ordered set. 136ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen typedef std::set<const CodeGenRegister*, Less> Set; 137026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen 138b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen private: 139b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen bool SubRegsComplete; 140b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen SubRegMap SubRegs; 141026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen SuperRegList SuperRegs; 1428dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner }; 1438dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner 1448dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner 145ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen class CodeGenRegisterClass { 146ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen CodeGenRegister::Set Members; 147cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen // Allocation orders. Order[0] always contains all registers in Members. 148cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen std::vector<SmallVector<Record*, 16> > Orders; 149203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen // Bit mask of sub-classes including this, indexed by their EnumValue. 150203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen BitVector SubClasses; 151f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen // List of super-classes, topologocally ordered to have the larger classes 152f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen // first. This is the same as sorting by EnumValue. 153f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen SmallVector<CodeGenRegisterClass*, 4> SuperClasses; 154056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner Record *TheDef; 1556fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen std::string Name; 156babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 157babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // For a synthesized class, inherit missing properties from the nearest 158babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // super-class. 159babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen void inheritProperties(CodeGenRegBank&); 160babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 161570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // Map SubRegIndex -> sub-class. This is the largest sub-class where all 162570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // registers have a SubRegIndex sub-register. 1635fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen DenseMap<CodeGenSubRegIndex*, CodeGenRegisterClass*> SubClassWithSubReg; 164845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen 165570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // Map SubRegIndex -> set of super-reg classes. This is all register 166570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // classes SuperRC such that: 167570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // 168570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // R:SubRegIndex in this RC for all R in SuperRC. 169570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // 1705fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen DenseMap<CodeGenSubRegIndex*, 1715fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen SmallPtrSet<CodeGenRegisterClass*, 8> > SuperRegClasses; 1726fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen public: 1737dcaa5b0fb56468e774044d3b887c21b2d484a1cJakob Stoklund Olesen unsigned EnumValue; 174c67c18fd2378fd2394c42f12b67897e7eba02d5cChris Lattner std::string Namespace; 175825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson std::vector<MVT::SimpleValueType> VTs; 176056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner unsigned SpillSize; 177056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner unsigned SpillAlignment; 178a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng int CopyCost; 179f462e3fac7ac67503657d63dc35330d0b19359b3Jakob Stoklund Olesen bool Allocatable; 18009bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen // Map SubRegIndex -> RegisterClass 18109bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen DenseMap<Record*,Record*> SubRegClasses; 18254c47c1ce94b9e549ef768e80fd004788d13ce85Jakob Stoklund Olesen std::string AltOrderSelect; 183056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner 1846fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen // Return the Record that defined this class, or NULL if the class was 1856fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen // created by TableGen. 1866fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen Record *getDef() const { return TheDef; } 1876fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen 1886fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen const std::string &getName() const { return Name; } 1896fea31e7300fe012b0b2984d6bc0338d02b054d3Jakob Stoklund Olesen std::string getQualifiedName() const; 190825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson const std::vector<MVT::SimpleValueType> &getValueTypes() const {return VTs;} 1915c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner unsigned getNumValueTypes() const { return VTs.size(); } 1925d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach 193825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson MVT::SimpleValueType getValueTypeNum(unsigned VTNum) const { 1946510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman if (VTNum < VTs.size()) 1956510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman return VTs[VTNum]; 196655b8de7b2ab773a977e0c524307e71354d8af29Craig Topper llvm_unreachable("VTNum greater than number of ValueTypes in RegClass!"); 1976510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman } 1985d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach 199ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen // Return true if this this class contains the register. 200ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen bool contains(const CodeGenRegister*) const; 2015d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach 202ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen // Returns true if RC is a subclass. 203a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // RC is a sub-class of this class if it is a valid replacement for any 2045d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach // instruction operand where a register of this classis required. It must 205a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // satisfy these conditions: 206a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // 207a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // 1. All RC registers are also in this. 208a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // 2. The RC spill size must not be smaller than our spill size. 209a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // 3. RC spill alignment must be compatible with ours. 210a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // 21152e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen bool hasSubClass(const CodeGenRegisterClass *RC) const { 21252e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen return SubClasses.test(RC->EnumValue); 21352e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen } 214a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher 215845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen // getSubClassWithSubReg - Returns the largest sub-class where all 216845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen // registers have a SubIdx sub-register. 2175fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen CodeGenRegisterClass* 2185fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen getSubClassWithSubReg(CodeGenSubRegIndex *SubIdx) const { 219845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen return SubClassWithSubReg.lookup(SubIdx); 220845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen } 221845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen 2225fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen void setSubClassWithSubReg(CodeGenSubRegIndex *SubIdx, 2235fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen CodeGenRegisterClass *SubRC) { 224845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen SubClassWithSubReg[SubIdx] = SubRC; 225845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen } 226845d2c0c776abce551d16f7b1b7dc1f4d4df1a27Jakob Stoklund Olesen 227570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // getSuperRegClasses - Returns a bit vector of all register classes 228570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // containing only SubIdx super-registers of this class. 2295fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen void getSuperRegClasses(CodeGenSubRegIndex *SubIdx, BitVector &Out) const; 230570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen 231570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen // addSuperRegClass - Add a class containing only SudIdx super-registers. 2325fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen void addSuperRegClass(CodeGenSubRegIndex *SubIdx, 2335fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen CodeGenRegisterClass *SuperRC) { 234570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen SuperRegClasses[SubIdx].insert(SuperRC); 235570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen } 236570f9a972e02830d1ca223743dd6b4cc4fdf9549Jakob Stoklund Olesen 237f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen // getSubClasses - Returns a constant BitVector of subclasses indexed by 238f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen // EnumValue. 239f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen // The SubClasses vector includs an entry for this class. 240830378f6628ad3af1d0293a0b605065532f99e43Eli Friedman const BitVector &getSubClasses() const { return SubClasses; } 241f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen 242f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen // getSuperClasses - Returns a list of super classes ordered by EnumValue. 243f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen // The array does not include an entry for this class. 244f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen ArrayRef<CodeGenRegisterClass*> getSuperClasses() const { 245f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen return SuperClasses; 246f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen } 247f9a4bb78dadc12c7c1e604c6f17b63a71305c2caJakob Stoklund Olesen 248ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen // Returns an ordered list of class members. 249ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen // The order of registers is the same as in the .td file. 250b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen // No = 0 is the default allocation order, No = 1 is the first alternative. 251b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen ArrayRef<Record*> getOrder(unsigned No = 0) const { 252cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen return Orders[No]; 253a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher } 2546510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman 255b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen // Return the total number of allocation orders available. 256cc0c975b7db95ce6bc865c56a3016bf0d4f83304Jakob Stoklund Olesen unsigned getNumOrders() const { return Orders.size(); } 257b4c704877d1600852a55ab7bef2918a7c0af5e0dJakob Stoklund Olesen 25852e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen // Get the set of registers. This set contains the same registers as 25952e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen // getOrder(0). 26052e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen const CodeGenRegister::Set &getMembers() const { return Members; } 26152e7dfadc65257f05480de6e70da00373a8954d1Jakob Stoklund Olesen 262ae1920b1efa72c1789d562df4746110d0c2e10bdJakob Stoklund Olesen CodeGenRegisterClass(CodeGenRegBank&, Record *R); 263203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen 264babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // A key representing the parts of a register class used for forming 265babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // sub-classes. Note the ordering provided by this key is not the same as 266babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // the topological order used for the EnumValues. 267babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen struct Key { 268babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen const CodeGenRegister::Set *Members; 269babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen unsigned SpillSize; 270babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen unsigned SpillAlignment; 271babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 272babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen Key(const Key &O) 273babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen : Members(O.Members), 274babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen SpillSize(O.SpillSize), 275babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen SpillAlignment(O.SpillAlignment) {} 276babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 277babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen Key(const CodeGenRegister::Set *M, unsigned S = 0, unsigned A = 0) 278babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen : Members(M), SpillSize(S), SpillAlignment(A) {} 279babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 280babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen Key(const CodeGenRegisterClass &RC) 281babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen : Members(&RC.getMembers()), 282babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen SpillSize(RC.SpillSize), 283babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen SpillAlignment(RC.SpillAlignment) {} 284babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 285babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // Lexicographical order of (Members, SpillSize, SpillAlignment). 286babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen bool operator<(const Key&) const; 287babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen }; 288babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 289babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // Create a non-user defined register class. 290babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen CodeGenRegisterClass(StringRef Name, Key Props); 291babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 292203e0b17dd6049d64cb4ed7c4da09747204e6463Jakob Stoklund Olesen // Called by CodeGenRegBank::CodeGenRegBank(). 293babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen static void computeSubClasses(CodeGenRegBank&); 2948dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner }; 295dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen 296dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen // CodeGenRegBank - Represent a target's registers and the relations between 297dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen // them. 298dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen class CodeGenRegBank { 299dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen RecordKeeper &Records; 30059f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen SetTheory Sets; 30159f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen 3025fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen // SubRegIndices. 3035fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen std::vector<CodeGenSubRegIndex*> SubRegIndices; 3045fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen DenseMap<Record*, CodeGenSubRegIndex*> Def2SubRegIdx; 305dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen unsigned NumNamedIndices; 3065fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen 3075fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen // Registers. 308abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen std::vector<CodeGenRegister*> Registers; 309b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen DenseMap<Record*, CodeGenRegister*> Def2Reg; 310b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen 311babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // Register classes. 31229f018cee616e4082e5005bc9adee4dc777e621cJakob Stoklund Olesen std::vector<CodeGenRegisterClass*> RegClasses; 3137b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen DenseMap<Record*, CodeGenRegisterClass*> Def2RC; 314babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen typedef std::map<CodeGenRegisterClass::Key, CodeGenRegisterClass*> RCKeyMap; 315babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen RCKeyMap Key2RC; 316babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 317babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // Add RC to *2RC maps. 318babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen void addToMaps(CodeGenRegisterClass*); 319babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen 3201b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen // Create a synthetic sub-class if it is missing. 3211b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen CodeGenRegisterClass *getOrCreateSubClass(const CodeGenRegisterClass *RC, 3221b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen const CodeGenRegister::Set *Membs, 3231b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen StringRef Name); 3241b3d218880a7147caeb58f2604af1df26a409f7dJakob Stoklund Olesen 325babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen // Infer missing register classes. 326babf0569e2e4f204f9a304416cc4acc349d8f836Jakob Stoklund Olesen void computeInferredRegisterClasses(); 3277e56831a6804812b2295c5446a05f4ec457b6b3eJakob Stoklund Olesen void inferCommonSubClass(CodeGenRegisterClass *RC); 328fec33444c5ca22e0338fdac0fcaee2644bd756afJakob Stoklund Olesen void inferSubClassWithSubReg(CodeGenRegisterClass *RC); 329a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen void inferMatchingSuperRegClass(CodeGenRegisterClass *RC, 330a9f65b9a1f57dcf546399ac32bf89d71d20df5b9Jakob Stoklund Olesen unsigned FirstSubRegRC = 0); 3317b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen 332b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // Populate the Composite map from sub-register relationships. 333b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen void computeComposites(); 334dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen 335dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen public: 336dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen CodeGenRegBank(RecordKeeper&); 337dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen 33859f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen SetTheory &getSets() { return Sets; } 33959f26aadce1bb985b9befe841fc106c891e1c728Jakob Stoklund Olesen 340b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // Sub-register indices. The first NumNamedIndices are defined by the user 341b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // in the .td files. The rest are synthesized such that all sub-registers 342b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // have a unique name. 3435fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen ArrayRef<CodeGenSubRegIndex*> getSubRegIndices() { return SubRegIndices; } 344dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen unsigned getNumNamedIndices() { return NumNamedIndices; } 345dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen 3465fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen // Find a SubRegIndex form its Record def. 3475fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen CodeGenSubRegIndex *getSubRegIdx(Record*); 348dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen 349b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // Find or create a sub-register index representing the A+B composition. 3505fcc156344e0d38fa5f5eab3d9193b859b27b45eJakob Stoklund Olesen CodeGenSubRegIndex *getCompositeSubRegIndex(CodeGenSubRegIndex *A, 35190498b195ba759cf4f2a98da4e46fb9a2b580396Jakob Stoklund Olesen CodeGenSubRegIndex *B); 352b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen 353abdbc84b4ed4276ed3def50f554e3ba156325717Jakob Stoklund Olesen const std::vector<CodeGenRegister*> &getRegisters() { return Registers; } 354b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen 355b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // Find a register from its Record def. 356b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen CodeGenRegister *getReg(Record*); 357b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen 35829f018cee616e4082e5005bc9adee4dc777e621cJakob Stoklund Olesen ArrayRef<CodeGenRegisterClass*> getRegClasses() const { 3597b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen return RegClasses; 3607b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen } 3617b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen 3627b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen // Find a register class from its def. 3637b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen CodeGenRegisterClass *getRegClass(Record*); 3647b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen 3657b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen /// getRegisterClassForRegister - Find the register class that contains the 3667b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen /// specified physical register. If the register is not in a register 3677b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen /// class, return null. If the register is in multiple classes, and the 3687b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen /// classes have a superset-subset relationship and the same set of types, 3697b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen /// return the superclass. Otherwise return null. 3707b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen const CodeGenRegisterClass* getRegClassForRegister(Record *R); 3717b9cafde5e3faec22bbfbbc90cca0876968abad9Jakob Stoklund Olesen 372b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen // Computed derived records such as missing sub-register indices. 373b5923db192d2aa938ff3c12aaac87d80ab649625Jakob Stoklund Olesen void computeDerivedInfo(); 374026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen 375026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // Compute full overlap sets for every register. These sets include the 376026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // rarely used aliases that are neither sub nor super-registers. 377026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // 378026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // Map[R1].count(R2) is reflexive and symmetric, but not transitive. 379026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // 380026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen // If R1 is a sub-register of R2, Map[R1] is a subset of Map[R2]. 381026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen void computeOverlaps(std::map<const CodeGenRegister*, 382026dc223aeef2579d63f395007491e37d6cde3a0Jakob Stoklund Olesen CodeGenRegister::Set> &Map); 383ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen 384ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen // Compute the set of registers completely covered by the registers in Regs. 385ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen // The returned BitVector will have a bit set for each register in Regs, 386ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen // all sub-registers, and all super-registers that are covered by the 387ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen // registers in Regs. 388ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen // 389ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen // This is used to compute the mask of call-preserved registers from a list 390ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen // of callee-saves. 391ec572539dd5660f9ca42027ac04df3a3f8c0cab1Jakob Stoklund Olesen BitVector computeCoveredRegisters(ArrayRef<Record*> Regs); 392dc29c447136aabf05f48a7119e48065c3b4cee9bJakob Stoklund Olesen }; 3938dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner} 3948dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner 3958dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner#endif 396