< prev index next >

src/os_cpu/windows_x86/vm/atomic_windows_x86.hpp

Print this page
rev 13030 : [mq]: add_const


 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 }
< prev index next >