1 //===- CodeGenRegisters.h - Register and RegisterClass Info -----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines structures to encapsulate information gleaned from the
11 // target register and register class definitions.
13 //===----------------------------------------------------------------------===//
15 #ifndef CODEGEN_REGISTERS_H
16 #define CODEGEN_REGISTERS_H
18 #include "llvm/CodeGen/ValueTypes.h"
19 #include "llvm/ADT/DenseMap.h"
28 /// CodeGenRegister - Represents a register definition.
29 struct CodeGenRegister
{
31 const std::string
&getName() const;
32 unsigned DeclaredSpillSize
, DeclaredSpillAlignment
;
34 CodeGenRegister(Record
*R
);
38 struct CodeGenRegisterClass
{
40 std::string Namespace
;
41 std::vector
<Record
*> Elements
;
42 std::vector
<MVT::SimpleValueType
> VTs
;
44 unsigned SpillAlignment
;
46 // Map SubRegIndex -> RegisterClass
47 DenseMap
<Record
*,Record
*> SubRegClasses
;
48 std::string MethodProtos
, MethodBodies
;
50 const std::string
&getName() const;
51 const std::vector
<MVT::SimpleValueType
> &getValueTypes() const {return VTs
;}
52 unsigned getNumValueTypes() const { return VTs
.size(); }
54 MVT::SimpleValueType
getValueTypeNum(unsigned VTNum
) const {
55 if (VTNum
< VTs
.size())
57 assert(0 && "VTNum greater than number of ValueTypes in RegClass!");
61 bool containsRegister(Record
*R
) const {
62 for (unsigned i
= 0, e
= Elements
.size(); i
!= e
; ++i
)
63 if (Elements
[i
] == R
) return true;
67 // Returns true if RC is a strict subclass.
68 // RC is a sub-class of this class if it is a valid replacement for any
69 // instruction operand where a register of this classis required. It must
70 // satisfy these conditions:
72 // 1. All RC registers are also in this.
73 // 2. The RC spill size must not be smaller than our spill size.
74 // 3. RC spill alignment must be compatible with ours.
76 bool hasSubClass(const CodeGenRegisterClass
*RC
) const {
78 if (RC
->Elements
.size() > Elements
.size() ||
79 (SpillAlignment
&& RC
->SpillAlignment
% SpillAlignment
) ||
80 SpillSize
> RC
->SpillSize
)
83 std::set
<Record
*> RegSet
;
84 for (unsigned i
= 0, e
= Elements
.size(); i
!= e
; ++i
) {
85 Record
*Reg
= Elements
[i
];
89 for (unsigned i
= 0, e
= RC
->Elements
.size(); i
!= e
; ++i
) {
90 Record
*Reg
= RC
->Elements
[i
];
91 if (!RegSet
.count(Reg
))
98 CodeGenRegisterClass(Record
*R
);