RFR: jextract generates BigDecimal for "long double" but binder fails to handle it

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Mon Nov 5 18:18:49 UTC 2018


On 05/11/2018 15:40, Jorn Vernee wrote:
> Changes look good!
>
> I'm still not sure that compromising on functionality rather than 
> performance (using `double` vs. `BigDecimal`) is the right move tbh, 
> but if it's temporary any ways then I feel like it's not worth 
> discussing right now. That's just the reality of prototyping, that 
> some things don't have full functionality (yet).

I think there's a general feeling that X87 types are on the verge of 
being "deprecated" by both Intel and AMD; System V for instance uses SSE 
registers for quad precision doubles (__float128), so I guess we'd be 
interesting in hearing of cases where X87 long double is still actively 
being used. If this turns out to be a common enough case we can revisit 
and add proper functionality but I'd say that for now what we have 
should be a good enough compromise between functionalities and performances.

Maurizio

>
> Though I'm always glad to exchange thoughts of course!
>
> Cheers,
> Jorn
>
> Maurizio Cimadamore schreef op 2018-11-05 15:38:
>> Updated webrev:
>>
>> http://cr.openjdk.java.net/~mcimadamore/panama/8213029_v3
>>
>> Thanks for the comments
>>
>> Maurizio
>>
>> On 05/11/2018 10:27, Maurizio Cimadamore wrote:
>>> Hi,
>>> this patch adds support for X87 values in the binder
>>>
>>> http://cr.openjdk.java.net/~mcimadamore/panama/8213029/
>>>
>>> The Hotspot changes are straightforward; there's a new X87 shuffle 
>>> recipe category which needs to be taken into account (its size is 
>>> 128 bits). Changes are needed on the binder side too as the X87 
>>> arguments have to be properly classified.
>>>
>>> More specifically, the ABI is very subtle when it comes to 'complex' 
>>> values; they are generally passed in stack slots (if they are in 
>>> argument position) but they are passed in registers (X87 st0 for 
>>> 'long double' or both 'st0' and 'st1' for 'long double complex') for 
>>> return values. To achieve this, we need to teach the binder about 
>>> the special LongDoubleComplex struct, so that the right 
>>> classification occurs (see changes to CallingSequenceBuilderImpl).
>>>
>>> Another issue is how to handle X87 values in Java - I started out 
>>> trying to map these values to BigDecimal, but after getting it to 
>>> work I realized that there were too many unanswered questions: one 
>>> performance side, to decode an X87 value into a BigDecimal you have 
>>> to create lots of intermediate BigIntegers/BigDecimal; on the 
>>> expressiveness side, BigDecimal is lacking support for NaN/Infinity, 
>>> making it an improper fit.
>>>
>>> I then decided to 'erase' X87 values down to 'double' (using a JNI 
>>> helper function to do the conversion, which should be efficient as 
>>> it can take advantage of platform specific instructions such as 
>>> flstp etc.).
>>>
>>> I tested it with fast-debug to make sure there were no weird hotspot 
>>> failures, but please give it a spin to make sure it all works.
>>>
>>> I also updates existing complex tests to add more cases and upcall 
>>> support.
>>>
>>> Cheers
>>>
>>> Maurizio
>>>
>>>
>>>


More information about the panama-dev mailing list