cmpxchg-grb.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #ifndef __ASM_SH_CMPXCHG_GRB_H
  2. #define __ASM_SH_CMPXCHG_GRB_H
  3. static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
  4. {
  5. unsigned long retval;
  6. __asm__ __volatile__ (
  7. " .align 2 \n\t"
  8. " mova 1f, r0 \n\t" /* r0 = end point */
  9. " nop \n\t"
  10. " mov r15, r1 \n\t" /* r1 = saved sp */
  11. " mov #-4, r15 \n\t" /* LOGIN */
  12. " mov.l @%1, %0 \n\t" /* load old value */
  13. " mov.l %2, @%1 \n\t" /* store new value */
  14. "1: mov r1, r15 \n\t" /* LOGOUT */
  15. : "=&r" (retval),
  16. "+r" (m),
  17. "+r" (val) /* inhibit r15 overloading */
  18. :
  19. : "memory", "r0", "r1");
  20. return retval;
  21. }
  22. static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
  23. {
  24. unsigned long retval;
  25. __asm__ __volatile__ (
  26. " .align 2 \n\t"
  27. " mova 1f, r0 \n\t" /* r0 = end point */
  28. " mov r15, r1 \n\t" /* r1 = saved sp */
  29. " mov #-6, r15 \n\t" /* LOGIN */
  30. " mov.b @%1, %0 \n\t" /* load old value */
  31. " extu.b %0, %0 \n\t" /* extend as unsigned */
  32. " mov.b %2, @%1 \n\t" /* store new value */
  33. "1: mov r1, r15 \n\t" /* LOGOUT */
  34. : "=&r" (retval),
  35. "+r" (m),
  36. "+r" (val) /* inhibit r15 overloading */
  37. :
  38. : "memory" , "r0", "r1");
  39. return retval;
  40. }
  41. static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old,
  42. unsigned long new)
  43. {
  44. unsigned long retval;
  45. __asm__ __volatile__ (
  46. " .align 2 \n\t"
  47. " mova 1f, r0 \n\t" /* r0 = end point */
  48. " nop \n\t"
  49. " mov r15, r1 \n\t" /* r1 = saved sp */
  50. " mov #-8, r15 \n\t" /* LOGIN */
  51. " mov.l @%3, %0 \n\t" /* load old value */
  52. " cmp/eq %0, %1 \n\t"
  53. " bf 1f \n\t" /* if not equal */
  54. " mov.l %2, @%3 \n\t" /* store new value */
  55. "1: mov r1, r15 \n\t" /* LOGOUT */
  56. : "=&r" (retval),
  57. "+r" (old), "+r" (new) /* old or new can be r15 */
  58. : "r" (m)
  59. : "memory" , "r0", "r1", "t");
  60. return retval;
  61. }
  62. #endif /* __ASM_SH_CMPXCHG_GRB_H */