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 |