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

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