• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2017 The WebM project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef VPX_VPX_DSP_X86_QUANTIZE_SSSE3_H_
12 #define VPX_VPX_DSP_X86_QUANTIZE_SSSE3_H_
13 
14 #include <emmintrin.h>
15 
16 #include "./vpx_config.h"
17 #include "vpx/vpx_integer.h"
18 #include "vpx_dsp/x86/quantize_sse2.h"
19 
calculate_dqcoeff_and_store_32x32(const __m128i qcoeff,const __m128i dequant,const __m128i zero,tran_low_t * dqcoeff)20 static INLINE void calculate_dqcoeff_and_store_32x32(const __m128i qcoeff,
21                                                      const __m128i dequant,
22                                                      const __m128i zero,
23                                                      tran_low_t *dqcoeff) {
24   // Un-sign to bias rounding like C.
25   const __m128i coeff = _mm_abs_epi16(qcoeff);
26 
27   const __m128i sign_0 = _mm_unpacklo_epi16(zero, qcoeff);
28   const __m128i sign_1 = _mm_unpackhi_epi16(zero, qcoeff);
29 
30   const __m128i low = _mm_mullo_epi16(coeff, dequant);
31   const __m128i high = _mm_mulhi_epi16(coeff, dequant);
32   __m128i dqcoeff32_0 = _mm_unpacklo_epi16(low, high);
33   __m128i dqcoeff32_1 = _mm_unpackhi_epi16(low, high);
34 
35   // "Divide" by 2.
36   dqcoeff32_0 = _mm_srli_epi32(dqcoeff32_0, 1);
37   dqcoeff32_1 = _mm_srli_epi32(dqcoeff32_1, 1);
38 
39   dqcoeff32_0 = _mm_sign_epi32(dqcoeff32_0, sign_0);
40   dqcoeff32_1 = _mm_sign_epi32(dqcoeff32_1, sign_1);
41 
42 #if CONFIG_VP9_HIGHBITDEPTH
43   _mm_store_si128((__m128i *)(dqcoeff), dqcoeff32_0);
44   _mm_store_si128((__m128i *)(dqcoeff + 4), dqcoeff32_1);
45 #else
46   _mm_store_si128((__m128i *)(dqcoeff),
47                   _mm_packs_epi32(dqcoeff32_0, dqcoeff32_1));
48 #endif  // CONFIG_VP9_HIGHBITDEPTH
49 }
50 
51 #endif  // VPX_VPX_DSP_X86_QUANTIZE_SSSE3_H_
52