X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=utils%2FTableGen%2FRegisterInfoEmitter.cpp;h=d514bf7deb8fc02e5a7fb0ce9e1725cc9f855dae;hb=abb1f1688172cf6f3c5bc539841da76053f23533;hp=366447403242ccb60b6d04439091bf1bf3997a03;hpb=b43f7e05ffbc4ff0bb1211e1d47c97b81cc806d8;p=oota-llvm.git diff --git a/utils/TableGen/RegisterInfoEmitter.cpp b/utils/TableGen/RegisterInfoEmitter.cpp index 36644740324..d514bf7deb8 100644 --- a/utils/TableGen/RegisterInfoEmitter.cpp +++ b/utils/TableGen/RegisterInfoEmitter.cpp @@ -473,10 +473,12 @@ void RegisterInfoEmitter::run(std::ostream &OS) { NumSubRegs += RegisterSubRegs[Regs[i].TheDef].size(); } - unsigned SubregHashTableSize = NextPowerOf2(2 * NumSubRegs); + unsigned SubregHashTableSize = 2 * NextPowerOf2(2 * NumSubRegs); unsigned* SubregHashTable = new unsigned[2 * SubregHashTableSize]; std::fill(SubregHashTable, SubregHashTable + 2 * SubregHashTableSize, ~0U); + unsigned hashMisses = 0; + for (unsigned i = 0, e = Regs.size(); i != e; ++i) { Record* R = Regs[i].TheDef; for (std::set::iterator I = RegisterSubRegs[R].begin(), @@ -491,6 +493,8 @@ void RegisterInfoEmitter::run(std::ostream &OS) { SubregHashTable[index*2+1] != ~0U) { index = (index + ProbeAmt) & (SubregHashTableSize-1); ProbeAmt += 2; + + hashMisses++; } SubregHashTable[index*2] = i; @@ -498,32 +502,39 @@ void RegisterInfoEmitter::run(std::ostream &OS) { } } + OS << "\n\n // Number of hash collisions: " << hashMisses << "\n"; + if (SubregHashTableSize) { std::string Namespace = Regs[0].TheDef->getValueAsString("Namespace"); - OS << "\n\n unsigned SubregHashTable[] = {"; + OS << " const unsigned SubregHashTable[] = { "; for (unsigned i = 0; i < SubregHashTableSize - 1; ++i) { + if (i != 0) + // Insert spaces for nice formatting. + OS << " "; + if (SubregHashTable[2*i] != ~0U) { OS << getQualifiedName(Regs[SubregHashTable[2*i]].TheDef) << ", " - << getQualifiedName(Regs[SubregHashTable[2*i+1]].TheDef) << ", "; + << getQualifiedName(Regs[SubregHashTable[2*i+1]].TheDef) << ", \n"; } else { - OS << Namespace << "::NoRegister, " << Namespace << "::NoRegister, "; + OS << Namespace << "::NoRegister, " << Namespace << "::NoRegister, \n"; } } unsigned Idx = SubregHashTableSize*2-2; if (SubregHashTable[Idx] != ~0U) { - OS << getQualifiedName(Regs[SubregHashTable[Idx]].TheDef) << ", " - << getQualifiedName(Regs[SubregHashTable[Idx+1]].TheDef) << "};\n"; + OS << " " + << getQualifiedName(Regs[SubregHashTable[Idx]].TheDef) << ", " + << getQualifiedName(Regs[SubregHashTable[Idx+1]].TheDef) << " };\n"; } else { - OS << Namespace << "::NoRegister, " << Namespace << "::NoRegister};\n"; + OS << Namespace << "::NoRegister, " << Namespace << "::NoRegister };\n"; } - OS << " unsigned SubregHashTableSize = " + OS << " const unsigned SubregHashTableSize = " << SubregHashTableSize << ";\n"; } else { - OS << "\n\n unsigned SubregHashTable[] = { ~0U, ~0U };\n" - << " unsigned SubregHashTableSize = 1;\n"; + OS << " const unsigned SubregHashTable[] = { ~0U, ~0U };\n" + << " const unsigned SubregHashTableSize = 1;\n"; } delete [] SubregHashTable; @@ -601,16 +612,7 @@ void RegisterInfoEmitter::run(std::ostream &OS) { else OS << Reg.getName(); OS << "\",\t\""; - if (!Reg.TheDef->getValueAsString("Name").empty()) { - OS << Reg.TheDef->getValueAsString("Name"); - } else { - // Default to "name". - if (!Reg.TheDef->getValueAsString("AsmName").empty()) - OS << Reg.TheDef->getValueAsString("AsmName"); - else - OS << Reg.getName(); - } - OS << "\",\t"; + OS << Reg.getName() << "\",\t"; if (RegisterAliases.count(Reg.TheDef)) OS << Reg.getName() << "_AliasSet,\t"; else @@ -672,9 +674,8 @@ void RegisterInfoEmitter::run(std::ostream &OS) { << "(int CallFrameSetupOpcode, int CallFrameDestroyOpcode)\n" << " : TargetRegisterInfo(RegisterDescriptors, " << Registers.size()+1 << ", RegisterClasses, RegisterClasses+" << RegisterClasses.size() <<",\n " - << " CallFrameSetupOpcode, CallFrameDestroyOpcode) {\n" - << " this->SubregHash = SubregHashTable;\n" - << " this->SubregHashSize = SubregHashTableSize;\n" + << " CallFrameSetupOpcode, CallFrameDestroyOpcode,\n" + << " SubregHashTable, SubregHashTableSize) {\n" << "}\n\n"; // Collect all information about dwarf register numbers