Fix high bit-depth loop-filter sse2 compiling issue - part 1

The intrinsic statement _mm_subs_epi16() should take immediate.
Feeding variable as its input argument will cause compile failure
in older version gcc.

Change-Id: I6a71efcc8d3b16b84715e0a9bcfa818494eea3f4
This commit is contained in:
Jingning Han 2015-02-24 12:04:09 -08:00 committed by Gerrit Code Review
parent 0f57d0a682
commit 2080e4b206

View File

@ -15,24 +15,38 @@
#include "vpx_ports/emmintrin_compat.h" #include "vpx_ports/emmintrin_compat.h"
static INLINE __m128i signed_char_clamp_bd_sse2(__m128i value, int bd) { static INLINE __m128i signed_char_clamp_bd_sse2(__m128i value, int bd) {
__m128i ubounded; __m128i ubounded;
__m128i lbounded; __m128i lbounded;
__m128i retval; __m128i retval;
const __m128i zero = _mm_set1_epi16(0); const __m128i zero = _mm_set1_epi16(0);
const __m128i one = _mm_set1_epi16(1); const __m128i one = _mm_set1_epi16(1);
const __m128i t80 = _mm_slli_epi16(_mm_set1_epi16(0x80), bd - 8); __m128i t80, max, min;
const __m128i max = _mm_subs_epi16(
_mm_subs_epi16(_mm_slli_epi16(one, bd), one), t80); if (bd == 8) {
const __m128i min = _mm_subs_epi16(zero, t80); t80 = _mm_set1_epi16(0x80);
ubounded = _mm_cmpgt_epi16(value, max); max = _mm_subs_epi16(
lbounded = _mm_cmplt_epi16(value, min); _mm_subs_epi16(_mm_slli_epi16(one, 8), one), t80);
retval = _mm_andnot_si128(_mm_or_si128(ubounded, lbounded), value); } else if (bd == 10) {
ubounded = _mm_and_si128(ubounded, max); t80 = _mm_set1_epi16(0x200);
lbounded = _mm_and_si128(lbounded, min); max = _mm_subs_epi16(
retval = _mm_or_si128(retval, ubounded); _mm_subs_epi16(_mm_slli_epi16(one, 10), one), t80);
retval = _mm_or_si128(retval, lbounded); } else { // bd == 12
return retval; t80 = _mm_set1_epi16(0x800);
max = _mm_subs_epi16(
_mm_subs_epi16(_mm_slli_epi16(one, 12), one), t80);
}
min = _mm_subs_epi16(zero, t80);
ubounded = _mm_cmpgt_epi16(value, max);
lbounded = _mm_cmplt_epi16(value, min);
retval = _mm_andnot_si128(_mm_or_si128(ubounded, lbounded), value);
ubounded = _mm_and_si128(ubounded, max);
lbounded = _mm_and_si128(lbounded, min);
retval = _mm_or_si128(retval, ubounded);
retval = _mm_or_si128(retval, lbounded);
return retval;
} }
// TODO(debargha, peter): Break up large functions into smaller ones // TODO(debargha, peter): Break up large functions into smaller ones