Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: To Nalimov and other programmers about BSF/BSR in VC

Author: Eugene Nalimov

Date: 21:50:08 01/16/99

Go up one level in this thread


I agree with you that it'll be better if there were the
build-in intrinsics "BSF/BSR". Unfortunately, that's not
the case.

Nevertheless, overhead is not so terrific. Extra 2-3
instructions to store argument in memory is usually
not worth talking about. And compiler usually can live
without storing variables in 2 registers that are
necessary for the inline assembly.

TopSpeed C is only 16-bit, and it's not supported
anymore.

Eugene

On January 16, 1999 at 11:49:58, Dezhi Zhao wrote:

>On January 16, 1999 at 10:00:51, Bo Persson wrote:
>
>>This is my solution for VC6, not perfect but working!
>>
>>// warning C4035: 'BSF' : no return value
>>#pragma warning(disable : 4035)
>>
>>   inline unsigned BSF(unsigned Bits)
>>   {
>>      __asm mov eax,[Bits]
>>      __asm bsf eax,eax
>>   }
>>
>>#pragma warning(default : 4035)
>
>I'm glad we share the same experience. This inline BSF func is equivalent
>to my second approach in my post. However inlining your BSF() into
>a C function will affect the optimization. BSF() uses eax and the VC
>compiler will generate the 2 lines as you write verbatim. If eax has been
>taken by another varible, which is very likely to happen, the complier
>has to generate extra save/reload instructions. It would be better if the
>compiler has a directive (hint to compiler), saying eax can be renamed
>during compiling time.
>
>>
>>   inline SQUARE BitBoard::GetLowMember()
>>   {
>>      if (Half[0] != 0)
>>      {
>>         const unsigned BitFound = BSF(Half[0]);
>>         Half[0] ^= (1 << BitFound);
>>         return static_cast<SQUARE>(BitFound);
>>      }
>>      else
>>      {
>>         const unsigned BitFound = BSF(Half[1]);
>>         Half[1] ^= (1 << BitFound);
>>         return static_cast<SQUARE>(BitFound + 4 * FILES);
>>      }
>>
>>   } /* GetLowMember */
>>
>>
>>VC6 still puts the argument 'Bits' on the stack and reloads it, so you loose a
>>few instructions but still come out faster *on a PII*.
>>
>>Compared to a 16-bit table lookup, the BSF is faster on a PII, makes no
>>difference on an AMD K6 and is actually *slower* on a Pentium 133!
>>
>>
>>
>>BTW, you don't have to invent new operators for C/C++ to improve inlining. Many
>>years ago I used the TopSpeed C++ that solved regsiter assignment with special
>>pragmas, like:
>>
>>#pragma call(reg_param=>(cx,dx), reg_return=>ax)
>>
>>Worked fine!
>>
>>
>>
>>Bo Persson
>>bop@malmo.mail.telia.com
>
>I agree that a directive will also do that. But a new operator can even
>save the asm stuff.
>
>is TopSpeed C++ a 32 bit one? How about code quality generated by it,
>especially compared with VC6?
>
>Dezhi Zhao



This page took 0 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.