Index: tools/llvm-exegesis/lib/BenchmarkResult.cpp =================================================================== --- tools/llvm-exegesis/lib/BenchmarkResult.cpp +++ tools/llvm-exegesis/lib/BenchmarkResult.cpp @@ -31,7 +31,8 @@ struct YamlContext { YamlContext(const exegesis::LLVMState &State) : State(&State), ErrorStream(LastError), - OpcodeNameToOpcodeIdx(generateOpcodeNameToOpcodeIdxMapping()) {} + OpcodeNameToOpcodeIdx(generateOpcodeNameToOpcodeIdxMapping()), + RegNameToRegNo(generateRegNameToRegNoMapping()) {} llvm::StringMap generateOpcodeNameToOpcodeIdxMapping() { const llvm::MCInstrInfo &InstrInfo = State->getInstrInfo(); @@ -42,6 +43,15 @@ return Map; }; + llvm::StringMap generateRegNameToRegNoMapping() { + const llvm::MCRegisterInfo &RegInfo = State->getRegInfo(); + llvm::StringMap Map(RegInfo.getNumRegs()); + for (unsigned I = 0, E = RegInfo.getNumRegs(); I < E; ++I) + Map.insert(std::make_pair(RegInfo.getName(I), I)); + assert(Map.size() == RegInfo.getNumRegs() && "Size prediction failed"); + return Map; + }; + void serializeMCInst(const llvm::MCInst &MCInst, llvm::raw_ostream &OS) { OS << getInstrName(MCInst.getOpcode()); for (const auto &Op : MCInst) { @@ -79,10 +89,9 @@ } unsigned getRegNo(llvm::StringRef RegName) { - const llvm::MCRegisterInfo &RegInfo = State->getRegInfo(); - for (unsigned E = RegInfo.getNumRegs(), I = 0; I < E; ++I) - if (RegInfo.getName(I) == RegName) - return I; + auto Iter = RegNameToRegNo.find(RegName); + if (Iter != RegNameToRegNo.end()) + return Iter->second; ErrorStream << "No register with name " << RegName; return 0; } @@ -158,6 +167,7 @@ std::string LastError; llvm::raw_string_ostream ErrorStream; const llvm::StringMap OpcodeNameToOpcodeIdx; + const llvm::StringMap RegNameToRegNo; }; } // namespace