atom.s 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. TEXT ainc(SB), 1, $0 /* long ainc(long *); */
  2. ainclp:
  3. MOVL (RARG), AX /* exp */
  4. MOVL AX, BX
  5. INCL BX /* new */
  6. LOCK; CMPXCHGL BX, (RARG)
  7. JNZ ainclp
  8. MOVL BX, AX
  9. RET
  10. TEXT adec(SB), 1, $0 /* long adec(long*); */
  11. adeclp:
  12. MOVL (RARG), AX
  13. MOVL AX, BX
  14. DECL BX
  15. LOCK; CMPXCHGL BX, (RARG)
  16. JNZ adeclp
  17. MOVL BX, AX
  18. RET
  19. /*
  20. * int cas32(u32int *p, u32int ov, u32int nv);
  21. * int cas(uint *p, int ov, int nv);
  22. * int casul(ulong *p, ulong ov, ulong nv);
  23. */
  24. TEXT cas32(SB), 1, $0
  25. TEXT cas(SB), 1, $0
  26. TEXT casul(SB), 1, $0
  27. TEXT casl(SB), 1, $0 /* back compat */
  28. MOVL exp+8(FP), AX
  29. MOVL new+16(FP), BX
  30. LOCK; CMPXCHGL BX, (RARG)
  31. MOVL $1, AX /* use CMOVLEQ etc. here? */
  32. JNZ _cas32r0
  33. _cas32r1:
  34. RET
  35. _cas32r0:
  36. DECL AX
  37. RET
  38. /*
  39. * int cas64(u64int *p, u64int ov, u64int nv);
  40. * int casp(void **p, void *ov, void *nv);
  41. */
  42. TEXT cas64(SB), 1, $0
  43. TEXT casp(SB), 1, $0
  44. MOVQ exp+8(FP), AX
  45. MOVQ new+16(FP), BX
  46. LOCK; CMPXCHGQ BX, (RARG)
  47. MOVL $1, AX /* use CMOVLEQ etc. here? */
  48. JNZ _cas64r0
  49. _cas64r1:
  50. RET
  51. _cas64r0:
  52. DECL AX
  53. RET
  54. /*
  55. * void mfence(void);
  56. */
  57. TEXT mfence(SB),0,$0
  58. MFENCE
  59. RET