atomics.s 1001 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /* Contract for all versions is same as cas.l r2,r3,@r0
  2. * pr and r1 are also clobbered (by jsr & r1 as temp).
  3. * r0,r2,r4-r15 must be preserved.
  4. * r3 contains result (==r2 iff cas succeeded). */
  5. .align 2
  6. .global __sh_cas_gusa
  7. .hidden __sh_cas_gusa
  8. __sh_cas_gusa:
  9. mov.l r5,@-r15
  10. mov.l r4,@-r15
  11. mov r0,r4
  12. mova 1f,r0
  13. mov r15,r1
  14. mov #(0f-1f),r15
  15. 0: mov.l @r4,r5
  16. cmp/eq r5,r2
  17. bf 1f
  18. mov.l r3,@r4
  19. 1: mov r1,r15
  20. mov r5,r3
  21. mov r4,r0
  22. mov.l @r15+,r4
  23. rts
  24. mov.l @r15+,r5
  25. .global __sh_cas_llsc
  26. .hidden __sh_cas_llsc
  27. __sh_cas_llsc:
  28. mov r0,r1
  29. synco
  30. 0: movli.l @r1,r0
  31. cmp/eq r0,r2
  32. bf 1f
  33. mov r3,r0
  34. movco.l r0,@r1
  35. bf 0b
  36. mov r2,r0
  37. 1: synco
  38. mov r0,r3
  39. rts
  40. mov r1,r0
  41. .global __sh_cas_imask
  42. .hidden __sh_cas_imask
  43. __sh_cas_imask:
  44. mov r0,r1
  45. stc sr,r0
  46. mov.l r0,@-r15
  47. or #0xf0,r0
  48. ldc r0,sr
  49. mov.l @r1,r0
  50. cmp/eq r0,r2
  51. bf 1f
  52. mov.l r3,@r1
  53. 1: ldc.l @r15+,sr
  54. mov r0,r3
  55. rts
  56. mov r1,r0
  57. .global __sh_cas_cas_l
  58. .hidden __sh_cas_cas_l
  59. __sh_cas_cas_l:
  60. rts
  61. .word 0x2323 /* cas.l r2,r3,@r0 */