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.