xref: /aosp_15_r20/art/test/859-checker-var-handles-intrinsics/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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