FreeCalypso > hg > gsm-codec-lib
comparison libgsmefr/basic_op.h @ 349:ed8762eea8a1
libgsmefr: use some inline functions from PacketVideo
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 22 Apr 2024 08:14:20 +0000 |
parents | 1c514150c033 |
children | 9b05bbc23b8a |
comparison
equal
deleted
inserted
replaced
348:3da7ab45910d | 349:ed8762eea8a1 |
---|---|
2 * This version of basic_op.h for GSM-EFR codec has been created at | 2 * This version of basic_op.h for GSM-EFR codec has been created at |
3 * Themyscira Wireless with the aim of performance improvement. | 3 * Themyscira Wireless with the aim of performance improvement. |
4 * The original version contained only function declarations, | 4 * The original version contained only function declarations, |
5 * resulting in a function call for every elementary operation; | 5 * resulting in a function call for every elementary operation; |
6 * the present version implements most of these operations as inline | 6 * the present version implements most of these operations as inline |
7 * functions. | 7 * functions. (Further update: for extra speed-up, the some inline |
8 * function implementations have been lifted from PacketVideo AMR | |
9 * version, aka libopencore-amrnb.) | |
8 * | 10 * |
9 * Elimination of Overflow flag: examination of EFR code reveals that | 11 * Elimination of Overflow flag: examination of EFR code reveals that |
10 * both Carry and Overflow flags are accessed outside of basicop2.c | 12 * both Carry and Overflow flags are accessed outside of basicop2.c |
11 * only in g_pitch.c, as part of a code sequence that uses L_macNs. | 13 * only in g_pitch.c, as part of a code sequence that uses L_macNs. |
12 * Since the Overflow flag is not checked anywhere else, we can eliminate | 14 * Since the Overflow flag is not checked anywhere else, we can eliminate |
157 |___________________________________________________________________________| | 159 |___________________________________________________________________________| |
158 */ | 160 */ |
159 | 161 |
160 static inline Word16 abs_s (Word16 var1) | 162 static inline Word16 abs_s (Word16 var1) |
161 { | 163 { |
162 Word16 var_out; | 164 Word16 y = var1 - (var1 < 0); |
163 | 165 y = y ^ (y >> 15); |
164 if (unlikely(var1 == (Word16) 0X8000)) | 166 return (y); |
165 { | |
166 var_out = MAX_16; | |
167 } | |
168 else | |
169 { | |
170 if (var1 < 0) | |
171 { | |
172 var_out = -var1; | |
173 } | |
174 else | |
175 { | |
176 var_out = var1; | |
177 } | |
178 } | |
179 return (var_out); | |
180 } | 167 } |
181 | 168 |
182 /*___________________________________________________________________________ | 169 /*___________________________________________________________________________ |
183 | | | 170 | | |
184 | Function Name : shl | | 171 | Function Name : shl | |
214 |___________________________________________________________________________| | 201 |___________________________________________________________________________| |
215 */ | 202 */ |
216 | 203 |
217 static inline Word16 shl (Word16 var1, Word16 var2) | 204 static inline Word16 shl (Word16 var1, Word16 var2) |
218 { | 205 { |
219 Word32 result; | 206 Word16 var_out; |
220 | 207 |
221 if (var2 < 0) { | 208 if (unlikely(var2 < 0)) { |
222 var2 = -var2; | 209 var2 = -var2; |
223 if (unlikely(var2 >= 15)) | 210 if (unlikely(var2 > 15)) |
224 return (var1 < 0) ? -1 : 0; | 211 var2 = 15; |
225 else | 212 var_out = var1 >> var2; |
226 return var1 >> var2; | |
227 } else { | 213 } else { |
228 result = (Word32) var1 << var2; | 214 if (unlikely(var2 > 15)) |
229 if (var1 > 0) { | 215 var2 = 15; |
230 if (unlikely((var2 >= 15) || (result & 0xFFFF8000))) | 216 var_out = var1 << var2; |
231 return MAX_16; | 217 if (unlikely(var_out >> var2 != var1)) |
232 else | 218 { |
233 return (Word16) result; | 219 var_out = (var1 >> 15) ^ MAX_16; |
234 } else if (var1 < 0) { | 220 } |
235 if (unlikely((var2 >= 16) || ((result & 0xFFFF8000) != 0xFFFF8000))) | 221 } |
236 return MIN_16; | 222 return var_out; |
237 else | |
238 return (Word16) result; | |
239 } else | |
240 return 0; | |
241 } | |
242 } | 223 } |
243 | 224 |
244 /*___________________________________________________________________________ | 225 /*___________________________________________________________________________ |
245 | | | 226 | | |
246 | Function Name : shr | | 227 | Function Name : shr | |
276 |___________________________________________________________________________| | 257 |___________________________________________________________________________| |
277 */ | 258 */ |
278 | 259 |
279 static inline Word16 shr (Word16 var1, Word16 var2) | 260 static inline Word16 shr (Word16 var1, Word16 var2) |
280 { | 261 { |
281 Word32 result; | 262 Word16 var_out; |
282 | 263 |
283 if (var2 < 0) { | 264 if (unlikely(var2 < 0)) { |
284 var2 = -var2; | 265 var2 = -var2; |
285 result = (Word32) var1 << var2; | 266 if (unlikely(var2 > 15)) |
286 if (var1 > 0) { | 267 var2 = 15; |
287 if (unlikely((var2 >= 15) || (result & 0xFFFF8000))) | 268 var_out = var1 << var2; |
288 return MAX_16; | 269 if (unlikely(var_out >> var2 != var1)) |
289 else | 270 { |
290 return (Word16) result; | 271 var_out = (var1 >> 15) ^ MAX_16; |
291 } else if (var1 < 0) { | 272 } |
292 if (unlikely((var2 >= 16) || ((result & 0xFFFF8000) != 0xFFFF8000))) | |
293 return MIN_16; | |
294 else | |
295 return (Word16) result; | |
296 } else | |
297 return 0; | |
298 } else { | 273 } else { |
299 if (unlikely(var2 >= 15)) | 274 if (unlikely(var2 > 15)) |
300 return (var1 < 0) ? -1 : 0; | 275 var2 = 15; |
301 else | 276 var_out = var1 >> var2; |
302 return var1 >> var2; | 277 } |
303 } | 278 return var_out; |
304 } | 279 } |
305 | 280 |
306 /*___________________________________________________________________________ | 281 /*___________________________________________________________________________ |
307 | | | 282 | | |
308 | Function Name : mult | | 283 | Function Name : mult | |
338 |___________________________________________________________________________| | 313 |___________________________________________________________________________| |
339 */ | 314 */ |
340 | 315 |
341 static inline Word16 mult (Word16 var1, Word16 var2) | 316 static inline Word16 mult (Word16 var1, Word16 var2) |
342 { | 317 { |
343 if (unlikely(var1 == MIN_16 && var2 == MIN_16)) | 318 register Word32 product; |
344 return MAX_16; | 319 |
345 else | 320 product = ((Word32) var1 * var2) >> 15; |
346 return ((Word32) var1 * var2) >> 15; | 321 |
322 /* Saturate result (if necessary). */ | |
323 /* var1 * var2 >0x00007fff is the only case */ | |
324 /* that saturation occurs. */ | |
325 | |
326 if (unlikely(product > 0x00007fff)) | |
327 product = (Word32) MAX_16; | |
328 | |
329 /* Return the product as a 16 bit value by type casting Word32 to Word16 */ | |
330 | |
331 return ((Word16) product); | |
347 } | 332 } |
348 | 333 |
349 /*___________________________________________________________________________ | 334 /*___________________________________________________________________________ |
350 | | | 335 | | |
351 | Function Name : negate | | 336 | Function Name : negate | |
627 |___________________________________________________________________________| | 612 |___________________________________________________________________________| |
628 */ | 613 */ |
629 | 614 |
630 static inline Word32 L_mult (Word16 var1, Word16 var2) | 615 static inline Word32 L_mult (Word16 var1, Word16 var2) |
631 { | 616 { |
632 if (unlikely(var1 == MIN_16 && var2 == MIN_16)) { | 617 register Word32 L_product; |
618 | |
619 L_product = (Word32) var1 * var2; | |
620 | |
621 if (likely(L_product != (Word32) 0x40000000)) | |
622 { | |
623 L_product <<= 1; /* Multiply by 2 */ | |
624 } | |
625 else | |
626 { | |
633 Overflow = 1; | 627 Overflow = 1; |
634 return MAX_32; | 628 L_product = MAX_32; |
635 } else | 629 } |
636 return ((Word32) var1 * var2) << 1; | 630 |
631 return (L_product); | |
637 } | 632 } |
638 | 633 |
639 /*___________________________________________________________________________ | 634 /*___________________________________________________________________________ |
640 | | | 635 | | |
641 | Function Name : L_mac | | 636 | Function Name : L_mac | |
802 | 797 |
803 static inline Word32 L_shl (Word32 L_var1, Word16 var2) | 798 static inline Word32 L_shl (Word32 L_var1, Word16 var2) |
804 { | 799 { |
805 Word32 L_var_out; | 800 Word32 L_var_out; |
806 | 801 |
807 if (var2 < 0) { | 802 if (unlikely(var2 < 0)) { |
808 var2 = -var2; | 803 var2 = -var2; |
809 if (unlikely(var2 >= 31)) | 804 if (unlikely(var2 > 31)) |
810 L_var_out = (L_var1 < 0) ? -1 : 0; | 805 var2 = 31; |
811 else | 806 L_var_out = L_var1 >> var2; |
812 L_var_out = L_var1 >> var2; | |
813 } else { | 807 } else { |
808 if (unlikely(var2 > 31)) | |
809 var2 = 31; | |
814 L_var_out = L_var1 << var2; | 810 L_var_out = L_var1 << var2; |
815 if (unlikely(L_var_out >> var2 != L_var1)) | 811 if (unlikely(L_var_out >> var2 != L_var1)) |
816 L_var_out = (L_var1 >> 31) ^ MAX_32; | 812 L_var_out = (L_var1 >> 31) ^ MAX_32; |
817 } | 813 } |
818 return (L_var_out); | 814 return (L_var_out); |
854 | 850 |
855 static inline Word32 L_shr (Word32 L_var1, Word16 var2) | 851 static inline Word32 L_shr (Word32 L_var1, Word16 var2) |
856 { | 852 { |
857 Word32 L_var_out; | 853 Word32 L_var_out; |
858 | 854 |
859 if (var2 < 0) { | 855 if (unlikely(var2 < 0)) { |
860 var2 = -var2; | 856 var2 = -var2; |
857 if (unlikely(var2 > 31)) | |
858 var2 = 31; | |
861 L_var_out = L_var1 << var2; | 859 L_var_out = L_var1 << var2; |
862 if (unlikely(L_var_out >> var2 != L_var1)) | 860 if (unlikely(L_var_out >> var2 != L_var1)) |
863 L_var_out = (L_var1 >> 31) ^ MAX_32; | 861 L_var_out = (L_var1 >> 31) ^ MAX_32; |
864 } else { | 862 } else { |
865 if (unlikely(var2 >= 31)) | 863 if (unlikely(var2 > 31)) |
866 L_var_out = (L_var1 < 0) ? -1 : 0; | 864 var2 = 31; |
867 else | 865 L_var_out = L_var1 >> var2; |
868 L_var_out = L_var1 >> var2; | |
869 } | 866 } |
870 return (L_var_out); | 867 return (L_var_out); |
871 } | 868 } |
872 | 869 |
873 /*___________________________________________________________________________ | 870 /*___________________________________________________________________________ |