1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.MethodHandles; 17*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.VarHandle; 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker public class Main { main(String[] args)20*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 21*795d594fSAndroid Build Coastguard Worker // Since the tests will share a value, we have the condition that the value starts 22*795d594fSAndroid Build Coastguard Worker // and ends as 0 before and after each test. 23*795d594fSAndroid Build Coastguard Worker 24*795d594fSAndroid Build Coastguard Worker // Int tests 25*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndAdd_Int(); 26*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndSet_Int(); 27*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndBitwiseAnd_Int(); 28*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndBitwiseOr_Int(); 29*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndBitwiseXor_Int(); 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker // Long tests 32*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndAdd_Long(); 33*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndSet_Long(); 34*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndBitwiseAnd_Long(); 35*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndBitwiseOr_Long(); 36*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndBitwiseXor_Long(); 37*795d594fSAndroid Build Coastguard Worker 38*795d594fSAndroid Build Coastguard Worker // Float tests 39*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndAdd_Float(); 40*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndSet_Float(); 41*795d594fSAndroid Build Coastguard Worker 42*795d594fSAndroid Build Coastguard Worker // Double tests 43*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndAdd_Double(); 44*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndSet_Double(); 45*795d594fSAndroid Build Coastguard Worker } 46*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndAdd_Int()47*795d594fSAndroid Build Coastguard Worker private static void $noinline$testGetAndAdd_Int() { 48*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 49*795d594fSAndroid Build Coastguard Worker // 0 + 100 = 100 50*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0, (int) INT_VALUE.get(m)); 51*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndAdd_Int(100); 52*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(100, (int) INT_VALUE.get(m)); 53*795d594fSAndroid Build Coastguard Worker 54*795d594fSAndroid Build Coastguard Worker // 100 - 100 = 0 55*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndAdd_Int(-100); 56*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0, (int) INT_VALUE.get(m)); 57*795d594fSAndroid Build Coastguard Worker } 58*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndSet_Int()59*795d594fSAndroid Build Coastguard Worker private static void $noinline$testGetAndSet_Int() { 60*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 61*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0, (int) INT_VALUE.get(m)); 62*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Int(100); 63*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(100, (int) INT_VALUE.get(m)); 64*795d594fSAndroid Build Coastguard Worker 65*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Int(-100); 66*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(-100, (int) INT_VALUE.get(m)); 67*795d594fSAndroid Build Coastguard Worker 68*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Int(0); 69*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0, (int) INT_VALUE.get(m)); 70*795d594fSAndroid Build Coastguard Worker } 71*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndBitwiseAnd_Int()72*795d594fSAndroid Build Coastguard Worker private static void $noinline$testGetAndBitwiseAnd_Int() { 73*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 74*795d594fSAndroid Build Coastguard Worker // 0 AND X = 0 75*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0, (int) INT_VALUE.get(m)); 76*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseAnd_Int(100); 77*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0, (int) INT_VALUE.get(m)); 78*795d594fSAndroid Build Coastguard Worker 79*795d594fSAndroid Build Coastguard Worker // 10101010 AND 80*795d594fSAndroid Build Coastguard Worker // 11001100 = 81*795d594fSAndroid Build Coastguard Worker // 10001000 82*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Int(0b10101010); 83*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseAnd_Int(0b11001100); 84*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0b10001000, (int) INT_VALUE.get(m)); 85*795d594fSAndroid Build Coastguard Worker 86*795d594fSAndroid Build Coastguard Worker // 10001000 AND 87*795d594fSAndroid Build Coastguard Worker // 11111111 = 88*795d594fSAndroid Build Coastguard Worker // 10001000 89*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseAnd_Int(0b11111111); 90*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0b10001000, (int) INT_VALUE.get(m)); 91*795d594fSAndroid Build Coastguard Worker 92*795d594fSAndroid Build Coastguard Worker // 10001000 AND 93*795d594fSAndroid Build Coastguard Worker // 01110111 = 94*795d594fSAndroid Build Coastguard Worker // 0 95*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseAnd_Int(0b01110111); 96*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0, (int) INT_VALUE.get(m)); 97*795d594fSAndroid Build Coastguard Worker } 98*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndBitwiseOr_Int()99*795d594fSAndroid Build Coastguard Worker private static void $noinline$testGetAndBitwiseOr_Int() { 100*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 101*795d594fSAndroid Build Coastguard Worker 102*795d594fSAndroid Build Coastguard Worker // 0 OR X = X 103*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0, (int) INT_VALUE.get(m)); 104*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseOr_Int(0b10101010); 105*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0b10101010, (int) INT_VALUE.get(m)); 106*795d594fSAndroid Build Coastguard Worker 107*795d594fSAndroid Build Coastguard Worker // 10101010 OR 108*795d594fSAndroid Build Coastguard Worker // 01010101 = 109*795d594fSAndroid Build Coastguard Worker // 11111111 110*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseOr_Int(0b01010101); 111*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0b11111111, (int) INT_VALUE.get(m)); 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker // 11111111 OR 114*795d594fSAndroid Build Coastguard Worker // 0 = 115*795d594fSAndroid Build Coastguard Worker // 11111111 116*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseOr_Int(0); 117*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0b11111111, (int) INT_VALUE.get(m)); 118*795d594fSAndroid Build Coastguard Worker 119*795d594fSAndroid Build Coastguard Worker // Set to 0 due to precondition. See comment in main. 120*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Int(0); 121*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0, (int) INT_VALUE.get(m)); 122*795d594fSAndroid Build Coastguard Worker } 123*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndBitwiseXor_Int()124*795d594fSAndroid Build Coastguard Worker private static void $noinline$testGetAndBitwiseXor_Int() { 125*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 126*795d594fSAndroid Build Coastguard Worker 127*795d594fSAndroid Build Coastguard Worker // 0 XOR X = X 128*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0, (int) INT_VALUE.get(m)); 129*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseXor_Int(0b10101010); 130*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0b10101010, (int) INT_VALUE.get(m)); 131*795d594fSAndroid Build Coastguard Worker 132*795d594fSAndroid Build Coastguard Worker // 10101010 XOR 133*795d594fSAndroid Build Coastguard Worker // 01010101 = 134*795d594fSAndroid Build Coastguard Worker // 11111111 135*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseXor_Int(0b01010101); 136*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0b11111111, (int) INT_VALUE.get(m)); 137*795d594fSAndroid Build Coastguard Worker 138*795d594fSAndroid Build Coastguard Worker // 11111111 XOR 139*795d594fSAndroid Build Coastguard Worker // 01010101 = 140*795d594fSAndroid Build Coastguard Worker // 10101010 141*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseXor_Int(0b01010101); 142*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0b10101010, (int) INT_VALUE.get(m)); 143*795d594fSAndroid Build Coastguard Worker 144*795d594fSAndroid Build Coastguard Worker // X XOR X = 0 145*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseXor_Int(0b10101010); 146*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(0, (int) INT_VALUE.get(m)); 147*795d594fSAndroid Build Coastguard Worker } 148*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndAdd_Long()149*795d594fSAndroid Build Coastguard Worker private static void $noinline$testGetAndAdd_Long() { 150*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 151*795d594fSAndroid Build Coastguard Worker // 0 + 100 = 100 152*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0L, (long) LONG_VALUE.get(m)); 153*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndAdd_Long(100); 154*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(100L, (long) LONG_VALUE.get(m)); 155*795d594fSAndroid Build Coastguard Worker 156*795d594fSAndroid Build Coastguard Worker // 100 - 100 = 0 157*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndAdd_Long(-100); 158*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0L, (long) LONG_VALUE.get(m)); 159*795d594fSAndroid Build Coastguard Worker } 160*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndSet_Long()161*795d594fSAndroid Build Coastguard Worker private static void $noinline$testGetAndSet_Long() { 162*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 163*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0L, (long) LONG_VALUE.get(m)); 164*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Long(100); 165*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(100L, (long) LONG_VALUE.get(m)); 166*795d594fSAndroid Build Coastguard Worker 167*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Long(-100); 168*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(-100L, (long) LONG_VALUE.get(m)); 169*795d594fSAndroid Build Coastguard Worker 170*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Long(0); 171*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0L, (long) LONG_VALUE.get(m)); 172*795d594fSAndroid Build Coastguard Worker } 173*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndBitwiseAnd_Long()174*795d594fSAndroid Build Coastguard Worker private static void $noinline$testGetAndBitwiseAnd_Long() { 175*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 176*795d594fSAndroid Build Coastguard Worker // 0 AND X = 0 177*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0L, (long) LONG_VALUE.get(m)); 178*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseAnd_Long(100); 179*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0L, (long) LONG_VALUE.get(m)); 180*795d594fSAndroid Build Coastguard Worker 181*795d594fSAndroid Build Coastguard Worker // 10101010 AND 182*795d594fSAndroid Build Coastguard Worker // 11001100 = 183*795d594fSAndroid Build Coastguard Worker // 10001000 184*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Long(0b10101010); 185*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseAnd_Long(0b11001100); 186*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0b10001000L, (long) LONG_VALUE.get(m)); 187*795d594fSAndroid Build Coastguard Worker 188*795d594fSAndroid Build Coastguard Worker // 10001000 AND 189*795d594fSAndroid Build Coastguard Worker // 11111111 = 190*795d594fSAndroid Build Coastguard Worker // 10001000 191*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseAnd_Long(0b11111111); 192*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0b10001000L, (long) LONG_VALUE.get(m)); 193*795d594fSAndroid Build Coastguard Worker 194*795d594fSAndroid Build Coastguard Worker // 10001000 AND 195*795d594fSAndroid Build Coastguard Worker // 01110111 = 196*795d594fSAndroid Build Coastguard Worker // 0 197*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseAnd_Long(0b01110111); 198*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0L, (long) LONG_VALUE.get(m)); 199*795d594fSAndroid Build Coastguard Worker } 200*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndBitwiseOr_Long()201*795d594fSAndroid Build Coastguard Worker private static void $noinline$testGetAndBitwiseOr_Long() { 202*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 203*795d594fSAndroid Build Coastguard Worker 204*795d594fSAndroid Build Coastguard Worker // 0 OR X = X 205*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0L, (long) LONG_VALUE.get(m)); 206*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseOr_Long(0b10101010); 207*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0b10101010L, (long) LONG_VALUE.get(m)); 208*795d594fSAndroid Build Coastguard Worker 209*795d594fSAndroid Build Coastguard Worker // 10101010 OR 210*795d594fSAndroid Build Coastguard Worker // 01010101 = 211*795d594fSAndroid Build Coastguard Worker // 11111111 212*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseOr_Long(0b01010101); 213*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0b11111111L, (long) LONG_VALUE.get(m)); 214*795d594fSAndroid Build Coastguard Worker 215*795d594fSAndroid Build Coastguard Worker // 11111111 OR 216*795d594fSAndroid Build Coastguard Worker // 0 = 217*795d594fSAndroid Build Coastguard Worker // 11111111 218*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseOr_Long(0); 219*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0b11111111L, (long) LONG_VALUE.get(m)); 220*795d594fSAndroid Build Coastguard Worker 221*795d594fSAndroid Build Coastguard Worker // Set to 0 due to precondition. See comment in main. 222*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Long(0); 223*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0L, (long) LONG_VALUE.get(m)); 224*795d594fSAndroid Build Coastguard Worker } 225*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndBitwiseXor_Long()226*795d594fSAndroid Build Coastguard Worker private static void $noinline$testGetAndBitwiseXor_Long() { 227*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 228*795d594fSAndroid Build Coastguard Worker 229*795d594fSAndroid Build Coastguard Worker // 0 XOR X = X 230*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0L, (long) LONG_VALUE.get(m)); 231*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseXor_Long(0b10101010); 232*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0b10101010L, (long) LONG_VALUE.get(m)); 233*795d594fSAndroid Build Coastguard Worker 234*795d594fSAndroid Build Coastguard Worker // 10101010 XOR 235*795d594fSAndroid Build Coastguard Worker // 01010101 = 236*795d594fSAndroid Build Coastguard Worker // 11111111 237*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseXor_Long(0b01010101); 238*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0b11111111L, (long) LONG_VALUE.get(m)); 239*795d594fSAndroid Build Coastguard Worker 240*795d594fSAndroid Build Coastguard Worker // 11111111 XOR 241*795d594fSAndroid Build Coastguard Worker // 01010101 = 242*795d594fSAndroid Build Coastguard Worker // 10101010 243*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseXor_Long(0b01010101); 244*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0b10101010L, (long) LONG_VALUE.get(m)); 245*795d594fSAndroid Build Coastguard Worker 246*795d594fSAndroid Build Coastguard Worker // X XOR X = 0 247*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndBitwiseXor_Long(0b10101010); 248*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(0L, (long) LONG_VALUE.get(m)); 249*795d594fSAndroid Build Coastguard Worker } 250*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndAdd_Float()251*795d594fSAndroid Build Coastguard Worker private static void $noinline$testGetAndAdd_Float() { 252*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 253*795d594fSAndroid Build Coastguard Worker // 0 + 100 = 100 254*795d594fSAndroid Build Coastguard Worker $noinline$assertFloatEquals(0.0f, (float) FLOAT_VALUE.get(m)); 255*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndAdd_Float(100.0f); 256*795d594fSAndroid Build Coastguard Worker $noinline$assertFloatEquals(100.0f, (float) FLOAT_VALUE.get(m)); 257*795d594fSAndroid Build Coastguard Worker 258*795d594fSAndroid Build Coastguard Worker // 100 - 100 = 0 259*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndAdd_Float(-100.0f); 260*795d594fSAndroid Build Coastguard Worker $noinline$assertFloatEquals(0.0f, (float) FLOAT_VALUE.get(m)); 261*795d594fSAndroid Build Coastguard Worker } 262*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndSet_Float()263*795d594fSAndroid Build Coastguard Worker private static void $noinline$testGetAndSet_Float() { 264*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 265*795d594fSAndroid Build Coastguard Worker $noinline$assertFloatEquals(0.0f, (float) FLOAT_VALUE.get(m)); 266*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Float(100.0f); 267*795d594fSAndroid Build Coastguard Worker $noinline$assertFloatEquals(100.0f, (float) FLOAT_VALUE.get(m)); 268*795d594fSAndroid Build Coastguard Worker 269*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Float(-100.0f); 270*795d594fSAndroid Build Coastguard Worker $noinline$assertFloatEquals(-100.0f, (float) FLOAT_VALUE.get(m)); 271*795d594fSAndroid Build Coastguard Worker 272*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Float(0.0f); 273*795d594fSAndroid Build Coastguard Worker $noinline$assertFloatEquals(0.0f, (float) FLOAT_VALUE.get(m)); 274*795d594fSAndroid Build Coastguard Worker } 275*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndAdd_Double()276*795d594fSAndroid Build Coastguard Worker private static void $noinline$testGetAndAdd_Double() { 277*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 278*795d594fSAndroid Build Coastguard Worker // 0 + 100 = 100 279*795d594fSAndroid Build Coastguard Worker $noinline$assertDoubleEquals(0.0d, (double) DOUBLE_VALUE.get(m)); 280*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndAdd_Double(100.0d); 281*795d594fSAndroid Build Coastguard Worker $noinline$assertDoubleEquals(100.0d, (double) DOUBLE_VALUE.get(m)); 282*795d594fSAndroid Build Coastguard Worker 283*795d594fSAndroid Build Coastguard Worker // 100 - 100 = 0 284*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndAdd_Double(-100.0d); 285*795d594fSAndroid Build Coastguard Worker $noinline$assertDoubleEquals(0.0d, (double) DOUBLE_VALUE.get(m)); 286*795d594fSAndroid Build Coastguard Worker } 287*795d594fSAndroid Build Coastguard Worker $noinline$testGetAndSet_Double()288*795d594fSAndroid Build Coastguard Worker private static void $noinline$testGetAndSet_Double() { 289*795d594fSAndroid Build Coastguard Worker Main m = new Main(); 290*795d594fSAndroid Build Coastguard Worker $noinline$assertDoubleEquals(0.0d, (double) DOUBLE_VALUE.get(m)); 291*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Double(100.0d); 292*795d594fSAndroid Build Coastguard Worker $noinline$assertDoubleEquals(100.0d, (double) DOUBLE_VALUE.get(m)); 293*795d594fSAndroid Build Coastguard Worker 294*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Double(-100.0d); 295*795d594fSAndroid Build Coastguard Worker $noinline$assertDoubleEquals(-100.0d, (double) DOUBLE_VALUE.get(m)); 296*795d594fSAndroid Build Coastguard Worker 297*795d594fSAndroid Build Coastguard Worker m.$noinline$getAndSet_Double(0.0d); 298*795d594fSAndroid Build Coastguard Worker $noinline$assertDoubleEquals(0.0d, (double) DOUBLE_VALUE.get(m)); 299*795d594fSAndroid Build Coastguard Worker } 300*795d594fSAndroid Build Coastguard Worker 301*795d594fSAndroid Build Coastguard Worker // VarHandles 302*795d594fSAndroid Build Coastguard Worker private volatile int int_value = 0; 303*795d594fSAndroid Build Coastguard Worker private static final VarHandle INT_VALUE; 304*795d594fSAndroid Build Coastguard Worker static { 305*795d594fSAndroid Build Coastguard Worker try { 306*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup l = MethodHandles.lookup(); 307*795d594fSAndroid Build Coastguard Worker INT_VALUE = l.findVarHandle(Main.class, "int_value", int.class); 308*795d594fSAndroid Build Coastguard Worker } catch (ReflectiveOperationException e) { 309*795d594fSAndroid Build Coastguard Worker throw new ExceptionInInitializerError(e); 310*795d594fSAndroid Build Coastguard Worker } 311*795d594fSAndroid Build Coastguard Worker } 312*795d594fSAndroid Build Coastguard Worker 313*795d594fSAndroid Build Coastguard Worker private volatile long long_value = 0L; 314*795d594fSAndroid Build Coastguard Worker private static final VarHandle LONG_VALUE; 315*795d594fSAndroid Build Coastguard Worker static { 316*795d594fSAndroid Build Coastguard Worker try { 317*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup l = MethodHandles.lookup(); 318*795d594fSAndroid Build Coastguard Worker LONG_VALUE = l.findVarHandle(Main.class, "long_value", long.class); 319*795d594fSAndroid Build Coastguard Worker } catch (ReflectiveOperationException e) { 320*795d594fSAndroid Build Coastguard Worker throw new ExceptionInInitializerError(e); 321*795d594fSAndroid Build Coastguard Worker } 322*795d594fSAndroid Build Coastguard Worker } 323*795d594fSAndroid Build Coastguard Worker 324*795d594fSAndroid Build Coastguard Worker private volatile float float_value = 0.0f; 325*795d594fSAndroid Build Coastguard Worker private static final VarHandle FLOAT_VALUE; 326*795d594fSAndroid Build Coastguard Worker static { 327*795d594fSAndroid Build Coastguard Worker try { 328*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup l = MethodHandles.lookup(); 329*795d594fSAndroid Build Coastguard Worker FLOAT_VALUE = l.findVarHandle(Main.class, "float_value", float.class); 330*795d594fSAndroid Build Coastguard Worker } catch (ReflectiveOperationException e) { 331*795d594fSAndroid Build Coastguard Worker throw new ExceptionInInitializerError(e); 332*795d594fSAndroid Build Coastguard Worker } 333*795d594fSAndroid Build Coastguard Worker } 334*795d594fSAndroid Build Coastguard Worker 335*795d594fSAndroid Build Coastguard Worker private volatile double double_value = 0.0d; 336*795d594fSAndroid Build Coastguard Worker private static final VarHandle DOUBLE_VALUE; 337*795d594fSAndroid Build Coastguard Worker static { 338*795d594fSAndroid Build Coastguard Worker try { 339*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup l = MethodHandles.lookup(); 340*795d594fSAndroid Build Coastguard Worker DOUBLE_VALUE = l.findVarHandle(Main.class, "double_value", double.class); 341*795d594fSAndroid Build Coastguard Worker } catch (ReflectiveOperationException e) { 342*795d594fSAndroid Build Coastguard Worker throw new ExceptionInInitializerError(e); 343*795d594fSAndroid Build Coastguard Worker } 344*795d594fSAndroid Build Coastguard Worker } 345*795d594fSAndroid Build Coastguard Worker 346*795d594fSAndroid Build Coastguard Worker // Check that we successfully intrinsify intrinsics (e.g. getAndAdd) by checking that there's no 347*795d594fSAndroid Build Coastguard Worker // call to the runtime. 348*795d594fSAndroid Build Coastguard Worker 349*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{X86,X86_64}: void Main.$noinline$getAndAdd_Int(int) disassembly (after) 350*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 351*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: call 352*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 353*795d594fSAndroid Build Coastguard Worker 354*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndAdd_Int(int) disassembly (after) 355*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 356*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blx 357*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 358*795d594fSAndroid Build Coastguard Worker 359*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndAdd_Int(int) disassembly (after) 360*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 361*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blr 362*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 363*795d594fSAndroid Build Coastguard Worker 364*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: void Main.$noinline$getAndAdd_Int(int) disassembly (after) 365*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 366*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: jalr 367*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid $noinline$getAndAdd_Int(int value)368*795d594fSAndroid Build Coastguard Worker private void $noinline$getAndAdd_Int(int value) { 369*795d594fSAndroid Build Coastguard Worker INT_VALUE.getAndAdd(this, value); 370*795d594fSAndroid Build Coastguard Worker } 371*795d594fSAndroid Build Coastguard Worker 372*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{X86,X86_64}: void Main.$noinline$getAndSet_Int(int) disassembly (after) 373*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 374*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: call 375*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 376*795d594fSAndroid Build Coastguard Worker 377*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndSet_Int(int) disassembly (after) 378*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 379*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blx 380*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 381*795d594fSAndroid Build Coastguard Worker 382*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndSet_Int(int) disassembly (after) 383*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 384*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blr 385*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 386*795d594fSAndroid Build Coastguard Worker 387*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: void Main.$noinline$getAndSet_Int(int) disassembly (after) 388*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 389*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: jalr 390*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid $noinline$getAndSet_Int(int value)391*795d594fSAndroid Build Coastguard Worker private void $noinline$getAndSet_Int(int value) { 392*795d594fSAndroid Build Coastguard Worker INT_VALUE.getAndSet(this, value); 393*795d594fSAndroid Build Coastguard Worker } 394*795d594fSAndroid Build Coastguard Worker 395*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{X86,X86_64}: void Main.$noinline$getAndBitwiseAnd_Int(int) disassembly (after) 396*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseAnd 397*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: call 398*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 399*795d594fSAndroid Build Coastguard Worker 400*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndBitwiseAnd_Int(int) disassembly (after) 401*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseAnd 402*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blx 403*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 404*795d594fSAndroid Build Coastguard Worker 405*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndBitwiseAnd_Int(int) disassembly (after) 406*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseAnd 407*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blr 408*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 409*795d594fSAndroid Build Coastguard Worker 410*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: void Main.$noinline$getAndBitwiseAnd_Int(int) disassembly (after) 411*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseAnd 412*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: jalr 413*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid $noinline$getAndBitwiseAnd_Int(int value)414*795d594fSAndroid Build Coastguard Worker private void $noinline$getAndBitwiseAnd_Int(int value) { 415*795d594fSAndroid Build Coastguard Worker INT_VALUE.getAndBitwiseAnd(this, value); 416*795d594fSAndroid Build Coastguard Worker } 417*795d594fSAndroid Build Coastguard Worker 418*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{X86,X86_64}: void Main.$noinline$getAndBitwiseOr_Int(int) disassembly (after) 419*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseOr 420*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: call 421*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 422*795d594fSAndroid Build Coastguard Worker 423*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndBitwiseOr_Int(int) disassembly (after) 424*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseOr 425*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blx 426*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 427*795d594fSAndroid Build Coastguard Worker 428*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndBitwiseOr_Int(int) disassembly (after) 429*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseOr 430*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blr 431*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 432*795d594fSAndroid Build Coastguard Worker 433*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: void Main.$noinline$getAndBitwiseOr_Int(int) disassembly (after) 434*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseOr 435*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: jalr 436*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid $noinline$getAndBitwiseOr_Int(int value)437*795d594fSAndroid Build Coastguard Worker private void $noinline$getAndBitwiseOr_Int(int value) { 438*795d594fSAndroid Build Coastguard Worker INT_VALUE.getAndBitwiseOr(this, value); 439*795d594fSAndroid Build Coastguard Worker } 440*795d594fSAndroid Build Coastguard Worker 441*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{X86,X86_64}: void Main.$noinline$getAndBitwiseXor_Int(int) disassembly (after) 442*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseXor 443*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: call 444*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 445*795d594fSAndroid Build Coastguard Worker 446*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndBitwiseXor_Int(int) disassembly (after) 447*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseXor 448*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blx 449*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 450*795d594fSAndroid Build Coastguard Worker 451*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndBitwiseXor_Int(int) disassembly (after) 452*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseXor 453*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blr 454*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 455*795d594fSAndroid Build Coastguard Worker 456*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: void Main.$noinline$getAndBitwiseXor_Int(int) disassembly (after) 457*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseXor 458*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: jalr 459*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid $noinline$getAndBitwiseXor_Int(int value)460*795d594fSAndroid Build Coastguard Worker private void $noinline$getAndBitwiseXor_Int(int value) { 461*795d594fSAndroid Build Coastguard Worker INT_VALUE.getAndBitwiseXor(this, value); 462*795d594fSAndroid Build Coastguard Worker } 463*795d594fSAndroid Build Coastguard Worker $noinline$assertIntEquals(int expected, int result)464*795d594fSAndroid Build Coastguard Worker private static void $noinline$assertIntEquals(int expected, int result) { 465*795d594fSAndroid Build Coastguard Worker if (expected != result) { 466*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 467*795d594fSAndroid Build Coastguard Worker } 468*795d594fSAndroid Build Coastguard Worker } 469*795d594fSAndroid Build Coastguard Worker 470*795d594fSAndroid Build Coastguard Worker // Note that the Long ones do a call for X86. 471*795d594fSAndroid Build Coastguard Worker // TODO(solanes): Add this support. 472*795d594fSAndroid Build Coastguard Worker 473*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86: void Main.$noinline$getAndAdd_Long(long) disassembly (after) 474*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 475*795d594fSAndroid Build Coastguard Worker /// CHECK: call 476*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 477*795d594fSAndroid Build Coastguard Worker 478*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86_64: void Main.$noinline$getAndAdd_Long(long) disassembly (after) 479*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 480*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: call 481*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 482*795d594fSAndroid Build Coastguard Worker 483*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndAdd_Long(long) disassembly (after) 484*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 485*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blx 486*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 487*795d594fSAndroid Build Coastguard Worker 488*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndAdd_Long(long) disassembly (after) 489*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 490*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blr 491*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 492*795d594fSAndroid Build Coastguard Worker 493*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: void Main.$noinline$getAndAdd_Long(long) disassembly (after) 494*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 495*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: jalr 496*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid $noinline$getAndAdd_Long(long value)497*795d594fSAndroid Build Coastguard Worker private void $noinline$getAndAdd_Long(long value) { 498*795d594fSAndroid Build Coastguard Worker LONG_VALUE.getAndAdd(this, value); 499*795d594fSAndroid Build Coastguard Worker } 500*795d594fSAndroid Build Coastguard Worker 501*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86: void Main.$noinline$getAndSet_Long(long) disassembly (after) 502*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 503*795d594fSAndroid Build Coastguard Worker /// CHECK: call 504*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 505*795d594fSAndroid Build Coastguard Worker 506*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86_64: void Main.$noinline$getAndSet_Long(long) disassembly (after) 507*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 508*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: call 509*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 510*795d594fSAndroid Build Coastguard Worker 511*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndSet_Long(long) disassembly (after) 512*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 513*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blx 514*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 515*795d594fSAndroid Build Coastguard Worker 516*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndSet_Long(long) disassembly (after) 517*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 518*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blr 519*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 520*795d594fSAndroid Build Coastguard Worker 521*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: void Main.$noinline$getAndSet_Long(long) disassembly (after) 522*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 523*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: jalr 524*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid $noinline$getAndSet_Long(long value)525*795d594fSAndroid Build Coastguard Worker private void $noinline$getAndSet_Long(long value) { 526*795d594fSAndroid Build Coastguard Worker LONG_VALUE.getAndSet(this, value); 527*795d594fSAndroid Build Coastguard Worker } 528*795d594fSAndroid Build Coastguard Worker 529*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86: void Main.$noinline$getAndBitwiseAnd_Long(long) disassembly (after) 530*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseAnd 531*795d594fSAndroid Build Coastguard Worker /// CHECK: call 532*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 533*795d594fSAndroid Build Coastguard Worker 534*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86_64: void Main.$noinline$getAndBitwiseAnd_Long(long) disassembly (after) 535*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseAnd 536*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: call 537*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 538*795d594fSAndroid Build Coastguard Worker 539*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndBitwiseAnd_Long(long) disassembly (after) 540*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseAnd 541*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blx 542*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 543*795d594fSAndroid Build Coastguard Worker 544*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndBitwiseAnd_Long(long) disassembly (after) 545*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseAnd 546*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blr 547*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 548*795d594fSAndroid Build Coastguard Worker 549*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: void Main.$noinline$getAndBitwiseAnd_Long(long) disassembly (after) 550*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseAnd 551*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: jalr 552*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid $noinline$getAndBitwiseAnd_Long(long value)553*795d594fSAndroid Build Coastguard Worker private void $noinline$getAndBitwiseAnd_Long(long value) { 554*795d594fSAndroid Build Coastguard Worker LONG_VALUE.getAndBitwiseAnd(this, value); 555*795d594fSAndroid Build Coastguard Worker } 556*795d594fSAndroid Build Coastguard Worker 557*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86: void Main.$noinline$getAndBitwiseOr_Long(long) disassembly (after) 558*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseOr 559*795d594fSAndroid Build Coastguard Worker /// CHECK: call 560*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 561*795d594fSAndroid Build Coastguard Worker 562*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86_64: void Main.$noinline$getAndBitwiseOr_Long(long) disassembly (after) 563*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseOr 564*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: call 565*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 566*795d594fSAndroid Build Coastguard Worker 567*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndBitwiseOr_Long(long) disassembly (after) 568*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseOr 569*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blx 570*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 571*795d594fSAndroid Build Coastguard Worker 572*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndBitwiseOr_Long(long) disassembly (after) 573*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseOr 574*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blr 575*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 576*795d594fSAndroid Build Coastguard Worker 577*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: void Main.$noinline$getAndBitwiseOr_Long(long) disassembly (after) 578*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseOr 579*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: jalr 580*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid $noinline$getAndBitwiseOr_Long(long value)581*795d594fSAndroid Build Coastguard Worker private void $noinline$getAndBitwiseOr_Long(long value) { 582*795d594fSAndroid Build Coastguard Worker LONG_VALUE.getAndBitwiseOr(this, value); 583*795d594fSAndroid Build Coastguard Worker } 584*795d594fSAndroid Build Coastguard Worker 585*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86: void Main.$noinline$getAndBitwiseXor_Long(long) disassembly (after) 586*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseXor 587*795d594fSAndroid Build Coastguard Worker /// CHECK: call 588*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 589*795d594fSAndroid Build Coastguard Worker 590*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86_64: void Main.$noinline$getAndBitwiseXor_Long(long) disassembly (after) 591*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseXor 592*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: call 593*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 594*795d594fSAndroid Build Coastguard Worker 595*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndBitwiseXor_Long(long) disassembly (after) 596*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseXor 597*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blx 598*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 599*795d594fSAndroid Build Coastguard Worker 600*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndBitwiseXor_Long(long) disassembly (after) 601*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseXor 602*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blr 603*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 604*795d594fSAndroid Build Coastguard Worker 605*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: void Main.$noinline$getAndBitwiseXor_Long(long) disassembly (after) 606*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndBitwiseXor 607*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: jalr 608*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid $noinline$getAndBitwiseXor_Long(long value)609*795d594fSAndroid Build Coastguard Worker private void $noinline$getAndBitwiseXor_Long(long value) { 610*795d594fSAndroid Build Coastguard Worker LONG_VALUE.getAndBitwiseXor(this, value); 611*795d594fSAndroid Build Coastguard Worker } 612*795d594fSAndroid Build Coastguard Worker $noinline$assertLongEquals(long expected, long result)613*795d594fSAndroid Build Coastguard Worker private static void $noinline$assertLongEquals(long expected, long result) { 614*795d594fSAndroid Build Coastguard Worker if (expected != result) { 615*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 616*795d594fSAndroid Build Coastguard Worker } 617*795d594fSAndroid Build Coastguard Worker } 618*795d594fSAndroid Build Coastguard Worker 619*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{X86,X86_64}: void Main.$noinline$getAndAdd_Float(float) disassembly (after) 620*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 621*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: call 622*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 623*795d594fSAndroid Build Coastguard Worker 624*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndAdd_Float(float) disassembly (after) 625*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 626*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blx 627*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 628*795d594fSAndroid Build Coastguard Worker 629*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndAdd_Float(float) disassembly (after) 630*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 631*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blr 632*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 633*795d594fSAndroid Build Coastguard Worker 634*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: void Main.$noinline$getAndAdd_Float(float) disassembly (after) 635*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 636*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: jalr 637*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid $noinline$getAndAdd_Float(float value)638*795d594fSAndroid Build Coastguard Worker private void $noinline$getAndAdd_Float(float value) { 639*795d594fSAndroid Build Coastguard Worker FLOAT_VALUE.getAndAdd(this, value); 640*795d594fSAndroid Build Coastguard Worker } 641*795d594fSAndroid Build Coastguard Worker 642*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{X86,X86_64}: void Main.$noinline$getAndSet_Float(float) disassembly (after) 643*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 644*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: call 645*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 646*795d594fSAndroid Build Coastguard Worker 647*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndSet_Float(float) disassembly (after) 648*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 649*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blx 650*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 651*795d594fSAndroid Build Coastguard Worker 652*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndSet_Float(float) disassembly (after) 653*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 654*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blr 655*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 656*795d594fSAndroid Build Coastguard Worker 657*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: void Main.$noinline$getAndSet_Float(float) disassembly (after) 658*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 659*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: jalr 660*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid $noinline$getAndSet_Float(float value)661*795d594fSAndroid Build Coastguard Worker private void $noinline$getAndSet_Float(float value) { 662*795d594fSAndroid Build Coastguard Worker FLOAT_VALUE.getAndSet(this, value); 663*795d594fSAndroid Build Coastguard Worker } 664*795d594fSAndroid Build Coastguard Worker $noinline$assertFloatEquals(float expected, float result)665*795d594fSAndroid Build Coastguard Worker private static void $noinline$assertFloatEquals(float expected, float result) { 666*795d594fSAndroid Build Coastguard Worker if (expected != result) { 667*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 668*795d594fSAndroid Build Coastguard Worker } 669*795d594fSAndroid Build Coastguard Worker } 670*795d594fSAndroid Build Coastguard Worker 671*795d594fSAndroid Build Coastguard Worker // Note that the Double ones do a call for X86. 672*795d594fSAndroid Build Coastguard Worker // TODO(solanes): Add this support. 673*795d594fSAndroid Build Coastguard Worker 674*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86: void Main.$noinline$getAndAdd_Double(double) disassembly (after) 675*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 676*795d594fSAndroid Build Coastguard Worker /// CHECK: call 677*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 678*795d594fSAndroid Build Coastguard Worker 679*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86_64: void Main.$noinline$getAndAdd_Double(double) disassembly (after) 680*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 681*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: call 682*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 683*795d594fSAndroid Build Coastguard Worker 684*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndAdd_Double(double) disassembly (after) 685*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 686*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blx 687*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 688*795d594fSAndroid Build Coastguard Worker 689*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndAdd_Double(double) disassembly (after) 690*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 691*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blr 692*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 693*795d594fSAndroid Build Coastguard Worker 694*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: void Main.$noinline$getAndAdd_Double(double) disassembly (after) 695*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndAdd 696*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: jalr 697*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid $noinline$getAndAdd_Double(double value)698*795d594fSAndroid Build Coastguard Worker private void $noinline$getAndAdd_Double(double value) { 699*795d594fSAndroid Build Coastguard Worker DOUBLE_VALUE.getAndAdd(this, value); 700*795d594fSAndroid Build Coastguard Worker } 701*795d594fSAndroid Build Coastguard Worker 702*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86: void Main.$noinline$getAndSet_Double(double) disassembly (after) 703*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 704*795d594fSAndroid Build Coastguard Worker /// CHECK: call 705*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 706*795d594fSAndroid Build Coastguard Worker 707*795d594fSAndroid Build Coastguard Worker /// CHECK-START-X86_64: void Main.$noinline$getAndSet_Double(double) disassembly (after) 708*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 709*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: call 710*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 711*795d594fSAndroid Build Coastguard Worker 712*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndSet_Double(double) disassembly (after) 713*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 714*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blx 715*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 716*795d594fSAndroid Build Coastguard Worker 717*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.$noinline$getAndSet_Double(double) disassembly (after) 718*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 719*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: blr 720*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid 721*795d594fSAndroid Build Coastguard Worker 722*795d594fSAndroid Build Coastguard Worker /// CHECK-START-RISCV64: void Main.$noinline$getAndSet_Double(double) disassembly (after) 723*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokePolymorphic intrinsic:VarHandleGetAndSet 724*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: jalr 725*795d594fSAndroid Build Coastguard Worker /// CHECK: ReturnVoid $noinline$getAndSet_Double(double value)726*795d594fSAndroid Build Coastguard Worker private void $noinline$getAndSet_Double(double value) { 727*795d594fSAndroid Build Coastguard Worker DOUBLE_VALUE.getAndSet(this, value); 728*795d594fSAndroid Build Coastguard Worker } 729*795d594fSAndroid Build Coastguard Worker $noinline$assertDoubleEquals(double expected, double result)730*795d594fSAndroid Build Coastguard Worker private static void $noinline$assertDoubleEquals(double expected, double result) { 731*795d594fSAndroid Build Coastguard Worker if (expected != result) { 732*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 733*795d594fSAndroid Build Coastguard Worker } 734*795d594fSAndroid Build Coastguard Worker } 735*795d594fSAndroid Build Coastguard Worker } 736