Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Reverse Bitboards

Author: Gerd Isenberg

Date: 02:21:49 01/15/03

Go up one level in this thread


On January 14, 2003 at 19:23:38, Sander de Zoete wrote:

>Thanks Gerd,
>
>I also did some searching myself on the web. I ended up with a website where
>SIMD was explained together with MMX,SSE,MAJC, etc. Then I also managed to
>download the instruction sets from all these processor technologies. Can I use
>these like this in Cplusplus (Borland)

I don't know whether Borland Cplusplus supports inline assembly, and if, also
the MMX-instructions. With MSC one must install the processor pack, to use MMX
or P4s SSE2 instructions. What is MAJC?

>
>I really see a lot of potential here.
>
>// Put BITBOARD a into MMX
>void SetBitboardIntoMMX(BITBOARD a, unsigned int b)
>{
>    asm
>    {
>        movq a
>
>    }
>   // Shift a with value b to the right
>    asm
>   {
>       psrlw a, b
>
>   }
>}
>Will something like this work?

The intel asm-syntax is like

<opcode>  destination operand, source operand
<opcode>  unary destination operand

like
    mov    eax, 1   ; load immediate constant to eax
    xor    ecx, ecx ; clears ecx
    neg    edx      ; edx := -edx

most arithmetical or logical x86 instructions sets some flags (Carry = overflow,
Sign, Zero) where you can do some conditional jumps with:

    test    eax, edx ; like "and" without storing the result
    jz      label    ; jump, if no bit is set

MMX-(and SSE, SSE2 and 3DNow) Instructions are somehow different, they don't set
any flags. There is no load immediate constant. The whole MMX-instruction set is
not so stringent.
The instructions work on multiple bytes (therefore Single Instruction Multiple
Data SIMD), 16-bit words, 32-bit double words and 64-bit quad word. Shift (eg.
shift logical left: psllw, pslld, psllq) is supported for words, dwords and
qwords but not for bytes. Add and sub (paddb, paddw, paddd, psubb, psubw, psubd)
is supported for bytes, words and dwords, but no 64-arithmetic with qwords.

void SetBitboardIntoMMX(BITBOARD a, unsigned int b)
{
    asm
    {
        movq  mm5, [a]  ; load a into mm5
        movd  mm3, [b]  ; load b into mm3 with zero extension
        psrlw mm5, mm3  ; a>>b
    }
}

The "movq  mm5, [a]" becomes a huge penalty, if "a" is not properly bitboard
aligned. Because bitboard "a" pushed on the stack is not necessarily aligned, it
is recommend to use two load instructions instead of one "movq".

void SetBitboardIntoMMX(BITBOARD a, unsigned int b)
{
    asm
    {
        movd  mm5, [a]       ; load low dword a into mm5
	punpckldq mm5, [a+4] ; load high dword a into mm5

        movd  mm3, [b]  ; load b into mm3 with zero extension
        psrlw mm5, mm3  ; a>>b
    }
}

the [a] memory source operand here is really a base or stack pointer relative
memory access, like "movd mm5,[ebp+offset]". But you dont't have to care about
that, if you simply write [a]. But if a is a global variable it is "mov
reg,[address of var]".


>
>In an example a was represented by mm5 (probably the 6th memory space in MMX
>(mm0 - mm7 if I recall correctly). How do I know what is in mm5?
>

Yes, eight mmx-registers mm0-mm7. Ok you have to initialize a register via movd,
movq. To load a zero one should use pxor with same source and destination
register. To load 0xff..ff (-1) one should use pcmpeqd (parallel compare equal
double) with same source and destination register:

// input:   mm1 pawnBB
// output:  mm0 pawnAttacks
//=========================
void getBlackPawnAttacksMMX()
{
	__asm
	{
		pxor	mm4, mm4	; 0x0000000000000000
		pcmpeqd mm7, mm7	; 0xffffffffffffffff
		movq	mm0, mm1	; left
		psubb	mm4, mm7	; 0x0101010101010101
		psubb	mm7, mm4	; 0xfefefefefefefefe notA
		paddb	mm1, mm1	; right
		pand	mm0, mm7	; clear left a-file before shift
		psrlq	mm0, 1		; left
		por	mm0, mm1	; left|right
		psrlq	mm0, 8		; left|right -> down
	}
}

Gerd

>Sander.



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.