1 /*
2  *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include <immintrin.h>  // AVX2
12 
13 #include "./vpx_dsp_rtcd.h"
14 #include "vpx_dsp/txfm_common.h"
15 
16 #define pair256_set_epi16(a, b)                                            \
17   _mm256_set_epi16((int16_t)(b), (int16_t)(a), (int16_t)(b), (int16_t)(a), \
18                    (int16_t)(b), (int16_t)(a), (int16_t)(b), (int16_t)(a), \
19                    (int16_t)(b), (int16_t)(a), (int16_t)(b), (int16_t)(a), \
20                    (int16_t)(b), (int16_t)(a), (int16_t)(b), (int16_t)(a))
21 
22 #define pair256_set_epi32(a, b)                                                \
23   _mm256_set_epi32((int)(b), (int)(a), (int)(b), (int)(a), (int)(b), (int)(a), \
24                    (int)(b), (int)(a))
25 
26 #if FDCT32x32_HIGH_PRECISION
k_madd_epi32_avx2(__m256i a,__m256i b)27 static INLINE __m256i k_madd_epi32_avx2(__m256i a, __m256i b) {
28   __m256i buf0, buf1;
29   buf0 = _mm256_mul_epu32(a, b);
30   a = _mm256_srli_epi64(a, 32);
31   b = _mm256_srli_epi64(b, 32);
32   buf1 = _mm256_mul_epu32(a, b);
33   return _mm256_add_epi64(buf0, buf1);
34 }
35 
k_packs_epi64_avx2(__m256i a,__m256i b)36 static INLINE __m256i k_packs_epi64_avx2(__m256i a, __m256i b) {
37   __m256i buf0 = _mm256_shuffle_epi32(a, _MM_SHUFFLE(0, 0, 2, 0));
38   __m256i buf1 = _mm256_shuffle_epi32(b, _MM_SHUFFLE(0, 0, 2, 0));
39   return _mm256_unpacklo_epi64(buf0, buf1);
40 }
41 #endif
42 
FDCT32x32_2D_AVX2(const int16_t * input,int16_t * output_org,int stride)43 void FDCT32x32_2D_AVX2(const int16_t *input, int16_t *output_org, int stride) {
44   // Calculate pre-multiplied strides
45   const int str1 = stride;
46   const int str2 = 2 * stride;
47   const int str3 = 2 * stride + str1;
48   // We need an intermediate buffer between passes.
49   DECLARE_ALIGNED(32, int16_t, intermediate[32 * 32]);
50   // Constants
51   //    When we use them, in one case, they are all the same. In all others
52   //    it's a pair of them that we need to repeat four times. This is done
53   //    by constructing the 32 bit constant corresponding to that pair.
54   const __m256i k__cospi_p16_p16 = _mm256_set1_epi16((int16_t)cospi_16_64);
55   const __m256i k__cospi_p16_m16 =
56       pair256_set_epi16(+cospi_16_64, -cospi_16_64);
57   const __m256i k__cospi_m08_p24 = pair256_set_epi16(-cospi_8_64, cospi_24_64);
58   const __m256i k__cospi_m24_m08 = pair256_set_epi16(-cospi_24_64, -cospi_8_64);
59   const __m256i k__cospi_p24_p08 = pair256_set_epi16(+cospi_24_64, cospi_8_64);
60   const __m256i k__cospi_p12_p20 = pair256_set_epi16(+cospi_12_64, cospi_20_64);
61   const __m256i k__cospi_m20_p12 = pair256_set_epi16(-cospi_20_64, cospi_12_64);
62   const __m256i k__cospi_m04_p28 = pair256_set_epi16(-cospi_4_64, cospi_28_64);
63   const __m256i k__cospi_p28_p04 = pair256_set_epi16(+cospi_28_64, cospi_4_64);
64   const __m256i k__cospi_m28_m04 = pair256_set_epi16(-cospi_28_64, -cospi_4_64);
65   const __m256i k__cospi_m12_m20 =
66       pair256_set_epi16(-cospi_12_64, -cospi_20_64);
67   const __m256i k__cospi_p30_p02 = pair256_set_epi16(+cospi_30_64, cospi_2_64);
68   const __m256i k__cospi_p14_p18 = pair256_set_epi16(+cospi_14_64, cospi_18_64);
69   const __m256i k__cospi_p22_p10 = pair256_set_epi16(+cospi_22_64, cospi_10_64);
70   const __m256i k__cospi_p06_p26 = pair256_set_epi16(+cospi_6_64, cospi_26_64);
71   const __m256i k__cospi_m26_p06 = pair256_set_epi16(-cospi_26_64, cospi_6_64);
72   const __m256i k__cospi_m10_p22 = pair256_set_epi16(-cospi_10_64, cospi_22_64);
73   const __m256i k__cospi_m18_p14 = pair256_set_epi16(-cospi_18_64, cospi_14_64);
74   const __m256i k__cospi_m02_p30 = pair256_set_epi16(-cospi_2_64, cospi_30_64);
75   const __m256i k__cospi_p31_p01 = pair256_set_epi16(+cospi_31_64, cospi_1_64);
76   const __m256i k__cospi_p15_p17 = pair256_set_epi16(+cospi_15_64, cospi_17_64);
77   const __m256i k__cospi_p23_p09 = pair256_set_epi16(+cospi_23_64, cospi_9_64);
78   const __m256i k__cospi_p07_p25 = pair256_set_epi16(+cospi_7_64, cospi_25_64);
79   const __m256i k__cospi_m25_p07 = pair256_set_epi16(-cospi_25_64, cospi_7_64);
80   const __m256i k__cospi_m09_p23 = pair256_set_epi16(-cospi_9_64, cospi_23_64);
81   const __m256i k__cospi_m17_p15 = pair256_set_epi16(-cospi_17_64, cospi_15_64);
82   const __m256i k__cospi_m01_p31 = pair256_set_epi16(-cospi_1_64, cospi_31_64);
83   const __m256i k__cospi_p27_p05 = pair256_set_epi16(+cospi_27_64, cospi_5_64);
84   const __m256i k__cospi_p11_p21 = pair256_set_epi16(+cospi_11_64, cospi_21_64);
85   const __m256i k__cospi_p19_p13 = pair256_set_epi16(+cospi_19_64, cospi_13_64);
86   const __m256i k__cospi_p03_p29 = pair256_set_epi16(+cospi_3_64, cospi_29_64);
87   const __m256i k__cospi_m29_p03 = pair256_set_epi16(-cospi_29_64, cospi_3_64);
88   const __m256i k__cospi_m13_p19 = pair256_set_epi16(-cospi_13_64, cospi_19_64);
89   const __m256i k__cospi_m21_p11 = pair256_set_epi16(-cospi_21_64, cospi_11_64);
90   const __m256i k__cospi_m05_p27 = pair256_set_epi16(-cospi_5_64, cospi_27_64);
91   const __m256i k__DCT_CONST_ROUNDING = _mm256_set1_epi32(DCT_CONST_ROUNDING);
92   const __m256i kZero = _mm256_set1_epi16(0);
93   const __m256i kOne = _mm256_set1_epi16(1);
94   // Do the two transform/transpose passes
95   int pass;
96   for (pass = 0; pass < 2; ++pass) {
97     // We process sixteen columns (transposed rows in second pass) at a time.
98     int column_start;
99     for (column_start = 0; column_start < 32; column_start += 16) {
100       __m256i step1[32];
101       __m256i step2[32];
102       __m256i step3[32];
103       __m256i out[32];
104       // Stage 1
105       // Note: even though all the loads below are aligned, using the aligned
106       //       intrinsic make the code slightly slower.
107       if (0 == pass) {
108         const int16_t *in = &input[column_start];
109         // step1[i] =  (in[ 0 * stride] + in[(32 -  1) * stride]) << 2;
110         // Note: the next four blocks could be in a loop. That would help the
111         //       instruction cache but is actually slower.
112         {
113           const int16_t *ina = in + 0 * str1;
114           const int16_t *inb = in + 31 * str1;
115           __m256i *step1a = &step1[0];
116           __m256i *step1b = &step1[31];
117           const __m256i ina0 = _mm256_loadu_si256((const __m256i *)(ina));
118           const __m256i ina1 =
119               _mm256_loadu_si256((const __m256i *)(ina + str1));
120           const __m256i ina2 =
121               _mm256_loadu_si256((const __m256i *)(ina + str2));
122           const __m256i ina3 =
123               _mm256_loadu_si256((const __m256i *)(ina + str3));
124           const __m256i inb3 =
125               _mm256_loadu_si256((const __m256i *)(inb - str3));
126           const __m256i inb2 =
127               _mm256_loadu_si256((const __m256i *)(inb - str2));
128           const __m256i inb1 =
129               _mm256_loadu_si256((const __m256i *)(inb - str1));
130           const __m256i inb0 = _mm256_loadu_si256((const __m256i *)(inb));
131           step1a[0] = _mm256_add_epi16(ina0, inb0);
132           step1a[1] = _mm256_add_epi16(ina1, inb1);
133           step1a[2] = _mm256_add_epi16(ina2, inb2);
134           step1a[3] = _mm256_add_epi16(ina3, inb3);
135           step1b[-3] = _mm256_sub_epi16(ina3, inb3);
136           step1b[-2] = _mm256_sub_epi16(ina2, inb2);
137           step1b[-1] = _mm256_sub_epi16(ina1, inb1);
138           step1b[-0] = _mm256_sub_epi16(ina0, inb0);
139           step1a[0] = _mm256_slli_epi16(step1a[0], 2);
140           step1a[1] = _mm256_slli_epi16(step1a[1], 2);
141           step1a[2] = _mm256_slli_epi16(step1a[2], 2);
142           step1a[3] = _mm256_slli_epi16(step1a[3], 2);
143           step1b[-3] = _mm256_slli_epi16(step1b[-3], 2);
144           step1b[-2] = _mm256_slli_epi16(step1b[-2], 2);
145           step1b[-1] = _mm256_slli_epi16(step1b[-1], 2);
146           step1b[-0] = _mm256_slli_epi16(step1b[-0], 2);
147         }
148         {
149           const int16_t *ina = in + 4 * str1;
150           const int16_t *inb = in + 27 * str1;
151           __m256i *step1a = &step1[4];
152           __m256i *step1b = &step1[27];
153           const __m256i ina0 = _mm256_loadu_si256((const __m256i *)(ina));
154           const __m256i ina1 =
155               _mm256_loadu_si256((const __m256i *)(ina + str1));
156           const __m256i ina2 =
157               _mm256_loadu_si256((const __m256i *)(ina + str2));
158           const __m256i ina3 =
159               _mm256_loadu_si256((const __m256i *)(ina + str3));
160           const __m256i inb3 =
161               _mm256_loadu_si256((const __m256i *)(inb - str3));
162           const __m256i inb2 =
163               _mm256_loadu_si256((const __m256i *)(inb - str2));
164           const __m256i inb1 =
165               _mm256_loadu_si256((const __m256i *)(inb - str1));
166           const __m256i inb0 = _mm256_loadu_si256((const __m256i *)(inb));
167           step1a[0] = _mm256_add_epi16(ina0, inb0);
168           step1a[1] = _mm256_add_epi16(ina1, inb1);
169           step1a[2] = _mm256_add_epi16(ina2, inb2);
170           step1a[3] = _mm256_add_epi16(ina3, inb3);
171           step1b[-3] = _mm256_sub_epi16(ina3, inb3);
172           step1b[-2] = _mm256_sub_epi16(ina2, inb2);
173           step1b[-1] = _mm256_sub_epi16(ina1, inb1);
174           step1b[-0] = _mm256_sub_epi16(ina0, inb0);
175           step1a[0] = _mm256_slli_epi16(step1a[0], 2);
176           step1a[1] = _mm256_slli_epi16(step1a[1], 2);
177           step1a[2] = _mm256_slli_epi16(step1a[2], 2);
178           step1a[3] = _mm256_slli_epi16(step1a[3], 2);
179           step1b[-3] = _mm256_slli_epi16(step1b[-3], 2);
180           step1b[-2] = _mm256_slli_epi16(step1b[-2], 2);
181           step1b[-1] = _mm256_slli_epi16(step1b[-1], 2);
182           step1b[-0] = _mm256_slli_epi16(step1b[-0], 2);
183         }
184         {
185           const int16_t *ina = in + 8 * str1;
186           const int16_t *inb = in + 23 * str1;
187           __m256i *step1a = &step1[8];
188           __m256i *step1b = &step1[23];
189           const __m256i ina0 = _mm256_loadu_si256((const __m256i *)(ina));
190           const __m256i ina1 =
191               _mm256_loadu_si256((const __m256i *)(ina + str1));
192           const __m256i ina2 =
193               _mm256_loadu_si256((const __m256i *)(ina + str2));
194           const __m256i ina3 =
195               _mm256_loadu_si256((const __m256i *)(ina + str3));
196           const __m256i inb3 =
197               _mm256_loadu_si256((const __m256i *)(inb - str3));
198           const __m256i inb2 =
199               _mm256_loadu_si256((const __m256i *)(inb - str2));
200           const __m256i inb1 =
201               _mm256_loadu_si256((const __m256i *)(inb - str1));
202           const __m256i inb0 = _mm256_loadu_si256((const __m256i *)(inb));
203           step1a[0] = _mm256_add_epi16(ina0, inb0);
204           step1a[1] = _mm256_add_epi16(ina1, inb1);
205           step1a[2] = _mm256_add_epi16(ina2, inb2);
206           step1a[3] = _mm256_add_epi16(ina3, inb3);
207           step1b[-3] = _mm256_sub_epi16(ina3, inb3);
208           step1b[-2] = _mm256_sub_epi16(ina2, inb2);
209           step1b[-1] = _mm256_sub_epi16(ina1, inb1);
210           step1b[-0] = _mm256_sub_epi16(ina0, inb0);
211           step1a[0] = _mm256_slli_epi16(step1a[0], 2);
212           step1a[1] = _mm256_slli_epi16(step1a[1], 2);
213           step1a[2] = _mm256_slli_epi16(step1a[2], 2);
214           step1a[3] = _mm256_slli_epi16(step1a[3], 2);
215           step1b[-3] = _mm256_slli_epi16(step1b[-3], 2);
216           step1b[-2] = _mm256_slli_epi16(step1b[-2], 2);
217           step1b[-1] = _mm256_slli_epi16(step1b[-1], 2);
218           step1b[-0] = _mm256_slli_epi16(step1b[-0], 2);
219         }
220         {
221           const int16_t *ina = in + 12 * str1;
222           const int16_t *inb = in + 19 * str1;
223           __m256i *step1a = &step1[12];
224           __m256i *step1b = &step1[19];
225           const __m256i ina0 = _mm256_loadu_si256((const __m256i *)(ina));
226           const __m256i ina1 =
227               _mm256_loadu_si256((const __m256i *)(ina + str1));
228           const __m256i ina2 =
229               _mm256_loadu_si256((const __m256i *)(ina + str2));
230           const __m256i ina3 =
231               _mm256_loadu_si256((const __m256i *)(ina + str3));
232           const __m256i inb3 =
233               _mm256_loadu_si256((const __m256i *)(inb - str3));
234           const __m256i inb2 =
235               _mm256_loadu_si256((const __m256i *)(inb - str2));
236           const __m256i inb1 =
237               _mm256_loadu_si256((const __m256i *)(inb - str1));
238           const __m256i inb0 = _mm256_loadu_si256((const __m256i *)(inb));
239           step1a[0] = _mm256_add_epi16(ina0, inb0);
240           step1a[1] = _mm256_add_epi16(ina1, inb1);
241           step1a[2] = _mm256_add_epi16(ina2, inb2);
242           step1a[3] = _mm256_add_epi16(ina3, inb3);
243           step1b[-3] = _mm256_sub_epi16(ina3, inb3);
244           step1b[-2] = _mm256_sub_epi16(ina2, inb2);
245           step1b[-1] = _mm256_sub_epi16(ina1, inb1);
246           step1b[-0] = _mm256_sub_epi16(ina0, inb0);
247           step1a[0] = _mm256_slli_epi16(step1a[0], 2);
248           step1a[1] = _mm256_slli_epi16(step1a[1], 2);
249           step1a[2] = _mm256_slli_epi16(step1a[2], 2);
250           step1a[3] = _mm256_slli_epi16(step1a[3], 2);
251           step1b[-3] = _mm256_slli_epi16(step1b[-3], 2);
252           step1b[-2] = _mm256_slli_epi16(step1b[-2], 2);
253           step1b[-1] = _mm256_slli_epi16(step1b[-1], 2);
254           step1b[-0] = _mm256_slli_epi16(step1b[-0], 2);
255         }
256       } else {
257         int16_t *in = &intermediate[column_start];
258         // step1[i] =  in[ 0 * 32] + in[(32 -  1) * 32];
259         // Note: using the same approach as above to have common offset is
260         //       counter-productive as all offsets can be calculated at compile
261         //       time.
262         // Note: the next four blocks could be in a loop. That would help the
263         //       instruction cache but is actually slower.
264         {
265           __m256i in00 = _mm256_loadu_si256((const __m256i *)(in + 0 * 32));
266           __m256i in01 = _mm256_loadu_si256((const __m256i *)(in + 1 * 32));
267           __m256i in02 = _mm256_loadu_si256((const __m256i *)(in + 2 * 32));
268           __m256i in03 = _mm256_loadu_si256((const __m256i *)(in + 3 * 32));
269           __m256i in28 = _mm256_loadu_si256((const __m256i *)(in + 28 * 32));
270           __m256i in29 = _mm256_loadu_si256((const __m256i *)(in + 29 * 32));
271           __m256i in30 = _mm256_loadu_si256((const __m256i *)(in + 30 * 32));
272           __m256i in31 = _mm256_loadu_si256((const __m256i *)(in + 31 * 32));
273           step1[0] = _mm256_add_epi16(in00, in31);
274           step1[1] = _mm256_add_epi16(in01, in30);
275           step1[2] = _mm256_add_epi16(in02, in29);
276           step1[3] = _mm256_add_epi16(in03, in28);
277           step1[28] = _mm256_sub_epi16(in03, in28);
278           step1[29] = _mm256_sub_epi16(in02, in29);
279           step1[30] = _mm256_sub_epi16(in01, in30);
280           step1[31] = _mm256_sub_epi16(in00, in31);
281         }
282         {
283           __m256i in04 = _mm256_loadu_si256((const __m256i *)(in + 4 * 32));
284           __m256i in05 = _mm256_loadu_si256((const __m256i *)(in + 5 * 32));
285           __m256i in06 = _mm256_loadu_si256((const __m256i *)(in + 6 * 32));
286           __m256i in07 = _mm256_loadu_si256((const __m256i *)(in + 7 * 32));
287           __m256i in24 = _mm256_loadu_si256((const __m256i *)(in + 24 * 32));
288           __m256i in25 = _mm256_loadu_si256((const __m256i *)(in + 25 * 32));
289           __m256i in26 = _mm256_loadu_si256((const __m256i *)(in + 26 * 32));
290           __m256i in27 = _mm256_loadu_si256((const __m256i *)(in + 27 * 32));
291           step1[4] = _mm256_add_epi16(in04, in27);
292           step1[5] = _mm256_add_epi16(in05, in26);
293           step1[6] = _mm256_add_epi16(in06, in25);
294           step1[7] = _mm256_add_epi16(in07, in24);
295           step1[24] = _mm256_sub_epi16(in07, in24);
296           step1[25] = _mm256_sub_epi16(in06, in25);
297           step1[26] = _mm256_sub_epi16(in05, in26);
298           step1[27] = _mm256_sub_epi16(in04, in27);
299         }
300         {
301           __m256i in08 = _mm256_loadu_si256((const __m256i *)(in + 8 * 32));
302           __m256i in09 = _mm256_loadu_si256((const __m256i *)(in + 9 * 32));
303           __m256i in10 = _mm256_loadu_si256((const __m256i *)(in + 10 * 32));
304           __m256i in11 = _mm256_loadu_si256((const __m256i *)(in + 11 * 32));
305           __m256i in20 = _mm256_loadu_si256((const __m256i *)(in + 20 * 32));
306           __m256i in21 = _mm256_loadu_si256((const __m256i *)(in + 21 * 32));
307           __m256i in22 = _mm256_loadu_si256((const __m256i *)(in + 22 * 32));
308           __m256i in23 = _mm256_loadu_si256((const __m256i *)(in + 23 * 32));
309           step1[8] = _mm256_add_epi16(in08, in23);
310           step1[9] = _mm256_add_epi16(in09, in22);
311           step1[10] = _mm256_add_epi16(in10, in21);
312           step1[11] = _mm256_add_epi16(in11, in20);
313           step1[20] = _mm256_sub_epi16(in11, in20);
314           step1[21] = _mm256_sub_epi16(in10, in21);
315           step1[22] = _mm256_sub_epi16(in09, in22);
316           step1[23] = _mm256_sub_epi16(in08, in23);
317         }
318         {
319           __m256i in12 = _mm256_loadu_si256((const __m256i *)(in + 12 * 32));
320           __m256i in13 = _mm256_loadu_si256((const __m256i *)(in + 13 * 32));
321           __m256i in14 = _mm256_loadu_si256((const __m256i *)(in + 14 * 32));
322           __m256i in15 = _mm256_loadu_si256((const __m256i *)(in + 15 * 32));
323           __m256i in16 = _mm256_loadu_si256((const __m256i *)(in + 16 * 32));
324           __m256i in17 = _mm256_loadu_si256((const __m256i *)(in + 17 * 32));
325           __m256i in18 = _mm256_loadu_si256((const __m256i *)(in + 18 * 32));
326           __m256i in19 = _mm256_loadu_si256((const __m256i *)(in + 19 * 32));
327           step1[12] = _mm256_add_epi16(in12, in19);
328           step1[13] = _mm256_add_epi16(in13, in18);
329           step1[14] = _mm256_add_epi16(in14, in17);
330           step1[15] = _mm256_add_epi16(in15, in16);
331           step1[16] = _mm256_sub_epi16(in15, in16);
332           step1[17] = _mm256_sub_epi16(in14, in17);
333           step1[18] = _mm256_sub_epi16(in13, in18);
334           step1[19] = _mm256_sub_epi16(in12, in19);
335         }
336       }
337       // Stage 2
338       {
339         step2[0] = _mm256_add_epi16(step1[0], step1[15]);
340         step2[1] = _mm256_add_epi16(step1[1], step1[14]);
341         step2[2] = _mm256_add_epi16(step1[2], step1[13]);
342         step2[3] = _mm256_add_epi16(step1[3], step1[12]);
343         step2[4] = _mm256_add_epi16(step1[4], step1[11]);
344         step2[5] = _mm256_add_epi16(step1[5], step1[10]);
345         step2[6] = _mm256_add_epi16(step1[6], step1[9]);
346         step2[7] = _mm256_add_epi16(step1[7], step1[8]);
347         step2[8] = _mm256_sub_epi16(step1[7], step1[8]);
348         step2[9] = _mm256_sub_epi16(step1[6], step1[9]);
349         step2[10] = _mm256_sub_epi16(step1[5], step1[10]);
350         step2[11] = _mm256_sub_epi16(step1[4], step1[11]);
351         step2[12] = _mm256_sub_epi16(step1[3], step1[12]);
352         step2[13] = _mm256_sub_epi16(step1[2], step1[13]);
353         step2[14] = _mm256_sub_epi16(step1[1], step1[14]);
354         step2[15] = _mm256_sub_epi16(step1[0], step1[15]);
355       }
356       {
357         const __m256i s2_20_0 = _mm256_unpacklo_epi16(step1[27], step1[20]);
358         const __m256i s2_20_1 = _mm256_unpackhi_epi16(step1[27], step1[20]);
359         const __m256i s2_21_0 = _mm256_unpacklo_epi16(step1[26], step1[21]);
360         const __m256i s2_21_1 = _mm256_unpackhi_epi16(step1[26], step1[21]);
361         const __m256i s2_22_0 = _mm256_unpacklo_epi16(step1[25], step1[22]);
362         const __m256i s2_22_1 = _mm256_unpackhi_epi16(step1[25], step1[22]);
363         const __m256i s2_23_0 = _mm256_unpacklo_epi16(step1[24], step1[23]);
364         const __m256i s2_23_1 = _mm256_unpackhi_epi16(step1[24], step1[23]);
365         const __m256i s2_20_2 = _mm256_madd_epi16(s2_20_0, k__cospi_p16_m16);
366         const __m256i s2_20_3 = _mm256_madd_epi16(s2_20_1, k__cospi_p16_m16);
367         const __m256i s2_21_2 = _mm256_madd_epi16(s2_21_0, k__cospi_p16_m16);
368         const __m256i s2_21_3 = _mm256_madd_epi16(s2_21_1, k__cospi_p16_m16);
369         const __m256i s2_22_2 = _mm256_madd_epi16(s2_22_0, k__cospi_p16_m16);
370         const __m256i s2_22_3 = _mm256_madd_epi16(s2_22_1, k__cospi_p16_m16);
371         const __m256i s2_23_2 = _mm256_madd_epi16(s2_23_0, k__cospi_p16_m16);
372         const __m256i s2_23_3 = _mm256_madd_epi16(s2_23_1, k__cospi_p16_m16);
373         const __m256i s2_24_2 = _mm256_madd_epi16(s2_23_0, k__cospi_p16_p16);
374         const __m256i s2_24_3 = _mm256_madd_epi16(s2_23_1, k__cospi_p16_p16);
375         const __m256i s2_25_2 = _mm256_madd_epi16(s2_22_0, k__cospi_p16_p16);
376         const __m256i s2_25_3 = _mm256_madd_epi16(s2_22_1, k__cospi_p16_p16);
377         const __m256i s2_26_2 = _mm256_madd_epi16(s2_21_0, k__cospi_p16_p16);
378         const __m256i s2_26_3 = _mm256_madd_epi16(s2_21_1, k__cospi_p16_p16);
379         const __m256i s2_27_2 = _mm256_madd_epi16(s2_20_0, k__cospi_p16_p16);
380         const __m256i s2_27_3 = _mm256_madd_epi16(s2_20_1, k__cospi_p16_p16);
381         // dct_const_round_shift
382         const __m256i s2_20_4 =
383             _mm256_add_epi32(s2_20_2, k__DCT_CONST_ROUNDING);
384         const __m256i s2_20_5 =
385             _mm256_add_epi32(s2_20_3, k__DCT_CONST_ROUNDING);
386         const __m256i s2_21_4 =
387             _mm256_add_epi32(s2_21_2, k__DCT_CONST_ROUNDING);
388         const __m256i s2_21_5 =
389             _mm256_add_epi32(s2_21_3, k__DCT_CONST_ROUNDING);
390         const __m256i s2_22_4 =
391             _mm256_add_epi32(s2_22_2, k__DCT_CONST_ROUNDING);
392         const __m256i s2_22_5 =
393             _mm256_add_epi32(s2_22_3, k__DCT_CONST_ROUNDING);
394         const __m256i s2_23_4 =
395             _mm256_add_epi32(s2_23_2, k__DCT_CONST_ROUNDING);
396         const __m256i s2_23_5 =
397             _mm256_add_epi32(s2_23_3, k__DCT_CONST_ROUNDING);
398         const __m256i s2_24_4 =
399             _mm256_add_epi32(s2_24_2, k__DCT_CONST_ROUNDING);
400         const __m256i s2_24_5 =
401             _mm256_add_epi32(s2_24_3, k__DCT_CONST_ROUNDING);
402         const __m256i s2_25_4 =
403             _mm256_add_epi32(s2_25_2, k__DCT_CONST_ROUNDING);
404         const __m256i s2_25_5 =
405             _mm256_add_epi32(s2_25_3, k__DCT_CONST_ROUNDING);
406         const __m256i s2_26_4 =
407             _mm256_add_epi32(s2_26_2, k__DCT_CONST_ROUNDING);
408         const __m256i s2_26_5 =
409             _mm256_add_epi32(s2_26_3, k__DCT_CONST_ROUNDING);
410         const __m256i s2_27_4 =
411             _mm256_add_epi32(s2_27_2, k__DCT_CONST_ROUNDING);
412         const __m256i s2_27_5 =
413             _mm256_add_epi32(s2_27_3, k__DCT_CONST_ROUNDING);
414         const __m256i s2_20_6 = _mm256_srai_epi32(s2_20_4, DCT_CONST_BITS);
415         const __m256i s2_20_7 = _mm256_srai_epi32(s2_20_5, DCT_CONST_BITS);
416         const __m256i s2_21_6 = _mm256_srai_epi32(s2_21_4, DCT_CONST_BITS);
417         const __m256i s2_21_7 = _mm256_srai_epi32(s2_21_5, DCT_CONST_BITS);
418         const __m256i s2_22_6 = _mm256_srai_epi32(s2_22_4, DCT_CONST_BITS);
419         const __m256i s2_22_7 = _mm256_srai_epi32(s2_22_5, DCT_CONST_BITS);
420         const __m256i s2_23_6 = _mm256_srai_epi32(s2_23_4, DCT_CONST_BITS);
421         const __m256i s2_23_7 = _mm256_srai_epi32(s2_23_5, DCT_CONST_BITS);
422         const __m256i s2_24_6 = _mm256_srai_epi32(s2_24_4, DCT_CONST_BITS);
423         const __m256i s2_24_7 = _mm256_srai_epi32(s2_24_5, DCT_CONST_BITS);
424         const __m256i s2_25_6 = _mm256_srai_epi32(s2_25_4, DCT_CONST_BITS);
425         const __m256i s2_25_7 = _mm256_srai_epi32(s2_25_5, DCT_CONST_BITS);
426         const __m256i s2_26_6 = _mm256_srai_epi32(s2_26_4, DCT_CONST_BITS);
427         const __m256i s2_26_7 = _mm256_srai_epi32(s2_26_5, DCT_CONST_BITS);
428         const __m256i s2_27_6 = _mm256_srai_epi32(s2_27_4, DCT_CONST_BITS);
429         const __m256i s2_27_7 = _mm256_srai_epi32(s2_27_5, DCT_CONST_BITS);
430         // Combine
431         step2[20] = _mm256_packs_epi32(s2_20_6, s2_20_7);
432         step2[21] = _mm256_packs_epi32(s2_21_6, s2_21_7);
433         step2[22] = _mm256_packs_epi32(s2_22_6, s2_22_7);
434         step2[23] = _mm256_packs_epi32(s2_23_6, s2_23_7);
435         step2[24] = _mm256_packs_epi32(s2_24_6, s2_24_7);
436         step2[25] = _mm256_packs_epi32(s2_25_6, s2_25_7);
437         step2[26] = _mm256_packs_epi32(s2_26_6, s2_26_7);
438         step2[27] = _mm256_packs_epi32(s2_27_6, s2_27_7);
439       }
440 
441 #if !FDCT32x32_HIGH_PRECISION
442       // dump the magnitude by half, hence the intermediate values are within
443       // the range of 16 bits.
444       if (1 == pass) {
445         __m256i s3_00_0 = _mm256_cmpgt_epi16(kZero, step2[0]);
446         __m256i s3_01_0 = _mm256_cmpgt_epi16(kZero, step2[1]);
447         __m256i s3_02_0 = _mm256_cmpgt_epi16(kZero, step2[2]);
448         __m256i s3_03_0 = _mm256_cmpgt_epi16(kZero, step2[3]);
449         __m256i s3_04_0 = _mm256_cmpgt_epi16(kZero, step2[4]);
450         __m256i s3_05_0 = _mm256_cmpgt_epi16(kZero, step2[5]);
451         __m256i s3_06_0 = _mm256_cmpgt_epi16(kZero, step2[6]);
452         __m256i s3_07_0 = _mm256_cmpgt_epi16(kZero, step2[7]);
453         __m256i s2_08_0 = _mm256_cmpgt_epi16(kZero, step2[8]);
454         __m256i s2_09_0 = _mm256_cmpgt_epi16(kZero, step2[9]);
455         __m256i s3_10_0 = _mm256_cmpgt_epi16(kZero, step2[10]);
456         __m256i s3_11_0 = _mm256_cmpgt_epi16(kZero, step2[11]);
457         __m256i s3_12_0 = _mm256_cmpgt_epi16(kZero, step2[12]);
458         __m256i s3_13_0 = _mm256_cmpgt_epi16(kZero, step2[13]);
459         __m256i s2_14_0 = _mm256_cmpgt_epi16(kZero, step2[14]);
460         __m256i s2_15_0 = _mm256_cmpgt_epi16(kZero, step2[15]);
461         __m256i s3_16_0 = _mm256_cmpgt_epi16(kZero, step1[16]);
462         __m256i s3_17_0 = _mm256_cmpgt_epi16(kZero, step1[17]);
463         __m256i s3_18_0 = _mm256_cmpgt_epi16(kZero, step1[18]);
464         __m256i s3_19_0 = _mm256_cmpgt_epi16(kZero, step1[19]);
465         __m256i s3_20_0 = _mm256_cmpgt_epi16(kZero, step2[20]);
466         __m256i s3_21_0 = _mm256_cmpgt_epi16(kZero, step2[21]);
467         __m256i s3_22_0 = _mm256_cmpgt_epi16(kZero, step2[22]);
468         __m256i s3_23_0 = _mm256_cmpgt_epi16(kZero, step2[23]);
469         __m256i s3_24_0 = _mm256_cmpgt_epi16(kZero, step2[24]);
470         __m256i s3_25_0 = _mm256_cmpgt_epi16(kZero, step2[25]);
471         __m256i s3_26_0 = _mm256_cmpgt_epi16(kZero, step2[26]);
472         __m256i s3_27_0 = _mm256_cmpgt_epi16(kZero, step2[27]);
473         __m256i s3_28_0 = _mm256_cmpgt_epi16(kZero, step1[28]);
474         __m256i s3_29_0 = _mm256_cmpgt_epi16(kZero, step1[29]);
475         __m256i s3_30_0 = _mm256_cmpgt_epi16(kZero, step1[30]);
476         __m256i s3_31_0 = _mm256_cmpgt_epi16(kZero, step1[31]);
477 
478         step2[0] = _mm256_sub_epi16(step2[0], s3_00_0);
479         step2[1] = _mm256_sub_epi16(step2[1], s3_01_0);
480         step2[2] = _mm256_sub_epi16(step2[2], s3_02_0);
481         step2[3] = _mm256_sub_epi16(step2[3], s3_03_0);
482         step2[4] = _mm256_sub_epi16(step2[4], s3_04_0);
483         step2[5] = _mm256_sub_epi16(step2[5], s3_05_0);
484         step2[6] = _mm256_sub_epi16(step2[6], s3_06_0);
485         step2[7] = _mm256_sub_epi16(step2[7], s3_07_0);
486         step2[8] = _mm256_sub_epi16(step2[8], s2_08_0);
487         step2[9] = _mm256_sub_epi16(step2[9], s2_09_0);
488         step2[10] = _mm256_sub_epi16(step2[10], s3_10_0);
489         step2[11] = _mm256_sub_epi16(step2[11], s3_11_0);
490         step2[12] = _mm256_sub_epi16(step2[12], s3_12_0);
491         step2[13] = _mm256_sub_epi16(step2[13], s3_13_0);
492         step2[14] = _mm256_sub_epi16(step2[14], s2_14_0);
493         step2[15] = _mm256_sub_epi16(step2[15], s2_15_0);
494         step1[16] = _mm256_sub_epi16(step1[16], s3_16_0);
495         step1[17] = _mm256_sub_epi16(step1[17], s3_17_0);
496         step1[18] = _mm256_sub_epi16(step1[18], s3_18_0);
497         step1[19] = _mm256_sub_epi16(step1[19], s3_19_0);
498         step2[20] = _mm256_sub_epi16(step2[20], s3_20_0);
499         step2[21] = _mm256_sub_epi16(step2[21], s3_21_0);
500         step2[22] = _mm256_sub_epi16(step2[22], s3_22_0);
501         step2[23] = _mm256_sub_epi16(step2[23], s3_23_0);
502         step2[24] = _mm256_sub_epi16(step2[24], s3_24_0);
503         step2[25] = _mm256_sub_epi16(step2[25], s3_25_0);
504         step2[26] = _mm256_sub_epi16(step2[26], s3_26_0);
505         step2[27] = _mm256_sub_epi16(step2[27], s3_27_0);
506         step1[28] = _mm256_sub_epi16(step1[28], s3_28_0);
507         step1[29] = _mm256_sub_epi16(step1[29], s3_29_0);
508         step1[30] = _mm256_sub_epi16(step1[30], s3_30_0);
509         step1[31] = _mm256_sub_epi16(step1[31], s3_31_0);
510 
511         step2[0] = _mm256_add_epi16(step2[0], kOne);
512         step2[1] = _mm256_add_epi16(step2[1], kOne);
513         step2[2] = _mm256_add_epi16(step2[2], kOne);
514         step2[3] = _mm256_add_epi16(step2[3], kOne);
515         step2[4] = _mm256_add_epi16(step2[4], kOne);
516         step2[5] = _mm256_add_epi16(step2[5], kOne);
517         step2[6] = _mm256_add_epi16(step2[6], kOne);
518         step2[7] = _mm256_add_epi16(step2[7], kOne);
519         step2[8] = _mm256_add_epi16(step2[8], kOne);
520         step2[9] = _mm256_add_epi16(step2[9], kOne);
521         step2[10] = _mm256_add_epi16(step2[10], kOne);
522         step2[11] = _mm256_add_epi16(step2[11], kOne);
523         step2[12] = _mm256_add_epi16(step2[12], kOne);
524         step2[13] = _mm256_add_epi16(step2[13], kOne);
525         step2[14] = _mm256_add_epi16(step2[14], kOne);
526         step2[15] = _mm256_add_epi16(step2[15], kOne);
527         step1[16] = _mm256_add_epi16(step1[16], kOne);
528         step1[17] = _mm256_add_epi16(step1[17], kOne);
529         step1[18] = _mm256_add_epi16(step1[18], kOne);
530         step1[19] = _mm256_add_epi16(step1[19], kOne);
531         step2[20] = _mm256_add_epi16(step2[20], kOne);
532         step2[21] = _mm256_add_epi16(step2[21], kOne);
533         step2[22] = _mm256_add_epi16(step2[22], kOne);
534         step2[23] = _mm256_add_epi16(step2[23], kOne);
535         step2[24] = _mm256_add_epi16(step2[24], kOne);
536         step2[25] = _mm256_add_epi16(step2[25], kOne);
537         step2[26] = _mm256_add_epi16(step2[26], kOne);
538         step2[27] = _mm256_add_epi16(step2[27], kOne);
539         step1[28] = _mm256_add_epi16(step1[28], kOne);
540         step1[29] = _mm256_add_epi16(step1[29], kOne);
541         step1[30] = _mm256_add_epi16(step1[30], kOne);
542         step1[31] = _mm256_add_epi16(step1[31], kOne);
543 
544         step2[0] = _mm256_srai_epi16(step2[0], 2);
545         step2[1] = _mm256_srai_epi16(step2[1], 2);
546         step2[2] = _mm256_srai_epi16(step2[2], 2);
547         step2[3] = _mm256_srai_epi16(step2[3], 2);
548         step2[4] = _mm256_srai_epi16(step2[4], 2);
549         step2[5] = _mm256_srai_epi16(step2[5], 2);
550         step2[6] = _mm256_srai_epi16(step2[6], 2);
551         step2[7] = _mm256_srai_epi16(step2[7], 2);
552         step2[8] = _mm256_srai_epi16(step2[8], 2);
553         step2[9] = _mm256_srai_epi16(step2[9], 2);
554         step2[10] = _mm256_srai_epi16(step2[10], 2);
555         step2[11] = _mm256_srai_epi16(step2[11], 2);
556         step2[12] = _mm256_srai_epi16(step2[12], 2);
557         step2[13] = _mm256_srai_epi16(step2[13], 2);
558         step2[14] = _mm256_srai_epi16(step2[14], 2);
559         step2[15] = _mm256_srai_epi16(step2[15], 2);
560         step1[16] = _mm256_srai_epi16(step1[16], 2);
561         step1[17] = _mm256_srai_epi16(step1[17], 2);
562         step1[18] = _mm256_srai_epi16(step1[18], 2);
563         step1[19] = _mm256_srai_epi16(step1[19], 2);
564         step2[20] = _mm256_srai_epi16(step2[20], 2);
565         step2[21] = _mm256_srai_epi16(step2[21], 2);
566         step2[22] = _mm256_srai_epi16(step2[22], 2);
567         step2[23] = _mm256_srai_epi16(step2[23], 2);
568         step2[24] = _mm256_srai_epi16(step2[24], 2);
569         step2[25] = _mm256_srai_epi16(step2[25], 2);
570         step2[26] = _mm256_srai_epi16(step2[26], 2);
571         step2[27] = _mm256_srai_epi16(step2[27], 2);
572         step1[28] = _mm256_srai_epi16(step1[28], 2);
573         step1[29] = _mm256_srai_epi16(step1[29], 2);
574         step1[30] = _mm256_srai_epi16(step1[30], 2);
575         step1[31] = _mm256_srai_epi16(step1[31], 2);
576       }
577 #endif
578 
579 #if FDCT32x32_HIGH_PRECISION
580       if (pass == 0) {
581 #endif
582         // Stage 3
583         {
584           step3[0] = _mm256_add_epi16(step2[(8 - 1)], step2[0]);
585           step3[1] = _mm256_add_epi16(step2[(8 - 2)], step2[1]);
586           step3[2] = _mm256_add_epi16(step2[(8 - 3)], step2[2]);
587           step3[3] = _mm256_add_epi16(step2[(8 - 4)], step2[3]);
588           step3[4] = _mm256_sub_epi16(step2[(8 - 5)], step2[4]);
589           step3[5] = _mm256_sub_epi16(step2[(8 - 6)], step2[5]);
590           step3[6] = _mm256_sub_epi16(step2[(8 - 7)], step2[6]);
591           step3[7] = _mm256_sub_epi16(step2[(8 - 8)], step2[7]);
592         }
593         {
594           const __m256i s3_10_0 = _mm256_unpacklo_epi16(step2[13], step2[10]);
595           const __m256i s3_10_1 = _mm256_unpackhi_epi16(step2[13], step2[10]);
596           const __m256i s3_11_0 = _mm256_unpacklo_epi16(step2[12], step2[11]);
597           const __m256i s3_11_1 = _mm256_unpackhi_epi16(step2[12], step2[11]);
598           const __m256i s3_10_2 = _mm256_madd_epi16(s3_10_0, k__cospi_p16_m16);
599           const __m256i s3_10_3 = _mm256_madd_epi16(s3_10_1, k__cospi_p16_m16);
600           const __m256i s3_11_2 = _mm256_madd_epi16(s3_11_0, k__cospi_p16_m16);
601           const __m256i s3_11_3 = _mm256_madd_epi16(s3_11_1, k__cospi_p16_m16);
602           const __m256i s3_12_2 = _mm256_madd_epi16(s3_11_0, k__cospi_p16_p16);
603           const __m256i s3_12_3 = _mm256_madd_epi16(s3_11_1, k__cospi_p16_p16);
604           const __m256i s3_13_2 = _mm256_madd_epi16(s3_10_0, k__cospi_p16_p16);
605           const __m256i s3_13_3 = _mm256_madd_epi16(s3_10_1, k__cospi_p16_p16);
606           // dct_const_round_shift
607           const __m256i s3_10_4 =
608               _mm256_add_epi32(s3_10_2, k__DCT_CONST_ROUNDING);
609           const __m256i s3_10_5 =
610               _mm256_add_epi32(s3_10_3, k__DCT_CONST_ROUNDING);
611           const __m256i s3_11_4 =
612               _mm256_add_epi32(s3_11_2, k__DCT_CONST_ROUNDING);
613           const __m256i s3_11_5 =
614               _mm256_add_epi32(s3_11_3, k__DCT_CONST_ROUNDING);
615           const __m256i s3_12_4 =
616               _mm256_add_epi32(s3_12_2, k__DCT_CONST_ROUNDING);
617           const __m256i s3_12_5 =
618               _mm256_add_epi32(s3_12_3, k__DCT_CONST_ROUNDING);
619           const __m256i s3_13_4 =
620               _mm256_add_epi32(s3_13_2, k__DCT_CONST_ROUNDING);
621           const __m256i s3_13_5 =
622               _mm256_add_epi32(s3_13_3, k__DCT_CONST_ROUNDING);
623           const __m256i s3_10_6 = _mm256_srai_epi32(s3_10_4, DCT_CONST_BITS);
624           const __m256i s3_10_7 = _mm256_srai_epi32(s3_10_5, DCT_CONST_BITS);
625           const __m256i s3_11_6 = _mm256_srai_epi32(s3_11_4, DCT_CONST_BITS);
626           const __m256i s3_11_7 = _mm256_srai_epi32(s3_11_5, DCT_CONST_BITS);
627           const __m256i s3_12_6 = _mm256_srai_epi32(s3_12_4, DCT_CONST_BITS);
628           const __m256i s3_12_7 = _mm256_srai_epi32(s3_12_5, DCT_CONST_BITS);
629           const __m256i s3_13_6 = _mm256_srai_epi32(s3_13_4, DCT_CONST_BITS);
630           const __m256i s3_13_7 = _mm256_srai_epi32(s3_13_5, DCT_CONST_BITS);
631           // Combine
632           step3[10] = _mm256_packs_epi32(s3_10_6, s3_10_7);
633           step3[11] = _mm256_packs_epi32(s3_11_6, s3_11_7);
634           step3[12] = _mm256_packs_epi32(s3_12_6, s3_12_7);
635           step3[13] = _mm256_packs_epi32(s3_13_6, s3_13_7);
636         }
637         {
638           step3[16] = _mm256_add_epi16(step2[23], step1[16]);
639           step3[17] = _mm256_add_epi16(step2[22], step1[17]);
640           step3[18] = _mm256_add_epi16(step2[21], step1[18]);
641           step3[19] = _mm256_add_epi16(step2[20], step1[19]);
642           step3[20] = _mm256_sub_epi16(step1[19], step2[20]);
643           step3[21] = _mm256_sub_epi16(step1[18], step2[21]);
644           step3[22] = _mm256_sub_epi16(step1[17], step2[22]);
645           step3[23] = _mm256_sub_epi16(step1[16], step2[23]);
646           step3[24] = _mm256_sub_epi16(step1[31], step2[24]);
647           step3[25] = _mm256_sub_epi16(step1[30], step2[25]);
648           step3[26] = _mm256_sub_epi16(step1[29], step2[26]);
649           step3[27] = _mm256_sub_epi16(step1[28], step2[27]);
650           step3[28] = _mm256_add_epi16(step2[27], step1[28]);
651           step3[29] = _mm256_add_epi16(step2[26], step1[29]);
652           step3[30] = _mm256_add_epi16(step2[25], step1[30]);
653           step3[31] = _mm256_add_epi16(step2[24], step1[31]);
654         }
655 
656         // Stage 4
657         {
658           step1[0] = _mm256_add_epi16(step3[3], step3[0]);
659           step1[1] = _mm256_add_epi16(step3[2], step3[1]);
660           step1[2] = _mm256_sub_epi16(step3[1], step3[2]);
661           step1[3] = _mm256_sub_epi16(step3[0], step3[3]);
662           step1[8] = _mm256_add_epi16(step3[11], step2[8]);
663           step1[9] = _mm256_add_epi16(step3[10], step2[9]);
664           step1[10] = _mm256_sub_epi16(step2[9], step3[10]);
665           step1[11] = _mm256_sub_epi16(step2[8], step3[11]);
666           step1[12] = _mm256_sub_epi16(step2[15], step3[12]);
667           step1[13] = _mm256_sub_epi16(step2[14], step3[13]);
668           step1[14] = _mm256_add_epi16(step3[13], step2[14]);
669           step1[15] = _mm256_add_epi16(step3[12], step2[15]);
670         }
671         {
672           const __m256i s1_05_0 = _mm256_unpacklo_epi16(step3[6], step3[5]);
673           const __m256i s1_05_1 = _mm256_unpackhi_epi16(step3[6], step3[5]);
674           const __m256i s1_05_2 = _mm256_madd_epi16(s1_05_0, k__cospi_p16_m16);
675           const __m256i s1_05_3 = _mm256_madd_epi16(s1_05_1, k__cospi_p16_m16);
676           const __m256i s1_06_2 = _mm256_madd_epi16(s1_05_0, k__cospi_p16_p16);
677           const __m256i s1_06_3 = _mm256_madd_epi16(s1_05_1, k__cospi_p16_p16);
678           // dct_const_round_shift
679           const __m256i s1_05_4 =
680               _mm256_add_epi32(s1_05_2, k__DCT_CONST_ROUNDING);
681           const __m256i s1_05_5 =
682               _mm256_add_epi32(s1_05_3, k__DCT_CONST_ROUNDING);
683           const __m256i s1_06_4 =
684               _mm256_add_epi32(s1_06_2, k__DCT_CONST_ROUNDING);
685           const __m256i s1_06_5 =
686               _mm256_add_epi32(s1_06_3, k__DCT_CONST_ROUNDING);
687           const __m256i s1_05_6 = _mm256_srai_epi32(s1_05_4, DCT_CONST_BITS);
688           const __m256i s1_05_7 = _mm256_srai_epi32(s1_05_5, DCT_CONST_BITS);
689           const __m256i s1_06_6 = _mm256_srai_epi32(s1_06_4, DCT_CONST_BITS);
690           const __m256i s1_06_7 = _mm256_srai_epi32(s1_06_5, DCT_CONST_BITS);
691           // Combine
692           step1[5] = _mm256_packs_epi32(s1_05_6, s1_05_7);
693           step1[6] = _mm256_packs_epi32(s1_06_6, s1_06_7);
694         }
695         {
696           const __m256i s1_18_0 = _mm256_unpacklo_epi16(step3[18], step3[29]);
697           const __m256i s1_18_1 = _mm256_unpackhi_epi16(step3[18], step3[29]);
698           const __m256i s1_19_0 = _mm256_unpacklo_epi16(step3[19], step3[28]);
699           const __m256i s1_19_1 = _mm256_unpackhi_epi16(step3[19], step3[28]);
700           const __m256i s1_20_0 = _mm256_unpacklo_epi16(step3[20], step3[27]);
701           const __m256i s1_20_1 = _mm256_unpackhi_epi16(step3[20], step3[27]);
702           const __m256i s1_21_0 = _mm256_unpacklo_epi16(step3[21], step3[26]);
703           const __m256i s1_21_1 = _mm256_unpackhi_epi16(step3[21], step3[26]);
704           const __m256i s1_18_2 = _mm256_madd_epi16(s1_18_0, k__cospi_m08_p24);
705           const __m256i s1_18_3 = _mm256_madd_epi16(s1_18_1, k__cospi_m08_p24);
706           const __m256i s1_19_2 = _mm256_madd_epi16(s1_19_0, k__cospi_m08_p24);
707           const __m256i s1_19_3 = _mm256_madd_epi16(s1_19_1, k__cospi_m08_p24);
708           const __m256i s1_20_2 = _mm256_madd_epi16(s1_20_0, k__cospi_m24_m08);
709           const __m256i s1_20_3 = _mm256_madd_epi16(s1_20_1, k__cospi_m24_m08);
710           const __m256i s1_21_2 = _mm256_madd_epi16(s1_21_0, k__cospi_m24_m08);
711           const __m256i s1_21_3 = _mm256_madd_epi16(s1_21_1, k__cospi_m24_m08);
712           const __m256i s1_26_2 = _mm256_madd_epi16(s1_21_0, k__cospi_m08_p24);
713           const __m256i s1_26_3 = _mm256_madd_epi16(s1_21_1, k__cospi_m08_p24);
714           const __m256i s1_27_2 = _mm256_madd_epi16(s1_20_0, k__cospi_m08_p24);
715           const __m256i s1_27_3 = _mm256_madd_epi16(s1_20_1, k__cospi_m08_p24);
716           const __m256i s1_28_2 = _mm256_madd_epi16(s1_19_0, k__cospi_p24_p08);
717           const __m256i s1_28_3 = _mm256_madd_epi16(s1_19_1, k__cospi_p24_p08);
718           const __m256i s1_29_2 = _mm256_madd_epi16(s1_18_0, k__cospi_p24_p08);
719           const __m256i s1_29_3 = _mm256_madd_epi16(s1_18_1, k__cospi_p24_p08);
720           // dct_const_round_shift
721           const __m256i s1_18_4 =
722               _mm256_add_epi32(s1_18_2, k__DCT_CONST_ROUNDING);
723           const __m256i s1_18_5 =
724               _mm256_add_epi32(s1_18_3, k__DCT_CONST_ROUNDING);
725           const __m256i s1_19_4 =
726               _mm256_add_epi32(s1_19_2, k__DCT_CONST_ROUNDING);
727           const __m256i s1_19_5 =
728               _mm256_add_epi32(s1_19_3, k__DCT_CONST_ROUNDING);
729           const __m256i s1_20_4 =
730               _mm256_add_epi32(s1_20_2, k__DCT_CONST_ROUNDING);
731           const __m256i s1_20_5 =
732               _mm256_add_epi32(s1_20_3, k__DCT_CONST_ROUNDING);
733           const __m256i s1_21_4 =
734               _mm256_add_epi32(s1_21_2, k__DCT_CONST_ROUNDING);
735           const __m256i s1_21_5 =
736               _mm256_add_epi32(s1_21_3, k__DCT_CONST_ROUNDING);
737           const __m256i s1_26_4 =
738               _mm256_add_epi32(s1_26_2, k__DCT_CONST_ROUNDING);
739           const __m256i s1_26_5 =
740               _mm256_add_epi32(s1_26_3, k__DCT_CONST_ROUNDING);
741           const __m256i s1_27_4 =
742               _mm256_add_epi32(s1_27_2, k__DCT_CONST_ROUNDING);
743           const __m256i s1_27_5 =
744               _mm256_add_epi32(s1_27_3, k__DCT_CONST_ROUNDING);
745           const __m256i s1_28_4 =
746               _mm256_add_epi32(s1_28_2, k__DCT_CONST_ROUNDING);
747           const __m256i s1_28_5 =
748               _mm256_add_epi32(s1_28_3, k__DCT_CONST_ROUNDING);
749           const __m256i s1_29_4 =
750               _mm256_add_epi32(s1_29_2, k__DCT_CONST_ROUNDING);
751           const __m256i s1_29_5 =
752               _mm256_add_epi32(s1_29_3, k__DCT_CONST_ROUNDING);
753           const __m256i s1_18_6 = _mm256_srai_epi32(s1_18_4, DCT_CONST_BITS);
754           const __m256i s1_18_7 = _mm256_srai_epi32(s1_18_5, DCT_CONST_BITS);
755           const __m256i s1_19_6 = _mm256_srai_epi32(s1_19_4, DCT_CONST_BITS);
756           const __m256i s1_19_7 = _mm256_srai_epi32(s1_19_5, DCT_CONST_BITS);
757           const __m256i s1_20_6 = _mm256_srai_epi32(s1_20_4, DCT_CONST_BITS);
758           const __m256i s1_20_7 = _mm256_srai_epi32(s1_20_5, DCT_CONST_BITS);
759           const __m256i s1_21_6 = _mm256_srai_epi32(s1_21_4, DCT_CONST_BITS);
760           const __m256i s1_21_7 = _mm256_srai_epi32(s1_21_5, DCT_CONST_BITS);
761           const __m256i s1_26_6 = _mm256_srai_epi32(s1_26_4, DCT_CONST_BITS);
762           const __m256i s1_26_7 = _mm256_srai_epi32(s1_26_5, DCT_CONST_BITS);
763           const __m256i s1_27_6 = _mm256_srai_epi32(s1_27_4, DCT_CONST_BITS);
764           const __m256i s1_27_7 = _mm256_srai_epi32(s1_27_5, DCT_CONST_BITS);
765           const __m256i s1_28_6 = _mm256_srai_epi32(s1_28_4, DCT_CONST_BITS);
766           const __m256i s1_28_7 = _mm256_srai_epi32(s1_28_5, DCT_CONST_BITS);
767           const __m256i s1_29_6 = _mm256_srai_epi32(s1_29_4, DCT_CONST_BITS);
768           const __m256i s1_29_7 = _mm256_srai_epi32(s1_29_5, DCT_CONST_BITS);
769           // Combine
770           step1[18] = _mm256_packs_epi32(s1_18_6, s1_18_7);
771           step1[19] = _mm256_packs_epi32(s1_19_6, s1_19_7);
772           step1[20] = _mm256_packs_epi32(s1_20_6, s1_20_7);
773           step1[21] = _mm256_packs_epi32(s1_21_6, s1_21_7);
774           step1[26] = _mm256_packs_epi32(s1_26_6, s1_26_7);
775           step1[27] = _mm256_packs_epi32(s1_27_6, s1_27_7);
776           step1[28] = _mm256_packs_epi32(s1_28_6, s1_28_7);
777           step1[29] = _mm256_packs_epi32(s1_29_6, s1_29_7);
778         }
779         // Stage 5
780         {
781           step2[4] = _mm256_add_epi16(step1[5], step3[4]);
782           step2[5] = _mm256_sub_epi16(step3[4], step1[5]);
783           step2[6] = _mm256_sub_epi16(step3[7], step1[6]);
784           step2[7] = _mm256_add_epi16(step1[6], step3[7]);
785         }
786         {
787           const __m256i out_00_0 = _mm256_unpacklo_epi16(step1[0], step1[1]);
788           const __m256i out_00_1 = _mm256_unpackhi_epi16(step1[0], step1[1]);
789           const __m256i out_08_0 = _mm256_unpacklo_epi16(step1[2], step1[3]);
790           const __m256i out_08_1 = _mm256_unpackhi_epi16(step1[2], step1[3]);
791           const __m256i out_00_2 =
792               _mm256_madd_epi16(out_00_0, k__cospi_p16_p16);
793           const __m256i out_00_3 =
794               _mm256_madd_epi16(out_00_1, k__cospi_p16_p16);
795           const __m256i out_16_2 =
796               _mm256_madd_epi16(out_00_0, k__cospi_p16_m16);
797           const __m256i out_16_3 =
798               _mm256_madd_epi16(out_00_1, k__cospi_p16_m16);
799           const __m256i out_08_2 =
800               _mm256_madd_epi16(out_08_0, k__cospi_p24_p08);
801           const __m256i out_08_3 =
802               _mm256_madd_epi16(out_08_1, k__cospi_p24_p08);
803           const __m256i out_24_2 =
804               _mm256_madd_epi16(out_08_0, k__cospi_m08_p24);
805           const __m256i out_24_3 =
806               _mm256_madd_epi16(out_08_1, k__cospi_m08_p24);
807           // dct_const_round_shift
808           const __m256i out_00_4 =
809               _mm256_add_epi32(out_00_2, k__DCT_CONST_ROUNDING);
810           const __m256i out_00_5 =
811               _mm256_add_epi32(out_00_3, k__DCT_CONST_ROUNDING);
812           const __m256i out_16_4 =
813               _mm256_add_epi32(out_16_2, k__DCT_CONST_ROUNDING);
814           const __m256i out_16_5 =
815               _mm256_add_epi32(out_16_3, k__DCT_CONST_ROUNDING);
816           const __m256i out_08_4 =
817               _mm256_add_epi32(out_08_2, k__DCT_CONST_ROUNDING);
818           const __m256i out_08_5 =
819               _mm256_add_epi32(out_08_3, k__DCT_CONST_ROUNDING);
820           const __m256i out_24_4 =
821               _mm256_add_epi32(out_24_2, k__DCT_CONST_ROUNDING);
822           const __m256i out_24_5 =
823               _mm256_add_epi32(out_24_3, k__DCT_CONST_ROUNDING);
824           const __m256i out_00_6 = _mm256_srai_epi32(out_00_4, DCT_CONST_BITS);
825           const __m256i out_00_7 = _mm256_srai_epi32(out_00_5, DCT_CONST_BITS);
826           const __m256i out_16_6 = _mm256_srai_epi32(out_16_4, DCT_CONST_BITS);
827           const __m256i out_16_7 = _mm256_srai_epi32(out_16_5, DCT_CONST_BITS);
828           const __m256i out_08_6 = _mm256_srai_epi32(out_08_4, DCT_CONST_BITS);
829           const __m256i out_08_7 = _mm256_srai_epi32(out_08_5, DCT_CONST_BITS);
830           const __m256i out_24_6 = _mm256_srai_epi32(out_24_4, DCT_CONST_BITS);
831           const __m256i out_24_7 = _mm256_srai_epi32(out_24_5, DCT_CONST_BITS);
832           // Combine
833           out[0] = _mm256_packs_epi32(out_00_6, out_00_7);
834           out[16] = _mm256_packs_epi32(out_16_6, out_16_7);
835           out[8] = _mm256_packs_epi32(out_08_6, out_08_7);
836           out[24] = _mm256_packs_epi32(out_24_6, out_24_7);
837         }
838         {
839           const __m256i s2_09_0 = _mm256_unpacklo_epi16(step1[9], step1[14]);
840           const __m256i s2_09_1 = _mm256_unpackhi_epi16(step1[9], step1[14]);
841           const __m256i s2_10_0 = _mm256_unpacklo_epi16(step1[10], step1[13]);
842           const __m256i s2_10_1 = _mm256_unpackhi_epi16(step1[10], step1[13]);
843           const __m256i s2_09_2 = _mm256_madd_epi16(s2_09_0, k__cospi_m08_p24);
844           const __m256i s2_09_3 = _mm256_madd_epi16(s2_09_1, k__cospi_m08_p24);
845           const __m256i s2_10_2 = _mm256_madd_epi16(s2_10_0, k__cospi_m24_m08);
846           const __m256i s2_10_3 = _mm256_madd_epi16(s2_10_1, k__cospi_m24_m08);
847           const __m256i s2_13_2 = _mm256_madd_epi16(s2_10_0, k__cospi_m08_p24);
848           const __m256i s2_13_3 = _mm256_madd_epi16(s2_10_1, k__cospi_m08_p24);
849           const __m256i s2_14_2 = _mm256_madd_epi16(s2_09_0, k__cospi_p24_p08);
850           const __m256i s2_14_3 = _mm256_madd_epi16(s2_09_1, k__cospi_p24_p08);
851           // dct_const_round_shift
852           const __m256i s2_09_4 =
853               _mm256_add_epi32(s2_09_2, k__DCT_CONST_ROUNDING);
854           const __m256i s2_09_5 =
855               _mm256_add_epi32(s2_09_3, k__DCT_CONST_ROUNDING);
856           const __m256i s2_10_4 =
857               _mm256_add_epi32(s2_10_2, k__DCT_CONST_ROUNDING);
858           const __m256i s2_10_5 =
859               _mm256_add_epi32(s2_10_3, k__DCT_CONST_ROUNDING);
860           const __m256i s2_13_4 =
861               _mm256_add_epi32(s2_13_2, k__DCT_CONST_ROUNDING);
862           const __m256i s2_13_5 =
863               _mm256_add_epi32(s2_13_3, k__DCT_CONST_ROUNDING);
864           const __m256i s2_14_4 =
865               _mm256_add_epi32(s2_14_2, k__DCT_CONST_ROUNDING);
866           const __m256i s2_14_5 =
867               _mm256_add_epi32(s2_14_3, k__DCT_CONST_ROUNDING);
868           const __m256i s2_09_6 = _mm256_srai_epi32(s2_09_4, DCT_CONST_BITS);
869           const __m256i s2_09_7 = _mm256_srai_epi32(s2_09_5, DCT_CONST_BITS);
870           const __m256i s2_10_6 = _mm256_srai_epi32(s2_10_4, DCT_CONST_BITS);
871           const __m256i s2_10_7 = _mm256_srai_epi32(s2_10_5, DCT_CONST_BITS);
872           const __m256i s2_13_6 = _mm256_srai_epi32(s2_13_4, DCT_CONST_BITS);
873           const __m256i s2_13_7 = _mm256_srai_epi32(s2_13_5, DCT_CONST_BITS);
874           const __m256i s2_14_6 = _mm256_srai_epi32(s2_14_4, DCT_CONST_BITS);
875           const __m256i s2_14_7 = _mm256_srai_epi32(s2_14_5, DCT_CONST_BITS);
876           // Combine
877           step2[9] = _mm256_packs_epi32(s2_09_6, s2_09_7);
878           step2[10] = _mm256_packs_epi32(s2_10_6, s2_10_7);
879           step2[13] = _mm256_packs_epi32(s2_13_6, s2_13_7);
880           step2[14] = _mm256_packs_epi32(s2_14_6, s2_14_7);
881         }
882         {
883           step2[16] = _mm256_add_epi16(step1[19], step3[16]);
884           step2[17] = _mm256_add_epi16(step1[18], step3[17]);
885           step2[18] = _mm256_sub_epi16(step3[17], step1[18]);
886           step2[19] = _mm256_sub_epi16(step3[16], step1[19]);
887           step2[20] = _mm256_sub_epi16(step3[23], step1[20]);
888           step2[21] = _mm256_sub_epi16(step3[22], step1[21]);
889           step2[22] = _mm256_add_epi16(step1[21], step3[22]);
890           step2[23] = _mm256_add_epi16(step1[20], step3[23]);
891           step2[24] = _mm256_add_epi16(step1[27], step3[24]);
892           step2[25] = _mm256_add_epi16(step1[26], step3[25]);
893           step2[26] = _mm256_sub_epi16(step3[25], step1[26]);
894           step2[27] = _mm256_sub_epi16(step3[24], step1[27]);
895           step2[28] = _mm256_sub_epi16(step3[31], step1[28]);
896           step2[29] = _mm256_sub_epi16(step3[30], step1[29]);
897           step2[30] = _mm256_add_epi16(step1[29], step3[30]);
898           step2[31] = _mm256_add_epi16(step1[28], step3[31]);
899         }
900         // Stage 6
901         {
902           const __m256i out_04_0 = _mm256_unpacklo_epi16(step2[4], step2[7]);
903           const __m256i out_04_1 = _mm256_unpackhi_epi16(step2[4], step2[7]);
904           const __m256i out_20_0 = _mm256_unpacklo_epi16(step2[5], step2[6]);
905           const __m256i out_20_1 = _mm256_unpackhi_epi16(step2[5], step2[6]);
906           const __m256i out_12_0 = _mm256_unpacklo_epi16(step2[5], step2[6]);
907           const __m256i out_12_1 = _mm256_unpackhi_epi16(step2[5], step2[6]);
908           const __m256i out_28_0 = _mm256_unpacklo_epi16(step2[4], step2[7]);
909           const __m256i out_28_1 = _mm256_unpackhi_epi16(step2[4], step2[7]);
910           const __m256i out_04_2 =
911               _mm256_madd_epi16(out_04_0, k__cospi_p28_p04);
912           const __m256i out_04_3 =
913               _mm256_madd_epi16(out_04_1, k__cospi_p28_p04);
914           const __m256i out_20_2 =
915               _mm256_madd_epi16(out_20_0, k__cospi_p12_p20);
916           const __m256i out_20_3 =
917               _mm256_madd_epi16(out_20_1, k__cospi_p12_p20);
918           const __m256i out_12_2 =
919               _mm256_madd_epi16(out_12_0, k__cospi_m20_p12);
920           const __m256i out_12_3 =
921               _mm256_madd_epi16(out_12_1, k__cospi_m20_p12);
922           const __m256i out_28_2 =
923               _mm256_madd_epi16(out_28_0, k__cospi_m04_p28);
924           const __m256i out_28_3 =
925               _mm256_madd_epi16(out_28_1, k__cospi_m04_p28);
926           // dct_const_round_shift
927           const __m256i out_04_4 =
928               _mm256_add_epi32(out_04_2, k__DCT_CONST_ROUNDING);
929           const __m256i out_04_5 =
930               _mm256_add_epi32(out_04_3, k__DCT_CONST_ROUNDING);
931           const __m256i out_20_4 =
932               _mm256_add_epi32(out_20_2, k__DCT_CONST_ROUNDING);
933           const __m256i out_20_5 =
934               _mm256_add_epi32(out_20_3, k__DCT_CONST_ROUNDING);
935           const __m256i out_12_4 =
936               _mm256_add_epi32(out_12_2, k__DCT_CONST_ROUNDING);
937           const __m256i out_12_5 =
938               _mm256_add_epi32(out_12_3, k__DCT_CONST_ROUNDING);
939           const __m256i out_28_4 =
940               _mm256_add_epi32(out_28_2, k__DCT_CONST_ROUNDING);
941           const __m256i out_28_5 =
942               _mm256_add_epi32(out_28_3, k__DCT_CONST_ROUNDING);
943           const __m256i out_04_6 = _mm256_srai_epi32(out_04_4, DCT_CONST_BITS);
944           const __m256i out_04_7 = _mm256_srai_epi32(out_04_5, DCT_CONST_BITS);
945           const __m256i out_20_6 = _mm256_srai_epi32(out_20_4, DCT_CONST_BITS);
946           const __m256i out_20_7 = _mm256_srai_epi32(out_20_5, DCT_CONST_BITS);
947           const __m256i out_12_6 = _mm256_srai_epi32(out_12_4, DCT_CONST_BITS);
948           const __m256i out_12_7 = _mm256_srai_epi32(out_12_5, DCT_CONST_BITS);
949           const __m256i out_28_6 = _mm256_srai_epi32(out_28_4, DCT_CONST_BITS);
950           const __m256i out_28_7 = _mm256_srai_epi32(out_28_5, DCT_CONST_BITS);
951           // Combine
952           out[4] = _mm256_packs_epi32(out_04_6, out_04_7);
953           out[20] = _mm256_packs_epi32(out_20_6, out_20_7);
954           out[12] = _mm256_packs_epi32(out_12_6, out_12_7);
955           out[28] = _mm256_packs_epi32(out_28_6, out_28_7);
956         }
957         {
958           step3[8] = _mm256_add_epi16(step2[9], step1[8]);
959           step3[9] = _mm256_sub_epi16(step1[8], step2[9]);
960           step3[10] = _mm256_sub_epi16(step1[11], step2[10]);
961           step3[11] = _mm256_add_epi16(step2[10], step1[11]);
962           step3[12] = _mm256_add_epi16(step2[13], step1[12]);
963           step3[13] = _mm256_sub_epi16(step1[12], step2[13]);
964           step3[14] = _mm256_sub_epi16(step1[15], step2[14]);
965           step3[15] = _mm256_add_epi16(step2[14], step1[15]);
966         }
967         {
968           const __m256i s3_17_0 = _mm256_unpacklo_epi16(step2[17], step2[30]);
969           const __m256i s3_17_1 = _mm256_unpackhi_epi16(step2[17], step2[30]);
970           const __m256i s3_18_0 = _mm256_unpacklo_epi16(step2[18], step2[29]);
971           const __m256i s3_18_1 = _mm256_unpackhi_epi16(step2[18], step2[29]);
972           const __m256i s3_21_0 = _mm256_unpacklo_epi16(step2[21], step2[26]);
973           const __m256i s3_21_1 = _mm256_unpackhi_epi16(step2[21], step2[26]);
974           const __m256i s3_22_0 = _mm256_unpacklo_epi16(step2[22], step2[25]);
975           const __m256i s3_22_1 = _mm256_unpackhi_epi16(step2[22], step2[25]);
976           const __m256i s3_17_2 = _mm256_madd_epi16(s3_17_0, k__cospi_m04_p28);
977           const __m256i s3_17_3 = _mm256_madd_epi16(s3_17_1, k__cospi_m04_p28);
978           const __m256i s3_18_2 = _mm256_madd_epi16(s3_18_0, k__cospi_m28_m04);
979           const __m256i s3_18_3 = _mm256_madd_epi16(s3_18_1, k__cospi_m28_m04);
980           const __m256i s3_21_2 = _mm256_madd_epi16(s3_21_0, k__cospi_m20_p12);
981           const __m256i s3_21_3 = _mm256_madd_epi16(s3_21_1, k__cospi_m20_p12);
982           const __m256i s3_22_2 = _mm256_madd_epi16(s3_22_0, k__cospi_m12_m20);
983           const __m256i s3_22_3 = _mm256_madd_epi16(s3_22_1, k__cospi_m12_m20);
984           const __m256i s3_25_2 = _mm256_madd_epi16(s3_22_0, k__cospi_m20_p12);
985           const __m256i s3_25_3 = _mm256_madd_epi16(s3_22_1, k__cospi_m20_p12);
986           const __m256i s3_26_2 = _mm256_madd_epi16(s3_21_0, k__cospi_p12_p20);
987           const __m256i s3_26_3 = _mm256_madd_epi16(s3_21_1, k__cospi_p12_p20);
988           const __m256i s3_29_2 = _mm256_madd_epi16(s3_18_0, k__cospi_m04_p28);
989           const __m256i s3_29_3 = _mm256_madd_epi16(s3_18_1, k__cospi_m04_p28);
990           const __m256i s3_30_2 = _mm256_madd_epi16(s3_17_0, k__cospi_p28_p04);
991           const __m256i s3_30_3 = _mm256_madd_epi16(s3_17_1, k__cospi_p28_p04);
992           // dct_const_round_shift
993           const __m256i s3_17_4 =
994               _mm256_add_epi32(s3_17_2, k__DCT_CONST_ROUNDING);
995           const __m256i s3_17_5 =
996               _mm256_add_epi32(s3_17_3, k__DCT_CONST_ROUNDING);
997           const __m256i s3_18_4 =
998               _mm256_add_epi32(s3_18_2, k__DCT_CONST_ROUNDING);
999           const __m256i s3_18_5 =
1000               _mm256_add_epi32(s3_18_3, k__DCT_CONST_ROUNDING);
1001           const __m256i s3_21_4 =
1002               _mm256_add_epi32(s3_21_2, k__DCT_CONST_ROUNDING);
1003           const __m256i s3_21_5 =
1004               _mm256_add_epi32(s3_21_3, k__DCT_CONST_ROUNDING);
1005           const __m256i s3_22_4 =
1006               _mm256_add_epi32(s3_22_2, k__DCT_CONST_ROUNDING);
1007           const __m256i s3_22_5 =
1008               _mm256_add_epi32(s3_22_3, k__DCT_CONST_ROUNDING);
1009           const __m256i s3_17_6 = _mm256_srai_epi32(s3_17_4, DCT_CONST_BITS);
1010           const __m256i s3_17_7 = _mm256_srai_epi32(s3_17_5, DCT_CONST_BITS);
1011           const __m256i s3_18_6 = _mm256_srai_epi32(s3_18_4, DCT_CONST_BITS);
1012           const __m256i s3_18_7 = _mm256_srai_epi32(s3_18_5, DCT_CONST_BITS);
1013           const __m256i s3_21_6 = _mm256_srai_epi32(s3_21_4, DCT_CONST_BITS);
1014           const __m256i s3_21_7 = _mm256_srai_epi32(s3_21_5, DCT_CONST_BITS);
1015           const __m256i s3_22_6 = _mm256_srai_epi32(s3_22_4, DCT_CONST_BITS);
1016           const __m256i s3_22_7 = _mm256_srai_epi32(s3_22_5, DCT_CONST_BITS);
1017           const __m256i s3_25_4 =
1018               _mm256_add_epi32(s3_25_2, k__DCT_CONST_ROUNDING);
1019           const __m256i s3_25_5 =
1020               _mm256_add_epi32(s3_25_3, k__DCT_CONST_ROUNDING);
1021           const __m256i s3_26_4 =
1022               _mm256_add_epi32(s3_26_2, k__DCT_CONST_ROUNDING);
1023           const __m256i s3_26_5 =
1024               _mm256_add_epi32(s3_26_3, k__DCT_CONST_ROUNDING);
1025           const __m256i s3_29_4 =
1026               _mm256_add_epi32(s3_29_2, k__DCT_CONST_ROUNDING);
1027           const __m256i s3_29_5 =
1028               _mm256_add_epi32(s3_29_3, k__DCT_CONST_ROUNDING);
1029           const __m256i s3_30_4 =
1030               _mm256_add_epi32(s3_30_2, k__DCT_CONST_ROUNDING);
1031           const __m256i s3_30_5 =
1032               _mm256_add_epi32(s3_30_3, k__DCT_CONST_ROUNDING);
1033           const __m256i s3_25_6 = _mm256_srai_epi32(s3_25_4, DCT_CONST_BITS);
1034           const __m256i s3_25_7 = _mm256_srai_epi32(s3_25_5, DCT_CONST_BITS);
1035           const __m256i s3_26_6 = _mm256_srai_epi32(s3_26_4, DCT_CONST_BITS);
1036           const __m256i s3_26_7 = _mm256_srai_epi32(s3_26_5, DCT_CONST_BITS);
1037           const __m256i s3_29_6 = _mm256_srai_epi32(s3_29_4, DCT_CONST_BITS);
1038           const __m256i s3_29_7 = _mm256_srai_epi32(s3_29_5, DCT_CONST_BITS);
1039           const __m256i s3_30_6 = _mm256_srai_epi32(s3_30_4, DCT_CONST_BITS);
1040           const __m256i s3_30_7 = _mm256_srai_epi32(s3_30_5, DCT_CONST_BITS);
1041           // Combine
1042           step3[17] = _mm256_packs_epi32(s3_17_6, s3_17_7);
1043           step3[18] = _mm256_packs_epi32(s3_18_6, s3_18_7);
1044           step3[21] = _mm256_packs_epi32(s3_21_6, s3_21_7);
1045           step3[22] = _mm256_packs_epi32(s3_22_6, s3_22_7);
1046           // Combine
1047           step3[25] = _mm256_packs_epi32(s3_25_6, s3_25_7);
1048           step3[26] = _mm256_packs_epi32(s3_26_6, s3_26_7);
1049           step3[29] = _mm256_packs_epi32(s3_29_6, s3_29_7);
1050           step3[30] = _mm256_packs_epi32(s3_30_6, s3_30_7);
1051         }
1052         // Stage 7
1053         {
1054           const __m256i out_02_0 = _mm256_unpacklo_epi16(step3[8], step3[15]);
1055           const __m256i out_02_1 = _mm256_unpackhi_epi16(step3[8], step3[15]);
1056           const __m256i out_18_0 = _mm256_unpacklo_epi16(step3[9], step3[14]);
1057           const __m256i out_18_1 = _mm256_unpackhi_epi16(step3[9], step3[14]);
1058           const __m256i out_10_0 = _mm256_unpacklo_epi16(step3[10], step3[13]);
1059           const __m256i out_10_1 = _mm256_unpackhi_epi16(step3[10], step3[13]);
1060           const __m256i out_26_0 = _mm256_unpacklo_epi16(step3[11], step3[12]);
1061           const __m256i out_26_1 = _mm256_unpackhi_epi16(step3[11], step3[12]);
1062           const __m256i out_02_2 =
1063               _mm256_madd_epi16(out_02_0, k__cospi_p30_p02);
1064           const __m256i out_02_3 =
1065               _mm256_madd_epi16(out_02_1, k__cospi_p30_p02);
1066           const __m256i out_18_2 =
1067               _mm256_madd_epi16(out_18_0, k__cospi_p14_p18);
1068           const __m256i out_18_3 =
1069               _mm256_madd_epi16(out_18_1, k__cospi_p14_p18);
1070           const __m256i out_10_2 =
1071               _mm256_madd_epi16(out_10_0, k__cospi_p22_p10);
1072           const __m256i out_10_3 =
1073               _mm256_madd_epi16(out_10_1, k__cospi_p22_p10);
1074           const __m256i out_26_2 =
1075               _mm256_madd_epi16(out_26_0, k__cospi_p06_p26);
1076           const __m256i out_26_3 =
1077               _mm256_madd_epi16(out_26_1, k__cospi_p06_p26);
1078           const __m256i out_06_2 =
1079               _mm256_madd_epi16(out_26_0, k__cospi_m26_p06);
1080           const __m256i out_06_3 =
1081               _mm256_madd_epi16(out_26_1, k__cospi_m26_p06);
1082           const __m256i out_22_2 =
1083               _mm256_madd_epi16(out_10_0, k__cospi_m10_p22);
1084           const __m256i out_22_3 =
1085               _mm256_madd_epi16(out_10_1, k__cospi_m10_p22);
1086           const __m256i out_14_2 =
1087               _mm256_madd_epi16(out_18_0, k__cospi_m18_p14);
1088           const __m256i out_14_3 =
1089               _mm256_madd_epi16(out_18_1, k__cospi_m18_p14);
1090           const __m256i out_30_2 =
1091               _mm256_madd_epi16(out_02_0, k__cospi_m02_p30);
1092           const __m256i out_30_3 =
1093               _mm256_madd_epi16(out_02_1, k__cospi_m02_p30);
1094           // dct_const_round_shift
1095           const __m256i out_02_4 =
1096               _mm256_add_epi32(out_02_2, k__DCT_CONST_ROUNDING);
1097           const __m256i out_02_5 =
1098               _mm256_add_epi32(out_02_3, k__DCT_CONST_ROUNDING);
1099           const __m256i out_18_4 =
1100               _mm256_add_epi32(out_18_2, k__DCT_CONST_ROUNDING);
1101           const __m256i out_18_5 =
1102               _mm256_add_epi32(out_18_3, k__DCT_CONST_ROUNDING);
1103           const __m256i out_10_4 =
1104               _mm256_add_epi32(out_10_2, k__DCT_CONST_ROUNDING);
1105           const __m256i out_10_5 =
1106               _mm256_add_epi32(out_10_3, k__DCT_CONST_ROUNDING);
1107           const __m256i out_26_4 =
1108               _mm256_add_epi32(out_26_2, k__DCT_CONST_ROUNDING);
1109           const __m256i out_26_5 =
1110               _mm256_add_epi32(out_26_3, k__DCT_CONST_ROUNDING);
1111           const __m256i out_06_4 =
1112               _mm256_add_epi32(out_06_2, k__DCT_CONST_ROUNDING);
1113           const __m256i out_06_5 =
1114               _mm256_add_epi32(out_06_3, k__DCT_CONST_ROUNDING);
1115           const __m256i out_22_4 =
1116               _mm256_add_epi32(out_22_2, k__DCT_CONST_ROUNDING);
1117           const __m256i out_22_5 =
1118               _mm256_add_epi32(out_22_3, k__DCT_CONST_ROUNDING);
1119           const __m256i out_14_4 =
1120               _mm256_add_epi32(out_14_2, k__DCT_CONST_ROUNDING);
1121           const __m256i out_14_5 =
1122               _mm256_add_epi32(out_14_3, k__DCT_CONST_ROUNDING);
1123           const __m256i out_30_4 =
1124               _mm256_add_epi32(out_30_2, k__DCT_CONST_ROUNDING);
1125           const __m256i out_30_5 =
1126               _mm256_add_epi32(out_30_3, k__DCT_CONST_ROUNDING);
1127           const __m256i out_02_6 = _mm256_srai_epi32(out_02_4, DCT_CONST_BITS);
1128           const __m256i out_02_7 = _mm256_srai_epi32(out_02_5, DCT_CONST_BITS);
1129           const __m256i out_18_6 = _mm256_srai_epi32(out_18_4, DCT_CONST_BITS);
1130           const __m256i out_18_7 = _mm256_srai_epi32(out_18_5, DCT_CONST_BITS);
1131           const __m256i out_10_6 = _mm256_srai_epi32(out_10_4, DCT_CONST_BITS);
1132           const __m256i out_10_7 = _mm256_srai_epi32(out_10_5, DCT_CONST_BITS);
1133           const __m256i out_26_6 = _mm256_srai_epi32(out_26_4, DCT_CONST_BITS);
1134           const __m256i out_26_7 = _mm256_srai_epi32(out_26_5, DCT_CONST_BITS);
1135           const __m256i out_06_6 = _mm256_srai_epi32(out_06_4, DCT_CONST_BITS);
1136           const __m256i out_06_7 = _mm256_srai_epi32(out_06_5, DCT_CONST_BITS);
1137           const __m256i out_22_6 = _mm256_srai_epi32(out_22_4, DCT_CONST_BITS);
1138           const __m256i out_22_7 = _mm256_srai_epi32(out_22_5, DCT_CONST_BITS);
1139           const __m256i out_14_6 = _mm256_srai_epi32(out_14_4, DCT_CONST_BITS);
1140           const __m256i out_14_7 = _mm256_srai_epi32(out_14_5, DCT_CONST_BITS);
1141           const __m256i out_30_6 = _mm256_srai_epi32(out_30_4, DCT_CONST_BITS);
1142           const __m256i out_30_7 = _mm256_srai_epi32(out_30_5, DCT_CONST_BITS);
1143           // Combine
1144           out[2] = _mm256_packs_epi32(out_02_6, out_02_7);
1145           out[18] = _mm256_packs_epi32(out_18_6, out_18_7);
1146           out[10] = _mm256_packs_epi32(out_10_6, out_10_7);
1147           out[26] = _mm256_packs_epi32(out_26_6, out_26_7);
1148           out[6] = _mm256_packs_epi32(out_06_6, out_06_7);
1149           out[22] = _mm256_packs_epi32(out_22_6, out_22_7);
1150           out[14] = _mm256_packs_epi32(out_14_6, out_14_7);
1151           out[30] = _mm256_packs_epi32(out_30_6, out_30_7);
1152         }
1153         {
1154           step1[16] = _mm256_add_epi16(step3[17], step2[16]);
1155           step1[17] = _mm256_sub_epi16(step2[16], step3[17]);
1156           step1[18] = _mm256_sub_epi16(step2[19], step3[18]);
1157           step1[19] = _mm256_add_epi16(step3[18], step2[19]);
1158           step1[20] = _mm256_add_epi16(step3[21], step2[20]);
1159           step1[21] = _mm256_sub_epi16(step2[20], step3[21]);
1160           step1[22] = _mm256_sub_epi16(step2[23], step3[22]);
1161           step1[23] = _mm256_add_epi16(step3[22], step2[23]);
1162           step1[24] = _mm256_add_epi16(step3[25], step2[24]);
1163           step1[25] = _mm256_sub_epi16(step2[24], step3[25]);
1164           step1[26] = _mm256_sub_epi16(step2[27], step3[26]);
1165           step1[27] = _mm256_add_epi16(step3[26], step2[27]);
1166           step1[28] = _mm256_add_epi16(step3[29], step2[28]);
1167           step1[29] = _mm256_sub_epi16(step2[28], step3[29]);
1168           step1[30] = _mm256_sub_epi16(step2[31], step3[30]);
1169           step1[31] = _mm256_add_epi16(step3[30], step2[31]);
1170         }
1171         // Final stage --- outputs indices are bit-reversed.
1172         {
1173           const __m256i out_01_0 = _mm256_unpacklo_epi16(step1[16], step1[31]);
1174           const __m256i out_01_1 = _mm256_unpackhi_epi16(step1[16], step1[31]);
1175           const __m256i out_17_0 = _mm256_unpacklo_epi16(step1[17], step1[30]);
1176           const __m256i out_17_1 = _mm256_unpackhi_epi16(step1[17], step1[30]);
1177           const __m256i out_09_0 = _mm256_unpacklo_epi16(step1[18], step1[29]);
1178           const __m256i out_09_1 = _mm256_unpackhi_epi16(step1[18], step1[29]);
1179           const __m256i out_25_0 = _mm256_unpacklo_epi16(step1[19], step1[28]);
1180           const __m256i out_25_1 = _mm256_unpackhi_epi16(step1[19], step1[28]);
1181           const __m256i out_01_2 =
1182               _mm256_madd_epi16(out_01_0, k__cospi_p31_p01);
1183           const __m256i out_01_3 =
1184               _mm256_madd_epi16(out_01_1, k__cospi_p31_p01);
1185           const __m256i out_17_2 =
1186               _mm256_madd_epi16(out_17_0, k__cospi_p15_p17);
1187           const __m256i out_17_3 =
1188               _mm256_madd_epi16(out_17_1, k__cospi_p15_p17);
1189           const __m256i out_09_2 =
1190               _mm256_madd_epi16(out_09_0, k__cospi_p23_p09);
1191           const __m256i out_09_3 =
1192               _mm256_madd_epi16(out_09_1, k__cospi_p23_p09);
1193           const __m256i out_25_2 =
1194               _mm256_madd_epi16(out_25_0, k__cospi_p07_p25);
1195           const __m256i out_25_3 =
1196               _mm256_madd_epi16(out_25_1, k__cospi_p07_p25);
1197           const __m256i out_07_2 =
1198               _mm256_madd_epi16(out_25_0, k__cospi_m25_p07);
1199           const __m256i out_07_3 =
1200               _mm256_madd_epi16(out_25_1, k__cospi_m25_p07);
1201           const __m256i out_23_2 =
1202               _mm256_madd_epi16(out_09_0, k__cospi_m09_p23);
1203           const __m256i out_23_3 =
1204               _mm256_madd_epi16(out_09_1, k__cospi_m09_p23);
1205           const __m256i out_15_2 =
1206               _mm256_madd_epi16(out_17_0, k__cospi_m17_p15);
1207           const __m256i out_15_3 =
1208               _mm256_madd_epi16(out_17_1, k__cospi_m17_p15);
1209           const __m256i out_31_2 =
1210               _mm256_madd_epi16(out_01_0, k__cospi_m01_p31);
1211           const __m256i out_31_3 =
1212               _mm256_madd_epi16(out_01_1, k__cospi_m01_p31);
1213           // dct_const_round_shift
1214           const __m256i out_01_4 =
1215               _mm256_add_epi32(out_01_2, k__DCT_CONST_ROUNDING);
1216           const __m256i out_01_5 =
1217               _mm256_add_epi32(out_01_3, k__DCT_CONST_ROUNDING);
1218           const __m256i out_17_4 =
1219               _mm256_add_epi32(out_17_2, k__DCT_CONST_ROUNDING);
1220           const __m256i out_17_5 =
1221               _mm256_add_epi32(out_17_3, k__DCT_CONST_ROUNDING);
1222           const __m256i out_09_4 =
1223               _mm256_add_epi32(out_09_2, k__DCT_CONST_ROUNDING);
1224           const __m256i out_09_5 =
1225               _mm256_add_epi32(out_09_3, k__DCT_CONST_ROUNDING);
1226           const __m256i out_25_4 =
1227               _mm256_add_epi32(out_25_2, k__DCT_CONST_ROUNDING);
1228           const __m256i out_25_5 =
1229               _mm256_add_epi32(out_25_3, k__DCT_CONST_ROUNDING);
1230           const __m256i out_07_4 =
1231               _mm256_add_epi32(out_07_2, k__DCT_CONST_ROUNDING);
1232           const __m256i out_07_5 =
1233               _mm256_add_epi32(out_07_3, k__DCT_CONST_ROUNDING);
1234           const __m256i out_23_4 =
1235               _mm256_add_epi32(out_23_2, k__DCT_CONST_ROUNDING);
1236           const __m256i out_23_5 =
1237               _mm256_add_epi32(out_23_3, k__DCT_CONST_ROUNDING);
1238           const __m256i out_15_4 =
1239               _mm256_add_epi32(out_15_2, k__DCT_CONST_ROUNDING);
1240           const __m256i out_15_5 =
1241               _mm256_add_epi32(out_15_3, k__DCT_CONST_ROUNDING);
1242           const __m256i out_31_4 =
1243               _mm256_add_epi32(out_31_2, k__DCT_CONST_ROUNDING);
1244           const __m256i out_31_5 =
1245               _mm256_add_epi32(out_31_3, k__DCT_CONST_ROUNDING);
1246           const __m256i out_01_6 = _mm256_srai_epi32(out_01_4, DCT_CONST_BITS);
1247           const __m256i out_01_7 = _mm256_srai_epi32(out_01_5, DCT_CONST_BITS);
1248           const __m256i out_17_6 = _mm256_srai_epi32(out_17_4, DCT_CONST_BITS);
1249           const __m256i out_17_7 = _mm256_srai_epi32(out_17_5, DCT_CONST_BITS);
1250           const __m256i out_09_6 = _mm256_srai_epi32(out_09_4, DCT_CONST_BITS);
1251           const __m256i out_09_7 = _mm256_srai_epi32(out_09_5, DCT_CONST_BITS);
1252           const __m256i out_25_6 = _mm256_srai_epi32(out_25_4, DCT_CONST_BITS);
1253           const __m256i out_25_7 = _mm256_srai_epi32(out_25_5, DCT_CONST_BITS);
1254           const __m256i out_07_6 = _mm256_srai_epi32(out_07_4, DCT_CONST_BITS);
1255           const __m256i out_07_7 = _mm256_srai_epi32(out_07_5, DCT_CONST_BITS);
1256           const __m256i out_23_6 = _mm256_srai_epi32(out_23_4, DCT_CONST_BITS);
1257           const __m256i out_23_7 = _mm256_srai_epi32(out_23_5, DCT_CONST_BITS);
1258           const __m256i out_15_6 = _mm256_srai_epi32(out_15_4, DCT_CONST_BITS);
1259           const __m256i out_15_7 = _mm256_srai_epi32(out_15_5, DCT_CONST_BITS);
1260           const __m256i out_31_6 = _mm256_srai_epi32(out_31_4, DCT_CONST_BITS);
1261           const __m256i out_31_7 = _mm256_srai_epi32(out_31_5, DCT_CONST_BITS);
1262           // Combine
1263           out[1] = _mm256_packs_epi32(out_01_6, out_01_7);
1264           out[17] = _mm256_packs_epi32(out_17_6, out_17_7);
1265           out[9] = _mm256_packs_epi32(out_09_6, out_09_7);
1266           out[25] = _mm256_packs_epi32(out_25_6, out_25_7);
1267           out[7] = _mm256_packs_epi32(out_07_6, out_07_7);
1268           out[23] = _mm256_packs_epi32(out_23_6, out_23_7);
1269           out[15] = _mm256_packs_epi32(out_15_6, out_15_7);
1270           out[31] = _mm256_packs_epi32(out_31_6, out_31_7);
1271         }
1272         {
1273           const __m256i out_05_0 = _mm256_unpacklo_epi16(step1[20], step1[27]);
1274           const __m256i out_05_1 = _mm256_unpackhi_epi16(step1[20], step1[27]);
1275           const __m256i out_21_0 = _mm256_unpacklo_epi16(step1[21], step1[26]);
1276           const __m256i out_21_1 = _mm256_unpackhi_epi16(step1[21], step1[26]);
1277           const __m256i out_13_0 = _mm256_unpacklo_epi16(step1[22], step1[25]);
1278           const __m256i out_13_1 = _mm256_unpackhi_epi16(step1[22], step1[25]);
1279           const __m256i out_29_0 = _mm256_unpacklo_epi16(step1[23], step1[24]);
1280           const __m256i out_29_1 = _mm256_unpackhi_epi16(step1[23], step1[24]);
1281           const __m256i out_05_2 =
1282               _mm256_madd_epi16(out_05_0, k__cospi_p27_p05);
1283           const __m256i out_05_3 =
1284               _mm256_madd_epi16(out_05_1, k__cospi_p27_p05);
1285           const __m256i out_21_2 =
1286               _mm256_madd_epi16(out_21_0, k__cospi_p11_p21);
1287           const __m256i out_21_3 =
1288               _mm256_madd_epi16(out_21_1, k__cospi_p11_p21);
1289           const __m256i out_13_2 =
1290               _mm256_madd_epi16(out_13_0, k__cospi_p19_p13);
1291           const __m256i out_13_3 =
1292               _mm256_madd_epi16(out_13_1, k__cospi_p19_p13);
1293           const __m256i out_29_2 =
1294               _mm256_madd_epi16(out_29_0, k__cospi_p03_p29);
1295           const __m256i out_29_3 =
1296               _mm256_madd_epi16(out_29_1, k__cospi_p03_p29);
1297           const __m256i out_03_2 =
1298               _mm256_madd_epi16(out_29_0, k__cospi_m29_p03);
1299           const __m256i out_03_3 =
1300               _mm256_madd_epi16(out_29_1, k__cospi_m29_p03);
1301           const __m256i out_19_2 =
1302               _mm256_madd_epi16(out_13_0, k__cospi_m13_p19);
1303           const __m256i out_19_3 =
1304               _mm256_madd_epi16(out_13_1, k__cospi_m13_p19);
1305           const __m256i out_11_2 =
1306               _mm256_madd_epi16(out_21_0, k__cospi_m21_p11);
1307           const __m256i out_11_3 =
1308               _mm256_madd_epi16(out_21_1, k__cospi_m21_p11);
1309           const __m256i out_27_2 =
1310               _mm256_madd_epi16(out_05_0, k__cospi_m05_p27);
1311           const __m256i out_27_3 =
1312               _mm256_madd_epi16(out_05_1, k__cospi_m05_p27);
1313           // dct_const_round_shift
1314           const __m256i out_05_4 =
1315               _mm256_add_epi32(out_05_2, k__DCT_CONST_ROUNDING);
1316           const __m256i out_05_5 =
1317               _mm256_add_epi32(out_05_3, k__DCT_CONST_ROUNDING);
1318           const __m256i out_21_4 =
1319               _mm256_add_epi32(out_21_2, k__DCT_CONST_ROUNDING);
1320           const __m256i out_21_5 =
1321               _mm256_add_epi32(out_21_3, k__DCT_CONST_ROUNDING);
1322           const __m256i out_13_4 =
1323               _mm256_add_epi32(out_13_2, k__DCT_CONST_ROUNDING);
1324           const __m256i out_13_5 =
1325               _mm256_add_epi32(out_13_3, k__DCT_CONST_ROUNDING);
1326           const __m256i out_29_4 =
1327               _mm256_add_epi32(out_29_2, k__DCT_CONST_ROUNDING);
1328           const __m256i out_29_5 =
1329               _mm256_add_epi32(out_29_3, k__DCT_CONST_ROUNDING);
1330           const __m256i out_03_4 =
1331               _mm256_add_epi32(out_03_2, k__DCT_CONST_ROUNDING);
1332           const __m256i out_03_5 =
1333               _mm256_add_epi32(out_03_3, k__DCT_CONST_ROUNDING);
1334           const __m256i out_19_4 =
1335               _mm256_add_epi32(out_19_2, k__DCT_CONST_ROUNDING);
1336           const __m256i out_19_5 =
1337               _mm256_add_epi32(out_19_3, k__DCT_CONST_ROUNDING);
1338           const __m256i out_11_4 =
1339               _mm256_add_epi32(out_11_2, k__DCT_CONST_ROUNDING);
1340           const __m256i out_11_5 =
1341               _mm256_add_epi32(out_11_3, k__DCT_CONST_ROUNDING);
1342           const __m256i out_27_4 =
1343               _mm256_add_epi32(out_27_2, k__DCT_CONST_ROUNDING);
1344           const __m256i out_27_5 =
1345               _mm256_add_epi32(out_27_3, k__DCT_CONST_ROUNDING);
1346           const __m256i out_05_6 = _mm256_srai_epi32(out_05_4, DCT_CONST_BITS);
1347           const __m256i out_05_7 = _mm256_srai_epi32(out_05_5, DCT_CONST_BITS);
1348           const __m256i out_21_6 = _mm256_srai_epi32(out_21_4, DCT_CONST_BITS);
1349           const __m256i out_21_7 = _mm256_srai_epi32(out_21_5, DCT_CONST_BITS);
1350           const __m256i out_13_6 = _mm256_srai_epi32(out_13_4, DCT_CONST_BITS);
1351           const __m256i out_13_7 = _mm256_srai_epi32(out_13_5, DCT_CONST_BITS);
1352           const __m256i out_29_6 = _mm256_srai_epi32(out_29_4, DCT_CONST_BITS);
1353           const __m256i out_29_7 = _mm256_srai_epi32(out_29_5, DCT_CONST_BITS);
1354           const __m256i out_03_6 = _mm256_srai_epi32(out_03_4, DCT_CONST_BITS);
1355           const __m256i out_03_7 = _mm256_srai_epi32(out_03_5, DCT_CONST_BITS);
1356           const __m256i out_19_6 = _mm256_srai_epi32(out_19_4, DCT_CONST_BITS);
1357           const __m256i out_19_7 = _mm256_srai_epi32(out_19_5, DCT_CONST_BITS);
1358           const __m256i out_11_6 = _mm256_srai_epi32(out_11_4, DCT_CONST_BITS);
1359           const __m256i out_11_7 = _mm256_srai_epi32(out_11_5, DCT_CONST_BITS);
1360           const __m256i out_27_6 = _mm256_srai_epi32(out_27_4, DCT_CONST_BITS);
1361           const __m256i out_27_7 = _mm256_srai_epi32(out_27_5, DCT_CONST_BITS);
1362           // Combine
1363           out[5] = _mm256_packs_epi32(out_05_6, out_05_7);
1364           out[21] = _mm256_packs_epi32(out_21_6, out_21_7);
1365           out[13] = _mm256_packs_epi32(out_13_6, out_13_7);
1366           out[29] = _mm256_packs_epi32(out_29_6, out_29_7);
1367           out[3] = _mm256_packs_epi32(out_03_6, out_03_7);
1368           out[19] = _mm256_packs_epi32(out_19_6, out_19_7);
1369           out[11] = _mm256_packs_epi32(out_11_6, out_11_7);
1370           out[27] = _mm256_packs_epi32(out_27_6, out_27_7);
1371         }
1372 #if FDCT32x32_HIGH_PRECISION
1373       } else {
1374         __m256i lstep1[64], lstep2[64], lstep3[64];
1375         __m256i u[32], v[32], sign[16];
1376         const __m256i K32One = _mm256_set_epi32(1, 1, 1, 1, 1, 1, 1, 1);
1377         // start using 32-bit operations
1378         // stage 3
1379         {
1380           // expanding to 32-bit length priori to addition operations
1381           lstep2[0] = _mm256_unpacklo_epi16(step2[0], kZero);
1382           lstep2[1] = _mm256_unpackhi_epi16(step2[0], kZero);
1383           lstep2[2] = _mm256_unpacklo_epi16(step2[1], kZero);
1384           lstep2[3] = _mm256_unpackhi_epi16(step2[1], kZero);
1385           lstep2[4] = _mm256_unpacklo_epi16(step2[2], kZero);
1386           lstep2[5] = _mm256_unpackhi_epi16(step2[2], kZero);
1387           lstep2[6] = _mm256_unpacklo_epi16(step2[3], kZero);
1388           lstep2[7] = _mm256_unpackhi_epi16(step2[3], kZero);
1389           lstep2[8] = _mm256_unpacklo_epi16(step2[4], kZero);
1390           lstep2[9] = _mm256_unpackhi_epi16(step2[4], kZero);
1391           lstep2[10] = _mm256_unpacklo_epi16(step2[5], kZero);
1392           lstep2[11] = _mm256_unpackhi_epi16(step2[5], kZero);
1393           lstep2[12] = _mm256_unpacklo_epi16(step2[6], kZero);
1394           lstep2[13] = _mm256_unpackhi_epi16(step2[6], kZero);
1395           lstep2[14] = _mm256_unpacklo_epi16(step2[7], kZero);
1396           lstep2[15] = _mm256_unpackhi_epi16(step2[7], kZero);
1397           lstep2[0] = _mm256_madd_epi16(lstep2[0], kOne);
1398           lstep2[1] = _mm256_madd_epi16(lstep2[1], kOne);
1399           lstep2[2] = _mm256_madd_epi16(lstep2[2], kOne);
1400           lstep2[3] = _mm256_madd_epi16(lstep2[3], kOne);
1401           lstep2[4] = _mm256_madd_epi16(lstep2[4], kOne);
1402           lstep2[5] = _mm256_madd_epi16(lstep2[5], kOne);
1403           lstep2[6] = _mm256_madd_epi16(lstep2[6], kOne);
1404           lstep2[7] = _mm256_madd_epi16(lstep2[7], kOne);
1405           lstep2[8] = _mm256_madd_epi16(lstep2[8], kOne);
1406           lstep2[9] = _mm256_madd_epi16(lstep2[9], kOne);
1407           lstep2[10] = _mm256_madd_epi16(lstep2[10], kOne);
1408           lstep2[11] = _mm256_madd_epi16(lstep2[11], kOne);
1409           lstep2[12] = _mm256_madd_epi16(lstep2[12], kOne);
1410           lstep2[13] = _mm256_madd_epi16(lstep2[13], kOne);
1411           lstep2[14] = _mm256_madd_epi16(lstep2[14], kOne);
1412           lstep2[15] = _mm256_madd_epi16(lstep2[15], kOne);
1413 
1414           lstep3[0] = _mm256_add_epi32(lstep2[14], lstep2[0]);
1415           lstep3[1] = _mm256_add_epi32(lstep2[15], lstep2[1]);
1416           lstep3[2] = _mm256_add_epi32(lstep2[12], lstep2[2]);
1417           lstep3[3] = _mm256_add_epi32(lstep2[13], lstep2[3]);
1418           lstep3[4] = _mm256_add_epi32(lstep2[10], lstep2[4]);
1419           lstep3[5] = _mm256_add_epi32(lstep2[11], lstep2[5]);
1420           lstep3[6] = _mm256_add_epi32(lstep2[8], lstep2[6]);
1421           lstep3[7] = _mm256_add_epi32(lstep2[9], lstep2[7]);
1422           lstep3[8] = _mm256_sub_epi32(lstep2[6], lstep2[8]);
1423           lstep3[9] = _mm256_sub_epi32(lstep2[7], lstep2[9]);
1424           lstep3[10] = _mm256_sub_epi32(lstep2[4], lstep2[10]);
1425           lstep3[11] = _mm256_sub_epi32(lstep2[5], lstep2[11]);
1426           lstep3[12] = _mm256_sub_epi32(lstep2[2], lstep2[12]);
1427           lstep3[13] = _mm256_sub_epi32(lstep2[3], lstep2[13]);
1428           lstep3[14] = _mm256_sub_epi32(lstep2[0], lstep2[14]);
1429           lstep3[15] = _mm256_sub_epi32(lstep2[1], lstep2[15]);
1430         }
1431         {
1432           const __m256i s3_10_0 = _mm256_unpacklo_epi16(step2[13], step2[10]);
1433           const __m256i s3_10_1 = _mm256_unpackhi_epi16(step2[13], step2[10]);
1434           const __m256i s3_11_0 = _mm256_unpacklo_epi16(step2[12], step2[11]);
1435           const __m256i s3_11_1 = _mm256_unpackhi_epi16(step2[12], step2[11]);
1436           const __m256i s3_10_2 = _mm256_madd_epi16(s3_10_0, k__cospi_p16_m16);
1437           const __m256i s3_10_3 = _mm256_madd_epi16(s3_10_1, k__cospi_p16_m16);
1438           const __m256i s3_11_2 = _mm256_madd_epi16(s3_11_0, k__cospi_p16_m16);
1439           const __m256i s3_11_3 = _mm256_madd_epi16(s3_11_1, k__cospi_p16_m16);
1440           const __m256i s3_12_2 = _mm256_madd_epi16(s3_11_0, k__cospi_p16_p16);
1441           const __m256i s3_12_3 = _mm256_madd_epi16(s3_11_1, k__cospi_p16_p16);
1442           const __m256i s3_13_2 = _mm256_madd_epi16(s3_10_0, k__cospi_p16_p16);
1443           const __m256i s3_13_3 = _mm256_madd_epi16(s3_10_1, k__cospi_p16_p16);
1444           // dct_const_round_shift
1445           const __m256i s3_10_4 =
1446               _mm256_add_epi32(s3_10_2, k__DCT_CONST_ROUNDING);
1447           const __m256i s3_10_5 =
1448               _mm256_add_epi32(s3_10_3, k__DCT_CONST_ROUNDING);
1449           const __m256i s3_11_4 =
1450               _mm256_add_epi32(s3_11_2, k__DCT_CONST_ROUNDING);
1451           const __m256i s3_11_5 =
1452               _mm256_add_epi32(s3_11_3, k__DCT_CONST_ROUNDING);
1453           const __m256i s3_12_4 =
1454               _mm256_add_epi32(s3_12_2, k__DCT_CONST_ROUNDING);
1455           const __m256i s3_12_5 =
1456               _mm256_add_epi32(s3_12_3, k__DCT_CONST_ROUNDING);
1457           const __m256i s3_13_4 =
1458               _mm256_add_epi32(s3_13_2, k__DCT_CONST_ROUNDING);
1459           const __m256i s3_13_5 =
1460               _mm256_add_epi32(s3_13_3, k__DCT_CONST_ROUNDING);
1461           lstep3[20] = _mm256_srai_epi32(s3_10_4, DCT_CONST_BITS);
1462           lstep3[21] = _mm256_srai_epi32(s3_10_5, DCT_CONST_BITS);
1463           lstep3[22] = _mm256_srai_epi32(s3_11_4, DCT_CONST_BITS);
1464           lstep3[23] = _mm256_srai_epi32(s3_11_5, DCT_CONST_BITS);
1465           lstep3[24] = _mm256_srai_epi32(s3_12_4, DCT_CONST_BITS);
1466           lstep3[25] = _mm256_srai_epi32(s3_12_5, DCT_CONST_BITS);
1467           lstep3[26] = _mm256_srai_epi32(s3_13_4, DCT_CONST_BITS);
1468           lstep3[27] = _mm256_srai_epi32(s3_13_5, DCT_CONST_BITS);
1469         }
1470         {
1471           lstep2[40] = _mm256_unpacklo_epi16(step2[20], kZero);
1472           lstep2[41] = _mm256_unpackhi_epi16(step2[20], kZero);
1473           lstep2[42] = _mm256_unpacklo_epi16(step2[21], kZero);
1474           lstep2[43] = _mm256_unpackhi_epi16(step2[21], kZero);
1475           lstep2[44] = _mm256_unpacklo_epi16(step2[22], kZero);
1476           lstep2[45] = _mm256_unpackhi_epi16(step2[22], kZero);
1477           lstep2[46] = _mm256_unpacklo_epi16(step2[23], kZero);
1478           lstep2[47] = _mm256_unpackhi_epi16(step2[23], kZero);
1479           lstep2[48] = _mm256_unpacklo_epi16(step2[24], kZero);
1480           lstep2[49] = _mm256_unpackhi_epi16(step2[24], kZero);
1481           lstep2[50] = _mm256_unpacklo_epi16(step2[25], kZero);
1482           lstep2[51] = _mm256_unpackhi_epi16(step2[25], kZero);
1483           lstep2[52] = _mm256_unpacklo_epi16(step2[26], kZero);
1484           lstep2[53] = _mm256_unpackhi_epi16(step2[26], kZero);
1485           lstep2[54] = _mm256_unpacklo_epi16(step2[27], kZero);
1486           lstep2[55] = _mm256_unpackhi_epi16(step2[27], kZero);
1487           lstep2[40] = _mm256_madd_epi16(lstep2[40], kOne);
1488           lstep2[41] = _mm256_madd_epi16(lstep2[41], kOne);
1489           lstep2[42] = _mm256_madd_epi16(lstep2[42], kOne);
1490           lstep2[43] = _mm256_madd_epi16(lstep2[43], kOne);
1491           lstep2[44] = _mm256_madd_epi16(lstep2[44], kOne);
1492           lstep2[45] = _mm256_madd_epi16(lstep2[45], kOne);
1493           lstep2[46] = _mm256_madd_epi16(lstep2[46], kOne);
1494           lstep2[47] = _mm256_madd_epi16(lstep2[47], kOne);
1495           lstep2[48] = _mm256_madd_epi16(lstep2[48], kOne);
1496           lstep2[49] = _mm256_madd_epi16(lstep2[49], kOne);
1497           lstep2[50] = _mm256_madd_epi16(lstep2[50], kOne);
1498           lstep2[51] = _mm256_madd_epi16(lstep2[51], kOne);
1499           lstep2[52] = _mm256_madd_epi16(lstep2[52], kOne);
1500           lstep2[53] = _mm256_madd_epi16(lstep2[53], kOne);
1501           lstep2[54] = _mm256_madd_epi16(lstep2[54], kOne);
1502           lstep2[55] = _mm256_madd_epi16(lstep2[55], kOne);
1503 
1504           lstep1[32] = _mm256_unpacklo_epi16(step1[16], kZero);
1505           lstep1[33] = _mm256_unpackhi_epi16(step1[16], kZero);
1506           lstep1[34] = _mm256_unpacklo_epi16(step1[17], kZero);
1507           lstep1[35] = _mm256_unpackhi_epi16(step1[17], kZero);
1508           lstep1[36] = _mm256_unpacklo_epi16(step1[18], kZero);
1509           lstep1[37] = _mm256_unpackhi_epi16(step1[18], kZero);
1510           lstep1[38] = _mm256_unpacklo_epi16(step1[19], kZero);
1511           lstep1[39] = _mm256_unpackhi_epi16(step1[19], kZero);
1512           lstep1[56] = _mm256_unpacklo_epi16(step1[28], kZero);
1513           lstep1[57] = _mm256_unpackhi_epi16(step1[28], kZero);
1514           lstep1[58] = _mm256_unpacklo_epi16(step1[29], kZero);
1515           lstep1[59] = _mm256_unpackhi_epi16(step1[29], kZero);
1516           lstep1[60] = _mm256_unpacklo_epi16(step1[30], kZero);
1517           lstep1[61] = _mm256_unpackhi_epi16(step1[30], kZero);
1518           lstep1[62] = _mm256_unpacklo_epi16(step1[31], kZero);
1519           lstep1[63] = _mm256_unpackhi_epi16(step1[31], kZero);
1520           lstep1[32] = _mm256_madd_epi16(lstep1[32], kOne);
1521           lstep1[33] = _mm256_madd_epi16(lstep1[33], kOne);
1522           lstep1[34] = _mm256_madd_epi16(lstep1[34], kOne);
1523           lstep1[35] = _mm256_madd_epi16(lstep1[35], kOne);
1524           lstep1[36] = _mm256_madd_epi16(lstep1[36], kOne);
1525           lstep1[37] = _mm256_madd_epi16(lstep1[37], kOne);
1526           lstep1[38] = _mm256_madd_epi16(lstep1[38], kOne);
1527           lstep1[39] = _mm256_madd_epi16(lstep1[39], kOne);
1528           lstep1[56] = _mm256_madd_epi16(lstep1[56], kOne);
1529           lstep1[57] = _mm256_madd_epi16(lstep1[57], kOne);
1530           lstep1[58] = _mm256_madd_epi16(lstep1[58], kOne);
1531           lstep1[59] = _mm256_madd_epi16(lstep1[59], kOne);
1532           lstep1[60] = _mm256_madd_epi16(lstep1[60], kOne);
1533           lstep1[61] = _mm256_madd_epi16(lstep1[61], kOne);
1534           lstep1[62] = _mm256_madd_epi16(lstep1[62], kOne);
1535           lstep1[63] = _mm256_madd_epi16(lstep1[63], kOne);
1536 
1537           lstep3[32] = _mm256_add_epi32(lstep2[46], lstep1[32]);
1538           lstep3[33] = _mm256_add_epi32(lstep2[47], lstep1[33]);
1539 
1540           lstep3[34] = _mm256_add_epi32(lstep2[44], lstep1[34]);
1541           lstep3[35] = _mm256_add_epi32(lstep2[45], lstep1[35]);
1542           lstep3[36] = _mm256_add_epi32(lstep2[42], lstep1[36]);
1543           lstep3[37] = _mm256_add_epi32(lstep2[43], lstep1[37]);
1544           lstep3[38] = _mm256_add_epi32(lstep2[40], lstep1[38]);
1545           lstep3[39] = _mm256_add_epi32(lstep2[41], lstep1[39]);
1546           lstep3[40] = _mm256_sub_epi32(lstep1[38], lstep2[40]);
1547           lstep3[41] = _mm256_sub_epi32(lstep1[39], lstep2[41]);
1548           lstep3[42] = _mm256_sub_epi32(lstep1[36], lstep2[42]);
1549           lstep3[43] = _mm256_sub_epi32(lstep1[37], lstep2[43]);
1550           lstep3[44] = _mm256_sub_epi32(lstep1[34], lstep2[44]);
1551           lstep3[45] = _mm256_sub_epi32(lstep1[35], lstep2[45]);
1552           lstep3[46] = _mm256_sub_epi32(lstep1[32], lstep2[46]);
1553           lstep3[47] = _mm256_sub_epi32(lstep1[33], lstep2[47]);
1554           lstep3[48] = _mm256_sub_epi32(lstep1[62], lstep2[48]);
1555           lstep3[49] = _mm256_sub_epi32(lstep1[63], lstep2[49]);
1556           lstep3[50] = _mm256_sub_epi32(lstep1[60], lstep2[50]);
1557           lstep3[51] = _mm256_sub_epi32(lstep1[61], lstep2[51]);
1558           lstep3[52] = _mm256_sub_epi32(lstep1[58], lstep2[52]);
1559           lstep3[53] = _mm256_sub_epi32(lstep1[59], lstep2[53]);
1560           lstep3[54] = _mm256_sub_epi32(lstep1[56], lstep2[54]);
1561           lstep3[55] = _mm256_sub_epi32(lstep1[57], lstep2[55]);
1562           lstep3[56] = _mm256_add_epi32(lstep2[54], lstep1[56]);
1563           lstep3[57] = _mm256_add_epi32(lstep2[55], lstep1[57]);
1564           lstep3[58] = _mm256_add_epi32(lstep2[52], lstep1[58]);
1565           lstep3[59] = _mm256_add_epi32(lstep2[53], lstep1[59]);
1566           lstep3[60] = _mm256_add_epi32(lstep2[50], lstep1[60]);
1567           lstep3[61] = _mm256_add_epi32(lstep2[51], lstep1[61]);
1568           lstep3[62] = _mm256_add_epi32(lstep2[48], lstep1[62]);
1569           lstep3[63] = _mm256_add_epi32(lstep2[49], lstep1[63]);
1570         }
1571 
1572         // stage 4
1573         {
1574           // expanding to 32-bit length priori to addition operations
1575           lstep2[16] = _mm256_unpacklo_epi16(step2[8], kZero);
1576           lstep2[17] = _mm256_unpackhi_epi16(step2[8], kZero);
1577           lstep2[18] = _mm256_unpacklo_epi16(step2[9], kZero);
1578           lstep2[19] = _mm256_unpackhi_epi16(step2[9], kZero);
1579           lstep2[28] = _mm256_unpacklo_epi16(step2[14], kZero);
1580           lstep2[29] = _mm256_unpackhi_epi16(step2[14], kZero);
1581           lstep2[30] = _mm256_unpacklo_epi16(step2[15], kZero);
1582           lstep2[31] = _mm256_unpackhi_epi16(step2[15], kZero);
1583           lstep2[16] = _mm256_madd_epi16(lstep2[16], kOne);
1584           lstep2[17] = _mm256_madd_epi16(lstep2[17], kOne);
1585           lstep2[18] = _mm256_madd_epi16(lstep2[18], kOne);
1586           lstep2[19] = _mm256_madd_epi16(lstep2[19], kOne);
1587           lstep2[28] = _mm256_madd_epi16(lstep2[28], kOne);
1588           lstep2[29] = _mm256_madd_epi16(lstep2[29], kOne);
1589           lstep2[30] = _mm256_madd_epi16(lstep2[30], kOne);
1590           lstep2[31] = _mm256_madd_epi16(lstep2[31], kOne);
1591 
1592           lstep1[0] = _mm256_add_epi32(lstep3[6], lstep3[0]);
1593           lstep1[1] = _mm256_add_epi32(lstep3[7], lstep3[1]);
1594           lstep1[2] = _mm256_add_epi32(lstep3[4], lstep3[2]);
1595           lstep1[3] = _mm256_add_epi32(lstep3[5], lstep3[3]);
1596           lstep1[4] = _mm256_sub_epi32(lstep3[2], lstep3[4]);
1597           lstep1[5] = _mm256_sub_epi32(lstep3[3], lstep3[5]);
1598           lstep1[6] = _mm256_sub_epi32(lstep3[0], lstep3[6]);
1599           lstep1[7] = _mm256_sub_epi32(lstep3[1], lstep3[7]);
1600           lstep1[16] = _mm256_add_epi32(lstep3[22], lstep2[16]);
1601           lstep1[17] = _mm256_add_epi32(lstep3[23], lstep2[17]);
1602           lstep1[18] = _mm256_add_epi32(lstep3[20], lstep2[18]);
1603           lstep1[19] = _mm256_add_epi32(lstep3[21], lstep2[19]);
1604           lstep1[20] = _mm256_sub_epi32(lstep2[18], lstep3[20]);
1605           lstep1[21] = _mm256_sub_epi32(lstep2[19], lstep3[21]);
1606           lstep1[22] = _mm256_sub_epi32(lstep2[16], lstep3[22]);
1607           lstep1[23] = _mm256_sub_epi32(lstep2[17], lstep3[23]);
1608           lstep1[24] = _mm256_sub_epi32(lstep2[30], lstep3[24]);
1609           lstep1[25] = _mm256_sub_epi32(lstep2[31], lstep3[25]);
1610           lstep1[26] = _mm256_sub_epi32(lstep2[28], lstep3[26]);
1611           lstep1[27] = _mm256_sub_epi32(lstep2[29], lstep3[27]);
1612           lstep1[28] = _mm256_add_epi32(lstep3[26], lstep2[28]);
1613           lstep1[29] = _mm256_add_epi32(lstep3[27], lstep2[29]);
1614           lstep1[30] = _mm256_add_epi32(lstep3[24], lstep2[30]);
1615           lstep1[31] = _mm256_add_epi32(lstep3[25], lstep2[31]);
1616         }
1617         {
1618           // to be continued...
1619           //
1620           const __m256i k32_p16_p16 =
1621               pair256_set_epi32(cospi_16_64, cospi_16_64);
1622           const __m256i k32_p16_m16 =
1623               pair256_set_epi32(cospi_16_64, -cospi_16_64);
1624 
1625           u[0] = _mm256_unpacklo_epi32(lstep3[12], lstep3[10]);
1626           u[1] = _mm256_unpackhi_epi32(lstep3[12], lstep3[10]);
1627           u[2] = _mm256_unpacklo_epi32(lstep3[13], lstep3[11]);
1628           u[3] = _mm256_unpackhi_epi32(lstep3[13], lstep3[11]);
1629 
1630           // TODO(jingning): manually inline k_madd_epi32_avx2_ to further hide
1631           // instruction latency.
1632           v[0] = k_madd_epi32_avx2(u[0], k32_p16_m16);
1633           v[1] = k_madd_epi32_avx2(u[1], k32_p16_m16);
1634           v[2] = k_madd_epi32_avx2(u[2], k32_p16_m16);
1635           v[3] = k_madd_epi32_avx2(u[3], k32_p16_m16);
1636           v[4] = k_madd_epi32_avx2(u[0], k32_p16_p16);
1637           v[5] = k_madd_epi32_avx2(u[1], k32_p16_p16);
1638           v[6] = k_madd_epi32_avx2(u[2], k32_p16_p16);
1639           v[7] = k_madd_epi32_avx2(u[3], k32_p16_p16);
1640 
1641           u[0] = k_packs_epi64_avx2(v[0], v[1]);
1642           u[1] = k_packs_epi64_avx2(v[2], v[3]);
1643           u[2] = k_packs_epi64_avx2(v[4], v[5]);
1644           u[3] = k_packs_epi64_avx2(v[6], v[7]);
1645 
1646           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
1647           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
1648           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
1649           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
1650 
1651           lstep1[10] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
1652           lstep1[11] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
1653           lstep1[12] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
1654           lstep1[13] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
1655         }
1656         {
1657           const __m256i k32_m08_p24 =
1658               pair256_set_epi32(-cospi_8_64, cospi_24_64);
1659           const __m256i k32_m24_m08 =
1660               pair256_set_epi32(-cospi_24_64, -cospi_8_64);
1661           const __m256i k32_p24_p08 =
1662               pair256_set_epi32(cospi_24_64, cospi_8_64);
1663 
1664           u[0] = _mm256_unpacklo_epi32(lstep3[36], lstep3[58]);
1665           u[1] = _mm256_unpackhi_epi32(lstep3[36], lstep3[58]);
1666           u[2] = _mm256_unpacklo_epi32(lstep3[37], lstep3[59]);
1667           u[3] = _mm256_unpackhi_epi32(lstep3[37], lstep3[59]);
1668           u[4] = _mm256_unpacklo_epi32(lstep3[38], lstep3[56]);
1669           u[5] = _mm256_unpackhi_epi32(lstep3[38], lstep3[56]);
1670           u[6] = _mm256_unpacklo_epi32(lstep3[39], lstep3[57]);
1671           u[7] = _mm256_unpackhi_epi32(lstep3[39], lstep3[57]);
1672           u[8] = _mm256_unpacklo_epi32(lstep3[40], lstep3[54]);
1673           u[9] = _mm256_unpackhi_epi32(lstep3[40], lstep3[54]);
1674           u[10] = _mm256_unpacklo_epi32(lstep3[41], lstep3[55]);
1675           u[11] = _mm256_unpackhi_epi32(lstep3[41], lstep3[55]);
1676           u[12] = _mm256_unpacklo_epi32(lstep3[42], lstep3[52]);
1677           u[13] = _mm256_unpackhi_epi32(lstep3[42], lstep3[52]);
1678           u[14] = _mm256_unpacklo_epi32(lstep3[43], lstep3[53]);
1679           u[15] = _mm256_unpackhi_epi32(lstep3[43], lstep3[53]);
1680 
1681           v[0] = k_madd_epi32_avx2(u[0], k32_m08_p24);
1682           v[1] = k_madd_epi32_avx2(u[1], k32_m08_p24);
1683           v[2] = k_madd_epi32_avx2(u[2], k32_m08_p24);
1684           v[3] = k_madd_epi32_avx2(u[3], k32_m08_p24);
1685           v[4] = k_madd_epi32_avx2(u[4], k32_m08_p24);
1686           v[5] = k_madd_epi32_avx2(u[5], k32_m08_p24);
1687           v[6] = k_madd_epi32_avx2(u[6], k32_m08_p24);
1688           v[7] = k_madd_epi32_avx2(u[7], k32_m08_p24);
1689           v[8] = k_madd_epi32_avx2(u[8], k32_m24_m08);
1690           v[9] = k_madd_epi32_avx2(u[9], k32_m24_m08);
1691           v[10] = k_madd_epi32_avx2(u[10], k32_m24_m08);
1692           v[11] = k_madd_epi32_avx2(u[11], k32_m24_m08);
1693           v[12] = k_madd_epi32_avx2(u[12], k32_m24_m08);
1694           v[13] = k_madd_epi32_avx2(u[13], k32_m24_m08);
1695           v[14] = k_madd_epi32_avx2(u[14], k32_m24_m08);
1696           v[15] = k_madd_epi32_avx2(u[15], k32_m24_m08);
1697           v[16] = k_madd_epi32_avx2(u[12], k32_m08_p24);
1698           v[17] = k_madd_epi32_avx2(u[13], k32_m08_p24);
1699           v[18] = k_madd_epi32_avx2(u[14], k32_m08_p24);
1700           v[19] = k_madd_epi32_avx2(u[15], k32_m08_p24);
1701           v[20] = k_madd_epi32_avx2(u[8], k32_m08_p24);
1702           v[21] = k_madd_epi32_avx2(u[9], k32_m08_p24);
1703           v[22] = k_madd_epi32_avx2(u[10], k32_m08_p24);
1704           v[23] = k_madd_epi32_avx2(u[11], k32_m08_p24);
1705           v[24] = k_madd_epi32_avx2(u[4], k32_p24_p08);
1706           v[25] = k_madd_epi32_avx2(u[5], k32_p24_p08);
1707           v[26] = k_madd_epi32_avx2(u[6], k32_p24_p08);
1708           v[27] = k_madd_epi32_avx2(u[7], k32_p24_p08);
1709           v[28] = k_madd_epi32_avx2(u[0], k32_p24_p08);
1710           v[29] = k_madd_epi32_avx2(u[1], k32_p24_p08);
1711           v[30] = k_madd_epi32_avx2(u[2], k32_p24_p08);
1712           v[31] = k_madd_epi32_avx2(u[3], k32_p24_p08);
1713 
1714           u[0] = k_packs_epi64_avx2(v[0], v[1]);
1715           u[1] = k_packs_epi64_avx2(v[2], v[3]);
1716           u[2] = k_packs_epi64_avx2(v[4], v[5]);
1717           u[3] = k_packs_epi64_avx2(v[6], v[7]);
1718           u[4] = k_packs_epi64_avx2(v[8], v[9]);
1719           u[5] = k_packs_epi64_avx2(v[10], v[11]);
1720           u[6] = k_packs_epi64_avx2(v[12], v[13]);
1721           u[7] = k_packs_epi64_avx2(v[14], v[15]);
1722           u[8] = k_packs_epi64_avx2(v[16], v[17]);
1723           u[9] = k_packs_epi64_avx2(v[18], v[19]);
1724           u[10] = k_packs_epi64_avx2(v[20], v[21]);
1725           u[11] = k_packs_epi64_avx2(v[22], v[23]);
1726           u[12] = k_packs_epi64_avx2(v[24], v[25]);
1727           u[13] = k_packs_epi64_avx2(v[26], v[27]);
1728           u[14] = k_packs_epi64_avx2(v[28], v[29]);
1729           u[15] = k_packs_epi64_avx2(v[30], v[31]);
1730 
1731           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
1732           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
1733           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
1734           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
1735           v[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
1736           v[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
1737           v[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
1738           v[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
1739           v[8] = _mm256_add_epi32(u[8], k__DCT_CONST_ROUNDING);
1740           v[9] = _mm256_add_epi32(u[9], k__DCT_CONST_ROUNDING);
1741           v[10] = _mm256_add_epi32(u[10], k__DCT_CONST_ROUNDING);
1742           v[11] = _mm256_add_epi32(u[11], k__DCT_CONST_ROUNDING);
1743           v[12] = _mm256_add_epi32(u[12], k__DCT_CONST_ROUNDING);
1744           v[13] = _mm256_add_epi32(u[13], k__DCT_CONST_ROUNDING);
1745           v[14] = _mm256_add_epi32(u[14], k__DCT_CONST_ROUNDING);
1746           v[15] = _mm256_add_epi32(u[15], k__DCT_CONST_ROUNDING);
1747 
1748           lstep1[36] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
1749           lstep1[37] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
1750           lstep1[38] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
1751           lstep1[39] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
1752           lstep1[40] = _mm256_srai_epi32(v[4], DCT_CONST_BITS);
1753           lstep1[41] = _mm256_srai_epi32(v[5], DCT_CONST_BITS);
1754           lstep1[42] = _mm256_srai_epi32(v[6], DCT_CONST_BITS);
1755           lstep1[43] = _mm256_srai_epi32(v[7], DCT_CONST_BITS);
1756           lstep1[52] = _mm256_srai_epi32(v[8], DCT_CONST_BITS);
1757           lstep1[53] = _mm256_srai_epi32(v[9], DCT_CONST_BITS);
1758           lstep1[54] = _mm256_srai_epi32(v[10], DCT_CONST_BITS);
1759           lstep1[55] = _mm256_srai_epi32(v[11], DCT_CONST_BITS);
1760           lstep1[56] = _mm256_srai_epi32(v[12], DCT_CONST_BITS);
1761           lstep1[57] = _mm256_srai_epi32(v[13], DCT_CONST_BITS);
1762           lstep1[58] = _mm256_srai_epi32(v[14], DCT_CONST_BITS);
1763           lstep1[59] = _mm256_srai_epi32(v[15], DCT_CONST_BITS);
1764         }
1765         // stage 5
1766         {
1767           lstep2[8] = _mm256_add_epi32(lstep1[10], lstep3[8]);
1768           lstep2[9] = _mm256_add_epi32(lstep1[11], lstep3[9]);
1769           lstep2[10] = _mm256_sub_epi32(lstep3[8], lstep1[10]);
1770           lstep2[11] = _mm256_sub_epi32(lstep3[9], lstep1[11]);
1771           lstep2[12] = _mm256_sub_epi32(lstep3[14], lstep1[12]);
1772           lstep2[13] = _mm256_sub_epi32(lstep3[15], lstep1[13]);
1773           lstep2[14] = _mm256_add_epi32(lstep1[12], lstep3[14]);
1774           lstep2[15] = _mm256_add_epi32(lstep1[13], lstep3[15]);
1775         }
1776         {
1777           const __m256i k32_p16_p16 =
1778               pair256_set_epi32(cospi_16_64, cospi_16_64);
1779           const __m256i k32_p16_m16 =
1780               pair256_set_epi32(cospi_16_64, -cospi_16_64);
1781           const __m256i k32_p24_p08 =
1782               pair256_set_epi32(cospi_24_64, cospi_8_64);
1783           const __m256i k32_m08_p24 =
1784               pair256_set_epi32(-cospi_8_64, cospi_24_64);
1785 
1786           u[0] = _mm256_unpacklo_epi32(lstep1[0], lstep1[2]);
1787           u[1] = _mm256_unpackhi_epi32(lstep1[0], lstep1[2]);
1788           u[2] = _mm256_unpacklo_epi32(lstep1[1], lstep1[3]);
1789           u[3] = _mm256_unpackhi_epi32(lstep1[1], lstep1[3]);
1790           u[4] = _mm256_unpacklo_epi32(lstep1[4], lstep1[6]);
1791           u[5] = _mm256_unpackhi_epi32(lstep1[4], lstep1[6]);
1792           u[6] = _mm256_unpacklo_epi32(lstep1[5], lstep1[7]);
1793           u[7] = _mm256_unpackhi_epi32(lstep1[5], lstep1[7]);
1794 
1795           // TODO(jingning): manually inline k_madd_epi32_avx2_ to further hide
1796           // instruction latency.
1797           v[0] = k_madd_epi32_avx2(u[0], k32_p16_p16);
1798           v[1] = k_madd_epi32_avx2(u[1], k32_p16_p16);
1799           v[2] = k_madd_epi32_avx2(u[2], k32_p16_p16);
1800           v[3] = k_madd_epi32_avx2(u[3], k32_p16_p16);
1801           v[4] = k_madd_epi32_avx2(u[0], k32_p16_m16);
1802           v[5] = k_madd_epi32_avx2(u[1], k32_p16_m16);
1803           v[6] = k_madd_epi32_avx2(u[2], k32_p16_m16);
1804           v[7] = k_madd_epi32_avx2(u[3], k32_p16_m16);
1805           v[8] = k_madd_epi32_avx2(u[4], k32_p24_p08);
1806           v[9] = k_madd_epi32_avx2(u[5], k32_p24_p08);
1807           v[10] = k_madd_epi32_avx2(u[6], k32_p24_p08);
1808           v[11] = k_madd_epi32_avx2(u[7], k32_p24_p08);
1809           v[12] = k_madd_epi32_avx2(u[4], k32_m08_p24);
1810           v[13] = k_madd_epi32_avx2(u[5], k32_m08_p24);
1811           v[14] = k_madd_epi32_avx2(u[6], k32_m08_p24);
1812           v[15] = k_madd_epi32_avx2(u[7], k32_m08_p24);
1813 
1814           u[0] = k_packs_epi64_avx2(v[0], v[1]);
1815           u[1] = k_packs_epi64_avx2(v[2], v[3]);
1816           u[2] = k_packs_epi64_avx2(v[4], v[5]);
1817           u[3] = k_packs_epi64_avx2(v[6], v[7]);
1818           u[4] = k_packs_epi64_avx2(v[8], v[9]);
1819           u[5] = k_packs_epi64_avx2(v[10], v[11]);
1820           u[6] = k_packs_epi64_avx2(v[12], v[13]);
1821           u[7] = k_packs_epi64_avx2(v[14], v[15]);
1822 
1823           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
1824           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
1825           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
1826           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
1827           v[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
1828           v[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
1829           v[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
1830           v[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
1831 
1832           u[0] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
1833           u[1] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
1834           u[2] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
1835           u[3] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
1836           u[4] = _mm256_srai_epi32(v[4], DCT_CONST_BITS);
1837           u[5] = _mm256_srai_epi32(v[5], DCT_CONST_BITS);
1838           u[6] = _mm256_srai_epi32(v[6], DCT_CONST_BITS);
1839           u[7] = _mm256_srai_epi32(v[7], DCT_CONST_BITS);
1840 
1841           sign[0] = _mm256_cmpgt_epi32(kZero, u[0]);
1842           sign[1] = _mm256_cmpgt_epi32(kZero, u[1]);
1843           sign[2] = _mm256_cmpgt_epi32(kZero, u[2]);
1844           sign[3] = _mm256_cmpgt_epi32(kZero, u[3]);
1845           sign[4] = _mm256_cmpgt_epi32(kZero, u[4]);
1846           sign[5] = _mm256_cmpgt_epi32(kZero, u[5]);
1847           sign[6] = _mm256_cmpgt_epi32(kZero, u[6]);
1848           sign[7] = _mm256_cmpgt_epi32(kZero, u[7]);
1849 
1850           u[0] = _mm256_sub_epi32(u[0], sign[0]);
1851           u[1] = _mm256_sub_epi32(u[1], sign[1]);
1852           u[2] = _mm256_sub_epi32(u[2], sign[2]);
1853           u[3] = _mm256_sub_epi32(u[3], sign[3]);
1854           u[4] = _mm256_sub_epi32(u[4], sign[4]);
1855           u[5] = _mm256_sub_epi32(u[5], sign[5]);
1856           u[6] = _mm256_sub_epi32(u[6], sign[6]);
1857           u[7] = _mm256_sub_epi32(u[7], sign[7]);
1858 
1859           u[0] = _mm256_add_epi32(u[0], K32One);
1860           u[1] = _mm256_add_epi32(u[1], K32One);
1861           u[2] = _mm256_add_epi32(u[2], K32One);
1862           u[3] = _mm256_add_epi32(u[3], K32One);
1863           u[4] = _mm256_add_epi32(u[4], K32One);
1864           u[5] = _mm256_add_epi32(u[5], K32One);
1865           u[6] = _mm256_add_epi32(u[6], K32One);
1866           u[7] = _mm256_add_epi32(u[7], K32One);
1867 
1868           u[0] = _mm256_srai_epi32(u[0], 2);
1869           u[1] = _mm256_srai_epi32(u[1], 2);
1870           u[2] = _mm256_srai_epi32(u[2], 2);
1871           u[3] = _mm256_srai_epi32(u[3], 2);
1872           u[4] = _mm256_srai_epi32(u[4], 2);
1873           u[5] = _mm256_srai_epi32(u[5], 2);
1874           u[6] = _mm256_srai_epi32(u[6], 2);
1875           u[7] = _mm256_srai_epi32(u[7], 2);
1876 
1877           // Combine
1878           out[0] = _mm256_packs_epi32(u[0], u[1]);
1879           out[16] = _mm256_packs_epi32(u[2], u[3]);
1880           out[8] = _mm256_packs_epi32(u[4], u[5]);
1881           out[24] = _mm256_packs_epi32(u[6], u[7]);
1882         }
1883         {
1884           const __m256i k32_m08_p24 =
1885               pair256_set_epi32(-cospi_8_64, cospi_24_64);
1886           const __m256i k32_m24_m08 =
1887               pair256_set_epi32(-cospi_24_64, -cospi_8_64);
1888           const __m256i k32_p24_p08 =
1889               pair256_set_epi32(cospi_24_64, cospi_8_64);
1890 
1891           u[0] = _mm256_unpacklo_epi32(lstep1[18], lstep1[28]);
1892           u[1] = _mm256_unpackhi_epi32(lstep1[18], lstep1[28]);
1893           u[2] = _mm256_unpacklo_epi32(lstep1[19], lstep1[29]);
1894           u[3] = _mm256_unpackhi_epi32(lstep1[19], lstep1[29]);
1895           u[4] = _mm256_unpacklo_epi32(lstep1[20], lstep1[26]);
1896           u[5] = _mm256_unpackhi_epi32(lstep1[20], lstep1[26]);
1897           u[6] = _mm256_unpacklo_epi32(lstep1[21], lstep1[27]);
1898           u[7] = _mm256_unpackhi_epi32(lstep1[21], lstep1[27]);
1899 
1900           v[0] = k_madd_epi32_avx2(u[0], k32_m08_p24);
1901           v[1] = k_madd_epi32_avx2(u[1], k32_m08_p24);
1902           v[2] = k_madd_epi32_avx2(u[2], k32_m08_p24);
1903           v[3] = k_madd_epi32_avx2(u[3], k32_m08_p24);
1904           v[4] = k_madd_epi32_avx2(u[4], k32_m24_m08);
1905           v[5] = k_madd_epi32_avx2(u[5], k32_m24_m08);
1906           v[6] = k_madd_epi32_avx2(u[6], k32_m24_m08);
1907           v[7] = k_madd_epi32_avx2(u[7], k32_m24_m08);
1908           v[8] = k_madd_epi32_avx2(u[4], k32_m08_p24);
1909           v[9] = k_madd_epi32_avx2(u[5], k32_m08_p24);
1910           v[10] = k_madd_epi32_avx2(u[6], k32_m08_p24);
1911           v[11] = k_madd_epi32_avx2(u[7], k32_m08_p24);
1912           v[12] = k_madd_epi32_avx2(u[0], k32_p24_p08);
1913           v[13] = k_madd_epi32_avx2(u[1], k32_p24_p08);
1914           v[14] = k_madd_epi32_avx2(u[2], k32_p24_p08);
1915           v[15] = k_madd_epi32_avx2(u[3], k32_p24_p08);
1916 
1917           u[0] = k_packs_epi64_avx2(v[0], v[1]);
1918           u[1] = k_packs_epi64_avx2(v[2], v[3]);
1919           u[2] = k_packs_epi64_avx2(v[4], v[5]);
1920           u[3] = k_packs_epi64_avx2(v[6], v[7]);
1921           u[4] = k_packs_epi64_avx2(v[8], v[9]);
1922           u[5] = k_packs_epi64_avx2(v[10], v[11]);
1923           u[6] = k_packs_epi64_avx2(v[12], v[13]);
1924           u[7] = k_packs_epi64_avx2(v[14], v[15]);
1925 
1926           u[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
1927           u[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
1928           u[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
1929           u[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
1930           u[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
1931           u[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
1932           u[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
1933           u[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
1934 
1935           lstep2[18] = _mm256_srai_epi32(u[0], DCT_CONST_BITS);
1936           lstep2[19] = _mm256_srai_epi32(u[1], DCT_CONST_BITS);
1937           lstep2[20] = _mm256_srai_epi32(u[2], DCT_CONST_BITS);
1938           lstep2[21] = _mm256_srai_epi32(u[3], DCT_CONST_BITS);
1939           lstep2[26] = _mm256_srai_epi32(u[4], DCT_CONST_BITS);
1940           lstep2[27] = _mm256_srai_epi32(u[5], DCT_CONST_BITS);
1941           lstep2[28] = _mm256_srai_epi32(u[6], DCT_CONST_BITS);
1942           lstep2[29] = _mm256_srai_epi32(u[7], DCT_CONST_BITS);
1943         }
1944         {
1945           lstep2[32] = _mm256_add_epi32(lstep1[38], lstep3[32]);
1946           lstep2[33] = _mm256_add_epi32(lstep1[39], lstep3[33]);
1947           lstep2[34] = _mm256_add_epi32(lstep1[36], lstep3[34]);
1948           lstep2[35] = _mm256_add_epi32(lstep1[37], lstep3[35]);
1949           lstep2[36] = _mm256_sub_epi32(lstep3[34], lstep1[36]);
1950           lstep2[37] = _mm256_sub_epi32(lstep3[35], lstep1[37]);
1951           lstep2[38] = _mm256_sub_epi32(lstep3[32], lstep1[38]);
1952           lstep2[39] = _mm256_sub_epi32(lstep3[33], lstep1[39]);
1953           lstep2[40] = _mm256_sub_epi32(lstep3[46], lstep1[40]);
1954           lstep2[41] = _mm256_sub_epi32(lstep3[47], lstep1[41]);
1955           lstep2[42] = _mm256_sub_epi32(lstep3[44], lstep1[42]);
1956           lstep2[43] = _mm256_sub_epi32(lstep3[45], lstep1[43]);
1957           lstep2[44] = _mm256_add_epi32(lstep1[42], lstep3[44]);
1958           lstep2[45] = _mm256_add_epi32(lstep1[43], lstep3[45]);
1959           lstep2[46] = _mm256_add_epi32(lstep1[40], lstep3[46]);
1960           lstep2[47] = _mm256_add_epi32(lstep1[41], lstep3[47]);
1961           lstep2[48] = _mm256_add_epi32(lstep1[54], lstep3[48]);
1962           lstep2[49] = _mm256_add_epi32(lstep1[55], lstep3[49]);
1963           lstep2[50] = _mm256_add_epi32(lstep1[52], lstep3[50]);
1964           lstep2[51] = _mm256_add_epi32(lstep1[53], lstep3[51]);
1965           lstep2[52] = _mm256_sub_epi32(lstep3[50], lstep1[52]);
1966           lstep2[53] = _mm256_sub_epi32(lstep3[51], lstep1[53]);
1967           lstep2[54] = _mm256_sub_epi32(lstep3[48], lstep1[54]);
1968           lstep2[55] = _mm256_sub_epi32(lstep3[49], lstep1[55]);
1969           lstep2[56] = _mm256_sub_epi32(lstep3[62], lstep1[56]);
1970           lstep2[57] = _mm256_sub_epi32(lstep3[63], lstep1[57]);
1971           lstep2[58] = _mm256_sub_epi32(lstep3[60], lstep1[58]);
1972           lstep2[59] = _mm256_sub_epi32(lstep3[61], lstep1[59]);
1973           lstep2[60] = _mm256_add_epi32(lstep1[58], lstep3[60]);
1974           lstep2[61] = _mm256_add_epi32(lstep1[59], lstep3[61]);
1975           lstep2[62] = _mm256_add_epi32(lstep1[56], lstep3[62]);
1976           lstep2[63] = _mm256_add_epi32(lstep1[57], lstep3[63]);
1977         }
1978         // stage 6
1979         {
1980           const __m256i k32_p28_p04 =
1981               pair256_set_epi32(cospi_28_64, cospi_4_64);
1982           const __m256i k32_p12_p20 =
1983               pair256_set_epi32(cospi_12_64, cospi_20_64);
1984           const __m256i k32_m20_p12 =
1985               pair256_set_epi32(-cospi_20_64, cospi_12_64);
1986           const __m256i k32_m04_p28 =
1987               pair256_set_epi32(-cospi_4_64, cospi_28_64);
1988 
1989           u[0] = _mm256_unpacklo_epi32(lstep2[8], lstep2[14]);
1990           u[1] = _mm256_unpackhi_epi32(lstep2[8], lstep2[14]);
1991           u[2] = _mm256_unpacklo_epi32(lstep2[9], lstep2[15]);
1992           u[3] = _mm256_unpackhi_epi32(lstep2[9], lstep2[15]);
1993           u[4] = _mm256_unpacklo_epi32(lstep2[10], lstep2[12]);
1994           u[5] = _mm256_unpackhi_epi32(lstep2[10], lstep2[12]);
1995           u[6] = _mm256_unpacklo_epi32(lstep2[11], lstep2[13]);
1996           u[7] = _mm256_unpackhi_epi32(lstep2[11], lstep2[13]);
1997           u[8] = _mm256_unpacklo_epi32(lstep2[10], lstep2[12]);
1998           u[9] = _mm256_unpackhi_epi32(lstep2[10], lstep2[12]);
1999           u[10] = _mm256_unpacklo_epi32(lstep2[11], lstep2[13]);
2000           u[11] = _mm256_unpackhi_epi32(lstep2[11], lstep2[13]);
2001           u[12] = _mm256_unpacklo_epi32(lstep2[8], lstep2[14]);
2002           u[13] = _mm256_unpackhi_epi32(lstep2[8], lstep2[14]);
2003           u[14] = _mm256_unpacklo_epi32(lstep2[9], lstep2[15]);
2004           u[15] = _mm256_unpackhi_epi32(lstep2[9], lstep2[15]);
2005 
2006           v[0] = k_madd_epi32_avx2(u[0], k32_p28_p04);
2007           v[1] = k_madd_epi32_avx2(u[1], k32_p28_p04);
2008           v[2] = k_madd_epi32_avx2(u[2], k32_p28_p04);
2009           v[3] = k_madd_epi32_avx2(u[3], k32_p28_p04);
2010           v[4] = k_madd_epi32_avx2(u[4], k32_p12_p20);
2011           v[5] = k_madd_epi32_avx2(u[5], k32_p12_p20);
2012           v[6] = k_madd_epi32_avx2(u[6], k32_p12_p20);
2013           v[7] = k_madd_epi32_avx2(u[7], k32_p12_p20);
2014           v[8] = k_madd_epi32_avx2(u[8], k32_m20_p12);
2015           v[9] = k_madd_epi32_avx2(u[9], k32_m20_p12);
2016           v[10] = k_madd_epi32_avx2(u[10], k32_m20_p12);
2017           v[11] = k_madd_epi32_avx2(u[11], k32_m20_p12);
2018           v[12] = k_madd_epi32_avx2(u[12], k32_m04_p28);
2019           v[13] = k_madd_epi32_avx2(u[13], k32_m04_p28);
2020           v[14] = k_madd_epi32_avx2(u[14], k32_m04_p28);
2021           v[15] = k_madd_epi32_avx2(u[15], k32_m04_p28);
2022 
2023           u[0] = k_packs_epi64_avx2(v[0], v[1]);
2024           u[1] = k_packs_epi64_avx2(v[2], v[3]);
2025           u[2] = k_packs_epi64_avx2(v[4], v[5]);
2026           u[3] = k_packs_epi64_avx2(v[6], v[7]);
2027           u[4] = k_packs_epi64_avx2(v[8], v[9]);
2028           u[5] = k_packs_epi64_avx2(v[10], v[11]);
2029           u[6] = k_packs_epi64_avx2(v[12], v[13]);
2030           u[7] = k_packs_epi64_avx2(v[14], v[15]);
2031 
2032           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
2033           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
2034           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
2035           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
2036           v[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
2037           v[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
2038           v[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
2039           v[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
2040 
2041           u[0] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
2042           u[1] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
2043           u[2] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
2044           u[3] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
2045           u[4] = _mm256_srai_epi32(v[4], DCT_CONST_BITS);
2046           u[5] = _mm256_srai_epi32(v[5], DCT_CONST_BITS);
2047           u[6] = _mm256_srai_epi32(v[6], DCT_CONST_BITS);
2048           u[7] = _mm256_srai_epi32(v[7], DCT_CONST_BITS);
2049 
2050           sign[0] = _mm256_cmpgt_epi32(kZero, u[0]);
2051           sign[1] = _mm256_cmpgt_epi32(kZero, u[1]);
2052           sign[2] = _mm256_cmpgt_epi32(kZero, u[2]);
2053           sign[3] = _mm256_cmpgt_epi32(kZero, u[3]);
2054           sign[4] = _mm256_cmpgt_epi32(kZero, u[4]);
2055           sign[5] = _mm256_cmpgt_epi32(kZero, u[5]);
2056           sign[6] = _mm256_cmpgt_epi32(kZero, u[6]);
2057           sign[7] = _mm256_cmpgt_epi32(kZero, u[7]);
2058 
2059           u[0] = _mm256_sub_epi32(u[0], sign[0]);
2060           u[1] = _mm256_sub_epi32(u[1], sign[1]);
2061           u[2] = _mm256_sub_epi32(u[2], sign[2]);
2062           u[3] = _mm256_sub_epi32(u[3], sign[3]);
2063           u[4] = _mm256_sub_epi32(u[4], sign[4]);
2064           u[5] = _mm256_sub_epi32(u[5], sign[5]);
2065           u[6] = _mm256_sub_epi32(u[6], sign[6]);
2066           u[7] = _mm256_sub_epi32(u[7], sign[7]);
2067 
2068           u[0] = _mm256_add_epi32(u[0], K32One);
2069           u[1] = _mm256_add_epi32(u[1], K32One);
2070           u[2] = _mm256_add_epi32(u[2], K32One);
2071           u[3] = _mm256_add_epi32(u[3], K32One);
2072           u[4] = _mm256_add_epi32(u[4], K32One);
2073           u[5] = _mm256_add_epi32(u[5], K32One);
2074           u[6] = _mm256_add_epi32(u[6], K32One);
2075           u[7] = _mm256_add_epi32(u[7], K32One);
2076 
2077           u[0] = _mm256_srai_epi32(u[0], 2);
2078           u[1] = _mm256_srai_epi32(u[1], 2);
2079           u[2] = _mm256_srai_epi32(u[2], 2);
2080           u[3] = _mm256_srai_epi32(u[3], 2);
2081           u[4] = _mm256_srai_epi32(u[4], 2);
2082           u[5] = _mm256_srai_epi32(u[5], 2);
2083           u[6] = _mm256_srai_epi32(u[6], 2);
2084           u[7] = _mm256_srai_epi32(u[7], 2);
2085 
2086           out[4] = _mm256_packs_epi32(u[0], u[1]);
2087           out[20] = _mm256_packs_epi32(u[2], u[3]);
2088           out[12] = _mm256_packs_epi32(u[4], u[5]);
2089           out[28] = _mm256_packs_epi32(u[6], u[7]);
2090         }
2091         {
2092           lstep3[16] = _mm256_add_epi32(lstep2[18], lstep1[16]);
2093           lstep3[17] = _mm256_add_epi32(lstep2[19], lstep1[17]);
2094           lstep3[18] = _mm256_sub_epi32(lstep1[16], lstep2[18]);
2095           lstep3[19] = _mm256_sub_epi32(lstep1[17], lstep2[19]);
2096           lstep3[20] = _mm256_sub_epi32(lstep1[22], lstep2[20]);
2097           lstep3[21] = _mm256_sub_epi32(lstep1[23], lstep2[21]);
2098           lstep3[22] = _mm256_add_epi32(lstep2[20], lstep1[22]);
2099           lstep3[23] = _mm256_add_epi32(lstep2[21], lstep1[23]);
2100           lstep3[24] = _mm256_add_epi32(lstep2[26], lstep1[24]);
2101           lstep3[25] = _mm256_add_epi32(lstep2[27], lstep1[25]);
2102           lstep3[26] = _mm256_sub_epi32(lstep1[24], lstep2[26]);
2103           lstep3[27] = _mm256_sub_epi32(lstep1[25], lstep2[27]);
2104           lstep3[28] = _mm256_sub_epi32(lstep1[30], lstep2[28]);
2105           lstep3[29] = _mm256_sub_epi32(lstep1[31], lstep2[29]);
2106           lstep3[30] = _mm256_add_epi32(lstep2[28], lstep1[30]);
2107           lstep3[31] = _mm256_add_epi32(lstep2[29], lstep1[31]);
2108         }
2109         {
2110           const __m256i k32_m04_p28 =
2111               pair256_set_epi32(-cospi_4_64, cospi_28_64);
2112           const __m256i k32_m28_m04 =
2113               pair256_set_epi32(-cospi_28_64, -cospi_4_64);
2114           const __m256i k32_m20_p12 =
2115               pair256_set_epi32(-cospi_20_64, cospi_12_64);
2116           const __m256i k32_m12_m20 =
2117               pair256_set_epi32(-cospi_12_64, -cospi_20_64);
2118           const __m256i k32_p12_p20 =
2119               pair256_set_epi32(cospi_12_64, cospi_20_64);
2120           const __m256i k32_p28_p04 =
2121               pair256_set_epi32(cospi_28_64, cospi_4_64);
2122 
2123           u[0] = _mm256_unpacklo_epi32(lstep2[34], lstep2[60]);
2124           u[1] = _mm256_unpackhi_epi32(lstep2[34], lstep2[60]);
2125           u[2] = _mm256_unpacklo_epi32(lstep2[35], lstep2[61]);
2126           u[3] = _mm256_unpackhi_epi32(lstep2[35], lstep2[61]);
2127           u[4] = _mm256_unpacklo_epi32(lstep2[36], lstep2[58]);
2128           u[5] = _mm256_unpackhi_epi32(lstep2[36], lstep2[58]);
2129           u[6] = _mm256_unpacklo_epi32(lstep2[37], lstep2[59]);
2130           u[7] = _mm256_unpackhi_epi32(lstep2[37], lstep2[59]);
2131           u[8] = _mm256_unpacklo_epi32(lstep2[42], lstep2[52]);
2132           u[9] = _mm256_unpackhi_epi32(lstep2[42], lstep2[52]);
2133           u[10] = _mm256_unpacklo_epi32(lstep2[43], lstep2[53]);
2134           u[11] = _mm256_unpackhi_epi32(lstep2[43], lstep2[53]);
2135           u[12] = _mm256_unpacklo_epi32(lstep2[44], lstep2[50]);
2136           u[13] = _mm256_unpackhi_epi32(lstep2[44], lstep2[50]);
2137           u[14] = _mm256_unpacklo_epi32(lstep2[45], lstep2[51]);
2138           u[15] = _mm256_unpackhi_epi32(lstep2[45], lstep2[51]);
2139 
2140           v[0] = k_madd_epi32_avx2(u[0], k32_m04_p28);
2141           v[1] = k_madd_epi32_avx2(u[1], k32_m04_p28);
2142           v[2] = k_madd_epi32_avx2(u[2], k32_m04_p28);
2143           v[3] = k_madd_epi32_avx2(u[3], k32_m04_p28);
2144           v[4] = k_madd_epi32_avx2(u[4], k32_m28_m04);
2145           v[5] = k_madd_epi32_avx2(u[5], k32_m28_m04);
2146           v[6] = k_madd_epi32_avx2(u[6], k32_m28_m04);
2147           v[7] = k_madd_epi32_avx2(u[7], k32_m28_m04);
2148           v[8] = k_madd_epi32_avx2(u[8], k32_m20_p12);
2149           v[9] = k_madd_epi32_avx2(u[9], k32_m20_p12);
2150           v[10] = k_madd_epi32_avx2(u[10], k32_m20_p12);
2151           v[11] = k_madd_epi32_avx2(u[11], k32_m20_p12);
2152           v[12] = k_madd_epi32_avx2(u[12], k32_m12_m20);
2153           v[13] = k_madd_epi32_avx2(u[13], k32_m12_m20);
2154           v[14] = k_madd_epi32_avx2(u[14], k32_m12_m20);
2155           v[15] = k_madd_epi32_avx2(u[15], k32_m12_m20);
2156           v[16] = k_madd_epi32_avx2(u[12], k32_m20_p12);
2157           v[17] = k_madd_epi32_avx2(u[13], k32_m20_p12);
2158           v[18] = k_madd_epi32_avx2(u[14], k32_m20_p12);
2159           v[19] = k_madd_epi32_avx2(u[15], k32_m20_p12);
2160           v[20] = k_madd_epi32_avx2(u[8], k32_p12_p20);
2161           v[21] = k_madd_epi32_avx2(u[9], k32_p12_p20);
2162           v[22] = k_madd_epi32_avx2(u[10], k32_p12_p20);
2163           v[23] = k_madd_epi32_avx2(u[11], k32_p12_p20);
2164           v[24] = k_madd_epi32_avx2(u[4], k32_m04_p28);
2165           v[25] = k_madd_epi32_avx2(u[5], k32_m04_p28);
2166           v[26] = k_madd_epi32_avx2(u[6], k32_m04_p28);
2167           v[27] = k_madd_epi32_avx2(u[7], k32_m04_p28);
2168           v[28] = k_madd_epi32_avx2(u[0], k32_p28_p04);
2169           v[29] = k_madd_epi32_avx2(u[1], k32_p28_p04);
2170           v[30] = k_madd_epi32_avx2(u[2], k32_p28_p04);
2171           v[31] = k_madd_epi32_avx2(u[3], k32_p28_p04);
2172 
2173           u[0] = k_packs_epi64_avx2(v[0], v[1]);
2174           u[1] = k_packs_epi64_avx2(v[2], v[3]);
2175           u[2] = k_packs_epi64_avx2(v[4], v[5]);
2176           u[3] = k_packs_epi64_avx2(v[6], v[7]);
2177           u[4] = k_packs_epi64_avx2(v[8], v[9]);
2178           u[5] = k_packs_epi64_avx2(v[10], v[11]);
2179           u[6] = k_packs_epi64_avx2(v[12], v[13]);
2180           u[7] = k_packs_epi64_avx2(v[14], v[15]);
2181           u[8] = k_packs_epi64_avx2(v[16], v[17]);
2182           u[9] = k_packs_epi64_avx2(v[18], v[19]);
2183           u[10] = k_packs_epi64_avx2(v[20], v[21]);
2184           u[11] = k_packs_epi64_avx2(v[22], v[23]);
2185           u[12] = k_packs_epi64_avx2(v[24], v[25]);
2186           u[13] = k_packs_epi64_avx2(v[26], v[27]);
2187           u[14] = k_packs_epi64_avx2(v[28], v[29]);
2188           u[15] = k_packs_epi64_avx2(v[30], v[31]);
2189 
2190           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
2191           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
2192           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
2193           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
2194           v[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
2195           v[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
2196           v[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
2197           v[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
2198           v[8] = _mm256_add_epi32(u[8], k__DCT_CONST_ROUNDING);
2199           v[9] = _mm256_add_epi32(u[9], k__DCT_CONST_ROUNDING);
2200           v[10] = _mm256_add_epi32(u[10], k__DCT_CONST_ROUNDING);
2201           v[11] = _mm256_add_epi32(u[11], k__DCT_CONST_ROUNDING);
2202           v[12] = _mm256_add_epi32(u[12], k__DCT_CONST_ROUNDING);
2203           v[13] = _mm256_add_epi32(u[13], k__DCT_CONST_ROUNDING);
2204           v[14] = _mm256_add_epi32(u[14], k__DCT_CONST_ROUNDING);
2205           v[15] = _mm256_add_epi32(u[15], k__DCT_CONST_ROUNDING);
2206 
2207           lstep3[34] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
2208           lstep3[35] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
2209           lstep3[36] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
2210           lstep3[37] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
2211           lstep3[42] = _mm256_srai_epi32(v[4], DCT_CONST_BITS);
2212           lstep3[43] = _mm256_srai_epi32(v[5], DCT_CONST_BITS);
2213           lstep3[44] = _mm256_srai_epi32(v[6], DCT_CONST_BITS);
2214           lstep3[45] = _mm256_srai_epi32(v[7], DCT_CONST_BITS);
2215           lstep3[50] = _mm256_srai_epi32(v[8], DCT_CONST_BITS);
2216           lstep3[51] = _mm256_srai_epi32(v[9], DCT_CONST_BITS);
2217           lstep3[52] = _mm256_srai_epi32(v[10], DCT_CONST_BITS);
2218           lstep3[53] = _mm256_srai_epi32(v[11], DCT_CONST_BITS);
2219           lstep3[58] = _mm256_srai_epi32(v[12], DCT_CONST_BITS);
2220           lstep3[59] = _mm256_srai_epi32(v[13], DCT_CONST_BITS);
2221           lstep3[60] = _mm256_srai_epi32(v[14], DCT_CONST_BITS);
2222           lstep3[61] = _mm256_srai_epi32(v[15], DCT_CONST_BITS);
2223         }
2224         // stage 7
2225         {
2226           const __m256i k32_p30_p02 =
2227               pair256_set_epi32(cospi_30_64, cospi_2_64);
2228           const __m256i k32_p14_p18 =
2229               pair256_set_epi32(cospi_14_64, cospi_18_64);
2230           const __m256i k32_p22_p10 =
2231               pair256_set_epi32(cospi_22_64, cospi_10_64);
2232           const __m256i k32_p06_p26 =
2233               pair256_set_epi32(cospi_6_64, cospi_26_64);
2234           const __m256i k32_m26_p06 =
2235               pair256_set_epi32(-cospi_26_64, cospi_6_64);
2236           const __m256i k32_m10_p22 =
2237               pair256_set_epi32(-cospi_10_64, cospi_22_64);
2238           const __m256i k32_m18_p14 =
2239               pair256_set_epi32(-cospi_18_64, cospi_14_64);
2240           const __m256i k32_m02_p30 =
2241               pair256_set_epi32(-cospi_2_64, cospi_30_64);
2242 
2243           u[0] = _mm256_unpacklo_epi32(lstep3[16], lstep3[30]);
2244           u[1] = _mm256_unpackhi_epi32(lstep3[16], lstep3[30]);
2245           u[2] = _mm256_unpacklo_epi32(lstep3[17], lstep3[31]);
2246           u[3] = _mm256_unpackhi_epi32(lstep3[17], lstep3[31]);
2247           u[4] = _mm256_unpacklo_epi32(lstep3[18], lstep3[28]);
2248           u[5] = _mm256_unpackhi_epi32(lstep3[18], lstep3[28]);
2249           u[6] = _mm256_unpacklo_epi32(lstep3[19], lstep3[29]);
2250           u[7] = _mm256_unpackhi_epi32(lstep3[19], lstep3[29]);
2251           u[8] = _mm256_unpacklo_epi32(lstep3[20], lstep3[26]);
2252           u[9] = _mm256_unpackhi_epi32(lstep3[20], lstep3[26]);
2253           u[10] = _mm256_unpacklo_epi32(lstep3[21], lstep3[27]);
2254           u[11] = _mm256_unpackhi_epi32(lstep3[21], lstep3[27]);
2255           u[12] = _mm256_unpacklo_epi32(lstep3[22], lstep3[24]);
2256           u[13] = _mm256_unpackhi_epi32(lstep3[22], lstep3[24]);
2257           u[14] = _mm256_unpacklo_epi32(lstep3[23], lstep3[25]);
2258           u[15] = _mm256_unpackhi_epi32(lstep3[23], lstep3[25]);
2259 
2260           v[0] = k_madd_epi32_avx2(u[0], k32_p30_p02);
2261           v[1] = k_madd_epi32_avx2(u[1], k32_p30_p02);
2262           v[2] = k_madd_epi32_avx2(u[2], k32_p30_p02);
2263           v[3] = k_madd_epi32_avx2(u[3], k32_p30_p02);
2264           v[4] = k_madd_epi32_avx2(u[4], k32_p14_p18);
2265           v[5] = k_madd_epi32_avx2(u[5], k32_p14_p18);
2266           v[6] = k_madd_epi32_avx2(u[6], k32_p14_p18);
2267           v[7] = k_madd_epi32_avx2(u[7], k32_p14_p18);
2268           v[8] = k_madd_epi32_avx2(u[8], k32_p22_p10);
2269           v[9] = k_madd_epi32_avx2(u[9], k32_p22_p10);
2270           v[10] = k_madd_epi32_avx2(u[10], k32_p22_p10);
2271           v[11] = k_madd_epi32_avx2(u[11], k32_p22_p10);
2272           v[12] = k_madd_epi32_avx2(u[12], k32_p06_p26);
2273           v[13] = k_madd_epi32_avx2(u[13], k32_p06_p26);
2274           v[14] = k_madd_epi32_avx2(u[14], k32_p06_p26);
2275           v[15] = k_madd_epi32_avx2(u[15], k32_p06_p26);
2276           v[16] = k_madd_epi32_avx2(u[12], k32_m26_p06);
2277           v[17] = k_madd_epi32_avx2(u[13], k32_m26_p06);
2278           v[18] = k_madd_epi32_avx2(u[14], k32_m26_p06);
2279           v[19] = k_madd_epi32_avx2(u[15], k32_m26_p06);
2280           v[20] = k_madd_epi32_avx2(u[8], k32_m10_p22);
2281           v[21] = k_madd_epi32_avx2(u[9], k32_m10_p22);
2282           v[22] = k_madd_epi32_avx2(u[10], k32_m10_p22);
2283           v[23] = k_madd_epi32_avx2(u[11], k32_m10_p22);
2284           v[24] = k_madd_epi32_avx2(u[4], k32_m18_p14);
2285           v[25] = k_madd_epi32_avx2(u[5], k32_m18_p14);
2286           v[26] = k_madd_epi32_avx2(u[6], k32_m18_p14);
2287           v[27] = k_madd_epi32_avx2(u[7], k32_m18_p14);
2288           v[28] = k_madd_epi32_avx2(u[0], k32_m02_p30);
2289           v[29] = k_madd_epi32_avx2(u[1], k32_m02_p30);
2290           v[30] = k_madd_epi32_avx2(u[2], k32_m02_p30);
2291           v[31] = k_madd_epi32_avx2(u[3], k32_m02_p30);
2292 
2293           u[0] = k_packs_epi64_avx2(v[0], v[1]);
2294           u[1] = k_packs_epi64_avx2(v[2], v[3]);
2295           u[2] = k_packs_epi64_avx2(v[4], v[5]);
2296           u[3] = k_packs_epi64_avx2(v[6], v[7]);
2297           u[4] = k_packs_epi64_avx2(v[8], v[9]);
2298           u[5] = k_packs_epi64_avx2(v[10], v[11]);
2299           u[6] = k_packs_epi64_avx2(v[12], v[13]);
2300           u[7] = k_packs_epi64_avx2(v[14], v[15]);
2301           u[8] = k_packs_epi64_avx2(v[16], v[17]);
2302           u[9] = k_packs_epi64_avx2(v[18], v[19]);
2303           u[10] = k_packs_epi64_avx2(v[20], v[21]);
2304           u[11] = k_packs_epi64_avx2(v[22], v[23]);
2305           u[12] = k_packs_epi64_avx2(v[24], v[25]);
2306           u[13] = k_packs_epi64_avx2(v[26], v[27]);
2307           u[14] = k_packs_epi64_avx2(v[28], v[29]);
2308           u[15] = k_packs_epi64_avx2(v[30], v[31]);
2309 
2310           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
2311           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
2312           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
2313           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
2314           v[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
2315           v[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
2316           v[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
2317           v[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
2318           v[8] = _mm256_add_epi32(u[8], k__DCT_CONST_ROUNDING);
2319           v[9] = _mm256_add_epi32(u[9], k__DCT_CONST_ROUNDING);
2320           v[10] = _mm256_add_epi32(u[10], k__DCT_CONST_ROUNDING);
2321           v[11] = _mm256_add_epi32(u[11], k__DCT_CONST_ROUNDING);
2322           v[12] = _mm256_add_epi32(u[12], k__DCT_CONST_ROUNDING);
2323           v[13] = _mm256_add_epi32(u[13], k__DCT_CONST_ROUNDING);
2324           v[14] = _mm256_add_epi32(u[14], k__DCT_CONST_ROUNDING);
2325           v[15] = _mm256_add_epi32(u[15], k__DCT_CONST_ROUNDING);
2326 
2327           u[0] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
2328           u[1] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
2329           u[2] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
2330           u[3] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
2331           u[4] = _mm256_srai_epi32(v[4], DCT_CONST_BITS);
2332           u[5] = _mm256_srai_epi32(v[5], DCT_CONST_BITS);
2333           u[6] = _mm256_srai_epi32(v[6], DCT_CONST_BITS);
2334           u[7] = _mm256_srai_epi32(v[7], DCT_CONST_BITS);
2335           u[8] = _mm256_srai_epi32(v[8], DCT_CONST_BITS);
2336           u[9] = _mm256_srai_epi32(v[9], DCT_CONST_BITS);
2337           u[10] = _mm256_srai_epi32(v[10], DCT_CONST_BITS);
2338           u[11] = _mm256_srai_epi32(v[11], DCT_CONST_BITS);
2339           u[12] = _mm256_srai_epi32(v[12], DCT_CONST_BITS);
2340           u[13] = _mm256_srai_epi32(v[13], DCT_CONST_BITS);
2341           u[14] = _mm256_srai_epi32(v[14], DCT_CONST_BITS);
2342           u[15] = _mm256_srai_epi32(v[15], DCT_CONST_BITS);
2343 
2344           v[0] = _mm256_cmpgt_epi32(kZero, u[0]);
2345           v[1] = _mm256_cmpgt_epi32(kZero, u[1]);
2346           v[2] = _mm256_cmpgt_epi32(kZero, u[2]);
2347           v[3] = _mm256_cmpgt_epi32(kZero, u[3]);
2348           v[4] = _mm256_cmpgt_epi32(kZero, u[4]);
2349           v[5] = _mm256_cmpgt_epi32(kZero, u[5]);
2350           v[6] = _mm256_cmpgt_epi32(kZero, u[6]);
2351           v[7] = _mm256_cmpgt_epi32(kZero, u[7]);
2352           v[8] = _mm256_cmpgt_epi32(kZero, u[8]);
2353           v[9] = _mm256_cmpgt_epi32(kZero, u[9]);
2354           v[10] = _mm256_cmpgt_epi32(kZero, u[10]);
2355           v[11] = _mm256_cmpgt_epi32(kZero, u[11]);
2356           v[12] = _mm256_cmpgt_epi32(kZero, u[12]);
2357           v[13] = _mm256_cmpgt_epi32(kZero, u[13]);
2358           v[14] = _mm256_cmpgt_epi32(kZero, u[14]);
2359           v[15] = _mm256_cmpgt_epi32(kZero, u[15]);
2360 
2361           u[0] = _mm256_sub_epi32(u[0], v[0]);
2362           u[1] = _mm256_sub_epi32(u[1], v[1]);
2363           u[2] = _mm256_sub_epi32(u[2], v[2]);
2364           u[3] = _mm256_sub_epi32(u[3], v[3]);
2365           u[4] = _mm256_sub_epi32(u[4], v[4]);
2366           u[5] = _mm256_sub_epi32(u[5], v[5]);
2367           u[6] = _mm256_sub_epi32(u[6], v[6]);
2368           u[7] = _mm256_sub_epi32(u[7], v[7]);
2369           u[8] = _mm256_sub_epi32(u[8], v[8]);
2370           u[9] = _mm256_sub_epi32(u[9], v[9]);
2371           u[10] = _mm256_sub_epi32(u[10], v[10]);
2372           u[11] = _mm256_sub_epi32(u[11], v[11]);
2373           u[12] = _mm256_sub_epi32(u[12], v[12]);
2374           u[13] = _mm256_sub_epi32(u[13], v[13]);
2375           u[14] = _mm256_sub_epi32(u[14], v[14]);
2376           u[15] = _mm256_sub_epi32(u[15], v[15]);
2377 
2378           v[0] = _mm256_add_epi32(u[0], K32One);
2379           v[1] = _mm256_add_epi32(u[1], K32One);
2380           v[2] = _mm256_add_epi32(u[2], K32One);
2381           v[3] = _mm256_add_epi32(u[3], K32One);
2382           v[4] = _mm256_add_epi32(u[4], K32One);
2383           v[5] = _mm256_add_epi32(u[5], K32One);
2384           v[6] = _mm256_add_epi32(u[6], K32One);
2385           v[7] = _mm256_add_epi32(u[7], K32One);
2386           v[8] = _mm256_add_epi32(u[8], K32One);
2387           v[9] = _mm256_add_epi32(u[9], K32One);
2388           v[10] = _mm256_add_epi32(u[10], K32One);
2389           v[11] = _mm256_add_epi32(u[11], K32One);
2390           v[12] = _mm256_add_epi32(u[12], K32One);
2391           v[13] = _mm256_add_epi32(u[13], K32One);
2392           v[14] = _mm256_add_epi32(u[14], K32One);
2393           v[15] = _mm256_add_epi32(u[15], K32One);
2394 
2395           u[0] = _mm256_srai_epi32(v[0], 2);
2396           u[1] = _mm256_srai_epi32(v[1], 2);
2397           u[2] = _mm256_srai_epi32(v[2], 2);
2398           u[3] = _mm256_srai_epi32(v[3], 2);
2399           u[4] = _mm256_srai_epi32(v[4], 2);
2400           u[5] = _mm256_srai_epi32(v[5], 2);
2401           u[6] = _mm256_srai_epi32(v[6], 2);
2402           u[7] = _mm256_srai_epi32(v[7], 2);
2403           u[8] = _mm256_srai_epi32(v[8], 2);
2404           u[9] = _mm256_srai_epi32(v[9], 2);
2405           u[10] = _mm256_srai_epi32(v[10], 2);
2406           u[11] = _mm256_srai_epi32(v[11], 2);
2407           u[12] = _mm256_srai_epi32(v[12], 2);
2408           u[13] = _mm256_srai_epi32(v[13], 2);
2409           u[14] = _mm256_srai_epi32(v[14], 2);
2410           u[15] = _mm256_srai_epi32(v[15], 2);
2411 
2412           out[2] = _mm256_packs_epi32(u[0], u[1]);
2413           out[18] = _mm256_packs_epi32(u[2], u[3]);
2414           out[10] = _mm256_packs_epi32(u[4], u[5]);
2415           out[26] = _mm256_packs_epi32(u[6], u[7]);
2416           out[6] = _mm256_packs_epi32(u[8], u[9]);
2417           out[22] = _mm256_packs_epi32(u[10], u[11]);
2418           out[14] = _mm256_packs_epi32(u[12], u[13]);
2419           out[30] = _mm256_packs_epi32(u[14], u[15]);
2420         }
2421         {
2422           lstep1[32] = _mm256_add_epi32(lstep3[34], lstep2[32]);
2423           lstep1[33] = _mm256_add_epi32(lstep3[35], lstep2[33]);
2424           lstep1[34] = _mm256_sub_epi32(lstep2[32], lstep3[34]);
2425           lstep1[35] = _mm256_sub_epi32(lstep2[33], lstep3[35]);
2426           lstep1[36] = _mm256_sub_epi32(lstep2[38], lstep3[36]);
2427           lstep1[37] = _mm256_sub_epi32(lstep2[39], lstep3[37]);
2428           lstep1[38] = _mm256_add_epi32(lstep3[36], lstep2[38]);
2429           lstep1[39] = _mm256_add_epi32(lstep3[37], lstep2[39]);
2430           lstep1[40] = _mm256_add_epi32(lstep3[42], lstep2[40]);
2431           lstep1[41] = _mm256_add_epi32(lstep3[43], lstep2[41]);
2432           lstep1[42] = _mm256_sub_epi32(lstep2[40], lstep3[42]);
2433           lstep1[43] = _mm256_sub_epi32(lstep2[41], lstep3[43]);
2434           lstep1[44] = _mm256_sub_epi32(lstep2[46], lstep3[44]);
2435           lstep1[45] = _mm256_sub_epi32(lstep2[47], lstep3[45]);
2436           lstep1[46] = _mm256_add_epi32(lstep3[44], lstep2[46]);
2437           lstep1[47] = _mm256_add_epi32(lstep3[45], lstep2[47]);
2438           lstep1[48] = _mm256_add_epi32(lstep3[50], lstep2[48]);
2439           lstep1[49] = _mm256_add_epi32(lstep3[51], lstep2[49]);
2440           lstep1[50] = _mm256_sub_epi32(lstep2[48], lstep3[50]);
2441           lstep1[51] = _mm256_sub_epi32(lstep2[49], lstep3[51]);
2442           lstep1[52] = _mm256_sub_epi32(lstep2[54], lstep3[52]);
2443           lstep1[53] = _mm256_sub_epi32(lstep2[55], lstep3[53]);
2444           lstep1[54] = _mm256_add_epi32(lstep3[52], lstep2[54]);
2445           lstep1[55] = _mm256_add_epi32(lstep3[53], lstep2[55]);
2446           lstep1[56] = _mm256_add_epi32(lstep3[58], lstep2[56]);
2447           lstep1[57] = _mm256_add_epi32(lstep3[59], lstep2[57]);
2448           lstep1[58] = _mm256_sub_epi32(lstep2[56], lstep3[58]);
2449           lstep1[59] = _mm256_sub_epi32(lstep2[57], lstep3[59]);
2450           lstep1[60] = _mm256_sub_epi32(lstep2[62], lstep3[60]);
2451           lstep1[61] = _mm256_sub_epi32(lstep2[63], lstep3[61]);
2452           lstep1[62] = _mm256_add_epi32(lstep3[60], lstep2[62]);
2453           lstep1[63] = _mm256_add_epi32(lstep3[61], lstep2[63]);
2454         }
2455         // stage 8
2456         {
2457           const __m256i k32_p31_p01 =
2458               pair256_set_epi32(cospi_31_64, cospi_1_64);
2459           const __m256i k32_p15_p17 =
2460               pair256_set_epi32(cospi_15_64, cospi_17_64);
2461           const __m256i k32_p23_p09 =
2462               pair256_set_epi32(cospi_23_64, cospi_9_64);
2463           const __m256i k32_p07_p25 =
2464               pair256_set_epi32(cospi_7_64, cospi_25_64);
2465           const __m256i k32_m25_p07 =
2466               pair256_set_epi32(-cospi_25_64, cospi_7_64);
2467           const __m256i k32_m09_p23 =
2468               pair256_set_epi32(-cospi_9_64, cospi_23_64);
2469           const __m256i k32_m17_p15 =
2470               pair256_set_epi32(-cospi_17_64, cospi_15_64);
2471           const __m256i k32_m01_p31 =
2472               pair256_set_epi32(-cospi_1_64, cospi_31_64);
2473 
2474           u[0] = _mm256_unpacklo_epi32(lstep1[32], lstep1[62]);
2475           u[1] = _mm256_unpackhi_epi32(lstep1[32], lstep1[62]);
2476           u[2] = _mm256_unpacklo_epi32(lstep1[33], lstep1[63]);
2477           u[3] = _mm256_unpackhi_epi32(lstep1[33], lstep1[63]);
2478           u[4] = _mm256_unpacklo_epi32(lstep1[34], lstep1[60]);
2479           u[5] = _mm256_unpackhi_epi32(lstep1[34], lstep1[60]);
2480           u[6] = _mm256_unpacklo_epi32(lstep1[35], lstep1[61]);
2481           u[7] = _mm256_unpackhi_epi32(lstep1[35], lstep1[61]);
2482           u[8] = _mm256_unpacklo_epi32(lstep1[36], lstep1[58]);
2483           u[9] = _mm256_unpackhi_epi32(lstep1[36], lstep1[58]);
2484           u[10] = _mm256_unpacklo_epi32(lstep1[37], lstep1[59]);
2485           u[11] = _mm256_unpackhi_epi32(lstep1[37], lstep1[59]);
2486           u[12] = _mm256_unpacklo_epi32(lstep1[38], lstep1[56]);
2487           u[13] = _mm256_unpackhi_epi32(lstep1[38], lstep1[56]);
2488           u[14] = _mm256_unpacklo_epi32(lstep1[39], lstep1[57]);
2489           u[15] = _mm256_unpackhi_epi32(lstep1[39], lstep1[57]);
2490 
2491           v[0] = k_madd_epi32_avx2(u[0], k32_p31_p01);
2492           v[1] = k_madd_epi32_avx2(u[1], k32_p31_p01);
2493           v[2] = k_madd_epi32_avx2(u[2], k32_p31_p01);
2494           v[3] = k_madd_epi32_avx2(u[3], k32_p31_p01);
2495           v[4] = k_madd_epi32_avx2(u[4], k32_p15_p17);
2496           v[5] = k_madd_epi32_avx2(u[5], k32_p15_p17);
2497           v[6] = k_madd_epi32_avx2(u[6], k32_p15_p17);
2498           v[7] = k_madd_epi32_avx2(u[7], k32_p15_p17);
2499           v[8] = k_madd_epi32_avx2(u[8], k32_p23_p09);
2500           v[9] = k_madd_epi32_avx2(u[9], k32_p23_p09);
2501           v[10] = k_madd_epi32_avx2(u[10], k32_p23_p09);
2502           v[11] = k_madd_epi32_avx2(u[11], k32_p23_p09);
2503           v[12] = k_madd_epi32_avx2(u[12], k32_p07_p25);
2504           v[13] = k_madd_epi32_avx2(u[13], k32_p07_p25);
2505           v[14] = k_madd_epi32_avx2(u[14], k32_p07_p25);
2506           v[15] = k_madd_epi32_avx2(u[15], k32_p07_p25);
2507           v[16] = k_madd_epi32_avx2(u[12], k32_m25_p07);
2508           v[17] = k_madd_epi32_avx2(u[13], k32_m25_p07);
2509           v[18] = k_madd_epi32_avx2(u[14], k32_m25_p07);
2510           v[19] = k_madd_epi32_avx2(u[15], k32_m25_p07);
2511           v[20] = k_madd_epi32_avx2(u[8], k32_m09_p23);
2512           v[21] = k_madd_epi32_avx2(u[9], k32_m09_p23);
2513           v[22] = k_madd_epi32_avx2(u[10], k32_m09_p23);
2514           v[23] = k_madd_epi32_avx2(u[11], k32_m09_p23);
2515           v[24] = k_madd_epi32_avx2(u[4], k32_m17_p15);
2516           v[25] = k_madd_epi32_avx2(u[5], k32_m17_p15);
2517           v[26] = k_madd_epi32_avx2(u[6], k32_m17_p15);
2518           v[27] = k_madd_epi32_avx2(u[7], k32_m17_p15);
2519           v[28] = k_madd_epi32_avx2(u[0], k32_m01_p31);
2520           v[29] = k_madd_epi32_avx2(u[1], k32_m01_p31);
2521           v[30] = k_madd_epi32_avx2(u[2], k32_m01_p31);
2522           v[31] = k_madd_epi32_avx2(u[3], k32_m01_p31);
2523 
2524           u[0] = k_packs_epi64_avx2(v[0], v[1]);
2525           u[1] = k_packs_epi64_avx2(v[2], v[3]);
2526           u[2] = k_packs_epi64_avx2(v[4], v[5]);
2527           u[3] = k_packs_epi64_avx2(v[6], v[7]);
2528           u[4] = k_packs_epi64_avx2(v[8], v[9]);
2529           u[5] = k_packs_epi64_avx2(v[10], v[11]);
2530           u[6] = k_packs_epi64_avx2(v[12], v[13]);
2531           u[7] = k_packs_epi64_avx2(v[14], v[15]);
2532           u[8] = k_packs_epi64_avx2(v[16], v[17]);
2533           u[9] = k_packs_epi64_avx2(v[18], v[19]);
2534           u[10] = k_packs_epi64_avx2(v[20], v[21]);
2535           u[11] = k_packs_epi64_avx2(v[22], v[23]);
2536           u[12] = k_packs_epi64_avx2(v[24], v[25]);
2537           u[13] = k_packs_epi64_avx2(v[26], v[27]);
2538           u[14] = k_packs_epi64_avx2(v[28], v[29]);
2539           u[15] = k_packs_epi64_avx2(v[30], v[31]);
2540 
2541           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
2542           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
2543           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
2544           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
2545           v[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
2546           v[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
2547           v[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
2548           v[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
2549           v[8] = _mm256_add_epi32(u[8], k__DCT_CONST_ROUNDING);
2550           v[9] = _mm256_add_epi32(u[9], k__DCT_CONST_ROUNDING);
2551           v[10] = _mm256_add_epi32(u[10], k__DCT_CONST_ROUNDING);
2552           v[11] = _mm256_add_epi32(u[11], k__DCT_CONST_ROUNDING);
2553           v[12] = _mm256_add_epi32(u[12], k__DCT_CONST_ROUNDING);
2554           v[13] = _mm256_add_epi32(u[13], k__DCT_CONST_ROUNDING);
2555           v[14] = _mm256_add_epi32(u[14], k__DCT_CONST_ROUNDING);
2556           v[15] = _mm256_add_epi32(u[15], k__DCT_CONST_ROUNDING);
2557 
2558           u[0] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
2559           u[1] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
2560           u[2] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
2561           u[3] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
2562           u[4] = _mm256_srai_epi32(v[4], DCT_CONST_BITS);
2563           u[5] = _mm256_srai_epi32(v[5], DCT_CONST_BITS);
2564           u[6] = _mm256_srai_epi32(v[6], DCT_CONST_BITS);
2565           u[7] = _mm256_srai_epi32(v[7], DCT_CONST_BITS);
2566           u[8] = _mm256_srai_epi32(v[8], DCT_CONST_BITS);
2567           u[9] = _mm256_srai_epi32(v[9], DCT_CONST_BITS);
2568           u[10] = _mm256_srai_epi32(v[10], DCT_CONST_BITS);
2569           u[11] = _mm256_srai_epi32(v[11], DCT_CONST_BITS);
2570           u[12] = _mm256_srai_epi32(v[12], DCT_CONST_BITS);
2571           u[13] = _mm256_srai_epi32(v[13], DCT_CONST_BITS);
2572           u[14] = _mm256_srai_epi32(v[14], DCT_CONST_BITS);
2573           u[15] = _mm256_srai_epi32(v[15], DCT_CONST_BITS);
2574 
2575           v[0] = _mm256_cmpgt_epi32(kZero, u[0]);
2576           v[1] = _mm256_cmpgt_epi32(kZero, u[1]);
2577           v[2] = _mm256_cmpgt_epi32(kZero, u[2]);
2578           v[3] = _mm256_cmpgt_epi32(kZero, u[3]);
2579           v[4] = _mm256_cmpgt_epi32(kZero, u[4]);
2580           v[5] = _mm256_cmpgt_epi32(kZero, u[5]);
2581           v[6] = _mm256_cmpgt_epi32(kZero, u[6]);
2582           v[7] = _mm256_cmpgt_epi32(kZero, u[7]);
2583           v[8] = _mm256_cmpgt_epi32(kZero, u[8]);
2584           v[9] = _mm256_cmpgt_epi32(kZero, u[9]);
2585           v[10] = _mm256_cmpgt_epi32(kZero, u[10]);
2586           v[11] = _mm256_cmpgt_epi32(kZero, u[11]);
2587           v[12] = _mm256_cmpgt_epi32(kZero, u[12]);
2588           v[13] = _mm256_cmpgt_epi32(kZero, u[13]);
2589           v[14] = _mm256_cmpgt_epi32(kZero, u[14]);
2590           v[15] = _mm256_cmpgt_epi32(kZero, u[15]);
2591 
2592           u[0] = _mm256_sub_epi32(u[0], v[0]);
2593           u[1] = _mm256_sub_epi32(u[1], v[1]);
2594           u[2] = _mm256_sub_epi32(u[2], v[2]);
2595           u[3] = _mm256_sub_epi32(u[3], v[3]);
2596           u[4] = _mm256_sub_epi32(u[4], v[4]);
2597           u[5] = _mm256_sub_epi32(u[5], v[5]);
2598           u[6] = _mm256_sub_epi32(u[6], v[6]);
2599           u[7] = _mm256_sub_epi32(u[7], v[7]);
2600           u[8] = _mm256_sub_epi32(u[8], v[8]);
2601           u[9] = _mm256_sub_epi32(u[9], v[9]);
2602           u[10] = _mm256_sub_epi32(u[10], v[10]);
2603           u[11] = _mm256_sub_epi32(u[11], v[11]);
2604           u[12] = _mm256_sub_epi32(u[12], v[12]);
2605           u[13] = _mm256_sub_epi32(u[13], v[13]);
2606           u[14] = _mm256_sub_epi32(u[14], v[14]);
2607           u[15] = _mm256_sub_epi32(u[15], v[15]);
2608 
2609           v[0] = _mm256_add_epi32(u[0], K32One);
2610           v[1] = _mm256_add_epi32(u[1], K32One);
2611           v[2] = _mm256_add_epi32(u[2], K32One);
2612           v[3] = _mm256_add_epi32(u[3], K32One);
2613           v[4] = _mm256_add_epi32(u[4], K32One);
2614           v[5] = _mm256_add_epi32(u[5], K32One);
2615           v[6] = _mm256_add_epi32(u[6], K32One);
2616           v[7] = _mm256_add_epi32(u[7], K32One);
2617           v[8] = _mm256_add_epi32(u[8], K32One);
2618           v[9] = _mm256_add_epi32(u[9], K32One);
2619           v[10] = _mm256_add_epi32(u[10], K32One);
2620           v[11] = _mm256_add_epi32(u[11], K32One);
2621           v[12] = _mm256_add_epi32(u[12], K32One);
2622           v[13] = _mm256_add_epi32(u[13], K32One);
2623           v[14] = _mm256_add_epi32(u[14], K32One);
2624           v[15] = _mm256_add_epi32(u[15], K32One);
2625 
2626           u[0] = _mm256_srai_epi32(v[0], 2);
2627           u[1] = _mm256_srai_epi32(v[1], 2);
2628           u[2] = _mm256_srai_epi32(v[2], 2);
2629           u[3] = _mm256_srai_epi32(v[3], 2);
2630           u[4] = _mm256_srai_epi32(v[4], 2);
2631           u[5] = _mm256_srai_epi32(v[5], 2);
2632           u[6] = _mm256_srai_epi32(v[6], 2);
2633           u[7] = _mm256_srai_epi32(v[7], 2);
2634           u[8] = _mm256_srai_epi32(v[8], 2);
2635           u[9] = _mm256_srai_epi32(v[9], 2);
2636           u[10] = _mm256_srai_epi32(v[10], 2);
2637           u[11] = _mm256_srai_epi32(v[11], 2);
2638           u[12] = _mm256_srai_epi32(v[12], 2);
2639           u[13] = _mm256_srai_epi32(v[13], 2);
2640           u[14] = _mm256_srai_epi32(v[14], 2);
2641           u[15] = _mm256_srai_epi32(v[15], 2);
2642 
2643           out[1] = _mm256_packs_epi32(u[0], u[1]);
2644           out[17] = _mm256_packs_epi32(u[2], u[3]);
2645           out[9] = _mm256_packs_epi32(u[4], u[5]);
2646           out[25] = _mm256_packs_epi32(u[6], u[7]);
2647           out[7] = _mm256_packs_epi32(u[8], u[9]);
2648           out[23] = _mm256_packs_epi32(u[10], u[11]);
2649           out[15] = _mm256_packs_epi32(u[12], u[13]);
2650           out[31] = _mm256_packs_epi32(u[14], u[15]);
2651         }
2652         {
2653           const __m256i k32_p27_p05 =
2654               pair256_set_epi32(cospi_27_64, cospi_5_64);
2655           const __m256i k32_p11_p21 =
2656               pair256_set_epi32(cospi_11_64, cospi_21_64);
2657           const __m256i k32_p19_p13 =
2658               pair256_set_epi32(cospi_19_64, cospi_13_64);
2659           const __m256i k32_p03_p29 =
2660               pair256_set_epi32(cospi_3_64, cospi_29_64);
2661           const __m256i k32_m29_p03 =
2662               pair256_set_epi32(-cospi_29_64, cospi_3_64);
2663           const __m256i k32_m13_p19 =
2664               pair256_set_epi32(-cospi_13_64, cospi_19_64);
2665           const __m256i k32_m21_p11 =
2666               pair256_set_epi32(-cospi_21_64, cospi_11_64);
2667           const __m256i k32_m05_p27 =
2668               pair256_set_epi32(-cospi_5_64, cospi_27_64);
2669 
2670           u[0] = _mm256_unpacklo_epi32(lstep1[40], lstep1[54]);
2671           u[1] = _mm256_unpackhi_epi32(lstep1[40], lstep1[54]);
2672           u[2] = _mm256_unpacklo_epi32(lstep1[41], lstep1[55]);
2673           u[3] = _mm256_unpackhi_epi32(lstep1[41], lstep1[55]);
2674           u[4] = _mm256_unpacklo_epi32(lstep1[42], lstep1[52]);
2675           u[5] = _mm256_unpackhi_epi32(lstep1[42], lstep1[52]);
2676           u[6] = _mm256_unpacklo_epi32(lstep1[43], lstep1[53]);
2677           u[7] = _mm256_unpackhi_epi32(lstep1[43], lstep1[53]);
2678           u[8] = _mm256_unpacklo_epi32(lstep1[44], lstep1[50]);
2679           u[9] = _mm256_unpackhi_epi32(lstep1[44], lstep1[50]);
2680           u[10] = _mm256_unpacklo_epi32(lstep1[45], lstep1[51]);
2681           u[11] = _mm256_unpackhi_epi32(lstep1[45], lstep1[51]);
2682           u[12] = _mm256_unpacklo_epi32(lstep1[46], lstep1[48]);
2683           u[13] = _mm256_unpackhi_epi32(lstep1[46], lstep1[48]);
2684           u[14] = _mm256_unpacklo_epi32(lstep1[47], lstep1[49]);
2685           u[15] = _mm256_unpackhi_epi32(lstep1[47], lstep1[49]);
2686 
2687           v[0] = k_madd_epi32_avx2(u[0], k32_p27_p05);
2688           v[1] = k_madd_epi32_avx2(u[1], k32_p27_p05);
2689           v[2] = k_madd_epi32_avx2(u[2], k32_p27_p05);
2690           v[3] = k_madd_epi32_avx2(u[3], k32_p27_p05);
2691           v[4] = k_madd_epi32_avx2(u[4], k32_p11_p21);
2692           v[5] = k_madd_epi32_avx2(u[5], k32_p11_p21);
2693           v[6] = k_madd_epi32_avx2(u[6], k32_p11_p21);
2694           v[7] = k_madd_epi32_avx2(u[7], k32_p11_p21);
2695           v[8] = k_madd_epi32_avx2(u[8], k32_p19_p13);
2696           v[9] = k_madd_epi32_avx2(u[9], k32_p19_p13);
2697           v[10] = k_madd_epi32_avx2(u[10], k32_p19_p13);
2698           v[11] = k_madd_epi32_avx2(u[11], k32_p19_p13);
2699           v[12] = k_madd_epi32_avx2(u[12], k32_p03_p29);
2700           v[13] = k_madd_epi32_avx2(u[13], k32_p03_p29);
2701           v[14] = k_madd_epi32_avx2(u[14], k32_p03_p29);
2702           v[15] = k_madd_epi32_avx2(u[15], k32_p03_p29);
2703           v[16] = k_madd_epi32_avx2(u[12], k32_m29_p03);
2704           v[17] = k_madd_epi32_avx2(u[13], k32_m29_p03);
2705           v[18] = k_madd_epi32_avx2(u[14], k32_m29_p03);
2706           v[19] = k_madd_epi32_avx2(u[15], k32_m29_p03);
2707           v[20] = k_madd_epi32_avx2(u[8], k32_m13_p19);
2708           v[21] = k_madd_epi32_avx2(u[9], k32_m13_p19);
2709           v[22] = k_madd_epi32_avx2(u[10], k32_m13_p19);
2710           v[23] = k_madd_epi32_avx2(u[11], k32_m13_p19);
2711           v[24] = k_madd_epi32_avx2(u[4], k32_m21_p11);
2712           v[25] = k_madd_epi32_avx2(u[5], k32_m21_p11);
2713           v[26] = k_madd_epi32_avx2(u[6], k32_m21_p11);
2714           v[27] = k_madd_epi32_avx2(u[7], k32_m21_p11);
2715           v[28] = k_madd_epi32_avx2(u[0], k32_m05_p27);
2716           v[29] = k_madd_epi32_avx2(u[1], k32_m05_p27);
2717           v[30] = k_madd_epi32_avx2(u[2], k32_m05_p27);
2718           v[31] = k_madd_epi32_avx2(u[3], k32_m05_p27);
2719 
2720           u[0] = k_packs_epi64_avx2(v[0], v[1]);
2721           u[1] = k_packs_epi64_avx2(v[2], v[3]);
2722           u[2] = k_packs_epi64_avx2(v[4], v[5]);
2723           u[3] = k_packs_epi64_avx2(v[6], v[7]);
2724           u[4] = k_packs_epi64_avx2(v[8], v[9]);
2725           u[5] = k_packs_epi64_avx2(v[10], v[11]);
2726           u[6] = k_packs_epi64_avx2(v[12], v[13]);
2727           u[7] = k_packs_epi64_avx2(v[14], v[15]);
2728           u[8] = k_packs_epi64_avx2(v[16], v[17]);
2729           u[9] = k_packs_epi64_avx2(v[18], v[19]);
2730           u[10] = k_packs_epi64_avx2(v[20], v[21]);
2731           u[11] = k_packs_epi64_avx2(v[22], v[23]);
2732           u[12] = k_packs_epi64_avx2(v[24], v[25]);
2733           u[13] = k_packs_epi64_avx2(v[26], v[27]);
2734           u[14] = k_packs_epi64_avx2(v[28], v[29]);
2735           u[15] = k_packs_epi64_avx2(v[30], v[31]);
2736 
2737           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
2738           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
2739           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
2740           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
2741           v[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
2742           v[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
2743           v[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
2744           v[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
2745           v[8] = _mm256_add_epi32(u[8], k__DCT_CONST_ROUNDING);
2746           v[9] = _mm256_add_epi32(u[9], k__DCT_CONST_ROUNDING);
2747           v[10] = _mm256_add_epi32(u[10], k__DCT_CONST_ROUNDING);
2748           v[11] = _mm256_add_epi32(u[11], k__DCT_CONST_ROUNDING);
2749           v[12] = _mm256_add_epi32(u[12], k__DCT_CONST_ROUNDING);
2750           v[13] = _mm256_add_epi32(u[13], k__DCT_CONST_ROUNDING);
2751           v[14] = _mm256_add_epi32(u[14], k__DCT_CONST_ROUNDING);
2752           v[15] = _mm256_add_epi32(u[15], k__DCT_CONST_ROUNDING);
2753 
2754           u[0] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
2755           u[1] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
2756           u[2] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
2757           u[3] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
2758           u[4] = _mm256_srai_epi32(v[4], DCT_CONST_BITS);
2759           u[5] = _mm256_srai_epi32(v[5], DCT_CONST_BITS);
2760           u[6] = _mm256_srai_epi32(v[6], DCT_CONST_BITS);
2761           u[7] = _mm256_srai_epi32(v[7], DCT_CONST_BITS);
2762           u[8] = _mm256_srai_epi32(v[8], DCT_CONST_BITS);
2763           u[9] = _mm256_srai_epi32(v[9], DCT_CONST_BITS);
2764           u[10] = _mm256_srai_epi32(v[10], DCT_CONST_BITS);
2765           u[11] = _mm256_srai_epi32(v[11], DCT_CONST_BITS);
2766           u[12] = _mm256_srai_epi32(v[12], DCT_CONST_BITS);
2767           u[13] = _mm256_srai_epi32(v[13], DCT_CONST_BITS);
2768           u[14] = _mm256_srai_epi32(v[14], DCT_CONST_BITS);
2769           u[15] = _mm256_srai_epi32(v[15], DCT_CONST_BITS);
2770 
2771           v[0] = _mm256_cmpgt_epi32(kZero, u[0]);
2772           v[1] = _mm256_cmpgt_epi32(kZero, u[1]);
2773           v[2] = _mm256_cmpgt_epi32(kZero, u[2]);
2774           v[3] = _mm256_cmpgt_epi32(kZero, u[3]);
2775           v[4] = _mm256_cmpgt_epi32(kZero, u[4]);
2776           v[5] = _mm256_cmpgt_epi32(kZero, u[5]);
2777           v[6] = _mm256_cmpgt_epi32(kZero, u[6]);
2778           v[7] = _mm256_cmpgt_epi32(kZero, u[7]);
2779           v[8] = _mm256_cmpgt_epi32(kZero, u[8]);
2780           v[9] = _mm256_cmpgt_epi32(kZero, u[9]);
2781           v[10] = _mm256_cmpgt_epi32(kZero, u[10]);
2782           v[11] = _mm256_cmpgt_epi32(kZero, u[11]);
2783           v[12] = _mm256_cmpgt_epi32(kZero, u[12]);
2784           v[13] = _mm256_cmpgt_epi32(kZero, u[13]);
2785           v[14] = _mm256_cmpgt_epi32(kZero, u[14]);
2786           v[15] = _mm256_cmpgt_epi32(kZero, u[15]);
2787 
2788           u[0] = _mm256_sub_epi32(u[0], v[0]);
2789           u[1] = _mm256_sub_epi32(u[1], v[1]);
2790           u[2] = _mm256_sub_epi32(u[2], v[2]);
2791           u[3] = _mm256_sub_epi32(u[3], v[3]);
2792           u[4] = _mm256_sub_epi32(u[4], v[4]);
2793           u[5] = _mm256_sub_epi32(u[5], v[5]);
2794           u[6] = _mm256_sub_epi32(u[6], v[6]);
2795           u[7] = _mm256_sub_epi32(u[7], v[7]);
2796           u[8] = _mm256_sub_epi32(u[8], v[8]);
2797           u[9] = _mm256_sub_epi32(u[9], v[9]);
2798           u[10] = _mm256_sub_epi32(u[10], v[10]);
2799           u[11] = _mm256_sub_epi32(u[11], v[11]);
2800           u[12] = _mm256_sub_epi32(u[12], v[12]);
2801           u[13] = _mm256_sub_epi32(u[13], v[13]);
2802           u[14] = _mm256_sub_epi32(u[14], v[14]);
2803           u[15] = _mm256_sub_epi32(u[15], v[15]);
2804 
2805           v[0] = _mm256_add_epi32(u[0], K32One);
2806           v[1] = _mm256_add_epi32(u[1], K32One);
2807           v[2] = _mm256_add_epi32(u[2], K32One);
2808           v[3] = _mm256_add_epi32(u[3], K32One);
2809           v[4] = _mm256_add_epi32(u[4], K32One);
2810           v[5] = _mm256_add_epi32(u[5], K32One);
2811           v[6] = _mm256_add_epi32(u[6], K32One);
2812           v[7] = _mm256_add_epi32(u[7], K32One);
2813           v[8] = _mm256_add_epi32(u[8], K32One);
2814           v[9] = _mm256_add_epi32(u[9], K32One);
2815           v[10] = _mm256_add_epi32(u[10], K32One);
2816           v[11] = _mm256_add_epi32(u[11], K32One);
2817           v[12] = _mm256_add_epi32(u[12], K32One);
2818           v[13] = _mm256_add_epi32(u[13], K32One);
2819           v[14] = _mm256_add_epi32(u[14], K32One);
2820           v[15] = _mm256_add_epi32(u[15], K32One);
2821 
2822           u[0] = _mm256_srai_epi32(v[0], 2);
2823           u[1] = _mm256_srai_epi32(v[1], 2);
2824           u[2] = _mm256_srai_epi32(v[2], 2);
2825           u[3] = _mm256_srai_epi32(v[3], 2);
2826           u[4] = _mm256_srai_epi32(v[4], 2);
2827           u[5] = _mm256_srai_epi32(v[5], 2);
2828           u[6] = _mm256_srai_epi32(v[6], 2);
2829           u[7] = _mm256_srai_epi32(v[7], 2);
2830           u[8] = _mm256_srai_epi32(v[8], 2);
2831           u[9] = _mm256_srai_epi32(v[9], 2);
2832           u[10] = _mm256_srai_epi32(v[10], 2);
2833           u[11] = _mm256_srai_epi32(v[11], 2);
2834           u[12] = _mm256_srai_epi32(v[12], 2);
2835           u[13] = _mm256_srai_epi32(v[13], 2);
2836           u[14] = _mm256_srai_epi32(v[14], 2);
2837           u[15] = _mm256_srai_epi32(v[15], 2);
2838 
2839           out[5] = _mm256_packs_epi32(u[0], u[1]);
2840           out[21] = _mm256_packs_epi32(u[2], u[3]);
2841           out[13] = _mm256_packs_epi32(u[4], u[5]);
2842           out[29] = _mm256_packs_epi32(u[6], u[7]);
2843           out[3] = _mm256_packs_epi32(u[8], u[9]);
2844           out[19] = _mm256_packs_epi32(u[10], u[11]);
2845           out[11] = _mm256_packs_epi32(u[12], u[13]);
2846           out[27] = _mm256_packs_epi32(u[14], u[15]);
2847         }
2848       }
2849 #endif
2850       // Transpose the results, do it as four 8x8 transposes.
2851       {
2852         int transpose_block;
2853         int16_t *output_currStep, *output_nextStep;
2854         if (0 == pass) {
2855           output_currStep = &intermediate[column_start * 32];
2856           output_nextStep = &intermediate[(column_start + 8) * 32];
2857         } else {
2858           output_currStep = &output_org[column_start * 32];
2859           output_nextStep = &output_org[(column_start + 8) * 32];
2860         }
2861         for (transpose_block = 0; transpose_block < 4; ++transpose_block) {
2862           __m256i *this_out = &out[8 * transpose_block];
2863           // 00  01  02  03  04  05  06  07  08  09  10  11  12  13  14  15
2864           // 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35
2865           // 40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55
2866           // 60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75
2867           // 80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95
2868           // 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
2869           // 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
2870           // 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
2871           const __m256i tr0_0 = _mm256_unpacklo_epi16(this_out[0], this_out[1]);
2872           const __m256i tr0_1 = _mm256_unpacklo_epi16(this_out[2], this_out[3]);
2873           const __m256i tr0_2 = _mm256_unpackhi_epi16(this_out[0], this_out[1]);
2874           const __m256i tr0_3 = _mm256_unpackhi_epi16(this_out[2], this_out[3]);
2875           const __m256i tr0_4 = _mm256_unpacklo_epi16(this_out[4], this_out[5]);
2876           const __m256i tr0_5 = _mm256_unpacklo_epi16(this_out[6], this_out[7]);
2877           const __m256i tr0_6 = _mm256_unpackhi_epi16(this_out[4], this_out[5]);
2878           const __m256i tr0_7 = _mm256_unpackhi_epi16(this_out[6], this_out[7]);
2879           // 00  20  01  21  02  22  03  23  08  28  09  29  10  30  11  31
2880           // 40  60  41  61  42  62  43  63  48  68  49  69  50  70  51  71
2881           // 04  24  05  25  06  26  07  27  12  32  13  33  14  34  15  35
2882           // 44  64  45  65  46  66  47  67  52  72  53  73  54  74  55  75
2883           // 80  100 81  101 82  102 83  103 88  108 89  109 90  110 91  101
2884           // 120 140 121 141 122 142 123 143 128 148 129 149 130 150 131 151
2885           // 84  104 85  105 86  106 87  107 92  112 93  113 94  114 95  115
2886           // 124 144 125 145 126 146 127 147 132 152 133 153 134 154 135 155
2887 
2888           const __m256i tr1_0 = _mm256_unpacklo_epi32(tr0_0, tr0_1);
2889           const __m256i tr1_1 = _mm256_unpacklo_epi32(tr0_2, tr0_3);
2890           const __m256i tr1_2 = _mm256_unpackhi_epi32(tr0_0, tr0_1);
2891           const __m256i tr1_3 = _mm256_unpackhi_epi32(tr0_2, tr0_3);
2892           const __m256i tr1_4 = _mm256_unpacklo_epi32(tr0_4, tr0_5);
2893           const __m256i tr1_5 = _mm256_unpacklo_epi32(tr0_6, tr0_7);
2894           const __m256i tr1_6 = _mm256_unpackhi_epi32(tr0_4, tr0_5);
2895           const __m256i tr1_7 = _mm256_unpackhi_epi32(tr0_6, tr0_7);
2896           // 00 20  40  60  01 21  41  61  08 28  48  68  09 29  49  69
2897           // 04 24  44  64  05 25  45  65  12 32  52  72  13 33  53  73
2898           // 02 22  42  62  03 23  43  63  10 30  50  70  11 31  51  71
2899           // 06 26  46  66  07 27  47  67  14 34  54  74  15 35  55  75
2900           // 80 100 120 140 81 101 121 141 88 108 128 148 89 109 129 149
2901           // 84 104 124 144 85 105 125 145 92 112 132 152 93 113 133 153
2902           // 82 102 122 142 83 103 123 143 90 110 130 150 91 101 131 151
2903           // 86 106 126 146 87 107 127 147 94 114 134 154 95 115 135 155
2904           __m256i tr2_0 = _mm256_unpacklo_epi64(tr1_0, tr1_4);
2905           __m256i tr2_1 = _mm256_unpackhi_epi64(tr1_0, tr1_4);
2906           __m256i tr2_2 = _mm256_unpacklo_epi64(tr1_2, tr1_6);
2907           __m256i tr2_3 = _mm256_unpackhi_epi64(tr1_2, tr1_6);
2908           __m256i tr2_4 = _mm256_unpacklo_epi64(tr1_1, tr1_5);
2909           __m256i tr2_5 = _mm256_unpackhi_epi64(tr1_1, tr1_5);
2910           __m256i tr2_6 = _mm256_unpacklo_epi64(tr1_3, tr1_7);
2911           __m256i tr2_7 = _mm256_unpackhi_epi64(tr1_3, tr1_7);
2912           // 00 20 40 60 80 100 120 140 08 28 48 68 88 108 128 148
2913           // 01 21 41 61 81 101 121 141 09 29 49 69 89 109 129 149
2914           // 02 22 42 62 82 102 122 142 10 30 50 70 90 110 130 150
2915           // 03 23 43 63 83 103 123 143 11 31 51 71 91 101 131 151
2916           // 04 24 44 64 84 104 124 144 12 32 52 72 92 112 132 152
2917           // 05 25 45 65 85 105 125 145 13 33 53 73 93 113 133 153
2918           // 06 26 46 66 86 106 126 146 14 34 54 74 94 114 134 154
2919           // 07 27 47 67 87 107 127 147 15 35 55 75 95 115 135 155
2920           if (0 == pass) {
2921             // output[j] = (output[j] + 1 + (output[j] > 0)) >> 2;
2922             // TODO(cd): see quality impact of only doing
2923             //           output[j] = (output[j] + 1) >> 2;
2924             //           which would remove the code between here ...
2925             __m256i tr2_0_0 = _mm256_cmpgt_epi16(tr2_0, kZero);
2926             __m256i tr2_1_0 = _mm256_cmpgt_epi16(tr2_1, kZero);
2927             __m256i tr2_2_0 = _mm256_cmpgt_epi16(tr2_2, kZero);
2928             __m256i tr2_3_0 = _mm256_cmpgt_epi16(tr2_3, kZero);
2929             __m256i tr2_4_0 = _mm256_cmpgt_epi16(tr2_4, kZero);
2930             __m256i tr2_5_0 = _mm256_cmpgt_epi16(tr2_5, kZero);
2931             __m256i tr2_6_0 = _mm256_cmpgt_epi16(tr2_6, kZero);
2932             __m256i tr2_7_0 = _mm256_cmpgt_epi16(tr2_7, kZero);
2933             tr2_0 = _mm256_sub_epi16(tr2_0, tr2_0_0);
2934             tr2_1 = _mm256_sub_epi16(tr2_1, tr2_1_0);
2935             tr2_2 = _mm256_sub_epi16(tr2_2, tr2_2_0);
2936             tr2_3 = _mm256_sub_epi16(tr2_3, tr2_3_0);
2937             tr2_4 = _mm256_sub_epi16(tr2_4, tr2_4_0);
2938             tr2_5 = _mm256_sub_epi16(tr2_5, tr2_5_0);
2939             tr2_6 = _mm256_sub_epi16(tr2_6, tr2_6_0);
2940             tr2_7 = _mm256_sub_epi16(tr2_7, tr2_7_0);
2941             //           ... and here.
2942             //           PS: also change code in vp9/encoder/vp9_dct.c
2943             tr2_0 = _mm256_add_epi16(tr2_0, kOne);
2944             tr2_1 = _mm256_add_epi16(tr2_1, kOne);
2945             tr2_2 = _mm256_add_epi16(tr2_2, kOne);
2946             tr2_3 = _mm256_add_epi16(tr2_3, kOne);
2947             tr2_4 = _mm256_add_epi16(tr2_4, kOne);
2948             tr2_5 = _mm256_add_epi16(tr2_5, kOne);
2949             tr2_6 = _mm256_add_epi16(tr2_6, kOne);
2950             tr2_7 = _mm256_add_epi16(tr2_7, kOne);
2951             tr2_0 = _mm256_srai_epi16(tr2_0, 2);
2952             tr2_1 = _mm256_srai_epi16(tr2_1, 2);
2953             tr2_2 = _mm256_srai_epi16(tr2_2, 2);
2954             tr2_3 = _mm256_srai_epi16(tr2_3, 2);
2955             tr2_4 = _mm256_srai_epi16(tr2_4, 2);
2956             tr2_5 = _mm256_srai_epi16(tr2_5, 2);
2957             tr2_6 = _mm256_srai_epi16(tr2_6, 2);
2958             tr2_7 = _mm256_srai_epi16(tr2_7, 2);
2959           }
2960           // Note: even though all these stores are aligned, using the aligned
2961           //       intrinsic make the code slightly slower.
2962           _mm_storeu_si128((__m128i *)(output_currStep + 0 * 32),
2963                            _mm256_castsi256_si128(tr2_0));
2964           _mm_storeu_si128((__m128i *)(output_currStep + 1 * 32),
2965                            _mm256_castsi256_si128(tr2_1));
2966           _mm_storeu_si128((__m128i *)(output_currStep + 2 * 32),
2967                            _mm256_castsi256_si128(tr2_2));
2968           _mm_storeu_si128((__m128i *)(output_currStep + 3 * 32),
2969                            _mm256_castsi256_si128(tr2_3));
2970           _mm_storeu_si128((__m128i *)(output_currStep + 4 * 32),
2971                            _mm256_castsi256_si128(tr2_4));
2972           _mm_storeu_si128((__m128i *)(output_currStep + 5 * 32),
2973                            _mm256_castsi256_si128(tr2_5));
2974           _mm_storeu_si128((__m128i *)(output_currStep + 6 * 32),
2975                            _mm256_castsi256_si128(tr2_6));
2976           _mm_storeu_si128((__m128i *)(output_currStep + 7 * 32),
2977                            _mm256_castsi256_si128(tr2_7));
2978 
2979           _mm_storeu_si128((__m128i *)(output_nextStep + 0 * 32),
2980                            _mm256_extractf128_si256(tr2_0, 1));
2981           _mm_storeu_si128((__m128i *)(output_nextStep + 1 * 32),
2982                            _mm256_extractf128_si256(tr2_1, 1));
2983           _mm_storeu_si128((__m128i *)(output_nextStep + 2 * 32),
2984                            _mm256_extractf128_si256(tr2_2, 1));
2985           _mm_storeu_si128((__m128i *)(output_nextStep + 3 * 32),
2986                            _mm256_extractf128_si256(tr2_3, 1));
2987           _mm_storeu_si128((__m128i *)(output_nextStep + 4 * 32),
2988                            _mm256_extractf128_si256(tr2_4, 1));
2989           _mm_storeu_si128((__m128i *)(output_nextStep + 5 * 32),
2990                            _mm256_extractf128_si256(tr2_5, 1));
2991           _mm_storeu_si128((__m128i *)(output_nextStep + 6 * 32),
2992                            _mm256_extractf128_si256(tr2_6, 1));
2993           _mm_storeu_si128((__m128i *)(output_nextStep + 7 * 32),
2994                            _mm256_extractf128_si256(tr2_7, 1));
2995           // Process next 8x8
2996           output_currStep += 8;
2997           output_nextStep += 8;
2998         }
2999       }
3000     }
3001   }
3002 }  // NOLINT
3003