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