From: bxing Date: Sun, 8 Oct 2006 08:45:59 +0000 (+0000) Subject: Optimized HighBitSetXX() functions X-Git-Tag: edk2-stable201903~24185 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=73c47db8c767a056df433a61ca2beb5a1e8e42c1 Optimized HighBitSetXX() functions git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1689 6f19259b-4bc3-4df7-8a09-765794883524 --- 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; + } }