Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: question about an efficient way to change the bits of a number.

Author: Gerd Isenberg

Date: 10:14:51 07/27/03

Go up one level in this thread


On July 27, 2003 at 11:39:05, Ricardo Gibert wrote:

>On July 27, 2003 at 11:10:07, Ratko V Tomic wrote:
>
>>>To compute b = a for mask m: b = (b&~m)|(a&m)   [untested]
>>>
>>>That's 4 operations. 3 if m is a constant when the "~" will optimized away.
>>
>>A quicker way (max 3 ops):
>>
>>  b^=(a^b)&m;
>
>Neat.
>
>My way may gain from parallelizing operations, while yours is sequential.
>However, I suspect mine uses an extra register and this should cause it to be
>slower than yours depending on the context in which it is used. It would be
>interesting to benchmark the two.

Hi Ricardo,

From assemblers view...

I guess with constant "m" your statement is prefarable,
due to both ands are independent.

and  eax, someconst
and  ebx, ~someconst
or   ebx, eax

If "m" is variable, eg. acts like a "-1|0" mask to implement a kind of
conditional move of some bits, i found "b ^= (a^b) & m" shorter with about the
same quality of depencies.

and  eax, ecx ; (a&m)
not  ecx      ; ~m
and  ebx, ecx ; D2 (b&~m)
or   ebx, eax ; D1 (a&m)|(b&~m)

xor  eax, ebx ; (a^b)
and  eax, ecx ; D1 -> ((a^b) & m)
xor  ebx, eax ; D2 -> b ^ ((a^b) & m)

But of course, it depends on the environment, possible independent leading and
trailing instructions.

btw. which dependcy is "better"?

;D1
not  ecx
and  ecx, ebx

;D2
not  ecx
and  ebx, ecx

Cheers,
Gerd



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.