CodeGenRegisters.h revision 09bc0298650c76db1a06e20ca84c1dcb34071600
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>
22ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov#include <cstdlib>
238dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner
248dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattnernamespace llvm {
258dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner  class Record;
268dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner
278dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner  /// CodeGenRegister - Represents a register definition.
288dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner  struct CodeGenRegister {
298dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner    Record *TheDef;
308dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner    const std::string &getName() const;
317a680c60646fb3b06085f1fe6a7a1917c35010c6Chris Lattner    unsigned DeclaredSpillSize, DeclaredSpillAlignment;
327a680c60646fb3b06085f1fe6a7a1917c35010c6Chris Lattner    CodeGenRegister(Record *R);
338dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner  };
348dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner
358dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner
368dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner  struct CodeGenRegisterClass {
37056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner    Record *TheDef;
38c67c18fd2378fd2394c42f12b67897e7eba02d5cChris Lattner    std::string Namespace;
39056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner    std::vector<Record*> Elements;
40825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    std::vector<MVT::SimpleValueType> VTs;
41056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner    unsigned SpillSize;
42056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner    unsigned SpillAlignment;
43a3ca3149f2b59c512c50aab330b5a0d8efddeffaEvan Cheng    int CopyCost;
4409bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen    // Map SubRegIndex -> RegisterClass
4509bc0298650c76db1a06e20ca84c1dcb34071600Jakob Stoklund Olesen    DenseMap<Record*,Record*> SubRegClasses;
46ac46893e246748876d1155bb0c9e8892e52acab7Chris Lattner    std::string MethodProtos, MethodBodies;
47056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner
48056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner    const std::string &getName() const;
49825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    const std::vector<MVT::SimpleValueType> &getValueTypes() const {return VTs;}
505c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner    unsigned getNumValueTypes() const { return VTs.size(); }
515c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner
52825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    MVT::SimpleValueType getValueTypeNum(unsigned VTNum) const {
536510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman      if (VTNum < VTs.size())
546510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman        return VTs[VTNum];
556510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman      assert(0 && "VTNum greater than number of ValueTypes in RegClass!");
566510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman      abort();
576510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman    }
586510b22cec7de4f0acc9965ec24c3668a6a8a87eNate Begeman
59056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner    CodeGenRegisterClass(Record *R);
608dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner  };
618dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner}
628dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner
638dab6ca9c638709e7b60b942107ab88b3ef7d06dChris Lattner#endif
64