summaryrefslogtreecommitdiff
path: root/vp9/common/x86
diff options
context:
space:
mode:
authorJingning Han <jingning@google.com>2015-02-27 09:49:00 -0800
committerGerrit Code Review <gerrit@gerrit.golo.chromium.org>2015-02-27 09:49:00 -0800
commit43bb97f7d0b72eff2a00d34ecde98b9492638701 (patch)
tree6b1c541dfe99f767ce4ca8bc7d2aa23bbdca41ef /vp9/common/x86
parent4800b0e80d36680fd035720bdaf29121be4a695c (diff)
parent8ec22296b34283ba01f27fad7c1ad4b474389cce (diff)
downloadlibvpx-43bb97f7d0b72eff2a00d34ecde98b9492638701.tar
libvpx-43bb97f7d0b72eff2a00d34ecde98b9492638701.tar.gz
libvpx-43bb97f7d0b72eff2a00d34ecde98b9492638701.tar.bz2
libvpx-43bb97f7d0b72eff2a00d34ecde98b9492638701.zip
Merge "Fix high bit-depth loop-filter sse2 compiling issue - part 3"
Diffstat (limited to 'vp9/common/x86')
-rw-r--r--vp9/common/x86/vp9_high_loopfilter_intrin_sse2.c54
1 files changed, 39 insertions, 15 deletions
diff --git a/vp9/common/x86/vp9_high_loopfilter_intrin_sse2.c b/vp9/common/x86/vp9_high_loopfilter_intrin_sse2.c
index 26e85a3d6..04823ba9c 100644
--- a/vp9/common/x86/vp9_high_loopfilter_intrin_sse2.c
+++ b/vp9/common/x86/vp9_high_loopfilter_intrin_sse2.c
@@ -531,15 +531,7 @@ void vp9_highbd_lpf_horizontal_8_sse2(uint16_t *s, int p,
DECLARE_ALIGNED_ARRAY(16, uint16_t, flat_oq1, 16);
DECLARE_ALIGNED_ARRAY(16, uint16_t, flat_oq0, 16);
const __m128i zero = _mm_set1_epi16(0);
- const __m128i blimit = _mm_slli_epi16(
- _mm_unpacklo_epi8(_mm_load_si128((const __m128i *)_blimit), zero),
- bd - 8);
- const __m128i limit = _mm_slli_epi16(
- _mm_unpacklo_epi8(_mm_load_si128((const __m128i *)_limit), zero),
- bd - 8);
- const __m128i thresh = _mm_slli_epi16(
- _mm_unpacklo_epi8(_mm_load_si128((const __m128i *)_thresh), zero),
- bd - 8);
+ __m128i blimit, limit, thresh;
__m128i mask, hev, flat;
__m128i p3 = _mm_load_si128((__m128i *)(s - 4 * p));
__m128i q3 = _mm_load_si128((__m128i *)(s + 3 * p));
@@ -557,18 +549,43 @@ void vp9_highbd_lpf_horizontal_8_sse2(uint16_t *s, int p,
const __m128i t4 = _mm_set1_epi16(4);
const __m128i t3 = _mm_set1_epi16(3);
- const __m128i t80 = _mm_slli_epi16(_mm_set1_epi16(0x80), bd - 8);
+ __m128i t80;
const __m128i t1 = _mm_set1_epi16(0x1);
- const __m128i ps1 = _mm_subs_epi16(p1, t80);
- const __m128i ps0 = _mm_subs_epi16(p0, t80);
- const __m128i qs0 = _mm_subs_epi16(q0, t80);
- const __m128i qs1 = _mm_subs_epi16(q1, t80);
+ __m128i ps1, ps0, qs0, qs1;
__m128i filt;
__m128i work_a;
__m128i filter1, filter2;
(void)count;
+ if (bd == 8) {
+ blimit = _mm_unpacklo_epi8(_mm_load_si128((const __m128i *)_blimit), zero);
+ limit = _mm_unpacklo_epi8(_mm_load_si128((const __m128i *)_limit), zero);
+ thresh = _mm_unpacklo_epi8(_mm_load_si128((const __m128i *)_thresh), zero);
+ t80 = _mm_set1_epi16(0x80);
+ } else if (bd == 10) {
+ blimit = _mm_slli_epi16(
+ _mm_unpacklo_epi8(_mm_load_si128((const __m128i *)_blimit), zero), 2);
+ limit = _mm_slli_epi16(
+ _mm_unpacklo_epi8(_mm_load_si128((const __m128i *)_limit), zero), 2);
+ thresh = _mm_slli_epi16(
+ _mm_unpacklo_epi8(_mm_load_si128((const __m128i *)_thresh), zero), 2);
+ t80 = _mm_set1_epi16(0x200);
+ } else { // bd == 12
+ blimit = _mm_slli_epi16(
+ _mm_unpacklo_epi8(_mm_load_si128((const __m128i *)_blimit), zero), 4);
+ limit = _mm_slli_epi16(
+ _mm_unpacklo_epi8(_mm_load_si128((const __m128i *)_limit), zero), 4);
+ thresh = _mm_slli_epi16(
+ _mm_unpacklo_epi8(_mm_load_si128((const __m128i *)_thresh), zero), 4);
+ t80 = _mm_set1_epi16(0x800);
+ }
+
+ ps1 = _mm_subs_epi16(p1, t80);
+ ps0 = _mm_subs_epi16(p0, t80);
+ qs0 = _mm_subs_epi16(q0, t80);
+ qs1 = _mm_subs_epi16(q1, t80);
+
// filter_mask and hev_mask
abs_p1p0 = _mm_or_si128(_mm_subs_epu16(p1, p0),
_mm_subs_epu16(p0, p1));
@@ -620,7 +637,14 @@ void vp9_highbd_lpf_horizontal_8_sse2(uint16_t *s, int p,
flat = _mm_max_epi16(work, flat);
flat = _mm_max_epi16(abs_p1p0, flat);
flat = _mm_max_epi16(abs_q1q0, flat);
- flat = _mm_subs_epu16(flat, _mm_slli_epi16(one, bd - 8));
+
+ if (bd == 8)
+ flat = _mm_subs_epu16(flat, one);
+ else if (bd == 10)
+ flat = _mm_subs_epu16(flat, _mm_slli_epi16(one, 2));
+ else // bd == 12
+ flat = _mm_subs_epu16(flat, _mm_slli_epi16(one, 4));
+
flat = _mm_cmpeq_epi16(flat, zero);
flat = _mm_and_si128(flat, mask); // flat & mask