mult_r.cpp revision 4f1efc098cb5791c3e9f483f2af84aef70d2d0a0
1/* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18/****************************************************************************************
19Portions of this file are derived from the following 3GPP standard:
20
21    3GPP TS 26.073
22    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23    Available from http://www.3gpp.org
24
25(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26Permission to distribute, modify and use this file under the standard license
27terms listed above has been obtained from the copyright holder.
28****************************************************************************************/
29/*
30
31 Filename: /audio/gsm_amr/c/src/mult_r.c
32
33------------------------------------------------------------------------------
34 REVISION HISTORY
35
36 Description: Created separate file for the mult_r function. Sync'ed up
37          with the current template and fixed tabs.
38
39 Description: Passing in a pointer to the overflow flag instead of using
40          a global flag.
41
42 Description: Made the following changes based on P2/P3 review:
43              1) Simplified test to determine if sign extension is necessary
44              2) Changed the name of pointer "overflow" to "Poverflow"
45              3) Removed code that updates MOPS counter
46              4) Updated template and reference section
47
48 Who:                       Date:
49 Description:
50
51
52------------------------------------------------------------------------------
53 MODULE DESCRIPTION
54
55 Multiplication function with rounding and overflow control
56
57------------------------------------------------------------------------------
58*/
59
60/*----------------------------------------------------------------------------
61; INCLUDES
62----------------------------------------------------------------------------*/
63#include    "basic_op.h"
64
65/*----------------------------------------------------------------------------
66; MACROS
67; [Define module specific macros here]
68----------------------------------------------------------------------------*/
69
70/*----------------------------------------------------------------------------
71; DEFINES
72; [Include all pre-processor statements here. Include conditional
73; compile variables also.]
74----------------------------------------------------------------------------*/
75
76/*----------------------------------------------------------------------------
77; LOCAL FUNCTION DEFINITIONS
78; [List function prototypes here]
79----------------------------------------------------------------------------*/
80
81/*----------------------------------------------------------------------------
82; LOCAL VARIABLE DEFINITIONS
83; [Variable declaration - defined here and used outside this module]
84----------------------------------------------------------------------------*/
85
86
87/*
88------------------------------------------------------------------------------
89 FUNCTION NAME: mult_r
90------------------------------------------------------------------------------
91 INPUT AND OUTPUT DEFINITIONS
92
93 Inputs:
94    var1 = 16 bit short signed integer (Word16) whose value falls in
95           the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
96
97    var2 = 16 bit short signed integer (Word16) whose value falls in
98           the range : 0xffff 8000 <= var2 <= 0x0000 7fff.
99
100    pOverflow = pointer to overflow (Flag)
101
102 Outputs:
103    pOverflow -> 1 if the add operation resulted in overflow
104
105 Returns:
106    L_product_arr = 16-bit limited product of var1 and var2 (Word16)
107
108 Global Variables Used:
109    None
110
111 Local Variables Needed:
112    None
113
114------------------------------------------------------------------------------
115 FUNCTION DESCRIPTION
116
117 This function performs the multiplication of var1 by var2 with rounding, and
118 gives a 16 bit result which is scaled, i.e.:
119    mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and  |
120    mult_r(-32768,-32768) = 32767
121
122------------------------------------------------------------------------------
123 REQUIREMENTS
124
125 None
126
127------------------------------------------------------------------------------
128 REFERENCES
129
130 [1] mult_r() function in basicop2.c, UMTS GSM AMR speech codec, R99 -
131 Version 3.2.0, March 2, 2001
132
133------------------------------------------------------------------------------
134 PSEUDO-CODE
135
136Word16 mult_r (Word16 var1, Word16 var2)
137{
138    Word16 var_out;
139    Word32 L_product_arr;
140
141    L_product_arr = (Word32) var1 *(Word32) var2;
142    L_product_arr += (Word32) 0x00004000L;
143    L_product_arr &= (Word32) 0xffff8000L;
144    L_product_arr >>= 15;
145
146    if (L_product_arr & (Word32) 0x00010000L)
147    {
148        L_product_arr |= (Word32) 0xffff0000L;
149    }
150* The reference ETSI code uses a global flag for Overflow inside the function
151* saturate(). In the actual implementation a pointer to Overflow flag is passed in
152* as a parameter to the function
153
154    var_out = saturate (L_product_arr);
155
156#if (WMOPS)
157    multiCounter[currCounter].mult_r++;
158#endif
159
160    return (var_out);
161}
162
163------------------------------------------------------------------------------
164 RESOURCES USED [optional]
165
166 When the code is written for a specific target processor the
167 the resources used should be documented below.
168
169 HEAP MEMORY USED: x bytes
170
171 STACK MEMORY USED: x bytes
172
173 CLOCK CYCLES: (cycle count equation for this function) + (variable
174                used to represent cycle count for each subroutine
175                called)
176     where: (cycle count variable) = cycle count for [subroutine
177                                     name]
178
179------------------------------------------------------------------------------
180 CAUTION [optional]
181 [State any special notes, constraints or cautions for users of this function]
182
183------------------------------------------------------------------------------
184*/
185
186/*----------------------------------------------------------------------------
187; FUNCTION CODE
188----------------------------------------------------------------------------*/
189
190Word16 mult_r(Word16 var1, Word16 var2, Flag *pOverflow)
191{
192
193    register Word32 L_product_arr;
194
195    L_product_arr = ((Word32) var1) * var2;              /* product */
196    L_product_arr += (Word32) 0x00004000L;               /* round */
197    L_product_arr >>= 15;                                /* shift */
198
199    /* sign extend when necessary */
200    L_product_arr |= (Word32) - (L_product_arr & (Word32) 0x00010000L);
201
202    /* Saturate result (if necessary). */
203    /* Replaced function call with in-line code to conserve MIPS, */
204    /* i.e., var_out = saturate (L_product_arr)  */
205
206    if (L_product_arr > 0X00007fffL)
207    {
208        *pOverflow = 1;
209        L_product_arr = MAX_16;
210    }
211    else if (L_product_arr < (Word32) 0xffff8000L)
212    {
213        *pOverflow = 1;
214        L_product_arr = MIN_16;
215    }
216
217    return ((Word16) L_product_arr);
218}
219