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

VxWorks

开发平台:

C/C++

  1. /* ffsALib.s - i80x86 find first set function */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01d,22aug01,hdn  imported from T31 ver 01g
  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 defines an optimized version of the C routine in ffsLib.c.
  18. By taking advantage of the BSR instruction of 80X86 processors, the
  19. implementation determines the first bit set in constant time.
  20. */
  21. #define _ASMLANGUAGE
  22. #include "vxWorks.h"
  23. #include "asm.h"
  24. .data
  25. .globl  FUNC(copyright_wind_river)
  26. .long   FUNC(copyright_wind_river)
  27. #if defined(PORTABLE)
  28. #define ffsALib_PORTABLE
  29. #endif
  30. #ifndef ffsALib_PORTABLE
  31. /* internals */
  32. .globl GTEXT(ffsMsb)
  33. .globl GTEXT(ffsLsb)
  34. .text
  35. .balign 16
  36. /*******************************************************************************
  37. *
  38. * ffsMsb - find first set bit (searching from the most significant bit)
  39. *
  40. * This routine finds the first bit set in the argument passed it and
  41. * returns the index of that bit.  Bits are numbered starting
  42. * at 1 from the least significant bit to 32 the most significant bit.
  43. * A return value of zero indicates that the value passed is zero.
  44. *
  45. * RETURNS: bit position from 1 to 32, or 0 if the argument is zero.
  46. * int ffsMsb (i)
  47. *     int i;       /* argument to find first set bit in *
  48. */
  49. FUNC_LABEL(ffsMsb)
  50. movl SP_ARG1(%esp),%edx /* %edx = i */
  51. bsrl %edx,%eax /* search bit from 31 */
  52. je ffsNoBitSet  /* zeros means no bit is set */
  53. incl %eax /* found it, increment 1 */
  54. ret
  55. ffsNoBitSet: /* couldn't find it */
  56. xorl %eax,%eax /* return 0 */
  57. ret
  58. /*******************************************************************************
  59. *
  60. * ffsLsb - find first set bit (searching from the least significant bit)
  61. *
  62. * This routine finds the first bit set in the argument passed it and
  63. * returns the index of that bit.  Bits are numbered starting
  64. * at 1 from the least significant bit to 32 the most significant bit.
  65. * A return value of zero indicates that the value passed is zero.
  66. *
  67. * RETURNS: bit position from 1 to 32, or 0 if the argument is zero.
  68. * int ffsLsb (i)
  69. *     int i;       /* argument to find first set bit in *
  70. */
  71. .balign 16,0x90
  72. FUNC_LABEL(ffsLsb)
  73. movl SP_ARG1(%esp),%edx /* %edx = i */
  74. bsfl %edx,%eax /* search bit from 0 */
  75. je ffsNoBitSet  /* zeros means no bit is set */
  76. incl %eax /* found it, increment 1 */
  77. ret
  78. #endif /* ! ffsALib_PORTABLE */