[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