Kogge Stone, Vector Based
Posted: Wed Jan 23, 2013 12:30 am
Maybe it is of interest for someone,
the 8 directions for Kogge-Stone are done via an ulong8 vector datatype,
on my gpu it performs as fast as magic bitboards...
full code:
https://github.com/smatovic/Zeta/tree/z ... koggestone
--
Srdja
the 8 directions for Kogge-Stone are done via an ulong8 vector datatype,
on my gpu it performs as fast as magic bitboards...
Code: Select all
// generate pseudo legal moves
while( bbWork )
bbTemp = 0;
bbMoves = 0;
// pop 1st bit
pos = pop_1st_bit(bbWork);
piece = getPiece(board, pos);
// all 8 directions in parrallel via vector ulong8
pro8 = ~bbBlockers;
gen8 = SetMaskBB[pos];
r8 = shift8[piece];
pro8 &= avoidWrap8[piece];
// do kogge stone
gen8 |= pro8 & ((gen8 << r8) | (gen8 >> (64-r8)));
pro8 &= ((pro8 << r8) | (pro8 >> (64-r8)));
gen8 |= pro8 & ((gen8 << 2*r8) | (gen8 >> (64-2*r8)));
pro8 &= ((pro8 << 2*r8) | (pro8 >> (64-2*r8)));
gen8 |= pro8 & ((gen8 << 4*r8) | (gen8 >> (64-4*r8)));
// Shift one for Captures
gen8 = ((gen8 << r8) | (gen8 >> (64-r8))) & avoidWrap8[piece];
bbTemp = gen8.s0 | gen8.s1 | gen8.s2 | gen8.s3 | gen8.s4 | gen8.s5 | gen8.s6 | gen8.s7;
// Verify
bbTemp &= ( piece == PAWN) ? (PawnAttackTables[som*64+pos] & bbOpposite) | (PawnAttackTables[(som+2)*64+pos] & ~bbBlockers) : AttackTables[som*6*64+piece*64+pos] ;
// Pawn double square
if ( piece == PAWN && ( ( som == WHITE && (pos>>3) == 1) || (som == BLACK && (pos>>3) == 6 ) ) ) {
to = (som == BLACK)? pos-8 : pos+8;
cpt = (som == BLACK)? pos-16 : pos+16;
if ( (~bbBlockers & SetMaskBB[to]) && (~bbBlockers & SetMaskBB[cpt]) )
bbTemp |= SetMaskBB[cpt];
}
// Captures
bbMoves = (bbTemp & bbOpposite);
// Non cpatures
bbMoves |= (qs == 0)? bbTemp & ~bbBlockers : 0 ;
https://github.com/smatovic/Zeta/tree/z ... koggestone
--
Srdja