1 /*
   2  * Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @test
  26  * @comment Set CompileThresholdScaling to 0.1 so that the warmup loop sets to 2000 iterations
  27  *          to hit compilation thresholds
  28  * @run junit/othervm -Diters=2000 -XX:CompileThresholdScaling=0.1 VarHandleTestMethodHandleAccessLong
  29  */
  30 
  31 import java.lang.invoke.MethodHandle;
  32 import java.lang.invoke.MethodHandles;
  33 import java.lang.invoke.VarHandle;
  34 import java.util.ArrayList;
  35 import java.util.List;
  36 
  37 import static org.junit.jupiter.api.Assertions.*;
  38 import org.junit.jupiter.api.BeforeAll;
  39 import org.junit.jupiter.api.TestInstance;
  40 import org.junit.jupiter.params.ParameterizedTest;
  41 import org.junit.jupiter.params.provider.MethodSource;
  42 
  43 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
  44 public class VarHandleTestMethodHandleAccessLong extends VarHandleBaseTest {
  45     static final long static_final_v = 0x0123456789ABCDEFL;
  46 
  47     static long static_v;
  48 
  49     final long final_v = 0x0123456789ABCDEFL;
  50 
  51     long v;
  52 
  53     VarHandle vhFinalField;
  54 
  55     VarHandle vhField;
  56 
  57     VarHandle vhStaticField;
  58 
  59     VarHandle vhStaticFinalField;
  60 
  61     VarHandle vhArray;
  62 
  63     @BeforeAll
  64     public void setup() throws Exception {
  65         vhFinalField = MethodHandles.lookup().findVarHandle(
  66                 VarHandleTestMethodHandleAccessLong.class, "final_v", long.class);
  67 
  68         vhField = MethodHandles.lookup().findVarHandle(
  69                 VarHandleTestMethodHandleAccessLong.class, "v", long.class);
  70 
  71         vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
  72             VarHandleTestMethodHandleAccessLong.class, "static_final_v", long.class);
  73 
  74         vhStaticField = MethodHandles.lookup().findStaticVarHandle(
  75             VarHandleTestMethodHandleAccessLong.class, "static_v", long.class);
  76 
  77         vhArray = MethodHandles.arrayElementVarHandle(long[].class);
  78     }
  79 
  80     public Object[][] accessTestCaseProvider() throws Exception {
  81         List<AccessTestCase<?>> cases = new ArrayList<>();
  82 
  83         for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) {
  84             cases.add(new MethodHandleAccessTestCase("Instance field",
  85                                                      vhField, f, hs -> testInstanceField(this, hs)));
  86             cases.add(new MethodHandleAccessTestCase("Instance field unsupported",
  87                                                      vhField, f, hs -> testInstanceFieldUnsupported(this, hs),
  88                                                      false));
  89 
  90             cases.add(new MethodHandleAccessTestCase("Static field",
  91                                                      vhStaticField, f, VarHandleTestMethodHandleAccessLong::testStaticField));
  92             cases.add(new MethodHandleAccessTestCase("Static field unsupported",
  93                                                      vhStaticField, f, VarHandleTestMethodHandleAccessLong::testStaticFieldUnsupported,
  94                                                      false));
  95 
  96             cases.add(new MethodHandleAccessTestCase("Array",
  97                                                      vhArray, f, VarHandleTestMethodHandleAccessLong::testArray));
  98             cases.add(new MethodHandleAccessTestCase("Array unsupported",
  99                                                      vhArray, f, VarHandleTestMethodHandleAccessLong::testArrayUnsupported,
 100                                                      false));
 101             cases.add(new MethodHandleAccessTestCase("Array index out of bounds",
 102                                                      vhArray, f, VarHandleTestMethodHandleAccessLong::testArrayIndexOutOfBounds,
 103                                                      false));
 104         }
 105 
 106         // Work around issue with jtreg summary reporting which truncates
 107         // the String result of Object.toString to 30 characters, hence
 108         // the first dummy argument
 109         return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
 110     }
 111 
 112     @ParameterizedTest
 113     @MethodSource("accessTestCaseProvider")
 114     public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
 115         T t = atc.get();
 116         int iters = atc.requiresLoop() ? ITERS : 1;
 117         for (int c = 0; c < iters; c++) {
 118             atc.testAccess(t);
 119         }
 120     }
 121 
 122     static void testInstanceField(VarHandleTestMethodHandleAccessLong recv, Handles hs) throws Throwable {
 123         // Plain
 124         {
 125             hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
 126             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 127             assertEquals(0x0123456789ABCDEFL, x, "set long value");
 128         }
 129 
 130 
 131         // Volatile
 132         {
 133             hs.get(TestAccessMode.SET_VOLATILE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
 134             long x = (long) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(recv);
 135             assertEquals(0xCAFEBABECAFEBABEL, x, "setVolatile long value");
 136         }
 137 
 138         // Lazy
 139         {
 140             hs.get(TestAccessMode.SET_RELEASE).invokeExact(recv, 0x0123456789ABCDEFL);
 141             long x = (long) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(recv);
 142             assertEquals(0x0123456789ABCDEFL, x, "setRelease long value");
 143         }
 144 
 145         // Opaque
 146         {
 147             hs.get(TestAccessMode.SET_OPAQUE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
 148             long x = (long) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(recv);
 149             assertEquals(0xCAFEBABECAFEBABEL, x, "setOpaque long value");
 150         }
 151 
 152         hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
 153 
 154         // Compare
 155         {
 156             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
 157             assertEquals(r, true, "success compareAndSet long");
 158             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 159             assertEquals(0xCAFEBABECAFEBABEL, x, "success compareAndSet long value");
 160         }
 161 
 162         {
 163             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(recv, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
 164             assertEquals(r, false, "failing compareAndSet long");
 165             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 166             assertEquals(0xCAFEBABECAFEBABEL, x, "failing compareAndSet long value");
 167         }
 168 
 169         {
 170             long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
 171             assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchange long");
 172             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 173             assertEquals(0x0123456789ABCDEFL, x, "success compareAndExchange long value");
 174         }
 175 
 176         {
 177             long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
 178             assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchange long");
 179             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 180             assertEquals(0x0123456789ABCDEFL, x, "failing compareAndExchange long value");
 181         }
 182 
 183         {
 184             long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
 185             assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long");
 186             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 187             assertEquals(0xCAFEBABECAFEBABEL, x, "success compareAndExchangeAcquire long value");
 188         }
 189 
 190         {
 191             long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(recv, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
 192             assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long");
 193             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 194             assertEquals(0xCAFEBABECAFEBABEL, x, "failing compareAndExchangeAcquire long value");
 195         }
 196 
 197         {
 198             long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
 199             assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long");
 200             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 201             assertEquals(0x0123456789ABCDEFL, x, "success compareAndExchangeRelease long value");
 202         }
 203 
 204         {
 205             long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
 206             assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long");
 207             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 208             assertEquals(0x0123456789ABCDEFL, x, "failing compareAndExchangeRelease long value");
 209         }
 210 
 211         {
 212             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
 213             boolean success = false;
 214             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 215                 success = (boolean) mh.invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
 216                 if (!success) weakDelay();
 217             }
 218             assertEquals(success, true, "success weakCompareAndSetPlain long");
 219             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 220             assertEquals(0xCAFEBABECAFEBABEL, x, "success weakCompareAndSetPlain long value");
 221         }
 222 
 223         {
 224             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(recv, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
 225             assertEquals(success, false, "failing weakCompareAndSetPlain long");
 226             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 227             assertEquals(0xCAFEBABECAFEBABEL, x, "failing weakCompareAndSetPlain long value");
 228         }
 229 
 230         {
 231             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
 232             boolean success = false;
 233             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 234                 success = (boolean) mh.invokeExact(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
 235                 if (!success) weakDelay();
 236             }
 237             assertEquals(success, true, "success weakCompareAndSetAcquire long");
 238             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 239             assertEquals(0x0123456789ABCDEFL, x, "success weakCompareAndSetAcquire long");
 240         }
 241 
 242         {
 243             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
 244             assertEquals(success, false, "failing weakCompareAndSetAcquire long");
 245             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 246             assertEquals(0x0123456789ABCDEFL, x, "failing weakCompareAndSetAcquire long value");
 247         }
 248 
 249         {
 250             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
 251             boolean success = false;
 252             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 253                 success = (boolean) mh.invokeExact(recv, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
 254                 if (!success) weakDelay();
 255             }
 256             assertEquals(success, true, "success weakCompareAndSetRelease long");
 257             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 258             assertEquals(0xCAFEBABECAFEBABEL, x, "success weakCompareAndSetRelease long");
 259         }
 260 
 261         {
 262             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(recv, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
 263             assertEquals(success, false, "failing weakCompareAndSetRelease long");
 264             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 265             assertEquals(0xCAFEBABECAFEBABEL, x, "failing weakCompareAndSetRelease long value");
 266         }
 267 
 268         {
 269             boolean success = false;
 270             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
 271             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 272                 success = (boolean) mh.invokeExact(recv, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
 273                 if (!success) weakDelay();
 274             }
 275             assertEquals(success, true, "success weakCompareAndSet long");
 276             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 277             assertEquals(0x0123456789ABCDEFL, x, "success weakCompareAndSet long");
 278         }
 279 
 280         {
 281             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(recv, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
 282             assertEquals(success, false, "failing weakCompareAndSet long");
 283             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 284             assertEquals(0x0123456789ABCDEFL, x, "failing weakCompareAndSet long value");
 285         }
 286 
 287         // Compare set and get
 288         {
 289             long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(recv, 0xCAFEBABECAFEBABEL);
 290             assertEquals(0x0123456789ABCDEFL, o, "getAndSet long");
 291             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 292             assertEquals(0xCAFEBABECAFEBABEL, x, "getAndSet long value");
 293         }
 294 
 295         // get and add, add and get
 296         {
 297             hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
 298 
 299             long o = (long) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(recv, 0xCAFEBABECAFEBABEL);
 300             assertEquals(0x0123456789ABCDEFL, o, "getAndAdd long");
 301             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 302             assertEquals((long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), x, "getAndAdd long value");
 303         }
 304 
 305         {
 306             hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
 307 
 308             long o = (long) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
 309             assertEquals(0x0123456789ABCDEFL, o, "getAndAddAcquire long");
 310             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 311             assertEquals((long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), x, "getAndAddAcquire long value");
 312         }
 313 
 314         {
 315             hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
 316 
 317             long o = (long) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
 318             assertEquals(0x0123456789ABCDEFL, o, "getAndAddRelease long");
 319             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 320             assertEquals((long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), x, "getAndAddRelease long value");
 321         }
 322 
 323         // get and bitwise or
 324         {
 325             hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
 326 
 327             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(recv, 0xCAFEBABECAFEBABEL);
 328             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseOr long");
 329             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 330             assertEquals((long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), x, "getAndBitwiseOr long value");
 331         }
 332 
 333         {
 334             hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
 335 
 336             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
 337             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseOrAcquire long");
 338             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 339             assertEquals((long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), x, "getAndBitwiseOrAcquire long value");
 340         }
 341 
 342         {
 343             hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
 344 
 345             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
 346             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseOrRelease long");
 347             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 348             assertEquals((long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), x, "getAndBitwiseOrRelease long value");
 349         }
 350 
 351         // get and bitwise and
 352         {
 353             hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
 354 
 355             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(recv, 0xCAFEBABECAFEBABEL);
 356             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseAnd long");
 357             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 358             assertEquals((long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), x, "getAndBitwiseAnd long value");
 359         }
 360 
 361         {
 362             hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
 363 
 364             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
 365             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseAndAcquire long");
 366             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 367             assertEquals((long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), x, "getAndBitwiseAndAcquire long value");
 368         }
 369 
 370         {
 371             hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
 372 
 373             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
 374             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseAndRelease long");
 375             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 376             assertEquals((long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), x, "getAndBitwiseAndRelease long value");
 377         }
 378 
 379         // get and bitwise xor
 380         {
 381             hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
 382 
 383             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(recv, 0xCAFEBABECAFEBABEL);
 384             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseXor long");
 385             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 386             assertEquals((long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), x, "getAndBitwiseXor long value");
 387         }
 388 
 389         {
 390             hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
 391 
 392             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
 393             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseXorAcquire long");
 394             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 395             assertEquals((long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), x, "getAndBitwiseXorAcquire long value");
 396         }
 397 
 398         {
 399             hs.get(TestAccessMode.SET).invokeExact(recv, 0x0123456789ABCDEFL);
 400 
 401             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(recv, 0xCAFEBABECAFEBABEL);
 402             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseXorRelease long");
 403             long x = (long) hs.get(TestAccessMode.GET).invokeExact(recv);
 404             assertEquals((long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), x, "getAndBitwiseXorRelease long value");
 405         }
 406     }
 407 
 408     static void testInstanceFieldUnsupported(VarHandleTestMethodHandleAccessLong recv, Handles hs) throws Throwable {
 409 
 410 
 411     }
 412 
 413 
 414     static void testStaticField(Handles hs) throws Throwable {
 415         // Plain
 416         {
 417             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 418             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 419             assertEquals(0x0123456789ABCDEFL, x, "set long value");
 420         }
 421 
 422 
 423         // Volatile
 424         {
 425             hs.get(TestAccessMode.SET_VOLATILE).invokeExact(0xCAFEBABECAFEBABEL);
 426             long x = (long) hs.get(TestAccessMode.GET_VOLATILE).invokeExact();
 427             assertEquals(0xCAFEBABECAFEBABEL, x, "setVolatile long value");
 428         }
 429 
 430         // Lazy
 431         {
 432             hs.get(TestAccessMode.SET_RELEASE).invokeExact(0x0123456789ABCDEFL);
 433             long x = (long) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact();
 434             assertEquals(0x0123456789ABCDEFL, x, "setRelease long value");
 435         }
 436 
 437         // Opaque
 438         {
 439             hs.get(TestAccessMode.SET_OPAQUE).invokeExact(0xCAFEBABECAFEBABEL);
 440             long x = (long) hs.get(TestAccessMode.GET_OPAQUE).invokeExact();
 441             assertEquals(0xCAFEBABECAFEBABEL, x, "setOpaque long value");
 442         }
 443 
 444         hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 445 
 446         // Compare
 447         {
 448             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
 449             assertEquals(r, true, "success compareAndSet long");
 450             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 451             assertEquals(0xCAFEBABECAFEBABEL, x, "success compareAndSet long value");
 452         }
 453 
 454         {
 455             boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
 456             assertEquals(r, false, "failing compareAndSet long");
 457             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 458             assertEquals(0xCAFEBABECAFEBABEL, x, "failing compareAndSet long value");
 459         }
 460 
 461         {
 462             long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
 463             assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchange long");
 464             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 465             assertEquals(0x0123456789ABCDEFL, x, "success compareAndExchange long value");
 466         }
 467 
 468         {
 469             long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
 470             assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchange long");
 471             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 472             assertEquals(0x0123456789ABCDEFL, x, "failing compareAndExchange long value");
 473         }
 474 
 475         {
 476             long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
 477             assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long");
 478             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 479             assertEquals(0xCAFEBABECAFEBABEL, x, "success compareAndExchangeAcquire long value");
 480         }
 481 
 482         {
 483             long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
 484             assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long");
 485             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 486             assertEquals(0xCAFEBABECAFEBABEL, x, "failing compareAndExchangeAcquire long value");
 487         }
 488 
 489         {
 490             long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
 491             assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long");
 492             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 493             assertEquals(0x0123456789ABCDEFL, x, "success compareAndExchangeRelease long value");
 494         }
 495 
 496         {
 497             long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
 498             assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long");
 499             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 500             assertEquals(0x0123456789ABCDEFL, x, "failing compareAndExchangeRelease long value");
 501         }
 502 
 503         {
 504             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
 505             boolean success = false;
 506             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 507                 success = (boolean) mh.invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
 508                 if (!success) weakDelay();
 509             }
 510             assertEquals(success, true, "success weakCompareAndSetPlain long");
 511             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 512             assertEquals(0xCAFEBABECAFEBABEL, x, "success weakCompareAndSetPlain long value");
 513         }
 514 
 515         {
 516             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
 517             assertEquals(success, false, "failing weakCompareAndSetPlain long");
 518             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 519             assertEquals(0xCAFEBABECAFEBABEL, x, "failing weakCompareAndSetPlain long value");
 520         }
 521 
 522         {
 523             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
 524             boolean success = false;
 525             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 526                 success = (boolean) mh.invokeExact(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
 527                 if (!success) weakDelay();
 528             }
 529             assertEquals(success, true, "success weakCompareAndSetAcquire long");
 530             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 531             assertEquals(0x0123456789ABCDEFL, x, "success weakCompareAndSetAcquire long");
 532         }
 533 
 534         {
 535             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
 536             boolean success = (boolean) mh.invokeExact(0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
 537             assertEquals(success, false, "failing weakCompareAndSetAcquire long");
 538             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 539             assertEquals(0x0123456789ABCDEFL, x, "failing weakCompareAndSetAcquire long value");
 540         }
 541 
 542         {
 543             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
 544             boolean success = false;
 545             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 546                 success = (boolean) mh.invokeExact(0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
 547                 if (!success) weakDelay();
 548             }
 549             assertEquals(success, true, "success weakCompareAndSetRelease long");
 550             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 551             assertEquals(0xCAFEBABECAFEBABEL, x, "success weakCompareAndSetRelease long");
 552         }
 553 
 554         {
 555             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE).invokeExact(0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
 556             assertEquals(success, false, "failing weakCompareAndSetRelease long");
 557             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 558             assertEquals(0xCAFEBABECAFEBABEL, x, "failing weakCompareAndSetRelease long value");
 559         }
 560 
 561         {
 562             MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
 563             boolean success = false;
 564             for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 565                 success = (boolean) mh.invokeExact(0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
 566                 if (!success) weakDelay();
 567             }
 568             assertEquals(success, true, "success weakCompareAndSet long");
 569             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 570             assertEquals(0x0123456789ABCDEFL, x, "success weakCompareAndSet long");
 571         }
 572 
 573         {
 574             boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
 575             assertEquals(success, false, "failing weakCompareAndSet long");
 576             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 577             assertEquals(0x0123456789ABCDEFL, x, "failing weakCompareAndSetRe long value");
 578         }
 579 
 580         // Compare set and get
 581         {
 582             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 583 
 584             long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(0xCAFEBABECAFEBABEL);
 585             assertEquals(0x0123456789ABCDEFL, o, "getAndSet long");
 586             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 587             assertEquals(0xCAFEBABECAFEBABEL, x, "getAndSet long value");
 588         }
 589 
 590         // Compare set and get
 591         {
 592             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 593 
 594             long o = (long) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL);
 595             assertEquals(0x0123456789ABCDEFL, o, "getAndSetAcquire long");
 596             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 597             assertEquals(0xCAFEBABECAFEBABEL, x, "getAndSetAcquire long value");
 598         }
 599 
 600         // Compare set and get
 601         {
 602             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 603 
 604             long o = (long) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(0xCAFEBABECAFEBABEL);
 605             assertEquals(0x0123456789ABCDEFL, o, "getAndSetRelease long");
 606             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 607             assertEquals(0xCAFEBABECAFEBABEL, x, "getAndSetRelease long value");
 608         }
 609 
 610         // get and add, add and get
 611         {
 612             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 613 
 614             long o = (long) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(0xCAFEBABECAFEBABEL);
 615             assertEquals(0x0123456789ABCDEFL, o, "getAndAdd long");
 616             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 617             assertEquals((long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), x, "getAndAdd long value");
 618         }
 619 
 620         {
 621             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 622 
 623             long o = (long) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL);
 624             assertEquals(0x0123456789ABCDEFL, o, "getAndAddAcquire long");
 625             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 626             assertEquals((long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), x, "getAndAddAcquire long value");
 627         }
 628 
 629         {
 630             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 631 
 632             long o = (long) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(0xCAFEBABECAFEBABEL);
 633             assertEquals(0x0123456789ABCDEFL, o, "getAndAddRelease long");
 634             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 635             assertEquals((long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), x, "getAndAddRelease long value");
 636         }
 637 
 638         // get and bitwise or
 639         {
 640             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 641 
 642             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(0xCAFEBABECAFEBABEL);
 643             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseOr long");
 644             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 645             assertEquals((long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), x, "getAndBitwiseOr long value");
 646         }
 647 
 648         {
 649             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 650 
 651             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL);
 652             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseOrAcquire long");
 653             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 654             assertEquals((long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), x, "getAndBitwiseOrAcquire long value");
 655         }
 656 
 657         {
 658             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 659 
 660             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(0xCAFEBABECAFEBABEL);
 661             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseOrRelease long");
 662             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 663             assertEquals((long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), x, "getAndBitwiseOrRelease long value");
 664         }
 665 
 666         // get and bitwise and
 667         {
 668             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 669 
 670             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(0xCAFEBABECAFEBABEL);
 671             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseAnd long");
 672             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 673             assertEquals((long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), x, "getAndBitwiseAnd long value");
 674         }
 675 
 676         {
 677             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 678 
 679             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL);
 680             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseAndAcquire long");
 681             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 682             assertEquals((long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), x, "getAndBitwiseAndAcquire long value");
 683         }
 684 
 685         {
 686             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 687 
 688             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(0xCAFEBABECAFEBABEL);
 689             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseAndRelease long");
 690             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 691             assertEquals((long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), x, "getAndBitwiseAndRelease long value");
 692         }
 693 
 694         // get and bitwise xor
 695         {
 696             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 697 
 698             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(0xCAFEBABECAFEBABEL);
 699             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseXor long");
 700             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 701             assertEquals((long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), x, "getAndBitwiseXor long value");
 702         }
 703 
 704         {
 705             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 706 
 707             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(0xCAFEBABECAFEBABEL);
 708             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseXorAcquire long");
 709             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 710             assertEquals((long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), x, "getAndBitwiseXorAcquire long value");
 711         }
 712 
 713         {
 714             hs.get(TestAccessMode.SET).invokeExact(0x0123456789ABCDEFL);
 715 
 716             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(0xCAFEBABECAFEBABEL);
 717             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseXorRelease long");
 718             long x = (long) hs.get(TestAccessMode.GET).invokeExact();
 719             assertEquals((long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), x, "getAndBitwiseXorRelease long value");
 720         }
 721     }
 722 
 723     static void testStaticFieldUnsupported(Handles hs) throws Throwable {
 724 
 725 
 726     }
 727 
 728 
 729     static void testArray(Handles hs) throws Throwable {
 730         long[] array = new long[10];
 731 
 732         for (int i = 0; i < array.length; i++) {
 733             // Plain
 734             {
 735                 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
 736                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 737                 assertEquals(0x0123456789ABCDEFL, x, "get long value");
 738             }
 739 
 740 
 741             // Volatile
 742             {
 743                 hs.get(TestAccessMode.SET_VOLATILE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
 744                 long x = (long) hs.get(TestAccessMode.GET_VOLATILE).invokeExact(array, i);
 745                 assertEquals(0xCAFEBABECAFEBABEL, x, "setVolatile long value");
 746             }
 747 
 748             // Lazy
 749             {
 750                 hs.get(TestAccessMode.SET_RELEASE).invokeExact(array, i, 0x0123456789ABCDEFL);
 751                 long x = (long) hs.get(TestAccessMode.GET_ACQUIRE).invokeExact(array, i);
 752                 assertEquals(0x0123456789ABCDEFL, x, "setRelease long value");
 753             }
 754 
 755             // Opaque
 756             {
 757                 hs.get(TestAccessMode.SET_OPAQUE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
 758                 long x = (long) hs.get(TestAccessMode.GET_OPAQUE).invokeExact(array, i);
 759                 assertEquals(0xCAFEBABECAFEBABEL, x, "setOpaque long value");
 760             }
 761 
 762             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
 763 
 764             // Compare
 765             {
 766                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
 767                 assertEquals(r, true, "success compareAndSet long");
 768                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 769                 assertEquals(0xCAFEBABECAFEBABEL, x, "success compareAndSet long value");
 770             }
 771 
 772             {
 773                 boolean r = (boolean) hs.get(TestAccessMode.COMPARE_AND_SET).invokeExact(array, i, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
 774                 assertEquals(r, false, "failing compareAndSet long");
 775                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 776                 assertEquals(0xCAFEBABECAFEBABEL, x, "failing compareAndSet long value");
 777             }
 778 
 779             {
 780                 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
 781                 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchange long");
 782                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 783                 assertEquals(0x0123456789ABCDEFL, x, "success compareAndExchange long value");
 784             }
 785 
 786             {
 787                 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
 788                 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchange long");
 789                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 790                 assertEquals(0x0123456789ABCDEFL, x, "failing compareAndExchange long value");
 791             }
 792 
 793             {
 794                 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
 795                 assertEquals(r, 0x0123456789ABCDEFL, "success compareAndExchangeAcquire long");
 796                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 797                 assertEquals(0xCAFEBABECAFEBABEL, x, "success compareAndExchangeAcquire long value");
 798             }
 799 
 800             {
 801                 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_ACQUIRE).invokeExact(array, i, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
 802                 assertEquals(r, 0xCAFEBABECAFEBABEL, "failing compareAndExchangeAcquire long");
 803                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 804                 assertEquals(0xCAFEBABECAFEBABEL, x, "failing compareAndExchangeAcquire long value");
 805             }
 806 
 807             {
 808                 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
 809                 assertEquals(r, 0xCAFEBABECAFEBABEL, "success compareAndExchangeRelease long");
 810                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 811                 assertEquals(0x0123456789ABCDEFL, x, "success compareAndExchangeRelease long value");
 812             }
 813 
 814             {
 815                 long r = (long) hs.get(TestAccessMode.COMPARE_AND_EXCHANGE_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
 816                 assertEquals(r, 0x0123456789ABCDEFL, "failing compareAndExchangeRelease long");
 817                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 818                 assertEquals(0x0123456789ABCDEFL, x, "failing compareAndExchangeRelease long value");
 819             }
 820 
 821             {
 822                 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN);
 823                 boolean success = false;
 824                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 825                     success = (boolean) mh.invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
 826                     if (!success) weakDelay();
 827                 }
 828                 assertEquals(success, true, "success weakCompareAndSetPlain long");
 829                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 830                 assertEquals(0xCAFEBABECAFEBABEL, x, "success weakCompareAndSetPlain long value");
 831             }
 832 
 833             {
 834                 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_PLAIN).invokeExact(array, i, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
 835                 assertEquals(success, false, "failing weakCompareAndSetPlain long");
 836                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 837                 assertEquals(0xCAFEBABECAFEBABEL, x, "failing weakCompareAndSetPlain long value");
 838             }
 839 
 840             {
 841                 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE);
 842                 boolean success = false;
 843                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 844                     success = (boolean) mh.invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
 845                     if (!success) weakDelay();
 846                 }
 847                 assertEquals(success, true, "success weakCompareAndSetAcquire long");
 848                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 849                 assertEquals(0x0123456789ABCDEFL, x, "success weakCompareAndSetAcquire long");
 850             }
 851 
 852             {
 853                 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
 854                 assertEquals(success, false, "failing weakCompareAndSetAcquire long");
 855                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 856                 assertEquals(0x0123456789ABCDEFL, x, "failing weakCompareAndSetAcquire long value");
 857             }
 858 
 859             {
 860                 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_RELEASE);
 861                 boolean success = false;
 862                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 863                     success = (boolean) mh.invokeExact(array, i, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
 864                     if (!success) weakDelay();
 865                 }
 866                 assertEquals(success, true, "success weakCompareAndSetRelease long");
 867                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 868                 assertEquals(0xCAFEBABECAFEBABEL, x, "success weakCompareAndSetRelease long");
 869             }
 870 
 871             {
 872                 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET_ACQUIRE).invokeExact(array, i, 0x0123456789ABCDEFL, 0xDEADBEEFDEADBEEFL);
 873                 assertEquals(success, false, "failing weakCompareAndSetAcquire long");
 874                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 875                 assertEquals(0xCAFEBABECAFEBABEL, x, "failing weakCompareAndSetAcquire long value");
 876             }
 877 
 878             {
 879                 MethodHandle mh = hs.get(TestAccessMode.WEAK_COMPARE_AND_SET);
 880                 boolean success = false;
 881                 for (int c = 0; c < WEAK_ATTEMPTS && !success; c++) {
 882                     success = (boolean) mh.invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
 883                     if (!success) weakDelay();
 884                 }
 885                 assertEquals(success, true, "success weakCompareAndSet long");
 886                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 887                 assertEquals(0x0123456789ABCDEFL, x, "success weakCompareAndSet long");
 888             }
 889 
 890             {
 891                 boolean success = (boolean) hs.get(TestAccessMode.WEAK_COMPARE_AND_SET).invokeExact(array, i, 0xCAFEBABECAFEBABEL, 0xDEADBEEFDEADBEEFL);
 892                 assertEquals(success, false, "failing weakCompareAndSet long");
 893                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 894                 assertEquals(0x0123456789ABCDEFL, x, "failing weakCompareAndSet long value");
 895             }
 896 
 897             // Compare set and get
 898             {
 899                 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
 900 
 901                 long o = (long) hs.get(TestAccessMode.GET_AND_SET).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
 902                 assertEquals(0x0123456789ABCDEFL, o, "getAndSet long");
 903                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 904                 assertEquals(0xCAFEBABECAFEBABEL, x, "getAndSet long value");
 905             }
 906 
 907             {
 908                 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
 909 
 910                 long o = (long) hs.get(TestAccessMode.GET_AND_SET_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
 911                 assertEquals(0x0123456789ABCDEFL, o, "getAndSetAcquire long");
 912                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 913                 assertEquals(0xCAFEBABECAFEBABEL, x, "getAndSetAcquire long value");
 914             }
 915 
 916             {
 917                 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
 918 
 919                 long o = (long) hs.get(TestAccessMode.GET_AND_SET_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
 920                 assertEquals(0x0123456789ABCDEFL, o, "getAndSetRelease long");
 921                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 922                 assertEquals(0xCAFEBABECAFEBABEL, x, "getAndSetRelease long value");
 923             }
 924 
 925             // get and add, add and get
 926             {
 927                 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
 928 
 929                 long o = (long) hs.get(TestAccessMode.GET_AND_ADD).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
 930                 assertEquals(0x0123456789ABCDEFL, o, "getAndAdd long");
 931                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 932                 assertEquals((long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), x, "getAndAdd long value");
 933             }
 934 
 935             {
 936                 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
 937 
 938                 long o = (long) hs.get(TestAccessMode.GET_AND_ADD_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
 939                 assertEquals(0x0123456789ABCDEFL, o, "getAndAddAcquire long");
 940                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 941                 assertEquals((long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), x, "getAndAddAcquire long value");
 942             }
 943 
 944             {
 945                 hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
 946 
 947                 long o = (long) hs.get(TestAccessMode.GET_AND_ADD_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
 948                 assertEquals(0x0123456789ABCDEFL, o, "getAndAddRelease long");
 949                 long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 950                 assertEquals((long)(0x0123456789ABCDEFL + 0xCAFEBABECAFEBABEL), x, "getAndAddRelease long value");
 951             }
 952 
 953         // get and bitwise or
 954         {
 955             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
 956 
 957             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
 958             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseOr long");
 959             long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 960             assertEquals((long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), x, "getAndBitwiseOr long value");
 961         }
 962 
 963         {
 964             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
 965 
 966             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
 967             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseOrAcquire long");
 968             long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 969             assertEquals((long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), x, "getAndBitwiseOrAcquire long value");
 970         }
 971 
 972         {
 973             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
 974 
 975             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_OR_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
 976             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseOrRelease long");
 977             long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 978             assertEquals((long)(0x0123456789ABCDEFL | 0xCAFEBABECAFEBABEL), x, "getAndBitwiseOrRelease long value");
 979         }
 980 
 981         // get and bitwise and
 982         {
 983             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
 984 
 985             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
 986             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseAnd long");
 987             long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 988             assertEquals((long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), x, "getAndBitwiseAnd long value");
 989         }
 990 
 991         {
 992             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
 993 
 994             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
 995             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseAndAcquire long");
 996             long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
 997             assertEquals((long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), x, "getAndBitwiseAndAcquire long value");
 998         }
 999 
1000         {
1001             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
1002 
1003             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_AND_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
1004             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseAndRelease long");
1005             long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
1006             assertEquals((long)(0x0123456789ABCDEFL & 0xCAFEBABECAFEBABEL), x, "getAndBitwiseAndRelease long value");
1007         }
1008 
1009         // get and bitwise xor
1010         {
1011             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
1012 
1013             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
1014             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseXor long");
1015             long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
1016             assertEquals((long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), x, "getAndBitwiseXor long value");
1017         }
1018 
1019         {
1020             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
1021 
1022             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_ACQUIRE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
1023             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseXorAcquire long");
1024             long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
1025             assertEquals((long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), x, "getAndBitwiseXorAcquire long value");
1026         }
1027 
1028         {
1029             hs.get(TestAccessMode.SET).invokeExact(array, i, 0x0123456789ABCDEFL);
1030 
1031             long o = (long) hs.get(TestAccessMode.GET_AND_BITWISE_XOR_RELEASE).invokeExact(array, i, 0xCAFEBABECAFEBABEL);
1032             assertEquals(0x0123456789ABCDEFL, o, "getAndBitwiseXorRelease long");
1033             long x = (long) hs.get(TestAccessMode.GET).invokeExact(array, i);
1034             assertEquals((long)(0x0123456789ABCDEFL ^ 0xCAFEBABECAFEBABEL), x, "getAndBitwiseXorRelease long value");
1035         }
1036         }
1037     }
1038 
1039     static void testArrayUnsupported(Handles hs) throws Throwable {
1040         long[] array = new long[10];
1041 
1042         final int i = 0;
1043 
1044 
1045     }
1046 
1047     static void testArrayIndexOutOfBounds(Handles hs) throws Throwable {
1048         long[] array = new long[10];
1049 
1050         for (int i : new int[]{-1, Integer.MIN_VALUE, 10, 11, Integer.MAX_VALUE}) {
1051             final int ci = i;
1052 
1053             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
1054                 checkAIOOBE(am, () -> {
1055                     long x = (long) hs.get(am).invokeExact(array, ci);
1056                 });
1057             }
1058 
1059             for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
1060                 checkAIOOBE(am, () -> {
1061                     hs.get(am).invokeExact(array, ci, 0x0123456789ABCDEFL);
1062                 });
1063             }
1064 
1065             for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
1066                 checkAIOOBE(am, () -> {
1067                     boolean r = (boolean) hs.get(am).invokeExact(array, ci, 0x0123456789ABCDEFL, 0xCAFEBABECAFEBABEL);
1068                 });
1069             }
1070 
1071             for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
1072                 checkAIOOBE(am, () -> {
1073                     long r = (long) hs.get(am).invokeExact(array, ci, 0xCAFEBABECAFEBABEL, 0x0123456789ABCDEFL);
1074                 });
1075             }
1076 
1077             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
1078                 checkAIOOBE(am, () -> {
1079                     long o = (long) hs.get(am).invokeExact(array, ci, 0x0123456789ABCDEFL);
1080                 });
1081             }
1082 
1083             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_ADD)) {
1084                 checkAIOOBE(am, () -> {
1085                     long o = (long) hs.get(am).invokeExact(array, ci, 0xDEADBEEFDEADBEEFL);
1086                 });
1087             }
1088 
1089             for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_BITWISE)) {
1090                 checkAIOOBE(am, () -> {
1091                     long o = (long) hs.get(am).invokeExact(array, ci, 0xDEADBEEFDEADBEEFL);
1092                 });
1093             }
1094         }
1095     }
1096 }
1097