Optimized HighBitSetXX() functions

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1689 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
bxing 2006-10-08 08:45:59 +00:00
parent b1288fcac3
commit 73c47db8c7
2 changed files with 18 additions and 6 deletions

View File

@ -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;
}

View File

@ -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;
}
}