]> git.sesse.net Git - ffmpeg/blob - libavcodec/arm/simple_idct_armv5te.S
Merge commit '9446d75941d639f19cfa9ae007eb4c5ca041f200'
[ffmpeg] / libavcodec / arm / simple_idct_armv5te.S
1 /*
2  * Simple IDCT
3  *
4  * Copyright (c) 2001 Michael Niedermayer <michaelni@gmx.at>
5  * Copyright (c) 2006 Mans Rullgard <mans@mansr.com>
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23
24 #include "asm.S"
25
26 #define W1  22725   /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
27 #define W2  21407   /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
28 #define W3  19266   /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
29 #define W4  16383   /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
30 #define W5  12873   /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
31 #define W6  8867    /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
32 #define W7  4520    /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */
33 #define ROW_SHIFT 11
34 #define COL_SHIFT 20
35
36 #define W13 (W1 | (W3 << 16))
37 #define W26 (W2 | (W6 << 16))
38 #define W57 (W5 | (W7 << 16))
39
40         .text
41         .align
42 w13:    .long W13
43 w26:    .long W26
44 w57:    .long W57
45
46 function idct_row_armv5te
47         str    lr, [sp, #-4]!
48
49         ldrd   v1, [a1, #8]
50         ldrd   a3, [a1]              /* a3 = row[1:0], a4 = row[3:2] */
51         orrs   v1, v1, v2
52         cmpeq  v1, a4
53         cmpeq  v1, a3, lsr #16
54         beq    row_dc_only
55
56         mov    v1, #(1<<(ROW_SHIFT-1))
57         mov    ip, #16384
58         sub    ip, ip, #1            /* ip = W4 */
59         smlabb v1, ip, a3, v1        /* v1 = W4*row[0]+(1<<(RS-1)) */
60         ldr    ip, w26               /* ip = W2 | (W6 << 16) */
61         smultb a2, ip, a4
62         smulbb lr, ip, a4
63         add    v2, v1, a2
64         sub    v3, v1, a2
65         sub    v4, v1, lr
66         add    v1, v1, lr
67
68         ldr    ip, w13               /* ip = W1 | (W3 << 16) */
69         ldr    lr, w57               /* lr = W5 | (W7 << 16) */
70         smulbt v5, ip, a3
71         smultt v6, lr, a4
72         smlatt v5, ip, a4, v5
73         smultt a2, ip, a3
74         smulbt v7, lr, a3
75         sub    v6, v6, a2
76         smulbt a2, ip, a4
77         smultt fp, lr, a3
78         sub    v7, v7, a2
79         smulbt a2, lr, a4
80         ldrd   a3, [a1, #8]          /* a3=row[5:4] a4=row[7:6] */
81         sub    fp, fp, a2
82
83         orrs   a2, a3, a4
84         beq    1f
85
86         smlabt v5, lr, a3, v5
87         smlabt v6, ip, a3, v6
88         smlatt v5, lr, a4, v5
89         smlabt v6, lr, a4, v6
90         smlatt v7, lr, a3, v7
91         smlatt fp, ip, a3, fp
92         smulbt a2, ip, a4
93         smlatt v7, ip, a4, v7
94         sub    fp, fp, a2
95
96         ldr    ip, w26               /* ip = W2 | (W6 << 16) */
97         mov    a2, #16384
98         sub    a2, a2, #1            /* a2 =  W4 */
99         smulbb a2, a2, a3            /* a2 =  W4*row[4] */
100         smultb lr, ip, a4            /* lr =  W6*row[6] */
101         add    v1, v1, a2            /* v1 += W4*row[4] */
102         add    v1, v1, lr            /* v1 += W6*row[6] */
103         add    v4, v4, a2            /* v4 += W4*row[4] */
104         sub    v4, v4, lr            /* v4 -= W6*row[6] */
105         smulbb lr, ip, a4            /* lr =  W2*row[6] */
106         sub    v2, v2, a2            /* v2 -= W4*row[4] */
107         sub    v2, v2, lr            /* v2 -= W2*row[6] */
108         sub    v3, v3, a2            /* v3 -= W4*row[4] */
109         add    v3, v3, lr            /* v3 += W2*row[6] */
110
111 1:      add    a2, v1, v5
112         mov    a3, a2, lsr #11
113         bic    a3, a3, #0x1f0000
114         sub    a2, v2, v6
115         mov    a2, a2, lsr #11
116         add    a3, a3, a2, lsl #16
117         add    a2, v3, v7
118         mov    a4, a2, lsr #11
119         bic    a4, a4, #0x1f0000
120         add    a2, v4, fp
121         mov    a2, a2, lsr #11
122         add    a4, a4, a2, lsl #16
123         strd   a3, [a1]
124
125         sub    a2, v4, fp
126         mov    a3, a2, lsr #11
127         bic    a3, a3, #0x1f0000
128         sub    a2, v3, v7
129         mov    a2, a2, lsr #11
130         add    a3, a3, a2, lsl #16
131         add    a2, v2, v6
132         mov    a4, a2, lsr #11
133         bic    a4, a4, #0x1f0000
134         sub    a2, v1, v5
135         mov    a2, a2, lsr #11
136         add    a4, a4, a2, lsl #16
137         strd   a3, [a1, #8]
138
139         ldr    pc, [sp], #4
140
141 row_dc_only:
142         orr    a3, a3, a3, lsl #16
143         bic    a3, a3, #0xe000
144         mov    a3, a3, lsl #3
145         mov    a4, a3
146         strd   a3, [a1]
147         strd   a3, [a1, #8]
148
149         ldr    pc, [sp], #4
150 endfunc
151
152         .macro idct_col
153         ldr    a4, [a1]              /* a4 = col[1:0] */
154         mov    ip, #16384
155         sub    ip, ip, #1            /* ip = W4 */
156 #if 0
157         mov    v1, #(1<<(COL_SHIFT-1))
158         smlabt v2, ip, a4, v1        /* v2 = W4*col[1] + (1<<(COL_SHIFT-1)) */
159         smlabb v1, ip, a4, v1        /* v1 = W4*col[0] + (1<<(COL_SHIFT-1)) */
160         ldr    a4, [a1, #(16*4)]
161 #else
162         mov    v1, #((1<<(COL_SHIFT-1))/W4) /* this matches the C version */
163         add    v2, v1, a4, asr #16
164         rsb    v2, v2, v2, lsl #14
165         mov    a4, a4, lsl #16
166         add    v1, v1, a4, asr #16
167         ldr    a4, [a1, #(16*4)]
168         rsb    v1, v1, v1, lsl #14
169 #endif
170
171         smulbb lr, ip, a4
172         smulbt a3, ip, a4
173         sub    v3, v1, lr
174         sub    v5, v1, lr
175         add    v7, v1, lr
176         add    v1, v1, lr
177         sub    v4, v2, a3
178         sub    v6, v2, a3
179         add    fp, v2, a3
180         ldr    ip, w26
181         ldr    a4, [a1, #(16*2)]
182         add    v2, v2, a3
183
184         smulbb lr, ip, a4
185         smultb a3, ip, a4
186         add    v1, v1, lr
187         sub    v7, v7, lr
188         add    v3, v3, a3
189         sub    v5, v5, a3
190         smulbt lr, ip, a4
191         smultt a3, ip, a4
192         add    v2, v2, lr
193         sub    fp, fp, lr
194         add    v4, v4, a3
195         ldr    a4, [a1, #(16*6)]
196         sub    v6, v6, a3
197
198         smultb lr, ip, a4
199         smulbb a3, ip, a4
200         add    v1, v1, lr
201         sub    v7, v7, lr
202         sub    v3, v3, a3
203         add    v5, v5, a3
204         smultt lr, ip, a4
205         smulbt a3, ip, a4
206         add    v2, v2, lr
207         sub    fp, fp, lr
208         sub    v4, v4, a3
209         add    v6, v6, a3
210
211         stmfd  sp!, {v1, v2, v3, v4, v5, v6, v7, fp}
212
213         ldr    ip, w13
214         ldr    a4, [a1, #(16*1)]
215         ldr    lr, w57
216         smulbb v1, ip, a4
217         smultb v3, ip, a4
218         smulbb v5, lr, a4
219         smultb v7, lr, a4
220         smulbt v2, ip, a4
221         smultt v4, ip, a4
222         smulbt v6, lr, a4
223         smultt fp, lr, a4
224         rsb    v4, v4, #0
225         ldr    a4, [a1, #(16*3)]
226         rsb    v3, v3, #0
227
228         smlatb v1, ip, a4, v1
229         smlatb v3, lr, a4, v3
230         smulbb a3, ip, a4
231         smulbb a2, lr, a4
232         sub    v5, v5, a3
233         sub    v7, v7, a2
234         smlatt v2, ip, a4, v2
235         smlatt v4, lr, a4, v4
236         smulbt a3, ip, a4
237         smulbt a2, lr, a4
238         sub    v6, v6, a3
239         ldr    a4, [a1, #(16*5)]
240         sub    fp, fp, a2
241
242         smlabb v1, lr, a4, v1
243         smlabb v3, ip, a4, v3
244         smlatb v5, lr, a4, v5
245         smlatb v7, ip, a4, v7
246         smlabt v2, lr, a4, v2
247         smlabt v4, ip, a4, v4
248         smlatt v6, lr, a4, v6
249         ldr    a3, [a1, #(16*7)]
250         smlatt fp, ip, a4, fp
251
252         smlatb v1, lr, a3, v1
253         smlabb v3, lr, a3, v3
254         smlatb v5, ip, a3, v5
255         smulbb a4, ip, a3
256         smlatt v2, lr, a3, v2
257         sub    v7, v7, a4
258         smlabt v4, lr, a3, v4
259         smulbt a4, ip, a3
260         smlatt v6, ip, a3, v6
261         sub    fp, fp, a4
262         .endm
263
264 function idct_col_armv5te
265         str    lr, [sp, #-4]!
266
267         idct_col
268
269         ldmfd  sp!, {a3, a4}
270         adds   a2, a3, v1
271         mov    a2, a2, lsr #20
272         orrmi  a2, a2, #0xf000
273         add    ip, a4, v2
274         mov    ip, ip, asr #20
275         orr    a2, a2, ip, lsl #16
276         str    a2, [a1]
277         subs   a3, a3, v1
278         mov    a2, a3, lsr #20
279         orrmi  a2, a2, #0xf000
280         sub    a4, a4, v2
281         mov    a4, a4, asr #20
282         orr    a2, a2, a4, lsl #16
283         ldmfd  sp!, {a3, a4}
284         str    a2, [a1, #(16*7)]
285
286         subs   a2, a3, v3
287         mov    a2, a2, lsr #20
288         orrmi  a2, a2, #0xf000
289         sub    ip, a4, v4
290         mov    ip, ip, asr #20
291         orr    a2, a2, ip, lsl #16
292         str    a2, [a1, #(16*1)]
293         adds   a3, a3, v3
294         mov    a2, a3, lsr #20
295         orrmi  a2, a2, #0xf000
296         add    a4, a4, v4
297         mov    a4, a4, asr #20
298         orr    a2, a2, a4, lsl #16
299         ldmfd  sp!, {a3, a4}
300         str    a2, [a1, #(16*6)]
301
302         adds   a2, a3, v5
303         mov    a2, a2, lsr #20
304         orrmi  a2, a2, #0xf000
305         add    ip, a4, v6
306         mov    ip, ip, asr #20
307         orr    a2, a2, ip, lsl #16
308         str    a2, [a1, #(16*2)]
309         subs   a3, a3, v5
310         mov    a2, a3, lsr #20
311         orrmi  a2, a2, #0xf000
312         sub    a4, a4, v6
313         mov    a4, a4, asr #20
314         orr    a2, a2, a4, lsl #16
315         ldmfd  sp!, {a3, a4}
316         str    a2, [a1, #(16*5)]
317
318         adds   a2, a3, v7
319         mov    a2, a2, lsr #20
320         orrmi  a2, a2, #0xf000
321         add    ip, a4, fp
322         mov    ip, ip, asr #20
323         orr    a2, a2, ip, lsl #16
324         str    a2, [a1, #(16*3)]
325         subs   a3, a3, v7
326         mov    a2, a3, lsr #20
327         orrmi  a2, a2, #0xf000
328         sub    a4, a4, fp
329         mov    a4, a4, asr #20
330         orr    a2, a2, a4, lsl #16
331         str    a2, [a1, #(16*4)]
332
333         ldr    pc, [sp], #4
334 endfunc
335
336 .macro  clip   dst, src:vararg
337         movs   \dst, \src
338         movmi  \dst, #0
339         cmp    \dst, #255
340         movgt  \dst, #255
341 .endm
342
343 .macro  aclip  dst, src:vararg
344         adds   \dst, \src
345         movmi  \dst, #0
346         cmp    \dst, #255
347         movgt  \dst, #255
348 .endm
349
350 function idct_col_put_armv5te
351         str    lr, [sp, #-4]!
352
353         idct_col
354
355         ldmfd  sp!, {a3, a4}
356         ldr    lr, [sp, #32]
357         add    a2, a3, v1
358         clip   a2, a2, asr #20
359         add    ip, a4, v2
360         clip   ip, ip, asr #20
361         orr    a2, a2, ip, lsl #8
362         sub    a3, a3, v1
363         clip   a3, a3, asr #20
364         sub    a4, a4, v2
365         clip   a4, a4, asr #20
366         ldr    v1, [sp, #28]
367         strh   a2, [v1]
368         add    a2, v1, #2
369         str    a2, [sp, #28]
370         orr    a2, a3, a4, lsl #8
371         rsb    v2, lr, lr, lsl #3
372         ldmfd  sp!, {a3, a4}
373         strh   a2, [v2, v1]!
374
375         sub    a2, a3, v3
376         clip   a2, a2, asr #20
377         sub    ip, a4, v4
378         clip   ip, ip, asr #20
379         orr    a2, a2, ip, lsl #8
380         strh   a2, [v1, lr]!
381         add    a3, a3, v3
382         clip   a2, a3, asr #20
383         add    a4, a4, v4
384         clip   a4, a4, asr #20
385         orr    a2, a2, a4, lsl #8
386         ldmfd  sp!, {a3, a4}
387         strh   a2, [v2, -lr]!
388
389         add    a2, a3, v5
390         clip   a2, a2, asr #20
391         add    ip, a4, v6
392         clip   ip, ip, asr #20
393         orr    a2, a2, ip, lsl #8
394         strh   a2, [v1, lr]!
395         sub    a3, a3, v5
396         clip   a2, a3, asr #20
397         sub    a4, a4, v6
398         clip   a4, a4, asr #20
399         orr    a2, a2, a4, lsl #8
400         ldmfd  sp!, {a3, a4}
401         strh   a2, [v2, -lr]!
402
403         add    a2, a3, v7
404         clip   a2, a2, asr #20
405         add    ip, a4, fp
406         clip   ip, ip, asr #20
407         orr    a2, a2, ip, lsl #8
408         strh   a2, [v1, lr]
409         sub    a3, a3, v7
410         clip   a2, a3, asr #20
411         sub    a4, a4, fp
412         clip   a4, a4, asr #20
413         orr    a2, a2, a4, lsl #8
414         strh   a2, [v2, -lr]
415
416         ldr    pc, [sp], #4
417 endfunc
418
419 function idct_col_add_armv5te
420         str    lr, [sp, #-4]!
421
422         idct_col
423
424         ldr    lr, [sp, #36]
425
426         ldmfd  sp!, {a3, a4}
427         ldrh   ip, [lr]
428         add    a2, a3, v1
429         sub    a3, a3, v1
430         and    v1, ip, #255
431         aclip  a2, v1, a2, asr #20
432         add    v1, a4, v2
433         mov    v1, v1, asr #20
434         aclip  v1, v1, ip, lsr #8
435         orr    a2, a2, v1, lsl #8
436         ldr    v1, [sp, #32]
437         sub    a4, a4, v2
438         rsb    v2, v1, v1, lsl #3
439         ldrh   ip, [v2, lr]!
440         strh   a2, [lr]
441         and    a2, ip, #255
442         aclip  a3, a2, a3, asr #20
443         mov    a4, a4, asr #20
444         aclip  a4, a4, ip, lsr #8
445         add    a2, lr, #2
446         str    a2, [sp, #28]
447         orr    a2, a3, a4, lsl #8
448         strh   a2, [v2]
449
450         ldmfd  sp!, {a3, a4}
451         ldrh   ip, [lr, v1]!
452         sub    a2, a3, v3
453         add    a3, a3, v3
454         and    v3, ip, #255
455         aclip  a2, v3, a2, asr #20
456         sub    v3, a4, v4
457         mov    v3, v3, asr #20
458         aclip  v3, v3, ip, lsr #8
459         orr    a2, a2, v3, lsl #8
460         add    a4, a4, v4
461         ldrh   ip, [v2, -v1]!
462         strh   a2, [lr]
463         and    a2, ip, #255
464         aclip  a3, a2, a3, asr #20
465         mov    a4, a4, asr #20
466         aclip  a4, a4, ip, lsr #8
467         orr    a2, a3, a4, lsl #8
468         strh   a2, [v2]
469
470         ldmfd  sp!, {a3, a4}
471         ldrh   ip, [lr, v1]!
472         add    a2, a3, v5
473         sub    a3, a3, v5
474         and    v3, ip, #255
475         aclip  a2, v3, a2, asr #20
476         add    v3, a4, v6
477         mov    v3, v3, asr #20
478         aclip  v3, v3, ip, lsr #8
479         orr    a2, a2, v3, lsl #8
480         sub    a4, a4, v6
481         ldrh   ip, [v2, -v1]!
482         strh   a2, [lr]
483         and    a2, ip, #255
484         aclip  a3, a2, a3, asr #20
485         mov    a4, a4, asr #20
486         aclip  a4, a4, ip, lsr #8
487         orr    a2, a3, a4, lsl #8
488         strh   a2, [v2]
489
490         ldmfd  sp!, {a3, a4}
491         ldrh   ip, [lr, v1]!
492         add    a2, a3, v7
493         sub    a3, a3, v7
494         and    v3, ip, #255
495         aclip  a2, v3, a2, asr #20
496         add    v3, a4, fp
497         mov    v3, v3, asr #20
498         aclip  v3, v3, ip, lsr #8
499         orr    a2, a2, v3, lsl #8
500         sub    a4, a4, fp
501         ldrh   ip, [v2, -v1]!
502         strh   a2, [lr]
503         and    a2, ip, #255
504         aclip  a3, a2, a3, asr #20
505         mov    a4, a4, asr #20
506         aclip  a4, a4, ip, lsr #8
507         orr    a2, a3, a4, lsl #8
508         strh   a2, [v2]
509
510         ldr    pc, [sp], #4
511 endfunc
512
513 function ff_simple_idct_armv5te, export=1
514         stmfd  sp!, {v1, v2, v3, v4, v5, v6, v7, fp, lr}
515
516         bl     idct_row_armv5te
517         add    a1, a1, #16
518         bl     idct_row_armv5te
519         add    a1, a1, #16
520         bl     idct_row_armv5te
521         add    a1, a1, #16
522         bl     idct_row_armv5te
523         add    a1, a1, #16
524         bl     idct_row_armv5te
525         add    a1, a1, #16
526         bl     idct_row_armv5te
527         add    a1, a1, #16
528         bl     idct_row_armv5te
529         add    a1, a1, #16
530         bl     idct_row_armv5te
531
532         sub    a1, a1, #(16*7)
533
534         bl     idct_col_armv5te
535         add    a1, a1, #4
536         bl     idct_col_armv5te
537         add    a1, a1, #4
538         bl     idct_col_armv5te
539         add    a1, a1, #4
540         bl     idct_col_armv5te
541
542         ldmfd  sp!, {v1, v2, v3, v4, v5, v6, v7, fp, pc}
543 endfunc
544
545 function ff_simple_idct_add_armv5te, export=1
546         stmfd  sp!, {a1, a2, v1, v2, v3, v4, v5, v6, v7, fp, lr}
547
548         mov    a1, a3
549
550         bl     idct_row_armv5te
551         add    a1, a1, #16
552         bl     idct_row_armv5te
553         add    a1, a1, #16
554         bl     idct_row_armv5te
555         add    a1, a1, #16
556         bl     idct_row_armv5te
557         add    a1, a1, #16
558         bl     idct_row_armv5te
559         add    a1, a1, #16
560         bl     idct_row_armv5te
561         add    a1, a1, #16
562         bl     idct_row_armv5te
563         add    a1, a1, #16
564         bl     idct_row_armv5te
565
566         sub    a1, a1, #(16*7)
567
568         bl     idct_col_add_armv5te
569         add    a1, a1, #4
570         bl     idct_col_add_armv5te
571         add    a1, a1, #4
572         bl     idct_col_add_armv5te
573         add    a1, a1, #4
574         bl     idct_col_add_armv5te
575
576         add    sp, sp, #8
577         ldmfd  sp!, {v1, v2, v3, v4, v5, v6, v7, fp, pc}
578 endfunc
579
580 function ff_simple_idct_put_armv5te, export=1
581         stmfd  sp!, {a1, a2, v1, v2, v3, v4, v5, v6, v7, fp, lr}
582
583         mov    a1, a3
584
585         bl     idct_row_armv5te
586         add    a1, a1, #16
587         bl     idct_row_armv5te
588         add    a1, a1, #16
589         bl     idct_row_armv5te
590         add    a1, a1, #16
591         bl     idct_row_armv5te
592         add    a1, a1, #16
593         bl     idct_row_armv5te
594         add    a1, a1, #16
595         bl     idct_row_armv5te
596         add    a1, a1, #16
597         bl     idct_row_armv5te
598         add    a1, a1, #16
599         bl     idct_row_armv5te
600
601         sub    a1, a1, #(16*7)
602
603         bl     idct_col_put_armv5te
604         add    a1, a1, #4
605         bl     idct_col_put_armv5te
606         add    a1, a1, #4
607         bl     idct_col_put_armv5te
608         add    a1, a1, #4
609         bl     idct_col_put_armv5te
610
611         add    sp, sp, #8
612         ldmfd  sp!, {v1, v2, v3, v4, v5, v6, v7, fp, pc}
613 endfunc