xref: /aosp_15_r20/external/liblc3/src/ltpf_arm.h (revision 49fe348c0058011ee60b6957cdd9d52742df84bc)
1*49fe348cSAndroid Build Coastguard Worker /******************************************************************************
2*49fe348cSAndroid Build Coastguard Worker  *
3*49fe348cSAndroid Build Coastguard Worker  *  Copyright 2022 Google LLC
4*49fe348cSAndroid Build Coastguard Worker  *
5*49fe348cSAndroid Build Coastguard Worker  *  Licensed under the Apache License, Version 2.0 (the "License");
6*49fe348cSAndroid Build Coastguard Worker  *  you may not use this file except in compliance with the License.
7*49fe348cSAndroid Build Coastguard Worker  *  You may obtain a copy of the License at:
8*49fe348cSAndroid Build Coastguard Worker  *
9*49fe348cSAndroid Build Coastguard Worker  *  http://www.apache.org/licenses/LICENSE-2.0
10*49fe348cSAndroid Build Coastguard Worker  *
11*49fe348cSAndroid Build Coastguard Worker  *  Unless required by applicable law or agreed to in writing, software
12*49fe348cSAndroid Build Coastguard Worker  *  distributed under the License is distributed on an "AS IS" BASIS,
13*49fe348cSAndroid Build Coastguard Worker  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*49fe348cSAndroid Build Coastguard Worker  *  See the License for the specific language governing permissions and
15*49fe348cSAndroid Build Coastguard Worker  *  limitations under the License.
16*49fe348cSAndroid Build Coastguard Worker  *
17*49fe348cSAndroid Build Coastguard Worker  ******************************************************************************/
18*49fe348cSAndroid Build Coastguard Worker 
19*49fe348cSAndroid Build Coastguard Worker #if (__ARM_FEATURE_SIMD32 && !(__GNUC__ < 10) || defined(TEST_ARM))
20*49fe348cSAndroid Build Coastguard Worker 
21*49fe348cSAndroid Build Coastguard Worker #ifndef TEST_ARM
22*49fe348cSAndroid Build Coastguard Worker 
23*49fe348cSAndroid Build Coastguard Worker #include <arm_acle.h>
24*49fe348cSAndroid Build Coastguard Worker 
__pkhbt(int16x2_t a,int16x2_t b)25*49fe348cSAndroid Build Coastguard Worker static inline int16x2_t __pkhbt(int16x2_t a, int16x2_t b)
26*49fe348cSAndroid Build Coastguard Worker {
27*49fe348cSAndroid Build Coastguard Worker     int16x2_t r;
28*49fe348cSAndroid Build Coastguard Worker     __asm("pkhbt %0, %1, %2" : "=r" (r) : "r" (a), "r" (b));
29*49fe348cSAndroid Build Coastguard Worker     return r;
30*49fe348cSAndroid Build Coastguard Worker }
31*49fe348cSAndroid Build Coastguard Worker 
32*49fe348cSAndroid Build Coastguard Worker #endif /* TEST_ARM */
33*49fe348cSAndroid Build Coastguard Worker 
34*49fe348cSAndroid Build Coastguard Worker 
35*49fe348cSAndroid Build Coastguard Worker /**
36*49fe348cSAndroid Build Coastguard Worker  * Import
37*49fe348cSAndroid Build Coastguard Worker  */
38*49fe348cSAndroid Build Coastguard Worker 
39*49fe348cSAndroid Build Coastguard Worker static inline int32_t filter_hp50(struct lc3_ltpf_hp50_state *, int32_t);
40*49fe348cSAndroid Build Coastguard Worker static inline float dot(const int16_t *, const int16_t *, int);
41*49fe348cSAndroid Build Coastguard Worker 
42*49fe348cSAndroid Build Coastguard Worker 
43*49fe348cSAndroid Build Coastguard Worker /**
44*49fe348cSAndroid Build Coastguard Worker  * Resample from 8 / 16 / 32 KHz to 12.8 KHz Template
45*49fe348cSAndroid Build Coastguard Worker  */
46*49fe348cSAndroid Build Coastguard Worker #if !defined(resample_8k_12k8) || !defined(resample_16k_12k8) \
47*49fe348cSAndroid Build Coastguard Worker     || !defined(resample_32k_12k8)
arm_resample_x64k_12k8(const int p,const int16x2_t * h,struct lc3_ltpf_hp50_state * hp50,const int16x2_t * x,int16_t * y,int n)48*49fe348cSAndroid Build Coastguard Worker static inline void arm_resample_x64k_12k8(const int p, const int16x2_t *h,
49*49fe348cSAndroid Build Coastguard Worker     struct lc3_ltpf_hp50_state *hp50, const int16x2_t *x, int16_t *y, int n)
50*49fe348cSAndroid Build Coastguard Worker {
51*49fe348cSAndroid Build Coastguard Worker     const int w = 40 / p;
52*49fe348cSAndroid Build Coastguard Worker 
53*49fe348cSAndroid Build Coastguard Worker     x -= w;
54*49fe348cSAndroid Build Coastguard Worker 
55*49fe348cSAndroid Build Coastguard Worker     for (int i = 0; i < 5*n; i += 5) {
56*49fe348cSAndroid Build Coastguard Worker         const int16x2_t *hn = h + (i % (2*p)) * (48 / p);
57*49fe348cSAndroid Build Coastguard Worker         const int16x2_t *xn = x + (i / (2*p));
58*49fe348cSAndroid Build Coastguard Worker 
59*49fe348cSAndroid Build Coastguard Worker         int32_t un = __smlad(*(xn++), *(hn++), 0);
60*49fe348cSAndroid Build Coastguard Worker 
61*49fe348cSAndroid Build Coastguard Worker         for (int k = 0; k < w; k += 5) {
62*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
63*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
64*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
65*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
66*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
67*49fe348cSAndroid Build Coastguard Worker         }
68*49fe348cSAndroid Build Coastguard Worker 
69*49fe348cSAndroid Build Coastguard Worker         int32_t yn = filter_hp50(hp50, un);
70*49fe348cSAndroid Build Coastguard Worker         *(y++) = (yn + (1 << 15)) >> 16;
71*49fe348cSAndroid Build Coastguard Worker     }
72*49fe348cSAndroid Build Coastguard Worker }
73*49fe348cSAndroid Build Coastguard Worker #endif
74*49fe348cSAndroid Build Coastguard Worker 
75*49fe348cSAndroid Build Coastguard Worker /**
76*49fe348cSAndroid Build Coastguard Worker  * Resample from 24 / 48 KHz to 12.8 KHz Template
77*49fe348cSAndroid Build Coastguard Worker  */
78*49fe348cSAndroid Build Coastguard Worker #if !defined(resample_24k_12k8) || !defined(resample_48k_12k8)
arm_resample_x192k_12k8(const int p,const int16x2_t * h,struct lc3_ltpf_hp50_state * hp50,const int16x2_t * x,int16_t * y,int n)79*49fe348cSAndroid Build Coastguard Worker static inline void arm_resample_x192k_12k8(const int p, const int16x2_t *h,
80*49fe348cSAndroid Build Coastguard Worker     struct lc3_ltpf_hp50_state *hp50, const int16x2_t *x, int16_t *y, int n)
81*49fe348cSAndroid Build Coastguard Worker {
82*49fe348cSAndroid Build Coastguard Worker     const int w = 120 / p;
83*49fe348cSAndroid Build Coastguard Worker 
84*49fe348cSAndroid Build Coastguard Worker     x -= w;
85*49fe348cSAndroid Build Coastguard Worker 
86*49fe348cSAndroid Build Coastguard Worker     for (int i = 0; i < 15*n; i += 15) {
87*49fe348cSAndroid Build Coastguard Worker         const int16x2_t *hn = h + (i % (2*p)) * (128 / p);
88*49fe348cSAndroid Build Coastguard Worker         const int16x2_t *xn = x + (i / (2*p));
89*49fe348cSAndroid Build Coastguard Worker 
90*49fe348cSAndroid Build Coastguard Worker         int32_t un = __smlad(*(xn++), *(hn++), 0);
91*49fe348cSAndroid Build Coastguard Worker 
92*49fe348cSAndroid Build Coastguard Worker         for (int k = 0; k < w; k += 15) {
93*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
94*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
95*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
96*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
97*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
98*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
99*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
100*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
101*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
102*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
103*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
104*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
105*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
106*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
107*49fe348cSAndroid Build Coastguard Worker             un = __smlad(*(xn++), *(hn++), un);
108*49fe348cSAndroid Build Coastguard Worker         }
109*49fe348cSAndroid Build Coastguard Worker 
110*49fe348cSAndroid Build Coastguard Worker         int32_t yn = filter_hp50(hp50, un);
111*49fe348cSAndroid Build Coastguard Worker         *(y++) = (yn + (1 << 15)) >> 16;
112*49fe348cSAndroid Build Coastguard Worker     }
113*49fe348cSAndroid Build Coastguard Worker }
114*49fe348cSAndroid Build Coastguard Worker #endif
115*49fe348cSAndroid Build Coastguard Worker 
116*49fe348cSAndroid Build Coastguard Worker /**
117*49fe348cSAndroid Build Coastguard Worker  * Resample from 8 Khz to 12.8 KHz
118*49fe348cSAndroid Build Coastguard Worker  */
119*49fe348cSAndroid Build Coastguard Worker #ifndef resample_8k_12k8
120*49fe348cSAndroid Build Coastguard Worker 
arm_resample_8k_12k8(struct lc3_ltpf_hp50_state * hp50,const int16_t * x,int16_t * y,int n)121*49fe348cSAndroid Build Coastguard Worker static void arm_resample_8k_12k8(
122*49fe348cSAndroid Build Coastguard Worker     struct lc3_ltpf_hp50_state *hp50, const int16_t *x, int16_t *y, int n)
123*49fe348cSAndroid Build Coastguard Worker {
124*49fe348cSAndroid Build Coastguard Worker     static const int16_t alignas(int32_t) h[2*8*12] = {
125*49fe348cSAndroid Build Coastguard Worker         0, 214,  417, -1052, -4529, 26233, -4529, -1052,   417,  214,   0, 0,
126*49fe348cSAndroid Build Coastguard Worker         0, 180,    0, -1522, -2427, 24506, -5289,     0,   763,  156, -28, 0,
127*49fe348cSAndroid Build Coastguard Worker         0,  92, -323, -1361,     0, 19741, -3885,  1317,   861,    0, -61, 0,
128*49fe348cSAndroid Build Coastguard Worker         0,   0, -457,  -752,  1873, 13068,     0,  2389,   598, -213, -79, 0,
129*49fe348cSAndroid Build Coastguard Worker         0, -61, -398,     0,  2686,  5997,  5997,  2686,     0, -398, -61, 0,
130*49fe348cSAndroid Build Coastguard Worker         0, -79, -213,   598,  2389,     0, 13068,  1873,  -752, -457,   0, 0,
131*49fe348cSAndroid Build Coastguard Worker         0, -61,    0,   861,  1317, -3885, 19741,     0, -1361, -323,  92, 0,
132*49fe348cSAndroid Build Coastguard Worker         0, -28,  156,   763,     0, -5289, 24506, -2427, -1522,    0, 180, 0,
133*49fe348cSAndroid Build Coastguard Worker         0, 0, 214,  417, -1052, -4529, 26233, -4529, -1052,   417,  214,   0,
134*49fe348cSAndroid Build Coastguard Worker         0, 0, 180,    0, -1522, -2427, 24506, -5289,     0,   763,  156, -28,
135*49fe348cSAndroid Build Coastguard Worker         0, 0,  92, -323, -1361,     0, 19741, -3885,  1317,   861,    0, -61,
136*49fe348cSAndroid Build Coastguard Worker         0, 0,   0, -457,  -752,  1873, 13068,     0,  2389,   598, -213, -79,
137*49fe348cSAndroid Build Coastguard Worker         0, 0, -61, -398,     0,  2686,  5997,  5997,  2686,     0, -398, -61,
138*49fe348cSAndroid Build Coastguard Worker         0, 0, -79, -213,   598,  2389,     0, 13068,  1873,  -752, -457,   0,
139*49fe348cSAndroid Build Coastguard Worker         0, 0, -61,    0,   861,  1317, -3885, 19741,     0, -1361, -323,  92,
140*49fe348cSAndroid Build Coastguard Worker         0, 0, -28,  156,   763,     0, -5289, 24506, -2427, -1522,    0, 180,
141*49fe348cSAndroid Build Coastguard Worker     };
142*49fe348cSAndroid Build Coastguard Worker 
143*49fe348cSAndroid Build Coastguard Worker     arm_resample_x64k_12k8(
144*49fe348cSAndroid Build Coastguard Worker         8, (const int16x2_t *)h, hp50, (int16x2_t *)x, y, n);
145*49fe348cSAndroid Build Coastguard Worker }
146*49fe348cSAndroid Build Coastguard Worker 
147*49fe348cSAndroid Build Coastguard Worker #ifndef TEST_ARM
148*49fe348cSAndroid Build Coastguard Worker #define resample_8k_12k8 arm_resample_8k_12k8
149*49fe348cSAndroid Build Coastguard Worker #endif
150*49fe348cSAndroid Build Coastguard Worker 
151*49fe348cSAndroid Build Coastguard Worker #endif /* resample_8k_12k8 */
152*49fe348cSAndroid Build Coastguard Worker 
153*49fe348cSAndroid Build Coastguard Worker /**
154*49fe348cSAndroid Build Coastguard Worker  * Resample from 16 Khz to 12.8 KHz
155*49fe348cSAndroid Build Coastguard Worker  */
156*49fe348cSAndroid Build Coastguard Worker #ifndef resample_16k_12k8
157*49fe348cSAndroid Build Coastguard Worker 
arm_resample_16k_12k8(struct lc3_ltpf_hp50_state * hp50,const int16_t * x,int16_t * y,int n)158*49fe348cSAndroid Build Coastguard Worker static void arm_resample_16k_12k8(
159*49fe348cSAndroid Build Coastguard Worker     struct lc3_ltpf_hp50_state *hp50, const int16_t *x, int16_t *y, int n)
160*49fe348cSAndroid Build Coastguard Worker {
161*49fe348cSAndroid Build Coastguard Worker     static const int16_t alignas(int32_t) h[2*4*24] = {
162*49fe348cSAndroid Build Coastguard Worker 
163*49fe348cSAndroid Build Coastguard Worker             0,   -61,   214,  -398,   417,     0, -1052,  2686,
164*49fe348cSAndroid Build Coastguard Worker         -4529,  5997, 26233,  5997, -4529,  2686, -1052,     0,
165*49fe348cSAndroid Build Coastguard Worker           417,  -398,   214,   -61,     0,     0,     0,     0,
166*49fe348cSAndroid Build Coastguard Worker 
167*49fe348cSAndroid Build Coastguard Worker 
168*49fe348cSAndroid Build Coastguard Worker             0,   -79,   180,  -213,     0,   598, -1522,  2389,
169*49fe348cSAndroid Build Coastguard Worker         -2427,     0, 24506, 13068, -5289,  1873,     0,  -752,
170*49fe348cSAndroid Build Coastguard Worker           763,  -457,   156,     0,   -28,     0,     0,     0,
171*49fe348cSAndroid Build Coastguard Worker 
172*49fe348cSAndroid Build Coastguard Worker 
173*49fe348cSAndroid Build Coastguard Worker             0,   -61,    92,     0,  -323,   861, -1361,  1317,
174*49fe348cSAndroid Build Coastguard Worker             0, -3885, 19741, 19741, -3885,     0,  1317, -1361,
175*49fe348cSAndroid Build Coastguard Worker           861,  -323,     0,    92,   -61,     0,     0,     0,
176*49fe348cSAndroid Build Coastguard Worker 
177*49fe348cSAndroid Build Coastguard Worker             0,   -28,     0,   156,  -457,   763,  -752,     0,
178*49fe348cSAndroid Build Coastguard Worker          1873, -5289, 13068, 24506,     0, -2427,  2389, -1522,
179*49fe348cSAndroid Build Coastguard Worker           598,     0,  -213,   180,   -79,     0,     0,     0,
180*49fe348cSAndroid Build Coastguard Worker 
181*49fe348cSAndroid Build Coastguard Worker 
182*49fe348cSAndroid Build Coastguard Worker             0,     0,   -61,   214,  -398,   417,     0, -1052,
183*49fe348cSAndroid Build Coastguard Worker          2686, -4529,  5997, 26233,  5997, -4529,  2686, -1052,
184*49fe348cSAndroid Build Coastguard Worker             0,   417,  -398,   214,   -61,     0,     0,     0,
185*49fe348cSAndroid Build Coastguard Worker 
186*49fe348cSAndroid Build Coastguard Worker 
187*49fe348cSAndroid Build Coastguard Worker             0,     0,   -79,   180,  -213,     0,   598, -1522,
188*49fe348cSAndroid Build Coastguard Worker          2389, -2427,     0, 24506, 13068, -5289,  1873,     0,
189*49fe348cSAndroid Build Coastguard Worker          -752,   763,  -457,   156,     0,   -28,     0,     0,
190*49fe348cSAndroid Build Coastguard Worker 
191*49fe348cSAndroid Build Coastguard Worker 
192*49fe348cSAndroid Build Coastguard Worker             0,     0,   -61,    92,     0,  -323,   861, -1361,
193*49fe348cSAndroid Build Coastguard Worker          1317,     0, -3885, 19741, 19741, -3885,     0,  1317,
194*49fe348cSAndroid Build Coastguard Worker         -1361,   861,  -323,     0,    92,   -61,     0,     0,
195*49fe348cSAndroid Build Coastguard Worker 
196*49fe348cSAndroid Build Coastguard Worker             0,     0,   -28,     0,   156,  -457,   763,  -752,
197*49fe348cSAndroid Build Coastguard Worker             0,  1873, -5289, 13068, 24506,     0, -2427,  2389,
198*49fe348cSAndroid Build Coastguard Worker         -1522,   598,     0,  -213,   180,   -79,     0,     0,
199*49fe348cSAndroid Build Coastguard Worker     };
200*49fe348cSAndroid Build Coastguard Worker 
201*49fe348cSAndroid Build Coastguard Worker     arm_resample_x64k_12k8(
202*49fe348cSAndroid Build Coastguard Worker         4, (const int16x2_t *)h, hp50, (int16x2_t *)x, y, n);
203*49fe348cSAndroid Build Coastguard Worker }
204*49fe348cSAndroid Build Coastguard Worker 
205*49fe348cSAndroid Build Coastguard Worker #ifndef TEST_ARM
206*49fe348cSAndroid Build Coastguard Worker #define resample_16k_12k8 arm_resample_16k_12k8
207*49fe348cSAndroid Build Coastguard Worker #endif
208*49fe348cSAndroid Build Coastguard Worker 
209*49fe348cSAndroid Build Coastguard Worker #endif /* resample_16k_12k8 */
210*49fe348cSAndroid Build Coastguard Worker 
211*49fe348cSAndroid Build Coastguard Worker /**
212*49fe348cSAndroid Build Coastguard Worker  * Resample from 32 Khz to 12.8 KHz
213*49fe348cSAndroid Build Coastguard Worker  */
214*49fe348cSAndroid Build Coastguard Worker #ifndef resample_32k_12k8
215*49fe348cSAndroid Build Coastguard Worker 
arm_resample_32k_12k8(struct lc3_ltpf_hp50_state * hp50,const int16_t * x,int16_t * y,int n)216*49fe348cSAndroid Build Coastguard Worker static void arm_resample_32k_12k8(
217*49fe348cSAndroid Build Coastguard Worker     struct lc3_ltpf_hp50_state *hp50, const int16_t *x, int16_t *y, int n)
218*49fe348cSAndroid Build Coastguard Worker {
219*49fe348cSAndroid Build Coastguard Worker     static const int16_t alignas(int32_t) h[2*2*48] = {
220*49fe348cSAndroid Build Coastguard Worker 
221*49fe348cSAndroid Build Coastguard Worker             0,   -30,   -31,    46,   107,     0,  -199,  -162,
222*49fe348cSAndroid Build Coastguard Worker           209,   430,     0,  -681,  -526,   658,  1343,     0,
223*49fe348cSAndroid Build Coastguard Worker         -2264, -1943,  2999,  9871, 13116,  9871,  2999, -1943,
224*49fe348cSAndroid Build Coastguard Worker         -2264,     0,  1343,   658,  -526,  -681,     0,   430,
225*49fe348cSAndroid Build Coastguard Worker           209,  -162,  -199,     0,   107,    46,   -31,   -30,
226*49fe348cSAndroid Build Coastguard Worker             0,     0,     0,     0,     0,     0,     0,     0,
227*49fe348cSAndroid Build Coastguard Worker 
228*49fe348cSAndroid Build Coastguard Worker             0,   -14,   -39,     0,    90,    78,  -106,  -229,
229*49fe348cSAndroid Build Coastguard Worker             0,   382,   299,  -376,  -761,     0,  1194,   937,
230*49fe348cSAndroid Build Coastguard Worker         -1214, -2644,     0,  6534, 12253, 12253,  6534,     0,
231*49fe348cSAndroid Build Coastguard Worker         -2644, -1214,   937,  1194,     0,  -761,  -376,   299,
232*49fe348cSAndroid Build Coastguard Worker           382,     0,  -229,  -106,    78,    90,     0,   -39,
233*49fe348cSAndroid Build Coastguard Worker           -14,     0,     0,     0,     0,     0,     0,     0,
234*49fe348cSAndroid Build Coastguard Worker 
235*49fe348cSAndroid Build Coastguard Worker             0,     0,   -30,   -31,    46,   107,     0,  -199,
236*49fe348cSAndroid Build Coastguard Worker          -162,   209,   430,     0,  -681,  -526,   658,  1343,
237*49fe348cSAndroid Build Coastguard Worker             0, -2264, -1943,  2999,  9871, 13116,  9871,  2999,
238*49fe348cSAndroid Build Coastguard Worker         -1943, -2264,     0,  1343,   658,  -526,  -681,     0,
239*49fe348cSAndroid Build Coastguard Worker           430,   209,  -162,  -199,     0,   107,    46,   -31,
240*49fe348cSAndroid Build Coastguard Worker           -30,     0,     0,     0,     0,     0,     0,     0,
241*49fe348cSAndroid Build Coastguard Worker 
242*49fe348cSAndroid Build Coastguard Worker             0,     0,   -14,   -39,     0,    90,    78,  -106,
243*49fe348cSAndroid Build Coastguard Worker          -229,     0,   382,   299,  -376,  -761,     0,  1194,
244*49fe348cSAndroid Build Coastguard Worker           937, -1214, -2644,     0,  6534, 12253, 12253,  6534,
245*49fe348cSAndroid Build Coastguard Worker             0, -2644, -1214,   937,  1194,     0,  -761,  -376,
246*49fe348cSAndroid Build Coastguard Worker           299,   382,     0,  -229,  -106,    78,    90,     0,
247*49fe348cSAndroid Build Coastguard Worker           -39,   -14,     0,     0,     0,     0,     0,     0,
248*49fe348cSAndroid Build Coastguard Worker     };
249*49fe348cSAndroid Build Coastguard Worker 
250*49fe348cSAndroid Build Coastguard Worker     arm_resample_x64k_12k8(
251*49fe348cSAndroid Build Coastguard Worker         2, (const int16x2_t *)h, hp50, (int16x2_t *)x, y, n);
252*49fe348cSAndroid Build Coastguard Worker }
253*49fe348cSAndroid Build Coastguard Worker 
254*49fe348cSAndroid Build Coastguard Worker #ifndef TEST_ARM
255*49fe348cSAndroid Build Coastguard Worker #define resample_32k_12k8 arm_resample_32k_12k8
256*49fe348cSAndroid Build Coastguard Worker #endif
257*49fe348cSAndroid Build Coastguard Worker 
258*49fe348cSAndroid Build Coastguard Worker #endif /* resample_32k_12k8 */
259*49fe348cSAndroid Build Coastguard Worker 
260*49fe348cSAndroid Build Coastguard Worker /**
261*49fe348cSAndroid Build Coastguard Worker  * Resample from 24 Khz to 12.8 KHz
262*49fe348cSAndroid Build Coastguard Worker  */
263*49fe348cSAndroid Build Coastguard Worker #ifndef resample_24k_12k8
264*49fe348cSAndroid Build Coastguard Worker 
arm_resample_24k_12k8(struct lc3_ltpf_hp50_state * hp50,const int16_t * x,int16_t * y,int n)265*49fe348cSAndroid Build Coastguard Worker static void arm_resample_24k_12k8(
266*49fe348cSAndroid Build Coastguard Worker     struct lc3_ltpf_hp50_state *hp50, const int16_t *x, int16_t *y, int n)
267*49fe348cSAndroid Build Coastguard Worker {
268*49fe348cSAndroid Build Coastguard Worker     static const int16_t alignas(int32_t) h[2*8*32] = {
269*49fe348cSAndroid Build Coastguard Worker 
270*49fe348cSAndroid Build Coastguard Worker             0,   -50,    19,   143,   -93,  -290,   278,   485,
271*49fe348cSAndroid Build Coastguard Worker          -658,  -701,  1396,   901, -3019, -1042, 10276, 17488,
272*49fe348cSAndroid Build Coastguard Worker         10276, -1042, -3019,   901,  1396,  -701,  -658,   485,
273*49fe348cSAndroid Build Coastguard Worker           278,  -290,   -93,   143,    19,   -50,     0,     0,
274*49fe348cSAndroid Build Coastguard Worker 
275*49fe348cSAndroid Build Coastguard Worker             0,   -46,     0,   141,   -45,  -305,   185,   543,
276*49fe348cSAndroid Build Coastguard Worker          -501,  -854,  1153,  1249, -2619, -1908,  8712, 17358,
277*49fe348cSAndroid Build Coastguard Worker         11772,     0, -3319,   480,  1593,  -504,  -796,   399,
278*49fe348cSAndroid Build Coastguard Worker           367,  -261,  -142,   138,    40,   -52,    -5,     0,
279*49fe348cSAndroid Build Coastguard Worker 
280*49fe348cSAndroid Build Coastguard Worker             0,   -41,   -17,   133,     0,  -304,    91,   574,
281*49fe348cSAndroid Build Coastguard Worker          -334,  -959,   878,  1516, -2143, -2590,  7118, 16971,
282*49fe348cSAndroid Build Coastguard Worker         13161,  1202, -3495,     0,  1731,  -267,  -908,   287,
283*49fe348cSAndroid Build Coastguard Worker           445,  -215,  -188,   125,    62,   -52,   -12,     0,
284*49fe348cSAndroid Build Coastguard Worker 
285*49fe348cSAndroid Build Coastguard Worker             0,   -34,   -30,   120,    41,  -291,     0,   577,
286*49fe348cSAndroid Build Coastguard Worker          -164, -1015,   585,  1697, -1618, -3084,  5534, 16337,
287*49fe348cSAndroid Build Coastguard Worker         14406,  2544, -3526,  -523,  1800,     0,  -985,   152,
288*49fe348cSAndroid Build Coastguard Worker           509,  -156,  -230,   104,    83,   -48,   -19,     0,
289*49fe348cSAndroid Build Coastguard Worker 
290*49fe348cSAndroid Build Coastguard Worker             0,   -26,   -41,   103,    76,  -265,   -83,   554,
291*49fe348cSAndroid Build Coastguard Worker             0, -1023,   288,  1791, -1070, -3393,  3998, 15474,
292*49fe348cSAndroid Build Coastguard Worker         15474,  3998, -3393, -1070,  1791,   288, -1023,     0,
293*49fe348cSAndroid Build Coastguard Worker           554,   -83,  -265,    76,   103,   -41,   -26,     0,
294*49fe348cSAndroid Build Coastguard Worker 
295*49fe348cSAndroid Build Coastguard Worker             0,   -19,   -48,    83,   104,  -230,  -156,   509,
296*49fe348cSAndroid Build Coastguard Worker           152,  -985,     0,  1800,  -523, -3526,  2544, 14406,
297*49fe348cSAndroid Build Coastguard Worker         16337,  5534, -3084, -1618,  1697,   585, -1015,  -164,
298*49fe348cSAndroid Build Coastguard Worker           577,     0,  -291,    41,   120,   -30,   -34,     0,
299*49fe348cSAndroid Build Coastguard Worker 
300*49fe348cSAndroid Build Coastguard Worker             0,   -12,   -52,    62,   125,  -188,  -215,   445,
301*49fe348cSAndroid Build Coastguard Worker           287,  -908,  -267,  1731,     0, -3495,  1202, 13161,
302*49fe348cSAndroid Build Coastguard Worker         16971,  7118, -2590, -2143,  1516,   878,  -959,  -334,
303*49fe348cSAndroid Build Coastguard Worker           574,    91,  -304,     0,   133,   -17,   -41,     0,
304*49fe348cSAndroid Build Coastguard Worker 
305*49fe348cSAndroid Build Coastguard Worker             0,    -5,   -52,    40,   138,  -142,  -261,   367,
306*49fe348cSAndroid Build Coastguard Worker           399,  -796,  -504,  1593,   480, -3319,     0, 11772,
307*49fe348cSAndroid Build Coastguard Worker         17358,  8712, -1908, -2619,  1249,  1153,  -854,  -501,
308*49fe348cSAndroid Build Coastguard Worker           543,   185,  -305,   -45,   141,     0,   -46,     0,
309*49fe348cSAndroid Build Coastguard Worker 
310*49fe348cSAndroid Build Coastguard Worker             0,     0,   -50,    19,   143,   -93,  -290,   278,
311*49fe348cSAndroid Build Coastguard Worker           485,  -658,  -701,  1396,   901, -3019, -1042, 10276,
312*49fe348cSAndroid Build Coastguard Worker         17488, 10276, -1042, -3019,   901,  1396,  -701,  -658,
313*49fe348cSAndroid Build Coastguard Worker           485,   278,  -290,   -93,   143,    19,   -50,     0,
314*49fe348cSAndroid Build Coastguard Worker 
315*49fe348cSAndroid Build Coastguard Worker             0,     0,   -46,     0,   141,   -45,  -305,   185,
316*49fe348cSAndroid Build Coastguard Worker           543,  -501,  -854,  1153,  1249, -2619, -1908,  8712,
317*49fe348cSAndroid Build Coastguard Worker         17358, 11772,     0, -3319,   480,  1593,  -504,  -796,
318*49fe348cSAndroid Build Coastguard Worker           399,   367,  -261,  -142,   138,    40,   -52,    -5,
319*49fe348cSAndroid Build Coastguard Worker 
320*49fe348cSAndroid Build Coastguard Worker             0,     0,   -41,   -17,   133,     0,  -304,    91,
321*49fe348cSAndroid Build Coastguard Worker           574,  -334,  -959,   878,  1516, -2143, -2590,  7118,
322*49fe348cSAndroid Build Coastguard Worker         16971, 13161,  1202, -3495,     0,  1731,  -267,  -908,
323*49fe348cSAndroid Build Coastguard Worker           287,   445,  -215,  -188,   125,    62,   -52,   -12,
324*49fe348cSAndroid Build Coastguard Worker 
325*49fe348cSAndroid Build Coastguard Worker             0,     0,   -34,   -30,   120,    41,  -291,     0,
326*49fe348cSAndroid Build Coastguard Worker           577,  -164, -1015,   585,  1697, -1618, -3084,  5534,
327*49fe348cSAndroid Build Coastguard Worker         16337, 14406,  2544, -3526,  -523,  1800,     0,  -985,
328*49fe348cSAndroid Build Coastguard Worker           152,   509,  -156,  -230,   104,    83,   -48,   -19,
329*49fe348cSAndroid Build Coastguard Worker 
330*49fe348cSAndroid Build Coastguard Worker             0,     0,   -26,   -41,   103,    76,  -265,   -83,
331*49fe348cSAndroid Build Coastguard Worker           554,     0, -1023,   288,  1791, -1070, -3393,  3998,
332*49fe348cSAndroid Build Coastguard Worker         15474, 15474,  3998, -3393, -1070,  1791,   288, -1023,
333*49fe348cSAndroid Build Coastguard Worker             0,   554,   -83,  -265,    76,   103,   -41,   -26,
334*49fe348cSAndroid Build Coastguard Worker 
335*49fe348cSAndroid Build Coastguard Worker             0,     0,   -19,   -48,    83,   104,  -230,  -156,
336*49fe348cSAndroid Build Coastguard Worker           509,   152,  -985,     0,  1800,  -523, -3526,  2544,
337*49fe348cSAndroid Build Coastguard Worker         14406, 16337,  5534, -3084, -1618,  1697,   585, -1015,
338*49fe348cSAndroid Build Coastguard Worker          -164,   577,     0,  -291,    41,   120,   -30,   -34,
339*49fe348cSAndroid Build Coastguard Worker 
340*49fe348cSAndroid Build Coastguard Worker             0,     0,   -12,   -52,    62,   125,  -188,  -215,
341*49fe348cSAndroid Build Coastguard Worker           445,   287,  -908,  -267,  1731,     0, -3495,  1202,
342*49fe348cSAndroid Build Coastguard Worker         13161, 16971,  7118, -2590, -2143,  1516,   878,  -959,
343*49fe348cSAndroid Build Coastguard Worker          -334,   574,    91,  -304,     0,   133,   -17,   -41,
344*49fe348cSAndroid Build Coastguard Worker 
345*49fe348cSAndroid Build Coastguard Worker             0,     0,    -5,   -52,    40,   138,  -142,  -261,
346*49fe348cSAndroid Build Coastguard Worker           367,   399,  -796,  -504,  1593,   480, -3319,     0,
347*49fe348cSAndroid Build Coastguard Worker         11772, 17358,  8712, -1908, -2619,  1249,  1153,  -854,
348*49fe348cSAndroid Build Coastguard Worker          -501,   543,   185,  -305,   -45,   141,     0,   -46,
349*49fe348cSAndroid Build Coastguard Worker     };
350*49fe348cSAndroid Build Coastguard Worker 
351*49fe348cSAndroid Build Coastguard Worker     arm_resample_x192k_12k8(
352*49fe348cSAndroid Build Coastguard Worker         8, (const int16x2_t *)h, hp50, (int16x2_t *)x, y, n);
353*49fe348cSAndroid Build Coastguard Worker }
354*49fe348cSAndroid Build Coastguard Worker 
355*49fe348cSAndroid Build Coastguard Worker #ifndef TEST_ARM
356*49fe348cSAndroid Build Coastguard Worker #define resample_24k_12k8 arm_resample_24k_12k8
357*49fe348cSAndroid Build Coastguard Worker #endif
358*49fe348cSAndroid Build Coastguard Worker 
359*49fe348cSAndroid Build Coastguard Worker #endif /* resample_24k_12k8 */
360*49fe348cSAndroid Build Coastguard Worker 
361*49fe348cSAndroid Build Coastguard Worker /**
362*49fe348cSAndroid Build Coastguard Worker  * Resample from 48 Khz to 12.8 KHz
363*49fe348cSAndroid Build Coastguard Worker  */
364*49fe348cSAndroid Build Coastguard Worker #ifndef resample_48k_12k8
365*49fe348cSAndroid Build Coastguard Worker 
arm_resample_48k_12k8(struct lc3_ltpf_hp50_state * hp50,const int16_t * x,int16_t * y,int n)366*49fe348cSAndroid Build Coastguard Worker static void arm_resample_48k_12k8(
367*49fe348cSAndroid Build Coastguard Worker     struct lc3_ltpf_hp50_state *hp50, const int16_t *x, int16_t *y, int n)
368*49fe348cSAndroid Build Coastguard Worker {
369*49fe348cSAndroid Build Coastguard Worker     static const int16_t alignas(int32_t) h[2*4*64] = {
370*49fe348cSAndroid Build Coastguard Worker 
371*49fe348cSAndroid Build Coastguard Worker             0,   -13,   -25,   -20,    10,    51,    71,    38,
372*49fe348cSAndroid Build Coastguard Worker           -47,  -133,  -145,   -42,   139,   277,   242,     0,
373*49fe348cSAndroid Build Coastguard Worker          -329,  -511,  -351,   144,   698,   895,   450,  -535,
374*49fe348cSAndroid Build Coastguard Worker         -1510, -1697,  -521,  1999,  5138,  7737,  8744,  7737,
375*49fe348cSAndroid Build Coastguard Worker          5138,  1999,  -521, -1697, -1510,  -535,   450,   895,
376*49fe348cSAndroid Build Coastguard Worker           698,   144,  -351,  -511,  -329,     0,   242,   277,
377*49fe348cSAndroid Build Coastguard Worker           139,   -42,  -145,  -133,   -47,    38,    71,    51,
378*49fe348cSAndroid Build Coastguard Worker            10,   -20,   -25,   -13,     0,     0,     0,     0,
379*49fe348cSAndroid Build Coastguard Worker 
380*49fe348cSAndroid Build Coastguard Worker             0,    -9,   -23,   -24,     0,    41,    71,    52,
381*49fe348cSAndroid Build Coastguard Worker           -23,  -115,  -152,   -78,    92,   254,   272,    76,
382*49fe348cSAndroid Build Coastguard Worker          -251,  -493,  -427,     0,   576,   900,   624,  -262,
383*49fe348cSAndroid Build Coastguard Worker         -1309, -1763,  -954,  1272,  4356,  7203,  8679,  8169,
384*49fe348cSAndroid Build Coastguard Worker          5886,  2767,     0, -1542, -1660,  -809,   240,   848,
385*49fe348cSAndroid Build Coastguard Worker           796,   292,  -252,  -507,  -398,   -82,   199,   288,
386*49fe348cSAndroid Build Coastguard Worker           183,     0,  -130,  -145,   -71,    20,    69,    60,
387*49fe348cSAndroid Build Coastguard Worker            20,   -15,   -26,   -17,    -3,     0,     0,     0,
388*49fe348cSAndroid Build Coastguard Worker 
389*49fe348cSAndroid Build Coastguard Worker             0,    -6,   -20,   -26,    -8,    31,    67,    62,
390*49fe348cSAndroid Build Coastguard Worker             0,   -94,  -152,  -108,    45,   223,   287,   143,
391*49fe348cSAndroid Build Coastguard Worker          -167,  -454,  -480,  -134,   439,   866,   758,     0,
392*49fe348cSAndroid Build Coastguard Worker         -1071, -1748, -1295,   601,  3559,  6580,  8485,  8485,
393*49fe348cSAndroid Build Coastguard Worker          6580,  3559,   601, -1295, -1748, -1071,     0,   758,
394*49fe348cSAndroid Build Coastguard Worker           866,   439,  -134,  -480,  -454,  -167,   143,   287,
395*49fe348cSAndroid Build Coastguard Worker           223,    45,  -108,  -152,   -94,     0,    62,    67,
396*49fe348cSAndroid Build Coastguard Worker            31,    -8,   -26,   -20,    -6,     0,     0,     0,
397*49fe348cSAndroid Build Coastguard Worker 
398*49fe348cSAndroid Build Coastguard Worker             0,    -3,   -17,   -26,   -15,    20,    60,    69,
399*49fe348cSAndroid Build Coastguard Worker            20,   -71,  -145,  -130,     0,   183,   288,   199,
400*49fe348cSAndroid Build Coastguard Worker           -82,  -398,  -507,  -252,   292,   796,   848,   240,
401*49fe348cSAndroid Build Coastguard Worker          -809, -1660, -1542,     0,  2767,  5886,  8169,  8679,
402*49fe348cSAndroid Build Coastguard Worker          7203,  4356,  1272,  -954, -1763, -1309,  -262,   624,
403*49fe348cSAndroid Build Coastguard Worker           900,   576,     0,  -427,  -493,  -251,    76,   272,
404*49fe348cSAndroid Build Coastguard Worker           254,    92,   -78,  -152,  -115,   -23,    52,    71,
405*49fe348cSAndroid Build Coastguard Worker            41,     0,   -24,   -23,    -9,     0,     0,     0,
406*49fe348cSAndroid Build Coastguard Worker 
407*49fe348cSAndroid Build Coastguard Worker             0,     0,   -13,   -25,   -20,    10,    51,    71,
408*49fe348cSAndroid Build Coastguard Worker            38,   -47,  -133,  -145,   -42,   139,   277,   242,
409*49fe348cSAndroid Build Coastguard Worker             0,  -329,  -511,  -351,   144,   698,   895,   450,
410*49fe348cSAndroid Build Coastguard Worker          -535, -1510, -1697,  -521,  1999,  5138,  7737,  8744,
411*49fe348cSAndroid Build Coastguard Worker          7737,  5138,  1999,  -521, -1697, -1510,  -535,   450,
412*49fe348cSAndroid Build Coastguard Worker           895,   698,   144,  -351,  -511,  -329,     0,   242,
413*49fe348cSAndroid Build Coastguard Worker           277,   139,   -42,  -145,  -133,   -47,    38,    71,
414*49fe348cSAndroid Build Coastguard Worker            51,    10,   -20,   -25,   -13,     0,     0,     0,
415*49fe348cSAndroid Build Coastguard Worker 
416*49fe348cSAndroid Build Coastguard Worker             0,     0,    -9,   -23,   -24,     0,    41,    71,
417*49fe348cSAndroid Build Coastguard Worker            52,   -23,  -115,  -152,   -78,    92,   254,   272,
418*49fe348cSAndroid Build Coastguard Worker            76,  -251,  -493,  -427,     0,   576,   900,   624,
419*49fe348cSAndroid Build Coastguard Worker          -262, -1309, -1763,  -954,  1272,  4356,  7203,  8679,
420*49fe348cSAndroid Build Coastguard Worker          8169,  5886,  2767,     0, -1542, -1660,  -809,   240,
421*49fe348cSAndroid Build Coastguard Worker           848,   796,   292,  -252,  -507,  -398,   -82,   199,
422*49fe348cSAndroid Build Coastguard Worker           288,   183,     0,  -130,  -145,   -71,    20,    69,
423*49fe348cSAndroid Build Coastguard Worker            60,    20,   -15,   -26,   -17,    -3,     0,     0,
424*49fe348cSAndroid Build Coastguard Worker 
425*49fe348cSAndroid Build Coastguard Worker             0,     0,    -6,   -20,   -26,    -8,    31,    67,
426*49fe348cSAndroid Build Coastguard Worker            62,     0,   -94,  -152,  -108,    45,   223,   287,
427*49fe348cSAndroid Build Coastguard Worker           143,  -167,  -454,  -480,  -134,   439,   866,   758,
428*49fe348cSAndroid Build Coastguard Worker             0, -1071, -1748, -1295,   601,  3559,  6580,  8485,
429*49fe348cSAndroid Build Coastguard Worker          8485,  6580,  3559,   601, -1295, -1748, -1071,     0,
430*49fe348cSAndroid Build Coastguard Worker           758,   866,   439,  -134,  -480,  -454,  -167,   143,
431*49fe348cSAndroid Build Coastguard Worker           287,   223,    45,  -108,  -152,   -94,     0,    62,
432*49fe348cSAndroid Build Coastguard Worker            67,    31,    -8,   -26,   -20,    -6,     0,     0,
433*49fe348cSAndroid Build Coastguard Worker 
434*49fe348cSAndroid Build Coastguard Worker             0,     0,    -3,   -17,   -26,   -15,    20,    60,
435*49fe348cSAndroid Build Coastguard Worker            69,    20,   -71,  -145,  -130,     0,   183,   288,
436*49fe348cSAndroid Build Coastguard Worker           199,   -82,  -398,  -507,  -252,   292,   796,   848,
437*49fe348cSAndroid Build Coastguard Worker           240,  -809, -1660, -1542,     0,  2767,  5886,  8169,
438*49fe348cSAndroid Build Coastguard Worker          8679,  7203,  4356,  1272,  -954, -1763, -1309,  -262,
439*49fe348cSAndroid Build Coastguard Worker           624,   900,   576,     0,  -427,  -493,  -251,    76,
440*49fe348cSAndroid Build Coastguard Worker           272,   254,    92,   -78,  -152,  -115,   -23,    52,
441*49fe348cSAndroid Build Coastguard Worker            71,    41,     0,   -24,   -23,    -9,     0,     0,
442*49fe348cSAndroid Build Coastguard Worker     };
443*49fe348cSAndroid Build Coastguard Worker 
444*49fe348cSAndroid Build Coastguard Worker     arm_resample_x192k_12k8(
445*49fe348cSAndroid Build Coastguard Worker         4, (const int16x2_t *)h, hp50, (int16x2_t *)x, y, n);
446*49fe348cSAndroid Build Coastguard Worker }
447*49fe348cSAndroid Build Coastguard Worker 
448*49fe348cSAndroid Build Coastguard Worker #ifndef TEST_ARM
449*49fe348cSAndroid Build Coastguard Worker #define resample_48k_12k8 arm_resample_48k_12k8
450*49fe348cSAndroid Build Coastguard Worker #endif
451*49fe348cSAndroid Build Coastguard Worker 
452*49fe348cSAndroid Build Coastguard Worker #endif /* resample_48k_12k8 */
453*49fe348cSAndroid Build Coastguard Worker 
454*49fe348cSAndroid Build Coastguard Worker /**
455*49fe348cSAndroid Build Coastguard Worker  * Return vector of correlations
456*49fe348cSAndroid Build Coastguard Worker  */
457*49fe348cSAndroid Build Coastguard Worker #ifndef correlate
458*49fe348cSAndroid Build Coastguard Worker 
arm_correlate(const int16_t * a,const int16_t * b,int n,float * y,int nc)459*49fe348cSAndroid Build Coastguard Worker static void arm_correlate(
460*49fe348cSAndroid Build Coastguard Worker     const int16_t *a, const int16_t *b, int n, float *y, int nc)
461*49fe348cSAndroid Build Coastguard Worker {
462*49fe348cSAndroid Build Coastguard Worker     /* --- Check alignment of `b` --- */
463*49fe348cSAndroid Build Coastguard Worker 
464*49fe348cSAndroid Build Coastguard Worker     if ((uintptr_t)b & 3)
465*49fe348cSAndroid Build Coastguard Worker         *(y++) = dot(a, b--, n), nc--;
466*49fe348cSAndroid Build Coastguard Worker 
467*49fe348cSAndroid Build Coastguard Worker     /* --- Processing by pair --- */
468*49fe348cSAndroid Build Coastguard Worker 
469*49fe348cSAndroid Build Coastguard Worker     for ( ; nc >= 2; nc -= 2) {
470*49fe348cSAndroid Build Coastguard Worker         const int16x2_t *an = (const int16x2_t *)(a  );
471*49fe348cSAndroid Build Coastguard Worker         const int16x2_t *bn = (const int16x2_t *)(b--);
472*49fe348cSAndroid Build Coastguard Worker 
473*49fe348cSAndroid Build Coastguard Worker         int16x2_t ax, b0, b1;
474*49fe348cSAndroid Build Coastguard Worker         int64_t v0 = 0, v1 = 0;
475*49fe348cSAndroid Build Coastguard Worker 
476*49fe348cSAndroid Build Coastguard Worker         b1 = (int16x2_t)*(b--) << 16;
477*49fe348cSAndroid Build Coastguard Worker 
478*49fe348cSAndroid Build Coastguard Worker         for (int i = 0; i < (n >> 4); i++ )
479*49fe348cSAndroid Build Coastguard Worker             for (int j = 0; j < 4; j++) {
480*49fe348cSAndroid Build Coastguard Worker 
481*49fe348cSAndroid Build Coastguard Worker                 ax = *(an++), b0 = *(bn++);
482*49fe348cSAndroid Build Coastguard Worker                 v0 = __smlald (ax, b0, v0);
483*49fe348cSAndroid Build Coastguard Worker                 v1 = __smlaldx(ax, __pkhbt(b0, b1), v1);
484*49fe348cSAndroid Build Coastguard Worker 
485*49fe348cSAndroid Build Coastguard Worker                 ax = *(an++), b1 = *(bn++);
486*49fe348cSAndroid Build Coastguard Worker                 v0 = __smlald (ax, b1, v0);
487*49fe348cSAndroid Build Coastguard Worker                 v1 = __smlaldx(ax, __pkhbt(b1, b0), v1);
488*49fe348cSAndroid Build Coastguard Worker             }
489*49fe348cSAndroid Build Coastguard Worker 
490*49fe348cSAndroid Build Coastguard Worker         *(y++) = (float)((int32_t)((v0 + (1 << 5)) >> 6));
491*49fe348cSAndroid Build Coastguard Worker         *(y++) = (float)((int32_t)((v1 + (1 << 5)) >> 6));
492*49fe348cSAndroid Build Coastguard Worker     }
493*49fe348cSAndroid Build Coastguard Worker 
494*49fe348cSAndroid Build Coastguard Worker     /* --- Odd element count --- */
495*49fe348cSAndroid Build Coastguard Worker 
496*49fe348cSAndroid Build Coastguard Worker     if (nc > 0)
497*49fe348cSAndroid Build Coastguard Worker         *(y++) = dot(a, b, n);
498*49fe348cSAndroid Build Coastguard Worker }
499*49fe348cSAndroid Build Coastguard Worker 
500*49fe348cSAndroid Build Coastguard Worker #ifndef TEST_ARM
501*49fe348cSAndroid Build Coastguard Worker #define correlate arm_correlate
502*49fe348cSAndroid Build Coastguard Worker #endif
503*49fe348cSAndroid Build Coastguard Worker 
504*49fe348cSAndroid Build Coastguard Worker #endif /* correlate */
505*49fe348cSAndroid Build Coastguard Worker 
506*49fe348cSAndroid Build Coastguard Worker #endif /* __ARM_FEATURE_SIMD32 */
507