summaryrefslogtreecommitdiffstats
path: root/MdePkg/Library/BaseLib
diff options
context:
space:
mode:
authorbxing <bxing@6f19259b-4bc3-4df7-8a09-765794883524>2006-10-08 08:45:59 +0000
committerbxing <bxing@6f19259b-4bc3-4df7-8a09-765794883524>2006-10-08 08:45:59 +0000
commit73c47db8c767a056df433a61ca2beb5a1e8e42c1 (patch)
tree7c05c8b2a1f0596a3c41f0934b36726a5fbb9fdc /MdePkg/Library/BaseLib
parentb1288fcac3c4b6663177ecccc5900a13b356fb4f (diff)
downloadedk2-73c47db8c767a056df433a61ca2beb5a1e8e42c1.tar.gz
edk2-73c47db8c767a056df433a61ca2beb5a1e8e42c1.tar.bz2
edk2-73c47db8c767a056df433a61ca2beb5a1e8e42c1.zip
Optimized HighBitSetXX() functions
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1689 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdePkg/Library/BaseLib')
-rw-r--r--MdePkg/Library/BaseLib/HighBitSet32.c5
-rw-r--r--MdePkg/Library/BaseLib/HighBitSet64.c21
2 files changed, 19 insertions, 7 deletions
diff --git a/MdePkg/Library/BaseLib/HighBitSet32.c b/MdePkg/Library/BaseLib/HighBitSet32.c
index 65f067ac1a..5ab4d7fe8d 100644
--- a/MdePkg/Library/BaseLib/HighBitSet32.c
+++ b/MdePkg/Library/BaseLib/HighBitSet32.c
@@ -36,6 +36,9 @@ HighBitSet32 (
{
INTN BitIndex;
- for (BitIndex = -1; Operand != 0; BitIndex++, Operand >>= 1);
+ if (Operand == 0) {
+ return - 1;
+ }
+ for (BitIndex = 31; (INT32)Operand > 0; BitIndex--, Operand <<= 1);
return BitIndex;
}
diff --git a/MdePkg/Library/BaseLib/HighBitSet64.c b/MdePkg/Library/BaseLib/HighBitSet64.c
index 50889777b5..6b3c585f37 100644
--- a/MdePkg/Library/BaseLib/HighBitSet64.c
+++ b/MdePkg/Library/BaseLib/HighBitSet64.c
@@ -34,10 +34,19 @@ HighBitSet64 (
IN UINT64 Operand
)
{
- INTN BitIndex;
-
- for (BitIndex = -1;
- Operand != 0;
- BitIndex++, Operand = RShiftU64 (Operand, 1));
- return BitIndex;
+ if (Operand == (UINT32)Operand) {
+ //
+ // Operand is just a 32-bit integer
+ //
+ return HighBitSet32 ((UINT32)Operand);
+ }
+
+ //
+ // Operand is really a 64-bit integer
+ //
+ if (sizeof (UINTN) == sizeof (UINT32)) {
+ return HighBitSet32 (((UINT32*)&Operand)[1]) + 32;
+ } else {
+ return HighBitSet32 ((UINT32)RShiftU64 (Operand, 32)) + 32;
+ }
}