]> git.sesse.net Git - ffmpeg/blob - libavcodec/arm/vp8_armv6.S
Merge remote-tracking branch 'qatar/master'
[ffmpeg] / libavcodec / arm / vp8_armv6.S
1 /**
2  * Copyright (C) 2010 Mans Rullgard
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20
21 #include "asm.S"
22
23 .macro rac_get_prob     h, bs, buf, cw, pr, t0, t1
24         adds            \bs, \bs, \t0
25         lsl             \cw, \cw, \t0
26         lsl             \t0, \h,  \t0
27         rsb             \h,  \pr, #256
28         ldrhcs          \t1, [\buf], #2
29         smlabb          \h,  \t0, \pr, \h
30         rev16cs         \t1, \t1
31         orrcs           \cw, \cw, \t1, lsl \bs
32         subcs           \bs, \bs, #16
33         lsr             \h,  \h,  #8
34         cmp             \cw, \h,  lsl #16
35         subge           \cw, \cw, \h,  lsl #16
36         subge           \h,  \t0, \h
37 .endm
38
39 .macro rac_get_128      h, bs, buf, cw, t0, t1
40         adds            \bs, \bs, \t0
41         lsl             \cw, \cw, \t0
42         lsl             \t0, \h,  \t0
43         ldrhcs          \t1, [\buf], #2
44         mov             \h,  #128
45         rev16cs         \t1, \t1
46         add             \h,  \h,  \t0, lsl #7
47         orrcs           \cw, \cw, \t1, lsl \bs
48         subcs           \bs, \bs, #16
49         lsr             \h,  \h,  #8
50         cmp             \cw, \h,  lsl #16
51         subge           \cw, \cw, \h,  lsl #16
52         subge           \h,  \t0, \h
53 .endm
54
55 function ff_decode_block_coeffs_armv6, export=1
56         push            {r0,r1,r4-r11,lr}
57         movrel          lr,  X(ff_vp56_norm_shift)
58         ldrd            r4,  r5,  [sp, #44]             @ token_prob, qmul
59         cmp             r3,  #0
60         ldr             r11, [r5]
61         ldm             r0,  {r5-r7}                    @ high, bits, buf
62         pkhtbne         r11, r11, r11, asr #16
63         ldr             r8,  [r0, #16]                  @ code_word
64 0:
65         ldrb            r9,  [lr, r5]
66         add             r3,  r3,  #1
67         ldrb            r0,  [r4, #1]
68         rac_get_prob    r5,  r6,  r7,  r8,  r0,  r9,  r10
69         blt             2f
70
71         ldrb            r9,  [lr, r5]
72         ldrb            r0,  [r4, #2]
73         rac_get_prob    r5,  r6,  r7,  r8,  r0,  r9,  r10
74         ldrb            r9,  [lr, r5]
75         bge             3f
76
77         add             r4,  r3,  r3,  lsl #5
78         sxth            r12, r11
79         add             r4,  r2,  r4
80         adds            r6,  r6,  r9
81         add             r4,  r4,  #11
82         lsl             r8,  r8,  r9
83         ldrhcs          r10, [r7], #2
84         lsl             r9,  r5,  r9
85         mov             r5,  #128
86         rev16cs         r10, r10
87         add             r5,  r5,  r9,  lsl #7
88         orrcs           r8,  r8,  r10, lsl r6
89         subcs           r6,  r6,  #16
90         lsr             r5,  r5,  #8
91         cmp             r8,  r5,  lsl #16
92         movrel          r10, zigzag_scan-1
93         subge           r8,  r8,  r5,  lsl #16
94         subge           r5,  r9,  r5
95         ldrb            r10, [r10, r3]
96         rsbge           r12, r12, #0
97         cmp             r3,  #16
98         strh            r12, [r1, r10]
99         bge             6f
100 5:
101         ldrb            r9,  [lr, r5]
102         ldrb            r0,  [r4]
103         rac_get_prob    r5,  r6,  r7,  r8,  r0,  r9,  r10
104         pkhtb           r11, r11, r11, asr #16
105         bge             0b
106
107 6:
108         ldr             r0,  [sp]
109         ldr             r9,  [r0, #12]
110         cmp             r7,  r9
111         movhi           r7,  r9
112         stm             r0,  {r5-r7}                    @ high, bits, buf
113         str             r8,  [r0, #16]                  @ code_word
114
115         add             sp,  sp,  #8
116         mov             r0,  r3
117         pop             {r4-r11,pc}
118 2:
119         add             r4,  r3,  r3,  lsl #5
120         cmp             r3,  #16
121         add             r4,  r2,  r4
122         pkhtb           r11, r11, r11, asr #16
123         bne             0b
124         b               6b
125 3:
126         ldrb            r0,  [r4, #3]
127         rac_get_prob    r5,  r6,  r7,  r8,  r0,  r9,  r10
128         ldrb            r9,  [lr, r5]
129         bge             1f
130
131         mov             r12, #2
132         ldrb            r0,  [r4, #4]
133         rac_get_prob    r5,  r6,  r7,  r8,  r0,  r9,  r10
134         addge           r12, #1
135         ldrb            r9,  [lr, r5]
136         blt             4f
137         ldrb            r0,  [r4, #5]
138         rac_get_prob    r5,  r6,  r7,  r8,  r0,  r9,  r10
139         addge           r12, #1
140         ldrb            r9,  [lr, r5]
141         b               4f
142 1:
143         ldrb            r0,  [r4, #6]
144         rac_get_prob    r5,  r6,  r7,  r8,  r0,  r9,  r10
145         ldrb            r9,  [lr, r5]
146         bge             3f
147
148         ldrb            r0,  [r4, #7]
149         rac_get_prob    r5,  r6,  r7,  r8,  r0,  r9,  r10
150         ldrb            r9,  [lr, r5]
151         bge             2f
152
153         mov             r12, #5
154         mov             r0,  #159
155         rac_get_prob    r5,  r6,  r7,  r8,  r0,  r9,  r10
156         addge           r12, r12, #1
157         ldrb            r9,  [lr, r5]
158         b               4f
159 2:
160         mov             r12, #7
161         mov             r0,  #165
162         rac_get_prob    r5,  r6,  r7,  r8,  r0,  r9,  r10
163         addge           r12, r12, #2
164         ldrb            r9,  [lr, r5]
165         mov             r0,  #145
166         rac_get_prob    r5,  r6,  r7,  r8,  r0,  r9,  r10
167         addge           r12, r12, #1
168         ldrb            r9,  [lr, r5]
169         b               4f
170 3:
171         ldrb            r0,  [r4, #8]
172         rac_get_prob    r5,  r6,  r7,  r8,  r0,  r9,  r10
173         addge           r4,  r4,  #1
174         ldrb            r9,  [lr, r5]
175         movge           r12, #2
176         movlt           r12, #0
177         ldrb            r0,  [r4, #9]
178         rac_get_prob    r5,  r6,  r7,  r8,  r0,  r9,  r10
179         mov             r9,  #8
180         addge           r12, r12, #1
181         movrel          r4,  X(ff_vp8_dct_cat_prob)
182         lsl             r9,  r9,  r12
183         ldr             r4,  [r4, r12, lsl #2]
184         add             r12, r9,  #3
185         mov             r1,  #0
186         ldrb            r0,  [r4], #1
187 1:
188         ldrb            r9,  [lr, r5]
189         lsl             r1,  r1,  #1
190         rac_get_prob    r5,  r6,  r7,  r8,  r0,  r9,  r10
191         ldrb            r0,  [r4], #1
192         addge           r1,  r1,  #1
193         cmp             r0,  #0
194         bne             1b
195         ldrb            r9,  [lr, r5]
196         add             r12, r12, r1
197         ldr             r1,  [sp, #4]
198 4:
199         add             r4,  r3,  r3,  lsl #5
200         add             r4,  r2,  r4
201         add             r4,  r4,  #22
202         rac_get_128     r5,  r6,  r7,  r8,  r9,  r10
203         rsbge           r12, r12, #0
204         smulbb          r12, r12, r11
205         movrel          r9,  zigzag_scan-1
206         ldrb            r9,  [r9, r3]
207         cmp             r3,  #16
208         strh            r12, [r1, r9]
209         bge             6b
210         b               5b
211 endfunc
212
213         .section        .rodata
214 zigzag_scan:
215         .byte            0,  2,  8, 16
216         .byte           10,  4,  6, 12
217         .byte           18, 24, 26, 20
218         .byte           14, 22, 28, 30