Unsafe.{get,put}-X-Unaligned; Efficient array comparison intrinsics
Andrew Haley
aph at redhat.com
Wed Mar 4 09:25:01 UTC 2015
On 03/03/15 20:48, John Rose wrote:
> On Mar 2, 2015, at 11:30 AM, Andrew Haley <aph at redhat.com> wrote:
>>
>> On 02/25/2015 04:43 PM, Andrew Haley wrote:
>> I have done this as much as is possible, but methods which assemble
>> and split sub-words are necessarily endian-dependent. I have
>> separated the native big- and little-endian code into two classes,
>> only one of which will ever be loaded into a system.
>
> Here is a way to merge the twin classes, using gated "pick" operators:
> http://cr.openjdk.java.net/~jrose/draft/Unsafe.NativeEitherEndian.java
>
> If merging them actually works, then the merged result should be
> folded back into Unsafe, and static variables used everywhere.
> I think this is better than quasi-duplicate code, if it optimizes right.
That looks very nice. I'll see if it optimizes well.
>>>> Suggestion: Have getIntUnaligned take an optional boolean
>>>> parameter, which is "bigEndian" (since that's relatively exceptional).
>>>> An extra line of code can conditionally swap the bytes, taking
>>>> both the flag and the platform into account. Default value of the
>>>> boolean is whatever is natural to the platform. If you specifically
>>>> want Java's big-endian order, you specify true, etc.
>>
>> I've done this in Java. I tried some HotSpot intrinsic code to handle
>> the "bigEndian" parameter but foundered when I noticed that
>> Op_ReverseBytesXX nodes are optional, so an intrinsic might either be
>> emitted as an instruction or a call to a native method. This was all
>> too messy so I reverted to doing it in Java; the code quality does not
>> seem to suffer as a result of this. (Another possibility is to define
>> intrinsics which would only be used if Op_ReverseBytesXX nodes were
>> supported, but I don't know that such an intrinsic would buy us
>> anything.)
>
> I'm surprised it backed off to a native method. It should have backed
> off to bytecode equivalent to what you wrote (see Integer.java for the code).
I'm sorry, I misspoke. I mean that reverse may be emitted as a call to
a method if the C2 node isn't supported.
>> There are several places in the JDK where we have special cases for
>> alignment, endianness, and arrays and some could benefit from use of
>> these new methods, but except for HeapByteBuffers I haven't changed
>> anything.
>
> It would be good to call them out; we can file followup bugs.
Okay.
>> I am aware that the code is uncommented. I will fix that once we
>> agree about what to do next.
>>
>> http://cr.openjdk.java.net/~aph/unaligned.hotspot.1/
>> http://cr.openjdk.java.net/~aph/unaligned.jdk.2/
>
> I like it!
>
> I'm a little puzzled by the meaning of UseUnalignedAccesses.
> From a portable point of view, it sounds like the JVM will be using special access operators.
> But in fact, it is using the normal aligned memory access operators for unaligned accesses also.
> (Remember, from a portability point of view the normal memory access operators work only on aligned addresses.)
> I don't have a nice replacement name thought.
Sure. It's a developer-only flag, and we have something of a
tradition of obscurely-named developer flags. But I might be able to
think of a better name.
Andrew.
More information about the hotspot-compiler-dev
mailing list