1*600f14f4SXin Li /* libFLAC - Free Lossless Audio Codec library
2*600f14f4SXin Li * Copyright (C) 2000-2009 Josh Coalson
3*600f14f4SXin Li * Copyright (C) 2011-2023 Xiph.Org Foundation
4*600f14f4SXin Li *
5*600f14f4SXin Li * Redistribution and use in source and binary forms, with or without
6*600f14f4SXin Li * modification, are permitted provided that the following conditions
7*600f14f4SXin Li * are met:
8*600f14f4SXin Li *
9*600f14f4SXin Li * - Redistributions of source code must retain the above copyright
10*600f14f4SXin Li * notice, this list of conditions and the following disclaimer.
11*600f14f4SXin Li *
12*600f14f4SXin Li * - Redistributions in binary form must reproduce the above copyright
13*600f14f4SXin Li * notice, this list of conditions and the following disclaimer in the
14*600f14f4SXin Li * documentation and/or other materials provided with the distribution.
15*600f14f4SXin Li *
16*600f14f4SXin Li * - Neither the name of the Xiph.org Foundation nor the names of its
17*600f14f4SXin Li * contributors may be used to endorse or promote products derived from
18*600f14f4SXin Li * this software without specific prior written permission.
19*600f14f4SXin Li *
20*600f14f4SXin Li * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*600f14f4SXin Li * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*600f14f4SXin Li * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23*600f14f4SXin Li * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
24*600f14f4SXin Li * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*600f14f4SXin Li * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26*600f14f4SXin Li * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27*600f14f4SXin Li * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28*600f14f4SXin Li * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29*600f14f4SXin Li * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30*600f14f4SXin Li * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*600f14f4SXin Li */
32*600f14f4SXin Li
33*600f14f4SXin Li #ifdef HAVE_CONFIG_H
34*600f14f4SXin Li # include <config.h>
35*600f14f4SXin Li #endif
36*600f14f4SXin Li
37*600f14f4SXin Li #include "private/cpu.h"
38*600f14f4SXin Li
39*600f14f4SXin Li #ifndef FLAC__INTEGER_ONLY_LIBRARY
40*600f14f4SXin Li #ifndef FLAC__NO_ASM
41*600f14f4SXin Li #if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN
42*600f14f4SXin Li #include "private/lpc.h"
43*600f14f4SXin Li #ifdef FLAC__AVX2_SUPPORTED
44*600f14f4SXin Li
45*600f14f4SXin Li #include "FLAC/assert.h"
46*600f14f4SXin Li #include "FLAC/format.h"
47*600f14f4SXin Li
48*600f14f4SXin Li #include <immintrin.h> /* AVX2 */
49*600f14f4SXin Li
50*600f14f4SXin Li FLAC__SSE_TARGET("avx2")
FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2(const FLAC__int32 * data,uint32_t data_len,const FLAC__int32 qlp_coeff[],uint32_t order,int lp_quantization,FLAC__int32 residual[])51*600f14f4SXin Li void FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2(const FLAC__int32 *data, uint32_t data_len, const FLAC__int32 qlp_coeff[], uint32_t order, int lp_quantization, FLAC__int32 residual[])
52*600f14f4SXin Li {
53*600f14f4SXin Li int i;
54*600f14f4SXin Li FLAC__int32 sum;
55*600f14f4SXin Li const __m128i cnt = _mm_cvtsi32_si128(lp_quantization);
56*600f14f4SXin Li
57*600f14f4SXin Li FLAC__ASSERT(order > 0);
58*600f14f4SXin Li FLAC__ASSERT(order <= 32);
59*600f14f4SXin Li
60*600f14f4SXin Li if(order <= 12) {
61*600f14f4SXin Li if(order > 8) {
62*600f14f4SXin Li if(order > 10) {
63*600f14f4SXin Li if(order == 12) {
64*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11;
65*600f14f4SXin Li q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]);
66*600f14f4SXin Li q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]);
67*600f14f4SXin Li q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]);
68*600f14f4SXin Li q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]);
69*600f14f4SXin Li q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]);
70*600f14f4SXin Li q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]);
71*600f14f4SXin Li q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]);
72*600f14f4SXin Li q7 = _mm256_set1_epi32(0xffff & qlp_coeff[7 ]);
73*600f14f4SXin Li q8 = _mm256_set1_epi32(0xffff & qlp_coeff[8 ]);
74*600f14f4SXin Li q9 = _mm256_set1_epi32(0xffff & qlp_coeff[9 ]);
75*600f14f4SXin Li q10 = _mm256_set1_epi32(0xffff & qlp_coeff[10]);
76*600f14f4SXin Li q11 = _mm256_set1_epi32(0xffff & qlp_coeff[11]);
77*600f14f4SXin Li
78*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
79*600f14f4SXin Li __m256i summ, mull;
80*600f14f4SXin Li summ = _mm256_madd_epi16(q11, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-12)));
81*600f14f4SXin Li mull = _mm256_madd_epi16(q10, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-11))); summ = _mm256_add_epi32(summ, mull);
82*600f14f4SXin Li mull = _mm256_madd_epi16(q9, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-10))); summ = _mm256_add_epi32(summ, mull);
83*600f14f4SXin Li mull = _mm256_madd_epi16(q8, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-9 ))); summ = _mm256_add_epi32(summ, mull);
84*600f14f4SXin Li mull = _mm256_madd_epi16(q7, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-8 ))); summ = _mm256_add_epi32(summ, mull);
85*600f14f4SXin Li mull = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-7 ))); summ = _mm256_add_epi32(summ, mull);
86*600f14f4SXin Li mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull);
87*600f14f4SXin Li mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull);
88*600f14f4SXin Li mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull);
89*600f14f4SXin Li mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull);
90*600f14f4SXin Li mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull);
91*600f14f4SXin Li mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull);
92*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
93*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
94*600f14f4SXin Li }
95*600f14f4SXin Li }
96*600f14f4SXin Li else { /* order == 11 */
97*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10;
98*600f14f4SXin Li q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]);
99*600f14f4SXin Li q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]);
100*600f14f4SXin Li q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]);
101*600f14f4SXin Li q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]);
102*600f14f4SXin Li q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]);
103*600f14f4SXin Li q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]);
104*600f14f4SXin Li q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]);
105*600f14f4SXin Li q7 = _mm256_set1_epi32(0xffff & qlp_coeff[7 ]);
106*600f14f4SXin Li q8 = _mm256_set1_epi32(0xffff & qlp_coeff[8 ]);
107*600f14f4SXin Li q9 = _mm256_set1_epi32(0xffff & qlp_coeff[9 ]);
108*600f14f4SXin Li q10 = _mm256_set1_epi32(0xffff & qlp_coeff[10]);
109*600f14f4SXin Li
110*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
111*600f14f4SXin Li __m256i summ, mull;
112*600f14f4SXin Li summ = _mm256_madd_epi16(q10, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-11)));
113*600f14f4SXin Li mull = _mm256_madd_epi16(q9, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-10))); summ = _mm256_add_epi32(summ, mull);
114*600f14f4SXin Li mull = _mm256_madd_epi16(q8, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-9 ))); summ = _mm256_add_epi32(summ, mull);
115*600f14f4SXin Li mull = _mm256_madd_epi16(q7, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-8 ))); summ = _mm256_add_epi32(summ, mull);
116*600f14f4SXin Li mull = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-7 ))); summ = _mm256_add_epi32(summ, mull);
117*600f14f4SXin Li mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull);
118*600f14f4SXin Li mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull);
119*600f14f4SXin Li mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull);
120*600f14f4SXin Li mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull);
121*600f14f4SXin Li mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull);
122*600f14f4SXin Li mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull);
123*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
124*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
125*600f14f4SXin Li }
126*600f14f4SXin Li }
127*600f14f4SXin Li }
128*600f14f4SXin Li else {
129*600f14f4SXin Li if(order == 10) {
130*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9;
131*600f14f4SXin Li q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]);
132*600f14f4SXin Li q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]);
133*600f14f4SXin Li q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]);
134*600f14f4SXin Li q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]);
135*600f14f4SXin Li q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]);
136*600f14f4SXin Li q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]);
137*600f14f4SXin Li q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]);
138*600f14f4SXin Li q7 = _mm256_set1_epi32(0xffff & qlp_coeff[7 ]);
139*600f14f4SXin Li q8 = _mm256_set1_epi32(0xffff & qlp_coeff[8 ]);
140*600f14f4SXin Li q9 = _mm256_set1_epi32(0xffff & qlp_coeff[9 ]);
141*600f14f4SXin Li
142*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
143*600f14f4SXin Li __m256i summ, mull;
144*600f14f4SXin Li summ = _mm256_madd_epi16(q9, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-10)));
145*600f14f4SXin Li mull = _mm256_madd_epi16(q8, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-9 ))); summ = _mm256_add_epi32(summ, mull);
146*600f14f4SXin Li mull = _mm256_madd_epi16(q7, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-8 ))); summ = _mm256_add_epi32(summ, mull);
147*600f14f4SXin Li mull = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-7 ))); summ = _mm256_add_epi32(summ, mull);
148*600f14f4SXin Li mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull);
149*600f14f4SXin Li mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull);
150*600f14f4SXin Li mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull);
151*600f14f4SXin Li mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull);
152*600f14f4SXin Li mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull);
153*600f14f4SXin Li mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull);
154*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
155*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
156*600f14f4SXin Li }
157*600f14f4SXin Li }
158*600f14f4SXin Li else { /* order == 9 */
159*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8;
160*600f14f4SXin Li q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]);
161*600f14f4SXin Li q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]);
162*600f14f4SXin Li q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]);
163*600f14f4SXin Li q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]);
164*600f14f4SXin Li q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]);
165*600f14f4SXin Li q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]);
166*600f14f4SXin Li q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]);
167*600f14f4SXin Li q7 = _mm256_set1_epi32(0xffff & qlp_coeff[7 ]);
168*600f14f4SXin Li q8 = _mm256_set1_epi32(0xffff & qlp_coeff[8 ]);
169*600f14f4SXin Li
170*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
171*600f14f4SXin Li __m256i summ, mull;
172*600f14f4SXin Li summ = _mm256_madd_epi16(q8, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-9 )));
173*600f14f4SXin Li mull = _mm256_madd_epi16(q7, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-8 ))); summ = _mm256_add_epi32(summ, mull);
174*600f14f4SXin Li mull = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-7 ))); summ = _mm256_add_epi32(summ, mull);
175*600f14f4SXin Li mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull);
176*600f14f4SXin Li mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull);
177*600f14f4SXin Li mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull);
178*600f14f4SXin Li mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull);
179*600f14f4SXin Li mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull);
180*600f14f4SXin Li mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull);
181*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
182*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
183*600f14f4SXin Li }
184*600f14f4SXin Li }
185*600f14f4SXin Li }
186*600f14f4SXin Li }
187*600f14f4SXin Li else if(order > 4) {
188*600f14f4SXin Li if(order > 6) {
189*600f14f4SXin Li if(order == 8) {
190*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6, q7;
191*600f14f4SXin Li q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]);
192*600f14f4SXin Li q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]);
193*600f14f4SXin Li q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]);
194*600f14f4SXin Li q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]);
195*600f14f4SXin Li q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]);
196*600f14f4SXin Li q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]);
197*600f14f4SXin Li q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]);
198*600f14f4SXin Li q7 = _mm256_set1_epi32(0xffff & qlp_coeff[7 ]);
199*600f14f4SXin Li
200*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
201*600f14f4SXin Li __m256i summ, mull;
202*600f14f4SXin Li summ = _mm256_madd_epi16(q7, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-8 )));
203*600f14f4SXin Li mull = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-7 ))); summ = _mm256_add_epi32(summ, mull);
204*600f14f4SXin Li mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull);
205*600f14f4SXin Li mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull);
206*600f14f4SXin Li mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull);
207*600f14f4SXin Li mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull);
208*600f14f4SXin Li mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull);
209*600f14f4SXin Li mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull);
210*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
211*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
212*600f14f4SXin Li }
213*600f14f4SXin Li }
214*600f14f4SXin Li else { /* order == 7 */
215*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6;
216*600f14f4SXin Li q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]);
217*600f14f4SXin Li q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]);
218*600f14f4SXin Li q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]);
219*600f14f4SXin Li q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]);
220*600f14f4SXin Li q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]);
221*600f14f4SXin Li q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]);
222*600f14f4SXin Li q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]);
223*600f14f4SXin Li
224*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
225*600f14f4SXin Li __m256i summ, mull;
226*600f14f4SXin Li summ = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-7 )));
227*600f14f4SXin Li mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull);
228*600f14f4SXin Li mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull);
229*600f14f4SXin Li mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull);
230*600f14f4SXin Li mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull);
231*600f14f4SXin Li mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull);
232*600f14f4SXin Li mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull);
233*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
234*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
235*600f14f4SXin Li }
236*600f14f4SXin Li }
237*600f14f4SXin Li }
238*600f14f4SXin Li else {
239*600f14f4SXin Li if(order == 6) {
240*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5;
241*600f14f4SXin Li q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]);
242*600f14f4SXin Li q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]);
243*600f14f4SXin Li q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]);
244*600f14f4SXin Li q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]);
245*600f14f4SXin Li q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]);
246*600f14f4SXin Li q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]);
247*600f14f4SXin Li
248*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
249*600f14f4SXin Li __m256i summ, mull;
250*600f14f4SXin Li summ = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-6 )));
251*600f14f4SXin Li mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull);
252*600f14f4SXin Li mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull);
253*600f14f4SXin Li mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull);
254*600f14f4SXin Li mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull);
255*600f14f4SXin Li mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull);
256*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
257*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
258*600f14f4SXin Li }
259*600f14f4SXin Li }
260*600f14f4SXin Li else { /* order == 5 */
261*600f14f4SXin Li __m256i q0, q1, q2, q3, q4;
262*600f14f4SXin Li q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]);
263*600f14f4SXin Li q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]);
264*600f14f4SXin Li q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]);
265*600f14f4SXin Li q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]);
266*600f14f4SXin Li q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]);
267*600f14f4SXin Li
268*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
269*600f14f4SXin Li __m256i summ, mull;
270*600f14f4SXin Li summ = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5 )));
271*600f14f4SXin Li mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull);
272*600f14f4SXin Li mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull);
273*600f14f4SXin Li mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull);
274*600f14f4SXin Li mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull);
275*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
276*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
277*600f14f4SXin Li }
278*600f14f4SXin Li }
279*600f14f4SXin Li }
280*600f14f4SXin Li }
281*600f14f4SXin Li else {
282*600f14f4SXin Li if(order > 2) {
283*600f14f4SXin Li if(order == 4) {
284*600f14f4SXin Li __m256i q0, q1, q2, q3;
285*600f14f4SXin Li q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]);
286*600f14f4SXin Li q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]);
287*600f14f4SXin Li q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]);
288*600f14f4SXin Li q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]);
289*600f14f4SXin Li
290*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
291*600f14f4SXin Li __m256i summ, mull;
292*600f14f4SXin Li summ = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4 )));
293*600f14f4SXin Li mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull);
294*600f14f4SXin Li mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull);
295*600f14f4SXin Li mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull);
296*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
297*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
298*600f14f4SXin Li }
299*600f14f4SXin Li }
300*600f14f4SXin Li else { /* order == 3 */
301*600f14f4SXin Li __m256i q0, q1, q2;
302*600f14f4SXin Li q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]);
303*600f14f4SXin Li q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]);
304*600f14f4SXin Li q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]);
305*600f14f4SXin Li
306*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
307*600f14f4SXin Li __m256i summ, mull;
308*600f14f4SXin Li summ = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3 )));
309*600f14f4SXin Li mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull);
310*600f14f4SXin Li mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull);
311*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
312*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
313*600f14f4SXin Li }
314*600f14f4SXin Li }
315*600f14f4SXin Li }
316*600f14f4SXin Li else {
317*600f14f4SXin Li if(order == 2) {
318*600f14f4SXin Li __m256i q0, q1;
319*600f14f4SXin Li q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]);
320*600f14f4SXin Li q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]);
321*600f14f4SXin Li
322*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
323*600f14f4SXin Li __m256i summ, mull;
324*600f14f4SXin Li summ = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2 )));
325*600f14f4SXin Li mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull);
326*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
327*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
328*600f14f4SXin Li }
329*600f14f4SXin Li }
330*600f14f4SXin Li else { /* order == 1 */
331*600f14f4SXin Li __m256i q0;
332*600f14f4SXin Li q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]);
333*600f14f4SXin Li
334*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
335*600f14f4SXin Li __m256i summ;
336*600f14f4SXin Li summ = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1 )));
337*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
338*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
339*600f14f4SXin Li }
340*600f14f4SXin Li }
341*600f14f4SXin Li }
342*600f14f4SXin Li }
343*600f14f4SXin Li for(; i < (int)data_len; i++) {
344*600f14f4SXin Li sum = 0;
345*600f14f4SXin Li switch(order) {
346*600f14f4SXin Li case 12: sum += qlp_coeff[11] * data[i-12]; /* Falls through. */
347*600f14f4SXin Li case 11: sum += qlp_coeff[10] * data[i-11]; /* Falls through. */
348*600f14f4SXin Li case 10: sum += qlp_coeff[ 9] * data[i-10]; /* Falls through. */
349*600f14f4SXin Li case 9: sum += qlp_coeff[ 8] * data[i- 9]; /* Falls through. */
350*600f14f4SXin Li case 8: sum += qlp_coeff[ 7] * data[i- 8]; /* Falls through. */
351*600f14f4SXin Li case 7: sum += qlp_coeff[ 6] * data[i- 7]; /* Falls through. */
352*600f14f4SXin Li case 6: sum += qlp_coeff[ 5] * data[i- 6]; /* Falls through. */
353*600f14f4SXin Li case 5: sum += qlp_coeff[ 4] * data[i- 5]; /* Falls through. */
354*600f14f4SXin Li case 4: sum += qlp_coeff[ 3] * data[i- 4]; /* Falls through. */
355*600f14f4SXin Li case 3: sum += qlp_coeff[ 2] * data[i- 3]; /* Falls through. */
356*600f14f4SXin Li case 2: sum += qlp_coeff[ 1] * data[i- 2]; /* Falls through. */
357*600f14f4SXin Li case 1: sum += qlp_coeff[ 0] * data[i- 1];
358*600f14f4SXin Li }
359*600f14f4SXin Li residual[i] = data[i] - (sum >> lp_quantization);
360*600f14f4SXin Li }
361*600f14f4SXin Li }
362*600f14f4SXin Li else { /* order > 12 */
363*600f14f4SXin Li for(i = 0; i < (int)data_len; i++) {
364*600f14f4SXin Li sum = 0;
365*600f14f4SXin Li switch(order) {
366*600f14f4SXin Li case 32: sum += qlp_coeff[31] * data[i-32]; /* Falls through. */
367*600f14f4SXin Li case 31: sum += qlp_coeff[30] * data[i-31]; /* Falls through. */
368*600f14f4SXin Li case 30: sum += qlp_coeff[29] * data[i-30]; /* Falls through. */
369*600f14f4SXin Li case 29: sum += qlp_coeff[28] * data[i-29]; /* Falls through. */
370*600f14f4SXin Li case 28: sum += qlp_coeff[27] * data[i-28]; /* Falls through. */
371*600f14f4SXin Li case 27: sum += qlp_coeff[26] * data[i-27]; /* Falls through. */
372*600f14f4SXin Li case 26: sum += qlp_coeff[25] * data[i-26]; /* Falls through. */
373*600f14f4SXin Li case 25: sum += qlp_coeff[24] * data[i-25]; /* Falls through. */
374*600f14f4SXin Li case 24: sum += qlp_coeff[23] * data[i-24]; /* Falls through. */
375*600f14f4SXin Li case 23: sum += qlp_coeff[22] * data[i-23]; /* Falls through. */
376*600f14f4SXin Li case 22: sum += qlp_coeff[21] * data[i-22]; /* Falls through. */
377*600f14f4SXin Li case 21: sum += qlp_coeff[20] * data[i-21]; /* Falls through. */
378*600f14f4SXin Li case 20: sum += qlp_coeff[19] * data[i-20]; /* Falls through. */
379*600f14f4SXin Li case 19: sum += qlp_coeff[18] * data[i-19]; /* Falls through. */
380*600f14f4SXin Li case 18: sum += qlp_coeff[17] * data[i-18]; /* Falls through. */
381*600f14f4SXin Li case 17: sum += qlp_coeff[16] * data[i-17]; /* Falls through. */
382*600f14f4SXin Li case 16: sum += qlp_coeff[15] * data[i-16]; /* Falls through. */
383*600f14f4SXin Li case 15: sum += qlp_coeff[14] * data[i-15]; /* Falls through. */
384*600f14f4SXin Li case 14: sum += qlp_coeff[13] * data[i-14]; /* Falls through. */
385*600f14f4SXin Li case 13: sum += qlp_coeff[12] * data[i-13];
386*600f14f4SXin Li sum += qlp_coeff[11] * data[i-12];
387*600f14f4SXin Li sum += qlp_coeff[10] * data[i-11];
388*600f14f4SXin Li sum += qlp_coeff[ 9] * data[i-10];
389*600f14f4SXin Li sum += qlp_coeff[ 8] * data[i- 9];
390*600f14f4SXin Li sum += qlp_coeff[ 7] * data[i- 8];
391*600f14f4SXin Li sum += qlp_coeff[ 6] * data[i- 7];
392*600f14f4SXin Li sum += qlp_coeff[ 5] * data[i- 6];
393*600f14f4SXin Li sum += qlp_coeff[ 4] * data[i- 5];
394*600f14f4SXin Li sum += qlp_coeff[ 3] * data[i- 4];
395*600f14f4SXin Li sum += qlp_coeff[ 2] * data[i- 3];
396*600f14f4SXin Li sum += qlp_coeff[ 1] * data[i- 2];
397*600f14f4SXin Li sum += qlp_coeff[ 0] * data[i- 1];
398*600f14f4SXin Li }
399*600f14f4SXin Li residual[i] = data[i] - (sum >> lp_quantization);
400*600f14f4SXin Li }
401*600f14f4SXin Li }
402*600f14f4SXin Li _mm256_zeroupper();
403*600f14f4SXin Li }
404*600f14f4SXin Li
405*600f14f4SXin Li FLAC__SSE_TARGET("avx2")
FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_avx2(const FLAC__int32 * data,uint32_t data_len,const FLAC__int32 qlp_coeff[],uint32_t order,int lp_quantization,FLAC__int32 residual[])406*600f14f4SXin Li void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_avx2(const FLAC__int32 *data, uint32_t data_len, const FLAC__int32 qlp_coeff[], uint32_t order, int lp_quantization, FLAC__int32 residual[])
407*600f14f4SXin Li {
408*600f14f4SXin Li int i;
409*600f14f4SXin Li FLAC__int32 sum;
410*600f14f4SXin Li const __m128i cnt = _mm_cvtsi32_si128(lp_quantization);
411*600f14f4SXin Li
412*600f14f4SXin Li FLAC__ASSERT(order > 0);
413*600f14f4SXin Li FLAC__ASSERT(order <= 32);
414*600f14f4SXin Li
415*600f14f4SXin Li if(order <= 12) {
416*600f14f4SXin Li if(order > 8) {
417*600f14f4SXin Li if(order > 10) {
418*600f14f4SXin Li if(order == 12) {
419*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11;
420*600f14f4SXin Li q0 = _mm256_set1_epi32(qlp_coeff[0 ]);
421*600f14f4SXin Li q1 = _mm256_set1_epi32(qlp_coeff[1 ]);
422*600f14f4SXin Li q2 = _mm256_set1_epi32(qlp_coeff[2 ]);
423*600f14f4SXin Li q3 = _mm256_set1_epi32(qlp_coeff[3 ]);
424*600f14f4SXin Li q4 = _mm256_set1_epi32(qlp_coeff[4 ]);
425*600f14f4SXin Li q5 = _mm256_set1_epi32(qlp_coeff[5 ]);
426*600f14f4SXin Li q6 = _mm256_set1_epi32(qlp_coeff[6 ]);
427*600f14f4SXin Li q7 = _mm256_set1_epi32(qlp_coeff[7 ]);
428*600f14f4SXin Li q8 = _mm256_set1_epi32(qlp_coeff[8 ]);
429*600f14f4SXin Li q9 = _mm256_set1_epi32(qlp_coeff[9 ]);
430*600f14f4SXin Li q10 = _mm256_set1_epi32(qlp_coeff[10]);
431*600f14f4SXin Li q11 = _mm256_set1_epi32(qlp_coeff[11]);
432*600f14f4SXin Li
433*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
434*600f14f4SXin Li __m256i summ, mull;
435*600f14f4SXin Li summ = _mm256_mullo_epi32(q11, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-12)));
436*600f14f4SXin Li mull = _mm256_mullo_epi32(q10, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-11))); summ = _mm256_add_epi32(summ, mull);
437*600f14f4SXin Li mull = _mm256_mullo_epi32(q9, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-10))); summ = _mm256_add_epi32(summ, mull);
438*600f14f4SXin Li mull = _mm256_mullo_epi32(q8, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-9))); summ = _mm256_add_epi32(summ, mull);
439*600f14f4SXin Li mull = _mm256_mullo_epi32(q7, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-8))); summ = _mm256_add_epi32(summ, mull);
440*600f14f4SXin Li mull = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-7))); summ = _mm256_add_epi32(summ, mull);
441*600f14f4SXin Li mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-6))); summ = _mm256_add_epi32(summ, mull);
442*600f14f4SXin Li mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5))); summ = _mm256_add_epi32(summ, mull);
443*600f14f4SXin Li mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4))); summ = _mm256_add_epi32(summ, mull);
444*600f14f4SXin Li mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3))); summ = _mm256_add_epi32(summ, mull);
445*600f14f4SXin Li mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2))); summ = _mm256_add_epi32(summ, mull);
446*600f14f4SXin Li mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1))); summ = _mm256_add_epi32(summ, mull);
447*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
448*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
449*600f14f4SXin Li }
450*600f14f4SXin Li }
451*600f14f4SXin Li else { /* order == 11 */
452*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10;
453*600f14f4SXin Li q0 = _mm256_set1_epi32(qlp_coeff[0 ]);
454*600f14f4SXin Li q1 = _mm256_set1_epi32(qlp_coeff[1 ]);
455*600f14f4SXin Li q2 = _mm256_set1_epi32(qlp_coeff[2 ]);
456*600f14f4SXin Li q3 = _mm256_set1_epi32(qlp_coeff[3 ]);
457*600f14f4SXin Li q4 = _mm256_set1_epi32(qlp_coeff[4 ]);
458*600f14f4SXin Li q5 = _mm256_set1_epi32(qlp_coeff[5 ]);
459*600f14f4SXin Li q6 = _mm256_set1_epi32(qlp_coeff[6 ]);
460*600f14f4SXin Li q7 = _mm256_set1_epi32(qlp_coeff[7 ]);
461*600f14f4SXin Li q8 = _mm256_set1_epi32(qlp_coeff[8 ]);
462*600f14f4SXin Li q9 = _mm256_set1_epi32(qlp_coeff[9 ]);
463*600f14f4SXin Li q10 = _mm256_set1_epi32(qlp_coeff[10]);
464*600f14f4SXin Li
465*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
466*600f14f4SXin Li __m256i summ, mull;
467*600f14f4SXin Li summ = _mm256_mullo_epi32(q10, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-11)));
468*600f14f4SXin Li mull = _mm256_mullo_epi32(q9, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-10))); summ = _mm256_add_epi32(summ, mull);
469*600f14f4SXin Li mull = _mm256_mullo_epi32(q8, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-9))); summ = _mm256_add_epi32(summ, mull);
470*600f14f4SXin Li mull = _mm256_mullo_epi32(q7, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-8))); summ = _mm256_add_epi32(summ, mull);
471*600f14f4SXin Li mull = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-7))); summ = _mm256_add_epi32(summ, mull);
472*600f14f4SXin Li mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-6))); summ = _mm256_add_epi32(summ, mull);
473*600f14f4SXin Li mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5))); summ = _mm256_add_epi32(summ, mull);
474*600f14f4SXin Li mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4))); summ = _mm256_add_epi32(summ, mull);
475*600f14f4SXin Li mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3))); summ = _mm256_add_epi32(summ, mull);
476*600f14f4SXin Li mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2))); summ = _mm256_add_epi32(summ, mull);
477*600f14f4SXin Li mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1))); summ = _mm256_add_epi32(summ, mull);
478*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
479*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
480*600f14f4SXin Li }
481*600f14f4SXin Li }
482*600f14f4SXin Li }
483*600f14f4SXin Li else {
484*600f14f4SXin Li if(order == 10) {
485*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9;
486*600f14f4SXin Li q0 = _mm256_set1_epi32(qlp_coeff[0 ]);
487*600f14f4SXin Li q1 = _mm256_set1_epi32(qlp_coeff[1 ]);
488*600f14f4SXin Li q2 = _mm256_set1_epi32(qlp_coeff[2 ]);
489*600f14f4SXin Li q3 = _mm256_set1_epi32(qlp_coeff[3 ]);
490*600f14f4SXin Li q4 = _mm256_set1_epi32(qlp_coeff[4 ]);
491*600f14f4SXin Li q5 = _mm256_set1_epi32(qlp_coeff[5 ]);
492*600f14f4SXin Li q6 = _mm256_set1_epi32(qlp_coeff[6 ]);
493*600f14f4SXin Li q7 = _mm256_set1_epi32(qlp_coeff[7 ]);
494*600f14f4SXin Li q8 = _mm256_set1_epi32(qlp_coeff[8 ]);
495*600f14f4SXin Li q9 = _mm256_set1_epi32(qlp_coeff[9 ]);
496*600f14f4SXin Li
497*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
498*600f14f4SXin Li __m256i summ, mull;
499*600f14f4SXin Li summ = _mm256_mullo_epi32(q9, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-10)));
500*600f14f4SXin Li mull = _mm256_mullo_epi32(q8, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-9))); summ = _mm256_add_epi32(summ, mull);
501*600f14f4SXin Li mull = _mm256_mullo_epi32(q7, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-8))); summ = _mm256_add_epi32(summ, mull);
502*600f14f4SXin Li mull = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-7))); summ = _mm256_add_epi32(summ, mull);
503*600f14f4SXin Li mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-6))); summ = _mm256_add_epi32(summ, mull);
504*600f14f4SXin Li mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5))); summ = _mm256_add_epi32(summ, mull);
505*600f14f4SXin Li mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4))); summ = _mm256_add_epi32(summ, mull);
506*600f14f4SXin Li mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3))); summ = _mm256_add_epi32(summ, mull);
507*600f14f4SXin Li mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2))); summ = _mm256_add_epi32(summ, mull);
508*600f14f4SXin Li mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1))); summ = _mm256_add_epi32(summ, mull);
509*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
510*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
511*600f14f4SXin Li }
512*600f14f4SXin Li }
513*600f14f4SXin Li else { /* order == 9 */
514*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8;
515*600f14f4SXin Li q0 = _mm256_set1_epi32(qlp_coeff[0 ]);
516*600f14f4SXin Li q1 = _mm256_set1_epi32(qlp_coeff[1 ]);
517*600f14f4SXin Li q2 = _mm256_set1_epi32(qlp_coeff[2 ]);
518*600f14f4SXin Li q3 = _mm256_set1_epi32(qlp_coeff[3 ]);
519*600f14f4SXin Li q4 = _mm256_set1_epi32(qlp_coeff[4 ]);
520*600f14f4SXin Li q5 = _mm256_set1_epi32(qlp_coeff[5 ]);
521*600f14f4SXin Li q6 = _mm256_set1_epi32(qlp_coeff[6 ]);
522*600f14f4SXin Li q7 = _mm256_set1_epi32(qlp_coeff[7 ]);
523*600f14f4SXin Li q8 = _mm256_set1_epi32(qlp_coeff[8 ]);
524*600f14f4SXin Li
525*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
526*600f14f4SXin Li __m256i summ, mull;
527*600f14f4SXin Li summ = _mm256_mullo_epi32(q8, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-9)));
528*600f14f4SXin Li mull = _mm256_mullo_epi32(q7, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-8))); summ = _mm256_add_epi32(summ, mull);
529*600f14f4SXin Li mull = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-7))); summ = _mm256_add_epi32(summ, mull);
530*600f14f4SXin Li mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-6))); summ = _mm256_add_epi32(summ, mull);
531*600f14f4SXin Li mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5))); summ = _mm256_add_epi32(summ, mull);
532*600f14f4SXin Li mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4))); summ = _mm256_add_epi32(summ, mull);
533*600f14f4SXin Li mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3))); summ = _mm256_add_epi32(summ, mull);
534*600f14f4SXin Li mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2))); summ = _mm256_add_epi32(summ, mull);
535*600f14f4SXin Li mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1))); summ = _mm256_add_epi32(summ, mull);
536*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
537*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
538*600f14f4SXin Li }
539*600f14f4SXin Li }
540*600f14f4SXin Li }
541*600f14f4SXin Li }
542*600f14f4SXin Li else if(order > 4) {
543*600f14f4SXin Li if(order > 6) {
544*600f14f4SXin Li if(order == 8) {
545*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6, q7;
546*600f14f4SXin Li q0 = _mm256_set1_epi32(qlp_coeff[0 ]);
547*600f14f4SXin Li q1 = _mm256_set1_epi32(qlp_coeff[1 ]);
548*600f14f4SXin Li q2 = _mm256_set1_epi32(qlp_coeff[2 ]);
549*600f14f4SXin Li q3 = _mm256_set1_epi32(qlp_coeff[3 ]);
550*600f14f4SXin Li q4 = _mm256_set1_epi32(qlp_coeff[4 ]);
551*600f14f4SXin Li q5 = _mm256_set1_epi32(qlp_coeff[5 ]);
552*600f14f4SXin Li q6 = _mm256_set1_epi32(qlp_coeff[6 ]);
553*600f14f4SXin Li q7 = _mm256_set1_epi32(qlp_coeff[7 ]);
554*600f14f4SXin Li
555*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
556*600f14f4SXin Li __m256i summ, mull;
557*600f14f4SXin Li summ = _mm256_mullo_epi32(q7, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-8)));
558*600f14f4SXin Li mull = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-7))); summ = _mm256_add_epi32(summ, mull);
559*600f14f4SXin Li mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-6))); summ = _mm256_add_epi32(summ, mull);
560*600f14f4SXin Li mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5))); summ = _mm256_add_epi32(summ, mull);
561*600f14f4SXin Li mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4))); summ = _mm256_add_epi32(summ, mull);
562*600f14f4SXin Li mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3))); summ = _mm256_add_epi32(summ, mull);
563*600f14f4SXin Li mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2))); summ = _mm256_add_epi32(summ, mull);
564*600f14f4SXin Li mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1))); summ = _mm256_add_epi32(summ, mull);
565*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
566*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
567*600f14f4SXin Li }
568*600f14f4SXin Li }
569*600f14f4SXin Li else { /* order == 7 */
570*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6;
571*600f14f4SXin Li q0 = _mm256_set1_epi32(qlp_coeff[0 ]);
572*600f14f4SXin Li q1 = _mm256_set1_epi32(qlp_coeff[1 ]);
573*600f14f4SXin Li q2 = _mm256_set1_epi32(qlp_coeff[2 ]);
574*600f14f4SXin Li q3 = _mm256_set1_epi32(qlp_coeff[3 ]);
575*600f14f4SXin Li q4 = _mm256_set1_epi32(qlp_coeff[4 ]);
576*600f14f4SXin Li q5 = _mm256_set1_epi32(qlp_coeff[5 ]);
577*600f14f4SXin Li q6 = _mm256_set1_epi32(qlp_coeff[6 ]);
578*600f14f4SXin Li
579*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
580*600f14f4SXin Li __m256i summ, mull;
581*600f14f4SXin Li summ = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-7)));
582*600f14f4SXin Li mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-6))); summ = _mm256_add_epi32(summ, mull);
583*600f14f4SXin Li mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5))); summ = _mm256_add_epi32(summ, mull);
584*600f14f4SXin Li mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4))); summ = _mm256_add_epi32(summ, mull);
585*600f14f4SXin Li mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3))); summ = _mm256_add_epi32(summ, mull);
586*600f14f4SXin Li mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2))); summ = _mm256_add_epi32(summ, mull);
587*600f14f4SXin Li mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1))); summ = _mm256_add_epi32(summ, mull);
588*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
589*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
590*600f14f4SXin Li }
591*600f14f4SXin Li }
592*600f14f4SXin Li }
593*600f14f4SXin Li else {
594*600f14f4SXin Li if(order == 6) {
595*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5;
596*600f14f4SXin Li q0 = _mm256_set1_epi32(qlp_coeff[0 ]);
597*600f14f4SXin Li q1 = _mm256_set1_epi32(qlp_coeff[1 ]);
598*600f14f4SXin Li q2 = _mm256_set1_epi32(qlp_coeff[2 ]);
599*600f14f4SXin Li q3 = _mm256_set1_epi32(qlp_coeff[3 ]);
600*600f14f4SXin Li q4 = _mm256_set1_epi32(qlp_coeff[4 ]);
601*600f14f4SXin Li q5 = _mm256_set1_epi32(qlp_coeff[5 ]);
602*600f14f4SXin Li
603*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
604*600f14f4SXin Li __m256i summ, mull;
605*600f14f4SXin Li summ = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-6)));
606*600f14f4SXin Li mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5))); summ = _mm256_add_epi32(summ, mull);
607*600f14f4SXin Li mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4))); summ = _mm256_add_epi32(summ, mull);
608*600f14f4SXin Li mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3))); summ = _mm256_add_epi32(summ, mull);
609*600f14f4SXin Li mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2))); summ = _mm256_add_epi32(summ, mull);
610*600f14f4SXin Li mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1))); summ = _mm256_add_epi32(summ, mull);
611*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
612*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
613*600f14f4SXin Li }
614*600f14f4SXin Li }
615*600f14f4SXin Li else { /* order == 5 */
616*600f14f4SXin Li __m256i q0, q1, q2, q3, q4;
617*600f14f4SXin Li q0 = _mm256_set1_epi32(qlp_coeff[0 ]);
618*600f14f4SXin Li q1 = _mm256_set1_epi32(qlp_coeff[1 ]);
619*600f14f4SXin Li q2 = _mm256_set1_epi32(qlp_coeff[2 ]);
620*600f14f4SXin Li q3 = _mm256_set1_epi32(qlp_coeff[3 ]);
621*600f14f4SXin Li q4 = _mm256_set1_epi32(qlp_coeff[4 ]);
622*600f14f4SXin Li
623*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
624*600f14f4SXin Li __m256i summ, mull;
625*600f14f4SXin Li summ = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-5)));
626*600f14f4SXin Li mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4))); summ = _mm256_add_epi32(summ, mull);
627*600f14f4SXin Li mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3))); summ = _mm256_add_epi32(summ, mull);
628*600f14f4SXin Li mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2))); summ = _mm256_add_epi32(summ, mull);
629*600f14f4SXin Li mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1))); summ = _mm256_add_epi32(summ, mull);
630*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
631*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
632*600f14f4SXin Li }
633*600f14f4SXin Li }
634*600f14f4SXin Li }
635*600f14f4SXin Li }
636*600f14f4SXin Li else {
637*600f14f4SXin Li if(order > 2) {
638*600f14f4SXin Li if(order == 4) {
639*600f14f4SXin Li __m256i q0, q1, q2, q3;
640*600f14f4SXin Li q0 = _mm256_set1_epi32(qlp_coeff[0 ]);
641*600f14f4SXin Li q1 = _mm256_set1_epi32(qlp_coeff[1 ]);
642*600f14f4SXin Li q2 = _mm256_set1_epi32(qlp_coeff[2 ]);
643*600f14f4SXin Li q3 = _mm256_set1_epi32(qlp_coeff[3 ]);
644*600f14f4SXin Li
645*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
646*600f14f4SXin Li __m256i summ, mull;
647*600f14f4SXin Li summ = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-4)));
648*600f14f4SXin Li mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3))); summ = _mm256_add_epi32(summ, mull);
649*600f14f4SXin Li mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2))); summ = _mm256_add_epi32(summ, mull);
650*600f14f4SXin Li mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1))); summ = _mm256_add_epi32(summ, mull);
651*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
652*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
653*600f14f4SXin Li }
654*600f14f4SXin Li }
655*600f14f4SXin Li else { /* order == 3 */
656*600f14f4SXin Li __m256i q0, q1, q2;
657*600f14f4SXin Li q0 = _mm256_set1_epi32(qlp_coeff[0 ]);
658*600f14f4SXin Li q1 = _mm256_set1_epi32(qlp_coeff[1 ]);
659*600f14f4SXin Li q2 = _mm256_set1_epi32(qlp_coeff[2 ]);
660*600f14f4SXin Li
661*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
662*600f14f4SXin Li __m256i summ, mull;
663*600f14f4SXin Li summ = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-3)));
664*600f14f4SXin Li mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2))); summ = _mm256_add_epi32(summ, mull);
665*600f14f4SXin Li mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1))); summ = _mm256_add_epi32(summ, mull);
666*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
667*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
668*600f14f4SXin Li }
669*600f14f4SXin Li }
670*600f14f4SXin Li }
671*600f14f4SXin Li else {
672*600f14f4SXin Li if(order == 2) {
673*600f14f4SXin Li __m256i q0, q1;
674*600f14f4SXin Li q0 = _mm256_set1_epi32(qlp_coeff[0 ]);
675*600f14f4SXin Li q1 = _mm256_set1_epi32(qlp_coeff[1 ]);
676*600f14f4SXin Li
677*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
678*600f14f4SXin Li __m256i summ, mull;
679*600f14f4SXin Li summ = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-2)));
680*600f14f4SXin Li mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1))); summ = _mm256_add_epi32(summ, mull);
681*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
682*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
683*600f14f4SXin Li }
684*600f14f4SXin Li }
685*600f14f4SXin Li else { /* order == 1 */
686*600f14f4SXin Li __m256i q0;
687*600f14f4SXin Li q0 = _mm256_set1_epi32(qlp_coeff[0 ]);
688*600f14f4SXin Li
689*600f14f4SXin Li for(i = 0; i < (int)data_len-7; i+=8) {
690*600f14f4SXin Li __m256i summ;
691*600f14f4SXin Li summ = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(const void*)(data+i-1)));
692*600f14f4SXin Li summ = _mm256_sra_epi32(summ, cnt);
693*600f14f4SXin Li _mm256_storeu_si256((__m256i*)(void*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(const void*)(data+i)), summ));
694*600f14f4SXin Li }
695*600f14f4SXin Li }
696*600f14f4SXin Li }
697*600f14f4SXin Li }
698*600f14f4SXin Li for(; i < (int)data_len; i++) {
699*600f14f4SXin Li sum = 0;
700*600f14f4SXin Li switch(order) {
701*600f14f4SXin Li case 12: sum += qlp_coeff[11] * data[i-12]; /* Falls through. */
702*600f14f4SXin Li case 11: sum += qlp_coeff[10] * data[i-11]; /* Falls through. */
703*600f14f4SXin Li case 10: sum += qlp_coeff[ 9] * data[i-10]; /* Falls through. */
704*600f14f4SXin Li case 9: sum += qlp_coeff[ 8] * data[i- 9]; /* Falls through. */
705*600f14f4SXin Li case 8: sum += qlp_coeff[ 7] * data[i- 8]; /* Falls through. */
706*600f14f4SXin Li case 7: sum += qlp_coeff[ 6] * data[i- 7]; /* Falls through. */
707*600f14f4SXin Li case 6: sum += qlp_coeff[ 5] * data[i- 6]; /* Falls through. */
708*600f14f4SXin Li case 5: sum += qlp_coeff[ 4] * data[i- 5]; /* Falls through. */
709*600f14f4SXin Li case 4: sum += qlp_coeff[ 3] * data[i- 4]; /* Falls through. */
710*600f14f4SXin Li case 3: sum += qlp_coeff[ 2] * data[i- 3]; /* Falls through. */
711*600f14f4SXin Li case 2: sum += qlp_coeff[ 1] * data[i- 2]; /* Falls through. */
712*600f14f4SXin Li case 1: sum += qlp_coeff[ 0] * data[i- 1];
713*600f14f4SXin Li }
714*600f14f4SXin Li residual[i] = data[i] - (sum >> lp_quantization);
715*600f14f4SXin Li }
716*600f14f4SXin Li }
717*600f14f4SXin Li else { /* order > 12 */
718*600f14f4SXin Li for(i = 0; i < (int)data_len; i++) {
719*600f14f4SXin Li sum = 0;
720*600f14f4SXin Li switch(order) {
721*600f14f4SXin Li case 32: sum += qlp_coeff[31] * data[i-32]; /* Falls through. */
722*600f14f4SXin Li case 31: sum += qlp_coeff[30] * data[i-31]; /* Falls through. */
723*600f14f4SXin Li case 30: sum += qlp_coeff[29] * data[i-30]; /* Falls through. */
724*600f14f4SXin Li case 29: sum += qlp_coeff[28] * data[i-29]; /* Falls through. */
725*600f14f4SXin Li case 28: sum += qlp_coeff[27] * data[i-28]; /* Falls through. */
726*600f14f4SXin Li case 27: sum += qlp_coeff[26] * data[i-27]; /* Falls through. */
727*600f14f4SXin Li case 26: sum += qlp_coeff[25] * data[i-26]; /* Falls through. */
728*600f14f4SXin Li case 25: sum += qlp_coeff[24] * data[i-25]; /* Falls through. */
729*600f14f4SXin Li case 24: sum += qlp_coeff[23] * data[i-24]; /* Falls through. */
730*600f14f4SXin Li case 23: sum += qlp_coeff[22] * data[i-23]; /* Falls through. */
731*600f14f4SXin Li case 22: sum += qlp_coeff[21] * data[i-22]; /* Falls through. */
732*600f14f4SXin Li case 21: sum += qlp_coeff[20] * data[i-21]; /* Falls through. */
733*600f14f4SXin Li case 20: sum += qlp_coeff[19] * data[i-20]; /* Falls through. */
734*600f14f4SXin Li case 19: sum += qlp_coeff[18] * data[i-19]; /* Falls through. */
735*600f14f4SXin Li case 18: sum += qlp_coeff[17] * data[i-18]; /* Falls through. */
736*600f14f4SXin Li case 17: sum += qlp_coeff[16] * data[i-17]; /* Falls through. */
737*600f14f4SXin Li case 16: sum += qlp_coeff[15] * data[i-16]; /* Falls through. */
738*600f14f4SXin Li case 15: sum += qlp_coeff[14] * data[i-15]; /* Falls through. */
739*600f14f4SXin Li case 14: sum += qlp_coeff[13] * data[i-14]; /* Falls through. */
740*600f14f4SXin Li case 13: sum += qlp_coeff[12] * data[i-13];
741*600f14f4SXin Li sum += qlp_coeff[11] * data[i-12];
742*600f14f4SXin Li sum += qlp_coeff[10] * data[i-11];
743*600f14f4SXin Li sum += qlp_coeff[ 9] * data[i-10];
744*600f14f4SXin Li sum += qlp_coeff[ 8] * data[i- 9];
745*600f14f4SXin Li sum += qlp_coeff[ 7] * data[i- 8];
746*600f14f4SXin Li sum += qlp_coeff[ 6] * data[i- 7];
747*600f14f4SXin Li sum += qlp_coeff[ 5] * data[i- 6];
748*600f14f4SXin Li sum += qlp_coeff[ 4] * data[i- 5];
749*600f14f4SXin Li sum += qlp_coeff[ 3] * data[i- 4];
750*600f14f4SXin Li sum += qlp_coeff[ 2] * data[i- 3];
751*600f14f4SXin Li sum += qlp_coeff[ 1] * data[i- 2];
752*600f14f4SXin Li sum += qlp_coeff[ 0] * data[i- 1];
753*600f14f4SXin Li }
754*600f14f4SXin Li residual[i] = data[i] - (sum >> lp_quantization);
755*600f14f4SXin Li }
756*600f14f4SXin Li }
757*600f14f4SXin Li _mm256_zeroupper();
758*600f14f4SXin Li }
759*600f14f4SXin Li
760*600f14f4SXin Li static FLAC__int32 pack_arr[8] = { 0, 2, 4, 6, 1, 3, 5, 7 };
761*600f14f4SXin Li
762*600f14f4SXin Li FLAC__SSE_TARGET("avx2")
FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2(const FLAC__int32 * data,uint32_t data_len,const FLAC__int32 qlp_coeff[],uint32_t order,int lp_quantization,FLAC__int32 residual[])763*600f14f4SXin Li void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2(const FLAC__int32 *data, uint32_t data_len, const FLAC__int32 qlp_coeff[], uint32_t order, int lp_quantization, FLAC__int32 residual[])
764*600f14f4SXin Li {
765*600f14f4SXin Li int i;
766*600f14f4SXin Li FLAC__int64 sum;
767*600f14f4SXin Li const __m128i cnt = _mm_cvtsi32_si128(lp_quantization);
768*600f14f4SXin Li const __m256i pack = _mm256_loadu_si256((const __m256i *)(const void*)pack_arr);
769*600f14f4SXin Li
770*600f14f4SXin Li FLAC__ASSERT(order > 0);
771*600f14f4SXin Li FLAC__ASSERT(order <= 32);
772*600f14f4SXin Li FLAC__ASSERT(lp_quantization <= 32); /* there's no _mm256_sra_epi64() so we have to use _mm256_srl_epi64() */
773*600f14f4SXin Li
774*600f14f4SXin Li if(order <= 12) {
775*600f14f4SXin Li if(order > 8) {
776*600f14f4SXin Li if(order > 10) {
777*600f14f4SXin Li if(order == 12) {
778*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11;
779*600f14f4SXin Li q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ]));
780*600f14f4SXin Li q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ]));
781*600f14f4SXin Li q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ]));
782*600f14f4SXin Li q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ]));
783*600f14f4SXin Li q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ]));
784*600f14f4SXin Li q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ]));
785*600f14f4SXin Li q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ]));
786*600f14f4SXin Li q7 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[7 ]));
787*600f14f4SXin Li q8 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[8 ]));
788*600f14f4SXin Li q9 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[9 ]));
789*600f14f4SXin Li q10 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[10]));
790*600f14f4SXin Li q11 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[11]));
791*600f14f4SXin Li
792*600f14f4SXin Li for(i = 0; i < (int)data_len-3; i+=4) {
793*600f14f4SXin Li __m256i summ, mull;
794*600f14f4SXin Li summ = _mm256_mul_epi32(q11, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-12))));
795*600f14f4SXin Li mull = _mm256_mul_epi32(q10, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-11)))); summ = _mm256_add_epi64(summ, mull);
796*600f14f4SXin Li mull = _mm256_mul_epi32(q9, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-10)))); summ = _mm256_add_epi64(summ, mull);
797*600f14f4SXin Li mull = _mm256_mul_epi32(q8, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-9 )))); summ = _mm256_add_epi64(summ, mull);
798*600f14f4SXin Li mull = _mm256_mul_epi32(q7, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-8 )))); summ = _mm256_add_epi64(summ, mull);
799*600f14f4SXin Li mull = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-7 )))); summ = _mm256_add_epi64(summ, mull);
800*600f14f4SXin Li mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull);
801*600f14f4SXin Li mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull);
802*600f14f4SXin Li mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull);
803*600f14f4SXin Li mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull);
804*600f14f4SXin Li mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull);
805*600f14f4SXin Li mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull);
806*600f14f4SXin Li summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack);
807*600f14f4SXin Li _mm_storeu_si128((__m128i*)(void*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(const void*)(data+i)), _mm256_castsi256_si128(summ)));
808*600f14f4SXin Li }
809*600f14f4SXin Li }
810*600f14f4SXin Li else { /* order == 11 */
811*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10;
812*600f14f4SXin Li q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ]));
813*600f14f4SXin Li q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ]));
814*600f14f4SXin Li q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ]));
815*600f14f4SXin Li q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ]));
816*600f14f4SXin Li q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ]));
817*600f14f4SXin Li q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ]));
818*600f14f4SXin Li q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ]));
819*600f14f4SXin Li q7 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[7 ]));
820*600f14f4SXin Li q8 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[8 ]));
821*600f14f4SXin Li q9 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[9 ]));
822*600f14f4SXin Li q10 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[10]));
823*600f14f4SXin Li
824*600f14f4SXin Li for(i = 0; i < (int)data_len-3; i+=4) {
825*600f14f4SXin Li __m256i summ, mull;
826*600f14f4SXin Li summ = _mm256_mul_epi32(q10, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-11))));
827*600f14f4SXin Li mull = _mm256_mul_epi32(q9, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-10)))); summ = _mm256_add_epi64(summ, mull);
828*600f14f4SXin Li mull = _mm256_mul_epi32(q8, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-9 )))); summ = _mm256_add_epi64(summ, mull);
829*600f14f4SXin Li mull = _mm256_mul_epi32(q7, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-8 )))); summ = _mm256_add_epi64(summ, mull);
830*600f14f4SXin Li mull = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-7 )))); summ = _mm256_add_epi64(summ, mull);
831*600f14f4SXin Li mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull);
832*600f14f4SXin Li mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull);
833*600f14f4SXin Li mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull);
834*600f14f4SXin Li mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull);
835*600f14f4SXin Li mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull);
836*600f14f4SXin Li mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull);
837*600f14f4SXin Li summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack);
838*600f14f4SXin Li _mm_storeu_si128((__m128i*)(void*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(const void*)(data+i)), _mm256_castsi256_si128(summ)));
839*600f14f4SXin Li }
840*600f14f4SXin Li }
841*600f14f4SXin Li }
842*600f14f4SXin Li else {
843*600f14f4SXin Li if(order == 10) {
844*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9;
845*600f14f4SXin Li q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ]));
846*600f14f4SXin Li q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ]));
847*600f14f4SXin Li q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ]));
848*600f14f4SXin Li q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ]));
849*600f14f4SXin Li q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ]));
850*600f14f4SXin Li q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ]));
851*600f14f4SXin Li q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ]));
852*600f14f4SXin Li q7 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[7 ]));
853*600f14f4SXin Li q8 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[8 ]));
854*600f14f4SXin Li q9 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[9 ]));
855*600f14f4SXin Li
856*600f14f4SXin Li for(i = 0; i < (int)data_len-3; i+=4) {
857*600f14f4SXin Li __m256i summ, mull;
858*600f14f4SXin Li summ = _mm256_mul_epi32(q9, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-10))));
859*600f14f4SXin Li mull = _mm256_mul_epi32(q8, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-9 )))); summ = _mm256_add_epi64(summ, mull);
860*600f14f4SXin Li mull = _mm256_mul_epi32(q7, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-8 )))); summ = _mm256_add_epi64(summ, mull);
861*600f14f4SXin Li mull = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-7 )))); summ = _mm256_add_epi64(summ, mull);
862*600f14f4SXin Li mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull);
863*600f14f4SXin Li mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull);
864*600f14f4SXin Li mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull);
865*600f14f4SXin Li mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull);
866*600f14f4SXin Li mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull);
867*600f14f4SXin Li mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull);
868*600f14f4SXin Li summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack);
869*600f14f4SXin Li _mm_storeu_si128((__m128i*)(void*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(const void*)(data+i)), _mm256_castsi256_si128(summ)));
870*600f14f4SXin Li }
871*600f14f4SXin Li }
872*600f14f4SXin Li else { /* order == 9 */
873*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8;
874*600f14f4SXin Li q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ]));
875*600f14f4SXin Li q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ]));
876*600f14f4SXin Li q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ]));
877*600f14f4SXin Li q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ]));
878*600f14f4SXin Li q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ]));
879*600f14f4SXin Li q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ]));
880*600f14f4SXin Li q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ]));
881*600f14f4SXin Li q7 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[7 ]));
882*600f14f4SXin Li q8 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[8 ]));
883*600f14f4SXin Li
884*600f14f4SXin Li for(i = 0; i < (int)data_len-3; i+=4) {
885*600f14f4SXin Li __m256i summ, mull;
886*600f14f4SXin Li summ = _mm256_mul_epi32(q8, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-9 ))));
887*600f14f4SXin Li mull = _mm256_mul_epi32(q7, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-8 )))); summ = _mm256_add_epi64(summ, mull);
888*600f14f4SXin Li mull = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-7 )))); summ = _mm256_add_epi64(summ, mull);
889*600f14f4SXin Li mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull);
890*600f14f4SXin Li mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull);
891*600f14f4SXin Li mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull);
892*600f14f4SXin Li mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull);
893*600f14f4SXin Li mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull);
894*600f14f4SXin Li mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull);
895*600f14f4SXin Li summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack);
896*600f14f4SXin Li _mm_storeu_si128((__m128i*)(void*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(const void*)(data+i)), _mm256_castsi256_si128(summ)));
897*600f14f4SXin Li }
898*600f14f4SXin Li }
899*600f14f4SXin Li }
900*600f14f4SXin Li }
901*600f14f4SXin Li else if(order > 4) {
902*600f14f4SXin Li if(order > 6) {
903*600f14f4SXin Li if(order == 8) {
904*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6, q7;
905*600f14f4SXin Li q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ]));
906*600f14f4SXin Li q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ]));
907*600f14f4SXin Li q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ]));
908*600f14f4SXin Li q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ]));
909*600f14f4SXin Li q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ]));
910*600f14f4SXin Li q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ]));
911*600f14f4SXin Li q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ]));
912*600f14f4SXin Li q7 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[7 ]));
913*600f14f4SXin Li
914*600f14f4SXin Li for(i = 0; i < (int)data_len-3; i+=4) {
915*600f14f4SXin Li __m256i summ, mull;
916*600f14f4SXin Li summ = _mm256_mul_epi32(q7, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-8 ))));
917*600f14f4SXin Li mull = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-7 )))); summ = _mm256_add_epi64(summ, mull);
918*600f14f4SXin Li mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull);
919*600f14f4SXin Li mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull);
920*600f14f4SXin Li mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull);
921*600f14f4SXin Li mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull);
922*600f14f4SXin Li mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull);
923*600f14f4SXin Li mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull);
924*600f14f4SXin Li summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack);
925*600f14f4SXin Li _mm_storeu_si128((__m128i*)(void*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(const void*)(data+i)), _mm256_castsi256_si128(summ)));
926*600f14f4SXin Li }
927*600f14f4SXin Li }
928*600f14f4SXin Li else { /* order == 7 */
929*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5, q6;
930*600f14f4SXin Li q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ]));
931*600f14f4SXin Li q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ]));
932*600f14f4SXin Li q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ]));
933*600f14f4SXin Li q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ]));
934*600f14f4SXin Li q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ]));
935*600f14f4SXin Li q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ]));
936*600f14f4SXin Li q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ]));
937*600f14f4SXin Li
938*600f14f4SXin Li for(i = 0; i < (int)data_len-3; i+=4) {
939*600f14f4SXin Li __m256i summ, mull;
940*600f14f4SXin Li summ = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-7 ))));
941*600f14f4SXin Li mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull);
942*600f14f4SXin Li mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull);
943*600f14f4SXin Li mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull);
944*600f14f4SXin Li mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull);
945*600f14f4SXin Li mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull);
946*600f14f4SXin Li mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull);
947*600f14f4SXin Li summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack);
948*600f14f4SXin Li _mm_storeu_si128((__m128i*)(void*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(const void*)(data+i)), _mm256_castsi256_si128(summ)));
949*600f14f4SXin Li }
950*600f14f4SXin Li }
951*600f14f4SXin Li }
952*600f14f4SXin Li else {
953*600f14f4SXin Li if(order == 6) {
954*600f14f4SXin Li __m256i q0, q1, q2, q3, q4, q5;
955*600f14f4SXin Li q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ]));
956*600f14f4SXin Li q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ]));
957*600f14f4SXin Li q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ]));
958*600f14f4SXin Li q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ]));
959*600f14f4SXin Li q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ]));
960*600f14f4SXin Li q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ]));
961*600f14f4SXin Li
962*600f14f4SXin Li for(i = 0; i < (int)data_len-3; i+=4) {
963*600f14f4SXin Li __m256i summ, mull;
964*600f14f4SXin Li summ = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-6 ))));
965*600f14f4SXin Li mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull);
966*600f14f4SXin Li mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull);
967*600f14f4SXin Li mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull);
968*600f14f4SXin Li mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull);
969*600f14f4SXin Li mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull);
970*600f14f4SXin Li summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack);
971*600f14f4SXin Li _mm_storeu_si128((__m128i*)(void*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(const void*)(data+i)), _mm256_castsi256_si128(summ)));
972*600f14f4SXin Li }
973*600f14f4SXin Li }
974*600f14f4SXin Li else { /* order == 5 */
975*600f14f4SXin Li __m256i q0, q1, q2, q3, q4;
976*600f14f4SXin Li q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ]));
977*600f14f4SXin Li q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ]));
978*600f14f4SXin Li q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ]));
979*600f14f4SXin Li q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ]));
980*600f14f4SXin Li q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ]));
981*600f14f4SXin Li
982*600f14f4SXin Li for(i = 0; i < (int)data_len-3; i+=4) {
983*600f14f4SXin Li __m256i summ, mull;
984*600f14f4SXin Li summ = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-5 ))));
985*600f14f4SXin Li mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull);
986*600f14f4SXin Li mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull);
987*600f14f4SXin Li mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull);
988*600f14f4SXin Li mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull);
989*600f14f4SXin Li summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack);
990*600f14f4SXin Li _mm_storeu_si128((__m128i*)(void*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(const void*)(data+i)), _mm256_castsi256_si128(summ)));
991*600f14f4SXin Li }
992*600f14f4SXin Li }
993*600f14f4SXin Li }
994*600f14f4SXin Li }
995*600f14f4SXin Li else {
996*600f14f4SXin Li if(order > 2) {
997*600f14f4SXin Li if(order == 4) {
998*600f14f4SXin Li __m256i q0, q1, q2, q3;
999*600f14f4SXin Li q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ]));
1000*600f14f4SXin Li q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ]));
1001*600f14f4SXin Li q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ]));
1002*600f14f4SXin Li q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ]));
1003*600f14f4SXin Li
1004*600f14f4SXin Li for(i = 0; i < (int)data_len-3; i+=4) {
1005*600f14f4SXin Li __m256i summ, mull;
1006*600f14f4SXin Li summ = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-4 ))));
1007*600f14f4SXin Li mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull);
1008*600f14f4SXin Li mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull);
1009*600f14f4SXin Li mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull);
1010*600f14f4SXin Li summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack);
1011*600f14f4SXin Li _mm_storeu_si128((__m128i*)(void*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(const void*)(data+i)), _mm256_castsi256_si128(summ)));
1012*600f14f4SXin Li }
1013*600f14f4SXin Li }
1014*600f14f4SXin Li else { /* order == 3 */
1015*600f14f4SXin Li __m256i q0, q1, q2;
1016*600f14f4SXin Li q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ]));
1017*600f14f4SXin Li q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ]));
1018*600f14f4SXin Li q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ]));
1019*600f14f4SXin Li
1020*600f14f4SXin Li for(i = 0; i < (int)data_len-3; i+=4) {
1021*600f14f4SXin Li __m256i summ, mull;
1022*600f14f4SXin Li summ = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-3 ))));
1023*600f14f4SXin Li mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull);
1024*600f14f4SXin Li mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull);
1025*600f14f4SXin Li summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack);
1026*600f14f4SXin Li _mm_storeu_si128((__m128i*)(void*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(const void*)(data+i)), _mm256_castsi256_si128(summ)));
1027*600f14f4SXin Li }
1028*600f14f4SXin Li }
1029*600f14f4SXin Li }
1030*600f14f4SXin Li else {
1031*600f14f4SXin Li if(order == 2) {
1032*600f14f4SXin Li __m256i q0, q1;
1033*600f14f4SXin Li q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ]));
1034*600f14f4SXin Li q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ]));
1035*600f14f4SXin Li
1036*600f14f4SXin Li for(i = 0; i < (int)data_len-3; i+=4) {
1037*600f14f4SXin Li __m256i summ, mull;
1038*600f14f4SXin Li summ = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-2 ))));
1039*600f14f4SXin Li mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull);
1040*600f14f4SXin Li summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack);
1041*600f14f4SXin Li _mm_storeu_si128((__m128i*)(void*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(const void*)(data+i)), _mm256_castsi256_si128(summ)));
1042*600f14f4SXin Li }
1043*600f14f4SXin Li }
1044*600f14f4SXin Li else { /* order == 1 */
1045*600f14f4SXin Li __m256i q0;
1046*600f14f4SXin Li q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ]));
1047*600f14f4SXin Li
1048*600f14f4SXin Li for(i = 0; i < (int)data_len-3; i+=4) {
1049*600f14f4SXin Li __m256i summ;
1050*600f14f4SXin Li summ = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(const void*)(data+i-1 ))));
1051*600f14f4SXin Li summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack);
1052*600f14f4SXin Li _mm_storeu_si128((__m128i*)(void*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(const void*)(data+i)), _mm256_castsi256_si128(summ)));
1053*600f14f4SXin Li }
1054*600f14f4SXin Li }
1055*600f14f4SXin Li }
1056*600f14f4SXin Li }
1057*600f14f4SXin Li for(; i < (int)data_len; i++) {
1058*600f14f4SXin Li sum = 0;
1059*600f14f4SXin Li switch(order) {
1060*600f14f4SXin Li case 12: sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; /* Falls through. */
1061*600f14f4SXin Li case 11: sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; /* Falls through. */
1062*600f14f4SXin Li case 10: sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; /* Falls through. */
1063*600f14f4SXin Li case 9: sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; /* Falls through. */
1064*600f14f4SXin Li case 8: sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; /* Falls through. */
1065*600f14f4SXin Li case 7: sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; /* Falls through. */
1066*600f14f4SXin Li case 6: sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; /* Falls through. */
1067*600f14f4SXin Li case 5: sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; /* Falls through. */
1068*600f14f4SXin Li case 4: sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; /* Falls through. */
1069*600f14f4SXin Li case 3: sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; /* Falls through. */
1070*600f14f4SXin Li case 2: sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; /* Falls through. */
1071*600f14f4SXin Li case 1: sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1];
1072*600f14f4SXin Li }
1073*600f14f4SXin Li residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization);
1074*600f14f4SXin Li }
1075*600f14f4SXin Li }
1076*600f14f4SXin Li else { /* order > 12 */
1077*600f14f4SXin Li for(i = 0; i < (int)data_len; i++) {
1078*600f14f4SXin Li sum = 0;
1079*600f14f4SXin Li switch(order) {
1080*600f14f4SXin Li case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; /* Falls through. */
1081*600f14f4SXin Li case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; /* Falls through. */
1082*600f14f4SXin Li case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; /* Falls through. */
1083*600f14f4SXin Li case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; /* Falls through. */
1084*600f14f4SXin Li case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; /* Falls through. */
1085*600f14f4SXin Li case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; /* Falls through. */
1086*600f14f4SXin Li case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; /* Falls through. */
1087*600f14f4SXin Li case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; /* Falls through. */
1088*600f14f4SXin Li case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; /* Falls through. */
1089*600f14f4SXin Li case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; /* Falls through. */
1090*600f14f4SXin Li case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; /* Falls through. */
1091*600f14f4SXin Li case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; /* Falls through. */
1092*600f14f4SXin Li case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; /* Falls through. */
1093*600f14f4SXin Li case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; /* Falls through. */
1094*600f14f4SXin Li case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; /* Falls through. */
1095*600f14f4SXin Li case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; /* Falls through. */
1096*600f14f4SXin Li case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; /* Falls through. */
1097*600f14f4SXin Li case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; /* Falls through. */
1098*600f14f4SXin Li case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; /* Falls through. */
1099*600f14f4SXin Li case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13];
1100*600f14f4SXin Li sum += qlp_coeff[11] * (FLAC__int64)data[i-12];
1101*600f14f4SXin Li sum += qlp_coeff[10] * (FLAC__int64)data[i-11];
1102*600f14f4SXin Li sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10];
1103*600f14f4SXin Li sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9];
1104*600f14f4SXin Li sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8];
1105*600f14f4SXin Li sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7];
1106*600f14f4SXin Li sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6];
1107*600f14f4SXin Li sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5];
1108*600f14f4SXin Li sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4];
1109*600f14f4SXin Li sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3];
1110*600f14f4SXin Li sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2];
1111*600f14f4SXin Li sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1];
1112*600f14f4SXin Li }
1113*600f14f4SXin Li residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization);
1114*600f14f4SXin Li }
1115*600f14f4SXin Li }
1116*600f14f4SXin Li _mm256_zeroupper();
1117*600f14f4SXin Li }
1118*600f14f4SXin Li
1119*600f14f4SXin Li #endif /* FLAC__AVX2_SUPPORTED */
1120*600f14f4SXin Li #endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */
1121*600f14f4SXin Li #endif /* FLAC__NO_ASM */
1122*600f14f4SXin Li #endif /* FLAC__INTEGER_ONLY_LIBRARY */
1123