106 inline void Atomic::dec_ptr(volatile void* dest) {
107 (void)add_ptr(-1, dest);
108 }
109
110 inline jint Atomic::xchg (jint exchange_value, volatile jint* dest) {
111 return (jint)(*os::atomic_xchg_func)(exchange_value, dest);
112 }
113
114 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
115 return (intptr_t)(os::atomic_xchg_ptr_func)(exchange_value, dest);
116 }
117
118 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
119 return (void *)(os::atomic_xchg_ptr_func)((intptr_t)exchange_value, (volatile intptr_t*)dest);
120 }
121
122 inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
123 return (*os::atomic_cmpxchg_func)(exchange_value, dest, compare_value);
124 }
125
126 #define VM_HAS_SPECIALIZED_CMPXCHG_BYTE
127 inline jbyte Atomic::cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
128 return (*os::atomic_cmpxchg_byte_func)(exchange_value, dest, compare_value);
129 }
130
131 inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value) {
132 return (*os::atomic_cmpxchg_long_func)(exchange_value, dest, compare_value);
133 }
134
135 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value) {
136 return (intptr_t)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value);
137 }
138
139 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value) {
140 return (void*)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value);
141 }
142
143 inline jlong Atomic::load(volatile jlong* src) { return *src; }
144
145 #else // !AMD64
146
147 inline jint Atomic::add (jint add_value, volatile jint* dest) {
148 int mp = os::is_MP();
149 __asm {
150 mov edx, dest;
151 mov eax, add_value;
152 mov ecx, eax;
153 LOCK_IF_MP(mp)
154 xadd dword ptr [edx], eax;
155 add eax, ecx;
156 }
157 }
158
159 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
200 dec((volatile jint*)dest);
201 }
202
203 inline jint Atomic::xchg (jint exchange_value, volatile jint* dest) {
204 // alternative for InterlockedExchange
205 __asm {
206 mov eax, exchange_value;
207 mov ecx, dest;
208 xchg eax, dword ptr [ecx];
209 }
210 }
211
212 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
213 return (intptr_t)xchg((jint)exchange_value, (volatile jint*)dest);
214 }
215
216 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
217 return (void*)xchg((jint)exchange_value, (volatile jint*)dest);
218 }
219
220 #define VM_HAS_SPECIALIZED_CMPXCHG_BYTE
221 inline jbyte Atomic::cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
222 // alternative for InterlockedCompareExchange
223 int mp = os::is_MP();
224 __asm {
225 mov edx, dest
226 mov cl, exchange_value
227 mov al, compare_value
228 LOCK_IF_MP(mp)
229 cmpxchg byte ptr [edx], cl
230 }
231 }
232
233 inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
234 // alternative for InterlockedCompareExchange
235 int mp = os::is_MP();
236 __asm {
237 mov edx, dest
238 mov ecx, exchange_value
239 mov eax, compare_value
240 LOCK_IF_MP(mp)
241 cmpxchg dword ptr [edx], ecx
|
106 inline void Atomic::dec_ptr(volatile void* dest) {
107 (void)add_ptr(-1, dest);
108 }
109
110 inline jint Atomic::xchg (jint exchange_value, volatile jint* dest) {
111 return (jint)(*os::atomic_xchg_func)(exchange_value, dest);
112 }
113
114 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
115 return (intptr_t)(os::atomic_xchg_ptr_func)(exchange_value, dest);
116 }
117
118 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
119 return (void *)(os::atomic_xchg_ptr_func)((intptr_t)exchange_value, (volatile intptr_t*)dest);
120 }
121
122 inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
123 return (*os::atomic_cmpxchg_func)(exchange_value, dest, compare_value);
124 }
125
126 inline jbyte AtomicPlatform::cmpxchg(jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
127 return (*os::atomic_cmpxchg_byte_func)(exchange_value, dest, compare_value);
128 }
129
130 inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value) {
131 return (*os::atomic_cmpxchg_long_func)(exchange_value, dest, compare_value);
132 }
133
134 inline intptr_t Atomic::cmpxchg_ptr (intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value) {
135 return (intptr_t)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value);
136 }
137
138 inline void* Atomic::cmpxchg_ptr (void* exchange_value, volatile void* dest, void* compare_value) {
139 return (void*)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value);
140 }
141
142 inline jlong Atomic::load(volatile jlong* src) { return *src; }
143
144 #else // !AMD64
145
146 inline jint Atomic::add (jint add_value, volatile jint* dest) {
147 int mp = os::is_MP();
148 __asm {
149 mov edx, dest;
150 mov eax, add_value;
151 mov ecx, eax;
152 LOCK_IF_MP(mp)
153 xadd dword ptr [edx], eax;
154 add eax, ecx;
155 }
156 }
157
158 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
199 dec((volatile jint*)dest);
200 }
201
202 inline jint Atomic::xchg (jint exchange_value, volatile jint* dest) {
203 // alternative for InterlockedExchange
204 __asm {
205 mov eax, exchange_value;
206 mov ecx, dest;
207 xchg eax, dword ptr [ecx];
208 }
209 }
210
211 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
212 return (intptr_t)xchg((jint)exchange_value, (volatile jint*)dest);
213 }
214
215 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
216 return (void*)xchg((jint)exchange_value, (volatile jint*)dest);
217 }
218
219 inline jbyte AtomicPlatform::cmpxchg(jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
220 // alternative for InterlockedCompareExchange
221 int mp = os::is_MP();
222 __asm {
223 mov edx, dest
224 mov cl, exchange_value
225 mov al, compare_value
226 LOCK_IF_MP(mp)
227 cmpxchg byte ptr [edx], cl
228 }
229 }
230
231 inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
232 // alternative for InterlockedCompareExchange
233 int mp = os::is_MP();
234 __asm {
235 mov edx, dest
236 mov ecx, exchange_value
237 mov eax, compare_value
238 LOCK_IF_MP(mp)
239 cmpxchg dword ptr [edx], ecx
|