[x265] [PATCH 1 of 2] arm: Implement interp_8tap_vert_sp_NXN NEON

Deepthi Nandakumar deepthi at multicorewareinc.com
Thu Mar 24 09:07:40 CET 2016


Doesnt apply at the tip.

On Tue, Mar 22, 2016 at 6:57 PM, <ramya at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Ramya Sriraman<ramya at multicorewareinc.com>
> # Date 1458625243 -19800
> #      Tue Mar 22 11:10:43 2016 +0530
> # Node ID a9014e51d47ee5cdfe381d02526b1c94082cd4bf
> # Parent  e5c08206b8bfcce3a808b8f14848953c9cf51ce7
> arm: Implement interp_8tap_vert_sp_NXN NEON
>
> diff -r e5c08206b8bf -r a9014e51d47e source/common/arm/asm-primitives.cpp
> --- a/source/common/arm/asm-primitives.cpp      Wed Mar 16 16:52:23 2016
> +0530
> +++ b/source/common/arm/asm-primitives.cpp      Tue Mar 22 11:10:43 2016
> +0530
> @@ -328,6 +328,32 @@
>          p.pu[LUMA_24x32].luma_vpp   = PFX(interp_8tap_vert_pp_24x32_neon);
>          p.pu[LUMA_48x64].luma_vpp   = PFX(interp_8tap_vert_pp_48x64_neon);
>          p.pu[LUMA_12x16].luma_vpp   = PFX(interp_8tap_vert_pp_12x16_neon);
> +
> +        p.pu[LUMA_4x4].luma_vsp     = PFX(interp_8tap_vert_sp_4x4_neon);
> +        p.pu[LUMA_4x8].luma_vsp     = PFX(interp_8tap_vert_sp_4x8_neon);
> +        p.pu[LUMA_4x16].luma_vsp    = PFX(interp_8tap_vert_sp_4x16_neon);
> +        p.pu[LUMA_8x4].luma_vsp     = PFX(interp_8tap_vert_sp_8x4_neon);
> +        p.pu[LUMA_8x8].luma_vsp     = PFX(interp_8tap_vert_sp_8x8_neon);
> +        p.pu[LUMA_8x16].luma_vsp    = PFX(interp_8tap_vert_sp_8x16_neon);
> +        p.pu[LUMA_8x32].luma_vsp    = PFX(interp_8tap_vert_sp_8x32_neon);
> +        p.pu[LUMA_16x4].luma_vsp    = PFX(interp_8tap_vert_sp_16x4_neon);
> +        p.pu[LUMA_16x8].luma_vsp    = PFX(interp_8tap_vert_sp_16x8_neon);
> +        p.pu[LUMA_16x16].luma_vsp   = PFX(interp_8tap_vert_sp_16x16_neon);
> +        p.pu[LUMA_16x32].luma_vsp   = PFX(interp_8tap_vert_sp_16x32_neon);
> +        p.pu[LUMA_16x64].luma_vsp   = PFX(interp_8tap_vert_sp_16x64_neon);
> +        p.pu[LUMA_16x12].luma_vsp   = PFX(interp_8tap_vert_sp_16x12_neon);
> +        p.pu[LUMA_32x8].luma_vsp    = PFX(interp_8tap_vert_sp_32x8_neon);
> +        p.pu[LUMA_32x16].luma_vsp   = PFX(interp_8tap_vert_sp_32x16_neon);
> +        p.pu[LUMA_32x32].luma_vsp   = PFX(interp_8tap_vert_sp_32x32_neon);
> +        p.pu[LUMA_32x64].luma_vsp   = PFX(interp_8tap_vert_sp_32x64_neon);
> +        p.pu[LUMA_32x24].luma_vsp   = PFX(interp_8tap_vert_sp_32x24_neon);
> +        p.pu[LUMA_64x16].luma_vsp   = PFX(interp_8tap_vert_sp_64x16_neon);
> +        p.pu[LUMA_64x32].luma_vsp   = PFX(interp_8tap_vert_sp_64x32_neon);
> +        p.pu[LUMA_64x64].luma_vsp   = PFX(interp_8tap_vert_sp_64x64_neon);
> +        p.pu[LUMA_64x48].luma_vsp   = PFX(interp_8tap_vert_sp_64x48_neon);
> +        p.pu[LUMA_24x32].luma_vsp   = PFX(interp_8tap_vert_sp_24x32_neon);
> +        p.pu[LUMA_48x64].luma_vsp   = PFX(interp_8tap_vert_sp_48x64_neon);
> +        p.pu[LUMA_12x16].luma_vsp   = PFX(interp_8tap_vert_sp_12x16_neon);
>      }
>      if (cpuMask & X265_CPU_ARMV6)
>      {
> diff -r e5c08206b8bf -r a9014e51d47e source/common/arm/ipfilter8.S
> --- a/source/common/arm/ipfilter8.S     Wed Mar 16 16:52:23 2016 +0530
> +++ b/source/common/arm/ipfilter8.S     Tue Mar 22 11:10:43 2016 +0530
> @@ -32,6 +32,7 @@
>  .word -1,-1,4,4,-11,-11,40,40,40,40,-11,-11,4,4,-1,-1
>  .word 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)
> @@ -698,6 +699,102 @@
>      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, r1, lsl #2
> +    sub             r4, r1
> +    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
> +
> +    pld [r6]
> +    vld1.u32        d0[0], [r6], r1
> +    pld [r6]
> +    vld1.u32        d0[1], [r6], r1
> +    pld [r6]
> +    vld1.u32        d1[0], [r6], r1
> +    pld [r6]
> +    vld1.u32        d1[1], [r6], r1
> +    pld [r6]
> +    vld1.u32        d2[0], [r6], r1
> +    pld [r6]
> +    vld1.u32        d2[1], [r6], r1
> +    pld [r6]
> +    vld1.u32        d3[0], [r6], r1
> +    pld [r6]
> +    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
> +    .ltorg
> +endfunc
> +.endm
> +
> +LUMA_VPP_4xN 4
> +LUMA_VPP_4xN 8
> +LUMA_VPP_4xN 16
> +
>  .macro qpel_filter_0_32b
>      vmov.i16        d17, #64
>      vmovl.u8        q11, d3
> @@ -947,101 +1044,6 @@
>  LUMA_VPP 24 32
>  LUMA_VPP 48 64
>
> -.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, r1, lsl #2
> -    sub             r4, r1
> -    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
> -
> -    pld [r6]
> -    vld1.u32        d0[0], [r6], r1
> -    pld [r6]
> -    vld1.u32        d0[1], [r6], r1
> -    pld [r6]
> -    vld1.u32        d1[0], [r6], r1
> -    pld [r6]
> -    vld1.u32        d1[1], [r6], r1
> -    pld [r6]
> -    vld1.u32        d2[0], [r6], r1
> -    pld [r6]
> -    vld1.u32        d2[1], [r6], r1
> -    pld [r6]
> -    vld1.u32        d3[0], [r6], r1
> -    pld [r6]
> -    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
> -
>  function x265_interp_8tap_vert_pp_12x16_neon
>      push            {r4, r5, r6, r7}
>      ldr             r5, [sp, #4 * 4]
> @@ -1050,7 +1052,7 @@
>      sub             r0, r4
>
>      mov             r4, #16
> -.loop_12x16:
> +.loop_vpp_12x16:
>
>      mov             r6, r0
>      mov             r7, r2
> @@ -1083,6 +1085,9 @@
>      beq              2f
>      cmp             r5,#3
>      beq              3f
> +0:
> +    qpel_filter_0_32b
> +    b            5f
>  1:
>      qpel_filter_1_32b
>      b            5f
> @@ -1092,11 +1097,6 @@
>  3:
>      qpel_filter_3_32b
>      b            5f
> -0:
> -    vmov.i16        d17, #64
> -    vmovl.u8        q11, d3
> -    vmull.s16       q9, d22, d17    // 64*d0
> -    vmull.s16       q10, d23, d17   // 64*d1
>  5:
>      mov             r12,#32
>      vdup.32         q8, r12
> @@ -1137,6 +1137,9 @@
>      beq              2f
>      cmp             r5,#3
>      beq              3f
> +0:
> +    qpel_filter_0_32b
> +    b            5f
>  1:
>      qpel_filter_1_32b
>      b            5f
> @@ -1146,11 +1149,6 @@
>  3:
>      qpel_filter_3_32b
>      b            5f
> -0:
> -    vmov.i16        d17, #64
> -    vmovl.u8        q11, d3
> -    vmull.s16       q9, d22, d17    // 64*d0
> -    vmull.s16       q10, d23, d17   // 64*d1
>  5:
>      mov             r12,#32
>      vdup.32         q8, r12
> @@ -1164,8 +1162,448 @@
>      add             r0, r1
>      add             r2, r3
>      subs            r4, #1
> -    bne             .loop_12x16
> +    bne             .loop_vpp_12x16
>
>      pop             {r4, r5, r6, r7}
>      bx              lr
>  endfunc
> +//**************luma_vsp************
> +.macro LUMA_VSP_4xN h
> +function x265_interp_8tap_vert_sp_4x\h\()_neon
> +    push            {r4, r5, r6}
> +    ldr             r4, [sp, #4 * 3]
> +    mov             r5, r4, lsl #6
> +    lsl             r1, #1
> +    mov             r4, r1, lsl #2
> +    sub             r4, r1
> +    sub             r0, r4
> +
> +    mov             r12, #1
> +    lsl             r12, #19
> +    add             r12, #2048
> +    vdup.32         q8, r12
> +    mov             r4, #\h
> +.loop_vsp_4x\h:
> +    movrel          r12, g_lumaFilter
> +    add             r12, r5
> +    mov             r6, r0
> +
> +    pld [r6]
> +    vld1.u16         d0, [r6], r1
> +    pld [r6]
> +    vld1.u16         d1, [r6], r1
> +    pld [r6]
> +    vld1.u16         d2, [r6], r1
> +    pld [r6]
> +    vld1.u16         d3, [r6], r1
> +    pld [r6]
> +    vld1.u16         d4, [r6], r1
> +    pld [r6]
> +    vld1.u16         d5, [r6], r1
> +    pld [r6]
> +    vld1.u16         d6, [r6], r1
> +    pld [r6]
> +    vld1.u16         d7, [r6], r1
> +
> +    veor.u8         q9, q9
> +
> +    vmovl.s16       q11, d0
> +    vld1.s32        d24, [r12]!
> +    vmov.s32        d25, d24
> +    vmla.s32        q9, q12, q11
> +
> +    vmovl.s16       q11, d1
> +    vld1.s32        d24, [r12]!
> +    vmov.s32        d25, d24
> +    vmla.s32        q9, q12, q11
> +
> +    vmovl.s16       q11, d2
> +    vld1.s32        d24, [r12]!
> +    vmov.s32        d25, d24
> +    vmla.s32        q9, q12, q11
> +
> +    vmovl.s16       q11, d3
> +    vld1.s32        d24, [r12]!
> +    vmov.s32        d25, d24
> +    vmla.s32        q9, q12, q11
> +
> +    vmovl.s16       q11, d4
> +    vld1.s32        d24, [r12]!
> +    vmov.s32        d25, d24
> +    vmla.s32        q9, q12, q11
> +
> +    vmovl.s16       q11, d5
> +    vld1.s32        d24, [r12]!
> +    vmov.s32        d25, d24
> +    vmla.s32        q9, q12, q11
> +
> +    vmovl.s16       q11, d6
> +    vld1.s32        d24, [r12]!
> +    vmov.s32        d25, d24
> +    vmla.s32        q9, q12, q11
> +
> +    vmovl.s16       q11, d7
> +    vld1.s32        d24, [r12]!
> +    vmov.s32        d25, d24
> +    vmla.s32        q9, q12, q11
> +
> +
> +    vadd.s32        q9, q8
> +    vqshrun.s32     d0, q9, #12
> +    vqmovn.u16      d0, q0
> +    vst1.u32        d0[0], [r2], r3
> +
> +    add             r0, r1
> +    subs            r4, #1
> +    bne             .loop_vsp_4x\h
> +    pop             {r4, r5, r6}
> +    bx              lr
> +    .ltorg
> +endfunc
> +.endm
> +
> +LUMA_VSP_4xN 4
> +LUMA_VSP_4xN 8
> +LUMA_VSP_4xN 16
> +
> +.macro qpel_filter_0_32b_1
> +    vmov.i16        d17, #64
> +    vmull.s16       q9, d6, d17    // 64*d0
> +    vmull.s16       q10, d7, d17   // 64*d1
> +.endm
> +
> +.macro qpel_filter_1_32b_1
> +    vmov.i16        d16, #58
> +    vmov.i16        d17, #10
> +    vmull.s16       q9, d6, d16    // 58 * d0
> +    vmull.s16       q10, d7, d16   // 58 * d1
> +    vmov.i16        d16, #17
> +    vmull.s16       q11, d4, d17   // 10 * c0
> +    vmull.s16       q12, d5, d17   // 10 * c1
> +    vmov.i16        d17, #5
> +    vmull.s16       q13, d8, d16   // 17 * e0
> +    vmull.s16       q14, d9, d16   // 17 * e1
> +    vmull.s16       q15, d10, d17  //  5 * f0
> +    vmull.s16       q8, d11, d17   //  5 * f1
> +    vsub.s32        q9, q11        // 58 * d0 - 10 * c0
> +    vsub.s32        q10, q12       // 58 * d1 - 10 * c1
> +    vshll.s16       q11, d2, #2    // 4 * b0
> +    vshll.s16       q12, d3, #2    // 4 * b1
> +    vadd.s32        q9, q13        // 58 * d0 - 10 * c0 + 17 * e0
> +    vadd.s32        q10, q14       // 58 * d1 - 10 * c1 + 17 * e1
> +    vsubl.s16       q13, d12, d0   // g0 - a0
> +    vsubl.s16       q14, d13, d1   // g1 - a1
> +    vadd.s32        q9, q11        // 58 * d0 - 10 * c0 + 17 * e0 + 4 * b0
> +    vadd.s32        q10, q12       // 58 * d1 - 10 * c1 + 17 * e1 + 4 * b1
> +    vsub.s32        q13, q15       // g0 - a0 - 5 * f0
> +    vsub.s32        q14, q8        // g1 - a1 - 5 * f1
> +    vadd.s32        q9, q13        // 58 * d0 - 10 * c0 + 17 * e0 + 4 *
> b0 + g0 - a0 - 5 * f0
> +    vadd.s32        q10, q14       // 58 * d1 - 10 * c1 + 17 * e1 + 4 *
> b1 + g1 - a1 - 5 * f1
> +.endm
> +
> +.macro qpel_filter_2_32b_1
> +    vmov.i32        q8, #11
> +    vaddl.s16       q9, d6, d8    // d0 + e0
> +    vaddl.s16       q10, d7, d9   // d1 + e1
> +    vaddl.s16       q11, d4, d10  // c0 + f0
> +    vaddl.s16       q12, d5, d11  // c1 + f1
> +    vmul.s32        q11, q8       // 11 * (c0 + f0)
> +    vmul.s32        q12, q8       // 11 * (c1 + f1)
> +    vmov.i32        q8, #40
> +    vaddl.s16       q15, d2, d12  // b0 + g0
> +    vmul.s32        q9, q8        // 40 * (d0 + e0)
> +    vmul.s32        q10, q8       // 40 * (d1 + e1)
> +    vaddl.s16       q8, d3, d13   // b1 + g1
> +    vaddl.s16       q13, d0, d14  // a0 + h0
> +    vaddl.s16       q14, d1, d15  // a1 + h1
> +    vshl.s32        q15, #2       // 4*(b0+g0)
> +    vshl.s32        q8, #2        // 4*(b1+g1)
> +    vadd.s32        q11, q13      // 11 * (c0 + f0) + a0 + h0
> +    vadd.s32        q12, q14      // 11 * (c1 + f1) + a1 + h1
> +    vadd.s32        q9, q15       // 40 * (d0 + e0) + 4*(b0+g0)
> +    vadd.s32        q10, q8       // 40 * (d1 + e1) + 4*(b1+g1)
> +    vsub.s32        q9, q11       // 40 * (d0 + e0) + 4*(b0+g0) - (11 *
> (c0 + f0) + a0 + h0)
> +    vsub.s32        q10, q12      // 40 * (d1 + e1) + 4*(b1+g1) - (11 *
> (c1 + f1) + a1 + h1)
> +.endm
> +
> +.macro qpel_filter_3_32b_1
> +    vmov.i16        d16, #17
> +    vmov.i16        d17, #5
> +    vmull.s16       q9, d6, d16   // 17 * d0
> +    vmull.s16       q10, d7, d16  // 17 * d1
> +    vmull.s16       q11, d4, d17  // 5 * c0
> +    vmull.s16       q12, d5, d17  // 5* c1
> +    vmov.i16        d16, #58
> +    vmull.s16       q13, d8, d16  // 58 * e0
> +    vmull.s16       q14, d9, d16  // 58 * e1
> +    vmov.i16        d17, #10
> +    vmull.s16       q15, d10, d17 // 10 * f0
> +    vmull.s16       q8, d11, d17  // 10 * f1
> +    vsub.s32        q9, q11       // 17 * d0 - 5 * c0
> +    vsub.s32        q10, q12      // 17 * d1 - 5 * c1
> +    vshll.s16       q11, d12, #2  // 4 * g0
> +    vshll.s16       q12, d13, #2  // 4 * g1
> +    vadd.s32        q9, q13       // 17 * d0 - 5 * c0+ 58 * e0
> +    vadd.s32        q10, q14      // 17 * d1 - 5 * c1 + 58 * e1
> +    vsubl.s16       q13, d2, d14  // b0 - h0
> +    vsubl.s16       q14, d3, d15  // b1 - h1
> +    vadd.s32        q9, q11       // 17 * d0 - 5 * c0+ 58 * e0 +4 * g0
> +    vadd.s32        q10, q12      // 17 * d1 - 5 * c1 + 58 * e1+4 * g1
> +    vsub.s32        q13, q15      // 17 * d0 - 5 * c0+ 58 * e0 +4 * g0
> -10 * f0
> +    vsub.s32        q14, q8       // 17 * d1 - 5 * c1 + 58 * e1+4 * g1 -
> 10*f1
> +    vadd.s32        q9, q13       //  17 * d0 - 5 * c0+ 58 * e0 +4 * g0
> -10 * f0 +b0 - h0
> +    vadd.s32        q10, q14      // 17 * d1 - 5 * c1 + 58 * e1+4 * g1 -
> 10*f1 + b1 - h1
> +.endm
> +
> +.macro FILTER_VSP a b filterv
> +
> +    vpush           { q4 - q7}
> +.loop_\filterv\()_\a\()x\b:
> +
> +    mov             r7, r2
> +    mov             r6, r0
> +    eor             r8, r8
> +
> +.loop_w8_\filterv\()_\a\()x\b:
> +
> +    add             r6, r0, r8
> +
> +    pld [r6]
> +    vld1.u16         {q0}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q1}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q2}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q3}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q4}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q5}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q6}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q7}, [r6], r1
> +
> +    veor.u8         q9, q9
> +    veor.u8         q10, q10
> +
> +   \filterv
> +
> +    mov             r12,#1
> +    lsl             r12, #19
> +    add             r12, #2048
> +    vdup.32         q8, r12
> +    vadd.s32        q9, q8
> +    vqshrun.s32     d0, q9, #12
> +    vadd.s32        q10, q8
> +    vqshrun.s32     d1, q10, #12
> +    vqmovn.u16      d0, q0
> +    vst1.u8         d0, [r7]!
> +
> +
> +    add             r8, #16
> +    mov             r12, #\a
> +    lsl             r12, #1
> +    cmp             r8, r12
> +    blt             .loop_w8_\filterv\()_\a\()x\b
> +
> +    add             r0, r1
> +    add             r2, r3
> +    subs            r4, #1
> +    bne             .loop_\filterv\()_\a\()x\b
> +
> +    vpop            { q4 - q7}
> +
> +.endm
> +
> +.macro LUMA_VSP  w h
> +function x265_interp_8tap_vert_sp_\w\()x\h\()_neon
> +
> +    push            {r4, r5, r6, r7, r8}
> +    ldr             r5, [sp, #4 * 5]
> +    lsl             r1, #1
> +    mov             r4, r1, lsl #2
> +    sub             r4, r1
> +    sub             r0, r4
> +    mov             r4, #\h
> +
> +    cmp             r5, #0
> +    beq              0f
> +    cmp             r5, #1
> +    beq              1f
> +    cmp             r5, #2
> +    beq              2f
> +    cmp             r5, #3
> +    beq              3f
> +0:
> +    FILTER_VSP  \w \h qpel_filter_0_32b_1
> +    b            5f
> +1:
> +    FILTER_VSP  \w \h qpel_filter_1_32b_1
> +    b            5f
> +2:
> +    FILTER_VSP  \w \h qpel_filter_2_32b_1
> +    b            5f
> +3:
> +    FILTER_VSP  \w \h qpel_filter_3_32b_1
> +    b            5f
> +5:
> +    pop             {r4, r5, r6, r7, r8}
> +    bx              lr
> +endfunc
> +.endm
> +
> +
> +LUMA_VSP 8 4
> +LUMA_VSP 8 8
> +LUMA_VSP 8 16
> +LUMA_VSP 8 32
> +LUMA_VSP 16 4
> +LUMA_VSP 16 8
> +LUMA_VSP 16 16
> +LUMA_VSP 16 32
> +LUMA_VSP 16 64
> +LUMA_VSP 16 12
> +LUMA_VSP 32 8
> +LUMA_VSP 32 16
> +LUMA_VSP 32 32
> +LUMA_VSP 32 64
> +LUMA_VSP 32 24
> +LUMA_VSP 64 16
> +LUMA_VSP 64 32
> +LUMA_VSP 64 64
> +LUMA_VSP 64 48
> +LUMA_VSP 24 32
> +LUMA_VSP 48 64
> +
> +function x265_interp_8tap_vert_sp_12x16_neon
> +    push            {r4, r5, r6, r7}
> +    ldr             r5, [sp, #4 * 4]
> +    lsl             r1, #1
> +    mov             r4, r1, lsl #2
> +    sub             r4, r1
> +    sub             r0, r4
> +
> +    mov             r4, #16
> +    vpush           { q4 - q7}
> +.loop1_12x16:
> +
> +    mov             r6, r0
> +    mov             r7, r2
> +
> +    pld [r6]
> +    vld1.u16         {q0}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q1}, [r6], r1
> +    pld [r6]
> +    vld1.u8          {q2}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q3}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q4}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q5}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q6}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q7}, [r6], r1
> +
> +    veor.u8         q9, q9
> +    veor.u8         q10, q10
> +
> +    cmp             r5,#0
> +    beq              0f
> +    cmp             r5,#1
> +    beq              1f
> +    cmp             r5,#2
> +    beq              2f
> +    cmp             r5,#3
> +    beq              3f
> +0:
> +    qpel_filter_0_32b_1
> +    b            5f
> +1:
> +    qpel_filter_1_32b_1
> +    b            5f
> +2:
> +    qpel_filter_2_32b_1
> +    b            5f
> +3:
> +    qpel_filter_3_32b_1
> +    b            5f
> +5:
> +    mov             r12,#1
> +    lsl             r12, #19
> +    add             r12, #2048
> +    vdup.32         q8, r12
> +    vadd.s32        q9, q8
> +    vqshrun.s32     d0, q9, #12
> +    vadd.s32        q10, q8
> +    vqshrun.s32     d1, q10, #12
> +    vqmovn.u16      d0, q0
> +    vst1.u8         d0, [r7]!
> +
> +    add             r6, r0, #16
> +
> +    pld [r6]
> +    vld1.u16         {q0}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q1}, [r6], r1
> +    pld [r6]
> +    vld1.u8          {q2}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q3}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q4}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q5}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q6}, [r6], r1
> +    pld [r6]
> +    vld1.u16         {q7}, [r6], r1
> +
> +    veor.u8         q9, q9
> +    veor.u8         q10, q10
> +
> +    cmp             r5,#0
> +    beq              0f
> +    cmp             r5,#1
> +    beq              1f
> +    cmp             r5,#2
> +    beq              2f
> +    cmp             r5,#3
> +    beq              3f
> +0:
> +    qpel_filter_0_32b_1
> +    b            5f
> +1:
> +    qpel_filter_1_32b_1
> +    b            5f
> +2:
> +    qpel_filter_2_32b_1
> +    b            5f
> +3:
> +    qpel_filter_3_32b_1
> +    b            5f
> +5:
> +    mov             r12,#1
> +    lsl             r12, #19
> +    add             r12, #2048
> +    vdup.32         q8, r12
> +    vadd.s32        q9, q8
> +    vqshrun.s32     d0, q9, #12
> +    vadd.s32        q10, q8
> +    vqshrun.s32     d1, q10, #12
> +    vqmovn.u16      d0, q0
> +    vst1.u32        d0[0], [r7]!
> +
> +    add             r0, r1
> +    add             r2, r3
> +    subs            r4, #1
> +    bne             .loop1_12x16
> +    vpop            { q4 - q7}
> +    pop             {r4, r5, r6, r7}
> +    bx              lr
> +endfunc
> +
> diff -r e5c08206b8bf -r a9014e51d47e source/common/arm/ipfilter8.h
> --- a/source/common/arm/ipfilter8.h     Wed Mar 16 16:52:23 2016 +0530
> +++ b/source/common/arm/ipfilter8.h     Tue Mar 22 11:10:43 2016 +0530
> @@ -76,4 +76,30 @@
>  void x265_interp_8tap_vert_pp_24x32_neon(const pixel* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
>  void x265_interp_8tap_vert_pp_48x64_neon(const pixel* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
>  void x265_interp_8tap_vert_pp_12x16_neon(const pixel* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +
> +void x265_interp_8tap_vert_sp_4x4_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_4x8_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_4x16_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_8x4_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_8x8_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_8x16_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_8x32_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_16x4_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_16x8_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_16x16_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_16x32_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_16x64_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_16x12_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_32x8_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_32x16_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_32x32_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_32x64_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_32x24_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_64x16_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_64x32_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_64x64_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_64x48_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_24x32_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_48x64_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
> +void x265_interp_8tap_vert_sp_12x16_neon(const int16_t* src, intptr_t
> srcStride, pixel* dst, intptr_t dstStride, int coeffIdx);
>  #endif // ifndef X265_IPFILTER8_ARM_H
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>



-- 
Deepthi Nandakumar
Engineering Manager, x265
Multicoreware, Inc
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20160324/9bbed7b0/attachment-0001.html>


More information about the x265-devel mailing list