[PATCH] D90320: [llvm][StringExtras] Use a lookup table for `hexDigitValue`

River Riddle via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 28 11:45:33 PDT 2020


rriddle updated this revision to Diff 301358.
rriddle added a comment.

Reformat LUT.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D90320/new/

https://reviews.llvm.org/D90320

Files:
  llvm/include/llvm/ADT/StringExtras.h


Index: llvm/include/llvm/ADT/StringExtras.h
===================================================================
--- llvm/include/llvm/ADT/StringExtras.h
+++ llvm/include/llvm/ADT/StringExtras.h
@@ -66,10 +66,51 @@
 ///
 /// If \p C is not a valid hex digit, -1U is returned.
 inline unsigned hexDigitValue(char C) {
-  if (C >= '0' && C <= '9') return C-'0';
-  if (C >= 'a' && C <= 'f') return C-'a'+10U;
-  if (C >= 'A' && C <= 'F') return C-'A'+10U;
-  return -1U;
+  // clang-format off
+  static unsigned LUT[255] = {
+    /// 0-47: Non hexadecimal digits
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    /// 48-57: `0`-`9` hexadecimal digits
+    0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+    /// 58-64: Non hexadecimal digits
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    /// 65-70: `A`-`F` hexadecimal digits
+    10, 11, 12, 13, 14, 15,
+    /// 71-96: Non hexadecimal digits
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U,
+    /// 97-102: `a`-`f` hexadecimal digits
+    10, 11, 12, 13, 14, 15,
+    /// 103-254: Non hexadecimal digits
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U,
+    -1U, -1U, -1U, -1U, -1U, -1U, -1U, -1U
+  };
+  // clang-format on
+  return LUT[static_cast<unsigned char>(C)];
 }
 
 /// Checks if character \p C is one of the 10 decimal digits.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D90320.301358.patch
Type: text/x-patch
Size: 2359 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201028/3fceed31/attachment.bin>


More information about the llvm-commits mailing list