File indexing completed on 2026-05-10 08:44:14
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLVM_MC_MCREGISTER_H
0010 #define LLVM_MC_MCREGISTER_H
0011
0012 #include "llvm/ADT/DenseMapInfo.h"
0013 #include "llvm/ADT/Hashing.h"
0014 #include <cassert>
0015 #include <limits>
0016
0017 namespace llvm {
0018
0019
0020
0021 using MCPhysReg = uint16_t;
0022
0023
0024
0025
0026
0027
0028
0029
0030 using MCRegUnit = unsigned;
0031
0032
0033 class MCRegister {
0034 friend hash_code hash_value(const MCRegister &);
0035 unsigned Reg;
0036
0037 public:
0038 constexpr MCRegister(unsigned Val = 0) : Reg(Val) {}
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050 static_assert(std::numeric_limits<decltype(Reg)>::max() >= 0xFFFFFFFF,
0051 "Reg isn't large enough to hold full range.");
0052 static constexpr unsigned NoRegister = 0u;
0053 static constexpr unsigned FirstPhysicalReg = 1u;
0054 static constexpr unsigned FirstStackSlot = 1u << 30;
0055 static constexpr unsigned VirtualRegFlag = 1u << 31;
0056
0057
0058
0059
0060
0061 static constexpr bool isStackSlot(unsigned Reg) {
0062 return FirstStackSlot <= Reg && Reg < VirtualRegFlag;
0063 }
0064
0065
0066
0067 static constexpr bool isPhysicalRegister(unsigned Reg) {
0068 return FirstPhysicalReg <= Reg && Reg < FirstStackSlot;
0069 }
0070
0071
0072
0073 constexpr bool isPhysical() const { return isPhysicalRegister(Reg); }
0074
0075 constexpr operator unsigned() const { return Reg; }
0076
0077
0078 static MCRegister from(unsigned Val) {
0079 assert(Val == NoRegister || isPhysicalRegister(Val));
0080 return MCRegister(Val);
0081 }
0082
0083 constexpr unsigned id() const { return Reg; }
0084
0085 constexpr bool isValid() const { return Reg != NoRegister; }
0086
0087
0088 constexpr bool operator==(const MCRegister &Other) const {
0089 return Reg == Other.Reg;
0090 }
0091 constexpr bool operator!=(const MCRegister &Other) const {
0092 return Reg != Other.Reg;
0093 }
0094
0095
0096
0097
0098 constexpr bool operator==(unsigned Other) const { return Reg == Other; }
0099 constexpr bool operator!=(unsigned Other) const { return Reg != Other; }
0100 constexpr bool operator==(int Other) const { return Reg == unsigned(Other); }
0101 constexpr bool operator!=(int Other) const { return Reg != unsigned(Other); }
0102
0103 constexpr bool operator==(MCPhysReg Other) const {
0104 return Reg == unsigned(Other);
0105 }
0106 constexpr bool operator!=(MCPhysReg Other) const {
0107 return Reg != unsigned(Other);
0108 }
0109 };
0110
0111
0112 template <> struct DenseMapInfo<MCRegister> {
0113 static inline MCRegister getEmptyKey() {
0114 return DenseMapInfo<unsigned>::getEmptyKey();
0115 }
0116 static inline MCRegister getTombstoneKey() {
0117 return DenseMapInfo<unsigned>::getTombstoneKey();
0118 }
0119 static unsigned getHashValue(const MCRegister &Val) {
0120 return DenseMapInfo<unsigned>::getHashValue(Val.id());
0121 }
0122 static bool isEqual(const MCRegister &LHS, const MCRegister &RHS) {
0123 return LHS == RHS;
0124 }
0125 };
0126
0127 inline hash_code hash_value(const MCRegister &Reg) {
0128 return hash_value(Reg.id());
0129 }
0130 }
0131
0132 #endif