Author: Bo Persson
Date: 11:21:45 04/19/00
Go up one level in this thread
On April 19, 2000 at 14:13:05, Dan Newman wrote: >On April 19, 2000 at 04:31:48, Tony Werten wrote: > >>On April 19, 2000 at 03:27:16, Dan Newman wrote: >> >>>On April 18, 2000 at 22:44:25, Flemming Rodler wrote: >>> >>>>Hi, >>>> >>>>I am trying to implement a bitboard based chess program on a Pentium or AMD >>>>computer. I need to be able to find the following information fast: >>>> >>>>1) The position of the first and/or last bit in a sequence of 64 bits. >>>>2) Count the number of bits that are 1 in a sequence of 64 bits. >>>> >>>>I know there is a method that works linear in the number of on-bits for >>>>problem 2: >>>> >>>> for(count = 0; bitboard; count++, bitboard &= (bitboard -1)); >>>> >>>> >>>>Is there anything faster, ie. such lookuptables or machine code intrutions? >>>> >>>>What about problem 1? >>>> >>>>Thanks in advance for any reply >>>>Flemming >>> >>> >>>The following is what I use in my program to find bit indices >>>(it works only with MSVC). >>> >>>#pragma warning( push) >>>#pragma warning( disable: 4035) >>>inline int bsf( unsigned long bitpat) >>>{ >>> __asm mov eax, bitpat >> >>Just a small question. Can you leave this mov away ? Since bitpat will be passed >>in the eax register anyway ? Or doesn't this work for inline functions ? >>( I'm a delphi man, and delphi doesn't support inline ) >> >>Tony >> > >Well, I haven't tried that. I think that MSVC's default argument passing >scheme is by stack rather than register. I'll have to try it (with passing >via registers turned on, I guess)... (It could be, since this is inline, >that the optimizer gets rid of any extra move anyway and just arranges for >a copy of the argument to end up in eax just before the BSF.) > >-Dan. > I have tried it :-) MSVC does not optimize the __asm instructions, so there will be a redundant store/load to a temporary variable (the parameter). However, the resulting code is pretty fast anyway! Also, it ignores all requests for register parameter passing for inline asm functions. Bo Persson bop@malmo.mail.telia.com >>> __asm bsf eax, eax >>>} >>>inline int bsr( unsigned long bitpat) >>>{ >>> __asm mov eax, bitpat >>> __asm bsr eax, eax >>>} >>>#pragma warning( pop) >>> >>> >>>-Dan.
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.