[9] RFR(M): 8076373: In 32-bit VM interpreter and compiled code process signaling NaN values inconsistently

Zoltán Majó zoltan.majo at oracle.com
Tue Aug 18 12:15:58 UTC 2015


Thank you, Vladimir and Michael, for the review! I plan to push the 
changes tomorrow.

Best regards,


Zoltan


On 08/07/2015 10:37 PM, Berg, Michael C wrote:
> Zoltan, the code looks ok.  I have reviewed it in detail.
>
> Thanks,
> -Michael
>
> -----Original Message-----
> From: hotspot-compiler-dev [mailto:hotspot-compiler-dev-bounces at openjdk.java.net] On Behalf Of Vladimir Kozlov
> Sent: Friday, August 07, 2015 12:33 PM
> To: hotspot-compiler-dev at openjdk.java.net
> Subject: Re: [9] RFR(M): 8076373: In 32-bit VM interpreter and compiled code process signaling NaN values inconsistently
>
> I think this is good. You need second review since changes are big and complex.
>
> Thanks,
> Vladimir
>
> On 8/7/15 6:14 AM, Zoltán Majó wrote:
>> Hi,
>>
>>
>> please review the following patch for JDK-8076373.
>>
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8076373
>>
>>
>> Problem: On x86_32 systems with XMM instructions available, the
>> compilers and the interpreter behave inconsistently as far as
>> signalling NaNs (sNaNs) are concerned. For example, the following
>> statement||
>>
>> start == doubleToRawLongBits(longBitsToDouble(start))
>>
>> can be true or false, assuming that the variable 'start' contains a
>> bit pattern corresponding to a sNaN.
>>
>> The result is true if the statement is executed by compiled code and
>> longBitsToDouble/doubleToRawLongBits have been replaced by compiler
>> intrinsics. The result is false if the native library version of the
>> functions is used (either by compiled or by interpreted code).
>>
>> The inconsistency happens because the interpreter/native ABI relies on
>> x87 instructions to process floating point numbers, whereas the
>> compilers use XMM registers for the same purpose. x87 instructions
>> silently convert signaling NaNs to quiet NaNs, XMM instructions
>> preserve sNaNs.
>>
>>
>> Solution:
>> - Add intrinsics (stubs) for java.lang.Float.intBitsToFloat,
>> java.lang.Float.floatToRawIntBits, java.lang.Double.longBitsToDouble,
>> and java.lang.Double.doubleToRawLongBits. The stubs use XMM registers
>> and therefore preserve sNaNs. The stubs are used by both the
>> interpreter and the compilers.
>> - Change the interpreter to use XMM registers instead of x87 registers
>> to internally cache floating point values. As a result, sNaNs are
>> preserved within the interpreter.
>>
>>
>> Webrev:
>> http://cr.openjdk.java.net/~zmajo/8076373/webrev.00/
>>
>> Testing:
>> - JPRT run, testset hotspot (including the newly added test,
>> NaNTest.java); all tests pass;
>> - all JTREG tests in hotspot/test on x86_32 and x86_64; all tests pass
>> that pass with the default version of the VM.
>>
>> Thank you and best regards,
>>
>>
>> Zoltan
>>



More information about the hotspot-compiler-dev mailing list