34f467e86f93440dee987af0784763e4f846d515
[ffmpeg.git] / libavcodec / arm / idctdsp_arm.S
1 @
2 @ ARMv4-optimized IDCT functions
3 @ Copyright (c) 2004 AGAWA Koji <i (AT) atty (DOT) jp>
4 @
5 @ This file is part of Libav.
6 @
7 @ Libav is free software; you can redistribute it and/or
8 @ modify it under the terms of the GNU Lesser General Public
9 @ License as published by the Free Software Foundation; either
10 @ version 2.1 of the License, or (at your option) any later version.
11 @
12 @ Libav is distributed in the hope that it will be useful,
13 @ but WITHOUT ANY WARRANTY; without even the implied warranty of
14 @ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 @ Lesser General Public License for more details.
16 @
17 @ You should have received a copy of the GNU Lesser General Public
18 @ License along with Libav; if not, write to the Free Software
19 @ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 @
21
22 #include "config.h"
23 #include "libavutil/arm/asm.S"
24
25 @ void ff_add_pixels_clamped_arm(int16_t *block, uint8_t *dest, int stride)
26 function ff_add_pixels_clamped_arm, export=1, align=5
27         push            {r4-r10}
28         mov             r10, #8
29 1:
30         ldr             r4,  [r1]               /* load dest */
31         /* block[0] and block[1]*/
32         ldrsh           r5,  [r0]
33         ldrsh           r7,  [r0, #2]
34         and             r6,  r4,  #0xFF
35         and             r8,  r4,  #0xFF00
36         add             r6,  r6,  r5
37         add             r8,  r7,  r8,  lsr #8
38         mvn             r5,  r5
39         mvn             r7,  r7
40         tst             r6,  #0x100
41         it              ne
42         movne           r6,  r5,  lsr #24
43         tst             r8,  #0x100
44         it              ne
45         movne           r8,  r7,  lsr #24
46         mov             r9,  r6
47         ldrsh           r5,  [r0, #4]           /* moved form [A] */
48         orr             r9,  r9,  r8,  lsl #8
49         /* block[2] and block[3] */
50         /* [A] */
51         ldrsh           r7,  [r0, #6]
52         and             r6,  r4,  #0xFF0000
53         and             r8,  r4,  #0xFF000000
54         add             r6,  r5,  r6,  lsr #16
55         add             r8,  r7,  r8,  lsr #24
56         mvn             r5,  r5
57         mvn             r7,  r7
58         tst             r6,  #0x100
59         it              ne
60         movne           r6,  r5,  lsr #24
61         tst             r8,  #0x100
62         it              ne
63         movne           r8,  r7,  lsr #24
64         orr             r9,  r9,  r6,  lsl #16
65         ldr             r4,  [r1, #4]           /* moved form [B] */
66         orr             r9,  r9,  r8,  lsl #24
67         /* store dest */
68         ldrsh           r5,  [r0, #8]           /* moved form [C] */
69         str             r9,  [r1]
70
71         /* load dest */
72         /* [B] */
73         /* block[4] and block[5] */
74         /* [C] */
75         ldrsh           r7,  [r0, #10]
76         and             r6,  r4,  #0xFF
77         and             r8,  r4,  #0xFF00
78         add             r6,  r6,  r5
79         add             r8,  r7,  r8,  lsr #8
80         mvn             r5,  r5
81         mvn             r7,  r7
82         tst             r6,  #0x100
83         it              ne
84         movne           r6,  r5,  lsr #24
85         tst             r8,  #0x100
86         it              ne
87         movne           r8,  r7,  lsr #24
88         mov             r9,  r6
89         ldrsh           r5,  [r0, #12]          /* moved from [D] */
90         orr             r9,  r9,  r8,  lsl #8
91         /* block[6] and block[7] */
92         /* [D] */
93         ldrsh           r7,  [r0, #14]
94         and             r6,  r4,  #0xFF0000
95         and             r8,  r4,  #0xFF000000
96         add             r6,  r5,  r6,  lsr #16
97         add             r8,  r7,  r8,  lsr #24
98         mvn             r5,  r5
99         mvn             r7,  r7
100         tst             r6,  #0x100
101         it              ne
102         movne           r6,  r5,  lsr #24
103         tst             r8,  #0x100
104         it              ne
105         movne           r8,  r7,  lsr #24
106         orr             r9,  r9,  r6,  lsl #16
107         add             r0,  r0,  #16           /* moved from [E] */
108         orr             r9,  r9,  r8,  lsl #24
109         subs            r10, r10, #1            /* moved from [F] */
110         /* store dest */
111         str             r9,  [r1, #4]
112
113         /* [E] */
114         /* [F] */
115         add             r1,  r1,  r2
116         bne             1b
117
118         pop             {r4-r10}
119         bx              lr
120 endfunc