RFR(M): 8153076: Atomic::* on Solaris should use inline assembly instead of .il files
Erik Österlund
erik.osterlund at oracle.com
Mon Apr 11 09:19:25 UTC 2016
Hi Dean,
Changing the input to a memory operand did indeed work better. Thanks
for the great idea.
I updated the x86 code with cleaner assembly.
Updated webrev: http://cr.openjdk.java.net/~eosterlund/8153076/webrev.01/
Thanks,
/Erik
On 2016-04-09 02:20, Dean Long wrote:
> Hi Erik. Does this work any better?
>
> __asm__ volatile ("lock; addl $1,%0" : "+m" (*dest) : : "cc",
> "memory");
>
>
> dl
>
> On 4/8/2016 4:52 AM, Erik Österlund wrote:
>> Hi,
>>
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8153076
>> Webrev: http://cr.openjdk.java.net/~eosterlund/8153076/webrev.00/
>>
>> On Solaris, the Atomic class puts its assembly in a separate .il
>> file, then the code blobs are declared as extern "C" and called from
>> Atomic. More modern GCC-style inline assembly is now supported, and
>> we should use that instead. It works fine the way it is, but making
>> calls just to get an instruction that could be inlined, seems
>> suboptimal.
>>
>> There are two important things to note:
>>
>> 1) I have removed all the 32 bit code from solaris Atomic, and weird
>> combinations with GCC and compiler1. JDK9 is only supported on 64 bit
>> SPARC and x86, building using Solaris Studio. Since it is using
>> GCC-style inline assembly, the code should work with GCC too, but I
>> have not tested that as it is not a supported way of building
>> OpenJDK. I personally do not think we should spend too much time on
>> supporting unsupported code.
>>
>> 2) There appears to be a bug in Solaris Studio for emitting memory
>> accesses on x86.
>>
>> The following code:
>>
>> inline void Atomic::inc (volatile jint* dest) {
>> __asm__ volatile ("lock; addl $1,(%0)" :
>> : "r" (dest) : "cc", "memory");
>> }
>>
>> generated the following in HandleMark::initialize(Thread* thread) on
>> Solaris, x64, using SS12.4:
>>
>> lock addl $1, (%eax)
>>
>> Note the %eax instead of %rax. It is wrong and caused SIGSEGV as the
>> address was truncated, and libraries are not put within the first 4
>> GB of VA.
>>
>> I worked around the issue by assigning the address operands to a
>> fixed register, rdx. Being awkward with the choice of registers is
>> still better than having to make calls. This will have to be fixed,
>> once the solaris studio bug is fixed.
>>
>> Note that for SPARC there were no issues like this and the generated
>> code is fine.
>>
>> Testing: JPRT
>>
>> I need a sponsor to push this.
>>
>> Thanks,
>> /Erik
>
More information about the hotspot-runtime-dev
mailing list