Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: flood fill attack bitboards, continuation

Author: Gerd Isenberg

Date: 08:38:48 09/21/02

Go up one level in this thread


// input:	mm1 rooks
//		mm6 freeSquares (not changed)
// output:      mm0 rookattacks
//=======================================
void getRookAttacksMMX()
{
	__asm
	{
		pxor	mm5, mm5	; 0
		pcmpeqd mm7, mm7	; 0xffffffffffffffff
		movq	mm2, mm1	; left
		psubb	mm5, mm7	; 0x0101010101010101
		movq	mm3, mm1	; up
		pxor	mm7, mm5	; 0xfefefefefefefefe notA
		movq	mm4, mm1	; down
		pand	mm2, mm7	; clear left a-file before shift
		psrlq	mm5, 32+24-3    ; 8, saves some bytes
		pand	mm7, mm6	; to clear left occupied or a-file
		// 1. straight fill in each direction
		psrlq	mm2, 1		; left
		paddb	mm1, mm1	; right
		psllq	mm3, mm5	; up
		psrlq	mm4, mm5	; down
		movq	mm0, mm2	; rookAttacks |= left
		por	mm0, mm1	; rookAttacks |= right
		por	mm0, mm3	; rookAttacks |= up
		por	mm0, mm4	; rookAttacks |= down
		pand	mm2, mm7	; clear left occupied or a file
		pand	mm1, mm6	; clear right occupied
		pand	mm3, mm6	; clear up occupied
		pand	mm4, mm6	; clear down occupied
		// 2. straight fill in each direction
		psrlq	mm2, 1		; left
		paddb	mm1, mm1	; right
		psllq	mm3, mm5	; up
		psrlq	mm4, mm5	; down
		por	mm0, mm2	; rookAttacks |= left
		por	mm0, mm1	; rookAttacks |= right
		por	mm0, mm3	; rookAttacks |= up
		por	mm0, mm4	; rookAttacks |= down
		pand	mm2, mm7	; clear left occupied or a file
		pand	mm1, mm6	; clear right occupied
		pand	mm3, mm6	; clear up occupied
		pand	mm4, mm6	; clear down occupied
		// 3. straight fill in each direction
		psrlq	mm2, 1		; left
		paddb	mm1, mm1	; right
		psllq	mm3, mm5	; up
		psrlq	mm4, mm5	; down
		por	mm0, mm2	; rookAttacks |= left
		por	mm0, mm1	; rookAttacks |= right
		por	mm0, mm3	; rookAttacks |= up
		por	mm0, mm4	; rookAttacks |= down
		pand	mm2, mm7	; clear left occupied or a file
		pand	mm1, mm6	; clear right occupied
		pand	mm3, mm6	; clear up occupied
		pand	mm4, mm6	; clear down occupied
		// 4. straight fill in each direction
		psrlq	mm2, 1		; left
		paddb	mm1, mm1	; right
		psllq	mm3, mm5	; up
		psrlq	mm4, mm5	; down
		por	mm0, mm2	; rookAttacks |= left
		por	mm0, mm1	; rookAttacks |= right
		por	mm0, mm3	; rookAttacks |= up
		por	mm0, mm4	; rookAttacks |= down
		pand	mm2, mm7	; clear left occupied or a file
		pand	mm1, mm6	; clear right occupied
		pand	mm3, mm6	; clear up occupied
		pand	mm4, mm6	; clear down occupied
		// 5. straight fill in each direction
		psrlq	mm2, 1		; left
		paddb	mm1, mm1	; right
		psllq	mm3, mm5	; up
		psrlq	mm4, mm5	; down
		por	mm0, mm2	; rookAttacks |= left
		por	mm0, mm1	; rookAttacks |= right
		por	mm0, mm3	; rookAttacks |= up
		por	mm0, mm4	; rookAttacks |= down
		pand	mm2, mm7	; clear left occupied or a file
		pand	mm1, mm6	; clear right occupied
		pand	mm3, mm6	; clear up occupied
		pand	mm4, mm6	; clear down occupied
		// 6. straight fill in each direction
		psrlq	mm2, 1		; left
		paddb	mm1, mm1	; right
		psllq	mm3, mm5	; up
		psrlq	mm4, mm5	; down
		por	mm0, mm2	; rookAttacks |= left
		por	mm0, mm1	; rookAttacks |= right
		por	mm0, mm3	; rookAttacks |= up
		por	mm0, mm4	; rookAttacks |= down
		pand	mm2, mm7	; clear left occupied or a file
		pand	mm1, mm6	; clear right occupied
		pand	mm3, mm6	; clear up occupied
		pand	mm4, mm6	; clear down occupied
		// 7. straight fill in each direction
		psrlq	mm2, 1		; left
		paddb	mm1, mm1	; right
		psllq	mm3, mm5	; up
		psrlq	mm4, mm5	; down
		por	mm0, mm2	; rookAttacks |= left
		por	mm0, mm1	; rookAttacks |= right
		por	mm0, mm3	; rookAttacks |= up
		por	mm0, mm4	; rookAttacks |= down
// performance killer movd, use movq to aligned bitboard outside
//		pswapd	mm1, mm0
//		movd	eax, mm0
//		movd	edx, mm1
	}
}

