atom.s 1009 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /*
  2. * R4000 user-level atomic operations
  3. */
  4. #define LL(base, rt) WORD $((060<<26)|((base)<<21)|((rt)<<16))
  5. #define SC(base, rt) WORD $((070<<26)|((base)<<21)|((rt)<<16))
  6. #define NOOP WORD $0x27
  7. TEXT ainc(SB), 1, $-4 /* long ainc(long *); */
  8. TEXT _xinc(SB), 1, $-4 /* void _xinc(long *); */
  9. MOVW R1, R2 /* address of counter */
  10. loop: MOVW $1, R3
  11. LL(2, 1)
  12. NOOP
  13. ADDU R1, R3
  14. MOVW R3, R1 /* return new value */
  15. SC(2, 3)
  16. NOOP
  17. BEQ R3,loop
  18. RET
  19. TEXT adec(SB), 1, $-4 /* long adec(long*); */
  20. TEXT _xdec(SB), 1, $-4 /* long _xdec(long *); */
  21. MOVW R1, R2 /* address of counter */
  22. loop1: MOVW $-1, R3
  23. LL(2, 1)
  24. NOOP
  25. ADDU R1, R3
  26. MOVW R3, R1 /* return new value */
  27. SC(2, 3)
  28. NOOP
  29. BEQ R3,loop1
  30. RET
  31. /*
  32. * int cas(uint* p, int ov, int nv);
  33. */
  34. TEXT cas(SB), 1, $-4
  35. MOVW ov+4(FP), R2
  36. MOVW nv+8(FP), R3
  37. spincas:
  38. LL(1, 4) /* R4 = *R1 */
  39. NOOP
  40. BNE R2, R4, fail
  41. SC(1, 3) /* *R1 = R3 */
  42. NOOP
  43. BEQ R3, spincas /* R3 == 0 means store failed */
  44. MOVW $1, R1
  45. RET
  46. fail:
  47. MOVW $0, R1
  48. RET