src/hotspot/os_cpu/solaris_sparc/atomic_solaris_sparc.hpp
changeset 59252 623722a6aeb9
parent 59251 4cbfa5077d68
equal deleted inserted replaced
59251:4cbfa5077d68 59252:623722a6aeb9
    33   template<typename D, typename I>
    33   template<typename D, typename I>
    34   inline D operator()(D volatile* dest, I add_value, atomic_memory_order order) const {
    34   inline D operator()(D volatile* dest, I add_value, atomic_memory_order order) const {
    35     D old_value = *dest;
    35     D old_value = *dest;
    36     while (true) {
    36     while (true) {
    37       D new_value = old_value + add_value;
    37       D new_value = old_value + add_value;
    38       D result = cmpxchg(new_value, dest, old_value);
    38       D result = cmpxchg(dest, old_value, new_value);
    39       if (result == old_value) break;
    39       if (result == old_value) break;
    40       old_value = result;
    40       old_value = result;
    41     }
    41     }
    42     return old_value + add_value;
    42     return old_value + add_value;
    43   }
    43   }
    62                                              T exchange_value,
    62                                              T exchange_value,
    63                                              atomic_memory_order order) const {
    63                                              atomic_memory_order order) const {
    64   STATIC_ASSERT(8 == sizeof(T));
    64   STATIC_ASSERT(8 == sizeof(T));
    65   T old_value = *dest;
    65   T old_value = *dest;
    66   while (true) {
    66   while (true) {
    67     T result = cmpxchg(exchange_value, dest, old_value);
    67     T result = cmpxchg(dest, old_value, exchange_value);
    68     if (result == old_value) break;
    68     if (result == old_value) break;
    69     old_value = result;
    69     old_value = result;
    70   }
    70   }
    71   return old_value;
    71   return old_value;
    72 }
    72 }
    75 template<>
    75 template<>
    76 struct Atomic::PlatformCmpxchg<1> : Atomic::CmpxchgByteUsingInt {};
    76 struct Atomic::PlatformCmpxchg<1> : Atomic::CmpxchgByteUsingInt {};
    77 
    77 
    78 template<>
    78 template<>
    79 template<typename T>
    79 template<typename T>
    80 inline T Atomic::PlatformCmpxchg<4>::operator()(T exchange_value,
    80 inline T Atomic::PlatformCmpxchg<4>::operator()(T volatile* dest,
    81                                                 T volatile* dest,
       
    82                                                 T compare_value,
    81                                                 T compare_value,
       
    82                                                 T exchange_value,
    83                                                 atomic_memory_order order) const {
    83                                                 atomic_memory_order order) const {
    84   STATIC_ASSERT(4 == sizeof(T));
    84   STATIC_ASSERT(4 == sizeof(T));
    85   T rv;
    85   T rv;
    86   __asm__ volatile(
    86   __asm__ volatile(
    87     " cas    [%2], %3, %0"
    87     " cas    [%2], %3, %0"
    91   return rv;
    91   return rv;
    92 }
    92 }
    93 
    93 
    94 template<>
    94 template<>
    95 template<typename T>
    95 template<typename T>
    96 inline T Atomic::PlatformCmpxchg<8>::operator()(T exchange_value,
    96 inline T Atomic::PlatformCmpxchg<8>::operator()(T volatile* dest,
    97                                                 T volatile* dest,
       
    98                                                 T compare_value,
    97                                                 T compare_value,
       
    98                                                 T exchange_value,
    99                                                 atomic_memory_order order) const {
    99                                                 atomic_memory_order order) const {
   100   STATIC_ASSERT(8 == sizeof(T));
   100   STATIC_ASSERT(8 == sizeof(T));
   101   T rv;
   101   T rv;
   102   __asm__ volatile(
   102   __asm__ volatile(
   103     " casx   [%2], %3, %0"
   103     " casx   [%2], %3, %0"