Coverage Report

Created: 2025-10-10 07:38

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/opus/silk/x86/NSQ_del_dec_avx2.c
Line
Count
Source
1
/***********************************************************************
2
Copyright (c) 2021 Google Inc.
3
Redistribution and use in source and binary forms, with or without
4
modification, are permitted provided that the following conditions
5
are met:
6
- Redistributions of source code must retain the above copyright notice,
7
this list of conditions and the following disclaimer.
8
- Redistributions in binary form must reproduce the above copyright
9
notice, this list of conditions and the following disclaimer in the
10
documentation and/or other materials provided with the distribution.
11
- Neither the name of Internet Society, IETF or IETF Trust, nor the
12
names of specific contributors, may be used to endorse or promote
13
products derived from this software without specific prior written
14
permission.
15
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25
POSSIBILITY OF SUCH DAMAGE.
26
***********************************************************************/
27
28
#ifdef HAVE_CONFIG_H
29
#include "config.h"
30
#endif
31
32
#ifdef OPUS_CHECK_ASM
33
#include <string.h>
34
#endif
35
36
#include "opus_defines.h"
37
#include <immintrin.h>
38
39
#include "main.h"
40
#include "stack_alloc.h"
41
#include "NSQ.h"
42
#include "celt/x86/x86cpu.h"
43
44
/* Returns TRUE if all assumptions met */
45
static OPUS_INLINE int verify_assumptions(const silk_encoder_state *psEncC)
46
1.12M
{
47
    /* This optimization is based on these assumptions        */
48
    /* These assumptions are fundamental and hence assert are */
49
    /* used. Should any assert triggers, we have to re-visit  */
50
    /* all related code to make sure it still functions the   */
51
    /* same as the C implementation.                          */
52
1.12M
    silk_assert(MAX_DEL_DEC_STATES  <= 4      &&
53
1.12M
                MAX_FRAME_LENGTH     % 4 == 0 &&
54
1.12M
                MAX_SUB_FRAME_LENGTH % 4 == 0 &&
55
1.12M
                LTP_MEM_LENGTH_MS    % 4 == 0 );
56
1.12M
    silk_assert(psEncC->fs_kHz ==  8 ||
57
1.12M
                psEncC->fs_kHz == 12 ||
58
1.12M
                psEncC->fs_kHz == 16 );
59
1.12M
    silk_assert(psEncC->nb_subfr <= MAX_NB_SUBFR &&
60
1.12M
                psEncC->nb_subfr > 0             );
61
1.12M
    silk_assert(psEncC->nStatesDelayedDecision <= MAX_DEL_DEC_STATES &&
62
1.12M
                psEncC->nStatesDelayedDecision > 0                   );
63
1.12M
    silk_assert(psEncC->ltp_mem_length == psEncC->fs_kHz * LTP_MEM_LENGTH_MS);
64
65
    /* Regressions were observed on certain AMD Zen CPUs when      */
66
    /* nStatesDelayedDecision is 1 or 2. Ideally we should detect  */
67
    /* these CPUs and enable this optimization on others; however, */
68
    /* there is no good way to do so under current OPUS framework. */
69
1.12M
    return psEncC->nStatesDelayedDecision == 3 ||
70
887k
           psEncC->nStatesDelayedDecision == 4;
71
1.12M
}
72
73
/* Intrinsics not defined on MSVC */
74
#ifdef _MSC_VER
75
#include <intsafe.h>
76
static inline int __builtin_sadd_overflow(opus_int32 a, opus_int32 b, opus_int32* res)
77
{
78
    *res = a+b;
79
    return (*res ^ a) & (*res ^ b) & 0x80000000;
80
}
81
static inline int __builtin_ctz(unsigned int x)
82
{
83
    DWORD res = 0;
84
    return _BitScanForward(&res, x) ? res : 32;
85
}
86
#endif
87
88
static OPUS_INLINE __m128i silk_cvtepi64_epi32_high(__m256i num)
89
7.50G
{
90
7.50G
    return _mm256_castsi256_si128(_mm256_permutevar8x32_epi32(num, _mm256_set_epi32(0, 0, 0, 0, 7, 5, 3, 1)));
91
7.50G
}
92
93
static OPUS_INLINE opus_int16 silk_sat16(opus_int32 num)
94
154M
{
95
154M
    num = num > silk_int16_MAX ? silk_int16_MAX : num;
96
154M
    num = num < silk_int16_MIN ? silk_int16_MIN : num;
97
154M
    return num;
98
154M
}
99
100
static OPUS_INLINE opus_int32 silk_sar_round_32(opus_int32 a, int bits)
101
157M
{
102
157M
    silk_assert(bits > 0 && bits < 31);
103
157M
    a += 1 << (bits-1);
104
157M
    return a >> bits;
105
157M
}
106
107
static OPUS_INLINE opus_int64 silk_sar_round_smulww(opus_int32 a, opus_int32 b, int bits)
108
142M
{
109
142M
    opus_int64 t;
110
142M
    silk_assert(bits > 0 && bits < 63);
111
#ifdef OPUS_CHECK_ASM
112
72.3M
    return silk_RSHIFT_ROUND(silk_SMULWW(a, b), bits);
113
#else
114
    /* This code is more correct, but it won't overflow like the C code in some rare cases. */
115
70.1M
    silk_assert(bits > 0 && bits < 63);
116
70.1M
    t = ((opus_int64)a) * ((opus_int64)b);
117
70.1M
    bits += 16;
118
70.1M
    t += 1ull << (bits-1);
119
70.1M
    return t >> bits;
120
#endif
121
70.1M
}
NSQ_del_dec_avx2.c:silk_sar_round_smulww
Line
Count
Source
108
72.3M
{
109
72.3M
    opus_int64 t;
110
72.3M
    silk_assert(bits > 0 && bits < 63);
111
72.3M
#ifdef OPUS_CHECK_ASM
112
72.3M
    return silk_RSHIFT_ROUND(silk_SMULWW(a, b), bits);
113
#else
114
    /* This code is more correct, but it won't overflow like the C code in some rare cases. */
115
    silk_assert(bits > 0 && bits < 63);
116
    t = ((opus_int64)a) * ((opus_int64)b);
117
    bits += 16;
118
    t += 1ull << (bits-1);
119
    return t >> bits;
120
#endif
121
72.3M
}
NSQ_del_dec_avx2.c:silk_sar_round_smulww
Line
Count
Source
108
70.1M
{
109
70.1M
    opus_int64 t;
110
70.1M
    silk_assert(bits > 0 && bits < 63);
111
#ifdef OPUS_CHECK_ASM
112
    return silk_RSHIFT_ROUND(silk_SMULWW(a, b), bits);
113
#else
114
    /* This code is more correct, but it won't overflow like the C code in some rare cases. */
115
70.1M
    silk_assert(bits > 0 && bits < 63);
116
70.1M
    t = ((opus_int64)a) * ((opus_int64)b);
117
70.1M
    bits += 16;
118
70.1M
    t += 1ull << (bits-1);
119
70.1M
    return t >> bits;
120
70.1M
#endif
121
70.1M
}
122
123
static OPUS_INLINE opus_int32 silk_add_sat32(opus_int32 a, opus_int32 b)
124
87.1M
{
125
87.1M
    opus_int32 sum;
126
87.1M
    if (__builtin_sadd_overflow(a, b, &sum))
127
14.3k
    {
128
14.3k
        return a >= 0 ? silk_int32_MAX : silk_int32_MIN;
129
14.3k
    }
130
87.0M
    return sum;
131
87.1M
}
132
133
static OPUS_INLINE __m128i silk_mm_srai_round_epi32(__m128i a, int bits)
134
284M
{
135
284M
    silk_assert(bits > 0 && bits < 31);
136
284M
    return _mm_srai_epi32(_mm_add_epi32(a, _mm_set1_epi32(1 << (bits - 1))), bits);
137
284M
}
138
139
/* add/subtract with output saturated */
140
static OPUS_INLINE __m128i silk_mm_add_sat_epi32(__m128i a, __m128i b)
141
142M
{
142
142M
    __m128i r = _mm_add_epi32(a, b);
143
142M
    __m128i OF = _mm_and_si128(_mm_xor_si128(a, r), _mm_xor_si128(b, r));           /* OF = (sum ^ a) & (sum ^ b)   */
144
142M
    __m128i SAT = _mm_add_epi32(_mm_srli_epi32(a, 31), _mm_set1_epi32(0x7FFFFFFF)); /* SAT = (a >> 31) + 0x7FFFFFFF */
145
142M
    return _mm_blendv_epi8(r, SAT, _mm_srai_epi32(OF, 31));
146
142M
}
147
static OPUS_INLINE __m128i silk_mm_sub_sat_epi32(__m128i a, __m128i b)
148
142M
{
149
142M
    __m128i r = _mm_sub_epi32(a, b);
150
142M
    __m128i OF = _mm_andnot_si128(_mm_xor_si128(b, r), _mm_xor_si128(a, r));        /* OF = (sum ^ a) & (sum ^ ~b) = (sum ^ a) & ~(sum ^ b) */
151
142M
    __m128i SAT = _mm_add_epi32(_mm_srli_epi32(a, 31), _mm_set1_epi32(0x7FFFFFFF)); /* SAT = (a >> 31) + 0x7FFFFFFF                         */
152
142M
    return _mm_blendv_epi8(r, SAT, _mm_srai_epi32(OF, 31));
153
142M
}
154
static OPUS_INLINE __m256i silk_mm256_sub_sat_epi32(__m256i a, __m256i b)
155
142M
{
156
142M
    __m256i r = _mm256_sub_epi32(a, b);
157
142M
    __m256i OF = _mm256_andnot_si256(_mm256_xor_si256(b, r), _mm256_xor_si256(a, r));        /* OF = (sum ^ a) & (sum ^ ~b) = (sum ^ a) & ~(sum ^ b) */
158
142M
    __m256i SAT = _mm256_add_epi32(_mm256_srli_epi32(a, 31), _mm256_set1_epi32(0x7FFFFFFF)); /* SAT = (a >> 31) + 0x7FFFFFFF                         */
159
142M
    return _mm256_blendv_epi8(r, SAT, _mm256_srai_epi32(OF, 31));
160
142M
}
161
162
static OPUS_INLINE __m128i silk_mm_limit_epi32(__m128i num, opus_int32 limit1, opus_int32 limit2)
163
142M
{
164
142M
    opus_int32 lo = limit1 < limit2 ? limit1 : limit2;
165
142M
    opus_int32 hi = limit1 > limit2 ? limit1 : limit2;
166
167
142M
    num = _mm_min_epi32(num, _mm_set1_epi32(hi));
168
142M
    num = _mm_max_epi32(num, _mm_set1_epi32(lo));
169
142M
    return num;
170
142M
}
171
172
/* cond < 0 ? -num : num */
173
static OPUS_INLINE __m128i silk_mm_sign_epi32(__m128i num, __m128i cond)
174
151M
{
175
151M
    return _mm_sign_epi32(num, _mm_or_si128(cond, _mm_set1_epi32(1)));
176
151M
}
177
static OPUS_INLINE __m256i silk_mm256_sign_epi32(__m256i num, __m256i cond)
178
142M
{
179
142M
    return _mm256_sign_epi32(num, _mm256_or_si256(cond, _mm256_set1_epi32(1)));
180
142M
}
181
182
/* (a32 * b32) >> 16 */
183
static OPUS_INLINE __m128i silk_mm_smulww_epi32(__m128i a, opus_int32 b)
184
395M
{
185
395M
    return silk_cvtepi64_epi32_high(_mm256_slli_epi64(_mm256_mul_epi32(_mm256_cvtepi32_epi64(a), _mm256_set1_epi32(b)), 16));
186
395M
}
187
188
/* (a32 * (opus_int32)((opus_int16)(b32))) >> 16 output have to be 32bit int */
189
static OPUS_INLINE __m128i silk_mm_smulwb_epi32(__m128i a, opus_int32 b)
190
6.92G
{
191
6.92G
    return silk_cvtepi64_epi32_high(_mm256_mul_epi32(_mm256_cvtepi32_epi64(a), _mm256_set1_epi32((opus_uint32)b<<16)));
192
6.92G
}
193
194
/* (opus_int32)((opus_int16)(a3))) * (opus_int32)((opus_int16)(b32)) output have to be 32bit int */
195
static OPUS_INLINE __m256i silk_mm256_smulbb_epi32(__m256i a, __m256i b)
196
284M
{
197
284M
    const char FF = (char)0xFF;
198
284M
    __m256i msk = _mm256_set_epi8(
199
284M
        FF, FF, FF, FF, FF, FF, FF, FF, 13, 12, 9, 8, 5, 4, 1, 0,
200
284M
        FF, FF, FF, FF, FF, FF, FF, FF, 13, 12, 9, 8, 5, 4, 1, 0);
201
284M
    __m256i lo = _mm256_mullo_epi16(a, b);
202
284M
    __m256i hi = _mm256_mulhi_epi16(a, b);
203
284M
    lo = _mm256_shuffle_epi8(lo, msk);
204
284M
    hi = _mm256_shuffle_epi8(hi, msk);
205
284M
    return _mm256_unpacklo_epi16(lo, hi);
206
284M
}
207
208
static OPUS_INLINE __m256i silk_mm256_reverse_epi32(__m256i v)
209
16.2M
{
210
16.2M
    v = _mm256_shuffle_epi32(v, 0x1B);
211
16.2M
    v = _mm256_permute4x64_epi64(v, 0x4E);
212
16.2M
    return v;
213
16.2M
}
214
215
static OPUS_INLINE opus_int32 silk_mm256_hsum_epi32(__m256i v)
216
12.0M
{
217
12.0M
    __m128i sum = _mm_add_epi32(_mm256_extracti128_si256(v, 1), _mm256_extracti128_si256(v, 0));
218
12.0M
    sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0x4E));
