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

Reply via email to