Short/Character.reverseBytes intrinsics
Ulf Zibis
Ulf.Zibis at gmx.de
Tue Apr 13 14:14:25 PDT 2010
Maybe it's an option to have and intrinsify
Unsafe.putSwappedInt(...) etc.
Unsafe.getSwappedInt(...) etc.
Additionally I see, we don't have Float/Double.reverseBytes(), so a
swapped move becomes a nightmare using e.g.:
unsafe.putLong(ix(nextPutIndex()),
Long.reverseBytes(Double.doubleToRawLongBits(x)));.
-Ulf
Am 13.04.2010 22:50, schrieb Ulf Zibis:
> +1
> I would like to see this enhancement.
>
> But we could do better on x86, as I guess those swap instructions
> would likely come accompanied with a move:
> 0x00b95d79: bswap %ebx ;*invokevirtual putInt
> ...
> 0x00b95d8d: mov %ebx,(%eax,%ecx,1) ;*invokevirtual putInt
>
> could be shorter:
> ...
> 0x00b95d8b: movbe %ebx,(%eax,%ecx,1) ;*invokevirtual putInt
>
> On char/short there could be an additional win:
> swap(x) { return (char)(Integer.reverseBytes(x) >>> 16); }:
> 0x00b8965d: bswap %edx
> 0x00b8965f: shr $0x10,%edx
> ...
> 0x00b8966c: mov %dx,(%eax) ;*invokevirtual putChar
> ; -
> java.nio.DirectByteBuffer::putChar at 30 (line 482)
>
> ... but best would be:
> 0x00b89667: movbe %dx,(%eax) ;*invokevirtual putChar
> ; -
> java.nio.DirectByteBuffer::putChar at 30 (line 482)
>
> Same thoughts on getInt, getChar/Short.
> On SPARC I don't know.
>
> -Ulf
>
>
> Am 13.04.2010 21:11, schrieb Hiroshi Yamauchi:
>> Hi there,
>>
>> I'd like to contribute this patch that implements the intrinsics for
>> Short/Character.reverseBytes (in C2):
>>
>>
>> http://cr.openjdk.java.net/~rasbold/reversebytes/webrev.01/
>> (Patch 1)
>>
>> (Thanks to Chuck for reviewing it and creating the webrev on my behalf.)
>>
>> This adds new siblings for the existing Integer/Long.reverseBytes
>> intrinsics. Note: I did my best for the sparc implementation
>> (sparc.ad) but haven't been able to build or test it (I don't have
>> access to a sparc machine.)
>>
>> An impact of this patch can be seen in the microbenchmark
>> jdk/test/java/nio/Buffer/SwapMicroBenchmark (which was written by
>> Martin) with an experimental patch that lets DirectByteBuffer use
>> those intrinsics (instead of simple Java implementations) on
>> non-native endian operations:
>>
>> http://cr.openjdk.java.net/~martin/webrevs/openjdk7/nioBits.java/
>> (Patch 2)
>>
>> This patch hasn't been checked in yet but is being worked on by
>> Martin and Ulf.
>>
>> The numbers from my measurements on x86 32 bit follow. Note the
>> numbers for BIG_ENDIAN.
>>
>> ----------Unmodified----------
>> Method Millis Ratio
>> swap char BIG_ENDIAN 64 1.000
>> swap char LITTLE_ENDIAN 31 0.492
>> swap short BIG_ENDIAN 75 1.176
>> swap short LITTLE_ENDIAN 31 0.496
>> swap int BIG_ENDIAN 45 0.711
>> swap int LITTLE_ENDIAN 8 0.125
>> swap long BIG_ENDIAN 72 1.131
>> swap long LITTLE_ENDIAN 17 0.277
>>
>> ----------Modified (with Patches 1 and 2)----------
>> Method Millis Ratio
>> swap char BIG_ENDIAN 44 1.000
>> swap char LITTLE_ENDIAN 31 0.709
>> swap short BIG_ENDIAN 44 1.004
>> swap short LITTLE_ENDIAN 31 0.708
>> swap int BIG_ENDIAN 18 0.423
>> swap int LITTLE_ENDIAN 8 0.180
>> swap long BIG_ENDIAN 24 0.544
>> swap long LITTLE_ENDIAN 17 0.400
>>
>> The speedups are clearly non-trivial. The speedup for int/long is due
>> to the use of the existing Integer/Long.reverseBytes intrinsics in
>> DirectByteBuffer (Patch 2). The speedup for short/char is due to the
>> use of the new Character/Short.reverseBytes intrinsics in
>> DirectByteBuffer (Patch 1) and Patch 2.
>>
>> Anyone willing to review it (Patch 1)?
>>
>> Thanks,
>> Hiroshi
>>
>>
>
>
More information about the hotspot-compiler-dev
mailing list