219
12.0M
    sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, 0xB1));
220
12.0M
    return _mm_cvtsi128_si32(sum);
221
12.0M
}
222
223
static OPUS_INLINE __m128i silk_mm_hmin_epi32(__m128i num)
224
285M
{
225
285M
    num = _mm_min_epi32(num, _mm_shuffle_epi32(num, 0x4E)); /* 0123 -> 2301 */
226
285M
    num = _mm_min_epi32(num, _mm_shuffle_epi32(num, 0xB1)); /* 0123 -> 1032 */
227
285M
    return num;
228
285M
}
229
230
static OPUS_INLINE __m128i silk_mm_hmax_epi32(__m128i num)
231
142M
{
232
142M
    num = _mm_max_epi32(num, _mm_shuffle_epi32(num, 0x4E)); /* 0123 -> 2310 */
233
142M
    num = _mm_max_epi32(num, _mm_shuffle_epi32(num, 0xB1)); /* 0123 -> 1032 */
234
142M
    return num;
235
142M
}
236
237
static OPUS_INLINE __m128i silk_mm_mask_hmin_epi32(__m128i num, __m128i mask)
238
285M
{
239
285M
    num = _mm_blendv_epi8(num, _mm_set1_epi32(silk_int32_MAX), mask);
240
285M
    return silk_mm_hmin_epi32(num);
241
285M
}
242
243
static OPUS_INLINE __m128i silk_mm_mask_hmax_epi32(__m128i num, __m128i mask)
244
142M
{
245
142M
    num = _mm_blendv_epi8(num, _mm_set1_epi32(silk_int32_MIN), mask);
246
142M
    return silk_mm_hmax_epi32(num);
247
142M
}
248
249
static OPUS_INLINE __m128i silk_mm256_rand_epi32(__m128i seed)
250
142M
{
251
142M
    seed = _mm_mullo_epi32(seed, _mm_set1_epi32(RAND_MULTIPLIER));
252
142M
    seed = _mm_add_epi32(seed, _mm_set1_epi32(RAND_INCREMENT));
253
142M
    return seed;
254
142M
}
255
256
static OPUS_INLINE opus_int32 silk_index_of_first_equal_epi32(__m128i a, __m128i b)
257
295M
{
258
295M
    unsigned int mask = _mm_movemask_epi8(_mm_cmpeq_epi32(a, b)) & 0x1111;
259
295M
    silk_assert(mask != 0);
260
295M
    return __builtin_ctz(mask) >> 2;
261
295M
}
262
263
static __m128i silk_index_to_selector(opus_int32 index)
264
219M
{
265
219M
    silk_assert(index < 4);
266
219M
    index <<= 2;
267
219M
    return _mm_set_epi8(
268
219M
        index + 3, index + 2, index + 1, index + 0,
269
219M
        index + 3, index + 2, index + 1, index + 0,
270
219M
        index + 3, index + 2, index + 1, index + 0,
271
219M
        index + 3, index + 2, index + 1, index + 0);
272
219M
}
273
274
static opus_int32 silk_select_winner(__m128i num, __m128i selector)
275
572M
{
276
572M
    return _mm_cvtsi128_si32(_mm_shuffle_epi8(num, selector));
277
572M
}
278
279
typedef struct
280
{
281
    __m128i RandState;
282
    __m128i Q_Q10;
283
    __m128i Xq_Q14;
284
    __m128i Pred_Q15;
285
    __m128i Shape_Q14;
286
} NSQ_del_dec_sample_struct;
287
288
typedef struct
289
{
290
    __m128i sLPC_Q14[MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH];
291
    __m128i LF_AR_Q14;
292
    __m128i Seed;
293
    __m128i SeedInit;
294
    __m128i RD_Q10;
295
    __m128i Diff_Q14;
296
    __m128i sAR2_Q14[MAX_SHAPE_LPC_ORDER];
297
    NSQ_del_dec_sample_struct Samples[DECISION_DELAY];
298
} NSQ_del_dec_struct;
299
300
static OPUS_INLINE void silk_nsq_del_dec_scale_states_avx2(
301
    const silk_encoder_state *psEncC,          /* I    Encoder State                   */
302
    silk_nsq_state *NSQ,                       /* I/O  NSQ state                       */
303
    NSQ_del_dec_struct *psDelDec,              /* I/O  Delayed decision states         */
304
    const opus_int16 x16[],                    /* I    Input                           */
305
    opus_int32 x_sc_Q10[MAX_SUB_FRAME_LENGTH], /* O    Input scaled with 1/Gain in Q10 */
306
    const opus_int16 sLTP[],                   /* I    Re-whitened LTP state in Q0     */
307
    opus_int32 sLTP_Q15[],                     /* O    LTP state matching scaled input */
308
    opus_int subfr,                            /* I    Subframe number                 */
309
    const opus_int LTP_scale_Q14,              /* I    LTP state scaling               */
310
    const opus_int32 Gains_Q16[MAX_NB_SUBFR],  /* I                                    */
311
    const opus_int pitchL[MAX_NB_SUBFR],       /* I    Pitch lag                       */
312
    const opus_int signal_type,                /* I    Signal type                     */
313
    const opus_int decisionDelay               /* I    Decision delay                  */
314
);
315
316
/*******************************************/
317
/* LPC analysis filter                     */
318
/* NB! State is kept internally and the    */
319
/* filter always starts with zero state    */
320
/* first d output samples are set to zero  */
321
/*******************************************/
322
static OPUS_INLINE void silk_LPC_analysis_filter_avx2(
323
    opus_int16                  *out,               /* O    Output signal                           */
324
    const opus_int16            *in,                /* I    Input signal                            */
325
    const opus_int16            *B,                 /* I    MA prediction coefficients, Q12 [order] */
326
    const opus_int32            len,                /* I    Signal length                           */
327
    const opus_int32            order               /* I    Filter order                            */
328
);
329
330
/******************************************/
331
/* Noise shape quantizer for one subframe */
332
/******************************************/
333
static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_avx2(
334
    silk_nsq_state *NSQ,                        /* I/O  NSQ state                          */
335
    NSQ_del_dec_struct psDelDec[],              /* I/O  Delayed decision states            */
336
    opus_int signalType,                        /* I    Signal type                        */
337
    const opus_int32 x_Q10[],                   /* I                                       */
338
    opus_int8 pulses[],                         /* O                                       */
339
    opus_int16 xq[],                            /* O                                       */
340
    opus_int32 sLTP_Q15[],                      /* I/O  LTP filter state                   */
341
    opus_int32 delayedGain_Q10[DECISION_DELAY], /* I/O  Gain delay buffer                  */
342
    const opus_int16 a_Q12[],                   /* I    Short term prediction coefs        */
343
    const opus_int16 b_Q14[],                   /* I    Long term prediction coefs         */
344
    const opus_int16 AR_shp_Q13[],              /* I    Noise shaping coefs                */
345
    opus_int lag,                               /* I    Pitch lag                          */
346
    opus_int32 HarmShapeFIRPacked_Q14,          /* I                                       */
347
    opus_int Tilt_Q14,                          /* I    Spectral tilt                      */
348
    opus_int32 LF_shp_Q14,                      /* I                                       */
349
    opus_int32 Gain_Q16,                        /* I                                       */
350
    opus_int Lambda_Q10,                        /* I                                       */
351
    opus_int offset_Q10,                        /* I                                       */
352
    opus_int length,                            /* I    Input length                       */
353
    opus_int subfr,                             /* I    Subframe number                    */
354
    opus_int shapingLPCOrder,                   /* I    Shaping LPC filter order           */
355
    opus_int predictLPCOrder,                   /* I    Prediction filter order            */
356
    opus_int warping_Q16,                       /* I                                       */
357
    __m128i MaskDelDec,                         /* I    Mask of states in decision tree    */
358
    opus_int *smpl_buf_idx,                     /* I/O  Index to newest samples in buffers */
359
    opus_int decisionDelay                      /* I                                       */
360
);
361
362
void silk_NSQ_del_dec_avx2(
363
    const silk_encoder_state *psEncC,                            /* I    Encoder State               */
364
    silk_nsq_state *NSQ,                                         /* I/O  NSQ state                   */
365
    SideInfoIndices *psIndices,                                  /* I/O  Quantization Indices        */
366
    const opus_int16 x16[],                                      /* I    Input                       */
367
    opus_int8 pulses[],                                          /* O    Quantized pulse signal      */
368
    const opus_int16 *PredCoef_Q12,                              /* I    Short term prediction coefs */
369
    const opus_int16 LTPCoef_Q14[LTP_ORDER * MAX_NB_SUBFR],      /* I    Long term prediction coefs  */
370
    const opus_int16 AR_Q13[MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER], /* I    Noise shaping coefs         */
371
    const opus_int HarmShapeGain_Q14[MAX_NB_SUBFR],              /* I    Long term shaping coefs     */
372
    const opus_int Tilt_Q14[MAX_NB_SUBFR],                       /* I    Spectral tilt               */
373
    const opus_int32 LF_shp_Q14[MAX_NB_SUBFR],                   /* I    Low frequency shaping coefs */
374
    const opus_int32 Gains_Q16[MAX_NB_SUBFR],                    /* I    Quantization step sizes     */
375
    const opus_int32 pitchL[MAX_NB_SUBFR],                       /* I    Pitch lags                  */
376
    const opus_int Lambda_Q10,                                   /* I    Rate/distortion tradeoff    */
377
    const opus_int LTP_scale_Q14                                 /* I    LTP state scaling           */
378
)
379
1.12M
{
380
#ifdef OPUS_CHECK_ASM
381
    silk_nsq_state NSQ_c;
382
    SideInfoIndices psIndices_c;
383
    opus_int8 pulses_c[MAX_FRAME_LENGTH];
384
    const opus_int8 *const pulses_a = pulses;
385
386
551k
    silk_memcpy(&NSQ_c, NSQ, sizeof(NSQ_c));
387
551k
    silk_memcpy(&psIndices_c, psIndices, sizeof(psIndices_c));
388
551k
    silk_memcpy(pulses_c, pulses, sizeof(pulses_c));
389
    silk_NSQ_del_dec_c(psEncC, &NSQ_c, &psIndices_c, x16, pulses_c, PredCoef_Q12, LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16,
390
                       pitchL, Lambda_Q10, LTP_scale_Q14);
391
#endif
392
393
1.12M
    if (!verify_assumptions(psEncC))
394
352k
    {
395
352k
        silk_NSQ_del_dec_c(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14);
396
352k
        return;
397
352k
    }
398
399
776k
    opus_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr;
400
776k
    opus_int last_smple_idx, smpl_buf_idx, decisionDelay;
401
776k
    const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13;
402
776k
    opus_int16 *pxq;
403
776k
    VARDECL(opus_int32, sLTP_Q15);
404
776k
    VARDECL(opus_int16, sLTP);
405
776k
    opus_int32 HarmShapeFIRPacked_Q14;
406
776k
    opus_int offset_Q10;
407
776k
    opus_int32 Gain_Q10;
408
776k
    opus_int32 x_sc_Q10[MAX_SUB_FRAME_LENGTH];
409
776k
    opus_int32 delayedGain_Q10[DECISION_DELAY];
410
776k
    NSQ_del_dec_struct psDelDec = {0};
411
776k
    NSQ_del_dec_sample_struct *psSample;
412
776k
    __m128i RDmin_Q10, MaskDelDec, Winner_selector;
413
776k
    SAVE_STACK;
414
415
776k
    MaskDelDec = _mm_cvtepi8_epi32(_mm_cvtsi32_si128(0xFFFFFF00ul << ((psEncC->nStatesDelayedDecision - 1) << 3)));
416
417
    /* Set unvoiced lag to the previous one, overwrite later for voiced */
418
776k
    lag = NSQ->lagPrev;
419
420
776k
    silk_assert(NSQ->prev_gain_Q16 != 0);
421
776k
    psDelDec.Seed = _mm_and_si128(
422
776k
        _mm_add_epi32(_mm_set_epi32(3, 2, 1, 0), _mm_set1_epi32(psIndices->Seed)),
423
776k
        _mm_set1_epi32(3));
424
776k
    psDelDec.SeedInit = psDelDec.Seed;
425
776k
    psDelDec.RD_Q10 = _mm_setzero_si128();
426
776k
    psDelDec.LF_AR_Q14 = _mm_set1_epi32(NSQ->sLF_AR_shp_Q14);
427
776k
    psDelDec.Diff_Q14 = _mm_set1_epi32(NSQ->sDiff_shp_Q14);
428
776k
    psDelDec.Samples[0].Shape_Q14 = _mm_set1_epi32(NSQ->sLTP_shp_Q14[psEncC->ltp_mem_length - 1]);
429
13.1M
    for (i = 0; i < NSQ_LPC_BUF_LENGTH; i++)
430
12.4M
    {
431
12.4M
        psDelDec.sLPC_Q14[i] = _mm_set1_epi32(NSQ->sLPC_Q14[i]);
432
12.4M
    }
433
19.4M
    for (i = 0; i < MAX_SHAPE_LPC_ORDER; i++)
434
18.6M
    {
435
18.6M
        psDelDec.sAR2_Q14[i] = _mm_set1_epi32(NSQ->sAR2_Q14[i]);
436
18.6M
    }
437
438
776k
    offset_Q10 = silk_Quantization_Offsets_Q10[psIndices->signalType >> 1][psIndices->quantOffsetType];
439
776k
    smpl_buf_idx = 0; /* index of oldest samples */
440
441
776k
    decisionDelay = silk_min_int(DECISION_DELAY, psEncC->subfr_length);
442
443
    /* For voiced frames limit the decision delay to lower than the pitch lag */
444
776k
    if (psIndices->signalType == TYPE_VOICED)
445
152k
    {
446
761k
        for (k = 0; k < psEncC->nb_subfr; k++)
447
609k
        {
448
609k
            decisionDelay = silk_min_int(decisionDelay, pitchL[k] - LTP_ORDER / 2 - 1);
449
609k
        }
450
152k
    }
451
623k
    else
452
623k
    {
453
623k
        if (lag > 0)
454
367k
        {
455
367k
            decisionDelay = silk_min_int(decisionDelay, lag - LTP_ORDER / 2 - 1);
456
367k
        }
457
623k
    }
458
459
776k
    if (psIndices->NLSFInterpCoef_Q2 == 4)
460
644k
    {
461
644k
        LSF_interpolation_flag = 0;
462
644k
    }
463
131k
    else
464
131k
    {
465
131k
        LSF_interpolation_flag = 1;
466
131k
    }
467
468
776k
    ALLOC(sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32);
469
776k
    ALLOC(sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16);
470
    /* Set up pointers to start of sub frame */
471
776k
    pxq = &NSQ->xq[psEncC->ltp_mem_length];
472
776k
    NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length;
473
776k
    NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
474
776k
    subfr = 0;
475
3.50M
    for (k = 0; k < psEncC->nb_subfr; k++)
476
2.72M
    {
477
2.72M
        A_Q12 = &PredCoef_Q12[((k >> 1) | (1 ^ LSF_interpolation_flag)) * MAX_LPC_ORDER];
478
2.72M
        B_Q14 = &LTPCoef_Q14[k * LTP_ORDER];
479
2.72M
        AR_shp_Q13 = &AR_Q13[k * MAX_SHAPE_LPC_ORDER];
480
481
        /* Noise shape parameters */
482
2.72M
        silk_assert(HarmShapeGain_Q14[k] >= 0);
483
2.72M
        HarmShapeFIRPacked_Q14  =                          silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 );
484
2.72M
        HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 );
