LCOV - code coverage report
Current view: top level - third_party/aom/aom_dsp/x86 - inv_txfm_sse2.c (source / functions) Hit Total Coverage
Test: output.info Lines: 0 2132 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 23 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2016, Alliance for Open Media. All rights reserved
       3             :  *
       4             :  * This source code is subject to the terms of the BSD 2 Clause License and
       5             :  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
       6             :  * was not distributed with this source code in the LICENSE file, you can
       7             :  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
       8             :  * Media Patent License 1.0 was not distributed with this source code in the
       9             :  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
      10             :  */
      11             : 
      12             : #include "./aom_dsp_rtcd.h"
      13             : #include "aom_dsp/x86/inv_txfm_sse2.h"
      14             : #include "aom_dsp/x86/txfm_common_sse2.h"
      15             : 
      16             : #define RECON_AND_STORE4X4(dest, in_x)                    \
      17             :   {                                                       \
      18             :     __m128i d0 = _mm_cvtsi32_si128(*(const int *)(dest)); \
      19             :     d0 = _mm_unpacklo_epi8(d0, zero);                     \
      20             :     d0 = _mm_add_epi16(in_x, d0);                         \
      21             :     d0 = _mm_packus_epi16(d0, d0);                        \
      22             :     *(int *)(dest) = _mm_cvtsi128_si32(d0);               \
      23             :   }
      24             : 
      25           0 : void aom_idct4x4_16_add_sse2(const tran_low_t *input, uint8_t *dest,
      26             :                              int stride) {
      27           0 :   const __m128i zero = _mm_setzero_si128();
      28           0 :   const __m128i eight = _mm_set1_epi16(8);
      29           0 :   const __m128i cst = _mm_setr_epi16(
      30           0 :       (int16_t)cospi_16_64, (int16_t)cospi_16_64, (int16_t)cospi_16_64,
      31           0 :       (int16_t)-cospi_16_64, (int16_t)cospi_24_64, (int16_t)-cospi_8_64,
      32           0 :       (int16_t)cospi_8_64, (int16_t)cospi_24_64);
      33           0 :   const __m128i rounding = _mm_set1_epi32(DCT_CONST_ROUNDING);
      34             :   __m128i input0, input1, input2, input3;
      35             : 
      36             :   // Rows
      37           0 :   input0 = load_input_data(input);
      38           0 :   input2 = load_input_data(input + 8);
      39             : 
      40             :   // Construct i3, i1, i3, i1, i2, i0, i2, i0
      41           0 :   input0 = _mm_shufflelo_epi16(input0, 0xd8);
      42           0 :   input0 = _mm_shufflehi_epi16(input0, 0xd8);
      43           0 :   input2 = _mm_shufflelo_epi16(input2, 0xd8);
      44           0 :   input2 = _mm_shufflehi_epi16(input2, 0xd8);
      45             : 
      46           0 :   input1 = _mm_unpackhi_epi32(input0, input0);
      47           0 :   input0 = _mm_unpacklo_epi32(input0, input0);
      48           0 :   input3 = _mm_unpackhi_epi32(input2, input2);
      49           0 :   input2 = _mm_unpacklo_epi32(input2, input2);
      50             : 
      51             :   // Stage 1
      52           0 :   input0 = _mm_madd_epi16(input0, cst);
      53           0 :   input1 = _mm_madd_epi16(input1, cst);
      54           0 :   input2 = _mm_madd_epi16(input2, cst);
      55           0 :   input3 = _mm_madd_epi16(input3, cst);
      56             : 
      57           0 :   input0 = _mm_add_epi32(input0, rounding);
      58           0 :   input1 = _mm_add_epi32(input1, rounding);
      59           0 :   input2 = _mm_add_epi32(input2, rounding);
      60           0 :   input3 = _mm_add_epi32(input3, rounding);
      61             : 
      62           0 :   input0 = _mm_srai_epi32(input0, DCT_CONST_BITS);
      63           0 :   input1 = _mm_srai_epi32(input1, DCT_CONST_BITS);
      64           0 :   input2 = _mm_srai_epi32(input2, DCT_CONST_BITS);
      65           0 :   input3 = _mm_srai_epi32(input3, DCT_CONST_BITS);
      66             : 
      67             :   // Stage 2
      68           0 :   input0 = _mm_packs_epi32(input0, input1);
      69           0 :   input1 = _mm_packs_epi32(input2, input3);
      70             : 
      71             :   // Transpose
      72           0 :   input2 = _mm_unpacklo_epi16(input0, input1);
      73           0 :   input3 = _mm_unpackhi_epi16(input0, input1);
      74           0 :   input0 = _mm_unpacklo_epi32(input2, input3);
      75           0 :   input1 = _mm_unpackhi_epi32(input2, input3);
      76             : 
      77             :   // Switch column2, column 3, and then, we got:
      78             :   // input2: column1, column 0;  input3: column2, column 3.
      79           0 :   input1 = _mm_shuffle_epi32(input1, 0x4e);
      80           0 :   input2 = _mm_add_epi16(input0, input1);
      81           0 :   input3 = _mm_sub_epi16(input0, input1);
      82             : 
      83             :   // Columns
      84             :   // Construct i3, i1, i3, i1, i2, i0, i2, i0
      85           0 :   input0 = _mm_unpacklo_epi32(input2, input2);
      86           0 :   input1 = _mm_unpackhi_epi32(input2, input2);
      87           0 :   input2 = _mm_unpackhi_epi32(input3, input3);
      88           0 :   input3 = _mm_unpacklo_epi32(input3, input3);
      89             : 
      90             :   // Stage 1
      91           0 :   input0 = _mm_madd_epi16(input0, cst);
      92           0 :   input1 = _mm_madd_epi16(input1, cst);
      93           0 :   input2 = _mm_madd_epi16(input2, cst);
      94           0 :   input3 = _mm_madd_epi16(input3, cst);
      95             : 
      96           0 :   input0 = _mm_add_epi32(input0, rounding);
      97           0 :   input1 = _mm_add_epi32(input1, rounding);
      98           0 :   input2 = _mm_add_epi32(input2, rounding);
      99           0 :   input3 = _mm_add_epi32(input3, rounding);
     100             : 
     101           0 :   input0 = _mm_srai_epi32(input0, DCT_CONST_BITS);
     102           0 :   input1 = _mm_srai_epi32(input1, DCT_CONST_BITS);
     103           0 :   input2 = _mm_srai_epi32(input2, DCT_CONST_BITS);
     104           0 :   input3 = _mm_srai_epi32(input3, DCT_CONST_BITS);
     105             : 
     106             :   // Stage 2
     107           0 :   input0 = _mm_packs_epi32(input0, input2);
     108           0 :   input1 = _mm_packs_epi32(input1, input3);
     109             : 
     110             :   // Transpose
     111           0 :   input2 = _mm_unpacklo_epi16(input0, input1);
     112           0 :   input3 = _mm_unpackhi_epi16(input0, input1);
     113           0 :   input0 = _mm_unpacklo_epi32(input2, input3);
     114           0 :   input1 = _mm_unpackhi_epi32(input2, input3);
     115             : 
     116             :   // Switch column2, column 3, and then, we got:
     117             :   // input2: column1, column 0;  input3: column2, column 3.
     118           0 :   input1 = _mm_shuffle_epi32(input1, 0x4e);
     119           0 :   input2 = _mm_add_epi16(input0, input1);
     120           0 :   input3 = _mm_sub_epi16(input0, input1);
     121             : 
     122             :   // Final round and shift
     123           0 :   input2 = _mm_add_epi16(input2, eight);
     124           0 :   input3 = _mm_add_epi16(input3, eight);
     125             : 
     126           0 :   input2 = _mm_srai_epi16(input2, 4);
     127           0 :   input3 = _mm_srai_epi16(input3, 4);
     128             : 
     129             :   // Reconstruction and Store
     130             :   {
     131           0 :     __m128i d0 = _mm_cvtsi32_si128(*(const int *)(dest));
     132           0 :     __m128i d2 = _mm_cvtsi32_si128(*(const int *)(dest + stride * 2));
     133           0 :     d0 = _mm_unpacklo_epi32(d0,
     134           0 :                             _mm_cvtsi32_si128(*(const int *)(dest + stride)));
     135           0 :     d2 = _mm_unpacklo_epi32(
     136           0 :         _mm_cvtsi32_si128(*(const int *)(dest + stride * 3)), d2);
     137           0 :     d0 = _mm_unpacklo_epi8(d0, zero);
     138           0 :     d2 = _mm_unpacklo_epi8(d2, zero);
     139           0 :     d0 = _mm_add_epi16(d0, input2);
     140           0 :     d2 = _mm_add_epi16(d2, input3);
     141           0 :     d0 = _mm_packus_epi16(d0, d2);
     142             :     // store input0
     143           0 :     *(int *)dest = _mm_cvtsi128_si32(d0);
     144             :     // store input1
     145           0 :     d0 = _mm_srli_si128(d0, 4);
     146           0 :     *(int *)(dest + stride) = _mm_cvtsi128_si32(d0);
     147             :     // store input2
     148           0 :     d0 = _mm_srli_si128(d0, 4);
     149           0 :     *(int *)(dest + stride * 3) = _mm_cvtsi128_si32(d0);
     150             :     // store input3
     151           0 :     d0 = _mm_srli_si128(d0, 4);
     152           0 :     *(int *)(dest + stride * 2) = _mm_cvtsi128_si32(d0);
     153             :   }
     154           0 : }
     155             : 
     156           0 : void aom_idct4x4_1_add_sse2(const tran_low_t *input, uint8_t *dest,
     157             :                             int stride) {
     158             :   __m128i dc_value;
     159           0 :   const __m128i zero = _mm_setzero_si128();
     160             :   int a;
     161             : 
     162           0 :   a = (int)dct_const_round_shift(input[0] * cospi_16_64);
     163           0 :   a = (int)dct_const_round_shift(a * cospi_16_64);
     164           0 :   a = ROUND_POWER_OF_TWO(a, 4);
     165             : 
     166           0 :   if (a == 0) return;
     167             : 
     168           0 :   dc_value = _mm_set1_epi16(a);
     169             : 
     170           0 :   RECON_AND_STORE4X4(dest + 0 * stride, dc_value);
     171           0 :   RECON_AND_STORE4X4(dest + 1 * stride, dc_value);
     172           0 :   RECON_AND_STORE4X4(dest + 2 * stride, dc_value);
     173           0 :   RECON_AND_STORE4X4(dest + 3 * stride, dc_value);
     174             : }
     175             : 
     176           0 : void aom_idct4_sse2(__m128i *in) {
     177           0 :   const __m128i k__cospi_p16_p16 = pair_set_epi16(cospi_16_64, cospi_16_64);
     178           0 :   const __m128i k__cospi_p16_m16 = pair_set_epi16(cospi_16_64, -cospi_16_64);
     179           0 :   const __m128i k__cospi_p24_m08 = pair_set_epi16(cospi_24_64, -cospi_8_64);
     180           0 :   const __m128i k__cospi_p08_p24 = pair_set_epi16(cospi_8_64, cospi_24_64);
     181           0 :   const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
     182             :   __m128i u[8], v[8];
     183             : 
     184           0 :   array_transpose_4x4(in);
     185             :   // stage 1
     186           0 :   u[0] = _mm_unpacklo_epi16(in[0], in[1]);
     187           0 :   u[1] = _mm_unpackhi_epi16(in[0], in[1]);
     188           0 :   v[0] = _mm_madd_epi16(u[0], k__cospi_p16_p16);
     189           0 :   v[1] = _mm_madd_epi16(u[0], k__cospi_p16_m16);
     190           0 :   v[2] = _mm_madd_epi16(u[1], k__cospi_p24_m08);
     191           0 :   v[3] = _mm_madd_epi16(u[1], k__cospi_p08_p24);
     192             : 
     193           0 :   u[0] = _mm_add_epi32(v[0], k__DCT_CONST_ROUNDING);
     194           0 :   u[1] = _mm_add_epi32(v[1], k__DCT_CONST_ROUNDING);
     195           0 :   u[2] = _mm_add_epi32(v[2], k__DCT_CONST_ROUNDING);
     196           0 :   u[3] = _mm_add_epi32(v[3], k__DCT_CONST_ROUNDING);
     197             : 
     198           0 :   v[0] = _mm_srai_epi32(u[0], DCT_CONST_BITS);
     199           0 :   v[1] = _mm_srai_epi32(u[1], DCT_CONST_BITS);
     200           0 :   v[2] = _mm_srai_epi32(u[2], DCT_CONST_BITS);
     201           0 :   v[3] = _mm_srai_epi32(u[3], DCT_CONST_BITS);
     202             : 
     203           0 :   u[0] = _mm_packs_epi32(v[0], v[1]);
     204           0 :   u[1] = _mm_packs_epi32(v[3], v[2]);
     205             : 
     206             :   // stage 2
     207           0 :   in[0] = _mm_add_epi16(u[0], u[1]);
     208           0 :   in[1] = _mm_sub_epi16(u[0], u[1]);
     209           0 :   in[1] = _mm_shuffle_epi32(in[1], 0x4E);
     210           0 : }
     211             : 
     212           0 : void aom_iadst4_sse2(__m128i *in) {
     213           0 :   const __m128i k__sinpi_p01_p04 = pair_set_epi16(sinpi_1_9, sinpi_4_9);
     214           0 :   const __m128i k__sinpi_p03_p02 = pair_set_epi16(sinpi_3_9, sinpi_2_9);
     215           0 :   const __m128i k__sinpi_p02_m01 = pair_set_epi16(sinpi_2_9, -sinpi_1_9);
     216           0 :   const __m128i k__sinpi_p03_m04 = pair_set_epi16(sinpi_3_9, -sinpi_4_9);
     217           0 :   const __m128i k__sinpi_p03_p03 = _mm_set1_epi16((int16_t)sinpi_3_9);
     218           0 :   const __m128i kZero = _mm_set1_epi16(0);
     219           0 :   const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
     220             :   __m128i u[8], v[8], in7;
     221             : 
     222           0 :   array_transpose_4x4(in);
     223           0 :   in7 = _mm_srli_si128(in[1], 8);
     224           0 :   in7 = _mm_add_epi16(in7, in[0]);
     225           0 :   in7 = _mm_sub_epi16(in7, in[1]);
     226             : 
     227           0 :   u[0] = _mm_unpacklo_epi16(in[0], in[1]);
     228           0 :   u[1] = _mm_unpackhi_epi16(in[0], in[1]);
     229           0 :   u[2] = _mm_unpacklo_epi16(in7, kZero);
     230           0 :   u[3] = _mm_unpackhi_epi16(in[0], kZero);
     231             : 
     232           0 :   v[0] = _mm_madd_epi16(u[0], k__sinpi_p01_p04);  // s0 + s3
     233           0 :   v[1] = _mm_madd_epi16(u[1], k__sinpi_p03_p02);  // s2 + s5
     234           0 :   v[2] = _mm_madd_epi16(u[2], k__sinpi_p03_p03);  // x2
     235           0 :   v[3] = _mm_madd_epi16(u[0], k__sinpi_p02_m01);  // s1 - s4
     236           0 :   v[4] = _mm_madd_epi16(u[1], k__sinpi_p03_m04);  // s2 - s6
     237           0 :   v[5] = _mm_madd_epi16(u[3], k__sinpi_p03_p03);  // s2
     238             : 
     239           0 :   u[0] = _mm_add_epi32(v[0], v[1]);
     240           0 :   u[1] = _mm_add_epi32(v[3], v[4]);
     241           0 :   u[2] = v[2];
     242           0 :   u[3] = _mm_add_epi32(u[0], u[1]);
     243           0 :   u[4] = _mm_slli_epi32(v[5], 2);
     244           0 :   u[5] = _mm_add_epi32(u[3], v[5]);
     245           0 :   u[6] = _mm_sub_epi32(u[5], u[4]);
     246             : 
     247           0 :   v[0] = _mm_add_epi32(u[0], k__DCT_CONST_ROUNDING);
     248           0 :   v[1] = _mm_add_epi32(u[1], k__DCT_CONST_ROUNDING);
     249           0 :   v[2] = _mm_add_epi32(u[2], k__DCT_CONST_ROUNDING);
     250           0 :   v[3] = _mm_add_epi32(u[6], k__DCT_CONST_ROUNDING);
     251             : 
     252           0 :   u[0] = _mm_srai_epi32(v[0], DCT_CONST_BITS);
     253           0 :   u[1] = _mm_srai_epi32(v[1], DCT_CONST_BITS);
     254           0 :   u[2] = _mm_srai_epi32(v[2], DCT_CONST_BITS);
     255           0 :   u[3] = _mm_srai_epi32(v[3], DCT_CONST_BITS);
     256             : 
     257           0 :   in[0] = _mm_packs_epi32(u[0], u[1]);
     258           0 :   in[1] = _mm_packs_epi32(u[2], u[3]);
     259           0 : }
     260             : 
     261             : // Define Macro for multiplying elements by constants and adding them together.
     262             : #define MULTIPLICATION_AND_ADD(lo_0, hi_0, lo_1, hi_1, cst0, cst1, cst2, cst3, \
     263             :                                res0, res1, res2, res3)                         \
     264             :   {                                                                            \
     265             :     tmp0 = _mm_madd_epi16(lo_0, cst0);                                         \
     266             :     tmp1 = _mm_madd_epi16(hi_0, cst0);                                         \
     267             :     tmp2 = _mm_madd_epi16(lo_0, cst1);                                         \
     268             :     tmp3 = _mm_madd_epi16(hi_0, cst1);                                         \
     269             :     tmp4 = _mm_madd_epi16(lo_1, cst2);                                         \
     270             :     tmp5 = _mm_madd_epi16(hi_1, cst2);                                         \
     271             :     tmp6 = _mm_madd_epi16(lo_1, cst3);                                         \
     272             :     tmp7 = _mm_madd_epi16(hi_1, cst3);                                         \
     273             :                                                                                \
     274             :     tmp0 = _mm_add_epi32(tmp0, rounding);                                      \
     275             :     tmp1 = _mm_add_epi32(tmp1, rounding);                                      \
     276             :     tmp2 = _mm_add_epi32(tmp2, rounding);                                      \
     277             :     tmp3 = _mm_add_epi32(tmp3, rounding);                                      \
     278             :     tmp4 = _mm_add_epi32(tmp4, rounding);                                      \
     279             :     tmp5 = _mm_add_epi32(tmp5, rounding);                                      \
     280             :     tmp6 = _mm_add_epi32(tmp6, rounding);                                      \
     281             :     tmp7 = _mm_add_epi32(tmp7, rounding);                                      \
     282             :                                                                                \
     283             :     tmp0 = _mm_srai_epi32(tmp0, DCT_CONST_BITS);                               \
     284             :     tmp1 = _mm_srai_epi32(tmp1, DCT_CONST_BITS);                               \
     285             :     tmp2 = _mm_srai_epi32(tmp2, DCT_CONST_BITS);                               \
     286             :     tmp3 = _mm_srai_epi32(tmp3, DCT_CONST_BITS);                               \
     287             :     tmp4 = _mm_srai_epi32(tmp4, DCT_CONST_BITS);                               \
     288             :     tmp5 = _mm_srai_epi32(tmp5, DCT_CONST_BITS);                               \
     289             :     tmp6 = _mm_srai_epi32(tmp6, DCT_CONST_BITS);                               \
     290             :     tmp7 = _mm_srai_epi32(tmp7, DCT_CONST_BITS);                               \
     291             :                                                                                \
     292             :     res0 = _mm_packs_epi32(tmp0, tmp1);                                        \
     293             :     res1 = _mm_packs_epi32(tmp2, tmp3);                                        \
     294             :     res2 = _mm_packs_epi32(tmp4, tmp5);                                        \
     295             :     res3 = _mm_packs_epi32(tmp6, tmp7);                                        \
     296             :   }
     297             : 
     298             : #define MULTIPLICATION_AND_ADD_2(lo_0, hi_0, cst0, cst1, res0, res1) \
     299             :   {                                                                  \
     300             :     tmp0 = _mm_madd_epi16(lo_0, cst0);                               \
     301             :     tmp1 = _mm_madd_epi16(hi_0, cst0);                               \
     302             :     tmp2 = _mm_madd_epi16(lo_0, cst1);                               \
     303             :     tmp3 = _mm_madd_epi16(hi_0, cst1);                               \
     304             :                                                                      \
     305             :     tmp0 = _mm_add_epi32(tmp0, rounding);                            \
     306             :     tmp1 = _mm_add_epi32(tmp1, rounding);                            \
     307             :     tmp2 = _mm_add_epi32(tmp2, rounding);                            \
     308             :     tmp3 = _mm_add_epi32(tmp3, rounding);                            \
     309             :                                                                      \
     310             :     tmp0 = _mm_srai_epi32(tmp0, DCT_CONST_BITS);                     \
     311             :     tmp1 = _mm_srai_epi32(tmp1, DCT_CONST_BITS);                     \
     312             :     tmp2 = _mm_srai_epi32(tmp2, DCT_CONST_BITS);                     \
     313             :     tmp3 = _mm_srai_epi32(tmp3, DCT_CONST_BITS);                     \
     314             :                                                                      \
     315             :     res0 = _mm_packs_epi32(tmp0, tmp1);                              \
     316             :     res1 = _mm_packs_epi32(tmp2, tmp3);                              \
     317             :   }
     318             : 
     319             : #define IDCT8(in0, in1, in2, in3, in4, in5, in6, in7, out0, out1, out2, out3, \
     320             :               out4, out5, out6, out7)                                         \
     321             :   {                                                                           \
     322             :     /* Stage1 */                                                              \
     323             :     {                                                                         \
     324             :       const __m128i lo_17 = _mm_unpacklo_epi16(in1, in7);                     \
     325             :       const __m128i hi_17 = _mm_unpackhi_epi16(in1, in7);                     \
     326             :       const __m128i lo_35 = _mm_unpacklo_epi16(in3, in5);                     \
     327             :       const __m128i hi_35 = _mm_unpackhi_epi16(in3, in5);                     \
     328             :                                                                               \
     329             :       MULTIPLICATION_AND_ADD(lo_17, hi_17, lo_35, hi_35, stg1_0, stg1_1,      \
     330             :                              stg1_2, stg1_3, stp1_4, stp1_7, stp1_5, stp1_6)  \
     331             :     }                                                                         \
     332             :                                                                               \
     333             :     /* Stage2 */                                                              \
     334             :     {                                                                         \
     335             :       const __m128i lo_04 = _mm_unpacklo_epi16(in0, in4);                     \
     336             :       const __m128i hi_04 = _mm_unpackhi_epi16(in0, in4);                     \
     337             :       const __m128i lo_26 = _mm_unpacklo_epi16(in2, in6);                     \
     338             :       const __m128i hi_26 = _mm_unpackhi_epi16(in2, in6);                     \
     339             :                                                                               \
     340             :       MULTIPLICATION_AND_ADD(lo_04, hi_04, lo_26, hi_26, stg2_0, stg2_1,      \
     341             :                              stg2_2, stg2_3, stp2_0, stp2_1, stp2_2, stp2_3)  \
     342             :                                                                               \
     343             :       stp2_4 = _mm_adds_epi16(stp1_4, stp1_5);                                \
     344             :       stp2_5 = _mm_subs_epi16(stp1_4, stp1_5);                                \
     345             :       stp2_6 = _mm_subs_epi16(stp1_7, stp1_6);                                \
     346             :       stp2_7 = _mm_adds_epi16(stp1_7, stp1_6);                                \
     347             :     }                                                                         \
     348             :                                                                               \
     349             :     /* Stage3 */                                                              \
     350             :     {                                                                         \
     351             :       const __m128i lo_56 = _mm_unpacklo_epi16(stp2_6, stp2_5);               \
     352             :       const __m128i hi_56 = _mm_unpackhi_epi16(stp2_6, stp2_5);               \
     353             :                                                                               \
     354             :       stp1_0 = _mm_adds_epi16(stp2_0, stp2_3);                                \
     355             :       stp1_1 = _mm_adds_epi16(stp2_1, stp2_2);                                \
     356             :       stp1_2 = _mm_subs_epi16(stp2_1, stp2_2);                                \
     357             :       stp1_3 = _mm_subs_epi16(stp2_0, stp2_3);                                \
     358             :                                                                               \
     359             :       tmp0 = _mm_madd_epi16(lo_56, stg2_1);                                   \
     360             :       tmp1 = _mm_madd_epi16(hi_56, stg2_1);                                   \
     361             :       tmp2 = _mm_madd_epi16(lo_56, stg2_0);                                   \
     362             :       tmp3 = _mm_madd_epi16(hi_56, stg2_0);                                   \
     363             :                                                                               \
     364             :       tmp0 = _mm_add_epi32(tmp0, rounding);                                   \
     365             :       tmp1 = _mm_add_epi32(tmp1, rounding);                                   \
     366             :       tmp2 = _mm_add_epi32(tmp2, rounding);                                   \
     367             :       tmp3 = _mm_add_epi32(tmp3, rounding);                                   \
     368             :                                                                               \
     369             :       tmp0 = _mm_srai_epi32(tmp0, DCT_CONST_BITS);                            \
     370             :       tmp1 = _mm_srai_epi32(tmp1, DCT_CONST_BITS);                            \
     371             :       tmp2 = _mm_srai_epi32(tmp2, DCT_CONST_BITS);                            \
     372             :       tmp3 = _mm_srai_epi32(tmp3, DCT_CONST_BITS);                            \
     373             :                                                                               \
     374             :       stp1_5 = _mm_packs_epi32(tmp0, tmp1);                                   \
     375             :       stp1_6 = _mm_packs_epi32(tmp2, tmp3);                                   \
     376             :     }                                                                         \
     377             :                                                                               \
     378             :     /* Stage4  */                                                             \
     379             :     out0 = _mm_adds_epi16(stp1_0, stp2_7);                                    \
     380             :     out1 = _mm_adds_epi16(stp1_1, stp1_6);                                    \
     381             :     out2 = _mm_adds_epi16(stp1_2, stp1_5);                                    \
     382             :     out3 = _mm_adds_epi16(stp1_3, stp2_4);                                    \
     383             :     out4 = _mm_subs_epi16(stp1_3, stp2_4);                                    \
     384             :     out5 = _mm_subs_epi16(stp1_2, stp1_5);                                    \
     385             :     out6 = _mm_subs_epi16(stp1_1, stp1_6);                                    \
     386             :     out7 = _mm_subs_epi16(stp1_0, stp2_7);                                    \
     387             :   }
     388             : 
     389           0 : void aom_idct8x8_64_add_sse2(const tran_low_t *input, uint8_t *dest,
     390             :                              int stride) {
     391           0 :   const __m128i zero = _mm_setzero_si128();
     392           0 :   const __m128i rounding = _mm_set1_epi32(DCT_CONST_ROUNDING);
     393           0 :   const __m128i final_rounding = _mm_set1_epi16(1 << 4);
     394           0 :   const __m128i stg1_0 = pair_set_epi16(cospi_28_64, -cospi_4_64);
     395           0 :   const __m128i stg1_1 = pair_set_epi16(cospi_4_64, cospi_28_64);
     396           0 :   const __m128i stg1_2 = pair_set_epi16(-cospi_20_64, cospi_12_64);
     397           0 :   const __m128i stg1_3 = pair_set_epi16(cospi_12_64, cospi_20_64);
     398           0 :   const __m128i stg2_0 = pair_set_epi16(cospi_16_64, cospi_16_64);
     399           0 :   const __m128i stg2_1 = pair_set_epi16(cospi_16_64, -cospi_16_64);
     400           0 :   const __m128i stg2_2 = pair_set_epi16(cospi_24_64, -cospi_8_64);
     401           0 :   const __m128i stg2_3 = pair_set_epi16(cospi_8_64, cospi_24_64);
     402             : 
     403             :   __m128i in0, in1, in2, in3, in4, in5, in6, in7;
     404             :   __m128i stp1_0, stp1_1, stp1_2, stp1_3, stp1_4, stp1_5, stp1_6, stp1_7;
     405             :   __m128i stp2_0, stp2_1, stp2_2, stp2_3, stp2_4, stp2_5, stp2_6, stp2_7;
     406             :   __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
     407             :   int i;
     408             : 
     409             :   // Load input data.
     410           0 :   in0 = load_input_data(input);
     411           0 :   in1 = load_input_data(input + 8 * 1);
     412           0 :   in2 = load_input_data(input + 8 * 2);
     413           0 :   in3 = load_input_data(input + 8 * 3);
     414           0 :   in4 = load_input_data(input + 8 * 4);
     415           0 :   in5 = load_input_data(input + 8 * 5);
     416           0 :   in6 = load_input_data(input + 8 * 6);
     417           0 :   in7 = load_input_data(input + 8 * 7);
     418             : 
     419             :   // 2-D
     420           0 :   for (i = 0; i < 2; i++) {
     421             :     // 8x8 Transpose is copied from aom_fdct8x8_sse2()
     422           0 :     TRANSPOSE_8X8(in0, in1, in2, in3, in4, in5, in6, in7, in0, in1, in2, in3,
     423             :                   in4, in5, in6, in7);
     424             : 
     425             :     // 4-stage 1D idct8x8
     426           0 :     IDCT8(in0, in1, in2, in3, in4, in5, in6, in7, in0, in1, in2, in3, in4, in5,
     427             :           in6, in7);
     428             :   }
     429             : 
     430             :   // Final rounding and shift
     431           0 :   in0 = _mm_adds_epi16(in0, final_rounding);
     432           0 :   in1 = _mm_adds_epi16(in1, final_rounding);
     433           0 :   in2 = _mm_adds_epi16(in2, final_rounding);
     434           0 :   in3 = _mm_adds_epi16(in3, final_rounding);
     435           0 :   in4 = _mm_adds_epi16(in4, final_rounding);
     436           0 :   in5 = _mm_adds_epi16(in5, final_rounding);
     437           0 :   in6 = _mm_adds_epi16(in6, final_rounding);
     438           0 :   in7 = _mm_adds_epi16(in7, final_rounding);
     439             : 
     440           0 :   in0 = _mm_srai_epi16(in0, 5);
     441           0 :   in1 = _mm_srai_epi16(in1, 5);
     442           0 :   in2 = _mm_srai_epi16(in2, 5);
     443           0 :   in3 = _mm_srai_epi16(in3, 5);
     444           0 :   in4 = _mm_srai_epi16(in4, 5);
     445           0 :   in5 = _mm_srai_epi16(in5, 5);
     446           0 :   in6 = _mm_srai_epi16(in6, 5);
     447           0 :   in7 = _mm_srai_epi16(in7, 5);
     448             : 
     449           0 :   RECON_AND_STORE(dest + 0 * stride, in0);
     450           0 :   RECON_AND_STORE(dest + 1 * stride, in1);
     451           0 :   RECON_AND_STORE(dest + 2 * stride, in2);
     452           0 :   RECON_AND_STORE(dest + 3 * stride, in3);
     453           0 :   RECON_AND_STORE(dest + 4 * stride, in4);
     454           0 :   RECON_AND_STORE(dest + 5 * stride, in5);
     455           0 :   RECON_AND_STORE(dest + 6 * stride, in6);
     456           0 :   RECON_AND_STORE(dest + 7 * stride, in7);
     457           0 : }
     458             : 
     459           0 : void aom_idct8x8_1_add_sse2(const tran_low_t *input, uint8_t *dest,
     460             :                             int stride) {
     461             :   __m128i dc_value;
     462           0 :   const __m128i zero = _mm_setzero_si128();
     463             :   int a;
     464             : 
     465           0 :   a = (int)dct_const_round_shift(input[0] * cospi_16_64);
     466           0 :   a = (int)dct_const_round_shift(a * cospi_16_64);
     467           0 :   a = ROUND_POWER_OF_TWO(a, 5);
     468             : 
     469           0 :   if (a == 0) return;
     470             : 
     471           0 :   dc_value = _mm_set1_epi16(a);
     472             : 
     473           0 :   RECON_AND_STORE(dest + 0 * stride, dc_value);
     474           0 :   RECON_AND_STORE(dest + 1 * stride, dc_value);
     475           0 :   RECON_AND_STORE(dest + 2 * stride, dc_value);
     476           0 :   RECON_AND_STORE(dest + 3 * stride, dc_value);
     477           0 :   RECON_AND_STORE(dest + 4 * stride, dc_value);
     478           0 :   RECON_AND_STORE(dest + 5 * stride, dc_value);
     479           0 :   RECON_AND_STORE(dest + 6 * stride, dc_value);
     480           0 :   RECON_AND_STORE(dest + 7 * stride, dc_value);
     481             : }
     482             : 
     483           0 : void aom_idct8_sse2(__m128i *in) {
     484           0 :   const __m128i rounding = _mm_set1_epi32(DCT_CONST_ROUNDING);
     485           0 :   const __m128i stg1_0 = pair_set_epi16(cospi_28_64, -cospi_4_64);
     486           0 :   const __m128i stg1_1 = pair_set_epi16(cospi_4_64, cospi_28_64);
     487           0 :   const __m128i stg1_2 = pair_set_epi16(-cospi_20_64, cospi_12_64);
     488           0 :   const __m128i stg1_3 = pair_set_epi16(cospi_12_64, cospi_20_64);
     489           0 :   const __m128i stg2_0 = pair_set_epi16(cospi_16_64, cospi_16_64);
     490           0 :   const __m128i stg2_1 = pair_set_epi16(cospi_16_64, -cospi_16_64);
     491           0 :   const __m128i stg2_2 = pair_set_epi16(cospi_24_64, -cospi_8_64);
     492           0 :   const __m128i stg2_3 = pair_set_epi16(cospi_8_64, cospi_24_64);
     493             : 
     494             :   __m128i in0, in1, in2, in3, in4, in5, in6, in7;
     495             :   __m128i stp1_0, stp1_1, stp1_2, stp1_3, stp1_4, stp1_5, stp1_6, stp1_7;
     496             :   __m128i stp2_0, stp2_1, stp2_2, stp2_3, stp2_4, stp2_5, stp2_6, stp2_7;
     497             :   __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
     498             : 
     499             :   // 8x8 Transpose is copied from aom_fdct8x8_sse2()
     500           0 :   TRANSPOSE_8X8(in[0], in[1], in[2], in[3], in[4], in[5], in[6], in[7], in0,
     501             :                 in1, in2, in3, in4, in5, in6, in7);
     502             : 
     503             :   // 4-stage 1D idct8x8
     504           0 :   IDCT8(in0, in1, in2, in3, in4, in5, in6, in7, in[0], in[1], in[2], in[3],
     505             :         in[4], in[5], in[6], in[7]);
     506           0 : }
     507             : 
     508           0 : void aom_iadst8_sse2(__m128i *in) {
     509           0 :   const __m128i k__cospi_p02_p30 = pair_set_epi16(cospi_2_64, cospi_30_64);
     510           0 :   const __m128i k__cospi_p30_m02 = pair_set_epi16(cospi_30_64, -cospi_2_64);
     511           0 :   const __m128i k__cospi_p10_p22 = pair_set_epi16(cospi_10_64, cospi_22_64);
     512           0 :   const __m128i k__cospi_p22_m10 = pair_set_epi16(cospi_22_64, -cospi_10_64);
     513           0 :   const __m128i k__cospi_p18_p14 = pair_set_epi16(cospi_18_64, cospi_14_64);
     514           0 :   const __m128i k__cospi_p14_m18 = pair_set_epi16(cospi_14_64, -cospi_18_64);
     515           0 :   const __m128i k__cospi_p26_p06 = pair_set_epi16(cospi_26_64, cospi_6_64);
     516           0 :   const __m128i k__cospi_p06_m26 = pair_set_epi16(cospi_6_64, -cospi_26_64);
     517           0 :   const __m128i k__cospi_p08_p24 = pair_set_epi16(cospi_8_64, cospi_24_64);
     518           0 :   const __m128i k__cospi_p24_m08 = pair_set_epi16(cospi_24_64, -cospi_8_64);
     519           0 :   const __m128i k__cospi_m24_p08 = pair_set_epi16(-cospi_24_64, cospi_8_64);
     520           0 :   const __m128i k__cospi_p16_m16 = pair_set_epi16(cospi_16_64, -cospi_16_64);
     521           0 :   const __m128i k__cospi_p16_p16 = _mm_set1_epi16((int16_t)cospi_16_64);
     522           0 :   const __m128i k__const_0 = _mm_set1_epi16(0);
     523           0 :   const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
     524             : 
     525             :   __m128i u0, u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15;
     526             :   __m128i v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15;
     527             :   __m128i w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15;
     528             :   __m128i s0, s1, s2, s3, s4, s5, s6, s7;
     529             :   __m128i in0, in1, in2, in3, in4, in5, in6, in7;
     530             : 
     531             :   // transpose
     532           0 :   array_transpose_8x8(in, in);
     533             : 
     534             :   // properly aligned for butterfly input
     535           0 :   in0 = in[7];
     536           0 :   in1 = in[0];
     537           0 :   in2 = in[5];
     538           0 :   in3 = in[2];
     539           0 :   in4 = in[3];
     540           0 :   in5 = in[4];
     541           0 :   in6 = in[1];
     542           0 :   in7 = in[6];
     543             : 
     544             :   // column transformation
     545             :   // stage 1
     546             :   // interleave and multiply/add into 32-bit integer
     547           0 :   s0 = _mm_unpacklo_epi16(in0, in1);
     548           0 :   s1 = _mm_unpackhi_epi16(in0, in1);
     549           0 :   s2 = _mm_unpacklo_epi16(in2, in3);
     550           0 :   s3 = _mm_unpackhi_epi16(in2, in3);
     551           0 :   s4 = _mm_unpacklo_epi16(in4, in5);
     552           0 :   s5 = _mm_unpackhi_epi16(in4, in5);
     553           0 :   s6 = _mm_unpacklo_epi16(in6, in7);
     554           0 :   s7 = _mm_unpackhi_epi16(in6, in7);
     555             : 
     556           0 :   u0 = _mm_madd_epi16(s0, k__cospi_p02_p30);
     557           0 :   u1 = _mm_madd_epi16(s1, k__cospi_p02_p30);
     558           0 :   u2 = _mm_madd_epi16(s0, k__cospi_p30_m02);
     559           0 :   u3 = _mm_madd_epi16(s1, k__cospi_p30_m02);
     560           0 :   u4 = _mm_madd_epi16(s2, k__cospi_p10_p22);
     561           0 :   u5 = _mm_madd_epi16(s3, k__cospi_p10_p22);
     562           0 :   u6 = _mm_madd_epi16(s2, k__cospi_p22_m10);
     563           0 :   u7 = _mm_madd_epi16(s3, k__cospi_p22_m10);
     564           0 :   u8 = _mm_madd_epi16(s4, k__cospi_p18_p14);
     565           0 :   u9 = _mm_madd_epi16(s5, k__cospi_p18_p14);
     566           0 :   u10 = _mm_madd_epi16(s4, k__cospi_p14_m18);
     567           0 :   u11 = _mm_madd_epi16(s5, k__cospi_p14_m18);
     568           0 :   u12 = _mm_madd_epi16(s6, k__cospi_p26_p06);
     569           0 :   u13 = _mm_madd_epi16(s7, k__cospi_p26_p06);
     570           0 :   u14 = _mm_madd_epi16(s6, k__cospi_p06_m26);
     571           0 :   u15 = _mm_madd_epi16(s7, k__cospi_p06_m26);
     572             : 
     573             :   // addition
     574           0 :   w0 = _mm_add_epi32(u0, u8);
     575           0 :   w1 = _mm_add_epi32(u1, u9);
     576           0 :   w2 = _mm_add_epi32(u2, u10);
     577           0 :   w3 = _mm_add_epi32(u3, u11);
     578           0 :   w4 = _mm_add_epi32(u4, u12);
     579           0 :   w5 = _mm_add_epi32(u5, u13);
     580           0 :   w6 = _mm_add_epi32(u6, u14);
     581           0 :   w7 = _mm_add_epi32(u7, u15);
     582           0 :   w8 = _mm_sub_epi32(u0, u8);
     583           0 :   w9 = _mm_sub_epi32(u1, u9);
     584           0 :   w10 = _mm_sub_epi32(u2, u10);
     585           0 :   w11 = _mm_sub_epi32(u3, u11);
     586           0 :   w12 = _mm_sub_epi32(u4, u12);
     587           0 :   w13 = _mm_sub_epi32(u5, u13);
     588           0 :   w14 = _mm_sub_epi32(u6, u14);
     589           0 :   w15 = _mm_sub_epi32(u7, u15);
     590             : 
     591             :   // shift and rounding
     592           0 :   v0 = _mm_add_epi32(w0, k__DCT_CONST_ROUNDING);
     593           0 :   v1 = _mm_add_epi32(w1, k__DCT_CONST_ROUNDING);
     594           0 :   v2 = _mm_add_epi32(w2, k__DCT_CONST_ROUNDING);
     595           0 :   v3 = _mm_add_epi32(w3, k__DCT_CONST_ROUNDING);
     596           0 :   v4 = _mm_add_epi32(w4, k__DCT_CONST_ROUNDING);
     597           0 :   v5 = _mm_add_epi32(w5, k__DCT_CONST_ROUNDING);
     598           0 :   v6 = _mm_add_epi32(w6, k__DCT_CONST_ROUNDING);
     599           0 :   v7 = _mm_add_epi32(w7, k__DCT_CONST_ROUNDING);
     600           0 :   v8 = _mm_add_epi32(w8, k__DCT_CONST_ROUNDING);
     601           0 :   v9 = _mm_add_epi32(w9, k__DCT_CONST_ROUNDING);
     602           0 :   v10 = _mm_add_epi32(w10, k__DCT_CONST_ROUNDING);
     603           0 :   v11 = _mm_add_epi32(w11, k__DCT_CONST_ROUNDING);
     604           0 :   v12 = _mm_add_epi32(w12, k__DCT_CONST_ROUNDING);
     605           0 :   v13 = _mm_add_epi32(w13, k__DCT_CONST_ROUNDING);
     606           0 :   v14 = _mm_add_epi32(w14, k__DCT_CONST_ROUNDING);
     607           0 :   v15 = _mm_add_epi32(w15, k__DCT_CONST_ROUNDING);
     608             : 
     609           0 :   u0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
     610           0 :   u1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
     611           0 :   u2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
     612           0 :   u3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
     613           0 :   u4 = _mm_srai_epi32(v4, DCT_CONST_BITS);
     614           0 :   u5 = _mm_srai_epi32(v5, DCT_CONST_BITS);
     615           0 :   u6 = _mm_srai_epi32(v6, DCT_CONST_BITS);
     616           0 :   u7 = _mm_srai_epi32(v7, DCT_CONST_BITS);
     617           0 :   u8 = _mm_srai_epi32(v8, DCT_CONST_BITS);
     618           0 :   u9 = _mm_srai_epi32(v9, DCT_CONST_BITS);
     619           0 :   u10 = _mm_srai_epi32(v10, DCT_CONST_BITS);
     620           0 :   u11 = _mm_srai_epi32(v11, DCT_CONST_BITS);
     621           0 :   u12 = _mm_srai_epi32(v12, DCT_CONST_BITS);
     622           0 :   u13 = _mm_srai_epi32(v13, DCT_CONST_BITS);
     623           0 :   u14 = _mm_srai_epi32(v14, DCT_CONST_BITS);
     624           0 :   u15 = _mm_srai_epi32(v15, DCT_CONST_BITS);
     625             : 
     626             :   // back to 16-bit and pack 8 integers into __m128i
     627           0 :   in[0] = _mm_packs_epi32(u0, u1);
     628           0 :   in[1] = _mm_packs_epi32(u2, u3);
     629           0 :   in[2] = _mm_packs_epi32(u4, u5);
     630           0 :   in[3] = _mm_packs_epi32(u6, u7);
     631           0 :   in[4] = _mm_packs_epi32(u8, u9);
     632           0 :   in[5] = _mm_packs_epi32(u10, u11);
     633           0 :   in[6] = _mm_packs_epi32(u12, u13);
     634           0 :   in[7] = _mm_packs_epi32(u14, u15);
     635             : 
     636             :   // stage 2
     637           0 :   s0 = _mm_add_epi16(in[0], in[2]);
     638           0 :   s1 = _mm_add_epi16(in[1], in[3]);
     639           0 :   s2 = _mm_sub_epi16(in[0], in[2]);
     640           0 :   s3 = _mm_sub_epi16(in[1], in[3]);
     641           0 :   u0 = _mm_unpacklo_epi16(in[4], in[5]);
     642           0 :   u1 = _mm_unpackhi_epi16(in[4], in[5]);
     643           0 :   u2 = _mm_unpacklo_epi16(in[6], in[7]);
     644           0 :   u3 = _mm_unpackhi_epi16(in[6], in[7]);
     645             : 
     646           0 :   v0 = _mm_madd_epi16(u0, k__cospi_p08_p24);
     647           0 :   v1 = _mm_madd_epi16(u1, k__cospi_p08_p24);
     648           0 :   v2 = _mm_madd_epi16(u0, k__cospi_p24_m08);
     649           0 :   v3 = _mm_madd_epi16(u1, k__cospi_p24_m08);
     650           0 :   v4 = _mm_madd_epi16(u2, k__cospi_m24_p08);
     651           0 :   v5 = _mm_madd_epi16(u3, k__cospi_m24_p08);
     652           0 :   v6 = _mm_madd_epi16(u2, k__cospi_p08_p24);
     653           0 :   v7 = _mm_madd_epi16(u3, k__cospi_p08_p24);
     654             : 
     655           0 :   w0 = _mm_add_epi32(v0, v4);
     656           0 :   w1 = _mm_add_epi32(v1, v5);
     657           0 :   w2 = _mm_add_epi32(v2, v6);
     658           0 :   w3 = _mm_add_epi32(v3, v7);
     659           0 :   w4 = _mm_sub_epi32(v0, v4);
     660           0 :   w5 = _mm_sub_epi32(v1, v5);
     661           0 :   w6 = _mm_sub_epi32(v2, v6);
     662           0 :   w7 = _mm_sub_epi32(v3, v7);
     663             : 
     664           0 :   v0 = _mm_add_epi32(w0, k__DCT_CONST_ROUNDING);
     665           0 :   v1 = _mm_add_epi32(w1, k__DCT_CONST_ROUNDING);
     666           0 :   v2 = _mm_add_epi32(w2, k__DCT_CONST_ROUNDING);
     667           0 :   v3 = _mm_add_epi32(w3, k__DCT_CONST_ROUNDING);
     668           0 :   v4 = _mm_add_epi32(w4, k__DCT_CONST_ROUNDING);
     669           0 :   v5 = _mm_add_epi32(w5, k__DCT_CONST_ROUNDING);
     670           0 :   v6 = _mm_add_epi32(w6, k__DCT_CONST_ROUNDING);
     671           0 :   v7 = _mm_add_epi32(w7, k__DCT_CONST_ROUNDING);
     672             : 
     673           0 :   u0 = _mm_srai_epi32(v0, DCT_CONST_BITS);
     674           0 :   u1 = _mm_srai_epi32(v1, DCT_CONST_BITS);
     675           0 :   u2 = _mm_srai_epi32(v2, DCT_CONST_BITS);
     676           0 :   u3 = _mm_srai_epi32(v3, DCT_CONST_BITS);
     677           0 :   u4 = _mm_srai_epi32(v4, DCT_CONST_BITS);
     678           0 :   u5 = _mm_srai_epi32(v5, DCT_CONST_BITS);
     679           0 :   u6 = _mm_srai_epi32(v6, DCT_CONST_BITS);
     680           0 :   u7 = _mm_srai_epi32(v7, DCT_CONST_BITS);
     681             : 
     682             :   // back to 16-bit intergers
     683           0 :   s4 = _mm_packs_epi32(u0, u1);
     684           0 :   s5 = _mm_packs_epi32(u2, u3);
     685           0 :   s6 = _mm_packs_epi32(u4, u5);
     686           0 :   s7 = _mm_packs_epi32(u6, u7);
     687             : 
     688             :   // stage 3
     689           0 :   u0 = _mm_unpacklo_epi16(s2, s3);
     690           0 :   u1 = _mm_unpackhi_epi16(s2, s3);
     691           0 :   u2 = _mm_unpacklo_epi16(s6, s7);
     692           0 :   u3 = _mm_unpackhi_epi16(s6, s7);
     693             : 
     694           0 :   v0 = _mm_madd_epi16(u0, k__cospi_p16_p16);
     695           0 :   v1 = _mm_madd_epi16(u1, k__cospi_p16_p16);
     696           0 :   v2 = _mm_madd_epi16(u0, k__cospi_p16_m16);
     697           0 :   v3 = _mm_madd_epi16(u1, k__cospi_p16_m16);
     698           0 :   v4 = _mm_madd_epi16(u2, k__cospi_p16_p16);
     699           0 :   v5 = _mm_madd_epi16(u3, k__cospi_p16_p16);
     700           0 :   v6 = _mm_madd_epi16(u2, k__cospi_p16_m16);
     701           0 :   v7 = _mm_madd_epi16(u3, k__cospi_p16_m16);
     702             : 
     703           0 :   u0 = _mm_add_epi32(v0, k__DCT_CONST_ROUNDING);
     704           0 :   u1 = _mm_add_epi32(v1, k__DCT_CONST_ROUNDING);
     705           0 :   u2 = _mm_add_epi32(v2, k__DCT_CONST_ROUNDING);
     706           0 :   u3 = _mm_add_epi32(v3, k__DCT_CONST_ROUNDING);
     707           0 :   u4 = _mm_add_epi32(v4, k__DCT_CONST_ROUNDING);
     708           0 :   u5 = _mm_add_epi32(v5, k__DCT_CONST_ROUNDING);
     709           0 :   u6 = _mm_add_epi32(v6, k__DCT_CONST_ROUNDING);
     710           0 :   u7 = _mm_add_epi32(v7, k__DCT_CONST_ROUNDING);
     711             : 
     712           0 :   v0 = _mm_srai_epi32(u0, DCT_CONST_BITS);
     713           0 :   v1 = _mm_srai_epi32(u1, DCT_CONST_BITS);
     714           0 :   v2 = _mm_srai_epi32(u2, DCT_CONST_BITS);
     715           0 :   v3 = _mm_srai_epi32(u3, DCT_CONST_BITS);
     716           0 :   v4 = _mm_srai_epi32(u4, DCT_CONST_BITS);
     717           0 :   v5 = _mm_srai_epi32(u5, DCT_CONST_BITS);
     718           0 :   v6 = _mm_srai_epi32(u6, DCT_CONST_BITS);
     719           0 :   v7 = _mm_srai_epi32(u7, DCT_CONST_BITS);
     720             : 
     721           0 :   s2 = _mm_packs_epi32(v0, v1);
     722           0 :   s3 = _mm_packs_epi32(v2, v3);
     723           0 :   s6 = _mm_packs_epi32(v4, v5);
     724           0 :   s7 = _mm_packs_epi32(v6, v7);
     725             : 
     726           0 :   in[0] = s0;
     727           0 :   in[1] = _mm_sub_epi16(k__const_0, s4);
     728           0 :   in[2] = s6;
     729           0 :   in[3] = _mm_sub_epi16(k__const_0, s2);
     730           0 :   in[4] = s3;
     731           0 :   in[5] = _mm_sub_epi16(k__const_0, s7);
     732           0 :   in[6] = s5;
     733           0 :   in[7] = _mm_sub_epi16(k__const_0, s1);
     734           0 : }
     735             : 
     736           0 : void aom_idct8x8_12_add_sse2(const tran_low_t *input, uint8_t *dest,
     737             :                              int stride) {
     738           0 :   const __m128i zero = _mm_setzero_si128();
     739           0 :   const __m128i rounding = _mm_set1_epi32(DCT_CONST_ROUNDING);
     740           0 :   const __m128i final_rounding = _mm_set1_epi16(1 << 4);
     741           0 :   const __m128i stg1_0 = pair_set_epi16(cospi_28_64, -cospi_4_64);
     742           0 :   const __m128i stg1_1 = pair_set_epi16(cospi_4_64, cospi_28_64);
     743           0 :   const __m128i stg1_2 = pair_set_epi16(-cospi_20_64, cospi_12_64);
     744           0 :   const __m128i stg1_3 = pair_set_epi16(cospi_12_64, cospi_20_64);
     745           0 :   const __m128i stg2_0 = pair_set_epi16(cospi_16_64, cospi_16_64);
     746           0 :   const __m128i stg2_1 = pair_set_epi16(cospi_16_64, -cospi_16_64);
     747           0 :   const __m128i stg2_2 = pair_set_epi16(cospi_24_64, -cospi_8_64);
     748           0 :   const __m128i stg2_3 = pair_set_epi16(cospi_8_64, cospi_24_64);
     749           0 :   const __m128i stg3_0 = pair_set_epi16(-cospi_16_64, cospi_16_64);
     750             : 
     751             :   __m128i in0, in1, in2, in3, in4, in5, in6, in7;
     752             :   __m128i stp1_0, stp1_1, stp1_2, stp1_3, stp1_4, stp1_5, stp1_6, stp1_7;
     753             :   __m128i stp2_0, stp2_1, stp2_2, stp2_3, stp2_4, stp2_5, stp2_6, stp2_7;
     754             :   __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
     755             : 
     756             :   // Rows. Load 4-row input data.
     757           0 :   in0 = load_input_data(input);
     758           0 :   in1 = load_input_data(input + 8 * 1);
     759           0 :   in2 = load_input_data(input + 8 * 2);
     760           0 :   in3 = load_input_data(input + 8 * 3);
     761             : 
     762             :   // 8x4 Transpose
     763           0 :   TRANSPOSE_8X8_10(in0, in1, in2, in3, in0, in1);
     764             :   // Stage1
     765             :   {
     766           0 :     const __m128i lo_17 = _mm_unpackhi_epi16(in0, zero);
     767           0 :     const __m128i lo_35 = _mm_unpackhi_epi16(in1, zero);
     768             : 
     769           0 :     tmp0 = _mm_madd_epi16(lo_17, stg1_0);
     770           0 :     tmp2 = _mm_madd_epi16(lo_17, stg1_1);
     771           0 :     tmp4 = _mm_madd_epi16(lo_35, stg1_2);
     772           0 :     tmp6 = _mm_madd_epi16(lo_35, stg1_3);
     773             : 
     774           0 :     tmp0 = _mm_add_epi32(tmp0, rounding);
     775           0 :     tmp2 = _mm_add_epi32(tmp2, rounding);
     776           0 :     tmp4 = _mm_add_epi32(tmp4, rounding);
     777           0 :     tmp6 = _mm_add_epi32(tmp6, rounding);
     778           0 :     tmp0 = _mm_srai_epi32(tmp0, DCT_CONST_BITS);
     779           0 :     tmp2 = _mm_srai_epi32(tmp2, DCT_CONST_BITS);
     780           0 :     tmp4 = _mm_srai_epi32(tmp4, DCT_CONST_BITS);
     781           0 :     tmp6 = _mm_srai_epi32(tmp6, DCT_CONST_BITS);
     782             : 
     783           0 :     stp1_4 = _mm_packs_epi32(tmp0, tmp2);
     784           0 :     stp1_5 = _mm_packs_epi32(tmp4, tmp6);
     785             :   }
     786             : 
     787             :   // Stage2
     788             :   {
     789           0 :     const __m128i lo_04 = _mm_unpacklo_epi16(in0, zero);
     790           0 :     const __m128i lo_26 = _mm_unpacklo_epi16(in1, zero);
     791             : 
     792           0 :     tmp0 = _mm_madd_epi16(lo_04, stg2_0);
     793           0 :     tmp2 = _mm_madd_epi16(lo_04, stg2_1);
     794           0 :     tmp4 = _mm_madd_epi16(lo_26, stg2_2);
     795           0 :     tmp6 = _mm_madd_epi16(lo_26, stg2_3);
     796             : 
     797           0 :     tmp0 = _mm_add_epi32(tmp0, rounding);
     798           0 :     tmp2 = _mm_add_epi32(tmp2, rounding);
     799           0 :     tmp4 = _mm_add_epi32(tmp4, rounding);
     800           0 :     tmp6 = _mm_add_epi32(tmp6, rounding);
     801           0 :     tmp0 = _mm_srai_epi32(tmp0, DCT_CONST_BITS);
     802           0 :     tmp2 = _mm_srai_epi32(tmp2, DCT_CONST_BITS);
     803           0 :     tmp4 = _mm_srai_epi32(tmp4, DCT_CONST_BITS);
     804           0 :     tmp6 = _mm_srai_epi32(tmp6, DCT_CONST_BITS);
     805             : 
     806           0 :     stp2_0 = _mm_packs_epi32(tmp0, tmp2);
     807           0 :     stp2_2 = _mm_packs_epi32(tmp6, tmp4);
     808             : 
     809           0 :     tmp0 = _mm_adds_epi16(stp1_4, stp1_5);
     810           0 :     tmp1 = _mm_subs_epi16(stp1_4, stp1_5);
     811             : 
     812           0 :     stp2_4 = tmp0;
     813           0 :     stp2_5 = _mm_unpacklo_epi64(tmp1, zero);
     814           0 :     stp2_6 = _mm_unpackhi_epi64(tmp1, zero);
     815             :   }
     816             : 
     817             :   // Stage3
     818             :   {
     819           0 :     const __m128i lo_56 = _mm_unpacklo_epi16(stp2_5, stp2_6);
     820             : 
     821           0 :     tmp4 = _mm_adds_epi16(stp2_0, stp2_2);
     822           0 :     tmp6 = _mm_subs_epi16(stp2_0, stp2_2);
     823             : 
     824           0 :     stp1_2 = _mm_unpackhi_epi64(tmp6, tmp4);
     825           0 :     stp1_3 = _mm_unpacklo_epi64(tmp6, tmp4);
     826             : 
     827           0 :     tmp0 = _mm_madd_epi16(lo_56, stg3_0);
     828           0 :     tmp2 = _mm_madd_epi16(lo_56, stg2_0);  // stg3_1 = stg2_0
     829             : 
     830           0 :     tmp0 = _mm_add_epi32(tmp0, rounding);
     831           0 :     tmp2 = _mm_add_epi32(tmp2, rounding);
     832           0 :     tmp0 = _mm_srai_epi32(tmp0, DCT_CONST_BITS);
     833           0 :     tmp2 = _mm_srai_epi32(tmp2, DCT_CONST_BITS);
     834             : 
     835           0 :     stp1_5 = _mm_packs_epi32(tmp0, tmp2);
     836             :   }
     837             : 
     838             :   // Stage4
     839           0 :   tmp0 = _mm_adds_epi16(stp1_3, stp2_4);
     840           0 :   tmp1 = _mm_adds_epi16(stp1_2, stp1_5);
     841           0 :   tmp2 = _mm_subs_epi16(stp1_3, stp2_4);
     842           0 :   tmp3 = _mm_subs_epi16(stp1_2, stp1_5);
     843             : 
     844           0 :   TRANSPOSE_4X8_10(tmp0, tmp1, tmp2, tmp3, in0, in1, in2, in3)
     845             : 
     846           0 :   IDCT8(in0, in1, in2, in3, zero, zero, zero, zero, in0, in1, in2, in3, in4,
     847             :         in5, in6, in7);
     848             :   // Final rounding and shift
     849           0 :   in0 = _mm_adds_epi16(in0, final_rounding);
     850           0 :   in1 = _mm_adds_epi16(in1, final_rounding);
     851           0 :   in2 = _mm_adds_epi16(in2, final_rounding);
     852           0 :   in3 = _mm_adds_epi16(in3, final_rounding);
     853           0 :   in4 = _mm_adds_epi16(in4, final_rounding);
     854           0 :   in5 = _mm_adds_epi16(in5, final_rounding);
     855           0 :   in6 = _mm_adds_epi16(in6, final_rounding);
     856           0 :   in7 = _mm_adds_epi16(in7, final_rounding);
     857             : 
     858           0 :   in0 = _mm_srai_epi16(in0, 5);
     859           0 :   in1 = _mm_srai_epi16(in1, 5);
     860           0 :   in2 = _mm_srai_epi16(in2, 5);
     861           0 :   in3 = _mm_srai_epi16(in3, 5);
     862           0 :   in4 = _mm_srai_epi16(in4, 5);
     863           0 :   in5 = _mm_srai_epi16(in5, 5);
     864           0 :   in6 = _mm_srai_epi16(in6, 5);
     865           0 :   in7 = _mm_srai_epi16(in7, 5);
     866             : 
     867           0 :   RECON_AND_STORE(dest + 0 * stride, in0);
     868           0 :   RECON_AND_STORE(dest + 1 * stride, in1);
     869           0 :   RECON_AND_STORE(dest + 2 * stride, in2);
     870           0 :   RECON_AND_STORE(dest + 3 * stride, in3);
     871           0 :   RECON_AND_STORE(dest + 4 * stride, in4);
     872           0 :   RECON_AND_STORE(dest + 5 * stride, in5);
     873           0 :   RECON_AND_STORE(dest + 6 * stride, in6);
     874           0 :   RECON_AND_STORE(dest + 7 * stride, in7);
     875           0 : }
     876             : 
     877             : #define IDCT16                                                                 \
     878             :   /* Stage2 */                                                                 \
     879             :   {                                                                            \
     880             :     const __m128i lo_1_15 = _mm_unpacklo_epi16(in[1], in[15]);                 \
     881             :     const __m128i hi_1_15 = _mm_unpackhi_epi16(in[1], in[15]);                 \
     882             :     const __m128i lo_9_7 = _mm_unpacklo_epi16(in[9], in[7]);                   \
     883             :     const __m128i hi_9_7 = _mm_unpackhi_epi16(in[9], in[7]);                   \
     884             :     const __m128i lo_5_11 = _mm_unpacklo_epi16(in[5], in[11]);                 \
     885             :     const __m128i hi_5_11 = _mm_unpackhi_epi16(in[5], in[11]);                 \
     886             :     const __m128i lo_13_3 = _mm_unpacklo_epi16(in[13], in[3]);                 \
     887             :     const __m128i hi_13_3 = _mm_unpackhi_epi16(in[13], in[3]);                 \
     888             :                                                                                \
     889             :     MULTIPLICATION_AND_ADD(lo_1_15, hi_1_15, lo_9_7, hi_9_7, stg2_0, stg2_1,   \
     890             :                            stg2_2, stg2_3, stp2_8, stp2_15, stp2_9, stp2_14)   \
     891             :                                                                                \
     892             :     MULTIPLICATION_AND_ADD(lo_5_11, hi_5_11, lo_13_3, hi_13_3, stg2_4, stg2_5, \
     893             :                            stg2_6, stg2_7, stp2_10, stp2_13, stp2_11, stp2_12) \
     894             :   }                                                                            \
     895             :                                                                                \
     896             :   /* Stage3 */                                                                 \
     897             :   {                                                                            \
     898             :     const __m128i lo_2_14 = _mm_unpacklo_epi16(in[2], in[14]);                 \
     899             :     const __m128i hi_2_14 = _mm_unpackhi_epi16(in[2], in[14]);                 \
     900             :     const __m128i lo_10_6 = _mm_unpacklo_epi16(in[10], in[6]);                 \
     901             :     const __m128i hi_10_6 = _mm_unpackhi_epi16(in[10], in[6]);                 \
     902             :                                                                                \
     903             :     MULTIPLICATION_AND_ADD(lo_2_14, hi_2_14, lo_10_6, hi_10_6, stg3_0, stg3_1, \
     904             :                            stg3_2, stg3_3, stp1_4, stp1_7, stp1_5, stp1_6)     \
     905             :                                                                                \
     906             :     stp1_8_0 = _mm_add_epi16(stp2_8, stp2_9);                                  \
     907             :     stp1_9 = _mm_sub_epi16(stp2_8, stp2_9);                                    \
     908             :     stp1_10 = _mm_sub_epi16(stp2_11, stp2_10);                                 \
     909             :     stp1_11 = _mm_add_epi16(stp2_11, stp2_10);                                 \
     910             :                                                                                \
     911             :     stp1_12_0 = _mm_add_epi16(stp2_12, stp2_13);                               \
     912             :     stp1_13 = _mm_sub_epi16(stp2_12, stp2_13);                                 \
     913             :     stp1_14 = _mm_sub_epi16(stp2_15, stp2_14);                                 \
     914             :     stp1_15 = _mm_add_epi16(stp2_15, stp2_14);                                 \
     915             :   }                                                                            \
     916             :                                                                                \
     917             :   /* Stage4 */                                                                 \
     918             :   {                                                                            \
     919             :     const __m128i lo_0_8 = _mm_unpacklo_epi16(in[0], in[8]);                   \
     920             :     const __m128i hi_0_8 = _mm_unpackhi_epi16(in[0], in[8]);                   \
     921             :     const __m128i lo_4_12 = _mm_unpacklo_epi16(in[4], in[12]);                 \
     922             :     const __m128i hi_4_12 = _mm_unpackhi_epi16(in[4], in[12]);                 \
     923             :                                                                                \
     924             :     const __m128i lo_9_14 = _mm_unpacklo_epi16(stp1_9, stp1_14);               \
     925             :     const __m128i hi_9_14 = _mm_unpackhi_epi16(stp1_9, stp1_14);               \
     926             :     const __m128i lo_10_13 = _mm_unpacklo_epi16(stp1_10, stp1_13);             \
     927             :     const __m128i hi_10_13 = _mm_unpackhi_epi16(stp1_10, stp1_13);             \
     928             :                                                                                \
     929             :     MULTIPLICATION_AND_ADD(lo_0_8, hi_0_8, lo_4_12, hi_4_12, stg4_0, stg4_1,   \
     930             :                            stg4_2, stg4_3, stp2_0, stp2_1, stp2_2, stp2_3)     \
     931             :                                                                                \
     932             :     stp2_4 = _mm_add_epi16(stp1_4, stp1_5);                                    \
     933             :     stp2_5 = _mm_sub_epi16(stp1_4, stp1_5);                                    \
     934             :     stp2_6 = _mm_sub_epi16(stp1_7, stp1_6);                                    \
     935             :     stp2_7 = _mm_add_epi16(stp1_7, stp1_6);                                    \
     936             :                                                                                \
     937             :     MULTIPLICATION_AND_ADD(lo_9_14, hi_9_14, lo_10_13, hi_10_13, stg4_4,       \
     938             :                            stg4_5, stg4_6, stg4_7, stp2_9, stp2_14, stp2_10,   \
     939             :                            stp2_13)                                            \
     940             :   }                                                                            \
     941             :                                                                                \
     942             :   /* Stage5 */                                                                 \
     943             :   {                                                                            \
     944             :     const __m128i lo_6_5 = _mm_unpacklo_epi16(stp2_6, stp2_5);                 \
     945             :     const __m128i hi_6_5 = _mm_unpackhi_epi16(stp2_6, stp2_5);                 \
     946             :                                                                                \
     947             :     stp1_0 = _mm_add_epi16(stp2_0, stp2_3);                                    \
     948             :     stp1_1 = _mm_add_epi16(stp2_1, stp2_2);                                    \
     949             :     stp1_2 = _mm_sub_epi16(stp2_1, stp2_2);                                    \
     950             :     stp1_3 = _mm_sub_epi16(stp2_0, stp2_3);                                    \
     951             :                                                                                \
     952             :     tmp0 = _mm_madd_epi16(lo_6_5, stg4_1);                                     \
     953             :     tmp1 = _mm_madd_epi16(hi_6_5, stg4_1);                                     \
     954             :     tmp2 = _mm_madd_epi16(lo_6_5, stg4_0);                                     \
     955             :     tmp3 = _mm_madd_epi16(hi_6_5, stg4_0);                                     \
     956             :                                                                                \
     957             :     tmp0 = _mm_add_epi32(tmp0, rounding);                                      \
     958             :     tmp1 = _mm_add_epi32(tmp1, rounding);                                      \
     959             :     tmp2 = _mm_add_epi32(tmp2, rounding);                                      \
     960             :     tmp3 = _mm_add_epi32(tmp3, rounding);                                      \
     961             :                                                                                \
     962             :     tmp0 = _mm_srai_epi32(tmp0, DCT_CONST_BITS);                               \
     963             :     tmp1 = _mm_srai_epi32(tmp1, DCT_CONST_BITS);                               \
     964             :     tmp2 = _mm_srai_epi32(tmp2, DCT_CONST_BITS);                               \
     965             :     tmp3 = _mm_srai_epi32(tmp3, DCT_CONST_BITS);                               \
     966             :                                                                                \
     967             :     stp1_5 = _mm_packs_epi32(tmp0, tmp1);                                      \
     968             :     stp1_6 = _mm_packs_epi32(tmp2, tmp3);                                      \
     969             :                                                                                \
     970             :     stp1_8 = _mm_add_epi16(stp1_8_0, stp1_11);                                 \
     971             :     stp1_9 = _mm_add_epi16(stp2_9, stp2_10);                                   \
     972             :     stp1_10 = _mm_sub_epi16(stp2_9, stp2_10);                                  \
     973             :     stp1_11 = _mm_sub_epi16(stp1_8_0, stp1_11);                                \
     974             :                                                                                \
     975             :     stp1_12 = _mm_sub_epi16(stp1_15, stp1_12_0);                               \
     976             :     stp1_13 = _mm_sub_epi16(stp2_14, stp2_13);                                 \
     977             :     stp1_14 = _mm_add_epi16(stp2_14, stp2_13);                                 \
     978             :     stp1_15 = _mm_add_epi16(stp1_15, stp1_12_0);                               \
     979             :   }                                                                            \
     980             :                                                                                \
     981             :   /* Stage6 */                                                                 \
     982             :   {                                                                            \
     983             :     const __m128i lo_10_13 = _mm_unpacklo_epi16(stp1_10, stp1_13);             \
     984             :     const __m128i hi_10_13 = _mm_unpackhi_epi16(stp1_10, stp1_13);             \
     985             :     const __m128i lo_11_12 = _mm_unpacklo_epi16(stp1_11, stp1_12);             \
     986             :     const __m128i hi_11_12 = _mm_unpackhi_epi16(stp1_11, stp1_12);             \
     987             :                                                                                \
     988             :     stp2_0 = _mm_add_epi16(stp1_0, stp2_7);                                    \
     989             :     stp2_1 = _mm_add_epi16(stp1_1, stp1_6);                                    \
     990             :     stp2_2 = _mm_add_epi16(stp1_2, stp1_5);                                    \
     991             :     stp2_3 = _mm_add_epi16(stp1_3, stp2_4);                                    \
     992             :     stp2_4 = _mm_sub_epi16(stp1_3, stp2_4);                                    \
     993             :     stp2_5 = _mm_sub_epi16(stp1_2, stp1_5);                                    \
     994             :     stp2_6 = _mm_sub_epi16(stp1_1, stp1_6);                                    \
     995             :     stp2_7 = _mm_sub_epi16(stp1_0, stp2_7);                                    \
     996             :                                                                                \
     997             :     MULTIPLICATION_AND_ADD(lo_10_13, hi_10_13, lo_11_12, hi_11_12, stg6_0,     \
     998             :                            stg4_0, stg6_0, stg4_0, stp2_10, stp2_13, stp2_11,  \
     999             :                            stp2_12)                                            \
    1000             :   }
    1001             : 
    1002             : #define IDCT16_10                                                              \
    1003             :   /* Stage2 */                                                                 \
    1004             :   {                                                                            \
    1005             :     const __m128i lo_1_15 = _mm_unpacklo_epi16(in[1], zero);                   \
    1006             :     const __m128i hi_1_15 = _mm_unpackhi_epi16(in[1], zero);                   \
    1007             :     const __m128i lo_13_3 = _mm_unpacklo_epi16(zero, in[3]);                   \
    1008             :     const __m128i hi_13_3 = _mm_unpackhi_epi16(zero, in[3]);                   \
    1009             :                                                                                \
    1010             :     MULTIPLICATION_AND_ADD(lo_1_15, hi_1_15, lo_13_3, hi_13_3, stg2_0, stg2_1, \
    1011             :                            stg2_6, stg2_7, stp1_8_0, stp1_15, stp1_11,         \
    1012             :                            stp1_12_0)                                          \
    1013             :   }                                                                            \
    1014             :                                                                                \
    1015             :   /* Stage3 */                                                                 \
    1016             :   {                                                                            \
    1017             :     const __m128i lo_2_14 = _mm_unpacklo_epi16(in[2], zero);                   \
    1018             :     const __m128i hi_2_14 = _mm_unpackhi_epi16(in[2], zero);                   \
    1019             :                                                                                \
    1020             :     MULTIPLICATION_AND_ADD_2(lo_2_14, hi_2_14, stg3_0, stg3_1, stp2_4, stp2_7) \
    1021             :                                                                                \
    1022             :     stp1_9 = stp1_8_0;                                                         \
    1023             :     stp1_10 = stp1_11;                                                         \
    1024             :                                                                                \
    1025             :     stp1_13 = stp1_12_0;                                                       \
    1026             :     stp1_14 = stp1_15;                                                         \
    1027             :   }                                                                            \
    1028             :                                                                                \
    1029             :   /* Stage4 */                                                                 \
    1030             :   {                                                                            \
    1031             :     const __m128i lo_0_8 = _mm_unpacklo_epi16(in[0], zero);                    \
    1032             :     const __m128i hi_0_8 = _mm_unpackhi_epi16(in[0], zero);                    \
    1033             :                                                                                \
    1034             :     const __m128i lo_9_14 = _mm_unpacklo_epi16(stp1_9, stp1_14);               \
    1035             :     const __m128i hi_9_14 = _mm_unpackhi_epi16(stp1_9, stp1_14);               \
    1036             :     const __m128i lo_10_13 = _mm_unpacklo_epi16(stp1_10, stp1_13);             \
    1037             :     const __m128i hi_10_13 = _mm_unpackhi_epi16(stp1_10, stp1_13);             \
    1038             :                                                                                \
    1039             :     MULTIPLICATION_AND_ADD_2(lo_0_8, hi_0_8, stg4_0, stg4_1, stp1_0, stp1_1)   \
    1040             :     stp2_5 = stp2_4;                                                           \
    1041             :     stp2_6 = stp2_7;                                                           \
    1042             :                                                                                \
    1043             :     MULTIPLICATION_AND_ADD(lo_9_14, hi_9_14, lo_10_13, hi_10_13, stg4_4,       \
    1044             :                            stg4_5, stg4_6, stg4_7, stp2_9, stp2_14, stp2_10,   \
    1045             :                            stp2_13)                                            \
    1046             :   }                                                                            \
    1047             :                                                                                \
    1048             :   /* Stage5 */                                                                 \
    1049             :   {                                                                            \
    1050             :     const __m128i lo_6_5 = _mm_unpacklo_epi16(stp2_6, stp2_5);                 \
    1051             :     const __m128i hi_6_5 = _mm_unpackhi_epi16(stp2_6, stp2_5);                 \
    1052             :                                                                                \
    1053             :     stp1_2 = stp1_1;                                                           \
    1054             :     stp1_3 = stp1_0;                                                           \
    1055             :                                                                                \
    1056             :     tmp0 = _mm_madd_epi16(lo_6_5, stg4_1);                                     \
    1057             :     tmp1 = _mm_madd_epi16(hi_6_5, stg4_1);                                     \
    1058             :     tmp2 = _mm_madd_epi16(lo_6_5, stg4_0);                                     \
    1059             :     tmp3 = _mm_madd_epi16(hi_6_5, stg4_0);                                     \
    1060             :                                                                                \
    1061             :     tmp0 = _mm_add_epi32(tmp0, rounding);                                      \
    1062             :     tmp1 = _mm_add_epi32(tmp1, rounding);                                      \
    1063             :     tmp2 = _mm_add_epi32(tmp2, rounding);                                      \
    1064             :     tmp3 = _mm_add_epi32(tmp3, rounding);                                      \
    1065             :                                                                                \
    1066             :     tmp0 = _mm_srai_epi32(tmp0, DCT_CONST_BITS);                               \
    1067             :     tmp1 = _mm_srai_epi32(tmp1, DCT_CONST_BITS);                               \
    1068             :     tmp2 = _mm_srai_epi32(tmp2, DCT_CONST_BITS);                               \
    1069             :     tmp3 = _mm_srai_epi32(tmp3, DCT_CONST_BITS);                               \
    1070             :                                                                                \
    1071             :     stp1_5 = _mm_packs_epi32(tmp0, tmp1);                                      \
    1072             :     stp1_6 = _mm_packs_epi32(tmp2, tmp3);                                      \
    1073             :                                                                                \
    1074             :     stp1_8 = _mm_add_epi16(stp1_8_0, stp1_11);                                 \
    1075             :     stp1_9 = _mm_add_epi16(stp2_9, stp2_10);                                   \
    1076             :     stp1_10 = _mm_sub_epi16(stp2_9, stp2_10);                                  \
    1077             :     stp1_11 = _mm_sub_epi16(stp1_8_0, stp1_11);                                \
    1078             :                                                                                \
    1079             :     stp1_12 = _mm_sub_epi16(stp1_15, stp1_12_0);                               \
    1080             :     stp1_13 = _mm_sub_epi16(stp2_14, stp2_13);                                 \
    1081             :     stp1_14 = _mm_add_epi16(stp2_14, stp2_13);                                 \
    1082             :     stp1_15 = _mm_add_epi16(stp1_15, stp1_12_0);                               \
    1083             :   }                                                                            \
    1084             :                                                                                \
    1085             :   /* Stage6 */                                                                 \
    1086             :   {                                                                            \
    1087             :     const __m128i lo_10_13 = _mm_unpacklo_epi16(stp1_10, stp1_13);             \
    1088             :     const __m128i hi_10_13 = _mm_unpackhi_epi16(stp1_10, stp1_13);             \
    1089             :     const __m128i lo_11_12 = _mm_unpacklo_epi16(stp1_11, stp1_12);             \
    1090             :     const __m128i hi_11_12 = _mm_unpackhi_epi16(stp1_11, stp1_12);             \
    1091             :                                                                                \
    1092             :     stp2_0 = _mm_add_epi16(stp1_0, stp2_7);                                    \
    1093             :     stp2_1 = _mm_add_epi16(stp1_1, stp1_6);                                    \
    1094             :     stp2_2 = _mm_add_epi16(stp1_2, stp1_5);                                    \
    1095             :     stp2_3 = _mm_add_epi16(stp1_3, stp2_4);                                    \
    1096             :     stp2_4 = _mm_sub_epi16(stp1_3, stp2_4);                                    \
    1097             :     stp2_5 = _mm_sub_epi16(stp1_2, stp1_5);                                    \
    1098             :     stp2_6 = _mm_sub_epi16(stp1_1, stp1_6);                                    \
    1099             :     stp2_7 = _mm_sub_epi16(stp1_0, stp2_7);                                    \
    1100             :                                                                                \
    1101             :     MULTIPLICATION_AND_ADD(lo_10_13, hi_10_13, lo_11_12, hi_11_12, stg6_0,     \
    1102             :                            stg4_0, stg6_0, stg4_0, stp2_10, stp2_13, stp2_11,  \
    1103             :                            stp2_12)                                            \
    1104             :   }
    1105             : 
    1106           0 : void aom_idct16x16_256_add_sse2(const tran_low_t *input, uint8_t *dest,
    1107             :                                 int stride) {
    1108           0 :   const __m128i rounding = _mm_set1_epi32(DCT_CONST_ROUNDING);
    1109           0 :   const __m128i final_rounding = _mm_set1_epi16(1 << 5);
    1110           0 :   const __m128i zero = _mm_setzero_si128();
    1111             : 
    1112           0 :   const __m128i stg2_0 = pair_set_epi16(cospi_30_64, -cospi_2_64);
    1113           0 :   const __m128i stg2_1 = pair_set_epi16(cospi_2_64, cospi_30_64);
    1114           0 :   const __m128i stg2_2 = pair_set_epi16(cospi_14_64, -cospi_18_64);
    1115           0 :   const __m128i stg2_3 = pair_set_epi16(cospi_18_64, cospi_14_64);
    1116           0 :   const __m128i stg2_4 = pair_set_epi16(cospi_22_64, -cospi_10_64);
    1117           0 :   const __m128i stg2_5 = pair_set_epi16(cospi_10_64, cospi_22_64);
    1118           0 :   const __m128i stg2_6 = pair_set_epi16(cospi_6_64, -cospi_26_64);
    1119           0 :   const __m128i stg2_7 = pair_set_epi16(cospi_26_64, cospi_6_64);
    1120             : 
    1121           0 :   const __m128i stg3_0 = pair_set_epi16(cospi_28_64, -cospi_4_64);
    1122           0 :   const __m128i stg3_1 = pair_set_epi16(cospi_4_64, cospi_28_64);
    1123           0 :   const __m128i stg3_2 = pair_set_epi16(cospi_12_64, -cospi_20_64);
    1124           0 :   const __m128i stg3_3 = pair_set_epi16(cospi_20_64, cospi_12_64);
    1125             : 
    1126           0 :   const __m128i stg4_0 = pair_set_epi16(cospi_16_64, cospi_16_64);
    1127           0 :   const __m128i stg4_1 = pair_set_epi16(cospi_16_64, -cospi_16_64);
    1128           0 :   const __m128i stg4_2 = pair_set_epi16(cospi_24_64, -cospi_8_64);
    1129           0 :   const __m128i stg4_3 = pair_set_epi16(cospi_8_64, cospi_24_64);
    1130           0 :   const __m128i stg4_4 = pair_set_epi16(-cospi_8_64, cospi_24_64);
    1131           0 :   const __m128i stg4_5 = pair_set_epi16(cospi_24_64, cospi_8_64);
    1132           0 :   const __m128i stg4_6 = pair_set_epi16(-cospi_24_64, -cospi_8_64);
    1133           0 :   const __m128i stg4_7 = pair_set_epi16(-cospi_8_64, cospi_24_64);
    1134             : 
    1135           0 :   const __m128i stg6_0 = pair_set_epi16(-cospi_16_64, cospi_16_64);
    1136             : 
    1137             :   __m128i in[16], l[16], r[16], *curr1;
    1138             :   __m128i stp1_0, stp1_1, stp1_2, stp1_3, stp1_4, stp1_5, stp1_6, stp1_7,
    1139             :       stp1_8, stp1_9, stp1_10, stp1_11, stp1_12, stp1_13, stp1_14, stp1_15,
    1140             :       stp1_8_0, stp1_12_0;
    1141             :   __m128i stp2_0, stp2_1, stp2_2, stp2_3, stp2_4, stp2_5, stp2_6, stp2_7,
    1142             :       stp2_8, stp2_9, stp2_10, stp2_11, stp2_12, stp2_13, stp2_14, stp2_15;
    1143             :   __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
    1144             :   int i;
    1145             : 
    1146           0 :   curr1 = l;
    1147           0 :   for (i = 0; i < 2; i++) {
    1148             :     // 1-D idct
    1149             : 
    1150             :     // Load input data.
    1151           0 :     in[0] = load_input_data(input);
    1152           0 :     in[8] = load_input_data(input + 8 * 1);
    1153           0 :     in[1] = load_input_data(input + 8 * 2);
    1154           0 :     in[9] = load_input_data(input + 8 * 3);
    1155           0 :     in[2] = load_input_data(input + 8 * 4);
    1156           0 :     in[10] = load_input_data(input + 8 * 5);
    1157           0 :     in[3] = load_input_data(input + 8 * 6);
    1158           0 :     in[11] = load_input_data(input + 8 * 7);
    1159           0 :     in[4] = load_input_data(input + 8 * 8);
    1160           0 :     in[12] = load_input_data(input + 8 * 9);
    1161           0 :     in[5] = load_input_data(input + 8 * 10);
    1162           0 :     in[13] = load_input_data(input + 8 * 11);
    1163           0 :     in[6] = load_input_data(input + 8 * 12);
    1164           0 :     in[14] = load_input_data(input + 8 * 13);
    1165           0 :     in[7] = load_input_data(input + 8 * 14);
    1166           0 :     in[15] = load_input_data(input + 8 * 15);
    1167             : 
    1168           0 :     array_transpose_8x8(in, in);
    1169           0 :     array_transpose_8x8(in + 8, in + 8);
    1170             : 
    1171           0 :     IDCT16
    1172             : 
    1173             :     // Stage7
    1174           0 :     curr1[0] = _mm_add_epi16(stp2_0, stp1_15);
    1175           0 :     curr1[1] = _mm_add_epi16(stp2_1, stp1_14);
    1176           0 :     curr1[2] = _mm_add_epi16(stp2_2, stp2_13);
    1177           0 :     curr1[3] = _mm_add_epi16(stp2_3, stp2_12);
    1178           0 :     curr1[4] = _mm_add_epi16(stp2_4, stp2_11);
    1179           0 :     curr1[5] = _mm_add_epi16(stp2_5, stp2_10);
    1180           0 :     curr1[6] = _mm_add_epi16(stp2_6, stp1_9);
    1181           0 :     curr1[7] = _mm_add_epi16(stp2_7, stp1_8);
    1182           0 :     curr1[8] = _mm_sub_epi16(stp2_7, stp1_8);
    1183           0 :     curr1[9] = _mm_sub_epi16(stp2_6, stp1_9);
    1184           0 :     curr1[10] = _mm_sub_epi16(stp2_5, stp2_10);
    1185           0 :     curr1[11] = _mm_sub_epi16(stp2_4, stp2_11);
    1186           0 :     curr1[12] = _mm_sub_epi16(stp2_3, stp2_12);
    1187           0 :     curr1[13] = _mm_sub_epi16(stp2_2, stp2_13);
    1188           0 :     curr1[14] = _mm_sub_epi16(stp2_1, stp1_14);
    1189           0 :     curr1[15] = _mm_sub_epi16(stp2_0, stp1_15);
    1190             : 
    1191           0 :     curr1 = r;
    1192           0 :     input += 128;
    1193             :   }
    1194           0 :   for (i = 0; i < 2; i++) {
    1195             :     int j;
    1196             :     // 1-D idct
    1197           0 :     array_transpose_8x8(l + i * 8, in);
    1198           0 :     array_transpose_8x8(r + i * 8, in + 8);
    1199             : 
    1200           0 :     IDCT16
    1201             : 
    1202             :     // 2-D
    1203           0 :     in[0] = _mm_add_epi16(stp2_0, stp1_15);
    1204           0 :     in[1] = _mm_add_epi16(stp2_1, stp1_14);
    1205           0 :     in[2] = _mm_add_epi16(stp2_2, stp2_13);
    1206           0 :     in[3] = _mm_add_epi16(stp2_3, stp2_12);
    1207           0 :     in[4] = _mm_add_epi16(stp2_4, stp2_11);
    1208           0 :     in[5] = _mm_add_epi16(stp2_5, stp2_10);
    1209           0 :     in[6] = _mm_add_epi16(stp2_6, stp1_9);
    1210           0 :     in[7] = _mm_add_epi16(stp2_7, stp1_8);
    1211           0 :     in[8] = _mm_sub_epi16(stp2_7, stp1_8);
    1212           0 :     in[9] = _mm_sub_epi16(stp2_6, stp1_9);
    1213           0 :     in[10] = _mm_sub_epi16(stp2_5, stp2_10);
    1214           0 :     in[11] = _mm_sub_epi16(stp2_4, stp2_11);
    1215           0 :     in[12] = _mm_sub_epi16(stp2_3, stp2_12);
    1216           0 :     in[13] = _mm_sub_epi16(stp2_2, stp2_13);
    1217           0 :     in[14] = _mm_sub_epi16(stp2_1, stp1_14);
    1218           0 :     in[15] = _mm_sub_epi16(stp2_0, stp1_15);
    1219             : 
    1220           0 :     for (j = 0; j < 16; ++j) {
    1221             :       // Final rounding and shift
    1222           0 :       in[j] = _mm_adds_epi16(in[j], final_rounding);
    1223           0 :       in[j] = _mm_srai_epi16(in[j], 6);
    1224           0 :       RECON_AND_STORE(dest + j * stride, in[j]);
    1225             :     }
    1226             : 
    1227           0 :     dest += 8;
    1228             :   }
    1229           0 : }
    1230             : 
    1231           0 : void aom_idct16x16_1_add_sse2(const tran_low_t *input, uint8_t *dest,
    1232             :                               int stride) {
    1233             :   __m128i dc_value;
    1234           0 :   const __m128i zero = _mm_setzero_si128();
    1235             :   int a, i;
    1236             : 
    1237           0 :   a = (int)dct_const_round_shift(input[0] * cospi_16_64);
    1238           0 :   a = (int)dct_const_round_shift(a * cospi_16_64);
    1239           0 :   a = ROUND_POWER_OF_TWO(a, 6);
    1240             : 
    1241           0 :   if (a == 0) return;
    1242             : 
    1243           0 :   dc_value = _mm_set1_epi16(a);
    1244             : 
    1245           0 :   for (i = 0; i < 16; ++i) {
    1246           0 :     RECON_AND_STORE(dest + 0, dc_value);
    1247           0 :     RECON_AND_STORE(dest + 8, dc_value);
    1248           0 :     dest += stride;
    1249             :   }
    1250             : }
    1251             : 
    1252           0 : void iadst16_8col(__m128i *in) {
    1253             :   // perform 16x16 1-D ADST for 8 columns
    1254             :   __m128i s[16], x[16], u[32], v[32];
    1255           0 :   const __m128i k__cospi_p01_p31 = pair_set_epi16(cospi_1_64, cospi_31_64);
    1256           0 :   const __m128i k__cospi_p31_m01 = pair_set_epi16(cospi_31_64, -cospi_1_64);
    1257           0 :   const __m128i k__cospi_p05_p27 = pair_set_epi16(cospi_5_64, cospi_27_64);
    1258           0 :   const __m128i k__cospi_p27_m05 = pair_set_epi16(cospi_27_64, -cospi_5_64);
    1259           0 :   const __m128i k__cospi_p09_p23 = pair_set_epi16(cospi_9_64, cospi_23_64);
    1260           0 :   const __m128i k__cospi_p23_m09 = pair_set_epi16(cospi_23_64, -cospi_9_64);
    1261           0 :   const __m128i k__cospi_p13_p19 = pair_set_epi16(cospi_13_64, cospi_19_64);
    1262           0 :   const __m128i k__cospi_p19_m13 = pair_set_epi16(cospi_19_64, -cospi_13_64);
    1263           0 :   const __m128i k__cospi_p17_p15 = pair_set_epi16(cospi_17_64, cospi_15_64);
    1264           0 :   const __m128i k__cospi_p15_m17 = pair_set_epi16(cospi_15_64, -cospi_17_64);
    1265           0 :   const __m128i k__cospi_p21_p11 = pair_set_epi16(cospi_21_64, cospi_11_64);
    1266           0 :   const __m128i k__cospi_p11_m21 = pair_set_epi16(cospi_11_64, -cospi_21_64);
    1267           0 :   const __m128i k__cospi_p25_p07 = pair_set_epi16(cospi_25_64, cospi_7_64);
    1268           0 :   const __m128i k__cospi_p07_m25 = pair_set_epi16(cospi_7_64, -cospi_25_64);
    1269           0 :   const __m128i k__cospi_p29_p03 = pair_set_epi16(cospi_29_64, cospi_3_64);
    1270           0 :   const __m128i k__cospi_p03_m29 = pair_set_epi16(cospi_3_64, -cospi_29_64);
    1271           0 :   const __m128i k__cospi_p04_p28 = pair_set_epi16(cospi_4_64, cospi_28_64);
    1272           0 :   const __m128i k__cospi_p28_m04 = pair_set_epi16(cospi_28_64, -cospi_4_64);
    1273           0 :   const __m128i k__cospi_p20_p12 = pair_set_epi16(cospi_20_64, cospi_12_64);
    1274           0 :   const __m128i k__cospi_p12_m20 = pair_set_epi16(cospi_12_64, -cospi_20_64);
    1275           0 :   const __m128i k__cospi_m28_p04 = pair_set_epi16(-cospi_28_64, cospi_4_64);
    1276           0 :   const __m128i k__cospi_m12_p20 = pair_set_epi16(-cospi_12_64, cospi_20_64);
    1277           0 :   const __m128i k__cospi_p08_p24 = pair_set_epi16(cospi_8_64, cospi_24_64);
    1278           0 :   const __m128i k__cospi_p24_m08 = pair_set_epi16(cospi_24_64, -cospi_8_64);
    1279           0 :   const __m128i k__cospi_m24_p08 = pair_set_epi16(-cospi_24_64, cospi_8_64);
    1280           0 :   const __m128i k__cospi_m16_m16 = _mm_set1_epi16((int16_t)-cospi_16_64);
    1281           0 :   const __m128i k__cospi_p16_p16 = _mm_set1_epi16((int16_t)cospi_16_64);
    1282           0 :   const __m128i k__cospi_p16_m16 = pair_set_epi16(cospi_16_64, -cospi_16_64);
    1283           0 :   const __m128i k__cospi_m16_p16 = pair_set_epi16(-cospi_16_64, cospi_16_64);
    1284           0 :   const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
    1285           0 :   const __m128i kZero = _mm_set1_epi16(0);
    1286             : 
    1287           0 :   u[0] = _mm_unpacklo_epi16(in[15], in[0]);
    1288           0 :   u[1] = _mm_unpackhi_epi16(in[15], in[0]);
    1289           0 :   u[2] = _mm_unpacklo_epi16(in[13], in[2]);
    1290           0 :   u[3] = _mm_unpackhi_epi16(in[13], in[2]);
    1291           0 :   u[4] = _mm_unpacklo_epi16(in[11], in[4]);
    1292           0 :   u[5] = _mm_unpackhi_epi16(in[11], in[4]);
    1293           0 :   u[6] = _mm_unpacklo_epi16(in[9], in[6]);
    1294           0 :   u[7] = _mm_unpackhi_epi16(in[9], in[6]);
    1295           0 :   u[8] = _mm_unpacklo_epi16(in[7], in[8]);
    1296           0 :   u[9] = _mm_unpackhi_epi16(in[7], in[8]);
    1297           0 :   u[10] = _mm_unpacklo_epi16(in[5], in[10]);
    1298           0 :   u[11] = _mm_unpackhi_epi16(in[5], in[10]);
    1299           0 :   u[12] = _mm_unpacklo_epi16(in[3], in[12]);
    1300           0 :   u[13] = _mm_unpackhi_epi16(in[3], in[12]);
    1301           0 :   u[14] = _mm_unpacklo_epi16(in[1], in[14]);
    1302           0 :   u[15] = _mm_unpackhi_epi16(in[1], in[14]);
    1303             : 
    1304           0 :   v[0] = _mm_madd_epi16(u[0], k__cospi_p01_p31);
    1305           0 :   v[1] = _mm_madd_epi16(u[1], k__cospi_p01_p31);
    1306           0 :   v[2] = _mm_madd_epi16(u[0], k__cospi_p31_m01);
    1307           0 :   v[3] = _mm_madd_epi16(u[1], k__cospi_p31_m01);
    1308           0 :   v[4] = _mm_madd_epi16(u[2], k__cospi_p05_p27);
    1309           0 :   v[5] = _mm_madd_epi16(u[3], k__cospi_p05_p27);
    1310           0 :   v[6] = _mm_madd_epi16(u[2], k__cospi_p27_m05);
    1311           0 :   v[7] = _mm_madd_epi16(u[3], k__cospi_p27_m05);
    1312           0 :   v[8] = _mm_madd_epi16(u[4], k__cospi_p09_p23);
    1313           0 :   v[9] = _mm_madd_epi16(u[5], k__cospi_p09_p23);
    1314           0 :   v[10] = _mm_madd_epi16(u[4], k__cospi_p23_m09);
    1315           0 :   v[11] = _mm_madd_epi16(u[5], k__cospi_p23_m09);
    1316           0 :   v[12] = _mm_madd_epi16(u[6], k__cospi_p13_p19);
    1317           0 :   v[13] = _mm_madd_epi16(u[7], k__cospi_p13_p19);
    1318           0 :   v[14] = _mm_madd_epi16(u[6], k__cospi_p19_m13);
    1319           0 :   v[15] = _mm_madd_epi16(u[7], k__cospi_p19_m13);
    1320           0 :   v[16] = _mm_madd_epi16(u[8], k__cospi_p17_p15);
    1321           0 :   v[17] = _mm_madd_epi16(u[9], k__cospi_p17_p15);
    1322           0 :   v[18] = _mm_madd_epi16(u[8], k__cospi_p15_m17);
    1323           0 :   v[19] = _mm_madd_epi16(u[9], k__cospi_p15_m17);
    1324           0 :   v[20] = _mm_madd_epi16(u[10], k__cospi_p21_p11);
    1325           0 :   v[21] = _mm_madd_epi16(u[11], k__cospi_p21_p11);
    1326           0 :   v[22] = _mm_madd_epi16(u[10], k__cospi_p11_m21);
    1327           0 :   v[23] = _mm_madd_epi16(u[11], k__cospi_p11_m21);
    1328           0 :   v[24] = _mm_madd_epi16(u[12], k__cospi_p25_p07);
    1329           0 :   v[25] = _mm_madd_epi16(u[13], k__cospi_p25_p07);
    1330           0 :   v[26] = _mm_madd_epi16(u[12], k__cospi_p07_m25);
    1331           0 :   v[27] = _mm_madd_epi16(u[13], k__cospi_p07_m25);
    1332           0 :   v[28] = _mm_madd_epi16(u[14], k__cospi_p29_p03);
    1333           0 :   v[29] = _mm_madd_epi16(u[15], k__cospi_p29_p03);
    1334           0 :   v[30] = _mm_madd_epi16(u[14], k__cospi_p03_m29);
    1335           0 :   v[31] = _mm_madd_epi16(u[15], k__cospi_p03_m29);
    1336             : 
    1337           0 :   u[0] = _mm_add_epi32(v[0], v[16]);
    1338           0 :   u[1] = _mm_add_epi32(v[1], v[17]);
    1339           0 :   u[2] = _mm_add_epi32(v[2], v[18]);
    1340           0 :   u[3] = _mm_add_epi32(v[3], v[19]);
    1341           0 :   u[4] = _mm_add_epi32(v[4], v[20]);
    1342           0 :   u[5] = _mm_add_epi32(v[5], v[21]);
    1343           0 :   u[6] = _mm_add_epi32(v[6], v[22]);
    1344           0 :   u[7] = _mm_add_epi32(v[7], v[23]);
    1345           0 :   u[8] = _mm_add_epi32(v[8], v[24]);
    1346           0 :   u[9] = _mm_add_epi32(v[9], v[25]);
    1347           0 :   u[10] = _mm_add_epi32(v[10], v[26]);
    1348           0 :   u[11] = _mm_add_epi32(v[11], v[27]);
    1349           0 :   u[12] = _mm_add_epi32(v[12], v[28]);
    1350           0 :   u[13] = _mm_add_epi32(v[13], v[29]);
    1351           0 :   u[14] = _mm_add_epi32(v[14], v[30]);
    1352           0 :   u[15] = _mm_add_epi32(v[15], v[31]);
    1353           0 :   u[16] = _mm_sub_epi32(v[0], v[16]);
    1354           0 :   u[17] = _mm_sub_epi32(v[1], v[17]);
    1355           0 :   u[18] = _mm_sub_epi32(v[2], v[18]);
    1356           0 :   u[19] = _mm_sub_epi32(v[3], v[19]);
    1357           0 :   u[20] = _mm_sub_epi32(v[4], v[20]);
    1358           0 :   u[21] = _mm_sub_epi32(v[5], v[21]);
    1359           0 :   u[22] = _mm_sub_epi32(v[6], v[22]);
    1360           0 :   u[23] = _mm_sub_epi32(v[7], v[23]);
    1361           0 :   u[24] = _mm_sub_epi32(v[8], v[24]);
    1362           0 :   u[25] = _mm_sub_epi32(v[9], v[25]);
    1363           0 :   u[26] = _mm_sub_epi32(v[10], v[26]);
    1364           0 :   u[27] = _mm_sub_epi32(v[11], v[27]);
    1365           0 :   u[28] = _mm_sub_epi32(v[12], v[28]);
    1366           0 :   u[29] = _mm_sub_epi32(v[13], v[29]);
    1367           0 :   u[30] = _mm_sub_epi32(v[14], v[30]);
    1368           0 :   u[31] = _mm_sub_epi32(v[15], v[31]);
    1369             : 
    1370           0 :   v[0] = _mm_add_epi32(u[0], k__DCT_CONST_ROUNDING);
    1371           0 :   v[1] = _mm_add_epi32(u[1], k__DCT_CONST_ROUNDING);
    1372           0 :   v[2] = _mm_add_epi32(u[2], k__DCT_CONST_ROUNDING);
    1373           0 :   v[3] = _mm_add_epi32(u[3], k__DCT_CONST_ROUNDING);
    1374           0 :   v[4] = _mm_add_epi32(u[4], k__DCT_CONST_ROUNDING);
    1375           0 :   v[5] = _mm_add_epi32(u[5], k__DCT_CONST_ROUNDING);
    1376           0 :   v[6] = _mm_add_epi32(u[6], k__DCT_CONST_ROUNDING);
    1377           0 :   v[7] = _mm_add_epi32(u[7], k__DCT_CONST_ROUNDING);
    1378           0 :   v[8] = _mm_add_epi32(u[8], k__DCT_CONST_ROUNDING);
    1379           0 :   v[9] = _mm_add_epi32(u[9], k__DCT_CONST_ROUNDING);
    1380           0 :   v[10] = _mm_add_epi32(u[10], k__DCT_CONST_ROUNDING);
    1381           0 :   v[11] = _mm_add_epi32(u[11], k__DCT_CONST_ROUNDING);
    1382           0 :   v[12] = _mm_add_epi32(u[12], k__DCT_CONST_ROUNDING);
    1383           0 :   v[13] = _mm_add_epi32(u[13], k__DCT_CONST_ROUNDING);
    1384           0 :   v[14] = _mm_add_epi32(u[14], k__DCT_CONST_ROUNDING);
    1385           0 :   v[15] = _mm_add_epi32(u[15], k__DCT_CONST_ROUNDING);
    1386           0 :   v[16] = _mm_add_epi32(u[16], k__DCT_CONST_ROUNDING);
    1387           0 :   v[17] = _mm_add_epi32(u[17], k__DCT_CONST_ROUNDING);
    1388           0 :   v[18] = _mm_add_epi32(u[18], k__DCT_CONST_ROUNDING);
    1389           0 :   v[19] = _mm_add_epi32(u[19], k__DCT_CONST_ROUNDING);
    1390           0 :   v[20] = _mm_add_epi32(u[20], k__DCT_CONST_ROUNDING);
    1391           0 :   v[21] = _mm_add_epi32(u[21], k__DCT_CONST_ROUNDING);
    1392           0 :   v[22] = _mm_add_epi32(u[22], k__DCT_CONST_ROUNDING);
    1393           0 :   v[23] = _mm_add_epi32(u[23], k__DCT_CONST_ROUNDING);
    1394           0 :   v[24] = _mm_add_epi32(u[24], k__DCT_CONST_ROUNDING);
    1395           0 :   v[25] = _mm_add_epi32(u[25], k__DCT_CONST_ROUNDING);
    1396           0 :   v[26] = _mm_add_epi32(u[26], k__DCT_CONST_ROUNDING);
    1397           0 :   v[27] = _mm_add_epi32(u[27], k__DCT_CONST_ROUNDING);
    1398           0 :   v[28] = _mm_add_epi32(u[28], k__DCT_CONST_ROUNDING);
    1399           0 :   v[29] = _mm_add_epi32(u[29], k__DCT_CONST_ROUNDING);
    1400           0 :   v[30] = _mm_add_epi32(u[30], k__DCT_CONST_ROUNDING);
    1401           0 :   v[31] = _mm_add_epi32(u[31], k__DCT_CONST_ROUNDING);
    1402             : 
    1403           0 :   u[0] = _mm_srai_epi32(v[0], DCT_CONST_BITS);
    1404           0 :   u[1] = _mm_srai_epi32(v[1], DCT_CONST_BITS);
    1405           0 :   u[2] = _mm_srai_epi32(v[2], DCT_CONST_BITS);
    1406           0 :   u[3] = _mm_srai_epi32(v[3], DCT_CONST_BITS);
    1407           0 :   u[4] = _mm_srai_epi32(v[4], DCT_CONST_BITS);
    1408           0 :   u[5] = _mm_srai_epi32(v[5], DCT_CONST_BITS);
    1409           0 :   u[6] = _mm_srai_epi32(v[6], DCT_CONST_BITS);
    1410           0 :   u[7] = _mm_srai_epi32(v[7], DCT_CONST_BITS);
    1411           0 :   u[8] = _mm_srai_epi32(v[8], DCT_CONST_BITS);
    1412           0 :   u[9] = _mm_srai_epi32(v[9], DCT_CONST_BITS);
    1413           0 :   u[10] = _mm_srai_epi32(v[10], DCT_CONST_BITS);
    1414           0 :   u[11] = _mm_srai_epi32(v[11], DCT_CONST_BITS);
    1415           0 :   u[12] = _mm_srai_epi32(v[12], DCT_CONST_BITS);
    1416           0 :   u[13] = _mm_srai_epi32(v[13], DCT_CONST_BITS);
    1417           0 :   u[14] = _mm_srai_epi32(v[14], DCT_CONST_BITS);
    1418           0 :   u[15] = _mm_srai_epi32(v[15], DCT_CONST_BITS);
    1419           0 :   u[16] = _mm_srai_epi32(v[16], DCT_CONST_BITS);
    1420           0 :   u[17] = _mm_srai_epi32(v[17], DCT_CONST_BITS);
    1421           0 :   u[18] = _mm_srai_epi32(v[18], DCT_CONST_BITS);
    1422           0 :   u[19] = _mm_srai_epi32(v[19], DCT_CONST_BITS);
    1423           0 :   u[20] = _mm_srai_epi32(v[20], DCT_CONST_BITS);
    1424           0 :   u[21] = _mm_srai_epi32(v[21], DCT_CONST_BITS);
    1425           0 :   u[22] = _mm_srai_epi32(v[22], DCT_CONST_BITS);
    1426           0 :   u[23] = _mm_srai_epi32(v[23], DCT_CONST_BITS);
    1427           0 :   u[24] = _mm_srai_epi32(v[24], DCT_CONST_BITS);
    1428           0 :   u[25] = _mm_srai_epi32(v[25], DCT_CONST_BITS);
    1429           0 :   u[26] = _mm_srai_epi32(v[26], DCT_CONST_BITS);
    1430           0 :   u[27] = _mm_srai_epi32(v[27], DCT_CONST_BITS);
    1431           0 :   u[28] = _mm_srai_epi32(v[28], DCT_CONST_BITS);
    1432           0 :   u[29] = _mm_srai_epi32(v[29], DCT_CONST_BITS);
    1433           0 :   u[30] = _mm_srai_epi32(v[30], DCT_CONST_BITS);
    1434           0 :   u[31] = _mm_srai_epi32(v[31], DCT_CONST_BITS);
    1435             : 
    1436           0 :   s[0] = _mm_packs_epi32(u[0], u[1]);
    1437           0 :   s[1] = _mm_packs_epi32(u[2], u[3]);
    1438           0 :   s[2] = _mm_packs_epi32(u[4], u[5]);
    1439           0 :   s[3] = _mm_packs_epi32(u[6], u[7]);
    1440           0 :   s[4] = _mm_packs_epi32(u[8], u[9]);
    1441           0 :   s[5] = _mm_packs_epi32(u[10], u[11]);
    1442           0 :   s[6] = _mm_packs_epi32(u[12], u[13]);
    1443           0 :   s[7] = _mm_packs_epi32(u[14], u[15]);
    1444           0 :   s[8] = _mm_packs_epi32(u[16], u[17]);
    1445           0 :   s[9] = _mm_packs_epi32(u[18], u[19]);
    1446           0 :   s[10] = _mm_packs_epi32(u[20], u[21]);
    1447           0 :   s[11] = _mm_packs_epi32(u[22], u[23]);
    1448           0 :   s[12] = _mm_packs_epi32(u[24], u[25]);
    1449           0 :   s[13] = _mm_packs_epi32(u[26], u[27]);
    1450           0 :   s[14] = _mm_packs_epi32(u[28], u[29]);
    1451           0 :   s[15] = _mm_packs_epi32(u[30], u[31]);
    1452             : 
    1453             :   // stage 2
    1454           0 :   u[0] = _mm_unpacklo_epi16(s[8], s[9]);
    1455           0 :   u[1] = _mm_unpackhi_epi16(s[8], s[9]);
    1456           0 :   u[2] = _mm_unpacklo_epi16(s[10], s[11]);
    1457           0 :   u[3] = _mm_unpackhi_epi16(s[10], s[11]);
    1458           0 :   u[4] = _mm_unpacklo_epi16(s[12], s[13]);
    1459           0 :   u[5] = _mm_unpackhi_epi16(s[12], s[13]);
    1460           0 :   u[6] = _mm_unpacklo_epi16(s[14], s[15]);
    1461           0 :   u[7] = _mm_unpackhi_epi16(s[14], s[15]);
    1462             : 
    1463           0 :   v[0] = _mm_madd_epi16(u[0], k__cospi_p04_p28);
    1464           0 :   v[1] = _mm_madd_epi16(u[1], k__cospi_p04_p28);
    1465           0 :   v[2] = _mm_madd_epi16(u[0], k__cospi_p28_m04);
    1466           0 :   v[3] = _mm_madd_epi16(u[1], k__cospi_p28_m04);
    1467           0 :   v[4] = _mm_madd_epi16(u[2], k__cospi_p20_p12);
    1468           0 :   v[5] = _mm_madd_epi16(u[3], k__cospi_p20_p12);
    1469           0 :   v[6] = _mm_madd_epi16(u[2], k__cospi_p12_m20);
    1470           0 :   v[7] = _mm_madd_epi16(u[3], k__cospi_p12_m20);
    1471           0 :   v[8] = _mm_madd_epi16(u[4], k__cospi_m28_p04);
    1472           0 :   v[9] = _mm_madd_epi16(u[5], k__cospi_m28_p04);
    1473           0 :   v[10] = _mm_madd_epi16(u[4], k__cospi_p04_p28);
    1474           0 :   v[11] = _mm_madd_epi16(u[5], k__cospi_p04_p28);
    1475           0 :   v[12] = _mm_madd_epi16(u[6], k__cospi_m12_p20);
    1476           0 :   v[13] = _mm_madd_epi16(u[7], k__cospi_m12_p20);
    1477           0 :   v[14] = _mm_madd_epi16(u[6], k__cospi_p20_p12);
    1478           0 :   v[15] = _mm_madd_epi16(u[7], k__cospi_p20_p12);
    1479             : 
    1480           0 :   u[0] = _mm_add_epi32(v[0], v[8]);
    1481           0 :   u[1] = _mm_add_epi32(v[1], v[9]);
    1482           0 :   u[2] = _mm_add_epi32(v[2], v[10]);
    1483           0 :   u[3] = _mm_add_epi32(v[3], v[11]);
    1484           0 :   u[4] = _mm_add_epi32(v[4], v[12]);
    1485           0 :   u[5] = _mm_add_epi32(v[5], v[13]);
    1486           0 :   u[6] = _mm_add_epi32(v[6], v[14]);
    1487           0 :   u[7] = _mm_add_epi32(v[7], v[15]);
    1488           0 :   u[8] = _mm_sub_epi32(v[0], v[8]);
    1489           0 :   u[9] = _mm_sub_epi32(v[1], v[9]);
    1490           0 :   u[10] = _mm_sub_epi32(v[2], v[10]);
    1491           0 :   u[11] = _mm_sub_epi32(v[3], v[11]);
    1492           0 :   u[12] = _mm_sub_epi32(v[4], v[12]);
    1493           0 :   u[13] = _mm_sub_epi32(v[5], v[13]);
    1494           0 :   u[14] = _mm_sub_epi32(v[6], v[14]);
    1495           0 :   u[15] = _mm_sub_epi32(v[7], v[15]);
    1496             : 
    1497           0 :   v[0] = _mm_add_epi32(u[0], k__DCT_CONST_ROUNDING);
    1498           0 :   v[1] = _mm_add_epi32(u[1], k__DCT_CONST_ROUNDING);
    1499           0 :   v[2] = _mm_add_epi32(u[2], k__DCT_CONST_ROUNDING);
    1500           0 :   v[3] = _mm_add_epi32(u[3], k__DCT_CONST_ROUNDING);
    1501           0 :   v[4] = _mm_add_epi32(u[4], k__DCT_CONST_ROUNDING);
    1502           0 :   v[5] = _mm_add_epi32(u[5], k__DCT_CONST_ROUNDING);
    1503           0 :   v[6] = _mm_add_epi32(u[6], k__DCT_CONST_ROUNDING);
    1504           0 :   v[7] = _mm_add_epi32(u[7], k__DCT_CONST_ROUNDING);
    1505           0 :   v[8] = _mm_add_epi32(u[8], k__DCT_CONST_ROUNDING);
    1506           0 :   v[9] = _mm_add_epi32(u[9], k__DCT_CONST_ROUNDING);
    1507           0 :   v[10] = _mm_add_epi32(u[10], k__DCT_CONST_ROUNDING);
    1508           0 :   v[11] = _mm_add_epi32(u[11], k__DCT_CONST_ROUNDING);
    1509           0 :   v[12] = _mm_add_epi32(u[12], k__DCT_CONST_ROUNDING);
    1510           0 :   v[13] = _mm_add_epi32(u[13], k__DCT_CONST_ROUNDING);
    1511           0 :   v[14] = _mm_add_epi32(u[14], k__DCT_CONST_ROUNDING);
    1512           0 :   v[15] = _mm_add_epi32(u[15], k__DCT_CONST_ROUNDING);
    1513             : 
    1514           0 :   u[0] = _mm_srai_epi32(v[0], DCT_CONST_BITS);
    1515           0 :   u[1] = _mm_srai_epi32(v[1], DCT_CONST_BITS);
    1516           0 :   u[2] = _mm_srai_epi32(v[2], DCT_CONST_BITS);
    1517           0 :   u[3] = _mm_srai_epi32(v[3], DCT_CONST_BITS);
    1518           0 :   u[4] = _mm_srai_epi32(v[4], DCT_CONST_BITS);
    1519           0 :   u[5] = _mm_srai_epi32(v[5], DCT_CONST_BITS);
    1520           0 :   u[6] = _mm_srai_epi32(v[6], DCT_CONST_BITS);
    1521           0 :   u[7] = _mm_srai_epi32(v[7], DCT_CONST_BITS);
    1522           0 :   u[8] = _mm_srai_epi32(v[8], DCT_CONST_BITS);
    1523           0 :   u[9] = _mm_srai_epi32(v[9], DCT_CONST_BITS);
    1524           0 :   u[10] = _mm_srai_epi32(v[10], DCT_CONST_BITS);
    1525           0 :   u[11] = _mm_srai_epi32(v[11], DCT_CONST_BITS);
    1526           0 :   u[12] = _mm_srai_epi32(v[12], DCT_CONST_BITS);
    1527           0 :   u[13] = _mm_srai_epi32(v[13], DCT_CONST_BITS);
    1528           0 :   u[14] = _mm_srai_epi32(v[14], DCT_CONST_BITS);
    1529           0 :   u[15] = _mm_srai_epi32(v[15], DCT_CONST_BITS);
    1530             : 
    1531           0 :   x[0] = _mm_add_epi16(s[0], s[4]);
    1532           0 :   x[1] = _mm_add_epi16(s[1], s[5]);
    1533           0 :   x[2] = _mm_add_epi16(s[2], s[6]);
    1534           0 :   x[3] = _mm_add_epi16(s[3], s[7]);
    1535           0 :   x[4] = _mm_sub_epi16(s[0], s[4]);
    1536           0 :   x[5] = _mm_sub_epi16(s[1], s[5]);
    1537           0 :   x[6] = _mm_sub_epi16(s[2], s[6]);
    1538           0 :   x[7] = _mm_sub_epi16(s[3], s[7]);
    1539           0 :   x[8] = _mm_packs_epi32(u[0], u[1]);
    1540           0 :   x[9] = _mm_packs_epi32(u[2], u[3]);
    1541           0 :   x[10] = _mm_packs_epi32(u[4], u[5]);
    1542           0 :   x[11] = _mm_packs_epi32(u[6], u[7]);
    1543           0 :   x[12] = _mm_packs_epi32(u[8], u[9]);
    1544           0 :   x[13] = _mm_packs_epi32(u[10], u[11]);
    1545           0 :   x[14] = _mm_packs_epi32(u[12], u[13]);
    1546           0 :   x[15] = _mm_packs_epi32(u[14], u[15]);
    1547             : 
    1548             :   // stage 3
    1549           0 :   u[0] = _mm_unpacklo_epi16(x[4], x[5]);
    1550           0 :   u[1] = _mm_unpackhi_epi16(x[4], x[5]);
    1551           0 :   u[2] = _mm_unpacklo_epi16(x[6], x[7]);
    1552           0 :   u[3] = _mm_unpackhi_epi16(x[6], x[7]);
    1553           0 :   u[4] = _mm_unpacklo_epi16(x[12], x[13]);
    1554           0 :   u[5] = _mm_unpackhi_epi16(x[12], x[13]);
    1555           0 :   u[6] = _mm_unpacklo_epi16(x[14], x[15]);
    1556           0 :   u[7] = _mm_unpackhi_epi16(x[14], x[15]);
    1557             : 
    1558           0 :   v[0] = _mm_madd_epi16(u[0], k__cospi_p08_p24);
    1559           0 :   v[1] = _mm_madd_epi16(u[1], k__cospi_p08_p24);
    1560           0 :   v[2] = _mm_madd_epi16(u[0], k__cospi_p24_m08);
    1561           0 :   v[3] = _mm_madd_epi16(u[1], k__cospi_p24_m08);
    1562           0 :   v[4] = _mm_madd_epi16(u[2], k__cospi_m24_p08);
    1563           0 :   v[5] = _mm_madd_epi16(u[3], k__cospi_m24_p08);
    1564           0 :   v[6] = _mm_madd_epi16(u[2], k__cospi_p08_p24);
    1565           0 :   v[7] = _mm_madd_epi16(u[3], k__cospi_p08_p24);
    1566           0 :   v[8] = _mm_madd_epi16(u[4], k__cospi_p08_p24);
    1567           0 :   v[9] = _mm_madd_epi16(u[5], k__cospi_p08_p24);
    1568           0 :   v[10] = _mm_madd_epi16(u[4], k__cospi_p24_m08);
    1569           0 :   v[11] = _mm_madd_epi16(u[5], k__cospi_p24_m08);
    1570           0 :   v[12] = _mm_madd_epi16(u[6], k__cospi_m24_p08);
    1571           0 :   v[13] = _mm_madd_epi16(u[7], k__cospi_m24_p08);
    1572           0 :   v[14] = _mm_madd_epi16(u[6], k__cospi_p08_p24);
    1573           0 :   v[15] = _mm_madd_epi16(u[7], k__cospi_p08_p24);
    1574             : 
    1575           0 :   u[0] = _mm_add_epi32(v[0], v[4]);
    1576           0 :   u[1] = _mm_add_epi32(v[1], v[5]);
    1577           0 :   u[2] = _mm_add_epi32(v[2], v[6]);
    1578           0 :   u[3] = _mm_add_epi32(v[3], v[7]);
    1579           0 :   u[4] = _mm_sub_epi32(v[0], v[4]);
    1580           0 :   u[5] = _mm_sub_epi32(v[1], v[5]);
    1581           0 :   u[6] = _mm_sub_epi32(v[2], v[6]);
    1582           0 :   u[7] = _mm_sub_epi32(v[3], v[7]);
    1583           0 :   u[8] = _mm_add_epi32(v[8], v[12]);
    1584           0 :   u[9] = _mm_add_epi32(v[9], v[13]);
    1585           0 :   u[10] = _mm_add_epi32(v[10], v[14]);
    1586           0 :   u[11] = _mm_add_epi32(v[11], v[15]);
    1587           0 :   u[12] = _mm_sub_epi32(v[8], v[12]);
    1588           0 :   u[13] = _mm_sub_epi32(v[9], v[13]);
    1589           0 :   u[14] = _mm_sub_epi32(v[10], v[14]);
    1590           0 :   u[15] = _mm_sub_epi32(v[11], v[15]);
    1591             : 
    1592           0 :   u[0] = _mm_add_epi32(u[0], k__DCT_CONST_ROUNDING);
    1593           0 :   u[1] = _mm_add_epi32(u[1], k__DCT_CONST_ROUNDING);
    1594           0 :   u[2] = _mm_add_epi32(u[2], k__DCT_CONST_ROUNDING);
    1595           0 :   u[3] = _mm_add_epi32(u[3], k__DCT_CONST_ROUNDING);
    1596           0 :   u[4] = _mm_add_epi32(u[4], k__DCT_CONST_ROUNDING);
    1597           0 :   u[5] = _mm_add_epi32(u[5], k__DCT_CONST_ROUNDING);
    1598           0 :   u[6] = _mm_add_epi32(u[6], k__DCT_CONST_ROUNDING);
    1599           0 :   u[7] = _mm_add_epi32(u[7], k__DCT_CONST_ROUNDING);
    1600           0 :   u[8] = _mm_add_epi32(u[8], k__DCT_CONST_ROUNDING);
    1601           0 :   u[9] = _mm_add_epi32(u[9], k__DCT_CONST_ROUNDING);
    1602           0 :   u[10] = _mm_add_epi32(u[10], k__DCT_CONST_ROUNDING);
    1603           0 :   u[11] = _mm_add_epi32(u[11], k__DCT_CONST_ROUNDING);
    1604           0 :   u[12] = _mm_add_epi32(u[12], k__DCT_CONST_ROUNDING);
    1605           0 :   u[13] = _mm_add_epi32(u[13], k__DCT_CONST_ROUNDING);
    1606           0 :   u[14] = _mm_add_epi32(u[14], k__DCT_CONST_ROUNDING);
    1607           0 :   u[15] = _mm_add_epi32(u[15], k__DCT_CONST_ROUNDING);
    1608             : 
    1609           0 :   v[0] = _mm_srai_epi32(u[0], DCT_CONST_BITS);
    1610           0 :   v[1] = _mm_srai_epi32(u[1], DCT_CONST_BITS);
    1611           0 :   v[2] = _mm_srai_epi32(u[2], DCT_CONST_BITS);
    1612           0 :   v[3] = _mm_srai_epi32(u[3], DCT_CONST_BITS);
    1613           0 :   v[4] = _mm_srai_epi32(u[4], DCT_CONST_BITS);
    1614           0 :   v[5] = _mm_srai_epi32(u[5], DCT_CONST_BITS);
    1615           0 :   v[6] = _mm_srai_epi32(u[6], DCT_CONST_BITS);
    1616           0 :   v[7] = _mm_srai_epi32(u[7], DCT_CONST_BITS);
    1617           0 :   v[8] = _mm_srai_epi32(u[8], DCT_CONST_BITS);
    1618           0 :   v[9] = _mm_srai_epi32(u[9], DCT_CONST_BITS);
    1619           0 :   v[10] = _mm_srai_epi32(u[10], DCT_CONST_BITS);
    1620           0 :   v[11] = _mm_srai_epi32(u[11], DCT_CONST_BITS);
    1621           0 :   v[12] = _mm_srai_epi32(u[12], DCT_CONST_BITS);
    1622           0 :   v[13] = _mm_srai_epi32(u[13], DCT_CONST_BITS);
    1623           0 :   v[14] = _mm_srai_epi32(u[14], DCT_CONST_BITS);
    1624           0 :   v[15] = _mm_srai_epi32(u[15], DCT_CONST_BITS);
    1625             : 
    1626           0 :   s[0] = _mm_add_epi16(x[0], x[2]);
    1627           0 :   s[1] = _mm_add_epi16(x[1], x[3]);
    1628           0 :   s[2] = _mm_sub_epi16(x[0], x[2]);
    1629           0 :   s[3] = _mm_sub_epi16(x[1], x[3]);
    1630           0 :   s[4] = _mm_packs_epi32(v[0], v[1]);
    1631           0 :   s[5] = _mm_packs_epi32(v[2], v[3]);
    1632           0 :   s[6] = _mm_packs_epi32(v[4], v[5]);
    1633           0 :   s[7] = _mm_packs_epi32(v[6], v[7]);
    1634           0 :   s[8] = _mm_add_epi16(x[8], x[10]);
    1635           0 :   s[9] = _mm_add_epi16(x[9], x[11]);
    1636           0 :   s[10] = _mm_sub_epi16(x[8], x[10]);
    1637           0 :   s[11] = _mm_sub_epi16(x[9], x[11]);
    1638           0 :   s[12] = _mm_packs_epi32(v[8], v[9]);
    1639           0 :   s[13] = _mm_packs_epi32(v[10], v[11]);
    1640           0 :   s[14] = _mm_packs_epi32(v[12], v[13]);
    1641           0 :   s[15] = _mm_packs_epi32(v[14], v[15]);
    1642             : 
    1643             :   // stage 4
    1644           0 :   u[0] = _mm_unpacklo_epi16(s[2], s[3]);
    1645           0 :   u[1] = _mm_unpackhi_epi16(s[2], s[3]);
    1646           0 :   u[2] = _mm_unpacklo_epi16(s[6], s[7]);
    1647           0 :   u[3] = _mm_unpackhi_epi16(s[6], s[7]);
    1648           0 :   u[4] = _mm_unpacklo_epi16(s[10], s[11]);
    1649           0 :   u[5] = _mm_unpackhi_epi16(s[10], s[11]);
    1650           0 :   u[6] = _mm_unpacklo_epi16(s[14], s[15]);
    1651           0 :   u[7] = _mm_unpackhi_epi16(s[14], s[15]);
    1652             : 
    1653           0 :   v[0] = _mm_madd_epi16(u[0], k__cospi_m16_m16);
    1654           0 :   v[1] = _mm_madd_epi16(u[1], k__cospi_m16_m16);
    1655           0 :   v[2] = _mm_madd_epi16(u[0], k__cospi_p16_m16);
    1656           0 :   v[3] = _mm_madd_epi16(u[1], k__cospi_p16_m16);
    1657           0 :   v[4] = _mm_madd_epi16(u[2], k__cospi_p16_p16);
    1658           0 :   v[5] = _mm_madd_epi16(u[3], k__cospi_p16_p16);
    1659           0 :   v[6] = _mm_madd_epi16(u[2], k__cospi_m16_p16);
    1660           0 :   v[7] = _mm_madd_epi16(u[3], k__cospi_m16_p16);
    1661           0 :   v[8] = _mm_madd_epi16(u[4], k__cospi_p16_p16);
    1662           0 :   v[9] = _mm_madd_epi16(u[5], k__cospi_p16_p16);
    1663           0 :   v[10] = _mm_madd_epi16(u[4], k__cospi_m16_p16);
    1664           0 :   v[11] = _mm_madd_epi16(u[5], k__cospi_m16_p16);
    1665           0 :   v[12] = _mm_madd_epi16(u[6], k__cospi_m16_m16);
    1666           0 :   v[13] = _mm_madd_epi16(u[7], k__cospi_m16_m16);
    1667           0 :   v[14] = _mm_madd_epi16(u[6], k__cospi_p16_m16);
    1668           0 :   v[15] = _mm_madd_epi16(u[7], k__cospi_p16_m16);
    1669             : 
    1670           0 :   u[0] = _mm_add_epi32(v[0], k__DCT_CONST_ROUNDING);
    1671           0 :   u[1] = _mm_add_epi32(v[1], k__DCT_CONST_ROUNDING);
    1672           0 :   u[2] = _mm_add_epi32(v[2], k__DCT_CONST_ROUNDING);
    1673           0 :   u[3] = _mm_add_epi32(v[3], k__DCT_CONST_ROUNDING);
    1674           0 :   u[4] = _mm_add_epi32(v[4], k__DCT_CONST_ROUNDING);
    1675           0 :   u[5] = _mm_add_epi32(v[5], k__DCT_CONST_ROUNDING);
    1676           0 :   u[6] = _mm_add_epi32(v[6], k__DCT_CONST_ROUNDING);
    1677           0 :   u[7] = _mm_add_epi32(v[7], k__DCT_CONST_ROUNDING);
    1678           0 :   u[8] = _mm_add_epi32(v[8], k__DCT_CONST_ROUNDING);
    1679           0 :   u[9] = _mm_add_epi32(v[9], k__DCT_CONST_ROUNDING);
    1680           0 :   u[10] = _mm_add_epi32(v[10], k__DCT_CONST_ROUNDING);
    1681           0 :   u[11] = _mm_add_epi32(v[11], k__DCT_CONST_ROUNDING);
    1682           0 :   u[12] = _mm_add_epi32(v[12], k__DCT_CONST_ROUNDING);
    1683           0 :   u[13] = _mm_add_epi32(v[13], k__DCT_CONST_ROUNDING);
    1684           0 :   u[14] = _mm_add_epi32(v[14], k__DCT_CONST_ROUNDING);
    1685           0 :   u[15] = _mm_add_epi32(v[15], k__DCT_CONST_ROUNDING);
    1686             : 
    1687           0 :   v[0] = _mm_srai_epi32(u[0], DCT_CONST_BITS);
    1688           0 :   v[1] = _mm_srai_epi32(u[1], DCT_CONST_BITS);
    1689           0 :   v[2] = _mm_srai_epi32(u[2], DCT_CONST_BITS);
    1690           0 :   v[3] = _mm_srai_epi32(u[3], DCT_CONST_BITS);
    1691           0 :   v[4] = _mm_srai_epi32(u[4], DCT_CONST_BITS);
    1692           0 :   v[5] = _mm_srai_epi32(u[5], DCT_CONST_BITS);
    1693           0 :   v[6] = _mm_srai_epi32(u[6], DCT_CONST_BITS);
    1694           0 :   v[7] = _mm_srai_epi32(u[7], DCT_CONST_BITS);
    1695           0 :   v[8] = _mm_srai_epi32(u[8], DCT_CONST_BITS);
    1696           0 :   v[9] = _mm_srai_epi32(u[9], DCT_CONST_BITS);
    1697           0 :   v[10] = _mm_srai_epi32(u[10], DCT_CONST_BITS);
    1698           0 :   v[11] = _mm_srai_epi32(u[11], DCT_CONST_BITS);
    1699           0 :   v[12] = _mm_srai_epi32(u[12], DCT_CONST_BITS);
    1700           0 :   v[13] = _mm_srai_epi32(u[13], DCT_CONST_BITS);
    1701           0 :   v[14] = _mm_srai_epi32(u[14], DCT_CONST_BITS);
    1702           0 :   v[15] = _mm_srai_epi32(u[15], DCT_CONST_BITS);
    1703             : 
    1704           0 :   in[0] = s[0];
    1705           0 :   in[1] = _mm_sub_epi16(kZero, s[8]);
    1706           0 :   in[2] = s[12];
    1707           0 :   in[3] = _mm_sub_epi16(kZero, s[4]);
    1708           0 :   in[4] = _mm_packs_epi32(v[4], v[5]);
    1709           0 :   in[5] = _mm_packs_epi32(v[12], v[13]);
    1710           0 :   in[6] = _mm_packs_epi32(v[8], v[9]);
    1711           0 :   in[7] = _mm_packs_epi32(v[0], v[1]);
    1712           0 :   in[8] = _mm_packs_epi32(v[2], v[3]);
    1713           0 :   in[9] = _mm_packs_epi32(v[10], v[11]);
    1714           0 :   in[10] = _mm_packs_epi32(v[14], v[15]);
    1715           0 :   in[11] = _mm_packs_epi32(v[6], v[7]);
    1716           0 :   in[12] = s[5];
    1717           0 :   in[13] = _mm_sub_epi16(kZero, s[13]);
    1718           0 :   in[14] = s[9];
    1719           0 :   in[15] = _mm_sub_epi16(kZero, s[1]);
    1720           0 : }
    1721             : 
    1722           0 : void idct16_8col(__m128i *in) {
    1723           0 :   const __m128i k__cospi_p30_m02 = pair_set_epi16(cospi_30_64, -cospi_2_64);
    1724           0 :   const __m128i k__cospi_p02_p30 = pair_set_epi16(cospi_2_64, cospi_30_64);
    1725           0 :   const __m128i k__cospi_p14_m18 = pair_set_epi16(cospi_14_64, -cospi_18_64);
    1726           0 :   const __m128i k__cospi_p18_p14 = pair_set_epi16(cospi_18_64, cospi_14_64);
    1727           0 :   const __m128i k__cospi_p22_m10 = pair_set_epi16(cospi_22_64, -cospi_10_64);
    1728           0 :   const __m128i k__cospi_p10_p22 = pair_set_epi16(cospi_10_64, cospi_22_64);
    1729           0 :   const __m128i k__cospi_p06_m26 = pair_set_epi16(cospi_6_64, -cospi_26_64);
    1730           0 :   const __m128i k__cospi_p26_p06 = pair_set_epi16(cospi_26_64, cospi_6_64);
    1731           0 :   const __m128i k__cospi_p28_m04 = pair_set_epi16(cospi_28_64, -cospi_4_64);
    1732           0 :   const __m128i k__cospi_p04_p28 = pair_set_epi16(cospi_4_64, cospi_28_64);
    1733           0 :   const __m128i k__cospi_p12_m20 = pair_set_epi16(cospi_12_64, -cospi_20_64);
    1734           0 :   const __m128i k__cospi_p20_p12 = pair_set_epi16(cospi_20_64, cospi_12_64);
    1735           0 :   const __m128i k__cospi_p16_p16 = _mm_set1_epi16((int16_t)cospi_16_64);
    1736           0 :   const __m128i k__cospi_p16_m16 = pair_set_epi16(cospi_16_64, -cospi_16_64);
    1737           0 :   const __m128i k__cospi_p24_m08 = pair_set_epi16(cospi_24_64, -cospi_8_64);
    1738           0 :   const __m128i k__cospi_p08_p24 = pair_set_epi16(cospi_8_64, cospi_24_64);
    1739           0 :   const __m128i k__cospi_m08_p24 = pair_set_epi16(-cospi_8_64, cospi_24_64);
    1740           0 :   const __m128i k__cospi_p24_p08 = pair_set_epi16(cospi_24_64, cospi_8_64);
    1741           0 :   const __m128i k__cospi_m24_m08 = pair_set_epi16(-cospi_24_64, -cospi_8_64);
    1742           0 :   const __m128i k__cospi_m16_p16 = pair_set_epi16(-cospi_16_64, cospi_16_64);
    1743           0 :   const __m128i k__DCT_CONST_ROUNDING = _mm_set1_epi32(DCT_CONST_ROUNDING);
    1744             :   __m128i v[16], u[16], s[16], t[16];
    1745             : 
    1746             :   // stage 1
    1747           0 :   s[0] = in[0];
    1748           0 :   s[1] = in[8];
    1749           0 :   s[2] = in[4];
    1750           0 :   s[3] = in[12];
    1751           0 :   s[4] = in[2];
    1752           0 :   s[5] = in[10];
    1753           0 :   s[6] = in[6];
    1754           0 :   s[7] = in[14];
    1755           0 :   s[8] = in[1];
    1756           0 :   s[9] = in[9];
    1757           0 :   s[10] = in[5];
    1758           0 :   s[11] = in[13];
    1759           0 :   s[12] = in[3];
    1760           0 :   s[13] = in[11];
    1761           0 :   s[14] = in[7];
    1762           0 :   s[15] = in[15];
    1763             : 
    1764             :   // stage 2
    1765           0 :   u[0] = _mm_unpacklo_epi16(s[8], s[15]);
    1766           0 :   u[1] = _mm_unpackhi_epi16(s[8], s[15]);
    1767           0 :   u[2] = _mm_unpacklo_epi16(s[9], s[14]);
    1768           0 :   u[3] = _mm_unpackhi_epi16(s[9], s[14]);
    1769           0 :   u[4] = _mm_unpacklo_epi16(s[10], s[13]);
    1770           0 :   u[5] = _mm_unpackhi_epi16(s[10], s[13]);
    1771           0 :   u[6] = _mm_unpacklo_epi16(s[11], s[12]);
    1772           0 :   u[7] = _mm_unpackhi_epi16(s[11], s[12]);
    1773             : 
    1774           0 :   v[0] = _mm_madd_epi16(u[0], k__cospi_p30_m02);
    1775           0 :   v[1] = _mm_madd_epi16(u[1], k__cospi_p30_m02);
    1776           0 :   v[2] = _mm_madd_epi16(u[0], k__cospi_p02_p30);
    1777           0 :   v[3] = _mm_madd_epi16(u[1], k__cospi_p02_p30);
    1778           0 :   v[4] = _mm_madd_epi16(u[2], k__cospi_p14_m18);
    1779           0 :   v[5] = _mm_madd_epi16(u[3], k__cospi_p14_m18);
    1780           0 :   v[6] = _mm_madd_epi16(u[2], k__cospi_p18_p14);
    1781           0 :   v[7] = _mm_madd_epi16(u[3], k__cospi_p18_p14);
    1782           0 :   v[8] = _mm_madd_epi16(u[4], k__cospi_p22_m10);
    1783           0 :   v[9] = _mm_madd_epi16(u[5], k__cospi_p22_m10);
    1784           0 :   v[10] = _mm_madd_epi16(u[4], k__cospi_p10_p22);
    1785           0 :   v[11] = _mm_madd_epi16(u[5], k__cospi_p10_p22);
    1786           0 :   v[12] = _mm_madd_epi16(u[6], k__cospi_p06_m26);
    1787           0 :   v[13] = _mm_madd_epi16(u[7], k__cospi_p06_m26);
    1788           0 :   v[14] = _mm_madd_epi16(u[6], k__cospi_p26_p06);
    1789           0 :   v[15] = _mm_madd_epi16(u[7], k__cospi_p26_p06);
    1790             : 
    1791           0 :   u[0] = _mm_add_epi32(v[0], k__DCT_CONST_ROUNDING);
    1792           0 :   u[1] = _mm_add_epi32(v[1], k__DCT_CONST_ROUNDING);
    1793           0 :   u[2] = _mm_add_epi32(v[2], k__DCT_CONST_ROUNDING);
    1794           0 :   u[3] = _mm_add_epi32(v[3], k__DCT_CONST_ROUNDING);
    1795           0 :   u[4] = _mm_add_epi32(v[4], k__DCT_CONST_ROUNDING);
    1796           0 :   u[5] = _mm_add_epi32(v[5], k__DCT_CONST_ROUNDING);
    1797           0 :   u[6] = _mm_add_epi32(v[6], k__DCT_CONST_ROUNDING);
    1798           0 :   u[7] = _mm_add_epi32(v[7], k__DCT_CONST_ROUNDING);
    1799           0 :   u[8] = _mm_add_epi32(v[8], k__DCT_CONST_ROUNDING);
    1800           0 :   u[9] = _mm_add_epi32(v[9], k__DCT_CONST_ROUNDING);
    1801           0 :   u[10] = _mm_add_epi32(v[10], k__DCT_CONST_ROUNDING);
    1802           0 :   u[11] = _mm_add_epi32(v[11], k__DCT_CONST_ROUNDING);
    1803           0 :   u[12] = _mm_add_epi32(v[12], k__DCT_CONST_ROUNDING);
    1804           0 :   u[13] = _mm_add_epi32(v[13], k__DCT_CONST_ROUNDING);
    1805           0 :   u[14] = _mm_add_epi32(v[14], k__DCT_CONST_ROUNDING);
    1806           0 :   u[15] = _mm_add_epi32(v[15], k__DCT_CONST_ROUNDING);
    1807             : 
    1808           0 :   u[0] = _mm_srai_epi32(u[0], DCT_CONST_BITS);
    1809           0 :   u[1] = _mm_srai_epi32(u[1], DCT_CONST_BITS);
    1810           0 :   u[2] = _mm_srai_epi32(u[2], DCT_CONST_BITS);
    1811           0 :   u[3] = _mm_srai_epi32(u[3], DCT_CONST_BITS);
    1812           0 :   u[4] = _mm_srai_epi32(u[4], DCT_CONST_BITS);
    1813           0 :   u[5] = _mm_srai_epi32(u[5], DCT_CONST_BITS);
    1814           0 :   u[6] = _mm_srai_epi32(u[6], DCT_CONST_BITS);
    1815           0 :   u[7] = _mm_srai_epi32(u[7], DCT_CONST_BITS);
    1816           0 :   u[8] = _mm_srai_epi32(u[8], DCT_CONST_BITS);
    1817           0 :   u[9] = _mm_srai_epi32(u[9], DCT_CONST_BITS);
    1818           0 :   u[10] = _mm_srai_epi32(u[10], DCT_CONST_BITS);
    1819           0 :   u[11] = _mm_srai_epi32(u[11], DCT_CONST_BITS);
    1820           0 :   u[12] = _mm_srai_epi32(u[12], DCT_CONST_BITS);
    1821           0 :   u[13] = _mm_srai_epi32(u[13], DCT_CONST_BITS);
    1822           0 :   u[14] = _mm_srai_epi32(u[14], DCT_CONST_BITS);
    1823           0 :   u[15] = _mm_srai_epi32(u[15], DCT_CONST_BITS);
    1824             : 
    1825           0 :   s[8] = _mm_packs_epi32(u[0], u[1]);
    1826           0 :   s[15] = _mm_packs_epi32(u[2], u[3]);
    1827           0 :   s[9] = _mm_packs_epi32(u[4], u[5]);
    1828           0 :   s[14] = _mm_packs_epi32(u[6], u[7]);
    1829           0 :   s[10] = _mm_packs_epi32(u[8], u[9]);
    1830           0 :   s[13] = _mm_packs_epi32(u[10], u[11]);
    1831           0 :   s[11] = _mm_packs_epi32(u[12], u[13]);
    1832           0 :   s[12] = _mm_packs_epi32(u[14], u[15]);
    1833             : 
    1834             :   // stage 3
    1835           0 :   t[0] = s[0];
    1836           0 :   t[1] = s[1];
    1837           0 :   t[2] = s[2];
    1838           0 :   t[3] = s[3];
    1839           0 :   u[0] = _mm_unpacklo_epi16(s[4], s[7]);
    1840           0 :   u[1] = _mm_unpackhi_epi16(s[4], s[7]);
    1841           0 :   u[2] = _mm_unpacklo_epi16(s[5], s[6]);
    1842           0 :   u[3] = _mm_unpackhi_epi16(s[5], s[6]);
    1843             : 
    1844           0 :   v[0] = _mm_madd_epi16(u[0], k__cospi_p28_m04);
    1845           0 :   v[1] = _mm_madd_epi16(u[1], k__cospi_p28_m04);
    1846           0 :   v[2] = _mm_madd_epi16(u[0], k__cospi_p04_p28);
    1847           0 :   v[3] = _mm_madd_epi16(u[1], k__cospi_p04_p28);
    1848           0 :   v[4] = _mm_madd_epi16(u[2], k__cospi_p12_m20);
    1849           0 :   v[5] = _mm_madd_epi16(u[3], k__cospi_p12_m20);
    1850           0 :   v[6] = _mm_madd_epi16(u[2], k__cospi_p20_p12);
    1851           0 :   v[7] = _mm_madd_epi16(u[3], k__cospi_p20_p12);
    1852             : 
    1853           0 :   u[0] = _mm_add_epi32(v[0], k__DCT_CONST_ROUNDING);
    1854           0 :   u[1] = _mm_add_epi32(v[1], k__DCT_CONST_ROUNDING);
    1855           0 :   u[2] = _mm_add_epi32(v[2], k__DCT_CONST_ROUNDING);
    1856           0 :   u[3] = _mm_add_epi32(v[3], k__DCT_CONST_ROUNDING);
    1857           0 :   u[4] = _mm_add_epi32(v[4], k__DCT_CONST_ROUNDING);
    1858           0 :   u[5] = _mm_add_epi32(v[5], k__DCT_CONST_ROUNDING);
    1859           0 :   u[6] = _mm_add_epi32(v[6], k__DCT_CONST_ROUNDING);
    1860           0 :   u[7] = _mm_add_epi32(v[7], k__DCT_CONST_ROUNDING);
    1861             : 
    1862           0 :   u[0] = _mm_srai_epi32(u[0], DCT_CONST_BITS);
    1863           0 :   u[1] = _mm_srai_epi32(u[1], DCT_CONST_BITS);
    1864           0 :   u[2] = _mm_srai_epi32(u[2], DCT_CONST_BITS);
    1865           0 :   u[3] = _mm_srai_epi32(u[3], DCT_CONST_BITS);
    1866           0 :   u[4] = _mm_srai_epi32(u[4], DCT_CONST_BITS);
    1867           0 :   u[5] = _mm_srai_epi32(u[5], DCT_CONST_BITS);
    1868           0 :   u[6] = _mm_srai_epi32(u[6], DCT_CONST_BITS);
    1869           0 :   u[7] = _mm_srai_epi32(u[7], DCT_CONST_BITS);
    1870             : 
    1871           0 :   t[4] = _mm_packs_epi32(u[0], u[1]);
    1872           0 :   t[7] = _mm_packs_epi32(u[2], u[3]);
    1873           0 :   t[5] = _mm_packs_epi32(u[4], u[5]);
    1874           0 :   t[6] = _mm_packs_epi32(u[6], u[7]);
    1875           0 :   t[8] = _mm_add_epi16(s[8], s[9]);
    1876           0 :   t[9] = _mm_sub_epi16(s[8], s[9]);
    1877           0 :   t[10] = _mm_sub_epi16(s[11], s[10]);
    1878           0 :   t[11] = _mm_add_epi16(s[10], s[11]);
    1879           0 :   t[12] = _mm_add_epi16(s[12], s[13]);
    1880           0 :   t[13] = _mm_sub_epi16(s[12], s[13]);
    1881           0 :   t[14] = _mm_sub_epi16(s[15], s[14]);
    1882           0 :   t[15] = _mm_add_epi16(s[14], s[15]);
    1883             : 
    1884             :   // stage 4
    1885           0 :   u[0] = _mm_unpacklo_epi16(t[0], t[1]);
    1886           0 :   u[1] = _mm_unpackhi_epi16(t[0], t[1]);
    1887           0 :   u[2] = _mm_unpacklo_epi16(t[2], t[3]);
    1888           0 :   u[3] = _mm_unpackhi_epi16(t[2], t[3]);
    1889           0 :   u[4] = _mm_unpacklo_epi16(t[9], t[14]);
    1890           0 :   u[5] = _mm_unpackhi_epi16(t[9], t[14]);
    1891           0 :   u[6] = _mm_unpacklo_epi16(t[10], t[13]);
    1892           0 :   u[7] = _mm_unpackhi_epi16(t[10], t[13]);
    1893             : 
    1894           0 :   v[0] = _mm_madd_epi16(u[0], k__cospi_p16_p16);
    1895           0 :   v[1] = _mm_madd_epi16(u[1], k__cospi_p16_p16);
    1896           0 :   v[2] = _mm_madd_epi16(u[0], k__cospi_p16_m16);
    1897           0 :   v[3] = _mm_madd_epi16(u[1], k__cospi_p16_m16);
    1898           0 :   v[4] = _mm_madd_epi16(u[2], k__cospi_p24_m08);
    1899           0 :   v[5] = _mm_madd_epi16(u[3], k__cospi_p24_m08);
    1900           0 :   v[6] = _mm_madd_epi16(u[2], k__cospi_p08_p24);
    1901           0 :   v[7] = _mm_madd_epi16(u[3], k__cospi_p08_p24);
    1902           0 :   v[8] = _mm_madd_epi16(u[4], k__cospi_m08_p24);
    1903           0 :   v[9] = _mm_madd_epi16(u[5], k__cospi_m08_p24);
    1904           0 :   v[10] = _mm_madd_epi16(u[4], k__cospi_p24_p08);
    1905           0 :   v[11] = _mm_madd_epi16(u[5], k__cospi_p24_p08);
    1906           0 :   v[12] = _mm_madd_epi16(u[6], k__cospi_m24_m08);
    1907           0 :   v[13] = _mm_madd_epi16(u[7], k__cospi_m24_m08);
    1908           0 :   v[14] = _mm_madd_epi16(u[6], k__cospi_m08_p24);
    1909           0 :   v[15] = _mm_madd_epi16(u[7], k__cospi_m08_p24);
    1910             : 
    1911           0 :   u[0] = _mm_add_epi32(v[0], k__DCT_CONST_ROUNDING);
    1912           0 :   u[1] = _mm_add_epi32(v[1], k__DCT_CONST_ROUNDING);
    1913           0 :   u[2] = _mm_add_epi32(v[2], k__DCT_CONST_ROUNDING);
    1914           0 :   u[3] = _mm_add_epi32(v[3], k__DCT_CONST_ROUNDING);
    1915           0 :   u[4] = _mm_add_epi32(v[4], k__DCT_CONST_ROUNDING);
    1916           0 :   u[5] = _mm_add_epi32(v[5], k__DCT_CONST_ROUNDING);
    1917           0 :   u[6] = _mm_add_epi32(v[6], k__DCT_CONST_ROUNDING);
    1918           0 :   u[7] = _mm_add_epi32(v[7], k__DCT_CONST_ROUNDING);
    1919           0 :   u[8] = _mm_add_epi32(v[8], k__DCT_CONST_ROUNDING);
    1920           0 :   u[9] = _mm_add_epi32(v[9], k__DCT_CONST_ROUNDING);
    1921           0 :   u[10] = _mm_add_epi32(v[10], k__DCT_CONST_ROUNDING);
    1922           0 :   u[11] = _mm_add_epi32(v[11], k__DCT_CONST_ROUNDING);
    1923           0 :   u[12] = _mm_add_epi32(v[12], k__DCT_CONST_ROUNDING);
    1924           0 :   u[13] = _mm_add_epi32(v[13], k__DCT_CONST_ROUNDING);
    1925           0 :   u[14] = _mm_add_epi32(v[14], k__DCT_CONST_ROUNDING);
    1926           0 :   u[15] = _mm_add_epi32(v[15], k__DCT_CONST_ROUNDING);
    1927             : 
    1928           0 :   u[0] = _mm_srai_epi32(u[0], DCT_CONST_BITS);
    1929           0 :   u[1] = _mm_srai_epi32(u[1], DCT_CONST_BITS);
    1930           0 :   u[2] = _mm_srai_epi32(u[2], DCT_CONST_BITS);
    1931           0 :   u[3] = _mm_srai_epi32(u[3], DCT_CONST_BITS);
    1932           0 :   u[4] = _mm_srai_epi32(u[4], DCT_CONST_BITS);
    1933           0 :   u[5] = _mm_srai_epi32(u[5], DCT_CONST_BITS);
    1934           0 :   u[6] = _mm_srai_epi32(u[6], DCT_CONST_BITS);
    1935           0 :   u[7] = _mm_srai_epi32(u[7], DCT_CONST_BITS);
    1936           0 :   u[8] = _mm_srai_epi32(u[8], DCT_CONST_BITS);
    1937           0 :   u[9] = _mm_srai_epi32(u[9], DCT_CONST_BITS);
    1938           0 :   u[10] = _mm_srai_epi32(u[10], DCT_CONST_BITS);
    1939           0 :   u[11] = _mm_srai_epi32(u[11], DCT_CONST_BITS);
    1940           0 :   u[12] = _mm_srai_epi32(u[12], DCT_CONST_BITS);
    1941           0 :   u[13] = _mm_srai_epi32(u[13], DCT_CONST_BITS);
    1942           0 :   u[14] = _mm_srai_epi32(u[14], DCT_CONST_BITS);
    1943           0 :   u[15] = _mm_srai_epi32(u[15], DCT_CONST_BITS);
    1944             : 
    1945           0 :   s[0] = _mm_packs_epi32(u[0], u[1]);
    1946           0 :   s[1] = _mm_packs_epi32(u[2], u[3]);
    1947           0 :   s[2] = _mm_packs_epi32(u[4], u[5]);
    1948           0 :   s[3] = _mm_packs_epi32(u[6], u[7]);
    1949           0 :   s[4] = _mm_add_epi16(t[4], t[5]);
    1950           0 :   s[5] = _mm_sub_epi16(t[4], t[5]);
    1951           0 :   s[6] = _mm_sub_epi16(t[7], t[6]);
    1952           0 :   s[7] = _mm_add_epi16(t[6], t[7]);
    1953           0 :   s[8] = t[8];
    1954           0 :   s[15] = t[15];
    1955           0 :   s[9] = _mm_packs_epi32(u[8], u[9]);
    1956           0 :   s[14] = _mm_packs_epi32(u[10], u[11]);
    1957           0 :   s[10] = _mm_packs_epi32(u[12], u[13]);
    1958           0 :   s[13] = _mm_packs_epi32(u[14], u[15]);
    1959           0 :   s[11] = t[11];
    1960           0 :   s[12] = t[12];
    1961             : 
    1962             :   // stage 5
    1963           0 :   t[0] = _mm_add_epi16(s[0], s[3]);
    1964           0 :   t[1] = _mm_add_epi16(s[1], s[2]);
    1965           0 :   t[2] = _mm_sub_epi16(s[1], s[2]);
    1966           0 :   t[3] = _mm_sub_epi16(s[0], s[3]);
    1967           0 :   t[4] = s[4];
    1968           0 :   t[7] = s[7];
    1969             : 
    1970           0 :   u[0] = _mm_unpacklo_epi16(s[5], s[6]);
    1971           0 :   u[1] = _mm_unpackhi_epi16(s[5], s[6]);
    1972           0 :   v[0] = _mm_madd_epi16(u[0], k__cospi_m16_p16);
    1973           0 :   v[1] = _mm_madd_epi16(u[1], k__cospi_m16_p16);
    1974           0 :   v[2] = _mm_madd_epi16(u[0], k__cospi_p16_p16);
    1975           0 :   v[3] = _mm_madd_epi16(u[1], k__cospi_p16_p16);
    1976           0 :   u[0] = _mm_add_epi32(v[0], k__DCT_CONST_ROUNDING);
    1977           0 :   u[1] = _mm_add_epi32(v[1], k__DCT_CONST_ROUNDING);
    1978           0 :   u[2] = _mm_add_epi32(v[2], k__DCT_CONST_ROUNDING);
    1979           0 :   u[3] = _mm_add_epi32(v[3], k__DCT_CONST_ROUNDING);
    1980           0 :   u[0] = _mm_srai_epi32(u[0], DCT_CONST_BITS);
    1981           0 :   u[1] = _mm_srai_epi32(u[1], DCT_CONST_BITS);
    1982           0 :   u[2] = _mm_srai_epi32(u[2], DCT_CONST_BITS);
    1983           0 :   u[3] = _mm_srai_epi32(u[3], DCT_CONST_BITS);
    1984           0 :   t[5] = _mm_packs_epi32(u[0], u[1]);
    1985           0 :   t[6] = _mm_packs_epi32(u[2], u[3]);
    1986             : 
    1987           0 :   t[8] = _mm_add_epi16(s[8], s[11]);
    1988           0 :   t[9] = _mm_add_epi16(s[9], s[10]);
    1989           0 :   t[10] = _mm_sub_epi16(s[9], s[10]);
    1990           0 :   t[11] = _mm_sub_epi16(s[8], s[11]);
    1991           0 :   t[12] = _mm_sub_epi16(s[15], s[12]);
    1992           0 :   t[13] = _mm_sub_epi16(s[14], s[13]);
    1993           0 :   t[14] = _mm_add_epi16(s[13], s[14]);
    1994           0 :   t[15] = _mm_add_epi16(s[12], s[15]);
    1995             : 
    1996             :   // stage 6
    1997           0 :   s[0] = _mm_add_epi16(t[0], t[7]);
    1998           0 :   s[1] = _mm_add_epi16(t[1], t[6]);
    1999           0 :   s[2] = _mm_add_epi16(t[2], t[5]);
    2000           0 :   s[3] = _mm_add_epi16(t[3], t[4]);
    2001           0 :   s[4] = _mm_sub_epi16(t[3], t[4]);
    2002           0 :   s[5] = _mm_sub_epi16(t[2], t[5]);
    2003           0 :   s[6] = _mm_sub_epi16(t[1], t[6]);
    2004           0 :   s[7] = _mm_sub_epi16(t[0], t[7]);
    2005           0 :   s[8] = t[8];
    2006           0 :   s[9] = t[9];
    2007             : 
    2008           0 :   u[0] = _mm_unpacklo_epi16(t[10], t[13]);
    2009           0 :   u[1] = _mm_unpackhi_epi16(t[10], t[13]);
    2010           0 :   u[2] = _mm_unpacklo_epi16(t[11], t[12]);
    2011           0 :   u[3] = _mm_unpackhi_epi16(t[11], t[12]);
    2012             : 
    2013           0 :   v[0] = _mm_madd_epi16(u[0], k__cospi_m16_p16);
    2014           0 :   v[1] = _mm_madd_epi16(u[1], k__cospi_m16_p16);
    2015           0 :   v[2] = _mm_madd_epi16(u[0], k__cospi_p16_p16);
    2016           0 :   v[3] = _mm_madd_epi16(u[1], k__cospi_p16_p16);
    2017           0 :   v[4] = _mm_madd_epi16(u[2], k__cospi_m16_p16);
    2018           0 :   v[5] = _mm_madd_epi16(u[3], k__cospi_m16_p16);
    2019           0 :   v[6] = _mm_madd_epi16(u[2], k__cospi_p16_p16);
    2020           0 :   v[7] = _mm_madd_epi16(u[3], k__cospi_p16_p16);
    2021             : 
    2022           0 :   u[0] = _mm_add_epi32(v[0], k__DCT_CONST_ROUNDING);
    2023           0 :   u[1] = _mm_add_epi32(v[1], k__DCT_CONST_ROUNDING);
    2024           0 :   u[2] = _mm_add_epi32(v[2], k__DCT_CONST_ROUNDING);
    2025           0 :   u[3] = _mm_add_epi32(v[3], k__DCT_CONST_ROUNDING);
    2026           0 :   u[4] = _mm_add_epi32(v[4], k__DCT_CONST_ROUNDING);
    2027           0 :   u[5] = _mm_add_epi32(v[5], k__DCT_CONST_ROUNDING);
    2028           0 :   u[6] = _mm_add_epi32(v[6], k__DCT_CONST_ROUNDING);
    2029           0 :   u[7] = _mm_add_epi32(v[7], k__DCT_CONST_ROUNDING);
    2030             : 
    2031           0 :   u[0] = _mm_srai_epi32(u[0], DCT_CONST_BITS);
    2032           0 :   u[1] = _mm_srai_epi32(u[1], DCT_CONST_BITS);
    2033           0 :   u[2] = _mm_srai_epi32(u[2], DCT_CONST_BITS);
    2034           0 :   u[3] = _mm_srai_epi32(u[3], DCT_CONST_BITS);
    2035           0 :   u[4] = _mm_srai_epi32(u[4], DCT_CONST_BITS);
    2036           0 :   u[5] = _mm_srai_epi32(u[5], DCT_CONST_BITS);
    2037           0 :   u[6] = _mm_srai_epi32(u[6], DCT_CONST_BITS);
    2038           0 :   u[7] = _mm_srai_epi32(u[7], DCT_CONST_BITS);
    2039             : 
    2040           0 :   s[10] = _mm_packs_epi32(u[0], u[1]);
    2041           0 :   s[13] = _mm_packs_epi32(u[2], u[3]);
    2042           0 :   s[11] = _mm_packs_epi32(u[4], u[5]);
    2043           0 :   s[12] = _mm_packs_epi32(u[6], u[7]);
    2044           0 :   s[14] = t[14];
    2045           0 :   s[15] = t[15];
    2046             : 
    2047             :   // stage 7
    2048           0 :   in[0] = _mm_add_epi16(s[0], s[15]);
    2049           0 :   in[1] = _mm_add_epi16(s[1], s[14]);
    2050           0 :   in[2] = _mm_add_epi16(s[2], s[13]);
    2051           0 :   in[3] = _mm_add_epi16(s[3], s[12]);
    2052           0 :   in[4] = _mm_add_epi16(s[4], s[11]);
    2053           0 :   in[5] = _mm_add_epi16(s[5], s[10]);
    2054           0 :   in[6] = _mm_add_epi16(s[6], s[9]);
    2055           0 :   in[7] = _mm_add_epi16(s[7], s[8]);
    2056           0 :   in[8] = _mm_sub_epi16(s[7], s[8]);
    2057           0 :   in[9] = _mm_sub_epi16(s[6], s[9]);
    2058           0 :   in[10] = _mm_sub_epi16(s[5], s[10]);
    2059           0 :   in[11] = _mm_sub_epi16(s[4], s[11]);
    2060           0 :   in[12] = _mm_sub_epi16(s[3], s[12]);
    2061           0 :   in[13] = _mm_sub_epi16(s[2], s[13]);
    2062           0 :   in[14] = _mm_sub_epi16(s[1], s[14]);
    2063           0 :   in[15] = _mm_sub_epi16(s[0], s[15]);
    2064           0 : }
    2065             : 
    2066           0 : void aom_idct16_sse2(__m128i *in0, __m128i *in1) {
    2067           0 :   array_transpose_16x16(in0, in1);
    2068           0 :   idct16_8col(in0);
    2069           0 :   idct16_8col(in1);
    2070           0 : }
    2071             : 
    2072           0 : void aom_iadst16_sse2(__m128i *in0, __m128i *in1) {
    2073           0 :   array_transpose_16x16(in0, in1);
    2074           0 :   iadst16_8col(in0);
    2075           0 :   iadst16_8col(in1);
    2076           0 : }
    2077             : 
    2078           0 : void aom_idct16x16_10_add_sse2(const tran_low_t *input, uint8_t *dest,
    2079             :                                int stride) {
    2080           0 :   const __m128i rounding = _mm_set1_epi32(DCT_CONST_ROUNDING);
    2081           0 :   const __m128i final_rounding = _mm_set1_epi16(1 << 5);
    2082           0 :   const __m128i zero = _mm_setzero_si128();
    2083             : 
    2084           0 :   const __m128i stg2_0 = pair_set_epi16(cospi_30_64, -cospi_2_64);
    2085           0 :   const __m128i stg2_1 = pair_set_epi16(cospi_2_64, cospi_30_64);
    2086           0 :   const __m128i stg2_6 = pair_set_epi16(cospi_6_64, -cospi_26_64);
    2087           0 :   const __m128i stg2_7 = pair_set_epi16(cospi_26_64, cospi_6_64);
    2088             : 
    2089           0 :   const __m128i stg3_0 = pair_set_epi16(cospi_28_64, -cospi_4_64);
    2090           0 :   const __m128i stg3_1 = pair_set_epi16(cospi_4_64, cospi_28_64);
    2091             : 
    2092           0 :   const __m128i stg4_0 = pair_set_epi16(cospi_16_64, cospi_16_64);
    2093           0 :   const __m128i stg4_1 = pair_set_epi16(cospi_16_64, -cospi_16_64);
    2094           0 :   const __m128i stg4_4 = pair_set_epi16(-cospi_8_64, cospi_24_64);
    2095           0 :   const __m128i stg4_5 = pair_set_epi16(cospi_24_64, cospi_8_64);
    2096           0 :   const __m128i stg4_6 = pair_set_epi16(-cospi_24_64, -cospi_8_64);
    2097           0 :   const __m128i stg4_7 = pair_set_epi16(-cospi_8_64, cospi_24_64);
    2098             : 
    2099           0 :   const __m128i stg6_0 = pair_set_epi16(-cospi_16_64, cospi_16_64);
    2100             :   __m128i in[16], l[16];
    2101             :   __m128i stp1_0, stp1_1, stp1_2, stp1_3, stp1_4, stp1_5, stp1_6, stp1_8,
    2102             :       stp1_9, stp1_10, stp1_11, stp1_12, stp1_13, stp1_14, stp1_15, stp1_8_0,
    2103             :       stp1_12_0;
    2104             :   __m128i stp2_0, stp2_1, stp2_2, stp2_3, stp2_4, stp2_5, stp2_6, stp2_7,
    2105             :       stp2_8, stp2_9, stp2_10, stp2_11, stp2_12, stp2_13, stp2_14;
    2106             :   __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
    2107             :   int i;
    2108             :   // First 1-D inverse DCT
    2109             :   // Load input data.
    2110           0 :   in[0] = load_input_data(input);
    2111           0 :   in[1] = load_input_data(input + 8 * 2);
    2112           0 :   in[2] = load_input_data(input + 8 * 4);
    2113           0 :   in[3] = load_input_data(input + 8 * 6);
    2114             : 
    2115           0 :   TRANSPOSE_8X4(in[0], in[1], in[2], in[3], in[0], in[1]);
    2116             : 
    2117             :   // Stage2
    2118             :   {
    2119           0 :     const __m128i lo_1_15 = _mm_unpackhi_epi16(in[0], zero);
    2120           0 :     const __m128i lo_13_3 = _mm_unpackhi_epi16(zero, in[1]);
    2121             : 
    2122           0 :     tmp0 = _mm_madd_epi16(lo_1_15, stg2_0);
    2123           0 :     tmp2 = _mm_madd_epi16(lo_1_15, stg2_1);
    2124           0 :     tmp5 = _mm_madd_epi16(lo_13_3, stg2_6);
    2125           0 :     tmp7 = _mm_madd_epi16(lo_13_3, stg2_7);
    2126             : 
    2127           0 :     tmp0 = _mm_add_epi32(tmp0, rounding);
    2128           0 :     tmp2 = _mm_add_epi32(tmp2, rounding);
    2129           0 :     tmp5 = _mm_add_epi32(tmp5, rounding);
    2130           0 :     tmp7 = _mm_add_epi32(tmp7, rounding);
    2131             : 
    2132           0 :     tmp0 = _mm_srai_epi32(tmp0, DCT_CONST_BITS);
    2133           0 :     tmp2 = _mm_srai_epi32(tmp2, DCT_CONST_BITS);
    2134           0 :     tmp5 = _mm_srai_epi32(tmp5, DCT_CONST_BITS);
    2135           0 :     tmp7 = _mm_srai_epi32(tmp7, DCT_CONST_BITS);
    2136             : 
    2137           0 :     stp2_8 = _mm_packs_epi32(tmp0, tmp2);
    2138           0 :     stp2_11 = _mm_packs_epi32(tmp5, tmp7);
    2139             :   }
    2140             : 
    2141             :   // Stage3
    2142             :   {
    2143           0 :     const __m128i lo_2_14 = _mm_unpacklo_epi16(in[1], zero);
    2144             : 
    2145           0 :     tmp0 = _mm_madd_epi16(lo_2_14, stg3_0);
    2146           0 :     tmp2 = _mm_madd_epi16(lo_2_14, stg3_1);
    2147             : 
    2148           0 :     tmp0 = _mm_add_epi32(tmp0, rounding);
    2149           0 :     tmp2 = _mm_add_epi32(tmp2, rounding);
    2150           0 :     tmp0 = _mm_srai_epi32(tmp0, DCT_CONST_BITS);
    2151           0 :     tmp2 = _mm_srai_epi32(tmp2, DCT_CONST_BITS);
    2152             : 
    2153           0 :     stp1_13 = _mm_unpackhi_epi64(stp2_11, zero);
    2154           0 :     stp1_14 = _mm_unpackhi_epi64(stp2_8, zero);
    2155             : 
    2156           0 :     stp1_4 = _mm_packs_epi32(tmp0, tmp2);
    2157             :   }
    2158             : 
    2159             :   // Stage4
    2160             :   {
    2161           0 :     const __m128i lo_0_8 = _mm_unpacklo_epi16(in[0], zero);
    2162           0 :     const __m128i lo_9_14 = _mm_unpacklo_epi16(stp2_8, stp1_14);
    2163           0 :     const __m128i lo_10_13 = _mm_unpacklo_epi16(stp2_11, stp1_13);
    2164             : 
    2165           0 :     tmp0 = _mm_madd_epi16(lo_0_8, stg4_0);
    2166           0 :     tmp2 = _mm_madd_epi16(lo_0_8, stg4_1);
    2167           0 :     tmp1 = _mm_madd_epi16(lo_9_14, stg4_4);
    2168           0 :     tmp3 = _mm_madd_epi16(lo_9_14, stg4_5);
    2169           0 :     tmp5 = _mm_madd_epi16(lo_10_13, stg4_6);
    2170           0 :     tmp7 = _mm_madd_epi16(lo_10_13, stg4_7);
    2171             : 
    2172           0 :     tmp0 = _mm_add_epi32(tmp0, rounding);
    2173           0 :     tmp2 = _mm_add_epi32(tmp2, rounding);
    2174           0 :     tmp1 = _mm_add_epi32(tmp1, rounding);
    2175           0 :     tmp3 = _mm_add_epi32(tmp3, rounding);
    2176           0 :     tmp5 = _mm_add_epi32(tmp5, rounding);
    2177           0 :     tmp7 = _mm_add_epi32(tmp7, rounding);
    2178             : 
    2179           0 :     tmp0 = _mm_srai_epi32(tmp0, DCT_CONST_BITS);
    2180           0 :     tmp2 = _mm_srai_epi32(tmp2, DCT_CONST_BITS);
    2181           0 :     tmp1 = _mm_srai_epi32(tmp1, DCT_CONST_BITS);
    2182           0 :     tmp3 = _mm_srai_epi32(tmp3, DCT_CONST_BITS);
    2183           0 :     tmp5 = _mm_srai_epi32(tmp5, DCT_CONST_BITS);
    2184           0 :     tmp7 = _mm_srai_epi32(tmp7, DCT_CONST_BITS);
    2185             : 
    2186           0 :     stp1_0 = _mm_packs_epi32(tmp0, tmp0);
    2187           0 :     stp1_1 = _mm_packs_epi32(tmp2, tmp2);
    2188           0 :     stp2_9 = _mm_packs_epi32(tmp1, tmp3);
    2189           0 :     stp2_10 = _mm_packs_epi32(tmp5, tmp7);
    2190             : 
    2191           0 :     stp2_6 = _mm_unpackhi_epi64(stp1_4, zero);
    2192             :   }
    2193             : 
    2194             :   // Stage5 and Stage6
    2195             :   {
    2196           0 :     tmp0 = _mm_add_epi16(stp2_8, stp2_11);
    2197           0 :     tmp1 = _mm_sub_epi16(stp2_8, stp2_11);
    2198           0 :     tmp2 = _mm_add_epi16(stp2_9, stp2_10);
    2199           0 :     tmp3 = _mm_sub_epi16(stp2_9, stp2_10);
    2200             : 
    2201           0 :     stp1_9 = _mm_unpacklo_epi64(tmp2, zero);
    2202           0 :     stp1_10 = _mm_unpacklo_epi64(tmp3, zero);
    2203           0 :     stp1_8 = _mm_unpacklo_epi64(tmp0, zero);
    2204           0 :     stp1_11 = _mm_unpacklo_epi64(tmp1, zero);
    2205             : 
    2206           0 :     stp1_13 = _mm_unpackhi_epi64(tmp3, zero);
    2207           0 :     stp1_14 = _mm_unpackhi_epi64(tmp2, zero);
    2208           0 :     stp1_12 = _mm_unpackhi_epi64(tmp1, zero);
    2209           0 :     stp1_15 = _mm_unpackhi_epi64(tmp0, zero);
    2210             :   }
    2211             : 
    2212             :   // Stage6
    2213             :   {
    2214           0 :     const __m128i lo_6_5 = _mm_unpacklo_epi16(stp2_6, stp1_4);
    2215           0 :     const __m128i lo_10_13 = _mm_unpacklo_epi16(stp1_10, stp1_13);
    2216           0 :     const __m128i lo_11_12 = _mm_unpacklo_epi16(stp1_11, stp1_12);
    2217             : 
    2218           0 :     tmp1 = _mm_madd_epi16(lo_6_5, stg4_1);
    2219           0 :     tmp3 = _mm_madd_epi16(lo_6_5, stg4_0);
    2220           0 :     tmp0 = _mm_madd_epi16(lo_10_13, stg6_0);
    2221           0 :     tmp2 = _mm_madd_epi16(lo_10_13, stg4_0);
    2222           0 :     tmp4 = _mm_madd_epi16(lo_11_12, stg6_0);
    2223           0 :     tmp6 = _mm_madd_epi16(lo_11_12, stg4_0);
    2224             : 
    2225           0 :     tmp1 = _mm_add_epi32(tmp1, rounding);
    2226           0 :     tmp3 = _mm_add_epi32(tmp3, rounding);
    2227           0 :     tmp0 = _mm_add_epi32(tmp0, rounding);
    2228           0 :     tmp2 = _mm_add_epi32(tmp2, rounding);
    2229           0 :     tmp4 = _mm_add_epi32(tmp4, rounding);
    2230           0 :     tmp6 = _mm_add_epi32(tmp6, rounding);
    2231             : 
    2232           0 :     tmp1 = _mm_srai_epi32(tmp1, DCT_CONST_BITS);
    2233           0 :     tmp3 = _mm_srai_epi32(tmp3, DCT_CONST_BITS);
    2234           0 :     tmp0 = _mm_srai_epi32(tmp0, DCT_CONST_BITS);
    2235           0 :     tmp2 = _mm_srai_epi32(tmp2, DCT_CONST_BITS);
    2236           0 :     tmp4 = _mm_srai_epi32(tmp4, DCT_CONST_BITS);
    2237           0 :     tmp6 = _mm_srai_epi32(tmp6, DCT_CONST_BITS);
    2238             : 
    2239           0 :     stp1_6 = _mm_packs_epi32(tmp3, tmp1);
    2240             : 
    2241           0 :     stp2_10 = _mm_packs_epi32(tmp0, zero);
    2242           0 :     stp2_13 = _mm_packs_epi32(tmp2, zero);
    2243           0 :     stp2_11 = _mm_packs_epi32(tmp4, zero);
    2244           0 :     stp2_12 = _mm_packs_epi32(tmp6, zero);
    2245             : 
    2246           0 :     tmp0 = _mm_add_epi16(stp1_0, stp1_4);
    2247           0 :     tmp1 = _mm_sub_epi16(stp1_0, stp1_4);
    2248           0 :     tmp2 = _mm_add_epi16(stp1_1, stp1_6);
    2249           0 :     tmp3 = _mm_sub_epi16(stp1_1, stp1_6);
    2250             : 
    2251           0 :     stp2_0 = _mm_unpackhi_epi64(tmp0, zero);
    2252           0 :     stp2_1 = _mm_unpacklo_epi64(tmp2, zero);
    2253           0 :     stp2_2 = _mm_unpackhi_epi64(tmp2, zero);
    2254           0 :     stp2_3 = _mm_unpacklo_epi64(tmp0, zero);
    2255           0 :     stp2_4 = _mm_unpacklo_epi64(tmp1, zero);
    2256           0 :     stp2_5 = _mm_unpackhi_epi64(tmp3, zero);
    2257           0 :     stp2_6 = _mm_unpacklo_epi64(tmp3, zero);
    2258           0 :     stp2_7 = _mm_unpackhi_epi64(tmp1, zero);
    2259             :   }
    2260             : 
    2261             :   // Stage7. Left 8x16 only.
    2262           0 :   l[0] = _mm_add_epi16(stp2_0, stp1_15);
    2263           0 :   l[1] = _mm_add_epi16(stp2_1, stp1_14);
    2264           0 :   l[2] = _mm_add_epi16(stp2_2, stp2_13);
    2265           0 :   l[3] = _mm_add_epi16(stp2_3, stp2_12);
    2266           0 :   l[4] = _mm_add_epi16(stp2_4, stp2_11);
    2267           0 :   l[5] = _mm_add_epi16(stp2_5, stp2_10);
    2268           0 :   l[6] = _mm_add_epi16(stp2_6, stp1_9);
    2269           0 :   l[7] = _mm_add_epi16(stp2_7, stp1_8);
    2270           0 :   l[8] = _mm_sub_epi16(stp2_7, stp1_8);
    2271           0 :   l[9] = _mm_sub_epi16(stp2_6, stp1_9);
    2272           0 :   l[10] = _mm_sub_epi16(stp2_5, stp2_10);
    2273           0 :   l[11] = _mm_sub_epi16(stp2_4, stp2_11);
    2274           0 :   l[12] = _mm_sub_epi16(stp2_3, stp2_12);
    2275           0 :   l[13] = _mm_sub_epi16(stp2_2, stp2_13);
    2276           0 :   l[14] = _mm_sub_epi16(stp2_1, stp1_14);
    2277           0 :   l[15] = _mm_sub_epi16(stp2_0, stp1_15);
    2278             : 
    2279             :   // Second 1-D inverse transform, performed per 8x16 block
    2280           0 :   for (i = 0; i < 2; i++) {
    2281             :     int j;
    2282           0 :     array_transpose_4X8(l + 8 * i, in);
    2283             : 
    2284           0 :     IDCT16_10
    2285             : 
    2286             :     // Stage7
    2287           0 :     in[0] = _mm_add_epi16(stp2_0, stp1_15);
    2288           0 :     in[1] = _mm_add_epi16(stp2_1, stp1_14);
    2289           0 :     in[2] = _mm_add_epi16(stp2_2, stp2_13);
    2290           0 :     in[3] = _mm_add_epi16(stp2_3, stp2_12);
    2291           0 :     in[4] = _mm_add_epi16(stp2_4, stp2_11);
    2292           0 :     in[5] = _mm_add_epi16(stp2_5, stp2_10);
    2293           0 :     in[6] = _mm_add_epi16(stp2_6, stp1_9);
    2294           0 :     in[7] = _mm_add_epi16(stp2_7, stp1_8);
    2295           0 :     in[8] = _mm_sub_epi16(stp2_7, stp1_8);
    2296           0 :     in[9] = _mm_sub_epi16(stp2_6, stp1_9);
    2297           0 :     in[10] = _mm_sub_epi16(stp2_5, stp2_10);
    2298           0 :     in[11] = _mm_sub_epi16(stp2_4, stp2_11);
    2299           0 :     in[12] = _mm_sub_epi16(stp2_3, stp2_12);
    2300           0 :     in[13] = _mm_sub_epi16(stp2_2, stp2_13);
    2301           0 :     in[14] = _mm_sub_epi16(stp2_1, stp1_14);
    2302           0 :     in[15] = _mm_sub_epi16(stp2_0, stp1_15);
    2303             : 
    2304           0 :     for (j = 0; j < 16; ++j) {
    2305             :       // Final rounding and shift
    2306           0 :       in[j] = _mm_adds_epi16(in[j], final_rounding);
    2307           0 :       in[j] = _mm_srai_epi16(in[j], 6);
    2308           0 :       RECON_AND_STORE(dest + j * stride, in[j]);
    2309             :     }
    2310             : 
    2311           0 :     dest += 8;
    2312             :   }
    2313           0 : }
    2314             : 
    2315             : #define LOAD_DQCOEFF(reg, input)  \
    2316             :   {                               \
    2317             :     reg = load_input_data(input); \
    2318             :     input += 8;                   \
    2319             :   }
    2320             : 
    2321             : #define IDCT32_34                                                              \
    2322             :   /* Stage1 */                                                                 \
    2323             :   {                                                                            \
    2324             :     const __m128i lo_1_31 = _mm_unpacklo_epi16(in[1], zero);                   \
    2325             :     const __m128i hi_1_31 = _mm_unpackhi_epi16(in[1], zero);                   \
    2326             :                                                                                \
    2327             :     const __m128i lo_25_7 = _mm_unpacklo_epi16(zero, in[7]);                   \
    2328             :     const __m128i hi_25_7 = _mm_unpackhi_epi16(zero, in[7]);                   \
    2329             :                                                                                \
    2330             :     const __m128i lo_5_27 = _mm_unpacklo_epi16(in[5], zero);                   \
    2331             :     const __m128i hi_5_27 = _mm_unpackhi_epi16(in[5], zero);                   \
    2332             :                                                                                \
    2333             :     const __m128i lo_29_3 = _mm_unpacklo_epi16(zero, in[3]);                   \
    2334             :     const __m128i hi_29_3 = _mm_unpackhi_epi16(zero, in[3]);                   \
    2335             :                                                                                \
    2336             :     MULTIPLICATION_AND_ADD_2(lo_1_31, hi_1_31, stg1_0, stg1_1, stp1_16,        \
    2337             :                              stp1_31);                                         \
    2338             :     MULTIPLICATION_AND_ADD_2(lo_25_7, hi_25_7, stg1_6, stg1_7, stp1_19,        \
    2339             :                              stp1_28);                                         \
    2340             :     MULTIPLICATION_AND_ADD_2(lo_5_27, hi_5_27, stg1_8, stg1_9, stp1_20,        \
    2341             :                              stp1_27);                                         \
    2342             :     MULTIPLICATION_AND_ADD_2(lo_29_3, hi_29_3, stg1_14, stg1_15, stp1_23,      \
    2343             :                              stp1_24);                                         \
    2344             :   }                                                                            \
    2345             :                                                                                \
    2346             :   /* Stage2 */                                                                 \
    2347             :   {                                                                            \
    2348             :     const __m128i lo_2_30 = _mm_unpacklo_epi16(in[2], zero);                   \
    2349             :     const __m128i hi_2_30 = _mm_unpackhi_epi16(in[2], zero);                   \
    2350             :                                                                                \
    2351             :     const __m128i lo_26_6 = _mm_unpacklo_epi16(zero, in[6]);                   \
    2352             :     const __m128i hi_26_6 = _mm_unpackhi_epi16(zero, in[6]);                   \
    2353             :                                                                                \
    2354             :     MULTIPLICATION_AND_ADD_2(lo_2_30, hi_2_30, stg2_0, stg2_1, stp2_8,         \
    2355             :                              stp2_15);                                         \
    2356             :     MULTIPLICATION_AND_ADD_2(lo_26_6, hi_26_6, stg2_6, stg2_7, stp2_11,        \
    2357             :                              stp2_12);                                         \
    2358             :                                                                                \
    2359             :     stp2_16 = stp1_16;                                                         \
    2360             :     stp2_19 = stp1_19;                                                         \
    2361             :                                                                                \
    2362             :     stp2_20 = stp1_20;                                                         \
    2363             :     stp2_23 = stp1_23;                                                         \
    2364             :                                                                                \
    2365             :     stp2_24 = stp1_24;                                                         \
    2366             :     stp2_27 = stp1_27;                                                         \
    2367             :                                                                                \
    2368             :     stp2_28 = stp1_28;                                                         \
    2369             :     stp2_31 = stp1_31;                                                         \
    2370             :   }                                                                            \
    2371             :                                                                                \
    2372             :   /* Stage3 */                                                                 \
    2373             :   {                                                                            \
    2374             :     const __m128i lo_4_28 = _mm_unpacklo_epi16(in[4], zero);                   \
    2375             :     const __m128i hi_4_28 = _mm_unpackhi_epi16(in[4], zero);                   \
    2376             :                                                                                \
    2377             :     const __m128i lo_17_30 = _mm_unpacklo_epi16(stp1_16, stp1_31);             \
    2378             :     const __m128i hi_17_30 = _mm_unpackhi_epi16(stp1_16, stp1_31);             \
    2379             :     const __m128i lo_18_29 = _mm_unpacklo_epi16(stp1_19, stp1_28);             \
    2380             :     const __m128i hi_18_29 = _mm_unpackhi_epi16(stp1_19, stp1_28);             \
    2381             :                                                                                \
    2382             :     const __m128i lo_21_26 = _mm_unpacklo_epi16(stp1_20, stp1_27);             \
    2383             :     const __m128i hi_21_26 = _mm_unpackhi_epi16(stp1_20, stp1_27);             \
    2384             :     const __m128i lo_22_25 = _mm_unpacklo_epi16(stp1_23, stp1_24);             \
    2385             :     const __m128i hi_22_25 = _mm_unpackhi_epi16(stp1_23, stp2_24);             \
    2386             :                                                                                \
    2387             :     MULTIPLICATION_AND_ADD_2(lo_4_28, hi_4_28, stg3_0, stg3_1, stp1_4,         \
    2388             :                              stp1_7);                                          \
    2389             :                                                                                \
    2390             :     stp1_8 = stp2_8;                                                           \
    2391             :     stp1_11 = stp2_11;                                                         \
    2392             :     stp1_12 = stp2_12;                                                         \
    2393             :     stp1_15 = stp2_15;                                                         \
    2394             :                                                                                \
    2395             :     MULTIPLICATION_AND_ADD(lo_17_30, hi_17_30, lo_18_29, hi_18_29, stg3_4,     \
    2396             :                            stg3_5, stg3_6, stg3_4, stp1_17, stp1_30, stp1_18,  \
    2397             :                            stp1_29)                                            \
    2398             :     MULTIPLICATION_AND_ADD(lo_21_26, hi_21_26, lo_22_25, hi_22_25, stg3_8,     \
    2399             :                            stg3_9, stg3_10, stg3_8, stp1_21, stp1_26, stp1_22, \
    2400             :                            stp1_25)                                            \
    2401             :                                                                                \
    2402             :     stp1_16 = stp2_16;                                                         \
    2403             :     stp1_31 = stp2_31;                                                         \
    2404             :     stp1_19 = stp2_19;                                                         \
    2405             :     stp1_20 = stp2_20;                                                         \
    2406             :     stp1_23 = stp2_23;                                                         \
    2407             :     stp1_24 = stp2_24;                                                         \
    2408             :     stp1_27 = stp2_27;                                                         \
    2409             :     stp1_28 = stp2_28;                                                         \
    2410             :   }                                                                            \
    2411             :                                                                                \
    2412             :   /* Stage4 */                                                                 \
    2413             :   {                                                                            \
    2414             :     const __m128i lo_0_16 = _mm_unpacklo_epi16(in[0], zero);                   \
    2415             :     const __m128i hi_0_16 = _mm_unpackhi_epi16(in[0], zero);                   \
    2416             :                                                                                \
    2417             :     const __m128i lo_9_14 = _mm_unpacklo_epi16(stp2_8, stp2_15);               \
    2418             :     const __m128i hi_9_14 = _mm_unpackhi_epi16(stp2_8, stp2_15);               \
    2419             :     const __m128i lo_10_13 = _mm_unpacklo_epi16(stp2_11, stp2_12);             \
    2420             :     const __m128i hi_10_13 = _mm_unpackhi_epi16(stp2_11, stp2_12);             \
    2421             :                                                                                \
    2422             :     MULTIPLICATION_AND_ADD_2(lo_0_16, hi_0_16, stg4_0, stg4_1, stp2_0,         \
    2423             :                              stp2_1);                                          \
    2424             :                                                                                \
    2425             :     stp2_4 = stp1_4;                                                           \
    2426             :     stp2_5 = stp1_4;                                                           \
    2427             :     stp2_6 = stp1_7;                                                           \
    2428             :     stp2_7 = stp1_7;                                                           \
    2429             :                                                                                \
    2430             :     MULTIPLICATION_AND_ADD(lo_9_14, hi_9_14, lo_10_13, hi_10_13, stg4_4,       \
    2431             :                            stg4_5, stg4_6, stg4_4, stp2_9, stp2_14, stp2_10,   \
    2432             :                            stp2_13)                                            \
    2433             :                                                                                \
    2434             :     stp2_8 = stp1_8;                                                           \
    2435             :     stp2_15 = stp1_15;                                                         \
    2436             :     stp2_11 = stp1_11;                                                         \
    2437             :     stp2_12 = stp1_12;                                                         \
    2438             :                                                                                \
    2439             :     stp2_16 = _mm_add_epi16(stp1_16, stp1_19);                                 \
    2440             :     stp2_17 = _mm_add_epi16(stp1_17, stp1_18);                                 \
    2441             :     stp2_18 = _mm_sub_epi16(stp1_17, stp1_18);                                 \
    2442             :     stp2_19 = _mm_sub_epi16(stp1_16, stp1_19);                                 \
    2443             :     stp2_20 = _mm_sub_epi16(stp1_23, stp1_20);                                 \
    2444             :     stp2_21 = _mm_sub_epi16(stp1_22, stp1_21);                                 \
    2445             :     stp2_22 = _mm_add_epi16(stp1_22, stp1_21);                                 \
    2446             :     stp2_23 = _mm_add_epi16(stp1_23, stp1_20);                                 \
    2447             :                                                                                \
    2448             :     stp2_24 = _mm_add_epi16(stp1_24, stp1_27);                                 \
    2449             :     stp2_25 = _mm_add_epi16(stp1_25, stp1_26);                                 \
    2450             :     stp2_26 = _mm_sub_epi16(stp1_25, stp1_26);                                 \
    2451             :     stp2_27 = _mm_sub_epi16(stp1_24, stp1_27);                                 \
    2452             :     stp2_28 = _mm_sub_epi16(stp1_31, stp1_28);                                 \
    2453             :     stp2_29 = _mm_sub_epi16(stp1_30, stp1_29);                                 \
    2454             :     stp2_30 = _mm_add_epi16(stp1_29, stp1_30);                                 \
    2455             :     stp2_31 = _mm_add_epi16(stp1_28, stp1_31);                                 \
    2456             :   }                                                                            \
    2457             :                                                                                \
    2458             :   /* Stage5 */                                                                 \
    2459             :   {                                                                            \
    2460             :     const __m128i lo_6_5 = _mm_unpacklo_epi16(stp2_6, stp2_5);                 \
    2461             :     const __m128i hi_6_5 = _mm_unpackhi_epi16(stp2_6, stp2_5);                 \
    2462             :     const __m128i lo_18_29 = _mm_unpacklo_epi16(stp2_18, stp2_29);             \
    2463             :     const __m128i hi_18_29 = _mm_unpackhi_epi16(stp2_18, stp2_29);             \
    2464             :                                                                                \
    2465             :     const __m128i lo_19_28 = _mm_unpacklo_epi16(stp2_19, stp2_28);             \
    2466             :     const __m128i hi_19_28 = _mm_unpackhi_epi16(stp2_19, stp2_28);             \
    2467             :     const __m128i lo_20_27 = _mm_unpacklo_epi16(stp2_20, stp2_27);             \
    2468             :     const __m128i hi_20_27 = _mm_unpackhi_epi16(stp2_20, stp2_27);             \
    2469             :                                                                                \
    2470             :     const __m128i lo_21_26 = _mm_unpacklo_epi16(stp2_21, stp2_26);             \
    2471             :     const __m128i hi_21_26 = _mm_unpackhi_epi16(stp2_21, stp2_26);             \
    2472             :                                                                                \
    2473             :     stp1_0 = stp2_0;                                                           \
    2474             :     stp1_1 = stp2_1;                                                           \
    2475             :     stp1_2 = stp2_1;                                                           \
    2476             :     stp1_3 = stp2_0;                                                           \
    2477             :                                                                                \
    2478             :     tmp0 = _mm_madd_epi16(lo_6_5, stg4_1);                                     \
    2479             :     tmp1 = _mm_madd_epi16(hi_6_5, stg4_1);                                     \
    2480             :     tmp2 = _mm_madd_epi16(lo_6_5, stg4_0);                                     \
    2481             :     tmp3 = _mm_madd_epi16(hi_6_5, stg4_0);                                     \
    2482             :                                                                                \
    2483             :     tmp0 = _mm_add_epi32(tmp0, rounding);                                      \
    2484             :     tmp1 = _mm_add_epi32(tmp1, rounding);                                      \
    2485             :     tmp2 = _mm_add_epi32(tmp2, rounding);                                      \
    2486             :     tmp3 = _mm_add_epi32(tmp3, rounding);                                      \
    2487             :                                                                                \
    2488             :     tmp0 = _mm_srai_epi32(tmp0, DCT_CONST_BITS);                               \
    2489             :     tmp1 = _mm_srai_epi32(tmp1, DCT_CONST_BITS);                               \
    2490             :     tmp2 = _mm_srai_epi32(tmp2, DCT_CONST_BITS);                               \
    2491             :     tmp3 = _mm_srai_epi32(tmp3, DCT_CONST_BITS);                               \
    2492             :                                                                                \
    2493             :     stp1_5 = _mm_packs_epi32(tmp0, tmp1);                                      \
    2494             :     stp1_6 = _mm_packs_epi32(tmp2, tmp3);                                      \
    2495             :                                                                                \
    2496             :     stp1_4 = stp2_4;                                                           \
    2497             :     stp1_7 = stp2_7;                                                           \
    2498             :                                                                                \
    2499             :     stp1_8 = _mm_add_epi16(stp2_8, stp2_11);                                   \
    2500             :     stp1_9 = _mm_add_epi16(stp2_9, stp2_10);                                   \
    2501             :     stp1_10 = _mm_sub_epi16(stp2_9, stp2_10);                                  \
    2502             :     stp1_11 = _mm_sub_epi16(stp2_8, stp2_11);                                  \
    2503             :     stp1_12 = _mm_sub_epi16(stp2_15, stp2_12);                                 \
    2504             :     stp1_13 = _mm_sub_epi16(stp2_14, stp2_13);                                 \
    2505             :     stp1_14 = _mm_add_epi16(stp2_14, stp2_13);                                 \
    2506             :     stp1_15 = _mm_add_epi16(stp2_15, stp2_12);                                 \
    2507             :                                                                                \
    2508             :     stp1_16 = stp2_16;                                                         \
    2509             :     stp1_17 = stp2_17;                                                         \
    2510             :                                                                                \
    2511             :     MULTIPLICATION_AND_ADD(lo_18_29, hi_18_29, lo_19_28, hi_19_28, stg4_4,     \
    2512             :                            stg4_5, stg4_4, stg4_5, stp1_18, stp1_29, stp1_19,  \
    2513             :                            stp1_28)                                            \
    2514             :     MULTIPLICATION_AND_ADD(lo_20_27, hi_20_27, lo_21_26, hi_21_26, stg4_6,     \
    2515             :                            stg4_4, stg4_6, stg4_4, stp1_20, stp1_27, stp1_21,  \
    2516             :                            stp1_26)                                            \
    2517             :                                                                                \
    2518             :     stp1_22 = stp2_22;                                                         \
    2519             :     stp1_23 = stp2_23;                                                         \
    2520             :     stp1_24 = stp2_24;                                                         \
    2521             :     stp1_25 = stp2_25;                                                         \
    2522             :     stp1_30 = stp2_30;                                                         \
    2523             :     stp1_31 = stp2_31;                                                         \
    2524             :   }                                                                            \
    2525             :                                                                                \
    2526             :   /* Stage6 */                                                                 \
    2527             :   {                                                                            \
    2528             :     const __m128i lo_10_13 = _mm_unpacklo_epi16(stp1_10, stp1_13);             \
    2529             :     const __m128i hi_10_13 = _mm_unpackhi_epi16(stp1_10, stp1_13);             \
    2530             :     const __m128i lo_11_12 = _mm_unpacklo_epi16(stp1_11, stp1_12);             \
    2531             :     const __m128i hi_11_12 = _mm_unpackhi_epi16(stp1_11, stp1_12);             \
    2532             :                                                                                \
    2533             :     stp2_0 = _mm_add_epi16(stp1_0, stp1_7);                                    \
    2534             :     stp2_1 = _mm_add_epi16(stp1_1, stp1_6);                                    \
    2535             :     stp2_2 = _mm_add_epi16(stp1_2, stp1_5);                                    \
    2536             :     stp2_3 = _mm_add_epi16(stp1_3, stp1_4);                                    \
    2537             :     stp2_4 = _mm_sub_epi16(stp1_3, stp1_4);                                    \
    2538             :     stp2_5 = _mm_sub_epi16(stp1_2, stp1_5);                                    \
    2539             :     stp2_6 = _mm_sub_epi16(stp1_1, stp1_6);                                    \
    2540             :     stp2_7 = _mm_sub_epi16(stp1_0, stp1_7);                                    \
    2541             :                                                                                \
    2542             :     stp2_8 = stp1_8;                                                           \
    2543             :     stp2_9 = stp1_9;                                                           \
    2544             :     stp2_14 = stp1_14;                                                         \
    2545             :     stp2_15 = stp1_15;                                                         \
    2546             :                                                                                \
    2547             :     MULTIPLICATION_AND_ADD(lo_10_13, hi_10_13, lo_11_12, hi_11_12, stg6_0,     \
    2548             :                            stg4_0, stg6_0, stg4_0, stp2_10, stp2_13, stp2_11,  \
    2549             :                            stp2_12)                                            \
    2550             :                                                                                \
    2551             :     stp2_16 = _mm_add_epi16(stp1_16, stp1_23);                                 \
    2552             :     stp2_17 = _mm_add_epi16(stp1_17, stp1_22);                                 \
    2553             :     stp2_18 = _mm_add_epi16(stp1_18, stp1_21);                                 \
    2554             :     stp2_19 = _mm_add_epi16(stp1_19, stp1_20);                                 \
    2555             :     stp2_20 = _mm_sub_epi16(stp1_19, stp1_20);                                 \
    2556             :     stp2_21 = _mm_sub_epi16(stp1_18, stp1_21);                                 \
    2557             :     stp2_22 = _mm_sub_epi16(stp1_17, stp1_22);                                 \
    2558             :     stp2_23 = _mm_sub_epi16(stp1_16, stp1_23);                                 \
    2559             :                                                                                \
    2560             :     stp2_24 = _mm_sub_epi16(stp1_31, stp1_24);                                 \
    2561             :     stp2_25 = _mm_sub_epi16(stp1_30, stp1_25);                                 \
    2562             :     stp2_26 = _mm_sub_epi16(stp1_29, stp1_26);                                 \
    2563             :     stp2_27 = _mm_sub_epi16(stp1_28, stp1_27);                                 \
    2564             :     stp2_28 = _mm_add_epi16(stp1_27, stp1_28);                                 \
    2565             :     stp2_29 = _mm_add_epi16(stp1_26, stp1_29);                                 \
    2566             :     stp2_30 = _mm_add_epi16(stp1_25, stp1_30);                                 \
    2567             :     stp2_31 = _mm_add_epi16(stp1_24, stp1_31);                                 \
    2568             :   }                                                                            \
    2569             :                                                                                \
    2570             :   /* Stage7 */                                                                 \
    2571             :   {                                                                            \
    2572             :     const __m128i lo_20_27 = _mm_unpacklo_epi16(stp2_20, stp2_27);             \
    2573             :     const __m128i hi_20_27 = _mm_unpackhi_epi16(stp2_20, stp2_27);             \
    2574             :     const __m128i lo_21_26 = _mm_unpacklo_epi16(stp2_21, stp2_26);             \
    2575             :     const __m128i hi_21_26 = _mm_unpackhi_epi16(stp2_21, stp2_26);             \
    2576             :                                                                                \
    2577             :     const __m128i lo_22_25 = _mm_unpacklo_epi16(stp2_22, stp2_25);             \
    2578             :     const __m128i hi_22_25 = _mm_unpackhi_epi16(stp2_22, stp2_25);             \
    2579             :     const __m128i lo_23_24 = _mm_unpacklo_epi16(stp2_23, stp2_24);             \
    2580             :     const __m128i hi_23_24 = _mm_unpackhi_epi16(stp2_23, stp2_24);             \
    2581             :                                                                                \
    2582             :     stp1_0 = _mm_add_epi16(stp2_0, stp2_15);                                   \
    2583             :     stp1_1 = _mm_add_epi16(stp2_1, stp2_14);                                   \
    2584             :     stp1_2 = _mm_add_epi16(stp2_2, stp2_13);                                   \
    2585             :     stp1_3 = _mm_add_epi16(stp2_3, stp2_12);                                   \
    2586             :     stp1_4 = _mm_add_epi16(stp2_4, stp2_11);                                   \
    2587             :     stp1_5 = _mm_add_epi16(stp2_5, stp2_10);                                   \
    2588             :     stp1_6 = _mm_add_epi16(stp2_6, stp2_9);                                    \
    2589             :     stp1_7 = _mm_add_epi16(stp2_7, stp2_8);                                    \
    2590             :     stp1_8 = _mm_sub_epi16(stp2_7, stp2_8);                                    \
    2591             :     stp1_9 = _mm_sub_epi16(stp2_6, stp2_9);                                    \
    2592             :     stp1_10 = _mm_sub_epi16(stp2_5, stp2_10);                                  \
    2593             :     stp1_11 = _mm_sub_epi16(stp2_4, stp2_11);                                  \
    2594             :     stp1_12 = _mm_sub_epi16(stp2_3, stp2_12);                                  \
    2595             :     stp1_13 = _mm_sub_epi16(stp2_2, stp2_13);                                  \
    2596             :     stp1_14 = _mm_sub_epi16(stp2_1, stp2_14);                                  \
    2597             :     stp1_15 = _mm_sub_epi16(stp2_0, stp2_15);                                  \
    2598             :                                                                                \
    2599             :     stp1_16 = stp2_16;                                                         \
    2600             :     stp1_17 = stp2_17;                                                         \
    2601             :     stp1_18 = stp2_18;                                                         \
    2602             :     stp1_19 = stp2_19;                                                         \
    2603             :                                                                                \
    2604             :     MULTIPLICATION_AND_ADD(lo_20_27, hi_20_27, lo_21_26, hi_21_26, stg6_0,     \
    2605             :                            stg4_0, stg6_0, stg4_0, stp1_20, stp1_27, stp1_21,  \
    2606             :                            stp1_26)                                            \
    2607             :     MULTIPLICATION_AND_ADD(lo_22_25, hi_22_25, lo_23_24, hi_23_24, stg6_0,     \
    2608             :                            stg4_0, stg6_0, stg4_0, stp1_22, stp1_25, stp1_23,  \
    2609             :                            stp1_24)                                            \
    2610             :                                                                                \
    2611             :     stp1_28 = stp2_28;                                                         \
    2612             :     stp1_29 = stp2_29;                                                         \
    2613             :     stp1_30 = stp2_30;                                                         \
    2614             :     stp1_31 = stp2_31;                                                         \
    2615             :   }
    2616             : 
    2617             : #define IDCT32(in0, in1)                                                       \
    2618             :   /* Stage1 */                                                                 \
    2619             :   {                                                                            \
    2620             :     const __m128i lo_1_31 = _mm_unpacklo_epi16((in0)[1], (in1)[15]);           \
    2621             :     const __m128i hi_1_31 = _mm_unpackhi_epi16((in0)[1], (in1)[15]);           \
    2622             :     const __m128i lo_17_15 = _mm_unpacklo_epi16((in1)[1], (in0)[15]);          \
    2623             :     const __m128i hi_17_15 = _mm_unpackhi_epi16((in1)[1], (in0)[15]);          \
    2624             :                                                                                \
    2625             :     const __m128i lo_9_23 = _mm_unpacklo_epi16((in0)[9], (in1)[7]);            \
    2626             :     const __m128i hi_9_23 = _mm_unpackhi_epi16((in0)[9], (in1)[7]);            \
    2627             :     const __m128i lo_25_7 = _mm_unpacklo_epi16((in1)[9], (in0)[7]);            \
    2628             :     const __m128i hi_25_7 = _mm_unpackhi_epi16((in1)[9], (in0)[7]);            \
    2629             :                                                                                \
    2630             :     const __m128i lo_5_27 = _mm_unpacklo_epi16((in0)[5], (in1)[11]);           \
    2631             :     const __m128i hi_5_27 = _mm_unpackhi_epi16((in0)[5], (in1)[11]);           \
    2632             :     const __m128i lo_21_11 = _mm_unpacklo_epi16((in1)[5], (in0)[11]);          \
    2633             :     const __m128i hi_21_11 = _mm_unpackhi_epi16((in1)[5], (in0)[11]);          \
    2634             :                                                                                \
    2635             :     const __m128i lo_13_19 = _mm_unpacklo_epi16((in0)[13], (in1)[3]);          \
    2636             :     const __m128i hi_13_19 = _mm_unpackhi_epi16((in0)[13], (in1)[3]);          \
    2637             :     const __m128i lo_29_3 = _mm_unpacklo_epi16((in1)[13], (in0)[3]);           \
    2638             :     const __m128i hi_29_3 = _mm_unpackhi_epi16((in1)[13], (in0)[3]);           \
    2639             :                                                                                \
    2640             :     MULTIPLICATION_AND_ADD(lo_1_31, hi_1_31, lo_17_15, hi_17_15, stg1_0,       \
    2641             :                            stg1_1, stg1_2, stg1_3, stp1_16, stp1_31, stp1_17,  \
    2642             :                            stp1_30)                                            \
    2643             :     MULTIPLICATION_AND_ADD(lo_9_23, hi_9_23, lo_25_7, hi_25_7, stg1_4, stg1_5, \
    2644             :                            stg1_6, stg1_7, stp1_18, stp1_29, stp1_19, stp1_28) \
    2645             :     MULTIPLICATION_AND_ADD(lo_5_27, hi_5_27, lo_21_11, hi_21_11, stg1_8,       \
    2646             :                            stg1_9, stg1_10, stg1_11, stp1_20, stp1_27,         \
    2647             :                            stp1_21, stp1_26)                                   \
    2648             :     MULTIPLICATION_AND_ADD(lo_13_19, hi_13_19, lo_29_3, hi_29_3, stg1_12,      \
    2649             :                            stg1_13, stg1_14, stg1_15, stp1_22, stp1_25,        \
    2650             :                            stp1_23, stp1_24)                                   \
    2651             :   }                                                                            \
    2652             :                                                                                \
    2653             :   /* Stage2 */                                                                 \
    2654             :   {                                                                            \
    2655             :     const __m128i lo_2_30 = _mm_unpacklo_epi16((in0)[2], (in1)[14]);           \
    2656             :     const __m128i hi_2_30 = _mm_unpackhi_epi16((in0)[2], (in1)[14]);           \
    2657             :     const __m128i lo_18_14 = _mm_unpacklo_epi16((in1)[2], (in0)[14]);          \
    2658             :     const __m128i hi_18_14 = _mm_unpackhi_epi16((in1)[2], (in0)[14]);          \
    2659             :                                                                                \
    2660             :     const __m128i lo_10_22 = _mm_unpacklo_epi16((in0)[10], (in1)[6]);          \
    2661             :     const __m128i hi_10_22 = _mm_unpackhi_epi16((in0)[10], (in1)[6]);          \
    2662             :     const __m128i lo_26_6 = _mm_unpacklo_epi16((in1)[10], (in0)[6]);           \
    2663             :     const __m128i hi_26_6 = _mm_unpackhi_epi16((in1)[10], (in0)[6]);           \
    2664             :                                                                                \
    2665             :     MULTIPLICATION_AND_ADD(lo_2_30, hi_2_30, lo_18_14, hi_18_14, stg2_0,       \
    2666             :                            stg2_1, stg2_2, stg2_3, stp2_8, stp2_15, stp2_9,    \
    2667             :                            stp2_14)                                            \
    2668             :     MULTIPLICATION_AND_ADD(lo_10_22, hi_10_22, lo_26_6, hi_26_6, stg2_4,       \
    2669             :                            stg2_5, stg2_6, stg2_7, stp2_10, stp2_13, stp2_11,  \
    2670             :                            stp2_12)                                            \
    2671             :                                                                                \
    2672             :     stp2_16 = _mm_add_epi16(stp1_16, stp1_17);                                 \
    2673             :     stp2_17 = _mm_sub_epi16(stp1_16, stp1_17);                                 \
    2674             :     stp2_18 = _mm_sub_epi16(stp1_19, stp1_18);                                 \
    2675             :     stp2_19 = _mm_add_epi16(stp1_19, stp1_18);                                 \
    2676             :                                                                                \
    2677             :     stp2_20 = _mm_add_epi16(stp1_20, stp1_21);                                 \
    2678             :     stp2_21 = _mm_sub_epi16(stp1_20, stp1_21);                                 \
    2679             :     stp2_22 = _mm_sub_epi16(stp1_23, stp1_22);                                 \
    2680             :     stp2_23 = _mm_add_epi16(stp1_23, stp1_22);                                 \
    2681             :                                                                                \
    2682             :     stp2_24 = _mm_add_epi16(stp1_24, stp1_25);                                 \
    2683             :     stp2_25 = _mm_sub_epi16(stp1_24, stp1_25);                                 \
    2684             :     stp2_26 = _mm_sub_epi16(stp1_27, stp1_26);                                 \
    2685             :     stp2_27 = _mm_add_epi16(stp1_27, stp1_26);                                 \
    2686             :                                                                                \
    2687             :     stp2_28 = _mm_add_epi16(stp1_28, stp1_29);                                 \
    2688             :     stp2_29 = _mm_sub_epi16(stp1_28, stp1_29);                                 \
    2689             :     stp2_30 = _mm_sub_epi16(stp1_31, stp1_30);                                 \
    2690             :     stp2_31 = _mm_add_epi16(stp1_31, stp1_30);                                 \
    2691             :   }                                                                            \
    2692             :                                                                                \
    2693             :   /* Stage3 */                                                                 \
    2694             :   {                                                                            \
    2695             :     const __m128i lo_4_28 = _mm_unpacklo_epi16((in0)[4], (in1)[12]);           \
    2696             :     const __m128i hi_4_28 = _mm_unpackhi_epi16((in0)[4], (in1)[12]);           \
    2697             :     const __m128i lo_20_12 = _mm_unpacklo_epi16((in1)[4], (in0)[12]);          \
    2698             :     const __m128i hi_20_12 = _mm_unpackhi_epi16((in1)[4], (in0)[12]);          \
    2699             :                                                                                \
    2700             :     const __m128i lo_17_30 = _mm_unpacklo_epi16(stp2_17, stp2_30);             \
    2701             :     const __m128i hi_17_30 = _mm_unpackhi_epi16(stp2_17, stp2_30);             \
    2702             :     const __m128i lo_18_29 = _mm_unpacklo_epi16(stp2_18, stp2_29);             \
    2703             :     const __m128i hi_18_29 = _mm_unpackhi_epi16(stp2_18, stp2_29);             \
    2704             :                                                                                \
    2705             :     const __m128i lo_21_26 = _mm_unpacklo_epi16(stp2_21, stp2_26);             \
    2706             :     const __m128i hi_21_26 = _mm_unpackhi_epi16(stp2_21, stp2_26);             \
    2707             :     const __m128i lo_22_25 = _mm_unpacklo_epi16(stp2_22, stp2_25);             \
    2708             :     const __m128i hi_22_25 = _mm_unpackhi_epi16(stp2_22, stp2_25);             \
    2709             :                                                                                \
    2710             :     MULTIPLICATION_AND_ADD(lo_4_28, hi_4_28, lo_20_12, hi_20_12, stg3_0,       \
    2711             :                            stg3_1, stg3_2, stg3_3, stp1_4, stp1_7, stp1_5,     \
    2712             :                            stp1_6)                                             \
    2713             :                                                                                \
    2714             :     stp1_8 = _mm_add_epi16(stp2_8, stp2_9);                                    \
    2715             :     stp1_9 = _mm_sub_epi16(stp2_8, stp2_9);                                    \
    2716             :     stp1_10 = _mm_sub_epi16(stp2_11, stp2_10);                                 \
    2717             :     stp1_11 = _mm_add_epi16(stp2_11, stp2_10);                                 \
    2718             :     stp1_12 = _mm_add_epi16(stp2_12, stp2_13);                                 \
    2719             :     stp1_13 = _mm_sub_epi16(stp2_12, stp2_13);                                 \
    2720             :     stp1_14 = _mm_sub_epi16(stp2_15, stp2_14);                                 \
    2721             :     stp1_15 = _mm_add_epi16(stp2_15, stp2_14);                                 \
    2722             :                                                                                \
    2723             :     MULTIPLICATION_AND_ADD(lo_17_30, hi_17_30, lo_18_29, hi_18_29, stg3_4,     \
    2724             :                            stg3_5, stg3_6, stg3_4, stp1_17, stp1_30, stp1_18,  \
    2725             :                            stp1_29)                                            \
    2726             :     MULTIPLICATION_AND_ADD(lo_21_26, hi_21_26, lo_22_25, hi_22_25, stg3_8,     \
    2727             :                            stg3_9, stg3_10, stg3_8, stp1_21, stp1_26, stp1_22, \
    2728             :                            stp1_25)                                            \
    2729             :                                                                                \
    2730             :     stp1_16 = stp2_16;                                                         \
    2731             :     stp1_31 = stp2_31;                                                         \
    2732             :     stp1_19 = stp2_19;                                                         \
    2733             :     stp1_20 = stp2_20;                                                         \
    2734             :     stp1_23 = stp2_23;                                                         \
    2735             :     stp1_24 = stp2_24;                                                         \
    2736             :     stp1_27 = stp2_27;                                                         \
    2737             :     stp1_28 = stp2_28;                                                         \
    2738             :   }                                                                            \
    2739             :                                                                                \
    2740             :   /* Stage4 */                                                                 \
    2741             :   {                                                                            \
    2742             :     const __m128i lo_0_16 = _mm_unpacklo_epi16((in0)[0], (in1)[0]);            \
    2743             :     const __m128i hi_0_16 = _mm_unpackhi_epi16((in0)[0], (in1)[0]);            \
    2744             :     const __m128i lo_8_24 = _mm_unpacklo_epi16((in0)[8], (in1)[8]);            \
    2745             :     const __m128i hi_8_24 = _mm_unpackhi_epi16((in0)[8], (in1)[8]);            \
    2746             :                                                                                \
    2747             :     const __m128i lo_9_14 = _mm_unpacklo_epi16(stp1_9, stp1_14);               \
    2748             :     const __m128i hi_9_14 = _mm_unpackhi_epi16(stp1_9, stp1_14);               \
    2749             :     const __m128i lo_10_13 = _mm_unpacklo_epi16(stp1_10, stp1_13);             \
    2750             :     const __m128i hi_10_13 = _mm_unpackhi_epi16(stp1_10, stp1_13);             \
    2751             :                                                                                \
    2752             :     MULTIPLICATION_AND_ADD(lo_0_16, hi_0_16, lo_8_24, hi_8_24, stg4_0, stg4_1, \
    2753             :                            stg4_2, stg4_3, stp2_0, stp2_1, stp2_2, stp2_3)     \
    2754             :                                                                                \
    2755             :     stp2_4 = _mm_add_epi16(stp1_4, stp1_5);                                    \
    2756             :     stp2_5 = _mm_sub_epi16(stp1_4, stp1_5);                                    \
    2757             :     stp2_6 = _mm_sub_epi16(stp1_7, stp1_6);                                    \
    2758             :     stp2_7 = _mm_add_epi16(stp1_7, stp1_6);                                    \
    2759             :                                                                                \
    2760             :     MULTIPLICATION_AND_ADD(lo_9_14, hi_9_14, lo_10_13, hi_10_13, stg4_4,       \
    2761             :                            stg4_5, stg4_6, stg4_4, stp2_9, stp2_14, stp2_10,   \
    2762             :                            stp2_13)                                            \
    2763             :                                                                                \
    2764             :     stp2_8 = stp1_8;                                                           \
    2765             :     stp2_15 = stp1_15;                                                         \
    2766             :     stp2_11 = stp1_11;                                                         \
    2767             :     stp2_12 = stp1_12;                                                         \
    2768             :                                                                                \
    2769             :     stp2_16 = _mm_add_epi16(stp1_16, stp1_19);                                 \
    2770             :     stp2_17 = _mm_add_epi16(stp1_17, stp1_18);                                 \
    2771             :     stp2_18 = _mm_sub_epi16(stp1_17, stp1_18);                                 \
    2772             :     stp2_19 = _mm_sub_epi16(stp1_16, stp1_19);                                 \
    2773             :     stp2_20 = _mm_sub_epi16(stp1_23, stp1_20);                                 \
    2774             :     stp2_21 = _mm_sub_epi16(stp1_22, stp1_21);                                 \
    2775             :     stp2_22 = _mm_add_epi16(stp1_22, stp1_21);                                 \
    2776             :     stp2_23 = _mm_add_epi16(stp1_23, stp1_20);                                 \
    2777             :                                                                                \
    2778             :     stp2_24 = _mm_add_epi16(stp1_24, stp1_27);                                 \
    2779             :     stp2_25 = _mm_add_epi16(stp1_25, stp1_26);                                 \
    2780             :     stp2_26 = _mm_sub_epi16(stp1_25, stp1_26);                                 \
    2781             :     stp2_27 = _mm_sub_epi16(stp1_24, stp1_27);                                 \
    2782             :     stp2_28 = _mm_sub_epi16(stp1_31, stp1_28);                                 \
    2783             :     stp2_29 = _mm_sub_epi16(stp1_30, stp1_29);                                 \
    2784             :     stp2_30 = _mm_add_epi16(stp1_29, stp1_30);                                 \
    2785             :     stp2_31 = _mm_add_epi16(stp1_28, stp1_31);                                 \
    2786             :   }                                                                            \
    2787             :                                                                                \
    2788             :   /* Stage5 */                                                                 \
    2789             :   {                                                                            \
    2790             :     const __m128i lo_6_5 = _mm_unpacklo_epi16(stp2_6, stp2_5);                 \
    2791             :     const __m128i hi_6_5 = _mm_unpackhi_epi16(stp2_6, stp2_5);                 \
    2792             :     const __m128i lo_18_29 = _mm_unpacklo_epi16(stp2_18, stp2_29);             \
    2793             :     const __m128i hi_18_29 = _mm_unpackhi_epi16(stp2_18, stp2_29);             \
    2794             :                                                                                \
    2795             :     const __m128i lo_19_28 = _mm_unpacklo_epi16(stp2_19, stp2_28);             \
    2796             :     const __m128i hi_19_28 = _mm_unpackhi_epi16(stp2_19, stp2_28);             \
    2797             :     const __m128i lo_20_27 = _mm_unpacklo_epi16(stp2_20, stp2_27);             \
    2798             :     const __m128i hi_20_27 = _mm_unpackhi_epi16(stp2_20, stp2_27);             \
    2799             :                                                                                \
    2800             :     const __m128i lo_21_26 = _mm_unpacklo_epi16(stp2_21, stp2_26);             \
    2801             :     const __m128i hi_21_26 = _mm_unpackhi_epi16(stp2_21, stp2_26);             \
    2802             :                                                                                \
    2803             :     stp1_0 = _mm_add_epi16(stp2_0, stp2_3);                                    \
    2804             :     stp1_1 = _mm_add_epi16(stp2_1, stp2_2);                                    \
    2805             :     stp1_2 = _mm_sub_epi16(stp2_1, stp2_2);                                    \
    2806             :     stp1_3 = _mm_sub_epi16(stp2_0, stp2_3);                                    \
    2807             :                                                                                \
    2808             :     tmp0 = _mm_madd_epi16(lo_6_5, stg4_1);                                     \
    2809             :     tmp1 = _mm_madd_epi16(hi_6_5, stg4_1);                                     \
    2810             :     tmp2 = _mm_madd_epi16(lo_6_5, stg4_0);                                     \
    2811             :     tmp3 = _mm_madd_epi16(hi_6_5, stg4_0);                                     \
    2812             :                                                                                \
    2813             :     tmp0 = _mm_add_epi32(tmp0, rounding);                                      \
    2814             :     tmp1 = _mm_add_epi32(tmp1, rounding);                                      \
    2815             :     tmp2 = _mm_add_epi32(tmp2, rounding);                                      \
    2816             :     tmp3 = _mm_add_epi32(tmp3, rounding);                                      \
    2817             :                                                                                \
    2818             :     tmp0 = _mm_srai_epi32(tmp0, DCT_CONST_BITS);                               \
    2819             :     tmp1 = _mm_srai_epi32(tmp1, DCT_CONST_BITS);                               \
    2820             :     tmp2 = _mm_srai_epi32(tmp2, DCT_CONST_BITS);                               \
    2821             :     tmp3 = _mm_srai_epi32(tmp3, DCT_CONST_BITS);                               \
    2822             :                                                                                \
    2823             :     stp1_5 = _mm_packs_epi32(tmp0, tmp1);                                      \
    2824             :     stp1_6 = _mm_packs_epi32(tmp2, tmp3);                                      \
    2825             :                                                                                \
    2826             :     stp1_4 = stp2_4;                                                           \
    2827             :     stp1_7 = stp2_7;                                                           \
    2828             :                                                                                \
    2829             :     stp1_8 = _mm_add_epi16(stp2_8, stp2_11);                                   \
    2830             :     stp1_9 = _mm_add_epi16(stp2_9, stp2_10);                                   \
    2831             :     stp1_10 = _mm_sub_epi16(stp2_9, stp2_10);                                  \
    2832             :     stp1_11 = _mm_sub_epi16(stp2_8, stp2_11);                                  \
    2833             :     stp1_12 = _mm_sub_epi16(stp2_15, stp2_12);                                 \
    2834             :     stp1_13 = _mm_sub_epi16(stp2_14, stp2_13);                                 \
    2835             :     stp1_14 = _mm_add_epi16(stp2_14, stp2_13);                                 \
    2836             :     stp1_15 = _mm_add_epi16(stp2_15, stp2_12);                                 \
    2837             :                                                                                \
    2838             :     stp1_16 = stp2_16;                                                         \
    2839             :     stp1_17 = stp2_17;                                                         \
    2840             :                                                                                \
    2841             :     MULTIPLICATION_AND_ADD(lo_18_29, hi_18_29, lo_19_28, hi_19_28, stg4_4,     \
    2842             :                            stg4_5, stg4_4, stg4_5, stp1_18, stp1_29, stp1_19,  \
    2843             :                            stp1_28)                                            \
    2844             :     MULTIPLICATION_AND_ADD(lo_20_27, hi_20_27, lo_21_26, hi_21_26, stg4_6,     \
    2845             :                            stg4_4, stg4_6, stg4_4, stp1_20, stp1_27, stp1_21,  \
    2846             :                            stp1_26)                                            \
    2847             :                                                                                \
    2848             :     stp1_22 = stp2_22;                                                         \
    2849             :     stp1_23 = stp2_23;                                                         \
    2850             :     stp1_24 = stp2_24;                                                         \
    2851             :     stp1_25 = stp2_25;                                                         \
    2852             :     stp1_30 = stp2_30;                                                         \
    2853             :     stp1_31 = stp2_31;                                                         \
    2854             :   }                                                                            \
    2855             :                                                                                \
    2856             :   /* Stage6 */                                                                 \
    2857             :   {                                                                            \
    2858             :     const __m128i lo_10_13 = _mm_unpacklo_epi16(stp1_10, stp1_13);             \
    2859             :     const __m128i hi_10_13 = _mm_unpackhi_epi16(stp1_10, stp1_13);             \
    2860             :     const __m128i lo_11_12 = _mm_unpacklo_epi16(stp1_11, stp1_12);             \
    2861             :     const __m128i hi_11_12 = _mm_unpackhi_epi16(stp1_11, stp1_12);             \
    2862             :                                                                                \
    2863             :     stp2_0 = _mm_add_epi16(stp1_0, stp1_7);                                    \
    2864             :     stp2_1 = _mm_add_epi16(stp1_1, stp1_6);                                    \
    2865             :     stp2_2 = _mm_add_epi16(stp1_2, stp1_5);                                    \
    2866             :     stp2_3 = _mm_add_epi16(stp1_3, stp1_4);                                    \
    2867             :     stp2_4 = _mm_sub_epi16(stp1_3, stp1_4);                                    \
    2868             :     stp2_5 = _mm_sub_epi16(stp1_2, stp1_5);                                    \
    2869             :     stp2_6 = _mm_sub_epi16(stp1_1, stp1_6);                                    \
    2870             :     stp2_7 = _mm_sub_epi16(stp1_0, stp1_7);                                    \
    2871             :                                                                                \
    2872             :     stp2_8 = stp1_8;                                                           \
    2873             :     stp2_9 = stp1_9;                                                           \
    2874             :     stp2_14 = stp1_14;                                                         \
    2875             :     stp2_15 = stp1_15;                                                         \
    2876             :                                                                                \
    2877             :     MULTIPLICATION_AND_ADD(lo_10_13, hi_10_13, lo_11_12, hi_11_12, stg6_0,     \
    2878             :                            stg4_0, stg6_0, stg4_0, stp2_10, stp2_13, stp2_11,  \
    2879             :                            stp2_12)                                            \
    2880             :                                                                                \
    2881             :     stp2_16 = _mm_add_epi16(stp1_16, stp1_23);                                 \
    2882             :     stp2_17 = _mm_add_epi16(stp1_17, stp1_22);                                 \
    2883             :     stp2_18 = _mm_add_epi16(stp1_18, stp1_21);                                 \
    2884             :     stp2_19 = _mm_add_epi16(stp1_19, stp1_20);                                 \
    2885             :     stp2_20 = _mm_sub_epi16(stp1_19, stp1_20);                                 \
    2886             :     stp2_21 = _mm_sub_epi16(stp1_18, stp1_21);                                 \
    2887             :     stp2_22 = _mm_sub_epi16(stp1_17, stp1_22);                                 \
    2888             :     stp2_23 = _mm_sub_epi16(stp1_16, stp1_23);                                 \
    2889             :                                                                                \
    2890             :     stp2_24 = _mm_sub_epi16(stp1_31, stp1_24);                                 \
    2891             :     stp2_25 = _mm_sub_epi16(stp1_30, stp1_25);                                 \
    2892             :     stp2_26 = _mm_sub_epi16(stp1_29, stp1_26);                                 \
    2893             :     stp2_27 = _mm_sub_epi16(stp1_28, stp1_27);                                 \
    2894             :     stp2_28 = _mm_add_epi16(stp1_27, stp1_28);                                 \
    2895             :     stp2_29 = _mm_add_epi16(stp1_26, stp1_29);                                 \
    2896             :     stp2_30 = _mm_add_epi16(stp1_25, stp1_30);                                 \
    2897             :     stp2_31 = _mm_add_epi16(stp1_24, stp1_31);                                 \
    2898             :   }                                                                            \
    2899             :                                                                                \
    2900             :   /* Stage7 */                                                                 \
    2901             :   {                                                                            \
    2902             :     const __m128i lo_20_27 = _mm_unpacklo_epi16(stp2_20, stp2_27);             \
    2903             :     const __m128i hi_20_27 = _mm_unpackhi_epi16(stp2_20, stp2_27);             \
    2904             :     const __m128i lo_21_26 = _mm_unpacklo_epi16(stp2_21, stp2_26);             \
    2905             :     const __m128i hi_21_26 = _mm_unpackhi_epi16(stp2_21, stp2_26);             \
    2906             :                                                                                \
    2907             :     const __m128i lo_22_25 = _mm_unpacklo_epi16(stp2_22, stp2_25);             \
    2908             :     const __m128i hi_22_25 = _mm_unpackhi_epi16(stp2_22, stp2_25);             \
    2909             :     const __m128i lo_23_24 = _mm_unpacklo_epi16(stp2_23, stp2_24);             \
    2910             :     const __m128i hi_23_24 = _mm_unpackhi_epi16(stp2_23, stp2_24);             \
    2911             :                                                                                \
    2912             :     stp1_0 = _mm_add_epi16(stp2_0, stp2_15);                                   \
    2913             :     stp1_1 = _mm_add_epi16(stp2_1, stp2_14);                                   \
    2914             :     stp1_2 = _mm_add_epi16(stp2_2, stp2_13);                                   \
    2915             :     stp1_3 = _mm_add_epi16(stp2_3, stp2_12);                                   \
    2916             :     stp1_4 = _mm_add_epi16(stp2_4, stp2_11);                                   \
    2917             :     stp1_5 = _mm_add_epi16(stp2_5, stp2_10);                                   \
    2918             :     stp1_6 = _mm_add_epi16(stp2_6, stp2_9);                                    \
    2919             :     stp1_7 = _mm_add_epi16(stp2_7, stp2_8);                                    \
    2920             :     stp1_8 = _mm_sub_epi16(stp2_7, stp2_8);                                    \
    2921             :     stp1_9 = _mm_sub_epi16(stp2_6, stp2_9);                                    \
    2922             :     stp1_10 = _mm_sub_epi16(stp2_5, stp2_10);                                  \
    2923             :     stp1_11 = _mm_sub_epi16(stp2_4, stp2_11);                                  \
    2924             :     stp1_12 = _mm_sub_epi16(stp2_3, stp2_12);                                  \
    2925             :     stp1_13 = _mm_sub_epi16(stp2_2, stp2_13);                                  \
    2926             :     stp1_14 = _mm_sub_epi16(stp2_1, stp2_14);                                  \
    2927             :     stp1_15 = _mm_sub_epi16(stp2_0, stp2_15);                                  \
    2928             :                                                                                \
    2929             :     stp1_16 = stp2_16;                                                         \
    2930             :     stp1_17 = stp2_17;                                                         \
    2931             :     stp1_18 = stp2_18;                                                         \
    2932             :     stp1_19 = stp2_19;                                                         \
    2933             :                                                                                \
    2934             :     MULTIPLICATION_AND_ADD(lo_20_27, hi_20_27, lo_21_26, hi_21_26, stg6_0,     \
    2935             :                            stg4_0, stg6_0, stg4_0, stp1_20, stp1_27, stp1_21,  \
    2936             :                            stp1_26)                                            \
    2937             :     MULTIPLICATION_AND_ADD(lo_22_25, hi_22_25, lo_23_24, hi_23_24, stg6_0,     \
    2938             :                            stg4_0, stg6_0, stg4_0, stp1_22, stp1_25, stp1_23,  \
    2939             :                            stp1_24)                                            \
    2940             :                                                                                \
    2941             :     stp1_28 = stp2_28;                                                         \
    2942             :     stp1_29 = stp2_29;                                                         \
    2943             :     stp1_30 = stp2_30;                                                         \
    2944             :     stp1_31 = stp2_31;                                                         \
    2945             :   }
    2946             : 
    2947             : // Only upper-left 8x8 has non-zero coeff
    2948           0 : void aom_idct32x32_34_add_sse2(const tran_low_t *input, uint8_t *dest,
    2949             :                                int stride) {
    2950           0 :   const __m128i zero = _mm_setzero_si128();
    2951           0 :   const __m128i rounding = _mm_set1_epi32(DCT_CONST_ROUNDING);
    2952           0 :   const __m128i final_rounding = _mm_set1_epi16(1 << 5);
    2953             : 
    2954             :   // idct constants for each stage
    2955           0 :   const __m128i stg1_0 = pair_set_epi16(cospi_31_64, -cospi_1_64);
    2956           0 :   const __m128i stg1_1 = pair_set_epi16(cospi_1_64, cospi_31_64);
    2957           0 :   const __m128i stg1_6 = pair_set_epi16(cospi_7_64, -cospi_25_64);
    2958           0 :   const __m128i stg1_7 = pair_set_epi16(cospi_25_64, cospi_7_64);
    2959           0 :   const __m128i stg1_8 = pair_set_epi16(cospi_27_64, -cospi_5_64);
    2960           0 :   const __m128i stg1_9 = pair_set_epi16(cospi_5_64, cospi_27_64);
    2961           0 :   const __m128i stg1_14 = pair_set_epi16(cospi_3_64, -cospi_29_64);
    2962           0 :   const __m128i stg1_15 = pair_set_epi16(cospi_29_64, cospi_3_64);
    2963             : 
    2964           0 :   const __m128i stg2_0 = pair_set_epi16(cospi_30_64, -cospi_2_64);
    2965           0 :   const __m128i stg2_1 = pair_set_epi16(cospi_2_64, cospi_30_64);
    2966           0 :   const __m128i stg2_6 = pair_set_epi16(cospi_6_64, -cospi_26_64);
    2967           0 :   const __m128i stg2_7 = pair_set_epi16(cospi_26_64, cospi_6_64);
    2968             : 
    2969           0 :   const __m128i stg3_0 = pair_set_epi16(cospi_28_64, -cospi_4_64);
    2970           0 :   const __m128i stg3_1 = pair_set_epi16(cospi_4_64, cospi_28_64);
    2971           0 :   const __m128i stg3_4 = pair_set_epi16(-cospi_4_64, cospi_28_64);
    2972           0 :   const __m128i stg3_5 = pair_set_epi16(cospi_28_64, cospi_4_64);
    2973           0 :   const __m128i stg3_6 = pair_set_epi16(-cospi_28_64, -cospi_4_64);
    2974           0 :   const __m128i stg3_8 = pair_set_epi16(-cospi_20_64, cospi_12_64);
    2975           0 :   const __m128i stg3_9 = pair_set_epi16(cospi_12_64, cospi_20_64);
    2976           0 :   const __m128i stg3_10 = pair_set_epi16(-cospi_12_64, -cospi_20_64);
    2977             : 
    2978           0 :   const __m128i stg4_0 = pair_set_epi16(cospi_16_64, cospi_16_64);
    2979           0 :   const __m128i stg4_1 = pair_set_epi16(cospi_16_64, -cospi_16_64);
    2980           0 :   const __m128i stg4_4 = pair_set_epi16(-cospi_8_64, cospi_24_64);
    2981           0 :   const __m128i stg4_5 = pair_set_epi16(cospi_24_64, cospi_8_64);
    2982           0 :   const __m128i stg4_6 = pair_set_epi16(-cospi_24_64, -cospi_8_64);
    2983             : 
    2984           0 :   const __m128i stg6_0 = pair_set_epi16(-cospi_16_64, cospi_16_64);
    2985             : 
    2986             :   __m128i in[32], col[32];
    2987             :   __m128i stp1_0, stp1_1, stp1_2, stp1_3, stp1_4, stp1_5, stp1_6, stp1_7,
    2988             :       stp1_8, stp1_9, stp1_10, stp1_11, stp1_12, stp1_13, stp1_14, stp1_15,
    2989             :       stp1_16, stp1_17, stp1_18, stp1_19, stp1_20, stp1_21, stp1_22, stp1_23,
    2990             :       stp1_24, stp1_25, stp1_26, stp1_27, stp1_28, stp1_29, stp1_30, stp1_31;
    2991             :   __m128i stp2_0, stp2_1, stp2_2, stp2_3, stp2_4, stp2_5, stp2_6, stp2_7,
    2992             :       stp2_8, stp2_9, stp2_10, stp2_11, stp2_12, stp2_13, stp2_14, stp2_15,
    2993             :       stp2_16, stp2_17, stp2_18, stp2_19, stp2_20, stp2_21, stp2_22, stp2_23,
    2994             :       stp2_24, stp2_25, stp2_26, stp2_27, stp2_28, stp2_29, stp2_30, stp2_31;
    2995             :   __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
    2996             :   int i;
    2997             : 
    2998             :   // Load input data. Only need to load the top left 8x8 block.
    2999           0 :   in[0] = load_input_data(input);
    3000           0 :   in[1] = load_input_data(input + 32);
    3001           0 :   in[2] = load_input_data(input + 64);
    3002           0 :   in[3] = load_input_data(input + 96);
    3003           0 :   in[4] = load_input_data(input + 128);
    3004           0 :   in[5] = load_input_data(input + 160);
    3005           0 :   in[6] = load_input_data(input + 192);
    3006           0 :   in[7] = load_input_data(input + 224);
    3007             : 
    3008           0 :   for (i = 8; i < 32; ++i) {
    3009           0 :     in[i] = _mm_setzero_si128();
    3010             :   }
    3011             : 
    3012           0 :   array_transpose_8x8(in, in);
    3013             :   // TODO(hkuang): Following transposes are unnecessary. But remove them will
    3014             :   // lead to performance drop on some devices.
    3015           0 :   array_transpose_8x8(in + 8, in + 8);
    3016           0 :   array_transpose_8x8(in + 16, in + 16);
    3017           0 :   array_transpose_8x8(in + 24, in + 24);
    3018             : 
    3019           0 :   IDCT32_34
    3020             : 
    3021             :   // 1_D: Store 32 intermediate results for each 8x32 block.
    3022           0 :   col[0] = _mm_add_epi16(stp1_0, stp1_31);
    3023           0 :   col[1] = _mm_add_epi16(stp1_1, stp1_30);
    3024           0 :   col[2] = _mm_add_epi16(stp1_2, stp1_29);
    3025           0 :   col[3] = _mm_add_epi16(stp1_3, stp1_28);
    3026           0 :   col[4] = _mm_add_epi16(stp1_4, stp1_27);
    3027           0 :   col[5] = _mm_add_epi16(stp1_5, stp1_26);
    3028           0 :   col[6] = _mm_add_epi16(stp1_6, stp1_25);
    3029           0 :   col[7] = _mm_add_epi16(stp1_7, stp1_24);
    3030           0 :   col[8] = _mm_add_epi16(stp1_8, stp1_23);
    3031           0 :   col[9] = _mm_add_epi16(stp1_9, stp1_22);
    3032           0 :   col[10] = _mm_add_epi16(stp1_10, stp1_21);
    3033           0 :   col[11] = _mm_add_epi16(stp1_11, stp1_20);
    3034           0 :   col[12] = _mm_add_epi16(stp1_12, stp1_19);
    3035           0 :   col[13] = _mm_add_epi16(stp1_13, stp1_18);
    3036           0 :   col[14] = _mm_add_epi16(stp1_14, stp1_17);
    3037           0 :   col[15] = _mm_add_epi16(stp1_15, stp1_16);
    3038           0 :   col[16] = _mm_sub_epi16(stp1_15, stp1_16);
    3039           0 :   col[17] = _mm_sub_epi16(stp1_14, stp1_17);
    3040           0 :   col[18] = _mm_sub_epi16(stp1_13, stp1_18);
    3041           0 :   col[19] = _mm_sub_epi16(stp1_12, stp1_19);
    3042           0 :   col[20] = _mm_sub_epi16(stp1_11, stp1_20);
    3043           0 :   col[21] = _mm_sub_epi16(stp1_10, stp1_21);
    3044           0 :   col[22] = _mm_sub_epi16(stp1_9, stp1_22);
    3045           0 :   col[23] = _mm_sub_epi16(stp1_8, stp1_23);
    3046           0 :   col[24] = _mm_sub_epi16(stp1_7, stp1_24);
    3047           0 :   col[25] = _mm_sub_epi16(stp1_6, stp1_25);
    3048           0 :   col[26] = _mm_sub_epi16(stp1_5, stp1_26);
    3049           0 :   col[27] = _mm_sub_epi16(stp1_4, stp1_27);
    3050           0 :   col[28] = _mm_sub_epi16(stp1_3, stp1_28);
    3051           0 :   col[29] = _mm_sub_epi16(stp1_2, stp1_29);
    3052           0 :   col[30] = _mm_sub_epi16(stp1_1, stp1_30);
    3053           0 :   col[31] = _mm_sub_epi16(stp1_0, stp1_31);
    3054           0 :   for (i = 0; i < 4; i++) {
    3055             :     int j;
    3056             :     // Transpose 32x8 block to 8x32 block
    3057           0 :     array_transpose_8x8(col + i * 8, in);
    3058           0 :     IDCT32_34
    3059             : 
    3060             :     // 2_D: Calculate the results and store them to destination.
    3061           0 :     in[0] = _mm_add_epi16(stp1_0, stp1_31);
    3062           0 :     in[1] = _mm_add_epi16(stp1_1, stp1_30);
    3063           0 :     in[2] = _mm_add_epi16(stp1_2, stp1_29);
    3064           0 :     in[3] = _mm_add_epi16(stp1_3, stp1_28);
    3065           0 :     in[4] = _mm_add_epi16(stp1_4, stp1_27);
    3066           0 :     in[5] = _mm_add_epi16(stp1_5, stp1_26);
    3067           0 :     in[6] = _mm_add_epi16(stp1_6, stp1_25);
    3068           0 :     in[7] = _mm_add_epi16(stp1_7, stp1_24);
    3069           0 :     in[8] = _mm_add_epi16(stp1_8, stp1_23);
    3070           0 :     in[9] = _mm_add_epi16(stp1_9, stp1_22);
    3071           0 :     in[10] = _mm_add_epi16(stp1_10, stp1_21);
    3072           0 :     in[11] = _mm_add_epi16(stp1_11, stp1_20);
    3073           0 :     in[12] = _mm_add_epi16(stp1_12, stp1_19);
    3074           0 :     in[13] = _mm_add_epi16(stp1_13, stp1_18);
    3075           0 :     in[14] = _mm_add_epi16(stp1_14, stp1_17);
    3076           0 :     in[15] = _mm_add_epi16(stp1_15, stp1_16);
    3077           0 :     in[16] = _mm_sub_epi16(stp1_15, stp1_16);
    3078           0 :     in[17] = _mm_sub_epi16(stp1_14, stp1_17);
    3079           0 :     in[18] = _mm_sub_epi16(stp1_13, stp1_18);
    3080           0 :     in[19] = _mm_sub_epi16(stp1_12, stp1_19);
    3081           0 :     in[20] = _mm_sub_epi16(stp1_11, stp1_20);
    3082           0 :     in[21] = _mm_sub_epi16(stp1_10, stp1_21);
    3083           0 :     in[22] = _mm_sub_epi16(stp1_9, stp1_22);
    3084           0 :     in[23] = _mm_sub_epi16(stp1_8, stp1_23);
    3085           0 :     in[24] = _mm_sub_epi16(stp1_7, stp1_24);
    3086           0 :     in[25] = _mm_sub_epi16(stp1_6, stp1_25);
    3087           0 :     in[26] = _mm_sub_epi16(stp1_5, stp1_26);
    3088           0 :     in[27] = _mm_sub_epi16(stp1_4, stp1_27);
    3089           0 :     in[28] = _mm_sub_epi16(stp1_3, stp1_28);
    3090           0 :     in[29] = _mm_sub_epi16(stp1_2, stp1_29);
    3091           0 :     in[30] = _mm_sub_epi16(stp1_1, stp1_30);
    3092           0 :     in[31] = _mm_sub_epi16(stp1_0, stp1_31);
    3093             : 
    3094           0 :     for (j = 0; j < 32; ++j) {
    3095             :       // Final rounding and shift
    3096           0 :       in[j] = _mm_adds_epi16(in[j], final_rounding);
    3097           0 :       in[j] = _mm_srai_epi16(in[j], 6);
    3098           0 :       RECON_AND_STORE(dest + j * stride, in[j]);
    3099             :     }
    3100             : 
    3101           0 :     dest += 8;
    3102             :   }
    3103           0 : }
    3104             : 
    3105           0 : void aom_idct32x32_1024_add_sse2(const tran_low_t *input, uint8_t *dest,
    3106             :                                  int stride) {
    3107           0 :   const __m128i rounding = _mm_set1_epi32(DCT_CONST_ROUNDING);
    3108           0 :   const __m128i final_rounding = _mm_set1_epi16(1 << 5);
    3109           0 :   const __m128i zero = _mm_setzero_si128();
    3110             : 
    3111             :   // idct constants for each stage
    3112           0 :   const __m128i stg1_0 = pair_set_epi16(cospi_31_64, -cospi_1_64);
    3113           0 :   const __m128i stg1_1 = pair_set_epi16(cospi_1_64, cospi_31_64);
    3114           0 :   const __m128i stg1_2 = pair_set_epi16(cospi_15_64, -cospi_17_64);
    3115           0 :   const __m128i stg1_3 = pair_set_epi16(cospi_17_64, cospi_15_64);
    3116           0 :   const __m128i stg1_4 = pair_set_epi16(cospi_23_64, -cospi_9_64);
    3117           0 :   const __m128i stg1_5 = pair_set_epi16(cospi_9_64, cospi_23_64);
    3118           0 :   const __m128i stg1_6 = pair_set_epi16(cospi_7_64, -cospi_25_64);
    3119           0 :   const __m128i stg1_7 = pair_set_epi16(cospi_25_64, cospi_7_64);
    3120           0 :   const __m128i stg1_8 = pair_set_epi16(cospi_27_64, -cospi_5_64);
    3121           0 :   const __m128i stg1_9 = pair_set_epi16(cospi_5_64, cospi_27_64);
    3122           0 :   const __m128i stg1_10 = pair_set_epi16(cospi_11_64, -cospi_21_64);
    3123           0 :   const __m128i stg1_11 = pair_set_epi16(cospi_21_64, cospi_11_64);
    3124           0 :   const __m128i stg1_12 = pair_set_epi16(cospi_19_64, -cospi_13_64);
    3125           0 :   const __m128i stg1_13 = pair_set_epi16(cospi_13_64, cospi_19_64);
    3126           0 :   const __m128i stg1_14 = pair_set_epi16(cospi_3_64, -cospi_29_64);
    3127           0 :   const __m128i stg1_15 = pair_set_epi16(cospi_29_64, cospi_3_64);
    3128             : 
    3129           0 :   const __m128i stg2_0 = pair_set_epi16(cospi_30_64, -cospi_2_64);
    3130           0 :   const __m128i stg2_1 = pair_set_epi16(cospi_2_64, cospi_30_64);
    3131           0 :   const __m128i stg2_2 = pair_set_epi16(cospi_14_64, -cospi_18_64);
    3132           0 :   const __m128i stg2_3 = pair_set_epi16(cospi_18_64, cospi_14_64);
    3133           0 :   const __m128i stg2_4 = pair_set_epi16(cospi_22_64, -cospi_10_64);
    3134           0 :   const __m128i stg2_5 = pair_set_epi16(cospi_10_64, cospi_22_64);
    3135           0 :   const __m128i stg2_6 = pair_set_epi16(cospi_6_64, -cospi_26_64);
    3136           0 :   const __m128i stg2_7 = pair_set_epi16(cospi_26_64, cospi_6_64);
    3137             : 
    3138           0 :   const __m128i stg3_0 = pair_set_epi16(cospi_28_64, -cospi_4_64);
    3139           0 :   const __m128i stg3_1 = pair_set_epi16(cospi_4_64, cospi_28_64);
    3140           0 :   const __m128i stg3_2 = pair_set_epi16(cospi_12_64, -cospi_20_64);
    3141           0 :   const __m128i stg3_3 = pair_set_epi16(cospi_20_64, cospi_12_64);
    3142           0 :   const __m128i stg3_4 = pair_set_epi16(-cospi_4_64, cospi_28_64);
    3143           0 :   const __m128i stg3_5 = pair_set_epi16(cospi_28_64, cospi_4_64);
    3144           0 :   const __m128i stg3_6 = pair_set_epi16(-cospi_28_64, -cospi_4_64);
    3145           0 :   const __m128i stg3_8 = pair_set_epi16(-cospi_20_64, cospi_12_64);
    3146           0 :   const __m128i stg3_9 = pair_set_epi16(cospi_12_64, cospi_20_64);
    3147           0 :   const __m128i stg3_10 = pair_set_epi16(-cospi_12_64, -cospi_20_64);
    3148             : 
    3149           0 :   const __m128i stg4_0 = pair_set_epi16(cospi_16_64, cospi_16_64);
    3150           0 :   const __m128i stg4_1 = pair_set_epi16(cospi_16_64, -cospi_16_64);
    3151           0 :   const __m128i stg4_2 = pair_set_epi16(cospi_24_64, -cospi_8_64);
    3152           0 :   const __m128i stg4_3 = pair_set_epi16(cospi_8_64, cospi_24_64);
    3153           0 :   const __m128i stg4_4 = pair_set_epi16(-cospi_8_64, cospi_24_64);
    3154           0 :   const __m128i stg4_5 = pair_set_epi16(cospi_24_64, cospi_8_64);
    3155           0 :   const __m128i stg4_6 = pair_set_epi16(-cospi_24_64, -cospi_8_64);
    3156             : 
    3157           0 :   const __m128i stg6_0 = pair_set_epi16(-cospi_16_64, cospi_16_64);
    3158             : 
    3159             :   __m128i in[32], col[128], zero_idx[16];
    3160             :   __m128i stp1_0, stp1_1, stp1_2, stp1_3, stp1_4, stp1_5, stp1_6, stp1_7,
    3161             :       stp1_8, stp1_9, stp1_10, stp1_11, stp1_12, stp1_13, stp1_14, stp1_15,
    3162             :       stp1_16, stp1_17, stp1_18, stp1_19, stp1_20, stp1_21, stp1_22, stp1_23,
    3163             :       stp1_24, stp1_25, stp1_26, stp1_27, stp1_28, stp1_29, stp1_30, stp1_31;
    3164             :   __m128i stp2_0, stp2_1, stp2_2, stp2_3, stp2_4, stp2_5, stp2_6, stp2_7,
    3165             :       stp2_8, stp2_9, stp2_10, stp2_11, stp2_12, stp2_13, stp2_14, stp2_15,
    3166             :       stp2_16, stp2_17, stp2_18, stp2_19, stp2_20, stp2_21, stp2_22, stp2_23,
    3167             :       stp2_24, stp2_25, stp2_26, stp2_27, stp2_28, stp2_29, stp2_30, stp2_31;
    3168             :   __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
    3169             :   int i, j, i32;
    3170             : 
    3171           0 :   for (i = 0; i < 4; i++) {
    3172           0 :     i32 = (i << 5);
    3173             :     // First 1-D idct
    3174             :     // Load input data.
    3175           0 :     LOAD_DQCOEFF(in[0], input);
    3176           0 :     LOAD_DQCOEFF(in[8], input);
    3177           0 :     LOAD_DQCOEFF(in[16], input);
    3178           0 :     LOAD_DQCOEFF(in[24], input);
    3179           0 :     LOAD_DQCOEFF(in[1], input);
    3180           0 :     LOAD_DQCOEFF(in[9], input);
    3181           0 :     LOAD_DQCOEFF(in[17], input);
    3182           0 :     LOAD_DQCOEFF(in[25], input);
    3183           0 :     LOAD_DQCOEFF(in[2], input);
    3184           0 :     LOAD_DQCOEFF(in[10], input);
    3185           0 :     LOAD_DQCOEFF(in[18], input);
    3186           0 :     LOAD_DQCOEFF(in[26], input);
    3187           0 :     LOAD_DQCOEFF(in[3], input);
    3188           0 :     LOAD_DQCOEFF(in[11], input);
    3189           0 :     LOAD_DQCOEFF(in[19], input);
    3190           0 :     LOAD_DQCOEFF(in[27], input);
    3191             : 
    3192           0 :     LOAD_DQCOEFF(in[4], input);
    3193           0 :     LOAD_DQCOEFF(in[12], input);
    3194           0 :     LOAD_DQCOEFF(in[20], input);
    3195           0 :     LOAD_DQCOEFF(in[28], input);
    3196           0 :     LOAD_DQCOEFF(in[5], input);
    3197           0 :     LOAD_DQCOEFF(in[13], input);
    3198           0 :     LOAD_DQCOEFF(in[21], input);
    3199           0 :     LOAD_DQCOEFF(in[29], input);
    3200           0 :     LOAD_DQCOEFF(in[6], input);
    3201           0 :     LOAD_DQCOEFF(in[14], input);
    3202           0 :     LOAD_DQCOEFF(in[22], input);
    3203           0 :     LOAD_DQCOEFF(in[30], input);
    3204           0 :     LOAD_DQCOEFF(in[7], input);
    3205           0 :     LOAD_DQCOEFF(in[15], input);
    3206           0 :     LOAD_DQCOEFF(in[23], input);
    3207           0 :     LOAD_DQCOEFF(in[31], input);
    3208             : 
    3209             :     // checking if all entries are zero
    3210           0 :     zero_idx[0] = _mm_or_si128(in[0], in[1]);
    3211           0 :     zero_idx[1] = _mm_or_si128(in[2], in[3]);
    3212           0 :     zero_idx[2] = _mm_or_si128(in[4], in[5]);
    3213           0 :     zero_idx[3] = _mm_or_si128(in[6], in[7]);
    3214           0 :     zero_idx[4] = _mm_or_si128(in[8], in[9]);
    3215           0 :     zero_idx[5] = _mm_or_si128(in[10], in[11]);
    3216           0 :     zero_idx[6] = _mm_or_si128(in[12], in[13]);
    3217           0 :     zero_idx[7] = _mm_or_si128(in[14], in[15]);
    3218           0 :     zero_idx[8] = _mm_or_si128(in[16], in[17]);
    3219           0 :     zero_idx[9] = _mm_or_si128(in[18], in[19]);
    3220           0 :     zero_idx[10] = _mm_or_si128(in[20], in[21]);
    3221           0 :     zero_idx[11] = _mm_or_si128(in[22], in[23]);
    3222           0 :     zero_idx[12] = _mm_or_si128(in[24], in[25]);
    3223           0 :     zero_idx[13] = _mm_or_si128(in[26], in[27]);
    3224           0 :     zero_idx[14] = _mm_or_si128(in[28], in[29]);
    3225           0 :     zero_idx[15] = _mm_or_si128(in[30], in[31]);
    3226             : 
    3227           0 :     zero_idx[0] = _mm_or_si128(zero_idx[0], zero_idx[1]);
    3228           0 :     zero_idx[1] = _mm_or_si128(zero_idx[2], zero_idx[3]);
    3229           0 :     zero_idx[2] = _mm_or_si128(zero_idx[4], zero_idx[5]);
    3230           0 :     zero_idx[3] = _mm_or_si128(zero_idx[6], zero_idx[7]);
    3231           0 :     zero_idx[4] = _mm_or_si128(zero_idx[8], zero_idx[9]);
    3232           0 :     zero_idx[5] = _mm_or_si128(zero_idx[10], zero_idx[11]);
    3233           0 :     zero_idx[6] = _mm_or_si128(zero_idx[12], zero_idx[13]);
    3234           0 :     zero_idx[7] = _mm_or_si128(zero_idx[14], zero_idx[15]);
    3235             : 
    3236           0 :     zero_idx[8] = _mm_or_si128(zero_idx[0], zero_idx[1]);
    3237           0 :     zero_idx[9] = _mm_or_si128(zero_idx[2], zero_idx[3]);
    3238           0 :     zero_idx[10] = _mm_or_si128(zero_idx[4], zero_idx[5]);
    3239           0 :     zero_idx[11] = _mm_or_si128(zero_idx[6], zero_idx[7]);
    3240           0 :     zero_idx[12] = _mm_or_si128(zero_idx[8], zero_idx[9]);
    3241           0 :     zero_idx[13] = _mm_or_si128(zero_idx[10], zero_idx[11]);
    3242           0 :     zero_idx[14] = _mm_or_si128(zero_idx[12], zero_idx[13]);
    3243             : 
    3244           0 :     if (_mm_movemask_epi8(_mm_cmpeq_epi32(zero_idx[14], zero)) == 0xFFFF) {
    3245           0 :       col[i32 + 0] = _mm_setzero_si128();
    3246           0 :       col[i32 + 1] = _mm_setzero_si128();
    3247           0 :       col[i32 + 2] = _mm_setzero_si128();
    3248           0 :       col[i32 + 3] = _mm_setzero_si128();
    3249           0 :       col[i32 + 4] = _mm_setzero_si128();
    3250           0 :       col[i32 + 5] = _mm_setzero_si128();
    3251           0 :       col[i32 + 6] = _mm_setzero_si128();
    3252           0 :       col[i32 + 7] = _mm_setzero_si128();
    3253           0 :       col[i32 + 8] = _mm_setzero_si128();
    3254           0 :       col[i32 + 9] = _mm_setzero_si128();
    3255           0 :       col[i32 + 10] = _mm_setzero_si128();
    3256           0 :       col[i32 + 11] = _mm_setzero_si128();
    3257           0 :       col[i32 + 12] = _mm_setzero_si128();
    3258           0 :       col[i32 + 13] = _mm_setzero_si128();
    3259           0 :       col[i32 + 14] = _mm_setzero_si128();
    3260           0 :       col[i32 + 15] = _mm_setzero_si128();
    3261           0 :       col[i32 + 16] = _mm_setzero_si128();
    3262           0 :       col[i32 + 17] = _mm_setzero_si128();
    3263           0 :       col[i32 + 18] = _mm_setzero_si128();
    3264           0 :       col[i32 + 19] = _mm_setzero_si128();
    3265           0 :       col[i32 + 20] = _mm_setzero_si128();
    3266           0 :       col[i32 + 21] = _mm_setzero_si128();
    3267           0 :       col[i32 + 22] = _mm_setzero_si128();
    3268           0 :       col[i32 + 23] = _mm_setzero_si128();
    3269           0 :       col[i32 + 24] = _mm_setzero_si128();
    3270           0 :       col[i32 + 25] = _mm_setzero_si128();
    3271           0 :       col[i32 + 26] = _mm_setzero_si128();
    3272           0 :       col[i32 + 27] = _mm_setzero_si128();
    3273           0 :       col[i32 + 28] = _mm_setzero_si128();
    3274           0 :       col[i32 + 29] = _mm_setzero_si128();
    3275           0 :       col[i32 + 30] = _mm_setzero_si128();
    3276           0 :       col[i32 + 31] = _mm_setzero_si128();
    3277           0 :       continue;
    3278             :     }
    3279             : 
    3280             :     // Transpose 32x8 block to 8x32 block
    3281           0 :     array_transpose_8x8(in, in);
    3282           0 :     array_transpose_8x8(in + 8, in + 8);
    3283           0 :     array_transpose_8x8(in + 16, in + 16);
    3284           0 :     array_transpose_8x8(in + 24, in + 24);
    3285             : 
    3286           0 :     IDCT32(in, in + 16)
    3287             : 
    3288             :     // 1_D: Store 32 intermediate results for each 8x32 block.
    3289           0 :     col[i32 + 0] = _mm_add_epi16(stp1_0, stp1_31);
    3290           0 :     col[i32 + 1] = _mm_add_epi16(stp1_1, stp1_30);
    3291           0 :     col[i32 + 2] = _mm_add_epi16(stp1_2, stp1_29);
    3292           0 :     col[i32 + 3] = _mm_add_epi16(stp1_3, stp1_28);
    3293           0 :     col[i32 + 4] = _mm_add_epi16(stp1_4, stp1_27);
    3294           0 :     col[i32 + 5] = _mm_add_epi16(stp1_5, stp1_26);
    3295           0 :     col[i32 + 6] = _mm_add_epi16(stp1_6, stp1_25);
    3296           0 :     col[i32 + 7] = _mm_add_epi16(stp1_7, stp1_24);
    3297           0 :     col[i32 + 8] = _mm_add_epi16(stp1_8, stp1_23);
    3298           0 :     col[i32 + 9] = _mm_add_epi16(stp1_9, stp1_22);
    3299           0 :     col[i32 + 10] = _mm_add_epi16(stp1_10, stp1_21);
    3300           0 :     col[i32 + 11] = _mm_add_epi16(stp1_11, stp1_20);
    3301           0 :     col[i32 + 12] = _mm_add_epi16(stp1_12, stp1_19);
    3302           0 :     col[i32 + 13] = _mm_add_epi16(stp1_13, stp1_18);
    3303           0 :     col[i32 + 14] = _mm_add_epi16(stp1_14, stp1_17);
    3304           0 :     col[i32 + 15] = _mm_add_epi16(stp1_15, stp1_16);
    3305           0 :     col[i32 + 16] = _mm_sub_epi16(stp1_15, stp1_16);
    3306           0 :     col[i32 + 17] = _mm_sub_epi16(stp1_14, stp1_17);
    3307           0 :     col[i32 + 18] = _mm_sub_epi16(stp1_13, stp1_18);
    3308           0 :     col[i32 + 19] = _mm_sub_epi16(stp1_12, stp1_19);
    3309           0 :     col[i32 + 20] = _mm_sub_epi16(stp1_11, stp1_20);
    3310           0 :     col[i32 + 21] = _mm_sub_epi16(stp1_10, stp1_21);
    3311           0 :     col[i32 + 22] = _mm_sub_epi16(stp1_9, stp1_22);
    3312           0 :     col[i32 + 23] = _mm_sub_epi16(stp1_8, stp1_23);
    3313           0 :     col[i32 + 24] = _mm_sub_epi16(stp1_7, stp1_24);
    3314           0 :     col[i32 + 25] = _mm_sub_epi16(stp1_6, stp1_25);
    3315           0 :     col[i32 + 26] = _mm_sub_epi16(stp1_5, stp1_26);
    3316           0 :     col[i32 + 27] = _mm_sub_epi16(stp1_4, stp1_27);
    3317           0 :     col[i32 + 28] = _mm_sub_epi16(stp1_3, stp1_28);
    3318           0 :     col[i32 + 29] = _mm_sub_epi16(stp1_2, stp1_29);
    3319           0 :     col[i32 + 30] = _mm_sub_epi16(stp1_1, stp1_30);
    3320           0 :     col[i32 + 31] = _mm_sub_epi16(stp1_0, stp1_31);
    3321             :   }
    3322           0 :   for (i = 0; i < 4; i++) {
    3323             :     // Second 1-D idct
    3324           0 :     j = i << 3;
    3325             : 
    3326             :     // Transpose 32x8 block to 8x32 block
    3327           0 :     array_transpose_8x8(col + j, in);
    3328           0 :     array_transpose_8x8(col + j + 32, in + 8);
    3329           0 :     array_transpose_8x8(col + j + 64, in + 16);
    3330           0 :     array_transpose_8x8(col + j + 96, in + 24);
    3331             : 
    3332           0 :     IDCT32(in, in + 16)
    3333             : 
    3334             :     // 2_D: Calculate the results and store them to destination.
    3335           0 :     in[0] = _mm_add_epi16(stp1_0, stp1_31);
    3336           0 :     in[1] = _mm_add_epi16(stp1_1, stp1_30);
    3337           0 :     in[2] = _mm_add_epi16(stp1_2, stp1_29);
    3338           0 :     in[3] = _mm_add_epi16(stp1_3, stp1_28);
    3339           0 :     in[4] = _mm_add_epi16(stp1_4, stp1_27);
    3340           0 :     in[5] = _mm_add_epi16(stp1_5, stp1_26);
    3341           0 :     in[6] = _mm_add_epi16(stp1_6, stp1_25);
    3342           0 :     in[7] = _mm_add_epi16(stp1_7, stp1_24);
    3343           0 :     in[8] = _mm_add_epi16(stp1_8, stp1_23);
    3344           0 :     in[9] = _mm_add_epi16(stp1_9, stp1_22);
    3345           0 :     in[10] = _mm_add_epi16(stp1_10, stp1_21);
    3346           0 :     in[11] = _mm_add_epi16(stp1_11, stp1_20);
    3347           0 :     in[12] = _mm_add_epi16(stp1_12, stp1_19);
    3348           0 :     in[13] = _mm_add_epi16(stp1_13, stp1_18);
    3349           0 :     in[14] = _mm_add_epi16(stp1_14, stp1_17);
    3350           0 :     in[15] = _mm_add_epi16(stp1_15, stp1_16);
    3351           0 :     in[16] = _mm_sub_epi16(stp1_15, stp1_16);
    3352           0 :     in[17] = _mm_sub_epi16(stp1_14, stp1_17);
    3353           0 :     in[18] = _mm_sub_epi16(stp1_13, stp1_18);
    3354           0 :     in[19] = _mm_sub_epi16(stp1_12, stp1_19);
    3355           0 :     in[20] = _mm_sub_epi16(stp1_11, stp1_20);
    3356           0 :     in[21] = _mm_sub_epi16(stp1_10, stp1_21);
    3357           0 :     in[22] = _mm_sub_epi16(stp1_9, stp1_22);
    3358           0 :     in[23] = _mm_sub_epi16(stp1_8, stp1_23);
    3359           0 :     in[24] = _mm_sub_epi16(stp1_7, stp1_24);
    3360           0 :     in[25] = _mm_sub_epi16(stp1_6, stp1_25);
    3361           0 :     in[26] = _mm_sub_epi16(stp1_5, stp1_26);
    3362           0 :     in[27] = _mm_sub_epi16(stp1_4, stp1_27);
    3363           0 :     in[28] = _mm_sub_epi16(stp1_3, stp1_28);
    3364           0 :     in[29] = _mm_sub_epi16(stp1_2, stp1_29);
    3365           0 :     in[30] = _mm_sub_epi16(stp1_1, stp1_30);
    3366           0 :     in[31] = _mm_sub_epi16(stp1_0, stp1_31);
    3367             : 
    3368           0 :     for (j = 0; j < 32; ++j) {
    3369             :       // Final rounding and shift
    3370           0 :       in[j] = _mm_adds_epi16(in[j], final_rounding);
    3371           0 :       in[j] = _mm_srai_epi16(in[j], 6);
    3372           0 :       RECON_AND_STORE(dest + j * stride, in[j]);
    3373             :     }
    3374             : 
    3375           0 :     dest += 8;
    3376             :   }
    3377           0 : }
    3378             : 
    3379           0 : void aom_idct32x32_1_add_sse2(const tran_low_t *input, uint8_t *dest,
    3380             :                               int stride) {
    3381             :   __m128i dc_value;
    3382           0 :   const __m128i zero = _mm_setzero_si128();
    3383             :   int a, j;
    3384             : 
    3385           0 :   a = (int)dct_const_round_shift(input[0] * cospi_16_64);
    3386           0 :   a = (int)dct_const_round_shift(a * cospi_16_64);
    3387           0 :   a = ROUND_POWER_OF_TWO(a, 6);
    3388             : 
    3389           0 :   if (a == 0) return;
    3390             : 
    3391           0 :   dc_value = _mm_set1_epi16(a);
    3392             : 
    3393           0 :   for (j = 0; j < 32; ++j) {
    3394           0 :     RECON_AND_STORE(dest + 0 + j * stride, dc_value);
    3395           0 :     RECON_AND_STORE(dest + 8 + j * stride, dc_value);
    3396           0 :     RECON_AND_STORE(dest + 16 + j * stride, dc_value);
    3397           0 :     RECON_AND_STORE(dest + 24 + j * stride, dc_value);
    3398             :   }
    3399             : }
    3400             : 
    3401             : // Apply a 32-element IDCT to 8 columns. This does not do any transposition
    3402             : // of its input - the caller is expected to have done that.
    3403             : // The input buffers are the top and bottom halves of an 8x32 block.
    3404           0 : void idct32_8col(__m128i *in0, __m128i *in1) {
    3405           0 :   const __m128i rounding = _mm_set1_epi32(DCT_CONST_ROUNDING);
    3406             : 
    3407             :   // idct constants for each stage
    3408           0 :   const __m128i stg1_0 = pair_set_epi16(cospi_31_64, -cospi_1_64);
    3409           0 :   const __m128i stg1_1 = pair_set_epi16(cospi_1_64, cospi_31_64);
    3410           0 :   const __m128i stg1_2 = pair_set_epi16(cospi_15_64, -cospi_17_64);
    3411           0 :   const __m128i stg1_3 = pair_set_epi16(cospi_17_64, cospi_15_64);
    3412           0 :   const __m128i stg1_4 = pair_set_epi16(cospi_23_64, -cospi_9_64);
    3413           0 :   const __m128i stg1_5 = pair_set_epi16(cospi_9_64, cospi_23_64);
    3414           0 :   const __m128i stg1_6 = pair_set_epi16(cospi_7_64, -cospi_25_64);
    3415           0 :   const __m128i stg1_7 = pair_set_epi16(cospi_25_64, cospi_7_64);
    3416           0 :   const __m128i stg1_8 = pair_set_epi16(cospi_27_64, -cospi_5_64);
    3417           0 :   const __m128i stg1_9 = pair_set_epi16(cospi_5_64, cospi_27_64);
    3418           0 :   const __m128i stg1_10 = pair_set_epi16(cospi_11_64, -cospi_21_64);
    3419           0 :   const __m128i stg1_11 = pair_set_epi16(cospi_21_64, cospi_11_64);
    3420           0 :   const __m128i stg1_12 = pair_set_epi16(cospi_19_64, -cospi_13_64);
    3421           0 :   const __m128i stg1_13 = pair_set_epi16(cospi_13_64, cospi_19_64);
    3422           0 :   const __m128i stg1_14 = pair_set_epi16(cospi_3_64, -cospi_29_64);
    3423           0 :   const __m128i stg1_15 = pair_set_epi16(cospi_29_64, cospi_3_64);
    3424             : 
    3425           0 :   const __m128i stg2_0 = pair_set_epi16(cospi_30_64, -cospi_2_64);
    3426           0 :   const __m128i stg2_1 = pair_set_epi16(cospi_2_64, cospi_30_64);
    3427           0 :   const __m128i stg2_2 = pair_set_epi16(cospi_14_64, -cospi_18_64);
    3428           0 :   const __m128i stg2_3 = pair_set_epi16(cospi_18_64, cospi_14_64);
    3429           0 :   const __m128i stg2_4 = pair_set_epi16(cospi_22_64, -cospi_10_64);
    3430           0 :   const __m128i stg2_5 = pair_set_epi16(cospi_10_64, cospi_22_64);
    3431           0 :   const __m128i stg2_6 = pair_set_epi16(cospi_6_64, -cospi_26_64);
    3432           0 :   const __m128i stg2_7 = pair_set_epi16(cospi_26_64, cospi_6_64);
    3433             : 
    3434           0 :   const __m128i stg3_0 = pair_set_epi16(cospi_28_64, -cospi_4_64);
    3435           0 :   const __m128i stg3_1 = pair_set_epi16(cospi_4_64, cospi_28_64);
    3436           0 :   const __m128i stg3_2 = pair_set_epi16(cospi_12_64, -cospi_20_64);
    3437           0 :   const __m128i stg3_3 = pair_set_epi16(cospi_20_64, cospi_12_64);
    3438           0 :   const __m128i stg3_4 = pair_set_epi16(-cospi_4_64, cospi_28_64);
    3439           0 :   const __m128i stg3_5 = pair_set_epi16(cospi_28_64, cospi_4_64);
    3440           0 :   const __m128i stg3_6 = pair_set_epi16(-cospi_28_64, -cospi_4_64);
    3441           0 :   const __m128i stg3_8 = pair_set_epi16(-cospi_20_64, cospi_12_64);
    3442           0 :   const __m128i stg3_9 = pair_set_epi16(cospi_12_64, cospi_20_64);
    3443           0 :   const __m128i stg3_10 = pair_set_epi16(-cospi_12_64, -cospi_20_64);
    3444             : 
    3445           0 :   const __m128i stg4_0 = pair_set_epi16(cospi_16_64, cospi_16_64);
    3446           0 :   const __m128i stg4_1 = pair_set_epi16(cospi_16_64, -cospi_16_64);
    3447           0 :   const __m128i stg4_2 = pair_set_epi16(cospi_24_64, -cospi_8_64);
    3448           0 :   const __m128i stg4_3 = pair_set_epi16(cospi_8_64, cospi_24_64);
    3449           0 :   const __m128i stg4_4 = pair_set_epi16(-cospi_8_64, cospi_24_64);
    3450           0 :   const __m128i stg4_5 = pair_set_epi16(cospi_24_64, cospi_8_64);
    3451           0 :   const __m128i stg4_6 = pair_set_epi16(-cospi_24_64, -cospi_8_64);
    3452             : 
    3453           0 :   const __m128i stg6_0 = pair_set_epi16(-cospi_16_64, cospi_16_64);
    3454             : 
    3455             :   __m128i stp1_0, stp1_1, stp1_2, stp1_3, stp1_4, stp1_5, stp1_6, stp1_7,
    3456             :       stp1_8, stp1_9, stp1_10, stp1_11, stp1_12, stp1_13, stp1_14, stp1_15,
    3457             :       stp1_16, stp1_17, stp1_18, stp1_19, stp1_20, stp1_21, stp1_22, stp1_23,
    3458             :       stp1_24, stp1_25, stp1_26, stp1_27, stp1_28, stp1_29, stp1_30, stp1_31;
    3459             :   __m128i stp2_0, stp2_1, stp2_2, stp2_3, stp2_4, stp2_5, stp2_6, stp2_7,
    3460             :       stp2_8, stp2_9, stp2_10, stp2_11, stp2_12, stp2_13, stp2_14, stp2_15,
    3461             :       stp2_16, stp2_17, stp2_18, stp2_19, stp2_20, stp2_21, stp2_22, stp2_23,
    3462             :       stp2_24, stp2_25, stp2_26, stp2_27, stp2_28, stp2_29, stp2_30, stp2_31;
    3463             :   __m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
    3464             : 
    3465           0 :   IDCT32(in0, in1)
    3466             : 
    3467             :   // 2_D: Calculate the results and store them to destination.
    3468           0 :   in0[0] = _mm_add_epi16(stp1_0, stp1_31);
    3469           0 :   in0[1] = _mm_add_epi16(stp1_1, stp1_30);
    3470           0 :   in0[2] = _mm_add_epi16(stp1_2, stp1_29);
    3471           0 :   in0[3] = _mm_add_epi16(stp1_3, stp1_28);
    3472           0 :   in0[4] = _mm_add_epi16(stp1_4, stp1_27);
    3473           0 :   in0[5] = _mm_add_epi16(stp1_5, stp1_26);
    3474           0 :   in0[6] = _mm_add_epi16(stp1_6, stp1_25);
    3475           0 :   in0[7] = _mm_add_epi16(stp1_7, stp1_24);
    3476           0 :   in0[8] = _mm_add_epi16(stp1_8, stp1_23);
    3477           0 :   in0[9] = _mm_add_epi16(stp1_9, stp1_22);
    3478           0 :   in0[10] = _mm_add_epi16(stp1_10, stp1_21);
    3479           0 :   in0[11] = _mm_add_epi16(stp1_11, stp1_20);
    3480           0 :   in0[12] = _mm_add_epi16(stp1_12, stp1_19);
    3481           0 :   in0[13] = _mm_add_epi16(stp1_13, stp1_18);
    3482           0 :   in0[14] = _mm_add_epi16(stp1_14, stp1_17);
    3483           0 :   in0[15] = _mm_add_epi16(stp1_15, stp1_16);
    3484           0 :   in1[0] = _mm_sub_epi16(stp1_15, stp1_16);
    3485           0 :   in1[1] = _mm_sub_epi16(stp1_14, stp1_17);
    3486           0 :   in1[2] = _mm_sub_epi16(stp1_13, stp1_18);
    3487           0 :   in1[3] = _mm_sub_epi16(stp1_12, stp1_19);
    3488           0 :   in1[4] = _mm_sub_epi16(stp1_11, stp1_20);
    3489           0 :   in1[5] = _mm_sub_epi16(stp1_10, stp1_21);
    3490           0 :   in1[6] = _mm_sub_epi16(stp1_9, stp1_22);
    3491           0 :   in1[7] = _mm_sub_epi16(stp1_8, stp1_23);
    3492           0 :   in1[8] = _mm_sub_epi16(stp1_7, stp1_24);
    3493           0 :   in1[9] = _mm_sub_epi16(stp1_6, stp1_25);
    3494           0 :   in1[10] = _mm_sub_epi16(stp1_5, stp1_26);
    3495           0 :   in1[11] = _mm_sub_epi16(stp1_4, stp1_27);
    3496           0 :   in1[12] = _mm_sub_epi16(stp1_3, stp1_28);
    3497           0 :   in1[13] = _mm_sub_epi16(stp1_2, stp1_29);
    3498           0 :   in1[14] = _mm_sub_epi16(stp1_1, stp1_30);
    3499           0 :   in1[15] = _mm_sub_epi16(stp1_0, stp1_31);
    3500           0 : }
    3501             : 
    3502             : #if CONFIG_HIGHBITDEPTH
    3503           0 : static INLINE __m128i clamp_high_sse2(__m128i value, int bd) {
    3504             :   __m128i ubounded, retval;
    3505           0 :   const __m128i zero = _mm_set1_epi16(0);
    3506           0 :   const __m128i one = _mm_set1_epi16(1);
    3507           0 :   const __m128i max = _mm_subs_epi16(_mm_slli_epi16(one, bd), one);
    3508           0 :   ubounded = _mm_cmpgt_epi16(value, max);
    3509           0 :   retval = _mm_andnot_si128(ubounded, value);
    3510           0 :   ubounded = _mm_and_si128(ubounded, max);
    3511           0 :   retval = _mm_or_si128(retval, ubounded);
    3512           0 :   retval = _mm_and_si128(retval, _mm_cmpgt_epi16(retval, zero));
    3513           0 :   return retval;
    3514             : }
    3515             : 
    3516           0 : void aom_highbd_idct4x4_16_add_sse2(const tran_low_t *input, uint8_t *dest8,
    3517             :                                     int stride, int bd) {
    3518             :   tran_low_t out[4 * 4];
    3519           0 :   tran_low_t *outptr = out;
    3520             :   int i, j;
    3521             :   __m128i inptr[4];
    3522             :   __m128i sign_bits[2];
    3523             :   __m128i temp_mm, min_input, max_input;
    3524             :   int test;
    3525           0 :   uint16_t *dest = CONVERT_TO_SHORTPTR(dest8);
    3526           0 :   int optimised_cols = 0;
    3527           0 :   const __m128i zero = _mm_set1_epi16(0);
    3528           0 :   const __m128i eight = _mm_set1_epi16(8);
    3529           0 :   const __m128i max = _mm_set1_epi16(12043);
    3530           0 :   const __m128i min = _mm_set1_epi16(-12043);
    3531             :   // Load input into __m128i
    3532           0 :   inptr[0] = _mm_loadu_si128((const __m128i *)input);
    3533           0 :   inptr[1] = _mm_loadu_si128((const __m128i *)(input + 4));
    3534           0 :   inptr[2] = _mm_loadu_si128((const __m128i *)(input + 8));
    3535           0 :   inptr[3] = _mm_loadu_si128((const __m128i *)(input + 12));
    3536             : 
    3537             :   // Pack to 16 bits
    3538           0 :   inptr[0] = _mm_packs_epi32(inptr[0], inptr[1]);
    3539           0 :   inptr[1] = _mm_packs_epi32(inptr[2], inptr[3]);
    3540             : 
    3541           0 :   max_input = _mm_max_epi16(inptr[0], inptr[1]);
    3542           0 :   min_input = _mm_min_epi16(inptr[0], inptr[1]);
    3543           0 :   max_input = _mm_cmpgt_epi16(max_input, max);
    3544           0 :   min_input = _mm_cmplt_epi16(min_input, min);
    3545           0 :   temp_mm = _mm_or_si128(max_input, min_input);
    3546           0 :   test = _mm_movemask_epi8(temp_mm);
    3547             : 
    3548           0 :   if (!test) {
    3549             :     // Do the row transform
    3550           0 :     aom_idct4_sse2(inptr);
    3551             : 
    3552             :     // Check the min & max values
    3553           0 :     max_input = _mm_max_epi16(inptr[0], inptr[1]);
    3554           0 :     min_input = _mm_min_epi16(inptr[0], inptr[1]);
    3555           0 :     max_input = _mm_cmpgt_epi16(max_input, max);
    3556           0 :     min_input = _mm_cmplt_epi16(min_input, min);
    3557           0 :     temp_mm = _mm_or_si128(max_input, min_input);
    3558           0 :     test = _mm_movemask_epi8(temp_mm);
    3559             : 
    3560           0 :     if (test) {
    3561           0 :       array_transpose_4x4(inptr);
    3562           0 :       sign_bits[0] = _mm_cmplt_epi16(inptr[0], zero);
    3563           0 :       sign_bits[1] = _mm_cmplt_epi16(inptr[1], zero);
    3564           0 :       inptr[3] = _mm_unpackhi_epi16(inptr[1], sign_bits[1]);
    3565           0 :       inptr[2] = _mm_unpacklo_epi16(inptr[1], sign_bits[1]);
    3566           0 :       inptr[1] = _mm_unpackhi_epi16(inptr[0], sign_bits[0]);
    3567           0 :       inptr[0] = _mm_unpacklo_epi16(inptr[0], sign_bits[0]);
    3568           0 :       _mm_storeu_si128((__m128i *)outptr, inptr[0]);
    3569           0 :       _mm_storeu_si128((__m128i *)(outptr + 4), inptr[1]);
    3570           0 :       _mm_storeu_si128((__m128i *)(outptr + 8), inptr[2]);
    3571           0 :       _mm_storeu_si128((__m128i *)(outptr + 12), inptr[3]);
    3572             :     } else {
    3573             :       // Set to use the optimised transform for the column
    3574           0 :       optimised_cols = 1;
    3575             :     }
    3576             :   } else {
    3577             :     // Run the un-optimised row transform
    3578           0 :     for (i = 0; i < 4; ++i) {
    3579           0 :       aom_highbd_idct4_c(input, outptr, bd);
    3580           0 :       input += 4;
    3581           0 :       outptr += 4;
    3582             :     }
    3583             :   }
    3584             : 
    3585           0 :   if (optimised_cols) {
    3586           0 :     aom_idct4_sse2(inptr);
    3587             : 
    3588             :     // Final round and shift
    3589           0 :     inptr[0] = _mm_add_epi16(inptr[0], eight);
    3590           0 :     inptr[1] = _mm_add_epi16(inptr[1], eight);
    3591             : 
    3592           0 :     inptr[0] = _mm_srai_epi16(inptr[0], 4);
    3593           0 :     inptr[1] = _mm_srai_epi16(inptr[1], 4);
    3594             : 
    3595             :     // Reconstruction and Store
    3596             :     {
    3597           0 :       __m128i d0 = _mm_loadl_epi64((const __m128i *)dest);
    3598           0 :       __m128i d2 = _mm_loadl_epi64((const __m128i *)(dest + stride * 2));
    3599           0 :       d0 = _mm_unpacklo_epi64(
    3600           0 :           d0, _mm_loadl_epi64((const __m128i *)(dest + stride)));
    3601           0 :       d2 = _mm_unpacklo_epi64(
    3602           0 :           d2, _mm_loadl_epi64((const __m128i *)(dest + stride * 3)));
    3603           0 :       d0 = clamp_high_sse2(_mm_adds_epi16(d0, inptr[0]), bd);
    3604           0 :       d2 = clamp_high_sse2(_mm_adds_epi16(d2, inptr[1]), bd);
    3605             :       // store input0
    3606             :       _mm_storel_epi64((__m128i *)dest, d0);
    3607             :       // store input1
    3608           0 :       d0 = _mm_srli_si128(d0, 8);
    3609           0 :       _mm_storel_epi64((__m128i *)(dest + stride), d0);
    3610             :       // store input2
    3611           0 :       _mm_storel_epi64((__m128i *)(dest + stride * 2), d2);
    3612             :       // store input3
    3613           0 :       d2 = _mm_srli_si128(d2, 8);
    3614           0 :       _mm_storel_epi64((__m128i *)(dest + stride * 3), d2);
    3615             :     }
    3616             :   } else {
    3617             :     // Run the un-optimised column transform
    3618             :     tran_low_t temp_in[4], temp_out[4];
    3619             :     // Columns
    3620           0 :     for (i = 0; i < 4; ++i) {
    3621           0 :       for (j = 0; j < 4; ++j) temp_in[j] = out[j * 4 + i];
    3622           0 :       aom_highbd_idct4_c(temp_in, temp_out, bd);
    3623           0 :       for (j = 0; j < 4; ++j) {
    3624           0 :         dest[j * stride + i] = highbd_clip_pixel_add(
    3625           0 :             dest[j * stride + i], ROUND_POWER_OF_TWO(temp_out[j], 4), bd);
    3626             :       }
    3627             :     }
    3628             :   }
    3629           0 : }
    3630             : 
    3631           0 : void aom_highbd_idct8x8_10_add_sse2(const tran_low_t *input, uint8_t *dest8,
    3632             :                                     int stride, int bd) {
    3633           0 :   tran_low_t out[8 * 8] = { 0 };
    3634           0 :   tran_low_t *outptr = out;
    3635             :   int i, j, test;
    3636             :   __m128i inptr[8];
    3637             :   __m128i min_input, max_input, temp1, temp2, sign_bits;
    3638           0 :   uint16_t *dest = CONVERT_TO_SHORTPTR(dest8);
    3639           0 :   const __m128i zero = _mm_set1_epi16(0);
    3640           0 :   const __m128i sixteen = _mm_set1_epi16(16);
    3641           0 :   const __m128i max = _mm_set1_epi16(6201);
    3642           0 :   const __m128i min = _mm_set1_epi16(-6201);
    3643           0 :   int optimised_cols = 0;
    3644             : 
    3645             :   // Load input into __m128i & pack to 16 bits
    3646           0 :   for (i = 0; i < 8; i++) {
    3647           0 :     temp1 = _mm_loadu_si128((const __m128i *)(input + 8 * i));
    3648           0 :     temp2 = _mm_loadu_si128((const __m128i *)(input + 8 * i + 4));
    3649           0 :     inptr[i] = _mm_packs_epi32(temp1, temp2);
    3650             :   }
    3651             : 
    3652             :   // Find the min & max for the row transform
    3653             :   // only first 4 row has non-zero coefs
    3654           0 :   max_input = _mm_max_epi16(inptr[0], inptr[1]);
    3655           0 :   min_input = _mm_min_epi16(inptr[0], inptr[1]);
    3656           0 :   for (i = 2; i < 4; i++) {
    3657           0 :     max_input = _mm_max_epi16(max_input, inptr[i]);
    3658           0 :     min_input = _mm_min_epi16(min_input, inptr[i]);
    3659             :   }
    3660           0 :   max_input = _mm_cmpgt_epi16(max_input, max);
    3661           0 :   min_input = _mm_cmplt_epi16(min_input, min);
    3662           0 :   temp1 = _mm_or_si128(max_input, min_input);
    3663           0 :   test = _mm_movemask_epi8(temp1);
    3664             : 
    3665           0 :   if (!test) {
    3666             :     // Do the row transform
    3667           0 :     aom_idct8_sse2(inptr);
    3668             : 
    3669             :     // Find the min & max for the column transform
    3670             :     // N.B. Only first 4 cols contain non-zero coeffs
    3671           0 :     max_input = _mm_max_epi16(inptr[0], inptr[1]);
    3672           0 :     min_input = _mm_min_epi16(inptr[0], inptr[1]);
    3673           0 :     for (i = 2; i < 8; i++) {
    3674           0 :       max_input = _mm_max_epi16(max_input, inptr[i]);
    3675           0 :       min_input = _mm_min_epi16(min_input, inptr[i]);
    3676             :     }
    3677           0 :     max_input = _mm_cmpgt_epi16(max_input, max);
    3678           0 :     min_input = _mm_cmplt_epi16(min_input, min);
    3679           0 :     temp1 = _mm_or_si128(max_input, min_input);
    3680           0 :     test = _mm_movemask_epi8(temp1);
    3681             : 
    3682           0 :     if (test) {
    3683             :       // Use fact only first 4 rows contain non-zero coeffs
    3684           0 :       array_transpose_4X8(inptr, inptr);
    3685           0 :       for (i = 0; i < 4; i++) {
    3686           0 :         sign_bits = _mm_cmplt_epi16(inptr[i], zero);
    3687           0 :         temp1 = _mm_unpackhi_epi16(inptr[i], sign_bits);
    3688           0 :         temp2 = _mm_unpacklo_epi16(inptr[i], sign_bits);
    3689           0 :         _mm_storeu_si128((__m128i *)(outptr + 4 * (2 * i + 1)), temp1);
    3690           0 :         _mm_storeu_si128((__m128i *)(outptr + 4 * (2 * i)), temp2);
    3691             :       }
    3692             :     } else {
    3693             :       // Set to use the optimised transform for the column
    3694           0 :       optimised_cols = 1;
    3695             :     }
    3696             :   } else {
    3697             :     // Run the un-optimised row transform
    3698           0 :     for (i = 0; i < 4; ++i) {
    3699           0 :       aom_highbd_idct8_c(input, outptr, bd);
    3700           0 :       input += 8;
    3701           0 :       outptr += 8;
    3702             :     }
    3703             :   }
    3704             : 
    3705           0 :   if (optimised_cols) {
    3706           0 :     aom_idct8_sse2(inptr);
    3707             : 
    3708             :     // Final round & shift and Reconstruction and Store
    3709             :     {
    3710             :       __m128i d[8];
    3711           0 :       for (i = 0; i < 8; i++) {
    3712           0 :         inptr[i] = _mm_add_epi16(inptr[i], sixteen);
    3713           0 :         d[i] = _mm_loadu_si128((const __m128i *)(dest + stride * i));
    3714           0 :         inptr[i] = _mm_srai_epi16(inptr[i], 5);
    3715           0 :         d[i] = clamp_high_sse2(_mm_adds_epi16(d[i], inptr[i]), bd);
    3716             :         // Store
    3717           0 :         _mm_storeu_si128((__m128i *)(dest + stride * i), d[i]);
    3718             :       }
    3719             :     }
    3720             :   } else {
    3721             :     // Run the un-optimised column transform
    3722             :     tran_low_t temp_in[8], temp_out[8];
    3723           0 :     for (i = 0; i < 8; ++i) {
    3724           0 :       for (j = 0; j < 8; ++j) temp_in[j] = out[j * 8 + i];
    3725           0 :       aom_highbd_idct8_c(temp_in, temp_out, bd);
    3726           0 :       for (j = 0; j < 8; ++j) {
    3727           0 :         dest[j * stride + i] = highbd_clip_pixel_add(
    3728           0 :             dest[j * stride + i], ROUND_POWER_OF_TWO(temp_out[j], 5), bd);
    3729             :       }
    3730             :     }
    3731             :   }
    3732           0 : }
    3733             : 
    3734             : #endif  // CONFIG_HIGHBITDEPTH

Generated by: LCOV version 1.13