371 // heap oop is not pointer sized.
372 OrderAccess::release_store(p, encode_heap_oop_not_null(v));
373 }
374 void oopDesc::release_encode_store_heap_oop_not_null(volatile oop* p, oop v) {
375 OrderAccess::release_store(p, v);
376 }
377
378 void oopDesc::release_encode_store_heap_oop(volatile oop* p, oop v) {
379 OrderAccess::release_store(p, v);
380 }
381 void oopDesc::release_encode_store_heap_oop(volatile narrowOop* p, oop v) {
382 OrderAccess::release_store(p, encode_heap_oop(v));
383 }
384
385 // These functions are only used to exchange oop fields in instances,
386 // not headers.
387 oop oopDesc::atomic_exchange_oop(oop exchange_value, volatile HeapWord *dest) {
388 if (UseCompressedOops) {
389 // encode exchange value from oop to T
390 narrowOop val = encode_heap_oop(exchange_value);
391 narrowOop old = (narrowOop)Atomic::xchg(val, (narrowOop*)dest);
392 // decode old from T to oop
393 return decode_heap_oop(old);
394 } else {
395 return Atomic::xchg(exchange_value, (oop*)dest);
396 }
397 }
398
399 oop oopDesc::atomic_compare_exchange_oop(oop exchange_value,
400 volatile HeapWord *dest,
401 oop compare_value,
402 bool prebarrier) {
403 if (UseCompressedOops) {
404 if (prebarrier) {
405 update_barrier_set_pre((narrowOop*)dest, exchange_value);
406 }
407 // encode exchange and compare value from oop to T
408 narrowOop val = encode_heap_oop(exchange_value);
409 narrowOop cmp = encode_heap_oop(compare_value);
410
411 narrowOop old = Atomic::cmpxchg(val, (narrowOop*)dest, cmp);
|
371 // heap oop is not pointer sized.
372 OrderAccess::release_store(p, encode_heap_oop_not_null(v));
373 }
374 void oopDesc::release_encode_store_heap_oop_not_null(volatile oop* p, oop v) {
375 OrderAccess::release_store(p, v);
376 }
377
378 void oopDesc::release_encode_store_heap_oop(volatile oop* p, oop v) {
379 OrderAccess::release_store(p, v);
380 }
381 void oopDesc::release_encode_store_heap_oop(volatile narrowOop* p, oop v) {
382 OrderAccess::release_store(p, encode_heap_oop(v));
383 }
384
385 // These functions are only used to exchange oop fields in instances,
386 // not headers.
387 oop oopDesc::atomic_exchange_oop(oop exchange_value, volatile HeapWord *dest) {
388 if (UseCompressedOops) {
389 // encode exchange value from oop to T
390 narrowOop val = encode_heap_oop(exchange_value);
391 narrowOop old = Atomic::xchg(val, (narrowOop*)dest);
392 // decode old from T to oop
393 return decode_heap_oop(old);
394 } else {
395 return Atomic::xchg(exchange_value, (oop*)dest);
396 }
397 }
398
399 oop oopDesc::atomic_compare_exchange_oop(oop exchange_value,
400 volatile HeapWord *dest,
401 oop compare_value,
402 bool prebarrier) {
403 if (UseCompressedOops) {
404 if (prebarrier) {
405 update_barrier_set_pre((narrowOop*)dest, exchange_value);
406 }
407 // encode exchange and compare value from oop to T
408 narrowOop val = encode_heap_oop(exchange_value);
409 narrowOop cmp = encode_heap_oop(compare_value);
410
411 narrowOop old = Atomic::cmpxchg(val, (narrowOop*)dest, cmp);
|