Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Move generation question for the big boys

Author: Vincent Diepeveen

Date: 19:33:18 09/15/01

Go up one level in this thread


On September 15, 2001 at 20:38:36, Robert Hyatt wrote:

>On September 15, 2001 at 16:17:52, Vincent Diepeveen wrote:
>
>>On September 15, 2001 at 15:23:29, Bruce Moreland wrote:
>>
>>>On September 15, 2001 at 14:30:40, Vincent Diepeveen wrote:
>>>
>>>>On September 15, 2001 at 11:14:36, Sune Fischer wrote:
>>>
>>>>>   bb ^= mask[to_square];        // remove the bit
>>>>>
>>>>>   movelist[++counter].from=from_square;
>>>>>   movelist[counter].to=to_square;
>>>>>   movelist[counter].piece=QUEEN;
>>>>>   movelist[counter].capturedpiece=enemy.piece[board.id[to_square]];
>>>>
>>>>this looks ugly. Using a pointer here would be way faster.
>>>
>>>Not necessarily.  If the "counter" variable is enregistered by the compiler, you
>>>end up with about the same thing as if you used a pointer, but it also depends
>>>upon how large the elements of "movelist" are.
>>
>>If compilers optimized very well, then our problems would be solved Bruce,
>>we could go write our programs in JAVA or C++ and let the compiler handle
>>the problems of not allocating and removing objects.
>>
>>Also we would be able to use old Qbasic code in a very efficient way then.
>>
>>That's not what happens however. Usual it's smart to NOT trust the compiler.
>>
>>When patterns get complex then i saw that visual c++ makes huge optimization
>>errors.
>>
>>Like if i check for 2 non-array/pointer entities for being zero:
>>
>>if( a & b )
>>  then do this and that;
>>
>>to produce some crap assembly:
>>  CMP EAX,0
>>  JNZ LOOP
>>  CMP EDX,0
>>  JNZ LOOP1
>>
>>Now already people will complain: "you don't need special CMP for
>>2 different statements". Well they're right.
>>
>>In fact you don't need 2 compares even. All you need is something
>>primitive like:
>>
>>  ADD EAX,EDX
>>  CMP EAX,0
>>  JNZ LOOP1
>>
>
>
>That would be terribly dangerous, and if a is 1 and b is -1 you will screw
>up badly.  The compiler can't possibly know that it can do that unless a and
>b are unsigned.  And it would be dangerous there as there are two non-zero
>constants you can add and get zero in an unsigned integer.
>
>The compiler would need special information to be able to do the above
>safely, otherwise the world would be debugging some of the strangest bugs
>anyone ever saw...

Yeah sorry, there were a few bugs in my example code.

It should read:
  if ( a && b )

versus

  if( a | b )


>
>
>>However i would need to learn assembly for this or i must rewrite
>>my C code. The compiler isn't smart Bruce. The compiler is very stupid
>>when talking about source connections. So i have to write:
>>  if( a+b )
>>    then do this and that;
>>
>>>Using pointers will usually help the compiler out, because it can just indirect
>>>through a value, rather than having to deal with scaling the value and adding it
>>>to a constant.  But in some circumstances, scaling it and adding it to a
>>>constant is free.
>>
>>In general the above construction makes no sense. Optimizing it with a
>>pointer is always safer!
>>
>>>bruce



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.