diff options
| author | Ram Mohan <ram.mohan@ittiam.com> | 2018-10-05 18:05:06 +0530 |
|---|---|---|
| committer | Ray Essick <essick@google.com> | 2019-02-18 07:43:11 -0800 |
| commit | 69da5e22f66880b785b8d9d9b2b0ca706ac24d91 (patch) | |
| tree | f74d679fa97b370f412b864781c3bc03bde0e256 /encoder/ia_basic_ops40.h | |
| parent | e9568e04fc0749e3b3ad8bdcce61163f0f08d894 (diff) | |
| download | platform_external_libhevc-69da5e22f66880b785b8d9d9b2b0ca706ac24d91.tar.gz platform_external_libhevc-69da5e22f66880b785b8d9d9b2b0ca706ac24d91.tar.bz2 platform_external_libhevc-69da5e22f66880b785b8d9d9b2b0ca706ac24d91.zip | |
libhevcenc: Initial commit
Test: hevcenc -c vid_enc_cfg.txt
Bug: 110456253
Test: CtsMediaTests/VideoEncoder
Change-Id: I9df8143709c3fe5d2c8398974a16529a3f8b8ebc
Diffstat (limited to 'encoder/ia_basic_ops40.h')
| -rw-r--r-- | encoder/ia_basic_ops40.h | 1057 |
1 files changed, 1057 insertions, 0 deletions
diff --git a/encoder/ia_basic_ops40.h b/encoder/ia_basic_ops40.h new file mode 100644 index 0000000..826f8c1 --- /dev/null +++ b/encoder/ia_basic_ops40.h @@ -0,0 +1,1057 @@ +/****************************************************************************** + * + * 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__ */ |
