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 /****************************************************************************************
19 Portions 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)
26 Permission to distribute, modify and use this file under the standard license
27 terms 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
136 Word16 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
mult_r(Word16 var1,Word16 var2,Flag * pOverflow)190 Word16 mult_r(Word16 var1, Word16 var2, Flag *pOverflow)
191 {
192
193 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