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; + if (Operand == (UINT32)Operand) { + // + // Operand is just a 32-bit integer + // + return HighBitSet32 ((UINT32)Operand); + } - for (BitIndex = -1; - Operand != 0; - BitIndex++, Operand = RShiftU64 (Operand, 1)); - return BitIndex; + // + // 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; + } }