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