Short/Character.reverseBytes intrinsics

Hiroshi Yamauchi yamauchi at google.com
Tue Apr 13 12:11:29 PDT 2010


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