152 inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
153 jint rv;
154 __asm__ volatile(
155 " cas [%2], %3, %0"
156 : "=r" (rv)
157 : "0" (exchange_value), "r" (dest), "r" (compare_value)
158 : "memory");
159 return rv;
160 }
161
162 inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value) {
163 #ifdef _LP64
164 jlong rv;
165 __asm__ volatile(
166 " casx [%2], %3, %0"
167 : "=r" (rv)
168 : "0" (exchange_value), "r" (dest), "r" (compare_value)
169 : "memory");
170 return rv;
171 #else
172 assert(VM_Version::v9_instructions_work(), "cas only supported on v9");
173 volatile jlong_accessor evl, cvl, rv;
174 evl.long_value = exchange_value;
175 cvl.long_value = compare_value;
176
177 __asm__ volatile(
178 " sllx %2, 32, %2\n\t"
179 " srl %3, 0, %3\n\t"
180 " or %2, %3, %2\n\t"
181 " sllx %5, 32, %5\n\t"
182 " srl %6, 0, %6\n\t"
183 " or %5, %6, %5\n\t"
184 " casx [%4], %5, %2\n\t"
185 " srl %2, 0, %1\n\t"
186 " srlx %2, 32, %0\n\t"
187 : "=r" (rv.words[0]), "=r" (rv.words[1])
188 : "r" (evl.words[0]), "r" (evl.words[1]), "r" (dest), "r" (cvl.words[0]), "r" (cvl.words[1])
189 : "memory");
190
191 return rv.long_value;
192 #endif
|
152 inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) {
153 jint rv;
154 __asm__ volatile(
155 " cas [%2], %3, %0"
156 : "=r" (rv)
157 : "0" (exchange_value), "r" (dest), "r" (compare_value)
158 : "memory");
159 return rv;
160 }
161
162 inline jlong Atomic::cmpxchg (jlong exchange_value, volatile jlong* dest, jlong compare_value) {
163 #ifdef _LP64
164 jlong rv;
165 __asm__ volatile(
166 " casx [%2], %3, %0"
167 : "=r" (rv)
168 : "0" (exchange_value), "r" (dest), "r" (compare_value)
169 : "memory");
170 return rv;
171 #else
172 volatile jlong_accessor evl, cvl, rv;
173 evl.long_value = exchange_value;
174 cvl.long_value = compare_value;
175
176 __asm__ volatile(
177 " sllx %2, 32, %2\n\t"
178 " srl %3, 0, %3\n\t"
179 " or %2, %3, %2\n\t"
180 " sllx %5, 32, %5\n\t"
181 " srl %6, 0, %6\n\t"
182 " or %5, %6, %5\n\t"
183 " casx [%4], %5, %2\n\t"
184 " srl %2, 0, %1\n\t"
185 " srlx %2, 32, %0\n\t"
186 : "=r" (rv.words[0]), "=r" (rv.words[1])
187 : "r" (evl.words[0]), "r" (evl.words[1]), "r" (dest), "r" (cvl.words[0]), "r" (cvl.words[1])
188 : "memory");
189
190 return rv.long_value;
191 #endif
|