vp9_dct_sse2.c revision ba164dffc5a6795bce97fae02b51ccf3330e15e4
1/*
2 *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <emmintrin.h>  // SSE2
12#include "vp9/common/vp9_idct.h"  // for cospi constants
13
14void vp9_short_fdct4x4_sse2(int16_t *input, int16_t *output, int pitch) {
15  // The 2D transform is done with two passes which are actually pretty
16  // similar. In the first one, we transform the columns and transpose
17  // the results. In the second one, we transform the rows. To achieve that,
18  // as the first pass results are transposed, we tranpose the columns (that
19  // is the transposed rows) and transpose the results (so that it goes back
20  // in normal/row positions).
21  const int stride = pitch >> 1;
22  int pass;
23  // Constants
24  //    When we use them, in one case, they are all the same. In all others
25  //    it's a pair of them that we need to repeat four times. This is done
26  //    by constructing the 32 bit constant corresponding to that pair.
27  const __m128i k__cospi_p16_p16 = _mm_set1_epi16(cospi_16_64);
28  const __m128i k__cospi_p16_m16 = pair_set_epi16(cospi_16_64, -cospi_16_64);
29  const __m128i k__cospi_p24_p08 = pair_set_epi16(cospi_24_64, cospi_8_64);
30  const __m128i k__cospi_m08_p24 = pair_set_epi16(-cospi_8_64, cospi_24_64);
31  const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
32  const __m128i k__nonzero_bias_a = _mm_setr_epi16(0, 1, 1, 1, 1, 1, 1, 1);
33  const __m128i k__nonzero_bias_b = _mm_setr_epi16(1, 0, 0, 0, 0, 0, 0, 0);
34  const __m128i kOne = _mm_set1_epi16(1);
35  __m128i in0, in1, in2, in3;
36  // Load inputs.
37  {
38    in0  = _mm_loadl_epi64((const __m128i *)(input +  0 * stride));
39    in1  = _mm_loadl_epi64((const __m128i *)(input +  1 * stride));
40    in2  = _mm_loadl_epi64((const __m128i *)(input +  2 * stride));
41    in3  = _mm_loadl_epi64((const __m128i *)(input +  3 * stride));
42    // x = x << 4
43    in0 = _mm_slli_epi16(in0, 4);
44    in1 = _mm_slli_epi16(in1, 4);
45    in2 = _mm_slli_epi16(in2, 4);
46    in3 = _mm_slli_epi16(in3, 4);
47    // if (i == 0 && input[0]) input[0] += 1;
48    {
49      // The mask will only contain wether the first value is zero, all
50      // other comparison will fail as something shifted by 4 (above << 4)
51      // can never be equal to one. To increment in the non-zero case, we
52      // add the mask and one for the first element:
53      //   - if zero, mask = -1, v = v - 1 + 1 = v
54      //   - if non-zero, mask = 0, v = v + 0 + 1 = v + 1
55      __m128i mask = _mm_cmpeq_epi16(in0, k__nonzero_bias_a);
56      in0 = _mm_add_epi16(in0, mask);
57      in0 = _mm_add_epi16(in0, k__nonzero_bias_b);
58    }
59  }
60  // Do the two transform/transpose passes
61  for (pass = 0; pass < 2; ++pass) {
62    // Transform 1/2: Add/substract
63    const __m128i r0 = _mm_add_epi16(in0, in3);
64    const __m128i r1 = _mm_add_epi16(in1, in2);
65    const __m128i r2 = _mm_sub_epi16(in1, in2);
66    const __m128i r3 = _mm_sub_epi16(in0, in3);
67    // Transform 1/2: Interleave to do the multiply by constants which gets us
68    //                into 32 bits.
69    const __m128i t0 = _mm_unpacklo_epi16(r0, r1);
70    const __m128i t2 = _mm_unpacklo_epi16(r2, r3);
71    const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p16_p16);
72    const __m128i u2 = _mm_madd_epi16(t0, k__cospi_p16_m16);
73    const __m128i u4 = _mm_madd_epi16(t2, k__cospi_p24_p08);
74    const __m128i u6 = _mm_madd_epi16(t2, k__cospi_m08_p24);
75    const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
76    const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
77    const __m128i v4 = _mm_add_epi32(u4, k__DCT_CONST_ROUNDING);
78    const __m128i v6 = _mm_add_epi32(u6, k__DCT_CONST_ROUNDING);
79    const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
80    const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
81    const __m128i w4 = _mm_srai_epi32(v4, DCT_CONST_BITS);
82    const __m128i w6 = _mm_srai_epi32(v6, DCT_CONST_BITS);
83    // Combine and transpose
84    const __m128i res0 = _mm_packs_epi32(w0, w2);
85    const __m128i res1 = _mm_packs_epi32(w4, w6);
86    // 00 01 02 03 20 21 22 23
87    // 10 11 12 13 30 31 32 33
88    const __m128i tr0_0 = _mm_unpacklo_epi16(res0, res1);
89    const __m128i tr0_1 = _mm_unpackhi_epi16(res0, res1);
90    // 00 10 01 11 02 12 03 13
91    // 20 30 21 31 22 32 23 33
92    in0 = _mm_unpacklo_epi32(tr0_0, tr0_1);
93    in2 = _mm_unpackhi_epi32(tr0_0, tr0_1);
94    // 00 10 20 30 01 11 21 31      in0 contains 0 followed by 1
95    // 02 12 22 32 03 13 23 33      in2 contains 2 followed by 3
96    if (0 == pass) {
97      // Extract values in the high part for second pass as transform code
98      // only uses the first four values.
99      in1 = _mm_unpackhi_epi64(in0, in0);
100      in3 = _mm_unpackhi_epi64(in2, in2);
101    } else {
102      // Post-condition output and store it (v + 1) >> 2, taking advantage
103      // of the fact 1/3 are stored just after 0/2.
104      __m128i out01 = _mm_add_epi16(in0, kOne);
105      __m128i out23 = _mm_add_epi16(in2, kOne);
106      out01 = _mm_srai_epi16(out01, 2);
107      out23 = _mm_srai_epi16(out23, 2);
108      _mm_storeu_si128((__m128i *)(output + 0 * 4), out01);
109      _mm_storeu_si128((__m128i *)(output + 2 * 4), out23);
110    }
111  }
112}
113
114void vp9_short_fdct8x4_sse2(int16_t *input, int16_t *output, int pitch) {
115  vp9_short_fdct4x4_sse2(input, output, pitch);
116  vp9_short_fdct4x4_sse2(input + 4, output + 16, pitch);
117}
118
119void vp9_short_fdct8x8_sse2(int16_t *input, int16_t *output, int pitch) {
120  const int stride = pitch >> 1;
121  int pass;
122  // Constants
123  //    When we use them, in one case, they are all the same. In all others
124  //    it's a pair of them that we need to repeat four times. This is done
125  //    by constructing the 32 bit constant corresponding to that pair.
126  const __m128i k__cospi_p16_p16 = _mm_set1_epi16(cospi_16_64);
127  const __m128i k__cospi_p16_m16 = pair_set_epi16(cospi_16_64, -cospi_16_64);
128  const __m128i k__cospi_p24_p08 = pair_set_epi16(cospi_24_64, cospi_8_64);
129  const __m128i k__cospi_m08_p24 = pair_set_epi16(-cospi_8_64, cospi_24_64);
130  const __m128i k__cospi_p28_p04 = pair_set_epi16(cospi_28_64, cospi_4_64);
131  const __m128i k__cospi_m04_p28 = pair_set_epi16(-cospi_4_64, cospi_28_64);
132  const __m128i k__cospi_p12_p20 = pair_set_epi16(cospi_12_64, cospi_20_64);
133  const __m128i k__cospi_m20_p12 = pair_set_epi16(-cospi_20_64, cospi_12_64);
134  const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
135  // Load input
136  __m128i in0  = _mm_loadu_si128((const __m128i *)(input + 0 * stride));
137  __m128i in1  = _mm_loadu_si128((const __m128i *)(input + 1 * stride));
138  __m128i in2  = _mm_loadu_si128((const __m128i *)(input + 2 * stride));
139  __m128i in3  = _mm_loadu_si128((const __m128i *)(input + 3 * stride));
140  __m128i in4  = _mm_loadu_si128((const __m128i *)(input + 4 * stride));
141  __m128i in5  = _mm_loadu_si128((const __m128i *)(input + 5 * stride));
142  __m128i in6  = _mm_loadu_si128((const __m128i *)(input + 6 * stride));
143  __m128i in7  = _mm_loadu_si128((const __m128i *)(input + 7 * stride));
144  // Pre-condition input (shift by two)
145  in0 = _mm_slli_epi16(in0, 2);
146  in1 = _mm_slli_epi16(in1, 2);
147  in2 = _mm_slli_epi16(in2, 2);
148  in3 = _mm_slli_epi16(in3, 2);
149  in4 = _mm_slli_epi16(in4, 2);
150  in5 = _mm_slli_epi16(in5, 2);
151  in6 = _mm_slli_epi16(in6, 2);
152  in7 = _mm_slli_epi16(in7, 2);
153
154  // We do two passes, first the columns, then the rows. The results of the
155  // first pass are transposed so that the same column code can be reused. The
156  // results of the second pass are also transposed so that the rows (processed
157  // as columns) are put back in row positions.
158  for (pass = 0; pass < 2; pass++) {
159    // To store results of each pass before the transpose.
160    __m128i res0, res1, res2, res3, res4, res5, res6, res7;
161    // Add/substract
162    const __m128i q0 = _mm_add_epi16(in0, in7);
163    const __m128i q1 = _mm_add_epi16(in1, in6);
164    const __m128i q2 = _mm_add_epi16(in2, in5);
165    const __m128i q3 = _mm_add_epi16(in3, in4);
166    const __m128i q4 = _mm_sub_epi16(in3, in4);
167    const __m128i q5 = _mm_sub_epi16(in2, in5);
168    const __m128i q6 = _mm_sub_epi16(in1, in6);
169    const __m128i q7 = _mm_sub_epi16(in0, in7);
170    // Work on first four results
171    {
172      // Add/substract
173      const __m128i r0 = _mm_add_epi16(q0, q3);
174      const __m128i r1 = _mm_add_epi16(q1, q2);
175      const __m128i r2 = _mm_sub_epi16(q1, q2);
176      const __m128i r3 = _mm_sub_epi16(q0, q3);
177      // Interleave to do the multiply by constants which gets us into 32bits
178      const __m128i t0 = _mm_unpacklo_epi16(r0, r1);
179      const __m128i t1 = _mm_unpackhi_epi16(r0, r1);
180      const __m128i t2 = _mm_unpacklo_epi16(r2, r3);
181      const __m128i t3 = _mm_unpackhi_epi16(r2, r3);
182      const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p16_p16);
183      const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p16_p16);
184      const __m128i u2 = _mm_madd_epi16(t0, k__cospi_p16_m16);
185      const __m128i u3 = _mm_madd_epi16(t1, k__cospi_p16_m16);
186      const __m128i u4 = _mm_madd_epi16(t2, k__cospi_p24_p08);
187      const __m128i u5 = _mm_madd_epi16(t3, k__cospi_p24_p08);
188      const __m128i u6 = _mm_madd_epi16(t2, k__cospi_m08_p24);
189      const __m128i u7 = _mm_madd_epi16(t3, k__cospi_m08_p24);
190      // dct_const_round_shift
191      const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
192      const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
193      const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
194      const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
195      const __m128i v4 = _mm_add_epi32(u4, k__DCT_CONST_ROUNDING);
196      const __m128i v5 = _mm_add_epi32(u5, k__DCT_CONST_ROUNDING);
197      const __m128i v6 = _mm_add_epi32(u6, k__DCT_CONST_ROUNDING);
198      const __m128i v7 = _mm_add_epi32(u7, k__DCT_CONST_ROUNDING);
199      const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
200      const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
201      const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
202      const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
203      const __m128i w4 = _mm_srai_epi32(v4, DCT_CONST_BITS);
204      const __m128i w5 = _mm_srai_epi32(v5, DCT_CONST_BITS);
205      const __m128i w6 = _mm_srai_epi32(v6, DCT_CONST_BITS);
206      const __m128i w7 = _mm_srai_epi32(v7, DCT_CONST_BITS);
207      // Combine
208      res0 = _mm_packs_epi32(w0, w1);
209      res4 = _mm_packs_epi32(w2, w3);
210      res2 = _mm_packs_epi32(w4, w5);
211      res6 = _mm_packs_epi32(w6, w7);
212    }
213    // Work on next four results
214    {
215      // Interleave to do the multiply by constants which gets us into 32bits
216      const __m128i d0 = _mm_unpacklo_epi16(q6, q5);
217      const __m128i d1 = _mm_unpackhi_epi16(q6, q5);
218      const __m128i e0 = _mm_madd_epi16(d0, k__cospi_p16_m16);
219      const __m128i e1 = _mm_madd_epi16(d1, k__cospi_p16_m16);
220      const __m128i e2 = _mm_madd_epi16(d0, k__cospi_p16_p16);
221      const __m128i e3 = _mm_madd_epi16(d1, k__cospi_p16_p16);
222      // dct_const_round_shift
223      const __m128i f0 = _mm_add_epi32(e0, k__DCT_CONST_ROUNDING);
224      const __m128i f1 = _mm_add_epi32(e1, k__DCT_CONST_ROUNDING);
225      const __m128i f2 = _mm_add_epi32(e2, k__DCT_CONST_ROUNDING);
226      const __m128i f3 = _mm_add_epi32(e3, k__DCT_CONST_ROUNDING);
227      const __m128i s0 = _mm_srai_epi32(f0, DCT_CONST_BITS);
228      const __m128i s1 = _mm_srai_epi32(f1, DCT_CONST_BITS);
229      const __m128i s2 = _mm_srai_epi32(f2, DCT_CONST_BITS);
230      const __m128i s3 = _mm_srai_epi32(f3, DCT_CONST_BITS);
231      // Combine
232      const __m128i r0 = _mm_packs_epi32(s0, s1);
233      const __m128i r1 = _mm_packs_epi32(s2, s3);
234      // Add/substract
235      const __m128i x0 = _mm_add_epi16(q4, r0);
236      const __m128i x1 = _mm_sub_epi16(q4, r0);
237      const __m128i x2 = _mm_sub_epi16(q7, r1);
238      const __m128i x3 = _mm_add_epi16(q7, r1);
239      // Interleave to do the multiply by constants which gets us into 32bits
240      const __m128i t0 = _mm_unpacklo_epi16(x0, x3);
241      const __m128i t1 = _mm_unpackhi_epi16(x0, x3);
242      const __m128i t2 = _mm_unpacklo_epi16(x1, x2);
243      const __m128i t3 = _mm_unpackhi_epi16(x1, x2);
244      const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p28_p04);
245      const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p28_p04);
246      const __m128i u2 = _mm_madd_epi16(t0, k__cospi_m04_p28);
247      const __m128i u3 = _mm_madd_epi16(t1, k__cospi_m04_p28);
248      const __m128i u4 = _mm_madd_epi16(t2, k__cospi_p12_p20);
249      const __m128i u5 = _mm_madd_epi16(t3, k__cospi_p12_p20);
250      const __m128i u6 = _mm_madd_epi16(t2, k__cospi_m20_p12);
251      const __m128i u7 = _mm_madd_epi16(t3, k__cospi_m20_p12);
252      // dct_const_round_shift
253      const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
254      const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
255      const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
256      const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
257      const __m128i v4 = _mm_add_epi32(u4, k__DCT_CONST_ROUNDING);
258      const __m128i v5 = _mm_add_epi32(u5, k__DCT_CONST_ROUNDING);
259      const __m128i v6 = _mm_add_epi32(u6, k__DCT_CONST_ROUNDING);
260      const __m128i v7 = _mm_add_epi32(u7, k__DCT_CONST_ROUNDING);
261      const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
262      const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
263      const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
264      const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
265      const __m128i w4 = _mm_srai_epi32(v4, DCT_CONST_BITS);
266      const __m128i w5 = _mm_srai_epi32(v5, DCT_CONST_BITS);
267      const __m128i w6 = _mm_srai_epi32(v6, DCT_CONST_BITS);
268      const __m128i w7 = _mm_srai_epi32(v7, DCT_CONST_BITS);
269      // Combine
270      res1 = _mm_packs_epi32(w0, w1);
271      res7 = _mm_packs_epi32(w2, w3);
272      res5 = _mm_packs_epi32(w4, w5);
273      res3 = _mm_packs_epi32(w6, w7);
274    }
275    // Transpose the 8x8.
276    {
277      // 00 01 02 03 04 05 06 07
278      // 10 11 12 13 14 15 16 17
279      // 20 21 22 23 24 25 26 27
280      // 30 31 32 33 34 35 36 37
281      // 40 41 42 43 44 45 46 47
282      // 50 51 52 53 54 55 56 57
283      // 60 61 62 63 64 65 66 67
284      // 70 71 72 73 74 75 76 77
285      const __m128i tr0_0 = _mm_unpacklo_epi16(res0, res1);
286      const __m128i tr0_1 = _mm_unpacklo_epi16(res2, res3);
287      const __m128i tr0_2 = _mm_unpackhi_epi16(res0, res1);
288      const __m128i tr0_3 = _mm_unpackhi_epi16(res2, res3);
289      const __m128i tr0_4 = _mm_unpacklo_epi16(res4, res5);
290      const __m128i tr0_5 = _mm_unpacklo_epi16(res6, res7);
291      const __m128i tr0_6 = _mm_unpackhi_epi16(res4, res5);
292      const __m128i tr0_7 = _mm_unpackhi_epi16(res6, res7);
293      // 00 10 01 11 02 12 03 13
294      // 20 30 21 31 22 32 23 33
295      // 04 14 05 15 06 16 07 17
296      // 24 34 25 35 26 36 27 37
297      // 40 50 41 51 42 52 43 53
298      // 60 70 61 71 62 72 63 73
299      // 54 54 55 55 56 56 57 57
300      // 64 74 65 75 66 76 67 77
301      const __m128i tr1_0 = _mm_unpacklo_epi32(tr0_0, tr0_1);
302      const __m128i tr1_1 = _mm_unpacklo_epi32(tr0_2, tr0_3);
303      const __m128i tr1_2 = _mm_unpackhi_epi32(tr0_0, tr0_1);
304      const __m128i tr1_3 = _mm_unpackhi_epi32(tr0_2, tr0_3);
305      const __m128i tr1_4 = _mm_unpacklo_epi32(tr0_4, tr0_5);
306      const __m128i tr1_5 = _mm_unpacklo_epi32(tr0_6, tr0_7);
307      const __m128i tr1_6 = _mm_unpackhi_epi32(tr0_4, tr0_5);
308      const __m128i tr1_7 = _mm_unpackhi_epi32(tr0_6, tr0_7);
309      // 00 10 20 30 01 11 21 31
310      // 40 50 60 70 41 51 61 71
311      // 02 12 22 32 03 13 23 33
312      // 42 52 62 72 43 53 63 73
313      // 04 14 24 34 05 15 21 36
314      // 44 54 64 74 45 55 61 76
315      // 06 16 26 36 07 17 27 37
316      // 46 56 66 76 47 57 67 77
317      in0 = _mm_unpacklo_epi64(tr1_0, tr1_4);
318      in1 = _mm_unpackhi_epi64(tr1_0, tr1_4);
319      in2 = _mm_unpacklo_epi64(tr1_2, tr1_6);
320      in3 = _mm_unpackhi_epi64(tr1_2, tr1_6);
321      in4 = _mm_unpacklo_epi64(tr1_1, tr1_5);
322      in5 = _mm_unpackhi_epi64(tr1_1, tr1_5);
323      in6 = _mm_unpacklo_epi64(tr1_3, tr1_7);
324      in7 = _mm_unpackhi_epi64(tr1_3, tr1_7);
325      // 00 10 20 30 40 50 60 70
326      // 01 11 21 31 41 51 61 71
327      // 02 12 22 32 42 52 62 72
328      // 03 13 23 33 43 53 63 73
329      // 04 14 24 34 44 54 64 74
330      // 05 15 25 35 45 55 65 75
331      // 06 16 26 36 46 56 66 76
332      // 07 17 27 37 47 57 67 77
333    }
334  }
335  // Post-condition output and store it
336  {
337    // Post-condition (division by two)
338    //    division of two 16 bits signed numbers using shifts
339    //    n / 2 = (n - (n >> 15)) >> 1
340    const __m128i sign_in0 = _mm_srai_epi16(in0, 15);
341    const __m128i sign_in1 = _mm_srai_epi16(in1, 15);
342    const __m128i sign_in2 = _mm_srai_epi16(in2, 15);
343    const __m128i sign_in3 = _mm_srai_epi16(in3, 15);
344    const __m128i sign_in4 = _mm_srai_epi16(in4, 15);
345    const __m128i sign_in5 = _mm_srai_epi16(in5, 15);
346    const __m128i sign_in6 = _mm_srai_epi16(in6, 15);
347    const __m128i sign_in7 = _mm_srai_epi16(in7, 15);
348    in0 = _mm_sub_epi16(in0, sign_in0);
349    in1 = _mm_sub_epi16(in1, sign_in1);
350    in2 = _mm_sub_epi16(in2, sign_in2);
351    in3 = _mm_sub_epi16(in3, sign_in3);
352    in4 = _mm_sub_epi16(in4, sign_in4);
353    in5 = _mm_sub_epi16(in5, sign_in5);
354    in6 = _mm_sub_epi16(in6, sign_in6);
355    in7 = _mm_sub_epi16(in7, sign_in7);
356    in0 = _mm_srai_epi16(in0, 1);
357    in1 = _mm_srai_epi16(in1, 1);
358    in2 = _mm_srai_epi16(in2, 1);
359    in3 = _mm_srai_epi16(in3, 1);
360    in4 = _mm_srai_epi16(in4, 1);
361    in5 = _mm_srai_epi16(in5, 1);
362    in6 = _mm_srai_epi16(in6, 1);
363    in7 = _mm_srai_epi16(in7, 1);
364    // store results
365    _mm_storeu_si128((__m128i *)(output + 0 * 8), in0);
366    _mm_storeu_si128((__m128i *)(output + 1 * 8), in1);
367    _mm_storeu_si128((__m128i *)(output + 2 * 8), in2);
368    _mm_storeu_si128((__m128i *)(output + 3 * 8), in3);
369    _mm_storeu_si128((__m128i *)(output + 4 * 8), in4);
370    _mm_storeu_si128((__m128i *)(output + 5 * 8), in5);
371    _mm_storeu_si128((__m128i *)(output + 6 * 8), in6);
372    _mm_storeu_si128((__m128i *)(output + 7 * 8), in7);
373  }
374}
375
376void vp9_short_fdct16x16_sse2(int16_t *input, int16_t *output, int pitch) {
377  // The 2D transform is done with two passes which are actually pretty
378  // similar. In the first one, we transform the columns and transpose
379  // the results. In the second one, we transform the rows. To achieve that,
380  // as the first pass results are transposed, we tranpose the columns (that
381  // is the transposed rows) and transpose the results (so that it goes back
382  // in normal/row positions).
383  const int stride = pitch >> 1;
384  int pass;
385  // We need an intermediate buffer between passes.
386  int16_t intermediate[256];
387  int16_t *in = input;
388  int16_t *out = intermediate;
389  // Constants
390  //    When we use them, in one case, they are all the same. In all others
391  //    it's a pair of them that we need to repeat four times. This is done
392  //    by constructing the 32 bit constant corresponding to that pair.
393  const __m128i k__cospi_p16_p16 = _mm_set1_epi16(cospi_16_64);
394  const __m128i k__cospi_p16_m16 = pair_set_epi16(cospi_16_64, -cospi_16_64);
395  const __m128i k__cospi_p24_p08 = pair_set_epi16(cospi_24_64, cospi_8_64);
396  const __m128i k__cospi_m24_m08 = pair_set_epi16(-cospi_24_64, -cospi_8_64);
397  const __m128i k__cospi_m08_p24 = pair_set_epi16(-cospi_8_64, cospi_24_64);
398  const __m128i k__cospi_p28_p04 = pair_set_epi16(cospi_28_64, cospi_4_64);
399  const __m128i k__cospi_m04_p28 = pair_set_epi16(-cospi_4_64, cospi_28_64);
400  const __m128i k__cospi_p12_p20 = pair_set_epi16(cospi_12_64, cospi_20_64);
401  const __m128i k__cospi_m20_p12 = pair_set_epi16(-cospi_20_64, cospi_12_64);
402  const __m128i k__cospi_p30_p02 = pair_set_epi16(cospi_30_64, cospi_2_64);
403  const __m128i k__cospi_p14_p18 = pair_set_epi16(cospi_14_64, cospi_18_64);
404  const __m128i k__cospi_m02_p30 = pair_set_epi16(-cospi_2_64, cospi_30_64);
405  const __m128i k__cospi_m18_p14 = pair_set_epi16(-cospi_18_64, cospi_14_64);
406  const __m128i k__cospi_p22_p10 = pair_set_epi16(cospi_22_64, cospi_10_64);
407  const __m128i k__cospi_p06_p26 = pair_set_epi16(cospi_6_64, cospi_26_64);
408  const __m128i k__cospi_m10_p22 = pair_set_epi16(-cospi_10_64, cospi_22_64);
409  const __m128i k__cospi_m26_p06 = pair_set_epi16(-cospi_26_64, cospi_6_64);
410  const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
411  const __m128i kOne = _mm_set1_epi16(1);
412  // Do the two transform/transpose passes
413  for (pass = 0; pass < 2; ++pass) {
414    // We process eight columns (transposed rows in second pass) at a time.
415    int column_start;
416    for (column_start = 0; column_start < 16; column_start += 8) {
417      __m128i in00, in01, in02, in03, in04, in05, in06, in07;
418      __m128i in08, in09, in10, in11, in12, in13, in14, in15;
419      __m128i input0, input1, input2, input3, input4, input5, input6, input7;
420      __m128i step1_0, step1_1, step1_2, step1_3;
421      __m128i step1_4, step1_5, step1_6, step1_7;
422      __m128i step2_1, step2_2, step2_3, step2_4, step2_5, step2_6;
423      __m128i step3_0, step3_1, step3_2, step3_3;
424      __m128i step3_4, step3_5, step3_6, step3_7;
425      __m128i res00, res01, res02, res03, res04, res05, res06, res07;
426      __m128i res08, res09, res10, res11, res12, res13, res14, res15;
427      // Load and pre-condition input.
428      if (0 == pass) {
429        in00  = _mm_loadu_si128((const __m128i *)(in +  0 * stride));
430        in01  = _mm_loadu_si128((const __m128i *)(in +  1 * stride));
431        in02  = _mm_loadu_si128((const __m128i *)(in +  2 * stride));
432        in03  = _mm_loadu_si128((const __m128i *)(in +  3 * stride));
433        in04  = _mm_loadu_si128((const __m128i *)(in +  4 * stride));
434        in05  = _mm_loadu_si128((const __m128i *)(in +  5 * stride));
435        in06  = _mm_loadu_si128((const __m128i *)(in +  6 * stride));
436        in07  = _mm_loadu_si128((const __m128i *)(in +  7 * stride));
437        in08  = _mm_loadu_si128((const __m128i *)(in +  8 * stride));
438        in09  = _mm_loadu_si128((const __m128i *)(in +  9 * stride));
439        in10  = _mm_loadu_si128((const __m128i *)(in + 10 * stride));
440        in11  = _mm_loadu_si128((const __m128i *)(in + 11 * stride));
441        in12  = _mm_loadu_si128((const __m128i *)(in + 12 * stride));
442        in13  = _mm_loadu_si128((const __m128i *)(in + 13 * stride));
443        in14  = _mm_loadu_si128((const __m128i *)(in + 14 * stride));
444        in15  = _mm_loadu_si128((const __m128i *)(in + 15 * stride));
445        // x = x << 2
446        in00 = _mm_slli_epi16(in00, 2);
447        in01 = _mm_slli_epi16(in01, 2);
448        in02 = _mm_slli_epi16(in02, 2);
449        in03 = _mm_slli_epi16(in03, 2);
450        in04 = _mm_slli_epi16(in04, 2);
451        in05 = _mm_slli_epi16(in05, 2);
452        in06 = _mm_slli_epi16(in06, 2);
453        in07 = _mm_slli_epi16(in07, 2);
454        in08 = _mm_slli_epi16(in08, 2);
455        in09 = _mm_slli_epi16(in09, 2);
456        in10 = _mm_slli_epi16(in10, 2);
457        in11 = _mm_slli_epi16(in11, 2);
458        in12 = _mm_slli_epi16(in12, 2);
459        in13 = _mm_slli_epi16(in13, 2);
460        in14 = _mm_slli_epi16(in14, 2);
461        in15 = _mm_slli_epi16(in15, 2);
462      } else {
463        in00  = _mm_loadu_si128((const __m128i *)(in +  0 * 16));
464        in01  = _mm_loadu_si128((const __m128i *)(in +  1 * 16));
465        in02  = _mm_loadu_si128((const __m128i *)(in +  2 * 16));
466        in03  = _mm_loadu_si128((const __m128i *)(in +  3 * 16));
467        in04  = _mm_loadu_si128((const __m128i *)(in +  4 * 16));
468        in05  = _mm_loadu_si128((const __m128i *)(in +  5 * 16));
469        in06  = _mm_loadu_si128((const __m128i *)(in +  6 * 16));
470        in07  = _mm_loadu_si128((const __m128i *)(in +  7 * 16));
471        in08  = _mm_loadu_si128((const __m128i *)(in +  8 * 16));
472        in09  = _mm_loadu_si128((const __m128i *)(in +  9 * 16));
473        in10  = _mm_loadu_si128((const __m128i *)(in + 10 * 16));
474        in11  = _mm_loadu_si128((const __m128i *)(in + 11 * 16));
475        in12  = _mm_loadu_si128((const __m128i *)(in + 12 * 16));
476        in13  = _mm_loadu_si128((const __m128i *)(in + 13 * 16));
477        in14  = _mm_loadu_si128((const __m128i *)(in + 14 * 16));
478        in15  = _mm_loadu_si128((const __m128i *)(in + 15 * 16));
479        // x = (x + 1) >> 2
480        in00 = _mm_add_epi16(in00, kOne);
481        in01 = _mm_add_epi16(in01, kOne);
482        in02 = _mm_add_epi16(in02, kOne);
483        in03 = _mm_add_epi16(in03, kOne);
484        in04 = _mm_add_epi16(in04, kOne);
485        in05 = _mm_add_epi16(in05, kOne);
486        in06 = _mm_add_epi16(in06, kOne);
487        in07 = _mm_add_epi16(in07, kOne);
488        in08 = _mm_add_epi16(in08, kOne);
489        in09 = _mm_add_epi16(in09, kOne);
490        in10 = _mm_add_epi16(in10, kOne);
491        in11 = _mm_add_epi16(in11, kOne);
492        in12 = _mm_add_epi16(in12, kOne);
493        in13 = _mm_add_epi16(in13, kOne);
494        in14 = _mm_add_epi16(in14, kOne);
495        in15 = _mm_add_epi16(in15, kOne);
496        in00 = _mm_srai_epi16(in00, 2);
497        in01 = _mm_srai_epi16(in01, 2);
498        in02 = _mm_srai_epi16(in02, 2);
499        in03 = _mm_srai_epi16(in03, 2);
500        in04 = _mm_srai_epi16(in04, 2);
501        in05 = _mm_srai_epi16(in05, 2);
502        in06 = _mm_srai_epi16(in06, 2);
503        in07 = _mm_srai_epi16(in07, 2);
504        in08 = _mm_srai_epi16(in08, 2);
505        in09 = _mm_srai_epi16(in09, 2);
506        in10 = _mm_srai_epi16(in10, 2);
507        in11 = _mm_srai_epi16(in11, 2);
508        in12 = _mm_srai_epi16(in12, 2);
509        in13 = _mm_srai_epi16(in13, 2);
510        in14 = _mm_srai_epi16(in14, 2);
511        in15 = _mm_srai_epi16(in15, 2);
512      }
513      in += 8;
514      // Calculate input for the first 8 results.
515      {
516        input0 = _mm_add_epi16(in00, in15);
517        input1 = _mm_add_epi16(in01, in14);
518        input2 = _mm_add_epi16(in02, in13);
519        input3 = _mm_add_epi16(in03, in12);
520        input4 = _mm_add_epi16(in04, in11);
521        input5 = _mm_add_epi16(in05, in10);
522        input6 = _mm_add_epi16(in06, in09);
523        input7 = _mm_add_epi16(in07, in08);
524      }
525      // Calculate input for the next 8 results.
526      {
527        step1_0 = _mm_sub_epi16(in07, in08);
528        step1_1 = _mm_sub_epi16(in06, in09);
529        step1_2 = _mm_sub_epi16(in05, in10);
530        step1_3 = _mm_sub_epi16(in04, in11);
531        step1_4 = _mm_sub_epi16(in03, in12);
532        step1_5 = _mm_sub_epi16(in02, in13);
533        step1_6 = _mm_sub_epi16(in01, in14);
534        step1_7 = _mm_sub_epi16(in00, in15);
535      }
536      // Work on the first eight values; fdct8_1d(input, even_results);
537      {
538        // Add/substract
539        const __m128i q0 = _mm_add_epi16(input0, input7);
540        const __m128i q1 = _mm_add_epi16(input1, input6);
541        const __m128i q2 = _mm_add_epi16(input2, input5);
542        const __m128i q3 = _mm_add_epi16(input3, input4);
543        const __m128i q4 = _mm_sub_epi16(input3, input4);
544        const __m128i q5 = _mm_sub_epi16(input2, input5);
545        const __m128i q6 = _mm_sub_epi16(input1, input6);
546        const __m128i q7 = _mm_sub_epi16(input0, input7);
547        // Work on first four results
548        {
549          // Add/substract
550          const __m128i r0 = _mm_add_epi16(q0, q3);
551          const __m128i r1 = _mm_add_epi16(q1, q2);
552          const __m128i r2 = _mm_sub_epi16(q1, q2);
553          const __m128i r3 = _mm_sub_epi16(q0, q3);
554          // Interleave to do the multiply by constants which gets us
555          // into 32 bits.
556          const __m128i t0 = _mm_unpacklo_epi16(r0, r1);
557          const __m128i t1 = _mm_unpackhi_epi16(r0, r1);
558          const __m128i t2 = _mm_unpacklo_epi16(r2, r3);
559          const __m128i t3 = _mm_unpackhi_epi16(r2, r3);
560          const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p16_p16);
561          const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p16_p16);
562          const __m128i u2 = _mm_madd_epi16(t0, k__cospi_p16_m16);
563          const __m128i u3 = _mm_madd_epi16(t1, k__cospi_p16_m16);
564          const __m128i u4 = _mm_madd_epi16(t2, k__cospi_p24_p08);
565          const __m128i u5 = _mm_madd_epi16(t3, k__cospi_p24_p08);
566          const __m128i u6 = _mm_madd_epi16(t2, k__cospi_m08_p24);
567          const __m128i u7 = _mm_madd_epi16(t3, k__cospi_m08_p24);
568          // dct_const_round_shift
569          const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
570          const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
571          const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
572          const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
573          const __m128i v4 = _mm_add_epi32(u4, k__DCT_CONST_ROUNDING);
574          const __m128i v5 = _mm_add_epi32(u5, k__DCT_CONST_ROUNDING);
575          const __m128i v6 = _mm_add_epi32(u6, k__DCT_CONST_ROUNDING);
576          const __m128i v7 = _mm_add_epi32(u7, k__DCT_CONST_ROUNDING);
577          const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
578          const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
579          const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
580          const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
581          const __m128i w4 = _mm_srai_epi32(v4, DCT_CONST_BITS);
582          const __m128i w5 = _mm_srai_epi32(v5, DCT_CONST_BITS);
583          const __m128i w6 = _mm_srai_epi32(v6, DCT_CONST_BITS);
584          const __m128i w7 = _mm_srai_epi32(v7, DCT_CONST_BITS);
585          // Combine
586          res00 = _mm_packs_epi32(w0, w1);
587          res08 = _mm_packs_epi32(w2, w3);
588          res04 = _mm_packs_epi32(w4, w5);
589          res12 = _mm_packs_epi32(w6, w7);
590        }
591        // Work on next four results
592        {
593          // Interleave to do the multiply by constants which gets us
594          // into 32 bits.
595          const __m128i d0 = _mm_unpacklo_epi16(q6, q5);
596          const __m128i d1 = _mm_unpackhi_epi16(q6, q5);
597          const __m128i e0 = _mm_madd_epi16(d0, k__cospi_p16_m16);
598          const __m128i e1 = _mm_madd_epi16(d1, k__cospi_p16_m16);
599          const __m128i e2 = _mm_madd_epi16(d0, k__cospi_p16_p16);
600          const __m128i e3 = _mm_madd_epi16(d1, k__cospi_p16_p16);
601          // dct_const_round_shift
602          const __m128i f0 = _mm_add_epi32(e0, k__DCT_CONST_ROUNDING);
603          const __m128i f1 = _mm_add_epi32(e1, k__DCT_CONST_ROUNDING);
604          const __m128i f2 = _mm_add_epi32(e2, k__DCT_CONST_ROUNDING);
605          const __m128i f3 = _mm_add_epi32(e3, k__DCT_CONST_ROUNDING);
606          const __m128i s0 = _mm_srai_epi32(f0, DCT_CONST_BITS);
607          const __m128i s1 = _mm_srai_epi32(f1, DCT_CONST_BITS);
608          const __m128i s2 = _mm_srai_epi32(f2, DCT_CONST_BITS);
609          const __m128i s3 = _mm_srai_epi32(f3, DCT_CONST_BITS);
610          // Combine
611          const __m128i r0 = _mm_packs_epi32(s0, s1);
612          const __m128i r1 = _mm_packs_epi32(s2, s3);
613          // Add/substract
614          const __m128i x0 = _mm_add_epi16(q4, r0);
615          const __m128i x1 = _mm_sub_epi16(q4, r0);
616          const __m128i x2 = _mm_sub_epi16(q7, r1);
617          const __m128i x3 = _mm_add_epi16(q7, r1);
618          // Interleave to do the multiply by constants which gets us
619          // into 32 bits.
620          const __m128i t0 = _mm_unpacklo_epi16(x0, x3);
621          const __m128i t1 = _mm_unpackhi_epi16(x0, x3);
622          const __m128i t2 = _mm_unpacklo_epi16(x1, x2);
623          const __m128i t3 = _mm_unpackhi_epi16(x1, x2);
624          const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p28_p04);
625          const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p28_p04);
626          const __m128i u2 = _mm_madd_epi16(t0, k__cospi_m04_p28);
627          const __m128i u3 = _mm_madd_epi16(t1, k__cospi_m04_p28);
628          const __m128i u4 = _mm_madd_epi16(t2, k__cospi_p12_p20);
629          const __m128i u5 = _mm_madd_epi16(t3, k__cospi_p12_p20);
630          const __m128i u6 = _mm_madd_epi16(t2, k__cospi_m20_p12);
631          const __m128i u7 = _mm_madd_epi16(t3, k__cospi_m20_p12);
632          // dct_const_round_shift
633          const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
634          const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
635          const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
636          const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
637          const __m128i v4 = _mm_add_epi32(u4, k__DCT_CONST_ROUNDING);
638          const __m128i v5 = _mm_add_epi32(u5, k__DCT_CONST_ROUNDING);
639          const __m128i v6 = _mm_add_epi32(u6, k__DCT_CONST_ROUNDING);
640          const __m128i v7 = _mm_add_epi32(u7, k__DCT_CONST_ROUNDING);
641          const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
642          const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
643          const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
644          const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
645          const __m128i w4 = _mm_srai_epi32(v4, DCT_CONST_BITS);
646          const __m128i w5 = _mm_srai_epi32(v5, DCT_CONST_BITS);
647          const __m128i w6 = _mm_srai_epi32(v6, DCT_CONST_BITS);
648          const __m128i w7 = _mm_srai_epi32(v7, DCT_CONST_BITS);
649          // Combine
650          res02 = _mm_packs_epi32(w0, w1);
651          res14 = _mm_packs_epi32(w2, w3);
652          res10 = _mm_packs_epi32(w4, w5);
653          res06 = _mm_packs_epi32(w6, w7);
654        }
655      }
656      // Work on the next eight values; step1 -> odd_results
657      {
658        // step 2
659        {
660          const __m128i t0 = _mm_unpacklo_epi16(step1_5, step1_2);
661          const __m128i t1 = _mm_unpackhi_epi16(step1_5, step1_2);
662          const __m128i t2 = _mm_unpacklo_epi16(step1_4, step1_3);
663          const __m128i t3 = _mm_unpackhi_epi16(step1_4, step1_3);
664          const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p16_m16);
665          const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p16_m16);
666          const __m128i u2 = _mm_madd_epi16(t2, k__cospi_p16_m16);
667          const __m128i u3 = _mm_madd_epi16(t3, k__cospi_p16_m16);
668          // dct_const_round_shift
669          const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
670          const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
671          const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
672          const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
673          const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
674          const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
675          const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
676          const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
677          // Combine
678          step2_2 = _mm_packs_epi32(w0, w1);
679          step2_3 = _mm_packs_epi32(w2, w3);
680        }
681        {
682          const __m128i t0 = _mm_unpacklo_epi16(step1_5, step1_2);
683          const __m128i t1 = _mm_unpackhi_epi16(step1_5, step1_2);
684          const __m128i t2 = _mm_unpacklo_epi16(step1_4, step1_3);
685          const __m128i t3 = _mm_unpackhi_epi16(step1_4, step1_3);
686          const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p16_p16);
687          const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p16_p16);
688          const __m128i u2 = _mm_madd_epi16(t2, k__cospi_p16_p16);
689          const __m128i u3 = _mm_madd_epi16(t3, k__cospi_p16_p16);
690          // dct_const_round_shift
691          const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
692          const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
693          const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
694          const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
695          const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
696          const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
697          const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
698          const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
699          // Combine
700          step2_5 = _mm_packs_epi32(w0, w1);
701          step2_4 = _mm_packs_epi32(w2, w3);
702        }
703        // step 3
704        {
705          step3_0 = _mm_add_epi16(step1_0, step2_3);
706          step3_1 = _mm_add_epi16(step1_1, step2_2);
707          step3_2 = _mm_sub_epi16(step1_1, step2_2);
708          step3_3 = _mm_sub_epi16(step1_0, step2_3);
709          step3_4 = _mm_sub_epi16(step1_7, step2_4);
710          step3_5 = _mm_sub_epi16(step1_6, step2_5);
711          step3_6 = _mm_add_epi16(step1_6, step2_5);
712          step3_7 = _mm_add_epi16(step1_7, step2_4);
713        }
714        // step 4
715        {
716          const __m128i t0 = _mm_unpacklo_epi16(step3_1, step3_6);
717          const __m128i t1 = _mm_unpackhi_epi16(step3_1, step3_6);
718          const __m128i t2 = _mm_unpacklo_epi16(step3_2, step3_5);
719          const __m128i t3 = _mm_unpackhi_epi16(step3_2, step3_5);
720          const __m128i u0 = _mm_madd_epi16(t0, k__cospi_m08_p24);
721          const __m128i u1 = _mm_madd_epi16(t1, k__cospi_m08_p24);
722          const __m128i u2 = _mm_madd_epi16(t2, k__cospi_m24_m08);
723          const __m128i u3 = _mm_madd_epi16(t3, k__cospi_m24_m08);
724          // dct_const_round_shift
725          const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
726          const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
727          const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
728          const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
729          const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
730          const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
731          const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
732          const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
733          // Combine
734          step2_1 = _mm_packs_epi32(w0, w1);
735          step2_2 = _mm_packs_epi32(w2, w3);
736        }
737        {
738          const __m128i t0 = _mm_unpacklo_epi16(step3_1, step3_6);
739          const __m128i t1 = _mm_unpackhi_epi16(step3_1, step3_6);
740          const __m128i t2 = _mm_unpacklo_epi16(step3_2, step3_5);
741          const __m128i t3 = _mm_unpackhi_epi16(step3_2, step3_5);
742          const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p24_p08);
743          const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p24_p08);
744          const __m128i u2 = _mm_madd_epi16(t2, k__cospi_m08_p24);
745          const __m128i u3 = _mm_madd_epi16(t3, k__cospi_m08_p24);
746          // dct_const_round_shift
747          const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
748          const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
749          const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
750          const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
751          const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
752          const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
753          const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
754          const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
755          // Combine
756          step2_6 = _mm_packs_epi32(w0, w1);
757          step2_5 = _mm_packs_epi32(w2, w3);
758        }
759        // step 5
760        {
761          step1_0 = _mm_add_epi16(step3_0, step2_1);
762          step1_1 = _mm_sub_epi16(step3_0, step2_1);
763          step1_2 = _mm_sub_epi16(step3_3, step2_2);
764          step1_3 = _mm_add_epi16(step3_3, step2_2);
765          step1_4 = _mm_add_epi16(step3_4, step2_5);
766          step1_5 = _mm_sub_epi16(step3_4, step2_5);
767          step1_6 = _mm_sub_epi16(step3_7, step2_6);
768          step1_7 = _mm_add_epi16(step3_7, step2_6);
769        }
770        // step 6
771        {
772          const __m128i t0 = _mm_unpacklo_epi16(step1_0, step1_7);
773          const __m128i t1 = _mm_unpackhi_epi16(step1_0, step1_7);
774          const __m128i t2 = _mm_unpacklo_epi16(step1_1, step1_6);
775          const __m128i t3 = _mm_unpackhi_epi16(step1_1, step1_6);
776          const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p30_p02);
777          const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p30_p02);
778          const __m128i u2 = _mm_madd_epi16(t2, k__cospi_p14_p18);
779          const __m128i u3 = _mm_madd_epi16(t3, k__cospi_p14_p18);
780          // dct_const_round_shift
781          const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
782          const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
783          const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
784          const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
785          const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
786          const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
787          const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
788          const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
789          // Combine
790          res01 = _mm_packs_epi32(w0, w1);
791          res09 = _mm_packs_epi32(w2, w3);
792        }
793        {
794          const __m128i t0 = _mm_unpacklo_epi16(step1_2, step1_5);
795          const __m128i t1 = _mm_unpackhi_epi16(step1_2, step1_5);
796          const __m128i t2 = _mm_unpacklo_epi16(step1_3, step1_4);
797          const __m128i t3 = _mm_unpackhi_epi16(step1_3, step1_4);
798          const __m128i u0 = _mm_madd_epi16(t0, k__cospi_p22_p10);
799          const __m128i u1 = _mm_madd_epi16(t1, k__cospi_p22_p10);
800          const __m128i u2 = _mm_madd_epi16(t2, k__cospi_p06_p26);
801          const __m128i u3 = _mm_madd_epi16(t3, k__cospi_p06_p26);
802          // dct_const_round_shift
803          const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
804          const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
805          const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
806          const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
807          const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
808          const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
809          const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
810          const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
811          // Combine
812          res05 = _mm_packs_epi32(w0, w1);
813          res13 = _mm_packs_epi32(w2, w3);
814        }
815        {
816          const __m128i t0 = _mm_unpacklo_epi16(step1_2, step1_5);
817          const __m128i t1 = _mm_unpackhi_epi16(step1_2, step1_5);
818          const __m128i t2 = _mm_unpacklo_epi16(step1_3, step1_4);
819          const __m128i t3 = _mm_unpackhi_epi16(step1_3, step1_4);
820          const __m128i u0 = _mm_madd_epi16(t0, k__cospi_m10_p22);
821          const __m128i u1 = _mm_madd_epi16(t1, k__cospi_m10_p22);
822          const __m128i u2 = _mm_madd_epi16(t2, k__cospi_m26_p06);
823          const __m128i u3 = _mm_madd_epi16(t3, k__cospi_m26_p06);
824          // dct_const_round_shift
825          const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
826          const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
827          const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
828          const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
829          const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
830          const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
831          const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
832          const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
833          // Combine
834          res11 = _mm_packs_epi32(w0, w1);
835          res03 = _mm_packs_epi32(w2, w3);
836        }
837        {
838          const __m128i t0 = _mm_unpacklo_epi16(step1_0, step1_7);
839          const __m128i t1 = _mm_unpackhi_epi16(step1_0, step1_7);
840          const __m128i t2 = _mm_unpacklo_epi16(step1_1, step1_6);
841          const __m128i t3 = _mm_unpackhi_epi16(step1_1, step1_6);
842          const __m128i u0 = _mm_madd_epi16(t0, k__cospi_m02_p30);
843          const __m128i u1 = _mm_madd_epi16(t1, k__cospi_m02_p30);
844          const __m128i u2 = _mm_madd_epi16(t2, k__cospi_m18_p14);
845          const __m128i u3 = _mm_madd_epi16(t3, k__cospi_m18_p14);
846          // dct_const_round_shift
847          const __m128i v0 = _mm_add_epi32(u0, k__DCT_CONST_ROUNDING);
848          const __m128i v1 = _mm_add_epi32(u1, k__DCT_CONST_ROUNDING);
849          const __m128i v2 = _mm_add_epi32(u2, k__DCT_CONST_ROUNDING);
850          const __m128i v3 = _mm_add_epi32(u3, k__DCT_CONST_ROUNDING);
851          const __m128i w0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
852          const __m128i w1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
853          const __m128i w2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
854          const __m128i w3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
855          // Combine
856          res15 = _mm_packs_epi32(w0, w1);
857          res07 = _mm_packs_epi32(w2, w3);
858        }
859      }
860      // Transpose the results, do it as two 8x8 transposes.
861      {
862        // 00 01 02 03 04 05 06 07
863        // 10 11 12 13 14 15 16 17
864        // 20 21 22 23 24 25 26 27
865        // 30 31 32 33 34 35 36 37
866        // 40 41 42 43 44 45 46 47
867        // 50 51 52 53 54 55 56 57
868        // 60 61 62 63 64 65 66 67
869        // 70 71 72 73 74 75 76 77
870        const __m128i tr0_0 = _mm_unpacklo_epi16(res00, res01);
871        const __m128i tr0_1 = _mm_unpacklo_epi16(res02, res03);
872        const __m128i tr0_2 = _mm_unpackhi_epi16(res00, res01);
873        const __m128i tr0_3 = _mm_unpackhi_epi16(res02, res03);
874        const __m128i tr0_4 = _mm_unpacklo_epi16(res04, res05);
875        const __m128i tr0_5 = _mm_unpacklo_epi16(res06, res07);
876        const __m128i tr0_6 = _mm_unpackhi_epi16(res04, res05);
877        const __m128i tr0_7 = _mm_unpackhi_epi16(res06, res07);
878        // 00 10 01 11 02 12 03 13
879        // 20 30 21 31 22 32 23 33
880        // 04 14 05 15 06 16 07 17
881        // 24 34 25 35 26 36 27 37
882        // 40 50 41 51 42 52 43 53
883        // 60 70 61 71 62 72 63 73
884        // 54 54 55 55 56 56 57 57
885        // 64 74 65 75 66 76 67 77
886        const __m128i tr1_0 = _mm_unpacklo_epi32(tr0_0, tr0_1);
887        const __m128i tr1_1 = _mm_unpacklo_epi32(tr0_2, tr0_3);
888        const __m128i tr1_2 = _mm_unpackhi_epi32(tr0_0, tr0_1);
889        const __m128i tr1_3 = _mm_unpackhi_epi32(tr0_2, tr0_3);
890        const __m128i tr1_4 = _mm_unpacklo_epi32(tr0_4, tr0_5);
891        const __m128i tr1_5 = _mm_unpacklo_epi32(tr0_6, tr0_7);
892        const __m128i tr1_6 = _mm_unpackhi_epi32(tr0_4, tr0_5);
893        const __m128i tr1_7 = _mm_unpackhi_epi32(tr0_6, tr0_7);
894        // 00 10 20 30 01 11 21 31
895        // 40 50 60 70 41 51 61 71
896        // 02 12 22 32 03 13 23 33
897        // 42 52 62 72 43 53 63 73
898        // 04 14 24 34 05 15 21 36
899        // 44 54 64 74 45 55 61 76
900        // 06 16 26 36 07 17 27 37
901        // 46 56 66 76 47 57 67 77
902        const __m128i tr2_0 = _mm_unpacklo_epi64(tr1_0, tr1_4);
903        const __m128i tr2_1 = _mm_unpackhi_epi64(tr1_0, tr1_4);
904        const __m128i tr2_2 = _mm_unpacklo_epi64(tr1_2, tr1_6);
905        const __m128i tr2_3 = _mm_unpackhi_epi64(tr1_2, tr1_6);
906        const __m128i tr2_4 = _mm_unpacklo_epi64(tr1_1, tr1_5);
907        const __m128i tr2_5 = _mm_unpackhi_epi64(tr1_1, tr1_5);
908        const __m128i tr2_6 = _mm_unpacklo_epi64(tr1_3, tr1_7);
909        const __m128i tr2_7 = _mm_unpackhi_epi64(tr1_3, tr1_7);
910        // 00 10 20 30 40 50 60 70
911        // 01 11 21 31 41 51 61 71
912        // 02 12 22 32 42 52 62 72
913        // 03 13 23 33 43 53 63 73
914        // 04 14 24 34 44 54 64 74
915        // 05 15 25 35 45 55 65 75
916        // 06 16 26 36 46 56 66 76
917        // 07 17 27 37 47 57 67 77
918        _mm_storeu_si128((__m128i *)(out + 0 * 16), tr2_0);
919        _mm_storeu_si128((__m128i *)(out + 1 * 16), tr2_1);
920        _mm_storeu_si128((__m128i *)(out + 2 * 16), tr2_2);
921        _mm_storeu_si128((__m128i *)(out + 3 * 16), tr2_3);
922        _mm_storeu_si128((__m128i *)(out + 4 * 16), tr2_4);
923        _mm_storeu_si128((__m128i *)(out + 5 * 16), tr2_5);
924        _mm_storeu_si128((__m128i *)(out + 6 * 16), tr2_6);
925        _mm_storeu_si128((__m128i *)(out + 7 * 16), tr2_7);
926      }
927      {
928        // 00 01 02 03 04 05 06 07
929        // 10 11 12 13 14 15 16 17
930        // 20 21 22 23 24 25 26 27
931        // 30 31 32 33 34 35 36 37
932        // 40 41 42 43 44 45 46 47
933        // 50 51 52 53 54 55 56 57
934        // 60 61 62 63 64 65 66 67
935        // 70 71 72 73 74 75 76 77
936        const __m128i tr0_0 = _mm_unpacklo_epi16(res08, res09);
937        const __m128i tr0_1 = _mm_unpacklo_epi16(res10, res11);
938        const __m128i tr0_2 = _mm_unpackhi_epi16(res08, res09);
939        const __m128i tr0_3 = _mm_unpackhi_epi16(res10, res11);
940        const __m128i tr0_4 = _mm_unpacklo_epi16(res12, res13);
941        const __m128i tr0_5 = _mm_unpacklo_epi16(res14, res15);
942        const __m128i tr0_6 = _mm_unpackhi_epi16(res12, res13);
943        const __m128i tr0_7 = _mm_unpackhi_epi16(res14, res15);
944        // 00 10 01 11 02 12 03 13
945        // 20 30 21 31 22 32 23 33
946        // 04 14 05 15 06 16 07 17
947        // 24 34 25 35 26 36 27 37
948        // 40 50 41 51 42 52 43 53
949        // 60 70 61 71 62 72 63 73
950        // 54 54 55 55 56 56 57 57
951        // 64 74 65 75 66 76 67 77
952        const __m128i tr1_0 = _mm_unpacklo_epi32(tr0_0, tr0_1);
953        const __m128i tr1_1 = _mm_unpacklo_epi32(tr0_2, tr0_3);
954        const __m128i tr1_2 = _mm_unpackhi_epi32(tr0_0, tr0_1);
955        const __m128i tr1_3 = _mm_unpackhi_epi32(tr0_2, tr0_3);
956        const __m128i tr1_4 = _mm_unpacklo_epi32(tr0_4, tr0_5);
957        const __m128i tr1_5 = _mm_unpacklo_epi32(tr0_6, tr0_7);
958        const __m128i tr1_6 = _mm_unpackhi_epi32(tr0_4, tr0_5);
959        const __m128i tr1_7 = _mm_unpackhi_epi32(tr0_6, tr0_7);
960        // 00 10 20 30 01 11 21 31
961        // 40 50 60 70 41 51 61 71
962        // 02 12 22 32 03 13 23 33
963        // 42 52 62 72 43 53 63 73
964        // 04 14 24 34 05 15 21 36
965        // 44 54 64 74 45 55 61 76
966        // 06 16 26 36 07 17 27 37
967        // 46 56 66 76 47 57 67 77
968        const __m128i tr2_0 = _mm_unpacklo_epi64(tr1_0, tr1_4);
969        const __m128i tr2_1 = _mm_unpackhi_epi64(tr1_0, tr1_4);
970        const __m128i tr2_2 = _mm_unpacklo_epi64(tr1_2, tr1_6);
971        const __m128i tr2_3 = _mm_unpackhi_epi64(tr1_2, tr1_6);
972        const __m128i tr2_4 = _mm_unpacklo_epi64(tr1_1, tr1_5);
973        const __m128i tr2_5 = _mm_unpackhi_epi64(tr1_1, tr1_5);
974        const __m128i tr2_6 = _mm_unpacklo_epi64(tr1_3, tr1_7);
975        const __m128i tr2_7 = _mm_unpackhi_epi64(tr1_3, tr1_7);
976        // 00 10 20 30 40 50 60 70
977        // 01 11 21 31 41 51 61 71
978        // 02 12 22 32 42 52 62 72
979        // 03 13 23 33 43 53 63 73
980        // 04 14 24 34 44 54 64 74
981        // 05 15 25 35 45 55 65 75
982        // 06 16 26 36 46 56 66 76
983        // 07 17 27 37 47 57 67 77
984        // Store results
985        _mm_storeu_si128((__m128i *)(out + 8 + 0 * 16), tr2_0);
986        _mm_storeu_si128((__m128i *)(out + 8 + 1 * 16), tr2_1);
987        _mm_storeu_si128((__m128i *)(out + 8 + 2 * 16), tr2_2);
988        _mm_storeu_si128((__m128i *)(out + 8 + 3 * 16), tr2_3);
989        _mm_storeu_si128((__m128i *)(out + 8 + 4 * 16), tr2_4);
990        _mm_storeu_si128((__m128i *)(out + 8 + 5 * 16), tr2_5);
991        _mm_storeu_si128((__m128i *)(out + 8 + 6 * 16), tr2_6);
992        _mm_storeu_si128((__m128i *)(out + 8 + 7 * 16), tr2_7);
993      }
994      out += 8*16;
995    }
996    // Setup in/out for next pass.
997    in = intermediate;
998    out = output;
999  }
1000}
1001