Extract a slightly more general BitVector printer.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 30 Sep 2011 22:18:54 +0000 (22:18 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 30 Sep 2011 22:18:54 +0000 (22:18 +0000)
This one can also print 32-bit groups.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140897 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/RegisterInfoEmitter.cpp

index b784e738e0764d454281b54dc432567fa61b23b2..c00c7aa62df0ad2c91be49f60ef5d624cb8c63f2 100644 (file)
@@ -205,6 +205,21 @@ RegisterInfoEmitter::EmitRegMapping(raw_ostream &OS,
   }
 }
 
+// Print a BitVector as a sequence of hex numbers using a little-endian mapping.
+// Width is the number of bits per hex number.
+static void printBitVectorAsHex(raw_ostream &OS,
+                                const BitVector &Bits,
+                                unsigned Width) {
+  assert(Width <= 32 && "Width too large");
+  unsigned Digits = (Width + 3) / 4;
+  for (unsigned i = 0, e = Bits.size(); i < e; i += Width) {
+    unsigned Value = 0;
+    for (unsigned j = 0; j != Width && i + j != e; ++j)
+      Value |= Bits.test(i + j) << j;
+    OS << format("0x%0*x, ", Digits, Value);
+  }
+}
+
 // Helper to emit a set of bits into a constant byte array.
 class BitVectorEmitter {
   BitVector Values;
@@ -216,13 +231,7 @@ public:
   }
 
   void print(raw_ostream &OS) {
-    for (unsigned i = 0, e = Values.size() / 8; i != e; ++i) {
-      unsigned char out = 0;
-      for (unsigned j = 0; j != 8; ++j)
-        if (Values[i * 8 + j])
-          out |= 1 << j;
-      OS << format("0x%02x, ", out);
-    }
+    printBitVectorAsHex(OS, Values, 8);
   }
 };