1
0
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:
Daniel Sanders 2019-08-02 19:37:17 +00:00
parent 6449e66c97
commit 22e7bf14f7
3 changed files with 28 additions and 7 deletions

View File

@ -105,6 +105,10 @@ public:
return Reg;
}
operator MCRegister() const {
return MCRegister(Reg);
}
bool isValid() const {
return Reg != 0;
}

View File

@ -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

View File

@ -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);
}