Opus encode fails on 32-bit ARM

NEON optimizations overrun buffer due to improper termination condition
Also mark several arm-optimized routines which deliberately cause integer overflow
so they won't trap.

Bug: 136616344
Test: run cts -m CtsMediaTestCases  -t
      android.media.cts.EncoderTest#testOpusEncoders' on 32 bits project

Change-Id: Ib48b17fd1e4b13fe37c0e71d5f33f6f59f1f97d1
(cherry picked from commit de8d48c07149dcb4318a6ef6d2a7356f1d287c74)
diff --git a/libopus_blacklist.txt b/libopus_blacklist.txt
index a789961..fd3f398 100644
--- a/libopus_blacklist.txt
+++ b/libopus_blacklist.txt
@@ -23,6 +23,26 @@
 
 src:*/celt/kiss_fft.c
 
+# assembly optimizations that know what they are doing
+fun:silk_SMULWB_armv4
+fun:silk_SMULWT_armv4
+fun:silk_SMULWW_armv4
+fun:silk_SMLAWW_armv4
+#
+fun:silk_SMULWB_armv5e
+fun:silk_SMLAWB_armv5e
+fun:silk_SMULWT_armv5e
+fun:silk_SMLAWT_armv5e
+fun:silk_SMULBB_armv5e
+fun:silk_SMLABB_armv5e
+fun:silk_SMULBT_armv5e
+fun:silk_SMLABT_armv5e
+fun:silk_ADD_SAT32_armv5e
+fun:silk_SUB_SAT32_armv5e
+fun:silk_CLZ16_armv5
+fun:silk_CLZ32_armv5
+
+
 # Performance related
 fun:exp_rotation1
 fun:haar1
diff --git a/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c b/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c
index 00a70cb..ee06f98 100644
--- a/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c
+++ b/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c
@@ -172,7 +172,7 @@
                     state_QS_s32x4[ 0 ][ 1 ] = calc_state( state_QS_s32x4[ 0 ][ 1 ], state_QS_s32x4[ 2 ][ 1 ], state_QS_s32x4[ 1 ][ 1 ], warping_Q16_s32x4 );
                     state_QS_s32x4[ 1 ][ 0 ] = state_QS_s32x4[ 2 ][ 0 ];
                     state_QS_s32x4[ 1 ][ 1 ] = state_QS_s32x4[ 2 ][ 1 ];
-                } while( ++n < ( length + order ) );
+                } while( ++n < ( length + order - 3) );
                 in = state;
                 o -= 8;
             } while( o > 4 );