00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _BIT_COUNT_H
00029 #define _BIT_COUNT_H
00030
00031
00032 #if defined __CPU_i386 && ! defined __CPU_x86
00033 #define __CPU_x86
00034 #endif
00035
00036 #ifdef CC_GCC_LIKE_ASM
00037 #if defined __CPU_x86 || defined __CPU_x86_64
00038 #ifdef __SSE4_2__
00039
00040
00041 #define BIT_COUNT_ASM
00042 #endif
00043 #endif
00044 #endif
00045
00046 #ifdef BIT_COUNT_ASM
00047
00048
00049 static inline int bit_count(unsigned int u)
00050 {
00051 int v;
00052
00053 asm volatile(" popcnt %1, %0 " : "=r" (v) : "rm" (u));
00054 return v;
00055 }
00056
00057 #else
00058
00059
00060
00061
00062 #if 0
00063 static inline int bit_count(unsigned int u)
00064 {
00065 int count;
00066
00067
00068
00069
00070 for (count=0; u; count++)
00071 u &= u-1;
00072 return count;
00073 }
00074 #endif
00075
00076 static inline int bit_count(unsigned int i)
00077 {
00078 i = i - ((i >> 1) & 0x55555555);
00079 i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
00080 return (((i + (i >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24;
00081 }
00082
00083 #if 0
00084
00085
00086
00087
00088 extern int bits_in_char[256];
00089
00090 static inline int bit_count(unsigned int u)
00091 {
00092 return bits_in_char [u & 0xffu]
00093 + bits_in_char [(u >> 8 ) & 0xffu]
00094 + bits_in_char [(u >> 16) & 0xffu]
00095 + bits_in_char [(u >> 24) & 0xffu];
00096 }
00097 #endif
00098
00099 #endif
00100
00101 #endif