485
486
2.72M
        NSQ->rewhite_flag = 0;
487
2.72M
        if (psIndices->signalType == TYPE_VOICED)
488
609k
        {
489
            /* Voiced */
490
609k
            lag = pitchL[k];
491
492
            /* Re-whitening */
493
609k
            if ((k & (3 ^ (LSF_interpolation_flag << 1))) == 0)
494
207k
            {
495
207k
                if (k == 2)
496
54.8k
                {
497
                    /* RESET DELAYED DECISIONS */
498
                    /* Find winner */
499
54.8k
                    RDmin_Q10 = silk_mm_mask_hmin_epi32(psDelDec.RD_Q10, MaskDelDec);
500
54.8k
                    Winner_ind = silk_index_of_first_equal_epi32(RDmin_Q10, psDelDec.RD_Q10);
501
54.8k
                    Winner_selector = silk_index_to_selector(Winner_ind);
502
54.8k
                    psDelDec.RD_Q10 = _mm_add_epi32(
503
54.8k
                        psDelDec.RD_Q10,
504
54.8k
                        _mm_blendv_epi8(
505
54.8k
                            _mm_set1_epi32(silk_int32_MAX >> 4),
506
54.8k
                            _mm_setzero_si128(),
507
54.8k
                            _mm_cvtepi8_epi32(_mm_cvtsi32_si128(0xFFU << (unsigned)(Winner_ind << 3)))));
508
509
                    /* Copy final part of signals from winner state to output and long-term filter states */
510
54.8k
                    last_smple_idx = smpl_buf_idx + decisionDelay;
511
1.56M
                    for (i = 0; i < decisionDelay; i++)
512
1.51M
                    {
513
1.51M
                        last_smple_idx = (last_smple_idx + DECISION_DELAY - 1) % DECISION_DELAY;
514
1.51M
                        psSample = &psDelDec.Samples[last_smple_idx];
515
1.51M
                        pulses[i - decisionDelay] =
516
1.51M
                            (opus_int8)silk_sar_round_32(silk_select_winner(psSample->Q_Q10, Winner_selector), 10);
517
1.51M
                        pxq[i - decisionDelay] =
518
1.51M
                            silk_sat16((opus_int32)silk_sar_round_smulww(silk_select_winner(psSample->Xq_Q14, Winner_selector), Gains_Q16[1], 14));
519
1.51M
                        NSQ->sLTP_shp_Q14[NSQ->sLTP_shp_buf_idx - decisionDelay + i] =
520
1.51M
                            silk_select_winner(psSample->Shape_Q14, Winner_selector);
521
1.51M
                    }
522
523
54.8k
                    subfr = 0;
524
54.8k
                }
525
526
                /* Rewhiten with new A coefs */
527
207k
                start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2;
528
207k
                silk_assert(start_idx > 0);
529
530
207k
                silk_LPC_analysis_filter_avx2(&sLTP[start_idx], &NSQ->xq[start_idx + k * psEncC->subfr_length],
531
207k
                                              A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder);
532
533
207k
                NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
534
207k
                NSQ->rewhite_flag = 1;
535
207k
            }
536
609k
        }
537
538
2.72M
        silk_nsq_del_dec_scale_states_avx2(psEncC, NSQ, &psDelDec, x16, x_sc_Q10, sLTP, sLTP_Q15, k,
539
2.72M
                                           LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType, decisionDelay);
540
541
2.72M
        silk_noise_shape_quantizer_del_dec_avx2(NSQ, &psDelDec, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15,
542
2.72M
                                                delayedGain_Q10, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[k], LF_shp_Q14[k],
543
2.72M
                                                Gains_Q16[k], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder,
544
2.72M
                                                psEncC->predictLPCOrder, psEncC->warping_Q16, MaskDelDec, &smpl_buf_idx, decisionDelay);
545
546
2.72M
        x16 += psEncC->subfr_length;
547
2.72M
        pulses += psEncC->subfr_length;
548
2.72M
        pxq += psEncC->subfr_length;
549
2.72M
    }
550
551
    /* Find winner */
552
776k
    RDmin_Q10 = silk_mm_mask_hmin_epi32(psDelDec.RD_Q10, MaskDelDec);
553
776k
    Winner_selector = silk_index_to_selector(silk_index_of_first_equal_epi32(RDmin_Q10, psDelDec.RD_Q10));
554
555
    /* Copy final part of signals from winner state to output and long-term filter states */
556
776k
    psIndices->Seed = silk_select_winner(psDelDec.SeedInit, Winner_selector);
557
776k
    last_smple_idx = smpl_buf_idx + decisionDelay;
558
776k
    Gain_Q10 = Gains_Q16[psEncC->nb_subfr - 1] >> 6;
559
29.7M
    for (i = 0; i < decisionDelay; i++)
560
28.9M
    {
561
28.9M
        last_smple_idx = (last_smple_idx + DECISION_DELAY - 1) % DECISION_DELAY;
562
28.9M
        psSample = &psDelDec.Samples[last_smple_idx];
563
564
28.9M
        pulses[i - decisionDelay] =
565
28.9M
            (opus_int8)silk_sar_round_32(silk_select_winner(psSample->Q_Q10, Winner_selector), 10);
566
28.9M
        pxq[i - decisionDelay] =
567
28.9M
            silk_sat16((opus_int32)silk_sar_round_smulww(silk_select_winner(psSample->Xq_Q14, Winner_selector), Gain_Q10, 8));
568
28.9M
        NSQ->sLTP_shp_Q14[NSQ->sLTP_shp_buf_idx - decisionDelay + i] =
569
28.9M
            silk_select_winner(psSample->Shape_Q14, Winner_selector);
570
28.9M
    }
571
13.1M
    for (i = 0; i < NSQ_LPC_BUF_LENGTH; i++)
572
12.4M
    {
573
12.4M
        NSQ->sLPC_Q14[i] = silk_select_winner(psDelDec.sLPC_Q14[i], Winner_selector);
574
12.4M
    }
575
19.4M
    for (i = 0; i < MAX_SHAPE_LPC_ORDER; i++)
576
18.6M
    {
577
18.6M
        NSQ->sAR2_Q14[i] = silk_select_winner(psDelDec.sAR2_Q14[i], Winner_selector);
578
18.6M
    }
579
580
    /* Update states */
581
776k
    NSQ->sLF_AR_shp_Q14 = silk_select_winner(psDelDec.LF_AR_Q14, Winner_selector);
582
776k
    NSQ->sDiff_shp_Q14 = silk_select_winner(psDelDec.Diff_Q14, Winner_selector);
583
776k
    NSQ->lagPrev = pitchL[psEncC->nb_subfr - 1];
584
585
    /* Save quantized speech signal */
586
776k
    silk_memmove(NSQ->xq, &NSQ->xq[psEncC->frame_length], psEncC->ltp_mem_length * sizeof(opus_int16));
587
776k
    silk_memmove(NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[psEncC->frame_length], psEncC->ltp_mem_length * sizeof(opus_int32));
588
589
#ifdef OPUS_CHECK_ASM
590
403k
    silk_assert(!memcmp(&NSQ_c, NSQ, sizeof(NSQ_c)));
591
403k
    silk_assert(!memcmp(&psIndices_c, psIndices, sizeof(psIndices_c)));
592
403k
    silk_assert(!memcmp(pulses_c, pulses_a, sizeof(pulses_c)));
593
403k
#endif
594
595
403k
    RESTORE_STACK;
