xref: /aosp_15_r20/external/libvpx/vpx_dsp/x86/fwd_dct32x32_impl_avx2.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
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(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_setzero_si256();
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         const __m256i k__pOne_mOne = pair256_set_epi16(1, -1);
1378         // start using 32-bit operations
1379         // stage 3
1380         {
1381           // expanding to 32-bit length while adding and subtracting
1382           lstep2[0] = _mm256_unpacklo_epi16(step2[0], step2[7]);
1383           lstep2[1] = _mm256_unpackhi_epi16(step2[0], step2[7]);
1384           lstep2[2] = _mm256_unpacklo_epi16(step2[1], step2[6]);
1385           lstep2[3] = _mm256_unpackhi_epi16(step2[1], step2[6]);
1386           lstep2[4] = _mm256_unpacklo_epi16(step2[2], step2[5]);
1387           lstep2[5] = _mm256_unpackhi_epi16(step2[2], step2[5]);
1388           lstep2[6] = _mm256_unpacklo_epi16(step2[3], step2[4]);
1389           lstep2[7] = _mm256_unpackhi_epi16(step2[3], step2[4]);
1390 
1391           lstep3[0] = _mm256_madd_epi16(lstep2[0], kOne);
1392           lstep3[1] = _mm256_madd_epi16(lstep2[1], kOne);
1393           lstep3[2] = _mm256_madd_epi16(lstep2[2], kOne);
1394           lstep3[3] = _mm256_madd_epi16(lstep2[3], kOne);
1395           lstep3[4] = _mm256_madd_epi16(lstep2[4], kOne);
1396           lstep3[5] = _mm256_madd_epi16(lstep2[5], kOne);
1397           lstep3[6] = _mm256_madd_epi16(lstep2[6], kOne);
1398           lstep3[7] = _mm256_madd_epi16(lstep2[7], kOne);
1399 
1400           lstep3[8] = _mm256_madd_epi16(lstep2[6], k__pOne_mOne);
1401           lstep3[9] = _mm256_madd_epi16(lstep2[7], k__pOne_mOne);
1402           lstep3[10] = _mm256_madd_epi16(lstep2[4], k__pOne_mOne);
1403           lstep3[11] = _mm256_madd_epi16(lstep2[5], k__pOne_mOne);
1404           lstep3[12] = _mm256_madd_epi16(lstep2[2], k__pOne_mOne);
1405           lstep3[13] = _mm256_madd_epi16(lstep2[3], k__pOne_mOne);
1406           lstep3[14] = _mm256_madd_epi16(lstep2[0], k__pOne_mOne);
1407           lstep3[15] = _mm256_madd_epi16(lstep2[1], k__pOne_mOne);
1408         }
1409         {
1410           const __m256i s3_10_0 = _mm256_unpacklo_epi16(step2[13], step2[10]);
1411           const __m256i s3_10_1 = _mm256_unpackhi_epi16(step2[13], step2[10]);
1412           const __m256i s3_11_0 = _mm256_unpacklo_epi16(step2[12], step2[11]);
1413           const __m256i s3_11_1 = _mm256_unpackhi_epi16(step2[12], step2[11]);
1414           const __m256i s3_10_2 = _mm256_madd_epi16(s3_10_0, k__cospi_p16_m16);
1415           const __m256i s3_10_3 = _mm256_madd_epi16(s3_10_1, k__cospi_p16_m16);
1416           const __m256i s3_11_2 = _mm256_madd_epi16(s3_11_0, k__cospi_p16_m16);
1417           const __m256i s3_11_3 = _mm256_madd_epi16(s3_11_1, k__cospi_p16_m16);
1418           const __m256i s3_12_2 = _mm256_madd_epi16(s3_11_0, k__cospi_p16_p16);
1419           const __m256i s3_12_3 = _mm256_madd_epi16(s3_11_1, k__cospi_p16_p16);
1420           const __m256i s3_13_2 = _mm256_madd_epi16(s3_10_0, k__cospi_p16_p16);
1421           const __m256i s3_13_3 = _mm256_madd_epi16(s3_10_1, k__cospi_p16_p16);
1422           // dct_const_round_shift
1423           const __m256i s3_10_4 =
1424               _mm256_add_epi32(s3_10_2, k__DCT_CONST_ROUNDING);
1425           const __m256i s3_10_5 =
1426               _mm256_add_epi32(s3_10_3, k__DCT_CONST_ROUNDING);
1427           const __m256i s3_11_4 =
1428               _mm256_add_epi32(s3_11_2, k__DCT_CONST_ROUNDING);
1429           const __m256i s3_11_5 =
1430               _mm256_add_epi32(s3_11_3, k__DCT_CONST_ROUNDING);
1431           const __m256i s3_12_4 =
1432               _mm256_add_epi32(s3_12_2, k__DCT_CONST_ROUNDING);
1433           const __m256i s3_12_5 =
1434               _mm256_add_epi32(s3_12_3, k__DCT_CONST_ROUNDING);
1435           const __m256i s3_13_4 =
1436               _mm256_add_epi32(s3_13_2, k__DCT_CONST_ROUNDING);
1437           const __m256i s3_13_5 =
1438               _mm256_add_epi32(s3_13_3, k__DCT_CONST_ROUNDING);
1439           lstep3[20] = _mm256_srai_epi32(s3_10_4, DCT_CONST_BITS);
1440           lstep3[21] = _mm256_srai_epi32(s3_10_5, DCT_CONST_BITS);
1441           lstep3[22] = _mm256_srai_epi32(s3_11_4, DCT_CONST_BITS);
1442           lstep3[23] = _mm256_srai_epi32(s3_11_5, DCT_CONST_BITS);
1443           lstep3[24] = _mm256_srai_epi32(s3_12_4, DCT_CONST_BITS);
1444           lstep3[25] = _mm256_srai_epi32(s3_12_5, DCT_CONST_BITS);
1445           lstep3[26] = _mm256_srai_epi32(s3_13_4, DCT_CONST_BITS);
1446           lstep3[27] = _mm256_srai_epi32(s3_13_5, DCT_CONST_BITS);
1447         }
1448         {
1449           lstep1[32] = _mm256_unpacklo_epi16(step1[16], step2[23]);
1450           lstep1[33] = _mm256_unpackhi_epi16(step1[16], step2[23]);
1451           lstep1[34] = _mm256_unpacklo_epi16(step1[17], step2[22]);
1452           lstep1[35] = _mm256_unpackhi_epi16(step1[17], step2[22]);
1453           lstep1[36] = _mm256_unpacklo_epi16(step1[18], step2[21]);
1454           lstep1[37] = _mm256_unpackhi_epi16(step1[18], step2[21]);
1455           lstep1[38] = _mm256_unpacklo_epi16(step1[19], step2[20]);
1456           lstep1[39] = _mm256_unpackhi_epi16(step1[19], step2[20]);
1457 
1458           lstep1[56] = _mm256_unpacklo_epi16(step1[28], step2[27]);
1459           lstep1[57] = _mm256_unpackhi_epi16(step1[28], step2[27]);
1460           lstep1[58] = _mm256_unpacklo_epi16(step1[29], step2[26]);
1461           lstep1[59] = _mm256_unpackhi_epi16(step1[29], step2[26]);
1462           lstep1[60] = _mm256_unpacklo_epi16(step1[30], step2[25]);
1463           lstep1[61] = _mm256_unpackhi_epi16(step1[30], step2[25]);
1464           lstep1[62] = _mm256_unpacklo_epi16(step1[31], step2[24]);
1465           lstep1[63] = _mm256_unpackhi_epi16(step1[31], step2[24]);
1466 
1467           lstep3[32] = _mm256_madd_epi16(lstep1[32], kOne);
1468           lstep3[33] = _mm256_madd_epi16(lstep1[33], kOne);
1469           lstep3[34] = _mm256_madd_epi16(lstep1[34], kOne);
1470           lstep3[35] = _mm256_madd_epi16(lstep1[35], kOne);
1471           lstep3[36] = _mm256_madd_epi16(lstep1[36], kOne);
1472           lstep3[37] = _mm256_madd_epi16(lstep1[37], kOne);
1473           lstep3[38] = _mm256_madd_epi16(lstep1[38], kOne);
1474           lstep3[39] = _mm256_madd_epi16(lstep1[39], kOne);
1475 
1476           lstep3[40] = _mm256_madd_epi16(lstep1[38], k__pOne_mOne);
1477           lstep3[41] = _mm256_madd_epi16(lstep1[39], k__pOne_mOne);
1478           lstep3[42] = _mm256_madd_epi16(lstep1[36], k__pOne_mOne);
1479           lstep3[43] = _mm256_madd_epi16(lstep1[37], k__pOne_mOne);
1480           lstep3[44] = _mm256_madd_epi16(lstep1[34], k__pOne_mOne);
1481           lstep3[45] = _mm256_madd_epi16(lstep1[35], k__pOne_mOne);
1482           lstep3[46] = _mm256_madd_epi16(lstep1[32], k__pOne_mOne);
1483           lstep3[47] = _mm256_madd_epi16(lstep1[33], k__pOne_mOne);
1484 
1485           lstep3[48] = _mm256_madd_epi16(lstep1[62], k__pOne_mOne);
1486           lstep3[49] = _mm256_madd_epi16(lstep1[63], k__pOne_mOne);
1487           lstep3[50] = _mm256_madd_epi16(lstep1[60], k__pOne_mOne);
1488           lstep3[51] = _mm256_madd_epi16(lstep1[61], k__pOne_mOne);
1489           lstep3[52] = _mm256_madd_epi16(lstep1[58], k__pOne_mOne);
1490           lstep3[53] = _mm256_madd_epi16(lstep1[59], k__pOne_mOne);
1491           lstep3[54] = _mm256_madd_epi16(lstep1[56], k__pOne_mOne);
1492           lstep3[55] = _mm256_madd_epi16(lstep1[57], k__pOne_mOne);
1493 
1494           lstep3[56] = _mm256_madd_epi16(lstep1[56], kOne);
1495           lstep3[57] = _mm256_madd_epi16(lstep1[57], kOne);
1496           lstep3[58] = _mm256_madd_epi16(lstep1[58], kOne);
1497           lstep3[59] = _mm256_madd_epi16(lstep1[59], kOne);
1498           lstep3[60] = _mm256_madd_epi16(lstep1[60], kOne);
1499           lstep3[61] = _mm256_madd_epi16(lstep1[61], kOne);
1500           lstep3[62] = _mm256_madd_epi16(lstep1[62], kOne);
1501           lstep3[63] = _mm256_madd_epi16(lstep1[63], kOne);
1502         }
1503 
1504         // stage 4
1505         {
1506           // expanding to 32-bit length prior to addition operations
1507           sign[0] = _mm256_cmpgt_epi16(kZero, step2[8]);
1508           sign[1] = _mm256_cmpgt_epi16(kZero, step2[9]);
1509           sign[2] = _mm256_cmpgt_epi16(kZero, step2[14]);
1510           sign[3] = _mm256_cmpgt_epi16(kZero, step2[15]);
1511           lstep2[16] = _mm256_unpacklo_epi16(step2[8], sign[0]);
1512           lstep2[17] = _mm256_unpackhi_epi16(step2[8], sign[0]);
1513           lstep2[18] = _mm256_unpacklo_epi16(step2[9], sign[1]);
1514           lstep2[19] = _mm256_unpackhi_epi16(step2[9], sign[1]);
1515           lstep2[28] = _mm256_unpacklo_epi16(step2[14], sign[2]);
1516           lstep2[29] = _mm256_unpackhi_epi16(step2[14], sign[2]);
1517           lstep2[30] = _mm256_unpacklo_epi16(step2[15], sign[3]);
1518           lstep2[31] = _mm256_unpackhi_epi16(step2[15], sign[3]);
1519 
1520           lstep1[0] = _mm256_add_epi32(lstep3[6], lstep3[0]);
1521           lstep1[1] = _mm256_add_epi32(lstep3[7], lstep3[1]);
1522           lstep1[2] = _mm256_add_epi32(lstep3[4], lstep3[2]);
1523           lstep1[3] = _mm256_add_epi32(lstep3[5], lstep3[3]);
1524           lstep1[4] = _mm256_sub_epi32(lstep3[2], lstep3[4]);
1525           lstep1[5] = _mm256_sub_epi32(lstep3[3], lstep3[5]);
1526           lstep1[6] = _mm256_sub_epi32(lstep3[0], lstep3[6]);
1527           lstep1[7] = _mm256_sub_epi32(lstep3[1], lstep3[7]);
1528           lstep1[16] = _mm256_add_epi32(lstep3[22], lstep2[16]);
1529           lstep1[17] = _mm256_add_epi32(lstep3[23], lstep2[17]);
1530           lstep1[18] = _mm256_add_epi32(lstep3[20], lstep2[18]);
1531           lstep1[19] = _mm256_add_epi32(lstep3[21], lstep2[19]);
1532           lstep1[20] = _mm256_sub_epi32(lstep2[18], lstep3[20]);
1533           lstep1[21] = _mm256_sub_epi32(lstep2[19], lstep3[21]);
1534           lstep1[22] = _mm256_sub_epi32(lstep2[16], lstep3[22]);
1535           lstep1[23] = _mm256_sub_epi32(lstep2[17], lstep3[23]);
1536           lstep1[24] = _mm256_sub_epi32(lstep2[30], lstep3[24]);
1537           lstep1[25] = _mm256_sub_epi32(lstep2[31], lstep3[25]);
1538           lstep1[26] = _mm256_sub_epi32(lstep2[28], lstep3[26]);
1539           lstep1[27] = _mm256_sub_epi32(lstep2[29], lstep3[27]);
1540           lstep1[28] = _mm256_add_epi32(lstep3[26], lstep2[28]);
1541           lstep1[29] = _mm256_add_epi32(lstep3[27], lstep2[29]);
1542           lstep1[30] = _mm256_add_epi32(lstep3[24], lstep2[30]);
1543           lstep1[31] = _mm256_add_epi32(lstep3[25], lstep2[31]);
1544         }
1545         {
1546           // to be continued...
1547           //
1548           const __m256i k32_p16_p16 =
1549               pair256_set_epi32(cospi_16_64, cospi_16_64);
1550           const __m256i k32_p16_m16 =
1551               pair256_set_epi32(cospi_16_64, -cospi_16_64);
1552 
1553           u[0] = _mm256_unpacklo_epi32(lstep3[12], lstep3[10]);
1554           u[1] = _mm256_unpackhi_epi32(lstep3[12], lstep3[10]);
1555           u[2] = _mm256_unpacklo_epi32(lstep3[13], lstep3[11]);
1556           u[3] = _mm256_unpackhi_epi32(lstep3[13], lstep3[11]);
1557 
1558           // TODO(jingning): manually inline k_madd_epi32_avx2_ to further hide
1559           // instruction latency.
1560           v[0] = k_madd_epi32_avx2(u[0], k32_p16_m16);
1561           v[1] = k_madd_epi32_avx2(u[1], k32_p16_m16);
1562           v[2] = k_madd_epi32_avx2(u[2], k32_p16_m16);
1563           v[3] = k_madd_epi32_avx2(u[3], k32_p16_m16);
1564           v[4] = k_madd_epi32_avx2(u[0], k32_p16_p16);
1565           v[5] = k_madd_epi32_avx2(u[1], k32_p16_p16);
1566           v[6] = k_madd_epi32_avx2(u[2], k32_p16_p16);
1567           v[7] = k_madd_epi32_avx2(u[3], k32_p16_p16);
1568 
1569           u[0] = k_packs_epi64_avx2(v[0], v[1]);
1570           u[1] = k_packs_epi64_avx2(v[2], v[3]);
1571           u[2] = k_packs_epi64_avx2(v[4], v[5]);
1572           u[3] = k_packs_epi64_avx2(v[6], v[7]);
1573 
1574           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
1575           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
1576           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
1577           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
1578 
1579           lstep1[10] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
1580           lstep1[11] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
1581           lstep1[12] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
1582           lstep1[13] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
1583         }
1584         {
1585           const __m256i k32_m08_p24 =
1586               pair256_set_epi32(-cospi_8_64, cospi_24_64);
1587           const __m256i k32_m24_m08 =
1588               pair256_set_epi32(-cospi_24_64, -cospi_8_64);
1589           const __m256i k32_p24_p08 =
1590               pair256_set_epi32(cospi_24_64, cospi_8_64);
1591 
1592           u[0] = _mm256_unpacklo_epi32(lstep3[36], lstep3[58]);
1593           u[1] = _mm256_unpackhi_epi32(lstep3[36], lstep3[58]);
1594           u[2] = _mm256_unpacklo_epi32(lstep3[37], lstep3[59]);
1595           u[3] = _mm256_unpackhi_epi32(lstep3[37], lstep3[59]);
1596           u[4] = _mm256_unpacklo_epi32(lstep3[38], lstep3[56]);
1597           u[5] = _mm256_unpackhi_epi32(lstep3[38], lstep3[56]);
1598           u[6] = _mm256_unpacklo_epi32(lstep3[39], lstep3[57]);
1599           u[7] = _mm256_unpackhi_epi32(lstep3[39], lstep3[57]);
1600           u[8] = _mm256_unpacklo_epi32(lstep3[40], lstep3[54]);
1601           u[9] = _mm256_unpackhi_epi32(lstep3[40], lstep3[54]);
1602           u[10] = _mm256_unpacklo_epi32(lstep3[41], lstep3[55]);
1603           u[11] = _mm256_unpackhi_epi32(lstep3[41], lstep3[55]);
1604           u[12] = _mm256_unpacklo_epi32(lstep3[42], lstep3[52]);
1605           u[13] = _mm256_unpackhi_epi32(lstep3[42], lstep3[52]);
1606           u[14] = _mm256_unpacklo_epi32(lstep3[43], lstep3[53]);
1607           u[15] = _mm256_unpackhi_epi32(lstep3[43], lstep3[53]);
1608 
1609           v[0] = k_madd_epi32_avx2(u[0], k32_m08_p24);
1610           v[1] = k_madd_epi32_avx2(u[1], k32_m08_p24);
1611           v[2] = k_madd_epi32_avx2(u[2], k32_m08_p24);
1612           v[3] = k_madd_epi32_avx2(u[3], k32_m08_p24);
1613           v[4] = k_madd_epi32_avx2(u[4], k32_m08_p24);
1614           v[5] = k_madd_epi32_avx2(u[5], k32_m08_p24);
1615           v[6] = k_madd_epi32_avx2(u[6], k32_m08_p24);
1616           v[7] = k_madd_epi32_avx2(u[7], k32_m08_p24);
1617           v[8] = k_madd_epi32_avx2(u[8], k32_m24_m08);
1618           v[9] = k_madd_epi32_avx2(u[9], k32_m24_m08);
1619           v[10] = k_madd_epi32_avx2(u[10], k32_m24_m08);
1620           v[11] = k_madd_epi32_avx2(u[11], k32_m24_m08);
1621           v[12] = k_madd_epi32_avx2(u[12], k32_m24_m08);
1622           v[13] = k_madd_epi32_avx2(u[13], k32_m24_m08);
1623           v[14] = k_madd_epi32_avx2(u[14], k32_m24_m08);
1624           v[15] = k_madd_epi32_avx2(u[15], k32_m24_m08);
1625           v[16] = k_madd_epi32_avx2(u[12], k32_m08_p24);
1626           v[17] = k_madd_epi32_avx2(u[13], k32_m08_p24);
1627           v[18] = k_madd_epi32_avx2(u[14], k32_m08_p24);
1628           v[19] = k_madd_epi32_avx2(u[15], k32_m08_p24);
1629           v[20] = k_madd_epi32_avx2(u[8], k32_m08_p24);
1630           v[21] = k_madd_epi32_avx2(u[9], k32_m08_p24);
1631           v[22] = k_madd_epi32_avx2(u[10], k32_m08_p24);
1632           v[23] = k_madd_epi32_avx2(u[11], k32_m08_p24);
1633           v[24] = k_madd_epi32_avx2(u[4], k32_p24_p08);
1634           v[25] = k_madd_epi32_avx2(u[5], k32_p24_p08);
1635           v[26] = k_madd_epi32_avx2(u[6], k32_p24_p08);
1636           v[27] = k_madd_epi32_avx2(u[7], k32_p24_p08);
1637           v[28] = k_madd_epi32_avx2(u[0], k32_p24_p08);
1638           v[29] = k_madd_epi32_avx2(u[1], k32_p24_p08);
1639           v[30] = k_madd_epi32_avx2(u[2], k32_p24_p08);
1640           v[31] = k_madd_epi32_avx2(u[3], k32_p24_p08);
1641 
1642           u[0] = k_packs_epi64_avx2(v[0], v[1]);
1643           u[1] = k_packs_epi64_avx2(v[2], v[3]);
1644           u[2] = k_packs_epi64_avx2(v[4], v[5]);
1645           u[3] = k_packs_epi64_avx2(v[6], v[7]);
1646           u[4] = k_packs_epi64_avx2(v[8], v[9]);
1647           u[5] = k_packs_epi64_avx2(v[10], v[11]);
1648           u[6] = k_packs_epi64_avx2(v[12], v[13]);
1649           u[7] = k_packs_epi64_avx2(v[14], v[15]);
1650           u[8] = k_packs_epi64_avx2(v[16], v[17]);
1651           u[9] = k_packs_epi64_avx2(v[18], v[19]);
1652           u[10] = k_packs_epi64_avx2(v[20], v[21]);
1653           u[11] = k_packs_epi64_avx2(v[22], v[23]);
1654           u[12] = k_packs_epi64_avx2(v[24], v[25]);
1655           u[13] = k_packs_epi64_avx2(v[26], v[27]);
1656           u[14] = k_packs_epi64_avx2(v[28], v[29]);
1657           u[15] = k_packs_epi64_avx2(v[30], v[31]);
1658 
1659           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
1660           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
1661           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
1662           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
1663           v[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
1664           v[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
1665           v[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
1666           v[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
1667           v[8] = _mm256_add_epi32(u[8], k__DCT_CONST_ROUNDING);
1668           v[9] = _mm256_add_epi32(u[9], k__DCT_CONST_ROUNDING);
1669           v[10] = _mm256_add_epi32(u[10], k__DCT_CONST_ROUNDING);
1670           v[11] = _mm256_add_epi32(u[11], k__DCT_CONST_ROUNDING);
1671           v[12] = _mm256_add_epi32(u[12], k__DCT_CONST_ROUNDING);
1672           v[13] = _mm256_add_epi32(u[13], k__DCT_CONST_ROUNDING);
1673           v[14] = _mm256_add_epi32(u[14], k__DCT_CONST_ROUNDING);
1674           v[15] = _mm256_add_epi32(u[15], k__DCT_CONST_ROUNDING);
1675 
1676           lstep1[36] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
1677           lstep1[37] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
1678           lstep1[38] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
1679           lstep1[39] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
1680           lstep1[40] = _mm256_srai_epi32(v[4], DCT_CONST_BITS);
1681           lstep1[41] = _mm256_srai_epi32(v[5], DCT_CONST_BITS);
1682           lstep1[42] = _mm256_srai_epi32(v[6], DCT_CONST_BITS);
1683           lstep1[43] = _mm256_srai_epi32(v[7], DCT_CONST_BITS);
1684           lstep1[52] = _mm256_srai_epi32(v[8], DCT_CONST_BITS);
1685           lstep1[53] = _mm256_srai_epi32(v[9], DCT_CONST_BITS);
1686           lstep1[54] = _mm256_srai_epi32(v[10], DCT_CONST_BITS);
1687           lstep1[55] = _mm256_srai_epi32(v[11], DCT_CONST_BITS);
1688           lstep1[56] = _mm256_srai_epi32(v[12], DCT_CONST_BITS);
1689           lstep1[57] = _mm256_srai_epi32(v[13], DCT_CONST_BITS);
1690           lstep1[58] = _mm256_srai_epi32(v[14], DCT_CONST_BITS);
1691           lstep1[59] = _mm256_srai_epi32(v[15], DCT_CONST_BITS);
1692         }
1693         // stage 5
1694         {
1695           lstep2[8] = _mm256_add_epi32(lstep1[10], lstep3[8]);
1696           lstep2[9] = _mm256_add_epi32(lstep1[11], lstep3[9]);
1697           lstep2[10] = _mm256_sub_epi32(lstep3[8], lstep1[10]);
1698           lstep2[11] = _mm256_sub_epi32(lstep3[9], lstep1[11]);
1699           lstep2[12] = _mm256_sub_epi32(lstep3[14], lstep1[12]);
1700           lstep2[13] = _mm256_sub_epi32(lstep3[15], lstep1[13]);
1701           lstep2[14] = _mm256_add_epi32(lstep1[12], lstep3[14]);
1702           lstep2[15] = _mm256_add_epi32(lstep1[13], lstep3[15]);
1703         }
1704         {
1705           const __m256i k32_p16_p16 =
1706               pair256_set_epi32(cospi_16_64, cospi_16_64);
1707           const __m256i k32_p16_m16 =
1708               pair256_set_epi32(cospi_16_64, -cospi_16_64);
1709           const __m256i k32_p24_p08 =
1710               pair256_set_epi32(cospi_24_64, cospi_8_64);
1711           const __m256i k32_m08_p24 =
1712               pair256_set_epi32(-cospi_8_64, cospi_24_64);
1713 
1714           u[0] = _mm256_unpacklo_epi32(lstep1[0], lstep1[2]);
1715           u[1] = _mm256_unpackhi_epi32(lstep1[0], lstep1[2]);
1716           u[2] = _mm256_unpacklo_epi32(lstep1[1], lstep1[3]);
1717           u[3] = _mm256_unpackhi_epi32(lstep1[1], lstep1[3]);
1718           u[4] = _mm256_unpacklo_epi32(lstep1[4], lstep1[6]);
1719           u[5] = _mm256_unpackhi_epi32(lstep1[4], lstep1[6]);
1720           u[6] = _mm256_unpacklo_epi32(lstep1[5], lstep1[7]);
1721           u[7] = _mm256_unpackhi_epi32(lstep1[5], lstep1[7]);
1722 
1723           // TODO(jingning): manually inline k_madd_epi32_avx2_ to further hide
1724           // instruction latency.
1725           v[0] = k_madd_epi32_avx2(u[0], k32_p16_p16);
1726           v[1] = k_madd_epi32_avx2(u[1], k32_p16_p16);
1727           v[2] = k_madd_epi32_avx2(u[2], k32_p16_p16);
1728           v[3] = k_madd_epi32_avx2(u[3], k32_p16_p16);
1729           v[4] = k_madd_epi32_avx2(u[0], k32_p16_m16);
1730           v[5] = k_madd_epi32_avx2(u[1], k32_p16_m16);
1731           v[6] = k_madd_epi32_avx2(u[2], k32_p16_m16);
1732           v[7] = k_madd_epi32_avx2(u[3], k32_p16_m16);
1733           v[8] = k_madd_epi32_avx2(u[4], k32_p24_p08);
1734           v[9] = k_madd_epi32_avx2(u[5], k32_p24_p08);
1735           v[10] = k_madd_epi32_avx2(u[6], k32_p24_p08);
1736           v[11] = k_madd_epi32_avx2(u[7], k32_p24_p08);
1737           v[12] = k_madd_epi32_avx2(u[4], k32_m08_p24);
1738           v[13] = k_madd_epi32_avx2(u[5], k32_m08_p24);
1739           v[14] = k_madd_epi32_avx2(u[6], k32_m08_p24);
1740           v[15] = k_madd_epi32_avx2(u[7], k32_m08_p24);
1741 
1742           u[0] = k_packs_epi64_avx2(v[0], v[1]);
1743           u[1] = k_packs_epi64_avx2(v[2], v[3]);
1744           u[2] = k_packs_epi64_avx2(v[4], v[5]);
1745           u[3] = k_packs_epi64_avx2(v[6], v[7]);
1746           u[4] = k_packs_epi64_avx2(v[8], v[9]);
1747           u[5] = k_packs_epi64_avx2(v[10], v[11]);
1748           u[6] = k_packs_epi64_avx2(v[12], v[13]);
1749           u[7] = k_packs_epi64_avx2(v[14], v[15]);
1750 
1751           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
1752           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
1753           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
1754           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
1755           v[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
1756           v[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
1757           v[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
1758           v[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
1759 
1760           u[0] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
1761           u[1] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
1762           u[2] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
1763           u[3] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
1764           u[4] = _mm256_srai_epi32(v[4], DCT_CONST_BITS);
1765           u[5] = _mm256_srai_epi32(v[5], DCT_CONST_BITS);
1766           u[6] = _mm256_srai_epi32(v[6], DCT_CONST_BITS);
1767           u[7] = _mm256_srai_epi32(v[7], DCT_CONST_BITS);
1768 
1769           sign[0] = _mm256_cmpgt_epi32(kZero, u[0]);
1770           sign[1] = _mm256_cmpgt_epi32(kZero, u[1]);
1771           sign[2] = _mm256_cmpgt_epi32(kZero, u[2]);
1772           sign[3] = _mm256_cmpgt_epi32(kZero, u[3]);
1773           sign[4] = _mm256_cmpgt_epi32(kZero, u[4]);
1774           sign[5] = _mm256_cmpgt_epi32(kZero, u[5]);
1775           sign[6] = _mm256_cmpgt_epi32(kZero, u[6]);
1776           sign[7] = _mm256_cmpgt_epi32(kZero, u[7]);
1777 
1778           u[0] = _mm256_sub_epi32(u[0], sign[0]);
1779           u[1] = _mm256_sub_epi32(u[1], sign[1]);
1780           u[2] = _mm256_sub_epi32(u[2], sign[2]);
1781           u[3] = _mm256_sub_epi32(u[3], sign[3]);
1782           u[4] = _mm256_sub_epi32(u[4], sign[4]);
1783           u[5] = _mm256_sub_epi32(u[5], sign[5]);
1784           u[6] = _mm256_sub_epi32(u[6], sign[6]);
1785           u[7] = _mm256_sub_epi32(u[7], sign[7]);
1786 
1787           u[0] = _mm256_add_epi32(u[0], K32One);
1788           u[1] = _mm256_add_epi32(u[1], K32One);
1789           u[2] = _mm256_add_epi32(u[2], K32One);
1790           u[3] = _mm256_add_epi32(u[3], K32One);
1791           u[4] = _mm256_add_epi32(u[4], K32One);
1792           u[5] = _mm256_add_epi32(u[5], K32One);
1793           u[6] = _mm256_add_epi32(u[6], K32One);
1794           u[7] = _mm256_add_epi32(u[7], K32One);
1795 
1796           u[0] = _mm256_srai_epi32(u[0], 2);
1797           u[1] = _mm256_srai_epi32(u[1], 2);
1798           u[2] = _mm256_srai_epi32(u[2], 2);
1799           u[3] = _mm256_srai_epi32(u[3], 2);
1800           u[4] = _mm256_srai_epi32(u[4], 2);
1801           u[5] = _mm256_srai_epi32(u[5], 2);
1802           u[6] = _mm256_srai_epi32(u[6], 2);
1803           u[7] = _mm256_srai_epi32(u[7], 2);
1804 
1805           // Combine
1806           out[0] = _mm256_packs_epi32(u[0], u[1]);
1807           out[16] = _mm256_packs_epi32(u[2], u[3]);
1808           out[8] = _mm256_packs_epi32(u[4], u[5]);
1809           out[24] = _mm256_packs_epi32(u[6], u[7]);
1810         }
1811         {
1812           const __m256i k32_m08_p24 =
1813               pair256_set_epi32(-cospi_8_64, cospi_24_64);
1814           const __m256i k32_m24_m08 =
1815               pair256_set_epi32(-cospi_24_64, -cospi_8_64);
1816           const __m256i k32_p24_p08 =
1817               pair256_set_epi32(cospi_24_64, cospi_8_64);
1818 
1819           u[0] = _mm256_unpacklo_epi32(lstep1[18], lstep1[28]);
1820           u[1] = _mm256_unpackhi_epi32(lstep1[18], lstep1[28]);
1821           u[2] = _mm256_unpacklo_epi32(lstep1[19], lstep1[29]);
1822           u[3] = _mm256_unpackhi_epi32(lstep1[19], lstep1[29]);
1823           u[4] = _mm256_unpacklo_epi32(lstep1[20], lstep1[26]);
1824           u[5] = _mm256_unpackhi_epi32(lstep1[20], lstep1[26]);
1825           u[6] = _mm256_unpacklo_epi32(lstep1[21], lstep1[27]);
1826           u[7] = _mm256_unpackhi_epi32(lstep1[21], lstep1[27]);
1827 
1828           v[0] = k_madd_epi32_avx2(u[0], k32_m08_p24);
1829           v[1] = k_madd_epi32_avx2(u[1], k32_m08_p24);
1830           v[2] = k_madd_epi32_avx2(u[2], k32_m08_p24);
1831           v[3] = k_madd_epi32_avx2(u[3], k32_m08_p24);
1832           v[4] = k_madd_epi32_avx2(u[4], k32_m24_m08);
1833           v[5] = k_madd_epi32_avx2(u[5], k32_m24_m08);
1834           v[6] = k_madd_epi32_avx2(u[6], k32_m24_m08);
1835           v[7] = k_madd_epi32_avx2(u[7], k32_m24_m08);
1836           v[8] = k_madd_epi32_avx2(u[4], k32_m08_p24);
1837           v[9] = k_madd_epi32_avx2(u[5], k32_m08_p24);
1838           v[10] = k_madd_epi32_avx2(u[6], k32_m08_p24);
1839           v[11] = k_madd_epi32_avx2(u[7], k32_m08_p24);
1840           v[12] = k_madd_epi32_avx2(u[0], k32_p24_p08);
1841           v[13] = k_madd_epi32_avx2(u[1], k32_p24_p08);
1842           v[14] = k_madd_epi32_avx2(u[2], k32_p24_p08);
1843           v[15] = k_madd_epi32_avx2(u[3], k32_p24_p08);
1844 
1845           u[0] = k_packs_epi64_avx2(v[0], v[1]);
1846           u[1] = k_packs_epi64_avx2(v[2], v[3]);
1847           u[2] = k_packs_epi64_avx2(v[4], v[5]);
1848           u[3] = k_packs_epi64_avx2(v[6], v[7]);
1849           u[4] = k_packs_epi64_avx2(v[8], v[9]);
1850           u[5] = k_packs_epi64_avx2(v[10], v[11]);
1851           u[6] = k_packs_epi64_avx2(v[12], v[13]);
1852           u[7] = k_packs_epi64_avx2(v[14], v[15]);
1853 
1854           u[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
1855           u[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
1856           u[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
1857           u[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
1858           u[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
1859           u[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
1860           u[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
1861           u[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
1862 
1863           lstep2[18] = _mm256_srai_epi32(u[0], DCT_CONST_BITS);
1864           lstep2[19] = _mm256_srai_epi32(u[1], DCT_CONST_BITS);
1865           lstep2[20] = _mm256_srai_epi32(u[2], DCT_CONST_BITS);
1866           lstep2[21] = _mm256_srai_epi32(u[3], DCT_CONST_BITS);
1867           lstep2[26] = _mm256_srai_epi32(u[4], DCT_CONST_BITS);
1868           lstep2[27] = _mm256_srai_epi32(u[5], DCT_CONST_BITS);
1869           lstep2[28] = _mm256_srai_epi32(u[6], DCT_CONST_BITS);
1870           lstep2[29] = _mm256_srai_epi32(u[7], DCT_CONST_BITS);
1871         }
1872         {
1873           lstep2[32] = _mm256_add_epi32(lstep1[38], lstep3[32]);
1874           lstep2[33] = _mm256_add_epi32(lstep1[39], lstep3[33]);
1875           lstep2[34] = _mm256_add_epi32(lstep1[36], lstep3[34]);
1876           lstep2[35] = _mm256_add_epi32(lstep1[37], lstep3[35]);
1877           lstep2[36] = _mm256_sub_epi32(lstep3[34], lstep1[36]);
1878           lstep2[37] = _mm256_sub_epi32(lstep3[35], lstep1[37]);
1879           lstep2[38] = _mm256_sub_epi32(lstep3[32], lstep1[38]);
1880           lstep2[39] = _mm256_sub_epi32(lstep3[33], lstep1[39]);
1881           lstep2[40] = _mm256_sub_epi32(lstep3[46], lstep1[40]);
1882           lstep2[41] = _mm256_sub_epi32(lstep3[47], lstep1[41]);
1883           lstep2[42] = _mm256_sub_epi32(lstep3[44], lstep1[42]);
1884           lstep2[43] = _mm256_sub_epi32(lstep3[45], lstep1[43]);
1885           lstep2[44] = _mm256_add_epi32(lstep1[42], lstep3[44]);
1886           lstep2[45] = _mm256_add_epi32(lstep1[43], lstep3[45]);
1887           lstep2[46] = _mm256_add_epi32(lstep1[40], lstep3[46]);
1888           lstep2[47] = _mm256_add_epi32(lstep1[41], lstep3[47]);
1889           lstep2[48] = _mm256_add_epi32(lstep1[54], lstep3[48]);
1890           lstep2[49] = _mm256_add_epi32(lstep1[55], lstep3[49]);
1891           lstep2[50] = _mm256_add_epi32(lstep1[52], lstep3[50]);
1892           lstep2[51] = _mm256_add_epi32(lstep1[53], lstep3[51]);
1893           lstep2[52] = _mm256_sub_epi32(lstep3[50], lstep1[52]);
1894           lstep2[53] = _mm256_sub_epi32(lstep3[51], lstep1[53]);
1895           lstep2[54] = _mm256_sub_epi32(lstep3[48], lstep1[54]);
1896           lstep2[55] = _mm256_sub_epi32(lstep3[49], lstep1[55]);
1897           lstep2[56] = _mm256_sub_epi32(lstep3[62], lstep1[56]);
1898           lstep2[57] = _mm256_sub_epi32(lstep3[63], lstep1[57]);
1899           lstep2[58] = _mm256_sub_epi32(lstep3[60], lstep1[58]);
1900           lstep2[59] = _mm256_sub_epi32(lstep3[61], lstep1[59]);
1901           lstep2[60] = _mm256_add_epi32(lstep1[58], lstep3[60]);
1902           lstep2[61] = _mm256_add_epi32(lstep1[59], lstep3[61]);
1903           lstep2[62] = _mm256_add_epi32(lstep1[56], lstep3[62]);
1904           lstep2[63] = _mm256_add_epi32(lstep1[57], lstep3[63]);
1905         }
1906         // stage 6
1907         {
1908           const __m256i k32_p28_p04 =
1909               pair256_set_epi32(cospi_28_64, cospi_4_64);
1910           const __m256i k32_p12_p20 =
1911               pair256_set_epi32(cospi_12_64, cospi_20_64);
1912           const __m256i k32_m20_p12 =
1913               pair256_set_epi32(-cospi_20_64, cospi_12_64);
1914           const __m256i k32_m04_p28 =
1915               pair256_set_epi32(-cospi_4_64, cospi_28_64);
1916 
1917           u[0] = _mm256_unpacklo_epi32(lstep2[8], lstep2[14]);
1918           u[1] = _mm256_unpackhi_epi32(lstep2[8], lstep2[14]);
1919           u[2] = _mm256_unpacklo_epi32(lstep2[9], lstep2[15]);
1920           u[3] = _mm256_unpackhi_epi32(lstep2[9], lstep2[15]);
1921           u[4] = _mm256_unpacklo_epi32(lstep2[10], lstep2[12]);
1922           u[5] = _mm256_unpackhi_epi32(lstep2[10], lstep2[12]);
1923           u[6] = _mm256_unpacklo_epi32(lstep2[11], lstep2[13]);
1924           u[7] = _mm256_unpackhi_epi32(lstep2[11], lstep2[13]);
1925           u[8] = _mm256_unpacklo_epi32(lstep2[10], lstep2[12]);
1926           u[9] = _mm256_unpackhi_epi32(lstep2[10], lstep2[12]);
1927           u[10] = _mm256_unpacklo_epi32(lstep2[11], lstep2[13]);
1928           u[11] = _mm256_unpackhi_epi32(lstep2[11], lstep2[13]);
1929           u[12] = _mm256_unpacklo_epi32(lstep2[8], lstep2[14]);
1930           u[13] = _mm256_unpackhi_epi32(lstep2[8], lstep2[14]);
1931           u[14] = _mm256_unpacklo_epi32(lstep2[9], lstep2[15]);
1932           u[15] = _mm256_unpackhi_epi32(lstep2[9], lstep2[15]);
1933 
1934           v[0] = k_madd_epi32_avx2(u[0], k32_p28_p04);
1935           v[1] = k_madd_epi32_avx2(u[1], k32_p28_p04);
1936           v[2] = k_madd_epi32_avx2(u[2], k32_p28_p04);
1937           v[3] = k_madd_epi32_avx2(u[3], k32_p28_p04);
1938           v[4] = k_madd_epi32_avx2(u[4], k32_p12_p20);
1939           v[5] = k_madd_epi32_avx2(u[5], k32_p12_p20);
1940           v[6] = k_madd_epi32_avx2(u[6], k32_p12_p20);
1941           v[7] = k_madd_epi32_avx2(u[7], k32_p12_p20);
1942           v[8] = k_madd_epi32_avx2(u[8], k32_m20_p12);
1943           v[9] = k_madd_epi32_avx2(u[9], k32_m20_p12);
1944           v[10] = k_madd_epi32_avx2(u[10], k32_m20_p12);
1945           v[11] = k_madd_epi32_avx2(u[11], k32_m20_p12);
1946           v[12] = k_madd_epi32_avx2(u[12], k32_m04_p28);
1947           v[13] = k_madd_epi32_avx2(u[13], k32_m04_p28);
1948           v[14] = k_madd_epi32_avx2(u[14], k32_m04_p28);
1949           v[15] = k_madd_epi32_avx2(u[15], k32_m04_p28);
1950 
1951           u[0] = k_packs_epi64_avx2(v[0], v[1]);
1952           u[1] = k_packs_epi64_avx2(v[2], v[3]);
1953           u[2] = k_packs_epi64_avx2(v[4], v[5]);
1954           u[3] = k_packs_epi64_avx2(v[6], v[7]);
1955           u[4] = k_packs_epi64_avx2(v[8], v[9]);
1956           u[5] = k_packs_epi64_avx2(v[10], v[11]);
1957           u[6] = k_packs_epi64_avx2(v[12], v[13]);
1958           u[7] = k_packs_epi64_avx2(v[14], v[15]);
1959 
1960           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
1961           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
1962           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
1963           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
1964           v[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
1965           v[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
1966           v[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
1967           v[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
1968 
1969           u[0] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
1970           u[1] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
1971           u[2] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
1972           u[3] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
1973           u[4] = _mm256_srai_epi32(v[4], DCT_CONST_BITS);
1974           u[5] = _mm256_srai_epi32(v[5], DCT_CONST_BITS);
1975           u[6] = _mm256_srai_epi32(v[6], DCT_CONST_BITS);
1976           u[7] = _mm256_srai_epi32(v[7], DCT_CONST_BITS);
1977 
1978           sign[0] = _mm256_cmpgt_epi32(kZero, u[0]);
1979           sign[1] = _mm256_cmpgt_epi32(kZero, u[1]);
1980           sign[2] = _mm256_cmpgt_epi32(kZero, u[2]);
1981           sign[3] = _mm256_cmpgt_epi32(kZero, u[3]);
1982           sign[4] = _mm256_cmpgt_epi32(kZero, u[4]);
1983           sign[5] = _mm256_cmpgt_epi32(kZero, u[5]);
1984           sign[6] = _mm256_cmpgt_epi32(kZero, u[6]);
1985           sign[7] = _mm256_cmpgt_epi32(kZero, u[7]);
1986 
1987           u[0] = _mm256_sub_epi32(u[0], sign[0]);
1988           u[1] = _mm256_sub_epi32(u[1], sign[1]);
1989           u[2] = _mm256_sub_epi32(u[2], sign[2]);
1990           u[3] = _mm256_sub_epi32(u[3], sign[3]);
1991           u[4] = _mm256_sub_epi32(u[4], sign[4]);
1992           u[5] = _mm256_sub_epi32(u[5], sign[5]);
1993           u[6] = _mm256_sub_epi32(u[6], sign[6]);
1994           u[7] = _mm256_sub_epi32(u[7], sign[7]);
1995 
1996           u[0] = _mm256_add_epi32(u[0], K32One);
1997           u[1] = _mm256_add_epi32(u[1], K32One);
1998           u[2] = _mm256_add_epi32(u[2], K32One);
1999           u[3] = _mm256_add_epi32(u[3], K32One);
2000           u[4] = _mm256_add_epi32(u[4], K32One);
2001           u[5] = _mm256_add_epi32(u[5], K32One);
2002           u[6] = _mm256_add_epi32(u[6], K32One);
2003           u[7] = _mm256_add_epi32(u[7], K32One);
2004 
2005           u[0] = _mm256_srai_epi32(u[0], 2);
2006           u[1] = _mm256_srai_epi32(u[1], 2);
2007           u[2] = _mm256_srai_epi32(u[2], 2);
2008           u[3] = _mm256_srai_epi32(u[3], 2);
2009           u[4] = _mm256_srai_epi32(u[4], 2);
2010           u[5] = _mm256_srai_epi32(u[5], 2);
2011           u[6] = _mm256_srai_epi32(u[6], 2);
2012           u[7] = _mm256_srai_epi32(u[7], 2);
2013 
2014           out[4] = _mm256_packs_epi32(u[0], u[1]);
2015           out[20] = _mm256_packs_epi32(u[2], u[3]);
2016           out[12] = _mm256_packs_epi32(u[4], u[5]);
2017           out[28] = _mm256_packs_epi32(u[6], u[7]);
2018         }
2019         {
2020           lstep3[16] = _mm256_add_epi32(lstep2[18], lstep1[16]);
2021           lstep3[17] = _mm256_add_epi32(lstep2[19], lstep1[17]);
2022           lstep3[18] = _mm256_sub_epi32(lstep1[16], lstep2[18]);
2023           lstep3[19] = _mm256_sub_epi32(lstep1[17], lstep2[19]);
2024           lstep3[20] = _mm256_sub_epi32(lstep1[22], lstep2[20]);
2025           lstep3[21] = _mm256_sub_epi32(lstep1[23], lstep2[21]);
2026           lstep3[22] = _mm256_add_epi32(lstep2[20], lstep1[22]);
2027           lstep3[23] = _mm256_add_epi32(lstep2[21], lstep1[23]);
2028           lstep3[24] = _mm256_add_epi32(lstep2[26], lstep1[24]);
2029           lstep3[25] = _mm256_add_epi32(lstep2[27], lstep1[25]);
2030           lstep3[26] = _mm256_sub_epi32(lstep1[24], lstep2[26]);
2031           lstep3[27] = _mm256_sub_epi32(lstep1[25], lstep2[27]);
2032           lstep3[28] = _mm256_sub_epi32(lstep1[30], lstep2[28]);
2033           lstep3[29] = _mm256_sub_epi32(lstep1[31], lstep2[29]);
2034           lstep3[30] = _mm256_add_epi32(lstep2[28], lstep1[30]);
2035           lstep3[31] = _mm256_add_epi32(lstep2[29], lstep1[31]);
2036         }
2037         {
2038           const __m256i k32_m04_p28 =
2039               pair256_set_epi32(-cospi_4_64, cospi_28_64);
2040           const __m256i k32_m28_m04 =
2041               pair256_set_epi32(-cospi_28_64, -cospi_4_64);
2042           const __m256i k32_m20_p12 =
2043               pair256_set_epi32(-cospi_20_64, cospi_12_64);
2044           const __m256i k32_m12_m20 =
2045               pair256_set_epi32(-cospi_12_64, -cospi_20_64);
2046           const __m256i k32_p12_p20 =
2047               pair256_set_epi32(cospi_12_64, cospi_20_64);
2048           const __m256i k32_p28_p04 =
2049               pair256_set_epi32(cospi_28_64, cospi_4_64);
2050 
2051           u[0] = _mm256_unpacklo_epi32(lstep2[34], lstep2[60]);
2052           u[1] = _mm256_unpackhi_epi32(lstep2[34], lstep2[60]);
2053           u[2] = _mm256_unpacklo_epi32(lstep2[35], lstep2[61]);
2054           u[3] = _mm256_unpackhi_epi32(lstep2[35], lstep2[61]);
2055           u[4] = _mm256_unpacklo_epi32(lstep2[36], lstep2[58]);
2056           u[5] = _mm256_unpackhi_epi32(lstep2[36], lstep2[58]);
2057           u[6] = _mm256_unpacklo_epi32(lstep2[37], lstep2[59]);
2058           u[7] = _mm256_unpackhi_epi32(lstep2[37], lstep2[59]);
2059           u[8] = _mm256_unpacklo_epi32(lstep2[42], lstep2[52]);
2060           u[9] = _mm256_unpackhi_epi32(lstep2[42], lstep2[52]);
2061           u[10] = _mm256_unpacklo_epi32(lstep2[43], lstep2[53]);
2062           u[11] = _mm256_unpackhi_epi32(lstep2[43], lstep2[53]);
2063           u[12] = _mm256_unpacklo_epi32(lstep2[44], lstep2[50]);
2064           u[13] = _mm256_unpackhi_epi32(lstep2[44], lstep2[50]);
2065           u[14] = _mm256_unpacklo_epi32(lstep2[45], lstep2[51]);
2066           u[15] = _mm256_unpackhi_epi32(lstep2[45], lstep2[51]);
2067 
2068           v[0] = k_madd_epi32_avx2(u[0], k32_m04_p28);
2069           v[1] = k_madd_epi32_avx2(u[1], k32_m04_p28);
2070           v[2] = k_madd_epi32_avx2(u[2], k32_m04_p28);
2071           v[3] = k_madd_epi32_avx2(u[3], k32_m04_p28);
2072           v[4] = k_madd_epi32_avx2(u[4], k32_m28_m04);
2073           v[5] = k_madd_epi32_avx2(u[5], k32_m28_m04);
2074           v[6] = k_madd_epi32_avx2(u[6], k32_m28_m04);
2075           v[7] = k_madd_epi32_avx2(u[7], k32_m28_m04);
2076           v[8] = k_madd_epi32_avx2(u[8], k32_m20_p12);
2077           v[9] = k_madd_epi32_avx2(u[9], k32_m20_p12);
2078           v[10] = k_madd_epi32_avx2(u[10], k32_m20_p12);
2079           v[11] = k_madd_epi32_avx2(u[11], k32_m20_p12);
2080           v[12] = k_madd_epi32_avx2(u[12], k32_m12_m20);
2081           v[13] = k_madd_epi32_avx2(u[13], k32_m12_m20);
2082           v[14] = k_madd_epi32_avx2(u[14], k32_m12_m20);
2083           v[15] = k_madd_epi32_avx2(u[15], k32_m12_m20);
2084           v[16] = k_madd_epi32_avx2(u[12], k32_m20_p12);
2085           v[17] = k_madd_epi32_avx2(u[13], k32_m20_p12);
2086           v[18] = k_madd_epi32_avx2(u[14], k32_m20_p12);
2087           v[19] = k_madd_epi32_avx2(u[15], k32_m20_p12);
2088           v[20] = k_madd_epi32_avx2(u[8], k32_p12_p20);
2089           v[21] = k_madd_epi32_avx2(u[9], k32_p12_p20);
2090           v[22] = k_madd_epi32_avx2(u[10], k32_p12_p20);
2091           v[23] = k_madd_epi32_avx2(u[11], k32_p12_p20);
2092           v[24] = k_madd_epi32_avx2(u[4], k32_m04_p28);
2093           v[25] = k_madd_epi32_avx2(u[5], k32_m04_p28);
2094           v[26] = k_madd_epi32_avx2(u[6], k32_m04_p28);
2095           v[27] = k_madd_epi32_avx2(u[7], k32_m04_p28);
2096           v[28] = k_madd_epi32_avx2(u[0], k32_p28_p04);
2097           v[29] = k_madd_epi32_avx2(u[1], k32_p28_p04);
2098           v[30] = k_madd_epi32_avx2(u[2], k32_p28_p04);
2099           v[31] = k_madd_epi32_avx2(u[3], k32_p28_p04);
2100 
2101           u[0] = k_packs_epi64_avx2(v[0], v[1]);
2102           u[1] = k_packs_epi64_avx2(v[2], v[3]);
2103           u[2] = k_packs_epi64_avx2(v[4], v[5]);
2104           u[3] = k_packs_epi64_avx2(v[6], v[7]);
2105           u[4] = k_packs_epi64_avx2(v[8], v[9]);
2106           u[5] = k_packs_epi64_avx2(v[10], v[11]);
2107           u[6] = k_packs_epi64_avx2(v[12], v[13]);
2108           u[7] = k_packs_epi64_avx2(v[14], v[15]);
2109           u[8] = k_packs_epi64_avx2(v[16], v[17]);
2110           u[9] = k_packs_epi64_avx2(v[18], v[19]);
2111           u[10] = k_packs_epi64_avx2(v[20], v[21]);
2112           u[11] = k_packs_epi64_avx2(v[22], v[23]);
2113           u[12] = k_packs_epi64_avx2(v[24], v[25]);
2114           u[13] = k_packs_epi64_avx2(v[26], v[27]);
2115           u[14] = k_packs_epi64_avx2(v[28], v[29]);
2116           u[15] = k_packs_epi64_avx2(v[30], v[31]);
2117 
2118           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
2119           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
2120           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
2121           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
2122           v[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
2123           v[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
2124           v[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
2125           v[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
2126           v[8] = _mm256_add_epi32(u[8], k__DCT_CONST_ROUNDING);
2127           v[9] = _mm256_add_epi32(u[9], k__DCT_CONST_ROUNDING);
2128           v[10] = _mm256_add_epi32(u[10], k__DCT_CONST_ROUNDING);
2129           v[11] = _mm256_add_epi32(u[11], k__DCT_CONST_ROUNDING);
2130           v[12] = _mm256_add_epi32(u[12], k__DCT_CONST_ROUNDING);
2131           v[13] = _mm256_add_epi32(u[13], k__DCT_CONST_ROUNDING);
2132           v[14] = _mm256_add_epi32(u[14], k__DCT_CONST_ROUNDING);
2133           v[15] = _mm256_add_epi32(u[15], k__DCT_CONST_ROUNDING);
2134 
2135           lstep3[34] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
2136           lstep3[35] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
2137           lstep3[36] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
2138           lstep3[37] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
2139           lstep3[42] = _mm256_srai_epi32(v[4], DCT_CONST_BITS);
2140           lstep3[43] = _mm256_srai_epi32(v[5], DCT_CONST_BITS);
2141           lstep3[44] = _mm256_srai_epi32(v[6], DCT_CONST_BITS);
2142           lstep3[45] = _mm256_srai_epi32(v[7], DCT_CONST_BITS);
2143           lstep3[50] = _mm256_srai_epi32(v[8], DCT_CONST_BITS);
2144           lstep3[51] = _mm256_srai_epi32(v[9], DCT_CONST_BITS);
2145           lstep3[52] = _mm256_srai_epi32(v[10], DCT_CONST_BITS);
2146           lstep3[53] = _mm256_srai_epi32(v[11], DCT_CONST_BITS);
2147           lstep3[58] = _mm256_srai_epi32(v[12], DCT_CONST_BITS);
2148           lstep3[59] = _mm256_srai_epi32(v[13], DCT_CONST_BITS);
2149           lstep3[60] = _mm256_srai_epi32(v[14], DCT_CONST_BITS);
2150           lstep3[61] = _mm256_srai_epi32(v[15], DCT_CONST_BITS);
2151         }
2152         // stage 7
2153         {
2154           const __m256i k32_p30_p02 =
2155               pair256_set_epi32(cospi_30_64, cospi_2_64);
2156           const __m256i k32_p14_p18 =
2157               pair256_set_epi32(cospi_14_64, cospi_18_64);
2158           const __m256i k32_p22_p10 =
2159               pair256_set_epi32(cospi_22_64, cospi_10_64);
2160           const __m256i k32_p06_p26 =
2161               pair256_set_epi32(cospi_6_64, cospi_26_64);
2162           const __m256i k32_m26_p06 =
2163               pair256_set_epi32(-cospi_26_64, cospi_6_64);
2164           const __m256i k32_m10_p22 =
2165               pair256_set_epi32(-cospi_10_64, cospi_22_64);
2166           const __m256i k32_m18_p14 =
2167               pair256_set_epi32(-cospi_18_64, cospi_14_64);
2168           const __m256i k32_m02_p30 =
2169               pair256_set_epi32(-cospi_2_64, cospi_30_64);
2170 
2171           u[0] = _mm256_unpacklo_epi32(lstep3[16], lstep3[30]);
2172           u[1] = _mm256_unpackhi_epi32(lstep3[16], lstep3[30]);
2173           u[2] = _mm256_unpacklo_epi32(lstep3[17], lstep3[31]);
2174           u[3] = _mm256_unpackhi_epi32(lstep3[17], lstep3[31]);
2175           u[4] = _mm256_unpacklo_epi32(lstep3[18], lstep3[28]);
2176           u[5] = _mm256_unpackhi_epi32(lstep3[18], lstep3[28]);
2177           u[6] = _mm256_unpacklo_epi32(lstep3[19], lstep3[29]);
2178           u[7] = _mm256_unpackhi_epi32(lstep3[19], lstep3[29]);
2179           u[8] = _mm256_unpacklo_epi32(lstep3[20], lstep3[26]);
2180           u[9] = _mm256_unpackhi_epi32(lstep3[20], lstep3[26]);
2181           u[10] = _mm256_unpacklo_epi32(lstep3[21], lstep3[27]);
2182           u[11] = _mm256_unpackhi_epi32(lstep3[21], lstep3[27]);
2183           u[12] = _mm256_unpacklo_epi32(lstep3[22], lstep3[24]);
2184           u[13] = _mm256_unpackhi_epi32(lstep3[22], lstep3[24]);
2185           u[14] = _mm256_unpacklo_epi32(lstep3[23], lstep3[25]);
2186           u[15] = _mm256_unpackhi_epi32(lstep3[23], lstep3[25]);
2187 
2188           v[0] = k_madd_epi32_avx2(u[0], k32_p30_p02);
2189           v[1] = k_madd_epi32_avx2(u[1], k32_p30_p02);
2190           v[2] = k_madd_epi32_avx2(u[2], k32_p30_p02);
2191           v[3] = k_madd_epi32_avx2(u[3], k32_p30_p02);
2192           v[4] = k_madd_epi32_avx2(u[4], k32_p14_p18);
2193           v[5] = k_madd_epi32_avx2(u[5], k32_p14_p18);
2194           v[6] = k_madd_epi32_avx2(u[6], k32_p14_p18);
2195           v[7] = k_madd_epi32_avx2(u[7], k32_p14_p18);
2196           v[8] = k_madd_epi32_avx2(u[8], k32_p22_p10);
2197           v[9] = k_madd_epi32_avx2(u[9], k32_p22_p10);
2198           v[10] = k_madd_epi32_avx2(u[10], k32_p22_p10);
2199           v[11] = k_madd_epi32_avx2(u[11], k32_p22_p10);
2200           v[12] = k_madd_epi32_avx2(u[12], k32_p06_p26);
2201           v[13] = k_madd_epi32_avx2(u[13], k32_p06_p26);
2202           v[14] = k_madd_epi32_avx2(u[14], k32_p06_p26);
2203           v[15] = k_madd_epi32_avx2(u[15], k32_p06_p26);
2204           v[16] = k_madd_epi32_avx2(u[12], k32_m26_p06);
2205           v[17] = k_madd_epi32_avx2(u[13], k32_m26_p06);
2206           v[18] = k_madd_epi32_avx2(u[14], k32_m26_p06);
2207           v[19] = k_madd_epi32_avx2(u[15], k32_m26_p06);
2208           v[20] = k_madd_epi32_avx2(u[8], k32_m10_p22);
2209           v[21] = k_madd_epi32_avx2(u[9], k32_m10_p22);
2210           v[22] = k_madd_epi32_avx2(u[10], k32_m10_p22);
2211           v[23] = k_madd_epi32_avx2(u[11], k32_m10_p22);
2212           v[24] = k_madd_epi32_avx2(u[4], k32_m18_p14);
2213           v[25] = k_madd_epi32_avx2(u[5], k32_m18_p14);
2214           v[26] = k_madd_epi32_avx2(u[6], k32_m18_p14);
2215           v[27] = k_madd_epi32_avx2(u[7], k32_m18_p14);
2216           v[28] = k_madd_epi32_avx2(u[0], k32_m02_p30);
2217           v[29] = k_madd_epi32_avx2(u[1], k32_m02_p30);
2218           v[30] = k_madd_epi32_avx2(u[2], k32_m02_p30);
2219           v[31] = k_madd_epi32_avx2(u[3], k32_m02_p30);
2220 
2221           u[0] = k_packs_epi64_avx2(v[0], v[1]);
2222           u[1] = k_packs_epi64_avx2(v[2], v[3]);
2223           u[2] = k_packs_epi64_avx2(v[4], v[5]);
2224           u[3] = k_packs_epi64_avx2(v[6], v[7]);
2225           u[4] = k_packs_epi64_avx2(v[8], v[9]);
2226           u[5] = k_packs_epi64_avx2(v[10], v[11]);
2227           u[6] = k_packs_epi64_avx2(v[12], v[13]);
2228           u[7] = k_packs_epi64_avx2(v[14], v[15]);
2229           u[8] = k_packs_epi64_avx2(v[16], v[17]);
2230           u[9] = k_packs_epi64_avx2(v[18], v[19]);
2231           u[10] = k_packs_epi64_avx2(v[20], v[21]);
2232           u[11] = k_packs_epi64_avx2(v[22], v[23]);
2233           u[12] = k_packs_epi64_avx2(v[24], v[25]);
2234           u[13] = k_packs_epi64_avx2(v[26], v[27]);
2235           u[14] = k_packs_epi64_avx2(v[28], v[29]);
2236           u[15] = k_packs_epi64_avx2(v[30], v[31]);
2237 
2238           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
2239           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
2240           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
2241           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
2242           v[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
2243           v[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
2244           v[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
2245           v[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
2246           v[8] = _mm256_add_epi32(u[8], k__DCT_CONST_ROUNDING);
2247           v[9] = _mm256_add_epi32(u[9], k__DCT_CONST_ROUNDING);
2248           v[10] = _mm256_add_epi32(u[10], k__DCT_CONST_ROUNDING);
2249           v[11] = _mm256_add_epi32(u[11], k__DCT_CONST_ROUNDING);
2250           v[12] = _mm256_add_epi32(u[12], k__DCT_CONST_ROUNDING);
2251           v[13] = _mm256_add_epi32(u[13], k__DCT_CONST_ROUNDING);
2252           v[14] = _mm256_add_epi32(u[14], k__DCT_CONST_ROUNDING);
2253           v[15] = _mm256_add_epi32(u[15], k__DCT_CONST_ROUNDING);
2254 
2255           u[0] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
2256           u[1] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
2257           u[2] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
2258           u[3] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
2259           u[4] = _mm256_srai_epi32(v[4], DCT_CONST_BITS);
2260           u[5] = _mm256_srai_epi32(v[5], DCT_CONST_BITS);
2261           u[6] = _mm256_srai_epi32(v[6], DCT_CONST_BITS);
2262           u[7] = _mm256_srai_epi32(v[7], DCT_CONST_BITS);
2263           u[8] = _mm256_srai_epi32(v[8], DCT_CONST_BITS);
2264           u[9] = _mm256_srai_epi32(v[9], DCT_CONST_BITS);
2265           u[10] = _mm256_srai_epi32(v[10], DCT_CONST_BITS);
2266           u[11] = _mm256_srai_epi32(v[11], DCT_CONST_BITS);
2267           u[12] = _mm256_srai_epi32(v[12], DCT_CONST_BITS);
2268           u[13] = _mm256_srai_epi32(v[13], DCT_CONST_BITS);
2269           u[14] = _mm256_srai_epi32(v[14], DCT_CONST_BITS);
2270           u[15] = _mm256_srai_epi32(v[15], DCT_CONST_BITS);
2271 
2272           v[0] = _mm256_cmpgt_epi32(kZero, u[0]);
2273           v[1] = _mm256_cmpgt_epi32(kZero, u[1]);
2274           v[2] = _mm256_cmpgt_epi32(kZero, u[2]);
2275           v[3] = _mm256_cmpgt_epi32(kZero, u[3]);
2276           v[4] = _mm256_cmpgt_epi32(kZero, u[4]);
2277           v[5] = _mm256_cmpgt_epi32(kZero, u[5]);
2278           v[6] = _mm256_cmpgt_epi32(kZero, u[6]);
2279           v[7] = _mm256_cmpgt_epi32(kZero, u[7]);
2280           v[8] = _mm256_cmpgt_epi32(kZero, u[8]);
2281           v[9] = _mm256_cmpgt_epi32(kZero, u[9]);
2282           v[10] = _mm256_cmpgt_epi32(kZero, u[10]);
2283           v[11] = _mm256_cmpgt_epi32(kZero, u[11]);
2284           v[12] = _mm256_cmpgt_epi32(kZero, u[12]);
2285           v[13] = _mm256_cmpgt_epi32(kZero, u[13]);
2286           v[14] = _mm256_cmpgt_epi32(kZero, u[14]);
2287           v[15] = _mm256_cmpgt_epi32(kZero, u[15]);
2288 
2289           u[0] = _mm256_sub_epi32(u[0], v[0]);
2290           u[1] = _mm256_sub_epi32(u[1], v[1]);
2291           u[2] = _mm256_sub_epi32(u[2], v[2]);
2292           u[3] = _mm256_sub_epi32(u[3], v[3]);
2293           u[4] = _mm256_sub_epi32(u[4], v[4]);
2294           u[5] = _mm256_sub_epi32(u[5], v[5]);
2295           u[6] = _mm256_sub_epi32(u[6], v[6]);
2296           u[7] = _mm256_sub_epi32(u[7], v[7]);
2297           u[8] = _mm256_sub_epi32(u[8], v[8]);
2298           u[9] = _mm256_sub_epi32(u[9], v[9]);
2299           u[10] = _mm256_sub_epi32(u[10], v[10]);
2300           u[11] = _mm256_sub_epi32(u[11], v[11]);
2301           u[12] = _mm256_sub_epi32(u[12], v[12]);
2302           u[13] = _mm256_sub_epi32(u[13], v[13]);
2303           u[14] = _mm256_sub_epi32(u[14], v[14]);
2304           u[15] = _mm256_sub_epi32(u[15], v[15]);
2305 
2306           v[0] = _mm256_add_epi32(u[0], K32One);
2307           v[1] = _mm256_add_epi32(u[1], K32One);
2308           v[2] = _mm256_add_epi32(u[2], K32One);
2309           v[3] = _mm256_add_epi32(u[3], K32One);
2310           v[4] = _mm256_add_epi32(u[4], K32One);
2311           v[5] = _mm256_add_epi32(u[5], K32One);
2312           v[6] = _mm256_add_epi32(u[6], K32One);
2313           v[7] = _mm256_add_epi32(u[7], K32One);
2314           v[8] = _mm256_add_epi32(u[8], K32One);
2315           v[9] = _mm256_add_epi32(u[9], K32One);
2316           v[10] = _mm256_add_epi32(u[10], K32One);
2317           v[11] = _mm256_add_epi32(u[11], K32One);
2318           v[12] = _mm256_add_epi32(u[12], K32One);
2319           v[13] = _mm256_add_epi32(u[13], K32One);
2320           v[14] = _mm256_add_epi32(u[14], K32One);
2321           v[15] = _mm256_add_epi32(u[15], K32One);
2322 
2323           u[0] = _mm256_srai_epi32(v[0], 2);
2324           u[1] = _mm256_srai_epi32(v[1], 2);
2325           u[2] = _mm256_srai_epi32(v[2], 2);
2326           u[3] = _mm256_srai_epi32(v[3], 2);
2327           u[4] = _mm256_srai_epi32(v[4], 2);
2328           u[5] = _mm256_srai_epi32(v[5], 2);
2329           u[6] = _mm256_srai_epi32(v[6], 2);
2330           u[7] = _mm256_srai_epi32(v[7], 2);
2331           u[8] = _mm256_srai_epi32(v[8], 2);
2332           u[9] = _mm256_srai_epi32(v[9], 2);
2333           u[10] = _mm256_srai_epi32(v[10], 2);
2334           u[11] = _mm256_srai_epi32(v[11], 2);
2335           u[12] = _mm256_srai_epi32(v[12], 2);
2336           u[13] = _mm256_srai_epi32(v[13], 2);
2337           u[14] = _mm256_srai_epi32(v[14], 2);
2338           u[15] = _mm256_srai_epi32(v[15], 2);
2339 
2340           out[2] = _mm256_packs_epi32(u[0], u[1]);
2341           out[18] = _mm256_packs_epi32(u[2], u[3]);
2342           out[10] = _mm256_packs_epi32(u[4], u[5]);
2343           out[26] = _mm256_packs_epi32(u[6], u[7]);
2344           out[6] = _mm256_packs_epi32(u[8], u[9]);
2345           out[22] = _mm256_packs_epi32(u[10], u[11]);
2346           out[14] = _mm256_packs_epi32(u[12], u[13]);
2347           out[30] = _mm256_packs_epi32(u[14], u[15]);
2348         }
2349         {
2350           lstep1[32] = _mm256_add_epi32(lstep3[34], lstep2[32]);
2351           lstep1[33] = _mm256_add_epi32(lstep3[35], lstep2[33]);
2352           lstep1[34] = _mm256_sub_epi32(lstep2[32], lstep3[34]);
2353           lstep1[35] = _mm256_sub_epi32(lstep2[33], lstep3[35]);
2354           lstep1[36] = _mm256_sub_epi32(lstep2[38], lstep3[36]);
2355           lstep1[37] = _mm256_sub_epi32(lstep2[39], lstep3[37]);
2356           lstep1[38] = _mm256_add_epi32(lstep3[36], lstep2[38]);
2357           lstep1[39] = _mm256_add_epi32(lstep3[37], lstep2[39]);
2358           lstep1[40] = _mm256_add_epi32(lstep3[42], lstep2[40]);
2359           lstep1[41] = _mm256_add_epi32(lstep3[43], lstep2[41]);
2360           lstep1[42] = _mm256_sub_epi32(lstep2[40], lstep3[42]);
2361           lstep1[43] = _mm256_sub_epi32(lstep2[41], lstep3[43]);
2362           lstep1[44] = _mm256_sub_epi32(lstep2[46], lstep3[44]);
2363           lstep1[45] = _mm256_sub_epi32(lstep2[47], lstep3[45]);
2364           lstep1[46] = _mm256_add_epi32(lstep3[44], lstep2[46]);
2365           lstep1[47] = _mm256_add_epi32(lstep3[45], lstep2[47]);
2366           lstep1[48] = _mm256_add_epi32(lstep3[50], lstep2[48]);
2367           lstep1[49] = _mm256_add_epi32(lstep3[51], lstep2[49]);
2368           lstep1[50] = _mm256_sub_epi32(lstep2[48], lstep3[50]);
2369           lstep1[51] = _mm256_sub_epi32(lstep2[49], lstep3[51]);
2370           lstep1[52] = _mm256_sub_epi32(lstep2[54], lstep3[52]);
2371           lstep1[53] = _mm256_sub_epi32(lstep2[55], lstep3[53]);
2372           lstep1[54] = _mm256_add_epi32(lstep3[52], lstep2[54]);
2373           lstep1[55] = _mm256_add_epi32(lstep3[53], lstep2[55]);
2374           lstep1[56] = _mm256_add_epi32(lstep3[58], lstep2[56]);
2375           lstep1[57] = _mm256_add_epi32(lstep3[59], lstep2[57]);
2376           lstep1[58] = _mm256_sub_epi32(lstep2[56], lstep3[58]);
2377           lstep1[59] = _mm256_sub_epi32(lstep2[57], lstep3[59]);
2378           lstep1[60] = _mm256_sub_epi32(lstep2[62], lstep3[60]);
2379           lstep1[61] = _mm256_sub_epi32(lstep2[63], lstep3[61]);
2380           lstep1[62] = _mm256_add_epi32(lstep3[60], lstep2[62]);
2381           lstep1[63] = _mm256_add_epi32(lstep3[61], lstep2[63]);
2382         }
2383         // stage 8
2384         {
2385           const __m256i k32_p31_p01 =
2386               pair256_set_epi32(cospi_31_64, cospi_1_64);
2387           const __m256i k32_p15_p17 =
2388               pair256_set_epi32(cospi_15_64, cospi_17_64);
2389           const __m256i k32_p23_p09 =
2390               pair256_set_epi32(cospi_23_64, cospi_9_64);
2391           const __m256i k32_p07_p25 =
2392               pair256_set_epi32(cospi_7_64, cospi_25_64);
2393           const __m256i k32_m25_p07 =
2394               pair256_set_epi32(-cospi_25_64, cospi_7_64);
2395           const __m256i k32_m09_p23 =
2396               pair256_set_epi32(-cospi_9_64, cospi_23_64);
2397           const __m256i k32_m17_p15 =
2398               pair256_set_epi32(-cospi_17_64, cospi_15_64);
2399           const __m256i k32_m01_p31 =
2400               pair256_set_epi32(-cospi_1_64, cospi_31_64);
2401 
2402           u[0] = _mm256_unpacklo_epi32(lstep1[32], lstep1[62]);
2403           u[1] = _mm256_unpackhi_epi32(lstep1[32], lstep1[62]);
2404           u[2] = _mm256_unpacklo_epi32(lstep1[33], lstep1[63]);
2405           u[3] = _mm256_unpackhi_epi32(lstep1[33], lstep1[63]);
2406           u[4] = _mm256_unpacklo_epi32(lstep1[34], lstep1[60]);
2407           u[5] = _mm256_unpackhi_epi32(lstep1[34], lstep1[60]);
2408           u[6] = _mm256_unpacklo_epi32(lstep1[35], lstep1[61]);
2409           u[7] = _mm256_unpackhi_epi32(lstep1[35], lstep1[61]);
2410           u[8] = _mm256_unpacklo_epi32(lstep1[36], lstep1[58]);
2411           u[9] = _mm256_unpackhi_epi32(lstep1[36], lstep1[58]);
2412           u[10] = _mm256_unpacklo_epi32(lstep1[37], lstep1[59]);
2413           u[11] = _mm256_unpackhi_epi32(lstep1[37], lstep1[59]);
2414           u[12] = _mm256_unpacklo_epi32(lstep1[38], lstep1[56]);
2415           u[13] = _mm256_unpackhi_epi32(lstep1[38], lstep1[56]);
2416           u[14] = _mm256_unpacklo_epi32(lstep1[39], lstep1[57]);
2417           u[15] = _mm256_unpackhi_epi32(lstep1[39], lstep1[57]);
2418 
2419           v[0] = k_madd_epi32_avx2(u[0], k32_p31_p01);
2420           v[1] = k_madd_epi32_avx2(u[1], k32_p31_p01);
2421           v[2] = k_madd_epi32_avx2(u[2], k32_p31_p01);
2422           v[3] = k_madd_epi32_avx2(u[3], k32_p31_p01);
2423           v[4] = k_madd_epi32_avx2(u[4], k32_p15_p17);
2424           v[5] = k_madd_epi32_avx2(u[5], k32_p15_p17);
2425           v[6] = k_madd_epi32_avx2(u[6], k32_p15_p17);
2426           v[7] = k_madd_epi32_avx2(u[7], k32_p15_p17);
2427           v[8] = k_madd_epi32_avx2(u[8], k32_p23_p09);
2428           v[9] = k_madd_epi32_avx2(u[9], k32_p23_p09);
2429           v[10] = k_madd_epi32_avx2(u[10], k32_p23_p09);
2430           v[11] = k_madd_epi32_avx2(u[11], k32_p23_p09);
2431           v[12] = k_madd_epi32_avx2(u[12], k32_p07_p25);
2432           v[13] = k_madd_epi32_avx2(u[13], k32_p07_p25);
2433           v[14] = k_madd_epi32_avx2(u[14], k32_p07_p25);
2434           v[15] = k_madd_epi32_avx2(u[15], k32_p07_p25);
2435           v[16] = k_madd_epi32_avx2(u[12], k32_m25_p07);
2436           v[17] = k_madd_epi32_avx2(u[13], k32_m25_p07);
2437           v[18] = k_madd_epi32_avx2(u[14], k32_m25_p07);
2438           v[19] = k_madd_epi32_avx2(u[15], k32_m25_p07);
2439           v[20] = k_madd_epi32_avx2(u[8], k32_m09_p23);
2440           v[21] = k_madd_epi32_avx2(u[9], k32_m09_p23);
2441           v[22] = k_madd_epi32_avx2(u[10], k32_m09_p23);
2442           v[23] = k_madd_epi32_avx2(u[11], k32_m09_p23);
2443           v[24] = k_madd_epi32_avx2(u[4], k32_m17_p15);
2444           v[25] = k_madd_epi32_avx2(u[5], k32_m17_p15);
2445           v[26] = k_madd_epi32_avx2(u[6], k32_m17_p15);
2446           v[27] = k_madd_epi32_avx2(u[7], k32_m17_p15);
2447           v[28] = k_madd_epi32_avx2(u[0], k32_m01_p31);
2448           v[29] = k_madd_epi32_avx2(u[1], k32_m01_p31);
2449           v[30] = k_madd_epi32_avx2(u[2], k32_m01_p31);
2450           v[31] = k_madd_epi32_avx2(u[3], k32_m01_p31);
2451 
2452           u[0] = k_packs_epi64_avx2(v[0], v[1]);
2453           u[1] = k_packs_epi64_avx2(v[2], v[3]);
2454           u[2] = k_packs_epi64_avx2(v[4], v[5]);
2455           u[3] = k_packs_epi64_avx2(v[6], v[7]);
2456           u[4] = k_packs_epi64_avx2(v[8], v[9]);
2457           u[5] = k_packs_epi64_avx2(v[10], v[11]);
2458           u[6] = k_packs_epi64_avx2(v[12], v[13]);
2459           u[7] = k_packs_epi64_avx2(v[14], v[15]);
2460           u[8] = k_packs_epi64_avx2(v[16], v[17]);
2461           u[9] = k_packs_epi64_avx2(v[18], v[19]);
2462           u[10] = k_packs_epi64_avx2(v[20], v[21]);
2463           u[11] = k_packs_epi64_avx2(v[22], v[23]);
2464           u[12] = k_packs_epi64_avx2(v[24], v[25]);
2465           u[13] = k_packs_epi64_avx2(v[26], v[27]);
2466           u[14] = k_packs_epi64_avx2(v[28], v[29]);
2467           u[15] = k_packs_epi64_avx2(v[30], v[31]);
2468 
2469           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
2470           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
2471           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
2472           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
2473           v[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
2474           v[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
2475           v[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
2476           v[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
2477           v[8] = _mm256_add_epi32(u[8], k__DCT_CONST_ROUNDING);
2478           v[9] = _mm256_add_epi32(u[9], k__DCT_CONST_ROUNDING);
2479           v[10] = _mm256_add_epi32(u[10], k__DCT_CONST_ROUNDING);
2480           v[11] = _mm256_add_epi32(u[11], k__DCT_CONST_ROUNDING);
2481           v[12] = _mm256_add_epi32(u[12], k__DCT_CONST_ROUNDING);
2482           v[13] = _mm256_add_epi32(u[13], k__DCT_CONST_ROUNDING);
2483           v[14] = _mm256_add_epi32(u[14], k__DCT_CONST_ROUNDING);
2484           v[15] = _mm256_add_epi32(u[15], k__DCT_CONST_ROUNDING);
2485 
2486           u[0] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
2487           u[1] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
2488           u[2] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
2489           u[3] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
2490           u[4] = _mm256_srai_epi32(v[4], DCT_CONST_BITS);
2491           u[5] = _mm256_srai_epi32(v[5], DCT_CONST_BITS);
2492           u[6] = _mm256_srai_epi32(v[6], DCT_CONST_BITS);
2493           u[7] = _mm256_srai_epi32(v[7], DCT_CONST_BITS);
2494           u[8] = _mm256_srai_epi32(v[8], DCT_CONST_BITS);
2495           u[9] = _mm256_srai_epi32(v[9], DCT_CONST_BITS);
2496           u[10] = _mm256_srai_epi32(v[10], DCT_CONST_BITS);
2497           u[11] = _mm256_srai_epi32(v[11], DCT_CONST_BITS);
2498           u[12] = _mm256_srai_epi32(v[12], DCT_CONST_BITS);
2499           u[13] = _mm256_srai_epi32(v[13], DCT_CONST_BITS);
2500           u[14] = _mm256_srai_epi32(v[14], DCT_CONST_BITS);
2501           u[15] = _mm256_srai_epi32(v[15], DCT_CONST_BITS);
2502 
2503           v[0] = _mm256_cmpgt_epi32(kZero, u[0]);
2504           v[1] = _mm256_cmpgt_epi32(kZero, u[1]);
2505           v[2] = _mm256_cmpgt_epi32(kZero, u[2]);
2506           v[3] = _mm256_cmpgt_epi32(kZero, u[3]);
2507           v[4] = _mm256_cmpgt_epi32(kZero, u[4]);
2508           v[5] = _mm256_cmpgt_epi32(kZero, u[5]);
2509           v[6] = _mm256_cmpgt_epi32(kZero, u[6]);
2510           v[7] = _mm256_cmpgt_epi32(kZero, u[7]);
2511           v[8] = _mm256_cmpgt_epi32(kZero, u[8]);
2512           v[9] = _mm256_cmpgt_epi32(kZero, u[9]);
2513           v[10] = _mm256_cmpgt_epi32(kZero, u[10]);
2514           v[11] = _mm256_cmpgt_epi32(kZero, u[11]);
2515           v[12] = _mm256_cmpgt_epi32(kZero, u[12]);
2516           v[13] = _mm256_cmpgt_epi32(kZero, u[13]);
2517           v[14] = _mm256_cmpgt_epi32(kZero, u[14]);
2518           v[15] = _mm256_cmpgt_epi32(kZero, u[15]);
2519 
2520           u[0] = _mm256_sub_epi32(u[0], v[0]);
2521           u[1] = _mm256_sub_epi32(u[1], v[1]);
2522           u[2] = _mm256_sub_epi32(u[2], v[2]);
2523           u[3] = _mm256_sub_epi32(u[3], v[3]);
2524           u[4] = _mm256_sub_epi32(u[4], v[4]);
2525           u[5] = _mm256_sub_epi32(u[5], v[5]);
2526           u[6] = _mm256_sub_epi32(u[6], v[6]);
2527           u[7] = _mm256_sub_epi32(u[7], v[7]);
2528           u[8] = _mm256_sub_epi32(u[8], v[8]);
2529           u[9] = _mm256_sub_epi32(u[9], v[9]);
2530           u[10] = _mm256_sub_epi32(u[10], v[10]);
2531           u[11] = _mm256_sub_epi32(u[11], v[11]);
2532           u[12] = _mm256_sub_epi32(u[12], v[12]);
2533           u[13] = _mm256_sub_epi32(u[13], v[13]);
2534           u[14] = _mm256_sub_epi32(u[14], v[14]);
2535           u[15] = _mm256_sub_epi32(u[15], v[15]);
2536 
2537           v[0] = _mm256_add_epi32(u[0], K32One);
2538           v[1] = _mm256_add_epi32(u[1], K32One);
2539           v[2] = _mm256_add_epi32(u[2], K32One);
2540           v[3] = _mm256_add_epi32(u[3], K32One);
2541           v[4] = _mm256_add_epi32(u[4], K32One);
2542           v[5] = _mm256_add_epi32(u[5], K32One);
2543           v[6] = _mm256_add_epi32(u[6], K32One);
2544           v[7] = _mm256_add_epi32(u[7], K32One);
2545           v[8] = _mm256_add_epi32(u[8], K32One);
2546           v[9] = _mm256_add_epi32(u[9], K32One);
2547           v[10] = _mm256_add_epi32(u[10], K32One);
2548           v[11] = _mm256_add_epi32(u[11], K32One);
2549           v[12] = _mm256_add_epi32(u[12], K32One);
2550           v[13] = _mm256_add_epi32(u[13], K32One);
2551           v[14] = _mm256_add_epi32(u[14], K32One);
2552           v[15] = _mm256_add_epi32(u[15], K32One);
2553 
2554           u[0] = _mm256_srai_epi32(v[0], 2);
2555           u[1] = _mm256_srai_epi32(v[1], 2);
2556           u[2] = _mm256_srai_epi32(v[2], 2);
2557           u[3] = _mm256_srai_epi32(v[3], 2);
2558           u[4] = _mm256_srai_epi32(v[4], 2);
2559           u[5] = _mm256_srai_epi32(v[5], 2);
2560           u[6] = _mm256_srai_epi32(v[6], 2);
2561           u[7] = _mm256_srai_epi32(v[7], 2);
2562           u[8] = _mm256_srai_epi32(v[8], 2);
2563           u[9] = _mm256_srai_epi32(v[9], 2);
2564           u[10] = _mm256_srai_epi32(v[10], 2);
2565           u[11] = _mm256_srai_epi32(v[11], 2);
2566           u[12] = _mm256_srai_epi32(v[12], 2);
2567           u[13] = _mm256_srai_epi32(v[13], 2);
2568           u[14] = _mm256_srai_epi32(v[14], 2);
2569           u[15] = _mm256_srai_epi32(v[15], 2);
2570 
2571           out[1] = _mm256_packs_epi32(u[0], u[1]);
2572           out[17] = _mm256_packs_epi32(u[2], u[3]);
2573           out[9] = _mm256_packs_epi32(u[4], u[5]);
2574           out[25] = _mm256_packs_epi32(u[6], u[7]);
2575           out[7] = _mm256_packs_epi32(u[8], u[9]);
2576           out[23] = _mm256_packs_epi32(u[10], u[11]);
2577           out[15] = _mm256_packs_epi32(u[12], u[13]);
2578           out[31] = _mm256_packs_epi32(u[14], u[15]);
2579         }
2580         {
2581           const __m256i k32_p27_p05 =
2582               pair256_set_epi32(cospi_27_64, cospi_5_64);
2583           const __m256i k32_p11_p21 =
2584               pair256_set_epi32(cospi_11_64, cospi_21_64);
2585           const __m256i k32_p19_p13 =
2586               pair256_set_epi32(cospi_19_64, cospi_13_64);
2587           const __m256i k32_p03_p29 =
2588               pair256_set_epi32(cospi_3_64, cospi_29_64);
2589           const __m256i k32_m29_p03 =
2590               pair256_set_epi32(-cospi_29_64, cospi_3_64);
2591           const __m256i k32_m13_p19 =
2592               pair256_set_epi32(-cospi_13_64, cospi_19_64);
2593           const __m256i k32_m21_p11 =
2594               pair256_set_epi32(-cospi_21_64, cospi_11_64);
2595           const __m256i k32_m05_p27 =
2596               pair256_set_epi32(-cospi_5_64, cospi_27_64);
2597 
2598           u[0] = _mm256_unpacklo_epi32(lstep1[40], lstep1[54]);
2599           u[1] = _mm256_unpackhi_epi32(lstep1[40], lstep1[54]);
2600           u[2] = _mm256_unpacklo_epi32(lstep1[41], lstep1[55]);
2601           u[3] = _mm256_unpackhi_epi32(lstep1[41], lstep1[55]);
2602           u[4] = _mm256_unpacklo_epi32(lstep1[42], lstep1[52]);
2603           u[5] = _mm256_unpackhi_epi32(lstep1[42], lstep1[52]);
2604           u[6] = _mm256_unpacklo_epi32(lstep1[43], lstep1[53]);
2605           u[7] = _mm256_unpackhi_epi32(lstep1[43], lstep1[53]);
2606           u[8] = _mm256_unpacklo_epi32(lstep1[44], lstep1[50]);
2607           u[9] = _mm256_unpackhi_epi32(lstep1[44], lstep1[50]);
2608           u[10] = _mm256_unpacklo_epi32(lstep1[45], lstep1[51]);
2609           u[11] = _mm256_unpackhi_epi32(lstep1[45], lstep1[51]);
2610           u[12] = _mm256_unpacklo_epi32(lstep1[46], lstep1[48]);
2611           u[13] = _mm256_unpackhi_epi32(lstep1[46], lstep1[48]);
2612           u[14] = _mm256_unpacklo_epi32(lstep1[47], lstep1[49]);
2613           u[15] = _mm256_unpackhi_epi32(lstep1[47], lstep1[49]);
2614 
2615           v[0] = k_madd_epi32_avx2(u[0], k32_p27_p05);
2616           v[1] = k_madd_epi32_avx2(u[1], k32_p27_p05);
2617           v[2] = k_madd_epi32_avx2(u[2], k32_p27_p05);
2618           v[3] = k_madd_epi32_avx2(u[3], k32_p27_p05);
2619           v[4] = k_madd_epi32_avx2(u[4], k32_p11_p21);
2620           v[5] = k_madd_epi32_avx2(u[5], k32_p11_p21);
2621           v[6] = k_madd_epi32_avx2(u[6], k32_p11_p21);
2622           v[7] = k_madd_epi32_avx2(u[7], k32_p11_p21);
2623           v[8] = k_madd_epi32_avx2(u[8], k32_p19_p13);
2624           v[9] = k_madd_epi32_avx2(u[9], k32_p19_p13);
2625           v[10] = k_madd_epi32_avx2(u[10], k32_p19_p13);
2626           v[11] = k_madd_epi32_avx2(u[11], k32_p19_p13);
2627           v[12] = k_madd_epi32_avx2(u[12], k32_p03_p29);
2628           v[13] = k_madd_epi32_avx2(u[13], k32_p03_p29);
2629           v[14] = k_madd_epi32_avx2(u[14], k32_p03_p29);
2630           v[15] = k_madd_epi32_avx2(u[15], k32_p03_p29);
2631           v[16] = k_madd_epi32_avx2(u[12], k32_m29_p03);
2632           v[17] = k_madd_epi32_avx2(u[13], k32_m29_p03);
2633           v[18] = k_madd_epi32_avx2(u[14], k32_m29_p03);
2634           v[19] = k_madd_epi32_avx2(u[15], k32_m29_p03);
2635           v[20] = k_madd_epi32_avx2(u[8], k32_m13_p19);
2636           v[21] = k_madd_epi32_avx2(u[9], k32_m13_p19);
2637           v[22] = k_madd_epi32_avx2(u[10], k32_m13_p19);
2638           v[23] = k_madd_epi32_avx2(u[11], k32_m13_p19);
2639           v[24] = k_madd_epi32_avx2(u[4], k32_m21_p11);
2640           v[25] = k_madd_epi32_avx2(u[5], k32_m21_p11);
2641           v[26] = k_madd_epi32_avx2(u[6], k32_m21_p11);
2642           v[27] = k_madd_epi32_avx2(u[7], k32_m21_p11);
2643           v[28] = k_madd_epi32_avx2(u[0], k32_m05_p27);
2644           v[29] = k_madd_epi32_avx2(u[1], k32_m05_p27);
2645           v[30] = k_madd_epi32_avx2(u[2], k32_m05_p27);
2646           v[31] = k_madd_epi32_avx2(u[3], k32_m05_p27);
2647 
2648           u[0] = k_packs_epi64_avx2(v[0], v[1]);
2649           u[1] = k_packs_epi64_avx2(v[2], v[3]);
2650           u[2] = k_packs_epi64_avx2(v[4], v[5]);
2651           u[3] = k_packs_epi64_avx2(v[6], v[7]);
2652           u[4] = k_packs_epi64_avx2(v[8], v[9]);
2653           u[5] = k_packs_epi64_avx2(v[10], v[11]);
2654           u[6] = k_packs_epi64_avx2(v[12], v[13]);
2655           u[7] = k_packs_epi64_avx2(v[14], v[15]);
2656           u[8] = k_packs_epi64_avx2(v[16], v[17]);
2657           u[9] = k_packs_epi64_avx2(v[18], v[19]);
2658           u[10] = k_packs_epi64_avx2(v[20], v[21]);
2659           u[11] = k_packs_epi64_avx2(v[22], v[23]);
2660           u[12] = k_packs_epi64_avx2(v[24], v[25]);
2661           u[13] = k_packs_epi64_avx2(v[26], v[27]);
2662           u[14] = k_packs_epi64_avx2(v[28], v[29]);
2663           u[15] = k_packs_epi64_avx2(v[30], v[31]);
2664 
2665           v[0] = _mm256_add_epi32(u[0], k__DCT_CONST_ROUNDING);
2666           v[1] = _mm256_add_epi32(u[1], k__DCT_CONST_ROUNDING);
2667           v[2] = _mm256_add_epi32(u[2], k__DCT_CONST_ROUNDING);
2668           v[3] = _mm256_add_epi32(u[3], k__DCT_CONST_ROUNDING);
2669           v[4] = _mm256_add_epi32(u[4], k__DCT_CONST_ROUNDING);
2670           v[5] = _mm256_add_epi32(u[5], k__DCT_CONST_ROUNDING);
2671           v[6] = _mm256_add_epi32(u[6], k__DCT_CONST_ROUNDING);
2672           v[7] = _mm256_add_epi32(u[7], k__DCT_CONST_ROUNDING);
2673           v[8] = _mm256_add_epi32(u[8], k__DCT_CONST_ROUNDING);
2674           v[9] = _mm256_add_epi32(u[9], k__DCT_CONST_ROUNDING);
2675           v[10] = _mm256_add_epi32(u[10], k__DCT_CONST_ROUNDING);
2676           v[11] = _mm256_add_epi32(u[11], k__DCT_CONST_ROUNDING);
2677           v[12] = _mm256_add_epi32(u[12], k__DCT_CONST_ROUNDING);
2678           v[13] = _mm256_add_epi32(u[13], k__DCT_CONST_ROUNDING);
2679           v[14] = _mm256_add_epi32(u[14], k__DCT_CONST_ROUNDING);
2680           v[15] = _mm256_add_epi32(u[15], k__DCT_CONST_ROUNDING);
2681 
2682           u[0] = _mm256_srai_epi32(v[0], DCT_CONST_BITS);
2683           u[1] = _mm256_srai_epi32(v[1], DCT_CONST_BITS);
2684           u[2] = _mm256_srai_epi32(v[2], DCT_CONST_BITS);
2685           u[3] = _mm256_srai_epi32(v[3], DCT_CONST_BITS);
2686           u[4] = _mm256_srai_epi32(v[4], DCT_CONST_BITS);
2687           u[5] = _mm256_srai_epi32(v[5], DCT_CONST_BITS);
2688           u[6] = _mm256_srai_epi32(v[6], DCT_CONST_BITS);
2689           u[7] = _mm256_srai_epi32(v[7], DCT_CONST_BITS);
2690           u[8] = _mm256_srai_epi32(v[8], DCT_CONST_BITS);
2691           u[9] = _mm256_srai_epi32(v[9], DCT_CONST_BITS);
2692           u[10] = _mm256_srai_epi32(v[10], DCT_CONST_BITS);
2693           u[11] = _mm256_srai_epi32(v[11], DCT_CONST_BITS);
2694           u[12] = _mm256_srai_epi32(v[12], DCT_CONST_BITS);
2695           u[13] = _mm256_srai_epi32(v[13], DCT_CONST_BITS);
2696           u[14] = _mm256_srai_epi32(v[14], DCT_CONST_BITS);
2697           u[15] = _mm256_srai_epi32(v[15], DCT_CONST_BITS);
2698 
2699           v[0] = _mm256_cmpgt_epi32(kZero, u[0]);
2700           v[1] = _mm256_cmpgt_epi32(kZero, u[1]);
2701           v[2] = _mm256_cmpgt_epi32(kZero, u[2]);
2702           v[3] = _mm256_cmpgt_epi32(kZero, u[3]);
2703           v[4] = _mm256_cmpgt_epi32(kZero, u[4]);
2704           v[5] = _mm256_cmpgt_epi32(kZero, u[5]);
2705           v[6] = _mm256_cmpgt_epi32(kZero, u[6]);
2706           v[7] = _mm256_cmpgt_epi32(kZero, u[7]);
2707           v[8] = _mm256_cmpgt_epi32(kZero, u[8]);
2708           v[9] = _mm256_cmpgt_epi32(kZero, u[9]);
2709           v[10] = _mm256_cmpgt_epi32(kZero, u[10]);
2710           v[11] = _mm256_cmpgt_epi32(kZero, u[11]);
2711           v[12] = _mm256_cmpgt_epi32(kZero, u[12]);
2712           v[13] = _mm256_cmpgt_epi32(kZero, u[13]);
2713           v[14] = _mm256_cmpgt_epi32(kZero, u[14]);
2714           v[15] = _mm256_cmpgt_epi32(kZero, u[15]);
2715 
2716           u[0] = _mm256_sub_epi32(u[0], v[0]);
2717           u[1] = _mm256_sub_epi32(u[1], v[1]);
2718           u[2] = _mm256_sub_epi32(u[2], v[2]);
2719           u[3] = _mm256_sub_epi32(u[3], v[3]);
2720           u[4] = _mm256_sub_epi32(u[4], v[4]);
2721           u[5] = _mm256_sub_epi32(u[5], v[5]);
2722           u[6] = _mm256_sub_epi32(u[6], v[6]);
2723           u[7] = _mm256_sub_epi32(u[7], v[7]);
2724           u[8] = _mm256_sub_epi32(u[8], v[8]);
2725           u[9] = _mm256_sub_epi32(u[9], v[9]);
2726           u[10] = _mm256_sub_epi32(u[10], v[10]);
2727           u[11] = _mm256_sub_epi32(u[11], v[11]);
2728           u[12] = _mm256_sub_epi32(u[12], v[12]);
2729           u[13] = _mm256_sub_epi32(u[13], v[13]);
2730           u[14] = _mm256_sub_epi32(u[14], v[14]);
2731           u[15] = _mm256_sub_epi32(u[15], v[15]);
2732 
2733           v[0] = _mm256_add_epi32(u[0], K32One);
2734           v[1] = _mm256_add_epi32(u[1], K32One);
2735           v[2] = _mm256_add_epi32(u[2], K32One);
2736           v[3] = _mm256_add_epi32(u[3], K32One);
2737           v[4] = _mm256_add_epi32(u[4], K32One);
2738           v[5] = _mm256_add_epi32(u[5], K32One);
2739           v[6] = _mm256_add_epi32(u[6], K32One);
2740           v[7] = _mm256_add_epi32(u[7], K32One);
2741           v[8] = _mm256_add_epi32(u[8], K32One);
2742           v[9] = _mm256_add_epi32(u[9], K32One);
2743           v[10] = _mm256_add_epi32(u[10], K32One);
2744           v[11] = _mm256_add_epi32(u[11], K32One);
2745           v[12] = _mm256_add_epi32(u[12], K32One);
2746           v[13] = _mm256_add_epi32(u[13], K32One);
2747           v[14] = _mm256_add_epi32(u[14], K32One);
2748           v[15] = _mm256_add_epi32(u[15], K32One);
2749 
2750           u[0] = _mm256_srai_epi32(v[0], 2);
2751           u[1] = _mm256_srai_epi32(v[1], 2);
2752           u[2] = _mm256_srai_epi32(v[2], 2);
2753           u[3] = _mm256_srai_epi32(v[3], 2);
2754           u[4] = _mm256_srai_epi32(v[4], 2);
2755           u[5] = _mm256_srai_epi32(v[5], 2);
2756           u[6] = _mm256_srai_epi32(v[6], 2);
2757           u[7] = _mm256_srai_epi32(v[7], 2);
2758           u[8] = _mm256_srai_epi32(v[8], 2);
2759           u[9] = _mm256_srai_epi32(v[9], 2);
2760           u[10] = _mm256_srai_epi32(v[10], 2);
2761           u[11] = _mm256_srai_epi32(v[11], 2);
2762           u[12] = _mm256_srai_epi32(v[12], 2);
2763           u[13] = _mm256_srai_epi32(v[13], 2);
2764           u[14] = _mm256_srai_epi32(v[14], 2);
2765           u[15] = _mm256_srai_epi32(v[15], 2);
2766 
2767           out[5] = _mm256_packs_epi32(u[0], u[1]);
2768           out[21] = _mm256_packs_epi32(u[2], u[3]);
2769           out[13] = _mm256_packs_epi32(u[4], u[5]);
2770           out[29] = _mm256_packs_epi32(u[6], u[7]);
2771           out[3] = _mm256_packs_epi32(u[8], u[9]);
2772           out[19] = _mm256_packs_epi32(u[10], u[11]);
2773           out[11] = _mm256_packs_epi32(u[12], u[13]);
2774           out[27] = _mm256_packs_epi32(u[14], u[15]);
2775         }
2776       }
2777 #endif
2778       // Transpose the results, do it as four 8x8 transposes.
2779       {
2780         int transpose_block;
2781         int16_t *output_currStep, *output_nextStep;
2782         if (0 == pass) {
2783           output_currStep = &intermediate[column_start * 32];
2784           output_nextStep = &intermediate[(column_start + 8) * 32];
2785         } else {
2786           output_currStep = &output_org[column_start * 32];
2787           output_nextStep = &output_org[(column_start + 8) * 32];
2788         }
2789         for (transpose_block = 0; transpose_block < 4; ++transpose_block) {
2790           __m256i *this_out = &out[8 * transpose_block];
2791           // 00  01  02  03  04  05  06  07  08  09  10  11  12  13  14  15
2792           // 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35
2793           // 40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55
2794           // 60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75
2795           // 80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95
2796           // 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
2797           // 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
2798           // 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
2799           const __m256i tr0_0 = _mm256_unpacklo_epi16(this_out[0], this_out[1]);
2800           const __m256i tr0_1 = _mm256_unpacklo_epi16(this_out[2], this_out[3]);
2801           const __m256i tr0_2 = _mm256_unpackhi_epi16(this_out[0], this_out[1]);
2802           const __m256i tr0_3 = _mm256_unpackhi_epi16(this_out[2], this_out[3]);
2803           const __m256i tr0_4 = _mm256_unpacklo_epi16(this_out[4], this_out[5]);
2804           const __m256i tr0_5 = _mm256_unpacklo_epi16(this_out[6], this_out[7]);
2805           const __m256i tr0_6 = _mm256_unpackhi_epi16(this_out[4], this_out[5]);
2806           const __m256i tr0_7 = _mm256_unpackhi_epi16(this_out[6], this_out[7]);
2807           // 00  20  01  21  02  22  03  23  08  28  09  29  10  30  11  31
2808           // 40  60  41  61  42  62  43  63  48  68  49  69  50  70  51  71
2809           // 04  24  05  25  06  26  07  27  12  32  13  33  14  34  15  35
2810           // 44  64  45  65  46  66  47  67  52  72  53  73  54  74  55  75
2811           // 80  100 81  101 82  102 83  103 88  108 89  109 90  110 91  101
2812           // 120 140 121 141 122 142 123 143 128 148 129 149 130 150 131 151
2813           // 84  104 85  105 86  106 87  107 92  112 93  113 94  114 95  115
2814           // 124 144 125 145 126 146 127 147 132 152 133 153 134 154 135 155
2815 
2816           const __m256i tr1_0 = _mm256_unpacklo_epi32(tr0_0, tr0_1);
2817           const __m256i tr1_1 = _mm256_unpacklo_epi32(tr0_2, tr0_3);
2818           const __m256i tr1_2 = _mm256_unpackhi_epi32(tr0_0, tr0_1);
2819           const __m256i tr1_3 = _mm256_unpackhi_epi32(tr0_2, tr0_3);
2820           const __m256i tr1_4 = _mm256_unpacklo_epi32(tr0_4, tr0_5);
2821           const __m256i tr1_5 = _mm256_unpacklo_epi32(tr0_6, tr0_7);
2822           const __m256i tr1_6 = _mm256_unpackhi_epi32(tr0_4, tr0_5);
2823           const __m256i tr1_7 = _mm256_unpackhi_epi32(tr0_6, tr0_7);
2824           // 00 20  40  60  01 21  41  61  08 28  48  68  09 29  49  69
2825           // 04 24  44  64  05 25  45  65  12 32  52  72  13 33  53  73
2826           // 02 22  42  62  03 23  43  63  10 30  50  70  11 31  51  71
2827           // 06 26  46  66  07 27  47  67  14 34  54  74  15 35  55  75
2828           // 80 100 120 140 81 101 121 141 88 108 128 148 89 109 129 149
2829           // 84 104 124 144 85 105 125 145 92 112 132 152 93 113 133 153
2830           // 82 102 122 142 83 103 123 143 90 110 130 150 91 101 131 151
2831           // 86 106 126 146 87 107 127 147 94 114 134 154 95 115 135 155
2832           __m256i tr2_0 = _mm256_unpacklo_epi64(tr1_0, tr1_4);
2833           __m256i tr2_1 = _mm256_unpackhi_epi64(tr1_0, tr1_4);
2834           __m256i tr2_2 = _mm256_unpacklo_epi64(tr1_2, tr1_6);
2835           __m256i tr2_3 = _mm256_unpackhi_epi64(tr1_2, tr1_6);
2836           __m256i tr2_4 = _mm256_unpacklo_epi64(tr1_1, tr1_5);
2837           __m256i tr2_5 = _mm256_unpackhi_epi64(tr1_1, tr1_5);
2838           __m256i tr2_6 = _mm256_unpacklo_epi64(tr1_3, tr1_7);
2839           __m256i tr2_7 = _mm256_unpackhi_epi64(tr1_3, tr1_7);
2840           // 00 20 40 60 80 100 120 140 08 28 48 68 88 108 128 148
2841           // 01 21 41 61 81 101 121 141 09 29 49 69 89 109 129 149
2842           // 02 22 42 62 82 102 122 142 10 30 50 70 90 110 130 150
2843           // 03 23 43 63 83 103 123 143 11 31 51 71 91 101 131 151
2844           // 04 24 44 64 84 104 124 144 12 32 52 72 92 112 132 152
2845           // 05 25 45 65 85 105 125 145 13 33 53 73 93 113 133 153
2846           // 06 26 46 66 86 106 126 146 14 34 54 74 94 114 134 154
2847           // 07 27 47 67 87 107 127 147 15 35 55 75 95 115 135 155
2848           if (0 == pass) {
2849             // output[j] = (output[j] + 1 + (output[j] > 0)) >> 2;
2850             // TODO(cd): see quality impact of only doing
2851             //           output[j] = (output[j] + 1) >> 2;
2852             //           which would remove the code between here ...
2853             __m256i tr2_0_0 = _mm256_cmpgt_epi16(tr2_0, kZero);
2854             __m256i tr2_1_0 = _mm256_cmpgt_epi16(tr2_1, kZero);
2855             __m256i tr2_2_0 = _mm256_cmpgt_epi16(tr2_2, kZero);
2856             __m256i tr2_3_0 = _mm256_cmpgt_epi16(tr2_3, kZero);
2857             __m256i tr2_4_0 = _mm256_cmpgt_epi16(tr2_4, kZero);
2858             __m256i tr2_5_0 = _mm256_cmpgt_epi16(tr2_5, kZero);
2859             __m256i tr2_6_0 = _mm256_cmpgt_epi16(tr2_6, kZero);
2860             __m256i tr2_7_0 = _mm256_cmpgt_epi16(tr2_7, kZero);
2861             tr2_0 = _mm256_sub_epi16(tr2_0, tr2_0_0);
2862             tr2_1 = _mm256_sub_epi16(tr2_1, tr2_1_0);
2863             tr2_2 = _mm256_sub_epi16(tr2_2, tr2_2_0);
2864             tr2_3 = _mm256_sub_epi16(tr2_3, tr2_3_0);
2865             tr2_4 = _mm256_sub_epi16(tr2_4, tr2_4_0);
2866             tr2_5 = _mm256_sub_epi16(tr2_5, tr2_5_0);
2867             tr2_6 = _mm256_sub_epi16(tr2_6, tr2_6_0);
2868             tr2_7 = _mm256_sub_epi16(tr2_7, tr2_7_0);
2869             //           ... and here.
2870             //           PS: also change code in vp9/encoder/vp9_dct.c
2871             tr2_0 = _mm256_add_epi16(tr2_0, kOne);
2872             tr2_1 = _mm256_add_epi16(tr2_1, kOne);
2873             tr2_2 = _mm256_add_epi16(tr2_2, kOne);
2874             tr2_3 = _mm256_add_epi16(tr2_3, kOne);
2875             tr2_4 = _mm256_add_epi16(tr2_4, kOne);
2876             tr2_5 = _mm256_add_epi16(tr2_5, kOne);
2877             tr2_6 = _mm256_add_epi16(tr2_6, kOne);
2878             tr2_7 = _mm256_add_epi16(tr2_7, kOne);
2879             tr2_0 = _mm256_srai_epi16(tr2_0, 2);
2880             tr2_1 = _mm256_srai_epi16(tr2_1, 2);
2881             tr2_2 = _mm256_srai_epi16(tr2_2, 2);
2882             tr2_3 = _mm256_srai_epi16(tr2_3, 2);
2883             tr2_4 = _mm256_srai_epi16(tr2_4, 2);
2884             tr2_5 = _mm256_srai_epi16(tr2_5, 2);
2885             tr2_6 = _mm256_srai_epi16(tr2_6, 2);
2886             tr2_7 = _mm256_srai_epi16(tr2_7, 2);
2887           }
2888           // Note: even though all these stores are aligned, using the aligned
2889           //       intrinsic make the code slightly slower.
2890           _mm_storeu_si128((__m128i *)(output_currStep + 0 * 32),
2891                            _mm256_castsi256_si128(tr2_0));
2892           _mm_storeu_si128((__m128i *)(output_currStep + 1 * 32),
2893                            _mm256_castsi256_si128(tr2_1));
2894           _mm_storeu_si128((__m128i *)(output_currStep + 2 * 32),
2895                            _mm256_castsi256_si128(tr2_2));
2896           _mm_storeu_si128((__m128i *)(output_currStep + 3 * 32),
2897                            _mm256_castsi256_si128(tr2_3));
2898           _mm_storeu_si128((__m128i *)(output_currStep + 4 * 32),
2899                            _mm256_castsi256_si128(tr2_4));
2900           _mm_storeu_si128((__m128i *)(output_currStep + 5 * 32),
2901                            _mm256_castsi256_si128(tr2_5));
2902           _mm_storeu_si128((__m128i *)(output_currStep + 6 * 32),
2903                            _mm256_castsi256_si128(tr2_6));
2904           _mm_storeu_si128((__m128i *)(output_currStep + 7 * 32),
2905                            _mm256_castsi256_si128(tr2_7));
2906 
2907           _mm_storeu_si128((__m128i *)(output_nextStep + 0 * 32),
2908                            _mm256_extractf128_si256(tr2_0, 1));
2909           _mm_storeu_si128((__m128i *)(output_nextStep + 1 * 32),
2910                            _mm256_extractf128_si256(tr2_1, 1));
2911           _mm_storeu_si128((__m128i *)(output_nextStep + 2 * 32),
2912                            _mm256_extractf128_si256(tr2_2, 1));
2913           _mm_storeu_si128((__m128i *)(output_nextStep + 3 * 32),
2914                            _mm256_extractf128_si256(tr2_3, 1));
2915           _mm_storeu_si128((__m128i *)(output_nextStep + 4 * 32),
2916                            _mm256_extractf128_si256(tr2_4, 1));
2917           _mm_storeu_si128((__m128i *)(output_nextStep + 5 * 32),
2918                            _mm256_extractf128_si256(tr2_5, 1));
2919           _mm_storeu_si128((__m128i *)(output_nextStep + 6 * 32),
2920                            _mm256_extractf128_si256(tr2_6, 1));
2921           _mm_storeu_si128((__m128i *)(output_nextStep + 7 * 32),
2922                            _mm256_extractf128_si256(tr2_7, 1));
2923           // Process next 8x8
2924           output_currStep += 8;
2925           output_nextStep += 8;
2926         }
2927       }
2928     }
2929   }
2930 }  // NOLINT
2931