bitfuncs.h
上传用户:yuanda199
上传日期:2022-06-26
资源大小:412k
文件大小:2k
源码类别:

VxWorks

开发平台:

C/C++

  1. /*
  2.     EXTERNAL SOURCE RELEASE on 12/03/2001 3.0 - Subject to change without notice.
  3. */
  4. /*
  5.     Copyright 2001, Broadcom Corporation
  6.     All Rights Reserved.
  7.     
  8.     This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
  9.     the contents of this file may not be disclosed to third parties, copied or
  10.     duplicated in any form, in whole or in part, without the prior written
  11.     permission of Broadcom Corporation.
  12. */
  13. /*
  14.  * bit manipulation utility functions
  15.  *
  16.  * Copyright 2000 Broadcom, Inc.
  17.  * $Id: bitfuncs.h,v 1.1 Broadcom SDK $
  18.  */
  19. #ifndef _BITFUNCS_H
  20. #define _BITFUNCS_H
  21. #include <hnbutypedefs.h>
  22. /* local prototypes */
  23. static INLINE uint32 find_msbit(uint32 x);
  24. /*
  25.  * find_msbit: returns index of most significant set bit in x, with index
  26.  *   range defined as 0-31.  NOTE: returns zero if input is zero.
  27.  */
  28. #if defined(USE_PENTIUM_BSR) && defined(__GNUC__)
  29. /*
  30.  * Implementation for Pentium processors and gcc.  Note that this
  31.  * instruction is actually very slow on some processors (e.g., family 5,
  32.  * model 2, stepping 12, "Pentium 75 - 200"), so we use the generic
  33.  * implementation instead.
  34.  */
  35. static INLINE uint32 find_msbit(uint32 x)
  36. {
  37. uint msbit;
  38.         __asm__("bsrl %1,%0"
  39.                 :"=r" (msbit)
  40.                 :"r" (x));
  41.         return msbit;
  42. }
  43. #else
  44. /*
  45.  * Generic Implementation
  46.  */
  47. #define DB_POW_MASK16 0xffff0000
  48. #define DB_POW_MASK8 0x0000ff00
  49. #define DB_POW_MASK4 0x000000f0
  50. #define DB_POW_MASK2 0x0000000c
  51. #define DB_POW_MASK1 0x00000002
  52. static INLINE uint32 find_msbit(uint32 x)
  53. {
  54. uint32 temp_x = x;
  55. uint msbit = 0;
  56. if (temp_x & DB_POW_MASK16) {
  57. temp_x >>= 16;
  58. msbit = 16;
  59. }
  60. if (temp_x & DB_POW_MASK8) {
  61. temp_x >>= 8;
  62. msbit += 8;
  63. }
  64. if (temp_x & DB_POW_MASK4) {
  65. temp_x >>= 4;
  66. msbit += 4;
  67. }
  68. if (temp_x & DB_POW_MASK2) {
  69. temp_x >>= 2;
  70. msbit += 2;
  71. }
  72. if (temp_x & DB_POW_MASK1) {
  73. msbit += 1;
  74. }
  75. return(msbit);
  76. }
  77. #endif
  78. #endif /* _BITFUNCS_H */