changeset 242:d17d19c2f9d6

Merged in deepthidevaki/xhevc_deepthid (pull request #30) Added satd4x4 in vecprimitives.inv
author Steve Borho <steve@borho.org>
date Wed, 03 Apr 2013 09:00:37 -0500
parents 74715f9955e9 (current diff) ba8f928d91d6 (diff)
children 3ecb9180930e
files
diffstat 2 files changed, 282 insertions(+-), 255 deletions(-) [+]
line wrap: on
line diff
--- a/source/encoder/TComRdCost_SSE.cpp	Wed Apr 03 08:59:27 2013 -0500
+++ b/source/encoder/TComRdCost_SSE.cpp	Wed Apr 03 09:00:37 2013 -0500
@@ -492,174 +492,220 @@ UInt TComRdCost::xGetSAD64(DistParam *pc
 #if _MSC_VER
 #pragma warning(disable: 4100)
 #endif
-UInt TComRdCost::xCalcHADs8x8(Pel *piOrg, Pel *piCur, Int iStrideOrg, Int iStrideCur, Int iStep)
-{
-    Int  i, j, k, jj, sad = 0;
-    ALIGN_VAR_16(Int, m1[8][8]);
-    ALIGN_VAR_16(Int, m2[8][8]);
-    ALIGN_VAR_16(Int, m3[8][8]);
-    ALIGN_VAR_16(Short, diff[64]);
-
-    Vec8s diff_v1, piOrg_v, piCur_v;
-    Vec4i v1, v2;
-
-    assert(iStep == 1);
-
-    for (k = 0; k < 64; k += 8)
-    {
-        piOrg_v.load(piOrg);
-        piCur_v.load(piCur);
-        diff_v1 = piOrg_v - piCur_v;
-
-        diff_v1.store_a(diff + k);
-
-        piCur += iStrideCur;
-        piOrg += iStrideOrg;
-    }
-    //horizontal
-    for (j = 0; j < 8; j++)
-    {
-        jj = j << 3;
-        m2[j][0] = diff[jj  ] + diff[jj + 4];
-        m2[j][1] = diff[jj + 1] + diff[jj + 5];
-        m2[j][2] = diff[jj + 2] + diff[jj + 6];
-        m2[j][3] = diff[jj + 3] + diff[jj + 7];
-        m2[j][4] = diff[jj  ] - diff[jj + 4];
-        m2[j][5] = diff[jj + 1] - diff[jj + 5];
-        m2[j][6] = diff[jj + 2] - diff[jj + 6];
-        m2[j][7] = diff[jj + 3] - diff[jj + 7];
-
-        m1[j][0] = m2[j][0] + m2[j][2];
-        m1[j][1] = m2[j][1] + m2[j][3];
-        m1[j][2] = m2[j][0] - m2[j][2];
-        m1[j][3] = m2[j][1] - m2[j][3];
-        m1[j][4] = m2[j][4] + m2[j][6];
-        m1[j][5] = m2[j][5] + m2[j][7];
-        m1[j][6] = m2[j][4] - m2[j][6];
-        m1[j][7] = m2[j][5] - m2[j][7];
-
-        m2[j][0] = m1[j][0] + m1[j][1];
-        m2[j][1] = m1[j][0] - m1[j][1];
-        m2[j][2] = m1[j][2] + m1[j][3];
-        m2[j][3] = m1[j][2] - m1[j][3];
-        m2[j][4] = m1[j][4] + m1[j][5];
-        m2[j][5] = m1[j][4] - m1[j][5];
-        m2[j][6] = m1[j][6] + m1[j][7];
-        m2[j][7] = m1[j][6] - m1[j][7];
-
-    }
-
-    //vertical
-    for (i = 0; i < 8; i++)
-    {
-        m3[0][i] = m2[0][i] + m2[4][i];
-        m3[1][i] = m2[1][i] + m2[5][i];
-        m3[2][i] = m2[2][i] + m2[6][i];
-        m3[3][i] = m2[3][i] + m2[7][i];
-        m3[4][i] = m2[0][i] - m2[4][i];
-        m3[5][i] = m2[1][i] - m2[5][i];
-        m3[6][i] = m2[2][i] - m2[6][i];
-        m3[7][i] = m2[3][i] - m2[7][i];
-
-        m1[0][i] = m3[0][i] + m3[2][i];
-        m1[1][i] = m3[1][i] + m3[3][i];
-        m1[2][i] = m3[0][i] - m3[2][i];
-        m1[3][i] = m3[1][i] - m3[3][i];
-        m1[4][i] = m3[4][i] + m3[6][i];
-        m1[5][i] = m3[5][i] + m3[7][i];
-        m1[6][i] = m3[4][i] - m3[6][i];
-        m1[7][i] = m3[5][i] - m3[7][i];
+UInt TComRdCost::xCalcHADs8x8(Pel *piOrg, Pel *piCur, Int iStrideOrg, Int iStrideCur, Int iStep)
+{
+    Int  j, sad = 0;
+
+    ALIGN_VAR_16(Short, m2[8][8]);
+
+    Vec8s diff_v1, diff_v2, piOrg_v1, piOrg_v2, piCur_v1, piCur_v2;
+    Vec8s v1, v2, t1, t2;
+
+    assert(iStep == 1);
+
+    for (j = 0; j < 8; j += 2)
+    {
+        piOrg_v1.load(piOrg);
+        piCur_v1.load(piCur);
+        piCur += iStrideCur;
+        piOrg += iStrideOrg;
+
+        piOrg_v2.load(piOrg);
+        piCur_v2.load(piCur);
+        piCur += iStrideCur;
+        piOrg += iStrideOrg;
+
+        diff_v1 = piOrg_v1 - piCur_v1;
+        diff_v2 = piOrg_v2 - piCur_v2;
+
+        v1 = blend8s<0, 8, 1, 9, 2, 10, 3, 11>(diff_v1, diff_v2);
+        v2 = blend8s<4, 12, 5, 13, 6, 14, 7, 15>(diff_v1, diff_v2);
+
+        t1 = v1 + v2; //m2
+        t2 = v1 - v2;
+
+        v1 = blend8s<0, 8, 1, 9, 2, 10, 3, 11>(t1, t2);
+        v2 = blend8s<4, 12, 5, 13, 6, 14, 7, 15>(t1, t2);
+
+        t1 = v1 + v2; //m1
+        t2 = v1 - v2;
+
+        v1 = blend8s<0, 8, 1, 9, 2, 10, 3, 11>(t1, t2);
+        v2 = blend8s<4, 12, 5, 13, 6, 14, 7, 15>(t1, t2);
+
+        t1 = v1 + v2; //m2
+        t2 = v1 - v2;
+
+        v1 = blend8s<0, 8, 1, 9, 2, 10, 3, 11>(t1, t2);		//m2[j][0...7]
+        v2 = blend8s<4, 12, 5, 13, 6, 14, 7, 15>(t1, t2);	//m2[j+1][0..7]
+
+        v1.store_a(m2[j]);
+        v2.store_a(m2[j + 1]);
+
+    }
+
+    //vertical
+    {
+        Vec8s v0, v1, v2, v3, v4, v5, v6, v7, t1, t2;
+
+        v0.load_a(m2[0]);
+        v4.load_a(m2[4]);
+        t1 = v0 + v4;
+        t2 = v0 - v4;
+        v0 = t1;
+        v4 = t2;
+
+        v1.load_a(m2[1]);
+        v5.load_a(m2[5]);
+        t1 = v1 + v5;
+        t2 = v1 - v5;
+        v1 = t1;
+        v5 = t2;
+
+        v2.load_a(m2[2]);
+        v6.load_a(m2[6]);
+        t1 = v2 + v6;
+        t2 = v2 - v6;
+        v2 = t1;
+        v6 = t2;
+
+        v3.load_a(m2[3]);
+        v7.load_a(m2[7]);
+        t1 = v3 + v7;
+        t2 = v3 - v7;
+        v3 = t1;
+        v7 = t2;
+
+        //Calculate m2[0][] - m2[3][]
+
+        t1 = v0 + v2;
+        t2 = v0 - v2;
+        v0 = t1;
+        v2 = t2;
+
+        t1 = v1 + v3;
+        t2 = v1 - v3;
+        v1 = t1;
+        v3 = t2;
+
+        t1 = v0 + v1;
+        t2 = v0 - v1;
+        v0 = abs(t1);
+        v1 = abs(t2);
+        v0 = v0 + v1;
+
+        t1 = v2 + v3;
+        t2 = v2 - v3;
+        v2 = abs(t1);
+        v3 = abs(t2);
+        v2 = v2 + v3;
+
+        v0 = v0 + v2;
+
+        //Calculate m2[4][] - m2[7][]
+
+        t1 = v4 + v6;
+        t2 = v4 - v6;
+        v4 = t1;
+        v6 = t2;
+
+
+        t1 = v5 + v7;
+        t2 = v5 - v7;
+        v5 = t1;
+        v7 = t2;
+
+        t1 = v4 + v5;
+        t2 = v4 - v5;
+        v4 = abs(t1);
+        v5 = abs(t2);
+        v4 = v4 + v5;
+
+        t1 = v6 + v7;
+        t2 = v6 - v7;
+        v6 = abs(t1);
+        v7 = abs(t2);
+        v6 = v6 + v7;
+
+        v4 = v4 + v6;
+        v0 = v0 + v4;
+
+        sad = horizontal_add_x(v0);
+
+    }
+
+    sad = ((sad + 2) >> 2);
+
+    return sad;
+}
+
+UInt TComRdCost::xCalcHADs4x4(Pel *piOrg, Pel *piCur, Int iStrideOrg, Int iStrideCur, Int iStep)
+{
+    Int satd = 0;
+
+    assert(iStep == 1);
+
+    Vec8s v1, v2, m1, m2;
+    {
+        Vec8s temp1, temp2, temp3, temp4 , piOrg_v, piCur_v;;
+        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)temp1, (Vec2q)temp3);
+        piCur_v = blend2q<0, 2>((Vec2q)temp2, (Vec2q)temp4);
+
+        temp1.load(piOrg);
+        temp2.load(piCur);
+        piCur += iStrideCur;
+        piOrg += iStrideOrg;
+
+        temp3.load(piOrg);
+        temp4.load(piCur);
+        piCur += iStrideCur;
+        piOrg += iStrideOrg;
+
+        v1 = piOrg_v - piCur_v; //diff
+
+        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;
+}
 
-        m2[0][i] = m1[0][i] + m1[1][i];
-        m2[1][i] = m1[0][i] - m1[1][i];
-        m2[2][i] = m1[2][i] + m1[3][i];
-        m2[3][i] = m1[2][i] - m1[3][i];
-        m2[4][i] = m1[4][i] + m1[5][i];
-        m2[5][i] = m1[4][i] - m1[5][i];
-        m2[6][i] = m1[6][i] + m1[7][i];
-        m2[7][i] = m1[6][i] - m1[7][i];
-    }
-
-    for (i = 0; i < 8; i++)
-    {
-        v1.load_a(m2[i]);
-        v1 = abs(v1);
-        sad += horizontal_add_x(v1);
-        v1.load_a(m2[i] + 4);
-        v1 = abs(v1);
-        sad += horizontal_add_x(v1);
-    }
-
-    sad = ((sad + 2) >> 2);
-
-    return sad;
-}
-
-UInt TComRdCost::xCalcHADs4x4(Pel *piOrg, Pel *piCur, Int iStrideOrg, Int iStrideCur, Int iStep)
-{
-	Int satd = 0;
-
-	assert(iStep == 1);
-
-	Vec8s v1, v2, m1, m2;
-	{
-		Vec8s temp1, temp2, temp3, temp4 , piOrg_v, piCur_v;;
-		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)temp1,(Vec2q)temp3);
-		piCur_v = blend2q<0,2>((Vec2q)temp2,(Vec2q)temp4);
-		v1=piOrg_v - piCur_v; //diff
-
-		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
+#endif
\ No newline at end of file
--- a/source/encoder/vec/vecprimitives.inc	Wed Apr 03 08:59:27 2013 -0500
+++ b/source/encoder/vec/vecprimitives.inc	Wed Apr 03 09:00:37 2013 -0500
@@ -38,7 +38,7 @@ namespace {
 int CDECL NAME(sad_8x8)(pixel *piOrg, intptr_t strideOrg, pixel *piCur, intptr_t strideCur)
 {
     // NOTE: This is completely untested, and ignores alignment issues
-    int uiSum = 0;
+	int uiSum = 0;
 
     for (int Row = 0; Row < 8; Row++)
     {
@@ -56,91 +56,72 @@ int CDECL NAME(sad_8x8)(pixel *piOrg, in
     return uiSum;
 }
 
-int CDECL NAME(satd_4x4)(pixel *piOrg, intptr_t strideOrg, pixel *piCur, intptr_t strideCur)
+int CDECL NAME(satd_4x4)(pixel *piCur, intptr_t iStrideCur, pixel *piOrg, intptr_t iStrideOrg)
 {
-    int satd = 0;
-
-    /*Assertion istep==1 removed*/
-
-    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 += strideCur;
-    piOrg += strideOrg;
-
-    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 += strideCur;
-    piOrg += strideOrg;
-
-    temp1.load(piOrg);
-    temp2.load(piCur);
-    piCur += strideCur;
-    piOrg += strideOrg;
-
-    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;
-
-    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;
-
-    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);
-
-    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);
-
-    satd = satd1 + satd2 + satd3 + satd4;
-
-    satd = ((satd + 1) >> 1);
-
-    return satd;
+        
+	int satd = 0;
+	
+    Vec8s v1, v2, m1, m2;
+    {
+        Vec8s temp1, temp2, temp3, temp4 , piOrg_v, piCur_v;;
+        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)temp1, (Vec2q)temp3);
+        piCur_v = blend2q<0, 2>((Vec2q)temp2, (Vec2q)temp4);
+
+        temp1.load(piOrg);
+        temp2.load(piCur);
+        piCur += iStrideCur;
+        piOrg += iStrideOrg;
+
+        temp3.load(piOrg);
+        temp4.load(piCur);
+        piCur += iStrideCur;
+        piOrg += iStrideOrg;
+
+        v1 = piOrg_v - piCur_v; //diff
+
+        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; 
 }
 
 #else /* 8-bit pixels */