On Mon, 9 Jan 2023 11:07:51 GMT, Uwe Schindler <uschind...@openjdk.org> wrote:

>> src/java.base/share/classes/java/io/Bits.java line 77:
>> 
>>> 75:         // Using Double.longBitsToDouble collapses NaN values to a 
>>> single
>>> 76:         // "canonical" NaN value
>>> 77:         return Double.longBitsToDouble((long) LONG.get(b, off));
>> 
>> For the records, I believe the template classes for byte array var handle 
>> already perform this conversion - e.g.
>> 
>> 
>> @ForceInline
>>         static $type$ get(VarHandle ob, Object oba, int index) {
>>             ArrayHandle handle = (ArrayHandle)ob;
>>             byte[] ba = (byte[]) oba;
>> #if[floatingPoint]
>>             $rawType$ rawValue = UNSAFE.get$RawType$Unaligned(
>>                     ba,
>>                     ((long) index(ba, index)) + 
>> Unsafe.ARRAY_BYTE_BASE_OFFSET,
>>                     handle.be);
>>             return $Type$.$rawType$BitsTo$Type$(rawValue); // 
>> <-----------------------------
>> #else[floatingPoint]
>>             return UNSAFE.get$Type$Unaligned(
>>                     ba,
>>                     ((long) index(ba, index)) + 
>> Unsafe.ARRAY_BYTE_BASE_OFFSET,
>>                     handle.be);
>> #end[floatingPoint]
>>         }
>>  ````
>
> For the other direction it uses the `floatToRawIntBits`: 
> https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/lang/invoke/X-VarHandleByteArrayView.java.template#L148-L153
> 
> I think for symmatry we should keep it as is.

I see - thanks for the explanation - the problem is with `floatToIntBits` vs 
`floatToRawIntBits` in the "put" operation. The get operation is ok, but then 
having asymmetry where we use a float VH in one case (get) but not in the other 
(put) is not desirable.

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

PR: https://git.openjdk.org/jdk/pull/11840

Reply via email to