596
403k
}
silk_NSQ_del_dec_avx2
Line
Count
Source
379
551k
{
380
551k
#ifdef OPUS_CHECK_ASM
381
551k
    silk_nsq_state NSQ_c;
382
551k
    SideInfoIndices psIndices_c;
383
551k
    opus_int8 pulses_c[MAX_FRAME_LENGTH];
384
551k
    const opus_int8 *const pulses_a = pulses;
385
386
551k
    silk_memcpy(&NSQ_c, NSQ, sizeof(NSQ_c));
387
551k
    silk_memcpy(&psIndices_c, psIndices, sizeof(psIndices_c));
388
551k
    silk_memcpy(pulses_c, pulses, sizeof(pulses_c));
389
551k
    silk_NSQ_del_dec_c(psEncC, &NSQ_c, &psIndices_c, x16, pulses_c, PredCoef_Q12, LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16,
390
551k
                       pitchL, Lambda_Q10, LTP_scale_Q14);
391
551k
#endif
392
393
551k
    if (!verify_assumptions(psEncC))
394
148k
    {
395
148k
        silk_NSQ_del_dec_c(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14);
396
148k
        return;
397
148k
    }
398
399
403k
    opus_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr;
400
403k
    opus_int last_smple_idx, smpl_buf_idx, decisionDelay;
401
403k
    const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13;
402
403k
    opus_int16 *pxq;
403
403k
    VARDECL(opus_int32, sLTP_Q15);
404
403k
    VARDECL(opus_int16, sLTP);
405
403k
    opus_int32 HarmShapeFIRPacked_Q14;
406
403k
    opus_int offset_Q10;
407
403k
    opus_int32 Gain_Q10;
408
403k
    opus_int32 x_sc_Q10[MAX_SUB_FRAME_LENGTH];
409
403k
    opus_int32 delayedGain_Q10[DECISION_DELAY];
410
403k
    NSQ_del_dec_struct psDelDec = {0};
411
403k
    NSQ_del_dec_sample_struct *psSample;
412
403k
    __m128i RDmin_Q10, MaskDelDec, Winner_selector;
413
403k
    SAVE_STACK;
414
415
403k
    MaskDelDec = _mm_cvtepi8_epi32(_mm_cvtsi32_si128(0xFFFFFF00ul << ((psEncC->nStatesDelayedDecision - 1) << 3)));
416
417
    /* Set unvoiced lag to the previous one, overwrite later for voiced */
418
403k
    lag = NSQ->lagPrev;
419
420
403k
    silk_assert(NSQ->prev_gain_Q16 != 0);
421
403k
    psDelDec.Seed = _mm_and_si128(
422
403k
        _mm_add_epi32(_mm_set_epi32(3, 2, 1, 0), _mm_set1_epi32(psIndices->Seed)),
423
403k
        _mm_set1_epi32(3));
424
403k
    psDelDec.SeedInit = psDelDec.Seed;
425
403k
    psDelDec.RD_Q10 = _mm_setzero_si128();
426
403k
    psDelDec.LF_AR_Q14 = _mm_set1_epi32(NSQ->sLF_AR_shp_Q14);
427
403k
    psDelDec.Diff_Q14 = _mm_set1_epi32(NSQ->sDiff_shp_Q14);
428
403k
    psDelDec.Samples[0].Shape_Q14 = _mm_set1_epi32(NSQ->sLTP_shp_Q14[psEncC->ltp_mem_length - 1]);
429
6.85M
    for (i = 0; i < NSQ_LPC_BUF_LENGTH; i++)
430
6.45M
    {
431
6.45M
        psDelDec.sLPC_Q14[i] = _mm_set1_epi32(NSQ->sLPC_Q14[i]);
432
6.45M
    }
433
10.0M
    for (i = 0; i < MAX_SHAPE_LPC_ORDER; i++)
434
9.68M
    {
435
9.68M
        psDelDec.sAR2_Q14[i] = _mm_set1_epi32(NSQ->sAR2_Q14[i]);
436
9.68M
    }
437
438
403k
    offset_Q10 = silk_Quantization_Offsets_Q10[psIndices->signalType >> 1][psIndices->quantOffsetType];
439
403k
    smpl_buf_idx = 0; /* index of oldest samples */
440
441
403k
    decisionDelay = silk_min_int(DECISION_DELAY, psEncC->subfr_length);
442
443
    /* For voiced frames limit the decision delay to lower than the pitch lag */
444
403k
    if (psIndices->signalType == TYPE_VOICED)
445
78.4k
    {
446
392k
        for (k = 0; k < psEncC->nb_subfr; k++)
447
313k
        {
448
313k
            decisionDelay = silk_min_int(decisionDelay, pitchL[k] - LTP_ORDER / 2 - 1);
449
313k
        }
450
78.4k
    }
451
324k
    else
452
324k
    {
453
324k
        if (lag > 0)
454
190k
        {
455
190k
            decisionDelay = silk_min_int(decisionDelay, lag - LTP_ORDER / 2 - 1);
456
190k
        }
457
324k
    }
458
459
403k
    if (psIndices->NLSFInterpCoef_Q2 == 4)
460
336k
    {
461
336k
        LSF_interpolation_flag = 0;
462
336k
    }
463
67.2k
    else
464
67.2k
    {
465
67.2k
        LSF_interpolation_flag = 1;
466
67.2k
    }
467
468
403k
    ALLOC(sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32);
469
403k
    ALLOC(sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16);
470
    /* Set up pointers to start of sub frame */
471
403k
    pxq = &NSQ->xq[psEncC->ltp_mem_length];
472
403k
    NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length;
473
403k
    NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
474
403k
    subfr = 0;
475
1.81M
    for (k = 0; k < psEncC->nb_subfr; k++)
476
1.41M
    {
477
1.41M
        A_Q12 = &PredCoef_Q12[((k >> 1) | (1 ^ LSF_interpolation_flag)) * MAX_LPC_ORDER];
478
1.41M
        B_Q14 = &LTPCoef_Q14[k * LTP_ORDER];
479
1.41M
        AR_shp_Q13 = &AR_Q13[k * MAX_SHAPE_LPC_ORDER];
480
481
        /* Noise shape parameters */
482
1.41M
        silk_assert(HarmShapeGain_Q14[k] >= 0);
483
1.41M
        HarmShapeFIRPacked_Q14  =                          silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 );
484
1.41M
        HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 );
485
486
1.41M
        NSQ->rewhite_flag = 0;
487
1.41M
        if (psIndices->signalType == TYPE_VOICED)
488
313k
        {
489
            /* Voiced */
490
313k
            lag = pitchL[k];
491
492
            /* Re-whitening */
493
313k
            if ((k & (3 ^ (LSF_interpolation_flag << 1))) == 0)
494
107k
            {
495
107k
                if (k == 2)
496
28.8k
                {
497
                    /* RESET DELAYED DECISIONS */
498
                    /* Find winner */
499
28.8k
                    RDmin_Q10 = silk_mm_mask_hmin_epi32(psDelDec.RD_Q10, MaskDelDec);
500
28.8k
                    Winner_ind = silk_index_of_first_equal_epi32(RDmin_Q10, psDelDec.RD_Q10);
501
28.8k
                    Winner_selector = silk_index_to_selector(Winner_ind);
502
28.8k
                    psDelDec.RD_Q10 = _mm_add_epi32(
503
28.8k
                        psDelDec.RD_Q10,
504
28.8k
                        _mm_blendv_epi8(
505
28.8k
                            _mm_set1_epi32(silk_int32_MAX >> 4),
506
28.8k
                            _mm_setzero_si128(),
507
28.8k
                            _mm_cvtepi8_epi32(_mm_cvtsi32_si128(0xFFU << (unsigned)(Winner_ind << 3)))));
508
509
                    /* Copy final part of signals from winner state to output and long-term filter states */
510
28.8k
                    last_smple_idx = smpl_buf_idx + decisionDelay;
511
851k
                    for (i = 0; i < decisionDelay; i++)
512
822k
                    {
513
822k
                        last_smple_idx = (last_smple_idx + DECISION_DELAY - 1) % DECISION_DELAY;
514
822k
                        psSample = &psDelDec.Samples[last_smple_idx];
515
822k
                        pulses[i - decisionDelay] =
516
822k
                            (opus_int8)silk_sar_round_32(silk_select_winner(psSample->Q_Q10, Winner_selector), 10);
517
822k
                        pxq[i - decisionDelay] =
518
822k
                            silk_sat16((opus_int32)silk_sar_round_smulww(silk_select_winner(psSample->Xq_Q14, Winner_selector), Gains_Q16[1], 14));
519
822k
                        NSQ->sLTP_shp_Q14[NSQ->sLTP_shp_buf_idx - decisionDelay + i] =
520
822k
                            silk_select_winner(psSample->Shape_Q14, Winner_selector);
521
822k
                    }
522
523
28.8k
                    subfr = 0;
524
28.8k
                }
525
526
                /* Rewhiten with new A coefs */
527
107k
                start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2;
528
107k
                silk_assert(start_idx > 0);
529
530
107k
                silk_LPC_analysis_filter_avx2(&sLTP[start_idx], &NSQ->xq[start_idx + k * psEncC->subfr_length],
531
107k
                                              A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder);
532
533
107k
                NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
534
107k
                NSQ->rewhite_flag = 1;
535
107k
            }
536
313k
        }
537
538
1.41M
        silk_nsq_del_dec_scale_states_avx2(psEncC, NSQ, &psDelDec, x16, x_sc_Q10, sLTP, sLTP_Q15, k,
539
1.41M
                                           LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType, decisionDelay);
540
541
1.41M
        silk_noise_shape_quantizer_del_dec_avx2(NSQ, &psDelDec, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15,
542
1.41M
                                                delayedGain_Q10, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[k], LF_shp_Q14[k],
543
1.41M
                                                Gains_Q16[k], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder,
544
1.41M
                                                psEncC->predictLPCOrder, psEncC->warping_Q16, MaskDelDec, &smpl_buf_idx, decisionDelay);
545
546
1.41M
        x16 += psEncC->subfr_length;
547
1.41M
        pulses += psEncC->subfr_length;
548
1.41M
        pxq += psEncC->subfr_length;
549
1.41M
    }
550
551
    /* Find winner */
552
403k
    RDmin_Q10 = silk_mm_mask_hmin_epi32(psDelDec.RD_Q10, MaskDelDec);
553
403k
    Winner_selector = silk_index_to_selector(silk_index_of_first_equal_epi32(RDmin_Q10, psDelDec.RD_Q10));
554
555
    /* Copy final part of signals from winner state to output and long-term filter states */
556
403k
    psIndices->Seed = silk_select_winner(psDelDec.SeedInit, Winner_selector);
557
403k
    last_smple_idx = smpl_buf_idx + decisionDelay;
558
403k
    Gain_Q10 = Gains_Q16[psEncC->nb_subfr - 1] >> 6;
559
15.5M
    for (i = 0; i < decisionDelay; i++)
560
15.1M
    {
561
15.1M
        last_smple_idx = (last_smple_idx + DECISION_DELAY - 1) % DECISION_DELAY;
562
15.1M
        psSample = &psDelDec.Samples[last_smple_idx];
563
564
15.1M
        pulses[i - decisionDelay] =
565
15.1M
            (opus_int8)silk_sar_round_32(silk_select_winner(psSample->Q_Q10, Winner_selector), 10);
566
15.1M
        pxq[i - decisionDelay] =
567
15.1M
            silk_sat16((opus_int32)silk_sar_round_smulww(silk_select_winner(psSample->Xq_Q14, Winner_selector), Gain_Q10, 8));
568
15.1M
        NSQ->sLTP_shp_Q14[NSQ->sLTP_shp_buf_idx - decisionDelay + i] =
569
15.1M
            silk_select_winner(psSample->Shape_Q14, Winner_selector);
570
15.1M
    }
571
6.85M
    for (i = 0; i < NSQ_LPC_BUF_LENGTH; i++)
572
6.45M
    {
573
6.45M
        NSQ->sLPC_Q14[i] = silk_select_winner(psDelDec.sLPC_Q14[i], Winner_selector);
574
6.45M
    }
575
10.0M
    for (i = 0; i < MAX_SHAPE_LPC_ORDER; i++)
576
9.68M
    {
577
9.68M
        NSQ->sAR2_Q14[i] = silk_select_winner(psDelDec.sAR2_Q14[i], Winner_selector);
578
9.68M
    }
579
580
    /* Update states */
581
403k
    NSQ->sLF_AR_shp_Q14 = silk_select_winner(psDelDec.LF_AR_Q14, Winner_selector);
582
403k
    NSQ->sDiff_shp_Q14 = silk_select_winner(psDelDec.Diff_Q14, Winner_selector);
583
403k
    NSQ->lagPrev = pitchL[psEncC->nb_subfr - 1];
584
585
    /* Save quantized speech signal */
586
403k
    silk_memmove(NSQ->xq, &NSQ->xq[psEncC->frame_length], psEncC->ltp_mem_length * sizeof(opus_int16));
587
403k
    silk_memmove(NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[psEncC->frame_length], psEncC->ltp_mem_length * sizeof(opus_int32));
