[x264-devel] [PATCH] x264_decimate_score64_neon
George Stephanos
gaf.stephanos at gmail.com
Thu Feb 9 00:31:10 CET 2012
---
common/arm/quant-a.S | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++
common/arm/quant.h | 2 +
common/quant.c | 1 +
3 files changed, 163 insertions(+), 0 deletions(-)
diff --git a/common/arm/quant-a.S b/common/arm/quant-a.S
index c2b50ba..3080a1b 100644
--- a/common/arm/quant-a.S
+++ b/common/arm/quant-a.S
@@ -35,6 +35,11 @@ pmovmskb_byte:
decimate_table4:
.byte 3,2,2,1,1,1,0,0
.byte 0,0,0,0,0,0,0,0
+decimate_table8:
+.byte 3,3,3,3,2,2,2,2,2,2,2,2,1,1,1,1
+.byte 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0
+.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.text
@@ -528,3 +533,158 @@ function x264_decimate_score\size\()_neon
DECIMATE_SCORE 15
DECIMATE_SCORE 16
+function x264_decimate_score64_neon
+ push {r4-r6, lr}
+ mov r1, #32
+ vld1.64 {d16-d19}, [r0], r1
+ vld1.64 {d20-d23}, [r0], r1
+ vld1.64 {d24-d27}, [r0], r1
+ vld1.64 {d28-d31}, [r0], r1
+ vabs.s16 q8, q8
+ vabs.s16 q9, q9
+ vabs.s16 q10, q10
+ vabs.s16 q11, q11
+ vabs.s16 q12, q12
+ vabs.s16 q13, q13
+ vabs.s16 q14, q14
+ vabs.s16 q15, q15
+ vqmovn.u16 d16, q8
+ vqmovn.u16 d17, q9
+ vqmovn.u16 d18, q10
+ vqmovn.u16 d19, q11
+ vqmovn.u16 d20, q12
+ vqmovn.u16 d21, q13
+ vqmovn.u16 d22, q14
+ vqmovn.u16 d23, q15
+
+ movrel r3, pmovmskb_byte
+ vld1.64 {d0, d1}, [r3]
+
+ vmov.i8 q12, #2
+ vcge.u8 q1, q8, q12
+ vcge.u8 q2, q9, q12
+ vcge.u8 q3, q10, q12
+ vcge.u8 q4, q11, q12
+
+ vqmovn.u16 d28, q1
+ vqmovn.u16 d29, q2
+ vqmovn.u16 d30, q3
+ vqmovn.u16 d31, q4
+
+ vpadd.u8 d28, d29
+ vpadd.u8 d30, d31
+ vpadd.u8 d28, d30
+ vpadd.u8 d28, d28
+ vpadd.u8 d28, d28
+
+ vmov.32 r2, d28[0]
+ movs r2, r2
+ bne 3f
+
+ vtst.8 q8, q8
+ vtst.8 q9, q9
+ vtst.8 q10, q10
+ vtst.8 q11, q11
+
+ vand q8, q0
+ vand q9, q0
+ vand q10, q0
+ vand q11, q0
+
+ vmov.i8 d2, #0
+ vpadd.u8 d16, d2
+ vpadd.u8 d16, d2
+ vpadd.u8 d16, d2
+ vpadd.u8 d17, d2
+ vpadd.u8 d17, d2
+ vpadd.u8 d17, d2
+ vpadd.u8 d18, d2
+ vpadd.u8 d18, d2
+ vpadd.u8 d18, d2
+ vpadd.u8 d19, d2
+ vpadd.u8 d19, d2
+ vpadd.u8 d19, d2
+
+ vshl.u64 d17, #8
+ vorr.u8 d16, d17
+ vshl.u64 d18, #16
+ vorr.u8 d16, d18
+ vshl.u64 d19, #24
+ vorr.u8 d16, d19
+
+ vpadd.u8 d20, d2
+ vpadd.u8 d20, d2
+ vpadd.u8 d20, d2
+ vpadd.u8 d21, d2
+ vpadd.u8 d21, d2
+ vpadd.u8 d21, d2
+ vpadd.u8 d22, d2
+ vpadd.u8 d22, d2
+ vpadd.u8 d22, d2
+ vpadd.u8 d23, d2
+ vpadd.u8 d23, d2
+ vpadd.u8 d23, d2
+
+ vshl.u64 d21, #8
+ vorr.u8 d20, d21
+ vshl.u64 d22, #16
+ vorr.u8 d20, d22
+ vshl.u64 d23, #24
+ vorr.u8 d20, d23
+ vshl.u64 d20, #32
+ vorr.u8 d16, d20
+
+ mov r0, #0
+
+ vmov r3, r4, d16
+ adds r5, r4, r3
+ beq 4f
+
+ movrel r5, decimate_table8
+
+ rbit r3, r3
+ rbit r4, r4
+1:
+ clz r2, r3
+ movs r3, r3
+ beq 2f
+
+ lsl r3, r2
+ rsb r6, r2, #32
+ lsr r1, r4, r6
+ orr r3, r1
+
+ lsl r4, r2
+ ldrb r1, [r5, r2]
+ add r0, r1
+
+ lsl r3, #1
+ lsr r1, r4, #31
+ orr r3, r1
+
+ lsl r4, #1
+ movs r3, r3
+ bne 1b
+ movs r4, r4
+ bne 1b
+ b 4f
+2:
+ mov r3, r4
+ mov r4, #0
+ clz r2, r3
+
+ lsl r3, r2
+ lsls r3, #1
+ add r2, #32
+ ldrb r1, [r5, r2]
+ add r0, r1
+
+ bne 1b
+ b 4f
+3:
+ mov r0, #9
+4:
+ pop {r4-r6, pc}
+ bx lr
+.endfunc
+
diff --git a/common/arm/quant.h b/common/arm/quant.h
index db48b25..ee78d1c 100644
--- a/common/arm/quant.h
+++ b/common/arm/quant.h
@@ -49,4 +49,6 @@ int x264_coeff_level_run16_neon( int16_t * );
int x264_decimate_score15_neon( int16_t * );
int x264_decimate_score16_neon( int16_t * );
+int x264_decimate_score64_neon( int16_t * );
+
#endif
diff --git a/common/quant.c b/common/quant.c
index 605cf28..5d85c81 100644
--- a/common/quant.c
+++ b/common/quant.c
@@ -712,6 +712,7 @@ void x264_quant_init( x264_t *h, int cpu, x264_quant_function_t *pf )
pf->coeff_level_run[DCT_LUMA_4x4] = x264_coeff_level_run16_neon;
pf->decimate_score15 = x264_decimate_score15_neon;
pf->decimate_score16 = x264_decimate_score16_neon;
+ pf->decimate_score64 = x264_decimate_score64_neon;
}
#endif
#endif // HIGH_BIT_DEPTH
--
1.7.4.1
More information about the x264-devel
mailing list