18520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/******************************************************************************
28520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar *
38520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * Copyright (C) 2015 The Android Open Source Project
48520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar *
58520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * Licensed under the Apache License, Version 2.0 (the "License");
68520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * you may not use this file except in compliance with the License.
78520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * You may obtain a copy of the License at:
88520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar *
98520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * http://www.apache.org/licenses/LICENSE-2.0
108520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar *
118520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * Unless required by applicable law or agreed to in writing, software
128520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * distributed under the License is distributed on an "AS IS" BASIS,
138520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * See the License for the specific language governing permissions and
158520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * limitations under the License.
168520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar *
178520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar *****************************************************************************
188520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
198520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*/
208520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/**
218520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*******************************************************************************
228520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @file
238520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  ideint_cac_ssse3.c
248520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
258520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @brief
268520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  This file include the definitions of the combing  artifact check function
278520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* of the de-interlacer and some  variant of that.
288520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
298520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @author
308520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Ittiam
318520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
328520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @par List of Functions:
338520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  cac_4x8()
348520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  ideint_cac()
358520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
368520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @remarks
378520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  In the de-interlacer workspace, cac is not a seperate  assembly module as
388520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* it comes along with the  de_int_decision() function. But in C-Model, to
398520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* keep  the things cleaner, it was made to be a separate  function during
408520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* cac experiments long after the  assembly was written by Mudit.
418520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
428520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*******************************************************************************
438520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*/
448520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/*****************************************************************************/
458520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/* File Includes                                                             */
468520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/*****************************************************************************/
478520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/* System include files */
488520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include <stdio.h>
498520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include <stdint.h>
508520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include <string.h>
518520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include <stdlib.h>
528520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include <immintrin.h>
538520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
548520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/* User include files */
558520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "icv_datatypes.h"
568520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "icv_macros.h"
578520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "icv.h"
588520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "icv_variance.h"
598520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "icv_sad.h"
608520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "ideint.h"
618520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "ideint_defs.h"
628520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "ideint_structs.h"
638520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar#include "ideint_cac.h"
648520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
658520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar/**
668520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*******************************************************************************
678520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
688520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @brief
698520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* Combing artifact check function for 8x8 block
708520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
718520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @par   Description
728520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* Determines CAC for 8x8 block by calling 8x4 CAC function
738520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
748520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @param[in] pu1_top
758520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Top field
768520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
778520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @param[in] pu1_bot
788520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Bottom field
798520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
808520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @param[in] top_strd
818520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Top field Stride
828520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
838520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @param[in] bot_strd
848520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*  Bottom field stride
858520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
868520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @returns
878520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* combing artifact flag (1 = detected, 0 = not detected)
888520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
898520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar* @remarks
908520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*
918520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*******************************************************************************
928520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar*/
938520690e241ad92a07893e198b2df417fe045d79Harish MahendrakarWORD32 ideint_cac_8x8_ssse3(UWORD8 *pu1_top,
948520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar                            UWORD8 *pu1_bot,
958520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar                            WORD32 top_strd,
968520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar                            WORD32 bot_strd)
978520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar{
988520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 ca;        /* combing artifact result                          */
998520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 i;
1008520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 adj[2] = {0};
1018520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 alt[2] = {0};
1028520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 sum_1, sum_2, sum_3, sum_4;
1038520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    WORD32 sum_diff, diff_sum;
1048520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1058520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    __m128i top[4];
1068520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    __m128i bot[4];
1078520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    __m128i sum_t[4];
1088520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    __m128i sum_b[4];
1098520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    __m128i zero;
1108520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1118520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1128520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    zero = _mm_setzero_si128();
1138520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1148520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    for(i = 0; i < 4; i++)
1158520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    {
1168520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /* Load top */
1178520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        top[i] = (__m128i)_mm_loadl_epi64((__m128i *) (pu1_top));
1188520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        pu1_top += top_strd;
1198520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1208520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /* Load bottom */
1218520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        bot[i] = (__m128i)_mm_loadl_epi64((__m128i *) (pu1_bot));
1228520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        pu1_bot += bot_strd;
1238520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1248520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /* Unpack */
1258520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        top[i] = _mm_unpacklo_epi8(top[i], zero);
1268520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        bot[i] = _mm_unpacklo_epi8(bot[i], zero);
1278520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1288520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        /* Compute row sums */
1298520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_t[i]  = _mm_sad_epu8(top[i], zero);
1308520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_b[i]  = _mm_sad_epu8(bot[i], zero);
1318520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    }
1328520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1338520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* Compute row based alt and adj */
1348520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    for(i = 0; i < 4; i += 2)
1358520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    {
1368520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_1 = _mm_cvtsi128_si32(sum_t[i + 0]);
1378520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_2 = _mm_cvtsi128_si32(sum_b[i + 0]);
1388520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_diff = ABS_DIF(sum_1, sum_2);
1398520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        if(sum_diff >= RSUM_CSUM_THRESH)
1408520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar            adj[0] += sum_diff;
1418520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1428520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_3 = _mm_cvtsi128_si32(sum_t[i + 1]);
1438520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_4 = _mm_cvtsi128_si32(sum_b[i + 1]);
1448520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_diff = ABS_DIF(sum_3, sum_4);
1458520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        if(sum_diff >= RSUM_CSUM_THRESH)
1468520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar            adj[0] += sum_diff;
1478520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1488520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        alt[0] += ABS_DIF(sum_1, sum_3);
1498520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        alt[0] += ABS_DIF(sum_2, sum_4);
1508520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1518520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_1 = _mm_cvtsi128_si32(_mm_srli_si128(sum_t[i + 0], 8));
1528520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_2 = _mm_cvtsi128_si32(_mm_srli_si128(sum_b[i + 0], 8));
1538520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_diff = ABS_DIF(sum_1, sum_2);
1548520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        if(sum_diff >= RSUM_CSUM_THRESH)
1558520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar            adj[1] += sum_diff;
1568520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1578520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_3 = _mm_cvtsi128_si32(_mm_srli_si128(sum_t[i + 1], 8));
1588520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_4 = _mm_cvtsi128_si32(_mm_srli_si128(sum_b[i + 1], 8));
1598520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        sum_diff = ABS_DIF(sum_3, sum_4);
1608520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        if(sum_diff >= RSUM_CSUM_THRESH)
1618520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar            adj[1] += sum_diff;
1628520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1638520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        alt[1] += ABS_DIF(sum_1, sum_3);
1648520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        alt[1] += ABS_DIF(sum_2, sum_4);
1658520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    }
1668520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1678520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* Compute column based adj */
1688520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    {
1698520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        __m128i avg1, avg2;
1708520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        __m128i top_avg, bot_avg;
1718520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        __m128i min, max, diff, thresh;
1728520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        __m128i mask;
1738520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        avg1 = _mm_avg_epu8(top[0], top[1]);
1748520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        avg2 = _mm_avg_epu8(top[2], top[3]);
1758520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        top_avg = _mm_avg_epu8(avg1, avg2);
1768520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1778520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        avg1 = _mm_avg_epu8(bot[0], bot[1]);
1788520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        avg2 = _mm_avg_epu8(bot[2], bot[3]);
1798520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        bot_avg = _mm_avg_epu8(avg1, avg2);
1808520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1818520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        min = _mm_min_epu8(top_avg, bot_avg);
1828520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        max = _mm_max_epu8(top_avg, bot_avg);
1838520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1848520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        diff = _mm_sub_epi16(max, min);
1858520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        thresh = _mm_set1_epi16((RSUM_CSUM_THRESH >> 2) - 1);
1868520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1878520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        mask = _mm_cmpgt_epi16(diff, thresh);
1888520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        diff = _mm_and_si128(diff, mask);
1898520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1908520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        diff_sum = _mm_extract_epi16(diff, 0);
1918520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        diff_sum += _mm_extract_epi16(diff, 1);
1928520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        diff_sum += _mm_extract_epi16(diff, 2);
1938520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        diff_sum += _mm_extract_epi16(diff, 3);
1948520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1958520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        adj[0] += diff_sum << 2;
1968520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
1978520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        diff_sum = _mm_extract_epi16(diff, 4);
1988520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        diff_sum += _mm_extract_epi16(diff, 5);
1998520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        diff_sum += _mm_extract_epi16(diff, 6);
2008520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        diff_sum += _mm_extract_epi16(diff, 7);
2018520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2028520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        adj[1] += diff_sum << 2;
2038520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2048520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    }
2058520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2068520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    /* Compute column based alt */
2078520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    {
2088520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        __m128i avg1, avg2;
2098520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        __m128i even_avg, odd_avg, diff;
2108520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        avg1 = _mm_avg_epu8(top[0], bot[0]);
2118520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        avg2 = _mm_avg_epu8(top[2], bot[2]);
2128520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        even_avg = _mm_avg_epu8(avg1, avg2);
2138520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2148520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        avg1 = _mm_avg_epu8(top[1], bot[1]);
2158520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        avg2 = _mm_avg_epu8(top[3], bot[3]);
2168520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        odd_avg = _mm_avg_epu8(avg1, avg2);
2178520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2188520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        diff = _mm_sad_epu8(even_avg, odd_avg);
2198520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2208520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2218520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        diff_sum = _mm_cvtsi128_si32(diff);
2228520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        alt[0] += diff_sum << 2;
2238520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2248520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        diff_sum = _mm_cvtsi128_si32(_mm_srli_si128(diff, 8));
2258520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar        alt[1] += diff_sum << 2;
2268520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2278520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    }
2288520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    alt[0] += (alt[0] >> SAD_BIAS_MULT_SHIFT) + (SAD_BIAS_ADDITIVE >> 1);
2298520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    alt[1] += (alt[1] >> SAD_BIAS_MULT_SHIFT) + (SAD_BIAS_ADDITIVE >> 1);
2308520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2318520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    ca    = (alt[0] < adj[0]);
2328520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    ca   |= (alt[1] < adj[1]);
2338520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
2348520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar    return ca;
2358520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar}
2368520690e241ad92a07893e198b2df417fe045d79Harish Mahendrakar
237