588
589
403k
#ifdef OPUS_CHECK_ASM
590
403k
    silk_assert(!memcmp(&NSQ_c, NSQ, sizeof(NSQ_c)));
591
403k
    silk_assert(!memcmp(&psIndices_c, psIndices, sizeof(psIndices_c)));
592
403k
    silk_assert(!memcmp(pulses_c, pulses_a, sizeof(pulses_c)));
593
403k
#endif
594
595
403k
    RESTORE_STACK;
596
403k
}
silk_NSQ_del_dec_avx2
Line
Count
Source
379
577k
{
380
#ifdef OPUS_CHECK_ASM
381
    silk_nsq_state NSQ_c;
382
    SideInfoIndices psIndices_c;
383
    opus_int8 pulses_c[MAX_FRAME_LENGTH];
384
    const opus_int8 *const pulses_a = pulses;
385
386
    silk_memcpy(&NSQ_c, NSQ, sizeof(NSQ_c));
387
    silk_memcpy(&psIndices_c, psIndices, sizeof(psIndices_c));
388
    silk_memcpy(pulses_c, pulses, sizeof(pulses_c));
389
    silk_NSQ_del_dec_c(psEncC, &NSQ_c, &psIndices_c, x16, pulses_c, PredCoef_Q12, LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16,
390
                       pitchL, Lambda_Q10, LTP_scale_Q14);
391
#endif
392
393
577k
    if (!verify_assumptions(psEncC))
394
204k
    {
395
204k
        silk_NSQ_del_dec_c(psEncC, NSQ, psIndices, x16, pulses, PredCoef_Q12, LTPCoef_Q14, AR_Q13, HarmShapeGain_Q14, Tilt_Q14, LF_shp_Q14, Gains_Q16, pitchL, Lambda_Q10, LTP_scale_Q14);
396
204k
        return;
397
204k
    }
398
399
372k
    opus_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr;
400
372k
    opus_int last_smple_idx, smpl_buf_idx, decisionDelay;
401
372k
    const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13;
402
372k
    opus_int16 *pxq;
403
372k
    VARDECL(opus_int32, sLTP_Q15);
404
372k
    VARDECL(opus_int16, sLTP);
405
372k
    opus_int32 HarmShapeFIRPacked_Q14;
406
372k
    opus_int offset_Q10;
407
372k
    opus_int32 Gain_Q10;
408
372k
    opus_int32 x_sc_Q10[MAX_SUB_FRAME_LENGTH];
409
372k
    opus_int32 delayedGain_Q10[DECISION_DELAY];
410
372k
    NSQ_del_dec_struct psDelDec = {0};
411
372k
    NSQ_del_dec_sample_struct *psSample;
412
372k
    __m128i RDmin_Q10, MaskDelDec, Winner_selector;
413
372k
    SAVE_STACK;
414
415
372k
    MaskDelDec = _mm_cvtepi8_epi32(_mm_cvtsi32_si128(0xFFFFFF00ul << ((psEncC->nStatesDelayedDecision - 1) << 3)));
416
417
    /* Set unvoiced lag to the previous one, overwrite later for voiced */
418
372k
    lag = NSQ->lagPrev;
419
420
372k
    silk_assert(NSQ->prev_gain_Q16 != 0);
421
372k
    psDelDec.Seed = _mm_and_si128(
422
372k
        _mm_add_epi32(_mm_set_epi32(3, 2, 1, 0), _mm_set1_epi32(psIndices->Seed)),
423
372k
        _mm_set1_epi32(3));
424
372k
    psDelDec.SeedInit = psDelDec.Seed;
425
372k
    psDelDec.RD_Q10 = _mm_setzero_si128();
426
372k
    psDelDec.LF_AR_Q14 = _mm_set1_epi32(NSQ->sLF_AR_shp_Q14);
427
372k
    psDelDec.Diff_Q14 = _mm_set1_epi32(NSQ->sDiff_shp_Q14);
428
372k
    psDelDec.Samples[0].Shape_Q14 = _mm_set1_epi32(NSQ->sLTP_shp_Q14[psEncC->ltp_mem_length - 1]);
429
6.33M
    for (i = 0; i < NSQ_LPC_BUF_LENGTH; i++)
430
5.96M
    {
431
5.96M
        psDelDec.sLPC_Q14[i] = _mm_set1_epi32(NSQ->sLPC_Q14[i]);
432
5.96M
    }
433
9.31M
    for (i = 0; i < MAX_SHAPE_LPC_ORDER; i++)
434
8.94M
    {
435
8.94M
        psDelDec.sAR2_Q14[i] = _mm_set1_epi32(NSQ->sAR2_Q14[i]);
436
8.94M
    }
437
438
372k
    offset_Q10 = silk_Quantization_Offsets_Q10[psIndices->signalType >> 1][psIndices->quantOffsetType];
439
372k
    smpl_buf_idx = 0; /* index of oldest samples */
440
441
372k
    decisionDelay = silk_min_int(DECISION_DELAY, psEncC->subfr_length);
442
443
    /* For voiced frames limit the decision delay to lower than the pitch lag */
444
372k
    if (psIndices->signalType == TYPE_VOICED)
445
73.8k
    {
446
369k
        for (k = 0; k < psEncC->nb_subfr; k++)
447
295k
        {
448
295k
            decisionDelay = silk_min_int(decisionDelay, pitchL[k] - LTP_ORDER / 2 - 1);
449
295k
        }
450
73.8k
    }
451
298k
    else
452
298k
    {
453
298k
        if (lag > 0)
454
176k
        {
455
176k
            decisionDelay = silk_min_int(decisionDelay, lag - LTP_ORDER / 2 - 1);
456
176k
        }
457
298k
    }
458
459
372k
    if (psIndices->NLSFInterpCoef_Q2 == 4)
460
308k
    {
461
308k
        LSF_interpolation_flag = 0;
462
308k
    }
463
64.0k
    else
464
64.0k
    {
465
64.0k
        LSF_interpolation_flag = 1;
466
64.0k
    }
467
468
372k
    ALLOC(sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32);
469
372k
    ALLOC(sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16);
470
    /* Set up pointers to start of sub frame */
471
372k
    pxq = &NSQ->xq[psEncC->ltp_mem_length];
472
372k
    NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length;
473
372k
    NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
474
372k
    subfr = 0;
475
1.68M
    for (k = 0; k < psEncC->nb_subfr; k++)
476
1.31M
    {
477
1.31M
        A_Q12 = &PredCoef_Q12[((k >> 1) | (1 ^ LSF_interpolation_flag)) * MAX_LPC_ORDER];
478
1.31M
        B_Q14 = &LTPCoef_Q14[k * LTP_ORDER];
479
1.31M
        AR_shp_Q13 = &AR_Q13[k * MAX_SHAPE_LPC_ORDER];
480
481
        /* Noise shape parameters */
482
1.31M
        silk_assert(HarmShapeGain_Q14[k] >= 0);
483
1.31M
        HarmShapeFIRPacked_Q14  =                          silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 );
484
1.31M
        HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 );
485
486
1.31M
        NSQ->rewhite_flag = 0;
487
1.31M
        if (psIndices->signalType == TYPE_VOICED)
488
295k
        {
489
            /* Voiced */
490
295k
            lag = pitchL[k];
491
492
            /* Re-whitening */
493
295k
            if ((k & (3 ^ (LSF_interpolation_flag << 1))) == 0)
494
99.7k
            {
495
99.7k
                if (k == 2)
496
25.9k
                {
497
                    /* RESET DELAYED DECISIONS */
498
                    /* Find winner */
499
25.9k
                    RDmin_Q10 = silk_mm_mask_hmin_epi32(psDelDec.RD_Q10, MaskDelDec);
500
25.9k
                    Winner_ind = silk_index_of_first_equal_epi32(RDmin_Q10, psDelDec.RD_Q10);
501
25.9k
                    Winner_selector = silk_index_to_selector(Winner_ind);
502
25.9k
                    psDelDec.RD_Q10 = _mm_add_epi32(
503
25.9k
                        psDelDec.RD_Q10,
504
25.9k
                        _mm_blendv_epi8(
505
25.9k
                            _mm_set1_epi32(silk_int32_MAX >> 4),
506
25.9k
                            _mm_setzero_si128(),
507
25.9k
                            _mm_cvtepi8_epi32(_mm_cvtsi32_si128(0xFFU << (unsigned)(Winner_ind << 3)))));
508
509
                    /* Copy final part of signals from winner state to output and long-term filter states */
510
25.9k
                    last_smple_idx = smpl_buf_idx + decisionDelay;
511
716k
                    for (i = 0; i < decisionDelay; i++)
512
690k
                    {
513
690k
                        last_smple_idx = (last_smple_idx + DECISION_DELAY - 1) % DECISION_DELAY;
514
690k
                        psSample = &psDelDec.Samples[last_smple_idx];
515
690k
                        pulses[i - decisionDelay] =
516
690k
                            (opus_int8)silk_sar_round_32(silk_select_winner(psSample->Q_Q10, Winner_selector), 10);
517
690k
                        pxq[i - decisionDelay] =
518
690k
                            silk_sat16((opus_int32)silk_sar_round_smulww(silk_select_winner(psSample->Xq_Q14, Winner_selector), Gains_Q16[1], 14));
519
690k
                        NSQ->sLTP_shp_Q14[NSQ->sLTP_shp_buf_idx - decisionDelay + i] =
520
690k
                            silk_select_winner(psSample->Shape_Q14, Winner_selector);
521
690k
                    }
522
523
25.9k
                    subfr = 0;
524
25.9k
                }
525
526
                /* Rewhiten with new A coefs */
527
99.7k
                start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2;
528
99.7k
                silk_assert(start_idx > 0);
529
530
99.7k
                silk_LPC_analysis_filter_avx2(&sLTP[start_idx], &NSQ->xq[start_idx + k * psEncC->subfr_length],
531
99.7k
                                              A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder);
532
533
99.7k
                NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
534
99.7k
                NSQ->rewhite_flag = 1;
535
99.7k
            }
536
295k
        }
537
538
1.31M
        silk_nsq_del_dec_scale_states_avx2(psEncC, NSQ, &psDelDec, x16, x_sc_Q10, sLTP, sLTP_Q15, k,
539
1.31M
                                           LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType, decisionDelay);
540
541
1.31M
        silk_noise_shape_quantizer_del_dec_avx2(NSQ, &psDelDec, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15,
542
1.31M
                                                delayedGain_Q10, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[k], LF_shp_Q14[k],
543
1.31M
                                                Gains_Q16[k], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder,
544
1.31M
                                                psEncC->predictLPCOrder, psEncC->warping_Q16, MaskDelDec, &smpl_buf_idx, decisionDelay);
545
546
1.31M
        x16 += psEncC->subfr_length;
547
1.31M
        pulses += psEncC->subfr_length;
548
1.31M
        pxq += psEncC->subfr_length;
549
1.31M
    }
550
551
    /* Find winner */
552
372k
    RDmin_Q10 = silk_mm_mask_hmin_epi32(psDelDec.RD_Q10, MaskDelDec);
553
372k
    Winner_selector = silk_index_to_selector(silk_index_of_first_equal_epi32(RDmin_Q10, psDelDec.RD_Q10));
554
555
    /* Copy final part of signals from winner state to output and long-term filter states */
556
372k
    psIndices->Seed = silk_select_winner(psDelDec.SeedInit, Winner_selector);
557
372k
    last_smple_idx = smpl_buf_idx + decisionDelay;
558
372k
    Gain_Q10 = Gains_Q16[psEncC->nb_subfr - 1] >> 6;
559
14.1M
    for (i = 0; i < decisionDelay; i++)
560
13.7M
    {
561
13.7M
        last_smple_idx = (last_smple_idx + DECISION_DELAY - 1) % DECISION_DELAY;
562
13.7M
        psSample = &psDelDec.Samples[last_smple_idx];
563
564
13.7M
        pulses[i - decisionDelay] =
565
13.7M
            (opus_int8)silk_sar_round_32(silk_select_winner(psSample->Q_Q10, Winner_selector), 10);
566
13.7M
        pxq[i - decisionDelay] =
567
13.7M
            silk_sat16((opus_int32)silk_sar_round_smulww(silk_select_winner(psSample->Xq_Q14, Winner_selector), Gain_Q10, 8));
568
13.7M
        NSQ->sLTP_shp_Q14[NSQ->sLTP_shp_buf_idx - decisionDelay + i] =
569
13.7M
            silk_select_winner(psSample->Shape_Q14, Winner_selector);
570
13.7M
    }
