atomic_arch.h 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #define a_cas a_cas
  2. static inline int a_cas(volatile int *p, int t, int s)
  3. {
  4. int dummy;
  5. __asm__ __volatile__(
  6. ".set push\n"
  7. ".set mips2\n"
  8. ".set noreorder\n"
  9. " sync\n"
  10. "1: ll %0, %2\n"
  11. " bne %0, %3, 1f\n"
  12. " addu %1, %4, $0\n"
  13. " sc %1, %2\n"
  14. " beq %1, $0, 1b\n"
  15. " nop\n"
  16. " sync\n"
  17. "1: \n"
  18. ".set pop\n"
  19. : "=&r"(t), "=&r"(dummy), "+m"(*p) : "r"(t), "r"(s) : "memory" );
  20. return t;
  21. }
  22. #define a_swap a_swap
  23. static inline int a_swap(volatile int *x, int v)
  24. {
  25. int old, dummy;
  26. __asm__ __volatile__(
  27. ".set push\n"
  28. ".set mips2\n"
  29. ".set noreorder\n"
  30. " sync\n"
  31. "1: ll %0, %2\n"
  32. " addu %1, %3, $0\n"
  33. " sc %1, %2\n"
  34. " beq %1, $0, 1b\n"
  35. " nop\n"
  36. " sync\n"
  37. ".set pop\n"
  38. : "=&r"(old), "=&r"(dummy), "+m"(*x) : "r"(v) : "memory" );
  39. return old;
  40. }
  41. #define a_fetch_add a_fetch_add
  42. static inline int a_fetch_add(volatile int *x, int v)
  43. {
  44. int old, dummy;
  45. __asm__ __volatile__(
  46. ".set push\n"
  47. ".set mips2\n"
  48. ".set noreorder\n"
  49. " sync\n"
  50. "1: ll %0, %2\n"
  51. " addu %1, %0, %3\n"
  52. " sc %1, %2\n"
  53. " beq %1, $0, 1b\n"
  54. " nop\n"
  55. " sync\n"
  56. ".set pop\n"
  57. : "=&r"(old), "=&r"(dummy), "+m"(*x) : "r"(v) : "memory" );
  58. return old;
  59. }