[x265] [PATCH] arm: Implement interp_8tap_vert_pp_4xn_neon and interp_8tap_vert_pp_8xn_neon

ramya at multicorewareinc.com ramya at multicorewareinc.com
Mon Mar 14 12:09:19 CET 2016


# HG changeset patch
# User Ramya Sriraman<ramya at multicorewareinc.com>
# Date 1457681682 -19800
#      Fri Mar 11 13:04:42 2016 +0530
# Node ID c1d2fa2ca49d4027252bd52176ecbe2db0d0eddd
# Parent  0af38750a71aab5fe790993365aaaa3e209a7d5c
arm: Implement interp_8tap_vert_pp_4xn_neon and interp_8tap_vert_pp_8xn_neon

diff -r 0af38750a71a -r c1d2fa2ca49d source/common/arm/asm-primitives.cpp
--- a/source/common/arm/asm-primitives.cpp	Thu Mar 10 21:43:35 2016 +0530
+++ b/source/common/arm/asm-primitives.cpp	Fri Mar 11 13:04:42 2016 +0530
@@ -290,6 +290,14 @@
         // planecopy
         p.planecopy_cp = PFX(pixel_planecopy_cp_neon);
 
+        // interpolation filters
+        p.pu[LUMA_4x4].luma_vpp = PFX(interp_8tap_vert_pp_4x4_neon);
+        p.pu[LUMA_4x8].luma_vpp = PFX(interp_8tap_vert_pp_4x8_neon);
+        p.pu[LUMA_4x16].luma_vpp = PFX(interp_8tap_vert_pp_4x16_neon);
+        p.pu[LUMA_8x4].luma_vpp = PFX(interp_8tap_vert_pp_8x4_neon);
+        p.pu[LUMA_8x8].luma_vpp = PFX(interp_8tap_vert_pp_8x8_neon);
+        p.pu[LUMA_8x16].luma_vpp = PFX(interp_8tap_vert_pp_8x16_neon);
+        p.pu[LUMA_8x32].luma_vpp = PFX(interp_8tap_vert_pp_8x32_neon);
     }
     if (cpuMask & X265_CPU_ARMV6)
     {
diff -r 0af38750a71a -r c1d2fa2ca49d source/common/arm/ipfilter8.S
--- a/source/common/arm/ipfilter8.S	Thu Mar 10 21:43:35 2016 +0530
+++ b/source/common/arm/ipfilter8.S	Fri Mar 11 13:04:42 2016 +0530
@@ -27,6 +27,8 @@
 
 .align 4
 
+g_lumaFilter:
+.word 0,0,0,0,0,0,64,64,0,0,0,0,0,0,0,0,-1,-1,4,4,-10,-10,58,58,17,17,-5,-5,1,1,0,0,-1,-1,4,4,-11,-11,40,40,40,40,-11,-11,4,4,-1,-1,0,0,1,1,-5,-5,17,17,58,58,-10,-10,4,4,-1,-1 
 .text
 
 // filterPixelToShort(const pixel* src, intptr_t srcStride, int16_t* dst, intptr_t dstStride)
@@ -692,3 +694,207 @@
     bgt         .loop_filterP2S_48x64
     bx          lr
 endfunc
+
+.macro LUMA_VPP_4xN h
+function x265_interp_8tap_vert_pp_4x\h\()_neon
+    push            {r4, r5, r6}
+    ldr             r4, [sp, #4 * 3]
+    mov             r5, r4, lsl #6
+    mov             r4, #3
+    mul             r4, r1, r4
+    sub             r0, r4
+
+    mov             r4, #32
+    vdup.32         q8, r4
+    mov             r4, #\h
+
+.loop_4x\h:
+    movrel          r12, g_lumaFilter
+    add             r12, r5
+    mov             r6, r0
+
+    vld1.u32        d0[0], [r6], r1
+    vld1.u32        d0[1], [r6], r1
+    vld1.u32        d1[0], [r6], r1
+    vld1.u32        d1[1], [r6], r1
+    vld1.u32        d2[0], [r6], r1
+    vld1.u32        d2[1], [r6], r1
+    vld1.u32        d3[0], [r6], r1
+    vld1.u32        d3[1], [r6], r1
+
+    veor.u8         q9, q9
+
+    vmovl.u8        q11, d0
+    vmovl.u16       q12, d22
+    vmovl.u16       q13, d23
+    vld1.s32        d20, [r12]!
+    vmov.s32        d21, d20
+    vmla.s32        q9, q12, q10
+    vld1.s32        d20, [r12]!
+    vmov.s32        d21, d20
+    vmla.s32        q9, q13, q10
+
+    vmovl.u8        q11, d1
+    vmovl.u16       q12, d22
+    vmovl.u16       q13, d23
+    vld1.s32        d20, [r12]!
+    vmov.s32        d21, d20
+    vmla.s32        q9, q12, q10
+    vld1.s32        d20, [r12]!
+    vmov.s32        d21, d20
+    vmla.s32        q9, q13, q10
+
+    vmovl.u8        q11, d2
+    vmovl.u16       q12, d22
+    vmovl.u16       q13, d23
+    vld1.s32        d20, [r12]!
+    vmov.s32        d21, d20
+    vmla.s32        q9, q12, q10
+    vld1.s32        d20, [r12]!
+    vmov.s32        d21, d20
+    vmla.s32        q9, q13, q10
+
+    vmovl.u8        q11, d3
+    vmovl.u16       q12, d22
+    vmovl.u16       q13, d23
+    vld1.s32        d20, [r12]!
+    vmov.s32        d21, d20
+    vmla.s32        q9, q12, q10
+    vld1.s32        d20, [r12]!
+    vmov.s32        d21, d20
+    vmla.s32        q9, q13, q10
+
+    vadd.s32        q9, q8
+    vqshrun.s32     d0, q9, #6
+    vqmovn.u16      d0, q0
+    vst1.u32        d0[0], [r2], r3
+
+    add             r0, r1
+    subs            r4, #1
+    bne             .loop_4x\h
+
+    pop             {r4, r5, r6}
+    bx              lr
+endfunc
+.endm
+
+LUMA_VPP_4xN 4
+LUMA_VPP_4xN 8
+LUMA_VPP_4xN 16
+
+.macro LUMA_VPP_8xN h
+function x265_interp_8tap_vert_pp_8x\h\()_neon
+
+    push            {r5, r6, r7}
+    ldr             r5, [sp, #4 * 3]
+    mov             r7, r5, lsl #6
+    mov             r5, #3
+    mul             r5, r1, r5
+    sub             r0, r5
+
+    mov             r5, #32
+    vdup.32         q8, r5
+    mov             r5, #\h
+
+.loop_8x\h:
+    movrel          r12, g_lumaFilter
+    add             r12, r7
+    mov             r6, r0
+
+    vld1.u8         d0, [r6], r1
+    vld1.u8         d1, [r6], r1
+    vld1.u8         d2, [r6], r1
+    vld1.u8         d3, [r6], r1
+    vld1.u8         d4, [r6], r1
+    vld1.u8         d5, [r6], r1
+    vld1.u8         d6, [r6], r1
+    vld1.u8         d7, [r6], r1
+
+    veor.u8         q9, q9
+    veor.u8         q14, q14
+
+    vld1.s32        d20, [r12]!
+    vmov.s32        d21, d20
+    vmovl.u8        q11, d0
+    vmovl.u16       q12, d22
+    vmovl.u16       q13, d23
+    vmla.s32        q9, q12, q10
+    vmla.s32        q14, q13, q10
+
+    vld1.s32        d20, [r12]!
+    vmov.s32        d21, d20
+    vmovl.u8        q11, d1
+    vmovl.u16       q12, d22
+    vmovl.u16       q13, d23
+    vmla.s32        q9, q12, q10
+    vmla.s32        q14, q13, q10
+
+    vld1.s32        d20, [r12]!
+    vmov.s32        d21, d20
+    vmovl.u8        q11, d2
+    vmovl.u16       q12, d22
+    vmovl.u16       q13, d23
+    vmla.s32        q9, q12, q10
+    vmla.s32        q14, q13, q10
+
+    vld1.s32        d20, [r12]!
+    vmov.s32        d21, d20
+    vmovl.u8        q11, d3
+    vmovl.u16       q12, d22
+    vmovl.u16       q13, d23
+    vmla.s32        q9, q12, q10
+    vmla.s32        q14, q13, q10
+
+    vld1.s32        d20, [r12]!
+    vmov.s32        d21, d20
+    vmovl.u8        q11, d4
+    vmovl.u16       q12, d22
+    vmovl.u16       q13, d23
+    vmla.s32        q9, q12, q10
+    vmla.s32        q14, q13, q10
+
+    vld1.s32        d20, [r12]!
+    vmov.s32        d21, d20
+    vmovl.u8        q11, d5
+    vmovl.u16       q12, d22
+    vmovl.u16       q13, d23
+    vmla.s32        q9, q12, q10
+    vmla.s32        q14, q13, q10
+
+    vld1.s32        d20,[r12]!
+    vmov.s32        d21,d20
+    vmovl.u8        q11,d6
+    vmovl.u16       q12,d22
+    vmovl.u16       q13,d23
+    vmla.s32        q9,q12,q10
+    vmla.s32        q14,q13,q10
+
+    vld1.s32        d20, [r12]!
+    vmov.s32        d21, d20
+    vmovl.u8        q11, d7
+    vmovl.u16       q12, d22
+    vmovl.u16       q13, d23
+    vmla.s32        q9, q12, q10
+    vmla.s32        q14, q13, q10
+
+    vadd.s32        q9, q8
+    vqshrun.s32     d0, q9, #6
+    vadd.s32        q14, q8
+    vqshrun.s32     d1, q14, #6
+    vqmovn.u16      d0, q0
+    vst1.u8         d0, [r2], r3
+
+    add             r0, r1
+    subs            r5, #1
+    bne             .loop_8x\h
+
+    pop             {r5, r6, r7}
+    bx              lr
+endfunc
+.endm
+LUMA_VPP_8xN 4
+LUMA_VPP_8xN 8
+LUMA_VPP_8xN 16
+LUMA_VPP_8xN 32
+
+
diff -r 0af38750a71a -r c1d2fa2ca49d source/common/arm/ipfilter8.h
--- a/source/common/arm/ipfilter8.h	Thu Mar 10 21:43:35 2016 +0530
+++ b/source/common/arm/ipfilter8.h	Fri Mar 11 13:04:42 2016 +0530
@@ -51,4 +51,11 @@
 void x265_filterPixelToShort_64x48_neon(const pixel* src, intptr_t srcStride, int16_t* dst, intptr_t dstStride);
 void x265_filterPixelToShort_64x64_neon(const pixel* src, intptr_t srcStride, int16_t* dst, intptr_t dstStride);
 
+void x265_interp_8tap_vert_pp_4x4_neon(const pixel* src, intptr_t srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
+void x265_interp_8tap_vert_pp_4x8_neon(const pixel* src, intptr_t srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
+void x265_interp_8tap_vert_pp_4x16_neon(const pixel* src, intptr_t srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
+void x265_interp_8tap_vert_pp_8x4_neon(const pixel* src, intptr_t srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
+void x265_interp_8tap_vert_pp_8x8_neon(const pixel* src, intptr_t srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
+void x265_interp_8tap_vert_pp_8x16_neon(const pixel* src, intptr_t srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
+void x265_interp_8tap_vert_pp_8x32_neon(const pixel* src, intptr_t srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
 #endif // ifndef X265_IPFILTER8_ARM_H


More information about the x265-devel mailing list