1
0

atomic_arch.h 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #define a_ll a_ll
  2. static inline int a_ll(volatile int *p)
  3. {
  4. int v;
  5. __asm__ __volatile__ ("ldaxr %w0,%1" : "=r"(v) : "Q"(*p));
  6. return v;
  7. }
  8. #define a_sc a_sc
  9. static inline int a_sc(volatile int *p, int v)
  10. {
  11. int r;
  12. __asm__ __volatile__ ("stlxr %w0,%w2,%1" : "=&r"(r), "=Q"(*p) : "r"(v) : "memory");
  13. return !r;
  14. }
  15. #define a_barrier a_barrier
  16. static inline void a_barrier()
  17. {
  18. __asm__ __volatile__ ("dmb ish" : : : "memory");
  19. }
  20. #define a_cas a_cas
  21. static inline int a_cas(volatile int *p, int t, int s)
  22. {
  23. int old;
  24. do {
  25. old = a_ll(p);
  26. if (old != t) {
  27. a_barrier();
  28. break;
  29. }
  30. } while (!a_sc(p, s));
  31. return old;
  32. }
  33. static inline void *a_ll_p(volatile void *p)
  34. {
  35. void *v;
  36. __asm__ __volatile__ ("ldaxr %0, %1" : "=r"(v) : "Q"(*(void *volatile *)p));
  37. return v;
  38. }
  39. static inline int a_sc_p(volatile int *p, void *v)
  40. {
  41. int r;
  42. __asm__ __volatile__ ("stlxr %w0,%2,%1" : "=&r"(r), "=Q"(*(void *volatile *)p) : "r"(v) : "memory");
  43. return !r;
  44. }
  45. #define a_cas_p a_cas_p
  46. static inline void *a_cas_p(volatile void *p, void *t, void *s)
  47. {
  48. void *old;
  49. do {
  50. old = a_ll_p(p);
  51. if (old != t) {
  52. a_barrier();
  53. break;
  54. }
  55. } while (!a_sc_p(p, s));
  56. return old;
  57. }
  58. #define a_ctz_64 a_ctz_64
  59. static inline int a_ctz_64(uint64_t x)
  60. {
  61. __asm__(
  62. " rbit %0, %1\n"
  63. " clz %0, %0\n"
  64. : "=r"(x) : "r"(x));
  65. return x;
  66. }