50
51 inline void Atomic::dec (volatile jint* dest) { (void)add (-1, dest); }
52 inline void Atomic::dec_ptr(volatile intptr_t* dest) { (void)add_ptr(-1, dest); }
53 inline void Atomic::dec_ptr(volatile void* dest) { (void)add_ptr(-1, dest); }
54
55
56 #ifdef _LP64
57
58 inline void Atomic::store(jlong store_value, jlong* dest) { *dest = store_value; }
59 inline void Atomic::store(jlong store_value, volatile jlong* dest) { *dest = store_value; }
60 inline jlong Atomic::load(volatile jlong* src) { return *src; }
61
62 #else
63
64 extern "C" void _Atomic_move_long_v8(volatile jlong* src, volatile jlong* dst);
65 extern "C" void _Atomic_move_long_v9(volatile jlong* src, volatile jlong* dst);
66
67 inline void Atomic_move_long(volatile jlong* src, volatile jlong* dst) {
68 #ifdef COMPILER2
69 // Compiler2 does not support v8, it is used only for v9.
70 assert (VM_Version::v9_instructions_work(), "only supported on v9");
71 _Atomic_move_long_v9(src, dst);
72 #else
73 // The branch is cheaper then emulated LDD.
74 if (VM_Version::v9_instructions_work()) {
75 _Atomic_move_long_v9(src, dst);
76 } else {
77 _Atomic_move_long_v8(src, dst);
78 }
79 #endif
80 }
81
82 inline jlong Atomic::load(volatile jlong* src) {
83 volatile jlong dest;
84 Atomic_move_long(src, &dest);
85 return dest;
86 }
87
88 inline void Atomic::store(jlong store_value, jlong* dest) {
89 Atomic_move_long((volatile jlong*)&store_value, (volatile jlong*)dest);
90 }
|
50
51 inline void Atomic::dec (volatile jint* dest) { (void)add (-1, dest); }
52 inline void Atomic::dec_ptr(volatile intptr_t* dest) { (void)add_ptr(-1, dest); }
53 inline void Atomic::dec_ptr(volatile void* dest) { (void)add_ptr(-1, dest); }
54
55
56 #ifdef _LP64
57
58 inline void Atomic::store(jlong store_value, jlong* dest) { *dest = store_value; }
59 inline void Atomic::store(jlong store_value, volatile jlong* dest) { *dest = store_value; }
60 inline jlong Atomic::load(volatile jlong* src) { return *src; }
61
62 #else
63
64 extern "C" void _Atomic_move_long_v8(volatile jlong* src, volatile jlong* dst);
65 extern "C" void _Atomic_move_long_v9(volatile jlong* src, volatile jlong* dst);
66
67 inline void Atomic_move_long(volatile jlong* src, volatile jlong* dst) {
68 #ifdef COMPILER2
69 // Compiler2 does not support v8, it is used only for v9.
70 _Atomic_move_long_v9(src, dst);
71 #else
72 // The branch is cheaper then emulated LDD.
73 if (VM_Version::v9_instructions_work()) {
74 _Atomic_move_long_v9(src, dst);
75 } else {
76 _Atomic_move_long_v8(src, dst);
77 }
78 #endif
79 }
80
81 inline jlong Atomic::load(volatile jlong* src) {
82 volatile jlong dest;
83 Atomic_move_long(src, &dest);
84 return dest;
85 }
86
87 inline void Atomic::store(jlong store_value, jlong* dest) {
88 Atomic_move_long((volatile jlong*)&store_value, (volatile jlong*)dest);
89 }
|