changeset 199:87514f1663f3

Modified xCalcHADS4x4 to use 16bit operations.
author deepthidevaki
date Mon, 01 Apr 2013 18:35:13 +0530
parents 99eea17c57d6
children 0e8858d0fb9f
files source/encoder/TComRdCost_SSE.cpp
diffstat 1 files changed, 59 insertions(+-), 79 deletions(-) [+]
line wrap: on
line diff
--- a/source/encoder/TComRdCost_SSE.cpp	Sat Mar 30 13:50:54 2013 -0500
+++ b/source/encoder/TComRdCost_SSE.cpp	Mon Apr 01 18:35:13 2013 +0530
@@ -597,89 +597,69 @@ UInt TComRdCost::xCalcHADs8x8(Pel *piOrg
 
 UInt TComRdCost::xCalcHADs4x4(Pel *piOrg, Pel *piCur, Int iStrideOrg, Int iStrideCur, Int iStep)
 {
-    Int satd = 0;
-
-    assert(iStep == 1);
-
-    Vec8s temp1, temp2, temp3, temp4;
-    Vec4i v1, v2, v3, v4, m0, m4, m8, m12, diff_v, piOrg_v, piCur_v;
-    Int satd1, satd2, satd3, satd4;
-
-    temp1.load(piOrg);
-    temp2.load(piCur);
-    piCur += iStrideCur;
-    piOrg += iStrideOrg;
-
-    temp3.load(piOrg);
-    temp4.load(piCur);
-
-    piOrg_v = extend_low(temp1);
-    piCur_v = extend_low(temp2);
-    v1 = piOrg_v - piCur_v;
-
-    piOrg_v = extend_low(temp3);
-    piCur_v = extend_low(temp4);
-    v2 = piOrg_v - piCur_v;
-
-    piCur += iStrideCur;
-    piOrg += iStrideOrg;
-
-    temp1.load(piOrg);
-    temp2.load(piCur);
-    piCur += iStrideCur;
-    piOrg += iStrideOrg;
-
-    temp3.load(piOrg);
-    temp4.load(piCur);
-
-    piOrg_v = extend_low(temp1);
-    piCur_v = extend_low(temp2);
-    v3 = piOrg_v - piCur_v;
-
-    piOrg_v = extend_low(temp3);
-    piCur_v = extend_low(temp4);
-    v4 = piOrg_v - piCur_v;
+	Int satd = 0;
 
-    m4 = v2 + v3;
-    m8 = v2 - v3;
-
-    m0 = v1 + v4;
-    m12 = v1 - v4;
-
-    v1 = m0 + m4;
-    v2 = m8 + m12;
-    v3 = m0 - m4;
-    v4 = m12 - m8;
-
-    Vec4i tv1(v1[0], v1[1], v2[0], v2[1]);
-    Vec4i tv2(v1[3], v1[2], v2[3], v2[2]);
-    v1 = tv1 + tv2;
-    v2 = tv1 - tv2;
-
-    Vec4i tv3(v3[0], v3[1], v4[0], v4[1]);
-    Vec4i tv4(v3[3], v3[2], v4[3], v4[2]);
-    v3 = tv3 + tv4;
-    v4 = tv3 - tv4;
+	assert(iStep == 1);
 
-    Vec4i tm1(v1[0], v2[1], v1[2], v2[3]);
-    Vec4i tm2(v1[1], v2[0], v1[3], v2[2]);
-    v1 = abs(tm1 + tm2);
-    v2 = abs(tm1 - tm2);
-    satd1 = horizontal_add_x(v1);
-    satd2 = horizontal_add_x(v2);
+	Vec8s v1, v2, m1, m2;
+	{
+		Vec8s temp1, temp2, temp3, temp4 , piOrg_v, piCur_v;;
+		temp1.load(piOrg);
+		temp2.load(piCur);
+		piCur += iStrideCur;
+		piOrg += iStrideOrg;
 
-    Vec4i tm3(v3[0], v4[1], v3[2], v4[3]);
-    Vec4i tm4(v3[1], v4[0], v3[3], v4[2]);
-    v3 = abs(tm3 + tm4);
-    v4 = abs(tm3 - tm4);
-    satd3 = horizontal_add_x(v3);
-    satd4 = horizontal_add_x(v4);
+		temp3.load(piOrg);
+		temp4.load(piCur); 
+		piCur += iStrideCur;
+		piOrg += iStrideOrg;
 
-    satd = satd1 + satd2 + satd3 + satd4;
-
-    satd = ((satd + 1) >> 1);
+		piOrg_v = blend2q<0,2>((Vec2q)temp1,(Vec2q)temp3);
+		piCur_v = blend2q<0,2>((Vec2q)temp2,(Vec2q)temp4);
+		v1=piOrg_v - piCur_v; //diff
 
-    return satd;
+		temp1.load(piOrg);
+		temp2.load(piCur);
+		piCur += iStrideCur;
+		piOrg += iStrideOrg;
+
+		temp3.load(piOrg);
+		temp4.load(piCur); 
+		piCur += iStrideCur;
+		piOrg += iStrideOrg;
+
+		piOrg_v = blend2q<0,2>((Vec2q)temp3,(Vec2q)temp1);
+		piCur_v = blend2q<0,2>((Vec2q)temp4,(Vec2q)temp2);
+		v2=piOrg_v - piCur_v;	//diff
+	}
+
+	for(int i=0;i<2;i++)
+	{
+		m1=v1 + v2;
+		m2=v1 - v2;
+
+		v1 = blend8s<0,8,1,9,2,10,3,11>(m1,m2);
+		v2 = blend8s<4,12,5,13,6,14,7,15>(m1,m2);		
+	}
+
+	v2 = permute2q<1,0>((Vec2q)v2);
+
+	m1=v1 + v2;
+	m2=v1 - v2;
+
+	v1 = blend8s<0,8,1,9,2,10,3,11>(m1,m2);
+	v2 = blend8s<4,12,5,13,6,14,7,15>(m1,m2);
+
+	m1 = v1 + v2;
+	m2 = v1 - v2;
+
+	v1 = abs(m1);
+	v2 = abs(m2);
+	v1 = v1 + v2; 
+	satd = horizontal_add_x(v1);
+
+	satd = ((satd + 1) >> 1);
+
+	return satd;
 }
-
 #endif