mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
Add MCRegister and use it in MCRegisterClass::contains()
Summary: Register can cast to MCRegister and we may want to consider asserting !isValid() || isPhysical() when expensive checks are on. Depends on D65554 Reviewers: arsenm Subscribers: wdng, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D65599 llvm-svn: 367711
This commit is contained in:
parent
6449e66c97
commit
22e7bf14f7
@ -105,6 +105,10 @@ public:
|
||||
return Reg;
|
||||
}
|
||||
|
||||
operator MCRegister() const {
|
||||
return MCRegister(Reg);
|
||||
}
|
||||
|
||||
bool isValid() const {
|
||||
return Reg != 0;
|
||||
}
|
||||
|
@ -14,10 +14,12 @@
|
||||
namespace llvm {
|
||||
|
||||
/// Wrapper class representing physical registers. Should be passed by value.
|
||||
/// Note that this class is not fully implemented at this time. A more complete
|
||||
/// implementation will follow.
|
||||
class MCRegister {
|
||||
unsigned Reg;
|
||||
|
||||
public:
|
||||
MCRegister(unsigned Val = 0): Reg(Val) {}
|
||||
|
||||
// Register numbers can represent physical registers, virtual registers, and
|
||||
// sometimes stack slots. The unsigned values are divided into these ranges:
|
||||
//
|
||||
@ -46,9 +48,22 @@ public:
|
||||
assert(!isStackSlot(Reg) && "Not a register! Check isStackSlot() first.");
|
||||
return int(Reg) > 0;
|
||||
}
|
||||
|
||||
/// Return true if the specified register number is in the physical register
|
||||
/// namespace.
|
||||
bool isPhysical() const {
|
||||
return isPhysicalRegister(Reg);
|
||||
}
|
||||
|
||||
operator unsigned() const {
|
||||
return Reg;
|
||||
}
|
||||
|
||||
bool isValid() const {
|
||||
return Reg != 0;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // ifndef LLVM_MC_REGISTER_H
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/iterator_range.h"
|
||||
#include "llvm/MC/LaneBitmask.h"
|
||||
#include "llvm/MC/MCRegister.h"
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <utility>
|
||||
@ -65,16 +66,17 @@ public:
|
||||
|
||||
/// contains - Return true if the specified register is included in this
|
||||
/// register class. This does not include virtual registers.
|
||||
bool contains(unsigned Reg) const {
|
||||
unsigned InByte = Reg % 8;
|
||||
unsigned Byte = Reg / 8;
|
||||
bool contains(MCRegister Reg) const {
|
||||
unsigned RegNo = unsigned(Reg);
|
||||
unsigned InByte = RegNo % 8;
|
||||
unsigned Byte = RegNo / 8;
|
||||
if (Byte >= RegSetSize)
|
||||
return false;
|
||||
return (RegSet[Byte] & (1 << InByte)) != 0;
|
||||
}
|
||||
|
||||
/// contains - Return true if both registers are in this class.
|
||||
bool contains(unsigned Reg1, unsigned Reg2) const {
|
||||
bool contains(MCRegister Reg1, MCRegister Reg2) const {
|
||||
return contains(Reg1) && contains(Reg2);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user