diff options
Diffstat (limited to 'arch/mips/include/asm/system.h')
| -rw-r--r-- | arch/mips/include/asm/system.h | 52 |
1 files changed, 24 insertions, 28 deletions
diff --git a/arch/mips/include/asm/system.h b/arch/mips/include/asm/system.h index bb937ccfba1e..6018c80ce37a 100644 --- a/arch/mips/include/asm/system.h +++ b/arch/mips/include/asm/system.h | |||
| @@ -115,21 +115,19 @@ static inline unsigned long __xchg_u32(volatile int * m, unsigned int val) | |||
| 115 | } else if (kernel_uses_llsc) { | 115 | } else if (kernel_uses_llsc) { |
| 116 | unsigned long dummy; | 116 | unsigned long dummy; |
| 117 | 117 | ||
| 118 | __asm__ __volatile__( | 118 | do { |
| 119 | " .set mips3 \n" | 119 | __asm__ __volatile__( |
| 120 | "1: ll %0, %3 # xchg_u32 \n" | 120 | " .set mips3 \n" |
| 121 | " .set mips0 \n" | 121 | " ll %0, %3 # xchg_u32 \n" |
| 122 | " move %2, %z4 \n" | 122 | " .set mips0 \n" |
| 123 | " .set mips3 \n" | 123 | " move %2, %z4 \n" |
| 124 | " sc %2, %1 \n" | 124 | " .set mips3 \n" |
| 125 | " beqz %2, 2f \n" | 125 | " sc %2, %1 \n" |
| 126 | " .subsection 2 \n" | 126 | " .set mips0 \n" |
| 127 | "2: b 1b \n" | 127 | : "=&r" (retval), "=m" (*m), "=&r" (dummy) |
| 128 | " .previous \n" | 128 | : "R" (*m), "Jr" (val) |
| 129 | " .set mips0 \n" | 129 | : "memory"); |
| 130 | : "=&r" (retval), "=m" (*m), "=&r" (dummy) | 130 | } while (unlikely(!dummy)); |
| 131 | : "R" (*m), "Jr" (val) | ||
| 132 | : "memory"); | ||
| 133 | } else { | 131 | } else { |
| 134 | unsigned long flags; | 132 | unsigned long flags; |
| 135 | 133 | ||
| @@ -167,19 +165,17 @@ static inline __u64 __xchg_u64(volatile __u64 * m, __u64 val) | |||
| 167 | } else if (kernel_uses_llsc) { | 165 | } else if (kernel_uses_llsc) { |
| 168 | unsigned long dummy; | 166 | unsigned long dummy; |
| 169 | 167 | ||
| 170 | __asm__ __volatile__( | 168 | do { |
| 171 | " .set mips3 \n" | 169 | __asm__ __volatile__( |
| 172 | "1: lld %0, %3 # xchg_u64 \n" | 170 | " .set mips3 \n" |
| 173 | " move %2, %z4 \n" | 171 | " lld %0, %3 # xchg_u64 \n" |
| 174 | " scd %2, %1 \n" | 172 | " move %2, %z4 \n" |
| 175 | " beqz %2, 2f \n" | 173 | " scd %2, %1 \n" |
| 176 | " .subsection 2 \n" | 174 | " .set mips0 \n" |
| 177 | "2: b 1b \n" | 175 | : "=&r" (retval), "=m" (*m), "=&r" (dummy) |
| 178 | " .previous \n" | 176 | : "R" (*m), "Jr" (val) |
| 179 | " .set mips0 \n" | 177 | : "memory"); |
| 180 | : "=&r" (retval), "=m" (*m), "=&r" (dummy) | 178 | } while (unlikely(!dummy)); |
| 181 | : "R" (*m), "Jr" (val) | ||
| 182 | : "memory"); | ||
| 183 | } else { | 179 | } else { |
| 184 | unsigned long flags; | 180 | unsigned long flags; |
| 185 | 181 | ||
