Optimized HighBitSetXX() functions
authorbxing <bxing@6f19259b-4bc3-4df7-8a09-765794883524>
Sun, 8 Oct 2006 08:45:59 +0000 (08:45 +0000)
committerbxing <bxing@6f19259b-4bc3-4df7-8a09-765794883524>
Sun, 8 Oct 2006 08:45:59 +0000 (08:45 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1689 6f19259b-4bc3-4df7-8a09-765794883524

MdePkg/Library/BaseLib/HighBitSet32.c
MdePkg/Library/BaseLib/HighBitSet64.c

index 65f067a..5ab4d7f 100644 (file)
@@ -36,6 +36,9 @@ HighBitSet32 (
 {\r
   INTN                              BitIndex;\r
 \r
-  for (BitIndex = -1; Operand != 0; BitIndex++, Operand >>= 1);\r
+  if (Operand == 0) {\r
+    return - 1;\r
+  }\r
+  for (BitIndex = 31; (INT32)Operand > 0; BitIndex--, Operand <<= 1);\r
   return BitIndex;\r
 }\r
index 5088977..6b3c585 100644 (file)
@@ -34,10 +34,19 @@ HighBitSet64 (
   IN      UINT64                    Operand\r
   )\r
 {\r
-  INTN                              BitIndex;\r
-\r
-  for (BitIndex = -1;\r
-       Operand != 0;\r
-       BitIndex++, Operand = RShiftU64 (Operand, 1));\r
-  return BitIndex;\r
+  if (Operand == (UINT32)Operand) {\r
+    //\r
+    // Operand is just a 32-bit integer\r
+    //\r
+    return HighBitSet32 ((UINT32)Operand);\r
+  }\r
+\r
+  //\r
+  // Operand is really a 64-bit integer\r
+  //\r
+  if (sizeof (UINTN) == sizeof (UINT32)) {\r
+    return HighBitSet32 (((UINT32*)&Operand)[1]) + 32;\r
+  } else {\r
+    return HighBitSet32 ((UINT32)RShiftU64 (Operand, 32)) + 32;\r
+  }\r
 }\r