[AArch64] Don't store available subtarget features in AArch64SysReg::SysRegMapper

Subtarget features must not be a part of the target machine. So, they are now not being stored in SysRegMapper, but provided each time fromString()/toString() are called

Reviewers: jmolloy

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D8655


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233386 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Vladimir Sukharev
2015-03-27 17:11:29 +00:00
parent c18ea8d96e
commit 0c27224d25
4 changed files with 20 additions and 20 deletions

View File

@@ -2638,13 +2638,15 @@ AArch64AsmParser::tryParseSysReg(OperandVector &Operands) {
return MatchOperand_NoMatch; return MatchOperand_NoMatch;
bool IsKnown; bool IsKnown;
auto MRSMapper = AArch64SysReg::MRSMapper(STI.getFeatureBits()); auto MRSMapper = AArch64SysReg::MRSMapper();
uint32_t MRSReg = MRSMapper.fromString(Tok.getString(), IsKnown); uint32_t MRSReg = MRSMapper.fromString(Tok.getString(), STI.getFeatureBits(),
IsKnown);
assert(IsKnown == (MRSReg != -1U) && assert(IsKnown == (MRSReg != -1U) &&
"register should be -1 if and only if it's unknown"); "register should be -1 if and only if it's unknown");
auto MSRMapper = AArch64SysReg::MSRMapper(STI.getFeatureBits()); auto MSRMapper = AArch64SysReg::MSRMapper();
uint32_t MSRReg = MSRMapper.fromString(Tok.getString(), IsKnown); uint32_t MSRReg = MSRMapper.fromString(Tok.getString(), STI.getFeatureBits(),
IsKnown);
assert(IsKnown == (MSRReg != -1U) && assert(IsKnown == (MSRReg != -1U) &&
"register should be -1 if and only if it's unknown"); "register should be -1 if and only if it's unknown");

View File

@@ -1276,8 +1276,8 @@ void AArch64InstPrinter::printMRSSystemRegister(const MCInst *MI, unsigned OpNo,
raw_ostream &O) { raw_ostream &O) {
unsigned Val = MI->getOperand(OpNo).getImm(); unsigned Val = MI->getOperand(OpNo).getImm();
auto Mapper = AArch64SysReg::MRSMapper(getAvailableFeatures()); auto Mapper = AArch64SysReg::MRSMapper();
std::string Name = Mapper.toString(Val); std::string Name = Mapper.toString(Val, getAvailableFeatures());
O << StringRef(Name).upper(); O << StringRef(Name).upper();
} }
@@ -1286,8 +1286,8 @@ void AArch64InstPrinter::printMSRSystemRegister(const MCInst *MI, unsigned OpNo,
raw_ostream &O) { raw_ostream &O) {
unsigned Val = MI->getOperand(OpNo).getImm(); unsigned Val = MI->getOperand(OpNo).getImm();
auto Mapper = AArch64SysReg::MSRMapper(getAvailableFeatures()); auto Mapper = AArch64SysReg::MSRMapper();
std::string Name = Mapper.toString(Val); std::string Name = Mapper.toString(Val, getAvailableFeatures());
O << StringRef(Name).upper(); O << StringRef(Name).upper();
} }

View File

@@ -245,8 +245,7 @@ const AArch64NamedImmMapper::Mapping AArch64SysReg::MRSMapper::MRSMappings[] = {
{"ich_elsr_el2", ICH_ELSR_EL2} {"ich_elsr_el2", ICH_ELSR_EL2}
}; };
AArch64SysReg::MRSMapper::MRSMapper(uint64_t FeatureBits) AArch64SysReg::MRSMapper::MRSMapper() {
: SysRegMapper(FeatureBits) {
InstMappings = &MRSMappings[0]; InstMappings = &MRSMappings[0];
NumInstMappings = llvm::array_lengthof(MRSMappings); NumInstMappings = llvm::array_lengthof(MRSMappings);
} }
@@ -269,8 +268,7 @@ const AArch64NamedImmMapper::Mapping AArch64SysReg::MSRMapper::MSRMappings[] = {
{"icc_sgi0r_el1", ICC_SGI0R_EL1} {"icc_sgi0r_el1", ICC_SGI0R_EL1}
}; };
AArch64SysReg::MSRMapper::MSRMapper(uint64_t FeatureBits) AArch64SysReg::MSRMapper::MSRMapper() {
: SysRegMapper(FeatureBits) {
InstMappings = &MSRMappings[0]; InstMappings = &MSRMappings[0];
NumInstMappings = llvm::array_lengthof(MSRMappings); NumInstMappings = llvm::array_lengthof(MSRMappings);
} }
@@ -761,7 +759,8 @@ AArch64SysReg::SysRegMapper::CycloneSysRegMappings[] = {
}; };
uint32_t uint32_t
AArch64SysReg::SysRegMapper::fromString(StringRef Name, bool &Valid) const { AArch64SysReg::SysRegMapper::fromString(StringRef Name, uint64_t FeatureBits,
bool &Valid) const {
std::string NameLower = Name.lower(); std::string NameLower = Name.lower();
// First search the registers shared by all // First search the registers shared by all
@@ -814,7 +813,7 @@ AArch64SysReg::SysRegMapper::fromString(StringRef Name, bool &Valid) const {
} }
std::string std::string
AArch64SysReg::SysRegMapper::toString(uint32_t Bits) const { AArch64SysReg::SysRegMapper::toString(uint32_t Bits, uint64_t FeatureBits) const {
// First search the registers shared by all // First search the registers shared by all
for (unsigned i = 0; i < array_lengthof(SysRegMappings); ++i) { for (unsigned i = 0; i < array_lengthof(SysRegMappings); ++i) {
if (SysRegMappings[i].Value == Bits) { if (SysRegMappings[i].Value == Bits) {

View File

@@ -1139,21 +1139,20 @@ namespace AArch64SysReg {
const AArch64NamedImmMapper::Mapping *InstMappings; const AArch64NamedImmMapper::Mapping *InstMappings;
size_t NumInstMappings; size_t NumInstMappings;
uint64_t FeatureBits;
SysRegMapper(uint64_t FeatureBits) : FeatureBits(FeatureBits) { } SysRegMapper() { }
uint32_t fromString(StringRef Name, bool &Valid) const; uint32_t fromString(StringRef Name, uint64_t FeatureBits, bool &Valid) const;
std::string toString(uint32_t Bits) const; std::string toString(uint32_t Bits, uint64_t FeatureBits) const;
}; };
struct MSRMapper : SysRegMapper { struct MSRMapper : SysRegMapper {
static const AArch64NamedImmMapper::Mapping MSRMappings[]; static const AArch64NamedImmMapper::Mapping MSRMappings[];
MSRMapper(uint64_t FeatureBits); MSRMapper();
}; };
struct MRSMapper : SysRegMapper { struct MRSMapper : SysRegMapper {
static const AArch64NamedImmMapper::Mapping MRSMappings[]; static const AArch64NamedImmMapper::Mapping MRSMappings[];
MRSMapper(uint64_t FeatureBits); MRSMapper();
}; };
uint32_t ParseGenericRegister(StringRef Name, bool &Valid); uint32_t ParseGenericRegister(StringRef Name, bool &Valid);