atom.s 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. TEXT ainc(SB), $0 /* long ainc(long *); */
  2. MOVL addr+0(FP), BX
  3. ainclp:
  4. MOVL (BX), AX
  5. MOVL AX, CX
  6. INCL CX
  7. LOCK
  8. BYTE $0x0F; BYTE $0xB1; BYTE $0x0B /* CMPXCHGL CX, (BX) */
  9. JNZ ainclp
  10. MOVL CX, AX
  11. RET
  12. TEXT adec(SB), $0 /* long adec(long*); */
  13. MOVL addr+0(FP), BX
  14. adeclp:
  15. MOVL (BX), AX
  16. MOVL AX, CX
  17. DECL CX
  18. LOCK
  19. BYTE $0x0F; BYTE $0xB1; BYTE $0x0B /* CMPXCHGL CX, (BX) */
  20. JNZ adeclp
  21. MOVL CX, AX
  22. RET
  23. /*
  24. * int cas32(u32int *p, u32int ov, u32int nv);
  25. * int cas(uint *p, int ov, int nv);
  26. * int casp(void **p, void *ov, void *nv);
  27. * int casl(ulong *p, ulong ov, ulong nv);
  28. */
  29. /*
  30. * CMPXCHG (CX), DX: 0000 1111 1011 000w oorr rmmm,
  31. * mmm = CX = 001; rrr = DX = 010
  32. */
  33. #define CMPXCHG BYTE $0x0F; BYTE $0xB1; BYTE $0x11
  34. TEXT cas32+0(SB),0,$0
  35. TEXT cas+0(SB),0,$0
  36. TEXT casp+0(SB),0,$0
  37. TEXT casl+0(SB),0,$0
  38. MOVL p+0(FP), CX
  39. MOVL ov+4(FP), AX
  40. MOVL nv+8(FP), DX
  41. LOCK
  42. CMPXCHG
  43. JNE fail
  44. MOVL $1,AX
  45. RET
  46. fail:
  47. MOVL $0,AX
  48. RET
  49. /*
  50. * int cas64(u64int *p, u64int ov, u64int nv);
  51. */
  52. /*
  53. * CMPXCHG64 (DI): 0000 1111 1100 0111 0000 1110,
  54. */
  55. #define CMPXCHG64 BYTE $0x0F; BYTE $0xC7; BYTE $0x0F
  56. TEXT cas64+0(SB),0,$0
  57. MOVL p+0(FP), DI
  58. MOVL ov+0x4(FP), AX
  59. MOVL ov+0x8(FP), DX
  60. MOVL nv+0xc(FP), BX
  61. MOVL nv+0x10(FP), CX
  62. LOCK
  63. CMPXCHG64
  64. JNE fail
  65. MOVL $1,AX
  66. RET