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; 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; return BitIndex;
} }

View File

@ -34,10 +34,19 @@ HighBitSet64 (
IN UINT64 Operand 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; // Operand is really a 64-bit integer
BitIndex++, Operand = RShiftU64 (Operand, 1)); //
return BitIndex; if (sizeof (UINTN) == sizeof (UINT32)) {
return HighBitSet32 (((UINT32*)&Operand)[1]) + 32;
} else {
return HighBitSet32 ((UINT32)RShiftU64 (Operand, 32)) + 32;
}
} }