diff options
Diffstat (limited to 'arch/mips/include/asm/bitops.h')
-rw-r--r-- | arch/mips/include/asm/bitops.h | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/arch/mips/include/asm/bitops.h b/arch/mips/include/asm/bitops.h index bae6b0fa8ab5..6663bcca9d0c 100644 --- a/arch/mips/include/asm/bitops.h +++ b/arch/mips/include/asm/bitops.h | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/types.h> | 17 | #include <linux/types.h> |
18 | #include <asm/barrier.h> | 18 | #include <asm/barrier.h> |
19 | #include <asm/byteorder.h> /* sigh ... */ | 19 | #include <asm/byteorder.h> /* sigh ... */ |
20 | #include <asm/compiler.h> | ||
20 | #include <asm/cpu-features.h> | 21 | #include <asm/cpu-features.h> |
21 | #include <asm/sgidefs.h> | 22 | #include <asm/sgidefs.h> |
22 | #include <asm/war.h> | 23 | #include <asm/war.h> |
@@ -78,8 +79,8 @@ static inline void set_bit(unsigned long nr, volatile unsigned long *addr) | |||
78 | " " __SC "%0, %1 \n" | 79 | " " __SC "%0, %1 \n" |
79 | " beqzl %0, 1b \n" | 80 | " beqzl %0, 1b \n" |
80 | " .set mips0 \n" | 81 | " .set mips0 \n" |
81 | : "=&r" (temp), "=m" (*m) | 82 | : "=&r" (temp), "=" GCC_OFF12_ASM() (*m) |
82 | : "ir" (1UL << bit), "m" (*m)); | 83 | : "ir" (1UL << bit), GCC_OFF12_ASM() (*m)); |
83 | #ifdef CONFIG_CPU_MIPSR2 | 84 | #ifdef CONFIG_CPU_MIPSR2 |
84 | } else if (kernel_uses_llsc && __builtin_constant_p(bit)) { | 85 | } else if (kernel_uses_llsc && __builtin_constant_p(bit)) { |
85 | do { | 86 | do { |
@@ -87,7 +88,7 @@ static inline void set_bit(unsigned long nr, volatile unsigned long *addr) | |||
87 | " " __LL "%0, %1 # set_bit \n" | 88 | " " __LL "%0, %1 # set_bit \n" |
88 | " " __INS "%0, %3, %2, 1 \n" | 89 | " " __INS "%0, %3, %2, 1 \n" |
89 | " " __SC "%0, %1 \n" | 90 | " " __SC "%0, %1 \n" |
90 | : "=&r" (temp), "+m" (*m) | 91 | : "=&r" (temp), "+" GCC_OFF12_ASM() (*m) |
91 | : "ir" (bit), "r" (~0)); | 92 | : "ir" (bit), "r" (~0)); |
92 | } while (unlikely(!temp)); | 93 | } while (unlikely(!temp)); |
93 | #endif /* CONFIG_CPU_MIPSR2 */ | 94 | #endif /* CONFIG_CPU_MIPSR2 */ |
@@ -99,7 +100,7 @@ static inline void set_bit(unsigned long nr, volatile unsigned long *addr) | |||
99 | " or %0, %2 \n" | 100 | " or %0, %2 \n" |
100 | " " __SC "%0, %1 \n" | 101 | " " __SC "%0, %1 \n" |
101 | " .set mips0 \n" | 102 | " .set mips0 \n" |
102 | : "=&r" (temp), "+m" (*m) | 103 | : "=&r" (temp), "+" GCC_OFF12_ASM() (*m) |
103 | : "ir" (1UL << bit)); | 104 | : "ir" (1UL << bit)); |
104 | } while (unlikely(!temp)); | 105 | } while (unlikely(!temp)); |
105 | } else | 106 | } else |
@@ -130,7 +131,7 @@ static inline void clear_bit(unsigned long nr, volatile unsigned long *addr) | |||
130 | " " __SC "%0, %1 \n" | 131 | " " __SC "%0, %1 \n" |
131 | " beqzl %0, 1b \n" | 132 | " beqzl %0, 1b \n" |
132 | " .set mips0 \n" | 133 | " .set mips0 \n" |
133 | : "=&r" (temp), "+m" (*m) | 134 | : "=&r" (temp), "+" GCC_OFF12_ASM() (*m) |
134 | : "ir" (~(1UL << bit))); | 135 | : "ir" (~(1UL << bit))); |
135 | #ifdef CONFIG_CPU_MIPSR2 | 136 | #ifdef CONFIG_CPU_MIPSR2 |
136 | } else if (kernel_uses_llsc && __builtin_constant_p(bit)) { | 137 | } else if (kernel_uses_llsc && __builtin_constant_p(bit)) { |
@@ -139,7 +140,7 @@ static inline void clear_bit(unsigned long nr, volatile unsigned long *addr) | |||
139 | " " __LL "%0, %1 # clear_bit \n" | 140 | " " __LL "%0, %1 # clear_bit \n" |
140 | " " __INS "%0, $0, %2, 1 \n" | 141 | " " __INS "%0, $0, %2, 1 \n" |
141 | " " __SC "%0, %1 \n" | 142 | " " __SC "%0, %1 \n" |
142 | : "=&r" (temp), "+m" (*m) | 143 | : "=&r" (temp), "+" GCC_OFF12_ASM() (*m) |
143 | : "ir" (bit)); | 144 | : "ir" (bit)); |
144 | } while (unlikely(!temp)); | 145 | } while (unlikely(!temp)); |
145 | #endif /* CONFIG_CPU_MIPSR2 */ | 146 | #endif /* CONFIG_CPU_MIPSR2 */ |
@@ -151,7 +152,7 @@ static inline void clear_bit(unsigned long nr, volatile unsigned long *addr) | |||
151 | " and %0, %2 \n" | 152 | " and %0, %2 \n" |
152 | " " __SC "%0, %1 \n" | 153 | " " __SC "%0, %1 \n" |
153 | " .set mips0 \n" | 154 | " .set mips0 \n" |
154 | : "=&r" (temp), "+m" (*m) | 155 | : "=&r" (temp), "+" GCC_OFF12_ASM() (*m) |
155 | : "ir" (~(1UL << bit))); | 156 | : "ir" (~(1UL << bit))); |
156 | } while (unlikely(!temp)); | 157 | } while (unlikely(!temp)); |
157 | } else | 158 | } else |
@@ -196,7 +197,7 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *addr) | |||
196 | " " __SC "%0, %1 \n" | 197 | " " __SC "%0, %1 \n" |
197 | " beqzl %0, 1b \n" | 198 | " beqzl %0, 1b \n" |
198 | " .set mips0 \n" | 199 | " .set mips0 \n" |
199 | : "=&r" (temp), "+m" (*m) | 200 | : "=&r" (temp), "+" GCC_OFF12_ASM() (*m) |
200 | : "ir" (1UL << bit)); | 201 | : "ir" (1UL << bit)); |
201 | } else if (kernel_uses_llsc) { | 202 | } else if (kernel_uses_llsc) { |
202 | unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); | 203 | unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); |
@@ -209,7 +210,7 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *addr) | |||
209 | " xor %0, %2 \n" | 210 | " xor %0, %2 \n" |
210 | " " __SC "%0, %1 \n" | 211 | " " __SC "%0, %1 \n" |
211 | " .set mips0 \n" | 212 | " .set mips0 \n" |
212 | : "=&r" (temp), "+m" (*m) | 213 | : "=&r" (temp), "+" GCC_OFF12_ASM() (*m) |
213 | : "ir" (1UL << bit)); | 214 | : "ir" (1UL << bit)); |
214 | } while (unlikely(!temp)); | 215 | } while (unlikely(!temp)); |
215 | } else | 216 | } else |
@@ -244,7 +245,7 @@ static inline int test_and_set_bit(unsigned long nr, | |||
244 | " beqzl %2, 1b \n" | 245 | " beqzl %2, 1b \n" |
245 | " and %2, %0, %3 \n" | 246 | " and %2, %0, %3 \n" |
246 | " .set mips0 \n" | 247 | " .set mips0 \n" |
247 | : "=&r" (temp), "+m" (*m), "=&r" (res) | 248 | : "=&r" (temp), "+" GCC_OFF12_ASM() (*m), "=&r" (res) |
248 | : "r" (1UL << bit) | 249 | : "r" (1UL << bit) |
249 | : "memory"); | 250 | : "memory"); |
250 | } else if (kernel_uses_llsc) { | 251 | } else if (kernel_uses_llsc) { |
@@ -258,7 +259,7 @@ static inline int test_and_set_bit(unsigned long nr, | |||
258 | " or %2, %0, %3 \n" | 259 | " or %2, %0, %3 \n" |
259 | " " __SC "%2, %1 \n" | 260 | " " __SC "%2, %1 \n" |
260 | " .set mips0 \n" | 261 | " .set mips0 \n" |
261 | : "=&r" (temp), "+m" (*m), "=&r" (res) | 262 | : "=&r" (temp), "+" GCC_OFF12_ASM() (*m), "=&r" (res) |
262 | : "r" (1UL << bit) | 263 | : "r" (1UL << bit) |
263 | : "memory"); | 264 | : "memory"); |
264 | } while (unlikely(!res)); | 265 | } while (unlikely(!res)); |
@@ -312,7 +313,7 @@ static inline int test_and_set_bit_lock(unsigned long nr, | |||
312 | " or %2, %0, %3 \n" | 313 | " or %2, %0, %3 \n" |
313 | " " __SC "%2, %1 \n" | 314 | " " __SC "%2, %1 \n" |
314 | " .set mips0 \n" | 315 | " .set mips0 \n" |
315 | : "=&r" (temp), "+m" (*m), "=&r" (res) | 316 | : "=&r" (temp), "+" GCC_OFF12_ASM() (*m), "=&r" (res) |
316 | : "r" (1UL << bit) | 317 | : "r" (1UL << bit) |
317 | : "memory"); | 318 | : "memory"); |
318 | } while (unlikely(!res)); | 319 | } while (unlikely(!res)); |
@@ -354,7 +355,7 @@ static inline int test_and_clear_bit(unsigned long nr, | |||
354 | " beqzl %2, 1b \n" | 355 | " beqzl %2, 1b \n" |
355 | " and %2, %0, %3 \n" | 356 | " and %2, %0, %3 \n" |
356 | " .set mips0 \n" | 357 | " .set mips0 \n" |
357 | : "=&r" (temp), "+m" (*m), "=&r" (res) | 358 | : "=&r" (temp), "+" GCC_OFF12_ASM() (*m), "=&r" (res) |
358 | : "r" (1UL << bit) | 359 | : "r" (1UL << bit) |
359 | : "memory"); | 360 | : "memory"); |
360 | #ifdef CONFIG_CPU_MIPSR2 | 361 | #ifdef CONFIG_CPU_MIPSR2 |
@@ -368,7 +369,7 @@ static inline int test_and_clear_bit(unsigned long nr, | |||
368 | " " __EXT "%2, %0, %3, 1 \n" | 369 | " " __EXT "%2, %0, %3, 1 \n" |
369 | " " __INS "%0, $0, %3, 1 \n" | 370 | " " __INS "%0, $0, %3, 1 \n" |
370 | " " __SC "%0, %1 \n" | 371 | " " __SC "%0, %1 \n" |
371 | : "=&r" (temp), "+m" (*m), "=&r" (res) | 372 | : "=&r" (temp), "+" GCC_OFF12_ASM() (*m), "=&r" (res) |
372 | : "ir" (bit) | 373 | : "ir" (bit) |
373 | : "memory"); | 374 | : "memory"); |
374 | } while (unlikely(!temp)); | 375 | } while (unlikely(!temp)); |
@@ -385,7 +386,7 @@ static inline int test_and_clear_bit(unsigned long nr, | |||
385 | " xor %2, %3 \n" | 386 | " xor %2, %3 \n" |
386 | " " __SC "%2, %1 \n" | 387 | " " __SC "%2, %1 \n" |
387 | " .set mips0 \n" | 388 | " .set mips0 \n" |
388 | : "=&r" (temp), "+m" (*m), "=&r" (res) | 389 | : "=&r" (temp), "+" GCC_OFF12_ASM() (*m), "=&r" (res) |
389 | : "r" (1UL << bit) | 390 | : "r" (1UL << bit) |
390 | : "memory"); | 391 | : "memory"); |
391 | } while (unlikely(!res)); | 392 | } while (unlikely(!res)); |
@@ -427,7 +428,7 @@ static inline int test_and_change_bit(unsigned long nr, | |||
427 | " beqzl %2, 1b \n" | 428 | " beqzl %2, 1b \n" |
428 | " and %2, %0, %3 \n" | 429 | " and %2, %0, %3 \n" |
429 | " .set mips0 \n" | 430 | " .set mips0 \n" |
430 | : "=&r" (temp), "+m" (*m), "=&r" (res) | 431 | : "=&r" (temp), "+" GCC_OFF12_ASM() (*m), "=&r" (res) |
431 | : "r" (1UL << bit) | 432 | : "r" (1UL << bit) |
432 | : "memory"); | 433 | : "memory"); |
433 | } else if (kernel_uses_llsc) { | 434 | } else if (kernel_uses_llsc) { |
@@ -441,7 +442,7 @@ static inline int test_and_change_bit(unsigned long nr, | |||
441 | " xor %2, %0, %3 \n" | 442 | " xor %2, %0, %3 \n" |
442 | " " __SC "\t%2, %1 \n" | 443 | " " __SC "\t%2, %1 \n" |
443 | " .set mips0 \n" | 444 | " .set mips0 \n" |
444 | : "=&r" (temp), "+m" (*m), "=&r" (res) | 445 | : "=&r" (temp), "+" GCC_OFF12_ASM() (*m), "=&r" (res) |
445 | : "r" (1UL << bit) | 446 | : "r" (1UL << bit) |
446 | : "memory"); | 447 | : "memory"); |
447 | } while (unlikely(!res)); | 448 | } while (unlikely(!res)); |