@@ -17,7 +17,7 @@ MEM_STATIC unsigned ZSTD_countTrailingZeros32_fallback(U32 val)
1717{
1818 assert (val != 0 );
1919 {
20- static const int DeBruijnBytePos [32 ] = {0 , 1 , 28 , 2 , 29 , 14 , 24 , 3 ,
20+ static const U32 DeBruijnBytePos [32 ] = {0 , 1 , 28 , 2 , 29 , 14 , 24 , 3 ,
2121 30 , 22 , 20 , 15 , 25 , 17 , 4 , 8 ,
2222 31 , 27 , 13 , 23 , 21 , 19 , 16 , 7 ,
2323 26 , 12 , 18 , 6 , 11 , 5 , 10 , 9 };
@@ -30,7 +30,7 @@ MEM_STATIC unsigned ZSTD_countTrailingZeros32(U32 val)
3030 assert (val != 0 );
3131# if defined(_MSC_VER )
3232# if STATIC_BMI2 == 1
33- return _tzcnt_u32 (val );
33+ return ( unsigned ) _tzcnt_u32 (val );
3434# else
3535 if (val != 0 ) {
3636 unsigned long r ;
@@ -69,7 +69,7 @@ MEM_STATIC unsigned ZSTD_countLeadingZeros32(U32 val)
6969 assert (val != 0 );
7070# if defined(_MSC_VER )
7171# if STATIC_BMI2 == 1
72- return _lzcnt_u32 (val );
72+ return ( unsigned ) _lzcnt_u32 (val );
7373# else
7474 if (val != 0 ) {
7575 unsigned long r ;
@@ -92,7 +92,7 @@ MEM_STATIC unsigned ZSTD_countTrailingZeros64(U64 val)
9292 assert (val != 0 );
9393# if defined(_MSC_VER ) && defined(_WIN64 )
9494# if STATIC_BMI2 == 1
95- return _tzcnt_u64 (val );
95+ return ( unsigned ) _tzcnt_u64 (val );
9696# else
9797 if (val != 0 ) {
9898 unsigned long r ;
@@ -123,7 +123,7 @@ MEM_STATIC unsigned ZSTD_countLeadingZeros64(U64 val)
123123 assert (val != 0 );
124124# if defined(_MSC_VER ) && defined(_WIN64 )
125125# if STATIC_BMI2 == 1
126- return _lzcnt_u64 (val );
126+ return ( unsigned ) _lzcnt_u64 (val );
127127# else
128128 if (val != 0 ) {
129129 unsigned long r ;
@@ -172,4 +172,29 @@ MEM_STATIC unsigned ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCo
172172 return 31 - ZSTD_countLeadingZeros32 (val );
173173}
174174
175+ /* ZSTD_rotateRight_*():
176+ * Rotates a bitfield to the right by "count" bits.
177+ * https://en.wikipedia.org/w/index.php?title=Circular_shift&oldid=991635599#Implementing_circular_shifts
178+ */
179+ MEM_STATIC
180+ U64 ZSTD_rotateRight_U64 (U64 const value , U32 count ) {
181+ assert (count < 64 );
182+ count &= 0x3F ; /* for fickle pattern recognition */
183+ return (value >> count ) | (U64 )(value << ((0U - count ) & 0x3F ));
184+ }
185+
186+ MEM_STATIC
187+ U32 ZSTD_rotateRight_U32 (U32 const value , U32 count ) {
188+ assert (count < 32 );
189+ count &= 0x1F ; /* for fickle pattern recognition */
190+ return (value >> count ) | (U32 )(value << ((0U - count ) & 0x1F ));
191+ }
192+
193+ MEM_STATIC
194+ U16 ZSTD_rotateRight_U16 (U16 const value , U32 count ) {
195+ assert (count < 16 );
196+ count &= 0x0F ; /* for fickle pattern recognition */
197+ return (value >> count ) | (U16 )(value << ((0U - count ) & 0x0F ));
198+ }
199+
175200#endif /* ZSTD_BITS_H */
0 commit comments