Author: Dann Corbit
Date: 15:23:56 02/19/04
Go up one level in this thread
On February 19, 2004 at 18:16:17, Dann Corbit wrote:
>On February 19, 2004 at 17:41:59, James Robertson wrote:
>
>>... puzzling for me at least. A short time ago the following code compiled
>>nicely on the server machines using linux/g++ at my school:
>>
>>inline int FirstSetBit(unsigned long long a)
>>{
>> asm ("
>> bsf 4(%0), %%eax
>> add $32, %%eax
>> bsf (%0), %%eax
>> ":: "r"(&a): "%eax");
>>}
>>
>>Since that time I suppose that there have been a number of upgrades and so forth
>>to my school computers. Unfortunately, now I get a number of errors. I fixed the
>>first few by simply appending ; \ to each line, but the compiler is still
>>unhappy. Specifically, it complains that the '%eax' register is unknown on the
>>final line. Can anyone give me any help?
>
>You might want to examine here and below for an alternative pure C model that
>seems to be just about the same speed:
>http://www.talkchess.com/forums/1/message.html?349781
Oops. Never mind. YOU are doing first bit, and his post was for popcount.
But there are some C equivalents that are about as fast for this one too.
The CCC archives will probably turn it up.
Something you can try when you want to see the assembly syntax for a compiler is
to simply generate it. Here is an example using one of Deiter's routines:
#ifdef _MSC_VER
typedef unsigned __int64 BITBOARD;
#else
typedef unsigned long long BITBOARD;
#endif
typedef union tag_bu {
BITBOARD b;
unsigned long w[2];
} BU;
int dieter_popc(BU a)
{
unsigned long w;
int n = 0;
w = a.w[0];
if (w)
do
n++;
while ((w &= w - 1) != 0);
w = a.w[1];
if (w)
do
n++;
while ((w &= w - 1) != 0);
return n;
}
/*
.file "pop.c"
.text
.p2align 4,,15
.globl _dieter_popc
.def _dieter_popc; .scl 2; .type 32; .endef
_dieter_popc:
pushl %ebp
xorl %ecx, %ecx
movl %esp, %ebp
pushl %esi
movl 8(%ebp), %eax
movl 12(%ebp), %esi
pushl %ebx
testl %eax, %eax
movl %eax, %edx
je L2
.p2align 4,,15
L3:
leal -1(%edx), %ebx
incl %ecx
andl %ebx, %edx
jne L3
L2:
testl %esi, %esi
movl %esi, %edx
je L7
.p2align 4,,15
L8:
leal -1(%edx), %esi
incl %ecx
andl %esi, %edx
jne L8
L7:
popl %ebx
movl %ecx, %eax
popl %esi
popl %ebp
ret
*/
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.