64bit_arm.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // Copyright 2012 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package atomic
  5. func loadUint64(addr *uint64) (val uint64) {
  6. for {
  7. val = *addr
  8. if CompareAndSwapUint64(addr, val, val) {
  9. break
  10. }
  11. }
  12. return
  13. }
  14. func storeUint64(addr *uint64, val uint64) {
  15. for {
  16. old := *addr
  17. if CompareAndSwapUint64(addr, old, val) {
  18. break
  19. }
  20. }
  21. return
  22. }
  23. func addUint64(val *uint64, delta uint64) (new uint64) {
  24. for {
  25. old := *val
  26. new = old + delta
  27. if CompareAndSwapUint64(val, old, new) {
  28. break
  29. }
  30. }
  31. return
  32. }
  33. func swapUint64(addr *uint64, new uint64) (old uint64) {
  34. for {
  35. old = *addr
  36. if CompareAndSwapUint64(addr, old, new) {
  37. break
  38. }
  39. }
  40. return
  41. }
  42. // Additional ARM-specific assembly routines.
  43. // Declaration here to give assembly routines correct stack maps for arguments.
  44. func armCompareAndSwapUint32(addr *uint32, old, new uint32) (swapped bool)
  45. func armCompareAndSwapUint64(addr *uint64, old, new uint64) (swapped bool)
  46. func generalCAS64(addr *uint64, old, new uint64) (swapped bool)
  47. func armAddUint32(addr *uint32, delta uint32) (new uint32)
  48. func armAddUint64(addr *uint64, delta uint64) (new uint64)
  49. func armSwapUint32(addr *uint32, new uint32) (old uint32)
  50. func armSwapUint64(addr *uint64, new uint64) (old uint64)
  51. func armLoadUint64(addr *uint64) (val uint64)
  52. func armStoreUint64(addr *uint64, val uint64)