32 #ifndef SILK_FIX_INLINES_H
33 #define SILK_FIX_INLINES_H
41 static OPUS_INLINE opus_int32 silk_CLZ64( opus_int64 in )
45 in_upper = (opus_int32)silk_RSHIFT64(in, 32);
48 return 32 + silk_CLZ32( (opus_int32) in );
51 return silk_CLZ32( in_upper );
56 static OPUS_INLINE
void silk_CLZ_FRAC(
62 opus_int32 lzeros = silk_CLZ32(in);
65 * frac_Q7 = silk_ROR32(in, 24 - lzeros) & 0x7f;
71 static OPUS_INLINE opus_int32 silk_SQRT_APPROX( opus_int32 x )
73 opus_int32 y, lz, frac_Q7;
79 silk_CLZ_FRAC(x, &lz, &frac_Q7);
88 y >>= silk_RSHIFT(lz, 1);
91 y = silk_SMLAWB(y, y, silk_SMULBB(213, frac_Q7));
97 static OPUS_INLINE opus_int32 silk_DIV32_varQ(
103 opus_int a_headrm, b_headrm, lshift;
104 opus_int32 b32_inv, a32_nrm, b32_nrm, result;
106 silk_assert( b32 != 0 );
107 silk_assert( Qres >= 0 );
110 a_headrm = silk_CLZ32( silk_abs(a32) ) - 1;
111 a32_nrm = silk_LSHIFT(a32, a_headrm);
112 b_headrm = silk_CLZ32( silk_abs(b32) ) - 1;
113 b32_nrm = silk_LSHIFT(b32, b_headrm);
116 b32_inv = silk_DIV32_16( silk_int32_MAX >> 2, silk_RSHIFT(b32_nrm, 16) );
119 result = silk_SMULWB(a32_nrm, b32_inv);
123 a32_nrm = silk_SUB32_ovflw(a32_nrm, silk_LSHIFT_ovflw( silk_SMMUL(b32_nrm, result), 3 ));
126 result = silk_SMLAWB(result, a32_nrm, b32_inv);
129 lshift = 29 + a_headrm - b_headrm - Qres;
131 return silk_LSHIFT_SAT32(result, -lshift);
134 return silk_RSHIFT(result, lshift);
143 static OPUS_INLINE opus_int32 silk_INVERSE32_varQ(
144 const opus_int32 b32,
148 opus_int b_headrm, lshift;
149 opus_int32 b32_inv, b32_nrm, err_Q32, result;
151 silk_assert( b32 != 0 );
152 silk_assert( Qres > 0 );
155 b_headrm = silk_CLZ32( silk_abs(b32) ) - 1;
156 b32_nrm = silk_LSHIFT(b32, b_headrm);
159 b32_inv = silk_DIV32_16( silk_int32_MAX >> 2, silk_RSHIFT(b32_nrm, 16) );
162 result = silk_LSHIFT(b32_inv, 16);
165 err_Q32 = silk_LSHIFT( ((opus_int32)1<<29) - silk_SMULWB(b32_nrm, b32_inv), 3 );
168 result = silk_SMLAWW(result, err_Q32, b32_inv);
171 lshift = 61 - b_headrm - Qres;
173 return silk_LSHIFT_SAT32(result, -lshift);
176 return silk_RSHIFT(result, lshift);