107 "1:\n\t" 108 " mov %1, %%o3\n\t" 109 " ldx [%2], %%o2\n\t" 110 " casx [%2], %%o2, %%o3\n\t" 111 " cmp %%o2, %%o3\n\t" 112 " bne %%xcc, 1b\n\t" 113 " nop\n\t" 114 " mov %%o2, %0\n\t" 115 : "=r" (rv) 116 : "r" (exchange_value), "r" (dest) 117 : "memory", "o2", "o3"); 118 return rv; 119 } 120 121 // No direct support for cmpxchg of bytes; emulate using int. 122 template<> 123 struct Atomic::PlatformCmpxchg<1> : Atomic::CmpxchgByteUsingInt {}; 124 125 template<> 126 template<typename T> 127 inline T Atomic::PlatformCmpxchg<4>::operator()(T exchange_value, 128 T volatile* dest, 129 T compare_value, 130 atomic_memory_order order) const { 131 STATIC_ASSERT(4 == sizeof(T)); 132 T rv; 133 __asm__ volatile( 134 " cas [%2], %3, %0" 135 : "=r" (rv) 136 : "0" (exchange_value), "r" (dest), "r" (compare_value) 137 : "memory"); 138 return rv; 139 } 140 141 template<> 142 template<typename T> 143 inline T Atomic::PlatformCmpxchg<8>::operator()(T exchange_value, 144 T volatile* dest, 145 T compare_value, 146 atomic_memory_order order) const { 147 STATIC_ASSERT(8 == sizeof(T)); 148 T rv; 149 __asm__ volatile( 150 " casx [%2], %3, %0" 151 : "=r" (rv) 152 : "0" (exchange_value), "r" (dest), "r" (compare_value) 153 : "memory"); 154 return rv; 155 } 156 157 #endif // OS_CPU_LINUX_SPARC_ATOMIC_LINUX_SPARC_HPP | 107 "1:\n\t" 108 " mov %1, %%o3\n\t" 109 " ldx [%2], %%o2\n\t" 110 " casx [%2], %%o2, %%o3\n\t" 111 " cmp %%o2, %%o3\n\t" 112 " bne %%xcc, 1b\n\t" 113 " nop\n\t" 114 " mov %%o2, %0\n\t" 115 : "=r" (rv) 116 : "r" (exchange_value), "r" (dest) 117 : "memory", "o2", "o3"); 118 return rv; 119 } 120 121 // No direct support for cmpxchg of bytes; emulate using int. 122 template<> 123 struct Atomic::PlatformCmpxchg<1> : Atomic::CmpxchgByteUsingInt {}; 124 125 template<> 126 template<typename T> 127 inline T Atomic::PlatformCmpxchg<4>::operator()(T volatile* dest, 128 T compare_value, 129 T exchange_value, 130 atomic_memory_order order) const { 131 STATIC_ASSERT(4 == sizeof(T)); 132 T rv; 133 __asm__ volatile( 134 " cas [%2], %3, %0" 135 : "=r" (rv) 136 : "0" (exchange_value), "r" (dest), "r" (compare_value) 137 : "memory"); 138 return rv; 139 } 140 141 template<> 142 template<typename T> 143 inline T Atomic::PlatformCmpxchg<8>::operator()(T volatile* dest, 144 T compare_value, 145 T exchange_value, 146 atomic_memory_order order) const { 147 STATIC_ASSERT(8 == sizeof(T)); 148 T rv; 149 __asm__ volatile( 150 " casx [%2], %3, %0" 151 : "=r" (rv) 152 : "0" (exchange_value), "r" (dest), "r" (compare_value) 153 : "memory"); 154 return rv; 155 } 156 157 #endif // OS_CPU_LINUX_SPARC_ATOMIC_LINUX_SPARC_HPP |