summaryrefslogtreecommitdiff
path: root/vp9/encoder
diff options
context:
space:
mode:
authorJingning Han <jingning@google.com>2013-06-21 15:56:24 -0700
committerJingning Han <jingning@google.com>2013-06-25 12:02:26 -0700
commit0084e61d5f935e763c29a49094377d4ab64577e5 (patch)
tree44065ee93c4abb121fecccecb0dad8b7b0530238 /vp9/encoder
parentcd6932db770b7fe53f668bed8794e5d548745e38 (diff)
downloadlibvpx-0084e61d5f935e763c29a49094377d4ab64577e5.tar
libvpx-0084e61d5f935e763c29a49094377d4ab64577e5.tar.gz
libvpx-0084e61d5f935e763c29a49094377d4ab64577e5.tar.bz2
libvpx-0084e61d5f935e763c29a49094377d4ab64577e5.zip
Tune the rounding operations in 8x8 ADST/DCT sse2
Improve the round-trip precision to meet the unit test setttings. Change-Id: I303febae56b4b990ea3798b8ebed94c0510ecf79
Diffstat (limited to 'vp9/encoder')
-rw-r--r--vp9/encoder/x86/vp9_dct_sse2.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/vp9/encoder/x86/vp9_dct_sse2.c b/vp9/encoder/x86/vp9_dct_sse2.c
index f11200f62..484afce73 100644
--- a/vp9/encoder/x86/vp9_dct_sse2.c
+++ b/vp9/encoder/x86/vp9_dct_sse2.c
@@ -397,6 +397,24 @@ static INLINE void load_buffer_8x8(int16_t *input, __m128i in[8], int stride) {
// write 8x8 array
static INLINE void write_buffer_8x8(int16_t *output, __m128i res[8]) {
+ __m128i sign0 = _mm_srai_epi16(res[0], 15);
+ __m128i sign1 = _mm_srai_epi16(res[1], 15);
+ __m128i sign2 = _mm_srai_epi16(res[2], 15);
+ __m128i sign3 = _mm_srai_epi16(res[3], 15);
+ __m128i sign4 = _mm_srai_epi16(res[4], 15);
+ __m128i sign5 = _mm_srai_epi16(res[5], 15);
+ __m128i sign6 = _mm_srai_epi16(res[6], 15);
+ __m128i sign7 = _mm_srai_epi16(res[7], 15);
+
+ res[0] = _mm_sub_epi16(res[0], sign0);
+ res[1] = _mm_sub_epi16(res[1], sign1);
+ res[2] = _mm_sub_epi16(res[2], sign2);
+ res[3] = _mm_sub_epi16(res[3], sign3);
+ res[4] = _mm_sub_epi16(res[4], sign4);
+ res[5] = _mm_sub_epi16(res[5], sign5);
+ res[6] = _mm_sub_epi16(res[6], sign6);
+ res[7] = _mm_sub_epi16(res[7], sign7);
+
res[0] = _mm_srai_epi16(res[0], 1);
res[1] = _mm_srai_epi16(res[1], 1);
res[2] = _mm_srai_epi16(res[2], 1);