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