6 #include "xs3_math_types.h"
40 #define MAX(A,B) (((A) >= (B))? (A) : (B))
55 #define MIN(A,B) (((A) <= (B))? (A) : (B))
67 #define CLS_S16(X) (cls(X) - 16)
79 #define CLS_S32(X) (cls(X))
91 #define CLS_S64(X) ( (cls((int32_t)(((int64_t)(X))>>32)) == 32)? \
92 (cls((int32_t)(((int64_t)(X))>>16)) == 32)? 32 + cls((int32_t)(X)) \
93 : 16 + cls((int32_t)(((int64_t)(X))>>16)) \
94 : cls((int32_t)(((int64_t)(X))>>32)) )
109 #define CLS_C16(X) (MIN(CLS_S16((X).re), CLS_S16((X).im)))
123 #define CLS_C32(X) (MIN(CLS_S32(((int32_t)(X).re)), CLS_S32(((int32_t)(X).im))))
135 #define HR_S64(X) (CLS_S64(X)-1)
146 #define HR_S32(X) (CLS_S32(X)-1)
157 #define HR_S16(X) (CLS_S16(((int16_t)X))-1)
171 #define HR_C32(X) (CLS_C32(X)-1)
185 #define HR_C16(X) (CLS_C16(X)-1)
217 static inline unsigned cls(
223 asm(
"cls %0, %1" :
"=r"(res) :
"r"(a) );
228 if(a == 0 || a == -1)
232 for(
int i = 30; i >= 0; i--){
233 if(a & (1<<i))
return 31-i;
236 for(
int i = 30; i >= 0; i--){
237 unsigned mask = (1<<i);
238 if((a | mask) != a)
return 31-i;
249 static inline unsigned n_bitrev(
250 const unsigned index,
253 unsigned rev_index = 0;
256 const unsigned shifted_index = index << (32 - bits);
257 asm(
"bitrev %0, %1" :
"=r"(rev_index) :
"r"(shifted_index) );
260 unsigned dex = index;
262 for(
int i = 0; i < bits; i++, dex >>= 1){
263 rev_index = ((rev_index<<1) | (dex & 0x1));