atomicops.s
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:6k
源码类别:

Symbian

开发平台:

C/C++

  1. # ***** BEGIN LICENSE BLOCK *****  
  2. # Source last modified: $Id: atomicops.s,v 1.1 2003/05/18 07:49:27 dcollins Exp $
  3. #   
  4. # Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.  
  5. #       
  6. # The contents of this file, and the files included with this file, 
  7. # are subject to the current version of the RealNetworks Public 
  8. # Source License (the "RPSL") available at 
  9. # http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10. # the file under the current version of the RealNetworks Community 
  11. # Source License (the "RCSL") available at 
  12. # http://www.helixcommunity.org/content/rcsl, in which case the RCSL 
  13. # will apply. You may also obtain the license terms directly from 
  14. # RealNetworks.  You may not use this file except in compliance with 
  15. # the RPSL or, if you have a valid RCSL with RealNetworks applicable 
  16. # to this file, the RCSL.  Please see the applicable RPSL or RCSL for 
  17. # the rights, obligations and limitations governing use of the 
  18. # contents of the file. 
  19. #   
  20. # This file is part of the Helix DNA Technology. RealNetworks is the 
  21. # developer of the Original Code and owns the copyrights in the 
  22. # portions it created. 
  23. #   
  24. # This file, and the files included with this file, is distributed 
  25. # and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY 
  26. # KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS 
  27. # ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES 
  28. # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET 
  29. # ENJOYMENT OR NON-INFRINGEMENT. 
  30. #  
  31. # Technology Compatibility Kit Test Suite(s) Location:  
  32. #    http://www.helixcommunity.org/content/tck  
  33. #  
  34. # Contributor(s):  
  35. #   
  36. # ***** END LICENSE BLOCK *****  
  37. #######################################################################
  38. #
  39. # atomicops.s - AIX/PowerPC atomic add and subtract
  40. #######################################################################
  41. #
  42. # Notes:
  43. #
  44. # XXXDC: Uses lwarx/stwcx to achieve a fast atomic update, only available
  45. # on PPC or later, so you need to compile everything with -Wa,-m,ppc.
  46. #
  47. # Calling convention is arg1 is in GPR3, arg2 is in GPR4, etc.
  48. # Return value is placed in GPR3 prior to returning.
  49. #
  50. # Used by common/pub/atomicbase.h
  51. #
  52. #######################################################################
  53. # define registers to use
  54. .set r3,3
  55. .set r4,4
  56. .set r5,5
  57. #######################################################################
  58. #
  59. # Interface:
  60. #   INT32 _HXAtomicAddRetINT32(INT32* pNum, INT32 nNum);
  61. #
  62. # Inputs:
  63. #   Paramaters:
  64. #     GPR3 :  INT32* pNum - pointer to integer to modify
  65. #     GPR4 :  INT32  nNum - amount to increment by
  66. #
  67. # Outputs:
  68. #   Modifies memory at *pNum:
  69. #     *pNum = *pNum + nNum
  70. #
  71. #   Return value:
  72. #     GPR3 :  INT32 - new value of *pNum
  73. .globl ._HXAtomicAddRetINT32
  74. ._HXAtomicAddRetINT32:
  75.                 lwarx   r5,0,r3    # Load r5 w/ *pNum, set reserve flag
  76.                 addc    r5,r4,r5   # add GPR4 to r5
  77.                 stwcx.  r5,0,r3    # Store r5 in *pNum if flag still set
  78.                 bne-    ._HXAtomicAddRetINT32 # retry if store failed
  79.                 addi    r3,r5,0    # Save return value in r3
  80.                 br                 # return from routine
  81. #######################################################################
  82. #
  83. # Interface:
  84. #   INT32 _HXAtomicSubRetINT32(INT32* pNum, INT32 nNum);
  85. #
  86. # Inputs:
  87. #   Paramaters:
  88. #     GPR3 :  INT32* pNum - pointer to integer to modify
  89. #     GPR4 :  INT32  nNum - amount to decrement by
  90. #
  91. # Outputs:
  92. #   Modifies memory at *pNum:
  93. #     *pNum = *pNum + nNum
  94. #
  95. #   Return value:
  96. #     GPR3 :  INT32 - new value of *pNum
  97. .globl ._HXAtomicSubRetINT32
  98. ._HXAtomicSubRetINT32:
  99.                 lwarx   r5,0,r3    # Load r5 w/ *pNum, set reserve flag
  100.                 subf    r5,r4,r5   # subtract GPR4 from r5
  101.                 stwcx.  r5,0,r3    # Store r5 in *pNum if flag still set
  102.                 bne-    ._HXAtomicSubRetINT32 # retry if store failed
  103.                 addi    r3,r5,0    # Save return value in r3
  104.                 br                 # return from routine
  105. #######################################################################
  106. #
  107. # Interface:
  108. #   UINT32 HXAtomicAddRetUINT32(UINT32* pNum, UINT32 nNum);
  109. #
  110. # Inputs:
  111. #   Paramaters:
  112. #     GPR3 :  UINT32* pNum - pointer to integer to modify
  113. #     GPR4 :  UINT32  nNum - amount to increment by
  114. #
  115. # Outputs:
  116. #   Modifies memory at *pNum:
  117. #     *pNum = *pNum + nNum
  118. #
  119. #   Return value:
  120. #     GPR3 :  UINT32 - new value of *pNum
  121. .globl ._HXAtomicAddRetUINT32
  122. ._HXAtomicAddRetUINT32:
  123.                 lwarx   r5,0,r3    # Load r5 w/ *pNum, set reserve flag
  124.                 addc    r5,r4,r5   # add GPR4 to r5
  125.                 stwcx.  r5,0,r3    # Store r5 in *pNum if flag still set
  126.                 bne-    ._HXAtomicAddRetUINT32 # retry if store failed
  127.                 addi    r3,r5,0    # Save return value in r3
  128.                 br                 # return from routine
  129. #######################################################################
  130. #
  131. # Interface:
  132. #   UINT32 HXAtomicSubRetUINT32(UINT32* pNum, UINT32 nNum);
  133. #
  134. # Inputs:
  135. #   Paramaters:
  136. #     GPR3 :  UINT32* pNum - pointer to integer to modify
  137. #     GPR4 :  UINT32  nNum - amount to decrement by
  138. #
  139. # Outputs:
  140. #   Modifies memory at *pNum:
  141. #     *pNum = *pNum + nNum
  142. #
  143. #   Return value:
  144. #     GPR3 :  UINT32 - new value of *pNum
  145. .globl ._HXAtomicSubRetUINT32
  146. ._HXAtomicSubRetUINT32:
  147.                 lwarx   r5,0,r3    # Load r5 w/ *pNum, set reserve flag
  148.                 subf    r5,r4,r5   # subtract GPR4 from r5
  149.                 stwcx.  r5,0,r3    # Store r5 in *pNum if flag still set
  150.                 bne-    ._HXAtomicSubRetUINT32 # retry if store failed
  151.                 addi    r3,r5,0    # Save return value in r3
  152.                 br                 # return from routine
  153. #######################################################################