< prev index next >

src/hotspot/os_cpu/linux_sparc/atomic_linux_sparc.hpp

Print this page




 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
< prev index next >