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