From: Skybuck Flying on

"Skybuck Flying" <IntoTheFuture(a)hotmail.com> wrote in message
news:15d69$4bffe92b$54190f09$2267(a)cache3.tilbu1.nb.home.nl...
> "Skybuck Flying" <IntoTheFuture(a)hotmail.com> wrote in message
> news:82ee6$4bffe8c5$54190f09$1670(a)cache3.tilbu1.nb.home.nl...
>>> However the problem for shifting "content" still needs to be looked. I
>>> am not yet sure if it can be solved.
>>
>> There is now one remaining problem with the algorithm:
>>
>> mSomething := Content shr (BitCount - Shift);
>>
>> The BitCount can again range from 0 to 32.
>>
>> The Shift can range from 0 to 31.
>>
>> Thus BitCount 32 - 0 is 32
>>
>> So shr 32 is a problem.
>>
>> mSomething should become zero when shr 32 is done.
>>
>> Shr 0 will leave the content intact which would be wrong.
>>
>> Any solutions ?
>>
>> For now I only see a branch as a solution.
>
> It's kinda tricky too... to try and get a branch working.
>
> Just checking if BitCount is 32 would not be enough....
>
> Since BitShift might be 5 and then it needs to shift and so forth.
>
> So it actually needs to branches probably something like:
>
> if (mBitCount=32) and (mShift = 0) then
> begin
> mSomething := 0;
> end;

A better way could be to store the result in a variable first:

vShiftRight := (BitCount - Shift);

if vShiftRight = 32 then
begin
mSomething := 0;
end else
begin
mSomething := Content shr vShiftRight;
end;

At least this brings the branches back to 1.

Bye,
Skybuck.


From: Skybuck Flying on
Anyway,

I have now completely illiminated the need for a mask... at least in the
write routine... but other routines might/will probably still require it.

The formula was:

Mask := not ( -2 shl (BitCount-1) )

As far as I can see it probably uses 3 instructions, which is still quite a
lot.

Since a subtraction must now occur anyway the following formula will
probably be faster, unless shifting many bits takes longer... but I would
not expect that on modern hardware, the AMD optimization manual says "note
3, clock count ???" What is that ?

Anyway here is a potentially faster formula which works from the opposite
side:

Mask := -1 shr (32-BitCount);

From the looks of it, just 2 instructions.

Yeah it's a little bit faster :)

Bye,
Skybuck.