72 : "r" (dest), "r" (mp) : "cc", "memory");
73 }
74
75 inline void Atomic::dec_ptr(volatile void* dest) {
76 dec_ptr((volatile intptr_t*)dest);
77 }
78
79 inline jint Atomic::xchg (jint exchange_value, volatile jint* dest) {
80 __asm__ volatile ( "xchgl (%2),%0"
81 : "=r" (exchange_value)
82 : "0" (exchange_value), "r" (dest)
83 : "memory");
84 return exchange_value;
85 }
86
87 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
88 return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
89 }
90
91 #define VM_HAS_SPECIALIZED_CMPXCHG_BYTE
92 inline jbyte Atomic::cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value) {
93 int mp = os::is_MP();
94 __asm__ volatile (LOCK_IF_MP(%4) "cmpxchgb %1,(%3)"
95 : "=a" (exchange_value)
96 : "q" (exchange_value), "a" (compare_value), "r" (dest), "r" (mp)
97 : "cc", "memory");
98 return exchange_value;
99 }
100
101 inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
102 int mp = os::is_MP();
103 __asm__ volatile (LOCK_IF_MP(%4) "cmpxchgl %1,(%3)"
104 : "=a" (exchange_value)
105 : "r" (exchange_value), "a" (compare_value), "r" (dest), "r" (mp)
106 : "cc", "memory");
107 return exchange_value;
108 }
109
110 #ifdef AMD64
111 inline void Atomic::store (jlong store_value, jlong* dest) { *dest = store_value; }
112 inline void Atomic::store (jlong store_value, volatile jlong* dest) { *dest = store_value; }
113
114 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
115 intptr_t addend = add_value;
116 bool mp = os::is_MP();
117 __asm__ __volatile__ (LOCK_IF_MP(%3) "xaddq %0,(%2)"
118 : "=r" (addend)
119 : "0" (addend), "r" (dest), "r" (mp)
120 : "cc", "memory");
121 return addend + add_value;
132 : "r" (dest), "r" (mp)
133 : "cc", "memory");
134 }
135
136 inline void Atomic::dec_ptr(volatile intptr_t* dest) {
137 bool mp = os::is_MP();
138 __asm__ __volatile__ (LOCK_IF_MP(%1) "subq $1,(%0)"
139 :
140 : "r" (dest), "r" (mp)
141 : "cc", "memory");
142 }
143
144 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
145 __asm__ __volatile__ ("xchgq (%2),%0"
146 : "=r" (exchange_value)
147 : "0" (exchange_value), "r" (dest)
148 : "memory");
149 return exchange_value;
150 }
151
152 inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value) {
153 bool mp = os::is_MP();
154 __asm__ __volatile__ (LOCK_IF_MP(%4) "cmpxchgq %1,(%3)"
155 : "=a" (exchange_value)
156 : "r" (exchange_value), "a" (compare_value), "r" (dest), "r" (mp)
157 : "cc", "memory");
158 return exchange_value;
159 }
160
161 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value) {
162 return (intptr_t)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value);
163 }
164
165 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value) {
166 return (void*)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value);
167 }
168
169 inline jlong Atomic::load(volatile jlong* src) { return *src; }
170
171 #else // !AMD64
172
173 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
174 return (intptr_t)Atomic::add((jint)add_value, (volatile jint*)dest);
175 }
176
177 inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) {
178 return (void*)Atomic::add((jint)add_value, (volatile jint*)dest);
179 }
180
181
182 inline void Atomic::inc_ptr(volatile intptr_t* dest) {
183 inc((volatile jint*)dest);
184 }
185
186 inline void Atomic::dec_ptr(volatile intptr_t* dest) {
187 dec((volatile jint*)dest);
188 }
189
190 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
191 return (intptr_t)xchg((jint)exchange_value, (volatile jint*)dest);
192 }
193
194 extern "C" {
195 // defined in linux_x86.s
196 jlong _Atomic_cmpxchg_long(jlong, volatile jlong*, jlong, bool);
197 void _Atomic_move_long(volatile jlong* src, volatile jlong* dst);
198 }
199
200 inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value) {
201 return _Atomic_cmpxchg_long(exchange_value, dest, compare_value, os::is_MP());
202 }
203
204 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value) {
205 return (intptr_t)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value);
206 }
207
208 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value) {
209 return (void*)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value);
210 }
211
212 inline jlong Atomic::load(volatile jlong* src) {
213 volatile jlong dest;
214 _Atomic_move_long(src, &dest);
215 return dest;
216 }
217
218 inline void Atomic::store(jlong store_value, jlong* dest) {
219 _Atomic_move_long((volatile jlong*)&store_value, (volatile jlong*)dest);
220 }
221
222 inline void Atomic::store(jlong store_value, volatile jlong* dest) {
223 _Atomic_move_long((volatile jlong*)&store_value, dest);
224 }
225
226 #endif // AMD64
227
228 #endif // OS_CPU_LINUX_X86_VM_ATOMIC_LINUX_X86_INLINE_HPP
|
72 : "r" (dest), "r" (mp) : "cc", "memory");
73 }
74
75 inline void Atomic::dec_ptr(volatile void* dest) {
76 dec_ptr((volatile intptr_t*)dest);
77 }
78
79 inline jint Atomic::xchg (jint exchange_value, volatile jint* dest) {
80 __asm__ volatile ( "xchgl (%2),%0"
81 : "=r" (exchange_value)
82 : "0" (exchange_value), "r" (dest)
83 : "memory");
84 return exchange_value;
85 }
86
87 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
88 return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
89 }
90
91 #define VM_HAS_SPECIALIZED_CMPXCHG_BYTE
92 inline jbyte Atomic::cmpxchg (jbyte exchange_value, volatile jbyte* dest, jbyte compare_value, cmpxchg_memory_order order) {
93 int mp = os::is_MP();
94 __asm__ volatile (LOCK_IF_MP(%4) "cmpxchgb %1,(%3)"
95 : "=a" (exchange_value)
96 : "q" (exchange_value), "a" (compare_value), "r" (dest), "r" (mp)
97 : "cc", "memory");
98 return exchange_value;
99 }
100
101 inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value, cmpxchg_memory_order order) {
102 int mp = os::is_MP();
103 __asm__ volatile (LOCK_IF_MP(%4) "cmpxchgl %1,(%3)"
104 : "=a" (exchange_value)
105 : "r" (exchange_value), "a" (compare_value), "r" (dest), "r" (mp)
106 : "cc", "memory");
107 return exchange_value;
108 }
109
110 #ifdef AMD64
111 inline void Atomic::store (jlong store_value, jlong* dest) { *dest = store_value; }
112 inline void Atomic::store (jlong store_value, volatile jlong* dest) { *dest = store_value; }
113
114 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
115 intptr_t addend = add_value;
116 bool mp = os::is_MP();
117 __asm__ __volatile__ (LOCK_IF_MP(%3) "xaddq %0,(%2)"
118 : "=r" (addend)
119 : "0" (addend), "r" (dest), "r" (mp)
120 : "cc", "memory");
121 return addend + add_value;
132 : "r" (dest), "r" (mp)
133 : "cc", "memory");
134 }
135
136 inline void Atomic::dec_ptr(volatile intptr_t* dest) {
137 bool mp = os::is_MP();
138 __asm__ __volatile__ (LOCK_IF_MP(%1) "subq $1,(%0)"
139 :
140 : "r" (dest), "r" (mp)
141 : "cc", "memory");
142 }
143
144 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
145 __asm__ __volatile__ ("xchgq (%2),%0"
146 : "=r" (exchange_value)
147 : "0" (exchange_value), "r" (dest)
148 : "memory");
149 return exchange_value;
150 }
151
152 inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value, cmpxchg_memory_order order) {
153 bool mp = os::is_MP();
154 __asm__ __volatile__ (LOCK_IF_MP(%4) "cmpxchgq %1,(%3)"
155 : "=a" (exchange_value)
156 : "r" (exchange_value), "a" (compare_value), "r" (dest), "r" (mp)
157 : "cc", "memory");
158 return exchange_value;
159 }
160
161 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value, cmpxchg_memory_order order) {
162 return (intptr_t)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value, order);
163 }
164
165 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value, cmpxchg_memory_order order) {
166 return (void*)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value, order);
167 }
168
169 inline jlong Atomic::load(volatile jlong* src) { return *src; }
170
171 #else // !AMD64
172
173 inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) {
174 return (intptr_t)Atomic::add((jint)add_value, (volatile jint*)dest);
175 }
176
177 inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) {
178 return (void*)Atomic::add((jint)add_value, (volatile jint*)dest);
179 }
180
181
182 inline void Atomic::inc_ptr(volatile intptr_t* dest) {
183 inc((volatile jint*)dest);
184 }
185
186 inline void Atomic::dec_ptr(volatile intptr_t* dest) {
187 dec((volatile jint*)dest);
188 }
189
190 inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) {
191 return (intptr_t)xchg((jint)exchange_value, (volatile jint*)dest);
192 }
193
194 extern "C" {
195 // defined in linux_x86.s
196 jlong _Atomic_cmpxchg_long(jlong, volatile jlong*, jlong, bool);
197 void _Atomic_move_long(volatile jlong* src, volatile jlong* dst);
198 }
199
200 inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value, cmpxchg_memory_order order) {
201 return _Atomic_cmpxchg_long(exchange_value, dest, compare_value, os::is_MP());
202 }
203
204 inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value, cmpxchg_memory_order order) {
205 return (intptr_t)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value, order);
206 }
207
208 inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value, cmpxchg_memory_order order) {
209 return (void*)cmpxchg((jint)exchange_value, (volatile jint*)dest, (jint)compare_value, order);
210 }
211
212 inline jlong Atomic::load(volatile jlong* src) {
213 volatile jlong dest;
214 _Atomic_move_long(src, &dest);
215 return dest;
216 }
217
218 inline void Atomic::store(jlong store_value, jlong* dest) {
219 _Atomic_move_long((volatile jlong*)&store_value, (volatile jlong*)dest);
220 }
221
222 inline void Atomic::store(jlong store_value, volatile jlong* dest) {
223 _Atomic_move_long((volatile jlong*)&store_value, dest);
224 }
225
226 #endif // AMD64
227
228 #endif // OS_CPU_LINUX_X86_VM_ATOMIC_LINUX_X86_INLINE_HPP
|