Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2004-2010 NXP Software
      3  * Copyright (C) 2010 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 #include "LVM_Types.h"
     19 #include "LVM_Macros.h"
     20 #include "ScalarArithmetic.h"
     21 
     22 /*-------------------------------------------------------------------------*/
     23 /* FUNCTION:                                                               */
     24 /*   LVM_Polynomial                                                        */
     25 /*                                                                         */
     26 /* DESCRIPTION:                                                            */
     27 /*   This function performs polynomial expansion                           */
     28 /*  Y = (A0 + A1*X + A2*X2 + A3*X3 + .. + AN*xN) << AN+1                  */
     29 /*                                                                         */
     30 /*  LVM_INT32 LVM_Polynomial(LVM_UINT16    N,                              */
     31 /*                           LVM_INT32    *pCoefficients,                  */
     32 /*                           LVM_INT32    X)                               */
     33 /*                                                                         */
     34 /* PARAMETERS:                                                             */
     35 /*                                                                         */
     36 /*  N                is the polynomial order                               */
     37 /*  pCoefficients    is the ptr to polynomial coefficients A0,A1.. in Q.31 */
     38 /*  X                is the input variable                                 */
     39 /*                                                                         */
     40 /* RETURNS:                                                                */
     41 /*   The result of the polynomial expansion in Q1.31 format                */
     42 /*-------------------------------------------------------------------------*/
     43 
     44 LVM_INT32 LVM_Polynomial(LVM_UINT16    N,
     45                          LVM_INT32    *pCoefficients,
     46                          LVM_INT32    X)
     47 {
     48     LVM_INT32 i;
     49     LVM_INT32 Y,A,XTemp,Temp,sign;
     50 
     51     Y=*pCoefficients; /* Y=A0*/
     52     pCoefficients++;
     53 
     54     if((LVM_UINT32)X==0x80000000)
     55     {
     56         Temp=-1;
     57         sign=Temp;
     58         for(i=1;i<=N;i++)
     59         {
     60             Y+=((*pCoefficients)*sign);
     61             pCoefficients++;
     62             sign*=Temp;
     63         }
     64 
     65 
     66     }
     67     else
     68     {
     69         XTemp=X;
     70         for(i=N-1;i>=0;i--)
     71         {
     72             A=*pCoefficients;
     73             pCoefficients++;
     74 
     75             MUL32x32INTO32(A,XTemp,Temp,31)
     76             Y+=Temp;
     77 
     78             MUL32x32INTO32(XTemp,X,Temp,31)
     79             XTemp=Temp;
     80         }
     81     }
     82     A=*pCoefficients;
     83     pCoefficients++;
     84 
     85     if(A<0)
     86     {
     87         A=Abs_32(A);
     88         Y=Y>>A;
     89     }
     90     else
     91     {
     92         Y = Y<<A;
     93     }
     94     return Y;
     95 }
     96 
     97