Path: blob/master/jcl/src/java.base/share/classes/java/lang/invoke/ByteBufferViewVarHandle.java
12521 views
/*[INCLUDE-IF Sidecar19-SE & !OPENJDK_METHODHANDLES]*/1/*******************************************************************************2* Copyright (c) 2016, 2020 IBM Corp. and others3*4* This program and the accompanying materials are made available under5* the terms of the Eclipse Public License 2.0 which accompanies this6* distribution and is available at https://www.eclipse.org/legal/epl-2.0/7* or the Apache License, Version 2.0 which accompanies this distribution and8* is available at https://www.apache.org/licenses/LICENSE-2.0.9*10* This Source Code may also be made available under the following11* Secondary Licenses when the conditions for such availability set12* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU13* General Public License, version 2 with the GNU Classpath14* Exception [1] and GNU General Public License, version 2 with the15* OpenJDK Assembly Exception [2].16*17* [1] https://www.gnu.org/software/classpath/license.html18* [2] http://openjdk.java.net/legal/assembly-exception.html19*20* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception21*******************************************************************************/22package java.lang.invoke;2324import static java.lang.invoke.ByteBufferViewVarHandle.ByteBufferViewVarHandleOperations.*;25import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;26import static java.lang.invoke.MethodType.methodType;2728import com.ibm.oti.util.Msg;29import java.nio.ByteBuffer;30import java.nio.ByteOrder;31import java.nio.ReadOnlyBufferException;32import jdk.internal.misc.Unsafe;3334final class ByteBufferViewVarHandle extends ViewVarHandle {35private final static Class<?>[] COORDINATE_TYPES = new Class<?>[] {ByteBuffer.class, int.class};3637/**38* Populates the static MethodHandle[] corresponding to the provided type.39*40* @param type The type to create MethodHandles for.41* @param byteOrder The byteOrder of the ByteBuffer(s) that will be used.42* @return The populated MethodHandle[].43*/44static final MethodHandle[] populateMHs(Class<?> type, ByteOrder byteOrder) {45Class<? extends ByteBufferViewVarHandleOperations> operationsClass = null;46boolean convertEndian = (byteOrder != ByteOrder.nativeOrder());4748if (int.class == type) {49operationsClass = convertEndian ? OpIntConvertEndian.class : OpInt.class;50} else if (long.class == type) {51operationsClass = convertEndian ? OpLongConvertEndian.class : OpLong.class;52} else if (char.class == type) {53operationsClass = convertEndian ? OpCharConvertEndian.class : OpChar.class;54} else if (double.class == type) {55operationsClass = convertEndian ? OpDoubleConvertEndian.class : OpDouble.class;56} else if (float.class == type) {57operationsClass = convertEndian ? OpFloatConvertEndian.class : OpFloat.class;58} else if (short.class == type) {59operationsClass = convertEndian ? OpShortConvertEndian.class : OpShort.class;60} else {61/*[MSG "K0624", "{0} is not a supported view type."]*/62throw new UnsupportedOperationException(com.ibm.oti.util.Msg.getString("K0624", type)); //$NON-NLS-1$63}6465MethodType getter = methodType(type, ByteBuffer.class, int.class, VarHandle.class);66MethodType setter = methodType(void.class, ByteBuffer.class, int.class, type, VarHandle.class);67MethodType compareAndSet = methodType(boolean.class, ByteBuffer.class, int.class, type, type, VarHandle.class);68MethodType compareAndExchange = compareAndSet.changeReturnType(type);69MethodType getAndSet = setter.changeReturnType(type);70MethodType[] lookupTypes = populateMTs(getter, setter, compareAndSet, compareAndExchange, getAndSet);7172return populateMHs(operationsClass, lookupTypes, lookupTypes);73}7475/**76* Constructs a VarHandle that can access elements of a byte array as wider types.77*78* @param viewArrayType The component type used when viewing elements of the array.79*/80ByteBufferViewVarHandle(Class<?> viewArrayType, ByteOrder byteOrder) {81super(viewArrayType, COORDINATE_TYPES, populateMHs(viewArrayType, byteOrder), 0);82}8384/**85* Type specific methods used by ByteBufferViewVarHandle methods.86*/87@SuppressWarnings("unused")88static class ByteBufferViewVarHandleOperations extends ViewVarHandle.ViewVarHandleOperations {8990/**91* A ByteBuffer may be on-heap or off-heap. On-heap buffers are backed by a byte[],92* and off-heap buffers have a base memory address. This class abstracts away the93* difference so that a buffer element can simply be referenced by base and offset.94*/95private static class BufferElement {96private static final int INDEX_OFFSET = Unsafe.ARRAY_BYTE_BASE_OFFSET;97private static final MethodHandle directBufferAddressMH;98private static final MethodHandle onHeapBufferArrayMH;99private static final MethodHandle bufferOffsetMH;100101final Object base;102final long offset;103104static {105MethodHandle addressMH = null;106MethodHandle arrayMH = null;107MethodHandle offsetMH = null;108try {109addressMH = IMPL_LOOKUP.findGetter(ByteBuffer.class, "address", long.class);110arrayMH = IMPL_LOOKUP.findGetter(ByteBuffer.class, "hb", byte[].class);111offsetMH = IMPL_LOOKUP.findGetter(ByteBuffer.class, "offset", int.class);112} catch (Throwable t) {113throw new InternalError("Could not create MethodHandles for ByteBuffer fields", t);114}115directBufferAddressMH = addressMH;116onHeapBufferArrayMH = arrayMH;117bufferOffsetMH = offsetMH;118}119120BufferElement(ByteBuffer buffer, int viewTypeSize, int index) {121if (buffer.isDirect()) {122this.base = null;123this.offset = computeAddress(buffer, index, viewTypeSize);124} else {125this.base = getArray(buffer);126this.offset = computeOffset(buffer, index, viewTypeSize);127}128}129130private final byte[] getArray(ByteBuffer buffer) {131try {132return (byte[])onHeapBufferArrayMH.invokeExact(buffer);133} catch (Throwable e) {134throw new InternalError("Could not get ByteBuffer backing array", e);135}136}137138private static final long computeOffset(ByteBuffer buffer, int index, int viewTypeSize) {139int arrayOffset = 0;140try {141arrayOffset = (int)bufferOffsetMH.invokeExact(buffer);142} catch (Throwable e) {143throw new InternalError("Could not get ByteBuffer offset", e);144}145return (long)INDEX_OFFSET + arrayOffset + index;146}147148private static final long computeAddress(ByteBuffer buffer, int index, int viewTypeSize) {149long base = 0;150try {151base = (long)directBufferAddressMH.invokeExact(buffer);152} catch (Throwable e) {153throw new InternalError("Could not get ByteBuffer address", e);154}155return (long)base + index;156}157}158159static BufferElement checkAndGetBufferElement(ByteBuffer receiver, int viewTypeSize, int index, boolean readOnlyOperation, boolean allowUnaligned) {160receiver.getClass();161boundsCheck(receiver.limit(), viewTypeSize, index);162if ((!readOnlyOperation) && receiver.isReadOnly()) {163throw new ReadOnlyBufferException();164}165BufferElement be = new BufferElement(receiver, viewTypeSize, index);166alignmentCheck(be.offset, viewTypeSize, allowUnaligned);167return be;168}169170static final class OpChar extends ByteBufferViewVarHandleOperations {171private static final int BYTES = Character.BYTES;172173private static final char get(ByteBuffer receiver, int index, VarHandle varHandle) {174BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, true);175return _unsafe.getChar(be.base, be.offset);176177}178179private static final void set(ByteBuffer receiver, int index, char value, VarHandle varHandle) {180BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, true);181_unsafe.putChar(be.base, be.offset, value);182}183184private static final char getVolatile(ByteBuffer receiver, int index, VarHandle varHandle) {185BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);186return _unsafe.getCharVolatile(be.base, be.offset);187188}189190private static final void setVolatile(ByteBuffer receiver, int index, char value, VarHandle varHandle) {191BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);192_unsafe.putCharVolatile(be.base, be.offset, value);193}194195private static final char getOpaque(ByteBuffer receiver, int index, VarHandle varHandle) {196BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);197return _unsafe.getCharOpaque(be.base, be.offset);198199}200201private static final void setOpaque(ByteBuffer receiver, int index, char value, VarHandle varHandle) {202BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);203_unsafe.putCharOpaque(be.base, be.offset, value);204}205206private static final char getAcquire(ByteBuffer receiver, int index, VarHandle varHandle) {207BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);208return _unsafe.getCharAcquire(be.base, be.offset);209210}211212private static final void setRelease(ByteBuffer receiver, int index, char value, VarHandle varHandle) {213BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);214_unsafe.putCharRelease(be.base, be.offset, value);215}216217private static final boolean compareAndSet(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {218throw operationNotSupported(varHandle);219}220221private static final char compareAndExchange(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {222throw operationNotSupported(varHandle);223}224225private static final char compareAndExchangeAcquire(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {226throw operationNotSupported(varHandle);227}228229private static final char compareAndExchangeRelease(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {230throw operationNotSupported(varHandle);231}232233private static final boolean weakCompareAndSet(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {234throw operationNotSupported(varHandle);235}236237private static final boolean weakCompareAndSetAcquire(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {238throw operationNotSupported(varHandle);239}240241private static final boolean weakCompareAndSetRelease(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {242throw operationNotSupported(varHandle);243}244245private static final boolean weakCompareAndSetPlain(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {246throw operationNotSupported(varHandle);247}248249private static final char getAndSet(ByteBuffer receiver, int index, char value, VarHandle varHandle) {250throw operationNotSupported(varHandle);251}252253private static final char getAndSetAcquire(ByteBuffer receiver, int index, char value, VarHandle varHandle) {254throw operationNotSupported(varHandle);255}256257private static final char getAndSetRelease(ByteBuffer receiver, int index, char value, VarHandle varHandle) {258throw operationNotSupported(varHandle);259}260261private static final char getAndAdd(ByteBuffer receiver, int index, char value, VarHandle varHandle) {262throw operationNotSupported(varHandle);263}264265private static final char getAndAddAcquire(ByteBuffer receiver, int index, char value, VarHandle varHandle) {266throw operationNotSupported(varHandle);267}268269private static final char getAndAddRelease(ByteBuffer receiver, int index, char value, VarHandle varHandle) {270throw operationNotSupported(varHandle);271}272273private static final char getAndBitwiseAnd(ByteBuffer receiver, int index, char value, VarHandle varHandle) {274throw operationNotSupported(varHandle);275}276277private static final char getAndBitwiseAndAcquire(ByteBuffer receiver, int index, char value, VarHandle varHandle) {278throw operationNotSupported(varHandle);279}280281private static final char getAndBitwiseAndRelease(ByteBuffer receiver, int index, char value, VarHandle varHandle) {282throw operationNotSupported(varHandle);283}284285private static final char getAndBitwiseOr(ByteBuffer receiver, int index, char value, VarHandle varHandle) {286throw operationNotSupported(varHandle);287}288289private static final char getAndBitwiseOrAcquire(ByteBuffer receiver, int index, char value, VarHandle varHandle) {290throw operationNotSupported(varHandle);291}292293private static final char getAndBitwiseOrRelease(ByteBuffer receiver, int index, char value, VarHandle varHandle) {294throw operationNotSupported(varHandle);295}296297private static final char getAndBitwiseXor(ByteBuffer receiver, int index, char value, VarHandle varHandle) {298throw operationNotSupported(varHandle);299}300301private static final char getAndBitwiseXorAcquire(ByteBuffer receiver, int index, char value, VarHandle varHandle) {302throw operationNotSupported(varHandle);303}304305private static final char getAndBitwiseXorRelease(ByteBuffer receiver, int index, char value, VarHandle varHandle) {306throw operationNotSupported(varHandle);307}308}309310static final class OpDouble extends ByteBufferViewVarHandleOperations {311private static final int BYTES = Double.BYTES;312313private static final double get(ByteBuffer receiver, int index, VarHandle varHandle) {314BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, true);315return _unsafe.getDouble(be.base, be.offset);316}317318private static final void set(ByteBuffer receiver, int index, double value, VarHandle varHandle) {319BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, true);320_unsafe.putDouble(be.base, be.offset, value);321}322323private static final double getVolatile(ByteBuffer receiver, int index, VarHandle varHandle) {324BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);325return _unsafe.getDoubleVolatile(be.base, be.offset);326}327328private static final void setVolatile(ByteBuffer receiver, int index, double value, VarHandle varHandle) {329BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);330_unsafe.putDoubleVolatile(be.base, be.offset, value);331}332333private static final double getOpaque(ByteBuffer receiver, int index, VarHandle varHandle) {334BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);335return _unsafe.getDoubleOpaque(be.base, be.offset);336}337338private static final void setOpaque(ByteBuffer receiver, int index, double value, VarHandle varHandle) {339BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);340_unsafe.putDoubleOpaque(be.base, be.offset, value);341}342343private static final double getAcquire(ByteBuffer receiver, int index, VarHandle varHandle) {344BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);345return _unsafe.getDoubleAcquire(be.base, be.offset);346}347348private static final void setRelease(ByteBuffer receiver, int index, double value, VarHandle varHandle) {349BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);350_unsafe.putDoubleRelease(be.base, be.offset, value);351}352353private static final boolean compareAndSet(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {354BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);355/*[IF Sidecar19-SE-OpenJ9]*/356return _unsafe.compareAndSetDouble(be.base, be.offset, testValue, newValue);357/*[ELSE]358return _unsafe.compareAndSwapDouble(be.base, be.offset, testValue, newValue);359/*[ENDIF]*/360}361362private static final double compareAndExchange(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {363BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);364/*[IF Sidecar19-SE-OpenJ9]*/365return _unsafe.compareAndExchangeDouble(be.base, be.offset, testValue, newValue);366/*[ELSE]367return _unsafe.compareAndExchangeDoubleVolatile(be.base, be.offset, testValue, newValue);368/*[ENDIF]*/369}370371private static final double compareAndExchangeAcquire(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {372BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);373return _unsafe.compareAndExchangeDoubleAcquire(be.base, be.offset, testValue, newValue);374}375376private static final double compareAndExchangeRelease(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {377BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);378return _unsafe.compareAndExchangeDoubleRelease(be.base, be.offset, testValue, newValue);379}380381private static final boolean weakCompareAndSet(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {382BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);383/*[IF Sidecar19-SE-OpenJ9]*/384return _unsafe.weakCompareAndSetDoublePlain(be.base, be.offset, testValue, newValue);385/*[ELSE]386return _unsafe.weakCompareAndSwapDouble(be.base, be.offset, testValue, newValue);387/*[ENDIF]*/388}389390private static final boolean weakCompareAndSetAcquire(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {391BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);392/*[IF Sidecar19-SE-OpenJ9]*/393return _unsafe.weakCompareAndSetDoubleAcquire(be.base, be.offset, testValue, newValue);394/*[ELSE]395return _unsafe.weakCompareAndSwapDoubleAcquire(be.base, be.offset, testValue, newValue);396/*[ENDIF]*/397}398399private static final boolean weakCompareAndSetRelease(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {400BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);401/*[IF Sidecar19-SE-OpenJ9]*/402return _unsafe.weakCompareAndSetDoubleRelease(be.base, be.offset, testValue, newValue);403/*[ELSE]404return _unsafe.weakCompareAndSwapDoubleRelease(be.base, be.offset, testValue, newValue);405/*[ENDIF]*/406}407408private static final boolean weakCompareAndSetPlain(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {409BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);410/*[IF Sidecar19-SE-OpenJ9]*/411return _unsafe.weakCompareAndSetDoublePlain(be.base, be.offset, testValue, newValue);412/*[ELSE]413return _unsafe.weakCompareAndSwapDouble(be.base, be.offset, testValue, newValue);414/*[ENDIF]*/415}416417private static final double getAndSet(ByteBuffer receiver, int index, double value, VarHandle varHandle) {418BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);419return _unsafe.getAndSetDouble(be.base, be.offset, value);420}421422private static final double getAndSetAcquire(ByteBuffer receiver, int index, double value, VarHandle varHandle) {423BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);424return _unsafe.getAndSetDoubleAcquire(be.base, be.offset, value);425}426427private static final double getAndSetRelease(ByteBuffer receiver, int index, double value, VarHandle varHandle) {428BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);429return _unsafe.getAndSetDoubleRelease(be.base, be.offset, value);430}431432private static final double getAndAdd(ByteBuffer receiver, int index, double value, VarHandle varHandle) {433throw operationNotSupported(varHandle);434}435436private static final double getAndAddAcquire(ByteBuffer receiver, int index, double value, VarHandle varHandle) {437throw operationNotSupported(varHandle);438}439440private static final double getAndAddRelease(ByteBuffer receiver, int index, double value, VarHandle varHandle) {441throw operationNotSupported(varHandle);442}443444private static final double getAndBitwiseAnd(ByteBuffer receiver, int index, double value, VarHandle varHandle) {445throw operationNotSupported(varHandle);446}447448private static final double getAndBitwiseAndAcquire(ByteBuffer receiver, int index, double value, VarHandle varHandle) {449throw operationNotSupported(varHandle);450}451452private static final double getAndBitwiseAndRelease(ByteBuffer receiver, int index, double value, VarHandle varHandle) {453throw operationNotSupported(varHandle);454}455456private static final double getAndBitwiseOr(ByteBuffer receiver, int index, double value, VarHandle varHandle) {457throw operationNotSupported(varHandle);458}459460private static final double getAndBitwiseOrAcquire(ByteBuffer receiver, int index, double value, VarHandle varHandle) {461throw operationNotSupported(varHandle);462}463464private static final double getAndBitwiseOrRelease(ByteBuffer receiver, int index, double value, VarHandle varHandle) {465throw operationNotSupported(varHandle);466}467468private static final double getAndBitwiseXor(ByteBuffer receiver, int index, double value, VarHandle varHandle) {469throw operationNotSupported(varHandle);470}471472private static final double getAndBitwiseXorAcquire(ByteBuffer receiver, int index, double value, VarHandle varHandle) {473throw operationNotSupported(varHandle);474}475476private static final double getAndBitwiseXorRelease(ByteBuffer receiver, int index, double value, VarHandle varHandle) {477throw operationNotSupported(varHandle);478}479}480481static final class OpFloat extends ByteBufferViewVarHandleOperations {482private static final int BYTES = Float.BYTES;483484private static final float get(ByteBuffer receiver, int index, VarHandle varHandle) {485BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, true);486return _unsafe.getFloat(be.base, be.offset);487}488489private static final void set(ByteBuffer receiver, int index, float value, VarHandle varHandle) {490BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, true);491_unsafe.putFloat(be.base, be.offset, value);492}493494private static final float getVolatile(ByteBuffer receiver, int index, VarHandle varHandle) {495BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);496return _unsafe.getFloatVolatile(be.base, be.offset);497}498499private static final void setVolatile(ByteBuffer receiver, int index, float value, VarHandle varHandle) {500BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);501_unsafe.putFloatVolatile(be.base, be.offset, value);502}503504private static final float getOpaque(ByteBuffer receiver, int index, VarHandle varHandle) {505BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);506return _unsafe.getFloatOpaque(be.base, be.offset);507}508509private static final void setOpaque(ByteBuffer receiver, int index, float value, VarHandle varHandle) {510BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);511_unsafe.putFloatOpaque(be.base, be.offset, value);512}513514private static final float getAcquire(ByteBuffer receiver, int index, VarHandle varHandle) {515BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);516return _unsafe.getFloatAcquire(be.base, be.offset);517}518519private static final void setRelease(ByteBuffer receiver, int index, float value, VarHandle varHandle) {520BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);521_unsafe.putFloatRelease(be.base, be.offset, value);522}523524private static final boolean compareAndSet(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {525BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);526/*[IF Sidecar19-SE-OpenJ9]*/527return _unsafe.compareAndSetFloat(be.base, be.offset, testValue, newValue);528/*[ELSE]529return _unsafe.compareAndSwapFloat(be.base, be.offset, testValue, newValue);530/*[ENDIF]*/531}532533private static final float compareAndExchange(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {534BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);535/*[IF Sidecar19-SE-OpenJ9]*/536return _unsafe.compareAndExchangeFloat(be.base, be.offset, testValue, newValue);537/*[ELSE]538return _unsafe.compareAndExchangeFloatVolatile(be.base, be.offset, testValue, newValue);539/*[ENDIF]*/540}541542private static final float compareAndExchangeAcquire(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {543BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);544return _unsafe.compareAndExchangeFloatAcquire(be.base, be.offset, testValue, newValue);545}546547private static final float compareAndExchangeRelease(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {548BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);549return _unsafe.compareAndExchangeFloatRelease(be.base, be.offset, testValue, newValue);550}551552private static final boolean weakCompareAndSet(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {553BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);554/*[IF Sidecar19-SE-OpenJ9]*/555return _unsafe.weakCompareAndSetFloatPlain(be.base, be.offset, testValue, newValue);556/*[ELSE]557return _unsafe.weakCompareAndSwapFloat(be.base, be.offset, testValue, newValue);558/*[ENDIF]*/559}560561private static final boolean weakCompareAndSetAcquire(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {562BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);563/*[IF Sidecar19-SE-OpenJ9]*/564return _unsafe.weakCompareAndSetFloatAcquire(be.base, be.offset, testValue, newValue);565/*[ELSE]566return _unsafe.weakCompareAndSwapFloatAcquire(be.base, be.offset, testValue, newValue);567/*[ENDIF]*/568}569570private static final boolean weakCompareAndSetRelease(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {571BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);572/*[IF Sidecar19-SE-OpenJ9]*/573return _unsafe.weakCompareAndSetFloatRelease(be.base, be.offset, testValue, newValue);574/*[ELSE]575return _unsafe.weakCompareAndSwapFloatRelease(be.base, be.offset, testValue, newValue);576/*[ENDIF]*/577}578579private static final boolean weakCompareAndSetPlain(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {580BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);581/*[IF Sidecar19-SE-OpenJ9]*/582return _unsafe.weakCompareAndSetFloatPlain(be.base, be.offset, testValue, newValue);583/*[ELSE]584return _unsafe.weakCompareAndSwapFloat(be.base, be.offset, testValue, newValue);585/*[ENDIF]*/586}587588private static final float getAndSet(ByteBuffer receiver, int index, float value, VarHandle varHandle) {589BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);590return _unsafe.getAndSetFloat(be.base, be.offset, value);591}592593private static final float getAndSetAcquire(ByteBuffer receiver, int index, float value, VarHandle varHandle) {594BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);595return _unsafe.getAndSetFloatAcquire(be.base, be.offset, value);596}597598private static final float getAndSetRelease(ByteBuffer receiver, int index, float value, VarHandle varHandle) {599BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);600return _unsafe.getAndSetFloatRelease(be.base, be.offset, value);601}602603private static final float getAndAdd(ByteBuffer receiver, int index, float value, VarHandle varHandle) {604throw operationNotSupported(varHandle);605}606607private static final float getAndAddAcquire(ByteBuffer receiver, int index, float value, VarHandle varHandle) {608throw operationNotSupported(varHandle);609}610611private static final float getAndAddRelease(ByteBuffer receiver, int index, float value, VarHandle varHandle) {612throw operationNotSupported(varHandle);613}614615private static final float getAndBitwiseAnd(ByteBuffer receiver, int index, float value, VarHandle varHandle) {616throw operationNotSupported(varHandle);617}618619private static final float getAndBitwiseAndAcquire(ByteBuffer receiver, int index, float value, VarHandle varHandle) {620throw operationNotSupported(varHandle);621}622623private static final float getAndBitwiseAndRelease(ByteBuffer receiver, int index, float value, VarHandle varHandle) {624throw operationNotSupported(varHandle);625}626627private static final float getAndBitwiseOr(ByteBuffer receiver, int index, float value, VarHandle varHandle) {628throw operationNotSupported(varHandle);629}630631private static final float getAndBitwiseOrAcquire(ByteBuffer receiver, int index, float value, VarHandle varHandle) {632throw operationNotSupported(varHandle);633}634635private static final float getAndBitwiseOrRelease(ByteBuffer receiver, int index, float value, VarHandle varHandle) {636throw operationNotSupported(varHandle);637}638639private static final float getAndBitwiseXor(ByteBuffer receiver, int index, float value, VarHandle varHandle) {640throw operationNotSupported(varHandle);641}642643private static final float getAndBitwiseXorAcquire(ByteBuffer receiver, int index, float value, VarHandle varHandle) {644throw operationNotSupported(varHandle);645}646647private static final float getAndBitwiseXorRelease(ByteBuffer receiver, int index, float value, VarHandle varHandle) {648throw operationNotSupported(varHandle);649}650}651652static final class OpInt extends ByteBufferViewVarHandleOperations {653private static final int BYTES = Integer.BYTES;654655private static final int get(ByteBuffer receiver, int index, VarHandle varHandle) {656BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, true);657return _unsafe.getInt(be.base, be.offset);658}659660private static final void set(ByteBuffer receiver, int index, int value, VarHandle varHandle) {661BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, true);662_unsafe.putInt(be.base, be.offset, value);663}664665private static final int getVolatile(ByteBuffer receiver, int index, VarHandle varHandle) {666BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);667return _unsafe.getIntVolatile(be.base, be.offset);668}669670private static final void setVolatile(ByteBuffer receiver, int index, int value, VarHandle varHandle) {671BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);672_unsafe.putIntVolatile(be.base, be.offset, value);673}674675private static final int getOpaque(ByteBuffer receiver, int index, VarHandle varHandle) {676BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);677return _unsafe.getIntOpaque(be.base, be.offset);678}679680private static final void setOpaque(ByteBuffer receiver, int index, int value, VarHandle varHandle) {681BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);682_unsafe.putIntOpaque(be.base, be.offset, value);683}684685private static final int getAcquire(ByteBuffer receiver, int index, VarHandle varHandle) {686BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);687return _unsafe.getIntAcquire(be.base, be.offset);688}689690private static final void setRelease(ByteBuffer receiver, int index, int value, VarHandle varHandle) {691BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);692_unsafe.putIntRelease(be.base, be.offset, value);693}694695private static final boolean compareAndSet(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {696BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);697/*[IF Sidecar19-SE-OpenJ9]*/698return _unsafe.compareAndSetInt(be.base, be.offset, testValue, newValue);699/*[ELSE]700return _unsafe.compareAndSwapInt(be.base, be.offset, testValue, newValue);701/*[ENDIF]*/702}703704private static final int compareAndExchange(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {705BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);706/*[IF Sidecar19-SE-OpenJ9]*/707return _unsafe.compareAndExchangeInt(be.base, be.offset, testValue, newValue);708/*[ELSE]709return _unsafe.compareAndExchangeIntVolatile(be.base, be.offset, testValue, newValue);710/*[ENDIF]*/711}712713private static final int compareAndExchangeAcquire(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {714BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);715return _unsafe.compareAndExchangeIntAcquire(be.base, be.offset, testValue, newValue);716}717718private static final int compareAndExchangeRelease(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {719BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);720return _unsafe.compareAndExchangeIntRelease(be.base, be.offset, testValue, newValue);721}722723private static final boolean weakCompareAndSet(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {724BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);725/*[IF Sidecar19-SE-OpenJ9]*/726return _unsafe.weakCompareAndSetIntPlain(be.base, be.offset, testValue, newValue);727/*[ELSE]728return _unsafe.weakCompareAndSwapInt(be.base, be.offset, testValue, newValue);729/*[ENDIF]*/730}731732private static final boolean weakCompareAndSetAcquire(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {733BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);734/*[IF Sidecar19-SE-OpenJ9]*/735return _unsafe.weakCompareAndSetIntAcquire(be.base, be.offset, testValue, newValue);736/*[ELSE]737return _unsafe.weakCompareAndSwapIntAcquire(be.base, be.offset, testValue, newValue);738/*[ENDIF]*/739}740741private static final boolean weakCompareAndSetRelease(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {742BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);743/*[IF Sidecar19-SE-OpenJ9]*/744return _unsafe.weakCompareAndSetIntRelease(be.base, be.offset, testValue, newValue);745/*[ELSE]746return _unsafe.weakCompareAndSwapIntRelease(be.base, be.offset, testValue, newValue);747/*[ENDIF]*/748}749750private static final boolean weakCompareAndSetPlain(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {751BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);752/*[IF Sidecar19-SE-OpenJ9]*/753return _unsafe.weakCompareAndSetIntPlain(be.base, be.offset, testValue, newValue);754/*[ELSE]755return _unsafe.weakCompareAndSwapInt(be.base, be.offset, testValue, newValue);756/*[ENDIF]*/757}758759private static final int getAndSet(ByteBuffer receiver, int index, int value, VarHandle varHandle) {760BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);761return _unsafe.getAndSetInt(be.base, be.offset, value);762}763764private static final int getAndSetAcquire(ByteBuffer receiver, int index, int value, VarHandle varHandle) {765BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);766return _unsafe.getAndSetIntAcquire(be.base, be.offset, value);767}768769private static final int getAndSetRelease(ByteBuffer receiver, int index, int value, VarHandle varHandle) {770BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);771return _unsafe.getAndSetIntRelease(be.base, be.offset, value);772}773774private static final int getAndAdd(ByteBuffer receiver, int index, int value, VarHandle varHandle) {775BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);776return _unsafe.getAndAddInt(be.base, be.offset, value);777}778779private static final int getAndAddAcquire(ByteBuffer receiver, int index, int value, VarHandle varHandle) {780BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);781return _unsafe.getAndAddIntAcquire(be.base, be.offset, value);782}783784private static final int getAndAddRelease(ByteBuffer receiver, int index, int value, VarHandle varHandle) {785BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);786return _unsafe.getAndAddIntRelease(be.base, be.offset, value);787}788789private static final int getAndBitwiseAnd(ByteBuffer receiver, int index, int value, VarHandle varHandle) {790BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);791return _unsafe.getAndBitwiseAndInt(be.base, be.offset, value);792}793794private static final int getAndBitwiseAndAcquire(ByteBuffer receiver, int index, int value, VarHandle varHandle) {795BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);796return _unsafe.getAndBitwiseAndIntAcquire(be.base, be.offset, value);797}798799private static final int getAndBitwiseAndRelease(ByteBuffer receiver, int index, int value, VarHandle varHandle) {800BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);801return _unsafe.getAndBitwiseAndIntRelease(be.base, be.offset, value);802}803804private static final int getAndBitwiseOr(ByteBuffer receiver, int index, int value, VarHandle varHandle) {805BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);806return _unsafe.getAndBitwiseOrInt(be.base, be.offset, value);807}808809private static final int getAndBitwiseOrAcquire(ByteBuffer receiver, int index, int value, VarHandle varHandle) {810BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);811return _unsafe.getAndBitwiseOrIntAcquire(be.base, be.offset, value);812}813814private static final int getAndBitwiseOrRelease(ByteBuffer receiver, int index, int value, VarHandle varHandle) {815BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);816return _unsafe.getAndBitwiseOrIntRelease(be.base, be.offset, value);817}818819private static final int getAndBitwiseXor(ByteBuffer receiver, int index, int value, VarHandle varHandle) {820BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);821return _unsafe.getAndBitwiseXorInt(be.base, be.offset, value);822}823824private static final int getAndBitwiseXorAcquire(ByteBuffer receiver, int index, int value, VarHandle varHandle) {825BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);826return _unsafe.getAndBitwiseXorIntAcquire(be.base, be.offset, value);827}828829private static final int getAndBitwiseXorRelease(ByteBuffer receiver, int index, int value, VarHandle varHandle) {830BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);831return _unsafe.getAndBitwiseXorIntRelease(be.base, be.offset, value);832}833}834835static final class OpLong extends ByteBufferViewVarHandleOperations {836private static final int BYTES = Long.BYTES;837838private static final long get(ByteBuffer receiver, int index, VarHandle varHandle) {839BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, true);840return _unsafe.getLong(be.base, be.offset);841}842843private static final void set(ByteBuffer receiver, int index, long value, VarHandle varHandle) {844BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, true);845_unsafe.putLong(be.base, be.offset, value);846}847848private static final long getVolatile(ByteBuffer receiver, int index, VarHandle varHandle) {849BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);850return _unsafe.getLongVolatile(be.base, be.offset);851}852853private static final void setVolatile(ByteBuffer receiver, int index, long value, VarHandle varHandle) {854BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);855_unsafe.putLongVolatile(be.base, be.offset, value);856}857858private static final long getOpaque(ByteBuffer receiver, int index, VarHandle varHandle) {859BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);860return _unsafe.getLongOpaque(be.base, be.offset);861}862863private static final void setOpaque(ByteBuffer receiver, int index, long value, VarHandle varHandle) {864BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);865_unsafe.putLongOpaque(be.base, be.offset, value);866}867868private static final long getAcquire(ByteBuffer receiver, int index, VarHandle varHandle) {869BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);870return _unsafe.getLongAcquire(be.base, be.offset);871}872873private static final void setRelease(ByteBuffer receiver, int index, long value, VarHandle varHandle) {874BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);875_unsafe.putLongRelease(be.base, be.offset, value);876}877878private static final boolean compareAndSet(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {879BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);880/*[IF Sidecar19-SE-OpenJ9]*/881return _unsafe.compareAndSetLong(be.base, be.offset, testValue, newValue);882/*[ELSE]883return _unsafe.compareAndSwapLong(be.base, be.offset, testValue, newValue);884/*[ENDIF]*/885}886887private static final long compareAndExchange(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {888BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);889/*[IF Sidecar19-SE-OpenJ9]*/890return _unsafe.compareAndExchangeLong(be.base, be.offset, testValue, newValue);891/*[ELSE]892return _unsafe.compareAndExchangeLongVolatile(be.base, be.offset, testValue, newValue);893/*[ENDIF]*/894}895896private static final long compareAndExchangeAcquire(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {897BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);898return _unsafe.compareAndExchangeLongAcquire(be.base, be.offset, testValue, newValue);899}900901private static final long compareAndExchangeRelease(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {902BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);903return _unsafe.compareAndExchangeLongRelease(be.base, be.offset, testValue, newValue);904}905906private static final boolean weakCompareAndSet(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {907BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);908/*[IF Sidecar19-SE-OpenJ9]*/909return _unsafe.weakCompareAndSetLongPlain(be.base, be.offset, testValue, newValue);910/*[ELSE]911return _unsafe.weakCompareAndSwapLong(be.base, be.offset, testValue, newValue);912/*[ENDIF]*/913}914915private static final boolean weakCompareAndSetAcquire(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {916BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);917/*[IF Sidecar19-SE-OpenJ9]*/918return _unsafe.weakCompareAndSetLongAcquire(be.base, be.offset, testValue, newValue);919/*[ELSE]920return _unsafe.weakCompareAndSwapLongAcquire(be.base, be.offset, testValue, newValue);921/*[ENDIF]*/922}923924private static final boolean weakCompareAndSetRelease(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {925BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);926/*[IF Sidecar19-SE-OpenJ9]*/927return _unsafe.weakCompareAndSetLongRelease(be.base, be.offset, testValue, newValue);928/*[ELSE]929return _unsafe.weakCompareAndSwapLongRelease(be.base, be.offset, testValue, newValue);930/*[ENDIF]*/931}932933private static final boolean weakCompareAndSetPlain(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {934BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);935/*[IF Sidecar19-SE-OpenJ9]*/936return _unsafe.weakCompareAndSetLongPlain(be.base, be.offset, testValue, newValue);937/*[ELSE]938return _unsafe.weakCompareAndSwapLong(be.base, be.offset, testValue, newValue);939/*[ENDIF]*/940}941942private static final long getAndSet(ByteBuffer receiver, int index, long value, VarHandle varHandle) {943BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);944return _unsafe.getAndSetLong(be.base, be.offset, value);945}946947private static final long getAndSetAcquire(ByteBuffer receiver, int index, long value, VarHandle varHandle) {948BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);949return _unsafe.getAndSetLongAcquire(be.base, be.offset, value);950}951952private static final long getAndSetRelease(ByteBuffer receiver, int index, long value, VarHandle varHandle) {953BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);954return _unsafe.getAndSetLongRelease(be.base, be.offset, value);955}956957private static final long getAndAdd(ByteBuffer receiver, int index, long value, VarHandle varHandle) {958BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);959return _unsafe.getAndAddLong(be.base, be.offset, value);960}961962private static final long getAndAddAcquire(ByteBuffer receiver, int index, long value, VarHandle varHandle) {963BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);964return _unsafe.getAndAddLongAcquire(be.base, be.offset, value);965}966967private static final long getAndAddRelease(ByteBuffer receiver, int index, long value, VarHandle varHandle) {968BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);969return _unsafe.getAndAddLongRelease(be.base, be.offset, value);970}971972private static final long getAndBitwiseAnd(ByteBuffer receiver, int index, long value, VarHandle varHandle) {973BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);974return _unsafe.getAndBitwiseAndLong(be.base, be.offset, value);975}976977private static final long getAndBitwiseAndAcquire(ByteBuffer receiver, int index, long value, VarHandle varHandle) {978BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);979return _unsafe.getAndBitwiseAndLongAcquire(be.base, be.offset, value);980}981982private static final long getAndBitwiseAndRelease(ByteBuffer receiver, int index, long value, VarHandle varHandle) {983BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);984return _unsafe.getAndBitwiseAndLongRelease(be.base, be.offset, value);985}986987private static final long getAndBitwiseOr(ByteBuffer receiver, int index, long value, VarHandle varHandle) {988BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);989return _unsafe.getAndBitwiseOrLong(be.base, be.offset, value);990}991992private static final long getAndBitwiseOrAcquire(ByteBuffer receiver, int index, long value, VarHandle varHandle) {993BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);994return _unsafe.getAndBitwiseOrLongAcquire(be.base, be.offset, value);995}996997private static final long getAndBitwiseOrRelease(ByteBuffer receiver, int index, long value, VarHandle varHandle) {998BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);999return _unsafe.getAndBitwiseOrLongRelease(be.base, be.offset, value);1000}10011002private static final long getAndBitwiseXor(ByteBuffer receiver, int index, long value, VarHandle varHandle) {1003BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1004return _unsafe.getAndBitwiseXorLong(be.base, be.offset, value);1005}10061007private static final long getAndBitwiseXorAcquire(ByteBuffer receiver, int index, long value, VarHandle varHandle) {1008BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1009return _unsafe.getAndBitwiseXorLongAcquire(be.base, be.offset, value);1010}10111012private static final long getAndBitwiseXorRelease(ByteBuffer receiver, int index, long value, VarHandle varHandle) {1013BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1014return _unsafe.getAndBitwiseXorLongRelease(be.base, be.offset, value);1015}1016}10171018static final class OpShort extends ByteBufferViewVarHandleOperations {1019private static final int BYTES = Short.BYTES;10201021private static final short get(ByteBuffer receiver, int index, VarHandle varHandle) {1022BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, true);1023return _unsafe.getShort(be.base, be.offset);1024}10251026private static final void set(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1027BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, true);1028_unsafe.putShort(be.base, be.offset, value);1029}10301031private static final short getVolatile(ByteBuffer receiver, int index, VarHandle varHandle) {1032BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1033return _unsafe.getShortVolatile(be.base, be.offset);1034}10351036private static final void setVolatile(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1037BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1038_unsafe.putShortVolatile(be.base, be.offset, value);1039}10401041private static final short getOpaque(ByteBuffer receiver, int index, VarHandle varHandle) {1042BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1043return _unsafe.getShortOpaque(be.base, be.offset);1044}10451046private static final void setOpaque(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1047BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1048_unsafe.putShortOpaque(be.base, be.offset, value);1049}10501051private static final short getAcquire(ByteBuffer receiver, int index, VarHandle varHandle) {1052BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1053return _unsafe.getShortAcquire(be.base, be.offset);1054}10551056private static final void setRelease(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1057BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1058_unsafe.putShortRelease(be.base, be.offset, value);1059}10601061private static final boolean compareAndSet(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {1062throw operationNotSupported(varHandle);1063}10641065private static final short compareAndExchange(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {1066throw operationNotSupported(varHandle);1067}10681069private static final short compareAndExchangeAcquire(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {1070throw operationNotSupported(varHandle);1071}10721073private static final short compareAndExchangeRelease(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {1074throw operationNotSupported(varHandle);1075}10761077private static final boolean weakCompareAndSet(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {1078throw operationNotSupported(varHandle);1079}10801081private static final boolean weakCompareAndSetAcquire(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {1082throw operationNotSupported(varHandle);1083}10841085private static final boolean weakCompareAndSetRelease(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {1086throw operationNotSupported(varHandle);1087}10881089private static final boolean weakCompareAndSetPlain(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {1090throw operationNotSupported(varHandle);1091}10921093private static final short getAndSet(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1094throw operationNotSupported(varHandle);1095}10961097private static final short getAndSetAcquire(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1098throw operationNotSupported(varHandle);1099}11001101private static final short getAndSetRelease(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1102throw operationNotSupported(varHandle);1103}11041105private static final short getAndAdd(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1106throw operationNotSupported(varHandle);1107}11081109private static final short getAndAddAcquire(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1110throw operationNotSupported(varHandle);1111}11121113private static final short getAndAddRelease(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1114throw operationNotSupported(varHandle);1115}11161117private static final short getAndBitwiseAnd(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1118throw operationNotSupported(varHandle);1119}11201121private static final short getAndBitwiseAndAcquire(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1122throw operationNotSupported(varHandle);1123}11241125private static final short getAndBitwiseAndRelease(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1126throw operationNotSupported(varHandle);1127}11281129private static final short getAndBitwiseOr(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1130throw operationNotSupported(varHandle);1131}11321133private static final short getAndBitwiseOrAcquire(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1134throw operationNotSupported(varHandle);1135}11361137private static final short getAndBitwiseOrRelease(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1138throw operationNotSupported(varHandle);1139}11401141private static final short getAndBitwiseXor(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1142throw operationNotSupported(varHandle);1143}11441145private static final short getAndBitwiseXorAcquire(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1146throw operationNotSupported(varHandle);1147}11481149private static final short getAndBitwiseXorRelease(ByteBuffer receiver, int index, short value, VarHandle varHandle) {1150throw operationNotSupported(varHandle);1151}1152}11531154static final class OpCharConvertEndian extends ByteBufferViewVarHandleOperations {1155private static final int BYTES = Character.BYTES;11561157private static final char get(ByteBuffer receiver, int index, VarHandle varHandle) {1158BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, true);1159char result = _unsafe.getChar(be.base, be.offset);1160return convertEndian(result);1161}11621163private static final void set(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1164BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, true);1165_unsafe.putChar(be.base, be.offset, convertEndian(value));1166}11671168private static final char getVolatile(ByteBuffer receiver, int index, VarHandle varHandle) {1169BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1170char result = _unsafe.getCharVolatile(be.base, be.offset);1171return convertEndian(result);1172}11731174private static final void setVolatile(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1175BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1176_unsafe.putCharVolatile(be.base, be.offset, convertEndian(value));1177}11781179private static final char getOpaque(ByteBuffer receiver, int index, VarHandle varHandle) {1180BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1181char result = _unsafe.getCharOpaque(be.base, be.offset);1182return convertEndian(result);1183}11841185private static final void setOpaque(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1186BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1187_unsafe.putCharOpaque(be.base, be.offset, convertEndian(value));1188}11891190private static final char getAcquire(ByteBuffer receiver, int index, VarHandle varHandle) {1191BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1192char result = _unsafe.getCharAcquire(be.base, be.offset);1193return convertEndian(result);1194}11951196private static final void setRelease(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1197BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1198_unsafe.putCharRelease(be.base, be.offset, convertEndian(value));1199}12001201private static final boolean compareAndSet(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {1202throw operationNotSupported(varHandle);1203}12041205private static final char compareAndExchange(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {1206throw operationNotSupported(varHandle);1207}12081209private static final char compareAndExchangeAcquire(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {1210throw operationNotSupported(varHandle);1211}12121213private static final char compareAndExchangeRelease(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {1214throw operationNotSupported(varHandle);1215}12161217private static final boolean weakCompareAndSet(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {1218throw operationNotSupported(varHandle);1219}12201221private static final boolean weakCompareAndSetAcquire(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {1222throw operationNotSupported(varHandle);1223}12241225private static final boolean weakCompareAndSetRelease(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {1226throw operationNotSupported(varHandle);1227}12281229private static final boolean weakCompareAndSetPlain(ByteBuffer receiver, int index, char testValue, char newValue, VarHandle varHandle) {1230throw operationNotSupported(varHandle);1231}12321233private static final char getAndSet(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1234throw operationNotSupported(varHandle);1235}12361237private static final char getAndSetAcquire(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1238throw operationNotSupported(varHandle);1239}12401241private static final char getAndSetRelease(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1242throw operationNotSupported(varHandle);1243}12441245private static final char getAndAdd(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1246throw operationNotSupported(varHandle);1247}12481249private static final char getAndAddAcquire(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1250throw operationNotSupported(varHandle);1251}12521253private static final char getAndAddRelease(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1254throw operationNotSupported(varHandle);1255}12561257private static final char getAndBitwiseAnd(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1258throw operationNotSupported(varHandle);1259}12601261private static final char getAndBitwiseAndAcquire(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1262throw operationNotSupported(varHandle);1263}12641265private static final char getAndBitwiseAndRelease(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1266throw operationNotSupported(varHandle);1267}12681269private static final char getAndBitwiseOr(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1270throw operationNotSupported(varHandle);1271}12721273private static final char getAndBitwiseOrAcquire(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1274throw operationNotSupported(varHandle);1275}12761277private static final char getAndBitwiseOrRelease(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1278throw operationNotSupported(varHandle);1279}12801281private static final char getAndBitwiseXor(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1282throw operationNotSupported(varHandle);1283}12841285private static final char getAndBitwiseXorAcquire(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1286throw operationNotSupported(varHandle);1287}12881289private static final char getAndBitwiseXorRelease(ByteBuffer receiver, int index, char value, VarHandle varHandle) {1290throw operationNotSupported(varHandle);1291}1292}12931294static final class OpDoubleConvertEndian extends ByteBufferViewVarHandleOperations {1295private static final int BYTES = Double.BYTES;12961297private static final double get(ByteBuffer receiver, int index, VarHandle varHandle) {1298BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, true);1299double result = _unsafe.getDouble(be.base, be.offset);1300return convertEndian(result);1301}13021303private static final void set(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1304BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, true);1305_unsafe.putDouble(be.base, be.offset, convertEndian(value));1306}13071308private static final double getVolatile(ByteBuffer receiver, int index, VarHandle varHandle) {1309BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1310double result = _unsafe.getDoubleVolatile(be.base, be.offset);1311return convertEndian(result);1312}13131314private static final void setVolatile(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1315BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1316_unsafe.putDoubleVolatile(be.base, be.offset, convertEndian(value));1317}13181319private static final double getOpaque(ByteBuffer receiver, int index, VarHandle varHandle) {1320BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1321double result = _unsafe.getDoubleOpaque(be.base, be.offset);1322return convertEndian(result);1323}13241325private static final void setOpaque(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1326BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1327_unsafe.putDoubleOpaque(be.base, be.offset, convertEndian(value));1328}13291330private static final double getAcquire(ByteBuffer receiver, int index, VarHandle varHandle) {1331BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1332double result = _unsafe.getDoubleAcquire(be.base, be.offset);1333return convertEndian(result);1334}13351336private static final void setRelease(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1337BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1338_unsafe.putDoubleRelease(be.base, be.offset, convertEndian(value));1339}13401341private static final boolean compareAndSet(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {1342BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1343/*[IF Sidecar19-SE-OpenJ9]*/1344return _unsafe.compareAndSetDouble(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1345/*[ELSE]1346return _unsafe.compareAndSwapDouble(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1347/*[ENDIF]*/1348}13491350private static final double compareAndExchange(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {1351BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1352/*[IF Sidecar19-SE-OpenJ9]*/1353double result = _unsafe.compareAndExchangeDouble(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1354/*[ELSE]1355double result = _unsafe.compareAndExchangeDoubleVolatile(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1356/*[ENDIF]*/1357return convertEndian(result);1358}13591360private static final double compareAndExchangeAcquire(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {1361BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1362double result = _unsafe.compareAndExchangeDoubleAcquire(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1363return convertEndian(result);1364}13651366private static final double compareAndExchangeRelease(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {1367BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1368double result = _unsafe.compareAndExchangeDoubleRelease(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1369return convertEndian(result);1370}13711372private static final boolean weakCompareAndSet(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {1373BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1374/*[IF Sidecar19-SE-OpenJ9]*/1375return _unsafe.weakCompareAndSetDoublePlain(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1376/*[ELSE]1377return _unsafe.weakCompareAndSwapDouble(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1378/*[ENDIF]*/1379}13801381private static final boolean weakCompareAndSetAcquire(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {1382BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1383/*[IF Sidecar19-SE-OpenJ9]*/1384return _unsafe.weakCompareAndSetDoubleAcquire(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1385/*[ELSE]1386return _unsafe.weakCompareAndSwapDoubleAcquire(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1387/*[ENDIF]*/1388}13891390private static final boolean weakCompareAndSetRelease(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {1391BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1392/*[IF Sidecar19-SE-OpenJ9]*/1393return _unsafe.weakCompareAndSetDoubleRelease(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1394/*[ELSE]1395return _unsafe.weakCompareAndSwapDoubleRelease(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1396/*[ENDIF]*/1397}13981399private static final boolean weakCompareAndSetPlain(ByteBuffer receiver, int index, double testValue, double newValue, VarHandle varHandle) {1400BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1401/*[IF Sidecar19-SE-OpenJ9]*/1402return _unsafe.weakCompareAndSetDoublePlain(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1403/*[ELSE]1404return _unsafe.weakCompareAndSwapDouble(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1405/*[ENDIF]*/1406}14071408private static final double getAndSet(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1409BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1410double result = _unsafe.getAndSetDouble(be.base, be.offset, convertEndian(value));1411return convertEndian(result);1412}14131414private static final double getAndSetAcquire(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1415BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1416double result = _unsafe.getAndSetDoubleAcquire(be.base, be.offset, convertEndian(value));1417return convertEndian(result);1418}14191420private static final double getAndSetRelease(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1421BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1422double result = _unsafe.getAndSetDoubleRelease(be.base, be.offset, convertEndian(value));1423return convertEndian(result);1424}14251426private static final double getAndAdd(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1427throw operationNotSupported(varHandle);1428}14291430private static final double getAndAddAcquire(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1431throw operationNotSupported(varHandle);1432}14331434private static final double getAndAddRelease(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1435throw operationNotSupported(varHandle);1436}14371438private static final double getAndBitwiseAnd(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1439throw operationNotSupported(varHandle);1440}14411442private static final double getAndBitwiseAndAcquire(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1443throw operationNotSupported(varHandle);1444}14451446private static final double getAndBitwiseAndRelease(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1447throw operationNotSupported(varHandle);1448}14491450private static final double getAndBitwiseOr(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1451throw operationNotSupported(varHandle);1452}14531454private static final double getAndBitwiseOrAcquire(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1455throw operationNotSupported(varHandle);1456}14571458private static final double getAndBitwiseOrRelease(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1459throw operationNotSupported(varHandle);1460}14611462private static final double getAndBitwiseXor(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1463throw operationNotSupported(varHandle);1464}14651466private static final double getAndBitwiseXorAcquire(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1467throw operationNotSupported(varHandle);1468}14691470private static final double getAndBitwiseXorRelease(ByteBuffer receiver, int index, double value, VarHandle varHandle) {1471throw operationNotSupported(varHandle);1472}1473}14741475static final class OpFloatConvertEndian extends ByteBufferViewVarHandleOperations {1476private static final int BYTES = Float.BYTES;14771478private static final float get(ByteBuffer receiver, int index, VarHandle varHandle) {1479BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, true);1480float result = _unsafe.getFloat(be.base, be.offset);1481return convertEndian(result);1482}14831484private static final void set(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1485BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, true);1486_unsafe.putFloat(be.base, be.offset, convertEndian(value));1487}14881489private static final float getVolatile(ByteBuffer receiver, int index, VarHandle varHandle) {1490BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1491float result = _unsafe.getFloatVolatile(be.base, be.offset);1492return convertEndian(result);1493}14941495private static final void setVolatile(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1496BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1497_unsafe.putFloatVolatile(be.base, be.offset, convertEndian(value));1498}14991500private static final float getOpaque(ByteBuffer receiver, int index, VarHandle varHandle) {1501BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1502float result = _unsafe.getFloatOpaque(be.base, be.offset);1503return convertEndian(result);1504}15051506private static final void setOpaque(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1507BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1508_unsafe.putFloatOpaque(be.base, be.offset, convertEndian(value));1509}15101511private static final float getAcquire(ByteBuffer receiver, int index, VarHandle varHandle) {1512BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1513float result = _unsafe.getFloatAcquire(be.base, be.offset);1514return convertEndian(result);1515}15161517private static final void setRelease(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1518BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1519_unsafe.putFloatRelease(be.base, be.offset, convertEndian(value));1520}15211522private static final boolean compareAndSet(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {1523BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1524/*[IF Sidecar19-SE-OpenJ9]*/1525return _unsafe.compareAndSetFloat(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1526/*[ELSE]1527return _unsafe.compareAndSwapFloat(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1528/*[ENDIF]*/1529}15301531private static final float compareAndExchange(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {1532BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1533/*[IF Sidecar19-SE-OpenJ9]*/1534float result = _unsafe.compareAndExchangeFloat(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1535/*[ELSE]1536float result = _unsafe.compareAndExchangeFloatVolatile(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1537/*[ENDIF]*/1538return convertEndian(result);1539}15401541private static final float compareAndExchangeAcquire(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {1542BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1543float result = _unsafe.compareAndExchangeFloatAcquire(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1544return convertEndian(result);1545}15461547private static final float compareAndExchangeRelease(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {1548BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1549float result = _unsafe.compareAndExchangeFloatRelease(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1550return convertEndian(result);1551}15521553private static final boolean weakCompareAndSet(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {1554BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1555/*[IF Sidecar19-SE-OpenJ9]*/1556return _unsafe.weakCompareAndSetFloatPlain(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1557/*[ELSE]1558return _unsafe.weakCompareAndSwapFloat(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1559/*[ENDIF]*/1560}15611562private static final boolean weakCompareAndSetAcquire(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {1563BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1564/*[IF Sidecar19-SE-OpenJ9]*/1565return _unsafe.weakCompareAndSetFloatAcquire(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1566/*[ELSE]1567return _unsafe.weakCompareAndSwapFloatAcquire(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1568/*[ENDIF]*/1569}15701571private static final boolean weakCompareAndSetRelease(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {1572BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1573/*[IF Sidecar19-SE-OpenJ9]*/1574return _unsafe.weakCompareAndSetFloatRelease(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1575/*[ELSE]1576return _unsafe.weakCompareAndSwapFloatRelease(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1577/*[ENDIF]*/1578}15791580private static final boolean weakCompareAndSetPlain(ByteBuffer receiver, int index, float testValue, float newValue, VarHandle varHandle) {1581BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1582/*[IF Sidecar19-SE-OpenJ9]*/1583return _unsafe.weakCompareAndSetFloatPlain(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1584/*[ELSE]1585return _unsafe.weakCompareAndSwapFloat(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1586/*[ENDIF]*/1587}15881589private static final float getAndSet(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1590BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1591float result = _unsafe.getAndSetFloat(be.base, be.offset, convertEndian(value));1592return convertEndian(result);1593}15941595private static final float getAndSetAcquire(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1596BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1597float result = _unsafe.getAndSetFloatAcquire(be.base, be.offset, convertEndian(value));1598return convertEndian(result);1599}16001601private static final float getAndSetRelease(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1602BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1603float result = _unsafe.getAndSetFloatRelease(be.base, be.offset, convertEndian(value));1604return convertEndian(result);1605}16061607private static final float getAndAdd(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1608throw operationNotSupported(varHandle);1609}16101611private static final float getAndAddAcquire(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1612throw operationNotSupported(varHandle);1613}16141615private static final float getAndAddRelease(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1616throw operationNotSupported(varHandle);1617}16181619private static final float getAndBitwiseAnd(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1620throw operationNotSupported(varHandle);1621}16221623private static final float getAndBitwiseAndAcquire(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1624throw operationNotSupported(varHandle);1625}16261627private static final float getAndBitwiseAndRelease(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1628throw operationNotSupported(varHandle);1629}16301631private static final float getAndBitwiseOr(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1632throw operationNotSupported(varHandle);1633}16341635private static final float getAndBitwiseOrAcquire(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1636throw operationNotSupported(varHandle);1637}16381639private static final float getAndBitwiseOrRelease(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1640throw operationNotSupported(varHandle);1641}16421643private static final float getAndBitwiseXor(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1644throw operationNotSupported(varHandle);1645}16461647private static final float getAndBitwiseXorAcquire(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1648throw operationNotSupported(varHandle);1649}16501651private static final float getAndBitwiseXorRelease(ByteBuffer receiver, int index, float value, VarHandle varHandle) {1652throw operationNotSupported(varHandle);1653}1654}16551656static final class OpIntConvertEndian extends ByteBufferViewVarHandleOperations {1657private static final int BYTES = Integer.BYTES;16581659private static final int get(ByteBuffer receiver, int index, VarHandle varHandle) {1660BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, true);1661int result = _unsafe.getInt(be.base, be.offset);1662return convertEndian(result);1663}16641665private static final void set(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1666BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, true);1667_unsafe.putInt(be.base, be.offset, convertEndian(value));1668}16691670private static final int getVolatile(ByteBuffer receiver, int index, VarHandle varHandle) {1671BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1672int result = _unsafe.getIntVolatile(be.base, be.offset);1673return convertEndian(result);1674}16751676private static final void setVolatile(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1677BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1678_unsafe.putIntVolatile(be.base, be.offset, convertEndian(value));1679}16801681private static final int getOpaque(ByteBuffer receiver, int index, VarHandle varHandle) {1682BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1683int result = _unsafe.getIntOpaque(be.base, be.offset);1684return convertEndian(result);1685}16861687private static final void setOpaque(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1688BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1689_unsafe.putIntOpaque(be.base, be.offset, convertEndian(value));1690}16911692private static final int getAcquire(ByteBuffer receiver, int index, VarHandle varHandle) {1693BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1694int result = _unsafe.getIntAcquire(be.base, be.offset);1695return convertEndian(result);1696}16971698private static final void setRelease(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1699BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1700_unsafe.putIntRelease(be.base, be.offset, convertEndian(value));1701}17021703private static final boolean compareAndSet(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {1704BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1705/*[IF Sidecar19-SE-OpenJ9]*/1706return _unsafe.compareAndSetInt(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1707/*[ELSE]1708return _unsafe.compareAndSwapInt(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1709/*[ENDIF]*/1710}17111712private static final int compareAndExchange(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {1713BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1714/*[IF Sidecar19-SE-OpenJ9]*/1715int result = _unsafe.compareAndExchangeInt(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1716/*[ELSE]1717int result = _unsafe.compareAndExchangeIntVolatile(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1718/*[ENDIF]*/1719return convertEndian(result);1720}17211722private static final int compareAndExchangeAcquire(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {1723BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1724int result = _unsafe.compareAndExchangeIntAcquire(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1725return convertEndian(result);1726}17271728private static final int compareAndExchangeRelease(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {1729BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1730int result = _unsafe.compareAndExchangeIntRelease(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1731return convertEndian(result);1732}17331734private static final boolean weakCompareAndSet(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {1735BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1736/*[IF Sidecar19-SE-OpenJ9]*/1737return _unsafe.weakCompareAndSetIntPlain(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1738/*[ELSE]1739return _unsafe.weakCompareAndSwapInt(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1740/*[ENDIF]*/1741}17421743private static final boolean weakCompareAndSetAcquire(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {1744BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1745/*[IF Sidecar19-SE-OpenJ9]*/1746return _unsafe.weakCompareAndSetIntAcquire(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1747/*[ELSE]1748return _unsafe.weakCompareAndSwapIntAcquire(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1749/*[ENDIF]*/1750}17511752private static final boolean weakCompareAndSetRelease(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {1753BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1754/*[IF Sidecar19-SE-OpenJ9]*/1755return _unsafe.weakCompareAndSetIntRelease(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1756/*[ELSE]1757return _unsafe.weakCompareAndSwapIntRelease(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1758/*[ENDIF]*/1759}17601761private static final boolean weakCompareAndSetPlain(ByteBuffer receiver, int index, int testValue, int newValue, VarHandle varHandle) {1762BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1763/*[IF Sidecar19-SE-OpenJ9]*/1764return _unsafe.weakCompareAndSetIntPlain(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1765/*[ELSE]1766return _unsafe.weakCompareAndSwapInt(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1767/*[ENDIF]*/1768}17691770private static final int getAndSet(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1771BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1772int result = _unsafe.getAndSetInt(be.base, be.offset, convertEndian(value));1773return convertEndian(result);1774}17751776private static final int getAndSetAcquire(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1777BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1778int result = _unsafe.getAndSetIntAcquire(be.base, be.offset, convertEndian(value));1779return convertEndian(result);1780}17811782private static final int getAndSetRelease(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1783BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1784int result = _unsafe.getAndSetIntRelease(be.base, be.offset, convertEndian(value));1785return convertEndian(result);1786}17871788private static final int getAndAdd(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1789BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1790int result = _unsafe.getAndAddInt(be.base, be.offset, convertEndian(value));1791return convertEndian(result);1792}17931794private static final int getAndAddAcquire(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1795BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1796int result = _unsafe.getAndAddIntAcquire(be.base, be.offset, convertEndian(value));1797return convertEndian(result);1798}17991800private static final int getAndAddRelease(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1801BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1802int result = _unsafe.getAndAddIntRelease(be.base, be.offset, convertEndian(value));1803return convertEndian(result);1804}18051806private static final int getAndBitwiseAnd(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1807BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1808int result = _unsafe.getAndBitwiseAndInt(be.base, be.offset, convertEndian(value));1809return convertEndian(result);1810}18111812private static final int getAndBitwiseAndAcquire(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1813BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1814int result = _unsafe.getAndBitwiseAndIntAcquire(be.base, be.offset, convertEndian(value));1815return convertEndian(result);1816}18171818private static final int getAndBitwiseAndRelease(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1819BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1820int result = _unsafe.getAndBitwiseAndIntRelease(be.base, be.offset, convertEndian(value));1821return convertEndian(result);1822}18231824private static final int getAndBitwiseOr(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1825BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1826int result = _unsafe.getAndBitwiseOrInt(be.base, be.offset, convertEndian(value));1827return convertEndian(result);1828}18291830private static final int getAndBitwiseOrAcquire(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1831BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1832int result = _unsafe.getAndBitwiseOrIntAcquire(be.base, be.offset, convertEndian(value));1833return convertEndian(result);1834}18351836private static final int getAndBitwiseOrRelease(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1837BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1838int result = _unsafe.getAndBitwiseOrIntRelease(be.base, be.offset, convertEndian(value));1839return convertEndian(result);1840}18411842private static final int getAndBitwiseXor(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1843BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1844int result = _unsafe.getAndBitwiseXorInt(be.base, be.offset, convertEndian(value));1845return convertEndian(result);1846}18471848private static final int getAndBitwiseXorAcquire(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1849BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1850int result = _unsafe.getAndBitwiseXorIntAcquire(be.base, be.offset, convertEndian(value));1851return convertEndian(result);1852}18531854private static final int getAndBitwiseXorRelease(ByteBuffer receiver, int index, int value, VarHandle varHandle) {1855BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1856int result = _unsafe.getAndBitwiseXorIntRelease(be.base, be.offset, convertEndian(value));1857return convertEndian(result);1858}1859}18601861static final class OpLongConvertEndian extends ByteBufferViewVarHandleOperations {1862private static final int BYTES = Long.BYTES;18631864private static final long get(ByteBuffer receiver, int index, VarHandle varHandle) {1865BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, true);1866long result = _unsafe.getLong(be.base, be.offset);1867return convertEndian(result);1868}18691870private static final void set(ByteBuffer receiver, int index, long value, VarHandle varHandle) {1871BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, true);1872_unsafe.putLong(be.base, be.offset, convertEndian(value));1873}18741875private static final long getVolatile(ByteBuffer receiver, int index, VarHandle varHandle) {1876BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1877long result = _unsafe.getLongVolatile(be.base, be.offset);1878return convertEndian(result);1879}18801881private static final void setVolatile(ByteBuffer receiver, int index, long value, VarHandle varHandle) {1882BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1883_unsafe.putLongVolatile(be.base, be.offset, convertEndian(value));1884}18851886private static final long getOpaque(ByteBuffer receiver, int index, VarHandle varHandle) {1887BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1888long result = _unsafe.getLongOpaque(be.base, be.offset);1889return convertEndian(result);1890}18911892private static final void setOpaque(ByteBuffer receiver, int index, long value, VarHandle varHandle) {1893BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1894_unsafe.putLongOpaque(be.base, be.offset, convertEndian(value));1895}18961897private static final long getAcquire(ByteBuffer receiver, int index, VarHandle varHandle) {1898BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);1899long result = _unsafe.getLongAcquire(be.base, be.offset);1900return convertEndian(result);1901}19021903private static final void setRelease(ByteBuffer receiver, int index, long value, VarHandle varHandle) {1904BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1905_unsafe.putLongRelease(be.base, be.offset, convertEndian(value));1906}19071908private static final boolean compareAndSet(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {1909BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1910/*[IF Sidecar19-SE-OpenJ9]*/1911return _unsafe.compareAndSetLong(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1912/*[ELSE]1913return _unsafe.compareAndSwapLong(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1914/*[ENDIF]*/1915}19161917private static final long compareAndExchange(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {1918BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1919/*[IF Sidecar19-SE-OpenJ9]*/1920long result = _unsafe.compareAndExchangeLong(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1921/*[ELSE]1922long result = _unsafe.compareAndExchangeLongVolatile(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1923/*[ENDIF]*/1924return convertEndian(result);1925}19261927private static final long compareAndExchangeAcquire(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {1928BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1929long result = _unsafe.compareAndExchangeLongAcquire(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1930return convertEndian(result);1931}19321933private static final long compareAndExchangeRelease(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {1934BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1935long result = _unsafe.compareAndExchangeLongRelease(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1936return convertEndian(result);1937}19381939private static final boolean weakCompareAndSet(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {1940BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1941/*[IF Sidecar19-SE-OpenJ9]*/1942return _unsafe.weakCompareAndSetLongPlain(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1943/*[ELSE]1944return _unsafe.weakCompareAndSwapLong(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1945/*[ENDIF]*/1946}19471948private static final boolean weakCompareAndSetAcquire(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {1949BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1950/*[IF Sidecar19-SE-OpenJ9]*/1951return _unsafe.weakCompareAndSetLongAcquire(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1952/*[ELSE]1953return _unsafe.weakCompareAndSwapLongAcquire(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1954/*[ENDIF]*/1955}19561957private static final boolean weakCompareAndSetRelease(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {1958BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1959/*[IF Sidecar19-SE-OpenJ9]*/1960return _unsafe.weakCompareAndSetLongRelease(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1961/*[ELSE]1962return _unsafe.weakCompareAndSwapLongRelease(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1963/*[ENDIF]*/1964}19651966private static final boolean weakCompareAndSetPlain(ByteBuffer receiver, int index, long testValue, long newValue, VarHandle varHandle) {1967BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1968/*[IF Sidecar19-SE-OpenJ9]*/1969return _unsafe.weakCompareAndSetLongPlain(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1970/*[ELSE]1971return _unsafe.weakCompareAndSwapLong(be.base, be.offset, convertEndian(testValue), convertEndian(newValue));1972/*[ENDIF]*/1973}19741975private static final long getAndSet(ByteBuffer receiver, int index, long value, VarHandle varHandle) {1976BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1977long result = _unsafe.getAndSetLong(be.base, be.offset, convertEndian(value));1978return convertEndian(result);1979}19801981private static final long getAndSetAcquire(ByteBuffer receiver, int index, long value, VarHandle varHandle) {1982BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1983long result = _unsafe.getAndSetLongAcquire(be.base, be.offset, convertEndian(value));1984return convertEndian(result);1985}19861987private static final long getAndSetRelease(ByteBuffer receiver, int index, long value, VarHandle varHandle) {1988BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1989long result = _unsafe.getAndSetLongRelease(be.base, be.offset, convertEndian(value));1990return convertEndian(result);1991}19921993private static final long getAndAdd(ByteBuffer receiver, int index, long value, VarHandle varHandle) {1994BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);1995long result = _unsafe.getAndAddLong(be.base, be.offset, convertEndian(value));1996return convertEndian(result);1997}19981999private static final long getAndAddAcquire(ByteBuffer receiver, int index, long value, VarHandle varHandle) {2000BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);2001long result = _unsafe.getAndAddLongAcquire(be.base, be.offset, convertEndian(value));2002return convertEndian(result);2003}20042005private static final long getAndAddRelease(ByteBuffer receiver, int index, long value, VarHandle varHandle) {2006BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);2007long result = _unsafe.getAndAddLongRelease(be.base, be.offset, convertEndian(value));2008return convertEndian(result);2009}20102011private static final long getAndBitwiseAnd(ByteBuffer receiver, int index, long value, VarHandle varHandle) {2012BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);2013long result = _unsafe.getAndBitwiseAndLong(be.base, be.offset, convertEndian(value));2014return convertEndian(result);2015}20162017private static final long getAndBitwiseAndAcquire(ByteBuffer receiver, int index, long value, VarHandle varHandle) {2018BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);2019long result = _unsafe.getAndBitwiseAndLongAcquire(be.base, be.offset, convertEndian(value));2020return convertEndian(result);2021}20222023private static final long getAndBitwiseAndRelease(ByteBuffer receiver, int index, long value, VarHandle varHandle) {2024BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);2025long result = _unsafe.getAndBitwiseAndLongRelease(be.base, be.offset, convertEndian(value));2026return convertEndian(result);2027}20282029private static final long getAndBitwiseOr(ByteBuffer receiver, int index, long value, VarHandle varHandle) {2030BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);2031long result = _unsafe.getAndBitwiseOrLong(be.base, be.offset, convertEndian(value));2032return convertEndian(result);2033}20342035private static final long getAndBitwiseOrAcquire(ByteBuffer receiver, int index, long value, VarHandle varHandle) {2036BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);2037long result = _unsafe.getAndBitwiseOrLongAcquire(be.base, be.offset, convertEndian(value));2038return convertEndian(result);2039}20402041private static final long getAndBitwiseOrRelease(ByteBuffer receiver, int index, long value, VarHandle varHandle) {2042BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);2043long result = _unsafe.getAndBitwiseOrLongRelease(be.base, be.offset, convertEndian(value));2044return convertEndian(result);2045}20462047private static final long getAndBitwiseXor(ByteBuffer receiver, int index, long value, VarHandle varHandle) {2048BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);2049long result = _unsafe.getAndBitwiseXorLong(be.base, be.offset, convertEndian(value));2050return convertEndian(result);2051}20522053private static final long getAndBitwiseXorAcquire(ByteBuffer receiver, int index, long value, VarHandle varHandle) {2054BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);2055long result = _unsafe.getAndBitwiseXorLongAcquire(be.base, be.offset, convertEndian(value));2056return convertEndian(result);2057}20582059private static final long getAndBitwiseXorRelease(ByteBuffer receiver, int index, long value, VarHandle varHandle) {2060BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);2061long result = _unsafe.getAndBitwiseXorLongRelease(be.base, be.offset, convertEndian(value));2062return convertEndian(result);2063}2064}20652066static final class OpShortConvertEndian extends ByteBufferViewVarHandleOperations {2067private static final int BYTES = Short.BYTES;20682069private static final short get(ByteBuffer receiver, int index, VarHandle varHandle) {2070BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, true);2071short result = _unsafe.getShort(be.base, be.offset);2072return convertEndian(result);2073}20742075private static final void set(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2076BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, true);2077_unsafe.putShort(be.base, be.offset, convertEndian(value));2078}20792080private static final short getVolatile(ByteBuffer receiver, int index, VarHandle varHandle) {2081BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);2082short result = _unsafe.getShortVolatile(be.base, be.offset);2083return convertEndian(result);2084}20852086private static final void setVolatile(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2087BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);2088_unsafe.putShortVolatile(be.base, be.offset, convertEndian(value));2089}20902091private static final short getOpaque(ByteBuffer receiver, int index, VarHandle varHandle) {2092BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);2093short result = _unsafe.getShortOpaque(be.base, be.offset);2094return convertEndian(result);2095}20962097private static final void setOpaque(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2098BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);2099_unsafe.putShortOpaque(be.base, be.offset, convertEndian(value));2100}21012102private static final short getAcquire(ByteBuffer receiver, int index, VarHandle varHandle) {2103BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, true, false);2104short result = _unsafe.getShortAcquire(be.base, be.offset);2105return convertEndian(result);2106}21072108private static final void setRelease(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2109BufferElement be = checkAndGetBufferElement(receiver, BYTES, index, false, false);2110_unsafe.putShortRelease(be.base, be.offset, convertEndian(value));2111}21122113private static final boolean compareAndSet(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {2114throw operationNotSupported(varHandle);2115}21162117private static final short compareAndExchange(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {2118throw operationNotSupported(varHandle);2119}21202121private static final short compareAndExchangeAcquire(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {2122throw operationNotSupported(varHandle);2123}21242125private static final short compareAndExchangeRelease(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {2126throw operationNotSupported(varHandle);2127}21282129private static final boolean weakCompareAndSet(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {2130throw operationNotSupported(varHandle);2131}21322133private static final boolean weakCompareAndSetAcquire(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {2134throw operationNotSupported(varHandle);2135}21362137private static final boolean weakCompareAndSetRelease(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {2138throw operationNotSupported(varHandle);2139}21402141private static final boolean weakCompareAndSetPlain(ByteBuffer receiver, int index, short testValue, short newValue, VarHandle varHandle) {2142throw operationNotSupported(varHandle);2143}21442145private static final short getAndSet(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2146throw operationNotSupported(varHandle);2147}21482149private static final short getAndSetAcquire(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2150throw operationNotSupported(varHandle);2151}21522153private static final short getAndSetRelease(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2154throw operationNotSupported(varHandle);2155}21562157private static final short getAndAdd(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2158throw operationNotSupported(varHandle);2159}21602161private static final short getAndAddAcquire(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2162throw operationNotSupported(varHandle);2163}21642165private static final short getAndAddRelease(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2166throw operationNotSupported(varHandle);2167}21682169private static final short getAndBitwiseAnd(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2170throw operationNotSupported(varHandle);2171}21722173private static final short getAndBitwiseAndAcquire(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2174throw operationNotSupported(varHandle);2175}21762177private static final short getAndBitwiseAndRelease(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2178throw operationNotSupported(varHandle);2179}21802181private static final short getAndBitwiseOr(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2182throw operationNotSupported(varHandle);2183}21842185private static final short getAndBitwiseOrAcquire(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2186throw operationNotSupported(varHandle);2187}21882189private static final short getAndBitwiseOrRelease(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2190throw operationNotSupported(varHandle);2191}21922193private static final short getAndBitwiseXor(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2194throw operationNotSupported(varHandle);2195}21962197private static final short getAndBitwiseXorAcquire(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2198throw operationNotSupported(varHandle);2199}22002201private static final short getAndBitwiseXorRelease(ByteBuffer receiver, int index, short value, VarHandle varHandle) {2202throw operationNotSupported(varHandle);2203}2204}2205}2206}220722082209