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.