home *** CD-ROM | disk | FTP | other *** search
/ Dream 57 / Amiga_Dream_57.iso / Amiga / Jeux / Reflexion / Crafty-15.19.lha / crafty-15.19 / src / boolean.c < prev    next >
C/C++ Source or Header  |  1998-09-13  |  2KB  |  133 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "chess.h"
  4. #include "data.h"
  5.  
  6. #if !defined(CRAY1)
  7.  
  8. BITBOARD Mask(int arg1)
  9. {
  10.   register BITBOARD i;
  11.   i=(BITBOARD) -1;
  12.   if (arg1 == 128)
  13.     return(0);
  14.   else if (arg1 > 64)
  15.     return(i>>(arg1-64));
  16.   else
  17.     return(i<<(64-arg1));
  18. }
  19.  
  20. #if defined(MACOS)
  21.  
  22.   int FirstOne(register BITBOARD a)
  23.     {
  24.         register unsigned long i;
  25.         
  26.         if (i = a >> 32)
  27.             return(__cntlzw(i));
  28.         if (i = a & 0xffffffff)
  29.             return(__cntlzw(i) + 32);
  30.         return(64);
  31.     }
  32.   
  33.   int LastOne(register BITBOARD a)
  34.     {
  35.         register unsigned long i;
  36.         
  37.         if (i = a & 0xffffffff)
  38.             return(__cntlzw(i ^ (i - 1)) + 32);
  39.         if (i = a >> 32)
  40.             return(__cntlzw(i ^ (i - 1)));
  41.         return(64);
  42.     }
  43.  
  44.   int PopCnt(register BITBOARD a)
  45.   {
  46.     register int c=0;
  47.  
  48.     while(a) {
  49.       c++;
  50.       a &= a - 1;
  51.     }
  52.     return(c);
  53.   }
  54.  
  55.  
  56. #else
  57. #if !defined(USE_ASSEMBLY_B)
  58.   int PopCnt(register BITBOARD a)
  59.   {
  60.     register int c=0;
  61.  
  62.     while(a) {
  63.       c++;
  64.       a &= a - 1;
  65.     }
  66.     return(c);
  67.   }
  68.  
  69.   int FirstOne(BITBOARD arg1)
  70.   {
  71.     union doub {
  72.       unsigned short i[4];
  73.       BITBOARD d;
  74.     };
  75.     register union doub x;
  76.     x.d=arg1;
  77. #  if defined(LITTLE_ENDIAN_ARCH)
  78.     if (x.i[3])
  79.       return (first_ones[x.i[3]]);
  80.     if (x.i[2])
  81.       return (first_ones[x.i[2]]+16);
  82.     if (x.i[1])
  83.       return (first_ones[x.i[1]]+32);
  84.     if (x.i[0]) 
  85.       return (first_ones[x.i[0]]+48);
  86. #  endif
  87. #  if !defined(LITTLE_ENDIAN_ARCH)
  88.     if (x.i[0])
  89.       return (first_ones[x.i[0]]);
  90.     if (x.i[1])
  91.       return (first_ones[x.i[1]]+16);
  92.     if (x.i[2])
  93.       return (first_ones[x.i[2]]+32);
  94.     if (x.i[3]) 
  95.       return (first_ones[x.i[3]]+48);
  96. #  endif
  97.     return(64);
  98.   }
  99.   
  100.   int LastOne(BITBOARD arg1)
  101.   {
  102.     union doub {
  103.       unsigned short i[4];
  104.       BITBOARD d;
  105.     };
  106.     register union doub x;
  107.     x.d=arg1;
  108. #  if defined(LITTLE_ENDIAN_ARCH)
  109.     if (x.i[0]) 
  110.       return (last_ones[x.i[0]]+48);
  111.     if (x.i[1])
  112.       return (last_ones[x.i[1]]+32);
  113.     if (x.i[2])
  114.       return (last_ones[x.i[2]]+16);
  115.     if (x.i[3])
  116.       return (last_ones[x.i[3]]);
  117. #  endif
  118. #  if !defined(LITTLE_ENDIAN_ARCH)
  119.     if (x.i[3]) 
  120.       return (last_ones[x.i[3]]+48);
  121.     if (x.i[2])
  122.       return (last_ones[x.i[2]]+32);
  123.     if (x.i[1])
  124.       return (last_ones[x.i[1]]+16);
  125.     if (x.i[0])
  126.       return (last_ones[x.i[0]]);
  127. #  endif
  128.     return(64);
  129.   }
  130. #  endif
  131. #endif
  132. #endif
  133.