]> git.sesse.net Git - x264/blob - common/arm/bitstream-a.S
arm: Add x264_nal_escape_neon
[x264] / common / arm / bitstream-a.S
1 /*****************************************************************************
2  * bitstream-a.S: arm bitstream functions
3  *****************************************************************************
4  * Copyright (C) 2014-2015 x264 project
5  *
6  * Authors: Janne Grunau <janne-x264@jannau.net>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
21  *
22  * This program is also available under a commercial proprietary license.
23  * For more information, contact us at licensing@x264.com.
24  *****************************************************************************/
25
26 #include "asm.S"
27
28 function x264_nal_escape_neon
29     push        {r4-r5,lr}
30     vmov.u8     q0,  #0xff
31     vmov.u8     q8,  #4
32     mov         r3,  #3
33     subs        lr,  r1,  r2
34     beq         99f
35 0:
36     cmn         lr,  #15
37     blt         16f
38     mov         r1,  r2
39     b           100f
40 16:
41     vld1.8      {q1}, [r1]!
42     vext.8      q2,  q0,  q1, #14
43     vext.8      q3,  q0,  q1, #15
44     vcgt.u8     q11, q8,  q1
45     vceq.u8     q9,  q2,  #0
46     vceq.u8     q10, q3,  #0
47     vand        q9,  q9,  q11
48     vand        q9,  q9,  q10
49     vshrn.u16   d22, q9,  #4
50     vmov        ip,  lr,  d22
51     orrs        ip,  ip,  lr
52     beq         16f
53     mov         lr,  #-16
54 100:
55     vmov.u8     r5,  d1[6]
56     vmov.u8     r4,  d1[7]
57     orr         r5,  r4,  r5, lsl #8
58 101:
59     ldrb        r4,  [r1, lr]
60     orr         ip,  r4,  r5, lsl #16
61     cmp         ip,  #3
62     bhi         102f
63     strb        r3,  [r0], #1
64     orr         r5,  r3,  r5, lsl #8
65 102:
66     adds        lr,  lr,  #1
67     strb        r4,  [r0], #1
68     orr         r5,  r4,  r5, lsl #8
69     blt         101b
70     subs        lr,  r1,  r2
71     lsr         ip,  r5,  #8
72     vmov.u8     d1[6],  ip
73     vmov.u8     d1[7],  r5
74     blt         0b
75
76     pop         {r4-r5,pc}
77 16:
78     subs        lr,  r1,  r2
79     vst1.8      {q1}, [r0]!
80     vmov        q0, q1
81     blt         0b
82 99:
83     pop         {r4-r5,pc}
84 endfunc