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