[x265] [PATCH] arm: Implement pixel_var ARM NEON asm

dnyaneshwar at multicorewareinc.com dnyaneshwar at multicorewareinc.com
Thu Feb 18 12:32:29 CET 2016


# HG changeset patch
# User Dnyaneshwar G <dnyaneshwar at multicorewareinc.com>
# Date 1455793621 -19800
#      Thu Feb 18 16:37:01 2016 +0530
# Node ID b31fa1a4ef43697e163d17dda0f4650de45d6ff9
# Parent  cb8769b5ea70304d658173e02deb254fb8572bd6
arm: Implement pixel_var ARM NEON asm

diff -r cb8769b5ea70 -r b31fa1a4ef43 source/common/CMakeLists.txt
--- a/source/common/CMakeLists.txt	Thu Feb 18 10:23:24 2016 +0530
+++ b/source/common/CMakeLists.txt	Thu Feb 18 16:37:01 2016 +0530
@@ -89,7 +89,7 @@
     set(C_SRCS asm-primitives.cpp pixel.h mc.h ipfilter8.h blockcopy8.h dct8.h loopfilter.h)
 
     # add ARM assembly/intrinsic files here
-    set(A_SRCS asm.S cpu-a.S mc-a.S sad-a.S)
+    set(A_SRCS asm.S cpu-a.S mc-a.S sad-a.S pixel-util.S)
     set(VEC_PRIMITIVES)
 
     set(ARM_ASMS "${A_SRCS}" CACHE INTERNAL "ARM Assembly Sources")