// input:	mm1 bishops
//		mm6 freeSquares (not changed)
// output:      mm0 bishopAttacks
//=======================================
void getBishopAttacksMMX()
{
	__asm
	{
		pxor	mm0, mm0	; 0
		pcmpeqd mm7, mm7	; 0xffffffffffffffff
		movq	mm2, mm1	; leftup
		psubb	mm0, mm7	; 0x0101010101010101
		movq	mm3, mm1	; leftdown
		pxor	mm7, mm0	; 0xfefefefefefefefe notA
		movq	mm4, mm1	; rightdown
		movq	mm5, mm7	; 0xfefefefefefefefe notA
		pand	mm2, mm7	; clear leftup occupied or a file
		psrlq	mm5, 1		; 0x7f7f7f7f7f7f7f7f notH
		pand	mm3, mm7	; clear leftdown occupied or a file
		pand	mm1, mm5	; clear rightup occupied or h file
		pand	mm4, mm5	; clear rightdown occupied or h file
		pand	mm7, mm6	; to clear left occupied or a-file
		pand	mm5, mm6	; to clear left occupied or h-file
		// 1. diagonal fill in each direction
		psllq	mm1, 9		; rightup
		psrlq	mm4, 7		; rightdown
		psllq	mm2, 7		; leftup
		psrlq	mm3, 9		; leftdown
		movq	mm0, mm1	; bishopAttacks |= rightup
		por	mm0, mm4	; bishopAttacks |= rightdown
		por	mm0, mm2	; bishopAttacks |= leftup
		por	mm0, mm3	; bishopAttacks |= leftdown
		pand	mm1, mm5	; clear rightup occupied or h file
		pand	mm4, mm5	; clear rightdown occupied or h file
		pand	mm2, mm7	; clear leftup occupied or a file
		pand	mm3, mm7	; clear leftdown occupied or a file
		// 2. diagonal fill in each direction
		psllq	mm1, 9		; rightup
		psrlq	mm4, 7		; rightdown
		psllq	mm2, 7		; leftup
		psrlq	mm3, 9		; leftdown
		por	mm0, mm1	; bishopAttacks |= rightup
		por	mm0, mm4	; bishopAttacks |= rightdown
		por	mm0, mm2	; bishopAttacks |= leftup
		por	mm0, mm3	; bishopAttacks |= leftdown
		pand	mm1, mm5	; clear rightup occupied or h file
		pand	mm4, mm5	; clear rightdown occupied or h file
		pand	mm2, mm7	; clear leftup occupied or a file
		pand	mm3, mm7	; clear leftdown occupied or a file
		// 3. diagonal fill in each direction
		psllq	mm1, 9		; rightup
		psrlq	mm4, 7		; rightdown
		psllq	mm2, 7		; leftup
		psrlq	mm3, 9		; leftdown
		por	mm0, mm1	; bishopAttacks |= rightup
		por	mm0, mm4	; bishopAttacks |= rightdown
		por	mm0, mm2	; bishopAttacks |= leftup
		por	mm0, mm3	; bishopAttacks |= leftdown
		pand	mm1, mm5	; clear rightup occupied or h file
		pand	mm4, mm5	; clear rightdown occupied or h file
		pand	mm2, mm7	; clear leftup occupied or a file
		pand	mm3, mm7	; clear leftdown occupied or a file
		// 4. diagonal fill in each direction
		psllq	mm1, 9		; rightup
		psrlq	mm4, 7		; rightdown
		psllq	mm2, 7		; leftup
		psrlq	mm3, 9		; leftdown
		por	mm0, mm1	; bishopAttacks |= rightup
		por	mm0, mm4	; bishopAttacks |= rightdown
		por	mm0, mm2	; bishopAttacks |= leftup
		por	mm0, mm3	; bishopAttacks |= leftdown
		pand	mm1, mm5	; clear rightup occupied or h file
		pand	mm4, mm5	; clear rightdown occupied or h file
		pand	mm2, mm7	; clear leftup occupied or a file
		pand	mm3, mm7	; clear leftdown occupied or a file
		// 5. diagonal fill in each direction
		psllq	mm1, 9		; rightup
		psrlq	mm4, 7		; rightdown
		psllq	mm2, 7		; leftup
		psrlq	mm3, 9		; leftdown
		por	mm0, mm1	; bishopAttacks |= rightup
		por	mm0, mm4	; bishopAttacks |= rightdown
		por	mm0, mm2	; bishopAttacks |= leftup
		por	mm0, mm3	; bishopAttacks |= leftdown
		pand	mm1, mm5	; clear rightup occupied or h file
		pand	mm4, mm5	; clear rightdown occupied or h file
		pand	mm2, mm7	; clear leftup occupied or a file
		pand	mm3, mm7	; clear leftdown occupied or a file
		// 6. diagonal fill in each direction
		psllq	mm1, 9		; rightup
		psrlq	mm4, 7		; rightdown
		psllq	mm2, 7		; leftup
		psrlq	mm3, 9		; leftdown
		por	mm0, mm1	; bishopAttacks |= rightup
		por	mm0, mm4	; bishopAttacks |= rightdown
		por	mm0, mm2	; bishopAttacks |= leftup
		por	mm0, mm3	; bishopAttacks |= leftdown
		pand	mm1, mm5	; clear rightup occupied or h file
		pand	mm4, mm5	; clear rightdown occupied or h file
		pand	mm2, mm7	; clear leftup occupied or a file
		pand	mm3, mm7	; clear leftdown occupied or a file
		// 7. diagonal fill in each direction
		psllq	mm1, 9		; rightup
		psrlq	mm4, 7		; rightdown
		psllq	mm2, 7		; leftup
		psrlq	mm3, 9		; leftdown
		por	mm0, mm1	; bishopAttacks |= rightup
		por	mm0, mm4	; bishopAttacks |= rightdown
		por	mm0, mm2	; bishopAttacks |= leftup
		por	mm0, mm3	; bishopAttacks |= leftdown
	}
}

