Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===-- llvm/CodeGen/Register.h ---------------------------------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
 
9
#ifndef LLVM_CODEGEN_REGISTER_H
10
#define LLVM_CODEGEN_REGISTER_H
11
 
12
#include "llvm/MC/MCRegister.h"
13
#include <cassert>
14
 
15
namespace llvm {
16
 
17
/// Wrapper class representing virtual and physical registers. Should be passed
18
/// by value.
19
class Register {
20
  unsigned Reg;
21
 
22
public:
23
  constexpr Register(unsigned Val = 0): Reg(Val) {}
24
  constexpr Register(MCRegister Val): Reg(Val) {}
25
 
26
  // Register numbers can represent physical registers, virtual registers, and
27
  // sometimes stack slots. The unsigned values are divided into these ranges:
28
  //
29
  //   0           Not a register, can be used as a sentinel.
30
  //   [1;2^30)    Physical registers assigned by TableGen.
31
  //   [2^30;2^31) Stack slots. (Rarely used.)
32
  //   [2^31;2^32) Virtual registers assigned by MachineRegisterInfo.
33
  //
34
  // Further sentinels can be allocated from the small negative integers.
35
  // DenseMapInfo<unsigned> uses -1u and -2u.
36
  static_assert(std::numeric_limits<decltype(Reg)>::max() >= 0xFFFFFFFF,
37
                "Reg isn't large enough to hold full range.");
38
 
39
  /// isStackSlot - Sometimes it is useful the be able to store a non-negative
40
  /// frame index in a variable that normally holds a register. isStackSlot()
41
  /// returns true if Reg is in the range used for stack slots.
42
  ///
43
  /// FIXME: remove in favor of member.
44
  static bool isStackSlot(unsigned Reg) {
45
    return MCRegister::isStackSlot(Reg);
46
  }
47
 
48
  /// Return true if this is a stack slot.
49
  bool isStack() const { return MCRegister::isStackSlot(Reg); }
50
 
51
  /// Compute the frame index from a register value representing a stack slot.
52
  static int stackSlot2Index(Register Reg) {
53
    assert(Reg.isStack() && "Not a stack slot");
54
    return int(Reg - MCRegister::FirstStackSlot);
55
  }
56
 
57
  /// Convert a non-negative frame index to a stack slot register value.
58
  static Register index2StackSlot(int FI) {
59
    assert(FI >= 0 && "Cannot hold a negative frame index.");
60
    return Register(FI + MCRegister::FirstStackSlot);
61
  }
62
 
63
  /// Return true if the specified register number is in
64
  /// the physical register namespace.
65
  static bool isPhysicalRegister(unsigned Reg) {
66
    return MCRegister::isPhysicalRegister(Reg);
67
  }
68
 
69
  /// Return true if the specified register number is in
70
  /// the virtual register namespace.
71
  static bool isVirtualRegister(unsigned Reg) {
72
    return Reg & MCRegister::VirtualRegFlag;
73
  }
74
 
75
  /// Convert a virtual register number to a 0-based index.
76
  /// The first virtual register in a function will get the index 0.
77
  static unsigned virtReg2Index(Register Reg) {
78
    assert(Reg.isVirtual() && "Not a virtual register");
79
    return Reg & ~MCRegister::VirtualRegFlag;
80
  }
81
 
82
  /// Convert a 0-based index to a virtual register number.
83
  /// This is the inverse operation of VirtReg2IndexFunctor below.
84
  static Register index2VirtReg(unsigned Index) {
85
    assert(Index < (1u << 31) && "Index too large for virtual register range.");
86
    return Index | MCRegister::VirtualRegFlag;
87
  }
88
 
89
  /// Return true if the specified register number is in the virtual register
90
  /// namespace.
91
  bool isVirtual() const {
92
    return isVirtualRegister(Reg);
93
  }
94
 
95
  /// Return true if the specified register number is in the physical register
96
  /// namespace.
97
  bool isPhysical() const {
98
    return isPhysicalRegister(Reg);
99
  }
100
 
101
  /// Convert a virtual register number to a 0-based index. The first virtual
102
  /// register in a function will get the index 0.
103
  unsigned virtRegIndex() const {
104
    return virtReg2Index(Reg);
105
  }
106
 
107
  constexpr operator unsigned() const {
108
    return Reg;
109
  }
110
 
111
  unsigned id() const { return Reg; }
112
 
113
  operator MCRegister() const {
114
    return MCRegister(Reg);
115
  }
116
 
117
  /// Utility to check-convert this value to a MCRegister. The caller is
118
  /// expected to have already validated that this Register is, indeed,
119
  /// physical.
120
  MCRegister asMCReg() const {
121
    assert(Reg == MCRegister::NoRegister ||
122
           MCRegister::isPhysicalRegister(Reg));
123
    return MCRegister(Reg);
124
  }
125
 
126
  bool isValid() const { return Reg != MCRegister::NoRegister; }
127
 
128
  /// Comparisons between register objects
129
  bool operator==(const Register &Other) const { return Reg == Other.Reg; }
130
  bool operator!=(const Register &Other) const { return Reg != Other.Reg; }
131
  bool operator==(const MCRegister &Other) const { return Reg == Other.id(); }
132
  bool operator!=(const MCRegister &Other) const { return Reg != Other.id(); }
133
 
134
  /// Comparisons against register constants. E.g.
135
  /// * R == AArch64::WZR
136
  /// * R == 0
137
  /// * R == VirtRegMap::NO_PHYS_REG
138
  bool operator==(unsigned Other) const { return Reg == Other; }
139
  bool operator!=(unsigned Other) const { return Reg != Other; }
140
  bool operator==(int Other) const { return Reg == unsigned(Other); }
141
  bool operator!=(int Other) const { return Reg != unsigned(Other); }
142
  // MSVC requires that we explicitly declare these two as well.
143
  bool operator==(MCPhysReg Other) const { return Reg == unsigned(Other); }
144
  bool operator!=(MCPhysReg Other) const { return Reg != unsigned(Other); }
145
};
146
 
147
// Provide DenseMapInfo for Register
148
template<> struct DenseMapInfo<Register> {
149
  static inline unsigned getEmptyKey() {
150
    return DenseMapInfo<unsigned>::getEmptyKey();
151
  }
152
  static inline unsigned getTombstoneKey() {
153
    return DenseMapInfo<unsigned>::getTombstoneKey();
154
  }
155
  static unsigned getHashValue(const Register &Val) {
156
    return DenseMapInfo<unsigned>::getHashValue(Val.id());
157
  }
158
  static bool isEqual(const Register &LHS, const Register &RHS) {
159
    return DenseMapInfo<unsigned>::isEqual(LHS.id(), RHS.id());
160
  }
161
};
162
 
163
}
164
 
165
#endif // LLVM_CODEGEN_REGISTER_H