Update SILK code using the CELT range coder
[opus.git] / src_SigProc_FIX / SKP_Silk_LPC_synthesis_order16.c
similarity index 55%
rename from src/SKP_Silk_LPC_synthesis_order16.c
rename to src_SigProc_FIX/SKP_Silk_LPC_synthesis_order16.c
index ec2d358..2b9c6a4 100644 (file)
@@ -43,98 +43,79 @@ void SKP_Silk_LPC_synthesis_order16(const SKP_int16 *in,          /* I:   excita
 )\r
 {\r
     SKP_int   k;\r
-    SKP_int32 SA, SB, Atmp, A_align_Q12[8], out32_Q10, out32;\r
-\r
-    /* combine two A_Q12 values and ensure 32-bit alignment */\r
-    for( k = 0; k < 8; k++ ) {\r
-        A_align_Q12[k] = (((SKP_int32)A_Q12[ 2*k ]) & 0x0000ffff) | SKP_LSHIFT( (SKP_int32)A_Q12[ 2*k + 1 ], 16 );\r
-    }\r
-\r
-    /* S[] values are in Q14 */\r
-    /* NOTE: the code below loads two int16 values in an int32, and multiplies each using the   */\r
-    /* SMLAWB and SMLAWT instructions. On a big-endian CPU the two int16 variables would be     */\r
-    /* loaded in reverse order and the code will give the wrong result. In that case swapping   */\r
-    /* the SMLAWB and SMLAWT instructions should solve the problem.                             */\r
+    SKP_int32 SA, SB, out32_Q10, out32;\r
     for( k = 0; k < len; k++ ) {\r
         /* unrolled loop: prolog */\r
         /* multiply-add two prediction coefficients per iteration */\r
-        SA = S[15];\r
-        Atmp = A_align_Q12[0];\r
-        SB = S[14];\r
-        S[14] = SA;\r
-        out32_Q10 = SKP_SMULWB(                  SA, Atmp );\r
-        out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );\r
-        SA = S[13];\r
-        S[13] = SB;\r
+        SA = S[ 15 ];\r
+        SB = S[ 14 ];\r
+        S[ 14 ] = SA;\r
+        out32_Q10 = SKP_SMULWB(                  SA, A_Q12[ 0 ] );\r
+        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 1 ] );\r
+        SA = S[ 13 ];\r
+        S[ 13 ] = SB;\r
 \r
         /* unrolled loop: main loop */\r
-        Atmp = A_align_Q12[1];\r
-        SB = S[12];\r
-        S[12] = SA;\r
-        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, Atmp );\r
-        out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );\r
-        SA = S[11];\r
-        S[11] = SB;\r
-\r
-        Atmp = A_align_Q12[2];\r
-        SB = S[10];\r
-        S[10] = SA;\r
-        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, Atmp );\r
-        out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );\r
-        SA = S[9];\r
-        S[9] = SB;\r
-\r
-        Atmp = A_align_Q12[3];\r
-        SB = S[8];\r
-        S[8] = SA;\r
-        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, Atmp );\r
-        out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );\r
-        SA = S[7];\r
-        S[7] = SB;\r
-\r
-        Atmp = A_align_Q12[4];\r
-        SB = S[6];\r
-        S[6] = SA;\r
-        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, Atmp );\r
-        out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );\r
-        SA = S[5];\r
-        S[5] = SB;\r
-\r
-        Atmp = A_align_Q12[5];\r
-        SB = S[4];\r
-        S[4] = SA;\r
-        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, Atmp );\r
-        out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );\r
-        SA = S[3];\r
-        S[3] = SB;\r
-\r
-        Atmp = A_align_Q12[6];\r
-        SB = S[2];\r
-        S[2] = SA;\r
-        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, Atmp );\r
-        out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );\r
-        SA = S[1];\r
-        S[1] = SB;\r
+        SB = S[ 12 ];\r
+        S[ 12 ] = SA;\r
+        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 2 ] );\r
+        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 3 ] );\r
+        SA = S[ 11 ];\r
+        S[ 11 ] = SB;\r
+\r
+        SB = S[ 10 ];\r
+        S[ 10 ] = SA;\r
+        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 4 ] );\r
+        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 5 ] );\r
+        SA = S[ 9 ];\r
+        S[ 9 ] = SB;\r
+\r
+        SB = S[ 8 ];\r
+        S[ 8 ] = SA;\r
+        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 6 ] );\r
+        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 7 ] );\r
+        SA = S[ 7 ];\r
+        S[ 7 ] = SB;\r
+\r
+        SB = S[ 6 ];\r
+        S[ 6 ] = SA;\r
+        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 8 ] );\r
+        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 9 ] );\r
+        SA = S[ 5 ];\r
+        S[ 5 ] = SB;\r
+\r
+        SB = S[ 4 ];\r
+        S[ 4 ] = SA;\r
+        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 10 ] );\r
+        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 11 ] );\r
+        SA = S[ 3 ];\r
+        S[ 3 ] = SB;\r
+\r
+        SB = S[ 2 ];\r
+        S[ 2 ] = SA;\r
+        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 12 ] );\r
+        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 13 ] );\r
+        SA = S[ 1 ];\r
+        S[ 1 ] = SB;\r
 \r
         /* unrolled loop: epilog */\r
-        Atmp = A_align_Q12[7];\r
-        SB = S[0];\r
-        S[0] = SA;\r
-        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, Atmp );\r
-        out32_Q10 = SKP_SMLAWT_ovflw( out32_Q10, SB, Atmp );\r
+        SB = S[ 0 ];\r
+        S[ 0 ] = SA;\r
+        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SA, A_Q12[ 14 ] );\r
+        out32_Q10 = SKP_SMLAWB_ovflw( out32_Q10, SB, A_Q12[ 15 ] );\r
 \r
         /* unrolled loop: end */\r
         /* apply gain to excitation signal and add to prediction */\r
-        out32_Q10 = SKP_ADD_SAT32( out32_Q10, SKP_SMULWB( Gain_Q26, in[k] ) );\r
+        out32_Q10 = SKP_ADD_SAT32( out32_Q10, SKP_SMULWB( Gain_Q26, in[ k ] ) );\r
 \r
         /* scale to Q0 */\r
         out32 = SKP_RSHIFT_ROUND( out32_Q10, 10 );\r
 \r
         /* saturate output */\r
-        out[k] = (SKP_int16)SKP_SAT16( out32 );\r
+        out[ k ] = ( SKP_int16 )SKP_SAT16( out32 );\r
 \r
         /* move result into delay line */\r
-        S[15] = SKP_LSHIFT_SAT32( out32_Q10, 4 );\r
+        S[ 15 ] = SKP_LSHIFT_SAT32( out32_Q10, 4 );\r
     }\r
 }\r
 \r