atomic-grb.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #ifndef __ASM_SH_ATOMIC_GRB_H
  2. #define __ASM_SH_ATOMIC_GRB_H
  3. #define ATOMIC_OP(op) \
  4. static inline void atomic_##op(int i, atomic_t *v) \
  5. { \
  6. int tmp; \
  7. \
  8. __asm__ __volatile__ ( \
  9. " .align 2 \n\t" \
  10. " mova 1f, r0 \n\t" /* r0 = end point */ \
  11. " mov r15, r1 \n\t" /* r1 = saved sp */ \
  12. " mov #-6, r15 \n\t" /* LOGIN: r15 = size */ \
  13. " mov.l @%1, %0 \n\t" /* load old value */ \
  14. " " #op " %2, %0 \n\t" /* $op */ \
  15. " mov.l %0, @%1 \n\t" /* store new value */ \
  16. "1: mov r1, r15 \n\t" /* LOGOUT */ \
  17. : "=&r" (tmp), \
  18. "+r" (v) \
  19. : "r" (i) \
  20. : "memory" , "r0", "r1"); \
  21. } \
  22. #define ATOMIC_OP_RETURN(op) \
  23. static inline int atomic_##op##_return(int i, atomic_t *v) \
  24. { \
  25. int tmp; \
  26. \
  27. __asm__ __volatile__ ( \
  28. " .align 2 \n\t" \
  29. " mova 1f, r0 \n\t" /* r0 = end point */ \
  30. " mov r15, r1 \n\t" /* r1 = saved sp */ \
  31. " mov #-6, r15 \n\t" /* LOGIN: r15 = size */ \
  32. " mov.l @%1, %0 \n\t" /* load old value */ \
  33. " " #op " %2, %0 \n\t" /* $op */ \
  34. " mov.l %0, @%1 \n\t" /* store new value */ \
  35. "1: mov r1, r15 \n\t" /* LOGOUT */ \
  36. : "=&r" (tmp), \
  37. "+r" (v) \
  38. : "r" (i) \
  39. : "memory" , "r0", "r1"); \
  40. \
  41. return tmp; \
  42. }
  43. #define ATOMIC_OPS(op) ATOMIC_OP(op) ATOMIC_OP_RETURN(op)
  44. ATOMIC_OPS(add)
  45. ATOMIC_OPS(sub)
  46. ATOMIC_OP(and)
  47. ATOMIC_OP(or)
  48. ATOMIC_OP(xor)
  49. #undef ATOMIC_OPS
  50. #undef ATOMIC_OP_RETURN
  51. #undef ATOMIC_OP
  52. #endif /* __ASM_SH_ATOMIC_GRB_H */