@@ -166,32 +166,6 @@ namespace ojph {
166166 #endif
167167 }
168168
169- // ///////////////////////////////////////////////////////////////////////////
170- static inline ui32 population_count64 (ui64 val)
171- {
172- #if defined(OJPH_COMPILER_MSVC) \
173- && (defined (OJPH_ARCH_X86_64) || defined (OJPH_ARCH_I386))
174- return (ui32)__popcnt64 (val);
175- #elif (defined OJPH_COMPILER_GNUC)
176- return (ui32)__builtin_popcountll (val);
177- #else
178- const ui64 k1 = 0x5555555555555555ull ;
179- const ui64 k2 = 0x3333333333333333ull ;
180- const ui64 k4 = 0x0F0F0F0F0F0F0F0Full ;
181- const ui64 kf = 0x0101010101010101ull ;
182-
183- // put count of each 2 bits into those 2 bits
184- val = val - ((val >> 1 ) & k1);
185- // put count of each 4 bits into those 4 bits
186- val = (val & k2) + ((val >> 2 ) & k2);
187- // put count of each 8 bits into those 8 bits
188- val = (val + (val >> 4 )) & k4 ;
189- // returns 8 most significant bits of x + (x<<8) + (x<<16) + (x<<24) + ...
190- val = (val * kf) >> 56 ;
191- return (ui32) val;
192- #endif
193- }
194-
195169 // ///////////////////////////////////////////////////////////////////////////
196170#ifdef OJPH_COMPILER_MSVC
197171 #pragma intrinsic(_BitScanReverse)
@@ -214,15 +188,33 @@ namespace ojph {
214188 #endif
215189 }
216190
217- // ///////////////////////////////////////////////////////////////////////////
191+ // ///////////////////////////////////////////////////////////////////////////
218192#ifdef OJPH_COMPILER_MSVC
219- #pragma intrinsic(_BitScanReverse64)
193+ #if (defined OJPH_ARCH_X86_64)
194+ #pragma intrinsic(_BitScanReverse64)
195+ #elif (defined OJPH_ARCH_I386)
196+ #pragma intrinsic(_BitScanReverse)
197+ #else
198+ #error Error unsupport MSVC version
199+ #endif
220200#endif
221201 static inline ui32 count_leading_zeros (ui64 val)
222202 {
223203 #ifdef OJPH_COMPILER_MSVC
224204 unsigned long result = 0 ;
225- _BitScanReverse64 (&result, val);
205+ #ifdef OJPH_ARCH_X86_64
206+ _BitScanReverse64 (&result, val);
207+ #elif (defined OJPH_ARCH_I386)
208+ ui32 msb = (ui32)(val >> 32 ), lsb = (ui32)val;
209+ if (msb == 0 )
210+ _BitScanReverse (&result, lsb);
211+ else {
212+ _BitScanReverse (&result, msb);
213+ result += 32 ;
214+ }
215+ #else
216+ #error Error unsupport MSVC version
217+ #endif
226218 return 63 ^ (ui32)result;
227219 #elif (defined OJPH_COMPILER_GNUC)
228220 return (ui32)__builtin_clzll (val);
0 commit comments