571
6.33M
    for (i = 0; i < NSQ_LPC_BUF_LENGTH; i++)
572
5.96M
    {
573
5.96M
        NSQ->sLPC_Q14[i] = silk_select_winner(psDelDec.sLPC_Q14[i], Winner_selector);
574
5.96M
    }
575
9.31M
    for (i = 0; i < MAX_SHAPE_LPC_ORDER; i++)
576
8.94M
    {
577
8.94M
        NSQ->sAR2_Q14[i] = silk_select_winner(psDelDec.sAR2_Q14[i], Winner_selector);
578
8.94M
    }
579
580
    /* Update states */
581
372k
    NSQ->sLF_AR_shp_Q14 = silk_select_winner(psDelDec.LF_AR_Q14, Winner_selector);
582
372k
    NSQ->sDiff_shp_Q14 = silk_select_winner(psDelDec.Diff_Q14, Winner_selector);
583
372k
    NSQ->lagPrev = pitchL[psEncC->nb_subfr - 1];
584
585
    /* Save quantized speech signal */
586
372k
    silk_memmove(NSQ->xq, &NSQ->xq[psEncC->frame_length], psEncC->ltp_mem_length * sizeof(opus_int16));
587
372k
    silk_memmove(NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[psEncC->frame_length], psEncC->ltp_mem_length * sizeof(opus_int32));
588
589
#ifdef OPUS_CHECK_ASM
590
    silk_assert(!memcmp(&NSQ_c, NSQ, sizeof(NSQ_c)));
591
    silk_assert(!memcmp(&psIndices_c, psIndices, sizeof(psIndices_c)));
592
    silk_assert(!memcmp(pulses_c, pulses_a, sizeof(pulses_c)));
593
#endif
594
595
372k
    RESTORE_STACK;
596
372k
}
597
598
static OPUS_INLINE __m128i silk_noise_shape_quantizer_short_prediction_x4(const __m128i *buf32, const opus_int16 *coef16, opus_int order)
599
142M
{
600
142M
    __m256i out;
601
142M
    silk_assert(order == 10 || order == 16);
602
603
    /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */
604
142M
    out = _mm256_set1_epi32(order >> 1);
605
142M
    out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-0]), _mm256_set1_epi32(silk_LSHIFT(coef16[0], 16)))); /* High DWORD */
606
142M
    out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-1]), _mm256_set1_epi32(silk_LSHIFT(coef16[1], 16)))); /* High DWORD */
607
142M
    out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-2]), _mm256_set1_epi32(silk_LSHIFT(coef16[2], 16)))); /* High DWORD */
608
142M
    out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-3]), _mm256_set1_epi32(silk_LSHIFT(coef16[3], 16)))); /* High DWORD */
609
142M
    out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-4]), _mm256_set1_epi32(silk_LSHIFT(coef16[4], 16)))); /* High DWORD */
610
142M
    out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-5]), _mm256_set1_epi32(silk_LSHIFT(coef16[5], 16)))); /* High DWORD */
611
142M
    out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-6]), _mm256_set1_epi32(silk_LSHIFT(coef16[6], 16)))); /* High DWORD */
612
142M
    out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-7]), _mm256_set1_epi32(silk_LSHIFT(coef16[7], 16)))); /* High DWORD */
613
142M
    out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-8]), _mm256_set1_epi32(silk_LSHIFT(coef16[8], 16)))); /* High DWORD */
614
142M
    out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-9]), _mm256_set1_epi32(silk_LSHIFT(coef16[9], 16)))); /* High DWORD */
615
616
142M
    if (order == 16)
617
56.2M
    {
618
56.2M
        out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-10]), _mm256_set1_epi32(silk_LSHIFT(coef16[10], 16)))); /* High DWORD */
619
56.2M
        out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-11]), _mm256_set1_epi32(silk_LSHIFT(coef16[11], 16)))); /* High DWORD */
620
56.2M
        out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-12]), _mm256_set1_epi32(silk_LSHIFT(coef16[12], 16)))); /* High DWORD */
621
56.2M
        out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-13]), _mm256_set1_epi32(silk_LSHIFT(coef16[13], 16)))); /* High DWORD */
622
56.2M
        out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-14]), _mm256_set1_epi32(silk_LSHIFT(coef16[14], 16)))); /* High DWORD */
623
56.2M
        out = _mm256_add_epi32(out, _mm256_mul_epi32(_mm256_cvtepi32_epi64(buf32[-15]), _mm256_set1_epi32(silk_LSHIFT(coef16[15], 16)))); /* High DWORD */
624
56.2M
    }
625
142M
    return silk_cvtepi64_epi32_high(out);
