/* * 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 */ /*-------------------------------------------------------------------------*/ 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<