[llvm-dev] Floor-integer-div and integer sign operations?

John Regehr via llvm-dev llvm-dev at lists.llvm.org
Fri Mar 30 09:57:49 PDT 2018


Hacker's Delight or this web page are probably the best references for 
tricks like this:

https://graphics.stanford.edu/~seander/bithacks.html#CopyIntegerSign

John


On 03/30/2018 03:58 AM, edA-qa mort-ora-y via llvm-dev wrote:
> I'm looking for ways to do some basic operations without using branches.
> 
> The key operation I want is a floored/round-to-negative-infinity integer
> division (as opposed to the default round-to-zero).
> 
>      7 floordiv 5 = 1
>      -3 floordiv 5 = -1
>      -6 floordiv 5 = -2
> 
> As I guess that doesn't exist, the operation can be constructed as:
> 
>     (a/b) + (a>>31)
> 
> Assuming a is 32 bits. I can probably check the bit count, but perhaps
> there's an op that does this already.
> 
> 
> I'm also looking for a `sign(a) => (-1,0,1)` operation. Is there some
> easy way to do this without branches? That is, have I overlooked from IR
> function?
> 


More information about the llvm-dev mailing list