cas.s 509 B

12345678910111213141516171819202122232425262728
  1. /*
  2. * int swp(int r, int *p);
  3. * uchar swpb(uchar r, uchar *p);
  4. *
  5. * int cas(uintptr *p, uintptr ov, uintptr nv);
  6. */
  7. #define LDREX(a,r) WORD $(0xe<<28|0x01900f9f | (a)<<16 | (r)<<12)
  8. #define STREX(a,v,r) WORD $(0xe<<28|0x01800f90 | (a)<<16 | (r)<<12 | (v)<<0)
  9. TEXT cas+0(SB),0,$12 /* r0 holds p */
  10. MOVW ov+4(FP), R1
  11. MOVW nv+8(FP), R2
  12. spin:
  13. /* LDREX 0(R0),R3 */
  14. LDREX(0,3)
  15. CMP.S R3, R1
  16. BNE fail
  17. /* STREX 0(R0),R2,R4 */
  18. STREX(0,2,4)
  19. CMP.S $0, R4
  20. BNE spin
  21. MOVW $1, R0
  22. RET
  23. fail:
  24. MOVW $0, R0
  25. RET