# HG changeset patch # User Dnyaneshwar G <dnyanesh...@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 <dnyanesh...@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 _______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel