Author: Ricardo Gibert
Date: 18:21:57 01/22/02
Go up one level in this thread
On January 22, 2002 at 21:15:17, Ricardo Gibert wrote:
>On January 21, 2002 at 16:16:10, Rafael Andrist wrote:
>
>>Well, I just rewrote the following function in assembler to get better speed (no
>>conditional jumps, less memory access) but the speedup was only minimal. A
>>possible problem of the asm code is, that the instructions doesn't pair well,
>>but it should be still considerably faster. Has anyone an idea what the problem
>>with the code below is? Should I perhaps throw this function out and use a
>>look-up-table?
>>
>>INLINE int Diag045Rot(const int iSqNr)
>>{
>>#if defined (Use_Asm)
>>// 0 <= iSqNr <= 63
>>__asm
>>{
>> mov eax, iFeldNr;
>> mov ah, al;
>> and al, 007h; //x (iFeldNr%8) --> al
>> shr ah, 3; //y (iFeldNr/8) --> ah
>> sub al, ah; //x-y --> al
>> mov ah, al; // --> ah
>> and ah, 080h; //ah &= 0x80 (isolate sign bit)
>> add ah, 080h; //ah += 0x80 (setting the carry bit)
>> adc ah, 0; //ah += carry bit
>> shl ah, 3; //ah <<= 3;
>> add al, ah; //al += 8*(x-y < 0)
>> xor ah, ah;
>>}
>>#else
>> int x, y;
>> x = iSqNr%8;
>> y = iSqNr/8;
>> return x-y + 8*(x-y < 0);
>
>Isn't this is the same as "return abs(x-y);"? If so, maybe the compiler will do
>a better job of optimizing with it.
Oops! No it's not, but how about return (x-y+8)%8 ?
>
>Also, if you are using msvc6, it might help the compiler to insert an
>"__assume((0 <= iSqNr) && (iSqNr <= 63));". I don't use msvc6 myself, so I can't
>tell you if this really helps here.
>
>>#endif
>>}
>>
>>
>>Thanks in Advance
>>Rafael B. Andrist
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.