diff -r cb8769b5ea70 -r b31fa1a4ef43 source/common/arm/asm-primitives.cpp
--- a/source/common/arm/asm-primitives.cpp	Thu Feb 18 10:23:24 2016 +0530
+++ b/source/common/arm/asm-primitives.cpp	Thu Feb 18 16:37:01 2016 +0530
@@ -32,6 +32,7 @@
 extern "C" {
 #include "blockcopy8.h"
 #include "pixel.h"
+#include "pixel-util.h"
 }
 
 namespace X265_NS {
@@ -41,6 +42,12 @@
 {
     if (cpuMask & X265_CPU_NEON)
     {
+        // pixel_var
+        p.cu[BLOCK_8x8].var   = PFX(pixel_var_8x8_neon);
+        p.cu[BLOCK_16x16].var = PFX(pixel_var_16x16_neon);
+        p.cu[BLOCK_32x32].var = PFX(pixel_var_32x32_neon);
+        p.cu[BLOCK_64x64].var = PFX(pixel_var_64x64_neon);
+
         // blockcopy
         p.pu[LUMA_16x16].copy_pp = PFX(blockcopy_pp_16x16_neon);
         p.pu[LUMA_8x4].copy_pp   = PFX(blockcopy_pp_8x4_neon);
diff -r cb8769b5ea70 -r b31fa1a4ef43 source/common/arm/pixel-util.S
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/source/common/arm/pixel-util.S	Thu Feb 18 16:37:01 2016 +0530
@@ -0,0 +1,243 @@
+/*****************************************************************************
+ * Copyright (C) 2016 x265 project
+ *
+ * Authors: Dnyaneshwar G <dnyaneshwar at multicorewareinc.com>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
+ *
+ * This program is also available under a commercial proprietary license.
+ * For more information, contact us at license @ x265.com.
+ *****************************************************************************/
+
+#include "asm.S"
+
+.section .rodata
+
+.align 4
+
+
+.text
+
+.macro VAR_SQR_SUM qsqr_sum, qsqr_last, qsqr_temp, dsrc, num=0, vpadal=vpadal.u16
+    vmull.u8        \qsqr_temp, \dsrc, \dsrc
+    vaddw.u8        q\num, q\num, \dsrc
+    \vpadal         \qsqr_sum, \qsqr_last
+.endm
+
+function x265_pixel_var_8x8_neon
+    vld1.u8         {d16}, [r0], r1
+    vmull.u8        q1, d16, d16
+    vmovl.u8        q0, d16
+    vld1.u8         {d18}, [r0], r1
+    vmull.u8        q2, d18, d18
+    vaddw.u8        q0, q0, d18
+
+    vld1.u8         {d20}, [r0], r1
+    VAR_SQR_SUM     q1, q1, q3, d20, 0, vpaddl.u16
+    vld1.u8         {d22}, [r0], r1
+    VAR_SQR_SUM     q2, q2, q8, d22, 0, vpaddl.u16
+
+    vld1.u8         {d24}, [r0], r1
+    VAR_SQR_SUM     q1, q3, q9, d24
+    vld1.u8         {d26}, [r0], r1
+    VAR_SQR_SUM     q2, q8, q10, d26
+    vld1.u8         {d24}, [r0], r1
+    VAR_SQR_SUM     q1, q9, q14, d24
+    vld1.u8         {d26}, [r0], r1
+    VAR_SQR_SUM     q2, q10, q15, d26
+
+    vpaddl.u16      q8, q14
+    vpaddl.u16      q9, q15
+    vadd.u32        q1, q1, q8
+    vadd.u16        d0, d0, d1
+    vadd.u32        q1, q1, q9
+    vadd.u32        q1, q1, q2
+    vpaddl.u16      d0, d0
+    vadd.u32        d2, d2, d3
+    vpadd.u32       d0, d0, d2
+
+    vmov            r0, r1, d0
+    bx              lr
+endfunc
+
+function x265_pixel_var_16x16_neon
+    veor.u8         q0, q0
+    veor.u8         q1, q1
+    veor.u8         q2, q2
+    veor.u8         q14, q14
+    veor.u8         q15, q15
+    mov             ip, #4
+
+.var16_loop:
+    subs            ip, ip, #1
+    vld1.u8         {q8}, [r0], r1
+    VAR_SQR_SUM     q1, q14, q12, d16
+    VAR_SQR_SUM     q2, q15, q13, d17
+
+    vld1.u8         {q9}, [r0], r1
+    VAR_SQR_SUM     q1, q12, q14, d18
+    VAR_SQR_SUM     q2, q13, q15, d19
+
+    vld1.u8         {q8}, [r0], r1
+    VAR_SQR_SUM     q1, q14, q12, d16
+    VAR_SQR_SUM     q2, q15, q13, d17
+
+    vld1.u8         {q9}, [r0], r1
+    VAR_SQR_SUM     q1, q12, q14, d18
+    VAR_SQR_SUM     q2, q13, q15, d19
+    bgt             .var16_loop
+
+    vpaddl.u16      q8, q14
+    vpaddl.u16      q9, q15
+    vadd.u32        q1, q1, q8
+    vadd.u16        d0, d0, d1
+    vadd.u32        q1, q1, q9
+    vadd.u32        q1, q1, q2
+    vpaddl.u16      d0, d0
+    vadd.u32        d2, d2, d3
+    vpadd.u32       d0, d0, d2
+
+    vmov            r0, r1, d0
+    bx              lr
+endfunc
+
+function x265_pixel_var_32x32_neon
+    veor.u8         q0, q0
+    veor.u8         q1, q1
+    veor.u8         q2, q2
+    veor.u8         q14, q14
+    veor.u8         q15, q15
+    mov             ip, #8
+
+.var32_loop:
+    subs            ip, ip, #1
+    vld1.u8         {q8-q9}, [r0], r1
+    VAR_SQR_SUM     q1, q14, q12, d16
+    VAR_SQR_SUM     q2, q15, q13, d17
+    VAR_SQR_SUM     q1, q12, q14, d18
+    VAR_SQR_SUM     q2, q13, q15, d19
+
+    vld1.u8         {q8-q9}, [r0], r1
+    VAR_SQR_SUM     q1, q14, q12, d16
+    VAR_SQR_SUM     q2, q15, q13, d17
+    VAR_SQR_SUM     q1, q12, q14, d18
+    VAR_SQR_SUM     q2, q13, q15, d19
+
+    vld1.u8         {q8-q9}, [r0], r1
+    VAR_SQR_SUM     q1, q14, q12, d16
+    VAR_SQR_SUM     q2, q15, q13, d17
+    VAR_SQR_SUM     q1, q12, q14, d18
+    VAR_SQR_SUM     q2, q13, q15, d19
+
+    vld1.u8         {q8-q9}, [r0], r1
+    VAR_SQR_SUM     q1, q14, q12, d16
+    VAR_SQR_SUM     q2, q15, q13, d17
+    VAR_SQR_SUM     q1, q12, q14, d18
+    VAR_SQR_SUM     q2, q13, q15, d19
+    bgt             .var32_loop
+
+    vpaddl.u16      q8, q14
+    vpaddl.u16      q9, q15
+    vadd.u32        q1, q1, q8
+    vadd.u16        d0, d0, d1
+    vadd.u32        q1, q1, q9
+    vadd.u32        q1, q1, q2
+    vpaddl.u16      d0, d0
+    vadd.u32        d2, d2, d3
+    vpadd.u32       d0, d0, d2
+
+    vmov            r0, r1, d0
+    bx              lr
+endfunc
+
+function x265_pixel_var_64x64_neon
+    sub             r1, #32
+    veor.u8         q0, q0
+    veor.u8         q1, q1
+    veor.u8         q2, q2
+    veor.u8         q3, q3
+    veor.u8         q14, q14
+    veor.u8         q15, q15
+    mov             ip, #16
+
+.var64_loop:
+    subs            ip, ip, #1
+    vld1.u8         {q8-q9}, [r0]!
+    VAR_SQR_SUM     q1, q14, q12, d16
+    VAR_SQR_SUM     q2, q15, q13, d17
+    VAR_SQR_SUM     q1, q12, q14, d18
+    VAR_SQR_SUM     q2, q13, q15, d19
+
+    vld1.u8         {q8-q9}, [r0], r1
+    VAR_SQR_SUM     q1, q14, q12, d16, 3
+    VAR_SQR_SUM     q2, q15, q13, d17, 3
+    VAR_SQR_SUM     q1, q12, q14, d18, 3
+    VAR_SQR_SUM     q2, q13, q15, d19, 3
+
+    vld1.u8         {q8-q9}, [r0]!
+    VAR_SQR_SUM     q1, q14, q12, d16
+    VAR_SQR_SUM     q2, q15, q13, d17
+    VAR_SQR_SUM     q1, q12, q14, d18
+    VAR_SQR_SUM     q2, q13, q15, d19
+
+    vld1.u8         {q8-q9}, [r0], r1
+    VAR_SQR_SUM     q1, q14, q12, d16, 3
+    VAR_SQR_SUM     q2, q15, q13, d17, 3
+    VAR_SQR_SUM     q1, q12, q14, d18, 3
+    VAR_SQR_SUM     q2, q13, q15, d19, 3
+
+    vld1.u8         {q8-q9}, [r0]!
+    VAR_SQR_SUM     q1, q14, q12, d16
+    VAR_SQR_SUM     q2, q15, q13, d17
+    VAR_SQR_SUM     q1, q12, q14, d18
+    VAR_SQR_SUM     q2, q13, q15, d19
+
+    vld1.u8         {q8-q9}, [r0], r1
+    VAR_SQR_SUM     q1, q14, q12, d16, 3
+    VAR_SQR_SUM     q2, q15, q13, d17, 3
+    VAR_SQR_SUM     q1, q12, q14, d18, 3
+    VAR_SQR_SUM     q2, q13, q15, d19, 3
+
+    vld1.u8         {q8-q9}, [r0]!
+    VAR_SQR_SUM     q1, q14, q12, d16
+    VAR_SQR_SUM     q2, q15, q13, d17
+    VAR_SQR_SUM     q1, q12, q14, d18
+    VAR_SQR_SUM     q2, q13, q15, d19
+
+    vld1.u8         {q8-q9}, [r0], r1
+    VAR_SQR_SUM     q1, q14, q12, d16, 3
+    VAR_SQR_SUM     q2, q15, q13, d17, 3
+    VAR_SQR_SUM     q1, q12, q14, d18, 3
+    VAR_SQR_SUM     q2, q13, q15, d19, 3
+    bgt             .var64_loop
+
+    vpaddl.u16      q8, q14
+    vpaddl.u16      q9, q15
+    vadd.u32        q1, q1, q8
+    vadd.u32        q1, q1, q9
+    vadd.u32        q1, q1, q2
+    vpaddl.u16      d0, d0
+    vpaddl.u16      d1, d1
+    vpaddl.u16      d6, d6
+    vpaddl.u16      d7, d7
+    vadd.u32        d0, d1
+    vadd.u32        d6, d7
+    vadd.u32        d0, d6
+    vadd.u32        d2, d2, d3
+    vpadd.u32       d0, d0, d2
+
+    vmov            r0, r1, d0
+    bx              lr
+endfunc
diff -r cb8769b5ea70 -r b31fa1a4ef43 source/common/arm/pixel-util.h
--- a/source/common/arm/pixel-util.h	Thu Feb 18 10:23:24 2016 +0530
+++ b/source/common/arm/pixel-util.h	Thu Feb 18 16:37:01 2016 +0530
@@ -25,4 +25,9 @@
 #ifndef X265_PIXEL_UTIL_ARM_H
 #define X265_PIXEL_UTIL_ARM_H
 
+uint64_t x265_pixel_var_8x8_neon(const pixel* pix, intptr_t stride);
+uint64_t x265_pixel_var_16x16_neon(const pixel* pix, intptr_t stride);
+uint64_t x265_pixel_var_32x32_neon(const pixel* pix, intptr_t stride);
+uint64_t x265_pixel_var_64x64_neon(const pixel* pix, intptr_t stride);
+
 #endif // ifndef X265_PIXEL_UTIL_ARM_H


More information about the x265-devel mailing list