The definition for _BitScanReverse in WinNT.h is broken, and most probably the other 3 similar functions are in the same situation. With the following very simple test source file, the attached assembly file is obtained.
****
#include <windows.h>
#include <stdio.h>
unsigned int foo(long unsigned int Val)
{ long unsigned int Res1,Res2;
_BitScanReverse(&Res1,Val);
Res2=__builtin_clz(Val)^0x1F;
return Res2-Res1;
}
int main()
{ printf("Result %u",foo(rand()));
return 0;
}
****
In theory _BitScanReverse() and __builtin_clz()^0x1F should provide the same result. In the generated assembly code is clearly visible that _BitScanReverse has as input value some uninitialized value on the stack.
Resulting assembly file