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

VxWorks

开发平台:

C/C++

  1. /* ffsLib.c - find first bit set library */
  2. /* Copyright 1984-1998 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01m,13nov01,dee  add CPU_FAMILY==COLDFIRE to portable test
  8. 01l,13nov98,cdp  use portable routines for ARM CPUs with ARM_THUMB==TRUE.
  9. 01l,03mar00,zl   merged SH support into T2
  10. 01k,04may98,cym  added SIMNT to PROTABLE list.
  11. 01j,22apr97,jpd  added optimised version for ARM.
  12. 01i,28nov96,cdp  added ARM support.
  13. 01h,03apr96,ism  vxsim/solaris
  14. 01g,02dec93,pme  added Am29K family support.
  15. 01h,11aug93,gae  vxsim hppa from rrr.
  16. 01g,12jun93,rrr  vxsim.
  17. 01f,08jun92,ajm  made portable for mips, added ffsLsb routine
  18. 01e,26may92,rrr  the tree shuffle
  19. 01d,22apr92,jwt  optimized version for SPARClite; copyright to 1992.
  20. 01c,04oct91,rrr  passed through the ansification filter
  21.                   -changed functions to ansi style
  22.   -fixed #else and #endif
  23.   -changed copyright notice
  24. 01b,25sep91,yao   added suport for CPU32.
  25. 01a,21jan91,jcf   written.
  26. */
  27. /*
  28. DESCRIPTION
  29. This library contains routines to find the first bit set in a 32 bit field.
  30. It is utilized by bit mapped priority queues and hashing functions.
  31. */
  32. #include "vxWorks.h"
  33. /* optimized version available for MC680xx, COLDFIRE and ARM families */
  34. #if (defined(PORTABLE) || 
  35.      (CPU_FAMILY == SIMNT) || (CPU_FAMILY == SPARC) || (CPU_FAMILY == MIPS) || 
  36.      (CPU_FAMILY == SIMSPARCSUNOS) || (CPU_FAMILY == SIMHPPA) || 
  37.      (CPU_FAMILY == AM29XXX) || (CPU_FAMILY == SIMSPARCSOLARIS) || 
  38.      ((CPU_FAMILY == ARM) && ARM_THUMB))
  39. #define ffsLib_PORTABLE
  40. #endif
  41. #if ((CPU == SPARClite) || (CPU_FAMILY == SH))
  42. #undef PORTABLE
  43. #undef ffsLib_PORTABLE
  44. #endif
  45. #if (defined(ffsLib_PORTABLE)||(CPU == MC68000)||(CPU == MC68010)||(CPU==CPU32) || 
  46.        (CPU_FAMILY == ARM) || (CPU_FAMILY == COLDFIRE))
  47. #define ffsLib_FFS_TABLE
  48. #endif
  49. #ifdef ffsLib_FFS_TABLE
  50. UINT8 ffsMsbTbl [256] = /* lookup table for ffsMsb() */
  51.     {
  52.     0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
  53.     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  54.     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  55.     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  56.     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  57.     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  58.     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  59.     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
  60.     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  61.     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  62.     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  63.     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  64.     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  65.     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  66.     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  67.     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
  68.     };
  69. UINT8 ffsLsbTbl [256] =                 /* lookup table for ffsLsb() */
  70.     {
  71.     0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  72.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  73.     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  74.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  75.     6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  76.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  77.     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  78.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  79.     7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  80.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  81.     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  82.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  83.     6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  84.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  85.     5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  86.     4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
  87.     };
  88. #endif /* ffsLib_FFS_TABLE */
  89. #ifdef ffsLib_PORTABLE
  90. /*******************************************************************************
  91. *
  92. * ffsMsb - find most significant bit set
  93. *
  94. * This routine finds the first bit set in the 32 bit argument passed it and
  95. * returns the index of that bit.  Bits are numbered starting at 1 from the
  96. * least signifficant bit.  A return value of zero indicates that the value
  97. * passed is zero.
  98. *
  99. * RETURNS: most significant bit set
  100. */
  101. int ffsMsb
  102.     (
  103.     UINT32 i        /* argument to find first set bit in */
  104.     )
  105.     {
  106.     UINT16 msw = (UINT16) (i >> 16); /* most significant word */
  107.     UINT16 lsw = (UINT16) (i & 0xffff); /* least significant word */
  108.     UINT8  byte;
  109.     if (i == 0)
  110. return (0);
  111.     if (msw)
  112. {
  113. byte = (UINT8) (msw >> 8); /* byte is bits [24:31] */
  114. if (byte)
  115.     return (ffsMsbTbl[byte] + 24 + 1);
  116. else
  117.     return (ffsMsbTbl[(UINT8) msw] + 16 + 1);
  118. }
  119.     else
  120. {
  121. byte = (UINT8) (lsw >> 8); /* byte is bits [8:15] */
  122. if (byte)
  123.     return (ffsMsbTbl[byte] + 8 + 1);
  124. else
  125.     return (ffsMsbTbl[(UINT8) lsw] + 1);
  126. }
  127.     }
  128. /*******************************************************************************
  129. *
  130. * ffsLsb - find least significant bit set
  131. *
  132. * This routine finds the first bit set in the 32 bit argument passed it and
  133. * returns the index of that bit.  Bits are numbered starting at 1 from the
  134. * least signifficant bit.  A return value of zero indicates that the value
  135. * passed is zero.
  136. *
  137. * RETURNS: least significant bit set
  138. */
  139. int ffsLsb
  140.     (
  141.     UINT32 i        /* argument to find first set bit in */
  142.     )
  143.     {
  144.     UINT16 msw = (UINT16) (i >> 16); /* most significant word */
  145.     UINT16 lsw = (UINT16) (i & 0xffff); /* least significant word */
  146.     UINT8  byte;
  147.     if (i == 0)
  148. return (0);
  149.     if (lsw)
  150. {
  151. byte = (UINT8) (lsw & 0xff);
  152. if (byte) /* byte is bits [0:7] */
  153.     return (ffsLsbTbl[byte] + 1);
  154. else /* byte is bits [8:15] */
  155.     return (ffsLsbTbl[(UINT8) (lsw >> 8)] + 8 + 1);
  156. }
  157.     else
  158. {
  159. byte = (UINT8) (msw & 0xff); /* byte is bits [16:23] */
  160. if (byte)
  161.     return (ffsLsbTbl[byte] + 16 + 1);
  162. else /* byte is bits [24:31] */
  163.     return (ffsLsbTbl[(UINT8) (msw >> 8)] + 24 + 1);
  164. }
  165.     }
  166. #endif /* ffsLib_PORTABLE */