• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
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 "libavutil/arm/asm.S"
22
23function ff_h264_idct_add_neon, export=1
24h264_idct_add_neon_nothumb:
25        vld1.64         {d0-d3},  [r1,:128]
26        vmov.i16        q15, #0
27
28        vswp            d1,  d2
29        vst1.16         {q15},    [r1,:128]!
30        vadd.i16        d4,  d0,  d1
31        vst1.16         {q15},    [r1,:128]!
32        vshr.s16        q8,  q1,  #1
33        vsub.i16        d5,  d0,  d1
34        vadd.i16        d6,  d2,  d17
35        vsub.i16        d7,  d16, d3
36        vadd.i16        q0,  q2,  q3
37        vsub.i16        q1,  q2,  q3
38
39        vtrn.16         d0,  d1
40        vtrn.16         d3,  d2
41        vtrn.32         d0,  d3
42        vtrn.32         d1,  d2
43
44        vadd.i16        d4,  d0,  d3
45        vld1.32         {d18[0]}, [r0,:32], r2
46        vswp            d1,  d3
47        vshr.s16        q8,  q1,  #1
48        vld1.32         {d19[1]}, [r0,:32], r2
49        vsub.i16        d5,  d0,  d1
50        vld1.32         {d18[1]}, [r0,:32], r2
51        vadd.i16        d6,  d16, d3
52        vld1.32         {d19[0]}, [r0,:32], r2
53        vsub.i16        d7,  d2,  d17
54        sub             r0,  r0,  r2, lsl #2
55        vadd.i16        q0,  q2,  q3
56        vsub.i16        q1,  q2,  q3
57
58        vrshr.s16       q0,  q0,  #6
59        vrshr.s16       q1,  q1,  #6
60
61        vaddw.u8        q0,  q0,  d18
62        vaddw.u8        q1,  q1,  d19
63
64        vqmovun.s16     d0,  q0
65        vqmovun.s16     d1,  q1
66
67        vst1.32         {d0[0]},  [r0,:32], r2
68        vst1.32         {d1[1]},  [r0,:32], r2
69        vst1.32         {d0[1]},  [r0,:32], r2
70        vst1.32         {d1[0]},  [r0,:32], r2
71
72        sub             r1,  r1,  #32
73        bx              lr
74endfunc
75
76function ff_h264_idct_dc_add_neon, export=1
77h264_idct_dc_add_neon_nothumb:
78        mov             r3,       #0
79        vld1.16         {d2[],d3[]}, [r1,:16]
80        strh            r3,       [r1]
81        vrshr.s16       q1,  q1,  #6
82        vld1.32         {d0[0]},  [r0,:32], r2
83        vld1.32         {d0[1]},  [r0,:32], r2
84        vaddw.u8        q2,  q1,  d0
85        vld1.32         {d1[0]},  [r0,:32], r2
86        vld1.32         {d1[1]},  [r0,:32], r2
87        vaddw.u8        q1,  q1,  d1
88        vqmovun.s16     d0,  q2
89        vqmovun.s16     d1,  q1
90        sub             r0,  r0,  r2, lsl #2
91        vst1.32         {d0[0]},  [r0,:32], r2
92        vst1.32         {d0[1]},  [r0,:32], r2
93        vst1.32         {d1[0]},  [r0,:32], r2
94        vst1.32         {d1[1]},  [r0,:32], r2
95        bx              lr
96endfunc
97
98function ff_h264_idct_add16_neon, export=1
99        push            {r4-r8,lr}
100        mov             r4,  r0
101        mov             r5,  r1
102        mov             r1,  r2
103        mov             r2,  r3
104        ldr             r6,  [sp, #24]
105        movrel          r7,  scan8
106        mov             ip,  #16
1071:      ldrb            r8,  [r7], #1
108        ldr             r0,  [r5], #4
109        ldrb            r8,  [r6, r8]
110        subs            r8,  r8,  #1
111        blt             2f
112        ldrsh           lr,  [r1]
113        add             r0,  r0,  r4
114        it              ne
115        movne           lr,  #0
116        cmp             lr,  #0
117        ite             ne
118        adrne           lr,  h264_idct_dc_add_neon_nothumb + CONFIG_THUMB
119        adreq           lr,  h264_idct_add_neon_nothumb    + CONFIG_THUMB
120        blx             lr
1212:      subs            ip,  ip,  #1
122        add             r1,  r1,  #32
123        bne             1b
124        pop             {r4-r8,pc}
125endfunc
126
127function ff_h264_idct_add16intra_neon, export=1
128        push            {r4-r8,lr}
129        mov             r4,  r0
130        mov             r5,  r1
131        mov             r1,  r2
132        mov             r2,  r3
133        ldr             r6,  [sp, #24]
134        movrel          r7,  scan8
135        mov             ip,  #16
1361:      ldrb            r8,  [r7], #1
137        ldr             r0,  [r5], #4
138        ldrb            r8,  [r6, r8]
139        add             r0,  r0,  r4
140        cmp             r8,  #0
141        ldrsh           r8,  [r1]
142        iteet           ne
143        adrne           lr,  h264_idct_add_neon_nothumb    + CONFIG_THUMB
144        adreq           lr,  h264_idct_dc_add_neon_nothumb + CONFIG_THUMB
145        cmpeq           r8,  #0
146        blxne           lr
147        subs            ip,  ip,  #1
148        add             r1,  r1,  #32
149        bne             1b
150        pop             {r4-r8,pc}
151endfunc
152
153function ff_h264_idct_add8_neon, export=1
154        push            {r4-r10,lr}
155        ldm             r0,  {r4,r9}
156        add             r5,  r1,  #16*4
157        add             r1,  r2,  #16*32
158        mov             r2,  r3
159        mov             r10, r1
160        ldr             r6,  [sp, #32]
161        movrel          r7,  scan8+16
162        mov             r12, #0
1631:      ldrb            r8,  [r7, r12]
164        ldr             r0,  [r5, r12, lsl #2]
165        ldrb            r8,  [r6, r8]
166        add             r0,  r0,  r4
167        add             r1,  r10, r12, lsl #5
168        cmp             r8,  #0
169        ldrsh           r8,  [r1]
170        iteet           ne
171        adrne           lr,  h264_idct_add_neon_nothumb    + CONFIG_THUMB
172        adreq           lr,  h264_idct_dc_add_neon_nothumb + CONFIG_THUMB
173        cmpeq           r8,  #0
174        blxne           lr
175        add             r12, r12, #1
176        cmp             r12, #4
177        itt             eq
178        moveq           r12, #16
179        moveq           r4,  r9
180        cmp             r12, #20
181        blt             1b
182        pop             {r4-r10,pc}
183endfunc
184
185.macro  idct8x8_cols    pass
186  .if \pass == 0
187        qa      .req    q2
188        qb      .req    q14
189        vshr.s16        q2,  q10, #1
190        vadd.i16        q0,  q8,  q12
191        vld1.16         {q14-q15},[r1,:128]
192        vst1.16         {q3},     [r1,:128]!
193        vst1.16         {q3},     [r1,:128]!
194        vsub.i16        q1,  q8,  q12
195        vshr.s16        q3,  q14, #1
196        vsub.i16        q2,  q2,  q14
197        vadd.i16        q3,  q3,  q10
198  .else
199        qa      .req    q14
200        qb      .req    q2
201        vtrn.32         q8,  q10
202        vtrn.16         q12, q13
203        vtrn.32         q9,  q11
204        vtrn.32         q12, q2
205        vtrn.32         q13, q15
206        vswp            d21, d4
207        vshr.s16        q14, q10, #1
208        vswp            d17, d24
209        vshr.s16        q3,  q2,  #1
210        vswp            d19, d26
211        vadd.i16        q0,  q8,  q12
212        vswp            d23, d30
213        vsub.i16        q1,  q8,  q12
214        vsub.i16        q14, q14, q2
215        vadd.i16        q3,  q3,  q10
216  .endif
217        vadd.i16        q10, q1,  qa
218        vsub.i16        q12, q1,  qa
219        vadd.i16        q8,  q0,  q3
220        vsub.i16        qb,  q0,  q3
221        vsub.i16        q0,  q13, q11
222        vadd.i16        q1,  q15, q9
223        vsub.i16        qa,  q15, q9
224        vadd.i16        q3,  q13, q11
225        vsub.i16        q0,  q0,  q15
226        vsub.i16        q1,  q1,  q11
227        vadd.i16        qa,  qa,  q13
228        vadd.i16        q3,  q3,  q9
229        vshr.s16        q9,  q9,  #1
230        vshr.s16        q11, q11, #1
231        vshr.s16        q13, q13, #1
232        vshr.s16        q15, q15, #1
233        vsub.i16        q0,  q0,  q15
234        vsub.i16        q1,  q1,  q11
235        vadd.i16        qa,  qa,  q13
236        vadd.i16        q3,  q3,  q9
237        vshr.s16        q9,  q0,  #2
238        vshr.s16        q11, q1,  #2
239        vshr.s16        q13, qa,  #2
240        vshr.s16        q15, q3,  #2
241        vsub.i16        q3,  q3,  q9
242        vsub.i16        qa,  q11, qa
243        vadd.i16        q1,  q1,  q13
244        vadd.i16        q0,  q0,  q15
245  .if \pass == 0
246        vsub.i16        q15, q8,  q3
247        vadd.i16        q8,  q8,  q3
248        vadd.i16        q9,  q10, q2
249        vsub.i16        q2,  q10, q2
250        vtrn.16         q8,  q9
251        vadd.i16        q10, q12, q1
252        vtrn.16         q2,  q15
253        vadd.i16        q11, q14, q0
254        vsub.i16        q13, q12, q1
255        vtrn.16         q10, q11
256        vsub.i16        q12, q14, q0
257  .else
258        vsub.i16        q15, q8,  q3
259        vadd.i16        q8,  q8,  q3
260        vadd.i16        q9,  q10, q14
261        vsub.i16        q14, q10, q14
262        vadd.i16        q10, q12, q1
263        vsub.i16        q13, q12, q1
264        vadd.i16        q11, q2, q0
265        vsub.i16        q12, q2, q0
266  .endif
267        .unreq          qa
268        .unreq          qb
269.endm
270
271function ff_h264_idct8_add_neon, export=1
272h264_idct8_add_neon_nothumb:
273        vmov.i16        q3,       #0
274        vld1.16         {q8-q9},  [r1,:128]
275        vst1.16         {q3},     [r1,:128]!
276        vst1.16         {q3},     [r1,:128]!
277        vld1.16         {q10-q11},[r1,:128]
278        vst1.16         {q3},     [r1,:128]!
279        vst1.16         {q3},     [r1,:128]!
280        vld1.16         {q12-q13},[r1,:128]
281        vst1.16         {q3},     [r1,:128]!
282        vst1.16         {q3},     [r1,:128]!
283
284        idct8x8_cols    0
285        idct8x8_cols    1
286
287        mov             r3,  r0
288        vrshr.s16       q8,  q8,  #6
289        vld1.8          {d0},     [r0,:64], r2
290        vrshr.s16       q9,  q9,  #6
291        vld1.8          {d1},     [r0,:64], r2
292        vrshr.s16       q10, q10, #6
293        vld1.8          {d2},     [r0,:64], r2
294        vrshr.s16       q11, q11, #6
295        vld1.8          {d3},     [r0,:64], r2
296        vrshr.s16       q12, q12, #6
297        vld1.8          {d4},     [r0,:64], r2
298        vrshr.s16       q13, q13, #6
299        vld1.8          {d5},     [r0,:64], r2
300        vrshr.s16       q14, q14, #6
301        vld1.8          {d6},     [r0,:64], r2
302        vrshr.s16       q15, q15, #6
303        vld1.8          {d7},     [r0,:64], r2
304        vaddw.u8        q8,  q8,  d0
305        vaddw.u8        q9,  q9,  d1
306        vaddw.u8        q10, q10, d2
307        vqmovun.s16     d0,  q8
308        vaddw.u8        q11, q11, d3
309        vqmovun.s16     d1,  q9
310        vaddw.u8        q12, q12, d4
311        vqmovun.s16     d2,  q10
312        vst1.8          {d0},     [r3,:64], r2
313        vaddw.u8        q13, q13, d5
314        vqmovun.s16     d3,  q11
315        vst1.8          {d1},     [r3,:64], r2
316        vaddw.u8        q14, q14, d6
317        vqmovun.s16     d4,  q12
318        vst1.8          {d2},     [r3,:64], r2
319        vaddw.u8        q15, q15, d7
320        vqmovun.s16     d5,  q13
321        vst1.8          {d3},     [r3,:64], r2
322        vqmovun.s16     d6,  q14
323        vqmovun.s16     d7,  q15
324        vst1.8          {d4},     [r3,:64], r2
325        vst1.8          {d5},     [r3,:64], r2
326        vst1.8          {d6},     [r3,:64], r2
327        vst1.8          {d7},     [r3,:64], r2
328
329        sub             r1,  r1,  #128
330        bx              lr
331endfunc
332
333function ff_h264_idct8_dc_add_neon, export=1
334h264_idct8_dc_add_neon_nothumb:
335        mov             r3,       #0
336        vld1.16         {d30[],d31[]},[r1,:16]
337        strh            r3,       [r1]
338        vld1.32         {d0},     [r0,:64], r2
339        vrshr.s16       q15, q15, #6
340        vld1.32         {d1},     [r0,:64], r2
341        vld1.32         {d2},     [r0,:64], r2
342        vaddw.u8        q8,  q15, d0
343        vld1.32         {d3},     [r0,:64], r2
344        vaddw.u8        q9,  q15, d1
345        vld1.32         {d4},     [r0,:64], r2
346        vaddw.u8        q10, q15, d2
347        vld1.32         {d5},     [r0,:64], r2
348        vaddw.u8        q11, q15, d3
349        vld1.32         {d6},     [r0,:64], r2
350        vaddw.u8        q12, q15, d4
351        vld1.32         {d7},     [r0,:64], r2
352        vaddw.u8        q13, q15, d5
353        vaddw.u8        q14, q15, d6
354        vaddw.u8        q15, q15, d7
355        vqmovun.s16     d0,  q8
356        vqmovun.s16     d1,  q9
357        vqmovun.s16     d2,  q10
358        vqmovun.s16     d3,  q11
359        sub             r0,  r0,  r2, lsl #3
360        vst1.32         {d0},     [r0,:64], r2
361        vqmovun.s16     d4,  q12
362        vst1.32         {d1},     [r0,:64], r2
363        vqmovun.s16     d5,  q13
364        vst1.32         {d2},     [r0,:64], r2
365        vqmovun.s16     d6,  q14
366        vst1.32         {d3},     [r0,:64], r2
367        vqmovun.s16     d7,  q15
368        vst1.32         {d4},     [r0,:64], r2
369        vst1.32         {d5},     [r0,:64], r2
370        vst1.32         {d6},     [r0,:64], r2
371        vst1.32         {d7},     [r0,:64], r2
372        bx              lr
373endfunc
374
375function ff_h264_idct8_add4_neon, export=1
376        push            {r4-r8,lr}
377        mov             r4,  r0
378        mov             r5,  r1
379        mov             r1,  r2
380        mov             r2,  r3
381        ldr             r6,  [sp, #24]
382        movrel          r7,  scan8
383        mov             r12, #16
3841:      ldrb            r8,  [r7], #4
385        ldr             r0,  [r5], #16
386        ldrb            r8,  [r6, r8]
387        subs            r8,  r8,  #1
388        blt             2f
389        ldrsh           lr,  [r1]
390        add             r0,  r0,  r4
391        it              ne
392        movne           lr,  #0
393        cmp             lr,  #0
394        ite             ne
395        adrne           lr,  h264_idct8_dc_add_neon_nothumb + CONFIG_THUMB
396        adreq           lr,  h264_idct8_add_neon_nothumb    + CONFIG_THUMB
397        blx             lr
3982:      subs            r12, r12, #4
399        add             r1,  r1,  #128
400        bne             1b
401        pop             {r4-r8,pc}
402endfunc
403
404const   scan8
405        .byte           4+ 1*8, 5+ 1*8, 4+ 2*8, 5+ 2*8
406        .byte           6+ 1*8, 7+ 1*8, 6+ 2*8, 7+ 2*8
407        .byte           4+ 3*8, 5+ 3*8, 4+ 4*8, 5+ 4*8
408        .byte           6+ 3*8, 7+ 3*8, 6+ 4*8, 7+ 4*8
409        .byte           4+ 6*8, 5+ 6*8, 4+ 7*8, 5+ 7*8
410        .byte           6+ 6*8, 7+ 6*8, 6+ 7*8, 7+ 7*8
411        .byte           4+ 8*8, 5+ 8*8, 4+ 9*8, 5+ 9*8
412        .byte           6+ 8*8, 7+ 8*8, 6+ 9*8, 7+ 9*8
413        .byte           4+11*8, 5+11*8, 4+12*8, 5+12*8
414        .byte           6+11*8, 7+11*8, 6+12*8, 7+12*8
415        .byte           4+13*8, 5+13*8, 4+14*8, 5+14*8
416        .byte           6+13*8, 7+13*8, 6+14*8, 7+14*8
417endconst
418