| 188 | |
| 189 | #if defined(__mips_n64) || defined(__mips_n32) |
| 190 | static __inline void |
| 191 | atomic_set_64(__volatile uint64_t *p, uint64_t v) |
| 192 | { |
| 193 | uint64_t temp; |
| 194 | |
| 195 | __asm __volatile ( |
| 196 | "1:\n\t" |
| 197 | "lld %0, %3\n\t" /* load old value */ |
| 198 | "or %0, %2, %0\n\t" /* calculate new value */ |
| 199 | "scd %0, %1\n\t" /* attempt to store */ |
| 200 | "beqz %0, 1b\n\t" /* spin if failed */ |
| 201 | : "=&r" (temp), "=m" (*p) |
| 202 | : "r" (v), "m" (*p) |
| 203 | : "memory"); |
| 204 | |
| 205 | } |
| 206 | |
| 207 | static __inline void |
| 208 | atomic_clear_64(__volatile uint64_t *p, uint64_t v) |