1885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/***********************************************************************
2885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCopyright (c) 2006-2011, Skype Limited. All rights reserved.
3885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgRedistribution and use in source and binary forms, with or without
4885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgmodification, are permitted provided that the following conditions
5885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgare met:
6885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org- Redistributions of source code must retain the above copyright notice,
7885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgthis list of conditions and the following disclaimer.
8885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org- Redistributions in binary form must reproduce the above copyright
9885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgnotice, this list of conditions and the following disclaimer in the
10885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgdocumentation and/or other materials provided with the distribution.
11e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.org- Neither the name of Internet Society, IETF or IETF Trust, nor the
12885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgnames of specific contributors, may be used to endorse or promote
13885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgproducts derived from this software without specific prior written
14885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgpermission.
15e3ea049fcaee2247e45f0ce793d4313babb4ef69tlegrand@chromium.orgTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgPOSSIBILITY OF SUCH DAMAGE.
26885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org***********************************************************************/
27885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
28885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*! \file silk_Inlines.h
293c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.com *  \brief silk_Inlines.h defines OPUS_INLINE signal processing functions.
30885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org */
31885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
32885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifndef SILK_FIX_INLINES_H
33885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#define SILK_FIX_INLINES_H
34885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
35885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef  __cplusplus
36885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.orgextern "C"
37885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
38885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
39885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
40885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* count leading zeros of opus_int64 */
413c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE opus_int32 silk_CLZ64( opus_int64 in )
42885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
43885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 in_upper;
44885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
45885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    in_upper = (opus_int32)silk_RSHIFT64(in, 32);
46885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    if (in_upper == 0) {
47885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        /* Search in the lower 32 bits */
48885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        return 32 + silk_CLZ32( (opus_int32) in );
49885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    } else {
50885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        /* Search in the upper 32 bits */
51885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        return silk_CLZ32( in_upper );
52885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    }
53885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
54885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
55885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* get number of leading zeros and fractional part (the bits right after the leading one */
563c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE void silk_CLZ_FRAC(
57885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 in,            /* I  input                               */
58885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 *lz,           /* O  number of leading zeros             */
59885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 *frac_Q7       /* O  the 7 bits right after the leading one */
60885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org)
61885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
62885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 lzeros = silk_CLZ32(in);
63885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
64885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    * lz = lzeros;
65885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    * frac_Q7 = silk_ROR32(in, 24 - lzeros) & 0x7f;
66885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
67885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
68885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Approximation of square root                                          */
69885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Accuracy: < +/- 10%  for output values > 15                           */
70885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/*           < +/- 2.5% for output values > 120                          */
713c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE opus_int32 silk_SQRT_APPROX( opus_int32 x )
72885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
73885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 y, lz, frac_Q7;
74885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
75885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    if( x <= 0 ) {
76885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        return 0;
77885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    }
78885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
79885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_CLZ_FRAC(x, &lz, &frac_Q7);
80885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
81885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    if( lz & 1 ) {
82885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        y = 32768;
83885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    } else {
84885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        y = 46214;        /* 46214 = sqrt(2) * 32768 */
85885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    }
86885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
87885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* get scaling right */
88885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    y >>= silk_RSHIFT(lz, 1);
89885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
90885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* increment using fractional part of input */
91885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    y = silk_SMLAWB(y, y, silk_SMULBB(213, frac_Q7));
92885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
93885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    return y;
94885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
95885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
96885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Divide two int32 values and return result as int32 in a given Q-domain */
973c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE opus_int32 silk_DIV32_varQ(   /* O    returns a good approximation of "(a32 << Qres) / b32" */
98885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int32     a32,               /* I    numerator (Q0)                  */
99885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int32     b32,               /* I    denominator (Q0)                */
100885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int       Qres               /* I    Q-domain of result (>= 0)       */
101885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org)
102885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
103885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int   a_headrm, b_headrm, lshift;
104885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 b32_inv, a32_nrm, b32_nrm, result;
105885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
106885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_assert( b32 != 0 );
107885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_assert( Qres >= 0 );
108885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
109885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* Compute number of bits head room and normalize inputs */
110885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    a_headrm = silk_CLZ32( silk_abs(a32) ) - 1;
111885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    a32_nrm = silk_LSHIFT(a32, a_headrm);                                       /* Q: a_headrm                  */
112885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    b_headrm = silk_CLZ32( silk_abs(b32) ) - 1;
113885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    b32_nrm = silk_LSHIFT(b32, b_headrm);                                       /* Q: b_headrm                  */
114885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
115885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* Inverse of b32, with 14 bits of precision */
116885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    b32_inv = silk_DIV32_16( silk_int32_MAX >> 2, silk_RSHIFT(b32_nrm, 16) );   /* Q: 29 + 16 - b_headrm        */
117885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
118885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* First approximation */
119885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    result = silk_SMULWB(a32_nrm, b32_inv);                                     /* Q: 29 + a_headrm - b_headrm  */
120885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
121885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* Compute residual by subtracting product of denominator and first approximation */
122885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* It's OK to overflow because the final value of a32_nrm should always be small */
123885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    a32_nrm = silk_SUB32_ovflw(a32_nrm, silk_LSHIFT_ovflw( silk_SMMUL(b32_nrm, result), 3 ));  /* Q: a_headrm   */
124885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
125885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* Refinement */
126885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    result = silk_SMLAWB(result, a32_nrm, b32_inv);                             /* Q: 29 + a_headrm - b_headrm  */
127885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
128885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* Convert to Qres domain */
129885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    lshift = 29 + a_headrm - b_headrm - Qres;
130885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    if( lshift < 0 ) {
131885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        return silk_LSHIFT_SAT32(result, -lshift);
132885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    } else {
133885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        if( lshift < 32){
134885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            return silk_RSHIFT(result, lshift);
135885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        } else {
136885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            /* Avoid undefined result */
137885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            return 0;
138885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        }
139885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    }
140885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
141885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
142885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org/* Invert int32 value and return result as int32 in a given Q-domain */
1433c3902f0ac13428394f14f78f0fab05ef3468d69tlegrand@google.comstatic OPUS_INLINE opus_int32 silk_INVERSE32_varQ(   /* O    returns a good approximation of "(1 << Qres) / b32" */
144885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int32     b32,                   /* I    denominator (Q0)                */
145885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    const opus_int       Qres                   /* I    Q-domain of result (> 0)        */
146885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org)
147885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org{
148885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int   b_headrm, lshift;
149885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    opus_int32 b32_inv, b32_nrm, err_Q32, result;
150885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
151885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_assert( b32 != 0 );
152885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    silk_assert( Qres > 0 );
153885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
154885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* Compute number of bits head room and normalize input */
155885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    b_headrm = silk_CLZ32( silk_abs(b32) ) - 1;
156885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    b32_nrm = silk_LSHIFT(b32, b_headrm);                                       /* Q: b_headrm                */
157885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
158885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* Inverse of b32, with 14 bits of precision */
159885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    b32_inv = silk_DIV32_16( silk_int32_MAX >> 2, silk_RSHIFT(b32_nrm, 16) );   /* Q: 29 + 16 - b_headrm    */
160885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
161885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* First approximation */
162885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    result = silk_LSHIFT(b32_inv, 16);                                          /* Q: 61 - b_headrm            */
163885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
164885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* Compute residual by subtracting product of denominator and first approximation from one */
165885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    err_Q32 = silk_LSHIFT( ((opus_int32)1<<29) - silk_SMULWB(b32_nrm, b32_inv), 3 );        /* Q32                        */
166885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
167885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* Refinement */
168885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    result = silk_SMLAWW(result, err_Q32, b32_inv);                             /* Q: 61 - b_headrm            */
169885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
170885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    /* Convert to Qres domain */
171885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    lshift = 61 - b_headrm - Qres;
172885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    if( lshift <= 0 ) {
173885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        return silk_LSHIFT_SAT32(result, -lshift);
174885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    } else {
175885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        if( lshift < 32){
176885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            return silk_RSHIFT(result, lshift);
177885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        }else{
178885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            /* Avoid undefined result */
179885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org            return 0;
180885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org        }
181885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org    }
182885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
183885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
184885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#ifdef  __cplusplus
185885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org}
186885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif
187885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org
188885f2ff5a7a7d6a73432d26a6c0ae9147e6b452sergeyu@chromium.org#endif /* SILK_FIX_INLINES_H */
189