/*
***********************************************************************
*
* Copyright (C) 1999 Ericsson Radio Systems AB
* 
* The Association of Radio Industries and Businesses (ARIB) has the
* licence to reproduce, distribute and publish the Bit Exact C Code
* programs in this CD-ROM together with the other parts of the RCR
* STD-27 (Personal Digital Cellular Telecommunication System)
* specification.
* 
* Ericsson has declared Option 1 (royalty-free licence) to ARIB for
* its Essential Industrial Property Rights related to the ACELP
* specification and the Bit Exact C Code programs. The royalty-free
* licence is limited to the development and manufacturing of
* products complying with the RCR STD-27H specification (or
* subsequent versions) for sale and use in Japan. Copying of the
* program(s) for any other purpose requires the prior written
* permission from Ericsson.
* 
* The user of the Bit Exact C Code hereby acknowledges the
* following:
* 
* 1.  Ericsson does not provide the user with any warranties,
*     whether express or implied, including but not limited to
*     warranties of merchantability and fitness for a particular
*     purpose relating to the Bit Exact C Code.
* 
* 2.  Ericsson shall have no responsibility whatsoever to indemnify
*     the user against actions or claims for infringement of any
*     intellectual property rights, e.g. patents, copyrights,
*     registered designs or any other rights, by reason of the
*     user's use of the Bit Exact C Code.
* 
***********************************************************************
*/

/*************************************************************************
 *
 *   FUNCTION:   Log2()
 *
 *   PURPOSE:   Computes log2(L_x),  where   L_x is positive.
 *              If L_x is negative or zero, the result is 0.
 *
 *   DESCRIPTION:
 *        The function Log2(L_x) is approximated by a table and linear
 *        interpolation. The following steps are used to compute Log2(L_x)
 *
 *           1- Normalization of L_x.
 *           2- exponent = 30-exponent
 *           3- i = bit25-b31 of L_x;  32<=i<=63  (because of normalization).
 *           4- a = bit10-b24
 *           5- i -=32
 *           6- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2
 *
 *************************************************************************/


#include "typedef.h"
#include "basic_op.h"

#include "log2.tab"                /* Table for Log2() */

void Log2(
    Word32 L_x,        /* (i) : input value                                 */
    Word16 * exponent, /* (o) : Integer part of Log2.   (range: 0<=val<=30) */
    Word16 * fraction  /* (o) : Fractionnal part of Log2. (range: 0<=val<1) */
)
{
    Word16 exp, i, a, tmp;
    Word32 L_y;

    if (L_x <= (Word32) 0) {
        *exponent = 0;
        *fraction = 0;
        return;
    }
    exp = norm_l(L_x);
    L_x = L_shl(L_x, exp);        /* L_x is normalized */

    *exponent = sub(30, exp);

    L_x = L_shr(L_x, 9);
    i = extract_h(L_x);         /* Extract b25-b31 */
    L_x = L_shr(L_x, 1);
    a = extract_l(L_x);         /* Extract b10-b24 of fraction */
    a = a & (Word16) 0x7fff;
    i = sub(i, 32);

    L_y = L_deposit_h(table[i]); /* table[i] << 16 */
    tmp = sub(table[i], table[i + 1]);  /* table[i] - table[i+1] */
    L_y = L_msu(L_y, tmp, a);    /* L_y -= tmp*a*2 */

    *fraction = extract_h(L_y);

    return;
}
