[x265] [PATCH 1 of 2] arm: Implement interp_8tap_vert_sp_NXN NEON
ramya at multicorewareinc.com
ramya at multicorewareinc.com
Tue Mar 22 14:27:57 CET 2016
# 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
More information about the x265-devel
mailing list