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