< prev index next >

src/hotspot/os_cpu/solaris_x86/atomic_solaris_x86.hpp

Print this page




  87 
  88 template<>
  89 template<typename T>
  90 inline T Atomic::PlatformXchg<8>::operator()(T volatile* dest,
  91                                              T exchange_value,
  92                                              atomic_memory_order order) const {
  93   STATIC_ASSERT(8 == sizeof(T));
  94   return PrimitiveConversions::cast<T>(
  95     _Atomic_xchg_long(PrimitiveConversions::cast<int64_t>(exchange_value),
  96                       reinterpret_cast<int64_t volatile*>(dest)));
  97 }
  98 
  99 // Not using cmpxchg_using_helper here, because some configurations of
 100 // Solaris compiler don't deal well with passing a "defined in .il"
 101 // function as an argument.  We *should* switch to using gcc-style
 102 // inline assembly, but attempting to do so with Studio 12.4 ran into
 103 // segfaults.
 104 
 105 template<>
 106 template<typename T>
 107 inline T Atomic::PlatformCmpxchg<1>::operator()(T exchange_value,
 108                                                 T volatile* dest,
 109                                                 T compare_value,

 110                                                 atomic_memory_order order) const {
 111   STATIC_ASSERT(1 == sizeof(T));
 112   return PrimitiveConversions::cast<T>(
 113     _Atomic_cmpxchg_byte(PrimitiveConversions::cast<int8_t>(exchange_value),
 114                          reinterpret_cast<int8_t volatile*>(dest),
 115                          PrimitiveConversions::cast<int8_t>(compare_value)));
 116 }
 117 
 118 template<>
 119 template<typename T>
 120 inline T Atomic::PlatformCmpxchg<4>::operator()(T exchange_value,
 121                                                 T volatile* dest,
 122                                                 T compare_value,

 123                                                 atomic_memory_order order) const {
 124   STATIC_ASSERT(4 == sizeof(T));
 125   return PrimitiveConversions::cast<T>(
 126     _Atomic_cmpxchg(PrimitiveConversions::cast<int32_t>(exchange_value),
 127                     reinterpret_cast<int32_t volatile*>(dest),
 128                     PrimitiveConversions::cast<int32_t>(compare_value)));
 129 }
 130 
 131 template<>
 132 template<typename T>
 133 inline T Atomic::PlatformCmpxchg<8>::operator()(T exchange_value,
 134                                                 T volatile* dest,
 135                                                 T compare_value,

 136                                                 atomic_memory_order order) const {
 137   STATIC_ASSERT(8 == sizeof(T));
 138   return PrimitiveConversions::cast<T>(
 139     _Atomic_cmpxchg_long(PrimitiveConversions::cast<int64_t>(exchange_value),
 140                          reinterpret_cast<int64_t volatile*>(dest),
 141                          PrimitiveConversions::cast<int64_t>(compare_value)));
 142 }
 143 
 144 #endif // OS_CPU_SOLARIS_X86_ATOMIC_SOLARIS_X86_HPP


  87 
  88 template<>
  89 template<typename T>
  90 inline T Atomic::PlatformXchg<8>::operator()(T volatile* dest,
  91                                              T exchange_value,
  92                                              atomic_memory_order order) const {
  93   STATIC_ASSERT(8 == sizeof(T));
  94   return PrimitiveConversions::cast<T>(
  95     _Atomic_xchg_long(PrimitiveConversions::cast<int64_t>(exchange_value),
  96                       reinterpret_cast<int64_t volatile*>(dest)));
  97 }
  98 
  99 // Not using cmpxchg_using_helper here, because some configurations of
 100 // Solaris compiler don't deal well with passing a "defined in .il"
 101 // function as an argument.  We *should* switch to using gcc-style
 102 // inline assembly, but attempting to do so with Studio 12.4 ran into
 103 // segfaults.
 104 
 105 template<>
 106 template<typename T>
 107 inline T Atomic::PlatformCmpxchg<1>::operator()(T volatile* dest,

 108                                                 T compare_value,
 109                                                 T exchange_value,
 110                                                 atomic_memory_order order) const {
 111   STATIC_ASSERT(1 == sizeof(T));
 112   return PrimitiveConversions::cast<T>(
 113     _Atomic_cmpxchg_byte(PrimitiveConversions::cast<int8_t>(exchange_value),
 114                          reinterpret_cast<int8_t volatile*>(dest),
 115                          PrimitiveConversions::cast<int8_t>(compare_value)));
 116 }
 117 
 118 template<>
 119 template<typename T>
 120 inline T Atomic::PlatformCmpxchg<4>::operator()(T volatile* dest,

 121                                                 T compare_value,
 122                                                 T exchange_value,
 123                                                 atomic_memory_order order) const {
 124   STATIC_ASSERT(4 == sizeof(T));
 125   return PrimitiveConversions::cast<T>(
 126     _Atomic_cmpxchg(PrimitiveConversions::cast<int32_t>(exchange_value),
 127                     reinterpret_cast<int32_t volatile*>(dest),
 128                     PrimitiveConversions::cast<int32_t>(compare_value)));
 129 }
 130 
 131 template<>
 132 template<typename T>
 133 inline T Atomic::PlatformCmpxchg<8>::operator()(T volatile* dest,

 134                                                 T compare_value,
 135                                                 T exchange_value,
 136                                                 atomic_memory_order order) const {
 137   STATIC_ASSERT(8 == sizeof(T));
 138   return PrimitiveConversions::cast<T>(
 139     _Atomic_cmpxchg_long(PrimitiveConversions::cast<int64_t>(exchange_value),
 140                          reinterpret_cast<int64_t volatile*>(dest),
 141                          PrimitiveConversions::cast<int64_t>(compare_value)));
 142 }
 143 
 144 #endif // OS_CPU_SOLARIS_X86_ATOMIC_SOLARIS_X86_HPP
< prev index next >