static WEBP_INLINE void ComplexMask(const __m128i* const p1, const __m128i* const p0, const __m128i* const q0, const __m128i* const q1, int thresh, int ithresh, __m128i* const mask) { const __m128i it = _mm_set1_epi8(ithresh); const __m128i diff = _mm_subs_epu8(*mask, it); const __m128i thresh_mask = _mm_cmpeq_epi8(diff, _mm_setzero_si128()); __m128i filter_mask; NeedsFilter(p1, p0, q0, q1, thresh, &filter_mask); *mask = _mm_and_si128(thresh_mask, filter_mask); }
// Applies filter on 2 pixels (p0 and q0) static WEBP_INLINE void DoFilter2(__m128i* const p1, __m128i* const p0, __m128i* const q0, __m128i* const q1, int thresh) { __m128i a, mask; const __m128i sign_bit = _mm_set1_epi8(0x80); // convert p1/q1 to int8_t (for GetBaseDelta) __m128i p1s = _mm_xor_si128(*p1, sign_bit); // insieme: dropped const __m128i q1s = _mm_xor_si128(*q1, sign_bit); // insieme: dropped const NeedsFilter(p1, p0, q0, q1, thresh, &mask); FLIP_SIGN_BIT2(*p0, *q0); GetBaseDelta(&p1s, p0, q0, &q1s, &a); a = _mm_and_si128(a, mask); // mask filter values we don't care about DoSimpleFilter(p0, q0, &a); FLIP_SIGN_BIT2(*p0, *q0); }
// Applies filter on 2 pixels (p0 and q0) static WEBP_INLINE void DoFilter2(const __m128i* p1, __m128i* p0, __m128i* q0, const __m128i* q1, int thresh) { __m128i a, mask; const __m128i sign_bit = _mm_set1_epi8(0x80); const __m128i p1s = _mm_xor_si128(*p1, sign_bit); const __m128i q1s = _mm_xor_si128(*q1, sign_bit); NeedsFilter(p1, p0, q0, q1, thresh, &mask); // convert to signed values FLIP_SIGN_BIT2(*p0, *q0); GET_BASE_DELTA(p1s, *p0, *q0, q1s, a); a = _mm_and_si128(a, mask); // mask filter values we don't care about DO_SIMPLE_FILTER(*p0, *q0, a); // unoffset FLIP_SIGN_BIT2(*p0, *q0); }