Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Visual C++ question

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.