ref: 6714b8ae993b5e049262444a9f17d9552188a68f
parent: 62824ce398eacb64927fc96bade4d6818d9dccd2
parent: c011890764bebeb237674e78c44155711284bb76
author: volvet <qizh@cisco.com>
date: Fri Mar 14 06:28:55 EDT 2014
Merge pull request #463 from mstorsjo/dont-clobber-neon-registers Avoid clobbering the neon registers q4-q7 Review and verified by zhilwang
--- a/codec/common/deblocking_neon.S
+++ b/codec/common/deblocking_neon.S
@@ -277,6 +277,7 @@
#endif
WELS_ASM_FUNC_BEGIN DeblockLumaLt4V_neon
+ vpush {q4-q7}
vdup.u8 q11, r2
vdup.u8 q9, r3
@@ -290,7 +291,7 @@
vld1.u8 {q5}, [r0]
sub r2, r2, r1
- ldr r3, [sp, #0]
+ ldr r3, [sp, #64]
vld1.s8 {d31}, [r3]
vdup.s8 d28, d31[0]
vdup.s8 d30, d31[1]
@@ -332,10 +333,12 @@
vst1.u8 {q3}, [r2] , r1
vst1.u8 {q7}, [r2]
+ vpop {q4-q7}
WELS_ASM_FUNC_END
WELS_ASM_FUNC_BEGIN DeblockLumaEq4V_neon
+ vpush {q4-q7}
vdup.u8 q5, r2
vdup.u8 q4, r3
@@ -393,10 +396,12 @@
DIFF_LUMA_EQ4_MASK q3, q14, q0, q4
vst1.u8 {q4}, [r3], r1
+ vpop {q4-q7}
WELS_ASM_FUNC_END
WELS_ASM_FUNC_BEGIN DeblockLumaLt4H_neon
+ vpush {q4-q7}
vdup.u8 q11, r2
vdup.u8 q9, r3
@@ -429,7 +434,7 @@
sub r0, r0, r1, lsl #4
- ldr r3, [sp, #0]
+ ldr r3, [sp, #64]
vld1.s8 {d31}, [r3]
vdup.s8 d28, d31[0]
vdup.s8 d30, d31[1]
@@ -488,10 +493,12 @@
STORE_LUMA_DATA_4 d6, d7, d8, d9, 4, 5
STORE_LUMA_DATA_4 d6, d7, d8, d9, 6, 7
+ vpop {q4-q7}
WELS_ASM_FUNC_END
WELS_ASM_FUNC_BEGIN DeblockLumaEq4H_neon
+ vpush {q4-q7}
vdup.u8 q5, r2
vdup.u8 q4, r3
@@ -591,6 +598,7 @@
STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,6
STORE_LUMA_DATA_3 d7,d8,d9,d13,d14,d15,7
+ vpop {q4-q7}
WELS_ASM_FUNC_END
@@ -615,31 +623,31 @@
sub r0, r0, r2, lsl #1
sub r1, r1, r2, lsl #1
- vld1.s8 {d15}, [r3]
- vmovl.u8 q6, d15
- vshl.u64 d13,d12,#8
- vorr d12,d13
- vmov d13, d12
- veor q7, q7
- vsub.i8 q7,q7,q6
+ vld1.s8 {d31}, [r3]
+ vmovl.u8 q14,d31
+ vshl.u64 d29,d28,#8
+ vorr d28,d29
+ vmov d29, d28
+ veor q15, q15
+ vsub.i8 q15,q15,q14
- MASK_MATRIX q0, q1, q2, q3, q11, q9, q5
+ MASK_MATRIX q0, q1, q2, q3, q11, q9, q10
- DIFF_LUMA_LT4_P0_Q0 d0, d2, d4, d6, d8, q12, q13
- DIFF_LUMA_LT4_P0_Q0 d1, d3, d5, d7, d9, q12, q13
- vmax.s8 q4, q4, q7
- vmin.s8 q4, q4, q6
+ DIFF_LUMA_LT4_P0_Q0 d0, d2, d4, d6, d16, q12, q13
+ DIFF_LUMA_LT4_P0_Q0 d1, d3, d5, d7, d17, q12, q13
+ vmax.s8 q8, q8, q15
+ vmin.s8 q8, q8, q14
- vand.s8 q4, q4, q5
- vcge.s8 q6, q6, #0
- vand.s8 q4, q4, q6
- EXTRACT_DELTA_INTO_TWO_PART q4, q5
- vqadd.u8 q1, q1, q5
- vqsub.u8 q1, q1, q4
+ vand.s8 q8, q8, q10
+ vcge.s8 q14, q14, #0
+ vand.s8 q8, q8, q14
+ EXTRACT_DELTA_INTO_TWO_PART q8, q10
+ vqadd.u8 q1, q1, q10
+ vqsub.u8 q1, q1, q8
vst1.u8 {d2}, [r0], r2
vst1.u8 {d3}, [r1], r2
- vqsub.u8 q2, q2, q5
- vqadd.u8 q2, q2, q4
+ vqsub.u8 q2, q2, q10
+ vqadd.u8 q2, q2, q8
vst1.u8 {d4}, [r0]
vst1.u8 {d5}, [r1]
@@ -647,9 +655,10 @@
WELS_ASM_FUNC_BEGIN DeblockChromaEq4V_neon
+ vpush {q4-q5}
vdup.u8 q11, r3
- ldr r3, [sp, #0]
+ ldr r3, [sp, #32]
sub r0, r0, r2 , lsl #1
sub r1, r1, r2, lsl #1
@@ -670,10 +679,10 @@
vmov q11, q10
- DIFF_CHROMA_EQ4_P0Q0 d0, d2, d4, d6, q4, q5, q6, d14, d0 // Cb::p0' q0'
- DIFF_CHROMA_EQ4_P0Q0 d1, d3, d5, d7, q12, q13, q14, d15, d1 // Cr::p0' q0'
+ DIFF_CHROMA_EQ4_P0Q0 d0, d2, d4, d6, q4, q5, q8, d30, d0 // Cb::p0' q0'
+ DIFF_CHROMA_EQ4_P0Q0 d1, d3, d5, d7, q12, q13, q14, d31, d1 // Cr::p0' q0'
- vbsl.u8 q10, q7, q1
+ vbsl.u8 q10, q15, q1
vst1.u8 {d20}, [r0], r2
vst1.u8 {d21}, [r1], r2
@@ -681,6 +690,7 @@
vst1.u8 {d22}, [r0]
vst1.u8 {d23}, [r1]
+ vpop {q4-q5}
WELS_ASM_FUNC_END
WELS_ASM_FUNC_BEGIN DeblockChromaLt4H_neon
@@ -692,7 +702,7 @@
vdup.u8 q9, r3
ldr r3, [sp, #4]
sub r1, r1, #2
- vld1.s8 {d15}, [r3]
+ vld1.s8 {d31}, [r3]
LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 0
LOAD_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 1
@@ -706,28 +716,28 @@
vswp d1, d2
vswp d6, d5
- vmovl.u8 q6, d15
- vshl.u64 d13,d12,#8
- vorr d12,d13
- vmov d13, d12
- veor q7, q7
- vsub.i8 q7,q7,q6
+ vmovl.u8 q14, d31
+ vshl.u64 d29,d28,#8
+ vorr d28,d29
+ vmov d29, d28
+ veor q15, q15
+ vsub.i8 q15,q15,q14
- MASK_MATRIX q0, q1, q2, q3, q11, q9, q5
+ MASK_MATRIX q0, q1, q2, q3, q11, q9, q10
- DIFF_LUMA_LT4_P0_Q0 d0, d2, d4, d6, d8, q12, q13
- DIFF_LUMA_LT4_P0_Q0 d1, d3, d5, d7, d9, q12, q13
- vmax.s8 q4, q4, q7
- vmin.s8 q4, q4, q6
+ DIFF_LUMA_LT4_P0_Q0 d0, d2, d4, d6, d16, q12, q13
+ DIFF_LUMA_LT4_P0_Q0 d1, d3, d5, d7, d17, q12, q13
+ vmax.s8 q8, q8, q15
+ vmin.s8 q8, q8, q14
- vand.s8 q4, q4, q5
- vcge.s8 q6, q6, #0
- vand.s8 q4, q4, q6
- EXTRACT_DELTA_INTO_TWO_PART q4, q5
- vqadd.u8 q1, q1, q5
- vqsub.u8 q1, q1, q4
- vqsub.u8 q2, q2, q5
- vqadd.u8 q2, q2, q4
+ vand.s8 q8, q8, q10
+ vcge.s8 q14, q14, #0
+ vand.s8 q8, q8, q14
+ EXTRACT_DELTA_INTO_TWO_PART q8, q10
+ vqadd.u8 q1, q1, q10
+ vqsub.u8 q1, q1, q8
+ vqsub.u8 q2, q2, q10
+ vqadd.u8 q2, q2, q8
sub r0, r0, r2, lsl #3
sub r1, r1, r2, lsl #3
@@ -747,8 +757,9 @@
WELS_ASM_FUNC_END
WELS_ASM_FUNC_BEGIN DeblockChromaEq4H_neon
+ vpush {q4-q5}
vdup.u8 q11, r3
- ldr r3, [sp, #0]
+ ldr r3, [sp, #32]
sub r0, r0, #2
sub r1, r1, #2
@@ -792,6 +803,7 @@
STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 6
STORE_CHROMA_DATA_4 d0, d1, d2, d3, d4, d5, d6, d7, 7
+ vpop {q4-q5}
WELS_ASM_FUNC_END
--- a/codec/common/mc_neon.S
+++ b/codec/common/mc_neon.S
@@ -271,13 +271,13 @@
vext.8 q2, q0, q1, #1 //q2=src[-1]
vext.8 q3, q0, q1, #2 //q3=src[0]
- vext.8 q4, q0, q1, #3 //q4=src[1]
- vext.8 q5, q0, q1, #4 //q5=src[2]
- vext.8 q6, q0, q1, #5 //q6=src[3]
+ vext.8 q8, q0, q1, #3 //q8=src[1]
+ vext.8 q9, q0, q1, #4 //q9=src[2]
+ vext.8 q10, q0, q1, #5 //q10=src[3]
- FILTER_6TAG_8BITS d0, d4, d6, d8, d10, d12, d2, q14, q15
+ FILTER_6TAG_8BITS d0, d4, d6, d16, d18, d20, d2, q14, q15
- FILTER_6TAG_8BITS d1, d5, d7, d9, d11, d13, d3, q14, q15
+ FILTER_6TAG_8BITS d1, d5, d7, d17, d19, d21, d3, q14, q15
sub r4, #1
vst1.u8 {d2, d3}, [r2], r3 //write 16Byte
@@ -334,9 +334,9 @@
vext.8 d4, d0, d1, #1 //d4: 1st row src[-1:6]
vext.8 d5, d2, d3, #1 //d5: 2nd row src[-1:6]
vext.8 q3, q2, q2, #1 //src[0:6 *]
- vext.8 q4, q2, q2, #2 //src[1:6 * *]
+ vext.8 q8, q2, q2, #2 //src[1:6 * *]
- vtrn.32 q3, q4 //q3::d6:1st row [0:3]+[1:4]; d7:2nd row [0:3]+[1:4]
+ vtrn.32 q3, q8 //q3::d6:1st row [0:3]+[1:4]; d7:2nd row [0:3]+[1:4]
vtrn.32 d6, d7 //d6:[0:3]; d7[1:4]
vtrn.32 d0, d2 //d0:[-2:1]; d2[2:5]
vtrn.32 d4, d5 //d4:[-1:2]; d5[3:6]
@@ -370,13 +370,13 @@
vext.8 q2, q0, q1, #1 //q2=src[-1]
vext.8 q3, q0, q1, #2 //q3=src[0]
- vext.8 q4, q0, q1, #3 //q4=src[1]
- vext.8 q5, q0, q1, #4 //q5=src[2]
- vext.8 q6, q0, q1, #5 //q6=src[3]
+ vext.8 q8, q0, q1, #3 //q8=src[1]
+ vext.8 q9, q0, q1, #4 //q9=src[2]
+ vext.8 q10, q0, q1, #5 //q10=src[3]
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d4, d6, d8, d10, d12, d2, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d4, d6, d16, d18, d20, d2, q14, q15
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d5, d7, d9, d11, d13, d3, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d5, d7, d17, d19, d21, d3, q14, q15
sub r4, #1
vst1.u8 {d2, d3}, [r2], r3 //write 16Byte
@@ -433,9 +433,9 @@
vext.8 d4, d0, d1, #1 //d4: 1st row src[-1:6]
vext.8 d5, d2, d3, #1 //d5: 2nd row src[-1:6]
vext.8 q3, q2, q2, #1 //src[0:6 *]
- vext.8 q4, q2, q2, #2 //src[1:6 * *]
+ vext.8 q8, q2, q2, #2 //src[1:6 * *]
- vtrn.32 q3, q4 //q3::d6:1st row [0:3]+[1:4]; d7:2nd row [0:3]+[1:4]
+ vtrn.32 q3, q8 //q3::d6:1st row [0:3]+[1:4]; d7:2nd row [0:3]+[1:4]
vtrn.32 d6, d7 //d6:[0:3]; d7[1:4]
vtrn.32 d0, d2 //d0:[-2:1]; d2[2:5]
vtrn.32 d4, d5 //d4:[-1:2]; d5[3:6]
@@ -469,13 +469,13 @@
vext.8 q2, q0, q1, #1 //q2=src[-1]
vext.8 q3, q0, q1, #2 //q3=src[0]
- vext.8 q4, q0, q1, #3 //q4=src[1]
- vext.8 q5, q0, q1, #4 //q5=src[2]
- vext.8 q6, q0, q1, #5 //q6=src[3]
+ vext.8 q8, q0, q1, #3 //q8=src[1]
+ vext.8 q9, q0, q1, #4 //q9=src[2]
+ vext.8 q10, q0, q1, #5 //q10=src[3]
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d4, d6, d8, d10, d12, d2, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d4, d6, d16, d18, d20, d2, q14, q15
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d5, d7, d9, d11, d13, d3, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d5, d7, d17, d19, d21, d3, q14, q15
sub r4, #1
vst1.u8 {d2, d3}, [r2], r3 //write 16Byte
@@ -532,9 +532,9 @@
vext.8 d4, d0, d1, #1 //d4: 1st row src[-1:6]
vext.8 d5, d2, d3, #1 //d5: 2nd row src[-1:6]
vext.8 q3, q2, q2, #1 //src[0:6 *]
- vext.8 q4, q2, q2, #2 //src[1:6 * *]
+ vext.8 q8, q2, q2, #2 //src[1:6 * *]
- vtrn.32 q3, q4 //q3::d6:1st row [0:3]+[1:4]; d7:2nd row [0:3]+[1:4]
+ vtrn.32 q3, q8 //q3::d6:1st row [0:3]+[1:4]; d7:2nd row [0:3]+[1:4]
vtrn.32 d6, d7 //d6:[0:3]; d7[1:4]
vtrn.32 d0, d2 //d0:[-2:1]; d2[2:5]
vtrn.32 d4, d5 //d4:[-1:2]; d5[3:6]
@@ -569,64 +569,64 @@
vshr.u16 q15, q14, #2 // 5
vld1.u8 {q2}, [r0], r1 //q2=src[0]
vld1.u8 {q3}, [r0], r1 //q3=src[1]
- vld1.u8 {q4}, [r0], r1 //q4=src[2]
+ vld1.u8 {q8}, [r0], r1 //q8=src[2]
w16_xy_01_luma_loop:
- vld1.u8 {q5}, [r0], r1 //q5=src[3]
+ vld1.u8 {q9}, [r0], r1 //q9=src[3]
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d2, d4, d6, d8, d10, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d2, d4, d6, d16, d18, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d3, d5, d7, d9, d11, d13, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d3, d5, d7, d17, d19, d21, q14, q15
vld1.u8 {q0}, [r0], r1 //read 2nd row
- vst1.u8 {q6}, [r2], r3 //write 1st 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 1st 16Byte
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d4, d6, d8, d10, d0, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d4, d6, d16, d18, d0, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d3, d5, d7, d9, d11, d1, d13, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d3, d5, d7, d17, d19, d1, d21, q14, q15
vld1.u8 {q1}, [r0], r1 //read 3rd row
- vst1.u8 {q6}, [r2], r3 //write 2nd 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 2nd 16Byte
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d4, d6, d8, d10, d0, d2, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d4, d6, d16, d18, d0, d2, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d5, d7, d9, d11, d1, d3, d13, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d5, d7, d17, d19, d1, d3, d21, q14, q15
vld1.u8 {q2}, [r0], r1 //read 4th row
- vst1.u8 {q6}, [r2], r3 //write 3rd 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 3rd 16Byte
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d6, d8, d10, d0, d2, d4, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d6, d16, d18, d0, d2, d4, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d7, d9, d11, d1, d3, d5, d13, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d7, d17, d19, d1, d3, d5, d21, q14, q15
vld1.u8 {q3}, [r0], r1 //read 5th row
- vst1.u8 {q6}, [r2], r3 //write 4th 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 4th 16Byte
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d8, d10, d0, d2, d4, d6, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d16, d18, d0, d2, d4, d6, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d9, d11, d1, d3, d5, d7, d13, q14, q15
- vld1.u8 {q4}, [r0], r1 //read 6th row
- vst1.u8 {q6}, [r2], r3 //write 5th 16Byte
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d17, d19, d1, d3, d5, d7, d21, q14, q15
+ vld1.u8 {q8}, [r0], r1 //read 6th row
+ vst1.u8 {q10}, [r2], r3 //write 5th 16Byte
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d10, d0, d2, d4, d6, d8, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d18, d0, d2, d4, d6, d16, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d11, d1, d3, d5, d7, d9, d13, q14, q15
- vld1.u8 {q5}, [r0], r1 //read 7th row
- vst1.u8 {q6}, [r2], r3 //write 6th 16Byte
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d19, d1, d3, d5, d7, d17, d21, q14, q15
+ vld1.u8 {q9}, [r0], r1 //read 7th row
+ vst1.u8 {q10}, [r2], r3 //write 6th 16Byte
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d2, d4, d6, d8, d10, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d2, d4, d6, d16, d18, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d3, d5, d7, d9, d11, d13, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d3, d5, d7, d17, d19, d21, q14, q15
vld1.u8 {q0}, [r0], r1 //read 8th row
- vst1.u8 {q6}, [r2], r3 //write 7th 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 7th 16Byte
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d4, d6, d8, d10, d0, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d4, d6, d16, d18, d0, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d3, d5, d7, d9, d11, d1, d13, q14, q15
- vst1.u8 {q6}, [r2], r3 //write 8th 16Byte
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d3, d5, d7, d17, d19, d1, d21, q14, q15
+ vst1.u8 {q10}, [r2], r3 //write 8th 16Byte
//q2, q3, q4, q5, q0 --> q0~q4
- vswp q0, q4
+ vswp q0, q8
vswp q0, q2
vmov q1, q3
- vmov q3, q5 //q0~q4
+ vmov q3, q9 //q0~q4
sub r4, #8
cmp r4, #0
@@ -658,24 +658,24 @@
w8_xy_01_mc_luma_loop:
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d1, d2, d3, d4, d5, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d1, d2, d3, d4, d5, d16, q14, q15
vld1.u8 {d0}, [r0], r1 //read 2nd row
- vst1.u8 {d12}, [r2], r3 //write 1st 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 1st 8Byte
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d2, d3, d4, d5, d0, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d1, d2, d3, d4, d5, d0, d16, q14, q15
vld1.u8 {d1}, [r0], r1 //read 3rd row
- vst1.u8 {d12}, [r2], r3 //write 2nd 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 2nd 8Byte
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d3, d4, d5, d0, d1, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d3, d4, d5, d0, d1, d16, q14, q15
vld1.u8 {d2}, [r0], r1 //read 4th row
- vst1.u8 {d12}, [r2], r3 //write 3rd 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 3rd 8Byte
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d3, d4, d5, d0, d1, d2, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d3, d4, d5, d0, d1, d2, d16, q14, q15
vld1.u8 {d3}, [r0], r1 //read 5th row
- vst1.u8 {d12}, [r2], r3 //write 4th 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 4th 8Byte
//d4, d5, d0, d1, d2, d3 --> d0, d1, d2, d3, d4, d5
vswp q0, q2
@@ -721,8 +721,8 @@
vmov d4, r4, r5
vmov d5, r5, r6 //reserved r6
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d1, d2, d3, d4, d5, d12, q14, q15
- vmov r4, r5, d12
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d0, d1, d2, d3, d4, d5, d16, q14, q15
+ vmov r4, r5, d16
str r4, [r2], r3 //write 1st 4Byte
str r5, [r2], r3 //write 2nd 4Byte
@@ -731,8 +731,8 @@
vmov d0, r6, r5
vmov d1, r5, r4 //reserved r4
- FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d3, d4, d5, d0, d1, d12, q14, q15
- vmov r5, r6, d12
+ FILTER_6TAG_8BITS_AVERAGE_WITH_0 d2, d3, d4, d5, d0, d1, d16, q14, q15
+ vmov r5, r6, d16
str r5, [r2], r3 //write 3rd 4Byte
str r6, [r2], r3 //write 4th 4Byte
@@ -764,64 +764,64 @@
vshr.u16 q15, q14, #2 // 5
vld1.u8 {q2}, [r0], r1 //q2=src[0]
vld1.u8 {q3}, [r0], r1 //q3=src[1]
- vld1.u8 {q4}, [r0], r1 //q4=src[2]
+ vld1.u8 {q8}, [r0], r1 //q8=src[2]
w16_xy_03_luma_loop:
- vld1.u8 {q5}, [r0], r1 //q5=src[3]
+ vld1.u8 {q9}, [r0], r1 //q9=src[3]
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d2, d4, d6, d8, d10, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d2, d4, d6, d16, d18, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d3, d5, d7, d9, d11, d13, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d3, d5, d7, d17, d19, d21, q14, q15
vld1.u8 {q0}, [r0], r1 //read 2nd row
- vst1.u8 {q6}, [r2], r3 //write 1st 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 1st 16Byte
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d4, d6, d8, d10, d0, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d4, d6, d16, d18, d0, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d3, d5, d7, d9, d11, d1, d13, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d3, d5, d7, d17, d19, d1, d21, q14, q15
vld1.u8 {q1}, [r0], r1 //read 3rd row
- vst1.u8 {q6}, [r2], r3 //write 2nd 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 2nd 16Byte
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d4, d6, d8, d10, d0, d2, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d4, d6, d16, d18, d0, d2, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d5, d7, d9, d11, d1, d3, d13, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d5, d7, d17, d19, d1, d3, d21, q14, q15
vld1.u8 {q2}, [r0], r1 //read 4th row
- vst1.u8 {q6}, [r2], r3 //write 3rd 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 3rd 16Byte
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d6, d8, d10, d0, d2, d4, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d6, d16, d18, d0, d2, d4, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d7, d9, d11, d1, d3, d5, d13, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d7, d17, d19, d1, d3, d5, d21, q14, q15
vld1.u8 {q3}, [r0], r1 //read 5th row
- vst1.u8 {q6}, [r2], r3 //write 4th 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 4th 16Byte
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d8, d10, d0, d2, d4, d6, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d16, d18, d0, d2, d4, d6, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d9, d11, d1, d3, d5, d7, d13, q14, q15
- vld1.u8 {q4}, [r0], r1 //read 6th row
- vst1.u8 {q6}, [r2], r3 //write 5th 16Byte
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d17, d19, d1, d3, d5, d7, d21, q14, q15
+ vld1.u8 {q8}, [r0], r1 //read 6th row
+ vst1.u8 {q10}, [r2], r3 //write 5th 16Byte
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d10, d0, d2, d4, d6, d8, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d18, d0, d2, d4, d6, d16, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d11, d1, d3, d5, d7, d9, d13, q14, q15
- vld1.u8 {q5}, [r0], r1 //read 7th row
- vst1.u8 {q6}, [r2], r3 //write 6th 16Byte
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d19, d1, d3, d5, d7, d17, d21, q14, q15
+ vld1.u8 {q9}, [r0], r1 //read 7th row
+ vst1.u8 {q10}, [r2], r3 //write 6th 16Byte
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d2, d4, d6, d8, d10, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d2, d4, d6, d16, d18, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d3, d5, d7, d9, d11, d13, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d3, d5, d7, d17, d19, d21, q14, q15
vld1.u8 {q0}, [r0], r1 //read 8th row
- vst1.u8 {q6}, [r2], r3 //write 7th 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 7th 16Byte
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d4, d6, d8, d10, d0, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d4, d6, d16, d18, d0, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d3, d5, d7, d9, d11, d1, d13, q14, q15
- vst1.u8 {q6}, [r2], r3 //write 8th 16Byte
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d3, d5, d7, d17, d19, d1, d21, q14, q15
+ vst1.u8 {q10}, [r2], r3 //write 8th 16Byte
- //q2, q3, q4, q5, q0 --> q0~q4
- vswp q0, q4
+ //q2, q3, q8, q9, q0 --> q0~q8
+ vswp q0, q8
vswp q0, q2
vmov q1, q3
- vmov q3, q5 //q0~q4
+ vmov q3, q9 //q0~q8
sub r4, #8
cmp r4, #0
@@ -853,24 +853,24 @@
w8_xy_03_mc_luma_loop:
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d1, d2, d3, d4, d5, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d1, d2, d3, d4, d5, d16, q14, q15
vld1.u8 {d0}, [r0], r1 //read 2nd row
- vst1.u8 {d12}, [r2], r3 //write 1st 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 1st 8Byte
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d2, d3, d4, d5, d0, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d1, d2, d3, d4, d5, d0, d16, q14, q15
vld1.u8 {d1}, [r0], r1 //read 3rd row
- vst1.u8 {d12}, [r2], r3 //write 2nd 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 2nd 8Byte
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d3, d4, d5, d0, d1, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d3, d4, d5, d0, d1, d16, q14, q15
vld1.u8 {d2}, [r0], r1 //read 4th row
- vst1.u8 {d12}, [r2], r3 //write 3rd 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 3rd 8Byte
pld [r0]
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d3, d4, d5, d0, d1, d2, d12, q14, q15
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d3, d4, d5, d0, d1, d2, d16, q14, q15
vld1.u8 {d3}, [r0], r1 //read 5th row
- vst1.u8 {d12}, [r2], r3 //write 4th 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 4th 8Byte
//d4, d5, d0, d1, d2, d3 --> d0, d1, d2, d3, d4, d5
vswp q0, q2
@@ -916,8 +916,8 @@
vmov d4, r4, r5
vmov d5, r5, r6 //reserved r6
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d1, d2, d3, d4, d5, d12, q14, q15
- vmov r4, r5, d12
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d0, d1, d2, d3, d4, d5, d16, q14, q15
+ vmov r4, r5, d16
str r4, [r2], r3 //write 1st 4Byte
str r5, [r2], r3 //write 2nd 4Byte
@@ -926,8 +926,8 @@
vmov d0, r6, r5
vmov d1, r5, r4 //reserved r4
- FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d3, d4, d5, d0, d1, d12, q14, q15
- vmov r5, r6, d12
+ FILTER_6TAG_8BITS_AVERAGE_WITH_1 d2, d3, d4, d5, d0, d1, d16, q14, q15
+ vmov r5, r6, d16
str r5, [r2], r3 //write 3rd 4Byte
str r6, [r2], r3 //write 4th 4Byte
@@ -959,64 +959,64 @@
vshr.u16 q15, q14, #2 // 5
vld1.u8 {q2}, [r0], r1 //q2=src[0]
vld1.u8 {q3}, [r0], r1 //q3=src[1]
- vld1.u8 {q4}, [r0], r1 //q4=src[2]
+ vld1.u8 {q8}, [r0], r1 //q8=src[2]
w16_v_mc_luma_loop:
- vld1.u8 {q5}, [r0], r1 //q5=src[3]
+ vld1.u8 {q9}, [r0], r1 //q9=src[3]
- FILTER_6TAG_8BITS d0, d2, d4, d6, d8, d10, d12, q14, q15
+ FILTER_6TAG_8BITS d0, d2, d4, d6, d16, d18, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d1, d3, d5, d7, d9, d11, d13, q14, q15
+ FILTER_6TAG_8BITS d1, d3, d5, d7, d17, d19, d21, q14, q15
vld1.u8 {q0}, [r0], r1 //read 2nd row
- vst1.u8 {q6}, [r2], r3 //write 1st 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 1st 16Byte
- FILTER_6TAG_8BITS d2, d4, d6, d8, d10, d0, d12, q14, q15
+ FILTER_6TAG_8BITS d2, d4, d6, d16, d18, d0, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d3, d5, d7, d9, d11, d1, d13, q14, q15
+ FILTER_6TAG_8BITS d3, d5, d7, d17, d19, d1, d21, q14, q15
vld1.u8 {q1}, [r0], r1 //read 3rd row
- vst1.u8 {q6}, [r2], r3 //write 2nd 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 2nd 16Byte
- FILTER_6TAG_8BITS d4, d6, d8, d10, d0, d2, d12, q14, q15
+ FILTER_6TAG_8BITS d4, d6, d16, d18, d0, d2, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d5, d7, d9, d11, d1, d3, d13, q14, q15
+ FILTER_6TAG_8BITS d5, d7, d17, d19, d1, d3, d21, q14, q15
vld1.u8 {q2}, [r0], r1 //read 4th row
- vst1.u8 {q6}, [r2], r3 //write 3rd 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 3rd 16Byte
- FILTER_6TAG_8BITS d6, d8, d10, d0, d2, d4, d12, q14, q15
+ FILTER_6TAG_8BITS d6, d16, d18, d0, d2, d4, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d7, d9, d11, d1, d3, d5, d13, q14, q15
+ FILTER_6TAG_8BITS d7, d17, d19, d1, d3, d5, d21, q14, q15
vld1.u8 {q3}, [r0], r1 //read 5th row
- vst1.u8 {q6}, [r2], r3 //write 4th 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 4th 16Byte
- FILTER_6TAG_8BITS d8, d10, d0, d2, d4, d6, d12, q14, q15
+ FILTER_6TAG_8BITS d16, d18, d0, d2, d4, d6, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d9, d11, d1, d3, d5, d7, d13, q14, q15
- vld1.u8 {q4}, [r0], r1 //read 6th row
- vst1.u8 {q6}, [r2], r3 //write 5th 16Byte
+ FILTER_6TAG_8BITS d17, d19, d1, d3, d5, d7, d21, q14, q15
+ vld1.u8 {q8}, [r0], r1 //read 6th row
+ vst1.u8 {q10}, [r2], r3 //write 5th 16Byte
- FILTER_6TAG_8BITS d10, d0, d2, d4, d6, d8, d12, q14, q15
+ FILTER_6TAG_8BITS d18, d0, d2, d4, d6, d16, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d11, d1, d3, d5, d7, d9, d13, q14, q15
- vld1.u8 {q5}, [r0], r1 //read 7th row
- vst1.u8 {q6}, [r2], r3 //write 6th 16Byte
+ FILTER_6TAG_8BITS d19, d1, d3, d5, d7, d17, d21, q14, q15
+ vld1.u8 {q9}, [r0], r1 //read 7th row
+ vst1.u8 {q10}, [r2], r3 //write 6th 16Byte
- FILTER_6TAG_8BITS d0, d2, d4, d6, d8, d10, d12, q14, q15
+ FILTER_6TAG_8BITS d0, d2, d4, d6, d16, d18, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d1, d3, d5, d7, d9, d11, d13, q14, q15
+ FILTER_6TAG_8BITS d1, d3, d5, d7, d17, d19, d21, q14, q15
vld1.u8 {q0}, [r0], r1 //read 8th row
- vst1.u8 {q6}, [r2], r3 //write 7th 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 7th 16Byte
- FILTER_6TAG_8BITS d2, d4, d6, d8, d10, d0, d12, q14, q15
+ FILTER_6TAG_8BITS d2, d4, d6, d16, d18, d0, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d3, d5, d7, d9, d11, d1, d13, q14, q15
- vst1.u8 {q6}, [r2], r3 //write 8th 16Byte
+ FILTER_6TAG_8BITS d3, d5, d7, d17, d19, d1, d21, q14, q15
+ vst1.u8 {q10}, [r2], r3 //write 8th 16Byte
- //q2, q3, q4, q5, q0 --> q0~q4
- vswp q0, q4
+ //q2, q3, q8, q9, q0 --> q0~q8
+ vswp q0, q8
vswp q0, q2
vmov q1, q3
- vmov q3, q5 //q0~q4
+ vmov q3, q9 //q0~q8
sub r4, #8
cmp r4, #0
@@ -1048,24 +1048,24 @@
w8_v_mc_luma_loop:
pld [r0]
- FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d12, q14, q15
+ FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d16, q14, q15
vld1.u8 {d0}, [r0], r1 //read 2nd row
- vst1.u8 {d12}, [r2], r3 //write 1st 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 1st 8Byte
pld [r0]
- FILTER_6TAG_8BITS d1, d2, d3, d4, d5, d0, d12, q14, q15
+ FILTER_6TAG_8BITS d1, d2, d3, d4, d5, d0, d16, q14, q15
vld1.u8 {d1}, [r0], r1 //read 3rd row
- vst1.u8 {d12}, [r2], r3 //write 2nd 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 2nd 8Byte
pld [r0]
- FILTER_6TAG_8BITS d2, d3, d4, d5, d0, d1, d12, q14, q15
+ FILTER_6TAG_8BITS d2, d3, d4, d5, d0, d1, d16, q14, q15
vld1.u8 {d2}, [r0], r1 //read 4th row
- vst1.u8 {d12}, [r2], r3 //write 3rd 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 3rd 8Byte
pld [r0]
- FILTER_6TAG_8BITS d3, d4, d5, d0, d1, d2, d12, q14, q15
+ FILTER_6TAG_8BITS d3, d4, d5, d0, d1, d2, d16, q14, q15
vld1.u8 {d3}, [r0], r1 //read 5th row
- vst1.u8 {d12}, [r2], r3 //write 4th 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 4th 8Byte
//d4, d5, d0, d1, d2, d3 --> d0, d1, d2, d3, d4, d5
vswp q0, q2
@@ -1111,8 +1111,8 @@
vmov d4, r4, r5
vmov d5, r5, r6 //reserved r6
- FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d12, q14, q15
- vmov r4, r5, d12
+ FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d16, q14, q15
+ vmov r4, r5, d16
str r4, [r2], r3 //write 1st 4Byte
str r5, [r2], r3 //write 2nd 4Byte
@@ -1121,8 +1121,8 @@
vmov d0, r6, r5
vmov d1, r5, r4 //reserved r4
- FILTER_6TAG_8BITS d2, d3, d4, d5, d0, d1, d12, q14, q15
- vmov r5, r6, d12
+ FILTER_6TAG_8BITS d2, d3, d4, d5, d0, d1, d16, q14, q15
+ vmov r5, r6, d16
str r5, [r2], r3 //write 3rd 4Byte
str r6, [r2], r3 //write 4th 4Byte
@@ -1140,7 +1140,8 @@
WELS_ASM_FUNC_BEGIN McHorVer22WidthEq16_neon
push {r4}
- ldr r4, [sp, #4]
+ vpush {q4-q7}
+ ldr r4, [sp, #68]
sub r0, #2 //src[-2]
sub r0, r0, r1, lsl #1 //src[-2*src_stride-2]
@@ -1246,6 +1247,7 @@
sub r4, #4
cmp r4, #0
bne w16_hv_mc_luma_loop
+ vpop {q4-q7}
pop {r4}
WELS_ASM_FUNC_END
@@ -1252,7 +1254,8 @@
WELS_ASM_FUNC_BEGIN McHorVer22WidthEq8_neon
push {r4}
- ldr r4, [sp, #4]
+ vpush {q4}
+ ldr r4, [sp, #20]
sub r0, #2 //src[-2]
sub r0, r0, r1, lsl #1 //src[-2*src_stride-2]
@@ -1275,59 +1278,60 @@
w8_hv_mc_luma_loop:
- vld1.u8 {q5}, [r0], r1 //use 13(8+5), =src[3]
+ vld1.u8 {q8}, [r0], r1 //use 13(8+5), =src[3]
//the 1st row
pld [r0]
- // vertical filtered into q6/q7
- FILTER_6TAG_8BITS_TO_16BITS d0, d2, d4, d6, d8, d10, q6, q14, q15 // 8 avail
- FILTER_6TAG_8BITS_TO_16BITS d1, d3, d5, d7, d9, d11, q7, q14, q15 // 5 avail
+ // vertical filtered into q9/q10
+ FILTER_6TAG_8BITS_TO_16BITS d0, d2, d4, d6, d8, d16, q9, q14, q15 // 8 avail
+ FILTER_6TAG_8BITS_TO_16BITS d1, d3, d5, d7, d9, d17, q10, q14, q15 // 5 avail
// horizon filtered
- UNPACK_2_16BITS_TO_ABC q6, q7, q11, q12, q13
- FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d12 //output to q6[0]
- vst1.u8 d12, [r2], r3 //write 8Byte
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
+ vst1.u8 d18, [r2], r3 //write 8Byte
vld1.u8 {q0}, [r0], r1 //read 2nd row
//the 2nd row
pld [r0]
- // vertical filtered into q6/q7
- FILTER_6TAG_8BITS_TO_16BITS d2, d4, d6, d8, d10, d0, q6, q14, q15 // 8 avail
- FILTER_6TAG_8BITS_TO_16BITS d3, d5, d7, d9, d11, d1, q7, q14, q15 // 5 avail
+ // vertical filtered into q9/q10
+ FILTER_6TAG_8BITS_TO_16BITS d2, d4, d6, d8, d16, d0, q9, q14, q15 // 8 avail
+ FILTER_6TAG_8BITS_TO_16BITS d3, d5, d7, d9, d17, d1, q10, q14, q15 // 5 avail
// horizon filtered
- UNPACK_2_16BITS_TO_ABC q6, q7, q11, q12, q13
- FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d12 //output to q6[0]
- vst1.u8 d12, [r2], r3 //write 8Byte
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
+ vst1.u8 d18, [r2], r3 //write 8Byte
vld1.u8 {q1}, [r0], r1 //read 3rd row
//the 3rd row
pld [r0]
- // vertical filtered into q6/q7
- FILTER_6TAG_8BITS_TO_16BITS d4, d6, d8, d10, d0, d2, q6, q14, q15 // 8 avail
- FILTER_6TAG_8BITS_TO_16BITS d5, d7, d9, d11, d1, d3, q7, q14, q15 // 5 avail
+ // vertical filtered into q9/q10
+ FILTER_6TAG_8BITS_TO_16BITS d4, d6, d8, d16, d0, d2, q9, q14, q15 // 8 avail
+ FILTER_6TAG_8BITS_TO_16BITS d5, d7, d9, d17, d1, d3, q10, q14, q15 // 5 avail
// horizon filtered
- UNPACK_2_16BITS_TO_ABC q6, q7, q11, q12, q13
- FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d12 //output to q6[0]
- vst1.u8 d12, [r2], r3 //write 8Byte
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
+ vst1.u8 d18, [r2], r3 //write 8Byte
vld1.u8 {q2}, [r0], r1 //read 4th row
//the 4th row
pld [r0]
- // vertical filtered into q6/q7
- FILTER_6TAG_8BITS_TO_16BITS d6, d8, d10, d0, d2, d4, q6, q14, q15 // 8 avail
- FILTER_6TAG_8BITS_TO_16BITS d7, d9, d11, d1, d3, d5, q7, q14, q15 // 5 avail
+ // vertical filtered into q9/q10
+ FILTER_6TAG_8BITS_TO_16BITS d6, d8, d16, d0, d2, d4, q9, q14, q15 // 8 avail
+ FILTER_6TAG_8BITS_TO_16BITS d7, d9, d17, d1, d3, d5, q10, q14, q15 // 5 avail
// horizon filtered
- UNPACK_2_16BITS_TO_ABC q6, q7, q11, q12, q13
- FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d12 //output to q6[0]
- vst1.u8 d12, [r2], r3 //write 8Byte
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
+ vst1.u8 d18, [r2], r3 //write 8Byte
//q4~q5, q0~q2, --> q0~q4
vswp q0, q4
vswp q2, q4
vmov q3, q1
- vmov q1, q5
+ vmov q1, q8
sub r4, #4
cmp r4, #0
bne w8_hv_mc_luma_loop
+ vpop {q4}
pop {r4}
WELS_ASM_FUNC_END
@@ -1334,7 +1338,8 @@
WELS_ASM_FUNC_BEGIN McHorVer22WidthEq4_neon
push {r4 ,r5, r6}
- ldr r6, [sp, #12]
+ vpush {q4-q7}
+ ldr r6, [sp, #76]
sub r0, #2 //src[-2]
sub r0, r0, r1, lsl #1 //src[-2*src_stride-2]
@@ -1417,6 +1422,7 @@
cmp r6, #0
bne w4_hv_mc_luma_loop
+ vpop {q4-q7}
pop {r4, r5, r6}
WELS_ASM_FUNC_END
@@ -1479,10 +1485,10 @@
vld1.u8 {q2}, [r2]!
vld1.u8 {q3}, [r3]!
- vld1.u8 {q4}, [r2]!
- vld1.u8 {q5}, [r3]!
- vld1.u8 {q6}, [r2]!
- vld1.u8 {q7}, [r3]!
+ vld1.u8 {q8}, [r2]!
+ vld1.u8 {q9}, [r3]!
+ vld1.u8 {q10}, [r2]!
+ vld1.u8 {q11}, [r3]!
AVERAGE_TWO_8BITS d0, d0, d2
AVERAGE_TWO_8BITS d1, d1, d3
@@ -1492,13 +1498,13 @@
AVERAGE_TWO_8BITS d5, d5, d7
vst1.u8 {q2}, [r0], r1
- AVERAGE_TWO_8BITS d8, d8, d10
- AVERAGE_TWO_8BITS d9, d9, d11
- vst1.u8 {q4}, [r0], r1
+ AVERAGE_TWO_8BITS d16, d16, d18
+ AVERAGE_TWO_8BITS d17, d17, d19
+ vst1.u8 {q8}, [r0], r1
- AVERAGE_TWO_8BITS d12, d12, d14
- AVERAGE_TWO_8BITS d13, d13, d15
- vst1.u8 {q6}, [r0], r1
+ AVERAGE_TWO_8BITS d20, d20, d22
+ AVERAGE_TWO_8BITS d21, d21, d23
+ vst1.u8 {q10}, [r0], r1
sub r4, #4
cmp r4, #0
@@ -1679,18 +1685,18 @@
vext.8 q2, q0, q1, #1 //q2=src[-1]
vext.8 q3, q0, q1, #2 //q3=src[0]
- vext.8 q4, q0, q1, #3 //q4=src[1]
- vext.8 q5, q0, q1, #4 //q5=src[2]
- vext.8 q6, q0, q1, #5 //q6=src[3]
+ vext.8 q8, q0, q1, #3 //q8=src[1]
+ vext.8 q9, q0, q1, #4 //q9=src[2]
+ vext.8 q10, q0, q1, #5 //q10=src[3]
- FILTER_6TAG_8BITS d0, d4, d6, d8, d10, d12, d14, q14, q15
+ FILTER_6TAG_8BITS d0, d4, d6, d16, d18, d20, d22, q14, q15
- FILTER_6TAG_8BITS d1, d5, d7, d9, d11, d13, d15, q14, q15
+ FILTER_6TAG_8BITS d1, d5, d7, d17, d19, d21, d23, q14, q15
- vst1.u8 {d14, d15}, [r2]! //write [0:15] Byte
+ vst1.u8 {d22, d23}, [r2]! //write [0:15] Byte
vsli.64 d2, d2, #8 // [0][1][2][3][4][5]XO-->O[0][1][2][3][4][5]X
- FILTER_SINGLE_TAG_8BITS d2, d3, d14, q7, q1
+ FILTER_SINGLE_TAG_8BITS d2, d3, d22, q11, q1
vst1.u8 {d2[0]}, [r2], r3 //write 16th Byte
@@ -1727,13 +1733,13 @@
vext.8 d5, d0, d1, #4 //d5=src[2]
vext.8 d6, d0, d1, #5 //d6=src[3]
- FILTER_6TAG_8BITS d0, d2, d3, d4, d5, d6, d8, q14, q15
+ FILTER_6TAG_8BITS d0, d2, d3, d4, d5, d6, d16, q14, q15
sub r4, #1
- vst1.u8 {d8}, [r2]! //write [0:7] Byte
+ vst1.u8 {d16}, [r2]! //write [0:7] Byte
vsli.64 d2, d1, #8 // [0][1][2][3][4][5]XO-->O[0][1][2][3][4][5]X
- FILTER_SINGLE_TAG_8BITS d2, d7, d14, q7, q1
+ FILTER_SINGLE_TAG_8BITS d2, d7, d18, q9, q1
vst1.u8 {d2[0]}, [r2], r3 //write 8th Byte
cmp r4, #0
@@ -1758,73 +1764,73 @@
vshr.u16 q15, q14, #2 // 5
vld1.u8 {q2}, [r0], r1 //q2=src[0]
vld1.u8 {q3}, [r0], r1 //q3=src[1]
- vld1.u8 {q4}, [r0], r1 //q4=src[2]
+ vld1.u8 {q8}, [r0], r1 //q8=src[2]
w17_v_mc_luma_loop:
- vld1.u8 {q5}, [r0], r1 //q5=src[3]
+ vld1.u8 {q9}, [r0], r1 //q9=src[3]
- FILTER_6TAG_8BITS d0, d2, d4, d6, d8, d10, d12, q14, q15
+ FILTER_6TAG_8BITS d0, d2, d4, d6, d16, d18, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d1, d3, d5, d7, d9, d11, d13, q14, q15
+ FILTER_6TAG_8BITS d1, d3, d5, d7, d17, d19, d21, q14, q15
vld1.u8 {q0}, [r0], r1 //read 2nd row
- vst1.u8 {q6}, [r2], r3 //write 1st 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 1st 16Byte
- FILTER_6TAG_8BITS d2, d4, d6, d8, d10, d0, d12, q14, q15
+ FILTER_6TAG_8BITS d2, d4, d6, d16, d18, d0, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d3, d5, d7, d9, d11, d1, d13, q14, q15
+ FILTER_6TAG_8BITS d3, d5, d7, d17, d19, d1, d21, q14, q15
vld1.u8 {q1}, [r0], r1 //read 3rd row
- vst1.u8 {q6}, [r2], r3 //write 2nd 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 2nd 16Byte
- FILTER_6TAG_8BITS d4, d6, d8, d10, d0, d2, d12, q14, q15
+ FILTER_6TAG_8BITS d4, d6, d16, d18, d0, d2, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d5, d7, d9, d11, d1, d3, d13, q14, q15
+ FILTER_6TAG_8BITS d5, d7, d17, d19, d1, d3, d21, q14, q15
vld1.u8 {q2}, [r0], r1 //read 4th row
- vst1.u8 {q6}, [r2], r3 //write 3rd 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 3rd 16Byte
- FILTER_6TAG_8BITS d6, d8, d10, d0, d2, d4, d12, q14, q15
+ FILTER_6TAG_8BITS d6, d16, d18, d0, d2, d4, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d7, d9, d11, d1, d3, d5, d13, q14, q15
+ FILTER_6TAG_8BITS d7, d17, d19, d1, d3, d5, d21, q14, q15
vld1.u8 {q3}, [r0], r1 //read 5th row
- vst1.u8 {q6}, [r2], r3 //write 4th 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 4th 16Byte
- FILTER_6TAG_8BITS d8, d10, d0, d2, d4, d6, d12, q14, q15
+ FILTER_6TAG_8BITS d16, d18, d0, d2, d4, d6, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d9, d11, d1, d3, d5, d7, d13, q14, q15
- vld1.u8 {q4}, [r0], r1 //read 6th row
- vst1.u8 {q6}, [r2], r3 //write 5th 16Byte
+ FILTER_6TAG_8BITS d17, d19, d1, d3, d5, d7, d21, q14, q15
+ vld1.u8 {q8}, [r0], r1 //read 6th row
+ vst1.u8 {q10}, [r2], r3 //write 5th 16Byte
- FILTER_6TAG_8BITS d10, d0, d2, d4, d6, d8, d12, q14, q15
+ FILTER_6TAG_8BITS d18, d0, d2, d4, d6, d16, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d11, d1, d3, d5, d7, d9, d13, q14, q15
- vld1.u8 {q5}, [r0], r1 //read 7th row
- vst1.u8 {q6}, [r2], r3 //write 6th 16Byte
+ FILTER_6TAG_8BITS d19, d1, d3, d5, d7, d17, d21, q14, q15
+ vld1.u8 {q9}, [r0], r1 //read 7th row
+ vst1.u8 {q10}, [r2], r3 //write 6th 16Byte
- FILTER_6TAG_8BITS d0, d2, d4, d6, d8, d10, d12, q14, q15
+ FILTER_6TAG_8BITS d0, d2, d4, d6, d16, d18, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d1, d3, d5, d7, d9, d11, d13, q14, q15
+ FILTER_6TAG_8BITS d1, d3, d5, d7, d17, d19, d21, q14, q15
vld1.u8 {q0}, [r0], r1 //read 8th row
- vst1.u8 {q6}, [r2], r3 //write 7th 16Byte
+ vst1.u8 {q10}, [r2], r3 //write 7th 16Byte
- FILTER_6TAG_8BITS d2, d4, d6, d8, d10, d0, d12, q14, q15
+ FILTER_6TAG_8BITS d2, d4, d6, d16, d18, d0, d20, q14, q15
pld [r0]
- FILTER_6TAG_8BITS d3, d5, d7, d9, d11, d1, d13, q14, q15
- vst1.u8 {q6}, [r2], r3 //write 8th 16Byte
+ FILTER_6TAG_8BITS d3, d5, d7, d17, d19, d1, d21, q14, q15
+ vst1.u8 {q10}, [r2], r3 //write 8th 16Byte
- //q2, q3, q4, q5, q0 --> q0~q4
- vswp q0, q4
+ //q2, q3, q8, q9, q0 --> q0~q8
+ vswp q0, q8
vswp q0, q2
vmov q1, q3
- vmov q3, q5 //q0~q4
+ vmov q3, q9 //q0~q8
sub r4, #8
cmp r4, #1
bne w17_v_mc_luma_loop
// the last 16Bytes
- vld1.u8 {q5}, [r0], r1 //q5=src[3]
- FILTER_6TAG_8BITS d0, d2, d4, d6, d8, d10, d12, q14, q15
- FILTER_6TAG_8BITS d1, d3, d5, d7, d9, d11, d13, q14, q15
- vst1.u8 {q6}, [r2], r3 //write 1st 16Byte
+ vld1.u8 {q9}, [r0], r1 //q9=src[3]
+ FILTER_6TAG_8BITS d0, d2, d4, d6, d16, d18, d20, q14, q15
+ FILTER_6TAG_8BITS d1, d3, d5, d7, d17, d19, d21, q14, q15
+ vst1.u8 {q10}, [r2], r3 //write 1st 16Byte
pop {r4}
WELS_ASM_FUNC_END
@@ -1853,24 +1859,24 @@
w9_v_mc_luma_loop:
pld [r0]
- FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d12, q14, q15
+ FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d16, q14, q15
vld1.u8 {d0}, [r0], r1 //read 2nd row
- vst1.u8 {d12}, [r2], r3 //write 1st 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 1st 8Byte
pld [r0]
- FILTER_6TAG_8BITS d1, d2, d3, d4, d5, d0, d12, q14, q15
+ FILTER_6TAG_8BITS d1, d2, d3, d4, d5, d0, d16, q14, q15
vld1.u8 {d1}, [r0], r1 //read 3rd row
- vst1.u8 {d12}, [r2], r3 //write 2nd 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 2nd 8Byte
pld [r0]
- FILTER_6TAG_8BITS d2, d3, d4, d5, d0, d1, d12, q14, q15
+ FILTER_6TAG_8BITS d2, d3, d4, d5, d0, d1, d16, q14, q15
vld1.u8 {d2}, [r0], r1 //read 4th row
- vst1.u8 {d12}, [r2], r3 //write 3rd 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 3rd 8Byte
pld [r0]
- FILTER_6TAG_8BITS d3, d4, d5, d0, d1, d2, d12, q14, q15
+ FILTER_6TAG_8BITS d3, d4, d5, d0, d1, d2, d16, q14, q15
vld1.u8 {d3}, [r0], r1 //read 5th row
- vst1.u8 {d12}, [r2], r3 //write 4th 8Byte
+ vst1.u8 {d16}, [r2], r3 //write 4th 8Byte
//d4, d5, d0, d1, d2, d3 --> d0, d1, d2, d3, d4, d5
vswp q0, q2
@@ -1880,8 +1886,8 @@
cmp r4, #1
bne w9_v_mc_luma_loop
- FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d12, q14, q15
- vst1.u8 {d12}, [r2], r3 //write last 8Byte
+ FILTER_6TAG_8BITS d0, d1, d2, d3, d4, d5, d16, q14, q15
+ vst1.u8 {d16}, [r2], r3 //write last 8Byte
pop {r4}
WELS_ASM_FUNC_END
@@ -1889,7 +1895,8 @@
WELS_ASM_FUNC_BEGIN McHorVer22Width17_neon
push {r4}
- ldr r4, [sp, #4]
+ vpush {q4-q7}
+ ldr r4, [sp, #68]
sub r0, #2 //src[-2]
sub r0, r0, r1, lsl #1 //src[-2*src_stride-2]
@@ -2016,6 +2023,7 @@
UNPACK_1_IN_8x16BITS_TO_8BITS d2, d22, d23, q11 //output to d2[0]
vst1.u8 {d2[0]}, [r2], r3 //write 16th Byte
+ vpop {q4-q7}
pop {r4}
WELS_ASM_FUNC_END
@@ -2022,7 +2030,8 @@
WELS_ASM_FUNC_BEGIN McHorVer22Width9_neon
push {r4}
- ldr r4, [sp, #4]
+ vpush {q4}
+ ldr r4, [sp, #20]
sub r0, #2 //src[-2]
sub r0, r0, r1, lsl #1 //src[-2*src_stride-2]
@@ -2046,78 +2055,79 @@
w9_hv_mc_luma_loop:
- vld1.u8 {q5}, [r0], r1 //use 14(9+5), =src[3]
+ vld1.u8 {q8}, [r0], r1 //use 14(9+5), =src[3]
//the 1st row
pld [r0]
- // vertical filtered into q6/q7
- FILTER_6TAG_8BITS_TO_16BITS d0, d2, d4, d6, d8, d10, q6, q14, q15 // 8 avail
- FILTER_6TAG_8BITS_TO_16BITS d1, d3, d5, d7, d9, d11, q7, q14, q15 // 6 avail
+ // vertical filtered into q9/q10
+ FILTER_6TAG_8BITS_TO_16BITS d0, d2, d4, d6, d8, d16, q9, q14, q15 // 8 avail
+ FILTER_6TAG_8BITS_TO_16BITS d1, d3, d5, d7, d9, d17, q10, q14, q15 // 6 avail
// horizon filtered
- UNPACK_2_16BITS_TO_ABC q6, q7, q11, q12, q13
- FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d12 //output to q6[0]
- vst1.u8 d12, [r2]! //write 8Byte
- UNPACK_1_IN_8x16BITS_TO_8BITS d13, d14, d15, q7 //output to d13[0]
- vst1.u8 {d13[0]}, [r2], r3 //write 8th Byte
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
+ vst1.u8 d18, [r2]! //write 8Byte
+ UNPACK_1_IN_8x16BITS_TO_8BITS d19, d20, d21, q10 //output to d19[0]
+ vst1.u8 {d19[0]}, [r2], r3 //write 8th Byte
vld1.u8 {q0}, [r0], r1 //read 2nd row
//the 2nd row
pld [r0]
- // vertical filtered into q6/q7
- FILTER_6TAG_8BITS_TO_16BITS d2, d4, d6, d8, d10, d0, q6, q14, q15 // 8 avail
- FILTER_6TAG_8BITS_TO_16BITS d3, d5, d7, d9, d11, d1, q7, q14, q15 // 6 avail
+ // vertical filtered into q9/q10
+ FILTER_6TAG_8BITS_TO_16BITS d2, d4, d6, d8, d16, d0, q9, q14, q15 // 8 avail
+ FILTER_6TAG_8BITS_TO_16BITS d3, d5, d7, d9, d17, d1, q10, q14, q15 // 6 avail
// horizon filtered
- UNPACK_2_16BITS_TO_ABC q6, q7, q11, q12, q13
- FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d12 //output to q6[0]
- vst1.u8 d12, [r2]! //write 8Byte
- UNPACK_1_IN_8x16BITS_TO_8BITS d13, d14, d15, q7 //output to d13[0]
- vst1.u8 {d13[0]}, [r2], r3 //write 8th Byte
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
+ vst1.u8 d18, [r2]! //write 8Byte
+ UNPACK_1_IN_8x16BITS_TO_8BITS d19, d20, d21, q10 //output to d19[0]
+ vst1.u8 {d19[0]}, [r2], r3 //write 8th Byte
vld1.u8 {q1}, [r0], r1 //read 3rd row
//the 3rd row
pld [r0]
- // vertical filtered into q6/q7
- FILTER_6TAG_8BITS_TO_16BITS d4, d6, d8, d10, d0, d2, q6, q14, q15 // 8 avail
- FILTER_6TAG_8BITS_TO_16BITS d5, d7, d9, d11, d1, d3, q7, q14, q15 // 6 avail
+ // vertical filtered into q9/q10
+ FILTER_6TAG_8BITS_TO_16BITS d4, d6, d8, d16, d0, d2, q9, q14, q15 // 8 avail
+ FILTER_6TAG_8BITS_TO_16BITS d5, d7, d9, d17, d1, d3, q10, q14, q15 // 6 avail
// horizon filtered
- UNPACK_2_16BITS_TO_ABC q6, q7, q11, q12, q13
- FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d12 //output to q6[0]
- vst1.u8 d12, [r2]! //write 8Byte
- UNPACK_1_IN_8x16BITS_TO_8BITS d13, d14, d15, q7 //output to d13[0]
- vst1.u8 {d13[0]}, [r2], r3 //write 8th Byte
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
+ vst1.u8 d18, [r2]! //write 8Byte
+ UNPACK_1_IN_8x16BITS_TO_8BITS d19, d20, d21, q10 //output to d19[0]
+ vst1.u8 {d19[0]}, [r2], r3 //write 8th Byte
vld1.u8 {q2}, [r0], r1 //read 4th row
//the 4th row
pld [r0]
- // vertical filtered into q6/q7
- FILTER_6TAG_8BITS_TO_16BITS d6, d8, d10, d0, d2, d4, q6, q14, q15 // 8 avail
- FILTER_6TAG_8BITS_TO_16BITS d7, d9, d11, d1, d3, d5, q7, q14, q15 // 6 avail
+ // vertical filtered into q9/q10
+ FILTER_6TAG_8BITS_TO_16BITS d6, d8, d16, d0, d2, d4, q9, q14, q15 // 8 avail
+ FILTER_6TAG_8BITS_TO_16BITS d7, d9, d17, d1, d3, d5, q10, q14, q15 // 6 avail
// horizon filtered
- UNPACK_2_16BITS_TO_ABC q6, q7, q11, q12, q13
- FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d12 //output to q6[0]
- vst1.u8 d12, [r2]! //write 8Byte
- UNPACK_1_IN_8x16BITS_TO_8BITS d13, d14, d15, q7 //output to d13[0]
- vst1.u8 {d13[0]}, [r2], r3 //write 8th Byte
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
+ vst1.u8 d18, [r2]! //write 8Byte
+ UNPACK_1_IN_8x16BITS_TO_8BITS d19, d20, d21, q10 //output to d19[0]
+ vst1.u8 {d19[0]}, [r2], r3 //write 8th Byte
- //q4~q5, q0~q2, --> q0~q4
+ //q4~q8, q0~q2, --> q0~q4
vswp q0, q4
vswp q2, q4
vmov q3, q1
- vmov q1, q5
+ vmov q1, q8
sub r4, #4
cmp r4, #1
bne w9_hv_mc_luma_loop
//the last row
- vld1.u8 {q5}, [r0], r1 //use 14(9+5), =src[3]
- // vertical filtered into q6/q7
- FILTER_6TAG_8BITS_TO_16BITS d0, d2, d4, d6, d8, d10, q6, q14, q15 // 8 avail
- FILTER_6TAG_8BITS_TO_16BITS d1, d3, d5, d7, d9, d11, q7, q14, q15 // 6 avail
+ vld1.u8 {q8}, [r0], r1 //use 14(9+5), =src[3]
+ // vertical filtered into q9/q10
+ FILTER_6TAG_8BITS_TO_16BITS d0, d2, d4, d6, d8, d16, q9, q14, q15 // 8 avail
+ FILTER_6TAG_8BITS_TO_16BITS d1, d3, d5, d7, d9, d17, q10, q14, q15 // 6 avail
// horizon filtered
- UNPACK_2_16BITS_TO_ABC q6, q7, q11, q12, q13
- FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d12 //output to q6[0]
- vst1.u8 d12, [r2]! //write 8Byte
- UNPACK_1_IN_8x16BITS_TO_8BITS d13, d14, d15, q7 //output to d13[0]
- vst1.u8 {d13[0]}, [r2], r3 //write 8th Byte
+ UNPACK_2_16BITS_TO_ABC q9, q10, q11, q12, q13
+ FILTER_3_IN_16BITS_TO_8BITS q11, q12, q13, d18 //output to q9[0]
+ vst1.u8 d18, [r2]! //write 8Byte
+ UNPACK_1_IN_8x16BITS_TO_8BITS d19, d20, d21, q10 //output to d19[0]
+ vst1.u8 {d19[0]}, [r2], r3 //write 8th Byte
+ vpop {q4}
pop {r4}
WELS_ASM_FUNC_END
@@ -2134,10 +2144,10 @@
vld1.u8 {q2}, [r2], r3
vld1.u8 {q3}, [r4], r5
- vld1.u8 {q4}, [r2], r3
- vld1.u8 {q5}, [r4], r5
- vld1.u8 {q6}, [r2], r3
- vld1.u8 {q7}, [r4], r5
+ vld1.u8 {q8}, [r2], r3
+ vld1.u8 {q9}, [r4], r5
+ vld1.u8 {q10}, [r2], r3
+ vld1.u8 {q11}, [r4], r5
AVERAGE_TWO_8BITS d0, d0, d2
AVERAGE_TWO_8BITS d1, d1, d3
@@ -2147,13 +2157,13 @@
AVERAGE_TWO_8BITS d5, d5, d7
vst1.u8 {q2}, [r0], r1
- AVERAGE_TWO_8BITS d8, d8, d10
- AVERAGE_TWO_8BITS d9, d9, d11
- vst1.u8 {q4}, [r0], r1
+ AVERAGE_TWO_8BITS d16, d16, d18
+ AVERAGE_TWO_8BITS d17, d17, d19
+ vst1.u8 {q8}, [r0], r1
- AVERAGE_TWO_8BITS d12, d12, d14
- AVERAGE_TWO_8BITS d13, d13, d15
- vst1.u8 {q6}, [r0], r1
+ AVERAGE_TWO_8BITS d20, d20, d22
+ AVERAGE_TWO_8BITS d21, d21, d23
+ vst1.u8 {q10}, [r0], r1
sub r6, #4
cmp r6, #0
--- a/codec/decoder/core/arm/block_add_neon.S
+++ b/codec/decoder/core/arm/block_add_neon.S
@@ -161,9 +161,9 @@
vld4.s16 {d0, d1, d2, d3}, [r2] // cost 3 cycles!
- ROW_TRANSFORM_1_STEP d0, d1, d2, d3, q4, q5, q6, q7, d4, d5
+ ROW_TRANSFORM_1_STEP d0, d1, d2, d3, q8, q9, q10, q11, d4, d5
- TRANSFORM_4BYTES q0, q1, q2, q3, q4, q5, q6, q7
+ TRANSFORM_4BYTES q0, q1, q2, q3, q8, q9, q10, q11
// transform element 32bits
vtrn.s32 q0, q1 //[0 1 2 3]+[4 5 6 7]-->[0 4 2 6]+[1 5 3 7]
@@ -171,33 +171,33 @@
vswp d1, d4 //[0 4 2 6]+[8 12 10 14]-->[0 4 8 12]+[2 6 10 14]
vswp d3, d6 //[1 5 3 7]+[9 13 11 15]-->[1 5 9 13]+[3 7 11 15]
- COL_TRANSFORM_1_STEP q0, q1, q2, q3, q4, q5, q6, q7
+ COL_TRANSFORM_1_STEP q0, q1, q2, q3, q8, q9, q10, q11
- TRANSFORM_4BYTES q0, q1, q2, q3, q4, q5, q6, q7
+ TRANSFORM_4BYTES q0, q1, q2, q3, q8, q9, q10, q11
//after clip_table[MAX_NEG_CROP] into [0, 255]
mov r2, r0
- vld1.32 {d12[0]},[r0],r1
- vld1.32 {d12[1]},[r0],r1
- vld1.32 {d14[0]},[r0],r1
- vld1.32 {d14[1]},[r0]
+ vld1.32 {d20[0]},[r0],r1
+ vld1.32 {d20[1]},[r0],r1
+ vld1.32 {d22[0]},[r0],r1
+ vld1.32 {d22[1]},[r0]
- vrshrn.s32 d8, q0, #6
- vrshrn.s32 d9, q1, #6
- vrshrn.s32 d10, q2, #6
- vrshrn.s32 d11, q3, #6
+ vrshrn.s32 d16, q0, #6
+ vrshrn.s32 d17, q1, #6
+ vrshrn.s32 d18, q2, #6
+ vrshrn.s32 d19, q3, #6
- vmovl.u8 q0,d12
- vmovl.u8 q1,d14
- vadd.s16 q0,q4
- vadd.s16 q1,q5
+ vmovl.u8 q0,d20
+ vmovl.u8 q1,d22
+ vadd.s16 q0,q8
+ vadd.s16 q1,q9
- vqmovun.s16 d12,q0
- vqmovun.s16 d14,q1
+ vqmovun.s16 d20,q0
+ vqmovun.s16 d22,q1
- vst1.32 {d12[0]},[r2],r1
- vst1.32 {d12[1]},[r2],r1
- vst1.32 {d14[0]},[r2],r1
- vst1.32 {d14[1]},[r2]
+ vst1.32 {d20[0]},[r2],r1
+ vst1.32 {d20[1]},[r2],r1
+ vst1.32 {d22[0]},[r2],r1
+ vst1.32 {d22[1]},[r2]
WELS_ASM_FUNC_END
#endif
--- a/codec/decoder/core/arm/intra_pred_neon.S
+++ b/codec/decoder/core/arm/intra_pred_neon.S
@@ -214,12 +214,12 @@
vmla.s16 q3, q2, d0[0]
//Calculate a+'b'*{1,2,3,4,5,6,7,8} + c*{-7}
- vshl.s16 q5, q1, #3
- vadd.s16 q5, q3
+ vshl.s16 q8, q1, #3
+ vadd.s16 q8, q3
//right shift 5 bits and rounding
vqrshrun.s16 d0, q3, #5
- vqrshrun.s16 d1, q5, #5
+ vqrshrun.s16 d1, q8, #5
//Set the line of MB
vst1.u32 {d0,d1}, [r0], r1
@@ -229,9 +229,9 @@
mov r2, #15
loop_0_get_i16x16_luma_pred_plane:
vadd.s16 q3, q2
- vadd.s16 q5, q2
+ vadd.s16 q8, q2
vqrshrun.s16 d0, q3, #5
- vqrshrun.s16 d1, q5, #5
+ vqrshrun.s16 d1, q8, #5
vst1.u32 {d0,d1}, [r0], r1
subs r2, #1
bne loop_0_get_i16x16_luma_pred_plane
--- a/codec/encoder/core/arm/intra_pred_neon.S
+++ b/codec/encoder/core/arm/intra_pred_neon.S
@@ -216,12 +216,12 @@
vmla.s16 q3, q2, d0[0]
//Calculate a+'b'*{1,2,3,4,5,6,7,8} + c*{-7}
- vshl.s16 q5, q1, #3
- vadd.s16 q5, q3
+ vshl.s16 q8, q1, #3
+ vadd.s16 q8, q3
//right shift 5 bits and rounding
vqrshrun.s16 d0, q3, #5
- vqrshrun.s16 d1, q5, #5
+ vqrshrun.s16 d1, q8, #5
//Set the line of MB
vst1.u32 {d0,d1}, [r0]!
@@ -231,9 +231,9 @@
mov r3, #15
loop_0_get_i16x16_luma_pred_plane:
vadd.s16 q3, q2
- vadd.s16 q5, q2
+ vadd.s16 q8, q2
vqrshrun.s16 d0, q3, #5
- vqrshrun.s16 d1, q5, #5
+ vqrshrun.s16 d1, q8, #5
vst1.u32 {d0,d1}, [r0]!
subs r3, #1
bne loop_0_get_i16x16_luma_pred_plane
--- a/codec/encoder/core/arm/intra_pred_sad_3_opt_neon.S
+++ b/codec/encoder/core/arm/intra_pred_sad_3_opt_neon.S
@@ -535,10 +535,11 @@
WELS_ASM_FUNC_BEGIN WelsIntra8x8Combined3Satd_neon
stmdb sp!, {r4-r7, lr}
+ vpush {q4-q7}
//Get the data from stack
- ldr r4, [sp, #32] //p_dec_cr
- ldr r5, [sp, #36] //p_enc_cr
+ ldr r4, [sp, #96] //p_dec_cr
+ ldr r5, [sp, #100] //p_enc_cr
//Get the top line data to 'd29(cb), d31(cr)'(16 bytes)
sub r6, r0, r1
@@ -637,8 +638,8 @@
HDM_TRANSFORM_4X4_L0 d7, d9, d25, d21, d13, d11, d10, d28, d30
//Get the data from stack
- ldr r5, [sp, #20] //the addr of Best_mode
- ldr r6, [sp, #24] //the value of i_lambda
+ ldr r5, [sp, #84] //the addr of Best_mode
+ ldr r6, [sp, #88] //the value of i_lambda
vrshr.u16 d11, #1
vpaddl.u16 d11, d11
@@ -668,6 +669,7 @@
str r6, [r5]
mov r0, lr
+ vpop {q4-q7}
ldmia sp!, {r4-r7, lr}
WELS_ASM_FUNC_END
--- a/codec/encoder/core/arm/pixel_neon.S
+++ b/codec/encoder/core/arm/pixel_neon.S
@@ -38,86 +38,86 @@
vld1.64 {q0}, [r0,:128], r1
vld1.64 {q1}, [r2], r3
- vsubl.u8 q4, d0, d2
+ vsubl.u8 q8, d0, d2
vld1.64 {q2}, [r0,:128], r1
- vsubl.u8 q6, d1, d3
+ vsubl.u8 q10, d1, d3
vld1.64 {q3}, [r2], r3
- vsubl.u8 q5, d4, d6
+ vsubl.u8 q9, d4, d6
vld1.64 {q0}, [r0,:128], r1
- vsubl.u8 q7, d5, d7
+ vsubl.u8 q11, d5, d7
vld1.64 {q1}, [r2], r3
- vsubl.u8 q8, d0, d2
+ vsubl.u8 q12, d0, d2
vld1.64 {q2}, [r0,:128], r1
- vsubl.u8 q10, d1, d3
- vadd.s16 q0, q4, q5
+ vsubl.u8 q14, d1, d3
+ vadd.s16 q0, q8, q9
vld1.64 {q3}, [r2], r3
- vsub.s16 q1, q4, q5
+ vsub.s16 q1, q8, q9
- vsubl.u8 q9, d4, d6
- vsubl.u8 q11, d5, d7
+ vsubl.u8 q13, d4, d6
+ vsubl.u8 q15, d5, d7
- vadd.s16 q2, q8, q9
- vsub.s16 q3, q8, q9
+ vadd.s16 q2, q12, q13
+ vsub.s16 q3, q12, q13
- vadd.s16 q4, q6, q7
- vsub.s16 q5, q6, q7
+ vadd.s16 q8, q10, q11
+ vsub.s16 q9, q10, q11
- vadd.s16 q6, q10, q11
- vsub.s16 q7, q10, q11
+ vadd.s16 q10, q14, q15
+ vsub.s16 q11, q14, q15
- vadd.s16 q8, q0, q2
- vsub.s16 q10, q0, q2
+ vadd.s16 q12, q0, q2
+ vsub.s16 q14, q0, q2
- vadd.s16 q9, q4, q6
- vsub.s16 q11, q4, q6
+ vadd.s16 q13, q8, q10
+ vsub.s16 q15, q8, q10
vsub.s16 q0, q1, q3
vadd.s16 q2, q1, q3
- vsub.s16 q1, q5, q7
- vadd.s16 q3, q5, q7
+ vsub.s16 q1, q9, q11
+ vadd.s16 q3, q9, q11
- vtrn.16 q8, q10
- vtrn.16 q9, q11
+ vtrn.16 q12, q14
+ vtrn.16 q13, q15
- vadd.s16 q4, q8, q10
- vabd.s16 q6, q8, q10
+ vadd.s16 q8, q12, q14
+ vabd.s16 q10, q12, q14
- vadd.s16 q5, q9, q11
- vabd.s16 q7, q9, q11
+ vadd.s16 q9, q13, q15
+ vabd.s16 q11, q13, q15
- vabs.s16 q4, q4
- vabs.s16 q5, q5
+ vabs.s16 q8, q8
+ vabs.s16 q9, q9
vtrn.16 q0, q2
vtrn.16 q1, q3
- vadd.s16 q8, q0, q2
- vabd.s16 q10, q0, q2
+ vadd.s16 q12, q0, q2
+ vabd.s16 q14, q0, q2
- vadd.s16 q9, q1, q3
- vabd.s16 q11, q1, q3
+ vadd.s16 q13, q1, q3
+ vabd.s16 q15, q1, q3
- vabs.s16 q8, q8
- vabs.s16 q9, q9
+ vabs.s16 q12, q12
+ vabs.s16 q13, q13
- vtrn.32 q4, q6
- vtrn.32 q5, q7
-
vtrn.32 q8, q10
vtrn.32 q9, q11
- vmax.s16 q0, q4, q6
- vmax.s16 q1, q5, q7
- vmax.s16 q2, q8, q10
- vmax.s16 q3, q9, q11
+ vtrn.32 q12, q14
+ vtrn.32 q13, q15
+ vmax.s16 q0, q8, q10
+ vmax.s16 q1, q9, q11
+ vmax.s16 q2, q12, q14
+ vmax.s16 q3, q13, q15
+
vadd.u16 q0, q0, q1
vadd.u16 q2, q2, q3
.endm
@@ -128,49 +128,49 @@
vld1.64 {d1}, [r2], r3
vld1.64 {d2}, [r0,:64], r1
- vsubl.u8 q4, d0, d1
+ vsubl.u8 q8, d0, d1
vld1.64 {d3}, [r2], r3
- vsubl.u8 q5, d2, d3
+ vsubl.u8 q9, d2, d3
vld1.64 {d4}, [r0,:64], r1
vld1.64 {d5}, [r2], r3
- vadd.s16 q8, q4, q5
- vsubl.u8 q6, d4, d5
+ vadd.s16 q12, q8, q9
+ vsubl.u8 q10, d4, d5
vld1.64 {d6}, [r0,:64], r1
vld1.64 {d7}, [r2], r3
- vsubl.u8 q7, d6, d7
- vsub.s16 q9, q4, q5
+ vsubl.u8 q11, d6, d7
+ vsub.s16 q13, q8, q9
- vadd.s16 q10, q6, q7
- vsub.s16 q11, q6, q7
+ vadd.s16 q14, q10, q11
+ vsub.s16 q15, q10, q11
- vadd.s16 q0, q8, q10
- vsub.s16 q1, q8, q10
+ vadd.s16 q0, q12, q14
+ vsub.s16 q1, q12, q14
- vsub.s16 q2, q9, q11
- vadd.s16 q3, q9, q11
+ vsub.s16 q2, q13, q15
+ vadd.s16 q3, q13, q15
vtrn.16 q0, q1
vtrn.16 q2, q3
- vadd.s16 q4, q0, q1
- vabd.s16 q5, q0, q1
+ vadd.s16 q8, q0, q1
+ vabd.s16 q9, q0, q1
- vabs.s16 q4, q4
- vadd.s16 q6, q2, q3
+ vabs.s16 q8, q8
+ vadd.s16 q10, q2, q3
- vabd.s16 q7, q2, q3
- vabs.s16 q6, q6
+ vabd.s16 q11, q2, q3
+ vabs.s16 q10, q10
- vtrn.32 q4, q5
- vtrn.32 q6, q7
+ vtrn.32 q8, q9
+ vtrn.32 q10, q11
- vmax.s16 q0, q4, q5
- vmax.s16 q1, q6, q7
+ vmax.s16 q0, q8, q9
+ vmax.s16 q1, q10, q11
.endm
.macro SAD_16x4
@@ -221,6 +221,7 @@
WELS_ASM_FUNC_BEGIN WelsSampleSad16x16_neon
+ vpush {q4-q7}
vld1.64 {q0}, [r0, :128], r1
vld1.64 {q1}, [r2], r3
@@ -257,10 +258,13 @@
vpaddl.u16 d0, d0
vpaddl.u32 d0, d0
vmov.u32 r0, d0[0]
+
+ vpop {q4-q7}
WELS_ASM_FUNC_END
WELS_ASM_FUNC_BEGIN WelsSampleSad16x8_neon
+ vpush {q4-q7}
vld1.64 {q0}, [r0, :128], r1
vld1.64 {q1}, [r2], r3
@@ -295,6 +299,7 @@
vpaddl.u16 d0, d0
vpaddl.u32 d0, d0
vmov.u32 r0, d0[0]
+ vpop {q4-q7}
WELS_ASM_FUNC_END
@@ -405,11 +410,11 @@
vld1.8 {q0}, [r0], r1 //save pix1
vld1.8 {q1}, [r2], r3 //save pix2 - stride
- vld1.8 {q6}, [r2], r3 //save pix2
+ vld1.8 {q10}, [r2], r3 //save pix2
vld1.8 {q2}, [r2], r3 //save pix2 + stride
vld1.8 {q3}, [r4], r3 //save pix2 - 1
- vld1.8 {q4}, [r5], r3 //save pix2 + 1
+ vld1.8 {q8}, [r5], r3 //save pix2 + 1
//Do the SAD for 16 bytes
vabdl.u8 q15, d0, d2
@@ -421,8 +426,8 @@
vabdl.u8 q11, d0, d6
vabal.u8 q11, d1, d7
- vabdl.u8 q9, d0, d8
- vabal.u8 q9, d1, d9
+ vabdl.u8 q9, d0, d16
+ vabal.u8 q9, d1, d17
mov lr, #15
pixel_sad_4_16x16_loop_0:
@@ -429,14 +434,14 @@
//Loading a horizontal line data (16 bytes)
vld1.8 {q0}, [r0], r1 //save pix1
- vmov.8 q1, q6 //save pix2 - stride
- vmov.8 q6, q2
+ vmov.8 q1, q10 //save pix2 - stride
+ vmov.8 q10, q2
vabal.u8 q15, d0, d2
vld1.8 {q2}, [r2], r3 //save pix2 + stride
vabal.u8 q15, d1, d3
vld1.8 {q3}, [r4], r3 //save pix2 - 1
vabal.u8 q13, d0, d4
- vld1.8 {q4}, [r5], r3 //save pix2 + 1
+ vld1.8 {q8}, [r5], r3 //save pix2 + 1
vabal.u8 q13, d1, d5
subs lr, #1
@@ -443,8 +448,8 @@
vabal.u8 q11, d0, d6
vabal.u8 q11, d1, d7
- vabal.u8 q9, d0, d8
- vabal.u8 q9, d1, d9
+ vabal.u8 q9, d0, d16
+ vabal.u8 q9, d1, d17
bne pixel_sad_4_16x16_loop_0
@@ -481,11 +486,11 @@
vld1.8 {q0}, [r0], r1 //save pix1
vld1.8 {q1}, [r2], r3 //save pix2 - stride
- vld1.8 {q6}, [r2], r3 //save pix2
+ vld1.8 {q10}, [r2], r3 //save pix2
vld1.8 {q2}, [r2], r3 //save pix2 + stride
vld1.8 {q3}, [r4], r3 //save pix2 - 1
- vld1.8 {q4}, [r5], r3 //save pix2 + 1
+ vld1.8 {q8}, [r5], r3 //save pix2 + 1
//Do the SAD for 16 bytes
vabdl.u8 q15, d0, d2
@@ -497,8 +502,8 @@
vabdl.u8 q11, d0, d6
vabal.u8 q11, d1, d7
- vabdl.u8 q9, d0, d8
- vabal.u8 q9, d1, d9
+ vabdl.u8 q9, d0, d16
+ vabal.u8 q9, d1, d17
mov lr, #7
pixel_sad_4_16x8_loop_0:
@@ -505,14 +510,14 @@
//Loading a horizontal line data (16 bytes)
vld1.8 {q0}, [r0], r1 //save pix1
- vmov.8 q1, q6 //save pix2 - stride
- vmov.8 q6, q2
+ vmov.8 q1, q10 //save pix2 - stride
+ vmov.8 q10, q2
vabal.u8 q15, d0, d2
vld1.8 {q2}, [r2], r3 //save pix2 + stride
vabal.u8 q15, d1, d3
vld1.8 {q3}, [r4], r3 //save pix2 - 1
vabal.u8 q13, d0, d4
- vld1.8 {q4}, [r5], r3 //save pix2 + 1
+ vld1.8 {q8}, [r5], r3 //save pix2 + 1
vabal.u8 q13, d1, d5
subs lr, #1
@@ -519,8 +524,8 @@
vabal.u8 q11, d0, d6
vabal.u8 q11, d1, d7
- vabal.u8 q9, d0, d8
- vabal.u8 q9, d1, d9
+ vabal.u8 q9, d0, d16
+ vabal.u8 q9, d1, d17
bne pixel_sad_4_16x8_loop_0
@@ -735,86 +740,94 @@
WELS_ASM_FUNC_BEGIN WelsSampleSatd16x16_neon
+ vpush {q7}
SATD_16x4
- vadd.u16 q15, q0, q2
+ vadd.u16 q7, q0, q2
SATD_16x4
- vadd.u16 q15, q15, q0
- vadd.u16 q15, q15, q2
+ vadd.u16 q7, q7, q0
+ vadd.u16 q7, q7, q2
SATD_16x4
- vadd.u16 q15, q15, q0
- vadd.u16 q15, q15, q2
+ vadd.u16 q7, q7, q0
+ vadd.u16 q7, q7, q2
SATD_16x4
- vadd.u16 q15, q15, q0
- vadd.u16 q15, q15, q2
+ vadd.u16 q7, q7, q0
+ vadd.u16 q7, q7, q2
- vadd.u16 d0, d30, d31
+ vadd.u16 d0, d14, d15
vpaddl.u16 d0, d0
vpaddl.u32 d0, d0
vmov.32 r0, d0[0]
+ vpop {q7}
WELS_ASM_FUNC_END
WELS_ASM_FUNC_BEGIN WelsSampleSatd16x8_neon
+ vpush {q7}
SATD_16x4
- vadd.u16 q15, q0, q2
+ vadd.u16 q7, q0, q2
SATD_16x4
- vadd.u16 q15, q15, q0
- vadd.u16 q15, q15, q2
+ vadd.u16 q7, q7, q0
+ vadd.u16 q7, q7, q2
- vadd.u16 d0, d30, d31
+ vadd.u16 d0, d14, d15
vpaddl.u16 d0, d0
vpaddl.u32 d0, d0
vmov.32 r0, d0[0]
+ vpop {q7}
WELS_ASM_FUNC_END
WELS_ASM_FUNC_BEGIN WelsSampleSatd8x16_neon
+ vpush {q7}
SATD_8x4
- vadd.u16 q15, q0, q1
+ vadd.u16 q7, q0, q1
SATD_8x4
- vadd.u16 q15, q15, q0
- vadd.u16 q15, q15, q1
+ vadd.u16 q7, q7, q0
+ vadd.u16 q7, q7, q1
SATD_8x4
- vadd.u16 q15, q15, q0
- vadd.u16 q15, q15, q1
+ vadd.u16 q7, q7, q0
+ vadd.u16 q7, q7, q1
SATD_8x4
- vadd.u16 q15, q15, q0
- vadd.u16 q15, q15, q1
+ vadd.u16 q7, q7, q0
+ vadd.u16 q7, q7, q1
- vadd.u16 d0, d30, d31
+ vadd.u16 d0, d14, d15
vpaddl.u16 d0, d0
vpaddl.u32 d0, d0
vmov.32 r0, d0[0]
+ vpop {q7}
WELS_ASM_FUNC_END
WELS_ASM_FUNC_BEGIN WelsSampleSatd8x8_neon
+ vpush {q7}
SATD_8x4
- vadd.u16 q15, q0, q1
+ vadd.u16 q7, q0, q1
SATD_8x4
- vadd.u16 q15, q15, q0
- vadd.u16 q15, q15, q1
+ vadd.u16 q7, q7, q0
+ vadd.u16 q7, q7, q1
- vadd.u16 d0, d30, d31
+ vadd.u16 d0, d14, d15
vpaddl.u16 d0, d0
vpaddl.u32 d0, d0
vmov.32 r0, d0[0]
+ vpop {q7}
WELS_ASM_FUNC_END
--- a/codec/encoder/core/arm/reconstruct_neon.S
+++ b/codec/encoder/core/arm/reconstruct_neon.S
@@ -616,17 +616,17 @@
STORE_ALIGNED_DATA_WITH_STRIDE q0, q1, q2, q3, r0, r1
- LOAD_ALIGNED_DATA_WITH_STRIDE q4, q5, q6, q7, r2, r3
+ LOAD_ALIGNED_DATA_WITH_STRIDE q8, q9, q10, q11, r2, r3
- STORE_ALIGNED_DATA_WITH_STRIDE q4, q5, q6, q7, r0, r1
+ STORE_ALIGNED_DATA_WITH_STRIDE q8, q9, q10, q11, r0, r1
LOAD_ALIGNED_DATA_WITH_STRIDE q0, q1, q2, q3, r2, r3
STORE_ALIGNED_DATA_WITH_STRIDE q0, q1, q2, q3, r0, r1
- LOAD_ALIGNED_DATA_WITH_STRIDE q4, q5, q6, q7, r2, r3
+ LOAD_ALIGNED_DATA_WITH_STRIDE q8, q9, q10, q11, r2, r3
- STORE_ALIGNED_DATA_WITH_STRIDE q4, q5, q6, q7, r0, r1
+ STORE_ALIGNED_DATA_WITH_STRIDE q8, q9, q10, q11, r0, r1
WELS_ASM_FUNC_END
@@ -637,17 +637,17 @@
STORE_UNALIGNED_DATA_WITH_STRIDE q0, q1, q2, q3, r0, r1
- LOAD_UNALIGNED_DATA_WITH_STRIDE q4, q5, q6, q7, r2, r3
+ LOAD_UNALIGNED_DATA_WITH_STRIDE q8, q9, q10, q11, r2, r3
- STORE_UNALIGNED_DATA_WITH_STRIDE q4, q5, q6, q7, r0, r1
+ STORE_UNALIGNED_DATA_WITH_STRIDE q8, q9, q10, q11, r0, r1
LOAD_UNALIGNED_DATA_WITH_STRIDE q0, q1, q2, q3, r2, r3
STORE_UNALIGNED_DATA_WITH_STRIDE q0, q1, q2, q3, r0, r1
- LOAD_UNALIGNED_DATA_WITH_STRIDE q4, q5, q6, q7, r2, r3
+ LOAD_UNALIGNED_DATA_WITH_STRIDE q8, q9, q10, q11, r2, r3
- STORE_UNALIGNED_DATA_WITH_STRIDE q4, q5, q6, q7, r0, r1
+ STORE_UNALIGNED_DATA_WITH_STRIDE q8, q9, q10, q11, r0, r1
WELS_ASM_FUNC_END
@@ -658,9 +658,9 @@
STORE_UNALIGNED_DATA_WITH_STRIDE q0, q1, q2, q3, r0, r1
- LOAD_UNALIGNED_DATA_WITH_STRIDE q4, q5, q6, q7, r2, r3
+ LOAD_UNALIGNED_DATA_WITH_STRIDE q8, q9, q10, q11, r2, r3
- STORE_UNALIGNED_DATA_WITH_STRIDE q4, q5, q6, q7, r0, r1
+ STORE_UNALIGNED_DATA_WITH_STRIDE q8, q9, q10, q11, r0, r1
WELS_ASM_FUNC_END
@@ -720,22 +720,22 @@
push {r4}
ldr r4, [sp, #4]
- LOAD_8x8_DATA_FOR_DCT d8, d9, d10, d11, d12, d13, d14, d15, r1, r3
+ LOAD_8x8_DATA_FOR_DCT d16, d17, d18, d19, d20, d21, d22, d23, r1, r3
- vsubl.u8 q0, d8, d12
- vsubl.u8 q1, d9, d13
- vsubl.u8 q2, d10, d14
- vsubl.u8 q3, d11, d15
+ vsubl.u8 q0, d16, d20
+ vsubl.u8 q1, d17, d21
+ vsubl.u8 q2, d18, d22
+ vsubl.u8 q3, d19, d23
MATRIX_TRANSFORM_EACH_16BITS q0, q1, q2, q3
// horizontal transform
- DCT_ROW_TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q4, q5, q6, q7
+ DCT_ROW_TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q8, q9, q10, q11
// transform element
MATRIX_TRANSFORM_EACH_16BITS q0, q1, q2, q3
// vertical transform
- DCT_ROW_TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q4, q5, q6, q7
+ DCT_ROW_TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q8, q9, q10, q11
vswp d1, d2
vswp d5, d6
@@ -744,22 +744,22 @@
vst1.s16 {q2, q3}, [r0]!
////////////////
- LOAD_8x8_DATA_FOR_DCT d8, d9, d10, d11, d12, d13, d14, d15, r1, r3
+ LOAD_8x8_DATA_FOR_DCT d16, d17, d18, d19, d20, d21, d22, d23, r1, r3
- vsubl.u8 q0, d8, d12
- vsubl.u8 q1, d9, d13
- vsubl.u8 q2, d10, d14
- vsubl.u8 q3, d11, d15
+ vsubl.u8 q0, d16, d20
+ vsubl.u8 q1, d17, d21
+ vsubl.u8 q2, d18, d22
+ vsubl.u8 q3, d19, d23
MATRIX_TRANSFORM_EACH_16BITS q0, q1, q2, q3
// horizontal transform
- DCT_ROW_TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q4, q5, q6, q7
+ DCT_ROW_TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q8, q9, q10, q11
// transform element
MATRIX_TRANSFORM_EACH_16BITS q0, q1, q2, q3
// vertical transform
- DCT_ROW_TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q4, q5, q6, q7
+ DCT_ROW_TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q8, q9, q10, q11
vswp d1, d2
vswp d5, d6
@@ -776,13 +776,13 @@
vld1.s16 {q0, q1}, [r0]
vld1.s16 {q3}, [r2]
- vmov q4, q2
+ vmov q8, q2
- NEWQUANT_COEF_EACH_16BITS q0, q2, d4, d5, d6, d7, q5, q6, q7
+ NEWQUANT_COEF_EACH_16BITS q0, q2, d4, d5, d6, d7, q9, q10, q11
vst1.s16 {q2}, [r0]!
- NEWQUANT_COEF_EACH_16BITS q1, q4, d8, d9, d6, d7, q5, q6, q7
- vst1.s16 {q4}, [r0]!
+ NEWQUANT_COEF_EACH_16BITS q1, q8, d16, d17, d6, d7, q9, q10, q11
+ vst1.s16 {q8}, [r0]!
WELS_ASM_FUNC_END
@@ -793,13 +793,13 @@
vdup.s16 q2, r1 // even ff range [0, 768]
vdup.s16 q3, r2
- vmov q4, q2
+ vmov q8, q2
- NEWQUANT_COEF_EACH_16BITS q0, q2, d4, d5, d6, d7, q5, q6, q7
+ NEWQUANT_COEF_EACH_16BITS q0, q2, d4, d5, d6, d7, q9, q10, q11
vst1.s16 {q2}, [r0]!
- NEWQUANT_COEF_EACH_16BITS q1, q4, d8, d9, d6, d7, q5, q6, q7
- vst1.s16 {q4}, [r0]!
+ NEWQUANT_COEF_EACH_16BITS q1, q8, d16, d17, d6, d7, q9, q10, q11
+ vst1.s16 {q8}, [r0]!
WELS_ASM_FUNC_END
@@ -810,36 +810,36 @@
mov r1, r0
vld1.s16 {q0, q1}, [r0]!
- vmov q4, q2
- NEWQUANT_COEF_EACH_16BITS q0, q4, d8, d9, d6, d7, q5, q6, q7
- vst1.s16 {q4}, [r1]!
- vmov q4, q2
- NEWQUANT_COEF_EACH_16BITS q1, q4, d8, d9, d6, d7, q5, q6, q7
- vst1.s16 {q4}, [r1]!
+ vmov q8, q2
+ NEWQUANT_COEF_EACH_16BITS q0, q8, d16, d17, d6, d7, q9, q10, q11
+ vst1.s16 {q8}, [r1]!
+ vmov q8, q2
+ NEWQUANT_COEF_EACH_16BITS q1, q8, d16, d17, d6, d7, q9, q10, q11
+ vst1.s16 {q8}, [r1]!
vld1.s16 {q0, q1}, [r0]!
- vmov q4, q2
- NEWQUANT_COEF_EACH_16BITS q0, q4, d8, d9, d6, d7, q5, q6, q7
- vst1.s16 {q4}, [r1]!
- vmov q4, q2
- NEWQUANT_COEF_EACH_16BITS q1, q4, d8, d9, d6, d7, q5, q6, q7
- vst1.s16 {q4}, [r1]!
+ vmov q8, q2
+ NEWQUANT_COEF_EACH_16BITS q0, q8, d16, d17, d6, d7, q9, q10, q11
+ vst1.s16 {q8}, [r1]!
+ vmov q8, q2
+ NEWQUANT_COEF_EACH_16BITS q1, q8, d16, d17, d6, d7, q9, q10, q11
+ vst1.s16 {q8}, [r1]!
vld1.s16 {q0, q1}, [r0]!
- vmov q4, q2
- NEWQUANT_COEF_EACH_16BITS q0, q4, d8, d9, d6, d7, q5, q6, q7
- vst1.s16 {q4}, [r1]!
- vmov q4, q2
- NEWQUANT_COEF_EACH_16BITS q1, q4, d8, d9, d6, d7, q5, q6, q7
- vst1.s16 {q4}, [r1]!
+ vmov q8, q2
+ NEWQUANT_COEF_EACH_16BITS q0, q8, d16, d17, d6, d7, q9, q10, q11
+ vst1.s16 {q8}, [r1]!
+ vmov q8, q2
+ NEWQUANT_COEF_EACH_16BITS q1, q8, d16, d17, d6, d7, q9, q10, q11
+ vst1.s16 {q8}, [r1]!
vld1.s16 {q0, q1}, [r0]!
- vmov q4, q2
- NEWQUANT_COEF_EACH_16BITS q0, q4, d8, d9, d6, d7, q5, q6, q7
- vst1.s16 {q4}, [r1]!
- vmov q4, q2
- NEWQUANT_COEF_EACH_16BITS q1, q4, d8, d9, d6, d7, q5, q6, q7
- vst1.s16 {q4}, [r1]!
+ vmov q8, q2
+ NEWQUANT_COEF_EACH_16BITS q0, q8, d16, d17, d6, d7, q9, q10, q11
+ vst1.s16 {q8}, [r1]!
+ vmov q8, q2
+ NEWQUANT_COEF_EACH_16BITS q1, q8, d16, d17, d6, d7, q9, q10, q11
+ vst1.s16 {q8}, [r1]!
WELS_ASM_FUNC_END
@@ -850,42 +850,42 @@
mov r1, r0
vld1.s16 {q0, q1}, [r0]!
- vmov q4, q2
- NEWQUANT_COEF_EACH_16BITS_MAX q0, q4, d8, d9, d6, d7, q5, q6, q7, d18
- vst1.s16 {q4}, [r1]!
vmov q8, q2
- NEWQUANT_COEF_EACH_16BITS_MAX q1, q8, d16, d17, d6, d7, q5, q6, q7, d20
- vst1.s16 {q8}, [r1]! // then 1st 16 elem in d18 & d20
+ NEWQUANT_COEF_EACH_16BITS_MAX q0, q8, d16, d17, d6, d7, q9, q10, q11, d26
+ vst1.s16 {q8}, [r1]!
+ vmov q12, q2
+ NEWQUANT_COEF_EACH_16BITS_MAX q1, q12, d24, d25, d6, d7, q9, q10, q11, d28
+ vst1.s16 {q12}, [r1]! // then 1st 16 elem in d26 & d28
vld1.s16 {q0, q1}, [r0]!
- vmov q4, q2
- NEWQUANT_COEF_EACH_16BITS_MAX q0, q4, d8, d9, d6, d7, q5, q6, q7, d19
- vst1.s16 {q4}, [r1]!
vmov q8, q2
- NEWQUANT_COEF_EACH_16BITS_MAX q1, q8, d16, d17, d6, d7, q5, q6, q7, d21
- vst1.s16 {q8}, [r1]! // then 2nd 16 elem in d19 & d21
+ NEWQUANT_COEF_EACH_16BITS_MAX q0, q8, d16, d17, d6, d7, q9, q10, q11, d27
+ vst1.s16 {q8}, [r1]!
+ vmov q12, q2
+ NEWQUANT_COEF_EACH_16BITS_MAX q1, q12, d24, d25, d6, d7, q9, q10, q11, d29
+ vst1.s16 {q12}, [r1]! // then 2nd 16 elem in d27 & d29
- SELECT_MAX_IN_ABS_COEF q9, q10, q0, d0, d1
+ SELECT_MAX_IN_ABS_COEF q13, q14, q0, d0, d1
vst1.s32 {d0[0]}, [r3]!
///////////
vld1.s16 {q0, q1}, [r0]!
- vmov q4, q2
- NEWQUANT_COEF_EACH_16BITS_MAX q0, q4, d8, d9, d6, d7, q5, q6, q7, d18
- vst1.s16 {q4}, [r1]!
vmov q8, q2
- NEWQUANT_COEF_EACH_16BITS_MAX q1, q8, d16, d17, d6, d7, q5, q6, q7, d20
- vst1.s16 {q8}, [r1]! // then 3rd 16 elem in d18 & d20
+ NEWQUANT_COEF_EACH_16BITS_MAX q0, q8, d16, d17, d6, d7, q9, q10, q11, d26
+ vst1.s16 {q8}, [r1]!
+ vmov q12, q2
+ NEWQUANT_COEF_EACH_16BITS_MAX q1, q12, d24, d25, d6, d7, q9, q10, q11, d28
+ vst1.s16 {q12}, [r1]! // then 3rd 16 elem in d26 & d28
vld1.s16 {q0, q1}, [r0]!
- vmov q4, q2
- NEWQUANT_COEF_EACH_16BITS_MAX q0, q4, d8, d9, d6, d7, q5, q6, q7, d19
- vst1.s16 {q4}, [r1]!
vmov q8, q2
- NEWQUANT_COEF_EACH_16BITS_MAX q1, q8, d16, d17, d6, d7, q5, q6, q7, d21
- vst1.s16 {q8}, [r1]! // then 4th 16 elem in d19 & d21
+ NEWQUANT_COEF_EACH_16BITS_MAX q0, q8, d16, d17, d6, d7, q9, q10, q11, d27
+ vst1.s16 {q8}, [r1]!
+ vmov q12, q2
+ NEWQUANT_COEF_EACH_16BITS_MAX q1, q12, d24, d25, d6, d7, q9, q10, q11, d29
+ vst1.s16 {q12}, [r1]! // then 4th 16 elem in d27 & d29
- SELECT_MAX_IN_ABS_COEF q9, q10, q0, d0, d1
+ SELECT_MAX_IN_ABS_COEF q13, q14, q0, d0, d1
vst1.s32 {d0[0]}, [r3]!
WELS_ASM_FUNC_END
@@ -907,23 +907,23 @@
vtrn.16 q0, q2 // d0[0 4], d1[1 5]
vtrn.16 q1, q3 // d2[2 6], d3[3 7]
- vld1.s16 {d8}, [r1], r2
- vld1.s16 {d9}, [r3], r2
- vld1.s16 {d12}, [r1], r2
- vld1.s16 {d13}, [r3], r2
- vld1.s16 {d10}, [r1], r2
- vld1.s16 {d11}, [r3], r2
- vld1.s16 {d14}, [r1], r2
- vld1.s16 {d15}, [r3], r2
- vtrn.16 q4, q6 // d8[08 12], d9[09 13]
- vtrn.16 q5, q7 //d10[10 14],d11[11 15]
+ vld1.s16 {d16}, [r1], r2
+ vld1.s16 {d17}, [r3], r2
+ vld1.s16 {d20}, [r1], r2
+ vld1.s16 {d21}, [r3], r2
+ vld1.s16 {d18}, [r1], r2
+ vld1.s16 {d19}, [r3], r2
+ vld1.s16 {d22}, [r1], r2
+ vld1.s16 {d23}, [r3], r2
+ vtrn.16 q8, q10 //d16[08 12],d17[09 13]
+ vtrn.16 q9, q11 //d18[10 14],d19[11 15]
- vtrn.32 q0, q4 // d0 [0 4 08 12] = dct[idx], d1[1 5 09 13] = dct[idx+16]
- vtrn.32 q1, q5 // d2 [2 6 10 14] = dct[idx+64], d3[3 7 11 15] = dct[idx+80]
+ vtrn.32 q0, q8 // d0 [0 4 08 12] = dct[idx], d1[1 5 09 13] = dct[idx+16]
+ vtrn.32 q1, q9 // d2 [2 6 10 14] = dct[idx+64], d3[3 7 11 15] = dct[idx+80]
- ROW_TRANSFORM_0_STEP d0, d1, d3, d2, q4, q7, q6, q5
+ ROW_TRANSFORM_0_STEP d0, d1, d3, d2, q8, q11, q10, q9
- TRANSFORM_4BYTES q0, q1, q3, q2, q4, q7, q6, q5
+ TRANSFORM_4BYTES q0, q1, q3, q2, q8, q11, q10, q9
// transform element 32bits
vtrn.s32 q0, q1 //[0 1 2 3]+[4 5 6 7]-->[0 4 2 6]+[1 5 3 7]
@@ -931,15 +931,15 @@
vswp d1, d4 //[0 4 2 6]+[8 12 10 14]-->[0 4 8 12]+[2 6 10 14]
vswp d3, d6 //[1 5 3 7]+[9 13 11 15]-->[1 5 9 13]+[3 7 11 15]
- COL_TRANSFORM_0_STEP q0, q1, q3, q2, q4, q7, q6, q5
+ COL_TRANSFORM_0_STEP q0, q1, q3, q2, q8, q11, q10, q9
- TRANSFORM_4BYTES q0, q1, q3, q2, q4, q7, q6, q5
+ TRANSFORM_4BYTES q0, q1, q3, q2, q8, q11, q10, q9
- vrshrn.s32 d8, q0, #1
- vrshrn.s32 d9, q1, #1
- vrshrn.s32 d10, q2, #1
- vrshrn.s32 d11, q3, #1
- vst1.16 {q4, q5}, [r0] //store
+ vrshrn.s32 d16, q0, #1
+ vrshrn.s32 d17, q1, #1
+ vrshrn.s32 d18, q2, #1
+ vrshrn.s32 d19, q3, #1
+ vst1.16 {q8, q9}, [r0] //store
pop {r2,r3}
WELS_ASM_FUNC_END
@@ -1020,35 +1020,35 @@
vld1.s16 {q0, q1}, [r0]
vld1.u16 {q2}, [r1]
- vmul.s16 q4, q0, q2
- vmul.s16 q5, q1, q2
+ vmul.s16 q8, q0, q2
+ vmul.s16 q9, q1, q2
- vst1.s16 {q4, q5}, [r0]
+ vst1.s16 {q8, q9}, [r0]
WELS_ASM_FUNC_END
WELS_ASM_FUNC_BEGIN WelsDequantFour4x4_neon
- vld1.u16 {q8}, [r1]
+ vld1.u16 {q12}, [r1]
mov r1, r0
vld1.s16 {q0, q1}, [r0]!
vld1.s16 {q2, q3}, [r0]!
- vmul.s16 q0, q0, q8
- vld1.s16 {q4, q5}, [r0]!
- vmul.s16 q1, q1, q8
- vld1.s16 {q6, q7}, [r0]!
+ vmul.s16 q0, q0, q12
+ vld1.s16 {q8, q9}, [r0]!
+ vmul.s16 q1, q1, q12
+ vld1.s16 {q10, q11}, [r0]!
vst1.s16 {q0, q1}, [r1]!
- vmul.s16 q2, q2, q8
- vmul.s16 q3, q3, q8
- vmul.s16 q4, q4, q8
+ vmul.s16 q2, q2, q12
+ vmul.s16 q3, q3, q12
+ vmul.s16 q8, q8, q12
vst1.s16 {q2, q3}, [r1]!
- vmul.s16 q5, q5, q8
- vmul.s16 q6, q6, q8
- vmul.s16 q7, q7, q8
- vst1.s16 {q4, q5}, [r1]!
- vst1.s16 {q6, q7}, [r1]!
+ vmul.s16 q9, q9, q12
+ vmul.s16 q10, q10, q12
+ vmul.s16 q11, q11, q12
+ vst1.s16 {q8, q9}, [r1]!
+ vst1.s16 {q10, q11}, [r1]!
WELS_ASM_FUNC_END
@@ -1056,7 +1056,7 @@
WELS_ASM_FUNC_BEGIN WelsDequantIHadamard4x4_neon
vld1.s16 {q0, q1}, [r0]
- vdup.s16 q4, r1
+ vdup.s16 q8, r1
IHDM_4x4_TOTAL_16BITS q0, q2, q3
IHDM_4x4_TOTAL_16BITS q1, q2, q3
@@ -1064,10 +1064,10 @@
MATRIX_TRANSFORM_EACH_16BITS d0, d1, d2, d3
IHDM_4x4_TOTAL_16BITS q0, q2, q3
- vmul.s16 q0, q4
+ vmul.s16 q0, q8
IHDM_4x4_TOTAL_16BITS q1, q2, q3
- vmul.s16 q1, q4
+ vmul.s16 q1, q8
MATRIX_TRANSFORM_EACH_16BITS d0, d1, d2, d3
vst1.s16 {q0, q1}, [r0]
@@ -1075,14 +1075,14 @@
WELS_ASM_FUNC_BEGIN WelsIDctT4Rec_neon
- vld1.u32 {d14[0]}, [r2], r3
+ vld1.u32 {d16[0]}, [r2], r3
push {r4}
ldr r4, [sp, #4]
- vld1.u32 {d14[1]}, [r2], r3
+ vld1.u32 {d16[1]}, [r2], r3
vld4.s16 {d0, d1, d2, d3}, [r4] // cost 3 cycles!
- vld1.u32 {d15[0]}, [r2], r3
- vld1.u32 {d15[1]}, [r2], r3 // q7 is pred
+ vld1.u32 {d17[0]}, [r2], r3
+ vld1.u32 {d17[1]}, [r2], r3 // q7 is pred
ROW_TRANSFORM_1_STEP_TOTAL_16BITS d0, d1, d2, d3, d4, d5, d6, d7
@@ -1099,17 +1099,17 @@
vrshr.s16 d3, d3, #6
//after rounding 6, clip into [0, 255]
- vmovl.u8 q2,d14
+ vmovl.u8 q2,d16
vadd.s16 q0,q2
- vqmovun.s16 d14,q0
- vst1.32 {d14[0]},[r0],r1
- vst1.32 {d14[1]},[r0],r1
+ vqmovun.s16 d16,q0
+ vst1.32 {d16[0]},[r0],r1
+ vst1.32 {d16[1]},[r0],r1
- vmovl.u8 q2,d15
+ vmovl.u8 q2,d17
vadd.s16 q1,q2
- vqmovun.s16 d15,q1
- vst1.32 {d15[0]},[r0],r1
- vst1.32 {d15[1]},[r0]
+ vqmovun.s16 d17,q1
+ vst1.32 {d17[0]},[r0],r1
+ vst1.32 {d17[1]},[r0]
pop {r4}
WELS_ASM_FUNC_END
@@ -1117,28 +1117,28 @@
WELS_ASM_FUNC_BEGIN WelsIDctFourT4Rec_neon
- vld1.u64 {d16}, [r2], r3
+ vld1.u64 {d24}, [r2], r3
push {r4}
ldr r4, [sp, #4]
- vld1.u64 {d17}, [r2], r3
+ vld1.u64 {d25}, [r2], r3
vld4.s16 {d0, d1, d2, d3}, [r4]! // cost 3 cycles!
- vld1.u64 {d18}, [r2], r3
- vld1.u64 {d19}, [r2], r3
+ vld1.u64 {d26}, [r2], r3
+ vld1.u64 {d27}, [r2], r3
vld4.s16 {d4, d5, d6, d7}, [r4]! // cost 3 cycles!
vswp d1, d4
vswp d3, d6
vswp q1, q2 // q0~q3
- ROW_TRANSFORM_1_STEP_TOTAL_16BITS q0, q1, q2, q3, q4, q5, q6, q7
+ ROW_TRANSFORM_1_STEP_TOTAL_16BITS q0, q1, q2, q3, q8, q9, q10, q11
- TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q4, q5, q6, q7
+ TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q8, q9, q10, q11
MATRIX_TRANSFORM_EACH_16BITS q0, q1, q2, q3
- ROW_TRANSFORM_1_STEP_TOTAL_16BITS q0, q1, q2, q3, q4, q5, q6, q7
+ ROW_TRANSFORM_1_STEP_TOTAL_16BITS q0, q1, q2, q3, q8, q9, q10, q11
- TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q4, q5, q6, q7
+ TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q8, q9, q10, q11
vrshr.s16 q0, q0, #6
vrshr.s16 q1, q1, #6
vrshr.s16 q2, q2, #6
@@ -1145,46 +1145,46 @@
vrshr.s16 q3, q3, #6
//after rounding 6, clip into [0, 255]
- vmovl.u8 q4,d16
- vadd.s16 q0,q4
- vqmovun.s16 d16,q0
- vst1.u8 {d16},[r0],r1
+ vmovl.u8 q8,d24
+ vadd.s16 q0,q8
+ vqmovun.s16 d24,q0
+ vst1.u8 {d24},[r0],r1
- vmovl.u8 q4,d17
- vadd.s16 q1,q4
- vqmovun.s16 d17,q1
- vst1.u8 {d17},[r0],r1
+ vmovl.u8 q8,d25
+ vadd.s16 q1,q8
+ vqmovun.s16 d25,q1
+ vst1.u8 {d25},[r0],r1
- vmovl.u8 q4,d18
- vadd.s16 q2,q4
- vqmovun.s16 d18,q2
- vst1.u8 {d18},[r0],r1
+ vmovl.u8 q8,d26
+ vadd.s16 q2,q8
+ vqmovun.s16 d26,q2
+ vst1.u8 {d26},[r0],r1
- vmovl.u8 q4,d19
- vadd.s16 q3,q4
- vqmovun.s16 d19,q3
- vst1.u8 {d19},[r0],r1
+ vmovl.u8 q8,d27
+ vadd.s16 q3,q8
+ vqmovun.s16 d27,q3
+ vst1.u8 {d27},[r0],r1
- vld1.u64 {d16}, [r2], r3
- vld1.u64 {d17}, [r2], r3
+ vld1.u64 {d24}, [r2], r3
+ vld1.u64 {d25}, [r2], r3
vld4.s16 {d0, d1, d2, d3}, [r4]! // cost 3 cycles!
- vld1.u64 {d18}, [r2], r3
- vld1.u64 {d19}, [r2], r3
+ vld1.u64 {d26}, [r2], r3
+ vld1.u64 {d27}, [r2], r3
vld4.s16 {d4, d5, d6, d7}, [r4]! // cost 3 cycles!
vswp d1, d4
vswp d3, d6
vswp q1, q2 // q0~q3
- ROW_TRANSFORM_1_STEP_TOTAL_16BITS q0, q1, q2, q3, q4, q5, q6, q7
+ ROW_TRANSFORM_1_STEP_TOTAL_16BITS q0, q1, q2, q3, q8, q9, q10, q11
- TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q4, q5, q6, q7
+ TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q8, q9, q10, q11
MATRIX_TRANSFORM_EACH_16BITS q0, q1, q2, q3
- ROW_TRANSFORM_1_STEP_TOTAL_16BITS q0, q1, q2, q3, q4, q5, q6, q7
+ ROW_TRANSFORM_1_STEP_TOTAL_16BITS q0, q1, q2, q3, q8, q9, q10, q11
- TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q4, q5, q6, q7
+ TRANSFORM_TOTAL_16BITS q0, q1, q2, q3, q8, q9, q10, q11
vrshr.s16 q0, q0, #6
vrshr.s16 q1, q1, #6
vrshr.s16 q2, q2, #6
@@ -1191,25 +1191,25 @@
vrshr.s16 q3, q3, #6
//after rounding 6, clip into [0, 255]
- vmovl.u8 q4,d16
- vadd.s16 q0,q4
- vqmovun.s16 d16,q0
- vst1.u8 {d16},[r0],r1
+ vmovl.u8 q8,d24
+ vadd.s16 q0,q8
+ vqmovun.s16 d24,q0
+ vst1.u8 {d24},[r0],r1
- vmovl.u8 q4,d17
- vadd.s16 q1,q4
- vqmovun.s16 d17,q1
- vst1.u8 {d17},[r0],r1
+ vmovl.u8 q8,d25
+ vadd.s16 q1,q8
+ vqmovun.s16 d25,q1
+ vst1.u8 {d25},[r0],r1
- vmovl.u8 q4,d18
- vadd.s16 q2,q4
- vqmovun.s16 d18,q2
- vst1.u8 {d18},[r0],r1
+ vmovl.u8 q8,d26
+ vadd.s16 q2,q8
+ vqmovun.s16 d26,q2
+ vst1.u8 {d26},[r0],r1
- vmovl.u8 q4,d19
- vadd.s16 q3,q4
- vqmovun.s16 d19,q3
- vst1.u8 {d19},[r0],r1
+ vmovl.u8 q8,d27
+ vadd.s16 q3,q8
+ vqmovun.s16 d27,q3
+ vst1.u8 {d27},[r0],r1
pop {r4}
WELS_ASM_FUNC_END
--- a/codec/processing/src/arm/down_sample_neon.S
+++ b/codec/processing/src/arm/down_sample_neon.S
@@ -257,10 +257,10 @@
vdup.s32 d1, r11; //init u 16384 16383 16384 16383
mov r11, #16384
- vdup.s16 d8, r11
+ vdup.s16 d16, r11
sub r11, #1
- vdup.s16 d9, r11
- vext.8 d7, d9, d8, #4 //init v 16384 16384 16383 16383
+ vdup.s16 d17, r11
+ vext.8 d7, d17, d16, #4 //init v 16384 16384 16383 16383
veor q14, q14
sub r1, r2 // stride - width
--- a/codec/processing/src/arm/vaa_calc_neon.S
+++ b/codec/processing/src/arm/vaa_calc_neon.S
@@ -103,8 +103,8 @@
ldr r4, [sp, #20] //load pic_stride
ldr r5, [sp, #28] //load psad8x8
- //Initial the Q4 register for save the "psadframe"
- vmov.s64 q4, #0
+ //Initial the Q8 register for save the "psadframe"
+ vmov.s64 q8, #0
//Get the jump distance to use on loop codes
lsl r8, r4, #4
@@ -140,7 +140,7 @@
//Save to calculate "psadframe"
vadd.u32 q0, q1
- vadd.u32 q4, q0
+ vadd.u32 q8, q0
bne vaa_calc_sad_loop1
@@ -152,8 +152,8 @@
bne vaa_calc_sad_loop0
ldr r6, [sp, #24] //load psadframe
- vadd.u32 d8, d9
- vst1.32 {d8[0]}, [r6]
+ vadd.u32 d16, d17
+ vst1.32 {d16[0]}, [r6]
ldmia sp!, {r4-r8}
@@ -635,8 +635,9 @@
WELS_ASM_FUNC_BEGIN VAACalcSadSsdBgd_neon
stmdb sp!, {r0-r12, r14}
+ vpush {q4-q7}
- ldr r4, [sp, #56] //r4 keeps the pic_stride
+ ldr r4, [sp, #120] //r4 keeps the pic_stride
sub r5, r4, #1
lsl r5, r5, #4 //r5 keeps the little step
@@ -645,12 +646,12 @@
sub r6, r2, r6 //r6 keeps the big step
- ldr r8, [sp, #64]//psad8x8
- ldr r9, [sp, #68]//psum16x16
- ldr r10, [sp, #72]//psqsum16x16
- ldr r11, [sp, #76]//psqdiff16x16
- ldr r12, [sp, #80]//p_sd8x8
- ldr r14, [sp, #84]//p_mad8x8
+ ldr r8, [sp, #128]//psad8x8
+ ldr r9, [sp, #132]//psum16x16
+ ldr r10, [sp, #136]//psqsum16x16
+ ldr r11, [sp, #140]//psqdiff16x16
+ ldr r12, [sp, #144]//p_sd8x8
+ ldr r14, [sp, #148]//p_mad8x8
vmov.i8 q12, #0
@@ -700,11 +701,12 @@
bne vaa_calc_sad_ssd_bgd_height_loop
//psadframe
- ldr r7, [sp, #60]//psadframe
+ ldr r7, [sp, #124]//psadframe
vadd.i32 d24, d24, d25
vst1.32 {d24[0]}, [r7]
+ vpop {q4-q7}
ldmia sp!, {r0-r12, r14}
WELS_ASM_FUNC_END
@@ -912,8 +914,10 @@
WELS_ASM_FUNC_BEGIN VAACalcSadVar_neon
stmdb sp!, {r4-r11}
+ vpush {q4}
+ vpush {q6-q7}
- ldr r4, [sp, #32] //r4 keeps the pic_stride
+ ldr r4, [sp, #80] //r4 keeps the pic_stride
sub r5, r4, #1
lsl r5, r5, #4 //r5 keeps the little step
@@ -921,10 +925,10 @@
lsl r6, r4, #4
sub r6, r2, r6 //r6 keeps the big step
- ldr r7, [sp, #36] //psadframe
- ldr r8, [sp, #40] //psad8x8
- ldr r9, [sp, #44] //psum16x16
- ldr r10, [sp, #48] //psqsum16x16
+ ldr r7, [sp, #84] //psadframe
+ ldr r8, [sp, #88] //psad8x8
+ ldr r9, [sp, #92] //psum16x16
+ ldr r10, [sp, #96] //psqsum16x16
vmov.i8 q12, #0
vaa_calc_sad_var_height_loop:
@@ -961,6 +965,8 @@
vadd.i32 d24, d24, d25
vst1.32 {d24[0]}, [r7]
+ vpop {q6-q7}
+ vpop {q4}
ldmia sp!, {r4-r11}
WELS_ASM_FUNC_END
@@ -1080,8 +1086,10 @@
WELS_ASM_FUNC_BEGIN VAACalcSadSsd_neon
stmdb sp!, {r4-r12}
+ vpush {q4}
+ vpush {q6-q7}
- ldr r4, [sp, #36] //r4 keeps the pic_stride
+ ldr r4, [sp, #84] //r4 keeps the pic_stride
sub r5, r4, #1
lsl r5, r5, #4 //r5 keeps the little step
@@ -1089,11 +1097,11 @@
lsl r6, r4, #4
sub r6, r2, r6 //r6 keeps the big step
- ldr r7, [sp, #40] //psadframe
- ldr r8, [sp, #44] //psad8x8
- ldr r9, [sp, #48] //psum16x16
- ldr r10, [sp, #52] //psqsum16x16
- ldr r11, [sp, #56] //psqdiff16x16
+ ldr r7, [sp, #88] //psadframe
+ ldr r8, [sp, #92] //psad8x8
+ ldr r9, [sp, #96] //psum16x16
+ ldr r10, [sp, #100] //psqsum16x16
+ ldr r11, [sp, #104] //psqdiff16x16
vmov.i8 q12, #0
vaa_calc_sad_ssd_height_loop:
@@ -1137,6 +1145,8 @@
vadd.i32 d24, d24, d25
vst1.32 {d24[0]}, [r7]
+ vpop {q6-q7}
+ vpop {q4}
ldmia sp!, {r4-r12}
WELS_ASM_FUNC_END