Proposal: change the Bits instance for Bool to align with other basic types and support branchless calculations

Milan Straka fox at ucw.cz
Sun Sep 28 10:06:43 UTC 2014


Hi all,

I am not really convinced that the proposed implementation will be
faster -- if the short-circuiting kicks in, I believe it will perform
better, even if it uses conditional branching.

So unless being convinced by benchmark results, I would prefer the
lazier version of these operators.

Cheers,
Milan

> -----Original message-----
> From: David Feuer <david.feuer at gmail.com>
> Sent: 27 Sep 2014, 13:59
>
> ...
> Currently, the (.&.) and (.|.) methods for Bool are short-circuiting,
> defined like this:
> 
> instance Bits Bool where
>     (.&.) = (&&)
> 
>     (.|.) = (||)
> 
> Unlike the instances for Int, Word, etc., this gives short-circuiting
> behavior (conditionally lazy in the second operand). Unfortunately, this
> requires a conditional branch to implement, which can sometimes be bad.
> Since (&&) and (||) are readily available to anyone who wants
> short-circuiting, I propose that we use the following instead. Note that
> the Bits class does not specify anything about this aspect of instance
> behavior.
> 
>   x .&. y = tagToEnum# (dataToTag# x `andI#` dataToTag# y)
> 
>   x .|. y = tagToEnum# (dataToTag# x `orI#` dataToTag# y)
> 
> The rest of the operations look like this:
> 
>     x `xor` y = tagToEnum# (dataToTag# x `xorI#` dataToTag# y)
> 
>     complement x = tagToEnum# (dataToTag# x `xorI#` 1#)
> 
>     shift x s = testBit x s
> 
>     rotate x _ = x
> 
> -- I don't think we gain anything changing this one.
>     bit 0 = True
>     bit _ = False
> 
>     testBit x b = tagToEnum# (dataToTag# x `andI#` (dataToTag# b ==# 0#))
> 
>     bitSizeMaybe _ = Just 1
> 
>     bitSize _ = 1
> 
>     isSigned _ = False
> 
>     popCount x = I# (dataToTag# x)
> 
> instance FiniteBits Bool where
>     finiteBitSize _ = 1
>     countTrailingZeros x = I# (dataToTag# x `xorI#` 1#)
>     countLeadingZeros  x = I# (dataToTag# x `xorI#` 1#)

> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://www.haskell.org/mailman/listinfo/libraries



More information about the Libraries mailing list