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