55 /*========================================= |
55 /*========================================= |
56 * Target specific |
56 * Target specific |
57 =========================================*/ |
57 =========================================*/ |
58 #if defined(__BMI__) && defined(__GNUC__) |
58 #if defined(__BMI__) && defined(__GNUC__) |
59 # include <immintrin.h> /* support for bextr (experimental) */ |
59 # include <immintrin.h> /* support for bextr (experimental) */ |
|
60 #elif defined(__ICCARM__) |
|
61 # include <intrinsics.h> |
60 #endif |
62 #endif |
61 |
63 |
62 #define STREAM_ACCUMULATOR_MIN_32 25 |
64 #define STREAM_ACCUMULATOR_MIN_32 25 |
63 #define STREAM_ACCUMULATOR_MIN_64 57 |
65 #define STREAM_ACCUMULATOR_MIN_64 57 |
64 #define STREAM_ACCUMULATOR_MIN ((U32)(MEM_32bits() ? STREAM_ACCUMULATOR_MIN_32 : STREAM_ACCUMULATOR_MIN_64)) |
66 #define STREAM_ACCUMULATOR_MIN ((U32)(MEM_32bits() ? STREAM_ACCUMULATOR_MIN_32 : STREAM_ACCUMULATOR_MIN_64)) |
161 unsigned long r=0; |
163 unsigned long r=0; |
162 _BitScanReverse ( &r, val ); |
164 _BitScanReverse ( &r, val ); |
163 return (unsigned) r; |
165 return (unsigned) r; |
164 # elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */ |
166 # elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */ |
165 return 31 - __builtin_clz (val); |
167 return 31 - __builtin_clz (val); |
|
168 # elif defined(__ICCARM__) /* IAR Intrinsic */ |
|
169 return 31 - __CLZ(val); |
166 # else /* Software version */ |
170 # else /* Software version */ |
167 static const unsigned DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, |
171 static const unsigned DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, |
168 11, 14, 16, 18, 22, 25, 3, 30, |
172 11, 14, 16, 18, 22, 25, 3, 30, |
169 8, 12, 20, 28, 15, 17, 24, 7, |
173 8, 12, 20, 28, 15, 17, 24, 7, |
170 19, 27, 23, 6, 26, 5, 4, 31 }; |
174 19, 27, 23, 6, 26, 5, 4, 31 }; |