spinlock.s
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:5k
源码类别:

Symbian

开发平台:

Visual C++

  1. ; ***** BEGIN LICENSE BLOCK *****
  2. ; Source last modified: $Id: spinlock.s,v 1.1.30.3 2004/07/09 01:47:24 hubbe Exp $
  3. ; // Portions Copyright (c) 1995-2003 RealNetworks, Inc. All Rights Reserved.
  4. ; The contents of this file, and the files included with this file,
  5. ; are subject to the current version of the RealNetworks Public
  6. ; Source License (the "RPSL") available at
  7. ; http://www.helixcommunity.org/content/rpsl unless you have licensed
  8. ; the file under the current version of the RealNetworks Community
  9. ; Source License (the "RCSL") available at
  10. ; http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  11. ; will apply. You may also obtain the license terms directly from
  12. ; RealNetworks.  You may not use this file except in compliance with
  13. ; the RPSL or, if you have a valid RCSL with RealNetworks applicable
  14. ; to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  15. ; the rights, obligations and limitations governing use of the
  16. ; contents of the file.
  17. ; Alternatively, the contents of this file may be used under the
  18. ; terms of the GNU General Public License Version 2 or later (the
  19. ; "GPL") in which case the provisions of the GPL are applicable
  20. ; instead of those above. If you wish to allow use of your version of
  21. ; this file only under the terms of the GPL, and not to allow others
  22. ; to use your version of this file under the terms of either the RPSL
  23. ; or RCSL, indicate your decision by deleting the provisions above
  24. ; and replace them with the notice and other provisions required by
  25. ; the GPL. If you do not delete the provisions above, a recipient may
  26. ; use your version of this file under the terms of any one of the
  27. ; RPSL, the RCSL or the GPL.
  28. ; This file is part of the Helix DNA Technology. RealNetworks is the
  29. ; developer of the Original Code and owns the copyrights in the
  30. ; portions it created.
  31. ; This file, and the files included with this file, is distributed
  32. ; and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  33. ; KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  34. ; ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  35. ; OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  36. ; ENJOYMENT OR NON-INFRINGEMENT.
  37. ; Technology Compatibility Kit Test Suite(s) Location:
  38. ;    http://www.helixcommunity.org/content/tck
  39. ; Contributor(s):
  40. ; ***** END LICENSE BLOCK *****
  41. //////////////////////////////////////////////////////////////////////
  42. //
  43. // spinlock.s
  44. //      Implements a test-and-set operator, for use with a spinlock.
  45. //      implemented in IA64 (Itanium) assembly.
  46. //
  47. // Implementation Notes:
  48. //      A work-in-progress....
  49. //
  50. //////////////////////////////////////////////////////////////////////
  51.   
  52. //////////////////////////////////////////////////////////////////////
  53. // Misc. Assembler Directives
  54. //////////////////////////////////////////////////////////////////////
  55.         .radix  C       // C-style numeric constants
  56.         .section .text = "ax", "progbits" // read-only object code
  57. //////////////////////////////////////////////////////////////////////
  58. //
  59. // _HXMutexSetBit
  60. //      atomic test-and-set operator
  61. //
  62. // Interface:
  63. //   extern "C" int _HXMutexSetBit(HX_MUTEX pLock);
  64. //
  65. // Inputs:
  66. //   Paramaters:
  67. //     in0 :  HX_MUTEX pLock  - pointer to mutex (integer) to modify
  68. //
  69. // Outputs:
  70. //   Atomically modifies memory at *pLock:
  71. //     *pLock = 1
  72. //
  73. //   Return value:
  74. //     r8 : UINT32 - previous value of *pLock
  75. //                   If zero, the lock attempt was successful
  76. //
  77. //////////////////////////////////////////////////////////////////////
  78. .proc   _HXMutexSetBit
  79. .global _HXMutexSetBit
  80. _HXMutexSetBit:
  81.         alloc           loc0 = ar.pfs, 1, 1, 0, 0 //one input, one local
  82. mov r8 = 1;;                //x = 1
  83. xchg4 r8 = [in0], r8;;        //swap *pLock and x
  84. br.ret.dptk.few rp;;                    //return previous *pLock value
  85.         .endp   _HXMutexSetBit
  86. //////////////////////////////////////////////////////////////////////
  87. //
  88. // _HXMutexClearBit
  89. //      atomic bit clear operator
  90. //
  91. // Interface:
  92. //   extern "C" void _HXMutexClearBit(HX_MUTEX pLock);
  93. //
  94. // Inputs:
  95. //   Paramaters:
  96. //     in0 :  HX_MUTEX pLock  - pointer to mutex (integer) to modify
  97. //
  98. // Outputs:
  99. //   Atomically modifies memory at *pLock:
  100. //     *pLock = 0
  101. //
  102. //   Return value:
  103. //     none
  104. //
  105. //////////////////////////////////////////////////////////////////////
  106. //
  107. // Implementation notes:
  108. // We cannot safely just set the lock to zero with an assignment, the
  109. // use of the st4.rel release semantics is necessary to enforce correct
  110. // memory ordering.
  111. //
  112. //////////////////////////////////////////////////////////////////////
  113.         .proc   _HXMutexClearBit
  114.         .global _HXMutexClearBit
  115. _HXMutexClearBit:
  116.         alloc           loc0 = ar.pfs, 1, 1, 0, 0 //one input, one local
  117.         st4.rel         [in0] = r0;;            //atomically set to zero
  118. br.ret.dptk.few rp;;                    //return
  119.         .endp   _HXMutexClearBit