83 inline jint Atomic::xchg (jint exchange_value, volatile jint* dest) { |
83 inline jint Atomic::xchg (jint exchange_value, volatile jint* dest) { |
84 return _Atomic_xchg(exchange_value, dest); |
84 return _Atomic_xchg(exchange_value, dest); |
85 } |
85 } |
86 |
86 |
87 #define VM_HAS_SPECIALIZED_CMPXCHG_BYTE |
87 #define VM_HAS_SPECIALIZED_CMPXCHG_BYTE |
88 inline jbyte Atomic::cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) { |
88 inline jbyte Atomic::cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value, cmpxchg_memory_order order) { |
89 return _Atomic_cmpxchg_byte(exchange_value, dest, compare_value IS_MP_ARG()); |
89 return _Atomic_cmpxchg_byte(exchange_value, dest, compare_value IS_MP_ARG()); |
90 } |
90 } |
91 |
91 |
92 inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) { |
92 inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value, cmpxchg_memory_order order) { |
93 return _Atomic_cmpxchg(exchange_value, dest, compare_value IS_MP_ARG()); |
93 return _Atomic_cmpxchg(exchange_value, dest, compare_value IS_MP_ARG()); |
94 } |
94 } |
95 |
95 |
96 inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value) { |
96 inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value, cmpxchg_memory_order order) { |
97 return _Atomic_cmpxchg_long(exchange_value, dest, compare_value IS_MP_ARG()); |
97 return _Atomic_cmpxchg_long(exchange_value, dest, compare_value IS_MP_ARG()); |
98 } |
98 } |
99 |
99 |
100 |
100 |
101 #ifdef AMD64 |
101 #ifdef AMD64 |
118 |
118 |
119 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) { |
119 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) { |
120 return (void*)_Atomic_xchg_long((jlong)exchange_value, (volatile jlong*)dest); |
120 return (void*)_Atomic_xchg_long((jlong)exchange_value, (volatile jlong*)dest); |
121 } |
121 } |
122 |
122 |
123 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value) { |
123 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value, cmpxchg_memory_order order) { |
124 return (intptr_t)_Atomic_cmpxchg_long((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value); |
124 return (intptr_t)_Atomic_cmpxchg_long((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value); |
125 } |
125 } |
126 |
126 |
127 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value) { |
127 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value, cmpxchg_memory_order order) { |
128 return (void*)_Atomic_cmpxchg_long((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value); |
128 return (void*)_Atomic_cmpxchg_long((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value); |
129 } |
129 } |
130 |
130 |
131 inline jlong Atomic::load(volatile jlong* src) { return *src; } |
131 inline jlong Atomic::load(volatile jlong* src) { return *src; } |
132 |
132 |
146 |
146 |
147 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) { |
147 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) { |
148 return (void*)xchg((jint)exchange_value, (volatile jint*)dest); |
148 return (void*)xchg((jint)exchange_value, (volatile jint*)dest); |
149 } |
149 } |
150 |
150 |
151 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value) { |
151 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value, cmpxchg_memory_order order) { |
152 return (intptr_t)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value); |
152 return (intptr_t)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value, order); |
153 } |
153 } |
154 |
154 |
155 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value) { |
155 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value, cmpxchg_memory_order order) { |
156 return (void*)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value); |
156 return (void*)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value, order); |
157 } |
157 } |
158 |
158 |
159 extern "C" void _Atomic_move_long(volatile jlong* src, volatile jlong* dst); |
159 extern "C" void _Atomic_move_long(volatile jlong* src, volatile jlong* dst); |
160 |
160 |
161 inline jlong Atomic::load(volatile jlong* src) { |
161 inline jlong Atomic::load(volatile jlong* src) { |