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