Line data Source code
1 : /*
2 : * Copyright (c) 2018, Alliance for Open Media. All rights reserved
3 : *
4 : * This source code is subject to the terms of the BSD 2 Clause License and
5 : * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 : * was not distributed with this source code in the LICENSE file, you can
7 : * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8 : * Media Patent License 1.0 was not distributed with this source code in the
9 : * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10 : */
11 :
12 : #include "EbDefinitions.h"
13 : #include "aom_dsp_rtcd.h"
14 :
15 : #include "av1_inv_txfm_avx2.h"
16 : #include "av1_inv_txfm_ssse3.h"
17 : #include "EbTransforms.h"
18 :
19 : // Sqrt2, Sqrt2^2, Sqrt2^3, Sqrt2^4, Sqrt2^5
20 : static int32_t NewSqrt2list[TX_SIZES] = { 5793, 2 * 4096, 2 * 5793, 4 * 4096,
21 : 4 * 5793 };
22 :
23 8237430 : static INLINE void idct16_stage5_avx2(__m256i *x1, const int32_t *cospi,
24 : const __m256i _r, int8_t cos_bit) {
25 8237430 : const __m256i cospi_m32_p32 = pair_set_w16_epi16(-cospi[32], cospi[32]);
26 8236840 : const __m256i cospi_p32_p32 = pair_set_w16_epi16(cospi[32], cospi[32]);
27 8236140 : btf_16_adds_subs_avx2(&x1[0], &x1[3]);
28 8236080 : btf_16_adds_subs_avx2(&x1[1], &x1[2]);
29 8235670 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x1[5], &x1[6], _r, cos_bit);
30 :
31 8236770 : btf_16_adds_subs_avx2(&x1[8], &x1[11]);
32 8236450 : btf_16_adds_subs_avx2(&x1[9], &x1[10]);
33 8235420 : btf_16_adds_subs_avx2(&x1[15], &x1[12]);
34 8234920 : btf_16_adds_subs_avx2(&x1[14], &x1[13]);
35 8234620 : }
36 :
37 8234960 : static INLINE void idct16_stage6_avx2(__m256i *x, const int32_t *cospi,
38 : const __m256i _r, int8_t cos_bit) {
39 8234960 : const __m256i cospi_m32_p32 = pair_set_w16_epi16(-cospi[32], cospi[32]);
40 8234530 : const __m256i cospi_p32_p32 = pair_set_w16_epi16(cospi[32], cospi[32]);
41 8233900 : btf_16_adds_subs_avx2(&x[0], &x[7]);
42 8233920 : btf_16_adds_subs_avx2(&x[1], &x[6]);
43 8233930 : btf_16_adds_subs_avx2(&x[2], &x[5]);
44 8233830 : btf_16_adds_subs_avx2(&x[3], &x[4]);
45 8233940 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[10], &x[13], _r, cos_bit);
46 8236620 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[11], &x[12], _r, cos_bit);
47 8237000 : }
48 :
49 8237250 : static INLINE void idct16_stage7_avx2(__m256i *output, __m256i *x1) {
50 8237250 : btf_16_adds_subs_out_avx2(&output[0], &output[15], x1[0], x1[15]);
51 8236740 : btf_16_adds_subs_out_avx2(&output[1], &output[14], x1[1], x1[14]);
52 8236160 : btf_16_adds_subs_out_avx2(&output[2], &output[13], x1[2], x1[13]);
53 8235980 : btf_16_adds_subs_out_avx2(&output[3], &output[12], x1[3], x1[12]);
54 8235710 : btf_16_adds_subs_out_avx2(&output[4], &output[11], x1[4], x1[11]);
55 8235340 : btf_16_adds_subs_out_avx2(&output[5], &output[10], x1[5], x1[10]);
56 8235240 : btf_16_adds_subs_out_avx2(&output[6], &output[9], x1[6], x1[9]);
57 8235140 : btf_16_adds_subs_out_avx2(&output[7], &output[8], x1[7], x1[8]);
58 8235110 : }
59 :
60 8235950 : static void idct16_new_avx2(const __m256i *input, __m256i *output,
61 : int8_t cos_bit) {
62 : (void)(cos_bit);
63 8235950 : const int32_t *cospi = cospi_arr(INV_COS_BIT);
64 8235820 : const __m256i _r = _mm256_set1_epi32(1 << (INV_COS_BIT - 1));
65 :
66 8235820 : __m256i cospi_p60_m04 = pair_set_w16_epi16(cospi[60], -cospi[4]);
67 8235670 : __m256i cospi_p04_p60 = pair_set_w16_epi16(cospi[4], cospi[60]);
68 8235160 : __m256i cospi_p28_m36 = pair_set_w16_epi16(cospi[28], -cospi[36]);
69 8234750 : __m256i cospi_p36_p28 = pair_set_w16_epi16(cospi[36], cospi[28]);
70 8234250 : __m256i cospi_p44_m20 = pair_set_w16_epi16(cospi[44], -cospi[20]);
71 8233930 : __m256i cospi_p20_p44 = pair_set_w16_epi16(cospi[20], cospi[44]);
72 8233760 : __m256i cospi_p12_m52 = pair_set_w16_epi16(cospi[12], -cospi[52]);
73 8233580 : __m256i cospi_p52_p12 = pair_set_w16_epi16(cospi[52], cospi[12]);
74 8233490 : __m256i cospi_p56_m08 = pair_set_w16_epi16(cospi[56], -cospi[8]);
75 8233390 : __m256i cospi_p08_p56 = pair_set_w16_epi16(cospi[8], cospi[56]);
76 8233280 : __m256i cospi_p24_m40 = pair_set_w16_epi16(cospi[24], -cospi[40]);
77 8233190 : __m256i cospi_p40_p24 = pair_set_w16_epi16(cospi[40], cospi[24]);
78 8233120 : __m256i cospi_p32_p32 = pair_set_w16_epi16(cospi[32], cospi[32]);
79 8233110 : __m256i cospi_p32_m32 = pair_set_w16_epi16(cospi[32], -cospi[32]);
80 8233140 : __m256i cospi_p48_m16 = pair_set_w16_epi16(cospi[48], -cospi[16]);
81 8233210 : __m256i cospi_p16_p48 = pair_set_w16_epi16(cospi[16], cospi[48]);
82 8233190 : __m256i cospi_m16_p48 = pair_set_w16_epi16(-cospi[16], cospi[48]);
83 8233210 : __m256i cospi_p48_p16 = pair_set_w16_epi16(cospi[48], cospi[16]);
84 8233230 : __m256i cospi_m48_m16 = pair_set_w16_epi16(-cospi[48], -cospi[16]);
85 :
86 : // stage 1
87 : __m256i x1[16];
88 8233300 : x1[0] = input[0];
89 8233300 : x1[1] = input[8];
90 8233300 : x1[2] = input[4];
91 8233300 : x1[3] = input[12];
92 8233300 : x1[4] = input[2];
93 8233300 : x1[5] = input[10];
94 8233300 : x1[6] = input[6];
95 8233300 : x1[7] = input[14];
96 8233300 : x1[8] = input[1];
97 8233300 : x1[9] = input[9];
98 8233300 : x1[10] = input[5];
99 8233300 : x1[11] = input[13];
100 8233300 : x1[12] = input[3];
101 8233300 : x1[13] = input[11];
102 8233300 : x1[14] = input[7];
103 8233300 : x1[15] = input[15];
104 :
105 : // stage 2
106 8233300 : btf_16_w16_avx2(cospi_p60_m04, cospi_p04_p60, &x1[8], &x1[15], _r, cos_bit);
107 8235560 : btf_16_w16_avx2(cospi_p28_m36, cospi_p36_p28, &x1[9], &x1[14], _r, cos_bit);
108 8235710 : btf_16_w16_avx2(cospi_p44_m20, cospi_p20_p44, &x1[10], &x1[13], _r, cos_bit);
109 8236010 : btf_16_w16_avx2(cospi_p12_m52, cospi_p52_p12, &x1[11], &x1[12], _r, cos_bit);
110 :
111 : // stage 3
112 8236060 : btf_16_w16_avx2(cospi_p56_m08, cospi_p08_p56, &x1[4], &x1[7], _r, cos_bit);
113 8236150 : btf_16_w16_avx2(cospi_p24_m40, cospi_p40_p24, &x1[5], &x1[6], _r, cos_bit);
114 8235970 : btf_16_adds_subs_avx2(&x1[8], &x1[9]);
115 8235570 : btf_16_adds_subs_avx2(&x1[11], &x1[10]);
116 8234890 : btf_16_adds_subs_avx2(&x1[12], &x1[13]);
117 8234130 : btf_16_adds_subs_avx2(&x1[15], &x1[14]);
118 :
119 : // stage 4
120 8233710 : btf_16_w16_avx2(cospi_p32_p32, cospi_p32_m32, &x1[0], &x1[1], _r, cos_bit);
121 8236250 : btf_16_w16_avx2(cospi_p48_m16, cospi_p16_p48, &x1[2], &x1[3], _r, cos_bit);
122 8236190 : btf_16_adds_subs_avx2(&x1[4], &x1[5]);
123 8235820 : btf_16_adds_subs_avx2(&x1[7], &x1[6]);
124 8235010 : btf_16_w16_avx2(cospi_m16_p48, cospi_p48_p16, &x1[9], &x1[14], _r, cos_bit);
125 8236270 : btf_16_w16_avx2(cospi_m48_m16, cospi_m16_p48, &x1[10], &x1[13], _r, cos_bit);
126 :
127 8236620 : idct16_stage5_avx2(x1, cospi, _r, cos_bit);
128 8233890 : idct16_stage6_avx2(x1, cospi, _r, cos_bit);
129 8236210 : idct16_stage7_avx2(output, x1);
130 8234580 : }
131 :
132 765 : static void idct16_low8_new_avx2(const __m256i *input, __m256i *output,
133 : int8_t cos_bit) {
134 : (void)(cos_bit);
135 765 : const int32_t *cospi = cospi_arr(INV_COS_BIT);
136 765 : const __m256i _r = _mm256_set1_epi32(1 << (INV_COS_BIT - 1));
137 :
138 765 : const __m256i cospi_m16_p48 = pair_set_w16_epi16(-cospi[16], cospi[48]);
139 765 : const __m256i cospi_p48_p16 = pair_set_w16_epi16(cospi[48], cospi[16]);
140 765 : const __m256i cospi_m48_m16 = pair_set_w16_epi16(-cospi[48], -cospi[16]);
141 :
142 : // stage 1
143 : __m256i x1[16];
144 765 : x1[0] = input[0];
145 765 : x1[2] = input[4];
146 765 : x1[4] = input[2];
147 765 : x1[6] = input[6];
148 765 : x1[8] = input[1];
149 765 : x1[10] = input[5];
150 765 : x1[12] = input[3];
151 765 : x1[14] = input[7];
152 :
153 : // stage 2
154 3060 : btf_16_w16_0_avx2(cospi[60], cospi[4], x1[8], x1[8], x1[15]);
155 3060 : btf_16_w16_0_avx2(-cospi[36], cospi[28], x1[14], x1[9], x1[14]);
156 3060 : btf_16_w16_0_avx2(cospi[44], cospi[20], x1[10], x1[10], x1[13]);
157 3060 : btf_16_w16_0_avx2(-cospi[52], cospi[12], x1[12], x1[11], x1[12]);
158 :
159 : // stage 3
160 3060 : btf_16_w16_0_avx2(cospi[56], cospi[8], x1[4], x1[4], x1[7]);
161 3060 : btf_16_w16_0_avx2(-cospi[40], cospi[24], x1[6], x1[5], x1[6]);
162 765 : btf_16_adds_subs_avx2(&x1[8], &x1[9]);
163 765 : btf_16_adds_subs_avx2(&x1[11], &x1[10]);
164 765 : btf_16_adds_subs_avx2(&x1[12], &x1[13]);
165 765 : btf_16_adds_subs_avx2(&x1[15], &x1[14]);
166 :
167 : // stage 4
168 3060 : btf_16_w16_0_avx2(cospi[32], cospi[32], x1[0], x1[0], x1[1]);
169 3060 : btf_16_w16_0_avx2(cospi[48], cospi[16], x1[2], x1[2], x1[3]);
170 765 : btf_16_adds_subs_avx2(&x1[4], &x1[5]);
171 765 : btf_16_adds_subs_avx2(&x1[7], &x1[6]);
172 765 : btf_16_w16_avx2(cospi_m16_p48, cospi_p48_p16, &x1[9], &x1[14], _r, cos_bit);
173 765 : btf_16_w16_avx2(cospi_m48_m16, cospi_m16_p48, &x1[10], &x1[13], _r, cos_bit);
174 :
175 765 : idct16_stage5_avx2(x1, cospi, _r, cos_bit);
176 765 : idct16_stage6_avx2(x1, cospi, _r, cos_bit);
177 765 : idct16_stage7_avx2(output, x1);
178 765 : }
179 :
180 1472 : static void idct16_low1_new_avx2(const __m256i *input, __m256i *output,
181 : int8_t cos_bit) {
182 : (void)(cos_bit);
183 1472 : const int32_t *cospi = cospi_arr(INV_COS_BIT);
184 :
185 : // stage 1
186 : __m256i x1[2];
187 1472 : x1[0] = input[0];
188 :
189 : // stage 2
190 : // stage 3
191 : // stage 4
192 5888 : btf_16_w16_0_avx2(cospi[32], cospi[32], x1[0], x1[0], x1[1]);
193 :
194 : // stage 5
195 : // stage 6
196 1472 : output[0] = x1[0];
197 1472 : output[1] = x1[1];
198 1472 : output[2] = x1[1];
199 1472 : output[3] = x1[0];
200 1472 : output[4] = x1[0];
201 1472 : output[5] = x1[1];
202 1472 : output[6] = x1[1];
203 1472 : output[7] = x1[0];
204 1472 : output[8] = x1[0];
205 1472 : output[9] = x1[1];
206 1472 : output[10] = x1[1];
207 1472 : output[11] = x1[0];
208 1472 : output[12] = x1[0];
209 1472 : output[13] = x1[1];
210 1472 : output[14] = x1[1];
211 1472 : output[15] = x1[0];
212 1472 : }
213 :
214 1301800 : static INLINE void iadst16_stage3_avx2(__m256i *x) {
215 1301800 : btf_16_adds_subs_avx2(&x[0], &x[8]);
216 1301790 : btf_16_adds_subs_avx2(&x[1], &x[9]);
217 1301760 : btf_16_adds_subs_avx2(&x[2], &x[10]);
218 1301750 : btf_16_adds_subs_avx2(&x[3], &x[11]);
219 1301740 : btf_16_adds_subs_avx2(&x[4], &x[12]);
220 1301730 : btf_16_adds_subs_avx2(&x[5], &x[13]);
221 1301720 : btf_16_adds_subs_avx2(&x[6], &x[14]);
222 1301720 : btf_16_adds_subs_avx2(&x[7], &x[15]);
223 1301720 : }
224 :
225 1301760 : static INLINE void iadst16_stage4_avx2(__m256i *x, const int32_t *cospi,
226 : const __m256i _r, int8_t cos_bit) {
227 1301760 : const __m256i cospi_p08_p56 = pair_set_w16_epi16(cospi[8], cospi[56]);
228 1301740 : const __m256i cospi_p56_m08 = pair_set_w16_epi16(cospi[56], -cospi[8]);
229 1301720 : const __m256i cospi_p40_p24 = pair_set_w16_epi16(cospi[40], cospi[24]);
230 1301700 : const __m256i cospi_p24_m40 = pair_set_w16_epi16(cospi[24], -cospi[40]);
231 1301690 : const __m256i cospi_m56_p08 = pair_set_w16_epi16(-cospi[56], cospi[8]);
232 1301680 : const __m256i cospi_m24_p40 = pair_set_w16_epi16(-cospi[24], cospi[40]);
233 1301690 : btf_16_w16_avx2(cospi_p08_p56, cospi_p56_m08, &x[8], &x[9], _r, cos_bit);
234 1301800 : btf_16_w16_avx2(cospi_p40_p24, cospi_p24_m40, &x[10], &x[11], _r, cos_bit);
235 1301810 : btf_16_w16_avx2(cospi_m56_p08, cospi_p08_p56, &x[12], &x[13], _r, cos_bit);
236 1301800 : btf_16_w16_avx2(cospi_m24_p40, cospi_p40_p24, &x[14], &x[15], _r, cos_bit);
237 1301800 : }
238 :
239 1301800 : static INLINE void iadst16_stage5_avx2(__m256i *x) {
240 1301800 : btf_16_adds_subs_avx2(&x[0], &x[4]);
241 1301800 : btf_16_adds_subs_avx2(&x[1], &x[5]);
242 1301780 : btf_16_adds_subs_avx2(&x[2], &x[6]);
243 1301760 : btf_16_adds_subs_avx2(&x[3], &x[7]);
244 1301760 : btf_16_adds_subs_avx2(&x[8], &x[12]);
245 1301750 : btf_16_adds_subs_avx2(&x[9], &x[13]);
246 1301740 : btf_16_adds_subs_avx2(&x[10], &x[14]);
247 1301740 : btf_16_adds_subs_avx2(&x[11], &x[15]);
248 1301740 : }
249 :
250 1301760 : static INLINE void iadst16_stage6_avx2(__m256i *x, const int32_t *cospi,
251 : const __m256i _r, int8_t cos_bit) {
252 1301760 : const __m256i cospi_p16_p48 = pair_set_w16_epi16(cospi[16], cospi[48]);
253 1301750 : const __m256i cospi_p48_m16 = pair_set_w16_epi16(cospi[48], -cospi[16]);
254 1301730 : const __m256i cospi_m48_p16 = pair_set_w16_epi16(-cospi[48], cospi[16]);
255 1301720 : btf_16_w16_avx2(cospi_p16_p48, cospi_p48_m16, &x[4], &x[5], _r, cos_bit);
256 1301810 : btf_16_w16_avx2(cospi_m48_p16, cospi_p16_p48, &x[6], &x[7], _r, cos_bit);
257 1301810 : btf_16_w16_avx2(cospi_p16_p48, cospi_p48_m16, &x[12], &x[13], _r, cos_bit);
258 1301800 : btf_16_w16_avx2(cospi_m48_p16, cospi_p16_p48, &x[14], &x[15], _r, cos_bit);
259 1301800 : }
260 :
261 1301800 : static INLINE void iadst16_stage7_avx2(__m256i *x) {
262 1301800 : btf_16_adds_subs_avx2(&x[0], &x[2]);
263 1301800 : btf_16_adds_subs_avx2(&x[1], &x[3]);
264 1301780 : btf_16_adds_subs_avx2(&x[4], &x[6]);
265 1301760 : btf_16_adds_subs_avx2(&x[5], &x[7]);
266 1301760 : btf_16_adds_subs_avx2(&x[8], &x[10]);
267 1301760 : btf_16_adds_subs_avx2(&x[9], &x[11]);
268 1301750 : btf_16_adds_subs_avx2(&x[12], &x[14]);
269 1301750 : btf_16_adds_subs_avx2(&x[13], &x[15]);
270 1301750 : }
271 :
272 1302190 : static INLINE void iadst16_stage8_avx2(__m256i *x1, const int32_t *cospi,
273 : const __m256i _r, int8_t cos_bit) {
274 1302190 : const __m256i cospi_p32_p32 = pair_set_w16_epi16(cospi[32], cospi[32]);
275 1302190 : const __m256i cospi_p32_m32 = pair_set_w16_epi16(cospi[32], -cospi[32]);
276 1302180 : btf_16_w16_avx2(cospi_p32_p32, cospi_p32_m32, &x1[2], &x1[3], _r, cos_bit);
277 1302230 : btf_16_w16_avx2(cospi_p32_p32, cospi_p32_m32, &x1[6], &x1[7], _r, cos_bit);
278 1302240 : btf_16_w16_avx2(cospi_p32_p32, cospi_p32_m32, &x1[10], &x1[11], _r, cos_bit);
279 1302210 : btf_16_w16_avx2(cospi_p32_p32, cospi_p32_m32, &x1[14], &x1[15], _r, cos_bit);
280 1302220 : }
281 :
282 1302220 : static INLINE void iadst16_stage9_avx2(__m256i *output, __m256i *x1) {
283 1302220 : const __m256i __zero = _mm256_setzero_si256();
284 1302220 : output[0] = x1[0];
285 1302220 : output[1] = _mm256_subs_epi16(__zero, x1[8]);
286 1302220 : output[2] = x1[12];
287 1302220 : output[3] = _mm256_subs_epi16(__zero, x1[4]);
288 1302220 : output[4] = x1[6];
289 1302220 : output[5] = _mm256_subs_epi16(__zero, x1[14]);
290 1302220 : output[6] = x1[10];
291 1302220 : output[7] = _mm256_subs_epi16(__zero, x1[2]);
292 1302220 : output[8] = x1[3];
293 1302220 : output[9] = _mm256_subs_epi16(__zero, x1[11]);
294 1302220 : output[10] = x1[15];
295 1302220 : output[11] = _mm256_subs_epi16(__zero, x1[7]);
296 1302220 : output[12] = x1[5];
297 1302220 : output[13] = _mm256_subs_epi16(__zero, x1[13]);
298 1302220 : output[14] = x1[9];
299 1302220 : output[15] = _mm256_subs_epi16(__zero, x1[1]);
300 1302220 : }
301 :
302 1301330 : static void iadst16_new_avx2(const __m256i *input, __m256i *output,
303 : int8_t cos_bit) {
304 : (void)(cos_bit);
305 1301330 : const int32_t *cospi = cospi_arr(INV_COS_BIT);
306 :
307 1301320 : const __m256i _r = _mm256_set1_epi32(1 << (INV_COS_BIT - 1));
308 :
309 1301320 : __m256i cospi_p02_p62 = pair_set_w16_epi16(cospi[2], cospi[62]);
310 1301310 : __m256i cospi_p62_m02 = pair_set_w16_epi16(cospi[62], -cospi[2]);
311 1301280 : __m256i cospi_p10_p54 = pair_set_w16_epi16(cospi[10], cospi[54]);
312 1301250 : __m256i cospi_p54_m10 = pair_set_w16_epi16(cospi[54], -cospi[10]);
313 1301250 : __m256i cospi_p18_p46 = pair_set_w16_epi16(cospi[18], cospi[46]);
314 1301240 : __m256i cospi_p46_m18 = pair_set_w16_epi16(cospi[46], -cospi[18]);
315 1301240 : __m256i cospi_p26_p38 = pair_set_w16_epi16(cospi[26], cospi[38]);
316 1301240 : __m256i cospi_p38_m26 = pair_set_w16_epi16(cospi[38], -cospi[26]);
317 1301220 : __m256i cospi_p34_p30 = pair_set_w16_epi16(cospi[34], cospi[30]);
318 1301220 : __m256i cospi_p30_m34 = pair_set_w16_epi16(cospi[30], -cospi[34]);
319 1301210 : __m256i cospi_p42_p22 = pair_set_w16_epi16(cospi[42], cospi[22]);
320 1301210 : __m256i cospi_p22_m42 = pair_set_w16_epi16(cospi[22], -cospi[42]);
321 1301200 : __m256i cospi_p50_p14 = pair_set_w16_epi16(cospi[50], cospi[14]);
322 1301200 : __m256i cospi_p14_m50 = pair_set_w16_epi16(cospi[14], -cospi[50]);
323 1301200 : __m256i cospi_p58_p06 = pair_set_w16_epi16(cospi[58], cospi[6]);
324 1301190 : __m256i cospi_p06_m58 = pair_set_w16_epi16(cospi[6], -cospi[58]);
325 :
326 : // stage 1
327 : __m256i x1[16];
328 1301190 : x1[0] = input[15];
329 1301190 : x1[1] = input[0];
330 1301190 : x1[2] = input[13];
331 1301190 : x1[3] = input[2];
332 1301190 : x1[4] = input[11];
333 1301190 : x1[5] = input[4];
334 1301190 : x1[6] = input[9];
335 1301190 : x1[7] = input[6];
336 1301190 : x1[8] = input[7];
337 1301190 : x1[9] = input[8];
338 1301190 : x1[10] = input[5];
339 1301190 : x1[11] = input[10];
340 1301190 : x1[12] = input[3];
341 1301190 : x1[13] = input[12];
342 1301190 : x1[14] = input[1];
343 1301190 : x1[15] = input[14];
344 :
345 : // stage 2
346 1301190 : btf_16_w16_avx2(cospi_p02_p62, cospi_p62_m02, &x1[0], &x1[1], _r, cos_bit);
347 1301310 : btf_16_w16_avx2(cospi_p10_p54, cospi_p54_m10, &x1[2], &x1[3], _r, cos_bit);
348 1301320 : btf_16_w16_avx2(cospi_p18_p46, cospi_p46_m18, &x1[4], &x1[5], _r, cos_bit);
349 1301320 : btf_16_w16_avx2(cospi_p26_p38, cospi_p38_m26, &x1[6], &x1[7], _r, cos_bit);
350 1301330 : btf_16_w16_avx2(cospi_p34_p30, cospi_p30_m34, &x1[8], &x1[9], _r, cos_bit);
351 1301330 : btf_16_w16_avx2(cospi_p42_p22, cospi_p22_m42, &x1[10], &x1[11], _r, cos_bit);
352 1301330 : btf_16_w16_avx2(cospi_p50_p14, cospi_p14_m50, &x1[12], &x1[13], _r, cos_bit);
353 1301340 : btf_16_w16_avx2(cospi_p58_p06, cospi_p06_m58, &x1[14], &x1[15], _r, cos_bit);
354 :
355 1301340 : iadst16_stage3_avx2(x1);
356 1301270 : iadst16_stage4_avx2(x1, cospi, _r, cos_bit);
357 1301350 : iadst16_stage5_avx2(x1);
358 1301290 : iadst16_stage6_avx2(x1, cospi, _r, cos_bit);
359 1301340 : iadst16_stage7_avx2(x1);
360 1301290 : iadst16_stage8_avx2(x1, cospi, _r, cos_bit);
361 1301330 : iadst16_stage9_avx2(output, x1);
362 1301350 : }
363 :
364 458 : static void iadst16_low8_new_avx2(const __m256i *input, __m256i *output,
365 : int8_t cos_bit) {
366 : (void)(cos_bit);
367 458 : const int32_t *cospi = cospi_arr(INV_COS_BIT);
368 458 : const __m256i _r = _mm256_set1_epi32(1 << (INV_COS_BIT - 1));
369 :
370 : // stage 1
371 : __m256i x1[16];
372 458 : x1[1] = input[0];
373 458 : x1[3] = input[2];
374 458 : x1[5] = input[4];
375 458 : x1[7] = input[6];
376 458 : x1[8] = input[7];
377 458 : x1[10] = input[5];
378 458 : x1[12] = input[3];
379 458 : x1[14] = input[1];
380 :
381 : // stage 2
382 1832 : btf_16_w16_0_avx2(cospi[62], -cospi[2], x1[1], x1[0], x1[1]);
383 1832 : btf_16_w16_0_avx2(cospi[54], -cospi[10], x1[3], x1[2], x1[3]);
384 1832 : btf_16_w16_0_avx2(cospi[46], -cospi[18], x1[5], x1[4], x1[5]);
385 1832 : btf_16_w16_0_avx2(cospi[38], -cospi[26], x1[7], x1[6], x1[7]);
386 1832 : btf_16_w16_0_avx2(cospi[34], cospi[30], x1[8], x1[8], x1[9]);
387 1832 : btf_16_w16_0_avx2(cospi[42], cospi[22], x1[10], x1[10], x1[11]);
388 1832 : btf_16_w16_0_avx2(cospi[50], cospi[14], x1[12], x1[12], x1[13]);
389 1832 : btf_16_w16_0_avx2(cospi[58], cospi[06], x1[14], x1[14], x1[15]);
390 :
391 458 : iadst16_stage3_avx2(x1);
392 458 : iadst16_stage4_avx2(x1, cospi, _r, cos_bit);
393 458 : iadst16_stage5_avx2(x1);
394 458 : iadst16_stage6_avx2(x1, cospi, _r, cos_bit);
395 458 : iadst16_stage7_avx2(x1);
396 458 : iadst16_stage8_avx2(x1, cospi, _r, cos_bit);
397 458 : iadst16_stage9_avx2(output, x1);
398 458 : }
399 :
400 431 : static void iadst16_low1_new_avx2(const __m256i *input, __m256i *output,
401 : int8_t cos_bit) {
402 : (void)(cos_bit);
403 431 : const int32_t *cospi = cospi_arr(INV_COS_BIT);
404 431 : const __m256i _r = _mm256_set1_epi32(1 << (INV_COS_BIT - 1));
405 :
406 431 : const __m256i cospi_p08_p56 = pair_set_w16_epi16(cospi[8], cospi[56]);
407 431 : const __m256i cospi_p56_m08 = pair_set_w16_epi16(cospi[56], -cospi[8]);
408 431 : const __m256i cospi_p16_p48 = pair_set_w16_epi16(cospi[16], cospi[48]);
409 431 : const __m256i cospi_p48_m16 = pair_set_w16_epi16(cospi[48], -cospi[16]);
410 :
411 : // stage 1
412 : __m256i x1[16];
413 431 : x1[1] = input[0];
414 :
415 : // stage 2
416 1724 : btf_16_w16_0_avx2(cospi[62], -cospi[2], x1[1], x1[0], x1[1]);
417 :
418 : // stage 3
419 431 : x1[8] = x1[0];
420 431 : x1[9] = x1[1];
421 :
422 : // stage 4
423 431 : btf_16_w16_avx2(cospi_p08_p56, cospi_p56_m08, &x1[8], &x1[9], _r, cos_bit);
424 :
425 : // stage 5
426 431 : x1[4] = x1[0];
427 431 : x1[5] = x1[1];
428 :
429 431 : x1[12] = x1[8];
430 431 : x1[13] = x1[9];
431 :
432 : // stage 6
433 431 : btf_16_w16_avx2(cospi_p16_p48, cospi_p48_m16, &x1[4], &x1[5], _r, cos_bit);
434 431 : btf_16_w16_avx2(cospi_p16_p48, cospi_p48_m16, &x1[12], &x1[13], _r, cos_bit);
435 :
436 : // stage 7
437 431 : x1[2] = x1[0];
438 431 : x1[3] = x1[1];
439 431 : x1[6] = x1[4];
440 431 : x1[7] = x1[5];
441 431 : x1[10] = x1[8];
442 431 : x1[11] = x1[9];
443 431 : x1[14] = x1[12];
444 431 : x1[15] = x1[13];
445 :
446 431 : iadst16_stage8_avx2(x1, cospi, _r, cos_bit);
447 431 : iadst16_stage9_avx2(output, x1);
448 431 : }
449 :
450 4766690 : static INLINE void idct32_high16_stage3_avx2(__m256i *x) {
451 4766690 : btf_16_adds_subs_avx2(&x[16], &x[17]);
452 4766640 : btf_16_adds_subs_avx2(&x[19], &x[18]);
453 4766530 : btf_16_adds_subs_avx2(&x[20], &x[21]);
454 4766400 : btf_16_adds_subs_avx2(&x[23], &x[22]);
455 4766350 : btf_16_adds_subs_avx2(&x[24], &x[25]);
456 4766290 : btf_16_adds_subs_avx2(&x[27], &x[26]);
457 4766250 : btf_16_adds_subs_avx2(&x[28], &x[29]);
458 4766220 : btf_16_adds_subs_avx2(&x[31], &x[30]);
459 4766190 : }
460 :
461 4766750 : static INLINE void idct32_high16_stage4_avx2(__m256i *x, const int32_t *cospi,
462 : const __m256i _r, int8_t cos_bit) {
463 4766750 : const __m256i cospi_m08_p56 = pair_set_w16_epi16(-cospi[8], cospi[56]);
464 4766580 : const __m256i cospi_p56_p08 = pair_set_w16_epi16(cospi[56], cospi[8]);
465 4766320 : const __m256i cospi_m56_m08 = pair_set_w16_epi16(-cospi[56], -cospi[8]);
466 4766160 : const __m256i cospi_m40_p24 = pair_set_w16_epi16(-cospi[40], cospi[24]);
467 4766060 : const __m256i cospi_p24_p40 = pair_set_w16_epi16(cospi[24], cospi[40]);
468 4766030 : const __m256i cospi_m24_m40 = pair_set_w16_epi16(-cospi[24], -cospi[40]);
469 4765970 : btf_16_w16_avx2(cospi_m08_p56, cospi_p56_p08, &x[17], &x[30], _r, cos_bit);
470 4767020 : btf_16_w16_avx2(cospi_m56_m08, cospi_m08_p56, &x[18], &x[29], _r, cos_bit);
471 4767230 : btf_16_w16_avx2(cospi_m40_p24, cospi_p24_p40, &x[21], &x[26], _r, cos_bit);
472 4767140 : btf_16_w16_avx2(cospi_m24_m40, cospi_m40_p24, &x[22], &x[25], _r, cos_bit);
473 4767190 : }
474 :
475 4766730 : static INLINE void idct32_high24_stage5_avx2(__m256i *x, const int32_t *cospi,
476 : const __m256i _r, int8_t cos_bit) {
477 4766730 : const __m256i cospi_m16_p48 = pair_set_w16_epi16(-cospi[16], cospi[48]);
478 4766580 : const __m256i cospi_p48_p16 = pair_set_w16_epi16(cospi[48], cospi[16]);
479 4766400 : const __m256i cospi_m48_m16 = pair_set_w16_epi16(-cospi[48], -cospi[16]);
480 4766300 : btf_16_w16_avx2(cospi_m16_p48, cospi_p48_p16, &x[9], &x[14], _r, cos_bit);
481 4767100 : btf_16_w16_avx2(cospi_m48_m16, cospi_m16_p48, &x[10], &x[13], _r, cos_bit);
482 4767110 : btf_16_adds_subs_avx2(&x[16], &x[19]);
483 4766990 : btf_16_adds_subs_avx2(&x[17], &x[18]);
484 4766850 : btf_16_adds_subs_avx2(&x[23], &x[20]);
485 4766730 : btf_16_adds_subs_avx2(&x[22], &x[21]);
486 4766660 : btf_16_adds_subs_avx2(&x[24], &x[27]);
487 4766530 : btf_16_adds_subs_avx2(&x[25], &x[26]);
488 4766460 : btf_16_adds_subs_avx2(&x[31], &x[28]);
489 4766400 : btf_16_adds_subs_avx2(&x[30], &x[29]);
490 4766390 : }
491 :
492 4766510 : static INLINE void idct32_high28_stage6_avx2(__m256i *x, const int32_t *cospi,
493 : const __m256i _r, int8_t cos_bit) {
494 4766510 : const __m256i cospi_m32_p32 = pair_set_w16_epi16(-cospi[32], cospi[32]);
495 4766370 : const __m256i cospi_p32_p32 = pair_set_w16_epi16(cospi[32], cospi[32]);
496 4766270 : const __m256i cospi_m16_p48 = pair_set_w16_epi16(-cospi[16], cospi[48]);
497 4766180 : const __m256i cospi_p48_p16 = pair_set_w16_epi16(cospi[48], cospi[16]);
498 4766130 : const __m256i cospi_m48_m16 = pair_set_w16_epi16(-cospi[48], -cospi[16]);
499 4766110 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[5], &x[6], _r, cos_bit);
500 4767070 : btf_16_adds_subs_avx2(&x[8], &x[11]);
501 4766970 : btf_16_adds_subs_avx2(&x[9], &x[10]);
502 4766760 : btf_16_adds_subs_avx2(&x[15], &x[12]);
503 4766630 : btf_16_adds_subs_avx2(&x[14], &x[13]);
504 4766420 : btf_16_w16_avx2(cospi_m16_p48, cospi_p48_p16, &x[18], &x[29], _r, cos_bit);
505 4767180 : btf_16_w16_avx2(cospi_m16_p48, cospi_p48_p16, &x[19], &x[28], _r, cos_bit);
506 4767180 : btf_16_w16_avx2(cospi_m48_m16, cospi_m16_p48, &x[20], &x[27], _r, cos_bit);
507 4767220 : btf_16_w16_avx2(cospi_m48_m16, cospi_m16_p48, &x[21], &x[26], _r, cos_bit);
508 4767250 : }
509 :
510 4767240 : static INLINE void idct32_stage7_avx2(__m256i *x, const int32_t *cospi,
511 : const __m256i _r, int8_t cos_bit) {
512 4767240 : const __m256i cospi_m32_p32 = pair_set_w16_epi16(-cospi[32], cospi[32]);
513 4767160 : const __m256i cospi_p32_p32 = pair_set_w16_epi16(cospi[32], cospi[32]);
514 4767020 : btf_16_adds_subs_avx2(&x[0], &x[7]);
515 4767030 : btf_16_adds_subs_avx2(&x[1], &x[6]);
516 4766990 : btf_16_adds_subs_avx2(&x[2], &x[5]);
517 4766930 : btf_16_adds_subs_avx2(&x[3], &x[4]);
518 4766910 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[10], &x[13], _r, cos_bit);
519 4767370 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[11], &x[12], _r, cos_bit);
520 4767380 : btf_16_adds_subs_avx2(&x[16], &x[23]);
521 4767310 : btf_16_adds_subs_avx2(&x[17], &x[22]);
522 4767190 : btf_16_adds_subs_avx2(&x[18], &x[21]);
523 4767030 : btf_16_adds_subs_avx2(&x[19], &x[20]);
524 4766950 : btf_16_adds_subs_avx2(&x[31], &x[24]);
525 4766890 : btf_16_adds_subs_avx2(&x[30], &x[25]);
526 4766760 : btf_16_adds_subs_avx2(&x[29], &x[26]);
527 4766700 : btf_16_adds_subs_avx2(&x[28], &x[27]);
528 4766670 : }
529 :
530 4766790 : static INLINE void idct32_stage8_avx2(__m256i *x, const int32_t *cospi,
531 : const __m256i _r, int8_t cos_bit) {
532 4766790 : const __m256i cospi_m32_p32 = pair_set_w16_epi16(-cospi[32], cospi[32]);
533 4766690 : const __m256i cospi_p32_p32 = pair_set_w16_epi16(cospi[32], cospi[32]);
534 4766590 : btf_16_adds_subs_avx2(&x[0], &x[15]);
535 4766580 : btf_16_adds_subs_avx2(&x[1], &x[14]);
536 4766610 : btf_16_adds_subs_avx2(&x[2], &x[13]);
537 4766590 : btf_16_adds_subs_avx2(&x[3], &x[12]);
538 4766620 : btf_16_adds_subs_avx2(&x[4], &x[11]);
539 4766620 : btf_16_adds_subs_avx2(&x[5], &x[10]);
540 4766610 : btf_16_adds_subs_avx2(&x[6], &x[9]);
541 4766610 : btf_16_adds_subs_avx2(&x[7], &x[8]);
542 4766600 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[20], &x[27], _r, cos_bit);
543 4767310 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[21], &x[26], _r, cos_bit);
544 4767420 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[22], &x[25], _r, cos_bit);
545 4767320 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[23], &x[24], _r, cos_bit);
546 4767330 : }
547 :
548 4767330 : static INLINE void idct32_stage9_avx2(__m256i *output, __m256i *x) {
549 4767330 : btf_16_adds_subs_out_avx2(&output[0], &output[31], x[0], x[31]);
550 4767220 : btf_16_adds_subs_out_avx2(&output[1], &output[30], x[1], x[30]);
551 4767090 : btf_16_adds_subs_out_avx2(&output[2], &output[29], x[2], x[29]);
552 4766980 : btf_16_adds_subs_out_avx2(&output[3], &output[28], x[3], x[28]);
553 4766900 : btf_16_adds_subs_out_avx2(&output[4], &output[27], x[4], x[27]);
554 4766860 : btf_16_adds_subs_out_avx2(&output[5], &output[26], x[5], x[26]);
555 4766840 : btf_16_adds_subs_out_avx2(&output[6], &output[25], x[6], x[25]);
556 4766830 : btf_16_adds_subs_out_avx2(&output[7], &output[24], x[7], x[24]);
557 4766830 : btf_16_adds_subs_out_avx2(&output[8], &output[23], x[8], x[23]);
558 4766770 : btf_16_adds_subs_out_avx2(&output[9], &output[22], x[9], x[22]);
559 4766760 : btf_16_adds_subs_out_avx2(&output[10], &output[21], x[10], x[21]);
560 4766770 : btf_16_adds_subs_out_avx2(&output[11], &output[20], x[11], x[20]);
561 4766780 : btf_16_adds_subs_out_avx2(&output[12], &output[19], x[12], x[19]);
562 4766770 : btf_16_adds_subs_out_avx2(&output[13], &output[18], x[13], x[18]);
563 4766760 : btf_16_adds_subs_out_avx2(&output[14], &output[17], x[14], x[17]);
564 4766780 : btf_16_adds_subs_out_avx2(&output[15], &output[16], x[15], x[16]);
565 4766820 : }
566 :
567 872 : static void idct32_low1_new_avx2(const __m256i *input, __m256i *output,
568 : int8_t cos_bit) {
569 : (void)cos_bit;
570 872 : const int32_t *cospi = cospi_arr(INV_COS_BIT);
571 :
572 : // stage 1
573 : __m256i x[2];
574 872 : x[0] = input[0];
575 :
576 : // stage 2
577 : // stage 3
578 : // stage 4
579 : // stage 5
580 3488 : btf_16_w16_0_avx2(cospi[32], cospi[32], x[0], x[0], x[1]);
581 :
582 : // stage 6
583 : // stage 7
584 : // stage 8
585 : // stage 9
586 872 : output[0] = x[0];
587 872 : output[31] = x[0];
588 872 : output[1] = x[1];
589 872 : output[30] = x[1];
590 872 : output[2] = x[1];
591 872 : output[29] = x[1];
592 872 : output[3] = x[0];
593 872 : output[28] = x[0];
594 872 : output[4] = x[0];
595 872 : output[27] = x[0];
596 872 : output[5] = x[1];
597 872 : output[26] = x[1];
598 872 : output[6] = x[1];
599 872 : output[25] = x[1];
600 872 : output[7] = x[0];
601 872 : output[24] = x[0];
602 872 : output[8] = x[0];
603 872 : output[23] = x[0];
604 872 : output[9] = x[1];
605 872 : output[22] = x[1];
606 872 : output[10] = x[1];
607 872 : output[21] = x[1];
608 872 : output[11] = x[0];
609 872 : output[20] = x[0];
610 872 : output[12] = x[0];
611 872 : output[19] = x[0];
612 872 : output[13] = x[1];
613 872 : output[18] = x[1];
614 872 : output[14] = x[1];
615 872 : output[17] = x[1];
616 872 : output[15] = x[0];
617 872 : output[16] = x[0];
618 872 : }
619 :
620 550 : static void idct32_low8_new_avx2(const __m256i *input, __m256i *output,
621 : int8_t cos_bit) {
622 : (void)cos_bit;
623 550 : const int32_t *cospi = cospi_arr(INV_COS_BIT);
624 550 : const __m256i _r = _mm256_set1_epi32(1 << (INV_COS_BIT - 1));
625 :
626 : // stage 1
627 : __m256i x[32];
628 550 : x[0] = input[0];
629 550 : x[4] = input[4];
630 550 : x[8] = input[2];
631 550 : x[12] = input[6];
632 550 : x[16] = input[1];
633 550 : x[20] = input[5];
634 550 : x[24] = input[3];
635 550 : x[28] = input[7];
636 :
637 : // stage 2
638 2200 : btf_16_w16_0_avx2(cospi[62], cospi[2], x[16], x[16], x[31]);
639 2200 : btf_16_w16_0_avx2(-cospi[50], cospi[14], x[28], x[19], x[28]);
640 2200 : btf_16_w16_0_avx2(cospi[54], cospi[10], x[20], x[20], x[27]);
641 2200 : btf_16_w16_0_avx2(-cospi[58], cospi[6], x[24], x[23], x[24]);
642 :
643 : // stage 3
644 2200 : btf_16_w16_0_avx2(cospi[60], cospi[4], x[8], x[8], x[15]);
645 2200 : btf_16_w16_0_avx2(-cospi[52], cospi[12], x[12], x[11], x[12]);
646 550 : x[17] = x[16];
647 550 : x[18] = x[19];
648 550 : x[21] = x[20];
649 550 : x[22] = x[23];
650 550 : x[25] = x[24];
651 550 : x[26] = x[27];
652 550 : x[29] = x[28];
653 550 : x[30] = x[31];
654 :
655 : // stage 4
656 2200 : btf_16_w16_0_avx2(cospi[56], cospi[8], x[4], x[4], x[7]);
657 550 : x[9] = x[8];
658 550 : x[10] = x[11];
659 550 : x[13] = x[12];
660 550 : x[14] = x[15];
661 550 : idct32_high16_stage4_avx2(x, cospi, _r, cos_bit);
662 :
663 : // stage 5
664 2200 : btf_16_w16_0_avx2(cospi[32], cospi[32], x[0], x[0], x[1]);
665 550 : x[5] = x[4];
666 550 : x[6] = x[7];
667 550 : idct32_high24_stage5_avx2(x, cospi, _r, cos_bit);
668 : // stage 6
669 550 : x[3] = x[0];
670 550 : x[2] = x[1];
671 550 : idct32_high28_stage6_avx2(x, cospi, _r, cos_bit);
672 :
673 550 : idct32_stage7_avx2(x, cospi, _r, cos_bit);
674 550 : idct32_stage8_avx2(x, cospi, _r, cos_bit);
675 550 : idct32_stage9_avx2(output, x);
676 550 : }
677 :
678 47 : static void idct32_low16_new_avx2(const __m256i *input, __m256i *output,
679 : int8_t cos_bit) {
680 : (void)cos_bit;
681 47 : const int32_t *cospi = cospi_arr(INV_COS_BIT);
682 47 : const __m256i _r = _mm256_set1_epi32(1 << (INV_COS_BIT - 1));
683 :
684 : // stage 1
685 : __m256i x[32];
686 47 : x[0] = input[0];
687 47 : x[2] = input[8];
688 47 : x[4] = input[4];
689 47 : x[6] = input[12];
690 47 : x[8] = input[2];
691 47 : x[10] = input[10];
692 47 : x[12] = input[6];
693 47 : x[14] = input[14];
694 47 : x[16] = input[1];
695 47 : x[18] = input[9];
696 47 : x[20] = input[5];
697 47 : x[22] = input[13];
698 47 : x[24] = input[3];
699 47 : x[26] = input[11];
700 47 : x[28] = input[7];
701 47 : x[30] = input[15];
702 :
703 : // stage 2
704 188 : btf_16_w16_0_avx2(cospi[62], cospi[2], x[16], x[16], x[31]);
705 188 : btf_16_w16_0_avx2(-cospi[34], cospi[30], x[30], x[17], x[30]);
706 188 : btf_16_w16_0_avx2(cospi[46], cospi[18], x[18], x[18], x[29]);
707 188 : btf_16_w16_0_avx2(-cospi[50], cospi[14], x[28], x[19], x[28]);
708 188 : btf_16_w16_0_avx2(cospi[54], cospi[10], x[20], x[20], x[27]);
709 188 : btf_16_w16_0_avx2(-cospi[42], cospi[22], x[26], x[21], x[26]);
710 188 : btf_16_w16_0_avx2(cospi[38], cospi[26], x[22], x[22], x[25]);
711 188 : btf_16_w16_0_avx2(-cospi[58], cospi[6], x[24], x[23], x[24]);
712 :
713 : // stage 3
714 188 : btf_16_w16_0_avx2(cospi[60], cospi[4], x[8], x[8], x[15]);
715 188 : btf_16_w16_0_avx2(-cospi[36], cospi[28], x[14], x[9], x[14]);
716 188 : btf_16_w16_0_avx2(cospi[44], cospi[20], x[10], x[10], x[13]);
717 188 : btf_16_w16_0_avx2(-cospi[52], cospi[12], x[12], x[11], x[12]);
718 47 : idct32_high16_stage3_avx2(x);
719 :
720 : // stage 4
721 188 : btf_16_w16_0_avx2(cospi[56], cospi[8], x[4], x[4], x[7]);
722 188 : btf_16_w16_0_avx2(-cospi[40], cospi[24], x[6], x[5], x[6]);
723 47 : btf_16_adds_subs_avx2(&x[8], &x[9]);
724 47 : btf_16_adds_subs_avx2(&x[11], &x[10]);
725 47 : btf_16_adds_subs_avx2(&x[12], &x[13]);
726 47 : btf_16_adds_subs_avx2(&x[15], &x[14]);
727 47 : idct32_high16_stage4_avx2(x, cospi, _r, cos_bit);
728 :
729 : // stage 5
730 188 : btf_16_w16_0_avx2(cospi[32], cospi[32], x[0], x[0], x[1]);
731 188 : btf_16_w16_0_avx2(cospi[48], cospi[16], x[2], x[2], x[3]);
732 47 : btf_16_adds_subs_avx2(&x[4], &x[5]);
733 47 : btf_16_adds_subs_avx2(&x[7], &x[6]);
734 47 : idct32_high24_stage5_avx2(x, cospi, _r, cos_bit);
735 :
736 47 : btf_16_adds_subs_avx2(&x[0], &x[3]);
737 47 : btf_16_adds_subs_avx2(&x[1], &x[2]);
738 47 : idct32_high28_stage6_avx2(x, cospi, _r, cos_bit);
739 :
740 47 : idct32_stage7_avx2(x, cospi, _r, cos_bit);
741 47 : idct32_stage8_avx2(x, cospi, _r, cos_bit);
742 47 : idct32_stage9_avx2(output, x);
743 47 : }
744 :
745 4766500 : static void idct32_new_avx2(const __m256i *input, __m256i *output,
746 : int8_t cos_bit) {
747 : (void)(cos_bit);
748 4766500 : const int32_t *cospi = cospi_arr(INV_COS_BIT);
749 4766460 : const __m256i _r = _mm256_set1_epi32(1 << (INV_COS_BIT - 1));
750 :
751 4766460 : __m256i cospi_p62_m02 = pair_set_w16_epi16(cospi[62], -cospi[2]);
752 4766410 : __m256i cospi_p02_p62 = pair_set_w16_epi16(cospi[2], cospi[62]);
753 4766240 : __m256i cospi_p30_m34 = pair_set_w16_epi16(cospi[30], -cospi[34]);
754 4766070 : __m256i cospi_p34_p30 = pair_set_w16_epi16(cospi[34], cospi[30]);
755 4765890 : __m256i cospi_p46_m18 = pair_set_w16_epi16(cospi[46], -cospi[18]);
756 4765810 : __m256i cospi_p18_p46 = pair_set_w16_epi16(cospi[18], cospi[46]);
757 4765720 : __m256i cospi_p14_m50 = pair_set_w16_epi16(cospi[14], -cospi[50]);
758 4765650 : __m256i cospi_p50_p14 = pair_set_w16_epi16(cospi[50], cospi[14]);
759 4765600 : __m256i cospi_p54_m10 = pair_set_w16_epi16(cospi[54], -cospi[10]);
760 4765560 : __m256i cospi_p10_p54 = pair_set_w16_epi16(cospi[10], cospi[54]);
761 4765530 : __m256i cospi_p22_m42 = pair_set_w16_epi16(cospi[22], -cospi[42]);
762 4765510 : __m256i cospi_p42_p22 = pair_set_w16_epi16(cospi[42], cospi[22]);
763 4765480 : __m256i cospi_p38_m26 = pair_set_w16_epi16(cospi[38], -cospi[26]);
764 4765470 : __m256i cospi_p26_p38 = pair_set_w16_epi16(cospi[26], cospi[38]);
765 4765460 : __m256i cospi_p06_m58 = pair_set_w16_epi16(cospi[6], -cospi[58]);
766 4765510 : __m256i cospi_p58_p06 = pair_set_w16_epi16(cospi[58], cospi[6]);
767 4765520 : __m256i cospi_p60_m04 = pair_set_w16_epi16(cospi[60], -cospi[4]);
768 4765520 : __m256i cospi_p04_p60 = pair_set_w16_epi16(cospi[4], cospi[60]);
769 4765520 : __m256i cospi_p28_m36 = pair_set_w16_epi16(cospi[28], -cospi[36]);
770 4765580 : __m256i cospi_p36_p28 = pair_set_w16_epi16(cospi[36], cospi[28]);
771 4765560 : __m256i cospi_p44_m20 = pair_set_w16_epi16(cospi[44], -cospi[20]);
772 4765480 : __m256i cospi_p20_p44 = pair_set_w16_epi16(cospi[20], cospi[44]);
773 4765410 : __m256i cospi_p12_m52 = pair_set_w16_epi16(cospi[12], -cospi[52]);
774 4765340 : __m256i cospi_p52_p12 = pair_set_w16_epi16(cospi[52], cospi[12]);
775 4765290 : __m256i cospi_p56_m08 = pair_set_w16_epi16(cospi[56], -cospi[8]);
776 4765250 : __m256i cospi_p08_p56 = pair_set_w16_epi16(cospi[8], cospi[56]);
777 4765230 : __m256i cospi_p24_m40 = pair_set_w16_epi16(cospi[24], -cospi[40]);
778 4765180 : __m256i cospi_p40_p24 = pair_set_w16_epi16(cospi[40], cospi[24]);
779 4765160 : __m256i cospi_p32_p32 = pair_set_w16_epi16(cospi[32], cospi[32]);
780 4765170 : __m256i cospi_p32_m32 = pair_set_w16_epi16(cospi[32], -cospi[32]);
781 4765180 : __m256i cospi_p48_m16 = pair_set_w16_epi16(cospi[48], -cospi[16]);
782 4765200 : __m256i cospi_p16_p48 = pair_set_w16_epi16(cospi[16], cospi[48]);
783 :
784 : // stage 1
785 : __m256i x1[32];
786 4765220 : x1[0] = input[0];
787 4765220 : x1[1] = input[16];
788 4765220 : x1[2] = input[8];
789 4765220 : x1[3] = input[24];
790 4765220 : x1[4] = input[4];
791 4765220 : x1[5] = input[20];
792 4765220 : x1[6] = input[12];
793 4765220 : x1[7] = input[28];
794 4765220 : x1[8] = input[2];
795 4765220 : x1[9] = input[18];
796 4765220 : x1[10] = input[10];
797 4765220 : x1[11] = input[26];
798 4765220 : x1[12] = input[6];
799 4765220 : x1[13] = input[22];
800 4765220 : x1[14] = input[14];
801 4765220 : x1[15] = input[30];
802 4765220 : x1[16] = input[1];
803 4765220 : x1[17] = input[17];
804 4765220 : x1[18] = input[9];
805 4765220 : x1[19] = input[25];
806 4765220 : x1[20] = input[5];
807 4765220 : x1[21] = input[21];
808 4765220 : x1[22] = input[13];
809 4765220 : x1[23] = input[29];
810 4765220 : x1[24] = input[3];
811 4765220 : x1[25] = input[19];
812 4765220 : x1[26] = input[11];
813 4765220 : x1[27] = input[27];
814 4765220 : x1[28] = input[7];
815 4765220 : x1[29] = input[23];
816 4765220 : x1[30] = input[15];
817 4765220 : x1[31] = input[31];
818 :
819 : // stage 2
820 4765220 : btf_16_w16_avx2(cospi_p62_m02, cospi_p02_p62, &x1[16], &x1[31], _r, cos_bit);
821 4766380 : btf_16_w16_avx2(cospi_p30_m34, cospi_p34_p30, &x1[17], &x1[30], _r, cos_bit);
822 4766580 : btf_16_w16_avx2(cospi_p46_m18, cospi_p18_p46, &x1[18], &x1[29], _r, cos_bit);
823 4766680 : btf_16_w16_avx2(cospi_p14_m50, cospi_p50_p14, &x1[19], &x1[28], _r, cos_bit);
824 4766660 : btf_16_w16_avx2(cospi_p54_m10, cospi_p10_p54, &x1[20], &x1[27], _r, cos_bit);
825 4766680 : btf_16_w16_avx2(cospi_p22_m42, cospi_p42_p22, &x1[21], &x1[26], _r, cos_bit);
826 4766720 : btf_16_w16_avx2(cospi_p38_m26, cospi_p26_p38, &x1[22], &x1[25], _r, cos_bit);
827 4766710 : btf_16_w16_avx2(cospi_p06_m58, cospi_p58_p06, &x1[23], &x1[24], _r, cos_bit);
828 :
829 : // stage 3
830 4766700 : btf_16_w16_avx2(cospi_p60_m04, cospi_p04_p60, &x1[8], &x1[15], _r, cos_bit);
831 4766720 : btf_16_w16_avx2(cospi_p28_m36, cospi_p36_p28, &x1[9], &x1[14], _r, cos_bit);
832 4766670 : btf_16_w16_avx2(cospi_p44_m20, cospi_p20_p44, &x1[10], &x1[13], _r, cos_bit);
833 4766680 : btf_16_w16_avx2(cospi_p12_m52, cospi_p52_p12, &x1[11], &x1[12], _r, cos_bit);
834 4766660 : idct32_high16_stage3_avx2(x1);
835 :
836 : // stage 4
837 4766170 : btf_16_w16_avx2(cospi_p56_m08, cospi_p08_p56, &x1[4], &x1[7], _r, cos_bit);
838 4766730 : btf_16_w16_avx2(cospi_p24_m40, cospi_p40_p24, &x1[5], &x1[6], _r, cos_bit);
839 4766700 : btf_16_adds_subs_avx2(&x1[8], &x1[9]);
840 4766570 : btf_16_adds_subs_avx2(&x1[11], &x1[10]);
841 4766300 : btf_16_adds_subs_avx2(&x1[12], &x1[13]);
842 4766060 : btf_16_adds_subs_avx2(&x1[15], &x1[14]);
843 4765940 : idct32_high16_stage4_avx2(x1, cospi, _r, cos_bit);
844 :
845 : // stage 5
846 4766620 : btf_16_w16_avx2(cospi_p32_p32, cospi_p32_m32, &x1[0], &x1[1], _r, cos_bit);
847 4766700 : btf_16_w16_avx2(cospi_p48_m16, cospi_p16_p48, &x1[2], &x1[3], _r, cos_bit);
848 4766590 : btf_16_adds_subs_avx2(&x1[4], &x1[5]);
849 4766440 : btf_16_adds_subs_avx2(&x1[7], &x1[6]);
850 4766100 : idct32_high24_stage5_avx2(x1, cospi, _r, cos_bit);
851 :
852 : // stage 6
853 4765800 : btf_16_adds_subs_avx2(&x1[0], &x1[3]);
854 4765780 : btf_16_adds_subs_avx2(&x1[1], &x1[2]);
855 4765720 : idct32_high28_stage6_avx2(x1, cospi, _r, cos_bit);
856 :
857 4766660 : idct32_stage7_avx2(x1, cospi, _r, cos_bit);
858 4766080 : idct32_stage8_avx2(x1, cospi, _r, cos_bit);
859 4766740 : idct32_stage9_avx2(output, x1);
860 4766300 : }
861 :
862 2042900 : static INLINE void idct64_stage4_high32_avx2(__m256i *x, const int32_t *cospi,
863 : const __m256i _r, int8_t cos_bit) {
864 : (void)cos_bit;
865 2042900 : const __m256i cospi_m04_p60 = pair_set_w16_epi16(-cospi[4], cospi[60]);
866 2042870 : const __m256i cospi_p60_p04 = pair_set_w16_epi16(cospi[60], cospi[4]);
867 2042850 : const __m256i cospi_m60_m04 = pair_set_w16_epi16(-cospi[60], -cospi[4]);
868 2042820 : const __m256i cospi_m36_p28 = pair_set_w16_epi16(-cospi[36], cospi[28]);
869 2042790 : const __m256i cospi_p28_p36 = pair_set_w16_epi16(cospi[28], cospi[36]);
870 2042790 : const __m256i cospi_m28_m36 = pair_set_w16_epi16(-cospi[28], -cospi[36]);
871 2042790 : const __m256i cospi_m20_p44 = pair_set_w16_epi16(-cospi[20], cospi[44]);
872 2042780 : const __m256i cospi_p44_p20 = pair_set_w16_epi16(cospi[44], cospi[20]);
873 2042780 : const __m256i cospi_m44_m20 = pair_set_w16_epi16(-cospi[44], -cospi[20]);
874 2042790 : const __m256i cospi_m52_p12 = pair_set_w16_epi16(-cospi[52], cospi[12]);
875 2042800 : const __m256i cospi_p12_p52 = pair_set_w16_epi16(cospi[12], cospi[52]);
876 2042800 : const __m256i cospi_m12_m52 = pair_set_w16_epi16(-cospi[12], -cospi[52]);
877 2042810 : btf_16_w16_avx2(cospi_m04_p60, cospi_p60_p04, &x[33], &x[62], _r, cos_bit);
878 2043030 : btf_16_w16_avx2(cospi_m60_m04, cospi_m04_p60, &x[34], &x[61], _r, cos_bit);
879 2043050 : btf_16_w16_avx2(cospi_m36_p28, cospi_p28_p36, &x[37], &x[58], _r, cos_bit);
880 2043060 : btf_16_w16_avx2(cospi_m28_m36, cospi_m36_p28, &x[38], &x[57], _r, cos_bit);
881 2043070 : btf_16_w16_avx2(cospi_m20_p44, cospi_p44_p20, &x[41], &x[54], _r, cos_bit);
882 2043090 : btf_16_w16_avx2(cospi_m44_m20, cospi_m20_p44, &x[42], &x[53], _r, cos_bit);
883 2043100 : btf_16_w16_avx2(cospi_m52_p12, cospi_p12_p52, &x[45], &x[50], _r, cos_bit);
884 2043110 : btf_16_w16_avx2(cospi_m12_m52, cospi_m52_p12, &x[46], &x[49], _r, cos_bit);
885 2043120 : }
886 :
887 2042990 : static INLINE void idct64_stage5_high48_avx2(__m256i *x, const int32_t *cospi,
888 : const __m256i _r, int8_t cos_bit) {
889 : (void)cos_bit;
890 2042990 : const __m256i cospi_m08_p56 = pair_set_w16_epi16(-cospi[8], cospi[56]);
891 2042950 : const __m256i cospi_p56_p08 = pair_set_w16_epi16(cospi[56], cospi[8]);
892 2042910 : const __m256i cospi_m56_m08 = pair_set_w16_epi16(-cospi[56], -cospi[8]);
893 2042860 : const __m256i cospi_m40_p24 = pair_set_w16_epi16(-cospi[40], cospi[24]);
894 2042850 : const __m256i cospi_p24_p40 = pair_set_w16_epi16(cospi[24], cospi[40]);
895 2042840 : const __m256i cospi_m24_m40 = pair_set_w16_epi16(-cospi[24], -cospi[40]);
896 2042840 : btf_16_w16_avx2(cospi_m08_p56, cospi_p56_p08, &x[17], &x[30], _r, cos_bit);
897 2043070 : btf_16_w16_avx2(cospi_m56_m08, cospi_m08_p56, &x[18], &x[29], _r, cos_bit);
898 2043150 : btf_16_w16_avx2(cospi_m40_p24, cospi_p24_p40, &x[21], &x[26], _r, cos_bit);
899 2043120 : btf_16_w16_avx2(cospi_m24_m40, cospi_m40_p24, &x[22], &x[25], _r, cos_bit);
900 2043100 : btf_16_adds_subs_avx2(&x[32], &x[35]);
901 2043070 : btf_16_adds_subs_avx2(&x[33], &x[34]);
902 2043020 : btf_16_adds_subs_avx2(&x[39], &x[36]);
903 2042980 : btf_16_adds_subs_avx2(&x[38], &x[37]);
904 2042970 : btf_16_adds_subs_avx2(&x[40], &x[43]);
905 2042950 : btf_16_adds_subs_avx2(&x[41], &x[42]);
906 2042950 : btf_16_adds_subs_avx2(&x[47], &x[44]);
907 2042940 : btf_16_adds_subs_avx2(&x[46], &x[45]);
908 2042940 : btf_16_adds_subs_avx2(&x[48], &x[51]);
909 2042920 : btf_16_adds_subs_avx2(&x[49], &x[50]);
910 2042920 : btf_16_adds_subs_avx2(&x[55], &x[52]);
911 2042920 : btf_16_adds_subs_avx2(&x[54], &x[53]);
912 2042910 : btf_16_adds_subs_avx2(&x[56], &x[59]);
913 2042920 : btf_16_adds_subs_avx2(&x[57], &x[58]);
914 2042920 : btf_16_adds_subs_avx2(&x[63], &x[60]);
915 2042910 : btf_16_adds_subs_avx2(&x[62], &x[61]);
916 2042890 : }
917 :
918 2043550 : static INLINE void idct64_stage6_high32_avx2(__m256i *x, const int32_t *cospi,
919 : const __m256i _r, int8_t cos_bit) {
920 : (void)cos_bit;
921 2043550 : const __m256i cospi_m08_p56 = pair_set_w16_epi16(-cospi[8], cospi[56]);
922 2043530 : const __m256i cospi_p56_p08 = pair_set_w16_epi16(cospi[56], cospi[8]);
923 2043510 : const __m256i cospi_m56_m08 = pair_set_w16_epi16(-cospi[56], -cospi[8]);
924 2043480 : const __m256i cospi_m40_p24 = pair_set_w16_epi16(-cospi[40], cospi[24]);
925 2043450 : const __m256i cospi_p24_p40 = pair_set_w16_epi16(cospi[24], cospi[40]);
926 2043460 : const __m256i cospi_m24_m40 = pair_set_w16_epi16(-cospi[24], -cospi[40]);
927 2043450 : btf_16_w16_avx2(cospi_m08_p56, cospi_p56_p08, &x[34], &x[61], _r, cos_bit);
928 2043690 : btf_16_w16_avx2(cospi_m08_p56, cospi_p56_p08, &x[35], &x[60], _r, cos_bit);
929 2043740 : btf_16_w16_avx2(cospi_m56_m08, cospi_m08_p56, &x[36], &x[59], _r, cos_bit);
930 2043730 : btf_16_w16_avx2(cospi_m56_m08, cospi_m08_p56, &x[37], &x[58], _r, cos_bit);
931 2043730 : btf_16_w16_avx2(cospi_m40_p24, cospi_p24_p40, &x[42], &x[53], _r, cos_bit);
932 2043740 : btf_16_w16_avx2(cospi_m40_p24, cospi_p24_p40, &x[43], &x[52], _r, cos_bit);
933 2043730 : btf_16_w16_avx2(cospi_m24_m40, cospi_m40_p24, &x[44], &x[51], _r, cos_bit);
934 2043730 : btf_16_w16_avx2(cospi_m24_m40, cospi_m40_p24, &x[45], &x[50], _r, cos_bit);
935 2043730 : }
936 :
937 2043070 : static INLINE void idct64_stage6_high48_avx2(__m256i *x, const int32_t *cospi,
938 : const __m256i _r, int8_t cos_bit) {
939 2043070 : btf_16_adds_subs_avx2(&x[16], &x[19]);
940 2043070 : btf_16_adds_subs_avx2(&x[17], &x[18]);
941 2043040 : btf_16_adds_subs_avx2(&x[23], &x[20]);
942 2043010 : btf_16_adds_subs_avx2(&x[22], &x[21]);
943 2043000 : btf_16_adds_subs_avx2(&x[24], &x[27]);
944 2042980 : btf_16_adds_subs_avx2(&x[25], &x[26]);
945 2042950 : btf_16_adds_subs_avx2(&x[31], &x[28]);
946 2042940 : btf_16_adds_subs_avx2(&x[30], &x[29]);
947 2042930 : idct64_stage6_high32_avx2(x, cospi, _r, cos_bit);
948 2043130 : }
949 :
950 2043650 : static INLINE void idct64_stage7_high48_avx2(__m256i *x, const int32_t *cospi,
951 : const __m256i _r, int8_t cos_bit) {
952 : (void)cos_bit;
953 2043650 : const __m256i cospi_m16_p48 = pair_set_w16_epi16(-cospi[16], cospi[48]);
954 2043630 : const __m256i cospi_p48_p16 = pair_set_w16_epi16(cospi[48], cospi[16]);
955 2043600 : const __m256i cospi_m48_m16 = pair_set_w16_epi16(-cospi[48], -cospi[16]);
956 2043580 : btf_16_w16_avx2(cospi_m16_p48, cospi_p48_p16, &x[18], &x[29], _r, cos_bit);
957 2043730 : btf_16_w16_avx2(cospi_m16_p48, cospi_p48_p16, &x[19], &x[28], _r, cos_bit);
958 2043740 : btf_16_w16_avx2(cospi_m48_m16, cospi_m16_p48, &x[20], &x[27], _r, cos_bit);
959 2043740 : btf_16_w16_avx2(cospi_m48_m16, cospi_m16_p48, &x[21], &x[26], _r, cos_bit);
960 2043740 : btf_16_adds_subs_avx2(&x[32], &x[39]);
961 2043710 : btf_16_adds_subs_avx2(&x[33], &x[38]);
962 2043670 : btf_16_adds_subs_avx2(&x[34], &x[37]);
963 2043620 : btf_16_adds_subs_avx2(&x[35], &x[36]);
964 2043600 : btf_16_adds_subs_avx2(&x[47], &x[40]);
965 2043590 : btf_16_adds_subs_avx2(&x[46], &x[41]);
966 2043580 : btf_16_adds_subs_avx2(&x[45], &x[42]);
967 2043560 : btf_16_adds_subs_avx2(&x[44], &x[43]);
968 2043540 : btf_16_adds_subs_avx2(&x[48], &x[55]);
969 2043540 : btf_16_adds_subs_avx2(&x[49], &x[54]);
970 2043540 : btf_16_adds_subs_avx2(&x[50], &x[53]);
971 2043540 : btf_16_adds_subs_avx2(&x[51], &x[52]);
972 2043540 : btf_16_adds_subs_avx2(&x[63], &x[56]);
973 2043540 : btf_16_adds_subs_avx2(&x[62], &x[57]);
974 2043540 : btf_16_adds_subs_avx2(&x[61], &x[58]);
975 2043540 : btf_16_adds_subs_avx2(&x[60], &x[59]);
976 2043540 : }
977 :
978 2043700 : static INLINE void idct64_stage8_high48_avx2(__m256i *x, const int32_t *cospi,
979 : const __m256i _r, int8_t cos_bit) {
980 : (void)cos_bit;
981 2043700 : const __m256i cospi_m16_p48 = pair_set_w16_epi16(-cospi[16], cospi[48]);
982 2043660 : const __m256i cospi_p48_p16 = pair_set_w16_epi16(cospi[48], cospi[16]);
983 2043630 : const __m256i cospi_m48_m16 = pair_set_w16_epi16(-cospi[48], -cospi[16]);
984 2043610 : btf_16_adds_subs_avx2(&x[16], &x[23]);
985 2043610 : btf_16_adds_subs_avx2(&x[17], &x[22]);
986 2043630 : btf_16_adds_subs_avx2(&x[18], &x[21]);
987 2043610 : btf_16_adds_subs_avx2(&x[19], &x[20]);
988 2043620 : btf_16_adds_subs_avx2(&x[31], &x[24]);
989 2043620 : btf_16_adds_subs_avx2(&x[30], &x[25]);
990 2043620 : btf_16_adds_subs_avx2(&x[29], &x[26]);
991 2043620 : btf_16_adds_subs_avx2(&x[28], &x[27]);
992 2043620 : btf_16_w16_avx2(cospi_m16_p48, cospi_p48_p16, &x[36], &x[59], _r, cos_bit);
993 2043720 : btf_16_w16_avx2(cospi_m16_p48, cospi_p48_p16, &x[37], &x[58], _r, cos_bit);
994 2043740 : btf_16_w16_avx2(cospi_m16_p48, cospi_p48_p16, &x[38], &x[57], _r, cos_bit);
995 2043740 : btf_16_w16_avx2(cospi_m16_p48, cospi_p48_p16, &x[39], &x[56], _r, cos_bit);
996 2043750 : btf_16_w16_avx2(cospi_m48_m16, cospi_m16_p48, &x[40], &x[55], _r, cos_bit);
997 2043760 : btf_16_w16_avx2(cospi_m48_m16, cospi_m16_p48, &x[41], &x[54], _r, cos_bit);
998 2043740 : btf_16_w16_avx2(cospi_m48_m16, cospi_m16_p48, &x[42], &x[53], _r, cos_bit);
999 2043750 : btf_16_w16_avx2(cospi_m48_m16, cospi_m16_p48, &x[43], &x[52], _r, cos_bit);
1000 2043760 : }
1001 :
1002 2043750 : static INLINE void idct64_stage9_avx2(__m256i *x, const int32_t *cospi,
1003 : const __m256i _r, int8_t cos_bit) {
1004 : (void)cos_bit;
1005 2043750 : const __m256i cospi_m32_p32 = pair_set_w16_epi16(-cospi[32], cospi[32]);
1006 2043740 : const __m256i cospi_p32_p32 = pair_set_w16_epi16(cospi[32], cospi[32]);
1007 2043730 : btf_16_adds_subs_avx2(&x[0], &x[15]);
1008 2043730 : btf_16_adds_subs_avx2(&x[1], &x[14]);
1009 2043720 : btf_16_adds_subs_avx2(&x[2], &x[13]);
1010 2043710 : btf_16_adds_subs_avx2(&x[3], &x[12]);
1011 2043700 : btf_16_adds_subs_avx2(&x[4], &x[11]);
1012 2043700 : btf_16_adds_subs_avx2(&x[5], &x[10]);
1013 2043700 : btf_16_adds_subs_avx2(&x[6], &x[9]);
1014 2043700 : btf_16_adds_subs_avx2(&x[7], &x[8]);
1015 2043700 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[20], &x[27], _r, cos_bit);
1016 2043770 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[21], &x[26], _r, cos_bit);
1017 2043780 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[22], &x[25], _r, cos_bit);
1018 2043770 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[23], &x[24], _r, cos_bit);
1019 2043770 : btf_16_adds_subs_avx2(&x[32], &x[47]);
1020 2043750 : btf_16_adds_subs_avx2(&x[33], &x[46]);
1021 2043730 : btf_16_adds_subs_avx2(&x[34], &x[45]);
1022 2043710 : btf_16_adds_subs_avx2(&x[35], &x[44]);
1023 2043690 : btf_16_adds_subs_avx2(&x[36], &x[43]);
1024 2043670 : btf_16_adds_subs_avx2(&x[37], &x[42]);
1025 2043660 : btf_16_adds_subs_avx2(&x[38], &x[41]);
1026 2043650 : btf_16_adds_subs_avx2(&x[39], &x[40]);
1027 2043650 : btf_16_adds_subs_avx2(&x[63], &x[48]);
1028 2043650 : btf_16_adds_subs_avx2(&x[62], &x[49]);
1029 2043660 : btf_16_adds_subs_avx2(&x[61], &x[50]);
1030 2043650 : btf_16_adds_subs_avx2(&x[60], &x[51]);
1031 2043650 : btf_16_adds_subs_avx2(&x[59], &x[52]);
1032 2043660 : btf_16_adds_subs_avx2(&x[58], &x[53]);
1033 2043650 : btf_16_adds_subs_avx2(&x[57], &x[54]);
1034 2043650 : btf_16_adds_subs_avx2(&x[56], &x[55]);
1035 2043640 : }
1036 :
1037 2043660 : static INLINE void idct64_stage10_avx2(__m256i *x, const int32_t *cospi,
1038 : const __m256i _r, int8_t cos_bit) {
1039 : (void)cos_bit;
1040 2043660 : const __m256i cospi_m32_p32 = pair_set_w16_epi16(-cospi[32], cospi[32]);
1041 2043650 : const __m256i cospi_p32_p32 = pair_set_w16_epi16(cospi[32], cospi[32]);
1042 2043630 : btf_16_adds_subs_avx2(&x[0], &x[31]);
1043 2043620 : btf_16_adds_subs_avx2(&x[1], &x[30]);
1044 2043620 : btf_16_adds_subs_avx2(&x[2], &x[29]);
1045 2043620 : btf_16_adds_subs_avx2(&x[3], &x[28]);
1046 2043620 : btf_16_adds_subs_avx2(&x[4], &x[27]);
1047 2043620 : btf_16_adds_subs_avx2(&x[5], &x[26]);
1048 2043620 : btf_16_adds_subs_avx2(&x[6], &x[25]);
1049 2043620 : btf_16_adds_subs_avx2(&x[7], &x[24]);
1050 2043620 : btf_16_adds_subs_avx2(&x[8], &x[23]);
1051 2043620 : btf_16_adds_subs_avx2(&x[9], &x[22]);
1052 2043620 : btf_16_adds_subs_avx2(&x[10], &x[21]);
1053 2043620 : btf_16_adds_subs_avx2(&x[11], &x[20]);
1054 2043610 : btf_16_adds_subs_avx2(&x[12], &x[19]);
1055 2043600 : btf_16_adds_subs_avx2(&x[13], &x[18]);
1056 2043590 : btf_16_adds_subs_avx2(&x[14], &x[17]);
1057 2043580 : btf_16_adds_subs_avx2(&x[15], &x[16]);
1058 2043580 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[40], &x[55], _r, cos_bit);
1059 2043710 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[41], &x[54], _r, cos_bit);
1060 2043720 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[42], &x[53], _r, cos_bit);
1061 2043720 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[43], &x[52], _r, cos_bit);
1062 2043740 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[44], &x[51], _r, cos_bit);
1063 2043750 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[45], &x[50], _r, cos_bit);
1064 2043750 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[46], &x[49], _r, cos_bit);
1065 2043750 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[47], &x[48], _r, cos_bit);
1066 2043750 : }
1067 :
1068 2043740 : static INLINE void idct64_stage11_avx2(__m256i *output, __m256i *x) {
1069 2043740 : btf_16_adds_subs_out_avx2(&output[0], &output[63], x[0], x[63]);
1070 2043720 : btf_16_adds_subs_out_avx2(&output[1], &output[62], x[1], x[62]);
1071 2043710 : btf_16_adds_subs_out_avx2(&output[2], &output[61], x[2], x[61]);
1072 2043680 : btf_16_adds_subs_out_avx2(&output[3], &output[60], x[3], x[60]);
1073 2043680 : btf_16_adds_subs_out_avx2(&output[4], &output[59], x[4], x[59]);
1074 2043680 : btf_16_adds_subs_out_avx2(&output[5], &output[58], x[5], x[58]);
1075 2043670 : btf_16_adds_subs_out_avx2(&output[6], &output[57], x[6], x[57]);
1076 2043660 : btf_16_adds_subs_out_avx2(&output[7], &output[56], x[7], x[56]);
1077 2043670 : btf_16_adds_subs_out_avx2(&output[8], &output[55], x[8], x[55]);
1078 2043670 : btf_16_adds_subs_out_avx2(&output[9], &output[54], x[9], x[54]);
1079 2043670 : btf_16_adds_subs_out_avx2(&output[10], &output[53], x[10], x[53]);
1080 2043670 : btf_16_adds_subs_out_avx2(&output[11], &output[52], x[11], x[52]);
1081 2043670 : btf_16_adds_subs_out_avx2(&output[12], &output[51], x[12], x[51]);
1082 2043660 : btf_16_adds_subs_out_avx2(&output[13], &output[50], x[13], x[50]);
1083 2043660 : btf_16_adds_subs_out_avx2(&output[14], &output[49], x[14], x[49]);
1084 2043660 : btf_16_adds_subs_out_avx2(&output[15], &output[48], x[15], x[48]);
1085 2043680 : btf_16_adds_subs_out_avx2(&output[16], &output[47], x[16], x[47]);
1086 2043670 : btf_16_adds_subs_out_avx2(&output[17], &output[46], x[17], x[46]);
1087 2043670 : btf_16_adds_subs_out_avx2(&output[18], &output[45], x[18], x[45]);
1088 2043660 : btf_16_adds_subs_out_avx2(&output[19], &output[44], x[19], x[44]);
1089 2043640 : btf_16_adds_subs_out_avx2(&output[20], &output[43], x[20], x[43]);
1090 2043640 : btf_16_adds_subs_out_avx2(&output[21], &output[42], x[21], x[42]);
1091 2043640 : btf_16_adds_subs_out_avx2(&output[22], &output[41], x[22], x[41]);
1092 2043630 : btf_16_adds_subs_out_avx2(&output[23], &output[40], x[23], x[40]);
1093 2043630 : btf_16_adds_subs_out_avx2(&output[24], &output[39], x[24], x[39]);
1094 2043630 : btf_16_adds_subs_out_avx2(&output[25], &output[38], x[25], x[38]);
1095 2043640 : btf_16_adds_subs_out_avx2(&output[26], &output[37], x[26], x[37]);
1096 2043630 : btf_16_adds_subs_out_avx2(&output[27], &output[36], x[27], x[36]);
1097 2043620 : btf_16_adds_subs_out_avx2(&output[28], &output[35], x[28], x[35]);
1098 2043620 : btf_16_adds_subs_out_avx2(&output[29], &output[34], x[29], x[34]);
1099 2043630 : btf_16_adds_subs_out_avx2(&output[30], &output[33], x[30], x[33]);
1100 2043630 : btf_16_adds_subs_out_avx2(&output[31], &output[32], x[31], x[32]);
1101 2043660 : }
1102 :
1103 465 : static void idct64_low1_new_avx2(const __m256i *input, __m256i *output,
1104 : int8_t cos_bit) {
1105 : (void)cos_bit;
1106 465 : const int32_t *cospi = cospi_arr(INV_COS_BIT);
1107 :
1108 : // stage 1
1109 : __m256i x[32];
1110 465 : x[0] = input[0];
1111 :
1112 : // stage 2
1113 : // stage 3
1114 : // stage 4
1115 : // stage 5
1116 : // stage 6
1117 1860 : btf_16_w16_0_avx2(cospi[32], cospi[32], x[0], x[0], x[1]);
1118 :
1119 : // stage 7
1120 : // stage 8
1121 : // stage 9
1122 : // stage 10
1123 : // stage 11
1124 465 : output[0] = x[0];
1125 465 : output[63] = x[0];
1126 465 : output[1] = x[1];
1127 465 : output[62] = x[1];
1128 465 : output[2] = x[1];
1129 465 : output[61] = x[1];
1130 465 : output[3] = x[0];
1131 465 : output[60] = x[0];
1132 465 : output[4] = x[0];
1133 465 : output[59] = x[0];
1134 465 : output[5] = x[1];
1135 465 : output[58] = x[1];
1136 465 : output[6] = x[1];
1137 465 : output[57] = x[1];
1138 465 : output[7] = x[0];
1139 465 : output[56] = x[0];
1140 465 : output[8] = x[0];
1141 465 : output[55] = x[0];
1142 465 : output[9] = x[1];
1143 465 : output[54] = x[1];
1144 465 : output[10] = x[1];
1145 465 : output[53] = x[1];
1146 465 : output[11] = x[0];
1147 465 : output[52] = x[0];
1148 465 : output[12] = x[0];
1149 465 : output[51] = x[0];
1150 465 : output[13] = x[1];
1151 465 : output[50] = x[1];
1152 465 : output[14] = x[1];
1153 465 : output[49] = x[1];
1154 465 : output[15] = x[0];
1155 465 : output[48] = x[0];
1156 465 : output[16] = x[0];
1157 465 : output[47] = x[0];
1158 465 : output[17] = x[1];
1159 465 : output[46] = x[1];
1160 465 : output[18] = x[1];
1161 465 : output[45] = x[1];
1162 465 : output[19] = x[0];
1163 465 : output[44] = x[0];
1164 465 : output[20] = x[0];
1165 465 : output[43] = x[0];
1166 465 : output[21] = x[1];
1167 465 : output[42] = x[1];
1168 465 : output[22] = x[1];
1169 465 : output[41] = x[1];
1170 465 : output[23] = x[0];
1171 465 : output[40] = x[0];
1172 465 : output[24] = x[0];
1173 465 : output[39] = x[0];
1174 465 : output[25] = x[1];
1175 465 : output[38] = x[1];
1176 465 : output[26] = x[1];
1177 465 : output[37] = x[1];
1178 465 : output[27] = x[0];
1179 465 : output[36] = x[0];
1180 465 : output[28] = x[0];
1181 465 : output[35] = x[0];
1182 465 : output[29] = x[1];
1183 465 : output[34] = x[1];
1184 465 : output[30] = x[1];
1185 465 : output[33] = x[1];
1186 465 : output[31] = x[0];
1187 465 : output[32] = x[0];
1188 465 : }
1189 :
1190 600 : static void idct64_low8_new_avx2(const __m256i *input, __m256i *output,
1191 : int8_t cos_bit) {
1192 : (void)cos_bit;
1193 600 : const int32_t *cospi = cospi_arr(INV_COS_BIT);
1194 600 : const __m256i _r = _mm256_set1_epi32(1 << (INV_COS_BIT - 1));
1195 600 : const __m256i cospi_m04_p60 = pair_set_w16_epi16(-cospi[4], cospi[60]);
1196 600 : const __m256i cospi_p60_p04 = pair_set_w16_epi16(cospi[60], cospi[4]);
1197 600 : const __m256i cospi_m36_p28 = pair_set_w16_epi16(-cospi[36], cospi[28]);
1198 600 : const __m256i cospi_m28_m36 = pair_set_w16_epi16(-cospi[28], -cospi[36]);
1199 600 : const __m256i cospi_m20_p44 = pair_set_w16_epi16(-cospi[20], cospi[44]);
1200 600 : const __m256i cospi_p44_p20 = pair_set_w16_epi16(cospi[44], cospi[20]);
1201 600 : const __m256i cospi_m52_p12 = pair_set_w16_epi16(-cospi[52], cospi[12]);
1202 600 : const __m256i cospi_m12_m52 = pair_set_w16_epi16(-cospi[12], -cospi[52]);
1203 600 : const __m256i cospi_m08_p56 = pair_set_w16_epi16(-cospi[8], cospi[56]);
1204 600 : const __m256i cospi_p56_p08 = pair_set_w16_epi16(cospi[56], cospi[8]);
1205 600 : const __m256i cospi_m40_p24 = pair_set_w16_epi16(-cospi[40], cospi[24]);
1206 600 : const __m256i cospi_m24_m40 = pair_set_w16_epi16(-cospi[24], -cospi[40]);
1207 600 : const __m256i cospi_p32_p32 = pair_set_w16_epi16(cospi[32], cospi[32]);
1208 600 : const __m256i cospi_m16_p48 = pair_set_w16_epi16(-cospi[16], cospi[48]);
1209 600 : const __m256i cospi_p48_p16 = pair_set_w16_epi16(cospi[48], cospi[16]);
1210 600 : const __m256i cospi_m32_p32 = pair_set_w16_epi16(-cospi[32], cospi[32]);
1211 :
1212 : // stage 1
1213 : __m256i x[64];
1214 600 : x[0] = input[0];
1215 600 : x[8] = input[4];
1216 600 : x[16] = input[2];
1217 600 : x[24] = input[6];
1218 600 : x[32] = input[1];
1219 600 : x[40] = input[5];
1220 600 : x[48] = input[3];
1221 600 : x[56] = input[7];
1222 :
1223 : // stage 2
1224 2400 : btf_16_w16_0_avx2(cospi[63], cospi[1], x[32], x[32], x[63]);
1225 2400 : btf_16_w16_0_avx2(-cospi[57], cospi[7], x[56], x[39], x[56]);
1226 2400 : btf_16_w16_0_avx2(cospi[59], cospi[5], x[40], x[40], x[55]);
1227 2400 : btf_16_w16_0_avx2(-cospi[61], cospi[3], x[48], x[47], x[48]);
1228 :
1229 : // stage 3
1230 2400 : btf_16_w16_0_avx2(cospi[62], cospi[2], x[16], x[16], x[31]);
1231 2400 : btf_16_w16_0_avx2(-cospi[58], cospi[6], x[24], x[23], x[24]);
1232 600 : x[33] = x[32];
1233 600 : x[38] = x[39];
1234 600 : x[41] = x[40];
1235 600 : x[46] = x[47];
1236 600 : x[49] = x[48];
1237 600 : x[54] = x[55];
1238 600 : x[57] = x[56];
1239 600 : x[62] = x[63];
1240 :
1241 : // stage 4
1242 2400 : btf_16_w16_0_avx2(cospi[60], cospi[4], x[8], x[8], x[15]);
1243 600 : x[17] = x[16];
1244 600 : x[22] = x[23];
1245 600 : x[25] = x[24];
1246 600 : x[30] = x[31];
1247 600 : btf_16_w16_avx2(cospi_m04_p60, cospi_p60_p04, &x[33], &x[62], _r, cos_bit);
1248 600 : btf_16_w16_avx2(cospi_m28_m36, cospi_m36_p28, &x[38], &x[57], _r, cos_bit);
1249 600 : btf_16_w16_avx2(cospi_m20_p44, cospi_p44_p20, &x[41], &x[54], _r, cos_bit);
1250 600 : btf_16_w16_avx2(cospi_m12_m52, cospi_m52_p12, &x[46], &x[49], _r, cos_bit);
1251 :
1252 : // stage 5
1253 600 : x[9] = x[8];
1254 600 : x[14] = x[15];
1255 600 : btf_16_w16_avx2(cospi_m08_p56, cospi_p56_p08, &x[17], &x[30], _r, cos_bit);
1256 600 : btf_16_w16_avx2(cospi_m24_m40, cospi_m40_p24, &x[22], &x[25], _r, cos_bit);
1257 600 : x[35] = x[32];
1258 600 : x[34] = x[33];
1259 600 : x[36] = x[39];
1260 600 : x[37] = x[38];
1261 600 : x[43] = x[40];
1262 600 : x[42] = x[41];
1263 600 : x[44] = x[47];
1264 600 : x[45] = x[46];
1265 600 : x[51] = x[48];
1266 600 : x[50] = x[49];
1267 600 : x[52] = x[55];
1268 600 : x[53] = x[54];
1269 600 : x[59] = x[56];
1270 600 : x[58] = x[57];
1271 600 : x[60] = x[63];
1272 600 : x[61] = x[62];
1273 :
1274 : // stage 6
1275 2400 : btf_16_w16_0_avx2(cospi[32], cospi[32], x[0], x[0], x[1]);
1276 600 : btf_16_w16_avx2(cospi_m16_p48, cospi_p48_p16, &x[9], &x[14], _r, cos_bit);
1277 600 : x[19] = x[16];
1278 600 : x[18] = x[17];
1279 600 : x[20] = x[23];
1280 600 : x[21] = x[22];
1281 600 : x[27] = x[24];
1282 600 : x[26] = x[25];
1283 600 : x[28] = x[31];
1284 600 : x[29] = x[30];
1285 600 : idct64_stage6_high32_avx2(x, cospi, _r, cos_bit);
1286 :
1287 : // stage 7
1288 600 : x[3] = x[0];
1289 600 : x[2] = x[1];
1290 600 : x[11] = x[8];
1291 600 : x[10] = x[9];
1292 600 : x[12] = x[15];
1293 600 : x[13] = x[14];
1294 600 : idct64_stage7_high48_avx2(x, cospi, _r, cos_bit);
1295 :
1296 : // stage 8
1297 600 : x[7] = x[0];
1298 600 : x[6] = x[1];
1299 600 : x[5] = x[2];
1300 600 : x[4] = x[3];
1301 600 : x[9] = x[9];
1302 600 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[10], &x[13], _r, cos_bit);
1303 600 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[11], &x[12], _r, cos_bit);
1304 600 : idct64_stage8_high48_avx2(x, cospi, _r, cos_bit);
1305 :
1306 600 : idct64_stage9_avx2(x, cospi, _r, cos_bit);
1307 600 : idct64_stage10_avx2(x, cospi, _r, cos_bit);
1308 600 : idct64_stage11_avx2(output, x);
1309 600 : }
1310 :
1311 55 : static void idct64_low16_new_avx2(const __m256i *input, __m256i *output,
1312 : int8_t cos_bit) {
1313 : (void)cos_bit;
1314 55 : const int32_t *cospi = cospi_arr(INV_COS_BIT);
1315 55 : const __m256i _r = _mm256_set1_epi32(1 << (INV_COS_BIT - 1));
1316 :
1317 55 : const __m256i cospi_p32_p32 = pair_set_w16_epi16(cospi[32], cospi[32]);
1318 55 : const __m256i cospi_m16_p48 = pair_set_w16_epi16(-cospi[16], cospi[48]);
1319 55 : const __m256i cospi_p48_p16 = pair_set_w16_epi16(cospi[48], cospi[16]);
1320 55 : const __m256i cospi_m48_m16 = pair_set_w16_epi16(-cospi[48], -cospi[16]);
1321 55 : const __m256i cospi_m32_p32 = pair_set_w16_epi16(-cospi[32], cospi[32]);
1322 :
1323 : // stage 1
1324 : __m256i x[64];
1325 55 : x[0] = input[0];
1326 55 : x[4] = input[8];
1327 55 : x[8] = input[4];
1328 55 : x[12] = input[12];
1329 55 : x[16] = input[2];
1330 55 : x[20] = input[10];
1331 55 : x[24] = input[6];
1332 55 : x[28] = input[14];
1333 55 : x[32] = input[1];
1334 55 : x[36] = input[9];
1335 55 : x[40] = input[5];
1336 55 : x[44] = input[13];
1337 55 : x[48] = input[3];
1338 55 : x[52] = input[11];
1339 55 : x[56] = input[7];
1340 55 : x[60] = input[15];
1341 :
1342 : // stage 2
1343 220 : btf_16_w16_0_avx2(cospi[63], cospi[1], x[32], x[32], x[63]);
1344 220 : btf_16_w16_0_avx2(-cospi[49], cospi[15], x[60], x[35], x[60]);
1345 220 : btf_16_w16_0_avx2(cospi[55], cospi[9], x[36], x[36], x[59]);
1346 220 : btf_16_w16_0_avx2(-cospi[57], cospi[7], x[56], x[39], x[56]);
1347 220 : btf_16_w16_0_avx2(cospi[59], cospi[5], x[40], x[40], x[55]);
1348 220 : btf_16_w16_0_avx2(-cospi[53], cospi[11], x[52], x[43], x[52]);
1349 220 : btf_16_w16_0_avx2(cospi[51], cospi[13], x[44], x[44], x[51]);
1350 220 : btf_16_w16_0_avx2(-cospi[61], cospi[3], x[48], x[47], x[48]);
1351 :
1352 : // stage 3
1353 220 : btf_16_w16_0_avx2(cospi[62], cospi[2], x[16], x[16], x[31]);
1354 220 : btf_16_w16_0_avx2(-cospi[50], cospi[14], x[28], x[19], x[28]);
1355 220 : btf_16_w16_0_avx2(cospi[54], cospi[10], x[20], x[20], x[27]);
1356 220 : btf_16_w16_0_avx2(-cospi[58], cospi[6], x[24], x[23], x[24]);
1357 55 : x[33] = x[32];
1358 55 : x[34] = x[35];
1359 55 : x[37] = x[36];
1360 55 : x[38] = x[39];
1361 55 : x[41] = x[40];
1362 55 : x[42] = x[43];
1363 55 : x[45] = x[44];
1364 55 : x[46] = x[47];
1365 55 : x[49] = x[48];
1366 55 : x[50] = x[51];
1367 55 : x[53] = x[52];
1368 55 : x[54] = x[55];
1369 55 : x[57] = x[56];
1370 55 : x[58] = x[59];
1371 55 : x[61] = x[60];
1372 55 : x[62] = x[63];
1373 :
1374 : // stage 4
1375 220 : btf_16_w16_0_avx2(cospi[60], cospi[4], x[8], x[8], x[15]);
1376 220 : btf_16_w16_0_avx2(-cospi[52], cospi[12], x[12], x[11], x[12]);
1377 55 : x[17] = x[16];
1378 55 : x[18] = x[19];
1379 55 : x[21] = x[20];
1380 55 : x[22] = x[23];
1381 55 : x[25] = x[24];
1382 55 : x[26] = x[27];
1383 55 : x[29] = x[28];
1384 55 : x[30] = x[31];
1385 55 : idct64_stage4_high32_avx2(x, cospi, _r, cos_bit);
1386 :
1387 : // stage 5
1388 220 : btf_16_w16_0_avx2(cospi[56], cospi[8], x[4], x[4], x[7]);
1389 55 : x[9] = x[8];
1390 55 : x[10] = x[11];
1391 55 : x[13] = x[12];
1392 55 : x[14] = x[15];
1393 55 : idct64_stage5_high48_avx2(x, cospi, _r, cos_bit);
1394 :
1395 : // stage 6
1396 220 : btf_16_w16_0_avx2(cospi[32], cospi[32], x[0], x[0], x[1]);
1397 55 : x[5] = x[4];
1398 55 : x[6] = x[7];
1399 55 : btf_16_w16_avx2(cospi_m16_p48, cospi_p48_p16, &x[9], &x[14], _r, cos_bit);
1400 55 : btf_16_w16_avx2(cospi_m48_m16, cospi_m16_p48, &x[10], &x[13], _r, cos_bit);
1401 55 : idct64_stage6_high48_avx2(x, cospi, _r, cos_bit);
1402 :
1403 : // stage 7
1404 55 : x[3] = x[0];
1405 55 : x[2] = x[1];
1406 55 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[5], &x[6], _r, cos_bit);
1407 55 : btf_16_adds_subs_avx2(&x[8], &x[11]);
1408 55 : btf_16_adds_subs_avx2(&x[9], &x[10]);
1409 55 : btf_16_adds_subs_avx2(&x[15], &x[12]);
1410 55 : btf_16_adds_subs_avx2(&x[14], &x[13]);
1411 55 : idct64_stage7_high48_avx2(x, cospi, _r, cos_bit);
1412 :
1413 : // stage 8
1414 55 : btf_16_adds_subs_avx2(&x[0], &x[7]);
1415 55 : btf_16_adds_subs_avx2(&x[1], &x[6]);
1416 55 : btf_16_adds_subs_avx2(&x[2], &x[5]);
1417 55 : btf_16_adds_subs_avx2(&x[3], &x[4]);
1418 55 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[10], &x[13], _r, cos_bit);
1419 55 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[11], &x[12], _r, cos_bit);
1420 55 : idct64_stage8_high48_avx2(x, cospi, _r, cos_bit);
1421 :
1422 55 : idct64_stage9_avx2(x, cospi, _r, cos_bit);
1423 55 : idct64_stage10_avx2(x, cospi, _r, cos_bit);
1424 55 : idct64_stage11_avx2(output, x);
1425 55 : }
1426 :
1427 2043030 : static void idct64_low32_new_avx2(const __m256i *input, __m256i *output,
1428 : int8_t cos_bit) {
1429 : (void)cos_bit;
1430 2043030 : const int32_t *cospi = cospi_arr(INV_COS_BIT);
1431 2043020 : const __m256i _r = _mm256_set1_epi32(1 << (INV_COS_BIT - 1));
1432 :
1433 2043020 : const __m256i cospi_p32_p32 = pair_set_w16_epi16(cospi[32], cospi[32]);
1434 2043000 : const __m256i cospi_m16_p48 = pair_set_w16_epi16(-cospi[16], cospi[48]);
1435 2042960 : const __m256i cospi_p48_p16 = pair_set_w16_epi16(cospi[48], cospi[16]);
1436 2042920 : const __m256i cospi_m48_m16 = pair_set_w16_epi16(-cospi[48], -cospi[16]);
1437 2042900 : const __m256i cospi_m32_p32 = pair_set_w16_epi16(-cospi[32], cospi[32]);
1438 :
1439 : // stage 1
1440 : __m256i x[64];
1441 2043040 : x[0] = input[0];
1442 2043040 : x[2] = input[16];
1443 2043040 : x[4] = input[8];
1444 2043040 : x[6] = input[24];
1445 2043040 : x[8] = input[4];
1446 2043040 : x[10] = input[20];
1447 2043040 : x[12] = input[12];
1448 2043040 : x[14] = input[28];
1449 2043040 : x[16] = input[2];
1450 2043040 : x[18] = input[18];
1451 2043040 : x[20] = input[10];
1452 2043040 : x[22] = input[26];
1453 2043040 : x[24] = input[6];
1454 2043040 : x[26] = input[22];
1455 2043040 : x[28] = input[14];
1456 2043040 : x[30] = input[30];
1457 2043040 : x[32] = input[1];
1458 2043040 : x[34] = input[17];
1459 2043040 : x[36] = input[9];
1460 2043040 : x[38] = input[25];
1461 2043040 : x[40] = input[5];
1462 2043040 : x[42] = input[21];
1463 2043040 : x[44] = input[13];
1464 2043040 : x[46] = input[29];
1465 2043040 : x[48] = input[3];
1466 2043040 : x[50] = input[19];
1467 2043040 : x[52] = input[11];
1468 2043040 : x[54] = input[27];
1469 2043040 : x[56] = input[7];
1470 2043040 : x[58] = input[23];
1471 2043040 : x[60] = input[15];
1472 2043040 : x[62] = input[31];
1473 :
1474 : // stage 2
1475 8172150 : btf_16_w16_0_avx2(cospi[63], cospi[1], x[32], x[32], x[63]);
1476 8172150 : btf_16_w16_0_avx2(-cospi[33], cospi[31], x[62], x[33], x[62]);
1477 8172150 : btf_16_w16_0_avx2(cospi[47], cospi[17], x[34], x[34], x[61]);
1478 8172150 : btf_16_w16_0_avx2(-cospi[49], cospi[15], x[60], x[35], x[60]);
1479 8172150 : btf_16_w16_0_avx2(cospi[55], cospi[9], x[36], x[36], x[59]);
1480 8172150 : btf_16_w16_0_avx2(-cospi[41], cospi[23], x[58], x[37], x[58]);
1481 8172150 : btf_16_w16_0_avx2(cospi[39], cospi[25], x[38], x[38], x[57]);
1482 8172150 : btf_16_w16_0_avx2(-cospi[57], cospi[7], x[56], x[39], x[56]);
1483 8172150 : btf_16_w16_0_avx2(cospi[59], cospi[5], x[40], x[40], x[55]);
1484 8172150 : btf_16_w16_0_avx2(-cospi[37], cospi[27], x[54], x[41], x[54]);
1485 8172150 : btf_16_w16_0_avx2(cospi[43], cospi[21], x[42], x[42], x[53]);
1486 8172150 : btf_16_w16_0_avx2(-cospi[53], cospi[11], x[52], x[43], x[52]);
1487 8172150 : btf_16_w16_0_avx2(cospi[51], cospi[13], x[44], x[44], x[51]);
1488 8172150 : btf_16_w16_0_avx2(-cospi[45], cospi[19], x[50], x[45], x[50]);
1489 8172150 : btf_16_w16_0_avx2(cospi[35], cospi[29], x[46], x[46], x[49]);
1490 8172150 : btf_16_w16_0_avx2(-cospi[61], cospi[3], x[48], x[47], x[48]);
1491 :
1492 : // stage 3
1493 8172150 : btf_16_w16_0_avx2(cospi[62], cospi[2], x[16], x[16], x[31]);
1494 8172150 : btf_16_w16_0_avx2(-cospi[34], cospi[30], x[30], x[17], x[30]);
1495 8172150 : btf_16_w16_0_avx2(cospi[46], cospi[18], x[18], x[18], x[29]);
1496 8172150 : btf_16_w16_0_avx2(-cospi[50], cospi[14], x[28], x[19], x[28]);
1497 8172150 : btf_16_w16_0_avx2(cospi[54], cospi[10], x[20], x[20], x[27]);
1498 8172150 : btf_16_w16_0_avx2(-cospi[42], cospi[22], x[26], x[21], x[26]);
1499 8172150 : btf_16_w16_0_avx2(cospi[38], cospi[26], x[22], x[22], x[25]);
1500 8172150 : btf_16_w16_0_avx2(-cospi[58], cospi[6], x[24], x[23], x[24]);
1501 2043040 : btf_16_adds_subs_avx2(&x[32], &x[33]);
1502 2042940 : btf_16_adds_subs_avx2(&x[35], &x[34]);
1503 2042950 : btf_16_adds_subs_avx2(&x[36], &x[37]);
1504 2042910 : btf_16_adds_subs_avx2(&x[39], &x[38]);
1505 2042900 : btf_16_adds_subs_avx2(&x[40], &x[41]);
1506 2042880 : btf_16_adds_subs_avx2(&x[43], &x[42]);
1507 2042880 : btf_16_adds_subs_avx2(&x[44], &x[45]);
1508 2042880 : btf_16_adds_subs_avx2(&x[47], &x[46]);
1509 2042860 : btf_16_adds_subs_avx2(&x[48], &x[49]);
1510 2042840 : btf_16_adds_subs_avx2(&x[51], &x[50]);
1511 2042820 : btf_16_adds_subs_avx2(&x[52], &x[53]);
1512 2042810 : btf_16_adds_subs_avx2(&x[55], &x[54]);
1513 2042810 : btf_16_adds_subs_avx2(&x[56], &x[57]);
1514 2042810 : btf_16_adds_subs_avx2(&x[59], &x[58]);
1515 2042810 : btf_16_adds_subs_avx2(&x[60], &x[61]);
1516 2042810 : btf_16_adds_subs_avx2(&x[63], &x[62]);
1517 :
1518 : // stage 4
1519 8171780 : btf_16_w16_0_avx2(cospi[60], cospi[4], x[8], x[8], x[15]);
1520 8171780 : btf_16_w16_0_avx2(-cospi[36], cospi[28], x[14], x[9], x[14]);
1521 8171780 : btf_16_w16_0_avx2(cospi[44], cospi[20], x[10], x[10], x[13]);
1522 8171780 : btf_16_w16_0_avx2(-cospi[52], cospi[12], x[12], x[11], x[12]);
1523 2042940 : btf_16_adds_subs_avx2(&x[16], &x[17]);
1524 2042970 : btf_16_adds_subs_avx2(&x[19], &x[18]);
1525 2042950 : btf_16_adds_subs_avx2(&x[20], &x[21]);
1526 2042880 : btf_16_adds_subs_avx2(&x[23], &x[22]);
1527 2042840 : btf_16_adds_subs_avx2(&x[24], &x[25]);
1528 2042840 : btf_16_adds_subs_avx2(&x[27], &x[26]);
1529 2042830 : btf_16_adds_subs_avx2(&x[28], &x[29]);
1530 2042830 : btf_16_adds_subs_avx2(&x[31], &x[30]);
1531 2042800 : idct64_stage4_high32_avx2(x, cospi, _r, cos_bit);
1532 :
1533 : // stage 5
1534 8172310 : btf_16_w16_0_avx2(cospi[56], cospi[8], x[4], x[4], x[7]);
1535 8172310 : btf_16_w16_0_avx2(-cospi[40], cospi[24], x[6], x[5], x[6]);
1536 2043080 : btf_16_adds_subs_avx2(&x[8], &x[9]);
1537 2043040 : btf_16_adds_subs_avx2(&x[11], &x[10]);
1538 2043020 : btf_16_adds_subs_avx2(&x[12], &x[13]);
1539 2042960 : btf_16_adds_subs_avx2(&x[15], &x[14]);
1540 2042910 : idct64_stage5_high48_avx2(x, cospi, _r, cos_bit);
1541 :
1542 : // stage 6
1543 8171870 : btf_16_w16_0_avx2(cospi[32], cospi[32], x[0], x[0], x[1]);
1544 8171870 : btf_16_w16_0_avx2(cospi[48], cospi[16], x[2], x[2], x[3]);
1545 2042970 : btf_16_adds_subs_avx2(&x[4], &x[5]);
1546 2043010 : btf_16_adds_subs_avx2(&x[7], &x[6]);
1547 2042990 : btf_16_w16_avx2(cospi_m16_p48, cospi_p48_p16, &x[9], &x[14], _r, cos_bit);
1548 2043030 : btf_16_w16_avx2(cospi_m48_m16, cospi_m16_p48, &x[10], &x[13], _r, cos_bit);
1549 2043030 : idct64_stage6_high48_avx2(x, cospi, _r, cos_bit);
1550 :
1551 : // stage 7
1552 2043080 : btf_16_adds_subs_avx2(&x[0], &x[3]);
1553 2043060 : btf_16_adds_subs_avx2(&x[1], &x[2]);
1554 2043030 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[5], &x[6], _r, cos_bit);
1555 2043120 : btf_16_adds_subs_avx2(&x[8], &x[11]);
1556 2043080 : btf_16_adds_subs_avx2(&x[9], &x[10]);
1557 2043030 : btf_16_adds_subs_avx2(&x[15], &x[12]);
1558 2042970 : btf_16_adds_subs_avx2(&x[14], &x[13]);
1559 2042960 : idct64_stage7_high48_avx2(x, cospi, _r, cos_bit);
1560 :
1561 : // stage 8
1562 2042890 : btf_16_adds_subs_avx2(&x[0], &x[7]);
1563 2042890 : btf_16_adds_subs_avx2(&x[1], &x[6]);
1564 2042880 : btf_16_adds_subs_avx2(&x[2], &x[5]);
1565 2042880 : btf_16_adds_subs_avx2(&x[3], &x[4]);
1566 2042880 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[10], &x[13], _r, cos_bit);
1567 2043030 : btf_16_w16_avx2(cospi_m32_p32, cospi_p32_p32, &x[11], &x[12], _r, cos_bit);
1568 2043040 : idct64_stage8_high48_avx2(x, cospi, _r, cos_bit);
1569 :
1570 : // stage 9~11
1571 2043100 : idct64_stage9_avx2(x, cospi, _r, cos_bit);
1572 2042990 : idct64_stage10_avx2(x, cospi, _r, cos_bit);
1573 2043100 : idct64_stage11_avx2(output, x);
1574 2043010 : }
1575 :
1576 : typedef void(*transform_1d_avx2)(const __m256i *input, __m256i *output,
1577 : int8_t cos_bit);
1578 :
1579 : // 1D functions process 16 pixels at one time.
1580 : static const transform_1d_avx2
1581 : lowbd_txfm_all_1d_zeros_w16_arr[TX_SIZES][ITX_TYPES_1D][4] = {
1582 : {
1583 : { NULL, NULL, NULL, NULL },
1584 : { NULL, NULL, NULL, NULL },
1585 : { NULL, NULL, NULL, NULL },
1586 : },
1587 : {
1588 : { NULL, NULL, NULL, NULL },
1589 : { NULL, NULL, NULL, NULL },
1590 : { NULL, NULL, NULL, NULL } },
1591 : {
1592 : { idct16_low1_new_avx2, idct16_low8_new_avx2, idct16_new_avx2, NULL },
1593 : { iadst16_low1_new_avx2, iadst16_low8_new_avx2, iadst16_new_avx2,
1594 : NULL },
1595 : { NULL, NULL, NULL, NULL },
1596 : },
1597 : {
1598 : { idct32_low1_new_avx2, idct32_low8_new_avx2, idct32_low16_new_avx2,
1599 : idct32_new_avx2 },
1600 : { NULL, NULL, NULL, NULL },
1601 : { NULL, NULL, NULL, NULL } },
1602 : {
1603 : { idct64_low1_new_avx2, idct64_low8_new_avx2, idct64_low16_new_avx2,
1604 : idct64_low32_new_avx2 },
1605 : { NULL, NULL, NULL, NULL },
1606 : { NULL, NULL, NULL, NULL } }
1607 : };
1608 :
1609 : // only process w >= 16 h >= 16
1610 5639900 : static INLINE void lowbd_inv_txfm2d_add_no_identity_avx2(
1611 : const int32_t *input,
1612 : uint8_t *output_r, int32_t stride_r,
1613 : uint8_t *output_w, int32_t stride_w,
1614 : TxType tx_type, TxSize tx_size, int eob) {
1615 : __m256i buf1[64 * 16];
1616 : int eobx, eoby;
1617 5639900 : get_eobx_eoby_scan_default(&eobx, &eoby, tx_size, eob);
1618 5639920 : const int8_t *shift = eb_inv_txfm_shift_ls[tx_size];
1619 5639920 : const int txw_idx = get_txw_idx(tx_size);
1620 5639820 : const int txh_idx = get_txh_idx(tx_size);
1621 5639780 : const int cos_bit_col = inv_cos_bit_col[txw_idx][txh_idx];
1622 5639780 : const int cos_bit_row = inv_cos_bit_row[txw_idx][txh_idx];
1623 5639780 : const int txfm_size_col = tx_size_wide[tx_size];
1624 5639780 : const int txfm_size_row = tx_size_high[tx_size];
1625 5639780 : const int buf_size_w_div16 = txfm_size_col >> 4;
1626 5639780 : const int buf_size_nonzero_w_div16 = (eobx + 16) >> 4;
1627 5639780 : const int buf_size_nonzero_h_div16 = (eoby + 16) >> 4;
1628 5639780 : const int input_stride = AOMMIN(32, txfm_size_col);
1629 5639780 : const int rect_type = get_rect_tx_log_ratio(txfm_size_col, txfm_size_row);
1630 :
1631 5639750 : const int fun_idx_x = lowbd_txfm_all_1d_zeros_idx[eobx];
1632 5639750 : const int fun_idx_y = lowbd_txfm_all_1d_zeros_idx[eoby];
1633 5639750 : const transform_1d_avx2 row_txfm =
1634 5639750 : lowbd_txfm_all_1d_zeros_w16_arr[txw_idx][hitx_1d_tab[tx_type]][fun_idx_x];
1635 5639750 : const transform_1d_avx2 col_txfm =
1636 5639750 : lowbd_txfm_all_1d_zeros_w16_arr[txh_idx][vitx_1d_tab[tx_type]][fun_idx_y];
1637 :
1638 5639750 : assert(col_txfm != NULL);
1639 5639750 : assert(row_txfm != NULL);
1640 : int ud_flip, lr_flip;
1641 5639750 : get_flip_cfg(tx_type, &ud_flip, &lr_flip);
1642 5639960 : const __m256i scale0 = _mm256_set1_epi16(1 << (15 + shift[0]));
1643 13304700 : for (int i = 0; i < buf_size_nonzero_h_div16; i++) {
1644 : __m256i buf0[64];
1645 7664130 : const int32_t *input_row = input + (i << 4) * input_stride;
1646 18396900 : for (int j = 0; j < buf_size_nonzero_w_div16; ++j) {
1647 10731900 : __m256i *buf0_cur = buf0 + j * 16;
1648 10731900 : const int32_t *input_cur = input_row + j * 16;
1649 10731900 : load_buffer_32bit_to_16bit_w16_avx2(input_cur, input_stride, buf0_cur,
1650 : 16);
1651 10729000 : transpose_16bit_16x16_avx2(buf0_cur, buf0_cur);
1652 : }
1653 7664950 : if (rect_type == 1 || rect_type == -1)
1654 2600300 : round_shift_avx2(buf0, buf0, input_stride); // rect special code
1655 7665130 : row_txfm(buf0, buf0, cos_bit_row);
1656 205216000 : for (int j = 0; j < txfm_size_col; ++j)
1657 395103000 : buf0[j] = _mm256_mulhrs_epi16(buf0[j], scale0);
1658 :
1659 7664150 : __m256i *buf1_cur = buf1 + (i << 4);
1660 7664150 : if (lr_flip) {
1661 187164 : for (int j = 0; j < buf_size_w_div16; ++j) {
1662 : __m256i temp[16];
1663 93147 : flip_buf_avx2(buf0 + 16 * j, temp, 16);
1664 93147 : int offset = txfm_size_row * (buf_size_w_div16 - 1 - j);
1665 93147 : transpose_16bit_16x16_avx2(temp, buf1_cur + offset);
1666 : }
1667 : }
1668 : else {
1669 19829700 : for (int j = 0; j < buf_size_w_div16; ++j)
1670 12259000 : transpose_16bit_16x16_avx2(buf0 + 16 * j, buf1_cur + txfm_size_row * j);
1671 : }
1672 : }
1673 5640620 : const __m256i scale1 = _mm256_set1_epi16(1 << (15 + shift[1]));
1674 14252100 : for (int i = 0; i < buf_size_w_div16; i++) {
1675 8612380 : __m256i *buf1_cur = buf1 + i * txfm_size_row;
1676 8612380 : col_txfm(buf1_cur, buf1_cur, cos_bit_col);
1677 245669000 : for (int j = 0; j < txfm_size_row; ++j)
1678 474114000 : buf1_cur[j] = _mm256_mulhrs_epi16(buf1_cur[j], scale1);
1679 : }
1680 14251000 : for (int i = 0; i < buf_size_w_div16; i++)
1681 8612030 : lowbd_write_buffer_16xn_avx2(buf1 + i * txfm_size_row,
1682 8612030 : output_r + 16 * i, stride_r,
1683 8612030 : output_w + 16 * i, stride_w,
1684 : ud_flip, txfm_size_row);
1685 5638960 : }
1686 :
1687 389911 : static INLINE void iidentity_row_16xn_avx2(__m256i *out, const int32_t *input,
1688 : int stride, int shift, int height, int txw_idx, int rect_type) {
1689 389911 : const int32_t *input_row = input;
1690 389911 : const __m256i scale = _mm256_set1_epi16(NewSqrt2list[txw_idx]);
1691 389911 : const __m256i _r = _mm256_set1_epi16((1 << (NewSqrt2Bits - 1)) +
1692 389911 : (1 << (NewSqrt2Bits - shift - 1)));
1693 389911 : const __m256i one = _mm256_set1_epi16(1);
1694 389911 : const __m256i scale__r = _mm256_unpacklo_epi16(scale, _r);
1695 389911 : if (rect_type != 1 && rect_type != -1) {
1696 6215220 : for (int i = 0; i < height; ++i) {
1697 5885950 : const __m256i src = load_32bit_to_16bit_w16_avx2(input_row);
1698 5885690 : input_row += stride;
1699 5885690 : __m256i lo = _mm256_unpacklo_epi16(src, one);
1700 5885690 : __m256i hi = _mm256_unpackhi_epi16(src, one);
1701 5885690 : lo = _mm256_madd_epi16(lo, scale__r);
1702 5885690 : hi = _mm256_madd_epi16(hi, scale__r);
1703 5885690 : lo = _mm256_srai_epi32(lo, NewSqrt2Bits - shift);
1704 5885690 : hi = _mm256_srai_epi32(hi, NewSqrt2Bits - shift);
1705 11771400 : out[i] = _mm256_packs_epi32(lo, hi);
1706 : }
1707 : }
1708 : else {
1709 : const __m256i rect_scale =
1710 60375 : _mm256_set1_epi16(NewInvSqrt2 << (15 - NewSqrt2Bits));
1711 1328100 : for (int i = 0; i < height; ++i) {
1712 1267780 : __m256i src = load_32bit_to_16bit_w16_avx2(input_row);
1713 1267730 : src = _mm256_mulhrs_epi16(src, rect_scale);
1714 1267730 : input_row += stride;
1715 1267730 : __m256i lo = _mm256_unpacklo_epi16(src, one);
1716 1267730 : __m256i hi = _mm256_unpackhi_epi16(src, one);
1717 1267730 : lo = _mm256_madd_epi16(lo, scale__r);
1718 1267730 : hi = _mm256_madd_epi16(hi, scale__r);
1719 1267730 : lo = _mm256_srai_epi32(lo, NewSqrt2Bits - shift);
1720 1267730 : hi = _mm256_srai_epi32(hi, NewSqrt2Bits - shift);
1721 2535460 : out[i] = _mm256_packs_epi32(lo, hi);
1722 : }
1723 : }
1724 389599 : }
1725 :
1726 381627 : static INLINE void iidentity_col_16xn_avx2(
1727 : uint8_t *output_r, int32_t stride_r,
1728 : uint8_t *output_w, int32_t stride_w,
1729 : __m256i *buf, int shift, int height, int txh_idx) {
1730 381627 : const __m256i scale = _mm256_set1_epi16(NewSqrt2list[txh_idx]);
1731 381627 : const __m256i scale__r = _mm256_set1_epi16(1 << (NewSqrt2Bits - 1));
1732 763254 : const __m256i shift__r = _mm256_set1_epi32(1 << (-shift - 1));
1733 381627 : const __m256i one = _mm256_set1_epi16(1);
1734 381627 : const __m256i scale_coeff = _mm256_unpacklo_epi16(scale, scale__r);
1735 7412590 : for (int h = 0; h < height; ++h) {
1736 7030940 : __m256i lo = _mm256_unpacklo_epi16(buf[h], one);
1737 14061900 : __m256i hi = _mm256_unpackhi_epi16(buf[h], one);
1738 7030940 : lo = _mm256_madd_epi16(lo, scale_coeff);
1739 7030940 : hi = _mm256_madd_epi16(hi, scale_coeff);
1740 7030940 : lo = _mm256_srai_epi32(lo, NewSqrt2Bits);
1741 14061900 : hi = _mm256_srai_epi32(hi, NewSqrt2Bits);
1742 7030940 : lo = _mm256_add_epi32(lo, shift__r);
1743 7030940 : hi = _mm256_add_epi32(hi, shift__r);
1744 7030940 : lo = _mm256_srai_epi32(lo, -shift);
1745 14061900 : hi = _mm256_srai_epi32(hi, -shift);
1746 7030940 : const __m256i x = _mm256_packs_epi32(lo, hi);
1747 7030940 : write_recon_w16_avx2(x, output_r, output_w);
1748 7030960 : output_r += stride_r;
1749 7030960 : output_w += stride_w;
1750 : }
1751 381648 : }
1752 :
1753 308105 : static INLINE void lowbd_inv_txfm2d_add_idtx_avx2(const int32_t *input,
1754 : uint8_t *output_r, int32_t stride_r,
1755 : uint8_t *output_w, int32_t stride_w,
1756 : TxSize tx_size, int32_t eob) {
1757 : (void)eob;
1758 308105 : const int8_t *shift = eb_inv_txfm_shift_ls[tx_size];
1759 308105 : const int txw_idx = get_txw_idx(tx_size);
1760 308105 : const int txh_idx = get_txh_idx(tx_size);
1761 308105 : const int txfm_size_col = tx_size_wide[tx_size];
1762 308105 : const int txfm_size_row = tx_size_high[tx_size];
1763 308105 : const int input_stride = AOMMIN(32, txfm_size_col);
1764 308105 : const int row_max = AOMMIN(32, txfm_size_row);
1765 308105 : const int rect_type = get_rect_tx_log_ratio(txfm_size_col, txfm_size_row);
1766 : __m256i buf[32];
1767 656471 : for (int i = 0; i < input_stride; i += 16) {
1768 348369 : iidentity_row_16xn_avx2(buf, input + i, input_stride, shift[0], row_max,
1769 : txw_idx, rect_type);
1770 348369 : iidentity_col_16xn_avx2(output_r + i, stride_r, output_w + i, stride_w,
1771 348369 : buf, shift[1], row_max, txh_idx);
1772 : }
1773 308102 : }
1774 :
1775 41541 : static INLINE void lowbd_inv_txfm2d_add_h_identity_avx2(
1776 : const int32_t *input,
1777 : uint8_t *output_r, int32_t stride_r,
1778 : uint8_t *output_w, int32_t stride_w,
1779 : TxType tx_type, TxSize tx_size, int eob) {
1780 : int eobx, eoby;
1781 41541 : get_eobx_eoby_scan_h_identity(&eobx, &eoby, tx_size, eob);
1782 41541 : const int8_t *shift = eb_inv_txfm_shift_ls[tx_size];
1783 41541 : const int txw_idx = get_txw_idx(tx_size);
1784 41541 : const int txh_idx = get_txh_idx(tx_size);
1785 41541 : const int cos_bit_col = inv_cos_bit_col[txw_idx][txh_idx];
1786 41541 : const int txfm_size_col = tx_size_wide[tx_size];
1787 41541 : const int txfm_size_row = tx_size_high[tx_size];
1788 41541 : const int txfm_size_col_notzero = AOMMIN(32, txfm_size_col);
1789 41541 : const int input_stride = txfm_size_col_notzero;
1790 41541 : const int buf_size_w_div16 = (eobx + 16) >> 4;
1791 41541 : const int rect_type = get_rect_tx_log_ratio(txfm_size_col, txfm_size_row);
1792 :
1793 41541 : const int fun_idx_y = lowbd_txfm_all_1d_zeros_idx[eoby];
1794 41541 : const transform_1d_avx2 col_txfm =
1795 41541 : lowbd_txfm_all_1d_zeros_w16_arr[txh_idx][vitx_1d_tab[tx_type]][fun_idx_y];
1796 :
1797 41541 : assert(col_txfm != NULL);
1798 :
1799 : int ud_flip, lr_flip;
1800 41541 : get_flip_cfg(tx_type, &ud_flip, &lr_flip);
1801 83082 : for (int i = 0; i < buf_size_w_div16; i++) {
1802 : __m256i buf0[64];
1803 41541 : iidentity_row_16xn_avx2(buf0, input + (i << 4), input_stride, shift[0],
1804 : eoby + 1, txw_idx, rect_type);
1805 41541 : col_txfm(buf0, buf0, cos_bit_col);
1806 41541 : __m256i mshift = _mm256_set1_epi16(1 << (15 + shift[1]));
1807 41541 : int k = ud_flip ? (txfm_size_row - 1) : 0;
1808 41541 : const int step = ud_flip ? -1 : 1;
1809 706197 : for (int j = 0; j < txfm_size_row; ++j, k += step) {
1810 664656 : __m256i res = _mm256_mulhrs_epi16(buf0[k], mshift);
1811 664656 : write_recon_w16_avx2(res,
1812 664656 : output_r + (i << 4) + j * stride_r,
1813 664656 : output_w + (i << 4) + j * stride_w);
1814 : }
1815 : }
1816 41541 : }
1817 :
1818 33257 : static INLINE void lowbd_inv_txfm2d_add_v_identity_avx2(
1819 : const int32_t *input,
1820 : uint8_t *output_r, int32_t stride_r,
1821 : uint8_t *output_w, int32_t stride_w,
1822 : TxType tx_type, TxSize tx_size, int eob) {
1823 : __m256i buf1[64];
1824 : int eobx, eoby;
1825 33257 : get_eobx_eoby_scan_v_identity(&eobx, &eoby, tx_size, eob);
1826 33257 : const int8_t *shift = eb_inv_txfm_shift_ls[tx_size];
1827 33257 : const int txw_idx = get_txw_idx(tx_size);
1828 33257 : const int txh_idx = get_txh_idx(tx_size);
1829 33257 : const int cos_bit_row = inv_cos_bit_row[txw_idx][txh_idx];
1830 33257 : const int txfm_size_col = tx_size_wide[tx_size];
1831 33257 : const int txfm_size_row = tx_size_high[tx_size];
1832 33257 : const int buf_size_w_div16 = txfm_size_col >> 4;
1833 33257 : const int buf_size_h_div16 = (eoby + 16) >> 4;
1834 33257 : const int input_stride = AOMMIN(32, txfm_size_col);
1835 33257 : const int rect_type = get_rect_tx_log_ratio(txfm_size_col, txfm_size_row);
1836 :
1837 33257 : const int fun_idx_x = lowbd_txfm_all_1d_zeros_idx[eobx];
1838 33257 : const transform_1d_avx2 row_txfm =
1839 33257 : lowbd_txfm_all_1d_zeros_w16_arr[txw_idx][hitx_1d_tab[tx_type]][fun_idx_x];
1840 :
1841 33257 : assert(row_txfm != NULL);
1842 :
1843 : int ud_flip, lr_flip;
1844 33257 : get_flip_cfg(tx_type, &ud_flip, &lr_flip);
1845 66514 : for (int i = 0; i < buf_size_h_div16; i++) {
1846 : __m256i buf0[64];
1847 33257 : const int32_t *input_row = input + i * input_stride * 16;
1848 66514 : for (int j = 0; j < AOMMIN(4, buf_size_w_div16); ++j) {
1849 33257 : __m256i *buf0_cur = buf0 + j * 16;
1850 33257 : load_buffer_32bit_to_16bit_w16_avx2(input_row + j * 16, input_stride,
1851 : buf0_cur, 16);
1852 33257 : transpose_16bit_16x16_avx2(buf0_cur, buf0_cur);
1853 : }
1854 33257 : if (rect_type == 1 || rect_type == -1)
1855 0 : round_shift_avx2(buf0, buf0, input_stride); // rect special code
1856 33257 : row_txfm(buf0, buf0, cos_bit_row);
1857 33257 : round_shift_16bit_w16_avx2(buf0, txfm_size_col, shift[0]);
1858 33257 : __m256i *_buf1 = buf1;
1859 33257 : if (lr_flip) {
1860 0 : for (int j = 0; j < buf_size_w_div16; ++j) {
1861 : __m256i temp[16];
1862 0 : flip_buf_avx2(buf0 + 16 * j, temp, 16);
1863 0 : transpose_16bit_16x16_avx2(temp,
1864 0 : _buf1 + 16 * (buf_size_w_div16 - 1 - j));
1865 : }
1866 : }
1867 : else {
1868 66514 : for (int j = 0; j < buf_size_w_div16; ++j)
1869 33257 : transpose_16bit_16x16_avx2(buf0 + 16 * j, _buf1 + 16 * j);
1870 : }
1871 66514 : for (int j = 0; j < buf_size_w_div16; ++j)
1872 33257 : iidentity_col_16xn_avx2(
1873 33257 : output_r + i * 16 * stride_r + j * 16, stride_r,
1874 33257 : output_w + i * 16 * stride_w + j * 16, stride_w,
1875 33257 : buf1 + j * 16, shift[1], 16, txh_idx);
1876 : }
1877 33257 : }
1878 :
1879 : // for 32x32,32x64,64x32,64x64,16x32,32x16,64x16,16x64
1880 6023120 : static INLINE void lowbd_inv_txfm2d_add_universe_avx2(
1881 : const int32_t *input,
1882 : uint8_t *output_r, int32_t stride_r,
1883 : uint8_t *output_w, int32_t stride_w,
1884 : TxType tx_type, TxSize tx_size, int eob) {
1885 : (void)eob;
1886 6023120 : switch (tx_type) {
1887 5640420 : case DCT_DCT:
1888 : case ADST_DCT: // ADST in vertical, DCT in horizontal
1889 : case DCT_ADST: // DCT in vertical, ADST in horizontal
1890 : case ADST_ADST: // ADST in both directions
1891 : case FLIPADST_DCT:
1892 : case DCT_FLIPADST:
1893 : case FLIPADST_FLIPADST:
1894 : case ADST_FLIPADST:
1895 : case FLIPADST_ADST:
1896 5640420 : lowbd_inv_txfm2d_add_no_identity_avx2(input,
1897 : output_r, stride_r, output_w, stride_w,
1898 : tx_type, tx_size, eob);
1899 5640370 : break;
1900 308105 : case IDTX:
1901 308105 : lowbd_inv_txfm2d_add_idtx_avx2(input,
1902 : output_r, stride_r, output_w, stride_w,
1903 : tx_size, eob);
1904 308104 : break;
1905 41541 : case V_DCT:
1906 : case V_ADST:
1907 : case V_FLIPADST:
1908 41541 : lowbd_inv_txfm2d_add_h_identity_avx2(input,
1909 : output_r, stride_r, output_w, stride_w,
1910 : tx_type, tx_size, eob);
1911 41541 : break;
1912 33257 : case H_DCT:
1913 : case H_ADST:
1914 : case H_FLIPADST:
1915 33257 : lowbd_inv_txfm2d_add_v_identity_avx2(input,
1916 : output_r, stride_r, output_w, stride_w,
1917 : tx_type, tx_size, eob);
1918 33257 : break;
1919 0 : default:
1920 0 : eb_av1_lowbd_inv_txfm2d_add_ssse3(input,
1921 : output_r, stride_r, output_w, stride_w,
1922 : tx_type, tx_size, eob);
1923 0 : break;
1924 : }
1925 6023270 : }
1926 :
1927 44080900 : void eb_av1_lowbd_inv_txfm2d_add_avx2(const int32_t *input,
1928 : uint8_t *output_r, int32_t stride_r,
1929 : uint8_t *output_w, int32_t stride_w,
1930 : TxType tx_type, TxSize tx_size, int32_t eob) {
1931 44080900 : switch (tx_size) {
1932 38080600 : case TX_4X4:
1933 : case TX_8X8:
1934 : case TX_4X8:
1935 : case TX_8X4:
1936 : case TX_8X16:
1937 : case TX_16X8:
1938 : case TX_4X16:
1939 : case TX_16X4:
1940 : case TX_8X32:
1941 : case TX_32X8:
1942 38080600 : eb_av1_lowbd_inv_txfm2d_add_ssse3(input,
1943 : output_r, stride_r, output_w, stride_w,
1944 : tx_type, tx_size, eob);
1945 38068200 : break;
1946 6000280 : case TX_16X16:
1947 : case TX_32X32:
1948 : case TX_64X64:
1949 : case TX_16X32:
1950 : case TX_32X16:
1951 : case TX_32X64:
1952 : case TX_64X32:
1953 : case TX_16X64:
1954 : case TX_64X16:
1955 : default:
1956 6000280 : lowbd_inv_txfm2d_add_universe_avx2(input,
1957 : output_r, stride_r, output_w, stride_w,
1958 : tx_type, tx_size, eob);
1959 6023140 : break;
1960 : }
1961 44091300 : }
1962 :
1963 44090100 : void eb_av1_inv_txfm_add_avx2(const TranLow *dqcoeff,
1964 : uint8_t *dst_r, int32_t stride_r,
1965 : uint8_t *dst_w, int32_t stride_w,
1966 : const TxfmParam *txfm_param) {
1967 44090100 : const TxType tx_type = txfm_param->tx_type;
1968 44090100 : if (!txfm_param->lossless)
1969 44093800 : eb_av1_lowbd_inv_txfm2d_add_avx2(dqcoeff,
1970 : dst_r, stride_r, dst_w, stride_w,
1971 44093800 : tx_type, txfm_param->tx_size, txfm_param->eob);
1972 : else
1973 0 : eb_av1_inv_txfm_add_c(dqcoeff,
1974 : dst_r, stride_r, dst_w, stride_w,
1975 : txfm_param);
1976 44078400 : }
|