On November 16, 2016 5:22:17 PM GMT+01:00, Marc Glisse <marc.gli...@inria.fr> 
wrote:
>On Wed, 16 Nov 2016, Michael Matz wrote:
>
>> Hi,
>>
>> On Wed, 16 Nov 2016, Marc Glisse wrote:
>>
>>>>> The first sentence about ORing the sign bit sounds strange (except
>for a
>>>>> sign-magnitude representation). With 2's complement, INT_MIN is
>-2^31, the
>>>>> divisors are the 2^k and -(2^k). -2 * 2^30 yields INT_MIN, but
>your test
>>>>> misses -2 as a possible divisor. On the other hand, 0b100...001
>(aka
>>>>> -INT_MAX)
>>>>> is not a divisor of INT_MIN but your test says the reverse.
>>>>
>>>> Yeah, but it handled the testcase ;)  So I guess the easiest would
>be
>>>> to check integer_pow2p (abs (TREE_OPERAND (t, 0)) then, thus
>>>> wi::popcount (wi::abs (TREE_OPERAND (t, 0))) == 1?
>>>
>>> Looks good to me, thanks.
>>
>> An integer X is a power of two if and only if
>>  X & -X == 0  (&& X != 0 if you want to exclude zero)
>> which also nicely handles positive and negative numbers at the same
>time.
>> No need for popcounts or abs.
>
>There are bit tricks to test for powers of 2, but X & -X == 0 doesn't 
>quite work (X & -X == X is closer, but needs a tweak for negative 
>numbers). We could use
>wi::pow2_p (wi::abs (TREE_OPERAND (t, 0)))
>adding a new function pow2_p so it remains readable and we reduce the
>risk 
>of using the wrong bit trick...

Tree_pow2p uses wi::popcount 

Richard.


Reply via email to