[foreign] RFR: 8223808: initial port for AArch64

Jorn Vernee jbvernee at xs4all.nl
Tue May 14 11:03:29 UTC 2019


>> This is probably similar to what happens in SystemV ABI - where biger 
>> structs are returned with an indirection pointer stored in the first 
>> integer register. For this we have CallingSequence::returnsInMemory 
>> and CalingSequence::returnInMemoryBindings. It is possible that this 
>> logic might require some generalization to work with custom registers 
>> - the current code assumes that the bindings for the return-in-memory 
>> should be created with position "-1" (return) by the builder, and 
>> given the class "INTEGER_ARGUMENT_REGISTER", see
>> 
>> http://hg.openjdk.java.net/panama/dev/file/d9ded289d4dd/src/java.base/share/classes/jdk/internal/foreign/abi/CallingSequence.java#l70 
>> Which might or might not be enough for you.
> 
> This is really useful, thanks. Maybe it's enough to add this as
> special case in StorageCalculator::addBindings where
> forArguments==false, argumentIndex()==-1 and the argument class is
> INTEGER: then we can always allocate r8 for this argument. I'll
> experiment a bit.

I think ShuffleRecipe::make is currently dependent on the argument 
bindings for each class occurring in the order of their storage indices 
to generate skips. And CallingSequenceBuilder always adds the return 
binding first: 
http://hg.openjdk.java.net/panama/dev/file/d9ded289d4dd/src/java.base/share/classes/jdk/internal/foreign/abi/CallingSequenceBuilder.java#l54

If r8 is the first integer argument register this would work, but this 
doesn't seem to be the case? I think a quick-fix for this is adding a 
sorting pass of the bindings by storage index to 
CallingSequenceBuilder::build.

Jorn

Nick Gasson schreef op 2019-05-14 12:15:
> Hi Maurizio,
> 
> On 14/05/2019 16:32, Maurizio Cimadamore wrote:
>> 
>> I see - yes, the Windows code does that. I think the magic happens 
>> here:
>> 
>> [...]
>> 
>> That is, if the struct has certain charateristics (e.g. smaller than 
>> 64 bits), Windows pass it in register, otherwise it always pass it by 
>> reference (see the 'else' in the ABI::unbox code which creates a 
>> pointer).
>> 
>> (actually, now that I look at it, it's not clear to me why Windows's 
>> CallingSequenceBuilder is using ArgumentClass.INTEGER instead of 
>> ArgumentClass.POINTER for these cases)
> 
> Thanks! I'd found the part where it assigns ArgumentClass.INTEGER for
> these arguments in Windows CallingSequenceBuilderImpl but missed the
> corresponding code in box/unboxValue. I think we can use the same
> approach on AArch64.
> 
>> 
>> This is probably similar to what happens in SystemV ABI - where biger 
>> structs are returned with an indirection pointer stored in the first 
>> integer register. For this we have CallingSequence::returnsInMemory 
>> and CalingSequence::returnInMemoryBindings. It is possible that this 
>> logic might require some generalization to work with custom registers 
>> - the current code assumes that the bindings for the return-in-memory 
>> should be created with position "-1" (return) by the builder, and 
>> given the class "INTEGER_ARGUMENT_REGISTER", see
>> 
>> http://hg.openjdk.java.net/panama/dev/file/d9ded289d4dd/src/java.base/share/classes/jdk/internal/foreign/abi/CallingSequence.java#l70 
>> Which might or might not be enough for you.
> 
> This is really useful, thanks. Maybe it's enough to add this as
> special case in StorageCalculator::addBindings where
> forArguments==false, argumentIndex()==-1 and the argument class is
> INTEGER: then we can always allocate r8 for this argument. I'll
> experiment a bit.
> 
>> 
>> long double is currently only working on SystemV - and the underlying 
>> implementation heavily relies on Intel x87 registers and instructions; 
>> note that in SystemV a 'long double' maps onto extended precision IEEE 
>> format (80 bits) while in AArch64 it maps onto quad precision IEEE 
>> format (128 bits).
>> 
>> Which means classification is probably not working correctly on 
>> AArch64 and the LongDouble LayoutType/Reference implementation in the 
>> binder need some work too, since they assume 80-bit extended format.
>> 
> 
> OK, thanks again for the hints!
> 
>> 
>> Process note/question, our internal systems test Windows x64, Linux 
>> x64 and MacOS (x64) - once the patch is ready to be integrated, how do 
>> we plan to make sure that we're not accidentally introducing AArch64 
>> regressions (given that our nighties will be oblivious to that?)
>> 
> 
> We have an Arm-internal CI that we can configure to run nightly tests
> on the foreign branch (and the vectorIntrinsics branch too, as we're
> working on the AArch64 port of that). There's still a manual step of
> us posting to this list or sending a patch when something breaks
> though. The unit test for AArch64 CallingSequenceBuilder should run on
> x86 too.
> 
> 
> Nick


More information about the panama-dev mailing list