12c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*
22c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2004-2010 NXP Software
32c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2010 The Android Open Source Project
42c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
52c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
62c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * you may not use this file except in compliance with the License.
72c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * You may obtain a copy of the License at
82c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
92c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Unless required by applicable law or agreed to in writing, software
122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * See the License for the specific language governing permissions and
152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * limitations under the License.
162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */
172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifndef _VECTOR_ARITHMETIC_H_
192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define _VECTOR_ARITHMETIC_H_
202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifdef __cplusplus
232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentextern "C" {
242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif /* __cplusplus */
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Types.h"
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    VARIOUS FUNCTIONS
302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/
312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LoadConst_16(            const LVM_INT16 val,
332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 *dst,
342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n );
352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LoadConst_32(            const LVM_INT32 val,
372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT32 *dst,
382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n );
392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Copy_16(                 const LVM_INT16 *src,
412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 *dst,
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n );
432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*********************************************************************************
452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * note: In Mult3s_16x16() saturation of result is not taken care when           *
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *       overflow occurs.                                                        *
472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *       For example when *src = 0x8000, val = *0x8000                           *
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *       The function gives the output as 0x8000 instead of 0x7fff               *
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *       This is the only case which will give wrong result.                     *
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *       For more information refer to Vector_Arithmetic.doc in /doc folder      *
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *********************************************************************************/
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Mult3s_16x16(            const LVM_INT16 *src,
532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              const LVM_INT16 val,
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 *dst,
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n);
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*********************************************************************************
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * note: In Mult3s_32x16() saturation of result is not taken care when           *
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *       overflow occurs.                                                        *
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *       For example when *src = 0x8000000, val = *0x8000                        *
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *       The function gives the output as 0x8000000 instead of 0x7fffffff        *
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *       This is the only extreme condition which is giving unexpected result    *
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *       For more information refer to Vector_Arithmetic.doc in /doc folder      *
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *********************************************************************************/
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Mult3s_32x16(            const LVM_INT32  *src,
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              const LVM_INT16 val,
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT32  *dst,
682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n);
692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid DelayMix_16x16(          const LVM_INT16 *src,
712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 *delay,
722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 size,
732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 *dst,
742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 *pOffset,
752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n);
762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid DelayWrite_32(           const LVM_INT32  *src,               /* Source 1, to be delayed */
782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT32  *delay,             /* Delay buffer */
792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_UINT16 size,               /* Delay size */
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_UINT16 *pOffset,           /* Delay offset */
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n);
822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Add2_Sat_16x16(          const LVM_INT16 *src,
842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 *dst,
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n );
862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Add2_Sat_32x32(          const LVM_INT32  *src,
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT32  *dst,
892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n );
902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Mac3s_Sat_16x16(         const LVM_INT16 *src,
922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              const LVM_INT16 val,
932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 *dst,
942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n);
952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Mac3s_Sat_32x16(         const LVM_INT32  *src,
972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              const LVM_INT16 val,
982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT32  *dst,
992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n);
1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid DelayAllPass_Sat_32x16To32(    LVM_INT32  *delay,              /* Delay buffer */
1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_UINT16 size,                /* Delay size */
1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 coeff,                /* All pass filter coefficient */
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_UINT16 DelayOffset,         /* Simple delay offset */
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_UINT16 *pAllPassOffset,     /* All pass filter delay offset */
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT32  *dst,                /* Source/destination */
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n);
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    SHIFT FUNCTIONS
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/
1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Shift_Sat_v16xv16 (      const LVM_INT16 val,
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              const LVM_INT16 *src,
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 *dst,
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n);
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Shift_Sat_v32xv32 (      const LVM_INT16 val,
1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              const LVM_INT32 *src,
1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT32 *dst,
1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n);
1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************
1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    AUDIO FORMAT CONVERSION FUNCTIONS
1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/
1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid MonoTo2I_16(             const LVM_INT16 *src,
1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 *dst,
1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n);
1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid MonoTo2I_32(             const LVM_INT32  *src,
1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT32  *dst,
1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n);
1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid From2iToMono_32(         const LVM_INT32  *src,
1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT32  *dst,
1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n);
1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid MSTo2i_Sat_16x16(        const LVM_INT16 *srcM,
1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              const LVM_INT16 *srcS,
1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 *dst,
1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n );
1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid From2iToMS_16x16(        const LVM_INT16 *src,
1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 *dstM,
1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 *dstS,
1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n );
1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid From2iToMono_16(         const LVM_INT16 *src,
1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 *dst,
1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n);
1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid JoinTo2i_32x32(          const LVM_INT32  *srcL,
1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              const LVM_INT32  *srcR,
1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT32  *dst,
1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n );
1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************
1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    DATA TYPE CONVERSION FUNCTIONS
1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/
1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Int16LShiftToInt32_16x32(const LVM_INT16 *src,
1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT32  *dst,
1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n,
1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 shift );
1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid Int32RShiftToInt16_Sat_32x16(const  LVM_INT32  *src,
1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 *dst,
1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 n,
1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    LVM_INT16 shift );
1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifdef __cplusplus
1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif /* __cplusplus */
1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************/
1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif  /* _VECTOR_ARITHMETIC_H_ */
1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************/
182