[x265] [PATCH] arm: Implement psyCost_pp_8x8_neon

ramya at multicorewareinc.com ramya at multicorewareinc.com
Tue Jul 5 07:56:46 CEST 2016


# HG changeset patch
# User Ramya Sriraman
# Date 1467698197 -19800
#      Tue Jul 05 11:26:37 2016 +0530
# Node ID fbb2aa46cca671086d54ed96fb3dcc69cf1f7a0f
# Parent  a932b4366235ab6597c8d124c1569dade6ff790a
arm: Implement psyCost_pp_8x8_neon

diff -r a932b4366235 -r fbb2aa46cca6 source/common/arm/asm-primitives.cpp
--- a/source/common/arm/asm-primitives.cpp	Mon Jul 04 21:25:59 2016 +0530
+++ b/source/common/arm/asm-primitives.cpp	Tue Jul 05 11:26:37 2016 +0530
@@ -1010,6 +1010,7 @@
         p.cu[BLOCK_16x16].dct = PFX(dct_16x16_neon);
 #if !HIGH_BIT_DEPTH
         p.cu[BLOCK_4x4].psy_cost_pp = PFX(psyCost_4x4_neon);
+        p.cu[BLOCK_8x8].psy_cost_pp = PFX(psyCost_8x8_neon);
 #endif // !HIGH_BIT_DEPTH
     }
     if (cpuMask & X265_CPU_ARMV6)
diff -r a932b4366235 -r fbb2aa46cca6 source/common/arm/pixel-util.S
--- a/source/common/arm/pixel-util.S	Mon Jul 04 21:25:59 2016 +0530
+++ b/source/common/arm/pixel-util.S	Tue Jul 05 11:26:37 2016 +0530
@@ -2449,3 +2449,191 @@
     bx              lr
 endfunc
 
