Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: How to reverse a Reverse BitBoard!

Author: Dann Corbit

Date: 15:29:09 01/21/03

Go up one level in this thread


On January 21, 2003 at 17:48:29, Sander de Zoete wrote:

>Dan,
>
>Thanks for the code, I found the following algorithm on the internet to
>reverse the board. My P3-laptop does not support SSE, so I have to walk right
>over to my P4: Meanwhile, here is what I'm working on.
>
>BITBOARD RevBoard(BITBOARD bb) // MMX
>{
>    static const __int64 C55 = 0x5555555555555555;
>    static const __int64 C33 = 0x3333333333333333;
>    static const __int64 C0F = 0x0F0F0F0F0F0F0F0F;
>    asm {
>        //  Load Bitboard into MMX
>        movq        mm0,    qword ptr bb
>        //  1.  x = [(x shl 1) and C55] or [(x and C55) shr 1]
>        movq        mm1,    mm0
>		psllq       mm0,    1
>        pand        mm0,    C55
>        pand        mm1,    C55
>        psrlq       mm1,    1
>        por         mm0,    mm1
>        //  2.  x = [(x shl 2) and C33] or [(x and C33) shr 2]
>        movq        mm1,    mm0
>		psllq       mm0,    2
>        pand        mm0,    C33
>        pand        mm1,    C33
>        psrlq       mm1,    2
>        por         mm0,    mm1
>        //  3.  x = [(x shl 4) and C0F] or [(x and C0F) shr 4]
>        movq        mm1,    mm0
>		psllq       mm0,    4
>        pand        mm0,    C0F
>        pand        mm1,    C0F
>        psrlq       mm1,    4
>        por         mm0,    mm1
>        //  4.  x = (x shlw 8) or (x shrw 8) 0123456789ABCDEF
>        movq        mm1,    mm0
>		psllq       mm0,    8
>        pand        mm0,    C0F
>        pand        mm1,    C0F
>        psrlq       mm1,    8
>        por         mm0,    mm1
>        //  5.  x = x pshufw 00011011b (not supported on P3)
>        pshufw      mm0,    00011011b
>
>        //  Unload bitboard from MMX
>        movq        mm1,    mm0
>        psrlq       mm1,    32
>        movd        eax,    mm0
>        movd        edx,    mm1
>        }
>}
>
>pshufw, is not supported on this PC.

From here:
http://www.cpuid.com/sse/PSHUFW.htm

This is what it accomplishes:
mm1[15-0]   = ( mm2/m64 >> (imm8[1-0] * 16) )[15-0];
mm1[31-16]  = ( mm2/m64 >> (imm8[3-2] * 16) )[15-0];
mm1[47-32]  = ( mm2/m64 >> (imm8[5-4] * 16) )[15-0];
mm1[63-48]  = ( mm2/m64 >> (imm8[7-6] * 16) )[15-0];



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.