1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ nsx_core_neon.s 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ This file contains some functions in NS, optimized for ARM Neon 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ platforms. Reference C code is in file nsx_core.c. Bit-exact. 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "nsx_core_neon_offsets.h" 169fb16139d917ba32720e031d3c871987d418668fpbos@webrtc.org#include "webrtc/modules/audio_processing/ns/nsx_defines.h" 179fb16139d917ba32720e031d3c871987d418668fpbos@webrtc.org#include "webrtc/system_wrappers/interface/asm_defines.h" 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 19b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.orgGLOBAL_FUNCTION WebRtcNsx_NoiseEstimationNeon 20b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.orgGLOBAL_FUNCTION WebRtcNsx_PrepareSpectrumNeon 21b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.orgGLOBAL_FUNCTION WebRtcNsx_SynthesisUpdateNeon 22b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.orgGLOBAL_FUNCTION WebRtcNsx_AnalysisUpdateNeon 23267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.orgGLOBAL_LABEL WebRtcNsx_kLogTable 24267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.orgGLOBAL_LABEL WebRtcNsx_kCounterDiv 25267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.orgGLOBAL_LABEL WebRtcNsx_kLogTableFrac 26267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org 279bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org.align 2 28267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.orgWebRtcNsx_kLogTableFrac: 299bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org_WebRtcNsx_kLogTableFrac: 30267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 0, 1, 3, 4, 6, 7, 9, 10, 11, 13, 14, 16, 17, 18, 20, 21, 22, 24, 25, 26 31267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 28, 29, 30, 32, 33, 34, 36, 37, 38, 40, 41, 42, 44, 45, 46, 47, 49, 50 32267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 51, 52, 54, 55, 56, 57, 59, 60, 61, 62, 63, 65, 66, 67, 68, 69, 71, 72 33267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 73, 74, 75, 77, 78, 79, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90, 92, 93 34267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 94, 95, 96, 97, 98, 99, 100, 102, 103, 104, 105, 106, 107, 108, 109, 110 35267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 111, 112, 113, 114, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126 36267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141 37267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 155 38267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 169 39267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 170, 171, 172, 173, 174, 175, 176, 177, 178, 178, 179, 180, 181, 182, 183 40267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 184, 185, 185, 186, 187, 188, 189, 190, 191, 192, 192, 193, 194, 195, 196 41267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 197, 198, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206, 207, 208, 208 42267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 209, 210, 211, 212, 212, 213, 214, 215, 216, 216, 217, 218, 219, 220, 220 43267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 221, 222, 223, 224, 224, 225, 226, 227, 228, 228, 229, 230, 231, 231, 232 44267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 233, 234, 234, 235, 236, 237, 238, 238, 239, 240, 241, 241, 242, 243, 244 45267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 244, 245, 246, 247, 247, 248, 249, 249, 250, 251, 252, 252, 253, 254, 255 46267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 255 47267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org 489bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org.align 2 49267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.orgWebRtcNsx_kCounterDiv: 509bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org_WebRtcNsx_kCounterDiv: 51267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 32767, 16384, 10923, 8192, 6554, 5461, 4681, 4096, 3641, 3277, 2979 52267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 2731, 2521, 2341, 2185, 2048, 1928, 1820, 1725, 1638, 1560, 1489 53267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 1425, 1365, 1311, 1260, 1214, 1170, 1130, 1092, 1057, 1024, 993, 964 54267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 936, 910, 886, 862, 840, 819, 799, 780, 762, 745, 728, 712, 697, 683 55267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 669, 655, 643, 630, 618, 607, 596, 585, 575, 565, 555, 546, 537, 529 56267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 520, 512, 504, 496, 489, 482, 475, 468, 462, 455, 449, 443, 437, 431 57267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 426, 420, 415, 410, 405, 400, 395, 390, 386, 381, 377, 372, 368, 364 58267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 360, 356, 352, 349, 345, 341, 338, 334, 331, 328, 324, 321, 318, 315 59267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 312, 309, 306, 303, 301, 298, 295, 293, 290, 287, 285, 282, 280, 278 60267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 275, 273, 271, 269, 266, 264, 262, 260, 258, 256, 254, 252, 250, 248 61267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 246, 245, 243, 241, 239, 237, 236, 234, 232, 231, 229, 228, 226, 224 62267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 223, 221, 220, 218, 217, 216, 214, 213, 211, 210, 209, 207, 206, 205 63267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 204, 202, 201, 200, 199, 197, 196, 195, 194, 193, 192, 191, 189, 188 64267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174 65267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 173, 172, 172, 171, 170, 169, 168, 167, 166, 165, 165, 164, 163 66267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org 679bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org.align 2 68267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.orgWebRtcNsx_kLogTable: 699bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org_WebRtcNsx_kLogTable: 70267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org.short 0, 177, 355, 532, 710, 887, 1065, 1242, 1420 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ void NoiseEstimationNeon(NsxInst_t* inst, 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ uint16_t* magn, 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ uint32_t* noise, 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ int16_t* q_noise); 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ Register usage (across major loops of NoiseEstimationNeon()): 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ r0-r3: function arguments, and scratch registers. 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ r4: &inst 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ r5: &noiseEstLogQuantile[] 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ r6: inst->magnLen 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ r7: offset 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ r8: s, the loop counter for the LOOP_SIMULT 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ r9: &inst->noiseEstDensity[] 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ r10: &inst->noiseEstCounter[] 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ r11: countDiv 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ r12: i, the loop counter for LOOP_NOISEESTIMATION_MAGNLEN_INNER 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 899bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org.align 2 90b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.orgDEFINE_FUNCTION WebRtcNsx_NoiseEstimationNeon 915666f6ca681c168b1b0c701edbacc7730ae99cf1kma@webrtc.org push {r4-r12, r14} @ Make sure 8-byte stack alignment. 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vpush {d8-d15} 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org sub sp, #(16 + (HALF_ANAL_BLOCKL + 3) / 4 * 8) 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ [sp, #0]: logval 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ [sp, #4]: noise 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ [sp, #8]: q_noise 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ [sp, #12]: factor 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ [sp, #16 ~ #(16 + (HALF_ANAL_BLOCKL + 3) / 4 * 8)]: lmagn[HALF_ANAL_BLOCKL] 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org str r2, [sp, #4] @ noise 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org str r3, [sp, #8] @ q_noise 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r4, #offset_nsx_normData 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r2, [r0, #offset_nsx_stages] @ inst->stages 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r4, [r0, r4] @ inst->normData 106267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org adr r12, WebRtcNsx_kLogTable 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org subs r3, r2, r4 @ tabind = inst->stages - inst->normData; 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r5, [r0, #offset_nsx_magnLen] @ magnLen 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rsblt r3, #0 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lsl r3, #1 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrh r3, [r12, r3] @ logval = WebRtcNsx_kLogTable[tabind]; 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r12, sp, #16 @ lmagn[] 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rsblt r3, #0 @ logval = -WebRtcNsx_kLogTable[-tabind]; 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org str r3, [sp] 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vdup.16 q15, r3 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 117267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org adr r9, WebRtcNsx_kLogTableFrac 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_SET_LMAGN: 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrh r2, [r1], #2 @ magn[i] 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r2, #0 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org streqh r3, [r12], #2 @ lmagn[i] = logval; 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org beq CHECK_LMAGN_COUNTER 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org clz r6, r2 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r4, r6 @ zeros 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rsb r6, #31 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lsl r2, r4 129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ubfx r4, r2, #23, #8 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r2, r4, lsl #1 131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrh r4, [r9, r2] @ WebRtcNsx_kLogTableFrac[frac] 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r7, r4, r6, lsl #8 @ log2 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r2, #22713 @ log2_const 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org smulbb r2, r7, r2 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r2, r3, r2, lsr #15 136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org strh r2, [r12], #2 @ lmagn[i] 137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgCHECK_LMAGN_COUNTER: 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org subs r5, #1 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bgt LOOP_SET_LMAGN 141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r3, #21845 @ width_factor 143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vdup.16 q5, r3 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmov.s16 q14, #WIDTH_Q8 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r5, #offset_nsx_noiseEstLogQuantile 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r7, #offset_nsx_blockIndex 148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r9, #offset_nsx_noiseEstDensity 149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r5, r0 150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r6, [r0, #offset_nsx_magnLen] 151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r7, [r0, r7] 152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r9, r0 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r7, #END_STARTUP_LONG 1549bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org movw r10, #offset_nsx_noiseEstCounter 1559bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org add r10, r0 156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movge r7, #FACTOR_Q7 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movlt r7, #FACTOR_Q7_STARTUP 158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r4, r0 159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org str r7, [sp, #12] @ factor 160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r8, #SIMULT 161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r7, #0 162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_SIMULT: 164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrsh r1, [r10] @ inst->noiseEstCounter[s] 165267a0decd6e8569a0af603fc27e4ddd25d50d13ckma@webrtc.org adr r3, WebRtcNsx_kCounterDiv 166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r11, r1, lsl #1 @ counter 167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrh r11, [r3, r11] @ countDiv = WebRtcNsx_kCounterDiv[counter]; 168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org sub r12, r6, #1 @ Loop counter. 169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org smulbb r3, r1, r11 @ countProd 170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vdup.16 q11, r11 171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vqrdmulh.s16 q11, q5, q11 @ WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND( 173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org @ width_factor, countDiv, 15); 174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vdup.16 d24, r11 175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vdup.16 d25, r3 176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r3, [sp, #12] @ factor 178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r1, sp, #16 @ &lmagn[0] 179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vdup.16 q9, r3 180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmov.i16 q13, #512 181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmov.i16 q7, #15 182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmov.i32 q6, #FACTOR_Q16 183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_NOISEESTIMATION_MAGNLEN_INNER: 185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {q0}, [r9] @ noiseEstDensity[offset + i] 186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org @ Compute delta in the next two blocks. 188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vclz.i16 q4, q0 189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vsub.i16 q4, q4, q7 @ Value of the shift factors; likely negative. 190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmovl.s16 q3, d8 191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmovl.s16 q2, d9 192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vshl.s32 q1, q6, q3 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmovn.i32 d8, q1 @ d8 holds shifted FACTOR_Q16. 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vshl.s32 q1, q6, q2 196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vcgt.s16 q3, q0, q13 @ Compare noiseEstDensity to 512. 197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmovn.i32 d9, q1 @ d9 holds shifted FACTOR_Q16. 198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmov.i16 q1, q9 199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vbit.s16 q1, q4, q3 @ If bigger than 512, delta = shifted FACTOR_Q16. 200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q8, d3, d24 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q4, d2, d24 203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vshrn.i32 d2, q4, #14 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vshrn.i32 d3, q8, #14 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vrshr.s16 q3, q1, #1 207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vrshr.s16 q8, q1, #2 208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q4, d7, d28 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q3, d6, d28 210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {q10}, [r5] @ inst->noiseEstLogQuantile[offset + i] 211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vshrn.i32 d4, q3, #1 212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vshrn.i32 d5, q4, #1 213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {q3}, [r1]! @ lmagn[i] 215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vsub.i16 q4, q10, q2 216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vadd.i16 q8, q10, q8 217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vsub.i16 q2, q3, q10 218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmax.s16 q4, q4, q15 219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vcgt.s16 q1, q2, #0 220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vbit q10, q8, q1 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vbif q10, q4, q1 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vsub.i16 q1, q3, q10 224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vst1.16 {q10}, [r5]! @ inst->noiseEstLogQuantile[offset + i] 225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vabs.s16 q4, q1 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vqrdmulh.s16 d2, d0, d25 227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vqrdmulh.s16 d3, d1, d25 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vcgt.s16 q4, q14, q4 229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vadd.i16 q1, q1, q11 230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vbit q0, q1, q4 231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org subs r12, #8 232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vst1.16 {q0}, [r9]! @ noiseEstDensity[offset + i] 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bgt LOOP_NOISEESTIMATION_MAGNLEN_INNER 234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ 236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ Last iteration over magnitude spectrum. 237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ 238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgCOMPUTE_DELTA: 240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrsh r2, [r9] @ inst->noiseEstDensity[offset + i] 241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r2, #512 242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bgt COMPUTE_DELTA_BIGGER_DENSITY 243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r2, #offset_nsx_blockIndex 245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r0, [r4, r2] 246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r0, #END_STARTUP_LONG 247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movge r0, #FACTOR_Q7 @ delta 248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movlt r0, #FACTOR_Q7_STARTUP @ delta 249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org b UPDATE_LOG_QUANTILE_ESTIMATE 250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgCOMPUTE_DELTA_BIGGER_DENSITY: 252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org clz r2, r2 253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rsb r0, r2, #31 @ 14 - factor 254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r2, #FACTOR_Q16 255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r0, r2, lsr r0 @ FACTOR_Q16 >> (14 - factor) 256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgUPDATE_LOG_QUANTILE_ESTIMATE: 258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org smulbb r12, r0, r11 259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrsh r1, [r1] @ lmagn[i] 260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ubfx r12, r12, #14, #16 @ tmp16 261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrsh r2, [r5] @ inst->noiseEstLogQuantile[offset + i] 262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r1, r2 263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bgt UPDATE_LOG_QUANTILE_ESTIMATE_BIGGER_LMAGN 264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r12, #1 266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r3, [sp] @ logval 267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r0, r12, lsr #1 @ tmp16no1 268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r12, #3 269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org smulbb r12, r0, r12 @ tmp16no2 270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org sub r2, r12, lsr #1 271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r3, r2 272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrgt r2, [sp] 273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrgt r3, [sp] 274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org b UPDATE_LOG_QUANTILE_ESTIMATE_STORE 275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgUPDATE_LOG_QUANTILE_ESTIMATE_BIGGER_LMAGN: 277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r3, r12, #2 278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r2, r3, lsr #2 279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgUPDATE_LOG_QUANTILE_ESTIMATE_STORE: 281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmov.s16 r0, d25[0] @ countProd 282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org strh r2, [r5] 283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r5, #2 @ increment &noiseEstLogQuantile[offset + i] 284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgUPDATE_DENSITY_ESTIMATE: 286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org subs r12, r1, r2 287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rsblt r12, #0 288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r12, #WIDTH_Q8 289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bge UPDATE_DENSITY_ESTIMATE_CHECK_COUNTER 290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r3, #21845 @ width_factor 292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrh r12, [r9] @ inst->noiseEstDensity[offset + i] 293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org smulbb r2, r3, r11 294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org smulbb r1, r12, r0 295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r0, r2, #1 << 14 @ Rounding 296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r12, r1, #1 << 14 297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r1, r12, lsr #15 298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r3, r1, r0, lsr #15 299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org strh r3, [r9] @ inst->noiseEstDensity[offset + i] 300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgUPDATE_DENSITY_ESTIMATE_CHECK_COUNTER: 302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r9, #2 @ updata &noiseEstDensity[offset + i] 303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrsh r3, [r10] @ inst->noiseEstCounter[s] 304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r3, #END_STARTUP_LONG 305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org blt POST_UPDATE_DENSITY_ESTIMATE 306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r2, #offset_nsx_blockIndex 308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r12, #0 309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r2, [r4, r2] 310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org strh r12, [r10] 311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r2, #END_STARTUP_LONG 312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org blt POST_UPDATE_DENSITY_ESTIMATE 313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r0, r4 315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r1, r7 3169bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org CALL_FUNCTION UpdateNoiseEstimateNeon 317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgPOST_UPDATE_DENSITY_ESTIMATE: 319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrh r3, [r10] 320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r3, #1 321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org strh r3, [r10], #2 322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org subs r8, #1 323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r7, r6 @ offset += inst->magnLen; 324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bgt LOOP_SIMULT 325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r2, #offset_nsx_blockIndex 327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r2, [r4, r2] 328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r2, #END_STARTUP_LONG 329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bge UPDATE_NOISE 330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org sub r1, r7, r6 332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r0, r4 3339bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org CALL_FUNCTION UpdateNoiseEstimateNeon 334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgUPDATE_NOISE: 336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r1, #offset_nsx_noiseEstQuantile 337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r1, r4 338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r2, [sp, #4] 339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ Initial value of loop counter r6 = inst->magnLen. 341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_UPDATE_NOISE: 342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrsh r0, [r1], #2 343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org subs r6, #1 344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org str r0, [r2], #4 345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bgt LOOP_UPDATE_NOISE 346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgUPDATE_Q_NOISE: 348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r2, #offset_nsx_qNoise 349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r1, [sp, #8] 350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrh r2, [r4, r2] 351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org strh r2, [r1] 352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add sp, #(16 + (HALF_ANAL_BLOCKL + 3) / 4 * 8) 354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vpop {d8-d15} 3555666f6ca681c168b1b0c701edbacc7730ae99cf1kma@webrtc.org pop {r4-r12, pc} 356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ static void UpdateNoiseEstimateNeon(NsxInst_t* inst, int offset); 358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ Neon registers touched: q0-q3, q8-q13. 3599bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org.align 2 360b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.orgDEFINE_FUNCTION UpdateNoiseEstimateNeon 361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org push {r4, r5, r6, r14} 362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r5, r0 363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmov.i32 q10, #21 365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmov.i32 q11, #0x1FFFFF 366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmov.i32 q9, #0x200000 367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r0, #offset_nsx_noiseEstLogQuantile 369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r6, #offset_nsx_magnLen 370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r0, r5 @ &inst->noiseEstLogQuantile 371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r4, r0, r1, lsl #1 @ &inst->noiseEstLogQuantile[offset] 372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrsh r6, [r5, r6] @ &inst->magnLen 373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r0, r4 375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r1, r6 3769bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org CALL_FUNCTION WebRtcSpl_MaxValueW16Neon 377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org sub r12, r6, #1 @ Loop counter: inst->magnLen - 1. 379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r6, #11819 @ kExp2Const in Q13 381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r2, #offset_nsx_noiseEstQuantile 382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vdup.16 d16, r6 383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org smulbb r3, r6, r0 384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r0, r3, #1 << 20 @ Round 385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r1, #offset_nsx_qNoise 386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r0, r0, lsr #21 387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rsb r0, r0, #14 @ 14 - (round(kExp2Const * tmp16) >> 21) 388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r2, r5 @ &inst->noiseEstQuantile 389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vdup.32 q13, r0 390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org str r0, [r5, r1] 391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_UPDATE: 393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {d0, d1}, [r4]! @ &inst->noiseEstLogQuantile[offset + i] 394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q1, d0, d16 395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q0, d1, d16 396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vshr.s32 q3, q1, #21 397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vshr.s32 q2, q0, #21 398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vand q1, q1, q11 399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vand q0, q0, q11 400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vsub.i32 q3, q3, q10 401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vsub.i32 q2, q2, q10 402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vorr q1, q1, q9 403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vorr q0, q0, q9 404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vadd.i32 q3, q3, q13 405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vadd.i32 q2, q2, q13 406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vshl.s32 q1, q1, q3 407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vshl.s32 q0, q0, q2 408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vqmovn.s32 d1, q0 409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vqmovn.s32 d0, q1 410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org subs r12, #8 411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vst1.16 {d0, d1}, [r2]! 412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bgt LOOP_UPDATE 413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgPOST_LOOP_MAGNLEN: 415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrh r1, [r4] 416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org smulbb r3, r6, r1 @ kExp2Const * ptr_noiseEstLogQuantile[offset + i] 417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r12, #0x00200000 418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bfi r12, r3, #0, #21 @ tmp32no1 = 0x00200000 | (tmp32no2 & 0x001FFFFF); 419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rsb r0, #21 @ 21 - &inst->qNoise 420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org sub r14, r0, r3, lsr #21 @ -tmp16 421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r0, r12, lsr r14 422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ssat r3, #16, r0 423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org strh r3, [r2] 424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org pop {r4, r5, r6, pc} 426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ void PrepareSpectrumNeon(NsxInst_t* inst, int16_t* freq_buf); 4289bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org.align 2 429b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.orgDEFINE_FUNCTION WebRtcNsx_PrepareSpectrumNeon 4305666f6ca681c168b1b0c701edbacc7730ae99cf1kma@webrtc.org push {r4-r9} 431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r2, #offset_nsx_real 433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r12, #offset_nsx_noiseSupFilter 434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r4, #offset_nsx_imag 435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r5, #offset_nsx_magnLen 436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r2, r0 @ &inst->real[0] 438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r4, r0 @ &inst->image[0] 439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r9, r4 @ &inst->image[0] 440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r3, r2 @ &inst->real[0] 441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r5, [r0, r5] @ inst->magnLen 442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r6, r4, #2 @ &inst->image[1] 443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org sub r5, #1 444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r12, r0 @ &inst->noiseSupFilter[0] 445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r5, r2, r5, lsl #1 @ &inst->real[inst->magnLen - 1] 446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_MAGNLEN: 448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org @ Filter the elements. 449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {d20, d21}, [r2] @ inst->real[] 450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {d24, d25}, [r12]! @ inst->noiseSupFilter[] 451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {d22, d23}, [r4] @ inst->imag[] 452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q0, d20, d24 453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q1, d21, d25 454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q2, d22, d24 455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q3, d23, d25 456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vshrn.s32 d0, q0, #14 457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vshrn.s32 d1, q1, #14 458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vshrn.s32 d2, q2, #14 459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vshrn.s32 d3, q3, #14 460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vst1.16 {d0, d1}, [r2]! 461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vst1.16 {d2, d3}, [r4]! 462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r2, r5 463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bcc LOOP_MAGNLEN 464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org @ Last two elements to filter: 466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrh r7, [r2] 467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrh r8, [r12] 468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrh r5, [r4] 469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org smulbb r7, r7, r8 470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org smulbb r5, r5, r8 471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r7, r7, lsr #14 472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r8, r5, lsr #14 473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org strh r7, [r2] 474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org strh r8, [r4] 475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 476270cca151b2393743d1430baf71c7a9d31c7088ckma@webrtc.org ldr r5, [r0, #offset_nsx_anaLen2] @ inst->anaLen2 477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r7, [r0, #offset_nsx_anaLen] @ inst->anaLen 478270cca151b2393743d1430baf71c7a9d31c7088ckma@webrtc.org lsr r5, #3 @ inst->anaLen2 / 8 479270cca151b2393743d1430baf71c7a9d31c7088ckma@webrtc.org sub r5, #1 @ Loop counter. 480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 481270cca151b2393743d1430baf71c7a9d31c7088ckma@webrtc.org@ Process and write the first 2 samples into freq_buf[]. 482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrh r2, [r3], #2 @ inst->real[0] 483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrh r0, [r9] @ inst->imag[0] 484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org strh r2, [r1], #2 @ Store to freq_buf[0] 485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rsb r0, r0, #0 486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org strh r0, [r1], #2 @ Store to freq_buf[1]. Now r1 -> &freq_buf[2] 487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 488270cca151b2393743d1430baf71c7a9d31c7088ckma@webrtc.org@ Process and write (inst->anaLen2 * 4 - 32) samples into freq_buf[]. 489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_ANALEN2: 49033f81b106dc73be5e99290d61c93ae242cde397ekma@webrtc.org vld1.16 d5, [r6]! @ inst->imag[], starting from inst->imag[1] 49133f81b106dc73be5e99290d61c93ae242cde397ekma@webrtc.org vld1.16 d7, [r6]! 49233f81b106dc73be5e99290d61c93ae242cde397ekma@webrtc.org vneg.s16 d5, d5 49333f81b106dc73be5e99290d61c93ae242cde397ekma@webrtc.org vld1.16 d4, [r3]! @ inst->real[], starting from inst->real[1] 49433f81b106dc73be5e99290d61c93ae242cde397ekma@webrtc.org vneg.s16 d7, d7 49533f81b106dc73be5e99290d61c93ae242cde397ekma@webrtc.org vld1.16 d6, [r3]! 496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vzip.16 d4, d5 497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vzip.16 d6, d7 498270cca151b2393743d1430baf71c7a9d31c7088ckma@webrtc.org subs r5, #1 499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vst1.16 {d4, d5, d6, d7}, [r1]! 500270cca151b2393743d1430baf71c7a9d31c7088ckma@webrtc.org bgt LOOP_ANALEN2 501270cca151b2393743d1430baf71c7a9d31c7088ckma@webrtc.org 502270cca151b2393743d1430baf71c7a9d31c7088ckma@webrtc.org@ Process and write 32 samples into freq_buf[]. We need to adjust the pointers 503270cca151b2393743d1430baf71c7a9d31c7088ckma@webrtc.org@ to overwrite the 2 starting samples in the back half of the buffer. 50433f81b106dc73be5e99290d61c93ae242cde397ekma@webrtc.org vld1.16 d5, [r6]! @ inst->imag[], starting from inst->imag[1] 50533f81b106dc73be5e99290d61c93ae242cde397ekma@webrtc.org vld1.16 d7, [r6]! 50633f81b106dc73be5e99290d61c93ae242cde397ekma@webrtc.org vneg.s16 d5, d5 50733f81b106dc73be5e99290d61c93ae242cde397ekma@webrtc.org vld1.16 d4, [r3]! @ inst->real[], starting from inst->real[1] 50833f81b106dc73be5e99290d61c93ae242cde397ekma@webrtc.org vneg.s16 d7, d7 50933f81b106dc73be5e99290d61c93ae242cde397ekma@webrtc.org vld1.16 d6, [r3]! 510270cca151b2393743d1430baf71c7a9d31c7088ckma@webrtc.org vzip.16 d4, d5 511270cca151b2393743d1430baf71c7a9d31c7088ckma@webrtc.org vzip.16 d6, d7 512270cca151b2393743d1430baf71c7a9d31c7088ckma@webrtc.org vst1.16 {d4, d5, d6, d7}, [r1] 513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 5145666f6ca681c168b1b0c701edbacc7730ae99cf1kma@webrtc.org pop {r4-r9} 515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bx r14 516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ void SynthesisUpdateNeon(NsxInst_t* inst, 518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ int16_t* out_frame, 519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ int16_t gain_factor); 5209bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org.align 2 521b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.orgDEFINE_FUNCTION WebRtcNsx_SynthesisUpdateNeon 522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org push {r4, r5} 523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vdup.16 d31, r2 525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r2, #offset_nsx_anaLen 527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r4, #offset_nsx_real 528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r12, #offset_nsx_synthesisBuffer 529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrsh r5, [r0, r2] @ inst->anaLen 531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r12, r0 @ &inst->synthesisBuffer[0]; 532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r3, [r0, #offset_nsx_window] @ &inst->window[0] 533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r4, r0 @ &inst->real[0] 534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r5, r12, r5, lsl #1 @ &inst->synthesisBuffer[inst->anaLen] 535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r2, r12 @ &inst->synthesisBuffer[0]; 537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_SYNTHESIS: 539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {d0, d1}, [r4]! @ inst->real[] 540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {d2, d3}, [r3]! @ inst->window[] 541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {d4, d5}, [r2] @ inst->synthesisBuffer[]; 542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q3, d0, d2 543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q8, d1, d3 544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vrshrn.i32 d0, q3, #14 545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vrshrn.i32 d1, q8, #14 546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q3, d31, d0 547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q8, d31, d1 548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vqrshrn.s32 d0, q3, #13 549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vqrshrn.s32 d1, q8, #13 550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vqadd.s16 d4, d0 551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vqadd.s16 d5, d1 552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vst1.16 {d4, d5}, [r2]! 553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r2, r5 554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org blt LOOP_SYNTHESIS 555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgPOST_LOOP_SYNTHESIS: 557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r3, #offset_nsx_blockLen10ms 558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r2, [r0, r3] 559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r3, r12 @ &inst->synthesisBuffer[0]; 560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r0, r12, r2, lsl #1 @ &inst->synthesisBuffer[inst->blockLen10ms] 561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_BLOCKLEN10MS: 563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {q0, q1}, [r3]! @ inst->synthesisBuffer[]; 564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r3, r0 565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vst1.16 {q0, q1}, [r1]! @ out_frame[] 566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org blt LOOP_BLOCKLEN10MS 567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r0, r5 569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bge POST_LOOP_MEMCPY 570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_MEMCPY: 572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {q0, q1}, [r0]! @ inst->synthesisBuffer[i + inst->blockLen10ms] 573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r0, r5 574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vst1.16 {q0, q1}, [r12]! @ inst->synthesisBuffer[i] 575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org blt LOOP_MEMCPY 576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgPOST_LOOP_MEMCPY: 578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r12, r5 579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmov.i16 q10, #0 580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmov.i16 q11, #0 581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bge EXIT_SYNTHESISUPDATE 582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_ZEROSARRAY: 584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vst1.16 {q10, q11}, [r12]! @ inst->synthesisBuffer[i + inst->anaLen] 585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r12, r5 586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org blt LOOP_ZEROSARRAY 587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgEXIT_SYNTHESISUPDATE: 589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org pop {r4, r5} 590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bx r14 591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ void AnalysisUpdateNeon(NsxInst_t* inst, int16_t* out, int16_t* new_speech); 5939bf0d096fddaf2b1db2a16d0f6e4b64ea44aff5bkma@webrtc.org.align 2 594b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.orgDEFINE_FUNCTION WebRtcNsx_AnalysisUpdateNeon 595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org push {r4-r6} 596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r3, #offset_nsx_analysisBuffer 598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r4, #offset_nsx_anaLen 599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org movw r12, #offset_nsx_blockLen10ms 600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r3, r0 @ &inst->analysisBuffer[0] 601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldrsh r4, [r0, r4] @ inst->anaLen 602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r12, [r0, r12] @ inst->blockLen10ms 603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org sub r6, r4, r12 604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r6, r3, r6, lsl #1 @ &inst->analysisBuffer[inst->anaLen 605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org @ - inst->blockLen10ms] 606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r3, r6 607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mov r5, r3 608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bge POST_LOOP_MEMCPY_1 609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r12, r3, r12, lsl #1 @ &inst->analysisBuffer[inst->blockLen10ms] 611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_MEMCPY_1: 613b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {q10, q11}, [r12]! @ inst->analysisBuffer[i + inst->blockLen10ms] 614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vst1.16 {q10, q11}, [r5]! @ inst->analysisBuffer[i] 615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r5, r6 616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org blt LOOP_MEMCPY_1 617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgPOST_LOOP_MEMCPY_1: 619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r12, r3, r4, lsl #1 @ &inst->analysisBuffer[inst->anaLen] 620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r5, r12 621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bge POST_LOOP_MEMCPY_2 622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_MEMCPY_2: 624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {q10, q11}, [r2]! @ new_speech[i] 625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vst1.16 {q10, q11}, [r5]! @ inst->analysisBuffer[ 626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org @ i + inst->anaLen - inst->blockLen10ms] 627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r5, r12 628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org blt LOOP_MEMCPY_2 629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgPOST_LOOP_MEMCPY_2: 631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org add r4, r1, r4, lsl #1 @ &out[inst->anaLen] 632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r1, r4 633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ldr r2, [r0, #offset_nsx_window] @ &inst->window[0] 634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bge POST_LOOP_WINDOW_DATA 635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_WINDOW_DATA: 637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {d4, d5}, [r3]! @ inst->analysisBuffer[] 638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vld1.16 {d6, d7}, [r2]! @ inst->window[] 639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q0, d4, d6 640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vmull.s16 q1, d5, d7 641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vrshrn.i32 d4, q0, #14 642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vrshrn.i32 d5, q1, #14 643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org vst1.16 {d4, d5}, [r1]! @ out[] 644b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org cmp r1, r4 645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org blt LOOP_WINDOW_DATA 646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgPOST_LOOP_WINDOW_DATA: 648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org pop {r4-r6} 649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bx r14 650