aboutsummaryrefslogtreecommitdiffstats
path: root/utils/TableGen
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2011-07-23 00:47:49 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2011-07-23 00:47:49 +0000
commit9df8567548e15c6cd91e8a5851784574c4f09528 (patch)
treeca330eda2982a502af105fa23fd3dffd87e1aef5 /utils/TableGen
parentf496d68493acf8d178afbbe8c3146ea09bd7776b (diff)
downloadexternal_llvm-9df8567548e15c6cd91e8a5851784574c4f09528.zip
external_llvm-9df8567548e15c6cd91e8a5851784574c4f09528.tar.gz
external_llvm-9df8567548e15c6cd91e8a5851784574c4f09528.tar.bz2
Turn the DenseSet in MCRegisterClass into a tblgenerated bit field. This should be faster and smaller.
Goodbye static ctors and dtors! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135836 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen')
-rw-r--r--utils/TableGen/RegisterInfoEmitter.cpp40
1 files changed, 39 insertions, 1 deletions
diff --git a/utils/TableGen/RegisterInfoEmitter.cpp b/utils/TableGen/RegisterInfoEmitter.cpp
index 05411e5..8ec45d41 100644
--- a/utils/TableGen/RegisterInfoEmitter.cpp
+++ b/utils/TableGen/RegisterInfoEmitter.cpp
@@ -17,6 +17,7 @@
#include "CodeGenTarget.h"
#include "CodeGenRegisters.h"
#include "Record.h"
+#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/Format.h"
@@ -202,6 +203,30 @@ RegisterInfoEmitter::EmitRegMapping(raw_ostream &OS,
}
}
+// Helper to emit a set of bits into a constant byte array.
+class BitVectorEmitter {
+ BitVector Values;
+ unsigned Len;
+public:
+ BitVectorEmitter(unsigned L) : Len(L%8 ? ((L/8)+1)*8 : L) {
+ Values.resize(Len);
+ }
+
+ void add(unsigned v) { Values[v] = true; }
+
+ void print(raw_ostream &OS) {
+ for (unsigned i = 0, e = Len / 8; i != e; ++i) {
+ unsigned char out = 0;
+ for (unsigned ii = 0, ie = 8; ii != ie; ++ii)
+ if (Values[i * 8 + ii])
+ out |= 1 << ii;
+ OS << "0x";
+ OS.write_hex(out);
+ OS << ", ";
+ }
+ }
+};
+
//
// runMCDesc - Print out MC register descriptions.
//
@@ -320,6 +345,18 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
OS << getQualifiedName(Reg) << ", ";
}
OS << "\n };\n\n";
+
+ OS << " // " << Name << " Bit set.\n"
+ << " static const unsigned char " << Name
+ << "Bits[] = {\n ";
+ BitVectorEmitter BVE(Target.getRegBank().getRegisters().size()+1);
+ for (unsigned i = 0, e = Order.size(); i != e; ++i) {
+ Record *Reg = Order[i];
+ BVE.add(Target.getRegBank().getReg(Reg)->EnumValue);
+ }
+ BVE.print(OS);
+ OS << "\n };\n\n";
+
}
OS << "}\n\n";
@@ -337,7 +374,8 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
<< RC.CopyCost << ", "
<< RC.Allocatable << ", "
<< RC.getName() << ", " << RC.getName() << " + "
- << RC.getOrder().size()
+ << RC.getOrder().size() << ", "
+ << RC.getName() << "Bits, sizeof(" << RC.getName() << "Bits)"
<< "),\n";
}