shithub: openh264

Download patch

ref: 6714b8ae993b5e049262444a9f17d9552188a68f
parent: 62824ce398eacb64927fc96bade4d6818d9dccd2
parent: c011890764bebeb237674e78c44155711284bb76
author: volvet <[email protected]>
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