[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