2 * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
11 #include <emmintrin.h> // SSE2
12 #include "vp9/common/vp9_idct.h" // for cospi constants
13 #include "vpx_ports/mem.h"
15 #include "vp9/common/x86/vp9_idct_intrin_sse2.h"
17 void vp9_fdct4x4_1_sse2(const int16_t *input, int16_t *output, int stride) {
20 const __m128i zero = _mm_setzero_si128();
21 in0 = _mm_loadl_epi64((const __m128i *)(input + 0 * stride));
22 in1 = _mm_loadl_epi64((const __m128i *)(input + 1 * stride));
23 in1 = _mm_unpacklo_epi64(in1, _mm_loadl_epi64((const __m128i *)
24 (input + 2 * stride)));
25 in0 = _mm_unpacklo_epi64(in0, _mm_loadl_epi64((const __m128i *)
26 (input + 3 * stride)));
28 tmp = _mm_add_epi16(in0, in1);
29 in0 = _mm_unpacklo_epi16(zero, tmp);
30 in1 = _mm_unpackhi_epi16(zero, tmp);
31 in0 = _mm_srai_epi32(in0, 16);
32 in1 = _mm_srai_epi32(in1, 16);
34 tmp = _mm_add_epi32(in0, in1);
35 in0 = _mm_unpacklo_epi32(tmp, zero);
36 in1 = _mm_unpackhi_epi32(tmp, zero);
38 tmp = _mm_add_epi32(in0, in1);
39 in0 = _mm_srli_si128(tmp, 8);
41 in1 = _mm_add_epi32(tmp, in0);
42 in0 = _mm_slli_epi32(in1, 1);
43 _mm_store_si128((__m128i *)(output), in0);
46 void vp9_fdct4x4_sse2(const int16_t *input, int16_t *output, int stride) {
47 // This 2D transform implements 4 vertical 1D transforms followed
48 // by 4 horizontal 1D transforms. The multiplies and adds are as given
49 // by Chen, Smith and Fralick ('77). The commands for moving the data
50 // around have been minimized by hand.
51 // For the purposes of the comments, the 16 inputs are referred to at i0
52 // through iF (in raster order), intermediate variables are a0, b0, c0
53 // through f, and correspond to the in-place computations mapped to input
54 // locations. The outputs, o0 through oF are labeled according to the
58 // These are the coefficients used for the multiplies.
59 // In the comments, pN means cos(N pi /64) and mN is -cos(N pi /64),
60 // where cospi_N_64 = cos(N pi /64)
61 const __m128i k__cospi_A = _mm_setr_epi16(cospi_16_64, cospi_16_64,
62 cospi_16_64, cospi_16_64,
63 cospi_16_64, -cospi_16_64,
64 cospi_16_64, -cospi_16_64);
65 const __m128i k__cospi_B = _mm_setr_epi16(cospi_16_64, -cospi_16_64,
66 cospi_16_64, -cospi_16_64,
67 cospi_16_64, cospi_16_64,
68 cospi_16_64, cospi_16_64);
69 const __m128i k__cospi_C = _mm_setr_epi16(cospi_8_64, cospi_24_64,
70 cospi_8_64, cospi_24_64,
71 cospi_24_64, -cospi_8_64,
72 cospi_24_64, -cospi_8_64);
73 const __m128i k__cospi_D = _mm_setr_epi16(cospi_24_64, -cospi_8_64,
74 cospi_24_64, -cospi_8_64,
75 cospi_8_64, cospi_24_64,
76 cospi_8_64, cospi_24_64);
77 const __m128i k__cospi_E = _mm_setr_epi16(cospi_16_64, cospi_16_64,
78 cospi_16_64, cospi_16_64,
79 cospi_16_64, cospi_16_64,
80 cospi_16_64, cospi_16_64);
81 const __m128i k__cospi_F = _mm_setr_epi16(cospi_16_64, -cospi_16_64,
82 cospi_16_64, -cospi_16_64,
83 cospi_16_64, -cospi_16_64,
84 cospi_16_64, -cospi_16_64);
85 const __m128i k__cospi_G = _mm_setr_epi16(cospi_8_64, cospi_24_64,
86 cospi_8_64, cospi_24_64,
87 -cospi_8_64, -cospi_24_64,
88 -cospi_8_64, -cospi_24_64);
89 const __m128i k__cospi_H = _mm_setr_epi16(cospi_24_64, -cospi_8_64,
90 cospi_24_64, -cospi_8_64,
91 -cospi_24_64, cospi_8_64,
92 -cospi_24_64, cospi_8_64);
94 const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
95 // This second rounding constant saves doing some extra adds at the end
96 const __m128i k__DCT_CONST_ROUNDING2 = _mm_set1_epi32(DCT_CONST_ROUNDING
97 +(DCT_CONST_ROUNDING << 1));
98 const int DCT_CONST_BITS2 = DCT_CONST_BITS+2;
99 const __m128i k__nonzero_bias_a = _mm_setr_epi16(0, 1, 1, 1, 1, 1, 1, 1);
100 const __m128i k__nonzero_bias_b = _mm_setr_epi16(1, 0, 0, 0, 0, 0, 0, 0);
105 in0 = _mm_loadl_epi64((const __m128i *)(input + 0 * stride));
106 in1 = _mm_loadl_epi64((const __m128i *)(input + 1 * stride));
107 in1 = _mm_unpacklo_epi64(in1, _mm_loadl_epi64((const __m128i *)
108 (input + 2 * stride)));
109 in0 = _mm_unpacklo_epi64(in0, _mm_loadl_epi64((const __m128i *)
110 (input + 3 * stride)));
111 // in0 = [i0 i1 i2 i3 iC iD iE iF]
112 // in1 = [i4 i5 i6 i7 i8 i9 iA iB]
115 // multiply by 16 to give some extra precision
116 in0 = _mm_slli_epi16(in0, 4);
117 in1 = _mm_slli_epi16(in1, 4);
118 // if (i == 0 && input[0]) input[0] += 1;
119 // add 1 to the upper left pixel if it is non-zero, which helps reduce
120 // the round-trip error
122 // The mask will only contain whether the first value is zero, all
123 // other comparison will fail as something shifted by 4 (above << 4)
124 // can never be equal to one. To increment in the non-zero case, we
125 // add the mask and one for the first element:
126 // - if zero, mask = -1, v = v - 1 + 1 = v
127 // - if non-zero, mask = 0, v = v + 0 + 1 = v + 1
128 __m128i mask = _mm_cmpeq_epi16(in0, k__nonzero_bias_a);
129 in0 = _mm_add_epi16(in0, mask);
130 in0 = _mm_add_epi16(in0, k__nonzero_bias_b);
133 // There are 4 total stages, alternating between an add/subtract stage
134 // followed by an multiply-and-add stage.
136 // Stage 1: Add/subtract
138 // in0 = [i0 i1 i2 i3 iC iD iE iF]
139 // in1 = [i4 i5 i6 i7 i8 i9 iA iB]
140 const __m128i r0 = _mm_unpacklo_epi16(in0, in1);
141 const __m128i r1 = _mm_unpackhi_epi16(in0, in1);
142 // r0 = [i0 i4 i1 i5 i2 i6 i3 i7]
143 // r1 = [iC i8 iD i9 iE iA iF iB]
144 const __m128i r2 = _mm_shuffle_epi32(r0, 0xB4);
145 const __m128i r3 = _mm_shuffle_epi32(r1, 0xB4);
146 // r2 = [i0 i4 i1 i5 i3 i7 i2 i6]
147 // r3 = [iC i8 iD i9 iF iB iE iA]
149 const __m128i t0 = _mm_add_epi16(r2, r3);
150 const __m128i t1 = _mm_sub_epi16(r2, r3);
151 // t0 = [a0 a4 a1 a5 a3 a7 a2 a6]
152 // t1 = [aC a8 aD a9 aF aB aE aA]
154 // Stage 2: multiply by constants (which gets us into 32 bits).
155 // The constants needed here are:
156 // k__cospi_A = [p16 p16 p16 p16 p16 m16 p16 m16]
157 // k__cospi_B = [p16 m16 p16 m16 p16 p16 p16 p16]
158 // k__cospi_C = [p08 p24 p08 p24 p24 m08 p24 m08]
159 // k__cospi_D = [p24 m08 p24 m08 p08 p24 p08 p24]
160 const __m128i u0 = _mm_madd_epi16(t0, k__cospi_A);
161 const __m128i u2 = _mm_madd_epi16(t0, k__cospi_B);
162 const __m128i u1 = _mm_madd_epi16(t1, k__cospi_C);
163 const __m128i u3 = _mm_madd_epi16(t1, k__cospi_D);
164 // Then add and right-shift to get back to 16-bit range
165 const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
166 const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
167 const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
168 const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
169 const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
170 const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
171 const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
172 const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
173 // w0 = [b0 b1 b7 b6]
174 // w1 = [b8 b9 bF bE]
175 // w2 = [b4 b5 b3 b2]
176 // w3 = [bC bD bB bA]
177 const __m128i x0 = _mm_packs_epi32(w0, w1);
178 const __m128i x1 = _mm_packs_epi32(w2, w3);
179 // x0 = [b0 b1 b7 b6 b8 b9 bF bE]
180 // x1 = [b4 b5 b3 b2 bC bD bB bA]
181 in0 = _mm_shuffle_epi32(x0, 0xD8);
182 in1 = _mm_shuffle_epi32(x1, 0x8D);
183 // in0 = [b0 b1 b8 b9 b7 b6 bF bE]
184 // in1 = [b3 b2 bB bA b4 b5 bC bD]
187 // vertical DCTs finished. Now we do the horizontal DCTs.
188 // Stage 3: Add/subtract
190 const __m128i t0 = _mm_add_epi16(in0, in1);
191 const __m128i t1 = _mm_sub_epi16(in0, in1);
192 // t0 = [c0 c1 c8 c9 c4 c5 cC cD]
193 // t1 = [c3 c2 cB cA -c7 -c6 -cF -cE]
195 // Stage 4: multiply by constants (which gets us into 32 bits).
196 // The constants needed here are:
197 // k__cospi_E = [p16 p16 p16 p16 p16 p16 p16 p16]
198 // k__cospi_F = [p16 m16 p16 m16 p16 m16 p16 m16]
199 // k__cospi_G = [p08 p24 p08 p24 m08 m24 m08 m24]
200 // k__cospi_H = [p24 m08 p24 m08 m24 p08 m24 p08]
201 const __m128i u0 = _mm_madd_epi16(t0, k__cospi_E);
202 const __m128i u1 = _mm_madd_epi16(t0, k__cospi_F);
203 const __m128i u2 = _mm_madd_epi16(t1, k__cospi_G);
204 const __m128i u3 = _mm_madd_epi16(t1, k__cospi_H);
205 // Then add and right-shift to get back to 16-bit range
206 // but this combines the final right-shift as well to save operations
207 // This unusual rounding operations is to maintain bit-accurate
208 // compatibility with the c version of this function which has two
209 // rounding steps in a row.
210 const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING2);
211 const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING2);
212 const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING2);
213 const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING2);
214 const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS2);
215 const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS2);
216 const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS2);
217 const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS2);
218 // w0 = [o0 o4 o8 oC]
219 // w1 = [o2 o6 oA oE]
220 // w2 = [o1 o5 o9 oD]
221 // w3 = [o3 o7 oB oF]
222 // remember the o's are numbered according to the correct output location
223 const __m128i x0 = _mm_packs_epi32(w0, w1);
224 const __m128i x1 = _mm_packs_epi32(w2, w3);
225 // x0 = [o0 o4 o8 oC o2 o6 oA oE]
226 // x1 = [o1 o5 o9 oD o3 o7 oB oF]
227 const __m128i y0 = _mm_unpacklo_epi16(x0, x1);
228 const __m128i y1 = _mm_unpackhi_epi16(x0, x1);
229 // y0 = [o0 o1 o4 o5 o8 o9 oC oD]
230 // y1 = [o2 o3 o6 o7 oA oB oE oF]
231 in0 = _mm_unpacklo_epi32(y0, y1);
232 // in0 = [o0 o1 o2 o3 o4 o5 o6 o7]
233 in1 = _mm_unpackhi_epi32(y0, y1);
234 // in1 = [o8 o9 oA oB oC oD oE oF]
236 // Post-condition (v + 1) >> 2 is now incorporated into previous
237 // add and right-shift commands. Only 2 store instructions needed
238 // because we are using the fact that 1/3 are stored just after 0/2.
240 _mm_storeu_si128((__m128i *)(output + 0 * 4), in0);
241 _mm_storeu_si128((__m128i *)(output + 2 * 4), in1);
246 static INLINE void load_buffer_4x4(const int16_t *input, __m128i *in,
248 const __m128i k__nonzero_bias_a = _mm_setr_epi16(0, 1, 1, 1, 1, 1, 1, 1);
249 const __m128i k__nonzero_bias_b = _mm_setr_epi16(1, 0, 0, 0, 0, 0, 0, 0);
252 in[0] = _mm_loadl_epi64((const __m128i *)(input + 0 * stride));
253 in[1] = _mm_loadl_epi64((const __m128i *)(input + 1 * stride));
254 in[2] = _mm_loadl_epi64((const __m128i *)(input + 2 * stride));
255 in[3] = _mm_loadl_epi64((const __m128i *)(input + 3 * stride));
257 in[0] = _mm_slli_epi16(in[0], 4);
258 in[1] = _mm_slli_epi16(in[1], 4);
259 in[2] = _mm_slli_epi16(in[2], 4);
260 in[3] = _mm_slli_epi16(in[3], 4);
262 mask = _mm_cmpeq_epi16(in[0], k__nonzero_bias_a);
263 in[0] = _mm_add_epi16(in[0], mask);
264 in[0] = _mm_add_epi16(in[0], k__nonzero_bias_b);
267 static INLINE void write_buffer_4x4(int16_t *output, __m128i *res) {
268 const __m128i kOne = _mm_set1_epi16(1);
269 __m128i in01 = _mm_unpacklo_epi64(res[0], res[1]);
270 __m128i in23 = _mm_unpacklo_epi64(res[2], res[3]);
271 __m128i out01 = _mm_add_epi16(in01, kOne);
272 __m128i out23 = _mm_add_epi16(in23, kOne);
273 out01 = _mm_srai_epi16(out01, 2);
274 out23 = _mm_srai_epi16(out23, 2);
275 _mm_store_si128((__m128i *)(output + 0 * 8), out01);
276 _mm_store_si128((__m128i *)(output + 1 * 8), out23);
279 static INLINE void transpose_4x4(__m128i *res) {
280 // Combine and transpose
281 // 00 01 02 03 20 21 22 23
282 // 10 11 12 13 30 31 32 33
283 const __m128i tr0_0 = _mm_unpacklo_epi16(res[0], res[1]);
284 const __m128i tr0_1 = _mm_unpackhi_epi16(res[0], res[1]);
286 // 00 10 01 11 02 12 03 13
287 // 20 30 21 31 22 32 23 33
288 res[0] = _mm_unpacklo_epi32(tr0_0, tr0_1);
289 res[2] = _mm_unpackhi_epi32(tr0_0, tr0_1);
291 // 00 10 20 30 01 11 21 31
292 // 02 12 22 32 03 13 23 33
293 // only use the first 4 16-bit integers
294 res[1] = _mm_unpackhi_epi64(res[0], res[0]);
295 res[3] = _mm_unpackhi_epi64(res[2], res[2]);
298 void fdct4_sse2(__m128i *in) {
299 const __m128i k__cospi_p16_p16 = _mm_set1_epi16(cospi_16_64);
300 const __m128i k__cospi_p16_m16 = pair_set_epi16(cospi_16_64, -cospi_16_64);
301 const __m128i k__cospi_p08_p24 = pair_set_epi16(cospi_8_64, cospi_24_64);
302 const __m128i k__cospi_p24_m08 = pair_set_epi16(cospi_24_64, -cospi_8_64);
303 const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
306 u[0]=_mm_unpacklo_epi16(in[0], in[1]);
307 u[1]=_mm_unpacklo_epi16(in[3], in[2]);
309 v[0] = _mm_add_epi16(u[0], u[1]);
310 v[1] = _mm_sub_epi16(u[0], u[1]);
312 u[0] = _mm_madd_epi16(v[0], k__cospi_p16_p16); // 0
313 u[1] = _mm_madd_epi16(v[0], k__cospi_p16_m16); // 2
314 u[2] = _mm_madd_epi16(v[1], k__cospi_p08_p24); // 1
315 u[3] = _mm_madd_epi16(v[1], k__cospi_p24_m08); // 3
317 v[0] = _mm_add_epi32(u[0], k__DCT_CONST_ROUNDING);
318 v[1] = _mm_add_epi32(u[1], k__DCT_CONST_ROUNDING);
319 v[2] = _mm_add_epi32(u[2], k__DCT_CONST_ROUNDING);
320 v[3] = _mm_add_epi32(u[3], k__DCT_CONST_ROUNDING);
321 u[0] = _mm_srai_epi32(v[0], DCT_CONST_BITS);
322 u[1] = _mm_srai_epi32(v[1], DCT_CONST_BITS);
323 u[2] = _mm_srai_epi32(v[2], DCT_CONST_BITS);
324 u[3] = _mm_srai_epi32(v[3], DCT_CONST_BITS);
326 in[0] = _mm_packs_epi32(u[0], u[1]);
327 in[1] = _mm_packs_epi32(u[2], u[3]);
331 void fadst4_sse2(__m128i *in) {
332 const __m128i k__sinpi_p01_p02 = pair_set_epi16(sinpi_1_9, sinpi_2_9);
333 const __m128i k__sinpi_p04_m01 = pair_set_epi16(sinpi_4_9, -sinpi_1_9);
334 const __m128i k__sinpi_p03_p04 = pair_set_epi16(sinpi_3_9, sinpi_4_9);
335 const __m128i k__sinpi_m03_p02 = pair_set_epi16(-sinpi_3_9, sinpi_2_9);
336 const __m128i k__sinpi_p03_p03 = _mm_set1_epi16(sinpi_3_9);
337 const __m128i kZero = _mm_set1_epi16(0);
338 const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
340 __m128i in7 = _mm_add_epi16(in[0], in[1]);
342 u[0] = _mm_unpacklo_epi16(in[0], in[1]);
343 u[1] = _mm_unpacklo_epi16(in[2], in[3]);
344 u[2] = _mm_unpacklo_epi16(in7, kZero);
345 u[3] = _mm_unpacklo_epi16(in[2], kZero);
346 u[4] = _mm_unpacklo_epi16(in[3], kZero);
348 v[0] = _mm_madd_epi16(u[0], k__sinpi_p01_p02); // s0 + s2
349 v[1] = _mm_madd_epi16(u[1], k__sinpi_p03_p04); // s4 + s5
350 v[2] = _mm_madd_epi16(u[2], k__sinpi_p03_p03); // x1
351 v[3] = _mm_madd_epi16(u[0], k__sinpi_p04_m01); // s1 - s3
352 v[4] = _mm_madd_epi16(u[1], k__sinpi_m03_p02); // -s4 + s6
353 v[5] = _mm_madd_epi16(u[3], k__sinpi_p03_p03); // s4
354 v[6] = _mm_madd_epi16(u[4], k__sinpi_p03_p03);
356 u[0] = _mm_add_epi32(v[0], v[1]);
357 u[1] = _mm_sub_epi32(v[2], v[6]);
358 u[2] = _mm_add_epi32(v[3], v[4]);
359 u[3] = _mm_sub_epi32(u[2], u[0]);
360 u[4] = _mm_slli_epi32(v[5], 2);
361 u[5] = _mm_sub_epi32(u[4], v[5]);
362 u[6] = _mm_add_epi32(u[3], u[5]);
364 v[0] = _mm_add_epi32(u[0], k__DCT_CONST_ROUNDING);
365 v[1] = _mm_add_epi32(u[1], k__DCT_CONST_ROUNDING);
366 v[2] = _mm_add_epi32(u[2], k__DCT_CONST_ROUNDING);
367 v[3] = _mm_add_epi32(u[6], k__DCT_CONST_ROUNDING);
369 u[0] = _mm_srai_epi32(v[0], DCT_CONST_BITS);
370 u[1] = _mm_srai_epi32(v[1], DCT_CONST_BITS);
371 u[2] = _mm_srai_epi32(v[2], DCT_CONST_BITS);
372 u[3] = _mm_srai_epi32(v[3], DCT_CONST_BITS);
374 in[0] = _mm_packs_epi32(u[0], u[2]);
375 in[1] = _mm_packs_epi32(u[1], u[3]);
379 void vp9_fht4x4_sse2(const int16_t *input, int16_t *output,
380 int stride, int tx_type) {
385 vp9_fdct4x4_sse2(input, output, stride);
388 load_buffer_4x4(input, in, stride);
391 write_buffer_4x4(output, in);
394 load_buffer_4x4(input, in, stride);
397 write_buffer_4x4(output, in);
400 load_buffer_4x4(input, in, stride);
403 write_buffer_4x4(output, in);
411 void vp9_fdct8x8_1_sse2(const int16_t *input, int16_t *output, int stride) {
412 __m128i in0 = _mm_load_si128((const __m128i *)(input + 0 * stride));
413 __m128i in1 = _mm_load_si128((const __m128i *)(input + 1 * stride));
414 __m128i in2 = _mm_load_si128((const __m128i *)(input + 2 * stride));
415 __m128i in3 = _mm_load_si128((const __m128i *)(input + 3 * stride));
418 u0 = _mm_add_epi16(in0, in1);
419 u1 = _mm_add_epi16(in2, in3);
421 in0 = _mm_load_si128((const __m128i *)(input + 4 * stride));
422 in1 = _mm_load_si128((const __m128i *)(input + 5 * stride));
423 in2 = _mm_load_si128((const __m128i *)(input + 6 * stride));
424 in3 = _mm_load_si128((const __m128i *)(input + 7 * stride));
426 sum = _mm_add_epi16(u0, u1);
428 in0 = _mm_add_epi16(in0, in1);
429 in2 = _mm_add_epi16(in2, in3);
430 sum = _mm_add_epi16(sum, in0);
432 u0 = _mm_setzero_si128();
433 sum = _mm_add_epi16(sum, in2);
435 in0 = _mm_unpacklo_epi16(u0, sum);
436 in1 = _mm_unpackhi_epi16(u0, sum);
437 in0 = _mm_srai_epi32(in0, 16);
438 in1 = _mm_srai_epi32(in1, 16);
440 sum = _mm_add_epi32(in0, in1);
441 in0 = _mm_unpacklo_epi32(sum, u0);
442 in1 = _mm_unpackhi_epi32(sum, u0);
444 sum = _mm_add_epi32(in0, in1);
445 in0 = _mm_srli_si128(sum, 8);
447 in1 = _mm_add_epi32(sum, in0);
448 _mm_store_si128((__m128i *)(output), in1);
451 void vp9_fdct8x8_sse2(const int16_t *input, int16_t *output, int stride) {
454 // When we use them, in one case, they are all the same. In all others
455 // it's a pair of them that we need to repeat four times. This is done
456 // by constructing the 32 bit constant corresponding to that pair.
457 const __m128i k__cospi_p16_p16 = _mm_set1_epi16(cospi_16_64);
458 const __m128i k__cospi_p16_m16 = pair_set_epi16(cospi_16_64, -cospi_16_64);
459 const __m128i k__cospi_p24_p08 = pair_set_epi16(cospi_24_64, cospi_8_64);
460 const __m128i k__cospi_m08_p24 = pair_set_epi16(-cospi_8_64, cospi_24_64);
461 const __m128i k__cospi_p28_p04 = pair_set_epi16(cospi_28_64, cospi_4_64);
462 const __m128i k__cospi_m04_p28 = pair_set_epi16(-cospi_4_64, cospi_28_64);
463 const __m128i k__cospi_p12_p20 = pair_set_epi16(cospi_12_64, cospi_20_64);
464 const __m128i k__cospi_m20_p12 = pair_set_epi16(-cospi_20_64, cospi_12_64);
465 const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
467 __m128i in0 = _mm_load_si128((const __m128i *)(input + 0 * stride));
468 __m128i in1 = _mm_load_si128((const __m128i *)(input + 1 * stride));
469 __m128i in2 = _mm_load_si128((const __m128i *)(input + 2 * stride));
470 __m128i in3 = _mm_load_si128((const __m128i *)(input + 3 * stride));
471 __m128i in4 = _mm_load_si128((const __m128i *)(input + 4 * stride));
472 __m128i in5 = _mm_load_si128((const __m128i *)(input + 5 * stride));
473 __m128i in6 = _mm_load_si128((const __m128i *)(input + 6 * stride));
474 __m128i in7 = _mm_load_si128((const __m128i *)(input + 7 * stride));
475 // Pre-condition input (shift by two)
476 in0 = _mm_slli_epi16(in0, 2);
477 in1 = _mm_slli_epi16(in1, 2);
478 in2 = _mm_slli_epi16(in2, 2);
479 in3 = _mm_slli_epi16(in3, 2);
480 in4 = _mm_slli_epi16(in4, 2);
481 in5 = _mm_slli_epi16(in5, 2);
482 in6 = _mm_slli_epi16(in6, 2);
483 in7 = _mm_slli_epi16(in7, 2);
485 // We do two passes, first the columns, then the rows. The results of the
486 // first pass are transposed so that the same column code can be reused. The
487 // results of the second pass are also transposed so that the rows (processed
488 // as columns) are put back in row positions.
489 for (pass = 0; pass < 2; pass++) {
490 // To store results of each pass before the transpose.
491 __m128i res0, res1, res2, res3, res4, res5, res6, res7;
493 const __m128i q0 = _mm_add_epi16(in0, in7);
494 const __m128i q1 = _mm_add_epi16(in1, in6);
495 const __m128i q2 = _mm_add_epi16(in2, in5);
496 const __m128i q3 = _mm_add_epi16(in3, in4);
497 const __m128i q4 = _mm_sub_epi16(in3, in4);
498 const __m128i q5 = _mm_sub_epi16(in2, in5);
499 const __m128i q6 = _mm_sub_epi16(in1, in6);
500 const __m128i q7 = _mm_sub_epi16(in0, in7);
501 // Work on first four results
504 const __m128i r0 = _mm_add_epi16(q0, q3);
505 const __m128i r1 = _mm_add_epi16(q1, q2);
506 const __m128i r2 = _mm_sub_epi16(q1, q2);
507 const __m128i r3 = _mm_sub_epi16(q0, q3);
508 // Interleave to do the multiply by constants which gets us into 32bits
509 const __m128i t0 = _mm_unpacklo_epi16(r0, r1);
510 const __m128i t1 = _mm_unpackhi_epi16(r0, r1);
511 const __m128i t2 = _mm_unpacklo_epi16(r2, r3);
512 const __m128i t3 = _mm_unpackhi_epi16(r2, r3);
513 const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p16_p16);
514 const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p16_p16);
515 const __m128i u2 = _mm_madd_epi16(t0, k__cospi_p16_m16);
516 const __m128i u3 = _mm_madd_epi16(t1, k__cospi_p16_m16);
517 const __m128i u4 = _mm_madd_epi16(t2, k__cospi_p24_p08);
518 const __m128i u5 = _mm_madd_epi16(t3, k__cospi_p24_p08);
519 const __m128i u6 = _mm_madd_epi16(t2, k__cospi_m08_p24);
520 const __m128i u7 = _mm_madd_epi16(t3, k__cospi_m08_p24);
521 // dct_const_round_shift
522 const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
523 const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
524 const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
525 const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
526 const __m128i v4 = _mm_add_epi32(u4, k__DCT_CONST_ROUNDING);
527 const __m128i v5 = _mm_add_epi32(u5, k__DCT_CONST_ROUNDING);
528 const __m128i v6 = _mm_add_epi32(u6, k__DCT_CONST_ROUNDING);
529 const __m128i v7 = _mm_add_epi32(u7, k__DCT_CONST_ROUNDING);
530 const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
531 const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
532 const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
533 const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
534 const __m128i w4 = _mm_srai_epi32(v4, DCT_CONST_BITS);
535 const __m128i w5 = _mm_srai_epi32(v5, DCT_CONST_BITS);
536 const __m128i w6 = _mm_srai_epi32(v6, DCT_CONST_BITS);
537 const __m128i w7 = _mm_srai_epi32(v7, DCT_CONST_BITS);
539 res0 = _mm_packs_epi32(w0, w1);
540 res4 = _mm_packs_epi32(w2, w3);
541 res2 = _mm_packs_epi32(w4, w5);
542 res6 = _mm_packs_epi32(w6, w7);
544 // Work on next four results
546 // Interleave to do the multiply by constants which gets us into 32bits
547 const __m128i d0 = _mm_unpacklo_epi16(q6, q5);
548 const __m128i d1 = _mm_unpackhi_epi16(q6, q5);
549 const __m128i e0 = _mm_madd_epi16(d0, k__cospi_p16_m16);
550 const __m128i e1 = _mm_madd_epi16(d1, k__cospi_p16_m16);
551 const __m128i e2 = _mm_madd_epi16(d0, k__cospi_p16_p16);
552 const __m128i e3 = _mm_madd_epi16(d1, k__cospi_p16_p16);
553 // dct_const_round_shift
554 const __m128i f0 = _mm_add_epi32(e0, k__DCT_CONST_ROUNDING);
555 const __m128i f1 = _mm_add_epi32(e1, k__DCT_CONST_ROUNDING);
556 const __m128i f2 = _mm_add_epi32(e2, k__DCT_CONST_ROUNDING);
557 const __m128i f3 = _mm_add_epi32(e3, k__DCT_CONST_ROUNDING);
558 const __m128i s0 = _mm_srai_epi32(f0, DCT_CONST_BITS);
559 const __m128i s1 = _mm_srai_epi32(f1, DCT_CONST_BITS);
560 const __m128i s2 = _mm_srai_epi32(f2, DCT_CONST_BITS);
561 const __m128i s3 = _mm_srai_epi32(f3, DCT_CONST_BITS);
563 const __m128i r0 = _mm_packs_epi32(s0, s1);
564 const __m128i r1 = _mm_packs_epi32(s2, s3);
566 const __m128i x0 = _mm_add_epi16(q4, r0);
567 const __m128i x1 = _mm_sub_epi16(q4, r0);
568 const __m128i x2 = _mm_sub_epi16(q7, r1);
569 const __m128i x3 = _mm_add_epi16(q7, r1);
570 // Interleave to do the multiply by constants which gets us into 32bits
571 const __m128i t0 = _mm_unpacklo_epi16(x0, x3);
572 const __m128i t1 = _mm_unpackhi_epi16(x0, x3);
573 const __m128i t2 = _mm_unpacklo_epi16(x1, x2);
574 const __m128i t3 = _mm_unpackhi_epi16(x1, x2);
575 const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p28_p04);
576 const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p28_p04);
577 const __m128i u2 = _mm_madd_epi16(t0, k__cospi_m04_p28);
578 const __m128i u3 = _mm_madd_epi16(t1, k__cospi_m04_p28);
579 const __m128i u4 = _mm_madd_epi16(t2, k__cospi_p12_p20);
580 const __m128i u5 = _mm_madd_epi16(t3, k__cospi_p12_p20);
581 const __m128i u6 = _mm_madd_epi16(t2, k__cospi_m20_p12);
582 const __m128i u7 = _mm_madd_epi16(t3, k__cospi_m20_p12);
583 // dct_const_round_shift
584 const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
585 const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
586 const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
587 const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
588 const __m128i v4 = _mm_add_epi32(u4, k__DCT_CONST_ROUNDING);
589 const __m128i v5 = _mm_add_epi32(u5, k__DCT_CONST_ROUNDING);
590 const __m128i v6 = _mm_add_epi32(u6, k__DCT_CONST_ROUNDING);
591 const __m128i v7 = _mm_add_epi32(u7, k__DCT_CONST_ROUNDING);
592 const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
593 const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
594 const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
595 const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
596 const __m128i w4 = _mm_srai_epi32(v4, DCT_CONST_BITS);
597 const __m128i w5 = _mm_srai_epi32(v5, DCT_CONST_BITS);
598 const __m128i w6 = _mm_srai_epi32(v6, DCT_CONST_BITS);
599 const __m128i w7 = _mm_srai_epi32(v7, DCT_CONST_BITS);
601 res1 = _mm_packs_epi32(w0, w1);
602 res7 = _mm_packs_epi32(w2, w3);
603 res5 = _mm_packs_epi32(w4, w5);
604 res3 = _mm_packs_epi32(w6, w7);
606 // Transpose the 8x8.
608 // 00 01 02 03 04 05 06 07
609 // 10 11 12 13 14 15 16 17
610 // 20 21 22 23 24 25 26 27
611 // 30 31 32 33 34 35 36 37
612 // 40 41 42 43 44 45 46 47
613 // 50 51 52 53 54 55 56 57
614 // 60 61 62 63 64 65 66 67
615 // 70 71 72 73 74 75 76 77
616 const __m128i tr0_0 = _mm_unpacklo_epi16(res0, res1);
617 const __m128i tr0_1 = _mm_unpacklo_epi16(res2, res3);
618 const __m128i tr0_2 = _mm_unpackhi_epi16(res0, res1);
619 const __m128i tr0_3 = _mm_unpackhi_epi16(res2, res3);
620 const __m128i tr0_4 = _mm_unpacklo_epi16(res4, res5);
621 const __m128i tr0_5 = _mm_unpacklo_epi16(res6, res7);
622 const __m128i tr0_6 = _mm_unpackhi_epi16(res4, res5);
623 const __m128i tr0_7 = _mm_unpackhi_epi16(res6, res7);
624 // 00 10 01 11 02 12 03 13
625 // 20 30 21 31 22 32 23 33
626 // 04 14 05 15 06 16 07 17
627 // 24 34 25 35 26 36 27 37
628 // 40 50 41 51 42 52 43 53
629 // 60 70 61 71 62 72 63 73
630 // 54 54 55 55 56 56 57 57
631 // 64 74 65 75 66 76 67 77
632 const __m128i tr1_0 = _mm_unpacklo_epi32(tr0_0, tr0_1);
633 const __m128i tr1_1 = _mm_unpacklo_epi32(tr0_2, tr0_3);
634 const __m128i tr1_2 = _mm_unpackhi_epi32(tr0_0, tr0_1);
635 const __m128i tr1_3 = _mm_unpackhi_epi32(tr0_2, tr0_3);
636 const __m128i tr1_4 = _mm_unpacklo_epi32(tr0_4, tr0_5);
637 const __m128i tr1_5 = _mm_unpacklo_epi32(tr0_6, tr0_7);
638 const __m128i tr1_6 = _mm_unpackhi_epi32(tr0_4, tr0_5);
639 const __m128i tr1_7 = _mm_unpackhi_epi32(tr0_6, tr0_7);
640 // 00 10 20 30 01 11 21 31
641 // 40 50 60 70 41 51 61 71
642 // 02 12 22 32 03 13 23 33
643 // 42 52 62 72 43 53 63 73
644 // 04 14 24 34 05 15 21 36
645 // 44 54 64 74 45 55 61 76
646 // 06 16 26 36 07 17 27 37
647 // 46 56 66 76 47 57 67 77
648 in0 = _mm_unpacklo_epi64(tr1_0, tr1_4);
649 in1 = _mm_unpackhi_epi64(tr1_0, tr1_4);
650 in2 = _mm_unpacklo_epi64(tr1_2, tr1_6);
651 in3 = _mm_unpackhi_epi64(tr1_2, tr1_6);
652 in4 = _mm_unpacklo_epi64(tr1_1, tr1_5);
653 in5 = _mm_unpackhi_epi64(tr1_1, tr1_5);
654 in6 = _mm_unpacklo_epi64(tr1_3, tr1_7);
655 in7 = _mm_unpackhi_epi64(tr1_3, tr1_7);
656 // 00 10 20 30 40 50 60 70
657 // 01 11 21 31 41 51 61 71
658 // 02 12 22 32 42 52 62 72
659 // 03 13 23 33 43 53 63 73
660 // 04 14 24 34 44 54 64 74
661 // 05 15 25 35 45 55 65 75
662 // 06 16 26 36 46 56 66 76
663 // 07 17 27 37 47 57 67 77
666 // Post-condition output and store it
668 // Post-condition (division by two)
669 // division of two 16 bits signed numbers using shifts
670 // n / 2 = (n - (n >> 15)) >> 1
671 const __m128i sign_in0 = _mm_srai_epi16(in0, 15);
672 const __m128i sign_in1 = _mm_srai_epi16(in1, 15);
673 const __m128i sign_in2 = _mm_srai_epi16(in2, 15);
674 const __m128i sign_in3 = _mm_srai_epi16(in3, 15);
675 const __m128i sign_in4 = _mm_srai_epi16(in4, 15);
676 const __m128i sign_in5 = _mm_srai_epi16(in5, 15);
677 const __m128i sign_in6 = _mm_srai_epi16(in6, 15);
678 const __m128i sign_in7 = _mm_srai_epi16(in7, 15);
679 in0 = _mm_sub_epi16(in0, sign_in0);
680 in1 = _mm_sub_epi16(in1, sign_in1);
681 in2 = _mm_sub_epi16(in2, sign_in2);
682 in3 = _mm_sub_epi16(in3, sign_in3);
683 in4 = _mm_sub_epi16(in4, sign_in4);
684 in5 = _mm_sub_epi16(in5, sign_in5);
685 in6 = _mm_sub_epi16(in6, sign_in6);
686 in7 = _mm_sub_epi16(in7, sign_in7);
687 in0 = _mm_srai_epi16(in0, 1);
688 in1 = _mm_srai_epi16(in1, 1);
689 in2 = _mm_srai_epi16(in2, 1);
690 in3 = _mm_srai_epi16(in3, 1);
691 in4 = _mm_srai_epi16(in4, 1);
692 in5 = _mm_srai_epi16(in5, 1);
693 in6 = _mm_srai_epi16(in6, 1);
694 in7 = _mm_srai_epi16(in7, 1);
696 _mm_store_si128((__m128i *)(output + 0 * 8), in0);
697 _mm_store_si128((__m128i *)(output + 1 * 8), in1);
698 _mm_store_si128((__m128i *)(output + 2 * 8), in2);
699 _mm_store_si128((__m128i *)(output + 3 * 8), in3);
700 _mm_store_si128((__m128i *)(output + 4 * 8), in4);
701 _mm_store_si128((__m128i *)(output + 5 * 8), in5);
702 _mm_store_si128((__m128i *)(output + 6 * 8), in6);
703 _mm_store_si128((__m128i *)(output + 7 * 8), in7);
708 static INLINE void load_buffer_8x8(const int16_t *input, __m128i *in,
710 in[0] = _mm_load_si128((const __m128i *)(input + 0 * stride));
711 in[1] = _mm_load_si128((const __m128i *)(input + 1 * stride));
712 in[2] = _mm_load_si128((const __m128i *)(input + 2 * stride));
713 in[3] = _mm_load_si128((const __m128i *)(input + 3 * stride));
714 in[4] = _mm_load_si128((const __m128i *)(input + 4 * stride));
715 in[5] = _mm_load_si128((const __m128i *)(input + 5 * stride));
716 in[6] = _mm_load_si128((const __m128i *)(input + 6 * stride));
717 in[7] = _mm_load_si128((const __m128i *)(input + 7 * stride));
719 in[0] = _mm_slli_epi16(in[0], 2);
720 in[1] = _mm_slli_epi16(in[1], 2);
721 in[2] = _mm_slli_epi16(in[2], 2);
722 in[3] = _mm_slli_epi16(in[3], 2);
723 in[4] = _mm_slli_epi16(in[4], 2);
724 in[5] = _mm_slli_epi16(in[5], 2);
725 in[6] = _mm_slli_epi16(in[6], 2);
726 in[7] = _mm_slli_epi16(in[7], 2);
729 // right shift and rounding
730 static INLINE void right_shift_8x8(__m128i *res, int const bit) {
731 const __m128i kOne = _mm_set1_epi16(1);
732 const int bit_m02 = bit - 2;
733 __m128i sign0 = _mm_srai_epi16(res[0], 15);
734 __m128i sign1 = _mm_srai_epi16(res[1], 15);
735 __m128i sign2 = _mm_srai_epi16(res[2], 15);
736 __m128i sign3 = _mm_srai_epi16(res[3], 15);
737 __m128i sign4 = _mm_srai_epi16(res[4], 15);
738 __m128i sign5 = _mm_srai_epi16(res[5], 15);
739 __m128i sign6 = _mm_srai_epi16(res[6], 15);
740 __m128i sign7 = _mm_srai_epi16(res[7], 15);
743 __m128i k_const_rounding = _mm_slli_epi16(kOne, bit_m02);
744 res[0] = _mm_add_epi16(res[0], k_const_rounding);
745 res[1] = _mm_add_epi16(res[1], k_const_rounding);
746 res[2] = _mm_add_epi16(res[2], k_const_rounding);
747 res[3] = _mm_add_epi16(res[3], k_const_rounding);
748 res[4] = _mm_add_epi16(res[4], k_const_rounding);
749 res[5] = _mm_add_epi16(res[5], k_const_rounding);
750 res[6] = _mm_add_epi16(res[6], k_const_rounding);
751 res[7] = _mm_add_epi16(res[7], k_const_rounding);
754 res[0] = _mm_sub_epi16(res[0], sign0);
755 res[1] = _mm_sub_epi16(res[1], sign1);
756 res[2] = _mm_sub_epi16(res[2], sign2);
757 res[3] = _mm_sub_epi16(res[3], sign3);
758 res[4] = _mm_sub_epi16(res[4], sign4);
759 res[5] = _mm_sub_epi16(res[5], sign5);
760 res[6] = _mm_sub_epi16(res[6], sign6);
761 res[7] = _mm_sub_epi16(res[7], sign7);
763 res[0] = _mm_srai_epi16(res[0], bit);
764 res[1] = _mm_srai_epi16(res[1], bit);
765 res[2] = _mm_srai_epi16(res[2], bit);
766 res[3] = _mm_srai_epi16(res[3], bit);
767 res[4] = _mm_srai_epi16(res[4], bit);
768 res[5] = _mm_srai_epi16(res[5], bit);
769 res[6] = _mm_srai_epi16(res[6], bit);
770 res[7] = _mm_srai_epi16(res[7], bit);
774 static INLINE void write_buffer_8x8(int16_t *output, __m128i *res, int stride) {
775 _mm_store_si128((__m128i *)(output + 0 * stride), res[0]);
776 _mm_store_si128((__m128i *)(output + 1 * stride), res[1]);
777 _mm_store_si128((__m128i *)(output + 2 * stride), res[2]);
778 _mm_store_si128((__m128i *)(output + 3 * stride), res[3]);
779 _mm_store_si128((__m128i *)(output + 4 * stride), res[4]);
780 _mm_store_si128((__m128i *)(output + 5 * stride), res[5]);
781 _mm_store_si128((__m128i *)(output + 6 * stride), res[6]);
782 _mm_store_si128((__m128i *)(output + 7 * stride), res[7]);
785 void fdct8_sse2(__m128i *in) {
787 const __m128i k__cospi_p16_p16 = _mm_set1_epi16(cospi_16_64);
788 const __m128i k__cospi_p16_m16 = pair_set_epi16(cospi_16_64, -cospi_16_64);
789 const __m128i k__cospi_p24_p08 = pair_set_epi16(cospi_24_64, cospi_8_64);
790 const __m128i k__cospi_m08_p24 = pair_set_epi16(-cospi_8_64, cospi_24_64);
791 const __m128i k__cospi_p28_p04 = pair_set_epi16(cospi_28_64, cospi_4_64);
792 const __m128i k__cospi_m04_p28 = pair_set_epi16(-cospi_4_64, cospi_28_64);
793 const __m128i k__cospi_p12_p20 = pair_set_epi16(cospi_12_64, cospi_20_64);
794 const __m128i k__cospi_m20_p12 = pair_set_epi16(-cospi_20_64, cospi_12_64);
795 const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
796 __m128i u0, u1, u2, u3, u4, u5, u6, u7;
797 __m128i v0, v1, v2, v3, v4, v5, v6, v7;
798 __m128i s0, s1, s2, s3, s4, s5, s6, s7;
801 s0 = _mm_add_epi16(in[0], in[7]);
802 s1 = _mm_add_epi16(in[1], in[6]);
803 s2 = _mm_add_epi16(in[2], in[5]);
804 s3 = _mm_add_epi16(in[3], in[4]);
805 s4 = _mm_sub_epi16(in[3], in[4]);
806 s5 = _mm_sub_epi16(in[2], in[5]);
807 s6 = _mm_sub_epi16(in[1], in[6]);
808 s7 = _mm_sub_epi16(in[0], in[7]);
810 u0 = _mm_add_epi16(s0, s3);
811 u1 = _mm_add_epi16(s1, s2);
812 u2 = _mm_sub_epi16(s1, s2);
813 u3 = _mm_sub_epi16(s0, s3);
814 // interleave and perform butterfly multiplication/addition
815 v0 = _mm_unpacklo_epi16(u0, u1);
816 v1 = _mm_unpackhi_epi16(u0, u1);
817 v2 = _mm_unpacklo_epi16(u2, u3);
818 v3 = _mm_unpackhi_epi16(u2, u3);
820 u0 = _mm_madd_epi16(v0, k__cospi_p16_p16);
821 u1 = _mm_madd_epi16(v1, k__cospi_p16_p16);
822 u2 = _mm_madd_epi16(v0, k__cospi_p16_m16);
823 u3 = _mm_madd_epi16(v1, k__cospi_p16_m16);
824 u4 = _mm_madd_epi16(v2, k__cospi_p24_p08);
825 u5 = _mm_madd_epi16(v3, k__cospi_p24_p08);
826 u6 = _mm_madd_epi16(v2, k__cospi_m08_p24);
827 u7 = _mm_madd_epi16(v3, k__cospi_m08_p24);
829 // shift and rounding
830 v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
831 v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
832 v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
833 v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
834 v4 = _mm_add_epi32(u4, k__DCT_CONST_ROUNDING);
835 v5 = _mm_add_epi32(u5, k__DCT_CONST_ROUNDING);
836 v6 = _mm_add_epi32(u6, k__DCT_CONST_ROUNDING);
837 v7 = _mm_add_epi32(u7, k__DCT_CONST_ROUNDING);
839 u0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
840 u1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
841 u2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
842 u3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
843 u4 = _mm_srai_epi32(v4, DCT_CONST_BITS);
844 u5 = _mm_srai_epi32(v5, DCT_CONST_BITS);
845 u6 = _mm_srai_epi32(v6, DCT_CONST_BITS);
846 u7 = _mm_srai_epi32(v7, DCT_CONST_BITS);
848 in[0] = _mm_packs_epi32(u0, u1);
849 in[2] = _mm_packs_epi32(u4, u5);
850 in[4] = _mm_packs_epi32(u2, u3);
851 in[6] = _mm_packs_epi32(u6, u7);
854 // interleave and perform butterfly multiplication/addition
855 u0 = _mm_unpacklo_epi16(s6, s5);
856 u1 = _mm_unpackhi_epi16(s6, s5);
857 v0 = _mm_madd_epi16(u0, k__cospi_p16_m16);
858 v1 = _mm_madd_epi16(u1, k__cospi_p16_m16);
859 v2 = _mm_madd_epi16(u0, k__cospi_p16_p16);
860 v3 = _mm_madd_epi16(u1, k__cospi_p16_p16);
862 // shift and rounding
863 u0 = _mm_add_epi32(v0, k__DCT_CONST_ROUNDING);
864 u1 = _mm_add_epi32(v1, k__DCT_CONST_ROUNDING);
865 u2 = _mm_add_epi32(v2, k__DCT_CONST_ROUNDING);
866 u3 = _mm_add_epi32(v3, k__DCT_CONST_ROUNDING);
868 v0 = _mm_srai_epi32(u0, DCT_CONST_BITS);
869 v1 = _mm_srai_epi32(u1, DCT_CONST_BITS);
870 v2 = _mm_srai_epi32(u2, DCT_CONST_BITS);
871 v3 = _mm_srai_epi32(u3, DCT_CONST_BITS);
873 u0 = _mm_packs_epi32(v0, v1);
874 u1 = _mm_packs_epi32(v2, v3);
877 s0 = _mm_add_epi16(s4, u0);
878 s1 = _mm_sub_epi16(s4, u0);
879 s2 = _mm_sub_epi16(s7, u1);
880 s3 = _mm_add_epi16(s7, u1);
883 u0 = _mm_unpacklo_epi16(s0, s3);
884 u1 = _mm_unpackhi_epi16(s0, s3);
885 u2 = _mm_unpacklo_epi16(s1, s2);
886 u3 = _mm_unpackhi_epi16(s1, s2);
888 v0 = _mm_madd_epi16(u0, k__cospi_p28_p04);
889 v1 = _mm_madd_epi16(u1, k__cospi_p28_p04);
890 v2 = _mm_madd_epi16(u2, k__cospi_p12_p20);
891 v3 = _mm_madd_epi16(u3, k__cospi_p12_p20);
892 v4 = _mm_madd_epi16(u2, k__cospi_m20_p12);
893 v5 = _mm_madd_epi16(u3, k__cospi_m20_p12);
894 v6 = _mm_madd_epi16(u0, k__cospi_m04_p28);
895 v7 = _mm_madd_epi16(u1, k__cospi_m04_p28);
897 // shift and rounding
898 u0 = _mm_add_epi32(v0, k__DCT_CONST_ROUNDING);
899 u1 = _mm_add_epi32(v1, k__DCT_CONST_ROUNDING);
900 u2 = _mm_add_epi32(v2, k__DCT_CONST_ROUNDING);
901 u3 = _mm_add_epi32(v3, k__DCT_CONST_ROUNDING);
902 u4 = _mm_add_epi32(v4, k__DCT_CONST_ROUNDING);
903 u5 = _mm_add_epi32(v5, k__DCT_CONST_ROUNDING);
904 u6 = _mm_add_epi32(v6, k__DCT_CONST_ROUNDING);
905 u7 = _mm_add_epi32(v7, k__DCT_CONST_ROUNDING);
907 v0 = _mm_srai_epi32(u0, DCT_CONST_BITS);
908 v1 = _mm_srai_epi32(u1, DCT_CONST_BITS);
909 v2 = _mm_srai_epi32(u2, DCT_CONST_BITS);
910 v3 = _mm_srai_epi32(u3, DCT_CONST_BITS);
911 v4 = _mm_srai_epi32(u4, DCT_CONST_BITS);
912 v5 = _mm_srai_epi32(u5, DCT_CONST_BITS);
913 v6 = _mm_srai_epi32(u6, DCT_CONST_BITS);
914 v7 = _mm_srai_epi32(u7, DCT_CONST_BITS);
916 in[1] = _mm_packs_epi32(v0, v1);
917 in[3] = _mm_packs_epi32(v4, v5);
918 in[5] = _mm_packs_epi32(v2, v3);
919 in[7] = _mm_packs_epi32(v6, v7);
922 array_transpose_8x8(in, in);
925 void fadst8_sse2(__m128i *in) {
927 const __m128i k__cospi_p02_p30 = pair_set_epi16(cospi_2_64, cospi_30_64);
928 const __m128i k__cospi_p30_m02 = pair_set_epi16(cospi_30_64, -cospi_2_64);
929 const __m128i k__cospi_p10_p22 = pair_set_epi16(cospi_10_64, cospi_22_64);
930 const __m128i k__cospi_p22_m10 = pair_set_epi16(cospi_22_64, -cospi_10_64);
931 const __m128i k__cospi_p18_p14 = pair_set_epi16(cospi_18_64, cospi_14_64);
932 const __m128i k__cospi_p14_m18 = pair_set_epi16(cospi_14_64, -cospi_18_64);
933 const __m128i k__cospi_p26_p06 = pair_set_epi16(cospi_26_64, cospi_6_64);
934 const __m128i k__cospi_p06_m26 = pair_set_epi16(cospi_6_64, -cospi_26_64);
935 const __m128i k__cospi_p08_p24 = pair_set_epi16(cospi_8_64, cospi_24_64);
936 const __m128i k__cospi_p24_m08 = pair_set_epi16(cospi_24_64, -cospi_8_64);
937 const __m128i k__cospi_m24_p08 = pair_set_epi16(-cospi_24_64, cospi_8_64);
938 const __m128i k__cospi_p16_m16 = pair_set_epi16(cospi_16_64, -cospi_16_64);
939 const __m128i k__cospi_p16_p16 = _mm_set1_epi16(cospi_16_64);
940 const __m128i k__const_0 = _mm_set1_epi16(0);
941 const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
943 __m128i u0, u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15;
944 __m128i v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15;
945 __m128i w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15;
946 __m128i s0, s1, s2, s3, s4, s5, s6, s7;
947 __m128i in0, in1, in2, in3, in4, in5, in6, in7;
949 // properly aligned for butterfly input
959 // column transformation
961 // interleave and multiply/add into 32-bit integer
962 s0 = _mm_unpacklo_epi16(in0, in1);
963 s1 = _mm_unpackhi_epi16(in0, in1);
964 s2 = _mm_unpacklo_epi16(in2, in3);
965 s3 = _mm_unpackhi_epi16(in2, in3);
966 s4 = _mm_unpacklo_epi16(in4, in5);
967 s5 = _mm_unpackhi_epi16(in4, in5);
968 s6 = _mm_unpacklo_epi16(in6, in7);
969 s7 = _mm_unpackhi_epi16(in6, in7);
971 u0 = _mm_madd_epi16(s0, k__cospi_p02_p30);
972 u1 = _mm_madd_epi16(s1, k__cospi_p02_p30);
973 u2 = _mm_madd_epi16(s0, k__cospi_p30_m02);
974 u3 = _mm_madd_epi16(s1, k__cospi_p30_m02);
975 u4 = _mm_madd_epi16(s2, k__cospi_p10_p22);
976 u5 = _mm_madd_epi16(s3, k__cospi_p10_p22);
977 u6 = _mm_madd_epi16(s2, k__cospi_p22_m10);
978 u7 = _mm_madd_epi16(s3, k__cospi_p22_m10);
979 u8 = _mm_madd_epi16(s4, k__cospi_p18_p14);
980 u9 = _mm_madd_epi16(s5, k__cospi_p18_p14);
981 u10 = _mm_madd_epi16(s4, k__cospi_p14_m18);
982 u11 = _mm_madd_epi16(s5, k__cospi_p14_m18);
983 u12 = _mm_madd_epi16(s6, k__cospi_p26_p06);
984 u13 = _mm_madd_epi16(s7, k__cospi_p26_p06);
985 u14 = _mm_madd_epi16(s6, k__cospi_p06_m26);
986 u15 = _mm_madd_epi16(s7, k__cospi_p06_m26);
989 w0 = _mm_add_epi32(u0, u8);
990 w1 = _mm_add_epi32(u1, u9);
991 w2 = _mm_add_epi32(u2, u10);
992 w3 = _mm_add_epi32(u3, u11);
993 w4 = _mm_add_epi32(u4, u12);
994 w5 = _mm_add_epi32(u5, u13);
995 w6 = _mm_add_epi32(u6, u14);
996 w7 = _mm_add_epi32(u7, u15);
997 w8 = _mm_sub_epi32(u0, u8);
998 w9 = _mm_sub_epi32(u1, u9);
999 w10 = _mm_sub_epi32(u2, u10);
1000 w11 = _mm_sub_epi32(u3, u11);
1001 w12 = _mm_sub_epi32(u4, u12);
1002 w13 = _mm_sub_epi32(u5, u13);
1003 w14 = _mm_sub_epi32(u6, u14);
1004 w15 = _mm_sub_epi32(u7, u15);
1006 // shift and rounding
1007 v0 = _mm_add_epi32(w0, k__DCT_CONST_ROUNDING);
1008 v1 = _mm_add_epi32(w1, k__DCT_CONST_ROUNDING);
1009 v2 = _mm_add_epi32(w2, k__DCT_CONST_ROUNDING);
1010 v3 = _mm_add_epi32(w3, k__DCT_CONST_ROUNDING);
1011 v4 = _mm_add_epi32(w4, k__DCT_CONST_ROUNDING);
1012 v5 = _mm_add_epi32(w5, k__DCT_CONST_ROUNDING);
1013 v6 = _mm_add_epi32(w6, k__DCT_CONST_ROUNDING);
1014 v7 = _mm_add_epi32(w7, k__DCT_CONST_ROUNDING);
1015 v8 = _mm_add_epi32(w8, k__DCT_CONST_ROUNDING);
1016 v9 = _mm_add_epi32(w9, k__DCT_CONST_ROUNDING);
1017 v10 = _mm_add_epi32(w10, k__DCT_CONST_ROUNDING);
1018 v11 = _mm_add_epi32(w11, k__DCT_CONST_ROUNDING);
1019 v12 = _mm_add_epi32(w12, k__DCT_CONST_ROUNDING);
1020 v13 = _mm_add_epi32(w13, k__DCT_CONST_ROUNDING);
1021 v14 = _mm_add_epi32(w14, k__DCT_CONST_ROUNDING);
1022 v15 = _mm_add_epi32(w15, k__DCT_CONST_ROUNDING);
1024 u0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
1025 u1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
1026 u2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
1027 u3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
1028 u4 = _mm_srai_epi32(v4, DCT_CONST_BITS);
1029 u5 = _mm_srai_epi32(v5, DCT_CONST_BITS);
1030 u6 = _mm_srai_epi32(v6, DCT_CONST_BITS);
1031 u7 = _mm_srai_epi32(v7, DCT_CONST_BITS);
1032 u8 = _mm_srai_epi32(v8, DCT_CONST_BITS);
1033 u9 = _mm_srai_epi32(v9, DCT_CONST_BITS);
1034 u10 = _mm_srai_epi32(v10, DCT_CONST_BITS);
1035 u11 = _mm_srai_epi32(v11, DCT_CONST_BITS);
1036 u12 = _mm_srai_epi32(v12, DCT_CONST_BITS);
1037 u13 = _mm_srai_epi32(v13, DCT_CONST_BITS);
1038 u14 = _mm_srai_epi32(v14, DCT_CONST_BITS);
1039 u15 = _mm_srai_epi32(v15, DCT_CONST_BITS);
1041 // back to 16-bit and pack 8 integers into __m128i
1042 in[0] = _mm_packs_epi32(u0, u1);
1043 in[1] = _mm_packs_epi32(u2, u3);
1044 in[2] = _mm_packs_epi32(u4, u5);
1045 in[3] = _mm_packs_epi32(u6, u7);
1046 in[4] = _mm_packs_epi32(u8, u9);
1047 in[5] = _mm_packs_epi32(u10, u11);
1048 in[6] = _mm_packs_epi32(u12, u13);
1049 in[7] = _mm_packs_epi32(u14, u15);
1052 s0 = _mm_add_epi16(in[0], in[2]);
1053 s1 = _mm_add_epi16(in[1], in[3]);
1054 s2 = _mm_sub_epi16(in[0], in[2]);
1055 s3 = _mm_sub_epi16(in[1], in[3]);
1056 u0 = _mm_unpacklo_epi16(in[4], in[5]);
1057 u1 = _mm_unpackhi_epi16(in[4], in[5]);
1058 u2 = _mm_unpacklo_epi16(in[6], in[7]);
1059 u3 = _mm_unpackhi_epi16(in[6], in[7]);
1061 v0 = _mm_madd_epi16(u0, k__cospi_p08_p24);
1062 v1 = _mm_madd_epi16(u1, k__cospi_p08_p24);
1063 v2 = _mm_madd_epi16(u0, k__cospi_p24_m08);
1064 v3 = _mm_madd_epi16(u1, k__cospi_p24_m08);
1065 v4 = _mm_madd_epi16(u2, k__cospi_m24_p08);
1066 v5 = _mm_madd_epi16(u3, k__cospi_m24_p08);
1067 v6 = _mm_madd_epi16(u2, k__cospi_p08_p24);
1068 v7 = _mm_madd_epi16(u3, k__cospi_p08_p24);
1070 w0 = _mm_add_epi32(v0, v4);
1071 w1 = _mm_add_epi32(v1, v5);
1072 w2 = _mm_add_epi32(v2, v6);
1073 w3 = _mm_add_epi32(v3, v7);
1074 w4 = _mm_sub_epi32(v0, v4);
1075 w5 = _mm_sub_epi32(v1, v5);
1076 w6 = _mm_sub_epi32(v2, v6);
1077 w7 = _mm_sub_epi32(v3, v7);
1079 v0 = _mm_add_epi32(w0, k__DCT_CONST_ROUNDING);
1080 v1 = _mm_add_epi32(w1, k__DCT_CONST_ROUNDING);
1081 v2 = _mm_add_epi32(w2, k__DCT_CONST_ROUNDING);
1082 v3 = _mm_add_epi32(w3, k__DCT_CONST_ROUNDING);
1083 v4 = _mm_add_epi32(w4, k__DCT_CONST_ROUNDING);
1084 v5 = _mm_add_epi32(w5, k__DCT_CONST_ROUNDING);
1085 v6 = _mm_add_epi32(w6, k__DCT_CONST_ROUNDING);
1086 v7 = _mm_add_epi32(w7, k__DCT_CONST_ROUNDING);
1088 u0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
1089 u1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
1090 u2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
1091 u3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
1092 u4 = _mm_srai_epi32(v4, DCT_CONST_BITS);
1093 u5 = _mm_srai_epi32(v5, DCT_CONST_BITS);
1094 u6 = _mm_srai_epi32(v6, DCT_CONST_BITS);
1095 u7 = _mm_srai_epi32(v7, DCT_CONST_BITS);
1097 // back to 16-bit intergers
1098 s4 = _mm_packs_epi32(u0, u1);
1099 s5 = _mm_packs_epi32(u2, u3);
1100 s6 = _mm_packs_epi32(u4, u5);
1101 s7 = _mm_packs_epi32(u6, u7);
1104 u0 = _mm_unpacklo_epi16(s2, s3);
1105 u1 = _mm_unpackhi_epi16(s2, s3);
1106 u2 = _mm_unpacklo_epi16(s6, s7);
1107 u3 = _mm_unpackhi_epi16(s6, s7);
1109 v0 = _mm_madd_epi16(u0, k__cospi_p16_p16);
1110 v1 = _mm_madd_epi16(u1, k__cospi_p16_p16);
1111 v2 = _mm_madd_epi16(u0, k__cospi_p16_m16);
1112 v3 = _mm_madd_epi16(u1, k__cospi_p16_m16);
1113 v4 = _mm_madd_epi16(u2, k__cospi_p16_p16);
1114 v5 = _mm_madd_epi16(u3, k__cospi_p16_p16);
1115 v6 = _mm_madd_epi16(u2, k__cospi_p16_m16);
1116 v7 = _mm_madd_epi16(u3, k__cospi_p16_m16);
1118 u0 = _mm_add_epi32(v0, k__DCT_CONST_ROUNDING);
1119 u1 = _mm_add_epi32(v1, k__DCT_CONST_ROUNDING);
1120 u2 = _mm_add_epi32(v2, k__DCT_CONST_ROUNDING);
1121 u3 = _mm_add_epi32(v3, k__DCT_CONST_ROUNDING);
1122 u4 = _mm_add_epi32(v4, k__DCT_CONST_ROUNDING);
1123 u5 = _mm_add_epi32(v5, k__DCT_CONST_ROUNDING);
1124 u6 = _mm_add_epi32(v6, k__DCT_CONST_ROUNDING);
1125 u7 = _mm_add_epi32(v7, k__DCT_CONST_ROUNDING);
1127 v0 = _mm_srai_epi32(u0, DCT_CONST_BITS);
1128 v1 = _mm_srai_epi32(u1, DCT_CONST_BITS);
1129 v2 = _mm_srai_epi32(u2, DCT_CONST_BITS);
1130 v3 = _mm_srai_epi32(u3, DCT_CONST_BITS);
1131 v4 = _mm_srai_epi32(u4, DCT_CONST_BITS);
1132 v5 = _mm_srai_epi32(u5, DCT_CONST_BITS);
1133 v6 = _mm_srai_epi32(u6, DCT_CONST_BITS);
1134 v7 = _mm_srai_epi32(u7, DCT_CONST_BITS);
1136 s2 = _mm_packs_epi32(v0, v1);
1137 s3 = _mm_packs_epi32(v2, v3);
1138 s6 = _mm_packs_epi32(v4, v5);
1139 s7 = _mm_packs_epi32(v6, v7);
1141 // FIXME(jingning): do subtract using bit inversion?
1143 in[1] = _mm_sub_epi16(k__const_0, s4);
1145 in[3] = _mm_sub_epi16(k__const_0, s2);
1147 in[5] = _mm_sub_epi16(k__const_0, s7);
1149 in[7] = _mm_sub_epi16(k__const_0, s1);
1152 array_transpose_8x8(in, in);
1155 void vp9_fht8x8_sse2(const int16_t *input, int16_t *output,
1156 int stride, int tx_type) {
1161 vp9_fdct8x8_sse2(input, output, stride);
1164 load_buffer_8x8(input, in, stride);
1167 right_shift_8x8(in, 1);
1168 write_buffer_8x8(output, in, 8);
1171 load_buffer_8x8(input, in, stride);
1174 right_shift_8x8(in, 1);
1175 write_buffer_8x8(output, in, 8);
1178 load_buffer_8x8(input, in, stride);
1181 right_shift_8x8(in, 1);
1182 write_buffer_8x8(output, in, 8);
1190 void vp9_fdct16x16_1_sse2(const int16_t *input, int16_t *output, int stride) {
1191 __m128i in0, in1, in2, in3;
1193 __m128i sum = _mm_setzero_si128();
1196 for (i = 0; i < 2; ++i) {
1198 in0 = _mm_load_si128((const __m128i *)(input + 0 * stride));
1199 in1 = _mm_load_si128((const __m128i *)(input + 1 * stride));
1200 in2 = _mm_load_si128((const __m128i *)(input + 2 * stride));
1201 in3 = _mm_load_si128((const __m128i *)(input + 3 * stride));
1203 u0 = _mm_add_epi16(in0, in1);
1204 u1 = _mm_add_epi16(in2, in3);
1205 sum = _mm_add_epi16(sum, u0);
1207 in0 = _mm_load_si128((const __m128i *)(input + 4 * stride));
1208 in1 = _mm_load_si128((const __m128i *)(input + 5 * stride));
1209 in2 = _mm_load_si128((const __m128i *)(input + 6 * stride));
1210 in3 = _mm_load_si128((const __m128i *)(input + 7 * stride));
1212 sum = _mm_add_epi16(sum, u1);
1213 u0 = _mm_add_epi16(in0, in1);
1214 u1 = _mm_add_epi16(in2, in3);
1215 sum = _mm_add_epi16(sum, u0);
1217 in0 = _mm_load_si128((const __m128i *)(input + 8 * stride));
1218 in1 = _mm_load_si128((const __m128i *)(input + 9 * stride));
1219 in2 = _mm_load_si128((const __m128i *)(input + 10 * stride));
1220 in3 = _mm_load_si128((const __m128i *)(input + 11 * stride));
1222 sum = _mm_add_epi16(sum, u1);
1223 u0 = _mm_add_epi16(in0, in1);
1224 u1 = _mm_add_epi16(in2, in3);
1225 sum = _mm_add_epi16(sum, u0);
1227 in0 = _mm_load_si128((const __m128i *)(input + 12 * stride));
1228 in1 = _mm_load_si128((const __m128i *)(input + 13 * stride));
1229 in2 = _mm_load_si128((const __m128i *)(input + 14 * stride));
1230 in3 = _mm_load_si128((const __m128i *)(input + 15 * stride));
1232 sum = _mm_add_epi16(sum, u1);
1233 u0 = _mm_add_epi16(in0, in1);
1234 u1 = _mm_add_epi16(in2, in3);
1235 sum = _mm_add_epi16(sum, u0);
1237 sum = _mm_add_epi16(sum, u1);
1240 u0 = _mm_setzero_si128();
1241 in0 = _mm_unpacklo_epi16(u0, sum);
1242 in1 = _mm_unpackhi_epi16(u0, sum);
1243 in0 = _mm_srai_epi32(in0, 16);
1244 in1 = _mm_srai_epi32(in1, 16);
1246 sum = _mm_add_epi32(in0, in1);
1247 in0 = _mm_unpacklo_epi32(sum, u0);
1248 in1 = _mm_unpackhi_epi32(sum, u0);
1250 sum = _mm_add_epi32(in0, in1);
1251 in0 = _mm_srli_si128(sum, 8);
1253 in1 = _mm_add_epi32(sum, in0);
1254 in1 = _mm_srai_epi32(in1, 1);
1255 _mm_store_si128((__m128i *)(output), in1);
1258 void vp9_fdct16x16_sse2(const int16_t *input, int16_t *output, int stride) {
1259 // The 2D transform is done with two passes which are actually pretty
1260 // similar. In the first one, we transform the columns and transpose
1261 // the results. In the second one, we transform the rows. To achieve that,
1262 // as the first pass results are transposed, we transpose the columns (that
1263 // is the transposed rows) and transpose the results (so that it goes back
1264 // in normal/row positions).
1266 // We need an intermediate buffer between passes.
1267 DECLARE_ALIGNED_ARRAY(16, int16_t, intermediate, 256);
1268 const int16_t *in = input;
1269 int16_t *out = intermediate;
1271 // When we use them, in one case, they are all the same. In all others
1272 // it's a pair of them that we need to repeat four times. This is done
1273 // by constructing the 32 bit constant corresponding to that pair.
1274 const __m128i k__cospi_p16_p16 = _mm_set1_epi16(cospi_16_64);
1275 const __m128i k__cospi_p16_m16 = pair_set_epi16(cospi_16_64, -cospi_16_64);
1276 const __m128i k__cospi_p24_p08 = pair_set_epi16(cospi_24_64, cospi_8_64);
1277 const __m128i k__cospi_p08_m24 = pair_set_epi16(cospi_8_64, -cospi_24_64);
1278 const __m128i k__cospi_m08_p24 = pair_set_epi16(-cospi_8_64, cospi_24_64);
1279 const __m128i k__cospi_p28_p04 = pair_set_epi16(cospi_28_64, cospi_4_64);
1280 const __m128i k__cospi_m04_p28 = pair_set_epi16(-cospi_4_64, cospi_28_64);
1281 const __m128i k__cospi_p12_p20 = pair_set_epi16(cospi_12_64, cospi_20_64);
1282 const __m128i k__cospi_m20_p12 = pair_set_epi16(-cospi_20_64, cospi_12_64);
1283 const __m128i k__cospi_p30_p02 = pair_set_epi16(cospi_30_64, cospi_2_64);
1284 const __m128i k__cospi_p14_p18 = pair_set_epi16(cospi_14_64, cospi_18_64);
1285 const __m128i k__cospi_m02_p30 = pair_set_epi16(-cospi_2_64, cospi_30_64);
1286 const __m128i k__cospi_m18_p14 = pair_set_epi16(-cospi_18_64, cospi_14_64);
1287 const __m128i k__cospi_p22_p10 = pair_set_epi16(cospi_22_64, cospi_10_64);
1288 const __m128i k__cospi_p06_p26 = pair_set_epi16(cospi_6_64, cospi_26_64);
1289 const __m128i k__cospi_m10_p22 = pair_set_epi16(-cospi_10_64, cospi_22_64);
1290 const __m128i k__cospi_m26_p06 = pair_set_epi16(-cospi_26_64, cospi_6_64);
1291 const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
1292 const __m128i kOne = _mm_set1_epi16(1);
1293 // Do the two transform/transpose passes
1294 for (pass = 0; pass < 2; ++pass) {
1295 // We process eight columns (transposed rows in second pass) at a time.
1297 for (column_start = 0; column_start < 16; column_start += 8) {
1298 __m128i in00, in01, in02, in03, in04, in05, in06, in07;
1299 __m128i in08, in09, in10, in11, in12, in13, in14, in15;
1300 __m128i input0, input1, input2, input3, input4, input5, input6, input7;
1301 __m128i step1_0, step1_1, step1_2, step1_3;
1302 __m128i step1_4, step1_5, step1_6, step1_7;
1303 __m128i step2_1, step2_2, step2_3, step2_4, step2_5, step2_6;
1304 __m128i step3_0, step3_1, step3_2, step3_3;
1305 __m128i step3_4, step3_5, step3_6, step3_7;
1306 __m128i res00, res01, res02, res03, res04, res05, res06, res07;
1307 __m128i res08, res09, res10, res11, res12, res13, res14, res15;
1308 // Load and pre-condition input.
1310 in00 = _mm_load_si128((const __m128i *)(in + 0 * stride));
1311 in01 = _mm_load_si128((const __m128i *)(in + 1 * stride));
1312 in02 = _mm_load_si128((const __m128i *)(in + 2 * stride));
1313 in03 = _mm_load_si128((const __m128i *)(in + 3 * stride));
1314 in04 = _mm_load_si128((const __m128i *)(in + 4 * stride));
1315 in05 = _mm_load_si128((const __m128i *)(in + 5 * stride));
1316 in06 = _mm_load_si128((const __m128i *)(in + 6 * stride));
1317 in07 = _mm_load_si128((const __m128i *)(in + 7 * stride));
1318 in08 = _mm_load_si128((const __m128i *)(in + 8 * stride));
1319 in09 = _mm_load_si128((const __m128i *)(in + 9 * stride));
1320 in10 = _mm_load_si128((const __m128i *)(in + 10 * stride));
1321 in11 = _mm_load_si128((const __m128i *)(in + 11 * stride));
1322 in12 = _mm_load_si128((const __m128i *)(in + 12 * stride));
1323 in13 = _mm_load_si128((const __m128i *)(in + 13 * stride));
1324 in14 = _mm_load_si128((const __m128i *)(in + 14 * stride));
1325 in15 = _mm_load_si128((const __m128i *)(in + 15 * stride));
1327 in00 = _mm_slli_epi16(in00, 2);
1328 in01 = _mm_slli_epi16(in01, 2);
1329 in02 = _mm_slli_epi16(in02, 2);
1330 in03 = _mm_slli_epi16(in03, 2);
1331 in04 = _mm_slli_epi16(in04, 2);
1332 in05 = _mm_slli_epi16(in05, 2);
1333 in06 = _mm_slli_epi16(in06, 2);
1334 in07 = _mm_slli_epi16(in07, 2);
1335 in08 = _mm_slli_epi16(in08, 2);
1336 in09 = _mm_slli_epi16(in09, 2);
1337 in10 = _mm_slli_epi16(in10, 2);
1338 in11 = _mm_slli_epi16(in11, 2);
1339 in12 = _mm_slli_epi16(in12, 2);
1340 in13 = _mm_slli_epi16(in13, 2);
1341 in14 = _mm_slli_epi16(in14, 2);
1342 in15 = _mm_slli_epi16(in15, 2);
1344 in00 = _mm_load_si128((const __m128i *)(in + 0 * 16));
1345 in01 = _mm_load_si128((const __m128i *)(in + 1 * 16));
1346 in02 = _mm_load_si128((const __m128i *)(in + 2 * 16));
1347 in03 = _mm_load_si128((const __m128i *)(in + 3 * 16));
1348 in04 = _mm_load_si128((const __m128i *)(in + 4 * 16));
1349 in05 = _mm_load_si128((const __m128i *)(in + 5 * 16));
1350 in06 = _mm_load_si128((const __m128i *)(in + 6 * 16));
1351 in07 = _mm_load_si128((const __m128i *)(in + 7 * 16));
1352 in08 = _mm_load_si128((const __m128i *)(in + 8 * 16));
1353 in09 = _mm_load_si128((const __m128i *)(in + 9 * 16));
1354 in10 = _mm_load_si128((const __m128i *)(in + 10 * 16));
1355 in11 = _mm_load_si128((const __m128i *)(in + 11 * 16));
1356 in12 = _mm_load_si128((const __m128i *)(in + 12 * 16));
1357 in13 = _mm_load_si128((const __m128i *)(in + 13 * 16));
1358 in14 = _mm_load_si128((const __m128i *)(in + 14 * 16));
1359 in15 = _mm_load_si128((const __m128i *)(in + 15 * 16));
1361 in00 = _mm_add_epi16(in00, kOne);
1362 in01 = _mm_add_epi16(in01, kOne);
1363 in02 = _mm_add_epi16(in02, kOne);
1364 in03 = _mm_add_epi16(in03, kOne);
1365 in04 = _mm_add_epi16(in04, kOne);
1366 in05 = _mm_add_epi16(in05, kOne);
1367 in06 = _mm_add_epi16(in06, kOne);
1368 in07 = _mm_add_epi16(in07, kOne);
1369 in08 = _mm_add_epi16(in08, kOne);
1370 in09 = _mm_add_epi16(in09, kOne);
1371 in10 = _mm_add_epi16(in10, kOne);
1372 in11 = _mm_add_epi16(in11, kOne);
1373 in12 = _mm_add_epi16(in12, kOne);
1374 in13 = _mm_add_epi16(in13, kOne);
1375 in14 = _mm_add_epi16(in14, kOne);
1376 in15 = _mm_add_epi16(in15, kOne);
1377 in00 = _mm_srai_epi16(in00, 2);
1378 in01 = _mm_srai_epi16(in01, 2);
1379 in02 = _mm_srai_epi16(in02, 2);
1380 in03 = _mm_srai_epi16(in03, 2);
1381 in04 = _mm_srai_epi16(in04, 2);
1382 in05 = _mm_srai_epi16(in05, 2);
1383 in06 = _mm_srai_epi16(in06, 2);
1384 in07 = _mm_srai_epi16(in07, 2);
1385 in08 = _mm_srai_epi16(in08, 2);
1386 in09 = _mm_srai_epi16(in09, 2);
1387 in10 = _mm_srai_epi16(in10, 2);
1388 in11 = _mm_srai_epi16(in11, 2);
1389 in12 = _mm_srai_epi16(in12, 2);
1390 in13 = _mm_srai_epi16(in13, 2);
1391 in14 = _mm_srai_epi16(in14, 2);
1392 in15 = _mm_srai_epi16(in15, 2);
1395 // Calculate input for the first 8 results.
1397 input0 = _mm_add_epi16(in00, in15);
1398 input1 = _mm_add_epi16(in01, in14);
1399 input2 = _mm_add_epi16(in02, in13);
1400 input3 = _mm_add_epi16(in03, in12);
1401 input4 = _mm_add_epi16(in04, in11);
1402 input5 = _mm_add_epi16(in05, in10);
1403 input6 = _mm_add_epi16(in06, in09);
1404 input7 = _mm_add_epi16(in07, in08);
1406 // Calculate input for the next 8 results.
1408 step1_0 = _mm_sub_epi16(in07, in08);
1409 step1_1 = _mm_sub_epi16(in06, in09);
1410 step1_2 = _mm_sub_epi16(in05, in10);
1411 step1_3 = _mm_sub_epi16(in04, in11);
1412 step1_4 = _mm_sub_epi16(in03, in12);
1413 step1_5 = _mm_sub_epi16(in02, in13);
1414 step1_6 = _mm_sub_epi16(in01, in14);
1415 step1_7 = _mm_sub_epi16(in00, in15);
1417 // Work on the first eight values; fdct8(input, even_results);
1420 const __m128i q0 = _mm_add_epi16(input0, input7);
1421 const __m128i q1 = _mm_add_epi16(input1, input6);
1422 const __m128i q2 = _mm_add_epi16(input2, input5);
1423 const __m128i q3 = _mm_add_epi16(input3, input4);
1424 const __m128i q4 = _mm_sub_epi16(input3, input4);
1425 const __m128i q5 = _mm_sub_epi16(input2, input5);
1426 const __m128i q6 = _mm_sub_epi16(input1, input6);
1427 const __m128i q7 = _mm_sub_epi16(input0, input7);
1428 // Work on first four results
1431 const __m128i r0 = _mm_add_epi16(q0, q3);
1432 const __m128i r1 = _mm_add_epi16(q1, q2);
1433 const __m128i r2 = _mm_sub_epi16(q1, q2);
1434 const __m128i r3 = _mm_sub_epi16(q0, q3);
1435 // Interleave to do the multiply by constants which gets us
1437 const __m128i t0 = _mm_unpacklo_epi16(r0, r1);
1438 const __m128i t1 = _mm_unpackhi_epi16(r0, r1);
1439 const __m128i t2 = _mm_unpacklo_epi16(r2, r3);
1440 const __m128i t3 = _mm_unpackhi_epi16(r2, r3);
1441 const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p16_p16);
1442 const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p16_p16);
1443 const __m128i u2 = _mm_madd_epi16(t0, k__cospi_p16_m16);
1444 const __m128i u3 = _mm_madd_epi16(t1, k__cospi_p16_m16);
1445 const __m128i u4 = _mm_madd_epi16(t2, k__cospi_p24_p08);
1446 const __m128i u5 = _mm_madd_epi16(t3, k__cospi_p24_p08);
1447 const __m128i u6 = _mm_madd_epi16(t2, k__cospi_m08_p24);
1448 const __m128i u7 = _mm_madd_epi16(t3, k__cospi_m08_p24);
1449 // dct_const_round_shift
1450 const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
1451 const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
1452 const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
1453 const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
1454 const __m128i v4 = _mm_add_epi32(u4, k__DCT_CONST_ROUNDING);
1455 const __m128i v5 = _mm_add_epi32(u5, k__DCT_CONST_ROUNDING);
1456 const __m128i v6 = _mm_add_epi32(u6, k__DCT_CONST_ROUNDING);
1457 const __m128i v7 = _mm_add_epi32(u7, k__DCT_CONST_ROUNDING);
1458 const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
1459 const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
1460 const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
1461 const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
1462 const __m128i w4 = _mm_srai_epi32(v4, DCT_CONST_BITS);
1463 const __m128i w5 = _mm_srai_epi32(v5, DCT_CONST_BITS);
1464 const __m128i w6 = _mm_srai_epi32(v6, DCT_CONST_BITS);
1465 const __m128i w7 = _mm_srai_epi32(v7, DCT_CONST_BITS);
1467 res00 = _mm_packs_epi32(w0, w1);
1468 res08 = _mm_packs_epi32(w2, w3);
1469 res04 = _mm_packs_epi32(w4, w5);
1470 res12 = _mm_packs_epi32(w6, w7);
1472 // Work on next four results
1474 // Interleave to do the multiply by constants which gets us
1476 const __m128i d0 = _mm_unpacklo_epi16(q6, q5);
1477 const __m128i d1 = _mm_unpackhi_epi16(q6, q5);
1478 const __m128i e0 = _mm_madd_epi16(d0, k__cospi_p16_m16);
1479 const __m128i e1 = _mm_madd_epi16(d1, k__cospi_p16_m16);
1480 const __m128i e2 = _mm_madd_epi16(d0, k__cospi_p16_p16);
1481 const __m128i e3 = _mm_madd_epi16(d1, k__cospi_p16_p16);
1482 // dct_const_round_shift
1483 const __m128i f0 = _mm_add_epi32(e0, k__DCT_CONST_ROUNDING);
1484 const __m128i f1 = _mm_add_epi32(e1, k__DCT_CONST_ROUNDING);
1485 const __m128i f2 = _mm_add_epi32(e2, k__DCT_CONST_ROUNDING);
1486 const __m128i f3 = _mm_add_epi32(e3, k__DCT_CONST_ROUNDING);
1487 const __m128i s0 = _mm_srai_epi32(f0, DCT_CONST_BITS);
1488 const __m128i s1 = _mm_srai_epi32(f1, DCT_CONST_BITS);
1489 const __m128i s2 = _mm_srai_epi32(f2, DCT_CONST_BITS);
1490 const __m128i s3 = _mm_srai_epi32(f3, DCT_CONST_BITS);
1492 const __m128i r0 = _mm_packs_epi32(s0, s1);
1493 const __m128i r1 = _mm_packs_epi32(s2, s3);
1495 const __m128i x0 = _mm_add_epi16(q4, r0);
1496 const __m128i x1 = _mm_sub_epi16(q4, r0);
1497 const __m128i x2 = _mm_sub_epi16(q7, r1);
1498 const __m128i x3 = _mm_add_epi16(q7, r1);
1499 // Interleave to do the multiply by constants which gets us
1501 const __m128i t0 = _mm_unpacklo_epi16(x0, x3);
1502 const __m128i t1 = _mm_unpackhi_epi16(x0, x3);
1503 const __m128i t2 = _mm_unpacklo_epi16(x1, x2);
1504 const __m128i t3 = _mm_unpackhi_epi16(x1, x2);
1505 const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p28_p04);
1506 const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p28_p04);
1507 const __m128i u2 = _mm_madd_epi16(t0, k__cospi_m04_p28);
1508 const __m128i u3 = _mm_madd_epi16(t1, k__cospi_m04_p28);
1509 const __m128i u4 = _mm_madd_epi16(t2, k__cospi_p12_p20);
1510 const __m128i u5 = _mm_madd_epi16(t3, k__cospi_p12_p20);
1511 const __m128i u6 = _mm_madd_epi16(t2, k__cospi_m20_p12);
1512 const __m128i u7 = _mm_madd_epi16(t3, k__cospi_m20_p12);
1513 // dct_const_round_shift
1514 const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
1515 const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
1516 const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
1517 const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
1518 const __m128i v4 = _mm_add_epi32(u4, k__DCT_CONST_ROUNDING);
1519 const __m128i v5 = _mm_add_epi32(u5, k__DCT_CONST_ROUNDING);
1520 const __m128i v6 = _mm_add_epi32(u6, k__DCT_CONST_ROUNDING);
1521 const __m128i v7 = _mm_add_epi32(u7, k__DCT_CONST_ROUNDING);
1522 const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
1523 const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
1524 const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
1525 const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
1526 const __m128i w4 = _mm_srai_epi32(v4, DCT_CONST_BITS);
1527 const __m128i w5 = _mm_srai_epi32(v5, DCT_CONST_BITS);
1528 const __m128i w6 = _mm_srai_epi32(v6, DCT_CONST_BITS);
1529 const __m128i w7 = _mm_srai_epi32(v7, DCT_CONST_BITS);
1531 res02 = _mm_packs_epi32(w0, w1);
1532 res14 = _mm_packs_epi32(w2, w3);
1533 res10 = _mm_packs_epi32(w4, w5);
1534 res06 = _mm_packs_epi32(w6, w7);
1537 // Work on the next eight values; step1 -> odd_results
1541 const __m128i t0 = _mm_unpacklo_epi16(step1_5, step1_2);
1542 const __m128i t1 = _mm_unpackhi_epi16(step1_5, step1_2);
1543 const __m128i t2 = _mm_unpacklo_epi16(step1_4, step1_3);
1544 const __m128i t3 = _mm_unpackhi_epi16(step1_4, step1_3);
1545 const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p16_m16);
1546 const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p16_m16);
1547 const __m128i u2 = _mm_madd_epi16(t2, k__cospi_p16_m16);
1548 const __m128i u3 = _mm_madd_epi16(t3, k__cospi_p16_m16);
1549 // dct_const_round_shift
1550 const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
1551 const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
1552 const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
1553 const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
1554 const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
1555 const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
1556 const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
1557 const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
1559 step2_2 = _mm_packs_epi32(w0, w1);
1560 step2_3 = _mm_packs_epi32(w2, w3);
1563 const __m128i t0 = _mm_unpacklo_epi16(step1_5, step1_2);
1564 const __m128i t1 = _mm_unpackhi_epi16(step1_5, step1_2);
1565 const __m128i t2 = _mm_unpacklo_epi16(step1_4, step1_3);
1566 const __m128i t3 = _mm_unpackhi_epi16(step1_4, step1_3);
1567 const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p16_p16);
1568 const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p16_p16);
1569 const __m128i u2 = _mm_madd_epi16(t2, k__cospi_p16_p16);
1570 const __m128i u3 = _mm_madd_epi16(t3, k__cospi_p16_p16);
1571 // dct_const_round_shift
1572 const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
1573 const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
1574 const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
1575 const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
1576 const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
1577 const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
1578 const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
1579 const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
1581 step2_5 = _mm_packs_epi32(w0, w1);
1582 step2_4 = _mm_packs_epi32(w2, w3);
1586 step3_0 = _mm_add_epi16(step1_0, step2_3);
1587 step3_1 = _mm_add_epi16(step1_1, step2_2);
1588 step3_2 = _mm_sub_epi16(step1_1, step2_2);
1589 step3_3 = _mm_sub_epi16(step1_0, step2_3);
1590 step3_4 = _mm_sub_epi16(step1_7, step2_4);
1591 step3_5 = _mm_sub_epi16(step1_6, step2_5);
1592 step3_6 = _mm_add_epi16(step1_6, step2_5);
1593 step3_7 = _mm_add_epi16(step1_7, step2_4);
1597 const __m128i t0 = _mm_unpacklo_epi16(step3_1, step3_6);
1598 const __m128i t1 = _mm_unpackhi_epi16(step3_1, step3_6);
1599 const __m128i t2 = _mm_unpacklo_epi16(step3_2, step3_5);
1600 const __m128i t3 = _mm_unpackhi_epi16(step3_2, step3_5);
1601 const __m128i u0 = _mm_madd_epi16(t0, k__cospi_m08_p24);
1602 const __m128i u1 = _mm_madd_epi16(t1, k__cospi_m08_p24);
1603 const __m128i u2 = _mm_madd_epi16(t2, k__cospi_p24_p08);
1604 const __m128i u3 = _mm_madd_epi16(t3, k__cospi_p24_p08);
1605 // dct_const_round_shift
1606 const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
1607 const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
1608 const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
1609 const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
1610 const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
1611 const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
1612 const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
1613 const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
1615 step2_1 = _mm_packs_epi32(w0, w1);
1616 step2_2 = _mm_packs_epi32(w2, w3);
1619 const __m128i t0 = _mm_unpacklo_epi16(step3_1, step3_6);
1620 const __m128i t1 = _mm_unpackhi_epi16(step3_1, step3_6);
1621 const __m128i t2 = _mm_unpacklo_epi16(step3_2, step3_5);
1622 const __m128i t3 = _mm_unpackhi_epi16(step3_2, step3_5);
1623 const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p24_p08);
1624 const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p24_p08);
1625 const __m128i u2 = _mm_madd_epi16(t2, k__cospi_p08_m24);
1626 const __m128i u3 = _mm_madd_epi16(t3, k__cospi_p08_m24);
1627 // dct_const_round_shift
1628 const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
1629 const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
1630 const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
1631 const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
1632 const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
1633 const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
1634 const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
1635 const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
1637 step2_6 = _mm_packs_epi32(w0, w1);
1638 step2_5 = _mm_packs_epi32(w2, w3);
1642 step1_0 = _mm_add_epi16(step3_0, step2_1);
1643 step1_1 = _mm_sub_epi16(step3_0, step2_1);
1644 step1_2 = _mm_add_epi16(step3_3, step2_2);
1645 step1_3 = _mm_sub_epi16(step3_3, step2_2);
1646 step1_4 = _mm_sub_epi16(step3_4, step2_5);
1647 step1_5 = _mm_add_epi16(step3_4, step2_5);
1648 step1_6 = _mm_sub_epi16(step3_7, step2_6);
1649 step1_7 = _mm_add_epi16(step3_7, step2_6);
1653 const __m128i t0 = _mm_unpacklo_epi16(step1_0, step1_7);
1654 const __m128i t1 = _mm_unpackhi_epi16(step1_0, step1_7);
1655 const __m128i t2 = _mm_unpacklo_epi16(step1_1, step1_6);
1656 const __m128i t3 = _mm_unpackhi_epi16(step1_1, step1_6);
1657 const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p30_p02);
1658 const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p30_p02);
1659 const __m128i u2 = _mm_madd_epi16(t2, k__cospi_p14_p18);
1660 const __m128i u3 = _mm_madd_epi16(t3, k__cospi_p14_p18);
1661 // dct_const_round_shift
1662 const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
1663 const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
1664 const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
1665 const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
1666 const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
1667 const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
1668 const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
1669 const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
1671 res01 = _mm_packs_epi32(w0, w1);
1672 res09 = _mm_packs_epi32(w2, w3);
1675 const __m128i t0 = _mm_unpacklo_epi16(step1_2, step1_5);
1676 const __m128i t1 = _mm_unpackhi_epi16(step1_2, step1_5);
1677 const __m128i t2 = _mm_unpacklo_epi16(step1_3, step1_4);
1678 const __m128i t3 = _mm_unpackhi_epi16(step1_3, step1_4);
1679 const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p22_p10);
1680 const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p22_p10);
1681 const __m128i u2 = _mm_madd_epi16(t2, k__cospi_p06_p26);
1682 const __m128i u3 = _mm_madd_epi16(t3, k__cospi_p06_p26);
1683 // dct_const_round_shift
1684 const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
1685 const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
1686 const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
1687 const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
1688 const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
1689 const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
1690 const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
1691 const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
1693 res05 = _mm_packs_epi32(w0, w1);
1694 res13 = _mm_packs_epi32(w2, w3);
1697 const __m128i t0 = _mm_unpacklo_epi16(step1_2, step1_5);
1698 const __m128i t1 = _mm_unpackhi_epi16(step1_2, step1_5);
1699 const __m128i t2 = _mm_unpacklo_epi16(step1_3, step1_4);
1700 const __m128i t3 = _mm_unpackhi_epi16(step1_3, step1_4);
1701 const __m128i u0 = _mm_madd_epi16(t0, k__cospi_m10_p22);
1702 const __m128i u1 = _mm_madd_epi16(t1, k__cospi_m10_p22);
1703 const __m128i u2 = _mm_madd_epi16(t2, k__cospi_m26_p06);
1704 const __m128i u3 = _mm_madd_epi16(t3, k__cospi_m26_p06);
1705 // dct_const_round_shift
1706 const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
1707 const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
1708 const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
1709 const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
1710 const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
1711 const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
1712 const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
1713 const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
1715 res11 = _mm_packs_epi32(w0, w1);
1716 res03 = _mm_packs_epi32(w2, w3);
1719 const __m128i t0 = _mm_unpacklo_epi16(step1_0, step1_7);
1720 const __m128i t1 = _mm_unpackhi_epi16(step1_0, step1_7);
1721 const __m128i t2 = _mm_unpacklo_epi16(step1_1, step1_6);
1722 const __m128i t3 = _mm_unpackhi_epi16(step1_1, step1_6);
1723 const __m128i u0 = _mm_madd_epi16(t0, k__cospi_m02_p30);
1724 const __m128i u1 = _mm_madd_epi16(t1, k__cospi_m02_p30);
1725 const __m128i u2 = _mm_madd_epi16(t2, k__cospi_m18_p14);
1726 const __m128i u3 = _mm_madd_epi16(t3, k__cospi_m18_p14);
1727 // dct_const_round_shift
1728 const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
1729 const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
1730 const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
1731 const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
1732 const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
1733 const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
1734 const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
1735 const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
1737 res15 = _mm_packs_epi32(w0, w1);
1738 res07 = _mm_packs_epi32(w2, w3);
1741 // Transpose the results, do it as two 8x8 transposes.
1743 // 00 01 02 03 04 05 06 07
1744 // 10 11 12 13 14 15 16 17
1745 // 20 21 22 23 24 25 26 27
1746 // 30 31 32 33 34 35 36 37
1747 // 40 41 42 43 44 45 46 47
1748 // 50 51 52 53 54 55 56 57
1749 // 60 61 62 63 64 65 66 67
1750 // 70 71 72 73 74 75 76 77
1751 const __m128i tr0_0 = _mm_unpacklo_epi16(res00, res01);
1752 const __m128i tr0_1 = _mm_unpacklo_epi16(res02, res03);
1753 const __m128i tr0_2 = _mm_unpackhi_epi16(res00, res01);
1754 const __m128i tr0_3 = _mm_unpackhi_epi16(res02, res03);
1755 const __m128i tr0_4 = _mm_unpacklo_epi16(res04, res05);
1756 const __m128i tr0_5 = _mm_unpacklo_epi16(res06, res07);
1757 const __m128i tr0_6 = _mm_unpackhi_epi16(res04, res05);
1758 const __m128i tr0_7 = _mm_unpackhi_epi16(res06, res07);
1759 // 00 10 01 11 02 12 03 13
1760 // 20 30 21 31 22 32 23 33
1761 // 04 14 05 15 06 16 07 17
1762 // 24 34 25 35 26 36 27 37
1763 // 40 50 41 51 42 52 43 53
1764 // 60 70 61 71 62 72 63 73
1765 // 54 54 55 55 56 56 57 57
1766 // 64 74 65 75 66 76 67 77
1767 const __m128i tr1_0 = _mm_unpacklo_epi32(tr0_0, tr0_1);
1768 const __m128i tr1_1 = _mm_unpacklo_epi32(tr0_2, tr0_3);
1769 const __m128i tr1_2 = _mm_unpackhi_epi32(tr0_0, tr0_1);
1770 const __m128i tr1_3 = _mm_unpackhi_epi32(tr0_2, tr0_3);
1771 const __m128i tr1_4 = _mm_unpacklo_epi32(tr0_4, tr0_5);
1772 const __m128i tr1_5 = _mm_unpacklo_epi32(tr0_6, tr0_7);
1773 const __m128i tr1_6 = _mm_unpackhi_epi32(tr0_4, tr0_5);
1774 const __m128i tr1_7 = _mm_unpackhi_epi32(tr0_6, tr0_7);
1775 // 00 10 20 30 01 11 21 31
1776 // 40 50 60 70 41 51 61 71
1777 // 02 12 22 32 03 13 23 33
1778 // 42 52 62 72 43 53 63 73
1779 // 04 14 24 34 05 15 21 36
1780 // 44 54 64 74 45 55 61 76
1781 // 06 16 26 36 07 17 27 37
1782 // 46 56 66 76 47 57 67 77
1783 const __m128i tr2_0 = _mm_unpacklo_epi64(tr1_0, tr1_4);
1784 const __m128i tr2_1 = _mm_unpackhi_epi64(tr1_0, tr1_4);
1785 const __m128i tr2_2 = _mm_unpacklo_epi64(tr1_2, tr1_6);
1786 const __m128i tr2_3 = _mm_unpackhi_epi64(tr1_2, tr1_6);
1787 const __m128i tr2_4 = _mm_unpacklo_epi64(tr1_1, tr1_5);
1788 const __m128i tr2_5 = _mm_unpackhi_epi64(tr1_1, tr1_5);
1789 const __m128i tr2_6 = _mm_unpacklo_epi64(tr1_3, tr1_7);
1790 const __m128i tr2_7 = _mm_unpackhi_epi64(tr1_3, tr1_7);
1791 // 00 10 20 30 40 50 60 70
1792 // 01 11 21 31 41 51 61 71
1793 // 02 12 22 32 42 52 62 72
1794 // 03 13 23 33 43 53 63 73
1795 // 04 14 24 34 44 54 64 74
1796 // 05 15 25 35 45 55 65 75
1797 // 06 16 26 36 46 56 66 76
1798 // 07 17 27 37 47 57 67 77
1799 _mm_storeu_si128((__m128i *)(out + 0 * 16), tr2_0);
1800 _mm_storeu_si128((__m128i *)(out + 1 * 16), tr2_1);
1801 _mm_storeu_si128((__m128i *)(out + 2 * 16), tr2_2);
1802 _mm_storeu_si128((__m128i *)(out + 3 * 16), tr2_3);
1803 _mm_storeu_si128((__m128i *)(out + 4 * 16), tr2_4);
1804 _mm_storeu_si128((__m128i *)(out + 5 * 16), tr2_5);
1805 _mm_storeu_si128((__m128i *)(out + 6 * 16), tr2_6);
1806 _mm_storeu_si128((__m128i *)(out + 7 * 16), tr2_7);
1809 // 00 01 02 03 04 05 06 07
1810 // 10 11 12 13 14 15 16 17
1811 // 20 21 22 23 24 25 26 27
1812 // 30 31 32 33 34 35 36 37
1813 // 40 41 42 43 44 45 46 47
1814 // 50 51 52 53 54 55 56 57
1815 // 60 61 62 63 64 65 66 67
1816 // 70 71 72 73 74 75 76 77
1817 const __m128i tr0_0 = _mm_unpacklo_epi16(res08, res09);
1818 const __m128i tr0_1 = _mm_unpacklo_epi16(res10, res11);
1819 const __m128i tr0_2 = _mm_unpackhi_epi16(res08, res09);
1820 const __m128i tr0_3 = _mm_unpackhi_epi16(res10, res11);
1821 const __m128i tr0_4 = _mm_unpacklo_epi16(res12, res13);
1822 const __m128i tr0_5 = _mm_unpacklo_epi16(res14, res15);
1823 const __m128i tr0_6 = _mm_unpackhi_epi16(res12, res13);
1824 const __m128i tr0_7 = _mm_unpackhi_epi16(res14, res15);
1825 // 00 10 01 11 02 12 03 13
1826 // 20 30 21 31 22 32 23 33
1827 // 04 14 05 15 06 16 07 17
1828 // 24 34 25 35 26 36 27 37
1829 // 40 50 41 51 42 52 43 53
1830 // 60 70 61 71 62 72 63 73
1831 // 54 54 55 55 56 56 57 57
1832 // 64 74 65 75 66 76 67 77
1833 const __m128i tr1_0 = _mm_unpacklo_epi32(tr0_0, tr0_1);
1834 const __m128i tr1_1 = _mm_unpacklo_epi32(tr0_2, tr0_3);
1835 const __m128i tr1_2 = _mm_unpackhi_epi32(tr0_0, tr0_1);
1836 const __m128i tr1_3 = _mm_unpackhi_epi32(tr0_2, tr0_3);
1837 const __m128i tr1_4 = _mm_unpacklo_epi32(tr0_4, tr0_5);
1838 const __m128i tr1_5 = _mm_unpacklo_epi32(tr0_6, tr0_7);
1839 const __m128i tr1_6 = _mm_unpackhi_epi32(tr0_4, tr0_5);
1840 const __m128i tr1_7 = _mm_unpackhi_epi32(tr0_6, tr0_7);
1841 // 00 10 20 30 01 11 21 31
1842 // 40 50 60 70 41 51 61 71
1843 // 02 12 22 32 03 13 23 33
1844 // 42 52 62 72 43 53 63 73
1845 // 04 14 24 34 05 15 21 36
1846 // 44 54 64 74 45 55 61 76
1847 // 06 16 26 36 07 17 27 37
1848 // 46 56 66 76 47 57 67 77
1849 const __m128i tr2_0 = _mm_unpacklo_epi64(tr1_0, tr1_4);
1850 const __m128i tr2_1 = _mm_unpackhi_epi64(tr1_0, tr1_4);
1851 const __m128i tr2_2 = _mm_unpacklo_epi64(tr1_2, tr1_6);
1852 const __m128i tr2_3 = _mm_unpackhi_epi64(tr1_2, tr1_6);
1853 const __m128i tr2_4 = _mm_unpacklo_epi64(tr1_1, tr1_5);
1854 const __m128i tr2_5 = _mm_unpackhi_epi64(tr1_1, tr1_5);
1855 const __m128i tr2_6 = _mm_unpacklo_epi64(tr1_3, tr1_7);
1856 const __m128i tr2_7 = _mm_unpackhi_epi64(tr1_3, tr1_7);
1857 // 00 10 20 30 40 50 60 70
1858 // 01 11 21 31 41 51 61 71
1859 // 02 12 22 32 42 52 62 72
1860 // 03 13 23 33 43 53 63 73
1861 // 04 14 24 34 44 54 64 74
1862 // 05 15 25 35 45 55 65 75
1863 // 06 16 26 36 46 56 66 76
1864 // 07 17 27 37 47 57 67 77
1866 _mm_store_si128((__m128i *)(out + 8 + 0 * 16), tr2_0);
1867 _mm_store_si128((__m128i *)(out + 8 + 1 * 16), tr2_1);
1868 _mm_store_si128((__m128i *)(out + 8 + 2 * 16), tr2_2);
1869 _mm_store_si128((__m128i *)(out + 8 + 3 * 16), tr2_3);
1870 _mm_store_si128((__m128i *)(out + 8 + 4 * 16), tr2_4);
1871 _mm_store_si128((__m128i *)(out + 8 + 5 * 16), tr2_5);
1872 _mm_store_si128((__m128i *)(out + 8 + 6 * 16), tr2_6);
1873 _mm_store_si128((__m128i *)(out + 8 + 7 * 16), tr2_7);
1877 // Setup in/out for next pass.
1883 static INLINE void load_buffer_16x16(const int16_t* input, __m128i *in0,
1884 __m128i *in1, int stride) {
1885 // load first 8 columns
1886 load_buffer_8x8(input, in0, stride);
1887 load_buffer_8x8(input + 8 * stride, in0 + 8, stride);
1890 // load second 8 columns
1891 load_buffer_8x8(input, in1, stride);
1892 load_buffer_8x8(input + 8 * stride, in1 + 8, stride);
1895 static INLINE void write_buffer_16x16(int16_t *output, __m128i *in0,
1896 __m128i *in1, int stride) {
1897 // write first 8 columns
1898 write_buffer_8x8(output, in0, stride);
1899 write_buffer_8x8(output + 8 * stride, in0 + 8, stride);
1900 // write second 8 columns
1902 write_buffer_8x8(output, in1, stride);
1903 write_buffer_8x8(output + 8 * stride, in1 + 8, stride);
1906 static INLINE void right_shift_16x16(__m128i *res0, __m128i *res1) {
1907 // perform rounding operations
1908 right_shift_8x8(res0, 2);
1909 right_shift_8x8(res0 + 8, 2);
1910 right_shift_8x8(res1, 2);
1911 right_shift_8x8(res1 + 8, 2);
1914 void fdct16_8col(__m128i *in) {
1915 // perform 16x16 1-D DCT for 8 columns
1916 __m128i i[8], s[8], p[8], t[8], u[16], v[16];
1917 const __m128i k__cospi_p16_p16 = _mm_set1_epi16(cospi_16_64);
1918 const __m128i k__cospi_p16_m16 = pair_set_epi16(cospi_16_64, -cospi_16_64);
1919 const __m128i k__cospi_m16_p16 = pair_set_epi16(-cospi_16_64, cospi_16_64);
1920 const __m128i k__cospi_p24_p08 = pair_set_epi16(cospi_24_64, cospi_8_64);
1921 const __m128i k__cospi_p08_m24 = pair_set_epi16(cospi_8_64, -cospi_24_64);
1922 const __m128i k__cospi_m08_p24 = pair_set_epi16(-cospi_8_64, cospi_24_64);
1923 const __m128i k__cospi_p28_p04 = pair_set_epi16(cospi_28_64, cospi_4_64);
1924 const __m128i k__cospi_m04_p28 = pair_set_epi16(-cospi_4_64, cospi_28_64);
1925 const __m128i k__cospi_p12_p20 = pair_set_epi16(cospi_12_64, cospi_20_64);
1926 const __m128i k__cospi_m20_p12 = pair_set_epi16(-cospi_20_64, cospi_12_64);
1927 const __m128i k__cospi_p30_p02 = pair_set_epi16(cospi_30_64, cospi_2_64);
1928 const __m128i k__cospi_p14_p18 = pair_set_epi16(cospi_14_64, cospi_18_64);
1929 const __m128i k__cospi_m02_p30 = pair_set_epi16(-cospi_2_64, cospi_30_64);
1930 const __m128i k__cospi_m18_p14 = pair_set_epi16(-cospi_18_64, cospi_14_64);
1931 const __m128i k__cospi_p22_p10 = pair_set_epi16(cospi_22_64, cospi_10_64);
1932 const __m128i k__cospi_p06_p26 = pair_set_epi16(cospi_6_64, cospi_26_64);
1933 const __m128i k__cospi_m10_p22 = pair_set_epi16(-cospi_10_64, cospi_22_64);
1934 const __m128i k__cospi_m26_p06 = pair_set_epi16(-cospi_26_64, cospi_6_64);
1935 const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
1938 i[0] = _mm_add_epi16(in[0], in[15]);
1939 i[1] = _mm_add_epi16(in[1], in[14]);
1940 i[2] = _mm_add_epi16(in[2], in[13]);
1941 i[3] = _mm_add_epi16(in[3], in[12]);
1942 i[4] = _mm_add_epi16(in[4], in[11]);
1943 i[5] = _mm_add_epi16(in[5], in[10]);
1944 i[6] = _mm_add_epi16(in[6], in[9]);
1945 i[7] = _mm_add_epi16(in[7], in[8]);
1947 s[0] = _mm_sub_epi16(in[7], in[8]);
1948 s[1] = _mm_sub_epi16(in[6], in[9]);
1949 s[2] = _mm_sub_epi16(in[5], in[10]);
1950 s[3] = _mm_sub_epi16(in[4], in[11]);
1951 s[4] = _mm_sub_epi16(in[3], in[12]);
1952 s[5] = _mm_sub_epi16(in[2], in[13]);
1953 s[6] = _mm_sub_epi16(in[1], in[14]);
1954 s[7] = _mm_sub_epi16(in[0], in[15]);
1956 p[0] = _mm_add_epi16(i[0], i[7]);
1957 p[1] = _mm_add_epi16(i[1], i[6]);
1958 p[2] = _mm_add_epi16(i[2], i[5]);
1959 p[3] = _mm_add_epi16(i[3], i[4]);
1960 p[4] = _mm_sub_epi16(i[3], i[4]);
1961 p[5] = _mm_sub_epi16(i[2], i[5]);
1962 p[6] = _mm_sub_epi16(i[1], i[6]);
1963 p[7] = _mm_sub_epi16(i[0], i[7]);
1965 u[0] = _mm_add_epi16(p[0], p[3]);
1966 u[1] = _mm_add_epi16(p[1], p[2]);
1967 u[2] = _mm_sub_epi16(p[1], p[2]);
1968 u[3] = _mm_sub_epi16(p[0], p[3]);
1970 v[0] = _mm_unpacklo_epi16(u[0], u[1]);
1971 v[1] = _mm_unpackhi_epi16(u[0], u[1]);
1972 v[2] = _mm_unpacklo_epi16(u[2], u[3]);
1973 v[3] = _mm_unpackhi_epi16(u[2], u[3]);
1975 u[0] = _mm_madd_epi16(v[0], k__cospi_p16_p16);
1976 u[1] = _mm_madd_epi16(v[1], k__cospi_p16_p16);
1977 u[2] = _mm_madd_epi16(v[0], k__cospi_p16_m16);
1978 u[3] = _mm_madd_epi16(v[1], k__cospi_p16_m16);
1979 u[4] = _mm_madd_epi16(v[2], k__cospi_p24_p08);
1980 u[5] = _mm_madd_epi16(v[3], k__cospi_p24_p08);
1981 u[6] = _mm_madd_epi16(v[2], k__cospi_m08_p24);
1982 u[7] = _mm_madd_epi16(v[3], k__cospi_m08_p24);
1984 v[0] = _mm_add_epi32(u[0], k__DCT_CONST_ROUNDING);
1985 v[1] = _mm_add_epi32(u[1], k__DCT_CONST_ROUNDING);
1986 v[2] = _mm_add_epi32(u[2], k__DCT_CONST_ROUNDING);
1987 v[3] = _mm_add_epi32(u[3], k__DCT_CONST_ROUNDING);
1988 v[4] = _mm_add_epi32(u[4], k__DCT_CONST_ROUNDING);
1989 v[5] = _mm_add_epi32(u[5], k__DCT_CONST_ROUNDING);
1990 v[6] = _mm_add_epi32(u[6], k__DCT_CONST_ROUNDING);
1991 v[7] = _mm_add_epi32(u[7], k__DCT_CONST_ROUNDING);
1993 u[0] = _mm_srai_epi32(v[0], DCT_CONST_BITS);
1994 u[1] = _mm_srai_epi32(v[1], DCT_CONST_BITS);
1995 u[2] = _mm_srai_epi32(v[2], DCT_CONST_BITS);
1996 u[3] = _mm_srai_epi32(v[3], DCT_CONST_BITS);
1997 u[4] = _mm_srai_epi32(v[4], DCT_CONST_BITS);
1998 u[5] = _mm_srai_epi32(v[5], DCT_CONST_BITS);
1999 u[6] = _mm_srai_epi32(v[6], DCT_CONST_BITS);
2000 u[7] = _mm_srai_epi32(v[7], DCT_CONST_BITS);
2002 in[0] = _mm_packs_epi32(u[0], u[1]);
2003 in[4] = _mm_packs_epi32(u[4], u[5]);
2004 in[8] = _mm_packs_epi32(u[2], u[3]);
2005 in[12] = _mm_packs_epi32(u[6], u[7]);
2007 u[0] = _mm_unpacklo_epi16(p[5], p[6]);
2008 u[1] = _mm_unpackhi_epi16(p[5], p[6]);
2009 v[0] = _mm_madd_epi16(u[0], k__cospi_m16_p16);
2010 v[1] = _mm_madd_epi16(u[1], k__cospi_m16_p16);
2011 v[2] = _mm_madd_epi16(u[0], k__cospi_p16_p16);
2012 v[3] = _mm_madd_epi16(u[1], k__cospi_p16_p16);
2014 u[0] = _mm_add_epi32(v[0], k__DCT_CONST_ROUNDING);
2015 u[1] = _mm_add_epi32(v[1], k__DCT_CONST_ROUNDING);
2016 u[2] = _mm_add_epi32(v[2], k__DCT_CONST_ROUNDING);
2017 u[3] = _mm_add_epi32(v[3], k__DCT_CONST_ROUNDING);
2019 v[0] = _mm_srai_epi32(u[0], DCT_CONST_BITS);
2020 v[1] = _mm_srai_epi32(u[1], DCT_CONST_BITS);
2021 v[2] = _mm_srai_epi32(u[2], DCT_CONST_BITS);
2022 v[3] = _mm_srai_epi32(u[3], DCT_CONST_BITS);
2024 u[0] = _mm_packs_epi32(v[0], v[1]);
2025 u[1] = _mm_packs_epi32(v[2], v[3]);
2027 t[0] = _mm_add_epi16(p[4], u[0]);
2028 t[1] = _mm_sub_epi16(p[4], u[0]);
2029 t[2] = _mm_sub_epi16(p[7], u[1]);
2030 t[3] = _mm_add_epi16(p[7], u[1]);
2032 u[0] = _mm_unpacklo_epi16(t[0], t[3]);
2033 u[1] = _mm_unpackhi_epi16(t[0], t[3]);
2034 u[2] = _mm_unpacklo_epi16(t[1], t[2]);
2035 u[3] = _mm_unpackhi_epi16(t[1], t[2]);
2037 v[0] = _mm_madd_epi16(u[0], k__cospi_p28_p04);
2038 v[1] = _mm_madd_epi16(u[1], k__cospi_p28_p04);
2039 v[2] = _mm_madd_epi16(u[2], k__cospi_p12_p20);
2040 v[3] = _mm_madd_epi16(u[3], k__cospi_p12_p20);
2041 v[4] = _mm_madd_epi16(u[2], k__cospi_m20_p12);
2042 v[5] = _mm_madd_epi16(u[3], k__cospi_m20_p12);
2043 v[6] = _mm_madd_epi16(u[0], k__cospi_m04_p28);
2044 v[7] = _mm_madd_epi16(u[1], k__cospi_m04_p28);
2046 u[0] = _mm_add_epi32(v[0], k__DCT_CONST_ROUNDING);
2047 u[1] = _mm_add_epi32(v[1], k__DCT_CONST_ROUNDING);
2048 u[2] = _mm_add_epi32(v[2], k__DCT_CONST_ROUNDING);
2049 u[3] = _mm_add_epi32(v[3], k__DCT_CONST_ROUNDING);
2050 u[4] = _mm_add_epi32(v[4], k__DCT_CONST_ROUNDING);
2051 u[5] = _mm_add_epi32(v[5], k__DCT_CONST_ROUNDING);
2052 u[6] = _mm_add_epi32(v[6], k__DCT_CONST_ROUNDING);
2053 u[7] = _mm_add_epi32(v[7], k__DCT_CONST_ROUNDING);
2055 v[0] = _mm_srai_epi32(u[0], DCT_CONST_BITS);
2056 v[1] = _mm_srai_epi32(u[1], DCT_CONST_BITS);
2057 v[2] = _mm_srai_epi32(u[2], DCT_CONST_BITS);
2058 v[3] = _mm_srai_epi32(u[3], DCT_CONST_BITS);
2059 v[4] = _mm_srai_epi32(u[4], DCT_CONST_BITS);
2060 v[5] = _mm_srai_epi32(u[5], DCT_CONST_BITS);
2061 v[6] = _mm_srai_epi32(u[6], DCT_CONST_BITS);
2062 v[7] = _mm_srai_epi32(u[7], DCT_CONST_BITS);
2064 in[2] = _mm_packs_epi32(v[0], v[1]);
2065 in[6] = _mm_packs_epi32(v[4], v[5]);
2066 in[10] = _mm_packs_epi32(v[2], v[3]);
2067 in[14] = _mm_packs_epi32(v[6], v[7]);
2070 u[0] = _mm_unpacklo_epi16(s[2], s[5]);
2071 u[1] = _mm_unpackhi_epi16(s[2], s[5]);
2072 u[2] = _mm_unpacklo_epi16(s[3], s[4]);
2073 u[3] = _mm_unpackhi_epi16(s[3], s[4]);
2075 v[0] = _mm_madd_epi16(u[0], k__cospi_m16_p16);
2076 v[1] = _mm_madd_epi16(u[1], k__cospi_m16_p16);
2077 v[2] = _mm_madd_epi16(u[2], k__cospi_m16_p16);
2078 v[3] = _mm_madd_epi16(u[3], k__cospi_m16_p16);
2079 v[4] = _mm_madd_epi16(u[2], k__cospi_p16_p16);
2080 v[5] = _mm_madd_epi16(u[3], k__cospi_p16_p16);
2081 v[6] = _mm_madd_epi16(u[0], k__cospi_p16_p16);
2082 v[7] = _mm_madd_epi16(u[1], k__cospi_p16_p16);
2084 u[0] = _mm_add_epi32(v[0], k__DCT_CONST_ROUNDING);
2085 u[1] = _mm_add_epi32(v[1], k__DCT_CONST_ROUNDING);
2086 u[2] = _mm_add_epi32(v[2], k__DCT_CONST_ROUNDING);
2087 u[3] = _mm_add_epi32(v[3], k__DCT_CONST_ROUNDING);
2088 u[4] = _mm_add_epi32(v[4], k__DCT_CONST_ROUNDING);
2089 u[5] = _mm_add_epi32(v[5], k__DCT_CONST_ROUNDING);
2090 u[6] = _mm_add_epi32(v[6], k__DCT_CONST_ROUNDING);
2091 u[7] = _mm_add_epi32(v[7], k__DCT_CONST_ROUNDING);
2093 v[0] = _mm_srai_epi32(u[0], DCT_CONST_BITS);
2094 v[1] = _mm_srai_epi32(u[1], DCT_CONST_BITS);
2095 v[2] = _mm_srai_epi32(u[2], DCT_CONST_BITS);
2096 v[3] = _mm_srai_epi32(u[3], DCT_CONST_BITS);
2097 v[4] = _mm_srai_epi32(u[4], DCT_CONST_BITS);
2098 v[5] = _mm_srai_epi32(u[5], DCT_CONST_BITS);
2099 v[6] = _mm_srai_epi32(u[6], DCT_CONST_BITS);
2100 v[7] = _mm_srai_epi32(u[7], DCT_CONST_BITS);
2102 t[2] = _mm_packs_epi32(v[0], v[1]);
2103 t[3] = _mm_packs_epi32(v[2], v[3]);
2104 t[4] = _mm_packs_epi32(v[4], v[5]);
2105 t[5] = _mm_packs_epi32(v[6], v[7]);
2108 p[0] = _mm_add_epi16(s[0], t[3]);
2109 p[1] = _mm_add_epi16(s[1], t[2]);
2110 p[2] = _mm_sub_epi16(s[1], t[2]);
2111 p[3] = _mm_sub_epi16(s[0], t[3]);
2112 p[4] = _mm_sub_epi16(s[7], t[4]);
2113 p[5] = _mm_sub_epi16(s[6], t[5]);
2114 p[6] = _mm_add_epi16(s[6], t[5]);
2115 p[7] = _mm_add_epi16(s[7], t[4]);
2118 u[0] = _mm_unpacklo_epi16(p[1], p[6]);
2119 u[1] = _mm_unpackhi_epi16(p[1], p[6]);
2120 u[2] = _mm_unpacklo_epi16(p[2], p[5]);
2121 u[3] = _mm_unpackhi_epi16(p[2], p[5]);
2123 v[0] = _mm_madd_epi16(u[0], k__cospi_m08_p24);
2124 v[1] = _mm_madd_epi16(u[1], k__cospi_m08_p24);
2125 v[2] = _mm_madd_epi16(u[2], k__cospi_p24_p08);
2126 v[3] = _mm_madd_epi16(u[3], k__cospi_p24_p08);
2127 v[4] = _mm_madd_epi16(u[2], k__cospi_p08_m24);
2128 v[5] = _mm_madd_epi16(u[3], k__cospi_p08_m24);
2129 v[6] = _mm_madd_epi16(u[0], k__cospi_p24_p08);
2130 v[7] = _mm_madd_epi16(u[1], k__cospi_p24_p08);
2132 u[0] = _mm_add_epi32(v[0], k__DCT_CONST_ROUNDING);
2133 u[1] = _mm_add_epi32(v[1], k__DCT_CONST_ROUNDING);
2134 u[2] = _mm_add_epi32(v[2], k__DCT_CONST_ROUNDING);
2135 u[3] = _mm_add_epi32(v[3], k__DCT_CONST_ROUNDING);
2136 u[4] = _mm_add_epi32(v[4], k__DCT_CONST_ROUNDING);
2137 u[5] = _mm_add_epi32(v[5], k__DCT_CONST_ROUNDING);
2138 u[6] = _mm_add_epi32(v[6], k__DCT_CONST_ROUNDING);
2139 u[7] = _mm_add_epi32(v[7], k__DCT_CONST_ROUNDING);
2141 v[0] = _mm_srai_epi32(u[0], DCT_CONST_BITS);
2142 v[1] = _mm_srai_epi32(u[1], DCT_CONST_BITS);
2143 v[2] = _mm_srai_epi32(u[2], DCT_CONST_BITS);
2144 v[3] = _mm_srai_epi32(u[3], DCT_CONST_BITS);
2145 v[4] = _mm_srai_epi32(u[4], DCT_CONST_BITS);
2146 v[5] = _mm_srai_epi32(u[5], DCT_CONST_BITS);
2147 v[6] = _mm_srai_epi32(u[6], DCT_CONST_BITS);
2148 v[7] = _mm_srai_epi32(u[7], DCT_CONST_BITS);
2150 t[1] = _mm_packs_epi32(v[0], v[1]);
2151 t[2] = _mm_packs_epi32(v[2], v[3]);
2152 t[5] = _mm_packs_epi32(v[4], v[5]);
2153 t[6] = _mm_packs_epi32(v[6], v[7]);
2156 s[0] = _mm_add_epi16(p[0], t[1]);
2157 s[1] = _mm_sub_epi16(p[0], t[1]);
2158 s[2] = _mm_add_epi16(p[3], t[2]);
2159 s[3] = _mm_sub_epi16(p[3], t[2]);
2160 s[4] = _mm_sub_epi16(p[4], t[5]);
2161 s[5] = _mm_add_epi16(p[4], t[5]);
2162 s[6] = _mm_sub_epi16(p[7], t[6]);
2163 s[7] = _mm_add_epi16(p[7], t[6]);
2166 u[0] = _mm_unpacklo_epi16(s[0], s[7]);
2167 u[1] = _mm_unpackhi_epi16(s[0], s[7]);
2168 u[2] = _mm_unpacklo_epi16(s[1], s[6]);
2169 u[3] = _mm_unpackhi_epi16(s[1], s[6]);
2170 u[4] = _mm_unpacklo_epi16(s[2], s[5]);
2171 u[5] = _mm_unpackhi_epi16(s[2], s[5]);
2172 u[6] = _mm_unpacklo_epi16(s[3], s[4]);
2173 u[7] = _mm_unpackhi_epi16(s[3], s[4]);
2175 v[0] = _mm_madd_epi16(u[0], k__cospi_p30_p02);
2176 v[1] = _mm_madd_epi16(u[1], k__cospi_p30_p02);
2177 v[2] = _mm_madd_epi16(u[2], k__cospi_p14_p18);
2178 v[3] = _mm_madd_epi16(u[3], k__cospi_p14_p18);
2179 v[4] = _mm_madd_epi16(u[4], k__cospi_p22_p10);
2180 v[5] = _mm_madd_epi16(u[5], k__cospi_p22_p10);
2181 v[6] = _mm_madd_epi16(u[6], k__cospi_p06_p26);
2182 v[7] = _mm_madd_epi16(u[7], k__cospi_p06_p26);
2183 v[8] = _mm_madd_epi16(u[6], k__cospi_m26_p06);
2184 v[9] = _mm_madd_epi16(u[7], k__cospi_m26_p06);
2185 v[10] = _mm_madd_epi16(u[4], k__cospi_m10_p22);
2186 v[11] = _mm_madd_epi16(u[5], k__cospi_m10_p22);
2187 v[12] = _mm_madd_epi16(u[2], k__cospi_m18_p14);
2188 v[13] = _mm_madd_epi16(u[3], k__cospi_m18_p14);
2189 v[14] = _mm_madd_epi16(u[0], k__cospi_m02_p30);
2190 v[15] = _mm_madd_epi16(u[1], k__cospi_m02_p30);
2192 u[0] = _mm_add_epi32(v[0], k__DCT_CONST_ROUNDING);
2193 u[1] = _mm_add_epi32(v[1], k__DCT_CONST_ROUNDING);
2194 u[2] = _mm_add_epi32(v[2], k__DCT_CONST_ROUNDING);
2195 u[3] = _mm_add_epi32(v[3], k__DCT_CONST_ROUNDING);
2196 u[4] = _mm_add_epi32(v[4], k__DCT_CONST_ROUNDING);
2197 u[5] = _mm_add_epi32(v[5], k__DCT_CONST_ROUNDING);
2198 u[6] = _mm_add_epi32(v[6], k__DCT_CONST_ROUNDING);
2199 u[7] = _mm_add_epi32(v[7], k__DCT_CONST_ROUNDING);
2200 u[8] = _mm_add_epi32(v[8], k__DCT_CONST_ROUNDING);
2201 u[9] = _mm_add_epi32(v[9], k__DCT_CONST_ROUNDING);
2202 u[10] = _mm_add_epi32(v[10], k__DCT_CONST_ROUNDING);
2203 u[11] = _mm_add_epi32(v[11], k__DCT_CONST_ROUNDING);
2204 u[12] = _mm_add_epi32(v[12], k__DCT_CONST_ROUNDING);
2205 u[13] = _mm_add_epi32(v[13], k__DCT_CONST_ROUNDING);
2206 u[14] = _mm_add_epi32(v[14], k__DCT_CONST_ROUNDING);
2207 u[15] = _mm_add_epi32(v[15], k__DCT_CONST_ROUNDING);
2209 v[0] = _mm_srai_epi32(u[0], DCT_CONST_BITS);
2210 v[1] = _mm_srai_epi32(u[1], DCT_CONST_BITS);
2211 v[2] = _mm_srai_epi32(u[2], DCT_CONST_BITS);
2212 v[3] = _mm_srai_epi32(u[3], DCT_CONST_BITS);
2213 v[4] = _mm_srai_epi32(u[4], DCT_CONST_BITS);
2214 v[5] = _mm_srai_epi32(u[5], DCT_CONST_BITS);
2215 v[6] = _mm_srai_epi32(u[6], DCT_CONST_BITS);
2216 v[7] = _mm_srai_epi32(u[7], DCT_CONST_BITS);
2217 v[8] = _mm_srai_epi32(u[8], DCT_CONST_BITS);
2218 v[9] = _mm_srai_epi32(u[9], DCT_CONST_BITS);
2219 v[10] = _mm_srai_epi32(u[10], DCT_CONST_BITS);
2220 v[11] = _mm_srai_epi32(u[11], DCT_CONST_BITS);
2221 v[12] = _mm_srai_epi32(u[12], DCT_CONST_BITS);
2222 v[13] = _mm_srai_epi32(u[13], DCT_CONST_BITS);
2223 v[14] = _mm_srai_epi32(u[14], DCT_CONST_BITS);
2224 v[15] = _mm_srai_epi32(u[15], DCT_CONST_BITS);
2226 in[1] = _mm_packs_epi32(v[0], v[1]);
2227 in[9] = _mm_packs_epi32(v[2], v[3]);
2228 in[5] = _mm_packs_epi32(v[4], v[5]);
2229 in[13] = _mm_packs_epi32(v[6], v[7]);
2230 in[3] = _mm_packs_epi32(v[8], v[9]);
2231 in[11] = _mm_packs_epi32(v[10], v[11]);
2232 in[7] = _mm_packs_epi32(v[12], v[13]);
2233 in[15] = _mm_packs_epi32(v[14], v[15]);
2236 void fadst16_8col(__m128i *in) {
2237 // perform 16x16 1-D ADST for 8 columns
2238 __m128i s[16], x[16], u[32], v[32];
2239 const __m128i k__cospi_p01_p31 = pair_set_epi16(cospi_1_64, cospi_31_64);
2240 const __m128i k__cospi_p31_m01 = pair_set_epi16(cospi_31_64, -cospi_1_64);
2241 const __m128i k__cospi_p05_p27 = pair_set_epi16(cospi_5_64, cospi_27_64);
2242 const __m128i k__cospi_p27_m05 = pair_set_epi16(cospi_27_64, -cospi_5_64);
2243 const __m128i k__cospi_p09_p23 = pair_set_epi16(cospi_9_64, cospi_23_64);
2244 const __m128i k__cospi_p23_m09 = pair_set_epi16(cospi_23_64, -cospi_9_64);
2245 const __m128i k__cospi_p13_p19 = pair_set_epi16(cospi_13_64, cospi_19_64);
2246 const __m128i k__cospi_p19_m13 = pair_set_epi16(cospi_19_64, -cospi_13_64);
2247 const __m128i k__cospi_p17_p15 = pair_set_epi16(cospi_17_64, cospi_15_64);
2248 const __m128i k__cospi_p15_m17 = pair_set_epi16(cospi_15_64, -cospi_17_64);
2249 const __m128i k__cospi_p21_p11 = pair_set_epi16(cospi_21_64, cospi_11_64);
2250 const __m128i k__cospi_p11_m21 = pair_set_epi16(cospi_11_64, -cospi_21_64);
2251 const __m128i k__cospi_p25_p07 = pair_set_epi16(cospi_25_64, cospi_7_64);
2252 const __m128i k__cospi_p07_m25 = pair_set_epi16(cospi_7_64, -cospi_25_64);
2253 const __m128i k__cospi_p29_p03 = pair_set_epi16(cospi_29_64, cospi_3_64);
2254 const __m128i k__cospi_p03_m29 = pair_set_epi16(cospi_3_64, -cospi_29_64);
2255 const __m128i k__cospi_p04_p28 = pair_set_epi16(cospi_4_64, cospi_28_64);
2256 const __m128i k__cospi_p28_m04 = pair_set_epi16(cospi_28_64, -cospi_4_64);
2257 const __m128i k__cospi_p20_p12 = pair_set_epi16(cospi_20_64, cospi_12_64);
2258 const __m128i k__cospi_p12_m20 = pair_set_epi16(cospi_12_64, -cospi_20_64);
2259 const __m128i k__cospi_m28_p04 = pair_set_epi16(-cospi_28_64, cospi_4_64);
2260 const __m128i k__cospi_m12_p20 = pair_set_epi16(-cospi_12_64, cospi_20_64);
2261 const __m128i k__cospi_p08_p24 = pair_set_epi16(cospi_8_64, cospi_24_64);
2262 const __m128i k__cospi_p24_m08 = pair_set_epi16(cospi_24_64, -cospi_8_64);
2263 const __m128i k__cospi_m24_p08 = pair_set_epi16(-cospi_24_64, cospi_8_64);
2264 const __m128i k__cospi_m16_m16 = _mm_set1_epi16(-cospi_16_64);
2265 const __m128i k__cospi_p16_p16 = _mm_set1_epi16(cospi_16_64);
2266 const __m128i k__cospi_p16_m16 = pair_set_epi16(cospi_16_64, -cospi_16_64);
2267 const __m128i k__cospi_m16_p16 = pair_set_epi16(-cospi_16_64, cospi_16_64);
2268 const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
2269 const __m128i kZero = _mm_set1_epi16(0);
2271 u[0] = _mm_unpacklo_epi16(in[15], in[0]);
2272 u[1] = _mm_unpackhi_epi16(in[15], in[0]);
2273 u[2] = _mm_unpacklo_epi16(in[13], in[2]);
2274 u[3] = _mm_unpackhi_epi16(in[13], in[2]);
2275 u[4] = _mm_unpacklo_epi16(in[11], in[4]);
2276 u[5] = _mm_unpackhi_epi16(in[11], in[4]);
2277 u[6] = _mm_unpacklo_epi16(in[9], in[6]);
2278 u[7] = _mm_unpackhi_epi16(in[9], in[6]);
2279 u[8] = _mm_unpacklo_epi16(in[7], in[8]);
2280 u[9] = _mm_unpackhi_epi16(in[7], in[8]);
2281 u[10] = _mm_unpacklo_epi16(in[5], in[10]);
2282 u[11] = _mm_unpackhi_epi16(in[5], in[10]);
2283 u[12] = _mm_unpacklo_epi16(in[3], in[12]);
2284 u[13] = _mm_unpackhi_epi16(in[3], in[12]);
2285 u[14] = _mm_unpacklo_epi16(in[1], in[14]);
2286 u[15] = _mm_unpackhi_epi16(in[1], in[14]);
2288 v[0] = _mm_madd_epi16(u[0], k__cospi_p01_p31);
2289 v[1] = _mm_madd_epi16(u[1], k__cospi_p01_p31);
2290 v[2] = _mm_madd_epi16(u[0], k__cospi_p31_m01);
2291 v[3] = _mm_madd_epi16(u[1], k__cospi_p31_m01);
2292 v[4] = _mm_madd_epi16(u[2], k__cospi_p05_p27);
2293 v[5] = _mm_madd_epi16(u[3], k__cospi_p05_p27);
2294 v[6] = _mm_madd_epi16(u[2], k__cospi_p27_m05);
2295 v[7] = _mm_madd_epi16(u[3], k__cospi_p27_m05);
2296 v[8] = _mm_madd_epi16(u[4], k__cospi_p09_p23);
2297 v[9] = _mm_madd_epi16(u[5], k__cospi_p09_p23);
2298 v[10] = _mm_madd_epi16(u[4], k__cospi_p23_m09);
2299 v[11] = _mm_madd_epi16(u[5], k__cospi_p23_m09);
2300 v[12] = _mm_madd_epi16(u[6], k__cospi_p13_p19);
2301 v[13] = _mm_madd_epi16(u[7], k__cospi_p13_p19);
2302 v[14] = _mm_madd_epi16(u[6], k__cospi_p19_m13);
2303 v[15] = _mm_madd_epi16(u[7], k__cospi_p19_m13);
2304 v[16] = _mm_madd_epi16(u[8], k__cospi_p17_p15);
2305 v[17] = _mm_madd_epi16(u[9], k__cospi_p17_p15);
2306 v[18] = _mm_madd_epi16(u[8], k__cospi_p15_m17);
2307 v[19] = _mm_madd_epi16(u[9], k__cospi_p15_m17);
2308 v[20] = _mm_madd_epi16(u[10], k__cospi_p21_p11);
2309 v[21] = _mm_madd_epi16(u[11], k__cospi_p21_p11);
2310 v[22] = _mm_madd_epi16(u[10], k__cospi_p11_m21);
2311 v[23] = _mm_madd_epi16(u[11], k__cospi_p11_m21);
2312 v[24] = _mm_madd_epi16(u[12], k__cospi_p25_p07);
2313 v[25] = _mm_madd_epi16(u[13], k__cospi_p25_p07);
2314 v[26] = _mm_madd_epi16(u[12], k__cospi_p07_m25);
2315 v[27] = _mm_madd_epi16(u[13], k__cospi_p07_m25);
2316 v[28] = _mm_madd_epi16(u[14], k__cospi_p29_p03);
2317 v[29] = _mm_madd_epi16(u[15], k__cospi_p29_p03);
2318 v[30] = _mm_madd_epi16(u[14], k__cospi_p03_m29);
2319 v[31] = _mm_madd_epi16(u[15], k__cospi_p03_m29);
2321 u[0] = _mm_add_epi32(v[0], v[16]);
2322 u[1] = _mm_add_epi32(v[1], v[17]);
2323 u[2] = _mm_add_epi32(v[2], v[18]);
2324 u[3] = _mm_add_epi32(v[3], v[19]);
2325 u[4] = _mm_add_epi32(v[4], v[20]);
2326 u[5] = _mm_add_epi32(v[5], v[21]);
2327 u[6] = _mm_add_epi32(v[6], v[22]);
2328 u[7] = _mm_add_epi32(v[7], v[23]);
2329 u[8] = _mm_add_epi32(v[8], v[24]);
2330 u[9] = _mm_add_epi32(v[9], v[25]);
2331 u[10] = _mm_add_epi32(v[10], v[26]);
2332 u[11] = _mm_add_epi32(v[11], v[27]);
2333 u[12] = _mm_add_epi32(v[12], v[28]);
2334 u[13] = _mm_add_epi32(v[13], v[29]);
2335 u[14] = _mm_add_epi32(v[14], v[30]);
2336 u[15] = _mm_add_epi32(v[15], v[31]);
2337 u[16] = _mm_sub_epi32(v[0], v[16]);
2338 u[17] = _mm_sub_epi32(v[1], v[17]);
2339 u[18] = _mm_sub_epi32(v[2], v[18]);
2340 u[19] = _mm_sub_epi32(v[3], v[19]);
2341 u[20] = _mm_sub_epi32(v[4], v[20]);
2342 u[21] = _mm_sub_epi32(v[5], v[21]);
2343 u[22] = _mm_sub_epi32(v[6], v[22]);
2344 u[23] = _mm_sub_epi32(v[7], v[23]);
2345 u[24] = _mm_sub_epi32(v[8], v[24]);
2346 u[25] = _mm_sub_epi32(v[9], v[25]);
2347 u[26] = _mm_sub_epi32(v[10], v[26]);
2348 u[27] = _mm_sub_epi32(v[11], v[27]);
2349 u[28] = _mm_sub_epi32(v[12], v[28]);
2350 u[29] = _mm_sub_epi32(v[13], v[29]);
2351 u[30] = _mm_sub_epi32(v[14], v[30]);
2352 u[31] = _mm_sub_epi32(v[15], v[31]);
2354 v[0] = _mm_add_epi32(u[0], k__DCT_CONST_ROUNDING);
2355 v[1] = _mm_add_epi32(u[1], k__DCT_CONST_ROUNDING);
2356 v[2] = _mm_add_epi32(u[2], k__DCT_CONST_ROUNDING);
2357 v[3] = _mm_add_epi32(u[3], k__DCT_CONST_ROUNDING);
2358 v[4] = _mm_add_epi32(u[4], k__DCT_CONST_ROUNDING);
2359 v[5] = _mm_add_epi32(u[5], k__DCT_CONST_ROUNDING);
2360 v[6] = _mm_add_epi32(u[6], k__DCT_CONST_ROUNDING);
2361 v[7] = _mm_add_epi32(u[7], k__DCT_CONST_ROUNDING);
2362 v[8] = _mm_add_epi32(u[8], k__DCT_CONST_ROUNDING);
2363 v[9] = _mm_add_epi32(u[9], k__DCT_CONST_ROUNDING);
2364 v[10] = _mm_add_epi32(u[10], k__DCT_CONST_ROUNDING);
2365 v[11] = _mm_add_epi32(u[11], k__DCT_CONST_ROUNDING);
2366 v[12] = _mm_add_epi32(u[12], k__DCT_CONST_ROUNDING);
2367 v[13] = _mm_add_epi32(u[13], k__DCT_CONST_ROUNDING);
2368 v[14] = _mm_add_epi32(u[14], k__DCT_CONST_ROUNDING);
2369 v[15] = _mm_add_epi32(u[15], k__DCT_CONST_ROUNDING);
2370 v[16] = _mm_add_epi32(u[16], k__DCT_CONST_ROUNDING);
2371 v[17] = _mm_add_epi32(u[17], k__DCT_CONST_ROUNDING);
2372 v[18] = _mm_add_epi32(u[18], k__DCT_CONST_ROUNDING);
2373 v[19] = _mm_add_epi32(u[19], k__DCT_CONST_ROUNDING);
2374 v[20] = _mm_add_epi32(u[20], k__DCT_CONST_ROUNDING);
2375 v[21] = _mm_add_epi32(u[21], k__DCT_CONST_ROUNDING);
2376 v[22] = _mm_add_epi32(u[22], k__DCT_CONST_ROUNDING);
2377 v[23] = _mm_add_epi32(u[23], k__DCT_CONST_ROUNDING);
2378 v[24] = _mm_add_epi32(u[24], k__DCT_CONST_ROUNDING);
2379 v[25] = _mm_add_epi32(u[25], k__DCT_CONST_ROUNDING);
2380 v[26] = _mm_add_epi32(u[26], k__DCT_CONST_ROUNDING);
2381 v[27] = _mm_add_epi32(u[27], k__DCT_CONST_ROUNDING);
2382 v[28] = _mm_add_epi32(u[28], k__DCT_CONST_ROUNDING);
2383 v[29] = _mm_add_epi32(u[29], k__DCT_CONST_ROUNDING);
2384 v[30] = _mm_add_epi32(u[30], k__DCT_CONST_ROUNDING);
2385 v[31] = _mm_add_epi32(u[31], k__DCT_CONST_ROUNDING);
2387 u[0] = _mm_srai_epi32(v[0], DCT_CONST_BITS);
2388 u[1] = _mm_srai_epi32(v[1], DCT_CONST_BITS);
2389 u[2] = _mm_srai_epi32(v[2], DCT_CONST_BITS);
2390 u[3] = _mm_srai_epi32(v[3], DCT_CONST_BITS);
2391 u[4] = _mm_srai_epi32(v[4], DCT_CONST_BITS);
2392 u[5] = _mm_srai_epi32(v[5], DCT_CONST_BITS);
2393 u[6] = _mm_srai_epi32(v[6], DCT_CONST_BITS);
2394 u[7] = _mm_srai_epi32(v[7], DCT_CONST_BITS);
2395 u[8] = _mm_srai_epi32(v[8], DCT_CONST_BITS);
2396 u[9] = _mm_srai_epi32(v[9], DCT_CONST_BITS);
2397 u[10] = _mm_srai_epi32(v[10], DCT_CONST_BITS);
2398 u[11] = _mm_srai_epi32(v[11], DCT_CONST_BITS);
2399 u[12] = _mm_srai_epi32(v[12], DCT_CONST_BITS);
2400 u[13] = _mm_srai_epi32(v[13], DCT_CONST_BITS);
2401 u[14] = _mm_srai_epi32(v[14], DCT_CONST_BITS);
2402 u[15] = _mm_srai_epi32(v[15], DCT_CONST_BITS);
2403 u[16] = _mm_srai_epi32(v[16], DCT_CONST_BITS);
2404 u[17] = _mm_srai_epi32(v[17], DCT_CONST_BITS);
2405 u[18] = _mm_srai_epi32(v[18], DCT_CONST_BITS);
2406 u[19] = _mm_srai_epi32(v[19], DCT_CONST_BITS);
2407 u[20] = _mm_srai_epi32(v[20], DCT_CONST_BITS);
2408 u[21] = _mm_srai_epi32(v[21], DCT_CONST_BITS);
2409 u[22] = _mm_srai_epi32(v[22], DCT_CONST_BITS);
2410 u[23] = _mm_srai_epi32(v[23], DCT_CONST_BITS);
2411 u[24] = _mm_srai_epi32(v[24], DCT_CONST_BITS);
2412 u[25] = _mm_srai_epi32(v[25], DCT_CONST_BITS);
2413 u[26] = _mm_srai_epi32(v[26], DCT_CONST_BITS);
2414 u[27] = _mm_srai_epi32(v[27], DCT_CONST_BITS);
2415 u[28] = _mm_srai_epi32(v[28], DCT_CONST_BITS);
2416 u[29] = _mm_srai_epi32(v[29], DCT_CONST_BITS);
2417 u[30] = _mm_srai_epi32(v[30], DCT_CONST_BITS);
2418 u[31] = _mm_srai_epi32(v[31], DCT_CONST_BITS);
2420 s[0] = _mm_packs_epi32(u[0], u[1]);
2421 s[1] = _mm_packs_epi32(u[2], u[3]);
2422 s[2] = _mm_packs_epi32(u[4], u[5]);
2423 s[3] = _mm_packs_epi32(u[6], u[7]);
2424 s[4] = _mm_packs_epi32(u[8], u[9]);
2425 s[5] = _mm_packs_epi32(u[10], u[11]);
2426 s[6] = _mm_packs_epi32(u[12], u[13]);
2427 s[7] = _mm_packs_epi32(u[14], u[15]);
2428 s[8] = _mm_packs_epi32(u[16], u[17]);
2429 s[9] = _mm_packs_epi32(u[18], u[19]);
2430 s[10] = _mm_packs_epi32(u[20], u[21]);
2431 s[11] = _mm_packs_epi32(u[22], u[23]);
2432 s[12] = _mm_packs_epi32(u[24], u[25]);
2433 s[13] = _mm_packs_epi32(u[26], u[27]);
2434 s[14] = _mm_packs_epi32(u[28], u[29]);
2435 s[15] = _mm_packs_epi32(u[30], u[31]);
2438 u[0] = _mm_unpacklo_epi16(s[8], s[9]);
2439 u[1] = _mm_unpackhi_epi16(s[8], s[9]);
2440 u[2] = _mm_unpacklo_epi16(s[10], s[11]);
2441 u[3] = _mm_unpackhi_epi16(s[10], s[11]);
2442 u[4] = _mm_unpacklo_epi16(s[12], s[13]);
2443 u[5] = _mm_unpackhi_epi16(s[12], s[13]);
2444 u[6] = _mm_unpacklo_epi16(s[14], s[15]);
2445 u[7] = _mm_unpackhi_epi16(s[14], s[15]);
2447 v[0] = _mm_madd_epi16(u[0], k__cospi_p04_p28);
2448 v[1] = _mm_madd_epi16(u[1], k__cospi_p04_p28);
2449 v[2] = _mm_madd_epi16(u[0], k__cospi_p28_m04);
2450 v[3] = _mm_madd_epi16(u[1], k__cospi_p28_m04);
2451 v[4] = _mm_madd_epi16(u[2], k__cospi_p20_p12);
2452 v[5] = _mm_madd_epi16(u[3], k__cospi_p20_p12);
2453 v[6] = _mm_madd_epi16(u[2], k__cospi_p12_m20);
2454 v[7] = _mm_madd_epi16(u[3], k__cospi_p12_m20);
2455 v[8] = _mm_madd_epi16(u[4], k__cospi_m28_p04);
2456 v[9] = _mm_madd_epi16(u[5], k__cospi_m28_p04);
2457 v[10] = _mm_madd_epi16(u[4], k__cospi_p04_p28);
2458 v[11] = _mm_madd_epi16(u[5], k__cospi_p04_p28);
2459 v[12] = _mm_madd_epi16(u[6], k__cospi_m12_p20);
2460 v[13] = _mm_madd_epi16(u[7], k__cospi_m12_p20);
2461 v[14] = _mm_madd_epi16(u[6], k__cospi_p20_p12);
2462 v[15] = _mm_madd_epi16(u[7], k__cospi_p20_p12);
2464 u[0] = _mm_add_epi32(v[0], v[8]);
2465 u[1] = _mm_add_epi32(v[1], v[9]);
2466 u[2] = _mm_add_epi32(v[2], v[10]);
2467 u[3] = _mm_add_epi32(v[3], v[11]);
2468 u[4] = _mm_add_epi32(v[4], v[12]);
2469 u[5] = _mm_add_epi32(v[5], v[13]);
2470 u[6] = _mm_add_epi32(v[6], v[14]);
2471 u[7] = _mm_add_epi32(v[7], v[15]);
2472 u[8] = _mm_sub_epi32(v[0], v[8]);
2473 u[9] = _mm_sub_epi32(v[1], v[9]);
2474 u[10] = _mm_sub_epi32(v[2], v[10]);
2475 u[11] = _mm_sub_epi32(v[3], v[11]);
2476 u[12] = _mm_sub_epi32(v[4], v[12]);
2477 u[13] = _mm_sub_epi32(v[5], v[13]);
2478 u[14] = _mm_sub_epi32(v[6], v[14]);
2479 u[15] = _mm_sub_epi32(v[7], v[15]);
2481 v[0] = _mm_add_epi32(u[0], k__DCT_CONST_ROUNDING);
2482 v[1] = _mm_add_epi32(u[1], k__DCT_CONST_ROUNDING);
2483 v[2] = _mm_add_epi32(u[2], k__DCT_CONST_ROUNDING);
2484 v[3] = _mm_add_epi32(u[3], k__DCT_CONST_ROUNDING);
2485 v[4] = _mm_add_epi32(u[4], k__DCT_CONST_ROUNDING);
2486 v[5] = _mm_add_epi32(u[5], k__DCT_CONST_ROUNDING);
2487 v[6] = _mm_add_epi32(u[6], k__DCT_CONST_ROUNDING);
2488 v[7] = _mm_add_epi32(u[7], k__DCT_CONST_ROUNDING);
2489 v[8] = _mm_add_epi32(u[8], k__DCT_CONST_ROUNDING);
2490 v[9] = _mm_add_epi32(u[9], k__DCT_CONST_ROUNDING);
2491 v[10] = _mm_add_epi32(u[10], k__DCT_CONST_ROUNDING);
2492 v[11] = _mm_add_epi32(u[11], k__DCT_CONST_ROUNDING);
2493 v[12] = _mm_add_epi32(u[12], k__DCT_CONST_ROUNDING);
2494 v[13] = _mm_add_epi32(u[13], k__DCT_CONST_ROUNDING);
2495 v[14] = _mm_add_epi32(u[14], k__DCT_CONST_ROUNDING);
2496 v[15] = _mm_add_epi32(u[15], k__DCT_CONST_ROUNDING);
2498 u[0] = _mm_srai_epi32(v[0], DCT_CONST_BITS);
2499 u[1] = _mm_srai_epi32(v[1], DCT_CONST_BITS);
2500 u[2] = _mm_srai_epi32(v[2], DCT_CONST_BITS);
2501 u[3] = _mm_srai_epi32(v[3], DCT_CONST_BITS);
2502 u[4] = _mm_srai_epi32(v[4], DCT_CONST_BITS);
2503 u[5] = _mm_srai_epi32(v[5], DCT_CONST_BITS);
2504 u[6] = _mm_srai_epi32(v[6], DCT_CONST_BITS);
2505 u[7] = _mm_srai_epi32(v[7], DCT_CONST_BITS);
2506 u[8] = _mm_srai_epi32(v[8], DCT_CONST_BITS);
2507 u[9] = _mm_srai_epi32(v[9], DCT_CONST_BITS);
2508 u[10] = _mm_srai_epi32(v[10], DCT_CONST_BITS);
2509 u[11] = _mm_srai_epi32(v[11], DCT_CONST_BITS);
2510 u[12] = _mm_srai_epi32(v[12], DCT_CONST_BITS);
2511 u[13] = _mm_srai_epi32(v[13], DCT_CONST_BITS);
2512 u[14] = _mm_srai_epi32(v[14], DCT_CONST_BITS);
2513 u[15] = _mm_srai_epi32(v[15], DCT_CONST_BITS);
2515 x[0] = _mm_add_epi16(s[0], s[4]);
2516 x[1] = _mm_add_epi16(s[1], s[5]);
2517 x[2] = _mm_add_epi16(s[2], s[6]);
2518 x[3] = _mm_add_epi16(s[3], s[7]);
2519 x[4] = _mm_sub_epi16(s[0], s[4]);
2520 x[5] = _mm_sub_epi16(s[1], s[5]);
2521 x[6] = _mm_sub_epi16(s[2], s[6]);
2522 x[7] = _mm_sub_epi16(s[3], s[7]);
2523 x[8] = _mm_packs_epi32(u[0], u[1]);
2524 x[9] = _mm_packs_epi32(u[2], u[3]);
2525 x[10] = _mm_packs_epi32(u[4], u[5]);
2526 x[11] = _mm_packs_epi32(u[6], u[7]);
2527 x[12] = _mm_packs_epi32(u[8], u[9]);
2528 x[13] = _mm_packs_epi32(u[10], u[11]);
2529 x[14] = _mm_packs_epi32(u[12], u[13]);
2530 x[15] = _mm_packs_epi32(u[14], u[15]);
2533 u[0] = _mm_unpacklo_epi16(x[4], x[5]);
2534 u[1] = _mm_unpackhi_epi16(x[4], x[5]);
2535 u[2] = _mm_unpacklo_epi16(x[6], x[7]);
2536 u[3] = _mm_unpackhi_epi16(x[6], x[7]);
2537 u[4] = _mm_unpacklo_epi16(x[12], x[13]);
2538 u[5] = _mm_unpackhi_epi16(x[12], x[13]);
2539 u[6] = _mm_unpacklo_epi16(x[14], x[15]);
2540 u[7] = _mm_unpackhi_epi16(x[14], x[15]);
2542 v[0] = _mm_madd_epi16(u[0], k__cospi_p08_p24);
2543 v[1] = _mm_madd_epi16(u[1], k__cospi_p08_p24);
2544 v[2] = _mm_madd_epi16(u[0], k__cospi_p24_m08);
2545 v[3] = _mm_madd_epi16(u[1], k__cospi_p24_m08);
2546 v[4] = _mm_madd_epi16(u[2], k__cospi_m24_p08);
2547 v[5] = _mm_madd_epi16(u[3], k__cospi_m24_p08);
2548 v[6] = _mm_madd_epi16(u[2], k__cospi_p08_p24);
2549 v[7] = _mm_madd_epi16(u[3], k__cospi_p08_p24);
2550 v[8] = _mm_madd_epi16(u[4], k__cospi_p08_p24);
2551 v[9] = _mm_madd_epi16(u[5], k__cospi_p08_p24);
2552 v[10] = _mm_madd_epi16(u[4], k__cospi_p24_m08);
2553 v[11] = _mm_madd_epi16(u[5], k__cospi_p24_m08);
2554 v[12] = _mm_madd_epi16(u[6], k__cospi_m24_p08);
2555 v[13] = _mm_madd_epi16(u[7], k__cospi_m24_p08);
2556 v[14] = _mm_madd_epi16(u[6], k__cospi_p08_p24);
2557 v[15] = _mm_madd_epi16(u[7], k__cospi_p08_p24);
2559 u[0] = _mm_add_epi32(v[0], v[4]);
2560 u[1] = _mm_add_epi32(v[1], v[5]);
2561 u[2] = _mm_add_epi32(v[2], v[6]);
2562 u[3] = _mm_add_epi32(v[3], v[7]);
2563 u[4] = _mm_sub_epi32(v[0], v[4]);
2564 u[5] = _mm_sub_epi32(v[1], v[5]);
2565 u[6] = _mm_sub_epi32(v[2], v[6]);
2566 u[7] = _mm_sub_epi32(v[3], v[7]);
2567 u[8] = _mm_add_epi32(v[8], v[12]);
2568 u[9] = _mm_add_epi32(v[9], v[13]);
2569 u[10] = _mm_add_epi32(v[10], v[14]);
2570 u[11] = _mm_add_epi32(v[11], v[15]);
2571 u[12] = _mm_sub_epi32(v[8], v[12]);
2572 u[13] = _mm_sub_epi32(v[9], v[13]);
2573 u[14] = _mm_sub_epi32(v[10], v[14]);
2574 u[15] = _mm_sub_epi32(v[11], v[15]);
2576 u[0] = _mm_add_epi32(u[0], k__DCT_CONST_ROUNDING);
2577 u[1] = _mm_add_epi32(u[1], k__DCT_CONST_ROUNDING);
2578 u[2] = _mm_add_epi32(u[2], k__DCT_CONST_ROUNDING);
2579 u[3] = _mm_add_epi32(u[3], k__DCT_CONST_ROUNDING);
2580 u[4] = _mm_add_epi32(u[4], k__DCT_CONST_ROUNDING);
2581 u[5] = _mm_add_epi32(u[5], k__DCT_CONST_ROUNDING);
2582 u[6] = _mm_add_epi32(u[6], k__DCT_CONST_ROUNDING);
2583 u[7] = _mm_add_epi32(u[7], k__DCT_CONST_ROUNDING);
2584 u[8] = _mm_add_epi32(u[8], k__DCT_CONST_ROUNDING);
2585 u[9] = _mm_add_epi32(u[9], k__DCT_CONST_ROUNDING);
2586 u[10] = _mm_add_epi32(u[10], k__DCT_CONST_ROUNDING);
2587 u[11] = _mm_add_epi32(u[11], k__DCT_CONST_ROUNDING);
2588 u[12] = _mm_add_epi32(u[12], k__DCT_CONST_ROUNDING);
2589 u[13] = _mm_add_epi32(u[13], k__DCT_CONST_ROUNDING);
2590 u[14] = _mm_add_epi32(u[14], k__DCT_CONST_ROUNDING);
2591 u[15] = _mm_add_epi32(u[15], k__DCT_CONST_ROUNDING);
2593 v[0] = _mm_srai_epi32(u[0], DCT_CONST_BITS);
2594 v[1] = _mm_srai_epi32(u[1], DCT_CONST_BITS);
2595 v[2] = _mm_srai_epi32(u[2], DCT_CONST_BITS);
2596 v[3] = _mm_srai_epi32(u[3], DCT_CONST_BITS);
2597 v[4] = _mm_srai_epi32(u[4], DCT_CONST_BITS);
2598 v[5] = _mm_srai_epi32(u[5], DCT_CONST_BITS);
2599 v[6] = _mm_srai_epi32(u[6], DCT_CONST_BITS);
2600 v[7] = _mm_srai_epi32(u[7], DCT_CONST_BITS);
2601 v[8] = _mm_srai_epi32(u[8], DCT_CONST_BITS);
2602 v[9] = _mm_srai_epi32(u[9], DCT_CONST_BITS);
2603 v[10] = _mm_srai_epi32(u[10], DCT_CONST_BITS);
2604 v[11] = _mm_srai_epi32(u[11], DCT_CONST_BITS);
2605 v[12] = _mm_srai_epi32(u[12], DCT_CONST_BITS);
2606 v[13] = _mm_srai_epi32(u[13], DCT_CONST_BITS);
2607 v[14] = _mm_srai_epi32(u[14], DCT_CONST_BITS);
2608 v[15] = _mm_srai_epi32(u[15], DCT_CONST_BITS);
2610 s[0] = _mm_add_epi16(x[0], x[2]);
2611 s[1] = _mm_add_epi16(x[1], x[3]);
2612 s[2] = _mm_sub_epi16(x[0], x[2]);
2613 s[3] = _mm_sub_epi16(x[1], x[3]);
2614 s[4] = _mm_packs_epi32(v[0], v[1]);
2615 s[5] = _mm_packs_epi32(v[2], v[3]);
2616 s[6] = _mm_packs_epi32(v[4], v[5]);
2617 s[7] = _mm_packs_epi32(v[6], v[7]);
2618 s[8] = _mm_add_epi16(x[8], x[10]);
2619 s[9] = _mm_add_epi16(x[9], x[11]);
2620 s[10] = _mm_sub_epi16(x[8], x[10]);
2621 s[11] = _mm_sub_epi16(x[9], x[11]);
2622 s[12] = _mm_packs_epi32(v[8], v[9]);
2623 s[13] = _mm_packs_epi32(v[10], v[11]);
2624 s[14] = _mm_packs_epi32(v[12], v[13]);
2625 s[15] = _mm_packs_epi32(v[14], v[15]);
2628 u[0] = _mm_unpacklo_epi16(s[2], s[3]);
2629 u[1] = _mm_unpackhi_epi16(s[2], s[3]);
2630 u[2] = _mm_unpacklo_epi16(s[6], s[7]);
2631 u[3] = _mm_unpackhi_epi16(s[6], s[7]);
2632 u[4] = _mm_unpacklo_epi16(s[10], s[11]);
2633 u[5] = _mm_unpackhi_epi16(s[10], s[11]);
2634 u[6] = _mm_unpacklo_epi16(s[14], s[15]);
2635 u[7] = _mm_unpackhi_epi16(s[14], s[15]);
2637 v[0] = _mm_madd_epi16(u[0], k__cospi_m16_m16);
2638 v[1] = _mm_madd_epi16(u[1], k__cospi_m16_m16);
2639 v[2] = _mm_madd_epi16(u[0], k__cospi_p16_m16);
2640 v[3] = _mm_madd_epi16(u[1], k__cospi_p16_m16);
2641 v[4] = _mm_madd_epi16(u[2], k__cospi_p16_p16);
2642 v[5] = _mm_madd_epi16(u[3], k__cospi_p16_p16);
2643 v[6] = _mm_madd_epi16(u[2], k__cospi_m16_p16);
2644 v[7] = _mm_madd_epi16(u[3], k__cospi_m16_p16);
2645 v[8] = _mm_madd_epi16(u[4], k__cospi_p16_p16);
2646 v[9] = _mm_madd_epi16(u[5], k__cospi_p16_p16);
2647 v[10] = _mm_madd_epi16(u[4], k__cospi_m16_p16);
2648 v[11] = _mm_madd_epi16(u[5], k__cospi_m16_p16);
2649 v[12] = _mm_madd_epi16(u[6], k__cospi_m16_m16);
2650 v[13] = _mm_madd_epi16(u[7], k__cospi_m16_m16);
2651 v[14] = _mm_madd_epi16(u[6], k__cospi_p16_m16);
2652 v[15] = _mm_madd_epi16(u[7], k__cospi_p16_m16);
2654 u[0] = _mm_add_epi32(v[0], k__DCT_CONST_ROUNDING);
2655 u[1] = _mm_add_epi32(v[1], k__DCT_CONST_ROUNDING);
2656 u[2] = _mm_add_epi32(v[2], k__DCT_CONST_ROUNDING);
2657 u[3] = _mm_add_epi32(v[3], k__DCT_CONST_ROUNDING);
2658 u[4] = _mm_add_epi32(v[4], k__DCT_CONST_ROUNDING);
2659 u[5] = _mm_add_epi32(v[5], k__DCT_CONST_ROUNDING);
2660 u[6] = _mm_add_epi32(v[6], k__DCT_CONST_ROUNDING);
2661 u[7] = _mm_add_epi32(v[7], k__DCT_CONST_ROUNDING);
2662 u[8] = _mm_add_epi32(v[8], k__DCT_CONST_ROUNDING);
2663 u[9] = _mm_add_epi32(v[9], k__DCT_CONST_ROUNDING);
2664 u[10] = _mm_add_epi32(v[10], k__DCT_CONST_ROUNDING);
2665 u[11] = _mm_add_epi32(v[11], k__DCT_CONST_ROUNDING);
2666 u[12] = _mm_add_epi32(v[12], k__DCT_CONST_ROUNDING);
2667 u[13] = _mm_add_epi32(v[13], k__DCT_CONST_ROUNDING);
2668 u[14] = _mm_add_epi32(v[14], k__DCT_CONST_ROUNDING);
2669 u[15] = _mm_add_epi32(v[15], k__DCT_CONST_ROUNDING);
2671 v[0] = _mm_srai_epi32(u[0], DCT_CONST_BITS);
2672 v[1] = _mm_srai_epi32(u[1], DCT_CONST_BITS);
2673 v[2] = _mm_srai_epi32(u[2], DCT_CONST_BITS);
2674 v[3] = _mm_srai_epi32(u[3], DCT_CONST_BITS);
2675 v[4] = _mm_srai_epi32(u[4], DCT_CONST_BITS);
2676 v[5] = _mm_srai_epi32(u[5], DCT_CONST_BITS);
2677 v[6] = _mm_srai_epi32(u[6], DCT_CONST_BITS);
2678 v[7] = _mm_srai_epi32(u[7], DCT_CONST_BITS);
2679 v[8] = _mm_srai_epi32(u[8], DCT_CONST_BITS);
2680 v[9] = _mm_srai_epi32(u[9], DCT_CONST_BITS);
2681 v[10] = _mm_srai_epi32(u[10], DCT_CONST_BITS);
2682 v[11] = _mm_srai_epi32(u[11], DCT_CONST_BITS);
2683 v[12] = _mm_srai_epi32(u[12], DCT_CONST_BITS);
2684 v[13] = _mm_srai_epi32(u[13], DCT_CONST_BITS);
2685 v[14] = _mm_srai_epi32(u[14], DCT_CONST_BITS);
2686 v[15] = _mm_srai_epi32(u[15], DCT_CONST_BITS);
2689 in[1] = _mm_sub_epi16(kZero, s[8]);
2691 in[3] = _mm_sub_epi16(kZero, s[4]);
2692 in[4] = _mm_packs_epi32(v[4], v[5]);
2693 in[5] = _mm_packs_epi32(v[12], v[13]);
2694 in[6] = _mm_packs_epi32(v[8], v[9]);
2695 in[7] = _mm_packs_epi32(v[0], v[1]);
2696 in[8] = _mm_packs_epi32(v[2], v[3]);
2697 in[9] = _mm_packs_epi32(v[10], v[11]);
2698 in[10] = _mm_packs_epi32(v[14], v[15]);
2699 in[11] = _mm_packs_epi32(v[6], v[7]);
2701 in[13] = _mm_sub_epi16(kZero, s[13]);
2703 in[15] = _mm_sub_epi16(kZero, s[1]);
2706 void fdct16_sse2(__m128i *in0, __m128i *in1) {
2709 array_transpose_16x16(in0, in1);
2712 void fadst16_sse2(__m128i *in0, __m128i *in1) {
2715 array_transpose_16x16(in0, in1);
2718 void vp9_fht16x16_sse2(const int16_t *input, int16_t *output,
2719 int stride, int tx_type) {
2720 __m128i in0[16], in1[16];
2724 vp9_fdct16x16_sse2(input, output, stride);
2727 load_buffer_16x16(input, in0, in1, stride);
2728 fadst16_sse2(in0, in1);
2729 right_shift_16x16(in0, in1);
2730 fdct16_sse2(in0, in1);
2731 write_buffer_16x16(output, in0, in1, 16);
2734 load_buffer_16x16(input, in0, in1, stride);
2735 fdct16_sse2(in0, in1);
2736 right_shift_16x16(in0, in1);
2737 fadst16_sse2(in0, in1);
2738 write_buffer_16x16(output, in0, in1, 16);
2741 load_buffer_16x16(input, in0, in1, stride);
2742 fadst16_sse2(in0, in1);
2743 right_shift_16x16(in0, in1);
2744 fadst16_sse2(in0, in1);
2745 write_buffer_16x16(output, in0, in1, 16);
2753 void vp9_fdct32x32_1_sse2(const int16_t *input, int16_t *output, int stride) {
2754 __m128i in0, in1, in2, in3;
2756 __m128i sum = _mm_setzero_si128();
2759 for (i = 0; i < 8; ++i) {
2760 in0 = _mm_load_si128((const __m128i *)(input + 0));
2761 in1 = _mm_load_si128((const __m128i *)(input + 8));
2762 in2 = _mm_load_si128((const __m128i *)(input + 16));
2763 in3 = _mm_load_si128((const __m128i *)(input + 24));
2766 u0 = _mm_add_epi16(in0, in1);
2767 u1 = _mm_add_epi16(in2, in3);
2768 sum = _mm_add_epi16(sum, u0);
2770 in0 = _mm_load_si128((const __m128i *)(input + 0));
2771 in1 = _mm_load_si128((const __m128i *)(input + 8));
2772 in2 = _mm_load_si128((const __m128i *)(input + 16));
2773 in3 = _mm_load_si128((const __m128i *)(input + 24));
2776 sum = _mm_add_epi16(sum, u1);
2777 u0 = _mm_add_epi16(in0, in1);
2778 u1 = _mm_add_epi16(in2, in3);
2779 sum = _mm_add_epi16(sum, u0);
2781 in0 = _mm_load_si128((const __m128i *)(input + 0));
2782 in1 = _mm_load_si128((const __m128i *)(input + 8));
2783 in2 = _mm_load_si128((const __m128i *)(input + 16));
2784 in3 = _mm_load_si128((const __m128i *)(input + 24));
2787 sum = _mm_add_epi16(sum, u1);
2788 u0 = _mm_add_epi16(in0, in1);
2789 u1 = _mm_add_epi16(in2, in3);
2790 sum = _mm_add_epi16(sum, u0);
2792 in0 = _mm_load_si128((const __m128i *)(input + 0));
2793 in1 = _mm_load_si128((const __m128i *)(input + 8));
2794 in2 = _mm_load_si128((const __m128i *)(input + 16));
2795 in3 = _mm_load_si128((const __m128i *)(input + 24));
2798 sum = _mm_add_epi16(sum, u1);
2799 u0 = _mm_add_epi16(in0, in1);
2800 u1 = _mm_add_epi16(in2, in3);
2801 sum = _mm_add_epi16(sum, u0);
2803 sum = _mm_add_epi16(sum, u1);
2806 u0 = _mm_setzero_si128();
2807 in0 = _mm_unpacklo_epi16(u0, sum);
2808 in1 = _mm_unpackhi_epi16(u0, sum);
2809 in0 = _mm_srai_epi32(in0, 16);
2810 in1 = _mm_srai_epi32(in1, 16);
2812 sum = _mm_add_epi32(in0, in1);
2813 in0 = _mm_unpacklo_epi32(sum, u0);
2814 in1 = _mm_unpackhi_epi32(sum, u0);
2816 sum = _mm_add_epi32(in0, in1);
2817 in0 = _mm_srli_si128(sum, 8);
2819 in1 = _mm_add_epi32(sum, in0);
2820 in1 = _mm_srai_epi32(in1, 3);
2821 _mm_store_si128((__m128i *)(output), in1);
2824 #define FDCT32x32_2D vp9_fdct32x32_rd_sse2
2825 #define FDCT32x32_HIGH_PRECISION 0
2826 #include "vp9/encoder/x86/vp9_dct32x32_sse2.c"
2827 #undef FDCT32x32_HIGH_PRECISION
2830 #define FDCT32x32_2D vp9_fdct32x32_sse2
2831 #define FDCT32x32_HIGH_PRECISION 1
2832 #include "vp9/encoder/x86/vp9_dct32x32_sse2.c" // NOLINT
2833 #undef FDCT32x32_HIGH_PRECISION