summaryrefslogtreecommitdiff
path: root/utils/TableGen/AsmWriterEmitter.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-07-18 17:43:54 +0000
committerChris Lattner <sabre@nondot.org>2006-07-18 17:43:54 +0000
commite7a589df09ed4d1f0853fb586609b00357a34ac2 (patch)
treee97a9cfe1dbae9da8613d3f1a86918a3b47045d2 /utils/TableGen/AsmWriterEmitter.cpp
parentb51ecd4dd93b8eccf2cba3d541cff0f7cdbf7e1c (diff)
downloadllvm-e7a589df09ed4d1f0853fb586609b00357a34ac2.tar.gz
llvm-e7a589df09ed4d1f0853fb586609b00357a34ac2.tar.bz2
llvm-e7a589df09ed4d1f0853fb586609b00357a34ac2.tar.xz
Emit switches with 1/2 cases as unconditional code or an if/then/else for
tidyness. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29181 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/AsmWriterEmitter.cpp')
-rw-r--r--utils/TableGen/AsmWriterEmitter.cpp34
1 files changed, 24 insertions, 10 deletions
diff --git a/utils/TableGen/AsmWriterEmitter.cpp b/utils/TableGen/AsmWriterEmitter.cpp
index f84ebbfad4..9802c3aaf5 100644
--- a/utils/TableGen/AsmWriterEmitter.cpp
+++ b/utils/TableGen/AsmWriterEmitter.cpp
@@ -560,18 +560,32 @@ void AsmWriterEmitter::run(std::ostream &O) {
BitsLeft -= NumBits;
O << "\n // Fragment " << i << " encoded into " << NumBits
- << " bits for " << Commands.size() << " unique commands.\n"
- << " switch ((Bits >> " << (BitsLeft+AsmStrBits) << ") & "
- << ((1 << NumBits)-1) << ") {\n"
- << " default: // unreachable.\n";
+ << " bits for " << Commands.size() << " unique commands.\n";
- // Print out all the cases.
- for (unsigned i = 0, e = Commands.size(); i != e; ++i) {
- O << " case " << i << ":\n";
- O << Commands[i];
- O << " break;\n";
+ if (Commands.size() == 1) {
+ // Only one possibility, just emit it.
+ O << Commands[0];
+ } else if (Commands.size() == 2) {
+ // Emit two possibilitys with if/else.
+ O << " if ((Bits >> " << (BitsLeft+AsmStrBits) << ") & "
+ << ((1 << NumBits)-1) << ") {\n"
+ << Commands[1]
+ << " } else {\n"
+ << Commands[0]
+ << " }\n\n";
+ } else {
+ O << " switch ((Bits >> " << (BitsLeft+AsmStrBits) << ") & "
+ << ((1 << NumBits)-1) << ") {\n"
+ << " default: // unreachable.\n";
+
+ // Print out all the cases.
+ for (unsigned i = 0, e = Commands.size(); i != e; ++i) {
+ O << " case " << i << ":\n";
+ O << Commands[i];
+ O << " break;\n";
+ }
+ O << " }\n\n";
}
- O << " }\n\n";
}
// Okay, go through and strip out the operand information that we just