qPriBMapALib.s
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:8k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* qPriBMapALib.s - i80x86 optimized bit-mapped priority queue internals */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01d,22aug01,hdn  added FUNC/FUNC_LABEL, replaced .align with .balign
  7. 01c,01jun93,hdn  updated to 5.1.
  8.   - fixed #else and #endif
  9.   - changed VOID to void
  10.   - changed ASMLANGUAGE to _ASMLANGUAGE
  11.   - changed copyright notice
  12. 01b,13oct92,hdn  debugged.
  13. 01a,07apr92,hdn  written based on TRON version.
  14. */
  15. /*
  16. DESCRIPTION
  17. This module contains internals to the VxWorks kernel.
  18. These routines have been coded in assembler because they have been optimized
  19. for performance.
  20. INTERNAL
  21. The C code versions of these routines can be found in qPriBMapLib.c.
  22. Unlike 68K, Highest priority bit is LSB in the meta-map and bit-map.
  23. .ne 36
  24. 68K:
  25. .CS
  26.     priority = 255 - priority
  27.     * is highest priority (255)
  28.     $ is lowest priority (0)
  29. 31                                0
  30. metaBMap *------- -------- -------- -------$
  31. 7      0
  32. bMap[0] -------$
  33.   :
  34.   :
  35. bMap[31] *-------
  36.  
  37. listArray[0] -----------          ---------    ---------
  38. $  pNext  ---------> | pNext ---> | pNext ---> 0
  39. -----------          ---------    ---------
  40. $  pPrev  --+   0 <--- pPrev | <--- pPrev | <---+
  41. ----------- |        ---------    ---------     |
  42.     |                                   |
  43.     +-----------------------------------+
  44.   :
  45.   :
  46. listArray[255] -----------          ---------
  47. *  pNext  ---------> | pNext ---> 0
  48. -----------          ---------
  49. *  pPrev  --+   0 <--- pPrev | <---+
  50. ----------- |        ---------     |
  51.     |                      |
  52.     +----------------------+
  53. .CE
  54. .ne 36
  55. i80x86:
  56. .CS
  57.     priority = priority
  58.     * is highest priority (0)
  59.     $ is lowest priority (255)
  60. 0                                31
  61. metaBMap *------- -------- -------- -------$
  62. 0      7
  63. bMap[0] *-------
  64.   :
  65.   :
  66. bMap[31] -------$
  67.  
  68. listArray[0] -----------          ---------    ---------
  69. *  pNext  ---------> | pNext ---> | pNext ---> 0
  70. -----------          ---------    ---------
  71. *  pPrev  --+   0 <--- pPrev | <--- pPrev | <---+
  72. ----------- |        ---------    ---------     |
  73.     |                                   |
  74.     +-----------------------------------+
  75.   :
  76.   :
  77. listArray[255] -----------          ---------
  78. $  pNext  ---------> | pNext ---> 0
  79. -----------          ---------
  80. $  pPrev  --+   0 <--- pPrev | <---+
  81. ----------- |        ---------     |
  82.     |                      |
  83.     +----------------------+
  84. .CE
  85. */
  86. #define _ASMLANGUAGE
  87. #include "vxWorks.h"
  88. #include "asm.h"
  89. #include "qPriNode.h"
  90. .data
  91. .globl FUNC(copyright_wind_river)
  92. .long FUNC(copyright_wind_river)
  93. #ifndef PORTABLE
  94. /* internals */
  95. .globl GTEXT(qPriBMapPut)
  96. .globl GTEXT(qPriBMapGet)
  97. .globl GTEXT(qPriBMapRemove)
  98. .text
  99. .balign 16
  100. /*******************************************************************************
  101. *
  102. * qPriBMapPut - insert the specified TCB into the ready queue
  103. *
  104. *void qPriBMapPut (pQPriBMapHead, pQPriNode, key)
  105. *    Q_PRI_BMAP_HEAD *pQPriBMapHead;
  106. *    Q_PRI_NODE *pQPriNode;
  107. *    int key;
  108. */
  109. FUNC_LABEL(qPriBMapPut)
  110. pushl %ebx
  111. pushl %esi
  112. pushl %edi
  113. movl SP_ARG1+12(%esp),%edx /* %edx = ARG1 (pMHead) */
  114. movl SP_ARG2+12(%esp),%ecx /* %ecx = ARG2 (pPriNode) */
  115. movl SP_ARG3+12(%esp),%eax /* %eax = ARG3 (key) */
  116. movl (%edx),%ebx /* %ebx = highest node ready */
  117. cmpl $0,%ebx
  118. je qPriBMap0
  119. cmpl Q_PRI_NODE_KEY(%ebx),%eax /* is eax higher priority? */
  120. jge qPriBMap1
  121. qPriBMap0:
  122. movl %ecx,(%edx) /* pPriNode is highest priority */
  123. qPriBMap1:
  124. movl %eax,Q_PRI_NODE_KEY(%ecx) /* move key into pPriNode */
  125. /* qPriBMapMapSet - set the bits in the bit-map for the specified priority
  126.  * %eax = priority
  127.  * returns void
  128.  */
  129.     movl    4(%edx),%esi /* %esi = pMList (metaMap) */
  130.     btsl    %eax,4(%esi) /* set %eax bit # in bit-map */
  131.     leal    0x24(%esi,%eax,8),%ebx /* %ebx = pList */
  132.     shrl    $3,%eax /* %eax = top five bits of %eax */
  133.     btsl    %eax,(%esi) /* set %eax bit # of meta-map */
  134. movl 4(%ebx),%edi /* %edi = pList->tail = pPrev */
  135. /* dllAdd - add node to end of list
  136.  * %ebx = pList
  137.  * %edi = pLastNode
  138.  * %ecx = pNode
  139.  * returns void
  140.  */
  141.     movl    %edi,%esi /* %esi = pPrev->next */
  142.     cmpl    $0,%edi
  143.     jne     qPriBMap2
  144.     movl    %ebx,%esi /* %esi = pList->head */
  145. qPriBMap2:
  146.     movl    %ecx,(%esi) /* (%esi) = pNode */
  147.     movl    %ecx,4(%ebx) /* pList->tail = pNode */
  148.     movl    $0,(%ecx) /* pNode->next     = pNext */
  149.     movl    %edi,4(%ecx) /* pNode->previous = pPrev */
  150. popl %edi
  151. popl %esi
  152. popl %ebx
  153. ret
  154. /*******************************************************************************
  155. *
  156. * qPriBMapGet -
  157. *
  158. *Q_PRI_NODE *qPriBMapGet (pQPriBMapHead)
  159. *    Q_PRI_BMAP_HEAD *pQPriBMapHead;
  160. */
  161. .balign 16,0x90
  162. FUNC_LABEL(qPriBMapGet)
  163. movl SP_ARG1(%esp),%edx /* %edx = pMHead */
  164. pushl (%edx)
  165. cmpl $0,(%edx)
  166. je qPriBMapG1 /* if highNode is NULL we're done */
  167. pushl %edx /* push pMHead */
  168. call FUNC(qPriBMapRemove) /* delete the node */
  169. addl $4,%esp /* clean up second argument */
  170. qPriBMapG1:
  171. popl %eax /* return node */
  172. ret
  173. /*******************************************************************************
  174. *
  175. * qPriBMapRemove
  176. *
  177. *void qPriBMapRemove (pQPriBMapHead, pQPriNode)
  178. *    Q_PRI_BMAP_HEAD *pQPriBMapHead;
  179. *    Q_PRI_NODE *pQPriNode;
  180. */
  181. .balign 16,0x90
  182. FUNC_LABEL(qPriBMapRemove)
  183. pushl %ebx
  184. pushl %esi
  185. pushl %edi
  186. movl SP_ARG1+12(%esp),%edx /* %edx = ARG1 (pMHead) */
  187. movl SP_ARG2+12(%esp),%ecx /* %ecx = ARG2 (pPriNode) */
  188. movl Q_PRI_NODE_KEY(%ecx),%eax /* %eax = key */
  189. movl 4(%edx),%ebx /* %ebx = pMList (metaMap) */
  190. leal 0x24(%ebx,%eax,8),%esi /* %esi = pList */
  191. /* dllRemove - delete a node from a doubly linked list
  192.  * %esi = pList
  193.  * %ecx = pNode
  194.  * returns void
  195.  */
  196.     movl    4(%ecx),%ebx /* %ebx = pNode->previous */
  197.     movl    %ebx,%edi /* %edi = pNode->previous */
  198.     cmpl    $0,%ebx
  199.     jne     qPriBMapR1
  200.     movl    %esi,%edi /* %edi = pList */
  201. qPriBMapR1:
  202.     pushl   (%ecx)
  203.     popl    (%edi) /* pNode->next into (%edi) */
  204.     movl    (%ecx),%edi /* %edi = pNode->next */
  205.     cmpl    $0,%edi /* (pNode->next == NULL)? */
  206.     jne     qPriBMapR3
  207.     movl    %esi,%edi /* %edi = pList */
  208. qPriBMapR3:
  209.     movl    %ebx,4(%edi) /* pNode->previous into 4(%edi) */
  210.     
  211. movl (%esi),%edi
  212. cmpl $0,%edi /* if (pList->head == NULL)         */
  213. je clearMaps /*     then we clear maps           */
  214. cmpl (%edx),%ecx /* if not deleting highest priority */
  215. jne qPriBMapDExit /*     then we are done             */
  216. movl %edi,(%edx) /* update the highest priority task */
  217. jmp qPriBMapDExit
  218. .balign 16,0x90
  219. clearMaps:
  220. /* qPriBMapMapClear - clear the bits in the bit-maps for the specified priority
  221.  * %eax = priority,
  222.  * %ebx = &qPriBMapMetaMap,
  223.  * returns void
  224.  */
  225.     movl    4(%edx),%ebx /* %ebx = pMList (meta-map) */
  226.     btrl    %eax,4(%ebx) /* clear bit in bit-map */
  227.     shrl    $3,%eax /* %eax = top five bits of %eax */
  228.     cmpb    $0,4(%ebx,%eax,1)
  229.     jne     qPriBMapNoMeta /* if not zero, we're done */
  230.     btrl    %eax,(%ebx) /* clear bit in meta-map too */
  231. qPriBMapNoMeta:
  232. cmpl (%edx),%ecx /* have we deleted highest priority */
  233. jne qPriBMapDExit
  234. /* qPriBMapMapHigh - return highest priority task
  235.  * %ebx = &qPriBMapMetaMap,
  236.  * returns priority in d0
  237.  */
  238.     movl    (%ebx),%eax
  239.     bsfl    %eax,%esi /* find the top meta priority */
  240.     je     qPriBMapR11 /* if no bit is set, it is ERROR */
  241.     movzbl  4(%ebx,%esi,1),%eax
  242.     bsfl    %eax,%eax /* find the top bitmap priority */
  243.     je     qPriBMapR11 /* if no bit is set, it is ERROR */
  244.     shll    $3,%esi /* multiply meta priority by 8 */
  245.     orl     %esi,%eax /* add to the priority */
  246.     andl    $0xff,%eax
  247. qPriBMapR10:
  248. movl 0x24(%ebx,%eax,8),%eax /* get highest task into highNode */
  249. movl %eax,(%edx)
  250. qPriBMapDExit:
  251. popl %edi
  252. popl %esi
  253. popl %ebx
  254. ret
  255. .balign 16,0x90
  256. qPriBMapR11: /* It should not happen */
  257. xorl %eax,%eax
  258. jmp qPriBMapR10
  259. #endif /* !PORTABLE */