GetResidualCostSSE2: simplify abs calculation

max(coeff, 0 - coeff) works as well as min/max/sub or
(coeff ^ sign) - coeff

Change-Id: I9b11715372e49cd83820677bf4beba4a1c04931c
This commit is contained in:
James Zern 2015-04-21 20:29:12 -07:00
parent 6d4602b88a
commit b243a4bc30

View File

@ -68,12 +68,10 @@ static int GetResidualCostSSE2(int ctx0, const VP8Residual* const res) {
const __m128i kCst67 = _mm_set1_epi8(MAX_VARIABLE_LEVEL); const __m128i kCst67 = _mm_set1_epi8(MAX_VARIABLE_LEVEL);
const __m128i c0 = _mm_loadu_si128((const __m128i*)&res->coeffs[0]); const __m128i c0 = _mm_loadu_si128((const __m128i*)&res->coeffs[0]);
const __m128i c1 = _mm_loadu_si128((const __m128i*)&res->coeffs[8]); const __m128i c1 = _mm_loadu_si128((const __m128i*)&res->coeffs[8]);
const __m128i D0_m = _mm_min_epi16(c0, zero); const __m128i D0 = _mm_sub_epi16(zero, c0);
const __m128i D0_p = _mm_max_epi16(c0, zero); const __m128i D1 = _mm_sub_epi16(zero, c1);
const __m128i D1_m = _mm_min_epi16(c1, zero); const __m128i E0 = _mm_max_epi16(c0, D0); // abs(v), 16b
const __m128i D1_p = _mm_max_epi16(c1, zero); const __m128i E1 = _mm_max_epi16(c1, D1);
const __m128i E0 = _mm_sub_epi16(D0_p, D0_m); // abs(v), 16b
const __m128i E1 = _mm_sub_epi16(D1_p, D1_m);
const __m128i F = _mm_packs_epi16(E0, E1); const __m128i F = _mm_packs_epi16(E0, E1);
const __m128i G = _mm_min_epu8(F, kCst2); // context = 0,1,2 const __m128i G = _mm_min_epu8(F, kCst2); // context = 0,1,2
const __m128i H = _mm_min_epu8(F, kCst67); // clamp_level in [0..67] const __m128i H = _mm_min_epu8(F, kCst67); // clamp_level in [0..67]