void IdentifierInfo::DoRegLookup(const Arch& arch, SourceLocation source, DiagnosticsEngine& diags) { if (m_flags & DID_REG_LOOKUP) return; ++num_reg_lookup; m_flags &= ~(IS_REGISTER | IS_REGGROUP | IS_SEGREG | IS_TARGETMOD); Arch::RegTmod regtmod = arch.ParseCheckRegTmod(getName(), source, diags); switch (regtmod.getType()) { case Arch::RegTmod::REG: ++num_reg_lookup_reg; m_reg = const_cast<Register*>(regtmod.getReg()); m_flags |= IS_REGISTER; break; case Arch::RegTmod::REGGROUP: ++num_reg_lookup_reggroup; m_reg = const_cast<RegisterGroup*>(regtmod.getRegGroup()); m_flags |= IS_REGGROUP; break; case Arch::RegTmod::SEGREG: ++num_reg_lookup_segreg; m_reg = const_cast<SegmentRegister*>(regtmod.getSegReg()); m_flags |= IS_SEGREG; break; case Arch::RegTmod::TARGETMOD: ++num_reg_lookup_targetmod; m_reg = const_cast<TargetModifier*>(regtmod.getTargetMod()); m_flags |= IS_TARGETMOD; break; default: ++num_reg_lookup_none; break; } m_flags |= DID_REG_LOOKUP; }