From 73c47db8c767a056df433a61ca2beb5a1e8e42c1 Mon Sep 17 00:00:00 2001 From: bxing Date: Sun, 8 Oct 2006 08:45:59 +0000 Subject: [PATCH] Optimized HighBitSetXX() functions git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1689 6f19259b-4bc3-4df7-8a09-765794883524 --- MdePkg/Library/BaseLib/HighBitSet32.c | 5 ++++- MdePkg/Library/BaseLib/HighBitSet64.c | 19 ++++++++++++++----- 2 files changed, 18 insertions(+), 6 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; + 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; + } }