[fpc-devel] bitshift intrinsics
Marco van de Voort
marcov at stack.nl
Fri Oct 14 11:44:06 CEST 2016
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.
More information about the fpc-devel
mailing list