arm: hpeldsp: Move half-pel assembly from dsputil to hpeldsp
[ffmpeg.git] / libavcodec / arm / dsputil_arm.S
1 @
2 @ ARMv4 optimized DSP utils
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 #if !HAVE_ARMV5TE_EXTERNAL
26 #define pld @
27 #endif
28
29         .align 5
30 @ void ff_add_pixels_clamped_arm(int16_t *block, uint8_t *dest, int stride)
31 function ff_add_pixels_clamped_arm, export=1
32         push            {r4-r10}
33         mov             r10, #8
34 1:
35         ldr             r4,  [r1]               /* load dest */
36         /* block[0] and block[1]*/
37         ldrsh           r5,  [r0]
38         ldrsh           r7,  [r0, #2]
39         and             r6,  r4,  #0xFF
40         and             r8,  r4,  #0xFF00
41         add             r6,  r6,  r5
42         add             r8,  r7,  r8,  lsr #8
43         mvn             r5,  r5
44         mvn             r7,  r7
45         tst             r6,  #0x100
46         it              ne
47         movne           r6,  r5,  lsr #24
48         tst             r8,  #0x100
49         it              ne
50         movne           r8,  r7,  lsr #24
51         mov             r9,  r6
52         ldrsh           r5,  [r0, #4]           /* moved form [A] */
53         orr             r9,  r9,  r8,  lsl #8
54         /* block[2] and block[3] */
55         /* [A] */
56         ldrsh           r7,  [r0, #6]
57         and             r6,  r4,  #0xFF0000
58         and             r8,  r4,  #0xFF000000
59         add             r6,  r5,  r6,  lsr #16
60         add             r8,  r7,  r8,  lsr #24
61         mvn             r5,  r5
62         mvn             r7,  r7
63         tst             r6,  #0x100
64         it              ne
65         movne           r6,  r5,  lsr #24
66         tst             r8,  #0x100
67         it              ne
68         movne           r8,  r7,  lsr #24
69         orr             r9,  r9,  r6,  lsl #16
70         ldr             r4,  [r1, #4]           /* moved form [B] */
71         orr             r9,  r9,  r8,  lsl #24
72         /* store dest */
73         ldrsh           r5,  [r0, #8]           /* moved form [C] */
74         str             r9,  [r1]
75
76         /* load dest */
77         /* [B] */
78         /* block[4] and block[5] */
79         /* [C] */
80         ldrsh           r7,  [r0, #10]
81         and             r6,  r4,  #0xFF
82         and             r8,  r4,  #0xFF00
83         add             r6,  r6,  r5
84         add             r8,  r7,  r8,  lsr #8
85         mvn             r5,  r5
86         mvn             r7,  r7
87         tst             r6,  #0x100
88         it              ne
89         movne           r6,  r5,  lsr #24
90         tst             r8,  #0x100
91         it              ne
92         movne           r8,  r7,  lsr #24
93         mov             r9,  r6
94         ldrsh           r5,  [r0, #12]          /* moved from [D] */
95         orr             r9,  r9,  r8,  lsl #8
96         /* block[6] and block[7] */
97         /* [D] */
98         ldrsh           r7,  [r0, #14]
99         and             r6,  r4,  #0xFF0000
100         and             r8,  r4,  #0xFF000000
101         add             r6,  r5,  r6,  lsr #16
102         add             r8,  r7,  r8,  lsr #24
103         mvn             r5,  r5
104         mvn             r7,  r7
105         tst             r6,  #0x100
106         it              ne
107         movne           r6,  r5,  lsr #24
108         tst             r8,  #0x100
109         it              ne
110         movne           r8,  r7,  lsr #24
111         orr             r9,  r9,  r6,  lsl #16
112         add             r0,  r0,  #16           /* moved from [E] */
113         orr             r9,  r9,  r8,  lsl #24
114         subs            r10, r10, #1            /* moved from [F] */
115         /* store dest */
116         str             r9,  [r1, #4]
117
118         /* [E] */
119         /* [F] */
120         add             r1,  r1,  r2
121         bne             1b
122
123         pop             {r4-r10}
124         bx              lr
125 endfunc