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