diff -r 4ad1844e6a76 src/java.base/share/classes/sun/misc/Unsafe.java --- a/src/java.base/share/classes/sun/misc/Unsafe.java Mon Jul 27 16:12:17 2015 +0200 +++ b/src/java.base/share/classes/sun/misc/Unsafe.java Tue Jul 28 18:21:46 2015 +0300 @@ -836,121 +836,76 @@ public native void putOrderedLong(Object o, long offset, long x); /** Acquire version of {@link #getObjectVolatile(Object, long)} */ - public final Object getObjectAcquire(Object o, long offset) { - Object x = getObject(o, offset); - loadFence(); - return x; - } + @HotSpotIntrinsicCandidate + public final native Object getObjectAcquire(Object o, long offset); /** Acquire version of {@link #getBooleanVolatile(Object, long)} */ - public final boolean getBooleanAcquire(Object o, long offset) { - boolean x = getBoolean(o, offset); - loadFence(); - return x; - } + @HotSpotIntrinsicCandidate + public final native boolean getBooleanAcquire(Object o, long offset); /** Acquire version of {@link #getByteVolatile(Object, long)} */ - public final byte getByteAcquire(Object o, long offset) { - byte x = getByte(o, offset); - loadFence(); - return x; - } + @HotSpotIntrinsicCandidate + public final native byte getByteAcquire(Object o, long offset); /** Acquire version of {@link #getShortVolatile(Object, long)} */ - public final short getShortAcquire(Object o, long offset) { - short x = getShort(o, offset); - loadFence(); - return x; - } + @HotSpotIntrinsicCandidate + public final native short getShortAcquire(Object o, long offset); /** Acquire version of {@link #getCharVolatile(Object, long)} */ - public final char getCharAcquire(Object o, long offset) { - char x = getChar(o, offset); - loadFence(); - return x; - } + @HotSpotIntrinsicCandidate + public final native char getCharAcquire(Object o, long offset); /** Acquire version of {@link #getIntVolatile(Object, long)} */ - public final int getIntAcquire(Object o, long offset) { - int x = getInt(o, offset); - loadFence(); - return x; - } + @HotSpotIntrinsicCandidate + public final native int getIntAcquire(Object o, long offset); /** Acquire version of {@link #getFloatVolatile(Object, long)} */ - public final float getFloatAcquire(Object o, long offset) { - float x = getFloat(o, offset); - loadFence(); - return x; - } + @HotSpotIntrinsicCandidate + public final native float getFloatAcquire(Object o, long offset); /** Acquire version of {@link #getLongVolatile(Object, long)} */ - public final long getLongAcquire(Object o, long offset) { - long x = getLong(o, offset); - loadFence(); - return x; - } + @HotSpotIntrinsicCandidate + public final native long getLongAcquire(Object o, long offset); /** Acquire version of {@link #getDoubleVolatile(Object, long)} */ - public final double getDoubleAcquire(Object o, long offset) { - double x = getDouble(o, offset); - loadFence(); - return x; - } + @HotSpotIntrinsicCandidate + public final native double getDoubleAcquire(Object o, long offset); /** Release version of {@link #putObjectVolatile(Object, long, Object)} */ - public final void putObjectRelease(Object o, long offset, Object x) { - storeFence(); - putObject(o, offset, x); - } + @HotSpotIntrinsicCandidate + public final native void putObjectRelease(Object o, long offset, Object x); /** Release version of {@link #putBooleanVolatile(Object, long, boolean)} */ - public final void putBooleanRelease(Object o, long offset, boolean x) { - storeFence(); - putBoolean(o, offset, x); - } + @HotSpotIntrinsicCandidate + public final native void putBooleanRelease(Object o, long offset, boolean x); /** Release version of {@link #putByteVolatile(Object, long, byte)} */ - public final void putByteRelease(Object o, long offset, byte x) { - storeFence(); - putByte(o, offset, x); - } + @HotSpotIntrinsicCandidate + public final native void putByteRelease(Object o, long offset, byte x); /** Release version of {@link #putShortVolatile(Object, long, short)} */ - public final void putShortRelease(Object o, long offset, short x) { - storeFence(); - putShort(o, offset, x); - } + @HotSpotIntrinsicCandidate + public final native void putShortRelease(Object o, long offset, short x); /** Release version of {@link #putCharVolatile(Object, long, char)} */ - public final void putCharRelease(Object o, long offset, char x) { - storeFence(); - putChar(o, offset, x); - } + @HotSpotIntrinsicCandidate + public final native void putCharRelease(Object o, long offset, char x); /** Release version of {@link #putIntVolatile(Object, long, int)} */ - public final void putIntRelease(Object o, long offset, int x) { - storeFence(); - putInt(o, offset, x); - } + @HotSpotIntrinsicCandidate + public final native void putIntRelease(Object o, long offset, int x); /** Release version of {@link #putFloatVolatile(Object, long, float)} */ - public final void putFloatRelease(Object o, long offset, float x) { - storeFence(); - putFloat(o, offset, x); - } + @HotSpotIntrinsicCandidate + public final native void putFloatRelease(Object o, long offset, float x); /** Release version of {@link #putLongVolatile(Object, long, long)} */ - public final void putLongRelease(Object o, long offset, long x) { - storeFence(); - putLong(o, offset, x); - } + @HotSpotIntrinsicCandidate + public final native void putLongRelease(Object o, long offset, long x); /** Release version of {@link #putDoubleVolatile(Object, long, double)} */ - public final void putDoubleRelease(Object o, long offset, double x) { - storeFence(); - putDouble(o, offset, x); - } + @HotSpotIntrinsicCandidate + public final native void putDoubleRelease(Object o, long offset, double x); /** * Unblocks the given thread blocked on {@code park}, or, if it is diff -r 4ad1844e6a76 test/java/lang/invoke/VarHandleTest.java --- a/test/java/lang/invoke/VarHandleTest.java Mon Jul 27 16:12:17 2015 +0200 +++ b/test/java/lang/invoke/VarHandleTest.java Tue Jul 28 18:21:46 2015 +0300 @@ -25,8 +25,12 @@ /* * @test + * @run main/othervm -Diters=1 -Xint VarHandleTest + * @run main/othervm -Diters=100000 -XX:TieredStopAtLevel=1 VarHandleTest + * @run main/othervm -Diters=100000 -XX:TieredStopAtLevel=2 VarHandleTest + * @run main/othervm -Diters=100000 -XX:TieredStopAtLevel=3 VarHandleTest + * @run main/othervm -Diters=100000 -XX:TieredStopAtLevel=4 VarHandleTest */ - import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandleInfo; import java.lang.invoke.MethodHandles; @@ -49,34 +53,38 @@ float f; double d; + public static final int ITERS = Integer.getInteger("iters", 1); + public static void main(String[] args) throws Throwable { VarHandleTest t = new VarHandleTest(); t.testToMethodHandle(); - t.testInstanceRefField(); - t.testInstanceBooleanField(); - t.testInstanceByteField(); - t.testInstanceShortField(); - t.testInstanceCharField(); - t.testInstanceIntField(); - t.testInstanceLongField(); - t.testInstanceFloatField(); - t.testInstanceDoubleField(); + for (int c = 0; c < ITERS; c++) { + t.testInstanceRefField(); + t.testInstanceBooleanField(); + t.testInstanceByteField(); + t.testInstanceShortField(); + t.testInstanceCharField(); + t.testInstanceIntField(); + t.testInstanceLongField(); + t.testInstanceFloatField(); + t.testInstanceDoubleField(); - t.testStaticRefField(); - t.testStaticIntField(); - t.testStaticLongField(); + t.testStaticRefField(); + t.testStaticIntField(); + t.testStaticLongField(); - t.testRefArray(); - t.testBooleanArray(); - t.testByteArray(); - t.testShortArray(); - t.testCharArray(); - t.testIntArray(); - t.testLongArray(); - t.testFloatArray(); - t.testDoubleArray(); + t.testRefArray(); + t.testBooleanArray(); + t.testByteArray(); + t.testShortArray(); + t.testCharArray(); + t.testIntArray(); + t.testLongArray(); + t.testFloatArray(); + t.testDoubleArray(); + } t.testLoopMH(); t.testLoop();