I believe left-shift of negative numbers is UB. I believe C99 says this:
C99 Section 6.5.7 Paragraph 4The result of E1 << E2 is E1 left-shifted E2 bit
positions; vacated bits are filled with zeros. If E1 has an unsigned type, the
value of the result is E1 * 2**E2, reduced modulo one more than the maximum
value representable in the result type. If E1 has a signed type and nonnegative
value, and E1 * 2**E2 is representable in the result type, then that is the
resulting value; otherwise, the behavior is undefined.
Therefore I think it could be considered a coding defect to perform such
operations (in C or C++).
One such example is in computeLP.c
If you add the following line:
for (j=1; j<i; j++) { sum =
MAC32_32_Q31(sum, LPCoefficients[j], autoCorrelationCoefficient[i-j]);/*
LPCoefficients in Q27, autoCorrelation in Q31 -> result in Q27 -> sum in Q27 */
} sum = ADD32(SHL(sum, 4),
autoCorrelationCoefficient[i]); /* set sum in Q31 and add r[0] */
/* a[i] = -sum/E
*/ LPCoefficients[i] = -DIV32_32_Q31(sum,E); /*
LPCoefficient of current iteration is in Q31 for now, it will be set to Q27 at
the end of this iteration */
printf("sum: %d, E: %d, DIV: %d\n ", sum, E,
LPCoefficients[i]); /** ADD THIS LINE **/
/* iterations j = 1..i-1
*/
And then run the encoder test using the supplied sample data:
./encoderTest data/test.encoder.in
You will see printout indicating that some values of sum are negative. (sum is
a word32_t; word32_t and word64_T are defined to be signed numbers in typedef.h)
The DIV32_32_Q31 macro is defined as:
fixedPointMacros.h: #define DIV32_32_Q31(a,b)
(((word64_t)(a)<<31)/((word32_t)(b)))
Therefore it seems evident to me that in some cases, left-shift of negative
numbers is being requested.
Did I miss something?
_______________________________________________
Linphone-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/linphone-users