Unsafe.{get,put}-X-Unaligned; Efficient array comparison intrinsics
Andrew Haley
aph at redhat.com
Wed Mar 4 15:21:08 UTC 2015
On 03/04/2015 02:29 PM, Andrew Haley wrote:
>> My inclination is to remove the get*Unaligned(..., boolean
>> bigEndian) methods and thereby consistently use Bits.swap in the
>> heap buffer. A similar pattern applies for float/double conversion.
>
> I suggest that you and John argue that between yourselves! I think
> there's a lot to be said for that approach on architectures which can
> do unaligned accesses and have big- and little-endian memory
> operators.
The new API gives us HeapByteBuffer methods
public long getLong(int i) {
return unsafe.getLongUnaligned(hb, byteOffset(checkIndex(i, 8)), bigEndian);
}
If we get rid of the get*Unaligned(..., boolean bigEndian) methods
we'll end up with
public long getLong(int i) {
long x = unsafe.getLongUnaligned(hb, byteOffset(checkIndex(i, 8)));
return nativeByteOrder ? x : Bits.swap(x));
}
... which has the disadvantage that all of the Buffer methods have to
know about the native endianness.
One suggestion: if we exposed Unsafe.fromEndian we could do something
like
public long getLong(int i) {
long x = unsafe.getLongUnaligned(hb, byteOffset(checkIndex(i, 8)));
return unsafe.fromEndian(bigEndian, x));
}
Andrew.
More information about the hotspot-compiler-dev
mailing list