xincmips.s 674 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. /*
  2. * R4000 user level lock code
  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. #ifdef oldstyle
  8. TEXT xadd(SB), $0
  9. MOVW R1, R2 /* address of counter */
  10. loop: MOVW n+4(FP), R3 /* increment */
  11. LL(2, 1)
  12. NOOP
  13. ADD R1,R3,R3
  14. SC(2, 3)
  15. NOOP
  16. BEQ R3,loop
  17. RET
  18. #endif
  19. TEXT _xinc(SB), $0
  20. MOVW R1, R2 /* address of counter */
  21. loop: MOVW $1, R3
  22. LL(2, 1)
  23. NOOP
  24. ADD R1,R3,R3
  25. SC(2, 3)
  26. NOOP
  27. BEQ R3,loop
  28. RET
  29. TEXT _xdec(SB), $0
  30. MOVW R1, R2 /* address of counter */
  31. loop1: MOVW $-1, R3
  32. LL(2, 1)
  33. NOOP
  34. ADD R1,R3,R3
  35. MOVW R3, R1
  36. SC(2, 3)
  37. NOOP
  38. BEQ R3,loop1
  39. RET