💾 Archived View for runjimmyrunrunyoufuckerrun.com › src › games › chessengines › crafty › boolean.c captured on 2021-12-17 at 13:26:06.

View Raw

More Information

-=-=-=-=-=-=-

#include "chess.h"
#include "data.h"
/* last modified 02/16/14 */
/*
 *******************************************************************************
 *                                                                             *
 *   This group of procedures provide the three basic bitboard operators,      *
 *   MSB(x) that determines the Most Significant Bit, LSB(x) that determines   *
 *   the Least Significant Bit, and PopCnt(x) which returns the number of one  *
 *   bits set in the word.                                                     *
 *                                                                             *
 *   We prefer to use hardware facilities (such as intel BSF/BSR) when they    *
 *   are available, otherwise we resort to C and table lookups to do this in   *
 *   the most efficient way possible.                                          *
 *                                                                             *
 *******************************************************************************
 */
#if !defined(INLINEASM)
int MSB(uint64_t arg1) {
  if (arg1 >> 48)
    return msb[arg1 >> 48] + 48;
  if (arg1 >> 32 & 65535)
    return msb[arg1 >> 32 & 65535] + 32;
  if (arg1 >> 16 & 65535)
    return msb[arg1 >> 16 & 65535] + 16;
  return msb[arg1 & 65535];
}

int LSB(uint64_t arg1) {
  if (arg1 & 65535)
    return lsb[arg1 & 65535];
  if (arg1 >> 16 & 65535)
    return lsb[arg1 >> 16 & 65535] + 16;
  if (arg1 >> 32 & 65535)
    return lsb[arg1 >> 32 & 65535] + 32;
  return lsb[arg1 >> 48] + 48;
}

int PopCnt(uint64_t arg1) {
  int c;

  for (c = 0; arg1; c++)
    arg1 &= arg1 - 1;
  return c;
}
#endif