summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@gmail.com>2014-11-24 02:08:35 +0000
committerCraig Topper <craig.topper@gmail.com>2014-11-24 02:08:35 +0000
commitba6d83e64b1923ccf56c843fdbb0fee11c45c5aa (patch)
treec4dca0865d81ecd6566ef39a19ebb1a4f27bbf4b
parent79f226e780449291f5905fac05c0ae864068a28d (diff)
downloadbcm5719-llvm-ba6d83e64b1923ccf56c843fdbb0fee11c45c5aa.tar.gz
bcm5719-llvm-ba6d83e64b1923ccf56c843fdbb0fee11c45c5aa.zip
Detect best type for some static index tables instead of just using uint32_t to reduce total data size.
llvm-svn: 222643
-rw-r--r--llvm/utils/TableGen/AsmWriterEmitter.cpp39
1 files changed, 24 insertions, 15 deletions
diff --git a/llvm/utils/TableGen/AsmWriterEmitter.cpp b/llvm/utils/TableGen/AsmWriterEmitter.cpp
index 7ef70d31b69..7d26aee24f8 100644
--- a/llvm/utils/TableGen/AsmWriterEmitter.cpp
+++ b/llvm/utils/TableGen/AsmWriterEmitter.cpp
@@ -520,6 +520,15 @@ void AsmWriterEmitter::EmitPrintInstruction(raw_ostream &O) {
O << "}\n";
}
+static const char *getMinimalTypeForRange(uint64_t Range) {
+ assert(Range < 0xFFFFFFFFULL && "Enum too large");
+ if (Range > 0xFFFF)
+ return "uint32_t";
+ if (Range > 0xFF)
+ return "uint16_t";
+ return "uint8_t";
+}
+
static void
emitRegisterNameString(raw_ostream &O, StringRef AltName,
const std::vector<CodeGenRegister*> &Registers) {
@@ -564,7 +573,8 @@ emitRegisterNameString(raw_ostream &O, StringRef AltName,
StringTable.emit(O, printChar);
O << " };\n\n";
- O << " static const uint32_t RegAsmOffset" << AltName << "[] = {";
+ O << " static const " << getMinimalTypeForRange(StringTable.size()-1)
+ << " RegAsmOffset" << AltName << "[] = {";
for (unsigned i = 0, e = Registers.size(); i != e; ++i) {
if ((i % 14) == 0)
O << "\n ";
@@ -602,26 +612,25 @@ void AsmWriterEmitter::EmitGetRegisterName(raw_ostream &O) {
emitRegisterNameString(O, "", Registers);
if (hasAltNames) {
- O << " const uint32_t *RegAsmOffset;\n"
- << " const char *AsmStrs;\n"
- << " switch(AltIdx) {\n"
+ O << " switch(AltIdx) {\n"
<< " default: llvm_unreachable(\"Invalid register alt name index!\");\n";
for (unsigned i = 0, e = AltNameIndices.size(); i < e; ++i) {
std::string Namespace = AltNameIndices[1]->getValueAsString("Namespace");
std::string AltName(AltNameIndices[i]->getName());
- O << " case " << Namespace << "::" << AltName
- << ":\n"
- << " AsmStrs = AsmStrs" << AltName << ";\n"
- << " RegAsmOffset = RegAsmOffset" << AltName << ";\n"
- << " break;\n";
+ O << " case " << Namespace << "::" << AltName << ":\n"
+ << " assert(*(AsmStrs" << AltName << "+RegAsmOffset"
+ << AltName << "[RegNo-1]) &&\n"
+ << " \"Invalid alt name index for register!\");\n"
+ << " return AsmStrs" << AltName << "+RegAsmOffset"
+ << AltName << "[RegNo-1];\n";
}
- O << "}\n";
+ O << " }\n";
+ } else {
+ O << " assert (*(AsmStrs+RegAsmOffset[RegNo-1]) &&\n"
+ << " \"Invalid alt name index for register!\");\n"
+ << " return AsmStrs+RegAsmOffset[RegNo-1];\n";
}
-
- O << " assert (*(AsmStrs+RegAsmOffset[RegNo-1]) &&\n"
- << " \"Invalid alt name index for register!\");\n"
- << " return AsmStrs+RegAsmOffset[RegNo-1];\n"
- << "}\n";
+ O << "}\n";
}
namespace {
OpenPOWER on IntegriCloud