113 return (*os::atomic_cmpxchg_func)(exchange_value, dest, compare_value);
114 }
115
116 #define VM_HAS_SPECIALIZED_CMPXCHG_BYTE
117 inline jbyte Atomic::cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value, cmpxchg_memory_order order) {
118 return (*os::atomic_cmpxchg_byte_func)(exchange_value, dest, compare_value);
119 }
120
121 inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value, cmpxchg_memory_order order) {
122 return (*os::atomic_cmpxchg_long_func)(exchange_value, dest, compare_value);
123 }
124
125 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value, cmpxchg_memory_order order) {
126 return (intptr_t)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value, order);
127 }
128
129 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value, cmpxchg_memory_order order) {
130 return (void*)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value, order);
131 }
132
133 inline jlong Atomic::load(volatile jlong* src) { return *src; }
134
135 #else // !AMD64
136
137 inline jint Atomic::add (jint add_value, volatile jint* dest) {
138 __asm {
139 mov edx, dest;
140 mov eax, add_value;
141 mov ecx, eax;
142 lock xadd dword ptr [edx], eax;
143 add eax, ecx;
144 }
145 }
146
147 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
148 return (intptr_t)add((jint)add_value, (volatile jint*)dest);
149 }
150
151 inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) {
152 return (void*)add((jint)add_value, (volatile jint*)dest);
153 }
232 push edi
233 mov eax, cmp_lo
234 mov edx, cmp_hi
235 mov edi, dest
236 mov ebx, ex_lo
237 mov ecx, ex_hi
238 lock cmpxchg8b qword ptr [edi]
239 pop edi
240 pop ebx
241 }
242 }
243
244 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value, cmpxchg_memory_order order) {
245 return (intptr_t)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value, order);
246 }
247
248 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value, cmpxchg_memory_order order) {
249 return (void*)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value, order);
250 }
251
252 inline jlong Atomic::load(volatile jlong* src) {
253 volatile jlong dest;
254 volatile jlong* pdest = &dest;
255 __asm {
256 mov eax, src
257 fild qword ptr [eax]
258 mov eax, pdest
259 fistp qword ptr [eax]
260 }
261 return dest;
262 }
263
264 inline void Atomic::store(jlong store_value, volatile jlong* dest) {
265 volatile jlong* src = &store_value;
266 __asm {
267 mov eax, src
268 fild qword ptr [eax]
269 mov eax, dest
270 fistp qword ptr [eax]
271 }
272 }
|
113 return (*os::atomic_cmpxchg_func)(exchange_value, dest, compare_value);
114 }
115
116 #define VM_HAS_SPECIALIZED_CMPXCHG_BYTE
117 inline jbyte Atomic::cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value, cmpxchg_memory_order order) {
118 return (*os::atomic_cmpxchg_byte_func)(exchange_value, dest, compare_value);
119 }
120
121 inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value, cmpxchg_memory_order order) {
122 return (*os::atomic_cmpxchg_long_func)(exchange_value, dest, compare_value);
123 }
124
125 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value, cmpxchg_memory_order order) {
126 return (intptr_t)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value, order);
127 }
128
129 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value, cmpxchg_memory_order order) {
130 return (void*)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value, order);
131 }
132
133 inline jlong Atomic::load(const volatile jlong* src) { return *src; }
134
135 #else // !AMD64
136
137 inline jint Atomic::add (jint add_value, volatile jint* dest) {
138 __asm {
139 mov edx, dest;
140 mov eax, add_value;
141 mov ecx, eax;
142 lock xadd dword ptr [edx], eax;
143 add eax, ecx;
144 }
145 }
146
147 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
148 return (intptr_t)add((jint)add_value, (volatile jint*)dest);
149 }
150
151 inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) {
152 return (void*)add((jint)add_value, (volatile jint*)dest);
153 }
232 push edi
233 mov eax, cmp_lo
234 mov edx, cmp_hi
235 mov edi, dest
236 mov ebx, ex_lo
237 mov ecx, ex_hi
238 lock cmpxchg8b qword ptr [edi]
239 pop edi
240 pop ebx
241 }
242 }
243
244 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value, cmpxchg_memory_order order) {
245 return (intptr_t)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value, order);
246 }
247
248 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value, cmpxchg_memory_order order) {
249 return (void*)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value, order);
250 }
251
252 inline jlong Atomic::load(const volatile jlong* src) {
253 volatile jlong dest;
254 volatile jlong* pdest = &dest;
255 __asm {
256 mov eax, src
257 fild qword ptr [eax]
258 mov eax, pdest
259 fistp qword ptr [eax]
260 }
261 return dest;
262 }
263
264 inline void Atomic::store(jlong store_value, volatile jlong* dest) {
265 volatile jlong* src = &store_value;
266 __asm {
267 mov eax, src
268 fild qword ptr [eax]
269 mov eax, dest
270 fistp qword ptr [eax]
271 }
272 }
|