cmpxchg-grb.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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)
  18. : "memory", "r0", "r1");
  19. return retval;
  20. }
  21. static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
  22. {
  23. unsigned long retval;
  24. __asm__ __volatile__ (
  25. " .align 2 \n\t"
  26. " mova 1f, r0 \n\t" /* r0 = end point */
  27. " mov r15, r1 \n\t" /* r1 = saved sp */
  28. " mov #-6, r15 \n\t" /* LOGIN */
  29. " mov.b @%1, %0 \n\t" /* load old value */
  30. " extu.b %0, %0 \n\t" /* extend as unsigned */
  31. " mov.b %2, @%1 \n\t" /* store new value */
  32. "1: mov r1, r15 \n\t" /* LOGOUT */
  33. : "=&r" (retval),
  34. "+r" (m)
  35. : "r" (val)
  36. : "memory" , "r0", "r1");
  37. return retval;
  38. }
  39. static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old,
  40. unsigned long new)
  41. {
  42. unsigned long retval;
  43. __asm__ __volatile__ (
  44. " .align 2 \n\t"
  45. " mova 1f, r0 \n\t" /* r0 = end point */
  46. " nop \n\t"
  47. " mov r15, r1 \n\t" /* r1 = saved sp */
  48. " mov #-8, r15 \n\t" /* LOGIN */
  49. " mov.l @%1, %0 \n\t" /* load old value */
  50. " cmp/eq %0, %2 \n\t"
  51. " bf 1f \n\t" /* if not equal */
  52. " mov.l %2, @%1 \n\t" /* store new value */
  53. "1: mov r1, r15 \n\t" /* LOGOUT */
  54. : "=&r" (retval),
  55. "+r" (m)
  56. : "r" (new)
  57. : "memory" , "r0", "r1", "t");
  58. return retval;
  59. }
  60. #endif /* __ASM_SH_CMPXCHG_GRB_H */