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 /*___________________________________________________________________________