// input:	mm1 queens
//		mm6 freeSquares (not changed)
// output:      mm0 queenAttacks
//=======================================
void getQueenAttacksMMX()
{
	__asm
	{
		pxor	mm4, mm4	; 0
		pcmpeqd mm7, mm7	; 0xffffffffffffffff
		movq	mm2, mm1	; left
		psubb	mm4, mm7	; 0x0101010101010101
		movq	mm3, mm1	; up
		pxor	mm7, mm4	; 0xfefefefefefefefe notA
		movq	mm5, mm1	; save queens for diagonals
		pand	mm2, mm7	; clear left a-file before shift
		movq	mm4, mm1	; down
		pand	mm7, mm6	; to clear left occupied or a-file
		// 1. straight fill in each direction
		psrlq	mm2, 1		; left
		paddb	mm1, mm1	; right
		psllq	mm3, 8		; up
		psrlq	mm4, 8		; down
		movq	mm0, mm2	; rookAttacks  = left
		por	mm0, mm1	; rookAttacks |= right
		por	mm0, mm3	; rookAttacks |= up
		por	mm0, mm4	; rookAttacks |= down
		pand	mm2, mm7	; clear left occupied or a file
		pand	mm1, mm6	; clear right occupied
		pand	mm3, mm6	; clear up occupied
		pand	mm4, mm6	; clear down occupied
		// 2. straight fill in each direction
		psrlq	mm2, 1		; left
		paddb	mm1, mm1	; right
		psllq	mm3, 8		; up
		psrlq	mm4, 8		; down
		por	mm0, mm2	; queenAttacks |= left
		por	mm0, mm1	; queenAttacks |= right
		por	mm0, mm3	; queenAttacks |= up
		por	mm0, mm4	; queenAttacks |= down
		pand	mm2, mm7	; clear left occupied or a file
		pand	mm1, mm6	; clear right occupied
		pand	mm3, mm6	; clear up occupied
		pand	mm4, mm6	; clear down occupied
		// 3. straight fill in each direction
		psrlq	mm2, 1		; left
		paddb	mm1, mm1	; right
		psllq	mm3, 8		; up
		psrlq	mm4, 8		; down
		por	mm0, mm2	; queenAttacks |= left
		por	mm0, mm1	; queenAttacks |= right
		por	mm0, mm3	; queenAttacks |= up
		por	mm0, mm4	; queenAttacks |= down
		pand	mm2, mm7	; clear left occupied or a file
		pand	mm1, mm6	; clear right occupied
		pand	mm3, mm6	; clear up occupied
		pand	mm4, mm6	; clear down occupied
		// 4. straight fill in each direction
		psrlq	mm2, 1		; left
		paddb	mm1, mm1	; right
		psllq	mm3, 8		; up
		psrlq	mm4, 8		; down
		por	mm0, mm2	; queenAttacks |= left
		por	mm0, mm1	; queenAttacks |= right
		por	mm0, mm3	; queenAttacks |= up
		por	mm0, mm4	; queenAttacks |= down
		pand	mm2, mm7	; clear left occupied or a file
		pand	mm1, mm6	; clear right occupied
		pand	mm3, mm6	; clear up occupied
		pand	mm4, mm6	; clear down occupied
		// 5. straight fill in each direction
		psrlq	mm2, 1		; left
		paddb	mm1, mm1	; right
		psllq	mm3, 8		; up
		psrlq	mm4, 8		; down
		por	mm0, mm2	; queenAttacks |= left
		por	mm0, mm1	; queenAttacks |= right
		por	mm0, mm3	; queenAttacks |= up
		por	mm0, mm4	; queenAttacks |= down
		pand	mm2, mm7	; clear left occupied or a file
		pand	mm1, mm6	; clear right occupied
		pand	mm3, mm6	; clear up occupied
		pand	mm4, mm6	; clear down occupied
		// 6. straight fill in each direction
		psrlq	mm2, 1		; left
		paddb	mm1, mm1	; right
		psllq	mm3, 8		; up
		psrlq	mm4, 8		; down
		por	mm0, mm2	; queenAttacks |= left
		por	mm0, mm1	; queenAttacks |= right
		por	mm0, mm3	; queenAttacks |= up
		por	mm0, mm4	; queenAttacks |= down
		pand	mm2, mm7	; clear left occupied or a file
		pand	mm1, mm6	; clear right occupied
		pand	mm3, mm6	; clear up occupied
		pand	mm4, mm6	; clear down occupied
		// 7. straight fill in each direction
		psrlq	mm2, 1		; left
		paddb	mm1, mm1	; right
		psllq	mm3, 8		; up
		psrlq	mm4, 8		; down
		por	mm0, mm2	; queenAttacks |= left
		por	mm0, mm1	; queenAttacks |= right
		por	mm0, mm3	; queenAttacks |= up
		por	mm0, mm4	; queenAttacks |= down

		// diagonals
		movq	mm1, mm5
		pcmpeqd mm7, mm7	; 0xffffffffffffffff
		pxor	mm4, mm4	; 0
		movq	mm2, mm1	; leftup
		psubb	mm4, mm7	; 0x0101010101010101
		movq	mm3, mm1	; leftdown
		pxor	mm7, mm4	; 0xfefefefefefefefe notA
		movq	mm4, mm1	; rightdown
		movq	mm5, mm7	; 0xfefefefefefefefe notA
		pand	mm2, mm7	; clear leftup occupied or a file
		psrlq	mm5, 1		; 0x7f7f7f7f7f7f7f7f notH
		pand	mm3, mm7	; clear leftdown occupied or a file
		pand	mm1, mm5	; clear rightup occupied or h file
		pand	mm4, mm5	; clear rightdown occupied or h file
		pand	mm7, mm6	; to clear left occupied or a-file
		pand	mm5, mm6	; to clear left occupied or h-file
		// 1. diagonal fill in each direction
		psllq	mm1, 9		; rightup
		psrlq	mm4, 7		; rightdown
		psllq	mm2, 7		; leftup
		psrlq	mm3, 9		; leftdown
		por	mm0, mm1	; queenAttacks |= rightup
		por	mm0, mm4	; queenAttacks |= rightdown
		por	mm0, mm2	; queenAttacks |= leftup
		por	mm0, mm3	; queenAttacks |= leftdown
		pand	mm1, mm5	; clear rightup occupied or h file
		pand	mm4, mm5	; clear rightdown occupied or h file
		pand	mm2, mm7	; clear leftup occupied or a file
		pand	mm3, mm7	; clear leftdown occupied or a file
		// 2. diagonal fill in each direction
		psllq	mm1, 9		; rightup
		psrlq	mm4, 7		; rightdown
		psllq	mm2, 7		; leftup
		psrlq	mm3, 9		; leftdown
		por	mm0, mm1	; queenAttacks |= rightup
		por	mm0, mm4	; queenAttacks |= rightdown
		por	mm0, mm2	; queenAttacks |= leftup
		por	mm0, mm3	; queenAttacks |= leftdown
		pand	mm1, mm5	; clear rightup occupied or h file
		pand	mm4, mm5	; clear rightdown occupied or h file
		pand	mm2, mm7	; clear leftup occupied or a file
		pand	mm3, mm7	; clear leftdown occupied or a file
		// 3. diagonal fill in each direction
		psllq	mm1, 9		; rightup
		psrlq	mm4, 7		; rightdown
		psllq	mm2, 7		; leftup
		psrlq	mm3, 9		; leftdown
		por	mm0, mm1	; queenAttacks |= rightup
		por	mm0, mm4	; queenAttacks |= rightdown
		por	mm0, mm2	; queenAttacks |= leftup
		por	mm0, mm3	; queenAttacks |= leftdown
		pand	mm1, mm5	; clear rightup occupied or h file
		pand	mm4, mm5	; clear rightdown occupied or h file
		pand	mm2, mm7	; clear leftup occupied or a file
		pand	mm3, mm7	; clear leftdown occupied or a file
		// 4. diagonal fill in each direction
		psllq	mm1, 9		; rightup
		psrlq	mm4, 7		; rightdown
		psllq	mm2, 7		; leftup
		psrlq	mm3, 9		; leftdown
		por	mm0, mm1	; queenAttacks |= rightup
		por	mm0, mm4	; queenAttacks |= rightdown
		por	mm0, mm2	; queenAttacks |= leftup
		por	mm0, mm3	; queenAttacks |= leftdown
		pand	mm1, mm5	; clear rightup occupied or h file
		pand	mm4, mm5	; clear rightdown occupied or h file
		pand	mm2, mm7	; clear leftup occupied or a file
		pand	mm3, mm7	; clear leftdown occupied or a file
		// 5. diagonal fill in each direction
		psllq	mm1, 9		; rightup
		psrlq	mm4, 7		; rightdown
		psllq	mm2, 7		; leftup
		psrlq	mm3, 9		; leftdown
		por	mm0, mm1	; queenAttacks |= rightup
		por	mm0, mm4	; queenAttacks |= rightdown
		por	mm0, mm2	; queenAttacks |= leftup
		por	mm0, mm3	; queenAttacks |= leftdown
		pand	mm1, mm5	; clear rightup occupied or h file
		pand	mm4, mm5	; clear rightdown occupied or h file
		pand	mm2, mm7	; clear leftup occupied or a file
		pand	mm3, mm7	; clear leftdown occupied or a file
		// 6. diagonal fill in each direction
		psllq	mm1, 9		; rightup
		psrlq	mm4, 7		; rightdown
		psllq	mm2, 7		; leftup
		psrlq	mm3, 9		; leftdown
		por	mm0, mm1	; queenAttacks |= rightup
		por	mm0, mm4	; queenAttacks |= rightdown
		por	mm0, mm2	; queenAttacks |= leftup
		por	mm0, mm3	; queenAttacks |= leftdown
		pand	mm1, mm5	; clear rightup occupied or h file
		pand	mm4, mm5	; clear rightdown occupied or h file
		pand	mm2, mm7	; clear leftup occupied or a file
		pand	mm3, mm7	; clear leftdown occupied or a file
		// 7. diagonal fill in each direction
		psllq	mm1, 9		; rightup
		psrlq	mm4, 7		; rightdown
		psllq	mm2, 7		; leftup
		psrlq	mm3, 9		; leftdown
		por	mm0, mm1	; queenAttacks |= rightup
		por	mm0, mm4	; queenAttacks |= rightdown
		por	mm0, mm2	; queenAttacks |= leftup
		por	mm0, mm3	; queenAttacks |= leftdown
	}
}

