I revisited some old code and noticed there was a BSR using piece of
assembler there that used bsr as a cheap 2log for some buffer dimensioning.

When I tried to replace it with the intrinsic bsrdword, hoping making it
both inlinable and more portablw I noted that the intrinsic was exactly the
same as my code but returned 255 instead of -1 for "0".

Since this is a higher number than other values, it required another test to
avoid outrageous large buffers, resulting in asm code (-O4):

        bsrl    %eax,%eax
        jne     .Lj7
        movl    $255,%eax
.Lj7:
# Var $result located in register eax
# [6] if result=255 then result:=-1;
        cmpl    $255,%eax
        jne     .Lj9
        movl    $-1,%eax
.Lj9:


and then leal   2(%eax),%ebx to add two. Pretty hideous.

If the dword version returned $FFFFFFFF it could be at least typecasted to
-1.

So the questions are:
1. why do the primitives deliver a signed result ?
2. why do they not all deliver -1 for their with ($FFFF for 2-byte etc).
3. (for Michael: :-) why doesn't the documentation doesn't mention the
behaviour for no bits set?).

Since (3) the behaviour is not documented, we can still fix this ? :-)

The current choices (0..31 and 255) seem pointless.

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to