/*
 * Copyright (C) 2004-2010 NXP Software
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "LVM_Types.h"
#include "LVM_Macros.h"
#include "ScalarArithmetic.h"

/*-------------------------------------------------------------------------*/
/* FUNCTION:                                                               */
/*   LVM_Polynomial                                                        */
/*                                                                         */
/* DESCRIPTION:                                                            */
/*   This function performs polynomial expansion                           */
/*  Y = (A0 + A1*X + A2*X2 + A3*X3 + �.. + AN*xN) << AN+1                  */
/*                                                                         */
/*  LVM_INT32 LVM_Polynomial(LVM_UINT16    N,                              */
/*                           LVM_INT32    *pCoefficients,                  */
/*                           LVM_INT32    X)                               */
/*                                                                         */
/* PARAMETERS:                                                             */
/*                                                                         */
/*  N                is the polynomial order                               */
/*  pCoefficients    is the ptr to polynomial coefficients A0,A1.. in Q.31 */
/*  X                is the input variable                                 */
/*                                                                         */
/* RETURNS:                                                                */
/*   The result of the polynomial expansion in Q1.31 format                */
/*-------------------------------------------------------------------------*/
#ifdef BUILD_FLOAT
LVM_FLOAT LVM_Polynomial(LVM_UINT16    N,
                         LVM_FLOAT    *pCoefficients,
                         LVM_FLOAT    X)
{
    LVM_INT32 i;
    LVM_FLOAT Y,A,XTemp,Temp,sign;

    Y = *pCoefficients; /* Y=A0*/
    pCoefficients++;

    if(X == -1.0f)
    {
        Temp = -1;
        sign = Temp;
        for(i = 1; i <= N; i++)
        {
            Y += ((*pCoefficients) * sign);
            pCoefficients++;
            sign *= Temp;
        }


    }
    else
    {
        XTemp = X;
        for(i = N-1; i >= 0; i--)
        {
            A = *pCoefficients;
            pCoefficients++;

            Temp = A * XTemp;
            Y += Temp;

            Temp = XTemp * X;
            XTemp = Temp;
        }
    }
    return Y;
}
#else
LVM_INT32 LVM_Polynomial(LVM_UINT16    N,
                         LVM_INT32    *pCoefficients,
                         LVM_INT32    X)
{
    LVM_INT32 i;
    LVM_INT32 Y,A,XTemp,Temp,sign;

    Y=*pCoefficients; /* Y=A0*/
    pCoefficients++;

    if((LVM_UINT32)X==0x80000000)
    {
        Temp=-1;
        sign=Temp;
        for(i=1;i<=N;i++)
        {
            Y+=((*pCoefficients)*sign);
            pCoefficients++;
            sign*=Temp;
        }


    }
    else
    {
        XTemp=X;
        for(i=N-1;i>=0;i--)
        {
            A=*pCoefficients;
            pCoefficients++;

            MUL32x32INTO32(A,XTemp,Temp,31)
            Y+=Temp;

            MUL32x32INTO32(XTemp,X,Temp,31)
            XTemp=Temp;
        }
    }
    A=*pCoefficients;
    pCoefficients++;

    if(A<0)
    {
        A=Abs_32(A);
        Y=Y>>A;
    }
    else
    {
        Y = Y<<A;
    }
    return Y;
}
#endif