+function x265_psyCost_8x8_neon
+
+    vpush           {q4-q7}
+
+    vld1.8          {d0}, [r0], r1
+    vld1.8          {d1}, [r0], r1
+    vmovl.u8        q8, d0
+    vld1.8          {d2}, [r0], r1
+    vmovl.u8        q9, d1
+    vld1.8          {d3}, [r0], r1
+    vmovl.u8        q10, d2
+    vld1.8          {d4}, [r0], r1
+    vmovl.u8        q11, d3
+    vld1.8          {d5}, [r0], r1
+    vmovl.u8        q12, d4
+    vld1.8          {d6}, [r0], r1
+    vmovl.u8        q13, d5
+    vld1.8          {d7}, [r0], r1
+    vmovl.u8        q14, d6
+    vmovl.u8        q15, d7
+
+    // SAD Stage-0
+    vadd.u16        q4, q8, q9
+    vadd.u16        q5, q10, q11
+    vadd.u16        q6, q12, q13
+    vadd.u16        q7, q14, q15
+
+    // SAD Stage-1
+    vadd.u16        q4, q5
+    vadd.u16        q6, q7
+    vadd.u16        q4, q6
+    vpadd.u16       d8, d9
+    vpaddl.u16      d8, d8
+    vpadd.u32       d8, d8
+    vshr.u32        d8, #2
+
+    // sa8d
+    SUMSUB_AB       q0,  q1,  q8,  q9
+    SUMSUB_AB       q2,  q3,  q10, q11
+    SUMSUB_AB       q8,  q10, q0,  q2
+    SUMSUB_AB       q9,  q11, q1,  q3
+
+    HADAMARD4_V     q12, q13, q14, q15,  q0,  q1,  q2,  q3
+
+    SUMSUB_ABCD     q0,  q8,  q1,  q9,   q8,  q12, q9,  q13
+    SUMSUB_AB       q2,  q10, q10, q14
+    vtrn.16         q8,  q9
+    SUMSUB_AB       q3,  q11, q11, q15
+    vtrn.16         q0,  q1
+    SUMSUB_AB       q12, q13, q8,  q9
+    vtrn.16         q10, q11
+    SUMSUB_AB       q8,  q9,  q0,  q1
+    vtrn.16         q2,  q3
+    SUMSUB_AB       q14, q15, q10, q11
+    vadd.i16        q10, q2,  q3
+    vtrn.32         q12, q14
+    vsub.i16        q11, q2,  q3
+    vtrn.32         q13, q15
+    SUMSUB_AB       q0,  q2,  q12, q14
+    vtrn.32         q8,  q10
+    SUMSUB_AB       q1,  q3,  q13, q15
+    vtrn.32         q9,  q11
+    SUMSUB_AB       q12, q14, q8,  q10
+    SUMSUB_AB       q13, q15, q9,  q11
+
+    vswp            d1,  d24
+    ABS2            q0,  q12
+    vswp            d3,  d26
+    ABS2            q1,  q13
+    vswp            d5,  d28
+    ABS2            q2,  q14
+    vswp            d7,  d30
+    ABS2            q3,  q15
+    vmax.s16        q8,  q0,  q12
+    vmax.s16        q9,  q1,  q13
+    vmax.s16        q10, q2,  q14
+    vmax.s16        q11, q3,  q15
+    vadd.i16        q8,  q8,  q9
+    vadd.i16        q9,  q10, q11
+    vadd.u16        q0, q8, q9
+    vadd.u16        d0, d1
+    vpaddl.u16      d0, d0
+    vpadd.u32       d0, d0
+    vmov.32         r0, d0[0]
+    add             r0, r0, #1
+    lsr             r0, r0, #1
+//-------------------------------------------------------------
+    vld1.8          d0, [r2], r3
+    vld1.8          d1, [r2], r3
+    vmovl.u8        q8, d0
+    vld1.8          d2, [r2], r3
+    vmovl.u8        q9, d1
+    vld1.8          d3, [r2], r3
+    vmovl.u8        q10, d2
+    vld1.8          d4, [r2], r3
+    vmovl.u8        q11, d3
+    vld1.8          d5, [r2], r3
+    vmovl.u8        q12, d4
+    vld1.8          d6, [r2], r3
+    vmovl.u8        q13, d5
+    vld1.8          d7, [r2], r3
+    vmovl.u8        q14, d6
+    vmovl.u8        q15, d7
+
+    // SAD Stage-0
+    vadd.u16       q5, q8, q9
+    vadd.u16       q6, q10, q11
+    vadd.u16       q7, q12, q13
+    vadd.u16       q0, q14, q15
+
+    // SAD Stage-1
+    vadd.u16        q5, q6
+    vadd.u16        q7, q0
+    vadd.u16        q5, q7
+    vadd.u16        d10, d11
+    vpaddl.u16      d10, d10
+    vpadd.u32       d10, d10
+    vshr.u32        d10, #2
+
+    // sa8d
+    SUMSUB_AB       q0,  q1,  q8,  q9
+    SUMSUB_AB       q2,  q3,  q10, q11
+    SUMSUB_AB       q8,  q10, q0,  q2
+    SUMSUB_AB       q9,  q11, q1,  q3
+
+    HADAMARD4_V     q12, q13, q14, q15,  q0,  q1,  q2,  q3
+
+    SUMSUB_ABCD     q0,  q8,  q1,  q9,   q8,  q12, q9,  q13
+    SUMSUB_AB       q2,  q10, q10, q14
+    vtrn.16         q8,  q9
+    SUMSUB_AB       q3,  q11, q11, q15
+    vtrn.16         q0,  q1
+    SUMSUB_AB       q12, q13, q8,  q9
+    vtrn.16         q10, q11
+    SUMSUB_AB       q8,  q9,  q0,  q1
+    vtrn.16         q2,  q3
+    SUMSUB_AB       q14, q15, q10, q11
+    vadd.i16        q10, q2,  q3
+    vtrn.32         q12, q14
+    vsub.i16        q11, q2,  q3
+    vtrn.32         q13, q15
+    SUMSUB_AB       q0,  q2,  q12, q14
+    vtrn.32         q8,  q10
+    SUMSUB_AB       q1,  q3,  q13, q15
+    vtrn.32         q9,  q11
+    SUMSUB_AB       q12, q14, q8,  q10
+    SUMSUB_AB       q13, q15, q9,  q11
+
+    vswp            d1,  d24
+    ABS2            q0,  q12
+    vswp            d3,  d26
+    ABS2            q1,  q13
+    vswp            d5,  d28
+    ABS2            q2,  q14
+    vswp            d7,  d30
+    ABS2            q3,  q15
+    vmax.s16        q8,  q0,  q12
+    vmax.s16        q9,  q1,  q13
+    vmax.s16        q10, q2,  q14
+    vmax.s16        q11, q3,  q15
+    vadd.i16        q8,  q8,  q9
+    vadd.i16        q9,  q10, q11
+    vadd.u16        q0, q8, q9
+    vadd.u16        d0, d1
+    vpaddl.u16      d0, d0
+    vpadd.u32       d0, d0
+    vmov.32         r2, d0[0]
+    add             r2, r2, #1
+    lsr             r2, r2, #1
+
+    // SAD & SA8D Final Stage
+    vmov.32         r1, d8[0]
+    sub             r0, r1
+    vmov.32         r3, d10[0]
+    sub             r2, r3
+    cmp             r0, r2
+    bgt             subr0
+    sub             r0, r2, r0
+    b               end
+subr0:
+    sub             r0, r2
+end:
+
+    vpop            {q4-q7}
+    bx              lr
+endfunc
+
+
diff -r a932b4366235 -r fbb2aa46cca6 source/common/arm/pixel-util.h
--- a/source/common/arm/pixel-util.h	Mon Jul 04 21:25:59 2016 +0530
+++ b/source/common/arm/pixel-util.h	Tue Jul 05 11:26:37 2016 +0530
@@ -88,5 +88,6 @@
 void x265_ssim_4x4x2_core_neon(const pixel* pix1, intptr_t stride1, const pixel* pix2, intptr_t stride2, int sums[2][4]);
 
 int PFX(psyCost_4x4_neon)(const pixel* source, intptr_t sstride, const pixel* recon, intptr_t rstride);
+int PFX(psyCost_8x8_neon)(const pixel* source, intptr_t sstride, const pixel* recon, intptr_t rstride);
 
 #endif // ifndef X265_PIXEL_UTIL_ARM_H


More information about the x265-devel mailing list