626
142M
}
627
628
/******************************************/
629
/* Noise shape quantizer for one subframe */
630
/******************************************/
631
static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_avx2(
632
    silk_nsq_state *NSQ,                        /* I/O  NSQ state                          */
633
    NSQ_del_dec_struct *psDelDec,               /* I/O  Delayed decision states            */
634
    opus_int signalType,                        /* I    Signal type                        */
635
    const opus_int32 x_Q10[],                   /* I                                       */
636
    opus_int8 pulses[],                         /* O                                       */
637
    opus_int16 xq[],                            /* O                                       */
638
    opus_int32 sLTP_Q15[],                      /* I/O  LTP filter state                   */
639
    opus_int32 delayedGain_Q10[DECISION_DELAY], /* I/O  Gain delay buffer                  */
640
    const opus_int16 a_Q12[],                   /* I    Short term prediction coefs        */
641
    const opus_int16 b_Q14[],                   /* I    Long term prediction coefs         */
642
    const opus_int16 AR_shp_Q13[],              /* I    Noise shaping coefs                */
643
    opus_int lag,                               /* I    Pitch lag                          */
644
    opus_int32 HarmShapeFIRPacked_Q14,          /* I                                       */
645
    opus_int Tilt_Q14,                          /* I    Spectral tilt                      */
646
    opus_int32 LF_shp_Q14,                      /* I                                       */
647
    opus_int32 Gain_Q16,                        /* I                                       */
648
    opus_int Lambda_Q10,                        /* I                                       */
649
    opus_int offset_Q10,                        /* I                                       */
650
    opus_int length,                            /* I    Input length                       */
651
    opus_int subfr,                             /* I    Subframe number                    */
652
    opus_int shapingLPCOrder,                   /* I    Shaping LPC filter order           */
653
    opus_int predictLPCOrder,                   /* I    Prediction filter order            */
654
    opus_int warping_Q16,                       /* I                                       */
655
    __m128i MaskDelDec,                         /* I    Mask of states in decision tree    */
656
    opus_int *smpl_buf_idx,                     /* I/O  Index to newest samples in buffers */
657
    opus_int decisionDelay                      /* I                                       */
658
)
659
2.72M
{
660
2.72M
    int i;
661
2.72M
    opus_int32 *shp_lag_ptr = &NSQ->sLTP_shp_Q14[NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2];
662
2.72M
    opus_int32 *pred_lag_ptr = &sLTP_Q15[NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2];
663
2.72M
    opus_int32 Gain_Q10 = Gain_Q16 >> 6;
664
665
145M
    for (i = 0; i < length; i++)
666
142M
    {
667
        /* Perform common calculations used in all states */
668
        /* NSQ_sample_struct */
669
        /* Low  128 bits => 1st set */
670
        /* High 128 bits => 2nd set */
671
142M
        int j;
672
142M
        __m256i SS_Q_Q10;
673
142M
        __m256i SS_RD_Q10;
674
142M
        __m256i SS_xq_Q14;
675
142M
        __m256i SS_LF_AR_Q14;
676
142M
        __m256i SS_Diff_Q14;
677
142M
        __m256i SS_sLTP_shp_Q14;
678
142M
        __m256i SS_LPC_exc_Q14;
679
142M
        __m256i exc_Q14;
680
142M
        __m256i q_Q10, rr_Q10, rd_Q10;
681
142M
        __m256i mask;
682
142M
        __m128i LPC_pred_Q14, n_AR_Q14;
683
142M
        __m128i RDmin_Q10, RDmax_Q10;
684
142M
        __m128i n_LF_Q14;
685
142M
        __m128i r_Q10, q1_Q0, q1_Q10, q2_Q10;
686
142M
        __m128i Winner_rand_state, Winner_selector;
687
142M
        __m128i tmp0, tmp1;
688
142M
        NSQ_del_dec_sample_struct *psLastSample, *psSample;
689
142M
        opus_int32 RDmin_ind, RDmax_ind, last_smple_idx;
690
142M
        opus_int32 LTP_pred_Q14, n_LTP_Q14;
691
692
        /* Long-term prediction */
693
142M
        if (signalType == TYPE_VOICED)
694
31.8M
        {
695
            /* Unrolled loop */
696
            /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */
697
31.8M
            LTP_pred_Q14 = 2;
698
31.8M
            LTP_pred_Q14 += silk_SMULWB(pred_lag_ptr[-0], b_Q14[0]);
699
31.8M
            LTP_pred_Q14 += silk_SMULWB(pred_lag_ptr[-1], b_Q14[1]);
700
31.8M
            LTP_pred_Q14 += silk_SMULWB(pred_lag_ptr[-2], b_Q14[2]);
701
31.8M
            LTP_pred_Q14 += silk_SMULWB(pred_lag_ptr[-3], b_Q14[3]);
702
31.8M
            LTP_pred_Q14 += silk_SMULWB(pred_lag_ptr[-4], b_Q14[4]);
703
31.8M
            LTP_pred_Q14 = silk_LSHIFT(LTP_pred_Q14, 1); /* Q13 -> Q14 */
704
31.8M
            pred_lag_ptr++;
705
31.8M
        }
706
110M
        else
707
110M
        {
708
110M
            LTP_pred_Q14 = 0;
709
110M
        }
710
711
        /* Long-term shaping */
712
142M
        if (lag > 0)
713
87.1M
        {
714
            /* Symmetric, packed FIR coefficients */
715
87.1M
            n_LTP_Q14 = silk_add_sat32(shp_lag_ptr[0], shp_lag_ptr[-2]);
716
87.1M
            n_LTP_Q14 = silk_SMULWB(n_LTP_Q14, HarmShapeFIRPacked_Q14);
717
87.1M
            n_LTP_Q14 = n_LTP_Q14 + silk_SMULWT(shp_lag_ptr[-1], HarmShapeFIRPacked_Q14);
718
87.1M
            n_LTP_Q14 = LTP_pred_Q14 - (silk_LSHIFT(n_LTP_Q14, 2)); /* Q12 -> Q14 */
719
87.1M
            shp_lag_ptr++;
720
87.1M
        }
721
55.3M
        else
722
55.3M
        {
723
55.3M
            n_LTP_Q14 = 0;
724
55.3M
        }
725
726
        /* BEGIN Updating Delayed Decision States */
727
728
        /* Generate dither */
729
142M
        psDelDec->Seed = silk_mm256_rand_epi32(psDelDec->Seed);
730
731
        /* Short-term prediction */
732
142M
        LPC_pred_Q14 = silk_noise_shape_quantizer_short_prediction_x4(&psDelDec->sLPC_Q14[NSQ_LPC_BUF_LENGTH - 1 + i], a_Q12, predictLPCOrder);
733
142M
        LPC_pred_Q14 = _mm_slli_epi32(LPC_pred_Q14, 4); /* Q10 -> Q14 */
734
735
        /* Noise shape feedback */
736
142M
        silk_assert(shapingLPCOrder > 0);
737
142M
        silk_assert((shapingLPCOrder & 1) == 0); /* check that order is even */
738
        /* Output of lowpass section */
739
142M
        tmp0 = _mm_add_epi32(psDelDec->Diff_Q14, silk_mm_smulwb_epi32(psDelDec->sAR2_Q14[0], warping_Q16));
740
142M
        n_AR_Q14 = _mm_set1_epi32(shapingLPCOrder >> 1);
741
3.25G
        for (j = 0; j < shapingLPCOrder - 1; j++)
742
3.10G
        {
743
            /* Output of allpass section */
744
3.10G
            tmp1 = psDelDec->sAR2_Q14[j];
745
3.10G
            psDelDec->sAR2_Q14[j] = tmp0;
746
3.10G
            n_AR_Q14 = _mm_add_epi32(n_AR_Q14, silk_mm_smulwb_epi32(tmp0, AR_shp_Q13[j]));
747
3.10G
            tmp0 = _mm_add_epi32(tmp1, silk_mm_smulwb_epi32(_mm_sub_epi32(psDelDec->sAR2_Q14[j + 1], tmp0), warping_Q16));
748
3.10G
        }
749
142M
        psDelDec->sAR2_Q14[shapingLPCOrder - 1] = tmp0;
750
142M
        n_AR_Q14 = _mm_add_epi32(n_AR_Q14, silk_mm_smulwb_epi32(tmp0, AR_shp_Q13[shapingLPCOrder - 1]));
751
752
142M
        n_AR_Q14 = _mm_slli_epi32(n_AR_Q14, 1);                                                  /* Q11 -> Q12 */
753
142M
        n_AR_Q14 = _mm_add_epi32(n_AR_Q14, silk_mm_smulwb_epi32(psDelDec->LF_AR_Q14, Tilt_Q14)); /* Q12 */
754
142M
        n_AR_Q14 = _mm_slli_epi32(n_AR_Q14, 2);                                                  /* Q12 -> Q14 */
755
756
142M
        tmp0 = silk_mm_smulwb_epi32(psDelDec->Samples[*smpl_buf_idx].Shape_Q14, LF_shp_Q14); /* Q12 */
757
142M
        tmp1 = silk_mm_smulwb_epi32(psDelDec->LF_AR_Q14, LF_shp_Q14 >> 16);                  /* Q12 */
758
142M
        n_LF_Q14 = _mm_add_epi32(tmp0, tmp1);                                                /* Q12 */
759
142M
        n_LF_Q14 = _mm_slli_epi32(n_LF_Q14, 2);                                              /* Q12 -> Q14 */
760
761
        /* Input minus prediction plus noise feedback                       */
762
        /* r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP  */
763
142M
        tmp0 = silk_mm_add_sat_epi32(n_AR_Q14, n_LF_Q14);              /* Q14 */
764
142M
        tmp1 = _mm_add_epi32(_mm_set1_epi32(n_LTP_Q14), LPC_pred_Q14); /* Q13 */
765
142M
        tmp0 = silk_mm_sub_sat_epi32(tmp1, tmp0);                      /* Q13 */
766
142M
        tmp0 = silk_mm_srai_round_epi32(tmp0, 4);                      /* Q10 */
767
768
142M
        r_Q10 = _mm_sub_epi32(_mm_set1_epi32(x_Q10[i]), tmp0); /* residual error Q10 */
769
770
        /* Flip sign depending on dither */
771
142M
        r_Q10 = silk_mm_sign_epi32(r_Q10, psDelDec->Seed);
772
142M
        r_Q10 = silk_mm_limit_epi32(r_Q10, -(31 << 10), 30 << 10);
773
774
        /* Find two quantization level candidates and measure their rate-distortion */
775
142M
        q1_Q10 = _mm_sub_epi32(r_Q10, _mm_set1_epi32(offset_Q10));
776
142M
        q1_Q0 = _mm_srai_epi32(q1_Q10, 10);
777
142M
        if (Lambda_Q10 > 2048)
778
9.38M
        {
779
            /* For aggressive RDO, the bias becomes more than one pulse. */
780
9.38M
            tmp0 = _mm_sub_epi32(_mm_abs_epi32(q1_Q10), _mm_set1_epi32(Lambda_Q10 / 2 - 512)); /* rdo_offset */
781
9.38M
            q1_Q0 = _mm_srai_epi32(q1_Q10, 31);
782
9.38M
            tmp1 = _mm_cmpgt_epi32(tmp0, _mm_setzero_si128());
783
9.38M
            tmp0 = _mm_srai_epi32(silk_mm_sign_epi32(tmp0, q1_Q10), 10);
784
9.38M
            q1_Q0 = _mm_blendv_epi8(q1_Q0, tmp0, tmp1);
785
9.38M
        }
786
787
142M
        tmp0 = _mm_sign_epi32(_mm_set1_epi32(QUANT_LEVEL_ADJUST_Q10), q1_Q0);
788
142M
        q1_Q10 = _mm_sub_epi32(_mm_slli_epi32(q1_Q0, 10), tmp0);
789
142M
        q1_Q10 = _mm_add_epi32(q1_Q10, _mm_set1_epi32(offset_Q10));
790
791
        /* check if q1_Q0 is 0 or -1 */
792
142M
        tmp0 = _mm_add_epi32(_mm_srli_epi32(q1_Q0, 31), q1_Q0);
793
142M
        tmp1 = _mm_cmpeq_epi32(tmp0, _mm_setzero_si128());
794
142M
        tmp0 = _mm_blendv_epi8(_mm_set1_epi32(1024), _mm_set1_epi32(1024 - QUANT_LEVEL_ADJUST_Q10), tmp1);
795
142M
        q2_Q10 = _mm_add_epi32(q1_Q10, tmp0);
796
142M
        q_Q10 = _mm256_set_m128i(q2_Q10, q1_Q10);
797
798
142M
        rr_Q10 = _mm256_sub_epi32(_mm256_broadcastsi128_si256(r_Q10), q_Q10);
799
142M
        rd_Q10 = _mm256_abs_epi32(q_Q10);
800
142M
        rr_Q10 = silk_mm256_smulbb_epi32(rr_Q10, rr_Q10);
801
142M
        rd_Q10 = silk_mm256_smulbb_epi32(rd_Q10, _mm256_set1_epi32(Lambda_Q10));
802
142M
        rd_Q10 = _mm256_add_epi32(rd_Q10, rr_Q10);
803
142M
        rd_Q10 = _mm256_srai_epi32(rd_Q10, 10);
804
805
142M
        mask = _mm256_broadcastsi128_si256(_mm_cmplt_epi32(_mm256_extracti128_si256(rd_Q10, 0), _mm256_extracti128_si256(rd_Q10, 1)));
806
142M
        SS_RD_Q10 = _mm256_add_epi32(
807
142M
            _mm256_broadcastsi128_si256(psDelDec->RD_Q10),
808
142M
            _mm256_blendv_epi8(
809
142M
                _mm256_permute2x128_si256(rd_Q10, rd_Q10, 0x1),
810
142M
                rd_Q10,
811
142M
                mask));
812
142M
        SS_Q_Q10 = _mm256_blendv_epi8(
813
142M
            _mm256_permute2x128_si256(q_Q10, q_Q10, 0x1),
814
142M
            q_Q10,
815
142M
            mask);
816
817
        /* Update states for best and second best quantization */
818
819
        /* Quantized excitation */
820
142M
        exc_Q14 = silk_mm256_sign_epi32(_mm256_slli_epi32(SS_Q_Q10, 4), _mm256_broadcastsi128_si256(psDelDec->Seed));
821
822
        /* Add predictions */
823
142M
        exc_Q14 = _mm256_add_epi32(exc_Q14, _mm256_set1_epi32(LTP_pred_Q14));
824
142M
        SS_LPC_exc_Q14 = _mm256_slli_epi32(exc_Q14, 1);
825
142M
        SS_xq_Q14 = _mm256_add_epi32(exc_Q14, _mm256_broadcastsi128_si256(LPC_pred_Q14));
826
827
        /* Update states */
828
142M
        SS_Diff_Q14 = _mm256_sub_epi32(SS_xq_Q14, _mm256_set1_epi32(silk_LSHIFT(x_Q10[i], 4)));
829
142M
        SS_LF_AR_Q14 = _mm256_sub_epi32(SS_Diff_Q14, _mm256_broadcastsi128_si256(n_AR_Q14));
830
142M
        SS_sLTP_shp_Q14 = silk_mm256_sub_sat_epi32(SS_LF_AR_Q14, _mm256_broadcastsi128_si256(n_LF_Q14));
831
832
        /* END Updating Delayed Decision States */
833
834
142M
        *smpl_buf_idx = (*smpl_buf_idx + DECISION_DELAY - 1) % DECISION_DELAY;
835
142M
        last_smple_idx = (*smpl_buf_idx + decisionDelay) % DECISION_DELAY;
836
142M
        psLastSample = &psDelDec->Samples[last_smple_idx];
837
838
        /* Find winner */
839
142M
        RDmin_Q10 = silk_mm_mask_hmin_epi32(_mm256_castsi256_si128(SS_RD_Q10), MaskDelDec);
840
142M
        Winner_selector = silk_index_to_selector(silk_index_of_first_equal_epi32(RDmin_Q10, _mm256_castsi256_si128(SS_RD_Q10)));
841
842
        /* Increase RD values of expired states */
843
142M
        Winner_rand_state = _mm_shuffle_epi8(psLastSample->RandState, Winner_selector);
844
845
142M
        SS_RD_Q10 = _mm256_blendv_epi8(
846
142M
            _mm256_add_epi32(SS_RD_Q10, _mm256_set1_epi32(silk_int32_MAX >> 4)),
847
142M
            SS_RD_Q10,
848
142M
            _mm256_broadcastsi128_si256(_mm_cmpeq_epi32(psLastSample->RandState, Winner_rand_state)));
849
850
        /* find worst in first set */
851
142M
        RDmax_Q10 = silk_mm_mask_hmax_epi32(_mm256_extracti128_si256(SS_RD_Q10, 0), MaskDelDec);
852
        /* find best in second set */
853
142M
        RDmin_Q10 = silk_mm_mask_hmin_epi32(_mm256_extracti128_si256(SS_RD_Q10, 1), MaskDelDec);
854
855
        /* Replace a state if best from second set outperforms worst in first set */
856
142M
        tmp0 = _mm_cmplt_epi32(RDmin_Q10, RDmax_Q10);
857
142M
        if (!_mm_test_all_zeros(tmp0, tmp0))
858
75.9M
        {
859
75.9M
            int t;
860
75.9M
            RDmax_ind = silk_index_of_first_equal_epi32(RDmax_Q10, _mm256_extracti128_si256(SS_RD_Q10, 0));
861
75.9M
            RDmin_ind = silk_index_of_first_equal_epi32(RDmin_Q10, _mm256_extracti128_si256(SS_RD_Q10, 1));
862
75.9M
            tmp1 = _mm_cvtepi8_epi32(_mm_cvtsi32_si128(0xFFU << (unsigned)(RDmax_ind << 3)));
863
75.9M
            tmp0 = _mm_blendv_epi8(
864
75.9M
                _mm_set_epi8(0xF, 0xE, 0xD, 0xC, 0xB, 0xA, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0),
865
75.9M
                silk_index_to_selector(RDmin_ind),
866
75.9M
                tmp1);
867
5.10G
            for (t = i; t < MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH; t++)
868
5.02G
            {
869
5.02G
                psDelDec->sLPC_Q14[t] = _mm_shuffle_epi8(psDelDec->sLPC_Q14[t], tmp0);
870
5.02G
            }
871
75.9M
            psDelDec->Seed = _mm_shuffle_epi8(psDelDec->Seed, tmp0);
872
75.9M
            psDelDec->SeedInit = _mm_shuffle_epi8(psDelDec->SeedInit, tmp0);
873
1.89G
            for (t = 0; t < MAX_SHAPE_LPC_ORDER; t++)
874
1.82G
            {
875
1.82G
                psDelDec->sAR2_Q14[t] = _mm_shuffle_epi8(psDelDec->sAR2_Q14[t], tmp0);
876
1.82G
            }
877
3.11G
            for (t = 0; t < DECISION_DELAY; t++)
878
3.03G
            {
879
3.03G
                psDelDec->Samples[t].RandState = _mm_shuffle_epi8(psDelDec->Samples[t].RandState, tmp0);
880
3.03G
                psDelDec->Samples[t].Q_Q10 = _mm_shuffle_epi8(psDelDec->Samples[t].Q_Q10, tmp0);
881
3.03G
                psDelDec->Samples[t].Xq_Q14 = _mm_shuffle_epi8(psDelDec->Samples[t].Xq_Q14, tmp0);
882
3.03G
                psDelDec->Samples[t].Pred_Q15 = _mm_shuffle_epi8(psDelDec->Samples[t].Pred_Q15, tmp0);
883
3.03G
                psDelDec->Samples[t].Shape_Q14 = _mm_shuffle_epi8(psDelDec->Samples[t].Shape_Q14, tmp0);
884
3.03G
            }
885
75.9M
            mask = _mm256_castsi128_si256(_mm_blendv_epi8(_mm_set_epi32(0x3, 0x2, 0x1, 0x0), _mm_set1_epi32(RDmin_ind + 4), tmp1));
886
75.9M
            SS_Q_Q10 = _mm256_permutevar8x32_epi32(SS_Q_Q10, mask);
887
75.9M
            SS_RD_Q10 = _mm256_permutevar8x32_epi32(SS_RD_Q10, mask);
888
75.9M
            SS_xq_Q14 = _mm256_permutevar8x32_epi32(SS_xq_Q14, mask);
889
75.9M
            SS_LF_AR_Q14 = _mm256_permutevar8x32_epi32(SS_LF_AR_Q14, mask);
890
75.9M
            SS_Diff_Q14 = _mm256_permutevar8x32_epi32(SS_Diff_Q14, mask);
891
75.9M
            SS_sLTP_shp_Q14 = _mm256_permutevar8x32_epi32(SS_sLTP_shp_Q14, mask);
892
75.9M
            SS_LPC_exc_Q14 = _mm256_permutevar8x32_epi32(SS_LPC_exc_Q14, mask);
893
75.9M
        }
894
895
        /* Write samples from winner to output and long-term filter states */
896
142M
        if (subfr > 0 || i >= decisionDelay)
897
112M
        {
898
112M
            pulses[i - decisionDelay] =
899
112M
                (opus_int8)silk_sar_round_32(silk_select_winner(psLastSample->Q_Q10, Winner_selector), 10);
900
112M
            xq[i - decisionDelay] =
901
112M
                silk_sat16((opus_int32)silk_sar_round_smulww(silk_select_winner(psLastSample->Xq_Q14, Winner_selector), delayedGain_Q10[last_smple_idx], 8));
902
112M
            NSQ->sLTP_shp_Q14[NSQ->sLTP_shp_buf_idx - decisionDelay] =
903
112M
                silk_select_winner(psLastSample->Shape_Q14, Winner_selector);
904
112M
            sLTP_Q15[NSQ->sLTP_buf_idx - decisionDelay] =
905
112M
                silk_select_winner(psLastSample->Pred_Q15, Winner_selector);
906
112M
        }
907
142M
        NSQ->sLTP_shp_buf_idx++;
908
142M
        NSQ->sLTP_buf_idx++;
909
910
        /* Update states */
911
142M
        psSample = &psDelDec->Samples[*smpl_buf_idx];
912
142M
        psDelDec->Seed = _mm_add_epi32(psDelDec->Seed, silk_mm_srai_round_epi32(_mm256_castsi256_si128(SS_Q_Q10), 10));
913
142M
        psDelDec->LF_AR_Q14 = _mm256_castsi256_si128(SS_LF_AR_Q14);
914
142M
        psDelDec->Diff_Q14 = _mm256_castsi256_si128(SS_Diff_Q14);
915
142M
        psDelDec->sLPC_Q14[i + NSQ_LPC_BUF_LENGTH] = _mm256_castsi256_si128(SS_xq_Q14);
916
142M
        psDelDec->RD_Q10 = _mm256_castsi256_si128(SS_RD_Q10);
917
142M
        psSample->Xq_Q14 = _mm256_castsi256_si128(SS_xq_Q14);
918
142M
        psSample->Q_Q10 = _mm256_castsi256_si128(SS_Q_Q10);
919
142M
        psSample->Pred_Q15 = _mm256_castsi256_si128(SS_LPC_exc_Q14);
920
142M
        psSample->Shape_Q14 = _mm256_castsi256_si128(SS_sLTP_shp_Q14);
921
142M
        psSample->RandState = psDelDec->Seed;
922
142M
        delayedGain_Q10[*smpl_buf_idx] = Gain_Q10;
923
142M
    }
924
    /* Update LPC states */
925
46.3M
    for (i = 0; i < NSQ_LPC_BUF_LENGTH; i++)
926
43.6M
    {
927
43.6M
        psDelDec->sLPC_Q14[i] = (&psDelDec->sLPC_Q14[length])[i];
928
43.6M
    }
929
2.72M
}
930
931
static OPUS_INLINE void silk_nsq_del_dec_scale_states_avx2(
932
    const silk_encoder_state *psEncC,          /* I    Encoder State                   */
933
    silk_nsq_state *NSQ,                       /* I/O  NSQ state                       */
934
    NSQ_del_dec_struct *psDelDec,              /* I/O  Delayed decision states         */
935
    const opus_int16 x16[],                    /* I    Input                           */
936
    opus_int32 x_sc_Q10[MAX_SUB_FRAME_LENGTH], /* O    Input scaled with 1/Gain in Q10 */
937
    const opus_int16 sLTP[],                   /* I    Re-whitened LTP state in Q0     */
938
    opus_int32 sLTP_Q15[],                     /* O    LTP state matching scaled input */
939
    opus_int subfr,                            /* I    Subframe number                 */
940
    const opus_int LTP_scale_Q14,              /* I    LTP state scaling               */
941
    const opus_int32 Gains_Q16[MAX_NB_SUBFR],  /* I                                    */
942
    const opus_int pitchL[MAX_NB_SUBFR],       /* I    Pitch lag                       */
943
    const opus_int signal_type,                /* I    Signal type                     */
944
    const opus_int decisionDelay               /* I    Decision delay                  */
945
)
946
2.72M
{
947
2.72M
    int i;
948
2.72M
    opus_int lag;
949
2.72M
    opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q26;
950
2.72M
    NSQ_del_dec_sample_struct *psSample;
951
952
2.72M
    lag = pitchL[subfr];
953
2.72M
    inv_gain_Q31 = silk_INVERSE32_varQ(silk_max(Gains_Q16[subfr], 1), 47);
954
2.72M
    silk_assert(inv_gain_Q31 != 0);
955
956
    /* Scale input */
957
2.72M
    inv_gain_Q26 = silk_sar_round_32(inv_gain_Q31, 5);
958
38.3M
    for (i = 0; i < psEncC->subfr_length; i+=4)
959
35.6M
    {
960
35.6M
        __m256i x = _mm256_cvtepi16_epi64(_mm_loadu_si64(&x16[i]));
961
35.6M
        x = _mm256_slli_epi64(_mm256_mul_epi32(x, _mm256_set1_epi32(inv_gain_Q26)), 16);
962
35.6M
        _mm_storeu_si128((__m128i*)&x_sc_Q10[i], silk_cvtepi64_epi32_high(x));
963
35.6M
    }
964
965
    /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */
966
2.72M
    if (NSQ->rewhite_flag)
967
207k
    {
968
207k
        if (subfr == 0)
969
152k
        {
970
            /* Do LTP downscaling */
971
152k
            inv_gain_Q31 = silk_LSHIFT(silk_SMULWB(inv_gain_Q31, LTP_scale_Q14), 2);
972
152k
        }
973
12.2M
        for (i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++)
974
12.0M
        {
975
12.0M
            silk_assert(i < MAX_FRAME_LENGTH);
976
12.0M
            sLTP_Q15[i] = silk_SMULWB(inv_gain_Q31, sLTP[i]);
977
12.0M
        }
978
207k
    }
979
980
    /* Adjust for changing gain */
981
2.72M
    if (Gains_Q16[subfr] != NSQ->prev_gain_Q16)
982
2.27M
    {
983
2.27M
        gain_adj_Q16 = silk_DIV32_varQ(NSQ->prev_gain_Q16, Gains_Q16[subfr], 16);
984
985
        /* Scale long-term shaping state */
986
120M
        for (i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx; i+=4)
987
117M
        {
988
117M
      opus_int32 *p = &NSQ->sLTP_shp_Q14[i];
989
117M
            _mm_storeu_si128((__m128i*)p, silk_mm_smulww_epi32(_mm_loadu_si128((__m128i*)p), gain_adj_Q16));
990
117M
        }
991
992
        /* Scale long-term prediction state */
993
2.27M
        if (signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0)
994
314k
        {
995
9.53M
            for (i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx - decisionDelay; i++)
996
9.21M
            {
997
9.21M
                sLTP_Q15[i] = ((opus_int64)sLTP_Q15[i]) * ((opus_int64)gain_adj_Q16) >> 16;
998
9.21M
            }
999
314k
        }
1000
1001
        /* Scale scalar states */
1002
2.27M
        psDelDec->LF_AR_Q14 = silk_mm_smulww_epi32(psDelDec->LF_AR_Q14, gain_adj_Q16);
1003
2.27M
        psDelDec->Diff_Q14 = silk_mm_smulww_epi32(psDelDec->Diff_Q14, gain_adj_Q16);
1004
1005
        /* Scale short-term prediction and shaping states */
1006
38.6M
        for (i = 0; i < NSQ_LPC_BUF_LENGTH; i++)
1007
36.3M
        {
1008
36.3M
            psDelDec->sLPC_Q14[i] = silk_mm_smulww_epi32(psDelDec->sLPC_Q14[i], gain_adj_Q16);
1009
36.3M
        }
1010
93.1M
        for (i = 0; i < DECISION_DELAY; i++)
1011
90.9M
        {
1012
90.9M
            psSample = &psDelDec->Samples[i];
1013
90.9M
            psSample->Pred_Q15 = silk_mm_smulww_epi32(psSample->Pred_Q15, gain_adj_Q16);
1014
90.9M
            psSample->Shape_Q14 = silk_mm_smulww_epi32(psSample->Shape_Q14, gain_adj_Q16);
1015
90.9M
        }
1016
56.8M
        for (i = 0; i < MAX_SHAPE_LPC_ORDER; i++)
1017
54.5M
        {
1018
54.5M
            psDelDec->sAR2_Q14[i] = silk_mm_smulww_epi32(psDelDec->sAR2_Q14[i], gain_adj_Q16);
1019
54.5M
        }
1020
1021
        /* Save inverse gain */
1022
2.27M
        NSQ->prev_gain_Q16 = Gains_Q16[subfr];
1023
2.27M
    }
1024
2.72M
}
1025
1026
static OPUS_INLINE void silk_LPC_analysis_filter_avx2(
1027
    opus_int16                  *out,               /* O    Output signal                           */
1028
    const opus_int16            *in,                /* I    Input signal                            */
1029
    const opus_int16            *B,                 /* I    MA prediction coefficients, Q12 [order] */
1030
    const opus_int32            len,                /* I    Signal length                           */
1031
    const opus_int32            order               /* I    Filter order                            */
1032
)
1033
207k
{
1034
207k
    int i;
1035
207k
    opus_int32       out32_Q12, out32;
1036
207k
    silk_assert(order == 10 || order == 16);
1037
1038
12.2M
    for(i = order; i < len; i++ )
1039
12.0M
    {
1040
12.0M
        const opus_int16 *in_ptr = &in[ i ];
1041
        /* Allowing wrap around so that two wraps can cancel each other. The rare
1042
           cases where the result wraps around can only be triggered by invalid streams*/
1043
1044
12.0M
        __m256i in_v = _mm256_cvtepi16_epi32(_mm_loadu_si128((__m128i*)&in_ptr[-8]));
1045
12.0M
        __m256i B_v  = _mm256_cvtepi16_epi32(_mm_loadu_si128((__m128i*)&      B[0]));
1046
12.0M
        __m256i sum = _mm256_mullo_epi32(in_v, silk_mm256_reverse_epi32(B_v));
1047
12.0M
        if (order > 10)
1048
4.12M
        {
1049
4.12M
            in_v = _mm256_cvtepi16_epi32(_mm_loadu_si128((__m128i*)&in_ptr[-16]));
1050
4.12M
            B_v  = _mm256_cvtepi16_epi32(_mm_loadu_si128((__m128i*)&B       [8]));
1051
4.12M
            B_v  = silk_mm256_reverse_epi32(B_v);
1052
4.12M
        }
1053
7.94M
        else
1054
7.94M
        {
1055
7.94M
            in_v = _mm256_cvtepi16_epi32(_mm_loadu_si32(&in_ptr[-10]));
1056
7.94M
            B_v  = _mm256_cvtepi16_epi32(_mm_loadu_si32(&B       [8]));
1057
7.94M
            B_v  = _mm256_shuffle_epi32(B_v, 0x01);
1058
7.94M
        }
1059
12.0M
        sum = _mm256_add_epi32(sum, _mm256_mullo_epi32(in_v, B_v));
1060
1061
12.0M
        out32_Q12 = silk_mm256_hsum_epi32(sum);
1062
1063
        /* Subtract prediction */
1064
12.0M
        out32_Q12 = silk_SUB32_ovflw( silk_LSHIFT( (opus_int32)*in_ptr, 12 ), out32_Q12 );
1065
1066
        /* Scale to Q0 */
1067
12.0M
        out32 = silk_sar_round_32(out32_Q12, 12);
1068
1069
        /* Saturate output */
1070
12.0M
        out[ i ] = silk_sat16(out32);
1071
12.0M
    }
1072
1073
    /* Set first d output samples to zero */
1074
207k
    silk_memset( out, 0, order * sizeof( opus_int16 ) );
1075
207k
}