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