Author: Gerd Isenberg
Date: 03:22:22 05/15/05
Go up one level in this thread
On May 14, 2005 at 18:47:38, Tony Werten wrote:
>Hi,
>
>when I use the compiler intrinsic __ull_rshift it has the (undocumented) feature
>of wrapping the shift amount around 32.
>
>What do I have to use to shift with more than 32 ?
>
>Cheers,
>
>Tony
Yes, __ull_rshift seems to be wrong documented.
It produces the shortest code, a shrd and a shr instruction with implicit nShift
mod 32. Performant - but only correct for nShifts < 32.
Shift right operand works correct on unsigned __int64 for all nShift mod 64 but
requires a call and some conditional jumps depending on nShift.
extern "C"
unsigned __int64 __ull_rshift(unsigned __int64 mask, int nBit);
#pragma intrinsic(__ull_rshift)
void test_Shr()
{
BitBoard b1 = 0x123456789abcdef0;
for (int i = 1; i < 64; i++)
{
BitBoard b2 = __ull_rshift(b1, i);
BitBoard b3 = b1 >> i;
if ( b2 != b3 )
__debugbreak();
}
}
Cheers,
Gerd
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.