xref: /aosp_15_r20/external/libhevc/encoder/ia_basic_ops40.h (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar  *
3*c83a76b0SSuyog Pawar  * Copyright (C) 2018 The Android Open Source Project
4*c83a76b0SSuyog Pawar  *
5*c83a76b0SSuyog Pawar  * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar  * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar  * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar  *
9*c83a76b0SSuyog Pawar  * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar  *
11*c83a76b0SSuyog Pawar  * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar  * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar  * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar  * limitations under the License.
16*c83a76b0SSuyog Pawar  *
17*c83a76b0SSuyog Pawar  *****************************************************************************
18*c83a76b0SSuyog Pawar  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*c83a76b0SSuyog Pawar */
20*c83a76b0SSuyog Pawar 
21*c83a76b0SSuyog Pawar /*****************************************************************************/
22*c83a76b0SSuyog Pawar /*                                                                           */
23*c83a76b0SSuyog Pawar /*  file name        : ia_basic_ops40.h                                      */
24*c83a76b0SSuyog Pawar /*                                                                           */
25*c83a76b0SSuyog Pawar /*  description      : this file has all basic operations, which have        */
26*c83a76b0SSuyog Pawar /*                     40 bit intermediate operations                        */
27*c83a76b0SSuyog Pawar /*                                                                           */
28*c83a76b0SSuyog Pawar /*  list of functions: 1. norm40                                             */
29*c83a76b0SSuyog Pawar /*                     2. add32_shr40                                        */
30*c83a76b0SSuyog Pawar /*                     3. sub32_shr40                                        */
31*c83a76b0SSuyog Pawar /*                     4. mult32x16in32_shl                                  */
32*c83a76b0SSuyog Pawar /*                     5. mult32x16in32                                      */
33*c83a76b0SSuyog Pawar /*                     6. mult32x16in32_shl_sat                              */
34*c83a76b0SSuyog Pawar /*                     7. mult32_shl                                         */
35*c83a76b0SSuyog Pawar /*                     8. mult32                                             */
36*c83a76b0SSuyog Pawar /*                     9. mult32_shl_sat                                     */
37*c83a76b0SSuyog Pawar /*                     10.mac32x16in32                                       */
38*c83a76b0SSuyog Pawar /*                     11.mac32x16in32_shl                                   */
39*c83a76b0SSuyog Pawar /*                     12.mac32x16in32_shl_sat                               */
40*c83a76b0SSuyog Pawar /*                     13.mac32                                              */
41*c83a76b0SSuyog Pawar /*                     14.mac32_shl                                          */
42*c83a76b0SSuyog Pawar /*                     15.mac32_shl_sat                                      */
43*c83a76b0SSuyog Pawar /*                     16.msu32x16in32                                       */
44*c83a76b0SSuyog Pawar /*                     17.msu32x16in32_shl                                   */
45*c83a76b0SSuyog Pawar /*                     18.msu32x16in32_shl_sat                               */
46*c83a76b0SSuyog Pawar /*                     19.msu32                                              */
47*c83a76b0SSuyog Pawar /*                     20.msu32_shl                                          */
48*c83a76b0SSuyog Pawar /*                     21.msu32_shl_sat                                      */
49*c83a76b0SSuyog Pawar /*                     22.mac3216_arr40                                      */
50*c83a76b0SSuyog Pawar /*                     23.mac32_arr40                                        */
51*c83a76b0SSuyog Pawar /*                     24.mac16_arr40                                        */
52*c83a76b0SSuyog Pawar /*                     25.add32_arr40                                        */
53*c83a76b0SSuyog Pawar /*                                                                           */
54*c83a76b0SSuyog Pawar /*  issues / problems: none                                                  */
55*c83a76b0SSuyog Pawar /*                                                                           */
56*c83a76b0SSuyog Pawar /*  revision history :                                                       */
57*c83a76b0SSuyog Pawar /*                                                                           */
58*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
59*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
60*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
61*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
62*c83a76b0SSuyog Pawar /*                                                                           */
63*c83a76b0SSuyog Pawar /*****************************************************************************/
64*c83a76b0SSuyog Pawar 
65*c83a76b0SSuyog Pawar #ifndef __IA_BASIC_OPS40_H__
66*c83a76b0SSuyog Pawar #define __IA_BASIC_OPS40_H__
67*c83a76b0SSuyog Pawar 
68*c83a76b0SSuyog Pawar /*****************************************************************************/
69*c83a76b0SSuyog Pawar /* file includes                                                             */
70*c83a76b0SSuyog Pawar /*  ia_type_def.h                                                            */
71*c83a76b0SSuyog Pawar /*  ia_basic_ops32.h                                                         */
72*c83a76b0SSuyog Pawar /*****************************************************************************/
73*c83a76b0SSuyog Pawar 
74*c83a76b0SSuyog Pawar /*****************************************************************************/
75*c83a76b0SSuyog Pawar /*                                                                           */
76*c83a76b0SSuyog Pawar /*  function name : norm40                                                   */
77*c83a76b0SSuyog Pawar /*                                                                           */
78*c83a76b0SSuyog Pawar /*  description   : normalize input to 32 bits, return denormalizing info    */
79*c83a76b0SSuyog Pawar /*                  static function                                          */
80*c83a76b0SSuyog Pawar /*                                                                           */
81*c83a76b0SSuyog Pawar /*  inputs        : WORD40  *in                                              */
82*c83a76b0SSuyog Pawar /*                                                                           */
83*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
84*c83a76b0SSuyog Pawar /*                                                                           */
85*c83a76b0SSuyog Pawar /*  processing    : if input above 32_bits then only the upper 8 bits        */
86*c83a76b0SSuyog Pawar /*                  normalized to fit in 32_bits else normal 32_bit norming  */
87*c83a76b0SSuyog Pawar /*                                                                           */
88*c83a76b0SSuyog Pawar /*  outputs       : normalized 32 bit value                                  */
89*c83a76b0SSuyog Pawar /*                                                                           */
90*c83a76b0SSuyog Pawar /*  returns       : WORD16 exponent                                          */
91*c83a76b0SSuyog Pawar /*                                                                           */
92*c83a76b0SSuyog Pawar /*  assumptions   : if supplied input is 0 the result returned is 31         */
93*c83a76b0SSuyog Pawar /*                                                                           */
94*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
95*c83a76b0SSuyog Pawar /*                                                                           */
96*c83a76b0SSuyog Pawar /*  revision history :                                                       */
97*c83a76b0SSuyog Pawar /*                                                                           */
98*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
99*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
100*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
101*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
102*c83a76b0SSuyog Pawar /*                                                                           */
103*c83a76b0SSuyog Pawar /*****************************************************************************/
104*c83a76b0SSuyog Pawar 
norm40(WORD40 * in)105*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD16 norm40(WORD40 *in)
106*c83a76b0SSuyog Pawar {
107*c83a76b0SSuyog Pawar     WORD16 expo;
108*c83a76b0SSuyog Pawar     WORD32 tempo;
109*c83a76b0SSuyog Pawar     WORD40 cmp_val = (WORD40)-2147483648.0;
110*c83a76b0SSuyog Pawar 
111*c83a76b0SSuyog Pawar     if(0 == (*in))
112*c83a76b0SSuyog Pawar         return 31;
113*c83a76b0SSuyog Pawar 
114*c83a76b0SSuyog Pawar     if(((*in) <= 0x7fffffff) && ((WORD40)(*in) >= cmp_val))
115*c83a76b0SSuyog Pawar     {
116*c83a76b0SSuyog Pawar         tempo = (WORD32)(*in);
117*c83a76b0SSuyog Pawar         expo = norm32(tempo);
118*c83a76b0SSuyog Pawar         *in = tempo << expo;
119*c83a76b0SSuyog Pawar 
120*c83a76b0SSuyog Pawar         return (expo);
121*c83a76b0SSuyog Pawar     }
122*c83a76b0SSuyog Pawar 
123*c83a76b0SSuyog Pawar     tempo = (WORD32)((*in) >> 31);
124*c83a76b0SSuyog Pawar     expo = 31 - (norm32(tempo));
125*c83a76b0SSuyog Pawar     *in = (*in) >> expo;
126*c83a76b0SSuyog Pawar 
127*c83a76b0SSuyog Pawar     return (-expo);
128*c83a76b0SSuyog Pawar }
129*c83a76b0SSuyog Pawar 
130*c83a76b0SSuyog Pawar /*****************************************************************************/
131*c83a76b0SSuyog Pawar /*                                                                           */
132*c83a76b0SSuyog Pawar /*  function name : add32_shr40                                              */
133*c83a76b0SSuyog Pawar /*                                                                           */
134*c83a76b0SSuyog Pawar /*  description   : adds two numbers and right shifts once                   */
135*c83a76b0SSuyog Pawar /*                                                                           */
136*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b                                       */
137*c83a76b0SSuyog Pawar /*                                                                           */
138*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
139*c83a76b0SSuyog Pawar /*                                                                           */
140*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
141*c83a76b0SSuyog Pawar /*                                                                           */
142*c83a76b0SSuyog Pawar /*  processing    : add and right shift                                      */
143*c83a76b0SSuyog Pawar /*                                                                           */
144*c83a76b0SSuyog Pawar /*  returns       : WORD32 sum                                               */
145*c83a76b0SSuyog Pawar /*                                                                           */
146*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
147*c83a76b0SSuyog Pawar /*                                                                           */
148*c83a76b0SSuyog Pawar /*  revision history :                                                       */
149*c83a76b0SSuyog Pawar /*                                                                           */
150*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
151*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
152*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
153*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
154*c83a76b0SSuyog Pawar /*                                                                           */
155*c83a76b0SSuyog Pawar /*****************************************************************************/
156*c83a76b0SSuyog Pawar 
add32_shr40(WORD32 a,WORD32 b)157*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 add32_shr40(WORD32 a, WORD32 b)
158*c83a76b0SSuyog Pawar {
159*c83a76b0SSuyog Pawar     WORD40 sum;
160*c83a76b0SSuyog Pawar 
161*c83a76b0SSuyog Pawar     sum = (WORD40)a + (WORD40)b;
162*c83a76b0SSuyog Pawar     sum = sum >> 1;
163*c83a76b0SSuyog Pawar 
164*c83a76b0SSuyog Pawar     return ((WORD32)sum);
165*c83a76b0SSuyog Pawar }
166*c83a76b0SSuyog Pawar 
167*c83a76b0SSuyog Pawar /*****************************************************************************/
168*c83a76b0SSuyog Pawar /*                                                                           */
169*c83a76b0SSuyog Pawar /*  function name : sub32_shr40                                              */
170*c83a76b0SSuyog Pawar /*                                                                           */
171*c83a76b0SSuyog Pawar /*  description   : subtracts and right shifts once                          */
172*c83a76b0SSuyog Pawar /*                                                                           */
173*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b                                       */
174*c83a76b0SSuyog Pawar /*                                                                           */
175*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
176*c83a76b0SSuyog Pawar /*                                                                           */
177*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
178*c83a76b0SSuyog Pawar /*                                                                           */
179*c83a76b0SSuyog Pawar /*  processing    : substract and right shift                                */
180*c83a76b0SSuyog Pawar /*                                                                           */
181*c83a76b0SSuyog Pawar /*  returns       : WORD32 sum                                               */
182*c83a76b0SSuyog Pawar /*                                                                           */
183*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
184*c83a76b0SSuyog Pawar /*                                                                           */
185*c83a76b0SSuyog Pawar /*  revision history :                                                       */
186*c83a76b0SSuyog Pawar /*                                                                           */
187*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
188*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
189*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
190*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
191*c83a76b0SSuyog Pawar /*                                                                           */
192*c83a76b0SSuyog Pawar /*****************************************************************************/
193*c83a76b0SSuyog Pawar 
sub32_shr40(WORD32 a,WORD32 b)194*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 sub32_shr40(WORD32 a, WORD32 b)
195*c83a76b0SSuyog Pawar {
196*c83a76b0SSuyog Pawar     WORD40 sum;
197*c83a76b0SSuyog Pawar 
198*c83a76b0SSuyog Pawar     sum = (WORD40)a - (WORD40)b;
199*c83a76b0SSuyog Pawar     sum = sum >> 1;
200*c83a76b0SSuyog Pawar 
201*c83a76b0SSuyog Pawar     return ((WORD32)sum);
202*c83a76b0SSuyog Pawar }
203*c83a76b0SSuyog Pawar 
204*c83a76b0SSuyog Pawar /*****************************************************************************/
205*c83a76b0SSuyog Pawar /*                                                                           */
206*c83a76b0SSuyog Pawar /*  function name : mult32x16in32_shl                                        */
207*c83a76b0SSuyog Pawar /*                                                                           */
208*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD16 return bits 46 to 15         */
209*c83a76b0SSuyog Pawar /*                  doesnt take care of saturation                           */
210*c83a76b0SSuyog Pawar /*                                                                           */
211*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD16 b                                       */
212*c83a76b0SSuyog Pawar /*                                                                           */
213*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
214*c83a76b0SSuyog Pawar /*                                                                           */
215*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
216*c83a76b0SSuyog Pawar /*                                                                           */
217*c83a76b0SSuyog Pawar /*  processing    : multiply and right shift by 15                           */
218*c83a76b0SSuyog Pawar /*                                                                           */
219*c83a76b0SSuyog Pawar /*  returns       : WORD32 result                                            */
220*c83a76b0SSuyog Pawar /*                                                                           */
221*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
222*c83a76b0SSuyog Pawar /*                                                                           */
223*c83a76b0SSuyog Pawar /*  revision history :                                                       */
224*c83a76b0SSuyog Pawar /*                                                                           */
225*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
226*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
227*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
228*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
229*c83a76b0SSuyog Pawar /*                                                                           */
230*c83a76b0SSuyog Pawar /*****************************************************************************/
231*c83a76b0SSuyog Pawar 
mult32x16in32_shl(WORD32 a,WORD16 b)232*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 mult32x16in32_shl(WORD32 a, WORD16 b)
233*c83a76b0SSuyog Pawar {
234*c83a76b0SSuyog Pawar     WORD32 result;
235*c83a76b0SSuyog Pawar     LWORD64 temp_result;
236*c83a76b0SSuyog Pawar 
237*c83a76b0SSuyog Pawar     temp_result = (LWORD64)a * (LWORD64)b;
238*c83a76b0SSuyog Pawar 
239*c83a76b0SSuyog Pawar     result = (WORD32)((temp_result + 16384) >> 15);
240*c83a76b0SSuyog Pawar 
241*c83a76b0SSuyog Pawar     return (result);
242*c83a76b0SSuyog Pawar }
243*c83a76b0SSuyog Pawar 
244*c83a76b0SSuyog Pawar /*****************************************************************************/
245*c83a76b0SSuyog Pawar /*                                                                           */
246*c83a76b0SSuyog Pawar /*  function name : mult32x16in32                                            */
247*c83a76b0SSuyog Pawar /*                                                                           */
248*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD16 return bits 47 to 16         */
249*c83a76b0SSuyog Pawar /*                                                                           */
250*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD16 b                                       */
251*c83a76b0SSuyog Pawar /*                                                                           */
252*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
253*c83a76b0SSuyog Pawar /*                                                                           */
254*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
255*c83a76b0SSuyog Pawar /*                                                                           */
256*c83a76b0SSuyog Pawar /*  processing    : multiply and right shift by 16                           */
257*c83a76b0SSuyog Pawar /*                                                                           */
258*c83a76b0SSuyog Pawar /*  returns       : WORD32 result                                            */
259*c83a76b0SSuyog Pawar /*                                                                           */
260*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
261*c83a76b0SSuyog Pawar /*                                                                           */
262*c83a76b0SSuyog Pawar /*  revision history :                                                       */
263*c83a76b0SSuyog Pawar /*                                                                           */
264*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
265*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
266*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
267*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
268*c83a76b0SSuyog Pawar /*                                                                           */
269*c83a76b0SSuyog Pawar /*****************************************************************************/
270*c83a76b0SSuyog Pawar 
mult32x16in32(WORD32 a,WORD16 b)271*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 mult32x16in32(WORD32 a, WORD16 b)
272*c83a76b0SSuyog Pawar {
273*c83a76b0SSuyog Pawar     WORD32 result;
274*c83a76b0SSuyog Pawar     LWORD64 temp_result;
275*c83a76b0SSuyog Pawar 
276*c83a76b0SSuyog Pawar     temp_result = (LWORD64)a * (LWORD64)b;
277*c83a76b0SSuyog Pawar 
278*c83a76b0SSuyog Pawar     result = (WORD32)((temp_result + 16384) >> 16);
279*c83a76b0SSuyog Pawar 
280*c83a76b0SSuyog Pawar     return (result);
281*c83a76b0SSuyog Pawar }
282*c83a76b0SSuyog Pawar 
283*c83a76b0SSuyog Pawar /*****************************************************************************/
284*c83a76b0SSuyog Pawar /*                                                                           */
285*c83a76b0SSuyog Pawar /*  function name : mult32x16in32_shl_sat                                    */
286*c83a76b0SSuyog Pawar /*                                                                           */
287*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD16 return bits 46 to 15         */
288*c83a76b0SSuyog Pawar /*                  take care of saturation (MIN32 x MIN16 = MAX32)          */
289*c83a76b0SSuyog Pawar /*                                                                           */
290*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD16 b                                       */
291*c83a76b0SSuyog Pawar /*                                                                           */
292*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
293*c83a76b0SSuyog Pawar /*                                                                           */
294*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
295*c83a76b0SSuyog Pawar /*                                                                           */
296*c83a76b0SSuyog Pawar /*  processing    : if input mi_ns return MAX32 else                         */
297*c83a76b0SSuyog Pawar /*                  multiply and right shift by 15                           */
298*c83a76b0SSuyog Pawar /*                                                                           */
299*c83a76b0SSuyog Pawar /*  returns       : WORD32 result                                            */
300*c83a76b0SSuyog Pawar /*                                                                           */
301*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
302*c83a76b0SSuyog Pawar /*                                                                           */
303*c83a76b0SSuyog Pawar /*  revision history :                                                       */
304*c83a76b0SSuyog Pawar /*                                                                           */
305*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
306*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
307*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
308*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
309*c83a76b0SSuyog Pawar /*                                                                           */
310*c83a76b0SSuyog Pawar /*****************************************************************************/
311*c83a76b0SSuyog Pawar 
mult32x16in32_shl_sat(WORD32 a,WORD16 b)312*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 mult32x16in32_shl_sat(WORD32 a, WORD16 b)
313*c83a76b0SSuyog Pawar {
314*c83a76b0SSuyog Pawar     WORD32 result;
315*c83a76b0SSuyog Pawar 
316*c83a76b0SSuyog Pawar     if(a == (WORD32)0x80000000 && b == (WORD16)0x8000)
317*c83a76b0SSuyog Pawar     {
318*c83a76b0SSuyog Pawar         result = (WORD32)0x7fffffff;
319*c83a76b0SSuyog Pawar     }
320*c83a76b0SSuyog Pawar     else
321*c83a76b0SSuyog Pawar     {
322*c83a76b0SSuyog Pawar         result = mult32x16in32_shl(a, b);
323*c83a76b0SSuyog Pawar     }
324*c83a76b0SSuyog Pawar 
325*c83a76b0SSuyog Pawar     return (result);
326*c83a76b0SSuyog Pawar }
327*c83a76b0SSuyog Pawar 
328*c83a76b0SSuyog Pawar /*****************************************************************************/
329*c83a76b0SSuyog Pawar /*                                                                           */
330*c83a76b0SSuyog Pawar /*  function name : mult32_shl                                               */
331*c83a76b0SSuyog Pawar /*                                                                           */
332*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD32 return bits 62 to 31         */
333*c83a76b0SSuyog Pawar /*                  doesnt take care of saturation                           */
334*c83a76b0SSuyog Pawar /*                                                                           */
335*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b                                       */
336*c83a76b0SSuyog Pawar /*                                                                           */
337*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
338*c83a76b0SSuyog Pawar /*                                                                           */
339*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
340*c83a76b0SSuyog Pawar /*                                                                           */
341*c83a76b0SSuyog Pawar /*  processing    : multiply and right shift by 31                           */
342*c83a76b0SSuyog Pawar /*                                                                           */
343*c83a76b0SSuyog Pawar /*  returns       : WORD32 result                                            */
344*c83a76b0SSuyog Pawar /*                                                                           */
345*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
346*c83a76b0SSuyog Pawar /*                                                                           */
347*c83a76b0SSuyog Pawar /*  revision history :                                                       */
348*c83a76b0SSuyog Pawar /*                                                                           */
349*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
350*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
351*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
352*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
353*c83a76b0SSuyog Pawar /*                                                                           */
354*c83a76b0SSuyog Pawar /*****************************************************************************/
355*c83a76b0SSuyog Pawar 
mult32_shl(WORD32 a,WORD32 b)356*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 mult32_shl(WORD32 a, WORD32 b)
357*c83a76b0SSuyog Pawar {
358*c83a76b0SSuyog Pawar     WORD32 result;
359*c83a76b0SSuyog Pawar     LWORD64 temp_result;
360*c83a76b0SSuyog Pawar 
361*c83a76b0SSuyog Pawar     temp_result = (LWORD64)a * (LWORD64)b;
362*c83a76b0SSuyog Pawar     result = (WORD32)(temp_result >> 31);
363*c83a76b0SSuyog Pawar 
364*c83a76b0SSuyog Pawar     return (result);
365*c83a76b0SSuyog Pawar }
366*c83a76b0SSuyog Pawar 
367*c83a76b0SSuyog Pawar /*****************************************************************************/
368*c83a76b0SSuyog Pawar /*                                                                           */
369*c83a76b0SSuyog Pawar /*  function name : mult32                                                   */
370*c83a76b0SSuyog Pawar /*                                                                           */
371*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD32 return bits 63 to 32         */
372*c83a76b0SSuyog Pawar /*                                                                           */
373*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD16 b                                       */
374*c83a76b0SSuyog Pawar /*                                                                           */
375*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
376*c83a76b0SSuyog Pawar /*                                                                           */
377*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
378*c83a76b0SSuyog Pawar /*                                                                           */
379*c83a76b0SSuyog Pawar /*  processing    : multiply and right shift by 32                           */
380*c83a76b0SSuyog Pawar /*                                                                           */
381*c83a76b0SSuyog Pawar /*  returns       : WORD32 result                                            */
382*c83a76b0SSuyog Pawar /*                                                                           */
383*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
384*c83a76b0SSuyog Pawar /*                                                                           */
385*c83a76b0SSuyog Pawar /*  revision history :                                                       */
386*c83a76b0SSuyog Pawar /*                                                                           */
387*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
388*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
389*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
390*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
391*c83a76b0SSuyog Pawar /*                                                                           */
392*c83a76b0SSuyog Pawar /*****************************************************************************/
393*c83a76b0SSuyog Pawar 
mult32(WORD32 a,WORD32 b)394*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 mult32(WORD32 a, WORD32 b)
395*c83a76b0SSuyog Pawar {
396*c83a76b0SSuyog Pawar     WORD32 result;
397*c83a76b0SSuyog Pawar     LWORD64 temp_result;
398*c83a76b0SSuyog Pawar 
399*c83a76b0SSuyog Pawar     temp_result = (LWORD64)a * (LWORD64)b;
400*c83a76b0SSuyog Pawar     result = (WORD32)(temp_result >> 32);
401*c83a76b0SSuyog Pawar 
402*c83a76b0SSuyog Pawar     return (result);
403*c83a76b0SSuyog Pawar }
404*c83a76b0SSuyog Pawar 
405*c83a76b0SSuyog Pawar /*****************************************************************************/
406*c83a76b0SSuyog Pawar /*                                                                           */
407*c83a76b0SSuyog Pawar /*  function name : mult32_shl_sat                                           */
408*c83a76b0SSuyog Pawar /*                                                                           */
409*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD32 return bits 62 to 31         */
410*c83a76b0SSuyog Pawar /*                  take care of saturation (MIN32 x MIN32 = MAX32)          */
411*c83a76b0SSuyog Pawar /*                                                                           */
412*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b                                       */
413*c83a76b0SSuyog Pawar /*                                                                           */
414*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
415*c83a76b0SSuyog Pawar /*                                                                           */
416*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
417*c83a76b0SSuyog Pawar /*                                                                           */
418*c83a76b0SSuyog Pawar /*  processing    : if input mi_ns return MAX32 else                         */
419*c83a76b0SSuyog Pawar /*                  multiply and right shift by 31                           */
420*c83a76b0SSuyog Pawar /*                                                                           */
421*c83a76b0SSuyog Pawar /*  returns       : WORD32 result                                            */
422*c83a76b0SSuyog Pawar /*                                                                           */
423*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
424*c83a76b0SSuyog Pawar /*                                                                           */
425*c83a76b0SSuyog Pawar /*  revision history :                                                       */
426*c83a76b0SSuyog Pawar /*                                                                           */
427*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
428*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
429*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
430*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
431*c83a76b0SSuyog Pawar /*                                                                           */
432*c83a76b0SSuyog Pawar /*****************************************************************************/
433*c83a76b0SSuyog Pawar 
434*c83a76b0SSuyog Pawar #define MPYHIRC(x, y)                                                                              \
435*c83a76b0SSuyog Pawar     (((int)((short)(x >> 16) * (unsigned short)(y & 0x0000FFFF) + 0x4000) >> 15) +                 \
436*c83a76b0SSuyog Pawar      ((int)((short)(x >> 16) * (short)((y) >> 16)) << 1))
437*c83a76b0SSuyog Pawar 
438*c83a76b0SSuyog Pawar #define MPYLUHS(x, y) ((int)((unsigned short)(x & 0x0000FFFF) * (short)(y >> 16)))
439*c83a76b0SSuyog Pawar 
mult32_shl_sat(WORD32 a,WORD32 b)440*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 mult32_shl_sat(WORD32 a, WORD32 b)
441*c83a76b0SSuyog Pawar {
442*c83a76b0SSuyog Pawar     WORD32 high;
443*c83a76b0SSuyog Pawar 
444*c83a76b0SSuyog Pawar     high = (MPYHIRC(a, b) + (MPYLUHS(a, b) >> 15));
445*c83a76b0SSuyog Pawar 
446*c83a76b0SSuyog Pawar     return high;
447*c83a76b0SSuyog Pawar }
448*c83a76b0SSuyog Pawar 
449*c83a76b0SSuyog Pawar /*****************************************************************************/
450*c83a76b0SSuyog Pawar /*                                                                           */
451*c83a76b0SSuyog Pawar /*  function name : mac32x16in32                                             */
452*c83a76b0SSuyog Pawar /*                                                                           */
453*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD16 add bits 47 to 16 to acc     */
454*c83a76b0SSuyog Pawar /*                                                                           */
455*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b, WORD16 c                             */
456*c83a76b0SSuyog Pawar /*                                                                           */
457*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
458*c83a76b0SSuyog Pawar /*                                                                           */
459*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
460*c83a76b0SSuyog Pawar /*                                                                           */
461*c83a76b0SSuyog Pawar /*  processing    : multiply, right shift by 16 & add to acc                 */
462*c83a76b0SSuyog Pawar /*                                                                           */
463*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
464*c83a76b0SSuyog Pawar /*                                                                           */
465*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
466*c83a76b0SSuyog Pawar /*                                                                           */
467*c83a76b0SSuyog Pawar /*  revision history :                                                       */
468*c83a76b0SSuyog Pawar /*                                                                           */
469*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
470*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
471*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
472*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
473*c83a76b0SSuyog Pawar /*                                                                           */
474*c83a76b0SSuyog Pawar /*****************************************************************************/
475*c83a76b0SSuyog Pawar 
mac32x16in32(WORD32 a,WORD32 b,WORD16 c)476*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 mac32x16in32(WORD32 a, WORD32 b, WORD16 c)
477*c83a76b0SSuyog Pawar {
478*c83a76b0SSuyog Pawar     WORD32 result;
479*c83a76b0SSuyog Pawar 
480*c83a76b0SSuyog Pawar     result = a + mult32x16in32(b, c);
481*c83a76b0SSuyog Pawar 
482*c83a76b0SSuyog Pawar     return (result);
483*c83a76b0SSuyog Pawar }
484*c83a76b0SSuyog Pawar 
485*c83a76b0SSuyog Pawar /*****************************************************************************/
486*c83a76b0SSuyog Pawar /*                                                                           */
487*c83a76b0SSuyog Pawar /*  function name : mac32x16in32_shl                                         */
488*c83a76b0SSuyog Pawar /*                                                                           */
489*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD16 add bits 46 to 15 to acc     */
490*c83a76b0SSuyog Pawar /*                  doesnt take care of saturation                           */
491*c83a76b0SSuyog Pawar /*                                                                           */
492*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b, WORD16 c                             */
493*c83a76b0SSuyog Pawar /*                                                                           */
494*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
495*c83a76b0SSuyog Pawar /*                                                                           */
496*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
497*c83a76b0SSuyog Pawar /*                                                                           */
498*c83a76b0SSuyog Pawar /*  processing    : multiply, right shift by 15 & add to acc                 */
499*c83a76b0SSuyog Pawar /*                                                                           */
500*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
501*c83a76b0SSuyog Pawar /*                                                                           */
502*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
503*c83a76b0SSuyog Pawar /*                                                                           */
504*c83a76b0SSuyog Pawar /*  revision history :                                                       */
505*c83a76b0SSuyog Pawar /*                                                                           */
506*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
507*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
508*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
509*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
510*c83a76b0SSuyog Pawar /*                                                                           */
511*c83a76b0SSuyog Pawar /*****************************************************************************/
512*c83a76b0SSuyog Pawar 
mac32x16in32_shl(WORD32 a,WORD32 b,WORD16 c)513*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 mac32x16in32_shl(WORD32 a, WORD32 b, WORD16 c)
514*c83a76b0SSuyog Pawar {
515*c83a76b0SSuyog Pawar     WORD32 result;
516*c83a76b0SSuyog Pawar 
517*c83a76b0SSuyog Pawar     result = a + mult32x16in32_shl(b, c);
518*c83a76b0SSuyog Pawar 
519*c83a76b0SSuyog Pawar     return (result);
520*c83a76b0SSuyog Pawar }
521*c83a76b0SSuyog Pawar 
522*c83a76b0SSuyog Pawar /*****************************************************************************/
523*c83a76b0SSuyog Pawar /*                                                                           */
524*c83a76b0SSuyog Pawar /*  function name : mac32x16in32_shl_sat                                     */
525*c83a76b0SSuyog Pawar /*                                                                           */
526*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD16 add bits 46 to 15 to acc     */
527*c83a76b0SSuyog Pawar /*                  takes care of saturation in multiply and addition        */
528*c83a76b0SSuyog Pawar /*                                                                           */
529*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b, WORD16 c                             */
530*c83a76b0SSuyog Pawar /*                                                                           */
531*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
532*c83a76b0SSuyog Pawar /*                                                                           */
533*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
534*c83a76b0SSuyog Pawar /*                                                                           */
535*c83a76b0SSuyog Pawar /*  processing    : if input mi_ns add MAX32 else multiply,                  */
536*c83a76b0SSuyog Pawar /*                  right shift by 15 & add to acc with saturation           */
537*c83a76b0SSuyog Pawar /*                                                                           */
538*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
539*c83a76b0SSuyog Pawar /*                                                                           */
540*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
541*c83a76b0SSuyog Pawar /*                                                                           */
542*c83a76b0SSuyog Pawar /*  revision history :                                                       */
543*c83a76b0SSuyog Pawar /*                                                                           */
544*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
545*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
546*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
547*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
548*c83a76b0SSuyog Pawar /*                                                                           */
549*c83a76b0SSuyog Pawar /*****************************************************************************/
550*c83a76b0SSuyog Pawar 
mac32x16in32_shl_sat(WORD32 a,WORD32 b,WORD16 c)551*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 mac32x16in32_shl_sat(WORD32 a, WORD32 b, WORD16 c)
552*c83a76b0SSuyog Pawar {
553*c83a76b0SSuyog Pawar     return (add32_sat(a, mult32x16in32_shl_sat(b, c)));
554*c83a76b0SSuyog Pawar }
555*c83a76b0SSuyog Pawar 
556*c83a76b0SSuyog Pawar /*****************************************************************************/
557*c83a76b0SSuyog Pawar /*                                                                           */
558*c83a76b0SSuyog Pawar /*  function name : mac32                                                    */
559*c83a76b0SSuyog Pawar /*                                                                           */
560*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD32 add bits 63 to 32 to acc     */
561*c83a76b0SSuyog Pawar /*                                                                           */
562*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b, WORD32 c                             */
563*c83a76b0SSuyog Pawar /*                                                                           */
564*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
565*c83a76b0SSuyog Pawar /*                                                                           */
566*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
567*c83a76b0SSuyog Pawar /*                                                                           */
568*c83a76b0SSuyog Pawar /*  processing    : multiply, right shift by 32 & add to acc                 */
569*c83a76b0SSuyog Pawar /*                                                                           */
570*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
571*c83a76b0SSuyog Pawar /*                                                                           */
572*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
573*c83a76b0SSuyog Pawar /*                                                                           */
574*c83a76b0SSuyog Pawar /*  revision history :                                                       */
575*c83a76b0SSuyog Pawar /*                                                                           */
576*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
577*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
578*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
579*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
580*c83a76b0SSuyog Pawar /*                                                                           */
581*c83a76b0SSuyog Pawar /*****************************************************************************/
582*c83a76b0SSuyog Pawar 
mac32(WORD32 a,WORD32 b,WORD32 c)583*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 mac32(WORD32 a, WORD32 b, WORD32 c)
584*c83a76b0SSuyog Pawar {
585*c83a76b0SSuyog Pawar     WORD32 result;
586*c83a76b0SSuyog Pawar 
587*c83a76b0SSuyog Pawar     result = a + mult32(b, c);
588*c83a76b0SSuyog Pawar 
589*c83a76b0SSuyog Pawar     return (result);
590*c83a76b0SSuyog Pawar }
591*c83a76b0SSuyog Pawar 
592*c83a76b0SSuyog Pawar /*****************************************************************************/
593*c83a76b0SSuyog Pawar /*                                                                           */
594*c83a76b0SSuyog Pawar /*  function name : mac32_shl                                                 */
595*c83a76b0SSuyog Pawar /*                                                                           */
596*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD32 add bits 62 to 31 to acc     */
597*c83a76b0SSuyog Pawar /*                  doesnt take care of saturation                           */
598*c83a76b0SSuyog Pawar /*                                                                           */
599*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b, WORD32 c                             */
600*c83a76b0SSuyog Pawar /*                                                                           */
601*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
602*c83a76b0SSuyog Pawar /*                                                                           */
603*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
604*c83a76b0SSuyog Pawar /*                                                                           */
605*c83a76b0SSuyog Pawar /*  processing    : multiply, right shift by 31 & add to acc                 */
606*c83a76b0SSuyog Pawar /*                                                                           */
607*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
608*c83a76b0SSuyog Pawar /*                                                                           */
609*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
610*c83a76b0SSuyog Pawar /*                                                                           */
611*c83a76b0SSuyog Pawar /*  revision history :                                                       */
612*c83a76b0SSuyog Pawar /*                                                                           */
613*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
614*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
615*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
616*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
617*c83a76b0SSuyog Pawar /*                                                                           */
618*c83a76b0SSuyog Pawar /*****************************************************************************/
619*c83a76b0SSuyog Pawar 
mac32_shl(WORD32 a,WORD32 b,WORD32 c)620*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 mac32_shl(WORD32 a, WORD32 b, WORD32 c)
621*c83a76b0SSuyog Pawar {
622*c83a76b0SSuyog Pawar     WORD32 result;
623*c83a76b0SSuyog Pawar 
624*c83a76b0SSuyog Pawar     result = a + mult32_shl(b, c);
625*c83a76b0SSuyog Pawar 
626*c83a76b0SSuyog Pawar     return (result);
627*c83a76b0SSuyog Pawar }
628*c83a76b0SSuyog Pawar 
629*c83a76b0SSuyog Pawar /*****************************************************************************/
630*c83a76b0SSuyog Pawar /*                                                                           */
631*c83a76b0SSuyog Pawar /*  function name : mac32_shl_sat                                              */
632*c83a76b0SSuyog Pawar /*                                                                           */
633*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD32 add bits 62 to 31 to acc     */
634*c83a76b0SSuyog Pawar /*                  takes care of saturation in multiply and addition        */
635*c83a76b0SSuyog Pawar /*                                                                           */
636*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b, WORD32 c                             */
637*c83a76b0SSuyog Pawar /*                                                                           */
638*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
639*c83a76b0SSuyog Pawar /*                                                                           */
640*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
641*c83a76b0SSuyog Pawar /*                                                                           */
642*c83a76b0SSuyog Pawar /*  processing    : if input mi_ns add MAX32 else multiply,                   */
643*c83a76b0SSuyog Pawar /*                  right shift by 31 & add to acc with saturation           */
644*c83a76b0SSuyog Pawar /*                                                                           */
645*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
646*c83a76b0SSuyog Pawar /*                                                                           */
647*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
648*c83a76b0SSuyog Pawar /*                                                                           */
649*c83a76b0SSuyog Pawar /*  revision history :                                                       */
650*c83a76b0SSuyog Pawar /*                                                                           */
651*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
652*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
653*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
654*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
655*c83a76b0SSuyog Pawar /*                                                                           */
656*c83a76b0SSuyog Pawar /*****************************************************************************/
657*c83a76b0SSuyog Pawar 
mac32_shl_sat(WORD32 a,WORD32 b,WORD32 c)658*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 mac32_shl_sat(WORD32 a, WORD32 b, WORD32 c)
659*c83a76b0SSuyog Pawar {
660*c83a76b0SSuyog Pawar     return (add32_sat(a, mult32_shl_sat(b, c)));
661*c83a76b0SSuyog Pawar }
662*c83a76b0SSuyog Pawar 
663*c83a76b0SSuyog Pawar /*****************************************************************************/
664*c83a76b0SSuyog Pawar /*                                                                           */
665*c83a76b0SSuyog Pawar /*  function name : msu32x16in32                                             */
666*c83a76b0SSuyog Pawar /*                                                                           */
667*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD16 sub bits 47 to 16 from acc   */
668*c83a76b0SSuyog Pawar /*                                                                           */
669*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b, WORD16 c                             */
670*c83a76b0SSuyog Pawar /*                                                                           */
671*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
672*c83a76b0SSuyog Pawar /*                                                                           */
673*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
674*c83a76b0SSuyog Pawar /*                                                                           */
675*c83a76b0SSuyog Pawar /*  processing    : multiply, right shift by 16 & sub from acc               */
676*c83a76b0SSuyog Pawar /*                                                                           */
677*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
678*c83a76b0SSuyog Pawar /*                                                                           */
679*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
680*c83a76b0SSuyog Pawar /*                                                                           */
681*c83a76b0SSuyog Pawar /*  revision history :                                                       */
682*c83a76b0SSuyog Pawar /*                                                                           */
683*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
684*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
685*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
686*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
687*c83a76b0SSuyog Pawar /*                                                                           */
688*c83a76b0SSuyog Pawar /*****************************************************************************/
689*c83a76b0SSuyog Pawar 
msu32x16in32(WORD32 a,WORD32 b,WORD16 c)690*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 msu32x16in32(WORD32 a, WORD32 b, WORD16 c)
691*c83a76b0SSuyog Pawar {
692*c83a76b0SSuyog Pawar     WORD32 result;
693*c83a76b0SSuyog Pawar 
694*c83a76b0SSuyog Pawar     result = a - mult32x16in32(b, c);
695*c83a76b0SSuyog Pawar 
696*c83a76b0SSuyog Pawar     return (result);
697*c83a76b0SSuyog Pawar }
698*c83a76b0SSuyog Pawar 
699*c83a76b0SSuyog Pawar /*****************************************************************************/
700*c83a76b0SSuyog Pawar /*                                                                           */
701*c83a76b0SSuyog Pawar /*  function name : msu32x16in32_shl                                          */
702*c83a76b0SSuyog Pawar /*                                                                           */
703*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD16 sub bits 46 to 15 from acc   */
704*c83a76b0SSuyog Pawar /*                  doesnt take care of saturation                           */
705*c83a76b0SSuyog Pawar /*                                                                           */
706*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b, WORD16 c                             */
707*c83a76b0SSuyog Pawar /*                                                                           */
708*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
709*c83a76b0SSuyog Pawar /*                                                                           */
710*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
711*c83a76b0SSuyog Pawar /*                                                                           */
712*c83a76b0SSuyog Pawar /*  processing    : multiply, right shift by 15 & sub from acc               */
713*c83a76b0SSuyog Pawar /*                                                                           */
714*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
715*c83a76b0SSuyog Pawar /*                                                                           */
716*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
717*c83a76b0SSuyog Pawar /*                                                                           */
718*c83a76b0SSuyog Pawar /*  revision history :                                                       */
719*c83a76b0SSuyog Pawar /*                                                                           */
720*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
721*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
722*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
723*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
724*c83a76b0SSuyog Pawar /*                                                                           */
725*c83a76b0SSuyog Pawar /*****************************************************************************/
726*c83a76b0SSuyog Pawar 
msu32x16in32_shl(WORD32 a,WORD32 b,WORD16 c)727*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 msu32x16in32_shl(WORD32 a, WORD32 b, WORD16 c)
728*c83a76b0SSuyog Pawar {
729*c83a76b0SSuyog Pawar     WORD32 result;
730*c83a76b0SSuyog Pawar 
731*c83a76b0SSuyog Pawar     result = a - mult32x16in32_shl(b, c);
732*c83a76b0SSuyog Pawar 
733*c83a76b0SSuyog Pawar     return (result);
734*c83a76b0SSuyog Pawar }
735*c83a76b0SSuyog Pawar 
736*c83a76b0SSuyog Pawar /*****************************************************************************/
737*c83a76b0SSuyog Pawar /*                                                                           */
738*c83a76b0SSuyog Pawar /*  function name : msu32x16in32_shl_sat                                     */
739*c83a76b0SSuyog Pawar /*                                                                           */
740*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD16 sub bits 46 to 15 from acc   */
741*c83a76b0SSuyog Pawar /*                  takes care of saturation in multiply and addition        */
742*c83a76b0SSuyog Pawar /*                                                                           */
743*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b, WORD16 c                             */
744*c83a76b0SSuyog Pawar /*                                                                           */
745*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
746*c83a76b0SSuyog Pawar /*                                                                           */
747*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
748*c83a76b0SSuyog Pawar /*                                                                           */
749*c83a76b0SSuyog Pawar /*  processing    : if input mi_ns sub MAX32 else multiply,                  */
750*c83a76b0SSuyog Pawar /*                  right shift by 15 & sub from acc with saturation         */
751*c83a76b0SSuyog Pawar /*                                                                           */
752*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
753*c83a76b0SSuyog Pawar /*                                                                           */
754*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
755*c83a76b0SSuyog Pawar /*                                                                           */
756*c83a76b0SSuyog Pawar /*  revision history :                                                       */
757*c83a76b0SSuyog Pawar /*                                                                           */
758*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
759*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
760*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
761*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
762*c83a76b0SSuyog Pawar /*                                                                           */
763*c83a76b0SSuyog Pawar /*****************************************************************************/
764*c83a76b0SSuyog Pawar 
msu32x16in32_shl_sat(WORD32 a,WORD32 b,WORD16 c)765*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 msu32x16in32_shl_sat(WORD32 a, WORD32 b, WORD16 c)
766*c83a76b0SSuyog Pawar {
767*c83a76b0SSuyog Pawar     return (sub32_sat(a, mult32x16in32_shl_sat(b, c)));
768*c83a76b0SSuyog Pawar }
769*c83a76b0SSuyog Pawar 
770*c83a76b0SSuyog Pawar /*****************************************************************************/
771*c83a76b0SSuyog Pawar /*                                                                           */
772*c83a76b0SSuyog Pawar /*  function name : msu32                                                    */
773*c83a76b0SSuyog Pawar /*                                                                           */
774*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD32 sub bits 63 to 32 from acc   */
775*c83a76b0SSuyog Pawar /*                                                                           */
776*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b, WORD32 c                             */
777*c83a76b0SSuyog Pawar /*                                                                           */
778*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
779*c83a76b0SSuyog Pawar /*                                                                           */
780*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
781*c83a76b0SSuyog Pawar /*                                                                           */
782*c83a76b0SSuyog Pawar /*  processing    : multiply, right shift by 32 & sub from acc               */
783*c83a76b0SSuyog Pawar /*                                                                           */
784*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
785*c83a76b0SSuyog Pawar /*                                                                           */
786*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
787*c83a76b0SSuyog Pawar /*                                                                           */
788*c83a76b0SSuyog Pawar /*  revision history :                                                       */
789*c83a76b0SSuyog Pawar /*                                                                           */
790*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
791*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
792*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
793*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
794*c83a76b0SSuyog Pawar /*                                                                           */
795*c83a76b0SSuyog Pawar /*****************************************************************************/
796*c83a76b0SSuyog Pawar 
msu32(WORD32 a,WORD32 b,WORD32 c)797*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 msu32(WORD32 a, WORD32 b, WORD32 c)
798*c83a76b0SSuyog Pawar {
799*c83a76b0SSuyog Pawar     WORD32 result;
800*c83a76b0SSuyog Pawar 
801*c83a76b0SSuyog Pawar     result = a - mult32(b, c);
802*c83a76b0SSuyog Pawar 
803*c83a76b0SSuyog Pawar     return (result);
804*c83a76b0SSuyog Pawar }
805*c83a76b0SSuyog Pawar 
806*c83a76b0SSuyog Pawar /*****************************************************************************/
807*c83a76b0SSuyog Pawar /*                                                                           */
808*c83a76b0SSuyog Pawar /*  function name : msu32_shl                                                */
809*c83a76b0SSuyog Pawar /*                                                                           */
810*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD32 sub bits 62 to 31 from acc   */
811*c83a76b0SSuyog Pawar /*                  doesnt take care of saturation                           */
812*c83a76b0SSuyog Pawar /*                                                                           */
813*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b, WORD32 c                             */
814*c83a76b0SSuyog Pawar /*                                                                           */
815*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
816*c83a76b0SSuyog Pawar /*                                                                           */
817*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
818*c83a76b0SSuyog Pawar /*                                                                           */
819*c83a76b0SSuyog Pawar /*  processing    : multiply, right shift by 31 & sub from acc               */
820*c83a76b0SSuyog Pawar /*                                                                           */
821*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
822*c83a76b0SSuyog Pawar /*                                                                           */
823*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
824*c83a76b0SSuyog Pawar /*                                                                           */
825*c83a76b0SSuyog Pawar /*  revision history :                                                       */
826*c83a76b0SSuyog Pawar /*                                                                           */
827*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
828*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
829*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
830*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
831*c83a76b0SSuyog Pawar /*                                                                           */
832*c83a76b0SSuyog Pawar /*****************************************************************************/
833*c83a76b0SSuyog Pawar 
msu32_shl(WORD32 a,WORD32 b,WORD32 c)834*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 msu32_shl(WORD32 a, WORD32 b, WORD32 c)
835*c83a76b0SSuyog Pawar {
836*c83a76b0SSuyog Pawar     WORD32 result;
837*c83a76b0SSuyog Pawar 
838*c83a76b0SSuyog Pawar     result = a - mult32_shl(b, c);
839*c83a76b0SSuyog Pawar 
840*c83a76b0SSuyog Pawar     return (result);
841*c83a76b0SSuyog Pawar }
842*c83a76b0SSuyog Pawar 
843*c83a76b0SSuyog Pawar /*****************************************************************************/
844*c83a76b0SSuyog Pawar /*                                                                           */
845*c83a76b0SSuyog Pawar /*  function name : msu32_shl_sat                                            */
846*c83a76b0SSuyog Pawar /*                                                                           */
847*c83a76b0SSuyog Pawar /*  description   : multiply WORD32 with WORD32 sub bits 62 to 31 from acc   */
848*c83a76b0SSuyog Pawar /*                  takes care of saturation in multiply and addition        */
849*c83a76b0SSuyog Pawar /*                                                                           */
850*c83a76b0SSuyog Pawar /*  inputs        : WORD32 a, WORD32 b, WORD32 c                             */
851*c83a76b0SSuyog Pawar /*                                                                           */
852*c83a76b0SSuyog Pawar /*  outputs       : none                                                     */
853*c83a76b0SSuyog Pawar /*                                                                           */
854*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
855*c83a76b0SSuyog Pawar /*                                                                           */
856*c83a76b0SSuyog Pawar /*  processing    : if input mi_ns sub MAX32 else multiply,                  */
857*c83a76b0SSuyog Pawar /*                  right shift by 31 & sub from acc with saturation         */
858*c83a76b0SSuyog Pawar /*                                                                           */
859*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
860*c83a76b0SSuyog Pawar /*                                                                           */
861*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
862*c83a76b0SSuyog Pawar /*                                                                           */
863*c83a76b0SSuyog Pawar /*  revision history :                                                       */
864*c83a76b0SSuyog Pawar /*                                                                           */
865*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
866*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
867*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
868*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
869*c83a76b0SSuyog Pawar /*                                                                           */
870*c83a76b0SSuyog Pawar /*****************************************************************************/
871*c83a76b0SSuyog Pawar 
msu32_shl_sat(WORD32 a,WORD32 b,WORD32 c)872*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 msu32_shl_sat(WORD32 a, WORD32 b, WORD32 c)
873*c83a76b0SSuyog Pawar {
874*c83a76b0SSuyog Pawar     return (sub32_sat(a, mult32_shl_sat(b, c)));
875*c83a76b0SSuyog Pawar }
876*c83a76b0SSuyog Pawar 
877*c83a76b0SSuyog Pawar /*****************************************************************************/
878*c83a76b0SSuyog Pawar /*                                                                           */
879*c83a76b0SSuyog Pawar /*  function name : mac3216_arr40                                            */
880*c83a76b0SSuyog Pawar /*                                                                           */
881*c83a76b0SSuyog Pawar /*  description   : returns normalized 32 bit accumulated result and         */
882*c83a76b0SSuyog Pawar /*                  denormalizing info                                       */
883*c83a76b0SSuyog Pawar /*                                                                           */
884*c83a76b0SSuyog Pawar /*  inputs        : WORD32 x[], WORD16 y[], LOOPINDEX length                 */
885*c83a76b0SSuyog Pawar /*                                                                           */
886*c83a76b0SSuyog Pawar /*  outputs       : WORD16 *q_val                                            */
887*c83a76b0SSuyog Pawar /*                                                                           */
888*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
889*c83a76b0SSuyog Pawar /*                                                                           */
890*c83a76b0SSuyog Pawar /*  processing    : multiply and accumalate in WORD40 finally normalize      */
891*c83a76b0SSuyog Pawar /*                                                                           */
892*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
893*c83a76b0SSuyog Pawar /*                                                                           */
894*c83a76b0SSuyog Pawar /*  assumptions   : length < 256 for strict definition of WORD40             */
895*c83a76b0SSuyog Pawar /*                                                                           */
896*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
897*c83a76b0SSuyog Pawar /*                                                                           */
898*c83a76b0SSuyog Pawar /*  revision history :                                                       */
899*c83a76b0SSuyog Pawar /*                                                                           */
900*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
901*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
902*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
903*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
904*c83a76b0SSuyog Pawar /*                                                                           */
905*c83a76b0SSuyog Pawar /*****************************************************************************/
906*c83a76b0SSuyog Pawar 
mac3216_arr40(WORD32 * x,WORD16 * y,LOOPINDEX length,WORD16 * q_val)907*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 mac3216_arr40(WORD32 *x, WORD16 *y, LOOPINDEX length, WORD16 *q_val)
908*c83a76b0SSuyog Pawar {
909*c83a76b0SSuyog Pawar     LOOPINDEX i;
910*c83a76b0SSuyog Pawar     WORD40 sum = 0;
911*c83a76b0SSuyog Pawar 
912*c83a76b0SSuyog Pawar     for(i = 0; i < length; i++)
913*c83a76b0SSuyog Pawar     {
914*c83a76b0SSuyog Pawar         sum += (WORD40)(mult32x16in32(x[i], y[i]));
915*c83a76b0SSuyog Pawar     }
916*c83a76b0SSuyog Pawar 
917*c83a76b0SSuyog Pawar     *q_val = norm40(&sum);
918*c83a76b0SSuyog Pawar 
919*c83a76b0SSuyog Pawar     return (WORD32)sum;
920*c83a76b0SSuyog Pawar }
921*c83a76b0SSuyog Pawar 
922*c83a76b0SSuyog Pawar /*****************************************************************************/
923*c83a76b0SSuyog Pawar /*                                                                           */
924*c83a76b0SSuyog Pawar /*  function name : mac32_arr40                                              */
925*c83a76b0SSuyog Pawar /*                                                                           */
926*c83a76b0SSuyog Pawar /*  description   : returns normalized 32 bit accumulated result and         */
927*c83a76b0SSuyog Pawar /*                  denormalizing info                                       */
928*c83a76b0SSuyog Pawar /*                                                                           */
929*c83a76b0SSuyog Pawar /*  inputs        : WORD32 x[], WORD32 y[], LOOPINDEX length                 */
930*c83a76b0SSuyog Pawar /*                                                                           */
931*c83a76b0SSuyog Pawar /*  outputs       : WORD16 *q_val                                            */
932*c83a76b0SSuyog Pawar /*                                                                           */
933*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
934*c83a76b0SSuyog Pawar /*                                                                           */
935*c83a76b0SSuyog Pawar /*  processing    : multiply and accumalate in WORD40 finally normalize      */
936*c83a76b0SSuyog Pawar /*                                                                           */
937*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
938*c83a76b0SSuyog Pawar /*                                                                           */
939*c83a76b0SSuyog Pawar /*  assumptions   : length < 256 for strict definition of WORD40             */
940*c83a76b0SSuyog Pawar /*                                                                           */
941*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
942*c83a76b0SSuyog Pawar /*                                                                           */
943*c83a76b0SSuyog Pawar /*  revision history :                                                       */
944*c83a76b0SSuyog Pawar /*                                                                           */
945*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
946*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
947*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
948*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
949*c83a76b0SSuyog Pawar /*                                                                           */
950*c83a76b0SSuyog Pawar /*****************************************************************************/
951*c83a76b0SSuyog Pawar 
mac32_arr40(WORD32 * x,WORD32 * y,LOOPINDEX length,WORD16 * q_val)952*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 mac32_arr40(WORD32 *x, WORD32 *y, LOOPINDEX length, WORD16 *q_val)
953*c83a76b0SSuyog Pawar {
954*c83a76b0SSuyog Pawar     LOOPINDEX i;
955*c83a76b0SSuyog Pawar     WORD40 sum = 0;
956*c83a76b0SSuyog Pawar 
957*c83a76b0SSuyog Pawar     for(i = 0; i < length; i++)
958*c83a76b0SSuyog Pawar     {
959*c83a76b0SSuyog Pawar         sum += (WORD40)(mult32(x[i], y[i]));
960*c83a76b0SSuyog Pawar     }
961*c83a76b0SSuyog Pawar 
962*c83a76b0SSuyog Pawar     *q_val = norm40(&sum);
963*c83a76b0SSuyog Pawar 
964*c83a76b0SSuyog Pawar     return ((WORD32)sum);
965*c83a76b0SSuyog Pawar }
966*c83a76b0SSuyog Pawar 
967*c83a76b0SSuyog Pawar /*****************************************************************************/
968*c83a76b0SSuyog Pawar /*                                                                           */
969*c83a76b0SSuyog Pawar /*  function name : mac16_arr40                                              */
970*c83a76b0SSuyog Pawar /*                                                                           */
971*c83a76b0SSuyog Pawar /*  description   : returns normalized 32 bit accumulated result and         */
972*c83a76b0SSuyog Pawar /*                  denormalizing info                                       */
973*c83a76b0SSuyog Pawar /*                                                                           */
974*c83a76b0SSuyog Pawar /*  inputs        : WORD16 x[], WORD16 y[], LOOPINDEX length                 */
975*c83a76b0SSuyog Pawar /*                                                                           */
976*c83a76b0SSuyog Pawar /*  outputs       : WORD16 *q_val                                            */
977*c83a76b0SSuyog Pawar /*                                                                           */
978*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
979*c83a76b0SSuyog Pawar /*                                                                           */
980*c83a76b0SSuyog Pawar /*  processing    : multiply and accumalate in WORD40 finally normalize      */
981*c83a76b0SSuyog Pawar /*                                                                           */
982*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
983*c83a76b0SSuyog Pawar /*                                                                           */
984*c83a76b0SSuyog Pawar /*  assumptions   : length < 256 for strict definition of WORD40             */
985*c83a76b0SSuyog Pawar /*                                                                           */
986*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
987*c83a76b0SSuyog Pawar /*                                                                           */
988*c83a76b0SSuyog Pawar /*  revision history :                                                       */
989*c83a76b0SSuyog Pawar /*                                                                           */
990*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
991*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
992*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
993*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
994*c83a76b0SSuyog Pawar /*                                                                           */
995*c83a76b0SSuyog Pawar /*****************************************************************************/
996*c83a76b0SSuyog Pawar 
mac16_arr40(WORD16 * x,WORD16 * y,LOOPINDEX length,WORD16 * q_val)997*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 mac16_arr40(WORD16 *x, WORD16 *y, LOOPINDEX length, WORD16 *q_val)
998*c83a76b0SSuyog Pawar {
999*c83a76b0SSuyog Pawar     LOOPINDEX i;
1000*c83a76b0SSuyog Pawar     WORD40 sum = 0;
1001*c83a76b0SSuyog Pawar 
1002*c83a76b0SSuyog Pawar     for(i = 0; i < length; i++)
1003*c83a76b0SSuyog Pawar     {
1004*c83a76b0SSuyog Pawar         sum += (WORD40)((WORD32)x[i] * (WORD32)y[i]);
1005*c83a76b0SSuyog Pawar     }
1006*c83a76b0SSuyog Pawar 
1007*c83a76b0SSuyog Pawar     *q_val = norm40(&sum);
1008*c83a76b0SSuyog Pawar 
1009*c83a76b0SSuyog Pawar     return ((WORD32)sum);
1010*c83a76b0SSuyog Pawar }
1011*c83a76b0SSuyog Pawar 
1012*c83a76b0SSuyog Pawar /*****************************************************************************/
1013*c83a76b0SSuyog Pawar /*                                                                           */
1014*c83a76b0SSuyog Pawar /*  function name : add32_arr40                                              */
1015*c83a76b0SSuyog Pawar /*                                                                           */
1016*c83a76b0SSuyog Pawar /*  description   : returns normalized 32 bit accumulated result and         */
1017*c83a76b0SSuyog Pawar /*                  denormalizing info                                       */
1018*c83a76b0SSuyog Pawar /*                                                                           */
1019*c83a76b0SSuyog Pawar /*  inputs        : WORD32 x[], LOOPINDEX length                             */
1020*c83a76b0SSuyog Pawar /*                                                                           */
1021*c83a76b0SSuyog Pawar /*  outputs       : WORD16 *q_val                                            */
1022*c83a76b0SSuyog Pawar /*                                                                           */
1023*c83a76b0SSuyog Pawar /*  globals       : none                                                     */
1024*c83a76b0SSuyog Pawar /*                                                                           */
1025*c83a76b0SSuyog Pawar /*  processing    : accumalate in WORD40 finally normalize                   */
1026*c83a76b0SSuyog Pawar /*                                                                           */
1027*c83a76b0SSuyog Pawar /*  returns       : WORD32 accumulated result                                */
1028*c83a76b0SSuyog Pawar /*                                                                           */
1029*c83a76b0SSuyog Pawar /*  assumptions   : length < 256 for strict definition of WORD40             */
1030*c83a76b0SSuyog Pawar /*                                                                           */
1031*c83a76b0SSuyog Pawar /*  issues        : none                                                     */
1032*c83a76b0SSuyog Pawar /*                                                                           */
1033*c83a76b0SSuyog Pawar /*  revision history :                                                       */
1034*c83a76b0SSuyog Pawar /*                                                                           */
1035*c83a76b0SSuyog Pawar /*        DD MM YYYY       author                changes                     */
1036*c83a76b0SSuyog Pawar /*        06 12 2002       ashok M/chetan K      created                     */
1037*c83a76b0SSuyog Pawar /*        21 11 2003       raghavendra K R       modified(bug fixes)         */
1038*c83a76b0SSuyog Pawar /*        15 11 2004       tejaswi/vishal        modified(bug fixes/cleanup) */
1039*c83a76b0SSuyog Pawar /*                                                                           */
1040*c83a76b0SSuyog Pawar /*****************************************************************************/
1041*c83a76b0SSuyog Pawar 
add32_arr40(WORD32 * in_arr,LOOPINDEX length,WORD16 * q_val)1042*c83a76b0SSuyog Pawar static PLATFORM_INLINE WORD32 add32_arr40(WORD32 *in_arr, LOOPINDEX length, WORD16 *q_val)
1043*c83a76b0SSuyog Pawar {
1044*c83a76b0SSuyog Pawar     LOOPINDEX i;
1045*c83a76b0SSuyog Pawar     WORD40 sum = 0;
1046*c83a76b0SSuyog Pawar 
1047*c83a76b0SSuyog Pawar     for(i = 0; i < length; i++)
1048*c83a76b0SSuyog Pawar     {
1049*c83a76b0SSuyog Pawar         sum += (WORD40)in_arr[i];
1050*c83a76b0SSuyog Pawar     }
1051*c83a76b0SSuyog Pawar 
1052*c83a76b0SSuyog Pawar     *q_val = norm40(&sum);
1053*c83a76b0SSuyog Pawar 
1054*c83a76b0SSuyog Pawar     return ((WORD32)sum);
1055*c83a76b0SSuyog Pawar }
1056*c83a76b0SSuyog Pawar 
1057*c83a76b0SSuyog Pawar #endif /* __IA_BASIC_OPS40_H__ */
1058