You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1058 lines
63 KiB
1058 lines
63 KiB
/******************************************************************************
|
|
*
|
|
* Copyright (C) 2018 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.
|
|
*
|
|
*****************************************************************************
|
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
|
*/
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* file name : ia_basic_ops40.h */
|
|
/* */
|
|
/* description : this file has all basic operations, which have */
|
|
/* 40 bit intermediate operations */
|
|
/* */
|
|
/* list of functions: 1. norm40 */
|
|
/* 2. add32_shr40 */
|
|
/* 3. sub32_shr40 */
|
|
/* 4. mult32x16in32_shl */
|
|
/* 5. mult32x16in32 */
|
|
/* 6. mult32x16in32_shl_sat */
|
|
/* 7. mult32_shl */
|
|
/* 8. mult32 */
|
|
/* 9. mult32_shl_sat */
|
|
/* 10.mac32x16in32 */
|
|
/* 11.mac32x16in32_shl */
|
|
/* 12.mac32x16in32_shl_sat */
|
|
/* 13.mac32 */
|
|
/* 14.mac32_shl */
|
|
/* 15.mac32_shl_sat */
|
|
/* 16.msu32x16in32 */
|
|
/* 17.msu32x16in32_shl */
|
|
/* 18.msu32x16in32_shl_sat */
|
|
/* 19.msu32 */
|
|
/* 20.msu32_shl */
|
|
/* 21.msu32_shl_sat */
|
|
/* 22.mac3216_arr40 */
|
|
/* 23.mac32_arr40 */
|
|
/* 24.mac16_arr40 */
|
|
/* 25.add32_arr40 */
|
|
/* */
|
|
/* issues / problems: none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
#ifndef __IA_BASIC_OPS40_H__
|
|
#define __IA_BASIC_OPS40_H__
|
|
|
|
/*****************************************************************************/
|
|
/* file includes */
|
|
/* ia_type_def.h */
|
|
/* ia_basic_ops32.h */
|
|
/*****************************************************************************/
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : norm40 */
|
|
/* */
|
|
/* description : normalize input to 32 bits, return denormalizing info */
|
|
/* static function */
|
|
/* */
|
|
/* inputs : WORD40 *in */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : if input above 32_bits then only the upper 8 bits */
|
|
/* normalized to fit in 32_bits else normal 32_bit norming */
|
|
/* */
|
|
/* outputs : normalized 32 bit value */
|
|
/* */
|
|
/* returns : WORD16 exponent */
|
|
/* */
|
|
/* assumptions : if supplied input is 0 the result returned is 31 */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD16 norm40(WORD40 *in)
|
|
{
|
|
WORD16 expo;
|
|
WORD32 tempo;
|
|
WORD40 cmp_val = (WORD40)-2147483648.0;
|
|
|
|
if(0 == (*in))
|
|
return 31;
|
|
|
|
if(((*in) <= 0x7fffffff) && ((WORD40)(*in) >= cmp_val))
|
|
{
|
|
tempo = (WORD32)(*in);
|
|
expo = norm32(tempo);
|
|
*in = tempo << expo;
|
|
|
|
return (expo);
|
|
}
|
|
|
|
tempo = (WORD32)((*in) >> 31);
|
|
expo = 31 - (norm32(tempo));
|
|
*in = (*in) >> expo;
|
|
|
|
return (-expo);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : add32_shr40 */
|
|
/* */
|
|
/* description : adds two numbers and right shifts once */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : add and right shift */
|
|
/* */
|
|
/* returns : WORD32 sum */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 add32_shr40(WORD32 a, WORD32 b)
|
|
{
|
|
WORD40 sum;
|
|
|
|
sum = (WORD40)a + (WORD40)b;
|
|
sum = sum >> 1;
|
|
|
|
return ((WORD32)sum);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : sub32_shr40 */
|
|
/* */
|
|
/* description : subtracts and right shifts once */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : substract and right shift */
|
|
/* */
|
|
/* returns : WORD32 sum */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 sub32_shr40(WORD32 a, WORD32 b)
|
|
{
|
|
WORD40 sum;
|
|
|
|
sum = (WORD40)a - (WORD40)b;
|
|
sum = sum >> 1;
|
|
|
|
return ((WORD32)sum);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : mult32x16in32_shl */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD16 return bits 46 to 15 */
|
|
/* doesnt take care of saturation */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD16 b */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : multiply and right shift by 15 */
|
|
/* */
|
|
/* returns : WORD32 result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mult32x16in32_shl(WORD32 a, WORD16 b)
|
|
{
|
|
WORD32 result;
|
|
LWORD64 temp_result;
|
|
|
|
temp_result = (LWORD64)a * (LWORD64)b;
|
|
|
|
result = (WORD32)((temp_result + 16384) >> 15);
|
|
|
|
return (result);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : mult32x16in32 */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD16 return bits 47 to 16 */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD16 b */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : multiply and right shift by 16 */
|
|
/* */
|
|
/* returns : WORD32 result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mult32x16in32(WORD32 a, WORD16 b)
|
|
{
|
|
WORD32 result;
|
|
LWORD64 temp_result;
|
|
|
|
temp_result = (LWORD64)a * (LWORD64)b;
|
|
|
|
result = (WORD32)((temp_result + 16384) >> 16);
|
|
|
|
return (result);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : mult32x16in32_shl_sat */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD16 return bits 46 to 15 */
|
|
/* take care of saturation (MIN32 x MIN16 = MAX32) */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD16 b */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : if input mi_ns return MAX32 else */
|
|
/* multiply and right shift by 15 */
|
|
/* */
|
|
/* returns : WORD32 result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mult32x16in32_shl_sat(WORD32 a, WORD16 b)
|
|
{
|
|
WORD32 result;
|
|
|
|
if(a == (WORD32)0x80000000 && b == (WORD16)0x8000)
|
|
{
|
|
result = (WORD32)0x7fffffff;
|
|
}
|
|
else
|
|
{
|
|
result = mult32x16in32_shl(a, b);
|
|
}
|
|
|
|
return (result);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : mult32_shl */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD32 return bits 62 to 31 */
|
|
/* doesnt take care of saturation */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : multiply and right shift by 31 */
|
|
/* */
|
|
/* returns : WORD32 result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mult32_shl(WORD32 a, WORD32 b)
|
|
{
|
|
WORD32 result;
|
|
LWORD64 temp_result;
|
|
|
|
temp_result = (LWORD64)a * (LWORD64)b;
|
|
result = (WORD32)(temp_result >> 31);
|
|
|
|
return (result);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : mult32 */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD32 return bits 63 to 32 */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD16 b */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : multiply and right shift by 32 */
|
|
/* */
|
|
/* returns : WORD32 result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mult32(WORD32 a, WORD32 b)
|
|
{
|
|
WORD32 result;
|
|
LWORD64 temp_result;
|
|
|
|
temp_result = (LWORD64)a * (LWORD64)b;
|
|
result = (WORD32)(temp_result >> 32);
|
|
|
|
return (result);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : mult32_shl_sat */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD32 return bits 62 to 31 */
|
|
/* take care of saturation (MIN32 x MIN32 = MAX32) */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : if input mi_ns return MAX32 else */
|
|
/* multiply and right shift by 31 */
|
|
/* */
|
|
/* returns : WORD32 result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
#define MPYHIRC(x, y) \
|
|
(((int)((short)(x >> 16) * (unsigned short)(y & 0x0000FFFF) + 0x4000) >> 15) + \
|
|
((int)((short)(x >> 16) * (short)((y) >> 16)) << 1))
|
|
|
|
#define MPYLUHS(x, y) ((int)((unsigned short)(x & 0x0000FFFF) * (short)(y >> 16)))
|
|
|
|
static PLATFORM_INLINE WORD32 mult32_shl_sat(WORD32 a, WORD32 b)
|
|
{
|
|
WORD32 high;
|
|
|
|
high = (MPYHIRC(a, b) + (MPYLUHS(a, b) >> 15));
|
|
|
|
return high;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : mac32x16in32 */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD16 add bits 47 to 16 to acc */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b, WORD16 c */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : multiply, right shift by 16 & add to acc */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mac32x16in32(WORD32 a, WORD32 b, WORD16 c)
|
|
{
|
|
WORD32 result;
|
|
|
|
result = a + mult32x16in32(b, c);
|
|
|
|
return (result);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : mac32x16in32_shl */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD16 add bits 46 to 15 to acc */
|
|
/* doesnt take care of saturation */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b, WORD16 c */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : multiply, right shift by 15 & add to acc */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mac32x16in32_shl(WORD32 a, WORD32 b, WORD16 c)
|
|
{
|
|
WORD32 result;
|
|
|
|
result = a + mult32x16in32_shl(b, c);
|
|
|
|
return (result);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : mac32x16in32_shl_sat */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD16 add bits 46 to 15 to acc */
|
|
/* takes care of saturation in multiply and addition */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b, WORD16 c */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : if input mi_ns add MAX32 else multiply, */
|
|
/* right shift by 15 & add to acc with saturation */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mac32x16in32_shl_sat(WORD32 a, WORD32 b, WORD16 c)
|
|
{
|
|
return (add32_sat(a, mult32x16in32_shl_sat(b, c)));
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : mac32 */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD32 add bits 63 to 32 to acc */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b, WORD32 c */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : multiply, right shift by 32 & add to acc */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mac32(WORD32 a, WORD32 b, WORD32 c)
|
|
{
|
|
WORD32 result;
|
|
|
|
result = a + mult32(b, c);
|
|
|
|
return (result);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : mac32_shl */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD32 add bits 62 to 31 to acc */
|
|
/* doesnt take care of saturation */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b, WORD32 c */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : multiply, right shift by 31 & add to acc */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mac32_shl(WORD32 a, WORD32 b, WORD32 c)
|
|
{
|
|
WORD32 result;
|
|
|
|
result = a + mult32_shl(b, c);
|
|
|
|
return (result);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : mac32_shl_sat */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD32 add bits 62 to 31 to acc */
|
|
/* takes care of saturation in multiply and addition */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b, WORD32 c */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : if input mi_ns add MAX32 else multiply, */
|
|
/* right shift by 31 & add to acc with saturation */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mac32_shl_sat(WORD32 a, WORD32 b, WORD32 c)
|
|
{
|
|
return (add32_sat(a, mult32_shl_sat(b, c)));
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : msu32x16in32 */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD16 sub bits 47 to 16 from acc */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b, WORD16 c */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : multiply, right shift by 16 & sub from acc */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 msu32x16in32(WORD32 a, WORD32 b, WORD16 c)
|
|
{
|
|
WORD32 result;
|
|
|
|
result = a - mult32x16in32(b, c);
|
|
|
|
return (result);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : msu32x16in32_shl */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD16 sub bits 46 to 15 from acc */
|
|
/* doesnt take care of saturation */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b, WORD16 c */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : multiply, right shift by 15 & sub from acc */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 msu32x16in32_shl(WORD32 a, WORD32 b, WORD16 c)
|
|
{
|
|
WORD32 result;
|
|
|
|
result = a - mult32x16in32_shl(b, c);
|
|
|
|
return (result);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : msu32x16in32_shl_sat */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD16 sub bits 46 to 15 from acc */
|
|
/* takes care of saturation in multiply and addition */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b, WORD16 c */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : if input mi_ns sub MAX32 else multiply, */
|
|
/* right shift by 15 & sub from acc with saturation */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 msu32x16in32_shl_sat(WORD32 a, WORD32 b, WORD16 c)
|
|
{
|
|
return (sub32_sat(a, mult32x16in32_shl_sat(b, c)));
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : msu32 */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD32 sub bits 63 to 32 from acc */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b, WORD32 c */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : multiply, right shift by 32 & sub from acc */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 msu32(WORD32 a, WORD32 b, WORD32 c)
|
|
{
|
|
WORD32 result;
|
|
|
|
result = a - mult32(b, c);
|
|
|
|
return (result);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : msu32_shl */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD32 sub bits 62 to 31 from acc */
|
|
/* doesnt take care of saturation */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b, WORD32 c */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : multiply, right shift by 31 & sub from acc */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 msu32_shl(WORD32 a, WORD32 b, WORD32 c)
|
|
{
|
|
WORD32 result;
|
|
|
|
result = a - mult32_shl(b, c);
|
|
|
|
return (result);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : msu32_shl_sat */
|
|
/* */
|
|
/* description : multiply WORD32 with WORD32 sub bits 62 to 31 from acc */
|
|
/* takes care of saturation in multiply and addition */
|
|
/* */
|
|
/* inputs : WORD32 a, WORD32 b, WORD32 c */
|
|
/* */
|
|
/* outputs : none */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : if input mi_ns sub MAX32 else multiply, */
|
|
/* right shift by 31 & sub from acc with saturation */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 msu32_shl_sat(WORD32 a, WORD32 b, WORD32 c)
|
|
{
|
|
return (sub32_sat(a, mult32_shl_sat(b, c)));
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : mac3216_arr40 */
|
|
/* */
|
|
/* description : returns normalized 32 bit accumulated result and */
|
|
/* denormalizing info */
|
|
/* */
|
|
/* inputs : WORD32 x[], WORD16 y[], LOOPINDEX length */
|
|
/* */
|
|
/* outputs : WORD16 *q_val */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : multiply and accumalate in WORD40 finally normalize */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* assumptions : length < 256 for strict definition of WORD40 */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mac3216_arr40(WORD32 *x, WORD16 *y, LOOPINDEX length, WORD16 *q_val)
|
|
{
|
|
LOOPINDEX i;
|
|
WORD40 sum = 0;
|
|
|
|
for(i = 0; i < length; i++)
|
|
{
|
|
sum += (WORD40)(mult32x16in32(x[i], y[i]));
|
|
}
|
|
|
|
*q_val = norm40(&sum);
|
|
|
|
return (WORD32)sum;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : mac32_arr40 */
|
|
/* */
|
|
/* description : returns normalized 32 bit accumulated result and */
|
|
/* denormalizing info */
|
|
/* */
|
|
/* inputs : WORD32 x[], WORD32 y[], LOOPINDEX length */
|
|
/* */
|
|
/* outputs : WORD16 *q_val */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : multiply and accumalate in WORD40 finally normalize */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* assumptions : length < 256 for strict definition of WORD40 */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mac32_arr40(WORD32 *x, WORD32 *y, LOOPINDEX length, WORD16 *q_val)
|
|
{
|
|
LOOPINDEX i;
|
|
WORD40 sum = 0;
|
|
|
|
for(i = 0; i < length; i++)
|
|
{
|
|
sum += (WORD40)(mult32(x[i], y[i]));
|
|
}
|
|
|
|
*q_val = norm40(&sum);
|
|
|
|
return ((WORD32)sum);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : mac16_arr40 */
|
|
/* */
|
|
/* description : returns normalized 32 bit accumulated result and */
|
|
/* denormalizing info */
|
|
/* */
|
|
/* inputs : WORD16 x[], WORD16 y[], LOOPINDEX length */
|
|
/* */
|
|
/* outputs : WORD16 *q_val */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : multiply and accumalate in WORD40 finally normalize */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* assumptions : length < 256 for strict definition of WORD40 */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 mac16_arr40(WORD16 *x, WORD16 *y, LOOPINDEX length, WORD16 *q_val)
|
|
{
|
|
LOOPINDEX i;
|
|
WORD40 sum = 0;
|
|
|
|
for(i = 0; i < length; i++)
|
|
{
|
|
sum += (WORD40)((WORD32)x[i] * (WORD32)y[i]);
|
|
}
|
|
|
|
*q_val = norm40(&sum);
|
|
|
|
return ((WORD32)sum);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* function name : add32_arr40 */
|
|
/* */
|
|
/* description : returns normalized 32 bit accumulated result and */
|
|
/* denormalizing info */
|
|
/* */
|
|
/* inputs : WORD32 x[], LOOPINDEX length */
|
|
/* */
|
|
/* outputs : WORD16 *q_val */
|
|
/* */
|
|
/* globals : none */
|
|
/* */
|
|
/* processing : accumalate in WORD40 finally normalize */
|
|
/* */
|
|
/* returns : WORD32 accumulated result */
|
|
/* */
|
|
/* assumptions : length < 256 for strict definition of WORD40 */
|
|
/* */
|
|
/* issues : none */
|
|
/* */
|
|
/* revision history : */
|
|
/* */
|
|
/* DD MM YYYY author changes */
|
|
/* 06 12 2002 ashok M/chetan K created */
|
|
/* 21 11 2003 raghavendra K R modified(bug fixes) */
|
|
/* 15 11 2004 tejaswi/vishal modified(bug fixes/cleanup) */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static PLATFORM_INLINE WORD32 add32_arr40(WORD32 *in_arr, LOOPINDEX length, WORD16 *q_val)
|
|
{
|
|
LOOPINDEX i;
|
|
WORD40 sum = 0;
|
|
|
|
for(i = 0; i < length; i++)
|
|
{
|
|
sum += (WORD40)in_arr[i];
|
|
}
|
|
|
|
*q_val = norm40(&sum);
|
|
|
|
return ((WORD32)sum);
|
|
}
|
|
|
|
#endif /* __IA_BASIC_OPS40_H__ */
|