// input:   mm1 pawnBB
//          mm2 color (0|1)
// output:  mm0 pawnAttacks
//=========================
__forceinline void getPawnAttacksMMX()
{
	__asm
	{
		pxor	mm4, mm4	; 0x0000000000000000
		pcmpeqd mm7, mm7	; 0xffffffffffffffff
		movq	mm0, mm1	; left
		psubb	mm4, mm7	; 0x0101010101010101
		psllq	mm2, 4		; color * 16
		pxor	mm7, mm4	; 0xfefefefefefefefe notA
		pand	mm0, mm7	; clear left a-file before shift
		paddb	mm1, mm1	; right
		psrlq	mm0, 1		; left
		por	mm0, mm1	; left|right
		psllq	mm0, 8		; left|right -> up white attacks
		psrlq	mm0, mm2	; left|right -> color*2down (0|16)
	}
}

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

// input:    mm1 knightBB
// output:   mm0 knightAttacks
//============================
__forceinline void getKnightAttacksMMX()
{
	__asm
	{
		pxor	mm4, mm4	; 0x0000000000000000
		pcmpeqd mm7, mm7	; 0xffffffffffffffff
		movq	mm2, mm1	; left
		psubb	mm4, mm7	; 0x0101010101010101
		pxor	mm7, mm4	; 0xfefefefefefefefe notA
		pand	mm2, mm7	; clear left a-file before shift
		paddb	mm1, mm1	; right
		psrlq	mm2, 1		; left
		movq	mm3, mm1
		paddb	mm1, mm1	; 2right
		por	mm3, mm2	; left|right
		movq	mm0, mm3	; left|right
		pand	mm2, mm7	; clear left a-file before shift
		psrlq	mm3, 16		; left|right -> 2down
		psllq	mm0, 16		; left|right -> 2up
		psrlq	mm2, 1		; 2left
		por	mm0, mm3
		movq	mm3, mm1
		por	mm3, mm2	; 2left|2right
		movq	mm2, mm3	; 2left|2right
		psllq	mm3, 8		; 2left|2right -> up
		psrlq	mm2, 8		; 2left|2right -> down
		por	mm0, mm3
		por	mm0, mm2
	}
}



This page took 0.01 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.