src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp

Print this page




 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