Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/jcl/src/java.base/share/classes/java/lang/invoke/ByteArrayViewVarHandle.java
12520 views
1
/*[INCLUDE-IF Sidecar19-SE & !OPENJDK_METHODHANDLES]*/
2
/*******************************************************************************
3
* Copyright (c) 2016, 2020 IBM Corp. and others
4
*
5
* This program and the accompanying materials are made available under
6
* the terms of the Eclipse Public License 2.0 which accompanies this
7
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
8
* or the Apache License, Version 2.0 which accompanies this distribution and
9
* is available at https://www.apache.org/licenses/LICENSE-2.0.
10
*
11
* This Source Code may also be made available under the following
12
* Secondary Licenses when the conditions for such availability set
13
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
14
* General Public License, version 2 with the GNU Classpath
15
* Exception [1] and GNU General Public License, version 2 with the
16
* OpenJDK Assembly Exception [2].
17
*
18
* [1] https://www.gnu.org/software/classpath/license.html
19
* [2] http://openjdk.java.net/legal/assembly-exception.html
20
*
21
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
22
*******************************************************************************/
23
package java.lang.invoke;
24
25
import static java.lang.invoke.ByteArrayViewVarHandle.ByteArrayViewVarHandleOperations.*;
26
import static java.lang.invoke.MethodType.methodType;
27
28
import java.nio.ByteOrder;
29
import jdk.internal.misc.Unsafe;
30
31
final class ByteArrayViewVarHandle extends ViewVarHandle {
32
private final static Class<?>[] COORDINATE_TYPES = new Class<?>[] {byte[].class, int.class};
33
34
/**
35
* Populates the static MethodHandle[] corresponding to the provided type.
36
*
37
* @param type The type to create MethodHandles for.
38
* @return The populated MethodHandle[].
39
*/
40
static final MethodHandle[] populateMHs(Class<?> type, ByteOrder byteOrder) {
41
Class<? extends ByteArrayViewVarHandleOperations> operationsClass = null;
42
boolean convertEndian = (byteOrder != ByteOrder.nativeOrder());
43
44
if (int.class == type) {
45
operationsClass = convertEndian ? OpIntConvertEndian.class : OpInt.class;
46
} else if (long.class == type) {
47
operationsClass = convertEndian ? OpLongConvertEndian.class : OpLong.class;
48
} else if (char.class == type) {
49
operationsClass = convertEndian ? OpCharConvertEndian.class : OpChar.class;
50
} else if (double.class == type) {
51
operationsClass = convertEndian ? OpDoubleConvertEndian.class : OpDouble.class;
52
} else if (float.class == type) {
53
operationsClass = convertEndian ? OpFloatConvertEndian.class : OpFloat.class;
54
} else if (short.class == type) {
55
operationsClass = convertEndian ? OpShortConvertEndian.class : OpShort.class;
56
} else {
57
/*[MSG "K0624", "{0} is not a supported view type."]*/
58
throw new UnsupportedOperationException(com.ibm.oti.util.Msg.getString("K0624", type)); //$NON-NLS-1$
59
}
60
61
MethodType getter = methodType(type, byte[].class, int.class, VarHandle.class);
62
MethodType setter = methodType(void.class, byte[].class, int.class, type, VarHandle.class);
63
MethodType compareAndSet = methodType(boolean.class, byte[].class, int.class, type, type, VarHandle.class);
64
MethodType compareAndExchange = compareAndSet.changeReturnType(type);
65
MethodType getAndSet = setter.changeReturnType(type);
66
MethodType[] lookupTypes = populateMTs(getter, setter, compareAndSet, compareAndExchange, getAndSet);
67
68
return populateMHs(operationsClass, lookupTypes, lookupTypes);
69
}
70
71
/**
72
* Constructs a VarHandle that can access elements of a byte array as wider types.
73
*
74
* @param viewArrayType The component type used when viewing elements of the array.
75
*/
76
ByteArrayViewVarHandle(Class<?> viewArrayType, ByteOrder byteOrder) {
77
super(viewArrayType, COORDINATE_TYPES, populateMHs(viewArrayType, byteOrder), 0);
78
}
79
80
/**
81
* Type specific methods used by byte array view VarHandle methods.
82
*/
83
@SuppressWarnings("unused")
84
static class ByteArrayViewVarHandleOperations extends ViewVarHandle.ViewVarHandleOperations {
85
private static final int INDEX_OFFSET = Unsafe.ARRAY_BYTE_BASE_OFFSET;
86
87
private static final long computeOffset(int index) {
88
return (long)INDEX_OFFSET + index;
89
}
90
91
static long checkAndComputeOffset(byte[] receiver, int viewTypeSize, int index, boolean allowUnaligned) {
92
long offset = computeOffset(index);
93
94
receiver.getClass();
95
boundsCheck(receiver.length, viewTypeSize, index);
96
alignmentCheck(offset, viewTypeSize, allowUnaligned);
97
98
return offset;
99
}
100
101
static final class OpChar extends ByteArrayViewVarHandleOperations {
102
private static final int BYTES = Character.BYTES;
103
104
private static final char get(byte[] receiver, int index, VarHandle varHandle) {
105
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
106
return _unsafe.getChar(receiver, offset);
107
}
108
109
private static final void set(byte[] receiver, int index, char value, VarHandle varHandle) {
110
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
111
_unsafe.putChar(receiver, offset, value);
112
}
113
114
private static final char getVolatile(byte[] receiver, int index, VarHandle varHandle) {
115
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
116
return _unsafe.getCharVolatile(receiver, offset);
117
}
118
119
private static final void setVolatile(byte[] receiver, int index, char value, VarHandle varHandle) {
120
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
121
_unsafe.putCharVolatile(receiver, offset, value);
122
}
123
124
private static final char getOpaque(byte[] receiver, int index, VarHandle varHandle) {
125
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
126
return _unsafe.getCharOpaque(receiver, offset);
127
}
128
129
private static final void setOpaque(byte[] receiver, int index, char value, VarHandle varHandle) {
130
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
131
_unsafe.putCharOpaque(receiver, offset, value);
132
}
133
134
private static final char getAcquire(byte[] receiver, int index, VarHandle varHandle) {
135
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
136
return _unsafe.getCharAcquire(receiver, offset);
137
}
138
139
private static final void setRelease(byte[] receiver, int index, char value, VarHandle varHandle) {
140
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
141
_unsafe.putCharRelease(receiver, offset, value);
142
}
143
144
private static final boolean compareAndSet(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
145
throw operationNotSupported(varHandle);
146
}
147
148
private static final char compareAndExchange(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
149
throw operationNotSupported(varHandle);
150
}
151
152
private static final char compareAndExchangeAcquire(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
153
throw operationNotSupported(varHandle);
154
}
155
156
private static final char compareAndExchangeRelease(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
157
throw operationNotSupported(varHandle);
158
}
159
160
private static final boolean weakCompareAndSet(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
161
throw operationNotSupported(varHandle);
162
}
163
164
private static final boolean weakCompareAndSetAcquire(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
165
throw operationNotSupported(varHandle);
166
}
167
168
private static final boolean weakCompareAndSetRelease(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
169
throw operationNotSupported(varHandle);
170
}
171
172
private static final boolean weakCompareAndSetPlain(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
173
throw operationNotSupported(varHandle);
174
}
175
176
private static final char getAndSet(byte[] receiver, int index, char value, VarHandle varHandle) {
177
throw operationNotSupported(varHandle);
178
}
179
180
private static final char getAndSetAcquire(byte[] receiver, int index, char value, VarHandle varHandle) {
181
throw operationNotSupported(varHandle);
182
}
183
184
private static final char getAndSetRelease(byte[] receiver, int index, char value, VarHandle varHandle) {
185
throw operationNotSupported(varHandle);
186
}
187
188
private static final char getAndAdd(byte[] receiver, int index, char value, VarHandle varHandle) {
189
throw operationNotSupported(varHandle);
190
}
191
192
private static final char getAndAddAcquire(byte[] receiver, int index, char value, VarHandle varHandle) {
193
throw operationNotSupported(varHandle);
194
}
195
196
private static final char getAndAddRelease(byte[] receiver, int index, char value, VarHandle varHandle) {
197
throw operationNotSupported(varHandle);
198
}
199
200
private static final char getAndBitwiseAnd(byte[] receiver, int index, char value, VarHandle varHandle) {
201
throw operationNotSupported(varHandle);
202
}
203
204
private static final char getAndBitwiseAndAcquire(byte[] receiver, int index, char value, VarHandle varHandle) {
205
throw operationNotSupported(varHandle);
206
}
207
208
private static final char getAndBitwiseAndRelease(byte[] receiver, int index, char value, VarHandle varHandle) {
209
throw operationNotSupported(varHandle);
210
}
211
212
private static final char getAndBitwiseOr(byte[] receiver, int index, char value, VarHandle varHandle) {
213
throw operationNotSupported(varHandle);
214
}
215
216
private static final char getAndBitwiseOrAcquire(byte[] receiver, int index, char value, VarHandle varHandle) {
217
throw operationNotSupported(varHandle);
218
}
219
220
private static final char getAndBitwiseOrRelease(byte[] receiver, int index, char value, VarHandle varHandle) {
221
throw operationNotSupported(varHandle);
222
}
223
224
private static final char getAndBitwiseXor(byte[] receiver, int index, char value, VarHandle varHandle) {
225
throw operationNotSupported(varHandle);
226
}
227
228
private static final char getAndBitwiseXorAcquire(byte[] receiver, int index, char value, VarHandle varHandle) {
229
throw operationNotSupported(varHandle);
230
}
231
232
private static final char getAndBitwiseXorRelease(byte[] receiver, int index, char value, VarHandle varHandle) {
233
throw operationNotSupported(varHandle);
234
}
235
}
236
237
static final class OpDouble extends ByteArrayViewVarHandleOperations {
238
private static final int BYTES = Double.BYTES;
239
240
private static final double get(byte[] receiver, int index, VarHandle varHandle) {
241
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
242
return _unsafe.getDouble(receiver, offset);
243
}
244
245
private static final void set(byte[] receiver, int index, double value, VarHandle varHandle) {
246
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
247
_unsafe.putDouble(receiver, offset, value);
248
}
249
250
private static final double getVolatile(byte[] receiver, int index, VarHandle varHandle) {
251
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
252
return _unsafe.getDoubleVolatile(receiver, offset);
253
}
254
255
private static final void setVolatile(byte[] receiver, int index, double value, VarHandle varHandle) {
256
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
257
_unsafe.putDoubleVolatile(receiver, offset, value);
258
}
259
260
private static final double getOpaque(byte[] receiver, int index, VarHandle varHandle) {
261
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
262
return _unsafe.getDoubleOpaque(receiver, offset);
263
}
264
265
private static final void setOpaque(byte[] receiver, int index, double value, VarHandle varHandle) {
266
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
267
_unsafe.putDoubleOpaque(receiver, offset, value);
268
}
269
270
private static final double getAcquire(byte[] receiver, int index, VarHandle varHandle) {
271
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
272
return _unsafe.getDoubleAcquire(receiver, offset);
273
}
274
275
private static final void setRelease(byte[] receiver, int index, double value, VarHandle varHandle) {
276
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
277
_unsafe.putDoubleRelease(receiver, offset, value);
278
}
279
280
private static final boolean compareAndSet(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
281
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
282
/*[IF Sidecar19-SE-OpenJ9]*/
283
return _unsafe.compareAndSetDouble(receiver, offset, testValue, newValue);
284
/*[ELSE]
285
return _unsafe.compareAndSwapDouble(receiver, offset, testValue, newValue);
286
/*[ENDIF]*/
287
}
288
289
private static final double compareAndExchange(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
290
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
291
/*[IF Sidecar19-SE-OpenJ9]*/
292
return _unsafe.compareAndExchangeDouble(receiver, offset, testValue, newValue);
293
/*[ELSE]
294
return _unsafe.compareAndExchangeDoubleVolatile(receiver, offset, testValue, newValue);
295
/*[ENDIF]*/
296
}
297
298
private static final double compareAndExchangeAcquire(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
299
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
300
return _unsafe.compareAndExchangeDoubleAcquire(receiver, offset, testValue, newValue);
301
}
302
303
private static final double compareAndExchangeRelease(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
304
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
305
return _unsafe.compareAndExchangeDoubleRelease(receiver, offset, testValue, newValue);
306
}
307
308
private static final boolean weakCompareAndSet(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
309
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
310
/*[IF Sidecar19-SE-OpenJ9]*/
311
return _unsafe.weakCompareAndSetDoublePlain(receiver, offset, testValue, newValue);
312
/*[ELSE]
313
return _unsafe.weakCompareAndSwapDouble(receiver, offset, testValue, newValue);
314
/*[ENDIF]*/
315
}
316
317
private static final boolean weakCompareAndSetAcquire(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
318
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
319
/*[IF Sidecar19-SE-OpenJ9]*/
320
return _unsafe.weakCompareAndSetDoubleAcquire(receiver, offset, testValue, newValue);
321
/*[ELSE]
322
return _unsafe.weakCompareAndSwapDoubleAcquire(receiver, offset, testValue, newValue);
323
/*[ENDIF]*/
324
}
325
326
private static final boolean weakCompareAndSetRelease(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
327
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
328
/*[IF Sidecar19-SE-OpenJ9]*/
329
return _unsafe.weakCompareAndSetDoubleRelease(receiver, offset, testValue, newValue);
330
/*[ELSE]
331
return _unsafe.weakCompareAndSwapDoubleRelease(receiver, offset, testValue, newValue);
332
/*[ENDIF]*/
333
}
334
335
private static final boolean weakCompareAndSetPlain(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
336
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
337
/*[IF Sidecar19-SE-OpenJ9]*/
338
return _unsafe.weakCompareAndSetDoublePlain(receiver, offset, testValue, newValue);
339
/*[ELSE]
340
return _unsafe.weakCompareAndSwapDouble(receiver, offset, testValue, newValue);
341
/*[ENDIF]*/
342
}
343
344
private static final double getAndSet(byte[] receiver, int index, double value, VarHandle varHandle) {
345
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
346
return _unsafe.getAndSetDouble(receiver, offset, value);
347
}
348
349
private static final double getAndSetAcquire(byte[] receiver, int index, double value, VarHandle varHandle) {
350
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
351
return _unsafe.getAndSetDoubleAcquire(receiver, offset, value);
352
}
353
354
private static final double getAndSetRelease(byte[] receiver, int index, double value, VarHandle varHandle) {
355
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
356
return _unsafe.getAndSetDoubleRelease(receiver, offset, value);
357
}
358
359
private static final double getAndAdd(byte[] receiver, int index, double value, VarHandle varHandle) {
360
throw operationNotSupported(varHandle);
361
}
362
363
private static final double getAndAddAcquire(byte[] receiver, int index, double value, VarHandle varHandle) {
364
throw operationNotSupported(varHandle);
365
}
366
367
private static final double getAndAddRelease(byte[] receiver, int index, double value, VarHandle varHandle) {
368
throw operationNotSupported(varHandle);
369
}
370
371
private static final double getAndBitwiseAnd(byte[] receiver, int index, double value, VarHandle varHandle) {
372
throw operationNotSupported(varHandle);
373
}
374
375
private static final double getAndBitwiseAndAcquire(byte[] receiver, int index, double value, VarHandle varHandle) {
376
throw operationNotSupported(varHandle);
377
}
378
379
private static final double getAndBitwiseAndRelease(byte[] receiver, int index, double value, VarHandle varHandle) {
380
throw operationNotSupported(varHandle);
381
}
382
383
private static final double getAndBitwiseOr(byte[] receiver, int index, double value, VarHandle varHandle) {
384
throw operationNotSupported(varHandle);
385
}
386
387
private static final double getAndBitwiseOrAcquire(byte[] receiver, int index, double value, VarHandle varHandle) {
388
throw operationNotSupported(varHandle);
389
}
390
391
private static final double getAndBitwiseOrRelease(byte[] receiver, int index, double value, VarHandle varHandle) {
392
throw operationNotSupported(varHandle);
393
}
394
395
private static final double getAndBitwiseXor(byte[] receiver, int index, double value, VarHandle varHandle) {
396
throw operationNotSupported(varHandle);
397
}
398
399
private static final double getAndBitwiseXorAcquire(byte[] receiver, int index, double value, VarHandle varHandle) {
400
throw operationNotSupported(varHandle);
401
}
402
403
private static final double getAndBitwiseXorRelease(byte[] receiver, int index, double value, VarHandle varHandle) {
404
throw operationNotSupported(varHandle);
405
}
406
}
407
408
static final class OpFloat extends ByteArrayViewVarHandleOperations {
409
private static final int BYTES = Float.BYTES;
410
411
private static final float get(byte[] receiver, int index, VarHandle varHandle) {
412
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
413
return _unsafe.getFloat(receiver, offset);
414
}
415
416
private static final void set(byte[] receiver, int index, float value, VarHandle varHandle) {
417
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
418
_unsafe.putFloat(receiver, offset, value);
419
}
420
421
private static final float getVolatile(byte[] receiver, int index, VarHandle varHandle) {
422
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
423
return _unsafe.getFloatVolatile(receiver, offset);
424
}
425
426
private static final void setVolatile(byte[] receiver, int index, float value, VarHandle varHandle) {
427
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
428
_unsafe.putFloatVolatile(receiver, offset, value);
429
}
430
431
private static final float getOpaque(byte[] receiver, int index, VarHandle varHandle) {
432
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
433
return _unsafe.getFloatOpaque(receiver, offset);
434
}
435
436
private static final void setOpaque(byte[] receiver, int index, float value, VarHandle varHandle) {
437
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
438
_unsafe.putFloatOpaque(receiver, offset, value);
439
}
440
441
private static final float getAcquire(byte[] receiver, int index, VarHandle varHandle) {
442
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
443
return _unsafe.getFloatAcquire(receiver, offset);
444
}
445
446
private static final void setRelease(byte[] receiver, int index, float value, VarHandle varHandle) {
447
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
448
_unsafe.putFloatRelease(receiver, offset, value);
449
}
450
451
private static final boolean compareAndSet(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
452
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
453
/*[IF Sidecar19-SE-OpenJ9]*/
454
return _unsafe.compareAndSetFloat(receiver, offset, testValue, newValue);
455
/*[ELSE]
456
return _unsafe.compareAndSwapFloat(receiver, offset, testValue, newValue);
457
/*[ENDIF]*/
458
}
459
460
private static final float compareAndExchange(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
461
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
462
/*[IF Sidecar19-SE-OpenJ9]*/
463
return _unsafe.compareAndExchangeFloat(receiver, offset, testValue, newValue);
464
/*[ELSE]
465
return _unsafe.compareAndExchangeFloatVolatile(receiver, offset, testValue, newValue);
466
/*[ENDIF]*/
467
}
468
469
private static final float compareAndExchangeAcquire(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
470
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
471
return _unsafe.compareAndExchangeFloatAcquire(receiver, offset, testValue, newValue);
472
}
473
474
private static final float compareAndExchangeRelease(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
475
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
476
return _unsafe.compareAndExchangeFloatRelease(receiver, offset, testValue, newValue);
477
}
478
479
private static final boolean weakCompareAndSet(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
480
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
481
/*[IF Sidecar19-SE-OpenJ9]*/
482
return _unsafe.weakCompareAndSetFloatPlain(receiver, offset, testValue, newValue);
483
/*[ELSE]
484
return _unsafe.weakCompareAndSwapFloat(receiver, offset, testValue, newValue);
485
/*[ENDIF]*/
486
}
487
488
private static final boolean weakCompareAndSetAcquire(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
489
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
490
/*[IF Sidecar19-SE-OpenJ9]*/
491
return _unsafe.weakCompareAndSetFloatAcquire(receiver, offset, testValue, newValue);
492
/*[ELSE]
493
return _unsafe.weakCompareAndSwapFloatAcquire(receiver, offset, testValue, newValue);
494
/*[ENDIF]*/
495
}
496
497
private static final boolean weakCompareAndSetRelease(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
498
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
499
/*[IF Sidecar19-SE-OpenJ9]*/
500
return _unsafe.weakCompareAndSetFloatRelease(receiver, offset, testValue, newValue);
501
/*[ELSE]
502
return _unsafe.weakCompareAndSwapFloatRelease(receiver, offset, testValue, newValue);
503
/*[ENDIF]*/
504
}
505
506
private static final boolean weakCompareAndSetPlain(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
507
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
508
/*[IF Sidecar19-SE-OpenJ9]*/
509
return _unsafe.weakCompareAndSetFloatPlain(receiver, offset, testValue, newValue);
510
/*[ELSE]
511
return _unsafe.weakCompareAndSwapFloat(receiver, offset, testValue, newValue);
512
/*[ENDIF]*/
513
}
514
515
private static final float getAndSet(byte[] receiver, int index, float value, VarHandle varHandle) {
516
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
517
return _unsafe.getAndSetFloat(receiver, offset, value);
518
}
519
520
private static final float getAndSetAcquire(byte[] receiver, int index, float value, VarHandle varHandle) {
521
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
522
return _unsafe.getAndSetFloatAcquire(receiver, offset, value);
523
}
524
525
private static final float getAndSetRelease(byte[] receiver, int index, float value, VarHandle varHandle) {
526
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
527
return _unsafe.getAndSetFloatRelease(receiver, offset, value);
528
}
529
530
private static final float getAndAdd(byte[] receiver, int index, float value, VarHandle varHandle) {
531
throw operationNotSupported(varHandle);
532
}
533
534
private static final float getAndAddAcquire(byte[] receiver, int index, float value, VarHandle varHandle) {
535
throw operationNotSupported(varHandle);
536
}
537
538
private static final float getAndAddRelease(byte[] receiver, int index, float value, VarHandle varHandle) {
539
throw operationNotSupported(varHandle);
540
}
541
542
private static final float getAndBitwiseAnd(byte[] receiver, int index, float value, VarHandle varHandle) {
543
throw operationNotSupported(varHandle);
544
}
545
546
private static final float getAndBitwiseAndAcquire(byte[] receiver, int index, float value, VarHandle varHandle) {
547
throw operationNotSupported(varHandle);
548
}
549
550
private static final float getAndBitwiseAndRelease(byte[] receiver, int index, float value, VarHandle varHandle) {
551
throw operationNotSupported(varHandle);
552
}
553
554
private static final float getAndBitwiseOr(byte[] receiver, int index, float value, VarHandle varHandle) {
555
throw operationNotSupported(varHandle);
556
}
557
558
private static final float getAndBitwiseOrAcquire(byte[] receiver, int index, float value, VarHandle varHandle) {
559
throw operationNotSupported(varHandle);
560
}
561
562
private static final float getAndBitwiseOrRelease(byte[] receiver, int index, float value, VarHandle varHandle) {
563
throw operationNotSupported(varHandle);
564
}
565
566
private static final float getAndBitwiseXor(byte[] receiver, int index, float value, VarHandle varHandle) {
567
throw operationNotSupported(varHandle);
568
}
569
570
private static final float getAndBitwiseXorAcquire(byte[] receiver, int index, float value, VarHandle varHandle) {
571
throw operationNotSupported(varHandle);
572
}
573
574
private static final float getAndBitwiseXorRelease(byte[] receiver, int index, float value, VarHandle varHandle) {
575
throw operationNotSupported(varHandle);
576
}
577
}
578
579
static final class OpInt extends ByteArrayViewVarHandleOperations {
580
private static final int BYTES = Integer.BYTES;
581
582
private static final int get(byte[] receiver, int index, VarHandle varHandle) {
583
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
584
return _unsafe.getInt(receiver, offset);
585
}
586
587
private static final void set(byte[] receiver, int index, int value, VarHandle varHandle) {
588
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
589
_unsafe.putInt(receiver, offset, value);
590
}
591
592
private static final int getVolatile(byte[] receiver, int index, VarHandle varHandle) {
593
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
594
return _unsafe.getIntVolatile(receiver, offset);
595
}
596
597
private static final void setVolatile(byte[] receiver, int index, int value, VarHandle varHandle) {
598
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
599
_unsafe.putIntVolatile(receiver, offset, value);
600
}
601
602
private static final int getOpaque(byte[] receiver, int index, VarHandle varHandle) {
603
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
604
return _unsafe.getIntOpaque(receiver, offset);
605
}
606
607
private static final void setOpaque(byte[] receiver, int index, int value, VarHandle varHandle) {
608
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
609
_unsafe.putIntOpaque(receiver, offset, value);
610
}
611
612
private static final int getAcquire(byte[] receiver, int index, VarHandle varHandle) {
613
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
614
return _unsafe.getIntAcquire(receiver, offset);
615
}
616
617
private static final void setRelease(byte[] receiver, int index, int value, VarHandle varHandle) {
618
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
619
_unsafe.putIntRelease(receiver, offset, value);
620
}
621
622
private static final boolean compareAndSet(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
623
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
624
/*[IF Sidecar19-SE-OpenJ9]*/
625
return _unsafe.compareAndSetInt(receiver, offset, testValue, newValue);
626
/*[ELSE]
627
return _unsafe.compareAndSwapInt(receiver, offset, testValue, newValue);
628
/*[ENDIF]*/
629
}
630
631
private static final int compareAndExchange(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
632
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
633
/*[IF Sidecar19-SE-OpenJ9]*/
634
return _unsafe.compareAndExchangeInt(receiver, offset, testValue, newValue);
635
/*[ELSE]
636
return _unsafe.compareAndExchangeIntVolatile(receiver, offset, testValue, newValue);
637
/*[ENDIF]*/
638
}
639
640
private static final int compareAndExchangeAcquire(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
641
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
642
return _unsafe.compareAndExchangeIntAcquire(receiver, offset, testValue, newValue);
643
}
644
645
private static final int compareAndExchangeRelease(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
646
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
647
return _unsafe.compareAndExchangeIntRelease(receiver, offset, testValue, newValue);
648
}
649
650
private static final boolean weakCompareAndSet(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
651
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
652
/*[IF Sidecar19-SE-OpenJ9]*/
653
return _unsafe.weakCompareAndSetIntPlain(receiver, offset, testValue, newValue);
654
/*[ELSE]
655
return _unsafe.weakCompareAndSwapInt(receiver, offset, testValue, newValue);
656
/*[ENDIF]*/
657
}
658
659
private static final boolean weakCompareAndSetAcquire(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
660
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
661
/*[IF Sidecar19-SE-OpenJ9]*/
662
return _unsafe.weakCompareAndSetIntAcquire(receiver, offset, testValue, newValue);
663
/*[ELSE]
664
return _unsafe.weakCompareAndSwapIntAcquire(receiver, offset, testValue, newValue);
665
/*[ENDIF]*/
666
}
667
668
private static final boolean weakCompareAndSetRelease(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
669
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
670
/*[IF Sidecar19-SE-OpenJ9]*/
671
return _unsafe.weakCompareAndSetIntRelease(receiver, offset, testValue, newValue);
672
/*[ELSE]
673
return _unsafe.weakCompareAndSwapIntRelease(receiver, offset, testValue, newValue);
674
/*[ENDIF]*/
675
}
676
677
private static final boolean weakCompareAndSetPlain(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
678
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
679
/*[IF Sidecar19-SE-OpenJ9]*/
680
return _unsafe.weakCompareAndSetIntPlain(receiver, offset, testValue, newValue);
681
/*[ELSE]
682
return _unsafe.weakCompareAndSwapInt(receiver, offset, testValue, newValue);
683
/*[ENDIF]*/
684
}
685
686
private static final int getAndSet(byte[] receiver, int index, int value, VarHandle varHandle) {
687
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
688
return _unsafe.getAndSetInt(receiver, offset, value);
689
}
690
691
private static final int getAndSetAcquire(byte[] receiver, int index, int value, VarHandle varHandle) {
692
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
693
return _unsafe.getAndSetIntAcquire(receiver, offset, value);
694
}
695
696
private static final int getAndSetRelease(byte[] receiver, int index, int value, VarHandle varHandle) {
697
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
698
return _unsafe.getAndSetIntRelease(receiver, offset, value);
699
}
700
701
private static final int getAndAdd(byte[] receiver, int index, int value, VarHandle varHandle) {
702
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
703
return _unsafe.getAndAddInt(receiver, offset, value);
704
}
705
706
private static final int getAndAddAcquire(byte[] receiver, int index, int value, VarHandle varHandle) {
707
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
708
return _unsafe.getAndAddIntAcquire(receiver, offset, value);
709
}
710
711
private static final int getAndAddRelease(byte[] receiver, int index, int value, VarHandle varHandle) {
712
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
713
return _unsafe.getAndAddIntRelease(receiver, offset, value);
714
}
715
716
private static final int getAndBitwiseAnd(byte[] receiver, int index, int value, VarHandle varHandle) {
717
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
718
return _unsafe.getAndBitwiseAndInt(receiver, offset, value);
719
}
720
721
private static final int getAndBitwiseAndAcquire(byte[] receiver, int index, int value, VarHandle varHandle) {
722
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
723
return _unsafe.getAndBitwiseAndIntAcquire(receiver, offset, value);
724
}
725
726
private static final int getAndBitwiseAndRelease(byte[] receiver, int index, int value, VarHandle varHandle) {
727
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
728
return _unsafe.getAndBitwiseAndIntRelease(receiver, offset, value);
729
}
730
731
private static final int getAndBitwiseOr(byte[] receiver, int index, int value, VarHandle varHandle) {
732
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
733
return _unsafe.getAndBitwiseOrInt(receiver, offset, value);
734
}
735
736
private static final int getAndBitwiseOrAcquire(byte[] receiver, int index, int value, VarHandle varHandle) {
737
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
738
return _unsafe.getAndBitwiseOrIntAcquire(receiver, offset, value);
739
}
740
741
private static final int getAndBitwiseOrRelease(byte[] receiver, int index, int value, VarHandle varHandle) {
742
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
743
return _unsafe.getAndBitwiseOrIntRelease(receiver, offset, value);
744
}
745
746
private static final int getAndBitwiseXor(byte[] receiver, int index, int value, VarHandle varHandle) {
747
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
748
return _unsafe.getAndBitwiseXorInt(receiver, offset, value);
749
}
750
751
private static final int getAndBitwiseXorAcquire(byte[] receiver, int index, int value, VarHandle varHandle) {
752
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
753
return _unsafe.getAndBitwiseXorIntAcquire(receiver, offset, value);
754
}
755
756
private static final int getAndBitwiseXorRelease(byte[] receiver, int index, int value, VarHandle varHandle) {
757
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
758
return _unsafe.getAndBitwiseXorIntRelease(receiver, offset, value);
759
}
760
}
761
762
static final class OpLong extends ByteArrayViewVarHandleOperations {
763
private static final int BYTES = Long.BYTES;
764
765
private static final long get(byte[] receiver, int index, VarHandle varHandle) {
766
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
767
return _unsafe.getLong(receiver, offset);
768
}
769
770
private static final void set(byte[] receiver, int index, long value, VarHandle varHandle) {
771
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
772
_unsafe.putLong(receiver, offset, value);
773
}
774
775
private static final long getVolatile(byte[] receiver, int index, VarHandle varHandle) {
776
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
777
return _unsafe.getLongVolatile(receiver, offset);
778
}
779
780
private static final void setVolatile(byte[] receiver, int index, long value, VarHandle varHandle) {
781
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
782
_unsafe.putLongVolatile(receiver, offset, value);
783
}
784
785
private static final long getOpaque(byte[] receiver, int index, VarHandle varHandle) {
786
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
787
return _unsafe.getLongOpaque(receiver, offset);
788
}
789
790
private static final void setOpaque(byte[] receiver, int index, long value, VarHandle varHandle) {
791
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
792
_unsafe.putLongOpaque(receiver, offset, value);
793
}
794
795
private static final long getAcquire(byte[] receiver, int index, VarHandle varHandle) {
796
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
797
return _unsafe.getLongAcquire(receiver, offset);
798
}
799
800
private static final void setRelease(byte[] receiver, int index, long value, VarHandle varHandle) {
801
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
802
_unsafe.putLongRelease(receiver, offset, value);
803
}
804
805
private static final boolean compareAndSet(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
806
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
807
/*[IF Sidecar19-SE-OpenJ9]*/
808
return _unsafe.compareAndSetLong(receiver, offset, testValue, newValue);
809
/*[ELSE]
810
return _unsafe.compareAndSwapLong(receiver, offset, testValue, newValue);
811
/*[ENDIF]*/
812
}
813
814
private static final long compareAndExchange(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
815
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
816
/*[IF Sidecar19-SE-OpenJ9]*/
817
return _unsafe.compareAndExchangeLong(receiver, offset, testValue, newValue);
818
/*[ELSE]
819
return _unsafe.compareAndExchangeLongVolatile(receiver, offset, testValue, newValue);
820
/*[ENDIF]*/
821
}
822
823
private static final long compareAndExchangeAcquire(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
824
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
825
return _unsafe.compareAndExchangeLongAcquire(receiver, offset, testValue, newValue);
826
}
827
828
private static final long compareAndExchangeRelease(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
829
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
830
return _unsafe.compareAndExchangeLongRelease(receiver, offset, testValue, newValue);
831
}
832
833
private static final boolean weakCompareAndSet(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
834
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
835
/*[IF Sidecar19-SE-OpenJ9]*/
836
return _unsafe.weakCompareAndSetLongPlain(receiver, offset, testValue, newValue);
837
/*[ELSE]
838
return _unsafe.weakCompareAndSwapLong(receiver, offset, testValue, newValue);
839
/*[ENDIF]*/
840
}
841
842
private static final boolean weakCompareAndSetAcquire(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
843
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
844
/*[IF Sidecar19-SE-OpenJ9]*/
845
return _unsafe.weakCompareAndSetLongAcquire(receiver, offset, testValue, newValue);
846
/*[ELSE]
847
return _unsafe.weakCompareAndSwapLongAcquire(receiver, offset, testValue, newValue);
848
/*[ENDIF]*/
849
}
850
851
private static final boolean weakCompareAndSetRelease(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
852
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
853
/*[IF Sidecar19-SE-OpenJ9]*/
854
return _unsafe.weakCompareAndSetLongRelease(receiver, offset, testValue, newValue);
855
/*[ELSE]
856
return _unsafe.weakCompareAndSwapLongRelease(receiver, offset, testValue, newValue);
857
/*[ENDIF]*/
858
}
859
860
private static final boolean weakCompareAndSetPlain(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
861
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
862
/*[IF Sidecar19-SE-OpenJ9]*/
863
return _unsafe.weakCompareAndSetLongPlain(receiver, offset, testValue, newValue);
864
/*[ELSE]
865
return _unsafe.weakCompareAndSwapLong(receiver, offset, testValue, newValue);
866
/*[ENDIF]*/
867
}
868
869
private static final long getAndSet(byte[] receiver, int index, long value, VarHandle varHandle) {
870
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
871
return _unsafe.getAndSetLong(receiver, offset, value);
872
}
873
874
private static final long getAndSetAcquire(byte[] receiver, int index, long value, VarHandle varHandle) {
875
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
876
return _unsafe.getAndSetLongAcquire(receiver, offset, value);
877
}
878
879
private static final long getAndSetRelease(byte[] receiver, int index, long value, VarHandle varHandle) {
880
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
881
return _unsafe.getAndSetLongRelease(receiver, offset, value);
882
}
883
884
private static final long getAndAdd(byte[] receiver, int index, long value, VarHandle varHandle) {
885
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
886
return _unsafe.getAndAddLong(receiver, offset, value);
887
}
888
889
private static final long getAndAddAcquire(byte[] receiver, int index, long value, VarHandle varHandle) {
890
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
891
return _unsafe.getAndAddLongAcquire(receiver, offset, value);
892
}
893
894
private static final long getAndAddRelease(byte[] receiver, int index, long value, VarHandle varHandle) {
895
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
896
return _unsafe.getAndAddLongRelease(receiver, offset, value);
897
}
898
899
private static final long getAndBitwiseAnd(byte[] receiver, int index, long value, VarHandle varHandle) {
900
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
901
return _unsafe.getAndBitwiseAndLong(receiver, offset, value);
902
}
903
904
private static final long getAndBitwiseAndAcquire(byte[] receiver, int index, long value, VarHandle varHandle) {
905
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
906
return _unsafe.getAndBitwiseAndLongAcquire(receiver, offset, value);
907
}
908
909
private static final long getAndBitwiseAndRelease(byte[] receiver, int index, long value, VarHandle varHandle) {
910
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
911
return _unsafe.getAndBitwiseAndLongRelease(receiver, offset, value);
912
}
913
914
private static final long getAndBitwiseOr(byte[] receiver, int index, long value, VarHandle varHandle) {
915
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
916
return _unsafe.getAndBitwiseOrLong(receiver, offset, value);
917
}
918
919
private static final long getAndBitwiseOrAcquire(byte[] receiver, int index, long value, VarHandle varHandle) {
920
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
921
return _unsafe.getAndBitwiseOrLongAcquire(receiver, offset, value);
922
}
923
924
private static final long getAndBitwiseOrRelease(byte[] receiver, int index, long value, VarHandle varHandle) {
925
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
926
return _unsafe.getAndBitwiseOrLongRelease(receiver, offset, value);
927
}
928
929
private static final long getAndBitwiseXor(byte[] receiver, int index, long value, VarHandle varHandle) {
930
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
931
return _unsafe.getAndBitwiseXorLong(receiver, offset, value);
932
}
933
934
private static final long getAndBitwiseXorAcquire(byte[] receiver, int index, long value, VarHandle varHandle) {
935
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
936
return _unsafe.getAndBitwiseXorLongAcquire(receiver, offset, value);
937
}
938
939
private static final long getAndBitwiseXorRelease(byte[] receiver, int index, long value, VarHandle varHandle) {
940
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
941
return _unsafe.getAndBitwiseXorLongRelease(receiver, offset, value);
942
}
943
}
944
945
static final class OpShort extends ByteArrayViewVarHandleOperations {
946
private static final int BYTES = Short.BYTES;
947
948
private static final short get(byte[] receiver, int index, VarHandle varHandle) {
949
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
950
return _unsafe.getShort(receiver, offset);
951
}
952
953
private static final void set(byte[] receiver, int index, short value, VarHandle varHandle) {
954
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
955
_unsafe.putShort(receiver, offset, value);
956
}
957
958
private static final short getVolatile(byte[] receiver, int index, VarHandle varHandle) {
959
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
960
return _unsafe.getShortVolatile(receiver, offset);
961
}
962
963
private static final void setVolatile(byte[] receiver, int index, short value, VarHandle varHandle) {
964
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
965
_unsafe.putShortVolatile(receiver, offset, value);
966
}
967
968
private static final short getOpaque(byte[] receiver, int index, VarHandle varHandle) {
969
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
970
return _unsafe.getShortOpaque(receiver, offset);
971
}
972
973
private static final void setOpaque(byte[] receiver, int index, short value, VarHandle varHandle) {
974
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
975
_unsafe.putShortOpaque(receiver, offset, value);
976
}
977
978
private static final short getAcquire(byte[] receiver, int index, VarHandle varHandle) {
979
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
980
return _unsafe.getShortAcquire(receiver, offset);
981
}
982
983
private static final void setRelease(byte[] receiver, int index, short value, VarHandle varHandle) {
984
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
985
_unsafe.putShortRelease(receiver, offset, value);
986
}
987
988
private static final boolean compareAndSet(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
989
throw operationNotSupported(varHandle);
990
}
991
992
private static final short compareAndExchange(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
993
throw operationNotSupported(varHandle);
994
}
995
996
private static final short compareAndExchangeAcquire(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
997
throw operationNotSupported(varHandle);
998
}
999
1000
private static final short compareAndExchangeRelease(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
1001
throw operationNotSupported(varHandle);
1002
}
1003
1004
private static final boolean weakCompareAndSet(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
1005
throw operationNotSupported(varHandle);
1006
}
1007
1008
private static final boolean weakCompareAndSetAcquire(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
1009
throw operationNotSupported(varHandle);
1010
}
1011
1012
private static final boolean weakCompareAndSetRelease(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
1013
throw operationNotSupported(varHandle);
1014
}
1015
1016
private static final boolean weakCompareAndSetPlain(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
1017
throw operationNotSupported(varHandle);
1018
}
1019
1020
private static final short getAndSet(byte[] receiver, int index, short value, VarHandle varHandle) {
1021
throw operationNotSupported(varHandle);
1022
}
1023
1024
private static final short getAndSetAcquire(byte[] receiver, int index, short value, VarHandle varHandle) {
1025
throw operationNotSupported(varHandle);
1026
}
1027
1028
private static final short getAndSetRelease(byte[] receiver, int index, short value, VarHandle varHandle) {
1029
throw operationNotSupported(varHandle);
1030
}
1031
1032
private static final short getAndAdd(byte[] receiver, int index, short value, VarHandle varHandle) {
1033
throw operationNotSupported(varHandle);
1034
}
1035
1036
private static final short getAndAddAcquire(byte[] receiver, int index, short value, VarHandle varHandle) {
1037
throw operationNotSupported(varHandle);
1038
}
1039
1040
private static final short getAndAddRelease(byte[] receiver, int index, short value, VarHandle varHandle) {
1041
throw operationNotSupported(varHandle);
1042
}
1043
1044
private static final short getAndBitwiseAnd(byte[] receiver, int index, short value, VarHandle varHandle) {
1045
throw operationNotSupported(varHandle);
1046
}
1047
1048
private static final short getAndBitwiseAndAcquire(byte[] receiver, int index, short value, VarHandle varHandle) {
1049
throw operationNotSupported(varHandle);
1050
}
1051
1052
private static final short getAndBitwiseAndRelease(byte[] receiver, int index, short value, VarHandle varHandle) {
1053
throw operationNotSupported(varHandle);
1054
}
1055
1056
private static final short getAndBitwiseOr(byte[] receiver, int index, short value, VarHandle varHandle) {
1057
throw operationNotSupported(varHandle);
1058
}
1059
1060
private static final short getAndBitwiseOrAcquire(byte[] receiver, int index, short value, VarHandle varHandle) {
1061
throw operationNotSupported(varHandle);
1062
}
1063
1064
private static final short getAndBitwiseOrRelease(byte[] receiver, int index, short value, VarHandle varHandle) {
1065
throw operationNotSupported(varHandle);
1066
}
1067
1068
private static final short getAndBitwiseXor(byte[] receiver, int index, short value, VarHandle varHandle) {
1069
throw operationNotSupported(varHandle);
1070
}
1071
1072
private static final short getAndBitwiseXorAcquire(byte[] receiver, int index, short value, VarHandle varHandle) {
1073
throw operationNotSupported(varHandle);
1074
}
1075
1076
private static final short getAndBitwiseXorRelease(byte[] receiver, int index, short value, VarHandle varHandle) {
1077
throw operationNotSupported(varHandle);
1078
}
1079
}
1080
1081
static final class OpCharConvertEndian extends ByteArrayViewVarHandleOperations {
1082
private static final int BYTES = Character.BYTES;
1083
1084
private static final char get(byte[] receiver, int index, VarHandle varHandle) {
1085
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
1086
char result = _unsafe.getChar(receiver, offset);
1087
return convertEndian(result);
1088
}
1089
1090
private static final void set(byte[] receiver, int index, char value, VarHandle varHandle) {
1091
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
1092
_unsafe.putChar(receiver, offset, convertEndian(value));
1093
}
1094
1095
private static final char getVolatile(byte[] receiver, int index, VarHandle varHandle) {
1096
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1097
char result = _unsafe.getCharVolatile(receiver, offset);
1098
return convertEndian(result);
1099
}
1100
1101
private static final void setVolatile(byte[] receiver, int index, char value, VarHandle varHandle) {
1102
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1103
_unsafe.putCharVolatile(receiver, offset, convertEndian(value));
1104
}
1105
1106
private static final char getOpaque(byte[] receiver, int index, VarHandle varHandle) {
1107
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1108
char result = _unsafe.getCharOpaque(receiver, offset);
1109
return convertEndian(result);
1110
}
1111
1112
private static final void setOpaque(byte[] receiver, int index, char value, VarHandle varHandle) {
1113
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1114
_unsafe.putCharOpaque(receiver, offset, convertEndian(value));
1115
}
1116
1117
private static final char getAcquire(byte[] receiver, int index, VarHandle varHandle) {
1118
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1119
char result = _unsafe.getCharAcquire(receiver, offset);
1120
return convertEndian(result);
1121
}
1122
1123
private static final void setRelease(byte[] receiver, int index, char value, VarHandle varHandle) {
1124
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1125
_unsafe.putCharRelease(receiver, offset, convertEndian(value));
1126
}
1127
1128
private static final boolean compareAndSet(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
1129
throw operationNotSupported(varHandle);
1130
}
1131
1132
private static final char compareAndExchange(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
1133
throw operationNotSupported(varHandle);
1134
}
1135
1136
private static final char compareAndExchangeAcquire(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
1137
throw operationNotSupported(varHandle);
1138
}
1139
1140
private static final char compareAndExchangeRelease(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
1141
throw operationNotSupported(varHandle);
1142
}
1143
1144
private static final boolean weakCompareAndSet(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
1145
throw operationNotSupported(varHandle);
1146
}
1147
1148
private static final boolean weakCompareAndSetAcquire(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
1149
throw operationNotSupported(varHandle);
1150
}
1151
1152
private static final boolean weakCompareAndSetRelease(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
1153
throw operationNotSupported(varHandle);
1154
}
1155
1156
private static final boolean weakCompareAndSetPlain(byte[] receiver, int index, char testValue, char newValue, VarHandle varHandle) {
1157
throw operationNotSupported(varHandle);
1158
}
1159
1160
private static final char getAndSet(byte[] receiver, int index, char value, VarHandle varHandle) {
1161
throw operationNotSupported(varHandle);
1162
}
1163
1164
private static final char getAndSetAcquire(byte[] receiver, int index, char value, VarHandle varHandle) {
1165
throw operationNotSupported(varHandle);
1166
}
1167
1168
private static final char getAndSetRelease(byte[] receiver, int index, char value, VarHandle varHandle) {
1169
throw operationNotSupported(varHandle);
1170
}
1171
1172
private static final char getAndAdd(byte[] receiver, int index, char value, VarHandle varHandle) {
1173
throw operationNotSupported(varHandle);
1174
}
1175
1176
private static final char getAndAddAcquire(byte[] receiver, int index, char value, VarHandle varHandle) {
1177
throw operationNotSupported(varHandle);
1178
}
1179
1180
private static final char getAndAddRelease(byte[] receiver, int index, char value, VarHandle varHandle) {
1181
throw operationNotSupported(varHandle);
1182
}
1183
1184
private static final char getAndBitwiseAnd(byte[] receiver, int index, char value, VarHandle varHandle) {
1185
throw operationNotSupported(varHandle);
1186
}
1187
1188
private static final char getAndBitwiseAndAcquire(byte[] receiver, int index, char value, VarHandle varHandle) {
1189
throw operationNotSupported(varHandle);
1190
}
1191
1192
private static final char getAndBitwiseAndRelease(byte[] receiver, int index, char value, VarHandle varHandle) {
1193
throw operationNotSupported(varHandle);
1194
}
1195
1196
private static final char getAndBitwiseOr(byte[] receiver, int index, char value, VarHandle varHandle) {
1197
throw operationNotSupported(varHandle);
1198
}
1199
1200
private static final char getAndBitwiseOrAcquire(byte[] receiver, int index, char value, VarHandle varHandle) {
1201
throw operationNotSupported(varHandle);
1202
}
1203
1204
private static final char getAndBitwiseOrRelease(byte[] receiver, int index, char value, VarHandle varHandle) {
1205
throw operationNotSupported(varHandle);
1206
}
1207
1208
private static final char getAndBitwiseXor(byte[] receiver, int index, char value, VarHandle varHandle) {
1209
throw operationNotSupported(varHandle);
1210
}
1211
1212
private static final char getAndBitwiseXorAcquire(byte[] receiver, int index, char value, VarHandle varHandle) {
1213
throw operationNotSupported(varHandle);
1214
}
1215
1216
private static final char getAndBitwiseXorRelease(byte[] receiver, int index, char value, VarHandle varHandle) {
1217
throw operationNotSupported(varHandle);
1218
}
1219
}
1220
1221
static final class OpDoubleConvertEndian extends ByteArrayViewVarHandleOperations {
1222
private static final int BYTES = Double.BYTES;
1223
1224
private static final double get(byte[] receiver, int index, VarHandle varHandle) {
1225
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
1226
double result = _unsafe.getDouble(receiver, offset);
1227
return convertEndian(result);
1228
}
1229
1230
private static final void set(byte[] receiver, int index, double value, VarHandle varHandle) {
1231
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
1232
_unsafe.putDouble(receiver, offset, convertEndian(value));
1233
}
1234
1235
private static final double getVolatile(byte[] receiver, int index, VarHandle varHandle) {
1236
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1237
double result = _unsafe.getDoubleVolatile(receiver, offset);
1238
return convertEndian(result);
1239
}
1240
1241
private static final void setVolatile(byte[] receiver, int index, double value, VarHandle varHandle) {
1242
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1243
_unsafe.putDoubleVolatile(receiver, offset, convertEndian(value));
1244
}
1245
1246
private static final double getOpaque(byte[] receiver, int index, VarHandle varHandle) {
1247
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1248
double result = _unsafe.getDoubleOpaque(receiver, offset);
1249
return convertEndian(result);
1250
}
1251
1252
private static final void setOpaque(byte[] receiver, int index, double value, VarHandle varHandle) {
1253
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1254
_unsafe.putDoubleOpaque(receiver, offset, convertEndian(value));
1255
}
1256
1257
private static final double getAcquire(byte[] receiver, int index, VarHandle varHandle) {
1258
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1259
double result = _unsafe.getDoubleAcquire(receiver, offset);
1260
return convertEndian(result);
1261
}
1262
1263
private static final void setRelease(byte[] receiver, int index, double value, VarHandle varHandle) {
1264
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1265
_unsafe.putDoubleRelease(receiver, offset, convertEndian(value));
1266
}
1267
1268
private static final boolean compareAndSet(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
1269
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1270
/*[IF Sidecar19-SE-OpenJ9]*/
1271
return _unsafe.compareAndSetDouble(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1272
/*[ELSE]
1273
return _unsafe.compareAndSwapDouble(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1274
/*[ENDIF]*/
1275
}
1276
1277
private static final double compareAndExchange(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
1278
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1279
/*[IF Sidecar19-SE-OpenJ9]*/
1280
double result = _unsafe.compareAndExchangeDouble(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1281
/*[ELSE]
1282
double result = _unsafe.compareAndExchangeDoubleVolatile(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1283
/*[ENDIF]*/
1284
return convertEndian(result);
1285
}
1286
1287
private static final double compareAndExchangeAcquire(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
1288
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1289
double result = _unsafe.compareAndExchangeDoubleAcquire(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1290
return convertEndian(result);
1291
}
1292
1293
private static final double compareAndExchangeRelease(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
1294
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1295
double result = _unsafe.compareAndExchangeDoubleRelease(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1296
return convertEndian(result);
1297
}
1298
1299
private static final boolean weakCompareAndSet(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
1300
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1301
/*[IF Sidecar19-SE-OpenJ9]*/
1302
return _unsafe.weakCompareAndSetDoublePlain(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1303
/*[ELSE]
1304
return _unsafe.weakCompareAndSwapDouble(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1305
/*[ENDIF]*/
1306
}
1307
1308
private static final boolean weakCompareAndSetAcquire(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
1309
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1310
/*[IF Sidecar19-SE-OpenJ9]*/
1311
return _unsafe.weakCompareAndSetDoubleAcquire(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1312
/*[ELSE]
1313
return _unsafe.weakCompareAndSwapDoubleAcquire(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1314
/*[ENDIF]*/
1315
}
1316
1317
private static final boolean weakCompareAndSetRelease(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
1318
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1319
/*[IF Sidecar19-SE-OpenJ9]*/
1320
return _unsafe.weakCompareAndSetDoubleRelease(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1321
/*[ELSE]
1322
return _unsafe.weakCompareAndSwapDoubleRelease(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1323
/*[ENDIF]*/
1324
}
1325
1326
private static final boolean weakCompareAndSetPlain(byte[] receiver, int index, double testValue, double newValue, VarHandle varHandle) {
1327
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1328
/*[IF Sidecar19-SE-OpenJ9]*/
1329
return _unsafe.weakCompareAndSetDoublePlain(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1330
/*[ELSE]
1331
return _unsafe.weakCompareAndSwapDouble(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1332
/*[ENDIF]*/
1333
}
1334
1335
private static final double getAndSet(byte[] receiver, int index, double value, VarHandle varHandle) {
1336
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1337
double result = _unsafe.getAndSetDouble(receiver, offset, convertEndian(value));
1338
return convertEndian(result);
1339
}
1340
1341
private static final double getAndSetAcquire(byte[] receiver, int index, double value, VarHandle varHandle) {
1342
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1343
double result = _unsafe.getAndSetDoubleAcquire(receiver, offset, convertEndian(value));
1344
return convertEndian(result);
1345
}
1346
1347
private static final double getAndSetRelease(byte[] receiver, int index, double value, VarHandle varHandle) {
1348
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1349
double result = _unsafe.getAndSetDoubleRelease(receiver, offset, convertEndian(value));
1350
return convertEndian(result);
1351
}
1352
1353
private static final double getAndAdd(byte[] receiver, int index, double value, VarHandle varHandle) {
1354
throw operationNotSupported(varHandle);
1355
}
1356
1357
private static final double getAndAddAcquire(byte[] receiver, int index, double value, VarHandle varHandle) {
1358
throw operationNotSupported(varHandle);
1359
}
1360
1361
private static final double getAndAddRelease(byte[] receiver, int index, double value, VarHandle varHandle) {
1362
throw operationNotSupported(varHandle);
1363
}
1364
1365
private static final double getAndBitwiseAnd(byte[] receiver, int index, double value, VarHandle varHandle) {
1366
throw operationNotSupported(varHandle);
1367
}
1368
1369
private static final double getAndBitwiseAndAcquire(byte[] receiver, int index, double value, VarHandle varHandle) {
1370
throw operationNotSupported(varHandle);
1371
}
1372
1373
private static final double getAndBitwiseAndRelease(byte[] receiver, int index, double value, VarHandle varHandle) {
1374
throw operationNotSupported(varHandle);
1375
}
1376
1377
private static final double getAndBitwiseOr(byte[] receiver, int index, double value, VarHandle varHandle) {
1378
throw operationNotSupported(varHandle);
1379
}
1380
1381
private static final double getAndBitwiseOrAcquire(byte[] receiver, int index, double value, VarHandle varHandle) {
1382
throw operationNotSupported(varHandle);
1383
}
1384
1385
private static final double getAndBitwiseOrRelease(byte[] receiver, int index, double value, VarHandle varHandle) {
1386
throw operationNotSupported(varHandle);
1387
}
1388
1389
private static final double getAndBitwiseXor(byte[] receiver, int index, double value, VarHandle varHandle) {
1390
throw operationNotSupported(varHandle);
1391
}
1392
1393
private static final double getAndBitwiseXorAcquire(byte[] receiver, int index, double value, VarHandle varHandle) {
1394
throw operationNotSupported(varHandle);
1395
}
1396
1397
private static final double getAndBitwiseXorRelease(byte[] receiver, int index, double value, VarHandle varHandle) {
1398
throw operationNotSupported(varHandle);
1399
}
1400
}
1401
1402
static final class OpFloatConvertEndian extends ByteArrayViewVarHandleOperations {
1403
private static final int BYTES = Float.BYTES;
1404
1405
private static final float get(byte[] receiver, int index, VarHandle varHandle) {
1406
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
1407
float result = _unsafe.getFloat(receiver, offset);
1408
return convertEndian(result);
1409
}
1410
1411
private static final void set(byte[] receiver, int index, float value, VarHandle varHandle) {
1412
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
1413
_unsafe.putFloat(receiver, offset, convertEndian(value));
1414
}
1415
1416
private static final float getVolatile(byte[] receiver, int index, VarHandle varHandle) {
1417
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1418
float result = _unsafe.getFloatVolatile(receiver, offset);
1419
return convertEndian(result);
1420
}
1421
1422
private static final void setVolatile(byte[] receiver, int index, float value, VarHandle varHandle) {
1423
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1424
_unsafe.putFloatVolatile(receiver, offset, convertEndian(value));
1425
}
1426
1427
private static final float getOpaque(byte[] receiver, int index, VarHandle varHandle) {
1428
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1429
float result = _unsafe.getFloatOpaque(receiver, offset);
1430
return convertEndian(result);
1431
}
1432
1433
private static final void setOpaque(byte[] receiver, int index, float value, VarHandle varHandle) {
1434
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1435
_unsafe.putFloatOpaque(receiver, offset, convertEndian(value));
1436
}
1437
1438
private static final float getAcquire(byte[] receiver, int index, VarHandle varHandle) {
1439
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1440
float result = _unsafe.getFloatAcquire(receiver, offset);
1441
return convertEndian(result);
1442
}
1443
1444
private static final void setRelease(byte[] receiver, int index, float value, VarHandle varHandle) {
1445
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1446
_unsafe.putFloatRelease(receiver, offset, convertEndian(value));
1447
}
1448
1449
private static final boolean compareAndSet(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
1450
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1451
/*[IF Sidecar19-SE-OpenJ9]*/
1452
return _unsafe.compareAndSetFloat(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1453
/*[ELSE]
1454
return _unsafe.compareAndSwapFloat(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1455
/*[ENDIF]*/
1456
}
1457
1458
private static final float compareAndExchange(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
1459
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1460
/*[IF Sidecar19-SE-OpenJ9]*/
1461
float result = _unsafe.compareAndExchangeFloat(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1462
/*[ELSE]
1463
float result = _unsafe.compareAndExchangeFloatVolatile(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1464
/*[ENDIF]*/
1465
return convertEndian(result);
1466
}
1467
1468
private static final float compareAndExchangeAcquire(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
1469
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1470
float result = _unsafe.compareAndExchangeFloatAcquire(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1471
return convertEndian(result);
1472
}
1473
1474
private static final float compareAndExchangeRelease(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
1475
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1476
float result = _unsafe.compareAndExchangeFloatRelease(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1477
return convertEndian(result);
1478
}
1479
1480
private static final boolean weakCompareAndSet(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
1481
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1482
/*[IF Sidecar19-SE-OpenJ9]*/
1483
return _unsafe.weakCompareAndSetFloatPlain(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1484
/*[ELSE]
1485
return _unsafe.weakCompareAndSwapFloat(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1486
/*[ENDIF]*/
1487
}
1488
1489
private static final boolean weakCompareAndSetAcquire(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
1490
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1491
/*[IF Sidecar19-SE-OpenJ9]*/
1492
return _unsafe.weakCompareAndSetFloatAcquire(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1493
/*[ELSE]
1494
return _unsafe.weakCompareAndSwapFloatAcquire(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1495
/*[ENDIF]*/
1496
}
1497
1498
private static final boolean weakCompareAndSetRelease(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
1499
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1500
/*[IF Sidecar19-SE-OpenJ9]*/
1501
return _unsafe.weakCompareAndSetFloatRelease(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1502
/*[ELSE]
1503
return _unsafe.weakCompareAndSwapFloatRelease(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1504
/*[ENDIF]*/
1505
}
1506
1507
private static final boolean weakCompareAndSetPlain(byte[] receiver, int index, float testValue, float newValue, VarHandle varHandle) {
1508
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1509
/*[IF Sidecar19-SE-OpenJ9]*/
1510
return _unsafe.weakCompareAndSetFloatPlain(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1511
/*[ELSE]
1512
return _unsafe.weakCompareAndSwapFloat(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1513
/*[ENDIF]*/
1514
}
1515
1516
private static final float getAndSet(byte[] receiver, int index, float value, VarHandle varHandle) {
1517
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1518
float result = _unsafe.getAndSetFloat(receiver, offset, convertEndian(value));
1519
return convertEndian(result);
1520
}
1521
1522
private static final float getAndSetAcquire(byte[] receiver, int index, float value, VarHandle varHandle) {
1523
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1524
float result = _unsafe.getAndSetFloatAcquire(receiver, offset, convertEndian(value));
1525
return convertEndian(result);
1526
}
1527
1528
private static final float getAndSetRelease(byte[] receiver, int index, float value, VarHandle varHandle) {
1529
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1530
float result = _unsafe.getAndSetFloatRelease(receiver, offset, convertEndian(value));
1531
return convertEndian(result);
1532
}
1533
1534
private static final float getAndAdd(byte[] receiver, int index, float value, VarHandle varHandle) {
1535
throw operationNotSupported(varHandle);
1536
}
1537
1538
private static final float getAndAddAcquire(byte[] receiver, int index, float value, VarHandle varHandle) {
1539
throw operationNotSupported(varHandle);
1540
}
1541
1542
private static final float getAndAddRelease(byte[] receiver, int index, float value, VarHandle varHandle) {
1543
throw operationNotSupported(varHandle);
1544
}
1545
1546
private static final float getAndBitwiseAnd(byte[] receiver, int index, float value, VarHandle varHandle) {
1547
throw operationNotSupported(varHandle);
1548
}
1549
1550
private static final float getAndBitwiseAndAcquire(byte[] receiver, int index, float value, VarHandle varHandle) {
1551
throw operationNotSupported(varHandle);
1552
}
1553
1554
private static final float getAndBitwiseAndRelease(byte[] receiver, int index, float value, VarHandle varHandle) {
1555
throw operationNotSupported(varHandle);
1556
}
1557
1558
private static final float getAndBitwiseOr(byte[] receiver, int index, float value, VarHandle varHandle) {
1559
throw operationNotSupported(varHandle);
1560
}
1561
1562
private static final float getAndBitwiseOrAcquire(byte[] receiver, int index, float value, VarHandle varHandle) {
1563
throw operationNotSupported(varHandle);
1564
}
1565
1566
private static final float getAndBitwiseOrRelease(byte[] receiver, int index, float value, VarHandle varHandle) {
1567
throw operationNotSupported(varHandle);
1568
}
1569
1570
private static final float getAndBitwiseXor(byte[] receiver, int index, float value, VarHandle varHandle) {
1571
throw operationNotSupported(varHandle);
1572
}
1573
1574
private static final float getAndBitwiseXorAcquire(byte[] receiver, int index, float value, VarHandle varHandle) {
1575
throw operationNotSupported(varHandle);
1576
}
1577
1578
private static final float getAndBitwiseXorRelease(byte[] receiver, int index, float value, VarHandle varHandle) {
1579
throw operationNotSupported(varHandle);
1580
}
1581
}
1582
1583
static final class OpIntConvertEndian extends ByteArrayViewVarHandleOperations {
1584
private static final int BYTES = Integer.BYTES;
1585
1586
private static final int get(byte[] receiver, int index, VarHandle varHandle) {
1587
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
1588
int result = _unsafe.getInt(receiver, offset);
1589
return convertEndian(result);
1590
}
1591
1592
private static final void set(byte[] receiver, int index, int value, VarHandle varHandle) {
1593
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
1594
_unsafe.putInt(receiver, offset, convertEndian(value));
1595
}
1596
1597
private static final int getVolatile(byte[] receiver, int index, VarHandle varHandle) {
1598
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1599
int result = _unsafe.getIntVolatile(receiver, offset);
1600
return convertEndian(result);
1601
}
1602
1603
private static final void setVolatile(byte[] receiver, int index, int value, VarHandle varHandle) {
1604
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1605
_unsafe.putIntVolatile(receiver, offset, convertEndian(value));
1606
}
1607
1608
private static final int getOpaque(byte[] receiver, int index, VarHandle varHandle) {
1609
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1610
int result = _unsafe.getIntOpaque(receiver, offset);
1611
return convertEndian(result);
1612
}
1613
1614
private static final void setOpaque(byte[] receiver, int index, int value, VarHandle varHandle) {
1615
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1616
_unsafe.putIntOpaque(receiver, offset, convertEndian(value));
1617
}
1618
1619
private static final int getAcquire(byte[] receiver, int index, VarHandle varHandle) {
1620
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1621
int result = _unsafe.getIntAcquire(receiver, offset);
1622
return convertEndian(result);
1623
}
1624
1625
private static final void setRelease(byte[] receiver, int index, int value, VarHandle varHandle) {
1626
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1627
_unsafe.putIntRelease(receiver, offset, convertEndian(value));
1628
}
1629
1630
private static final boolean compareAndSet(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
1631
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1632
/*[IF Sidecar19-SE-OpenJ9]*/
1633
return _unsafe.compareAndSetInt(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1634
/*[ELSE]
1635
return _unsafe.compareAndSwapInt(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1636
/*[ENDIF]*/
1637
}
1638
1639
private static final int compareAndExchange(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
1640
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1641
/*[IF Sidecar19-SE-OpenJ9]*/
1642
int result = _unsafe.compareAndExchangeInt(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1643
/*[ELSE]
1644
int result = _unsafe.compareAndExchangeIntVolatile(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1645
/*[ENDIF]*/
1646
return convertEndian(result);
1647
}
1648
1649
private static final int compareAndExchangeAcquire(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
1650
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1651
int result = _unsafe.compareAndExchangeIntAcquire(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1652
return convertEndian(result);
1653
}
1654
1655
private static final int compareAndExchangeRelease(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
1656
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1657
int result = _unsafe.compareAndExchangeIntRelease(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1658
return convertEndian(result);
1659
}
1660
1661
private static final boolean weakCompareAndSet(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
1662
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1663
/*[IF Sidecar19-SE-OpenJ9]*/
1664
return _unsafe.weakCompareAndSetIntPlain(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1665
/*[ELSE]
1666
return _unsafe.weakCompareAndSwapInt(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1667
/*[ENDIF]*/
1668
}
1669
1670
private static final boolean weakCompareAndSetAcquire(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
1671
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1672
/*[IF Sidecar19-SE-OpenJ9]*/
1673
return _unsafe.weakCompareAndSetIntAcquire(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1674
/*[ELSE]
1675
return _unsafe.weakCompareAndSwapIntAcquire(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1676
/*[ENDIF]*/
1677
}
1678
1679
private static final boolean weakCompareAndSetRelease(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
1680
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1681
/*[IF Sidecar19-SE-OpenJ9]*/
1682
return _unsafe.weakCompareAndSetIntRelease(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1683
/*[ELSE]
1684
return _unsafe.weakCompareAndSwapIntRelease(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1685
/*[ENDIF]*/
1686
}
1687
1688
private static final boolean weakCompareAndSetPlain(byte[] receiver, int index, int testValue, int newValue, VarHandle varHandle) {
1689
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1690
/*[IF Sidecar19-SE-OpenJ9]*/
1691
return _unsafe.weakCompareAndSetIntPlain(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1692
/*[ELSE]
1693
return _unsafe.weakCompareAndSwapInt(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1694
/*[ENDIF]*/
1695
}
1696
1697
private static final int getAndSet(byte[] receiver, int index, int value, VarHandle varHandle) {
1698
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1699
int result = _unsafe.getAndSetInt(receiver, offset, convertEndian(value));
1700
return convertEndian(result);
1701
}
1702
1703
private static final int getAndSetAcquire(byte[] receiver, int index, int value, VarHandle varHandle) {
1704
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1705
int result = _unsafe.getAndSetIntAcquire(receiver, offset, convertEndian(value));
1706
return convertEndian(result);
1707
}
1708
1709
private static final int getAndSetRelease(byte[] receiver, int index, int value, VarHandle varHandle) {
1710
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1711
int result = _unsafe.getAndSetIntRelease(receiver, offset, convertEndian(value));
1712
return convertEndian(result);
1713
}
1714
1715
private static final int getAndAdd(byte[] receiver, int index, int value, VarHandle varHandle) {
1716
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1717
int result = _unsafe.getAndAddInt(receiver, offset, convertEndian(value));
1718
return convertEndian(result);
1719
}
1720
1721
private static final int getAndAddAcquire(byte[] receiver, int index, int value, VarHandle varHandle) {
1722
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1723
int result = _unsafe.getAndAddIntAcquire(receiver, offset, convertEndian(value));
1724
return convertEndian(result);
1725
}
1726
1727
private static final int getAndAddRelease(byte[] receiver, int index, int value, VarHandle varHandle) {
1728
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1729
int result = _unsafe.getAndAddIntRelease(receiver, offset, convertEndian(value));
1730
return convertEndian(result);
1731
}
1732
1733
private static final int getAndBitwiseAnd(byte[] receiver, int index, int value, VarHandle varHandle) {
1734
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1735
int result = _unsafe.getAndBitwiseAndInt(receiver, offset, convertEndian(value));
1736
return convertEndian(result);
1737
}
1738
1739
private static final int getAndBitwiseAndAcquire(byte[] receiver, int index, int value, VarHandle varHandle) {
1740
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1741
int result = _unsafe.getAndBitwiseAndIntAcquire(receiver, offset, convertEndian(value));
1742
return convertEndian(result);
1743
}
1744
1745
private static final int getAndBitwiseAndRelease(byte[] receiver, int index, int value, VarHandle varHandle) {
1746
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1747
int result = _unsafe.getAndBitwiseAndIntRelease(receiver, offset, convertEndian(value));
1748
return convertEndian(result);
1749
}
1750
1751
private static final int getAndBitwiseOr(byte[] receiver, int index, int value, VarHandle varHandle) {
1752
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1753
int result = _unsafe.getAndBitwiseOrInt(receiver, offset, convertEndian(value));
1754
return convertEndian(result);
1755
}
1756
1757
private static final int getAndBitwiseOrAcquire(byte[] receiver, int index, int value, VarHandle varHandle) {
1758
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1759
int result = _unsafe.getAndBitwiseOrIntAcquire(receiver, offset, convertEndian(value));
1760
return convertEndian(result);
1761
}
1762
1763
private static final int getAndBitwiseOrRelease(byte[] receiver, int index, int value, VarHandle varHandle) {
1764
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1765
int result = _unsafe.getAndBitwiseOrIntRelease(receiver, offset, convertEndian(value));
1766
return convertEndian(result);
1767
}
1768
1769
private static final int getAndBitwiseXor(byte[] receiver, int index, int value, VarHandle varHandle) {
1770
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1771
int result = _unsafe.getAndBitwiseXorInt(receiver, offset, convertEndian(value));
1772
return convertEndian(result);
1773
}
1774
1775
private static final int getAndBitwiseXorAcquire(byte[] receiver, int index, int value, VarHandle varHandle) {
1776
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1777
int result = _unsafe.getAndBitwiseXorIntAcquire(receiver, offset, convertEndian(value));
1778
return convertEndian(result);
1779
}
1780
1781
private static final int getAndBitwiseXorRelease(byte[] receiver, int index, int value, VarHandle varHandle) {
1782
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1783
int result = _unsafe.getAndBitwiseXorIntRelease(receiver, offset, convertEndian(value));
1784
return convertEndian(result);
1785
}
1786
}
1787
1788
static final class OpLongConvertEndian extends ByteArrayViewVarHandleOperations {
1789
private static final int BYTES = Long.BYTES;
1790
1791
private static final long get(byte[] receiver, int index, VarHandle varHandle) {
1792
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
1793
long result = _unsafe.getLong(receiver, offset);
1794
return convertEndian(result);
1795
}
1796
1797
private static final void set(byte[] receiver, int index, long value, VarHandle varHandle) {
1798
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
1799
_unsafe.putLong(receiver, offset, convertEndian(value));
1800
}
1801
1802
private static final long getVolatile(byte[] receiver, int index, VarHandle varHandle) {
1803
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1804
long result = _unsafe.getLongVolatile(receiver, offset);
1805
return convertEndian(result);
1806
}
1807
1808
private static final void setVolatile(byte[] receiver, int index, long value, VarHandle varHandle) {
1809
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1810
_unsafe.putLongVolatile(receiver, offset, convertEndian(value));
1811
}
1812
1813
private static final long getOpaque(byte[] receiver, int index, VarHandle varHandle) {
1814
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1815
long result = _unsafe.getLongOpaque(receiver, offset);
1816
return convertEndian(result);
1817
}
1818
1819
private static final void setOpaque(byte[] receiver, int index, long value, VarHandle varHandle) {
1820
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1821
_unsafe.putLongOpaque(receiver, offset, convertEndian(value));
1822
}
1823
1824
private static final long getAcquire(byte[] receiver, int index, VarHandle varHandle) {
1825
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1826
long result = _unsafe.getLongAcquire(receiver, offset);
1827
return convertEndian(result);
1828
}
1829
1830
private static final void setRelease(byte[] receiver, int index, long value, VarHandle varHandle) {
1831
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1832
_unsafe.putLongRelease(receiver, offset, convertEndian(value));
1833
}
1834
1835
private static final boolean compareAndSet(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
1836
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1837
/*[IF Sidecar19-SE-OpenJ9]*/
1838
return _unsafe.compareAndSetLong(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1839
/*[ELSE]
1840
return _unsafe.compareAndSwapLong(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1841
/*[ENDIF]*/
1842
}
1843
1844
private static final long compareAndExchange(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
1845
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1846
/*[IF Sidecar19-SE-OpenJ9]*/
1847
long result = _unsafe.compareAndExchangeLong(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1848
/*[ELSE]
1849
long result = _unsafe.compareAndExchangeLongVolatile(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1850
/*[ENDIF]*/
1851
return convertEndian(result);
1852
}
1853
1854
private static final long compareAndExchangeAcquire(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
1855
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1856
long result = _unsafe.compareAndExchangeLongAcquire(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1857
return convertEndian(result);
1858
}
1859
1860
private static final long compareAndExchangeRelease(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
1861
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1862
long result = _unsafe.compareAndExchangeLongRelease(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1863
return convertEndian(result);
1864
}
1865
1866
private static final boolean weakCompareAndSet(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
1867
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1868
/*[IF Sidecar19-SE-OpenJ9]*/
1869
return _unsafe.weakCompareAndSetLongPlain(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1870
/*[ELSE]
1871
return _unsafe.weakCompareAndSwapLong(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1872
/*[ENDIF]*/
1873
}
1874
1875
private static final boolean weakCompareAndSetAcquire(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
1876
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1877
/*[IF Sidecar19-SE-OpenJ9]*/
1878
return _unsafe.weakCompareAndSetLongAcquire(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1879
/*[ELSE]
1880
return _unsafe.weakCompareAndSwapLongAcquire(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1881
/*[ENDIF]*/
1882
}
1883
1884
private static final boolean weakCompareAndSetRelease(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
1885
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1886
/*[IF Sidecar19-SE-OpenJ9]*/
1887
return _unsafe.weakCompareAndSetLongRelease(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1888
/*[ELSE]
1889
return _unsafe.weakCompareAndSwapLongRelease(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1890
/*[ENDIF]*/
1891
}
1892
1893
private static final boolean weakCompareAndSetPlain(byte[] receiver, int index, long testValue, long newValue, VarHandle varHandle) {
1894
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1895
/*[IF Sidecar19-SE-OpenJ9]*/
1896
return _unsafe.weakCompareAndSetLongPlain(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1897
/*[ELSE]
1898
return _unsafe.weakCompareAndSwapLong(receiver, offset, convertEndian(testValue), convertEndian(newValue));
1899
/*[ENDIF]*/
1900
}
1901
1902
private static final long getAndSet(byte[] receiver, int index, long value, VarHandle varHandle) {
1903
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1904
long result = _unsafe.getAndSetLong(receiver, offset, convertEndian(value));
1905
return convertEndian(result);
1906
}
1907
1908
private static final long getAndSetAcquire(byte[] receiver, int index, long value, VarHandle varHandle) {
1909
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1910
long result = _unsafe.getAndSetLongAcquire(receiver, offset, convertEndian(value));
1911
return convertEndian(result);
1912
}
1913
1914
private static final long getAndSetRelease(byte[] receiver, int index, long value, VarHandle varHandle) {
1915
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1916
long result = _unsafe.getAndSetLongRelease(receiver, offset, convertEndian(value));
1917
return convertEndian(result);
1918
}
1919
1920
private static final long getAndAdd(byte[] receiver, int index, long value, VarHandle varHandle) {
1921
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1922
long result = _unsafe.getAndAddLong(receiver, offset, convertEndian(value));
1923
return convertEndian(result);
1924
}
1925
1926
private static final long getAndAddAcquire(byte[] receiver, int index, long value, VarHandle varHandle) {
1927
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1928
long result = _unsafe.getAndAddLongAcquire(receiver, offset, convertEndian(value));
1929
return convertEndian(result);
1930
}
1931
1932
private static final long getAndAddRelease(byte[] receiver, int index, long value, VarHandle varHandle) {
1933
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1934
long result = _unsafe.getAndAddLongRelease(receiver, offset, convertEndian(value));
1935
return convertEndian(result);
1936
}
1937
1938
private static final long getAndBitwiseAnd(byte[] receiver, int index, long value, VarHandle varHandle) {
1939
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1940
long result = _unsafe.getAndBitwiseAndLong(receiver, offset, convertEndian(value));
1941
return convertEndian(result);
1942
}
1943
1944
private static final long getAndBitwiseAndAcquire(byte[] receiver, int index, long value, VarHandle varHandle) {
1945
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1946
long result = _unsafe.getAndBitwiseAndLongAcquire(receiver, offset, convertEndian(value));
1947
return convertEndian(result);
1948
}
1949
1950
private static final long getAndBitwiseAndRelease(byte[] receiver, int index, long value, VarHandle varHandle) {
1951
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1952
long result = _unsafe.getAndBitwiseAndLongRelease(receiver, offset, convertEndian(value));
1953
return convertEndian(result);
1954
}
1955
1956
private static final long getAndBitwiseOr(byte[] receiver, int index, long value, VarHandle varHandle) {
1957
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1958
long result = _unsafe.getAndBitwiseOrLong(receiver, offset, convertEndian(value));
1959
return convertEndian(result);
1960
}
1961
1962
private static final long getAndBitwiseOrAcquire(byte[] receiver, int index, long value, VarHandle varHandle) {
1963
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1964
long result = _unsafe.getAndBitwiseOrLongAcquire(receiver, offset, convertEndian(value));
1965
return convertEndian(result);
1966
}
1967
1968
private static final long getAndBitwiseOrRelease(byte[] receiver, int index, long value, VarHandle varHandle) {
1969
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1970
long result = _unsafe.getAndBitwiseOrLongRelease(receiver, offset, convertEndian(value));
1971
return convertEndian(result);
1972
}
1973
1974
private static final long getAndBitwiseXor(byte[] receiver, int index, long value, VarHandle varHandle) {
1975
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1976
long result = _unsafe.getAndBitwiseXorLong(receiver, offset, convertEndian(value));
1977
return convertEndian(result);
1978
}
1979
1980
private static final long getAndBitwiseXorAcquire(byte[] receiver, int index, long value, VarHandle varHandle) {
1981
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1982
long result = _unsafe.getAndBitwiseXorLongAcquire(receiver, offset, convertEndian(value));
1983
return convertEndian(result);
1984
}
1985
1986
private static final long getAndBitwiseXorRelease(byte[] receiver, int index, long value, VarHandle varHandle) {
1987
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
1988
long result = _unsafe.getAndBitwiseXorLongRelease(receiver, offset, convertEndian(value));
1989
return convertEndian(result);
1990
}
1991
}
1992
1993
static final class OpShortConvertEndian extends ByteArrayViewVarHandleOperations {
1994
private static final int BYTES = Short.BYTES;
1995
1996
private static final short get(byte[] receiver, int index, VarHandle varHandle) {
1997
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
1998
short result = _unsafe.getShort(receiver, offset);
1999
return convertEndian(result);
2000
}
2001
2002
private static final void set(byte[] receiver, int index, short value, VarHandle varHandle) {
2003
long offset = checkAndComputeOffset(receiver, BYTES, index, true);
2004
_unsafe.putShort(receiver, offset, convertEndian(value));
2005
}
2006
2007
private static final short getVolatile(byte[] receiver, int index, VarHandle varHandle) {
2008
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
2009
short result = _unsafe.getShortVolatile(receiver, offset);
2010
return convertEndian(result);
2011
}
2012
2013
private static final void setVolatile(byte[] receiver, int index, short value, VarHandle varHandle) {
2014
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
2015
_unsafe.putShortVolatile(receiver, offset, convertEndian(value));
2016
}
2017
2018
private static final short getOpaque(byte[] receiver, int index, VarHandle varHandle) {
2019
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
2020
short result = _unsafe.getShortOpaque(receiver, offset);
2021
return convertEndian(result);
2022
}
2023
2024
private static final void setOpaque(byte[] receiver, int index, short value, VarHandle varHandle) {
2025
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
2026
_unsafe.putShortOpaque(receiver, offset, convertEndian(value));
2027
}
2028
2029
private static final short getAcquire(byte[] receiver, int index, VarHandle varHandle) {
2030
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
2031
short result = _unsafe.getShortAcquire(receiver, offset);
2032
return convertEndian(result);
2033
}
2034
2035
private static final void setRelease(byte[] receiver, int index, short value, VarHandle varHandle) {
2036
long offset = checkAndComputeOffset(receiver, BYTES, index, false);
2037
_unsafe.putShortRelease(receiver, offset, convertEndian(value));
2038
}
2039
2040
private static final boolean compareAndSet(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
2041
throw operationNotSupported(varHandle);
2042
}
2043
2044
private static final short compareAndExchange(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
2045
throw operationNotSupported(varHandle);
2046
}
2047
2048
private static final short compareAndExchangeAcquire(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
2049
throw operationNotSupported(varHandle);
2050
}
2051
2052
private static final short compareAndExchangeRelease(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
2053
throw operationNotSupported(varHandle);
2054
}
2055
2056
private static final boolean weakCompareAndSet(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
2057
throw operationNotSupported(varHandle);
2058
}
2059
2060
private static final boolean weakCompareAndSetAcquire(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
2061
throw operationNotSupported(varHandle);
2062
}
2063
2064
private static final boolean weakCompareAndSetRelease(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
2065
throw operationNotSupported(varHandle);
2066
}
2067
2068
private static final boolean weakCompareAndSetPlain(byte[] receiver, int index, short testValue, short newValue, VarHandle varHandle) {
2069
throw operationNotSupported(varHandle);
2070
}
2071
2072
private static final short getAndSet(byte[] receiver, int index, short value, VarHandle varHandle) {
2073
throw operationNotSupported(varHandle);
2074
}
2075
2076
private static final short getAndSetAcquire(byte[] receiver, int index, short value, VarHandle varHandle) {
2077
throw operationNotSupported(varHandle);
2078
}
2079
2080
private static final short getAndSetRelease(byte[] receiver, int index, short value, VarHandle varHandle) {
2081
throw operationNotSupported(varHandle);
2082
}
2083
2084
private static final short getAndAdd(byte[] receiver, int index, short value, VarHandle varHandle) {
2085
throw operationNotSupported(varHandle);
2086
}
2087
2088
private static final short getAndAddAcquire(byte[] receiver, int index, short value, VarHandle varHandle) {
2089
throw operationNotSupported(varHandle);
2090
}
2091
2092
private static final short getAndAddRelease(byte[] receiver, int index, short value, VarHandle varHandle) {
2093
throw operationNotSupported(varHandle);
2094
}
2095
2096
private static final short getAndBitwiseAnd(byte[] receiver, int index, short value, VarHandle varHandle) {
2097
throw operationNotSupported(varHandle);
2098
}
2099
2100
private static final short getAndBitwiseAndAcquire(byte[] receiver, int index, short value, VarHandle varHandle) {
2101
throw operationNotSupported(varHandle);
2102
}
2103
2104
private static final short getAndBitwiseAndRelease(byte[] receiver, int index, short value, VarHandle varHandle) {
2105
throw operationNotSupported(varHandle);
2106
}
2107
2108
private static final short getAndBitwiseOr(byte[] receiver, int index, short value, VarHandle varHandle) {
2109
throw operationNotSupported(varHandle);
2110
}
2111
2112
private static final short getAndBitwiseOrAcquire(byte[] receiver, int index, short value, VarHandle varHandle) {
2113
throw operationNotSupported(varHandle);
2114
}
2115
2116
private static final short getAndBitwiseOrRelease(byte[] receiver, int index, short value, VarHandle varHandle) {
2117
throw operationNotSupported(varHandle);
2118
}
2119
2120
private static final short getAndBitwiseXor(byte[] receiver, int index, short value, VarHandle varHandle) {
2121
throw operationNotSupported(varHandle);
2122
}
2123
2124
private static final short getAndBitwiseXorAcquire(byte[] receiver, int index, short value, VarHandle varHandle) {
2125
throw operationNotSupported(varHandle);
2126
}
2127
2128
private static final short getAndBitwiseXorRelease(byte[] receiver, int index, short value, VarHandle varHandle) {
2129
throw operationNotSupported(varHandle);
2130
}
2131
}
2132
}
2133
}
2134
2135