diff options
Diffstat (limited to 'include/asm-mips/atomic.h')
-rw-r--r-- | include/asm-mips/atomic.h | 90 |
1 files changed, 60 insertions, 30 deletions
diff --git a/include/asm-mips/atomic.h b/include/asm-mips/atomic.h index c1a2409bb52a..1ac50b6c47ad 100644 --- a/include/asm-mips/atomic.h +++ b/include/asm-mips/atomic.h | |||
@@ -69,16 +69,19 @@ static __inline__ void atomic_add(int i, atomic_t * v) | |||
69 | "1: ll %0, %1 # atomic_add \n" | 69 | "1: ll %0, %1 # atomic_add \n" |
70 | " addu %0, %2 \n" | 70 | " addu %0, %2 \n" |
71 | " sc %0, %1 \n" | 71 | " sc %0, %1 \n" |
72 | " beqz %0, 1b \n" | 72 | " beqz %0, 2f \n" |
73 | " .subsection 2 \n" | ||
74 | "2: b 1b \n" | ||
75 | " .previous \n" | ||
73 | " .set mips0 \n" | 76 | " .set mips0 \n" |
74 | : "=&r" (temp), "=m" (v->counter) | 77 | : "=&r" (temp), "=m" (v->counter) |
75 | : "Ir" (i), "m" (v->counter)); | 78 | : "Ir" (i), "m" (v->counter)); |
76 | } else { | 79 | } else { |
77 | unsigned long flags; | 80 | unsigned long flags; |
78 | 81 | ||
79 | local_irq_save(flags); | 82 | raw_local_irq_save(flags); |
80 | v->counter += i; | 83 | v->counter += i; |
81 | local_irq_restore(flags); | 84 | raw_local_irq_restore(flags); |
82 | } | 85 | } |
83 | } | 86 | } |
84 | 87 | ||
@@ -111,16 +114,19 @@ static __inline__ void atomic_sub(int i, atomic_t * v) | |||
111 | "1: ll %0, %1 # atomic_sub \n" | 114 | "1: ll %0, %1 # atomic_sub \n" |
112 | " subu %0, %2 \n" | 115 | " subu %0, %2 \n" |
113 | " sc %0, %1 \n" | 116 | " sc %0, %1 \n" |
114 | " beqz %0, 1b \n" | 117 | " beqz %0, 2f \n" |
118 | " .subsection 2 \n" | ||
119 | "2: b 1b \n" | ||
120 | " .previous \n" | ||
115 | " .set mips0 \n" | 121 | " .set mips0 \n" |
116 | : "=&r" (temp), "=m" (v->counter) | 122 | : "=&r" (temp), "=m" (v->counter) |
117 | : "Ir" (i), "m" (v->counter)); | 123 | : "Ir" (i), "m" (v->counter)); |
118 | } else { | 124 | } else { |
119 | unsigned long flags; | 125 | unsigned long flags; |
120 | 126 | ||
121 | local_irq_save(flags); | 127 | raw_local_irq_save(flags); |
122 | v->counter -= i; | 128 | v->counter -= i; |
123 | local_irq_restore(flags); | 129 | raw_local_irq_restore(flags); |
124 | } | 130 | } |
125 | } | 131 | } |
126 | 132 | ||
@@ -155,8 +161,11 @@ static __inline__ int atomic_add_return(int i, atomic_t * v) | |||
155 | "1: ll %1, %2 # atomic_add_return \n" | 161 | "1: ll %1, %2 # atomic_add_return \n" |
156 | " addu %0, %1, %3 \n" | 162 | " addu %0, %1, %3 \n" |
157 | " sc %0, %2 \n" | 163 | " sc %0, %2 \n" |
158 | " beqz %0, 1b \n" | 164 | " beqz %0, 2f \n" |
159 | " addu %0, %1, %3 \n" | 165 | " addu %0, %1, %3 \n" |
166 | " .subsection 2 \n" | ||
167 | "2: b 1b \n" | ||
168 | " .previous \n" | ||
160 | " .set mips0 \n" | 169 | " .set mips0 \n" |
161 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) | 170 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) |
162 | : "Ir" (i), "m" (v->counter) | 171 | : "Ir" (i), "m" (v->counter) |
@@ -164,11 +173,11 @@ static __inline__ int atomic_add_return(int i, atomic_t * v) | |||
164 | } else { | 173 | } else { |
165 | unsigned long flags; | 174 | unsigned long flags; |
166 | 175 | ||
167 | local_irq_save(flags); | 176 | raw_local_irq_save(flags); |
168 | result = v->counter; | 177 | result = v->counter; |
169 | result += i; | 178 | result += i; |
170 | v->counter = result; | 179 | v->counter = result; |
171 | local_irq_restore(flags); | 180 | raw_local_irq_restore(flags); |
172 | } | 181 | } |
173 | 182 | ||
174 | smp_mb(); | 183 | smp_mb(); |
@@ -204,8 +213,11 @@ static __inline__ int atomic_sub_return(int i, atomic_t * v) | |||
204 | "1: ll %1, %2 # atomic_sub_return \n" | 213 | "1: ll %1, %2 # atomic_sub_return \n" |
205 | " subu %0, %1, %3 \n" | 214 | " subu %0, %1, %3 \n" |
206 | " sc %0, %2 \n" | 215 | " sc %0, %2 \n" |
207 | " beqz %0, 1b \n" | 216 | " beqz %0, 2f \n" |
208 | " subu %0, %1, %3 \n" | 217 | " subu %0, %1, %3 \n" |
218 | " .subsection 2 \n" | ||
219 | "2: b 1b \n" | ||
220 | " .previous \n" | ||
209 | " .set mips0 \n" | 221 | " .set mips0 \n" |
210 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) | 222 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) |
211 | : "Ir" (i), "m" (v->counter) | 223 | : "Ir" (i), "m" (v->counter) |
@@ -213,11 +225,11 @@ static __inline__ int atomic_sub_return(int i, atomic_t * v) | |||
213 | } else { | 225 | } else { |
214 | unsigned long flags; | 226 | unsigned long flags; |
215 | 227 | ||
216 | local_irq_save(flags); | 228 | raw_local_irq_save(flags); |
217 | result = v->counter; | 229 | result = v->counter; |
218 | result -= i; | 230 | result -= i; |
219 | v->counter = result; | 231 | v->counter = result; |
220 | local_irq_restore(flags); | 232 | raw_local_irq_restore(flags); |
221 | } | 233 | } |
222 | 234 | ||
223 | smp_mb(); | 235 | smp_mb(); |
@@ -267,10 +279,13 @@ static __inline__ int atomic_sub_if_positive(int i, atomic_t * v) | |||
267 | " bltz %0, 1f \n" | 279 | " bltz %0, 1f \n" |
268 | " sc %0, %2 \n" | 280 | " sc %0, %2 \n" |
269 | " .set noreorder \n" | 281 | " .set noreorder \n" |
270 | " beqz %0, 1b \n" | 282 | " beqz %0, 2f \n" |
271 | " subu %0, %1, %3 \n" | 283 | " subu %0, %1, %3 \n" |
272 | " .set reorder \n" | 284 | " .set reorder \n" |
273 | "1: \n" | 285 | "1: \n" |
286 | " .subsection 2 \n" | ||
287 | "2: b 1b \n" | ||
288 | " .previous \n" | ||
274 | " .set mips0 \n" | 289 | " .set mips0 \n" |
275 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) | 290 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) |
276 | : "Ir" (i), "m" (v->counter) | 291 | : "Ir" (i), "m" (v->counter) |
@@ -278,12 +293,12 @@ static __inline__ int atomic_sub_if_positive(int i, atomic_t * v) | |||
278 | } else { | 293 | } else { |
279 | unsigned long flags; | 294 | unsigned long flags; |
280 | 295 | ||
281 | local_irq_save(flags); | 296 | raw_local_irq_save(flags); |
282 | result = v->counter; | 297 | result = v->counter; |
283 | result -= i; | 298 | result -= i; |
284 | if (result >= 0) | 299 | if (result >= 0) |
285 | v->counter = result; | 300 | v->counter = result; |
286 | local_irq_restore(flags); | 301 | raw_local_irq_restore(flags); |
287 | } | 302 | } |
288 | 303 | ||
289 | smp_mb(); | 304 | smp_mb(); |
@@ -429,16 +444,19 @@ static __inline__ void atomic64_add(long i, atomic64_t * v) | |||
429 | "1: lld %0, %1 # atomic64_add \n" | 444 | "1: lld %0, %1 # atomic64_add \n" |
430 | " addu %0, %2 \n" | 445 | " addu %0, %2 \n" |
431 | " scd %0, %1 \n" | 446 | " scd %0, %1 \n" |
432 | " beqz %0, 1b \n" | 447 | " beqz %0, 2f \n" |
448 | " .subsection 2 \n" | ||
449 | "2: b 1b \n" | ||
450 | " .previous \n" | ||
433 | " .set mips0 \n" | 451 | " .set mips0 \n" |
434 | : "=&r" (temp), "=m" (v->counter) | 452 | : "=&r" (temp), "=m" (v->counter) |
435 | : "Ir" (i), "m" (v->counter)); | 453 | : "Ir" (i), "m" (v->counter)); |
436 | } else { | 454 | } else { |
437 | unsigned long flags; | 455 | unsigned long flags; |
438 | 456 | ||
439 | local_irq_save(flags); | 457 | raw_local_irq_save(flags); |
440 | v->counter += i; | 458 | v->counter += i; |
441 | local_irq_restore(flags); | 459 | raw_local_irq_restore(flags); |
442 | } | 460 | } |
443 | } | 461 | } |
444 | 462 | ||
@@ -471,16 +489,19 @@ static __inline__ void atomic64_sub(long i, atomic64_t * v) | |||
471 | "1: lld %0, %1 # atomic64_sub \n" | 489 | "1: lld %0, %1 # atomic64_sub \n" |
472 | " subu %0, %2 \n" | 490 | " subu %0, %2 \n" |
473 | " scd %0, %1 \n" | 491 | " scd %0, %1 \n" |
474 | " beqz %0, 1b \n" | 492 | " beqz %0, 2f \n" |
493 | " .subsection 2 \n" | ||
494 | "2: b 1b \n" | ||
495 | " .previous \n" | ||
475 | " .set mips0 \n" | 496 | " .set mips0 \n" |
476 | : "=&r" (temp), "=m" (v->counter) | 497 | : "=&r" (temp), "=m" (v->counter) |
477 | : "Ir" (i), "m" (v->counter)); | 498 | : "Ir" (i), "m" (v->counter)); |
478 | } else { | 499 | } else { |
479 | unsigned long flags; | 500 | unsigned long flags; |
480 | 501 | ||
481 | local_irq_save(flags); | 502 | raw_local_irq_save(flags); |
482 | v->counter -= i; | 503 | v->counter -= i; |
483 | local_irq_restore(flags); | 504 | raw_local_irq_restore(flags); |
484 | } | 505 | } |
485 | } | 506 | } |
486 | 507 | ||
@@ -515,8 +536,11 @@ static __inline__ long atomic64_add_return(long i, atomic64_t * v) | |||
515 | "1: lld %1, %2 # atomic64_add_return \n" | 536 | "1: lld %1, %2 # atomic64_add_return \n" |
516 | " addu %0, %1, %3 \n" | 537 | " addu %0, %1, %3 \n" |
517 | " scd %0, %2 \n" | 538 | " scd %0, %2 \n" |
518 | " beqz %0, 1b \n" | 539 | " beqz %0, 2f \n" |
519 | " addu %0, %1, %3 \n" | 540 | " addu %0, %1, %3 \n" |
541 | " .subsection 2 \n" | ||
542 | "2: b 1b \n" | ||
543 | " .previous \n" | ||
520 | " .set mips0 \n" | 544 | " .set mips0 \n" |
521 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) | 545 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) |
522 | : "Ir" (i), "m" (v->counter) | 546 | : "Ir" (i), "m" (v->counter) |
@@ -524,11 +548,11 @@ static __inline__ long atomic64_add_return(long i, atomic64_t * v) | |||
524 | } else { | 548 | } else { |
525 | unsigned long flags; | 549 | unsigned long flags; |
526 | 550 | ||
527 | local_irq_save(flags); | 551 | raw_local_irq_save(flags); |
528 | result = v->counter; | 552 | result = v->counter; |
529 | result += i; | 553 | result += i; |
530 | v->counter = result; | 554 | v->counter = result; |
531 | local_irq_restore(flags); | 555 | raw_local_irq_restore(flags); |
532 | } | 556 | } |
533 | 557 | ||
534 | smp_mb(); | 558 | smp_mb(); |
@@ -564,8 +588,11 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t * v) | |||
564 | "1: lld %1, %2 # atomic64_sub_return \n" | 588 | "1: lld %1, %2 # atomic64_sub_return \n" |
565 | " subu %0, %1, %3 \n" | 589 | " subu %0, %1, %3 \n" |
566 | " scd %0, %2 \n" | 590 | " scd %0, %2 \n" |
567 | " beqz %0, 1b \n" | 591 | " beqz %0, 2f \n" |
568 | " subu %0, %1, %3 \n" | 592 | " subu %0, %1, %3 \n" |
593 | " .subsection 2 \n" | ||
594 | "2: b 1b \n" | ||
595 | " .previous \n" | ||
569 | " .set mips0 \n" | 596 | " .set mips0 \n" |
570 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) | 597 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) |
571 | : "Ir" (i), "m" (v->counter) | 598 | : "Ir" (i), "m" (v->counter) |
@@ -573,11 +600,11 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t * v) | |||
573 | } else { | 600 | } else { |
574 | unsigned long flags; | 601 | unsigned long flags; |
575 | 602 | ||
576 | local_irq_save(flags); | 603 | raw_local_irq_save(flags); |
577 | result = v->counter; | 604 | result = v->counter; |
578 | result -= i; | 605 | result -= i; |
579 | v->counter = result; | 606 | v->counter = result; |
580 | local_irq_restore(flags); | 607 | raw_local_irq_restore(flags); |
581 | } | 608 | } |
582 | 609 | ||
583 | smp_mb(); | 610 | smp_mb(); |
@@ -627,10 +654,13 @@ static __inline__ long atomic64_sub_if_positive(long i, atomic64_t * v) | |||
627 | " bltz %0, 1f \n" | 654 | " bltz %0, 1f \n" |
628 | " scd %0, %2 \n" | 655 | " scd %0, %2 \n" |
629 | " .set noreorder \n" | 656 | " .set noreorder \n" |
630 | " beqz %0, 1b \n" | 657 | " beqz %0, 2f \n" |
631 | " dsubu %0, %1, %3 \n" | 658 | " dsubu %0, %1, %3 \n" |
632 | " .set reorder \n" | 659 | " .set reorder \n" |
633 | "1: \n" | 660 | "1: \n" |
661 | " .subsection 2 \n" | ||
662 | "2: b 1b \n" | ||
663 | " .previous \n" | ||
634 | " .set mips0 \n" | 664 | " .set mips0 \n" |
635 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) | 665 | : "=&r" (result), "=&r" (temp), "=m" (v->counter) |
636 | : "Ir" (i), "m" (v->counter) | 666 | : "Ir" (i), "m" (v->counter) |
@@ -638,12 +668,12 @@ static __inline__ long atomic64_sub_if_positive(long i, atomic64_t * v) | |||
638 | } else { | 668 | } else { |
639 | unsigned long flags; | 669 | unsigned long flags; |
640 | 670 | ||
641 | local_irq_save(flags); | 671 | raw_local_irq_save(flags); |
642 | result = v->counter; | 672 | result = v->counter; |
643 | result -= i; | 673 | result -= i; |
644 | if (result >= 0) | 674 | if (result >= 0) |
645 | v->counter = result; | 675 | v->counter = result; |
646 | local_irq_restore(flags); | 676 | raw_local_irq_restore(flags); |
647 | } | 677 | } |
648 | 678 | ||
649 | smp_mb(); | 679 | smp_mb(); |