On Fri, 2 May 2025 16:57:43 GMT, Shaojin Wen <s...@openjdk.org> wrote:

>> src/java.base/share/classes/java/lang/Math.java line 3500:
>> 
>>> 3498:             return (n & 0b1) == 0 ? 1 : -1;
>>> 3499:         }
>>> 3500: 
>> 
>> Suggestion:
>> 
>> 
>>         if (x == 2) {
>>             if (n >= Integer.SIZE - 1)
>>                 throw new ArithmeticException("integer overflow");
>>             return 1 << n;
>>         }
>>         if (x == -2) {
>>             if (n >= Integer.SIZE)
>>                 throw new ArithmeticException("integer overflow");
>>             // if n == Integer.SIZE - 1, result is correct
>>             return (n & 0b1) == 0 ? 1 << n : -(1 << n);
>>         }
>> 
>>        if ((java.math.BigInteger.bitLengthForInt(Math.abs(x)) - 1L) * n + 1L 
>> > Integer.SIZE) {
>>            throw new ArithmeticException("integer overflow");
>>        }
>> 
>> With also a check for the condition 
>> `java.math.BigInteger.bitLengthForInt(Math.abs(x)) * n < Integer.SIZE`, when 
>> it is true the path could be led to a loop that skips the checks.
>
> return (n & 0b1) == 0 ? 1 << n : -(1 << n);
> 
> 
> Equivalent to 
> 
> 
> 
> return ((1 << n) ^ -(n & 1)) + (n & 1);
> 
> 
> Without branches it should be faster

> ```java
> return ((1 << n) ^ -(n & 1)) + (n & 1);
> ```

It should have a comment that explains that this does the two's complement if 
`n` is odd, and it does nothing otherwise. Anyway, probably the optimization 
for `x == -2` will not be included.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/25003#discussion_r2071960548

Reply via email to