CodeGenRegisters.h revision 6bfba2e5af163442a1c6b11fe14aa9df9101cfd7
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 18ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov#include "llvm/CodeGen/ValueTypes.h" 1909bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen#include "llvm/ADT/DenseMap.h" 208dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner#include <string> 21056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner#include <vector> 22a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher#include <set> 23ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov#include <cstdlib> 248dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner 258dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattnernamespace llvm { 268dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner class Record; 278dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner 288dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner /// CodeGenRegister - Represents a register definition. 298dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner struct CodeGenRegister { 308dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner Record *TheDef; 318dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner const std::string &getName() const; 327a680c60646fb3b06085f1fe6a7a1917c35010c6Chris Lattner unsigned DeclaredSpillSize, DeclaredSpillAlignment; 3317fad045cccf34822d3163ada9e70a8f4528746eJim Grosbach unsigned EnumValue; 346bfba2e5af163442a1c6b11fe14aa9df9101cfd7Jakob Stoklund Olesen unsigned CostPerUse; 357a680c60646fb3b06085f1fe6a7a1917c35010c6Chris Lattner CodeGenRegister(Record *R); 368dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner }; 378dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner 388dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner 398dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner struct CodeGenRegisterClass { 40056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner Record *TheDef; 41c67c18fd2378fd2394c42f12b67897e7eba02d5cChris Lattner std::string Namespace; 42056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner std::vector<Record*> Elements; 43825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson std::vector<MVT::SimpleValueType> VTs; 44056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner unsigned SpillSize; 45056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner unsigned SpillAlignment; 46a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng int CopyCost; 4709bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen // Map SubRegIndex -> RegisterClass 4809bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen DenseMap<Record*,Record*> SubRegClasses; 49ac46893e246748876d1155bb0c9e8892e52acab7Chris Lattner std::string MethodProtos, MethodBodies; 50056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner 51056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner const std::string &getName() const; 52825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson const std::vector<MVT::SimpleValueType> &getValueTypes() const {return VTs;} 535c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner unsigned getNumValueTypes() const { return VTs.size(); } 545d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach 55825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson MVT::SimpleValueType getValueTypeNum(unsigned VTNum) const { 566510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman if (VTNum < VTs.size()) 576510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman return VTs[VTNum]; 586510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman assert(0 && "VTNum greater than number of ValueTypes in RegClass!"); 596510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman abort(); 606510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman } 615d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach 6290fd797dc739319347861d4f3984bc8952ae9a29Chris Lattner bool containsRegister(Record *R) const { 6390fd797dc739319347861d4f3984bc8952ae9a29Chris Lattner for (unsigned i = 0, e = Elements.size(); i != e; ++i) 6490fd797dc739319347861d4f3984bc8952ae9a29Chris Lattner if (Elements[i] == R) return true; 6590fd797dc739319347861d4f3984bc8952ae9a29Chris Lattner return false; 6690fd797dc739319347861d4f3984bc8952ae9a29Chris Lattner } 675d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach 68a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // Returns true if RC is a strict subclass. 69a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // RC is a sub-class of this class if it is a valid replacement for any 705d4314ef720630e6547fe41efec1608d4c14c78eJim Grosbach // instruction operand where a register of this classis required. It must 71a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // satisfy these conditions: 72a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // 73a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // 1. All RC registers are also in this. 74a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // 2. The RC spill size must not be smaller than our spill size. 75a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // 3. RC spill alignment must be compatible with ours. 76a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher // 77a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher bool hasSubClass(const CodeGenRegisterClass *RC) const { 78a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher 79a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher if (RC->Elements.size() > Elements.size() || 80a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher (SpillAlignment && RC->SpillAlignment % SpillAlignment) || 81a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher SpillSize > RC->SpillSize) 82a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher return false; 83a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher 84a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher std::set<Record*> RegSet; 85a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher for (unsigned i = 0, e = Elements.size(); i != e; ++i) { 86a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher Record *Reg = Elements[i]; 87a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher RegSet.insert(Reg); 88a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher } 89a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher 90a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher for (unsigned i = 0, e = RC->Elements.size(); i != e; ++i) { 91a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher Record *Reg = RC->Elements[i]; 92a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher if (!RegSet.count(Reg)) 93a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher return false; 94a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher } 95a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher 96a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher return true; 97a2c9188560eb9a7d494960fefd28cf0998d9a78fEric Christopher } 986510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman 99056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner CodeGenRegisterClass(Record *R); 1008dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner }; 1018dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner} 1028dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner 1038dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner#endif 104