Mercurial > mplayer.hg
annotate libswscale/rgb2rgb_template.c @ 30041:dea60722b5a3
Move code to write multiple inclusion guards to generated files into functions.
author | diego |
---|---|
date | Sun, 20 Dec 2009 17:01:47 +0000 |
parents | 01b933e5d04c |
children | 1e02e823023c |
rev | line source |
---|---|
18861 | 1 /* |
27158 | 2 * software RGB to RGB converter |
3 * pluralize by software PAL8 to RGB converter | |
4 * software YUV to YUV converter | |
5 * software YUV to RGB converter | |
6 * Written by Nick Kurshev. | |
7 * palette & YUV & runtime CPU stuff by Michael (michaelni@gmx.at) | |
8 * lot of big-endian byte order fixes by Alex Beregszaszi | |
19703
ad7f49a1ba95
Add official GPL header to make license explicit as discussed on ffmpeg-devel.
diego
parents:
19396
diff
changeset
|
9 * |
20094
aca9e9783f67
Change license headers to say 'FFmpeg' instead of 'this program'.
diego
parents:
19703
diff
changeset
|
10 * This file is part of FFmpeg. |
aca9e9783f67
Change license headers to say 'FFmpeg' instead of 'this program'.
diego
parents:
19703
diff
changeset
|
11 * |
aca9e9783f67
Change license headers to say 'FFmpeg' instead of 'this program'.
diego
parents:
19703
diff
changeset
|
12 * FFmpeg is free software; you can redistribute it and/or modify |
19703
ad7f49a1ba95
Add official GPL header to make license explicit as discussed on ffmpeg-devel.
diego
parents:
19396
diff
changeset
|
13 * it under the terms of the GNU General Public License as published by |
ad7f49a1ba95
Add official GPL header to make license explicit as discussed on ffmpeg-devel.
diego
parents:
19396
diff
changeset
|
14 * the Free Software Foundation; either version 2 of the License, or |
ad7f49a1ba95
Add official GPL header to make license explicit as discussed on ffmpeg-devel.
diego
parents:
19396
diff
changeset
|
15 * (at your option) any later version. |
ad7f49a1ba95
Add official GPL header to make license explicit as discussed on ffmpeg-devel.
diego
parents:
19396
diff
changeset
|
16 * |
20094
aca9e9783f67
Change license headers to say 'FFmpeg' instead of 'this program'.
diego
parents:
19703
diff
changeset
|
17 * FFmpeg is distributed in the hope that it will be useful, |
19703
ad7f49a1ba95
Add official GPL header to make license explicit as discussed on ffmpeg-devel.
diego
parents:
19396
diff
changeset
|
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
ad7f49a1ba95
Add official GPL header to make license explicit as discussed on ffmpeg-devel.
diego
parents:
19396
diff
changeset
|
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ad7f49a1ba95
Add official GPL header to make license explicit as discussed on ffmpeg-devel.
diego
parents:
19396
diff
changeset
|
20 * GNU General Public License for more details. |
ad7f49a1ba95
Add official GPL header to make license explicit as discussed on ffmpeg-devel.
diego
parents:
19396
diff
changeset
|
21 * |
ad7f49a1ba95
Add official GPL header to make license explicit as discussed on ffmpeg-devel.
diego
parents:
19396
diff
changeset
|
22 * You should have received a copy of the GNU General Public License |
20094
aca9e9783f67
Change license headers to say 'FFmpeg' instead of 'this program'.
diego
parents:
19703
diff
changeset
|
23 * along with FFmpeg; if not, write to the Free Software |
23702 | 24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
23129 | 25 * |
27158 | 26 * The C code (not assembly, MMX, ...) of this file can be used |
25109 | 27 * under the LGPL license. |
18861 | 28 */ |
29 | |
30 #include <stddef.h> | |
31 | |
32 #undef PREFETCH | |
33 #undef MOVNTQ | |
34 #undef EMMS | |
35 #undef SFENCE | |
36 #undef MMREG_SIZE | |
37 #undef PREFETCHW | |
38 #undef PAVGB | |
39 | |
28276 | 40 #if HAVE_SSE2 |
18861 | 41 #define MMREG_SIZE 16 |
42 #else | |
43 #define MMREG_SIZE 8 | |
44 #endif | |
45 | |
28323
99c49467ebbc
HAVE_3DNOW --> HAVE_AMD3DNOW to sync with latest configure changes.
diego
parents:
28276
diff
changeset
|
46 #if HAVE_AMD3DNOW |
18861 | 47 #define PREFETCH "prefetch" |
48 #define PREFETCHW "prefetchw" | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
49 #define PAVGB "pavgusb" |
28276 | 50 #elif HAVE_MMX2 |
18861 | 51 #define PREFETCH "prefetchnta" |
52 #define PREFETCHW "prefetcht0" | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
53 #define PAVGB "pavgb" |
18861 | 54 #else |
20724
b8fe18a742ce
Fix MacIntel build: "/nop" is illegal on Apple's older version of GAS
gpoirier
parents:
20094
diff
changeset
|
55 #define PREFETCH " # nop" |
b8fe18a742ce
Fix MacIntel build: "/nop" is illegal on Apple's older version of GAS
gpoirier
parents:
20094
diff
changeset
|
56 #define PREFETCHW " # nop" |
18861 | 57 #endif |
58 | |
28323
99c49467ebbc
HAVE_3DNOW --> HAVE_AMD3DNOW to sync with latest configure changes.
diego
parents:
28276
diff
changeset
|
59 #if HAVE_AMD3DNOW |
27782 | 60 /* On K6 femms is faster than emms. On K7 femms is directly mapped to emms. */ |
18861 | 61 #define EMMS "femms" |
62 #else | |
63 #define EMMS "emms" | |
64 #endif | |
65 | |
28276 | 66 #if HAVE_MMX2 |
18861 | 67 #define MOVNTQ "movntq" |
68 #define SFENCE "sfence" | |
69 #else | |
70 #define MOVNTQ "movq" | |
20724
b8fe18a742ce
Fix MacIntel build: "/nop" is illegal on Apple's older version of GAS
gpoirier
parents:
20094
diff
changeset
|
71 #define SFENCE " # nop" |
18861 | 72 #endif |
73 | |
27486 | 74 static inline void RENAME(rgb24tobgr32)(const uint8_t *src, uint8_t *dst, long src_size) |
18861 | 75 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
76 uint8_t *dest = dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
77 const uint8_t *s = src; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
78 const uint8_t *end; |
29612 | 79 #if HAVE_MMX |
29480 | 80 const uint8_t *mm_end; |
29612 | 81 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
82 end = s + src_size; |
29612 | 83 #if HAVE_MMX |
29480 | 84 __asm__ volatile(PREFETCH" %0"::"m"(*s):"memory"); |
85 mm_end = end - 23; | |
86 __asm__ volatile("movq %0, %%mm7"::"m"(mask32a):"memory"); | |
29481 | 87 while (s < mm_end) { |
29480 | 88 __asm__ volatile( |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
89 PREFETCH" 32%1 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
90 "movd %1, %%mm0 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
91 "punpckldq 3%1, %%mm0 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
92 "movd 6%1, %%mm1 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
93 "punpckldq 9%1, %%mm1 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
94 "movd 12%1, %%mm2 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
95 "punpckldq 15%1, %%mm2 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
96 "movd 18%1, %%mm3 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
97 "punpckldq 21%1, %%mm3 \n\t" |
28721
267dd38c800e
When converting from a non alpha format to an alpha format, defaults to all ones rather than all zeroes
sdrik
parents:
28323
diff
changeset
|
98 "por %%mm7, %%mm0 \n\t" |
267dd38c800e
When converting from a non alpha format to an alpha format, defaults to all ones rather than all zeroes
sdrik
parents:
28323
diff
changeset
|
99 "por %%mm7, %%mm1 \n\t" |
267dd38c800e
When converting from a non alpha format to an alpha format, defaults to all ones rather than all zeroes
sdrik
parents:
28323
diff
changeset
|
100 "por %%mm7, %%mm2 \n\t" |
267dd38c800e
When converting from a non alpha format to an alpha format, defaults to all ones rather than all zeroes
sdrik
parents:
28323
diff
changeset
|
101 "por %%mm7, %%mm3 \n\t" |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
102 MOVNTQ" %%mm0, %0 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
103 MOVNTQ" %%mm1, 8%0 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
104 MOVNTQ" %%mm2, 16%0 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
105 MOVNTQ" %%mm3, 24%0" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
106 :"=m"(*dest) |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
107 :"m"(*s) |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
108 :"memory"); |
29480 | 109 dest += 32; |
110 s += 24; | |
111 } | |
112 __asm__ volatile(SFENCE:::"memory"); | |
113 __asm__ volatile(EMMS:::"memory"); | |
29612 | 114 #endif |
29481 | 115 while (s < end) { |
29612 | 116 #if HAVE_BIGENDIAN |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
117 /* RGB24 (= R,G,B) -> RGB32 (= A,B,G,R) */ |
28721
267dd38c800e
When converting from a non alpha format to an alpha format, defaults to all ones rather than all zeroes
sdrik
parents:
28323
diff
changeset
|
118 *dest++ = 255; |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
119 *dest++ = s[2]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
120 *dest++ = s[1]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
121 *dest++ = s[0]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
122 s+=3; |
29612 | 123 #else |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
124 *dest++ = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
125 *dest++ = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
126 *dest++ = *s++; |
28721
267dd38c800e
When converting from a non alpha format to an alpha format, defaults to all ones rather than all zeroes
sdrik
parents:
28323
diff
changeset
|
127 *dest++ = 255; |
29612 | 128 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
129 } |
18861 | 130 } |
131 | |
27486 | 132 static inline void RENAME(rgb32tobgr24)(const uint8_t *src, uint8_t *dst, long src_size) |
18861 | 133 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
134 uint8_t *dest = dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
135 const uint8_t *s = src; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
136 const uint8_t *end; |
28276 | 137 #if HAVE_MMX |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
138 const uint8_t *mm_end; |
18861 | 139 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
140 end = s + src_size; |
28276 | 141 #if HAVE_MMX |
27744 | 142 __asm__ volatile(PREFETCH" %0"::"m"(*s):"memory"); |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
143 mm_end = end - 31; |
29481 | 144 while (s < mm_end) { |
27744 | 145 __asm__ volatile( |
29480 | 146 PREFETCH" 32%1 \n\t" |
147 "movq %1, %%mm0 \n\t" | |
148 "movq 8%1, %%mm1 \n\t" | |
149 "movq 16%1, %%mm4 \n\t" | |
150 "movq 24%1, %%mm5 \n\t" | |
151 "movq %%mm0, %%mm2 \n\t" | |
152 "movq %%mm1, %%mm3 \n\t" | |
153 "movq %%mm4, %%mm6 \n\t" | |
154 "movq %%mm5, %%mm7 \n\t" | |
155 "psrlq $8, %%mm2 \n\t" | |
156 "psrlq $8, %%mm3 \n\t" | |
157 "psrlq $8, %%mm6 \n\t" | |
158 "psrlq $8, %%mm7 \n\t" | |
159 "pand %2, %%mm0 \n\t" | |
160 "pand %2, %%mm1 \n\t" | |
161 "pand %2, %%mm4 \n\t" | |
162 "pand %2, %%mm5 \n\t" | |
163 "pand %3, %%mm2 \n\t" | |
164 "pand %3, %%mm3 \n\t" | |
165 "pand %3, %%mm6 \n\t" | |
166 "pand %3, %%mm7 \n\t" | |
167 "por %%mm2, %%mm0 \n\t" | |
168 "por %%mm3, %%mm1 \n\t" | |
169 "por %%mm6, %%mm4 \n\t" | |
170 "por %%mm7, %%mm5 \n\t" | |
18861 | 171 |
29480 | 172 "movq %%mm1, %%mm2 \n\t" |
173 "movq %%mm4, %%mm3 \n\t" | |
174 "psllq $48, %%mm2 \n\t" | |
175 "psllq $32, %%mm3 \n\t" | |
176 "pand %4, %%mm2 \n\t" | |
177 "pand %5, %%mm3 \n\t" | |
178 "por %%mm2, %%mm0 \n\t" | |
179 "psrlq $16, %%mm1 \n\t" | |
180 "psrlq $32, %%mm4 \n\t" | |
181 "psllq $16, %%mm5 \n\t" | |
182 "por %%mm3, %%mm1 \n\t" | |
183 "pand %6, %%mm5 \n\t" | |
184 "por %%mm5, %%mm4 \n\t" | |
18861 | 185 |
29480 | 186 MOVNTQ" %%mm0, %0 \n\t" |
187 MOVNTQ" %%mm1, 8%0 \n\t" | |
188 MOVNTQ" %%mm4, 16%0" | |
189 :"=m"(*dest) | |
190 :"m"(*s),"m"(mask24l), | |
191 "m"(mask24h),"m"(mask24hh),"m"(mask24hhh),"m"(mask24hhhh) | |
192 :"memory"); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
193 dest += 24; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
194 s += 32; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
195 } |
27744 | 196 __asm__ volatile(SFENCE:::"memory"); |
197 __asm__ volatile(EMMS:::"memory"); | |
18861 | 198 #endif |
29481 | 199 while (s < end) { |
29397 | 200 #if HAVE_BIGENDIAN |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
201 /* RGB32 (= A,B,G,R) -> RGB24 (= R,G,B) */ |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
202 s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
203 dest[2] = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
204 dest[1] = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
205 dest[0] = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
206 dest += 3; |
18861 | 207 #else |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
208 *dest++ = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
209 *dest++ = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
210 *dest++ = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
211 s++; |
18861 | 212 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
213 } |
18861 | 214 } |
215 | |
216 /* | |
27158 | 217 original by Strepto/Astral |
218 ported to gcc & bugfixed: A'rpi | |
18861 | 219 MMX2, 3DNOW optimization by Nick Kurshev |
27158 | 220 32-bit C version, and and&add trick by Michael Niedermayer |
18861 | 221 */ |
25750 | 222 static inline void RENAME(rgb15to16)(const uint8_t *src, uint8_t *dst, long src_size) |
18861 | 223 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
224 register const uint8_t* s=src; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
225 register uint8_t* d=dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
226 register const uint8_t *end; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
227 const uint8_t *mm_end; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
228 end = s + src_size; |
28276 | 229 #if HAVE_MMX |
27744 | 230 __asm__ volatile(PREFETCH" %0"::"m"(*s)); |
231 __asm__ volatile("movq %0, %%mm4"::"m"(mask15s)); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
232 mm_end = end - 15; |
29481 | 233 while (s<mm_end) { |
27744 | 234 __asm__ volatile( |
29480 | 235 PREFETCH" 32%1 \n\t" |
236 "movq %1, %%mm0 \n\t" | |
237 "movq 8%1, %%mm2 \n\t" | |
238 "movq %%mm0, %%mm1 \n\t" | |
239 "movq %%mm2, %%mm3 \n\t" | |
240 "pand %%mm4, %%mm0 \n\t" | |
241 "pand %%mm4, %%mm2 \n\t" | |
242 "paddw %%mm1, %%mm0 \n\t" | |
243 "paddw %%mm3, %%mm2 \n\t" | |
244 MOVNTQ" %%mm0, %0 \n\t" | |
245 MOVNTQ" %%mm2, 8%0" | |
246 :"=m"(*d) | |
247 :"m"(*s) | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
248 ); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
249 d+=16; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
250 s+=16; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
251 } |
27744 | 252 __asm__ volatile(SFENCE:::"memory"); |
253 __asm__ volatile(EMMS:::"memory"); | |
18861 | 254 #endif |
255 mm_end = end - 3; | |
29481 | 256 while (s < mm_end) { |
26910 | 257 register unsigned x= *((const uint32_t *)s); |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
258 *((uint32_t *)d) = (x&0x7FFF7FFF) + (x&0x7FE07FE0); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
259 d+=4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
260 s+=4; |
18861 | 261 } |
29481 | 262 if (s < end) { |
26910 | 263 register unsigned short x= *((const uint16_t *)s); |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
264 *((uint16_t *)d) = (x&0x7FFF) + (x&0x7FE0); |
18861 | 265 } |
266 } | |
267 | |
25750 | 268 static inline void RENAME(rgb16to15)(const uint8_t *src, uint8_t *dst, long src_size) |
18861 | 269 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
270 register const uint8_t* s=src; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
271 register uint8_t* d=dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
272 register const uint8_t *end; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
273 const uint8_t *mm_end; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
274 end = s + src_size; |
28276 | 275 #if HAVE_MMX |
27744 | 276 __asm__ volatile(PREFETCH" %0"::"m"(*s)); |
277 __asm__ volatile("movq %0, %%mm7"::"m"(mask15rg)); | |
278 __asm__ volatile("movq %0, %%mm6"::"m"(mask15b)); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
279 mm_end = end - 15; |
29481 | 280 while (s<mm_end) { |
27744 | 281 __asm__ volatile( |
29480 | 282 PREFETCH" 32%1 \n\t" |
283 "movq %1, %%mm0 \n\t" | |
284 "movq 8%1, %%mm2 \n\t" | |
285 "movq %%mm0, %%mm1 \n\t" | |
286 "movq %%mm2, %%mm3 \n\t" | |
287 "psrlq $1, %%mm0 \n\t" | |
288 "psrlq $1, %%mm2 \n\t" | |
289 "pand %%mm7, %%mm0 \n\t" | |
290 "pand %%mm7, %%mm2 \n\t" | |
291 "pand %%mm6, %%mm1 \n\t" | |
292 "pand %%mm6, %%mm3 \n\t" | |
293 "por %%mm1, %%mm0 \n\t" | |
294 "por %%mm3, %%mm2 \n\t" | |
295 MOVNTQ" %%mm0, %0 \n\t" | |
296 MOVNTQ" %%mm2, 8%0" | |
297 :"=m"(*d) | |
298 :"m"(*s) | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
299 ); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
300 d+=16; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
301 s+=16; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
302 } |
27744 | 303 __asm__ volatile(SFENCE:::"memory"); |
304 __asm__ volatile(EMMS:::"memory"); | |
18861 | 305 #endif |
306 mm_end = end - 3; | |
29481 | 307 while (s < mm_end) { |
26925
3f6d2ca29727
restore needed cast to correct type with const
bcoudurier
parents:
26910
diff
changeset
|
308 register uint32_t x= *((const uint32_t*)s); |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
309 *((uint32_t *)d) = ((x>>1)&0x7FE07FE0) | (x&0x001F001F); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
310 s+=4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
311 d+=4; |
18861 | 312 } |
29481 | 313 if (s < end) { |
26925
3f6d2ca29727
restore needed cast to correct type with const
bcoudurier
parents:
26910
diff
changeset
|
314 register uint16_t x= *((const uint16_t*)s); |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
315 *((uint16_t *)d) = ((x>>1)&0x7FE0) | (x&0x001F); |
18861 | 316 } |
317 } | |
318 | |
319 static inline void RENAME(rgb32to16)(const uint8_t *src, uint8_t *dst, long src_size) | |
320 { | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
321 const uint8_t *s = src; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
322 const uint8_t *end; |
28276 | 323 #if HAVE_MMX |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
324 const uint8_t *mm_end; |
18861 | 325 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
326 uint16_t *d = (uint16_t *)dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
327 end = s + src_size; |
28276 | 328 #if HAVE_MMX |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
329 mm_end = end - 15; |
25109 | 330 #if 1 //is faster only if multiplies are reasonably fast (FIXME figure out on which CPUs this is faster, on Athlon it is slightly faster) |
27744 | 331 __asm__ volatile( |
29480 | 332 "movq %3, %%mm5 \n\t" |
333 "movq %4, %%mm6 \n\t" | |
334 "movq %5, %%mm7 \n\t" | |
335 "jmp 2f \n\t" | |
336 ASMALIGN(4) | |
337 "1: \n\t" | |
338 PREFETCH" 32(%1) \n\t" | |
339 "movd (%1), %%mm0 \n\t" | |
340 "movd 4(%1), %%mm3 \n\t" | |
341 "punpckldq 8(%1), %%mm0 \n\t" | |
342 "punpckldq 12(%1), %%mm3 \n\t" | |
343 "movq %%mm0, %%mm1 \n\t" | |
344 "movq %%mm3, %%mm4 \n\t" | |
345 "pand %%mm6, %%mm0 \n\t" | |
346 "pand %%mm6, %%mm3 \n\t" | |
347 "pmaddwd %%mm7, %%mm0 \n\t" | |
348 "pmaddwd %%mm7, %%mm3 \n\t" | |
349 "pand %%mm5, %%mm1 \n\t" | |
350 "pand %%mm5, %%mm4 \n\t" | |
351 "por %%mm1, %%mm0 \n\t" | |
352 "por %%mm4, %%mm3 \n\t" | |
353 "psrld $5, %%mm0 \n\t" | |
354 "pslld $11, %%mm3 \n\t" | |
355 "por %%mm3, %%mm0 \n\t" | |
356 MOVNTQ" %%mm0, (%0) \n\t" | |
357 "add $16, %1 \n\t" | |
358 "add $8, %0 \n\t" | |
359 "2: \n\t" | |
360 "cmp %2, %1 \n\t" | |
361 " jb 1b \n\t" | |
362 : "+r" (d), "+r"(s) | |
363 : "r" (mm_end), "m" (mask3216g), "m" (mask3216br), "m" (mul3216) | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
364 ); |
18861 | 365 #else |
27744 | 366 __asm__ volatile(PREFETCH" %0"::"m"(*src):"memory"); |
367 __asm__ volatile( | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
368 "movq %0, %%mm7 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
369 "movq %1, %%mm6 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
370 ::"m"(red_16mask),"m"(green_16mask)); |
29481 | 371 while (s < mm_end) { |
27744 | 372 __asm__ volatile( |
29480 | 373 PREFETCH" 32%1 \n\t" |
374 "movd %1, %%mm0 \n\t" | |
375 "movd 4%1, %%mm3 \n\t" | |
376 "punpckldq 8%1, %%mm0 \n\t" | |
377 "punpckldq 12%1, %%mm3 \n\t" | |
378 "movq %%mm0, %%mm1 \n\t" | |
379 "movq %%mm0, %%mm2 \n\t" | |
380 "movq %%mm3, %%mm4 \n\t" | |
381 "movq %%mm3, %%mm5 \n\t" | |
382 "psrlq $3, %%mm0 \n\t" | |
383 "psrlq $3, %%mm3 \n\t" | |
384 "pand %2, %%mm0 \n\t" | |
385 "pand %2, %%mm3 \n\t" | |
386 "psrlq $5, %%mm1 \n\t" | |
387 "psrlq $5, %%mm4 \n\t" | |
388 "pand %%mm6, %%mm1 \n\t" | |
389 "pand %%mm6, %%mm4 \n\t" | |
390 "psrlq $8, %%mm2 \n\t" | |
391 "psrlq $8, %%mm5 \n\t" | |
392 "pand %%mm7, %%mm2 \n\t" | |
393 "pand %%mm7, %%mm5 \n\t" | |
394 "por %%mm1, %%mm0 \n\t" | |
395 "por %%mm4, %%mm3 \n\t" | |
396 "por %%mm2, %%mm0 \n\t" | |
397 "por %%mm5, %%mm3 \n\t" | |
398 "psllq $16, %%mm3 \n\t" | |
399 "por %%mm3, %%mm0 \n\t" | |
400 MOVNTQ" %%mm0, %0 \n\t" | |
401 :"=m"(*d):"m"(*s),"m"(blue_16mask):"memory"); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
402 d += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
403 s += 16; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
404 } |
18861 | 405 #endif |
27744 | 406 __asm__ volatile(SFENCE:::"memory"); |
407 __asm__ volatile(EMMS:::"memory"); | |
18861 | 408 #endif |
29481 | 409 while (s < end) { |
26910 | 410 register int rgb = *(const uint32_t*)s; s += 4; |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
411 *d++ = ((rgb&0xFF)>>3) + ((rgb&0xFC00)>>5) + ((rgb&0xF80000)>>8); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
412 } |
18861 | 413 } |
414 | |
415 static inline void RENAME(rgb32tobgr16)(const uint8_t *src, uint8_t *dst, long src_size) | |
416 { | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
417 const uint8_t *s = src; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
418 const uint8_t *end; |
28276 | 419 #if HAVE_MMX |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
420 const uint8_t *mm_end; |
18861 | 421 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
422 uint16_t *d = (uint16_t *)dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
423 end = s + src_size; |
28276 | 424 #if HAVE_MMX |
27744 | 425 __asm__ volatile(PREFETCH" %0"::"m"(*src):"memory"); |
426 __asm__ volatile( | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
427 "movq %0, %%mm7 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
428 "movq %1, %%mm6 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
429 ::"m"(red_16mask),"m"(green_16mask)); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
430 mm_end = end - 15; |
29481 | 431 while (s < mm_end) { |
27744 | 432 __asm__ volatile( |
29480 | 433 PREFETCH" 32%1 \n\t" |
434 "movd %1, %%mm0 \n\t" | |
435 "movd 4%1, %%mm3 \n\t" | |
436 "punpckldq 8%1, %%mm0 \n\t" | |
437 "punpckldq 12%1, %%mm3 \n\t" | |
438 "movq %%mm0, %%mm1 \n\t" | |
439 "movq %%mm0, %%mm2 \n\t" | |
440 "movq %%mm3, %%mm4 \n\t" | |
441 "movq %%mm3, %%mm5 \n\t" | |
442 "psllq $8, %%mm0 \n\t" | |
443 "psllq $8, %%mm3 \n\t" | |
444 "pand %%mm7, %%mm0 \n\t" | |
445 "pand %%mm7, %%mm3 \n\t" | |
446 "psrlq $5, %%mm1 \n\t" | |
447 "psrlq $5, %%mm4 \n\t" | |
448 "pand %%mm6, %%mm1 \n\t" | |
449 "pand %%mm6, %%mm4 \n\t" | |
450 "psrlq $19, %%mm2 \n\t" | |
451 "psrlq $19, %%mm5 \n\t" | |
452 "pand %2, %%mm2 \n\t" | |
453 "pand %2, %%mm5 \n\t" | |
454 "por %%mm1, %%mm0 \n\t" | |
455 "por %%mm4, %%mm3 \n\t" | |
456 "por %%mm2, %%mm0 \n\t" | |
457 "por %%mm5, %%mm3 \n\t" | |
458 "psllq $16, %%mm3 \n\t" | |
459 "por %%mm3, %%mm0 \n\t" | |
460 MOVNTQ" %%mm0, %0 \n\t" | |
461 :"=m"(*d):"m"(*s),"m"(blue_16mask):"memory"); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
462 d += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
463 s += 16; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
464 } |
27744 | 465 __asm__ volatile(SFENCE:::"memory"); |
466 __asm__ volatile(EMMS:::"memory"); | |
18861 | 467 #endif |
29481 | 468 while (s < end) { |
26910 | 469 register int rgb = *(const uint32_t*)s; s += 4; |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
470 *d++ = ((rgb&0xF8)<<8) + ((rgb&0xFC00)>>5) + ((rgb&0xF80000)>>19); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
471 } |
18861 | 472 } |
473 | |
474 static inline void RENAME(rgb32to15)(const uint8_t *src, uint8_t *dst, long src_size) | |
475 { | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
476 const uint8_t *s = src; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
477 const uint8_t *end; |
28276 | 478 #if HAVE_MMX |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
479 const uint8_t *mm_end; |
18861 | 480 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
481 uint16_t *d = (uint16_t *)dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
482 end = s + src_size; |
28276 | 483 #if HAVE_MMX |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
484 mm_end = end - 15; |
25109 | 485 #if 1 //is faster only if multiplies are reasonably fast (FIXME figure out on which CPUs this is faster, on Athlon it is slightly faster) |
27744 | 486 __asm__ volatile( |
29480 | 487 "movq %3, %%mm5 \n\t" |
488 "movq %4, %%mm6 \n\t" | |
489 "movq %5, %%mm7 \n\t" | |
490 "jmp 2f \n\t" | |
491 ASMALIGN(4) | |
492 "1: \n\t" | |
493 PREFETCH" 32(%1) \n\t" | |
494 "movd (%1), %%mm0 \n\t" | |
495 "movd 4(%1), %%mm3 \n\t" | |
496 "punpckldq 8(%1), %%mm0 \n\t" | |
497 "punpckldq 12(%1), %%mm3 \n\t" | |
498 "movq %%mm0, %%mm1 \n\t" | |
499 "movq %%mm3, %%mm4 \n\t" | |
500 "pand %%mm6, %%mm0 \n\t" | |
501 "pand %%mm6, %%mm3 \n\t" | |
502 "pmaddwd %%mm7, %%mm0 \n\t" | |
503 "pmaddwd %%mm7, %%mm3 \n\t" | |
504 "pand %%mm5, %%mm1 \n\t" | |
505 "pand %%mm5, %%mm4 \n\t" | |
506 "por %%mm1, %%mm0 \n\t" | |
507 "por %%mm4, %%mm3 \n\t" | |
508 "psrld $6, %%mm0 \n\t" | |
509 "pslld $10, %%mm3 \n\t" | |
510 "por %%mm3, %%mm0 \n\t" | |
511 MOVNTQ" %%mm0, (%0) \n\t" | |
512 "add $16, %1 \n\t" | |
513 "add $8, %0 \n\t" | |
514 "2: \n\t" | |
515 "cmp %2, %1 \n\t" | |
516 " jb 1b \n\t" | |
517 : "+r" (d), "+r"(s) | |
518 : "r" (mm_end), "m" (mask3215g), "m" (mask3216br), "m" (mul3215) | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
519 ); |
18861 | 520 #else |
27744 | 521 __asm__ volatile(PREFETCH" %0"::"m"(*src):"memory"); |
522 __asm__ volatile( | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
523 "movq %0, %%mm7 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
524 "movq %1, %%mm6 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
525 ::"m"(red_15mask),"m"(green_15mask)); |
29481 | 526 while (s < mm_end) { |
27744 | 527 __asm__ volatile( |
29480 | 528 PREFETCH" 32%1 \n\t" |
529 "movd %1, %%mm0 \n\t" | |
530 "movd 4%1, %%mm3 \n\t" | |
531 "punpckldq 8%1, %%mm0 \n\t" | |
532 "punpckldq 12%1, %%mm3 \n\t" | |
533 "movq %%mm0, %%mm1 \n\t" | |
534 "movq %%mm0, %%mm2 \n\t" | |
535 "movq %%mm3, %%mm4 \n\t" | |
536 "movq %%mm3, %%mm5 \n\t" | |
537 "psrlq $3, %%mm0 \n\t" | |
538 "psrlq $3, %%mm3 \n\t" | |
539 "pand %2, %%mm0 \n\t" | |
540 "pand %2, %%mm3 \n\t" | |
541 "psrlq $6, %%mm1 \n\t" | |
542 "psrlq $6, %%mm4 \n\t" | |
543 "pand %%mm6, %%mm1 \n\t" | |
544 "pand %%mm6, %%mm4 \n\t" | |
545 "psrlq $9, %%mm2 \n\t" | |
546 "psrlq $9, %%mm5 \n\t" | |
547 "pand %%mm7, %%mm2 \n\t" | |
548 "pand %%mm7, %%mm5 \n\t" | |
549 "por %%mm1, %%mm0 \n\t" | |
550 "por %%mm4, %%mm3 \n\t" | |
551 "por %%mm2, %%mm0 \n\t" | |
552 "por %%mm5, %%mm3 \n\t" | |
553 "psllq $16, %%mm3 \n\t" | |
554 "por %%mm3, %%mm0 \n\t" | |
555 MOVNTQ" %%mm0, %0 \n\t" | |
556 :"=m"(*d):"m"(*s),"m"(blue_15mask):"memory"); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
557 d += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
558 s += 16; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
559 } |
18861 | 560 #endif |
27744 | 561 __asm__ volatile(SFENCE:::"memory"); |
562 __asm__ volatile(EMMS:::"memory"); | |
18861 | 563 #endif |
29481 | 564 while (s < end) { |
26910 | 565 register int rgb = *(const uint32_t*)s; s += 4; |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
566 *d++ = ((rgb&0xFF)>>3) + ((rgb&0xF800)>>6) + ((rgb&0xF80000)>>9); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
567 } |
18861 | 568 } |
569 | |
570 static inline void RENAME(rgb32tobgr15)(const uint8_t *src, uint8_t *dst, long src_size) | |
571 { | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
572 const uint8_t *s = src; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
573 const uint8_t *end; |
28276 | 574 #if HAVE_MMX |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
575 const uint8_t *mm_end; |
18861 | 576 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
577 uint16_t *d = (uint16_t *)dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
578 end = s + src_size; |
28276 | 579 #if HAVE_MMX |
27744 | 580 __asm__ volatile(PREFETCH" %0"::"m"(*src):"memory"); |
581 __asm__ volatile( | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
582 "movq %0, %%mm7 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
583 "movq %1, %%mm6 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
584 ::"m"(red_15mask),"m"(green_15mask)); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
585 mm_end = end - 15; |
29481 | 586 while (s < mm_end) { |
27744 | 587 __asm__ volatile( |
29480 | 588 PREFETCH" 32%1 \n\t" |
589 "movd %1, %%mm0 \n\t" | |
590 "movd 4%1, %%mm3 \n\t" | |
591 "punpckldq 8%1, %%mm0 \n\t" | |
592 "punpckldq 12%1, %%mm3 \n\t" | |
593 "movq %%mm0, %%mm1 \n\t" | |
594 "movq %%mm0, %%mm2 \n\t" | |
595 "movq %%mm3, %%mm4 \n\t" | |
596 "movq %%mm3, %%mm5 \n\t" | |
597 "psllq $7, %%mm0 \n\t" | |
598 "psllq $7, %%mm3 \n\t" | |
599 "pand %%mm7, %%mm0 \n\t" | |
600 "pand %%mm7, %%mm3 \n\t" | |
601 "psrlq $6, %%mm1 \n\t" | |
602 "psrlq $6, %%mm4 \n\t" | |
603 "pand %%mm6, %%mm1 \n\t" | |
604 "pand %%mm6, %%mm4 \n\t" | |
605 "psrlq $19, %%mm2 \n\t" | |
606 "psrlq $19, %%mm5 \n\t" | |
607 "pand %2, %%mm2 \n\t" | |
608 "pand %2, %%mm5 \n\t" | |
609 "por %%mm1, %%mm0 \n\t" | |
610 "por %%mm4, %%mm3 \n\t" | |
611 "por %%mm2, %%mm0 \n\t" | |
612 "por %%mm5, %%mm3 \n\t" | |
613 "psllq $16, %%mm3 \n\t" | |
614 "por %%mm3, %%mm0 \n\t" | |
615 MOVNTQ" %%mm0, %0 \n\t" | |
616 :"=m"(*d):"m"(*s),"m"(blue_15mask):"memory"); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
617 d += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
618 s += 16; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
619 } |
27744 | 620 __asm__ volatile(SFENCE:::"memory"); |
621 __asm__ volatile(EMMS:::"memory"); | |
18861 | 622 #endif |
29481 | 623 while (s < end) { |
26910 | 624 register int rgb = *(const uint32_t*)s; s += 4; |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
625 *d++ = ((rgb&0xF8)<<7) + ((rgb&0xF800)>>6) + ((rgb&0xF80000)>>19); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
626 } |
18861 | 627 } |
628 | |
27486 | 629 static inline void RENAME(rgb24tobgr16)(const uint8_t *src, uint8_t *dst, long src_size) |
18861 | 630 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
631 const uint8_t *s = src; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
632 const uint8_t *end; |
28276 | 633 #if HAVE_MMX |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
634 const uint8_t *mm_end; |
18861 | 635 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
636 uint16_t *d = (uint16_t *)dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
637 end = s + src_size; |
28276 | 638 #if HAVE_MMX |
27744 | 639 __asm__ volatile(PREFETCH" %0"::"m"(*src):"memory"); |
640 __asm__ volatile( | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
641 "movq %0, %%mm7 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
642 "movq %1, %%mm6 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
643 ::"m"(red_16mask),"m"(green_16mask)); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
644 mm_end = end - 11; |
29481 | 645 while (s < mm_end) { |
27744 | 646 __asm__ volatile( |
29480 | 647 PREFETCH" 32%1 \n\t" |
648 "movd %1, %%mm0 \n\t" | |
649 "movd 3%1, %%mm3 \n\t" | |
650 "punpckldq 6%1, %%mm0 \n\t" | |
651 "punpckldq 9%1, %%mm3 \n\t" | |
652 "movq %%mm0, %%mm1 \n\t" | |
653 "movq %%mm0, %%mm2 \n\t" | |
654 "movq %%mm3, %%mm4 \n\t" | |
655 "movq %%mm3, %%mm5 \n\t" | |
656 "psrlq $3, %%mm0 \n\t" | |
657 "psrlq $3, %%mm3 \n\t" | |
658 "pand %2, %%mm0 \n\t" | |
659 "pand %2, %%mm3 \n\t" | |
660 "psrlq $5, %%mm1 \n\t" | |
661 "psrlq $5, %%mm4 \n\t" | |
662 "pand %%mm6, %%mm1 \n\t" | |
663 "pand %%mm6, %%mm4 \n\t" | |
664 "psrlq $8, %%mm2 \n\t" | |
665 "psrlq $8, %%mm5 \n\t" | |
666 "pand %%mm7, %%mm2 \n\t" | |
667 "pand %%mm7, %%mm5 \n\t" | |
668 "por %%mm1, %%mm0 \n\t" | |
669 "por %%mm4, %%mm3 \n\t" | |
670 "por %%mm2, %%mm0 \n\t" | |
671 "por %%mm5, %%mm3 \n\t" | |
672 "psllq $16, %%mm3 \n\t" | |
673 "por %%mm3, %%mm0 \n\t" | |
674 MOVNTQ" %%mm0, %0 \n\t" | |
675 :"=m"(*d):"m"(*s),"m"(blue_16mask):"memory"); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
676 d += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
677 s += 12; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
678 } |
27744 | 679 __asm__ volatile(SFENCE:::"memory"); |
680 __asm__ volatile(EMMS:::"memory"); | |
18861 | 681 #endif |
29481 | 682 while (s < end) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
683 const int b = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
684 const int g = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
685 const int r = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
686 *d++ = (b>>3) | ((g&0xFC)<<3) | ((r&0xF8)<<8); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
687 } |
18861 | 688 } |
689 | |
27486 | 690 static inline void RENAME(rgb24to16)(const uint8_t *src, uint8_t *dst, long src_size) |
18861 | 691 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
692 const uint8_t *s = src; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
693 const uint8_t *end; |
28276 | 694 #if HAVE_MMX |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
695 const uint8_t *mm_end; |
18861 | 696 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
697 uint16_t *d = (uint16_t *)dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
698 end = s + src_size; |
28276 | 699 #if HAVE_MMX |
27744 | 700 __asm__ volatile(PREFETCH" %0"::"m"(*src):"memory"); |
701 __asm__ volatile( | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
702 "movq %0, %%mm7 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
703 "movq %1, %%mm6 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
704 ::"m"(red_16mask),"m"(green_16mask)); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
705 mm_end = end - 15; |
29481 | 706 while (s < mm_end) { |
27744 | 707 __asm__ volatile( |
29480 | 708 PREFETCH" 32%1 \n\t" |
709 "movd %1, %%mm0 \n\t" | |
710 "movd 3%1, %%mm3 \n\t" | |
711 "punpckldq 6%1, %%mm0 \n\t" | |
712 "punpckldq 9%1, %%mm3 \n\t" | |
713 "movq %%mm0, %%mm1 \n\t" | |
714 "movq %%mm0, %%mm2 \n\t" | |
715 "movq %%mm3, %%mm4 \n\t" | |
716 "movq %%mm3, %%mm5 \n\t" | |
717 "psllq $8, %%mm0 \n\t" | |
718 "psllq $8, %%mm3 \n\t" | |
719 "pand %%mm7, %%mm0 \n\t" | |
720 "pand %%mm7, %%mm3 \n\t" | |
721 "psrlq $5, %%mm1 \n\t" | |
722 "psrlq $5, %%mm4 \n\t" | |
723 "pand %%mm6, %%mm1 \n\t" | |
724 "pand %%mm6, %%mm4 \n\t" | |
725 "psrlq $19, %%mm2 \n\t" | |
726 "psrlq $19, %%mm5 \n\t" | |
727 "pand %2, %%mm2 \n\t" | |
728 "pand %2, %%mm5 \n\t" | |
729 "por %%mm1, %%mm0 \n\t" | |
730 "por %%mm4, %%mm3 \n\t" | |
731 "por %%mm2, %%mm0 \n\t" | |
732 "por %%mm5, %%mm3 \n\t" | |
733 "psllq $16, %%mm3 \n\t" | |
734 "por %%mm3, %%mm0 \n\t" | |
735 MOVNTQ" %%mm0, %0 \n\t" | |
736 :"=m"(*d):"m"(*s),"m"(blue_16mask):"memory"); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
737 d += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
738 s += 12; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
739 } |
27744 | 740 __asm__ volatile(SFENCE:::"memory"); |
741 __asm__ volatile(EMMS:::"memory"); | |
18861 | 742 #endif |
29481 | 743 while (s < end) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
744 const int r = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
745 const int g = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
746 const int b = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
747 *d++ = (b>>3) | ((g&0xFC)<<3) | ((r&0xF8)<<8); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
748 } |
18861 | 749 } |
750 | |
27486 | 751 static inline void RENAME(rgb24tobgr15)(const uint8_t *src, uint8_t *dst, long src_size) |
18861 | 752 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
753 const uint8_t *s = src; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
754 const uint8_t *end; |
28276 | 755 #if HAVE_MMX |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
756 const uint8_t *mm_end; |
18861 | 757 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
758 uint16_t *d = (uint16_t *)dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
759 end = s + src_size; |
28276 | 760 #if HAVE_MMX |
27744 | 761 __asm__ volatile(PREFETCH" %0"::"m"(*src):"memory"); |
762 __asm__ volatile( | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
763 "movq %0, %%mm7 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
764 "movq %1, %%mm6 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
765 ::"m"(red_15mask),"m"(green_15mask)); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
766 mm_end = end - 11; |
29481 | 767 while (s < mm_end) { |
27744 | 768 __asm__ volatile( |
29480 | 769 PREFETCH" 32%1 \n\t" |
770 "movd %1, %%mm0 \n\t" | |
771 "movd 3%1, %%mm3 \n\t" | |
772 "punpckldq 6%1, %%mm0 \n\t" | |
773 "punpckldq 9%1, %%mm3 \n\t" | |
774 "movq %%mm0, %%mm1 \n\t" | |
775 "movq %%mm0, %%mm2 \n\t" | |
776 "movq %%mm3, %%mm4 \n\t" | |
777 "movq %%mm3, %%mm5 \n\t" | |
778 "psrlq $3, %%mm0 \n\t" | |
779 "psrlq $3, %%mm3 \n\t" | |
780 "pand %2, %%mm0 \n\t" | |
781 "pand %2, %%mm3 \n\t" | |
782 "psrlq $6, %%mm1 \n\t" | |
783 "psrlq $6, %%mm4 \n\t" | |
784 "pand %%mm6, %%mm1 \n\t" | |
785 "pand %%mm6, %%mm4 \n\t" | |
786 "psrlq $9, %%mm2 \n\t" | |
787 "psrlq $9, %%mm5 \n\t" | |
788 "pand %%mm7, %%mm2 \n\t" | |
789 "pand %%mm7, %%mm5 \n\t" | |
790 "por %%mm1, %%mm0 \n\t" | |
791 "por %%mm4, %%mm3 \n\t" | |
792 "por %%mm2, %%mm0 \n\t" | |
793 "por %%mm5, %%mm3 \n\t" | |
794 "psllq $16, %%mm3 \n\t" | |
795 "por %%mm3, %%mm0 \n\t" | |
796 MOVNTQ" %%mm0, %0 \n\t" | |
797 :"=m"(*d):"m"(*s),"m"(blue_15mask):"memory"); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
798 d += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
799 s += 12; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
800 } |
27744 | 801 __asm__ volatile(SFENCE:::"memory"); |
802 __asm__ volatile(EMMS:::"memory"); | |
18861 | 803 #endif |
29481 | 804 while (s < end) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
805 const int b = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
806 const int g = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
807 const int r = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
808 *d++ = (b>>3) | ((g&0xF8)<<2) | ((r&0xF8)<<7); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
809 } |
18861 | 810 } |
811 | |
27486 | 812 static inline void RENAME(rgb24to15)(const uint8_t *src, uint8_t *dst, long src_size) |
18861 | 813 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
814 const uint8_t *s = src; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
815 const uint8_t *end; |
28276 | 816 #if HAVE_MMX |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
817 const uint8_t *mm_end; |
18861 | 818 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
819 uint16_t *d = (uint16_t *)dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
820 end = s + src_size; |
28276 | 821 #if HAVE_MMX |
27744 | 822 __asm__ volatile(PREFETCH" %0"::"m"(*src):"memory"); |
823 __asm__ volatile( | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
824 "movq %0, %%mm7 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
825 "movq %1, %%mm6 \n\t" |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
826 ::"m"(red_15mask),"m"(green_15mask)); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
827 mm_end = end - 15; |
29481 | 828 while (s < mm_end) { |
27744 | 829 __asm__ volatile( |
29480 | 830 PREFETCH" 32%1 \n\t" |
831 "movd %1, %%mm0 \n\t" | |
832 "movd 3%1, %%mm3 \n\t" | |
833 "punpckldq 6%1, %%mm0 \n\t" | |
834 "punpckldq 9%1, %%mm3 \n\t" | |
835 "movq %%mm0, %%mm1 \n\t" | |
836 "movq %%mm0, %%mm2 \n\t" | |
837 "movq %%mm3, %%mm4 \n\t" | |
838 "movq %%mm3, %%mm5 \n\t" | |
839 "psllq $7, %%mm0 \n\t" | |
840 "psllq $7, %%mm3 \n\t" | |
841 "pand %%mm7, %%mm0 \n\t" | |
842 "pand %%mm7, %%mm3 \n\t" | |
843 "psrlq $6, %%mm1 \n\t" | |
844 "psrlq $6, %%mm4 \n\t" | |
845 "pand %%mm6, %%mm1 \n\t" | |
846 "pand %%mm6, %%mm4 \n\t" | |
847 "psrlq $19, %%mm2 \n\t" | |
848 "psrlq $19, %%mm5 \n\t" | |
849 "pand %2, %%mm2 \n\t" | |
850 "pand %2, %%mm5 \n\t" | |
851 "por %%mm1, %%mm0 \n\t" | |
852 "por %%mm4, %%mm3 \n\t" | |
853 "por %%mm2, %%mm0 \n\t" | |
854 "por %%mm5, %%mm3 \n\t" | |
855 "psllq $16, %%mm3 \n\t" | |
856 "por %%mm3, %%mm0 \n\t" | |
857 MOVNTQ" %%mm0, %0 \n\t" | |
858 :"=m"(*d):"m"(*s),"m"(blue_15mask):"memory"); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
859 d += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
860 s += 12; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
861 } |
27744 | 862 __asm__ volatile(SFENCE:::"memory"); |
863 __asm__ volatile(EMMS:::"memory"); | |
18861 | 864 #endif |
29481 | 865 while (s < end) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
866 const int r = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
867 const int g = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
868 const int b = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
869 *d++ = (b>>3) | ((g&0xF8)<<2) | ((r&0xF8)<<7); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
870 } |
18861 | 871 } |
872 | |
873 /* | |
25109 | 874 I use less accurate approximation here by simply left-shifting the input |
875 value and filling the low order bits with zeroes. This method improves PNG | |
876 compression but this scheme cannot reproduce white exactly, since it does | |
877 not generate an all-ones maximum value; the net effect is to darken the | |
18861 | 878 image slightly. |
879 | |
880 The better method should be "left bit replication": | |
881 | |
882 4 3 2 1 0 | |
883 --------- | |
884 1 1 0 1 1 | |
885 | |
886 7 6 5 4 3 2 1 0 | |
887 ---------------- | |
888 1 1 0 1 1 1 1 0 | |
889 |=======| |===| | |
27158 | 890 | leftmost bits repeated to fill open bits |
18861 | 891 | |
27158 | 892 original bits |
18861 | 893 */ |
27486 | 894 static inline void RENAME(rgb15tobgr24)(const uint8_t *src, uint8_t *dst, long src_size) |
18861 | 895 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
896 const uint16_t *end; |
28276 | 897 #if HAVE_MMX |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
898 const uint16_t *mm_end; |
18861 | 899 #endif |
26909 | 900 uint8_t *d = dst; |
26910 | 901 const uint16_t *s = (const uint16_t*)src; |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
902 end = s + src_size/2; |
28276 | 903 #if HAVE_MMX |
27744 | 904 __asm__ volatile(PREFETCH" %0"::"m"(*s):"memory"); |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
905 mm_end = end - 7; |
29481 | 906 while (s < mm_end) { |
27744 | 907 __asm__ volatile( |
29480 | 908 PREFETCH" 32%1 \n\t" |
909 "movq %1, %%mm0 \n\t" | |
910 "movq %1, %%mm1 \n\t" | |
911 "movq %1, %%mm2 \n\t" | |
912 "pand %2, %%mm0 \n\t" | |
913 "pand %3, %%mm1 \n\t" | |
914 "pand %4, %%mm2 \n\t" | |
915 "psllq $3, %%mm0 \n\t" | |
916 "psrlq $2, %%mm1 \n\t" | |
917 "psrlq $7, %%mm2 \n\t" | |
918 "movq %%mm0, %%mm3 \n\t" | |
919 "movq %%mm1, %%mm4 \n\t" | |
920 "movq %%mm2, %%mm5 \n\t" | |
921 "punpcklwd %5, %%mm0 \n\t" | |
922 "punpcklwd %5, %%mm1 \n\t" | |
923 "punpcklwd %5, %%mm2 \n\t" | |
924 "punpckhwd %5, %%mm3 \n\t" | |
925 "punpckhwd %5, %%mm4 \n\t" | |
926 "punpckhwd %5, %%mm5 \n\t" | |
927 "psllq $8, %%mm1 \n\t" | |
928 "psllq $16, %%mm2 \n\t" | |
929 "por %%mm1, %%mm0 \n\t" | |
930 "por %%mm2, %%mm0 \n\t" | |
931 "psllq $8, %%mm4 \n\t" | |
932 "psllq $16, %%mm5 \n\t" | |
933 "por %%mm4, %%mm3 \n\t" | |
934 "por %%mm5, %%mm3 \n\t" | |
18861 | 935 |
29480 | 936 "movq %%mm0, %%mm6 \n\t" |
937 "movq %%mm3, %%mm7 \n\t" | |
23129 | 938 |
29480 | 939 "movq 8%1, %%mm0 \n\t" |
940 "movq 8%1, %%mm1 \n\t" | |
941 "movq 8%1, %%mm2 \n\t" | |
942 "pand %2, %%mm0 \n\t" | |
943 "pand %3, %%mm1 \n\t" | |
944 "pand %4, %%mm2 \n\t" | |
945 "psllq $3, %%mm0 \n\t" | |
946 "psrlq $2, %%mm1 \n\t" | |
947 "psrlq $7, %%mm2 \n\t" | |
948 "movq %%mm0, %%mm3 \n\t" | |
949 "movq %%mm1, %%mm4 \n\t" | |
950 "movq %%mm2, %%mm5 \n\t" | |
951 "punpcklwd %5, %%mm0 \n\t" | |
952 "punpcklwd %5, %%mm1 \n\t" | |
953 "punpcklwd %5, %%mm2 \n\t" | |
954 "punpckhwd %5, %%mm3 \n\t" | |
955 "punpckhwd %5, %%mm4 \n\t" | |
956 "punpckhwd %5, %%mm5 \n\t" | |
957 "psllq $8, %%mm1 \n\t" | |
958 "psllq $16, %%mm2 \n\t" | |
959 "por %%mm1, %%mm0 \n\t" | |
960 "por %%mm2, %%mm0 \n\t" | |
961 "psllq $8, %%mm4 \n\t" | |
962 "psllq $16, %%mm5 \n\t" | |
963 "por %%mm4, %%mm3 \n\t" | |
964 "por %%mm5, %%mm3 \n\t" | |
18861 | 965 |
29480 | 966 :"=m"(*d) |
967 :"m"(*s),"m"(mask15b),"m"(mask15g),"m"(mask15r), "m"(mmx_null) | |
968 :"memory"); | |
27158 | 969 /* borrowed 32 to 24 */ |
27744 | 970 __asm__ volatile( |
29480 | 971 "movq %%mm0, %%mm4 \n\t" |
972 "movq %%mm3, %%mm5 \n\t" | |
973 "movq %%mm6, %%mm0 \n\t" | |
974 "movq %%mm7, %%mm1 \n\t" | |
23129 | 975 |
29480 | 976 "movq %%mm4, %%mm6 \n\t" |
977 "movq %%mm5, %%mm7 \n\t" | |
978 "movq %%mm0, %%mm2 \n\t" | |
979 "movq %%mm1, %%mm3 \n\t" | |
18861 | 980 |
29480 | 981 "psrlq $8, %%mm2 \n\t" |
982 "psrlq $8, %%mm3 \n\t" | |
983 "psrlq $8, %%mm6 \n\t" | |
984 "psrlq $8, %%mm7 \n\t" | |
985 "pand %2, %%mm0 \n\t" | |
986 "pand %2, %%mm1 \n\t" | |
987 "pand %2, %%mm4 \n\t" | |
988 "pand %2, %%mm5 \n\t" | |
989 "pand %3, %%mm2 \n\t" | |
990 "pand %3, %%mm3 \n\t" | |
991 "pand %3, %%mm6 \n\t" | |
992 "pand %3, %%mm7 \n\t" | |
993 "por %%mm2, %%mm0 \n\t" | |
994 "por %%mm3, %%mm1 \n\t" | |
995 "por %%mm6, %%mm4 \n\t" | |
996 "por %%mm7, %%mm5 \n\t" | |
18861 | 997 |
29480 | 998 "movq %%mm1, %%mm2 \n\t" |
999 "movq %%mm4, %%mm3 \n\t" | |
1000 "psllq $48, %%mm2 \n\t" | |
1001 "psllq $32, %%mm3 \n\t" | |
1002 "pand %4, %%mm2 \n\t" | |
1003 "pand %5, %%mm3 \n\t" | |
1004 "por %%mm2, %%mm0 \n\t" | |
1005 "psrlq $16, %%mm1 \n\t" | |
1006 "psrlq $32, %%mm4 \n\t" | |
1007 "psllq $16, %%mm5 \n\t" | |
1008 "por %%mm3, %%mm1 \n\t" | |
1009 "pand %6, %%mm5 \n\t" | |
1010 "por %%mm5, %%mm4 \n\t" | |
18861 | 1011 |
29480 | 1012 MOVNTQ" %%mm0, %0 \n\t" |
1013 MOVNTQ" %%mm1, 8%0 \n\t" | |
1014 MOVNTQ" %%mm4, 16%0" | |
18861 | 1015 |
29480 | 1016 :"=m"(*d) |
1017 :"m"(*s),"m"(mask24l),"m"(mask24h),"m"(mask24hh),"m"(mask24hhh),"m"(mask24hhhh) | |
1018 :"memory"); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1019 d += 24; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1020 s += 8; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1021 } |
27744 | 1022 __asm__ volatile(SFENCE:::"memory"); |
1023 __asm__ volatile(EMMS:::"memory"); | |
18861 | 1024 #endif |
29481 | 1025 while (s < end) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1026 register uint16_t bgr; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1027 bgr = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1028 *d++ = (bgr&0x1F)<<3; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1029 *d++ = (bgr&0x3E0)>>2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1030 *d++ = (bgr&0x7C00)>>7; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1031 } |
18861 | 1032 } |
1033 | |
27486 | 1034 static inline void RENAME(rgb16tobgr24)(const uint8_t *src, uint8_t *dst, long src_size) |
18861 | 1035 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1036 const uint16_t *end; |
28276 | 1037 #if HAVE_MMX |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1038 const uint16_t *mm_end; |
18861 | 1039 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1040 uint8_t *d = (uint8_t *)dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1041 const uint16_t *s = (const uint16_t *)src; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1042 end = s + src_size/2; |
28276 | 1043 #if HAVE_MMX |
27744 | 1044 __asm__ volatile(PREFETCH" %0"::"m"(*s):"memory"); |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1045 mm_end = end - 7; |
29481 | 1046 while (s < mm_end) { |
27744 | 1047 __asm__ volatile( |
29480 | 1048 PREFETCH" 32%1 \n\t" |
1049 "movq %1, %%mm0 \n\t" | |
1050 "movq %1, %%mm1 \n\t" | |
1051 "movq %1, %%mm2 \n\t" | |
1052 "pand %2, %%mm0 \n\t" | |
1053 "pand %3, %%mm1 \n\t" | |
1054 "pand %4, %%mm2 \n\t" | |
1055 "psllq $3, %%mm0 \n\t" | |
1056 "psrlq $3, %%mm1 \n\t" | |
1057 "psrlq $8, %%mm2 \n\t" | |
1058 "movq %%mm0, %%mm3 \n\t" | |
1059 "movq %%mm1, %%mm4 \n\t" | |
1060 "movq %%mm2, %%mm5 \n\t" | |
1061 "punpcklwd %5, %%mm0 \n\t" | |
1062 "punpcklwd %5, %%mm1 \n\t" | |
1063 "punpcklwd %5, %%mm2 \n\t" | |
1064 "punpckhwd %5, %%mm3 \n\t" | |
1065 "punpckhwd %5, %%mm4 \n\t" | |
1066 "punpckhwd %5, %%mm5 \n\t" | |
1067 "psllq $8, %%mm1 \n\t" | |
1068 "psllq $16, %%mm2 \n\t" | |
1069 "por %%mm1, %%mm0 \n\t" | |
1070 "por %%mm2, %%mm0 \n\t" | |
1071 "psllq $8, %%mm4 \n\t" | |
1072 "psllq $16, %%mm5 \n\t" | |
1073 "por %%mm4, %%mm3 \n\t" | |
1074 "por %%mm5, %%mm3 \n\t" | |
23129 | 1075 |
29480 | 1076 "movq %%mm0, %%mm6 \n\t" |
1077 "movq %%mm3, %%mm7 \n\t" | |
18861 | 1078 |
29480 | 1079 "movq 8%1, %%mm0 \n\t" |
1080 "movq 8%1, %%mm1 \n\t" | |
1081 "movq 8%1, %%mm2 \n\t" | |
1082 "pand %2, %%mm0 \n\t" | |
1083 "pand %3, %%mm1 \n\t" | |
1084 "pand %4, %%mm2 \n\t" | |
1085 "psllq $3, %%mm0 \n\t" | |
1086 "psrlq $3, %%mm1 \n\t" | |
1087 "psrlq $8, %%mm2 \n\t" | |
1088 "movq %%mm0, %%mm3 \n\t" | |
1089 "movq %%mm1, %%mm4 \n\t" | |
1090 "movq %%mm2, %%mm5 \n\t" | |
1091 "punpcklwd %5, %%mm0 \n\t" | |
1092 "punpcklwd %5, %%mm1 \n\t" | |
1093 "punpcklwd %5, %%mm2 \n\t" | |
1094 "punpckhwd %5, %%mm3 \n\t" | |
1095 "punpckhwd %5, %%mm4 \n\t" | |
1096 "punpckhwd %5, %%mm5 \n\t" | |
1097 "psllq $8, %%mm1 \n\t" | |
1098 "psllq $16, %%mm2 \n\t" | |
1099 "por %%mm1, %%mm0 \n\t" | |
1100 "por %%mm2, %%mm0 \n\t" | |
1101 "psllq $8, %%mm4 \n\t" | |
1102 "psllq $16, %%mm5 \n\t" | |
1103 "por %%mm4, %%mm3 \n\t" | |
1104 "por %%mm5, %%mm3 \n\t" | |
1105 :"=m"(*d) | |
1106 :"m"(*s),"m"(mask16b),"m"(mask16g),"m"(mask16r),"m"(mmx_null) | |
1107 :"memory"); | |
27158 | 1108 /* borrowed 32 to 24 */ |
27744 | 1109 __asm__ volatile( |
29480 | 1110 "movq %%mm0, %%mm4 \n\t" |
1111 "movq %%mm3, %%mm5 \n\t" | |
1112 "movq %%mm6, %%mm0 \n\t" | |
1113 "movq %%mm7, %%mm1 \n\t" | |
23129 | 1114 |
29480 | 1115 "movq %%mm4, %%mm6 \n\t" |
1116 "movq %%mm5, %%mm7 \n\t" | |
1117 "movq %%mm0, %%mm2 \n\t" | |
1118 "movq %%mm1, %%mm3 \n\t" | |
18861 | 1119 |
29480 | 1120 "psrlq $8, %%mm2 \n\t" |
1121 "psrlq $8, %%mm3 \n\t" | |
1122 "psrlq $8, %%mm6 \n\t" | |
1123 "psrlq $8, %%mm7 \n\t" | |
1124 "pand %2, %%mm0 \n\t" | |
1125 "pand %2, %%mm1 \n\t" | |
1126 "pand %2, %%mm4 \n\t" | |
1127 "pand %2, %%mm5 \n\t" | |
1128 "pand %3, %%mm2 \n\t" | |
1129 "pand %3, %%mm3 \n\t" | |
1130 "pand %3, %%mm6 \n\t" | |
1131 "pand %3, %%mm7 \n\t" | |
1132 "por %%mm2, %%mm0 \n\t" | |
1133 "por %%mm3, %%mm1 \n\t" | |
1134 "por %%mm6, %%mm4 \n\t" | |
1135 "por %%mm7, %%mm5 \n\t" | |
18861 | 1136 |
29480 | 1137 "movq %%mm1, %%mm2 \n\t" |
1138 "movq %%mm4, %%mm3 \n\t" | |
1139 "psllq $48, %%mm2 \n\t" | |
1140 "psllq $32, %%mm3 \n\t" | |
1141 "pand %4, %%mm2 \n\t" | |
1142 "pand %5, %%mm3 \n\t" | |
1143 "por %%mm2, %%mm0 \n\t" | |
1144 "psrlq $16, %%mm1 \n\t" | |
1145 "psrlq $32, %%mm4 \n\t" | |
1146 "psllq $16, %%mm5 \n\t" | |
1147 "por %%mm3, %%mm1 \n\t" | |
1148 "pand %6, %%mm5 \n\t" | |
1149 "por %%mm5, %%mm4 \n\t" | |
18861 | 1150 |
29480 | 1151 MOVNTQ" %%mm0, %0 \n\t" |
1152 MOVNTQ" %%mm1, 8%0 \n\t" | |
1153 MOVNTQ" %%mm4, 16%0" | |
18861 | 1154 |
29480 | 1155 :"=m"(*d) |
1156 :"m"(*s),"m"(mask24l),"m"(mask24h),"m"(mask24hh),"m"(mask24hhh),"m"(mask24hhhh) | |
1157 :"memory"); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1158 d += 24; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1159 s += 8; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1160 } |
27744 | 1161 __asm__ volatile(SFENCE:::"memory"); |
1162 __asm__ volatile(EMMS:::"memory"); | |
18861 | 1163 #endif |
29481 | 1164 while (s < end) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1165 register uint16_t bgr; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1166 bgr = *s++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1167 *d++ = (bgr&0x1F)<<3; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1168 *d++ = (bgr&0x7E0)>>3; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1169 *d++ = (bgr&0xF800)>>8; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1170 } |
18861 | 1171 } |
1172 | |
28773
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1173 /* |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1174 * mm0 = 00 B3 00 B2 00 B1 00 B0 |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1175 * mm1 = 00 G3 00 G2 00 G1 00 G0 |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1176 * mm2 = 00 R3 00 R2 00 R1 00 R0 |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1177 * mm6 = FF FF FF FF FF FF FF FF |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1178 * mm7 = 00 00 00 00 00 00 00 00 |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1179 */ |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1180 #define PACK_RGB32 \ |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1181 "packuswb %%mm7, %%mm0 \n\t" /* 00 00 00 00 B3 B2 B1 B0 */ \ |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1182 "packuswb %%mm7, %%mm1 \n\t" /* 00 00 00 00 G3 G2 G1 G0 */ \ |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1183 "packuswb %%mm7, %%mm2 \n\t" /* 00 00 00 00 R3 R2 R1 R0 */ \ |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1184 "punpcklbw %%mm1, %%mm0 \n\t" /* G3 B3 G2 B2 G1 B1 G0 B0 */ \ |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1185 "punpcklbw %%mm6, %%mm2 \n\t" /* FF R3 FF R2 FF R1 FF R0 */ \ |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1186 "movq %%mm0, %%mm3 \n\t" \ |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1187 "punpcklwd %%mm2, %%mm0 \n\t" /* FF R1 G1 B1 FF R0 G0 B0 */ \ |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1188 "punpckhwd %%mm2, %%mm3 \n\t" /* FF R3 G3 B3 FF R2 G2 B2 */ \ |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1189 MOVNTQ" %%mm0, %0 \n\t" \ |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1190 MOVNTQ" %%mm3, 8%0 \n\t" \ |
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1191 |
18861 | 1192 static inline void RENAME(rgb15to32)(const uint8_t *src, uint8_t *dst, long src_size) |
1193 { | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1194 const uint16_t *end; |
28276 | 1195 #if HAVE_MMX |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1196 const uint16_t *mm_end; |
18861 | 1197 #endif |
26909 | 1198 uint8_t *d = dst; |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1199 const uint16_t *s = (const uint16_t *)src; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1200 end = s + src_size/2; |
28276 | 1201 #if HAVE_MMX |
27744 | 1202 __asm__ volatile(PREFETCH" %0"::"m"(*s):"memory"); |
1203 __asm__ volatile("pxor %%mm7,%%mm7 \n\t":::"memory"); | |
28773
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1204 __asm__ volatile("pcmpeqd %%mm6,%%mm6 \n\t":::"memory"); |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1205 mm_end = end - 3; |
29481 | 1206 while (s < mm_end) { |
27744 | 1207 __asm__ volatile( |
29480 | 1208 PREFETCH" 32%1 \n\t" |
1209 "movq %1, %%mm0 \n\t" | |
1210 "movq %1, %%mm1 \n\t" | |
1211 "movq %1, %%mm2 \n\t" | |
1212 "pand %2, %%mm0 \n\t" | |
1213 "pand %3, %%mm1 \n\t" | |
1214 "pand %4, %%mm2 \n\t" | |
1215 "psllq $3, %%mm0 \n\t" | |
1216 "psrlq $2, %%mm1 \n\t" | |
1217 "psrlq $7, %%mm2 \n\t" | |
1218 PACK_RGB32 | |
1219 :"=m"(*d) | |
1220 :"m"(*s),"m"(mask15b),"m"(mask15g),"m"(mask15r) | |
1221 :"memory"); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1222 d += 16; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1223 s += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1224 } |
27744 | 1225 __asm__ volatile(SFENCE:::"memory"); |
1226 __asm__ volatile(EMMS:::"memory"); | |
18861 | 1227 #endif |
29481 | 1228 while (s < end) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1229 register uint16_t bgr; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1230 bgr = *s++; |
29397 | 1231 #if HAVE_BIGENDIAN |
28721
267dd38c800e
When converting from a non alpha format to an alpha format, defaults to all ones rather than all zeroes
sdrik
parents:
28323
diff
changeset
|
1232 *d++ = 255; |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1233 *d++ = (bgr&0x7C00)>>7; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1234 *d++ = (bgr&0x3E0)>>2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1235 *d++ = (bgr&0x1F)<<3; |
18861 | 1236 #else |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1237 *d++ = (bgr&0x1F)<<3; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1238 *d++ = (bgr&0x3E0)>>2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1239 *d++ = (bgr&0x7C00)>>7; |
28721
267dd38c800e
When converting from a non alpha format to an alpha format, defaults to all ones rather than all zeroes
sdrik
parents:
28323
diff
changeset
|
1240 *d++ = 255; |
18861 | 1241 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1242 } |
18861 | 1243 } |
1244 | |
1245 static inline void RENAME(rgb16to32)(const uint8_t *src, uint8_t *dst, long src_size) | |
1246 { | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1247 const uint16_t *end; |
28276 | 1248 #if HAVE_MMX |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1249 const uint16_t *mm_end; |
18861 | 1250 #endif |
26909 | 1251 uint8_t *d = dst; |
26910 | 1252 const uint16_t *s = (const uint16_t*)src; |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1253 end = s + src_size/2; |
28276 | 1254 #if HAVE_MMX |
27744 | 1255 __asm__ volatile(PREFETCH" %0"::"m"(*s):"memory"); |
1256 __asm__ volatile("pxor %%mm7,%%mm7 \n\t":::"memory"); | |
28773
8a0785c19f48
Rewrite of rgb15to32 and rgb16to32 using fewer asm instructions
sdrik
parents:
28721
diff
changeset
|
1257 __asm__ volatile("pcmpeqd %%mm6,%%mm6 \n\t":::"memory"); |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1258 mm_end = end - 3; |
29481 | 1259 while (s < mm_end) { |
27744 | 1260 __asm__ volatile( |
29480 | 1261 PREFETCH" 32%1 \n\t" |
1262 "movq %1, %%mm0 \n\t" | |
1263 "movq %1, %%mm1 \n\t" | |
1264 "movq %1, %%mm2 \n\t" | |
1265 "pand %2, %%mm0 \n\t" | |
1266 "pand %3, %%mm1 \n\t" | |
1267 "pand %4, %%mm2 \n\t" | |
1268 "psllq $3, %%mm0 \n\t" | |
1269 "psrlq $3, %%mm1 \n\t" | |
1270 "psrlq $8, %%mm2 \n\t" | |
1271 PACK_RGB32 | |
1272 :"=m"(*d) | |
1273 :"m"(*s),"m"(mask16b),"m"(mask16g),"m"(mask16r) | |
1274 :"memory"); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1275 d += 16; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1276 s += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1277 } |
27744 | 1278 __asm__ volatile(SFENCE:::"memory"); |
1279 __asm__ volatile(EMMS:::"memory"); | |
18861 | 1280 #endif |
29481 | 1281 while (s < end) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1282 register uint16_t bgr; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1283 bgr = *s++; |
29397 | 1284 #if HAVE_BIGENDIAN |
28721
267dd38c800e
When converting from a non alpha format to an alpha format, defaults to all ones rather than all zeroes
sdrik
parents:
28323
diff
changeset
|
1285 *d++ = 255; |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1286 *d++ = (bgr&0xF800)>>8; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1287 *d++ = (bgr&0x7E0)>>3; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1288 *d++ = (bgr&0x1F)<<3; |
18861 | 1289 #else |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1290 *d++ = (bgr&0x1F)<<3; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1291 *d++ = (bgr&0x7E0)>>3; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1292 *d++ = (bgr&0xF800)>>8; |
28721
267dd38c800e
When converting from a non alpha format to an alpha format, defaults to all ones rather than all zeroes
sdrik
parents:
28323
diff
changeset
|
1293 *d++ = 255; |
18861 | 1294 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1295 } |
18861 | 1296 } |
1297 | |
1298 static inline void RENAME(rgb32tobgr32)(const uint8_t *src, uint8_t *dst, long src_size) | |
1299 { | |
28968 | 1300 x86_reg idx = 15 - src_size; |
26910 | 1301 const uint8_t *s = src-idx; |
1302 uint8_t *d = dst-idx; | |
28276 | 1303 #if HAVE_MMX |
27744 | 1304 __asm__ volatile( |
29480 | 1305 "test %0, %0 \n\t" |
1306 "jns 2f \n\t" | |
1307 PREFETCH" (%1, %0) \n\t" | |
1308 "movq %3, %%mm7 \n\t" | |
1309 "pxor %4, %%mm7 \n\t" | |
1310 "movq %%mm7, %%mm6 \n\t" | |
1311 "pxor %5, %%mm7 \n\t" | |
1312 ASMALIGN(4) | |
1313 "1: \n\t" | |
1314 PREFETCH" 32(%1, %0) \n\t" | |
1315 "movq (%1, %0), %%mm0 \n\t" | |
1316 "movq 8(%1, %0), %%mm1 \n\t" | |
28276 | 1317 # if HAVE_MMX2 |
29480 | 1318 "pshufw $177, %%mm0, %%mm3 \n\t" |
1319 "pshufw $177, %%mm1, %%mm5 \n\t" | |
1320 "pand %%mm7, %%mm0 \n\t" | |
1321 "pand %%mm6, %%mm3 \n\t" | |
1322 "pand %%mm7, %%mm1 \n\t" | |
1323 "pand %%mm6, %%mm5 \n\t" | |
1324 "por %%mm3, %%mm0 \n\t" | |
1325 "por %%mm5, %%mm1 \n\t" | |
22991 | 1326 # else |
29480 | 1327 "movq %%mm0, %%mm2 \n\t" |
1328 "movq %%mm1, %%mm4 \n\t" | |
1329 "pand %%mm7, %%mm0 \n\t" | |
1330 "pand %%mm6, %%mm2 \n\t" | |
1331 "pand %%mm7, %%mm1 \n\t" | |
1332 "pand %%mm6, %%mm4 \n\t" | |
1333 "movq %%mm2, %%mm3 \n\t" | |
1334 "movq %%mm4, %%mm5 \n\t" | |
1335 "pslld $16, %%mm2 \n\t" | |
1336 "psrld $16, %%mm3 \n\t" | |
1337 "pslld $16, %%mm4 \n\t" | |
1338 "psrld $16, %%mm5 \n\t" | |
1339 "por %%mm2, %%mm0 \n\t" | |
1340 "por %%mm4, %%mm1 \n\t" | |
1341 "por %%mm3, %%mm0 \n\t" | |
1342 "por %%mm5, %%mm1 \n\t" | |
22991 | 1343 # endif |
29480 | 1344 MOVNTQ" %%mm0, (%2, %0) \n\t" |
1345 MOVNTQ" %%mm1, 8(%2, %0) \n\t" | |
1346 "add $16, %0 \n\t" | |
1347 "js 1b \n\t" | |
1348 SFENCE" \n\t" | |
1349 EMMS" \n\t" | |
1350 "2: \n\t" | |
1351 : "+&r"(idx) | |
1352 : "r" (s), "r" (d), "m" (mask32b), "m" (mask32r), "m" (mmx_one) | |
1353 : "memory"); | |
18861 | 1354 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1355 for (; idx<15; idx+=4) { |
26910 | 1356 register int v = *(const uint32_t *)&s[idx], g = v & 0xff00ff00; |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1357 v &= 0xff00ff; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1358 *(uint32_t *)&d[idx] = (v>>16) + g + (v<<16); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1359 } |
18861 | 1360 } |
1361 | |
1362 static inline void RENAME(rgb24tobgr24)(const uint8_t *src, uint8_t *dst, long src_size) | |
1363 { | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1364 unsigned i; |
28276 | 1365 #if HAVE_MMX |
28957 | 1366 x86_reg mmx_size= 23 - src_size; |
27744 | 1367 __asm__ volatile ( |
29480 | 1368 "test %%"REG_a", %%"REG_a" \n\t" |
1369 "jns 2f \n\t" | |
1370 "movq "MANGLE(mask24r)", %%mm5 \n\t" | |
1371 "movq "MANGLE(mask24g)", %%mm6 \n\t" | |
1372 "movq "MANGLE(mask24b)", %%mm7 \n\t" | |
1373 ASMALIGN(4) | |
1374 "1: \n\t" | |
1375 PREFETCH" 32(%1, %%"REG_a") \n\t" | |
1376 "movq (%1, %%"REG_a"), %%mm0 \n\t" // BGR BGR BG | |
1377 "movq (%1, %%"REG_a"), %%mm1 \n\t" // BGR BGR BG | |
1378 "movq 2(%1, %%"REG_a"), %%mm2 \n\t" // R BGR BGR B | |
1379 "psllq $16, %%mm0 \n\t" // 00 BGR BGR | |
1380 "pand %%mm5, %%mm0 \n\t" | |
1381 "pand %%mm6, %%mm1 \n\t" | |
1382 "pand %%mm7, %%mm2 \n\t" | |
1383 "por %%mm0, %%mm1 \n\t" | |
1384 "por %%mm2, %%mm1 \n\t" | |
1385 "movq 6(%1, %%"REG_a"), %%mm0 \n\t" // BGR BGR BG | |
1386 MOVNTQ" %%mm1, (%2, %%"REG_a") \n\t" // RGB RGB RG | |
1387 "movq 8(%1, %%"REG_a"), %%mm1 \n\t" // R BGR BGR B | |
1388 "movq 10(%1, %%"REG_a"), %%mm2 \n\t" // GR BGR BGR | |
1389 "pand %%mm7, %%mm0 \n\t" | |
1390 "pand %%mm5, %%mm1 \n\t" | |
1391 "pand %%mm6, %%mm2 \n\t" | |
1392 "por %%mm0, %%mm1 \n\t" | |
1393 "por %%mm2, %%mm1 \n\t" | |
1394 "movq 14(%1, %%"REG_a"), %%mm0 \n\t" // R BGR BGR B | |
1395 MOVNTQ" %%mm1, 8(%2, %%"REG_a") \n\t" // B RGB RGB R | |
1396 "movq 16(%1, %%"REG_a"), %%mm1 \n\t" // GR BGR BGR | |
1397 "movq 18(%1, %%"REG_a"), %%mm2 \n\t" // BGR BGR BG | |
1398 "pand %%mm6, %%mm0 \n\t" | |
1399 "pand %%mm7, %%mm1 \n\t" | |
1400 "pand %%mm5, %%mm2 \n\t" | |
1401 "por %%mm0, %%mm1 \n\t" | |
1402 "por %%mm2, %%mm1 \n\t" | |
1403 MOVNTQ" %%mm1, 16(%2, %%"REG_a") \n\t" | |
1404 "add $24, %%"REG_a" \n\t" | |
1405 " js 1b \n\t" | |
1406 "2: \n\t" | |
1407 : "+a" (mmx_size) | |
1408 : "r" (src-mmx_size), "r"(dst-mmx_size) | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1409 ); |
18861 | 1410 |
27744 | 1411 __asm__ volatile(SFENCE:::"memory"); |
1412 __asm__ volatile(EMMS:::"memory"); | |
18861 | 1413 |
27158 | 1414 if (mmx_size==23) return; //finished, was multiple of 8 |
18861 | 1415 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1416 src+= src_size; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1417 dst+= src_size; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1418 src_size= 23-mmx_size; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1419 src-= src_size; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1420 dst-= src_size; |
18861 | 1421 #endif |
29481 | 1422 for (i=0; i<src_size; i+=3) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1423 register uint8_t x; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1424 x = src[i + 2]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1425 dst[i + 1] = src[i + 1]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1426 dst[i + 2] = src[i + 0]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1427 dst[i + 0] = x; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1428 } |
18861 | 1429 } |
1430 | |
1431 static inline void RENAME(yuvPlanartoyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1432 long width, long height, |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1433 long lumStride, long chromStride, long dstStride, long vertLumPerChroma) |
18861 | 1434 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1435 long y; |
28968 | 1436 const x86_reg chromWidth= width>>1; |
29481 | 1437 for (y=0; y<height; y++) { |
28276 | 1438 #if HAVE_MMX |
29612 | 1439 //FIXME handle 2 lines at once (fewer prefetches, reuse some chroma, but very likely memory-limited anyway) |
27744 | 1440 __asm__ volatile( |
29480 | 1441 "xor %%"REG_a", %%"REG_a" \n\t" |
1442 ASMALIGN(4) | |
1443 "1: \n\t" | |
1444 PREFETCH" 32(%1, %%"REG_a", 2) \n\t" | |
1445 PREFETCH" 32(%2, %%"REG_a") \n\t" | |
1446 PREFETCH" 32(%3, %%"REG_a") \n\t" | |
1447 "movq (%2, %%"REG_a"), %%mm0 \n\t" // U(0) | |
1448 "movq %%mm0, %%mm2 \n\t" // U(0) | |
1449 "movq (%3, %%"REG_a"), %%mm1 \n\t" // V(0) | |
1450 "punpcklbw %%mm1, %%mm0 \n\t" // UVUV UVUV(0) | |
1451 "punpckhbw %%mm1, %%mm2 \n\t" // UVUV UVUV(8) | |
18861 | 1452 |
29480 | 1453 "movq (%1, %%"REG_a",2), %%mm3 \n\t" // Y(0) |
1454 "movq 8(%1, %%"REG_a",2), %%mm5 \n\t" // Y(8) | |
1455 "movq %%mm3, %%mm4 \n\t" // Y(0) | |
1456 "movq %%mm5, %%mm6 \n\t" // Y(8) | |
1457 "punpcklbw %%mm0, %%mm3 \n\t" // YUYV YUYV(0) | |
1458 "punpckhbw %%mm0, %%mm4 \n\t" // YUYV YUYV(4) | |
1459 "punpcklbw %%mm2, %%mm5 \n\t" // YUYV YUYV(8) | |
1460 "punpckhbw %%mm2, %%mm6 \n\t" // YUYV YUYV(12) | |
18861 | 1461 |
29480 | 1462 MOVNTQ" %%mm3, (%0, %%"REG_a", 4) \n\t" |
1463 MOVNTQ" %%mm4, 8(%0, %%"REG_a", 4) \n\t" | |
1464 MOVNTQ" %%mm5, 16(%0, %%"REG_a", 4) \n\t" | |
1465 MOVNTQ" %%mm6, 24(%0, %%"REG_a", 4) \n\t" | |
18861 | 1466 |
29480 | 1467 "add $8, %%"REG_a" \n\t" |
1468 "cmp %4, %%"REG_a" \n\t" | |
1469 " jb 1b \n\t" | |
1470 ::"r"(dst), "r"(ysrc), "r"(usrc), "r"(vsrc), "g" (chromWidth) | |
1471 : "%"REG_a | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1472 ); |
18861 | 1473 #else |
1474 | |
28276 | 1475 #if ARCH_ALPHA && HAVE_MVI |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1476 #define pl2yuy2(n) \ |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1477 y1 = yc[n]; \ |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1478 y2 = yc2[n]; \ |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1479 u = uc[n]; \ |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1480 v = vc[n]; \ |
27744 | 1481 __asm__("unpkbw %1, %0" : "=r"(y1) : "r"(y1)); \ |
1482 __asm__("unpkbw %1, %0" : "=r"(y2) : "r"(y2)); \ | |
1483 __asm__("unpkbl %1, %0" : "=r"(u) : "r"(u)); \ | |
1484 __asm__("unpkbl %1, %0" : "=r"(v) : "r"(v)); \ | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1485 yuv1 = (u << 8) + (v << 24); \ |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1486 yuv2 = yuv1 + y2; \ |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1487 yuv1 += y1; \ |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1488 qdst[n] = yuv1; \ |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1489 qdst2[n] = yuv2; |
18861 | 1490 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1491 int i; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1492 uint64_t *qdst = (uint64_t *) dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1493 uint64_t *qdst2 = (uint64_t *) (dst + dstStride); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1494 const uint32_t *yc = (uint32_t *) ysrc; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1495 const uint32_t *yc2 = (uint32_t *) (ysrc + lumStride); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1496 const uint16_t *uc = (uint16_t*) usrc, *vc = (uint16_t*) vsrc; |
29481 | 1497 for (i = 0; i < chromWidth; i += 8) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1498 uint64_t y1, y2, yuv1, yuv2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1499 uint64_t u, v; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1500 /* Prefetch */ |
27744 | 1501 __asm__("ldq $31,64(%0)" :: "r"(yc)); |
1502 __asm__("ldq $31,64(%0)" :: "r"(yc2)); | |
1503 __asm__("ldq $31,64(%0)" :: "r"(uc)); | |
1504 __asm__("ldq $31,64(%0)" :: "r"(vc)); | |
18861 | 1505 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1506 pl2yuy2(0); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1507 pl2yuy2(1); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1508 pl2yuy2(2); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1509 pl2yuy2(3); |
18861 | 1510 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1511 yc += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1512 yc2 += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1513 uc += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1514 vc += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1515 qdst += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1516 qdst2 += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1517 } |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1518 y++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1519 ysrc += lumStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1520 dst += dstStride; |
18861 | 1521 |
27688
49d5420c5698
Use HAVE_FAST_64BIT instead of nonstandard __WORDSIZE macro.
diego
parents:
27666
diff
changeset
|
1522 #elif HAVE_FAST_64BIT |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1523 int i; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1524 uint64_t *ldst = (uint64_t *) dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1525 const uint8_t *yc = ysrc, *uc = usrc, *vc = vsrc; |
29481 | 1526 for (i = 0; i < chromWidth; i += 2) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1527 uint64_t k, l; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1528 k = yc[0] + (uc[0] << 8) + |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1529 (yc[1] << 16) + (vc[0] << 24); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1530 l = yc[2] + (uc[1] << 8) + |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1531 (yc[3] << 16) + (vc[1] << 24); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1532 *ldst++ = k + (l << 32); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1533 yc += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1534 uc += 2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1535 vc += 2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1536 } |
18861 | 1537 |
1538 #else | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1539 int i, *idst = (int32_t *) dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1540 const uint8_t *yc = ysrc, *uc = usrc, *vc = vsrc; |
29481 | 1541 for (i = 0; i < chromWidth; i++) { |
29397 | 1542 #if HAVE_BIGENDIAN |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1543 *idst++ = (yc[0] << 24)+ (uc[0] << 16) + |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1544 (yc[1] << 8) + (vc[0] << 0); |
18861 | 1545 #else |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1546 *idst++ = yc[0] + (uc[0] << 8) + |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1547 (yc[1] << 16) + (vc[0] << 24); |
18861 | 1548 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1549 yc += 2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1550 uc++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1551 vc++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1552 } |
18861 | 1553 #endif |
1554 #endif | |
29481 | 1555 if ((y&(vertLumPerChroma-1)) == vertLumPerChroma-1) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1556 usrc += chromStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1557 vsrc += chromStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1558 } |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1559 ysrc += lumStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1560 dst += dstStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1561 } |
28276 | 1562 #if HAVE_MMX |
29480 | 1563 __asm__(EMMS" \n\t" |
1564 SFENCE" \n\t" | |
1565 :::"memory"); | |
18861 | 1566 #endif |
1567 } | |
1568 | |
1569 /** | |
27158 | 1570 * Height should be a multiple of 2 and width should be a multiple of 16. |
1571 * (If this is a problem for anyone then tell me, and I will fix it.) | |
18861 | 1572 */ |
1573 static inline void RENAME(yv12toyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1574 long width, long height, |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1575 long lumStride, long chromStride, long dstStride) |
18861 | 1576 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1577 //FIXME interpolate chroma |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1578 RENAME(yuvPlanartoyuy2)(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride, 2); |
18861 | 1579 } |
1580 | |
1581 static inline void RENAME(yuvPlanartouyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1582 long width, long height, |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1583 long lumStride, long chromStride, long dstStride, long vertLumPerChroma) |
18861 | 1584 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1585 long y; |
28968 | 1586 const x86_reg chromWidth= width>>1; |
29481 | 1587 for (y=0; y<height; y++) { |
28276 | 1588 #if HAVE_MMX |
29612 | 1589 //FIXME handle 2 lines at once (fewer prefetches, reuse some chroma, but very likely memory-limited anyway) |
27744 | 1590 __asm__ volatile( |
29480 | 1591 "xor %%"REG_a", %%"REG_a" \n\t" |
1592 ASMALIGN(4) | |
1593 "1: \n\t" | |
1594 PREFETCH" 32(%1, %%"REG_a", 2) \n\t" | |
1595 PREFETCH" 32(%2, %%"REG_a") \n\t" | |
1596 PREFETCH" 32(%3, %%"REG_a") \n\t" | |
1597 "movq (%2, %%"REG_a"), %%mm0 \n\t" // U(0) | |
1598 "movq %%mm0, %%mm2 \n\t" // U(0) | |
1599 "movq (%3, %%"REG_a"), %%mm1 \n\t" // V(0) | |
1600 "punpcklbw %%mm1, %%mm0 \n\t" // UVUV UVUV(0) | |
1601 "punpckhbw %%mm1, %%mm2 \n\t" // UVUV UVUV(8) | |
18861 | 1602 |
29480 | 1603 "movq (%1, %%"REG_a",2), %%mm3 \n\t" // Y(0) |
1604 "movq 8(%1, %%"REG_a",2), %%mm5 \n\t" // Y(8) | |
1605 "movq %%mm0, %%mm4 \n\t" // Y(0) | |
1606 "movq %%mm2, %%mm6 \n\t" // Y(8) | |
1607 "punpcklbw %%mm3, %%mm0 \n\t" // YUYV YUYV(0) | |
1608 "punpckhbw %%mm3, %%mm4 \n\t" // YUYV YUYV(4) | |
1609 "punpcklbw %%mm5, %%mm2 \n\t" // YUYV YUYV(8) | |
1610 "punpckhbw %%mm5, %%mm6 \n\t" // YUYV YUYV(12) | |
18861 | 1611 |
29480 | 1612 MOVNTQ" %%mm0, (%0, %%"REG_a", 4) \n\t" |
1613 MOVNTQ" %%mm4, 8(%0, %%"REG_a", 4) \n\t" | |
1614 MOVNTQ" %%mm2, 16(%0, %%"REG_a", 4) \n\t" | |
1615 MOVNTQ" %%mm6, 24(%0, %%"REG_a", 4) \n\t" | |
18861 | 1616 |
29480 | 1617 "add $8, %%"REG_a" \n\t" |
1618 "cmp %4, %%"REG_a" \n\t" | |
1619 " jb 1b \n\t" | |
1620 ::"r"(dst), "r"(ysrc), "r"(usrc), "r"(vsrc), "g" (chromWidth) | |
1621 : "%"REG_a | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1622 ); |
18861 | 1623 #else |
25109 | 1624 //FIXME adapt the Alpha ASM code from yv12->yuy2 |
18861 | 1625 |
27688
49d5420c5698
Use HAVE_FAST_64BIT instead of nonstandard __WORDSIZE macro.
diego
parents:
27666
diff
changeset
|
1626 #if HAVE_FAST_64BIT |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1627 int i; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1628 uint64_t *ldst = (uint64_t *) dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1629 const uint8_t *yc = ysrc, *uc = usrc, *vc = vsrc; |
29481 | 1630 for (i = 0; i < chromWidth; i += 2) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1631 uint64_t k, l; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1632 k = uc[0] + (yc[0] << 8) + |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1633 (vc[0] << 16) + (yc[1] << 24); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1634 l = uc[1] + (yc[2] << 8) + |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1635 (vc[1] << 16) + (yc[3] << 24); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1636 *ldst++ = k + (l << 32); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1637 yc += 4; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1638 uc += 2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1639 vc += 2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1640 } |
18861 | 1641 |
1642 #else | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1643 int i, *idst = (int32_t *) dst; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1644 const uint8_t *yc = ysrc, *uc = usrc, *vc = vsrc; |
29481 | 1645 for (i = 0; i < chromWidth; i++) { |
29397 | 1646 #if HAVE_BIGENDIAN |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1647 *idst++ = (uc[0] << 24)+ (yc[0] << 16) + |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1648 (vc[0] << 8) + (yc[1] << 0); |
18861 | 1649 #else |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1650 *idst++ = uc[0] + (yc[0] << 8) + |
27158 | 1651 (vc[0] << 16) + (yc[1] << 24); |
18861 | 1652 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1653 yc += 2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1654 uc++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1655 vc++; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1656 } |
18861 | 1657 #endif |
1658 #endif | |
29481 | 1659 if ((y&(vertLumPerChroma-1)) == vertLumPerChroma-1) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1660 usrc += chromStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1661 vsrc += chromStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1662 } |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1663 ysrc += lumStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1664 dst += dstStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1665 } |
28276 | 1666 #if HAVE_MMX |
29480 | 1667 __asm__(EMMS" \n\t" |
1668 SFENCE" \n\t" | |
1669 :::"memory"); | |
18861 | 1670 #endif |
1671 } | |
1672 | |
1673 /** | |
27158 | 1674 * Height should be a multiple of 2 and width should be a multiple of 16 |
1675 * (If this is a problem for anyone then tell me, and I will fix it.) | |
18861 | 1676 */ |
1677 static inline void RENAME(yv12touyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1678 long width, long height, |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1679 long lumStride, long chromStride, long dstStride) |
18861 | 1680 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1681 //FIXME interpolate chroma |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1682 RENAME(yuvPlanartouyvy)(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride, 2); |
18861 | 1683 } |
1684 | |
1685 /** | |
25109 | 1686 * Width should be a multiple of 16. |
18861 | 1687 */ |
27495 | 1688 static inline void RENAME(yuv422ptouyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, |
1689 long width, long height, | |
1690 long lumStride, long chromStride, long dstStride) | |
1691 { | |
1692 RENAME(yuvPlanartouyvy)(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride, 1); | |
1693 } | |
1694 | |
1695 /** | |
1696 * Width should be a multiple of 16. | |
1697 */ | |
18861 | 1698 static inline void RENAME(yuv422ptoyuy2)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, uint8_t *dst, |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1699 long width, long height, |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1700 long lumStride, long chromStride, long dstStride) |
18861 | 1701 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1702 RENAME(yuvPlanartoyuy2)(ysrc, usrc, vsrc, dst, width, height, lumStride, chromStride, dstStride, 1); |
18861 | 1703 } |
1704 | |
1705 /** | |
27158 | 1706 * Height should be a multiple of 2 and width should be a multiple of 16. |
1707 * (If this is a problem for anyone then tell me, and I will fix it.) | |
18861 | 1708 */ |
1709 static inline void RENAME(yuy2toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1710 long width, long height, |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1711 long lumStride, long chromStride, long srcStride) |
18861 | 1712 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1713 long y; |
28968 | 1714 const x86_reg chromWidth= width>>1; |
29481 | 1715 for (y=0; y<height; y+=2) { |
28276 | 1716 #if HAVE_MMX |
27744 | 1717 __asm__ volatile( |
29480 | 1718 "xor %%"REG_a", %%"REG_a" \n\t" |
1719 "pcmpeqw %%mm7, %%mm7 \n\t" | |
1720 "psrlw $8, %%mm7 \n\t" // FF,00,FF,00... | |
1721 ASMALIGN(4) | |
1722 "1: \n\t" | |
1723 PREFETCH" 64(%0, %%"REG_a", 4) \n\t" | |
1724 "movq (%0, %%"REG_a", 4), %%mm0 \n\t" // YUYV YUYV(0) | |
1725 "movq 8(%0, %%"REG_a", 4), %%mm1 \n\t" // YUYV YUYV(4) | |
1726 "movq %%mm0, %%mm2 \n\t" // YUYV YUYV(0) | |
1727 "movq %%mm1, %%mm3 \n\t" // YUYV YUYV(4) | |
1728 "psrlw $8, %%mm0 \n\t" // U0V0 U0V0(0) | |
1729 "psrlw $8, %%mm1 \n\t" // U0V0 U0V0(4) | |
1730 "pand %%mm7, %%mm2 \n\t" // Y0Y0 Y0Y0(0) | |
1731 "pand %%mm7, %%mm3 \n\t" // Y0Y0 Y0Y0(4) | |
1732 "packuswb %%mm1, %%mm0 \n\t" // UVUV UVUV(0) | |
1733 "packuswb %%mm3, %%mm2 \n\t" // YYYY YYYY(0) | |
18861 | 1734 |
29480 | 1735 MOVNTQ" %%mm2, (%1, %%"REG_a", 2) \n\t" |
18861 | 1736 |
29480 | 1737 "movq 16(%0, %%"REG_a", 4), %%mm1 \n\t" // YUYV YUYV(8) |
1738 "movq 24(%0, %%"REG_a", 4), %%mm2 \n\t" // YUYV YUYV(12) | |
1739 "movq %%mm1, %%mm3 \n\t" // YUYV YUYV(8) | |
1740 "movq %%mm2, %%mm4 \n\t" // YUYV YUYV(12) | |
1741 "psrlw $8, %%mm1 \n\t" // U0V0 U0V0(8) | |
1742 "psrlw $8, %%mm2 \n\t" // U0V0 U0V0(12) | |
1743 "pand %%mm7, %%mm3 \n\t" // Y0Y0 Y0Y0(8) | |
1744 "pand %%mm7, %%mm4 \n\t" // Y0Y0 Y0Y0(12) | |
1745 "packuswb %%mm2, %%mm1 \n\t" // UVUV UVUV(8) | |
1746 "packuswb %%mm4, %%mm3 \n\t" // YYYY YYYY(8) | |
18861 | 1747 |
29480 | 1748 MOVNTQ" %%mm3, 8(%1, %%"REG_a", 2) \n\t" |
18861 | 1749 |
29480 | 1750 "movq %%mm0, %%mm2 \n\t" // UVUV UVUV(0) |
1751 "movq %%mm1, %%mm3 \n\t" // UVUV UVUV(8) | |
1752 "psrlw $8, %%mm0 \n\t" // V0V0 V0V0(0) | |
1753 "psrlw $8, %%mm1 \n\t" // V0V0 V0V0(8) | |
1754 "pand %%mm7, %%mm2 \n\t" // U0U0 U0U0(0) | |
1755 "pand %%mm7, %%mm3 \n\t" // U0U0 U0U0(8) | |
1756 "packuswb %%mm1, %%mm0 \n\t" // VVVV VVVV(0) | |
1757 "packuswb %%mm3, %%mm2 \n\t" // UUUU UUUU(0) | |
18861 | 1758 |
29480 | 1759 MOVNTQ" %%mm0, (%3, %%"REG_a") \n\t" |
1760 MOVNTQ" %%mm2, (%2, %%"REG_a") \n\t" | |
18861 | 1761 |
29480 | 1762 "add $8, %%"REG_a" \n\t" |
1763 "cmp %4, %%"REG_a" \n\t" | |
1764 " jb 1b \n\t" | |
1765 ::"r"(src), "r"(ydst), "r"(udst), "r"(vdst), "g" (chromWidth) | |
1766 : "memory", "%"REG_a | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1767 ); |
18861 | 1768 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1769 ydst += lumStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1770 src += srcStride; |
18861 | 1771 |
27744 | 1772 __asm__ volatile( |
29480 | 1773 "xor %%"REG_a", %%"REG_a" \n\t" |
1774 ASMALIGN(4) | |
1775 "1: \n\t" | |
1776 PREFETCH" 64(%0, %%"REG_a", 4) \n\t" | |
1777 "movq (%0, %%"REG_a", 4), %%mm0 \n\t" // YUYV YUYV(0) | |
1778 "movq 8(%0, %%"REG_a", 4), %%mm1 \n\t" // YUYV YUYV(4) | |
1779 "movq 16(%0, %%"REG_a", 4), %%mm2 \n\t" // YUYV YUYV(8) | |
1780 "movq 24(%0, %%"REG_a", 4), %%mm3 \n\t" // YUYV YUYV(12) | |
1781 "pand %%mm7, %%mm0 \n\t" // Y0Y0 Y0Y0(0) | |
1782 "pand %%mm7, %%mm1 \n\t" // Y0Y0 Y0Y0(4) | |
1783 "pand %%mm7, %%mm2 \n\t" // Y0Y0 Y0Y0(8) | |
1784 "pand %%mm7, %%mm3 \n\t" // Y0Y0 Y0Y0(12) | |
1785 "packuswb %%mm1, %%mm0 \n\t" // YYYY YYYY(0) | |
1786 "packuswb %%mm3, %%mm2 \n\t" // YYYY YYYY(8) | |
18861 | 1787 |
29480 | 1788 MOVNTQ" %%mm0, (%1, %%"REG_a", 2) \n\t" |
1789 MOVNTQ" %%mm2, 8(%1, %%"REG_a", 2) \n\t" | |
18861 | 1790 |
29480 | 1791 "add $8, %%"REG_a" \n\t" |
1792 "cmp %4, %%"REG_a" \n\t" | |
1793 " jb 1b \n\t" | |
18861 | 1794 |
29480 | 1795 ::"r"(src), "r"(ydst), "r"(udst), "r"(vdst), "g" (chromWidth) |
1796 : "memory", "%"REG_a | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1797 ); |
18861 | 1798 #else |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1799 long i; |
29481 | 1800 for (i=0; i<chromWidth; i++) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1801 ydst[2*i+0] = src[4*i+0]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1802 udst[i] = src[4*i+1]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1803 ydst[2*i+1] = src[4*i+2]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1804 vdst[i] = src[4*i+3]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1805 } |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1806 ydst += lumStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1807 src += srcStride; |
18861 | 1808 |
29481 | 1809 for (i=0; i<chromWidth; i++) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1810 ydst[2*i+0] = src[4*i+0]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1811 ydst[2*i+1] = src[4*i+2]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1812 } |
18861 | 1813 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1814 udst += chromStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1815 vdst += chromStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1816 ydst += lumStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1817 src += srcStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1818 } |
28276 | 1819 #if HAVE_MMX |
29480 | 1820 __asm__ volatile(EMMS" \n\t" |
1821 SFENCE" \n\t" | |
1822 :::"memory"); | |
18861 | 1823 #endif |
1824 } | |
1825 | |
1826 static inline void RENAME(yvu9toyv12)(const uint8_t *ysrc, const uint8_t *usrc, const uint8_t *vsrc, | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1827 uint8_t *ydst, uint8_t *udst, uint8_t *vdst, |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1828 long width, long height, long lumStride, long chromStride) |
18861 | 1829 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1830 /* Y Plane */ |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1831 memcpy(ydst, ysrc, width*height); |
18861 | 1832 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1833 /* XXX: implement upscaling for U,V */ |
18861 | 1834 } |
1835 | |
1836 static inline void RENAME(planar2x)(const uint8_t *src, uint8_t *dst, long srcWidth, long srcHeight, long srcStride, long dstStride) | |
1837 { | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1838 long x,y; |
23129 | 1839 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1840 dst[0]= src[0]; |
23129 | 1841 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1842 // first line |
29481 | 1843 for (x=0; x<srcWidth-1; x++) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1844 dst[2*x+1]= (3*src[x] + src[x+1])>>2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1845 dst[2*x+2]= ( src[x] + 3*src[x+1])>>2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1846 } |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1847 dst[2*srcWidth-1]= src[srcWidth-1]; |
23129 | 1848 |
29480 | 1849 dst+= dstStride; |
18861 | 1850 |
29481 | 1851 for (y=1; y<srcHeight; y++) { |
28323
99c49467ebbc
HAVE_3DNOW --> HAVE_AMD3DNOW to sync with latest configure changes.
diego
parents:
28276
diff
changeset
|
1852 #if HAVE_MMX2 || HAVE_AMD3DNOW |
28957 | 1853 const x86_reg mmxSize= srcWidth&~15; |
27744 | 1854 __asm__ volatile( |
29480 | 1855 "mov %4, %%"REG_a" \n\t" |
1856 "1: \n\t" | |
1857 "movq (%0, %%"REG_a"), %%mm0 \n\t" | |
1858 "movq (%1, %%"REG_a"), %%mm1 \n\t" | |
1859 "movq 1(%0, %%"REG_a"), %%mm2 \n\t" | |
1860 "movq 1(%1, %%"REG_a"), %%mm3 \n\t" | |
1861 "movq -1(%0, %%"REG_a"), %%mm4 \n\t" | |
1862 "movq -1(%1, %%"REG_a"), %%mm5 \n\t" | |
1863 PAVGB" %%mm0, %%mm5 \n\t" | |
1864 PAVGB" %%mm0, %%mm3 \n\t" | |
1865 PAVGB" %%mm0, %%mm5 \n\t" | |
1866 PAVGB" %%mm0, %%mm3 \n\t" | |
1867 PAVGB" %%mm1, %%mm4 \n\t" | |
1868 PAVGB" %%mm1, %%mm2 \n\t" | |
1869 PAVGB" %%mm1, %%mm4 \n\t" | |
1870 PAVGB" %%mm1, %%mm2 \n\t" | |
1871 "movq %%mm5, %%mm7 \n\t" | |
1872 "movq %%mm4, %%mm6 \n\t" | |
1873 "punpcklbw %%mm3, %%mm5 \n\t" | |
1874 "punpckhbw %%mm3, %%mm7 \n\t" | |
1875 "punpcklbw %%mm2, %%mm4 \n\t" | |
1876 "punpckhbw %%mm2, %%mm6 \n\t" | |
18861 | 1877 #if 1 |
29480 | 1878 MOVNTQ" %%mm5, (%2, %%"REG_a", 2) \n\t" |
1879 MOVNTQ" %%mm7, 8(%2, %%"REG_a", 2) \n\t" | |
1880 MOVNTQ" %%mm4, (%3, %%"REG_a", 2) \n\t" | |
1881 MOVNTQ" %%mm6, 8(%3, %%"REG_a", 2) \n\t" | |
18861 | 1882 #else |
29480 | 1883 "movq %%mm5, (%2, %%"REG_a", 2) \n\t" |
1884 "movq %%mm7, 8(%2, %%"REG_a", 2) \n\t" | |
1885 "movq %%mm4, (%3, %%"REG_a", 2) \n\t" | |
1886 "movq %%mm6, 8(%3, %%"REG_a", 2) \n\t" | |
18861 | 1887 #endif |
29480 | 1888 "add $8, %%"REG_a" \n\t" |
1889 " js 1b \n\t" | |
1890 :: "r" (src + mmxSize ), "r" (src + srcStride + mmxSize ), | |
1891 "r" (dst + mmxSize*2), "r" (dst + dstStride + mmxSize*2), | |
1892 "g" (-mmxSize) | |
1893 : "%"REG_a | |
18861 | 1894 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1895 ); |
18861 | 1896 #else |
28968 | 1897 const x86_reg mmxSize=1; |
18861 | 1898 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1899 dst[0 ]= (3*src[0] + src[srcStride])>>2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1900 dst[dstStride]= ( src[0] + 3*src[srcStride])>>2; |
18861 | 1901 |
29481 | 1902 for (x=mmxSize-1; x<srcWidth-1; x++) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1903 dst[2*x +1]= (3*src[x+0] + src[x+srcStride+1])>>2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1904 dst[2*x+dstStride+2]= ( src[x+0] + 3*src[x+srcStride+1])>>2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1905 dst[2*x+dstStride+1]= ( src[x+1] + 3*src[x+srcStride ])>>2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1906 dst[2*x +2]= (3*src[x+1] + src[x+srcStride ])>>2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1907 } |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1908 dst[srcWidth*2 -1 ]= (3*src[srcWidth-1] + src[srcWidth-1 + srcStride])>>2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1909 dst[srcWidth*2 -1 + dstStride]= ( src[srcWidth-1] + 3*src[srcWidth-1 + srcStride])>>2; |
18861 | 1910 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1911 dst+=dstStride*2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1912 src+=srcStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1913 } |
23129 | 1914 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1915 // last line |
18861 | 1916 #if 1 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1917 dst[0]= src[0]; |
23129 | 1918 |
29481 | 1919 for (x=0; x<srcWidth-1; x++) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1920 dst[2*x+1]= (3*src[x] + src[x+1])>>2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1921 dst[2*x+2]= ( src[x] + 3*src[x+1])>>2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1922 } |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1923 dst[2*srcWidth-1]= src[srcWidth-1]; |
18861 | 1924 #else |
29481 | 1925 for (x=0; x<srcWidth; x++) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1926 dst[2*x+0]= |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1927 dst[2*x+1]= src[x]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1928 } |
18861 | 1929 #endif |
1930 | |
28276 | 1931 #if HAVE_MMX |
29480 | 1932 __asm__ volatile(EMMS" \n\t" |
1933 SFENCE" \n\t" | |
1934 :::"memory"); | |
18861 | 1935 #endif |
1936 } | |
1937 | |
1938 /** | |
27158 | 1939 * Height should be a multiple of 2 and width should be a multiple of 16. |
1940 * (If this is a problem for anyone then tell me, and I will fix it.) | |
1941 * Chrominance data is only taken from every second line, others are ignored. | |
25109 | 1942 * FIXME: Write HQ version. |
18861 | 1943 */ |
1944 static inline void RENAME(uyvytoyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1945 long width, long height, |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1946 long lumStride, long chromStride, long srcStride) |
18861 | 1947 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
1948 long y; |
28968 | 1949 const x86_reg chromWidth= width>>1; |
29481 | 1950 for (y=0; y<height; y+=2) { |
28276 | 1951 #if HAVE_MMX |
27744 | 1952 __asm__ volatile( |
29480 | 1953 "xor %%"REG_a", %%"REG_a" \n\t" |
1954 "pcmpeqw %%mm7, %%mm7 \n\t" | |
1955 "psrlw $8, %%mm7 \n\t" // FF,00,FF,00... | |
1956 ASMALIGN(4) | |
1957 "1: \n\t" | |
1958 PREFETCH" 64(%0, %%"REG_a", 4) \n\t" | |
1959 "movq (%0, %%"REG_a", 4), %%mm0 \n\t" // UYVY UYVY(0) | |
1960 "movq 8(%0, %%"REG_a", 4), %%mm1 \n\t" // UYVY UYVY(4) | |
1961 "movq %%mm0, %%mm2 \n\t" // UYVY UYVY(0) | |
1962 "movq %%mm1, %%mm3 \n\t" // UYVY UYVY(4) | |
1963 "pand %%mm7, %%mm0 \n\t" // U0V0 U0V0(0) | |
1964 "pand %%mm7, %%mm1 \n\t" // U0V0 U0V0(4) | |
1965 "psrlw $8, %%mm2 \n\t" // Y0Y0 Y0Y0(0) | |
1966 "psrlw $8, %%mm3 \n\t" // Y0Y0 Y0Y0(4) | |
1967 "packuswb %%mm1, %%mm0 \n\t" // UVUV UVUV(0) | |
1968 "packuswb %%mm3, %%mm2 \n\t" // YYYY YYYY(0) | |
18861 | 1969 |
29480 | 1970 MOVNTQ" %%mm2, (%1, %%"REG_a", 2) \n\t" |
18861 | 1971 |
29480 | 1972 "movq 16(%0, %%"REG_a", 4), %%mm1 \n\t" // UYVY UYVY(8) |
1973 "movq 24(%0, %%"REG_a", 4), %%mm2 \n\t" // UYVY UYVY(12) | |
1974 "movq %%mm1, %%mm3 \n\t" // UYVY UYVY(8) | |
1975 "movq %%mm2, %%mm4 \n\t" // UYVY UYVY(12) | |
1976 "pand %%mm7, %%mm1 \n\t" // U0V0 U0V0(8) | |
1977 "pand %%mm7, %%mm2 \n\t" // U0V0 U0V0(12) | |
1978 "psrlw $8, %%mm3 \n\t" // Y0Y0 Y0Y0(8) | |
1979 "psrlw $8, %%mm4 \n\t" // Y0Y0 Y0Y0(12) | |
1980 "packuswb %%mm2, %%mm1 \n\t" // UVUV UVUV(8) | |
1981 "packuswb %%mm4, %%mm3 \n\t" // YYYY YYYY(8) | |
18861 | 1982 |
29480 | 1983 MOVNTQ" %%mm3, 8(%1, %%"REG_a", 2) \n\t" |
18861 | 1984 |
29480 | 1985 "movq %%mm0, %%mm2 \n\t" // UVUV UVUV(0) |
1986 "movq %%mm1, %%mm3 \n\t" // UVUV UVUV(8) | |
1987 "psrlw $8, %%mm0 \n\t" // V0V0 V0V0(0) | |
1988 "psrlw $8, %%mm1 \n\t" // V0V0 V0V0(8) | |
1989 "pand %%mm7, %%mm2 \n\t" // U0U0 U0U0(0) | |
1990 "pand %%mm7, %%mm3 \n\t" // U0U0 U0U0(8) | |
1991 "packuswb %%mm1, %%mm0 \n\t" // VVVV VVVV(0) | |
1992 "packuswb %%mm3, %%mm2 \n\t" // UUUU UUUU(0) | |
18861 | 1993 |
29480 | 1994 MOVNTQ" %%mm0, (%3, %%"REG_a") \n\t" |
1995 MOVNTQ" %%mm2, (%2, %%"REG_a") \n\t" | |
18861 | 1996 |
29480 | 1997 "add $8, %%"REG_a" \n\t" |
1998 "cmp %4, %%"REG_a" \n\t" | |
1999 " jb 1b \n\t" | |
2000 ::"r"(src), "r"(ydst), "r"(udst), "r"(vdst), "g" (chromWidth) | |
2001 : "memory", "%"REG_a | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2002 ); |
18861 | 2003 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2004 ydst += lumStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2005 src += srcStride; |
18861 | 2006 |
27744 | 2007 __asm__ volatile( |
29480 | 2008 "xor %%"REG_a", %%"REG_a" \n\t" |
2009 ASMALIGN(4) | |
2010 "1: \n\t" | |
2011 PREFETCH" 64(%0, %%"REG_a", 4) \n\t" | |
2012 "movq (%0, %%"REG_a", 4), %%mm0 \n\t" // YUYV YUYV(0) | |
2013 "movq 8(%0, %%"REG_a", 4), %%mm1 \n\t" // YUYV YUYV(4) | |
2014 "movq 16(%0, %%"REG_a", 4), %%mm2 \n\t" // YUYV YUYV(8) | |
2015 "movq 24(%0, %%"REG_a", 4), %%mm3 \n\t" // YUYV YUYV(12) | |
2016 "psrlw $8, %%mm0 \n\t" // Y0Y0 Y0Y0(0) | |
2017 "psrlw $8, %%mm1 \n\t" // Y0Y0 Y0Y0(4) | |
2018 "psrlw $8, %%mm2 \n\t" // Y0Y0 Y0Y0(8) | |
2019 "psrlw $8, %%mm3 \n\t" // Y0Y0 Y0Y0(12) | |
2020 "packuswb %%mm1, %%mm0 \n\t" // YYYY YYYY(0) | |
2021 "packuswb %%mm3, %%mm2 \n\t" // YYYY YYYY(8) | |
18861 | 2022 |
29480 | 2023 MOVNTQ" %%mm0, (%1, %%"REG_a", 2) \n\t" |
2024 MOVNTQ" %%mm2, 8(%1, %%"REG_a", 2) \n\t" | |
18861 | 2025 |
29480 | 2026 "add $8, %%"REG_a" \n\t" |
2027 "cmp %4, %%"REG_a" \n\t" | |
2028 " jb 1b \n\t" | |
18861 | 2029 |
29480 | 2030 ::"r"(src), "r"(ydst), "r"(udst), "r"(vdst), "g" (chromWidth) |
2031 : "memory", "%"REG_a | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2032 ); |
18861 | 2033 #else |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2034 long i; |
29481 | 2035 for (i=0; i<chromWidth; i++) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2036 udst[i] = src[4*i+0]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2037 ydst[2*i+0] = src[4*i+1]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2038 vdst[i] = src[4*i+2]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2039 ydst[2*i+1] = src[4*i+3]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2040 } |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2041 ydst += lumStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2042 src += srcStride; |
18861 | 2043 |
29481 | 2044 for (i=0; i<chromWidth; i++) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2045 ydst[2*i+0] = src[4*i+1]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2046 ydst[2*i+1] = src[4*i+3]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2047 } |
18861 | 2048 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2049 udst += chromStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2050 vdst += chromStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2051 ydst += lumStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2052 src += srcStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2053 } |
28276 | 2054 #if HAVE_MMX |
29480 | 2055 __asm__ volatile(EMMS" \n\t" |
2056 SFENCE" \n\t" | |
2057 :::"memory"); | |
18861 | 2058 #endif |
2059 } | |
2060 | |
2061 /** | |
27158 | 2062 * Height should be a multiple of 2 and width should be a multiple of 2. |
2063 * (If this is a problem for anyone then tell me, and I will fix it.) | |
2064 * Chrominance data is only taken from every second line, | |
25109 | 2065 * others are ignored in the C version. |
2066 * FIXME: Write HQ version. | |
18861 | 2067 */ |
2068 static inline void RENAME(rgb24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2069 long width, long height, |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2070 long lumStride, long chromStride, long srcStride) |
18861 | 2071 { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2072 long y; |
28968 | 2073 const x86_reg chromWidth= width>>1; |
28276 | 2074 #if HAVE_MMX |
29481 | 2075 for (y=0; y<height-2; y+=2) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2076 long i; |
29481 | 2077 for (i=0; i<2; i++) { |
27744 | 2078 __asm__ volatile( |
29480 | 2079 "mov %2, %%"REG_a" \n\t" |
2080 "movq "MANGLE(ff_bgr2YCoeff)", %%mm6 \n\t" | |
2081 "movq "MANGLE(ff_w1111)", %%mm5 \n\t" | |
2082 "pxor %%mm7, %%mm7 \n\t" | |
2083 "lea (%%"REG_a", %%"REG_a", 2), %%"REG_d" \n\t" | |
2084 ASMALIGN(4) | |
2085 "1: \n\t" | |
2086 PREFETCH" 64(%0, %%"REG_d") \n\t" | |
2087 "movd (%0, %%"REG_d"), %%mm0 \n\t" | |
2088 "movd 3(%0, %%"REG_d"), %%mm1 \n\t" | |
2089 "punpcklbw %%mm7, %%mm0 \n\t" | |
2090 "punpcklbw %%mm7, %%mm1 \n\t" | |
2091 "movd 6(%0, %%"REG_d"), %%mm2 \n\t" | |
2092 "movd 9(%0, %%"REG_d"), %%mm3 \n\t" | |
2093 "punpcklbw %%mm7, %%mm2 \n\t" | |
2094 "punpcklbw %%mm7, %%mm3 \n\t" | |
2095 "pmaddwd %%mm6, %%mm0 \n\t" | |
2096 "pmaddwd %%mm6, %%mm1 \n\t" | |
2097 "pmaddwd %%mm6, %%mm2 \n\t" | |
2098 "pmaddwd %%mm6, %%mm3 \n\t" | |
18861 | 2099 #ifndef FAST_BGR2YV12 |
29480 | 2100 "psrad $8, %%mm0 \n\t" |
2101 "psrad $8, %%mm1 \n\t" | |
2102 "psrad $8, %%mm2 \n\t" | |
2103 "psrad $8, %%mm3 \n\t" | |
18861 | 2104 #endif |
29480 | 2105 "packssdw %%mm1, %%mm0 \n\t" |
2106 "packssdw %%mm3, %%mm2 \n\t" | |
2107 "pmaddwd %%mm5, %%mm0 \n\t" | |
2108 "pmaddwd %%mm5, %%mm2 \n\t" | |
2109 "packssdw %%mm2, %%mm0 \n\t" | |
2110 "psraw $7, %%mm0 \n\t" | |
18861 | 2111 |
29480 | 2112 "movd 12(%0, %%"REG_d"), %%mm4 \n\t" |
2113 "movd 15(%0, %%"REG_d"), %%mm1 \n\t" | |
2114 "punpcklbw %%mm7, %%mm4 \n\t" | |
2115 "punpcklbw %%mm7, %%mm1 \n\t" | |
2116 "movd 18(%0, %%"REG_d"), %%mm2 \n\t" | |
2117 "movd 21(%0, %%"REG_d"), %%mm3 \n\t" | |
2118 "punpcklbw %%mm7, %%mm2 \n\t" | |
2119 "punpcklbw %%mm7, %%mm3 \n\t" | |
2120 "pmaddwd %%mm6, %%mm4 \n\t" | |
2121 "pmaddwd %%mm6, %%mm1 \n\t" | |
2122 "pmaddwd %%mm6, %%mm2 \n\t" | |
2123 "pmaddwd %%mm6, %%mm3 \n\t" | |
18861 | 2124 #ifndef FAST_BGR2YV12 |
29480 | 2125 "psrad $8, %%mm4 \n\t" |
2126 "psrad $8, %%mm1 \n\t" | |
2127 "psrad $8, %%mm2 \n\t" | |
2128 "psrad $8, %%mm3 \n\t" | |
18861 | 2129 #endif |
29480 | 2130 "packssdw %%mm1, %%mm4 \n\t" |
2131 "packssdw %%mm3, %%mm2 \n\t" | |
2132 "pmaddwd %%mm5, %%mm4 \n\t" | |
2133 "pmaddwd %%mm5, %%mm2 \n\t" | |
2134 "add $24, %%"REG_d" \n\t" | |
2135 "packssdw %%mm2, %%mm4 \n\t" | |
2136 "psraw $7, %%mm4 \n\t" | |
18861 | 2137 |
29480 | 2138 "packuswb %%mm4, %%mm0 \n\t" |
2139 "paddusb "MANGLE(ff_bgr2YOffset)", %%mm0 \n\t" | |
18861 | 2140 |
29480 | 2141 MOVNTQ" %%mm0, (%1, %%"REG_a") \n\t" |
2142 "add $8, %%"REG_a" \n\t" | |
2143 " js 1b \n\t" | |
2144 : : "r" (src+width*3), "r" (ydst+width), "g" ((x86_reg)-width) | |
2145 : "%"REG_a, "%"REG_d | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2146 ); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2147 ydst += lumStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2148 src += srcStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2149 } |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2150 src -= srcStride*2; |
27744 | 2151 __asm__ volatile( |
29480 | 2152 "mov %4, %%"REG_a" \n\t" |
2153 "movq "MANGLE(ff_w1111)", %%mm5 \n\t" | |
2154 "movq "MANGLE(ff_bgr2UCoeff)", %%mm6 \n\t" | |
2155 "pxor %%mm7, %%mm7 \n\t" | |
2156 "lea (%%"REG_a", %%"REG_a", 2), %%"REG_d" \n\t" | |
2157 "add %%"REG_d", %%"REG_d" \n\t" | |
2158 ASMALIGN(4) | |
2159 "1: \n\t" | |
2160 PREFETCH" 64(%0, %%"REG_d") \n\t" | |
2161 PREFETCH" 64(%1, %%"REG_d") \n\t" | |
28323
99c49467ebbc
HAVE_3DNOW --> HAVE_AMD3DNOW to sync with latest configure changes.
diego
parents:
28276
diff
changeset
|
2162 #if HAVE_MMX2 || HAVE_AMD3DNOW |
29480 | 2163 "movq (%0, %%"REG_d"), %%mm0 \n\t" |
2164 "movq (%1, %%"REG_d"), %%mm1 \n\t" | |
2165 "movq 6(%0, %%"REG_d"), %%mm2 \n\t" | |
2166 "movq 6(%1, %%"REG_d"), %%mm3 \n\t" | |
2167 PAVGB" %%mm1, %%mm0 \n\t" | |
2168 PAVGB" %%mm3, %%mm2 \n\t" | |
2169 "movq %%mm0, %%mm1 \n\t" | |
2170 "movq %%mm2, %%mm3 \n\t" | |
2171 "psrlq $24, %%mm0 \n\t" | |
2172 "psrlq $24, %%mm2 \n\t" | |
2173 PAVGB" %%mm1, %%mm0 \n\t" | |
2174 PAVGB" %%mm3, %%mm2 \n\t" | |
2175 "punpcklbw %%mm7, %%mm0 \n\t" | |
2176 "punpcklbw %%mm7, %%mm2 \n\t" | |
18861 | 2177 #else |
29480 | 2178 "movd (%0, %%"REG_d"), %%mm0 \n\t" |
2179 "movd (%1, %%"REG_d"), %%mm1 \n\t" | |
2180 "movd 3(%0, %%"REG_d"), %%mm2 \n\t" | |
2181 "movd 3(%1, %%"REG_d"), %%mm3 \n\t" | |
2182 "punpcklbw %%mm7, %%mm0 \n\t" | |
2183 "punpcklbw %%mm7, %%mm1 \n\t" | |
2184 "punpcklbw %%mm7, %%mm2 \n\t" | |
2185 "punpcklbw %%mm7, %%mm3 \n\t" | |
2186 "paddw %%mm1, %%mm0 \n\t" | |
2187 "paddw %%mm3, %%mm2 \n\t" | |
2188 "paddw %%mm2, %%mm0 \n\t" | |
2189 "movd 6(%0, %%"REG_d"), %%mm4 \n\t" | |
2190 "movd 6(%1, %%"REG_d"), %%mm1 \n\t" | |
2191 "movd 9(%0, %%"REG_d"), %%mm2 \n\t" | |
2192 "movd 9(%1, %%"REG_d"), %%mm3 \n\t" | |
2193 "punpcklbw %%mm7, %%mm4 \n\t" | |
2194 "punpcklbw %%mm7, %%mm1 \n\t" | |
2195 "punpcklbw %%mm7, %%mm2 \n\t" | |
2196 "punpcklbw %%mm7, %%mm3 \n\t" | |
2197 "paddw %%mm1, %%mm4 \n\t" | |
2198 "paddw %%mm3, %%mm2 \n\t" | |
2199 "paddw %%mm4, %%mm2 \n\t" | |
2200 "psrlw $2, %%mm0 \n\t" | |
2201 "psrlw $2, %%mm2 \n\t" | |
18861 | 2202 #endif |
29480 | 2203 "movq "MANGLE(ff_bgr2VCoeff)", %%mm1 \n\t" |
2204 "movq "MANGLE(ff_bgr2VCoeff)", %%mm3 \n\t" | |
18861 | 2205 |
29480 | 2206 "pmaddwd %%mm0, %%mm1 \n\t" |
2207 "pmaddwd %%mm2, %%mm3 \n\t" | |
2208 "pmaddwd %%mm6, %%mm0 \n\t" | |
2209 "pmaddwd %%mm6, %%mm2 \n\t" | |
18861 | 2210 #ifndef FAST_BGR2YV12 |
29480 | 2211 "psrad $8, %%mm0 \n\t" |
2212 "psrad $8, %%mm1 \n\t" | |
2213 "psrad $8, %%mm2 \n\t" | |
2214 "psrad $8, %%mm3 \n\t" | |
18861 | 2215 #endif |
29480 | 2216 "packssdw %%mm2, %%mm0 \n\t" |
2217 "packssdw %%mm3, %%mm1 \n\t" | |
2218 "pmaddwd %%mm5, %%mm0 \n\t" | |
2219 "pmaddwd %%mm5, %%mm1 \n\t" | |
2220 "packssdw %%mm1, %%mm0 \n\t" // V1 V0 U1 U0 | |
2221 "psraw $7, %%mm0 \n\t" | |
18861 | 2222 |
28323
99c49467ebbc
HAVE_3DNOW --> HAVE_AMD3DNOW to sync with latest configure changes.
diego
parents:
28276
diff
changeset
|
2223 #if HAVE_MMX2 || HAVE_AMD3DNOW |
29480 | 2224 "movq 12(%0, %%"REG_d"), %%mm4 \n\t" |
2225 "movq 12(%1, %%"REG_d"), %%mm1 \n\t" | |
2226 "movq 18(%0, %%"REG_d"), %%mm2 \n\t" | |
2227 "movq 18(%1, %%"REG_d"), %%mm3 \n\t" | |
2228 PAVGB" %%mm1, %%mm4 \n\t" | |
2229 PAVGB" %%mm3, %%mm2 \n\t" | |
2230 "movq %%mm4, %%mm1 \n\t" | |
2231 "movq %%mm2, %%mm3 \n\t" | |
2232 "psrlq $24, %%mm4 \n\t" | |
2233 "psrlq $24, %%mm2 \n\t" | |
2234 PAVGB" %%mm1, %%mm4 \n\t" | |
2235 PAVGB" %%mm3, %%mm2 \n\t" | |
2236 "punpcklbw %%mm7, %%mm4 \n\t" | |
2237 "punpcklbw %%mm7, %%mm2 \n\t" | |
18861 | 2238 #else |
29480 | 2239 "movd 12(%0, %%"REG_d"), %%mm4 \n\t" |
2240 "movd 12(%1, %%"REG_d"), %%mm1 \n\t" | |
2241 "movd 15(%0, %%"REG_d"), %%mm2 \n\t" | |
2242 "movd 15(%1, %%"REG_d"), %%mm3 \n\t" | |
2243 "punpcklbw %%mm7, %%mm4 \n\t" | |
2244 "punpcklbw %%mm7, %%mm1 \n\t" | |
2245 "punpcklbw %%mm7, %%mm2 \n\t" | |
2246 "punpcklbw %%mm7, %%mm3 \n\t" | |
2247 "paddw %%mm1, %%mm4 \n\t" | |
2248 "paddw %%mm3, %%mm2 \n\t" | |
2249 "paddw %%mm2, %%mm4 \n\t" | |
2250 "movd 18(%0, %%"REG_d"), %%mm5 \n\t" | |
2251 "movd 18(%1, %%"REG_d"), %%mm1 \n\t" | |
2252 "movd 21(%0, %%"REG_d"), %%mm2 \n\t" | |
2253 "movd 21(%1, %%"REG_d"), %%mm3 \n\t" | |
2254 "punpcklbw %%mm7, %%mm5 \n\t" | |
2255 "punpcklbw %%mm7, %%mm1 \n\t" | |
2256 "punpcklbw %%mm7, %%mm2 \n\t" | |
2257 "punpcklbw %%mm7, %%mm3 \n\t" | |
2258 "paddw %%mm1, %%mm5 \n\t" | |
2259 "paddw %%mm3, %%mm2 \n\t" | |
2260 "paddw %%mm5, %%mm2 \n\t" | |
2261 "movq "MANGLE(ff_w1111)", %%mm5 \n\t" | |
2262 "psrlw $2, %%mm4 \n\t" | |
2263 "psrlw $2, %%mm2 \n\t" | |
18861 | 2264 #endif |
29480 | 2265 "movq "MANGLE(ff_bgr2VCoeff)", %%mm1 \n\t" |
2266 "movq "MANGLE(ff_bgr2VCoeff)", %%mm3 \n\t" | |
18861 | 2267 |
29480 | 2268 "pmaddwd %%mm4, %%mm1 \n\t" |
2269 "pmaddwd %%mm2, %%mm3 \n\t" | |
2270 "pmaddwd %%mm6, %%mm4 \n\t" | |
2271 "pmaddwd %%mm6, %%mm2 \n\t" | |
18861 | 2272 #ifndef FAST_BGR2YV12 |
29480 | 2273 "psrad $8, %%mm4 \n\t" |
2274 "psrad $8, %%mm1 \n\t" | |
2275 "psrad $8, %%mm2 \n\t" | |
2276 "psrad $8, %%mm3 \n\t" | |
18861 | 2277 #endif |
29480 | 2278 "packssdw %%mm2, %%mm4 \n\t" |
2279 "packssdw %%mm3, %%mm1 \n\t" | |
2280 "pmaddwd %%mm5, %%mm4 \n\t" | |
2281 "pmaddwd %%mm5, %%mm1 \n\t" | |
2282 "add $24, %%"REG_d" \n\t" | |
2283 "packssdw %%mm1, %%mm4 \n\t" // V3 V2 U3 U2 | |
2284 "psraw $7, %%mm4 \n\t" | |
18861 | 2285 |
29480 | 2286 "movq %%mm0, %%mm1 \n\t" |
2287 "punpckldq %%mm4, %%mm0 \n\t" | |
2288 "punpckhdq %%mm4, %%mm1 \n\t" | |
2289 "packsswb %%mm1, %%mm0 \n\t" | |
2290 "paddb "MANGLE(ff_bgr2UVOffset)", %%mm0 \n\t" | |
2291 "movd %%mm0, (%2, %%"REG_a") \n\t" | |
2292 "punpckhdq %%mm0, %%mm0 \n\t" | |
2293 "movd %%mm0, (%3, %%"REG_a") \n\t" | |
2294 "add $4, %%"REG_a" \n\t" | |
2295 " js 1b \n\t" | |
2296 : : "r" (src+chromWidth*6), "r" (src+srcStride+chromWidth*6), "r" (udst+chromWidth), "r" (vdst+chromWidth), "g" (-chromWidth) | |
2297 : "%"REG_a, "%"REG_d | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2298 ); |
18861 | 2299 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2300 udst += chromStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2301 vdst += chromStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2302 src += srcStride*2; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2303 } |
18861 | 2304 |
29480 | 2305 __asm__ volatile(EMMS" \n\t" |
2306 SFENCE" \n\t" | |
2307 :::"memory"); | |
18861 | 2308 #else |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2309 y=0; |
18861 | 2310 #endif |
29481 | 2311 for (; y<height; y+=2) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2312 long i; |
29481 | 2313 for (i=0; i<chromWidth; i++) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2314 unsigned int b = src[6*i+0]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2315 unsigned int g = src[6*i+1]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2316 unsigned int r = src[6*i+2]; |
18861 | 2317 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2318 unsigned int Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2319 unsigned int V = ((RV*r + GV*g + BV*b)>>RGB2YUV_SHIFT) + 128; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2320 unsigned int U = ((RU*r + GU*g + BU*b)>>RGB2YUV_SHIFT) + 128; |
18861 | 2321 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2322 udst[i] = U; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2323 vdst[i] = V; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2324 ydst[2*i] = Y; |
18861 | 2325 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2326 b = src[6*i+3]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2327 g = src[6*i+4]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2328 r = src[6*i+5]; |
18861 | 2329 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2330 Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2331 ydst[2*i+1] = Y; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2332 } |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2333 ydst += lumStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2334 src += srcStride; |
18861 | 2335 |
29481 | 2336 for (i=0; i<chromWidth; i++) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2337 unsigned int b = src[6*i+0]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2338 unsigned int g = src[6*i+1]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2339 unsigned int r = src[6*i+2]; |
18861 | 2340 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2341 unsigned int Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16; |
18861 | 2342 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2343 ydst[2*i] = Y; |
18861 | 2344 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2345 b = src[6*i+3]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2346 g = src[6*i+4]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2347 r = src[6*i+5]; |
18861 | 2348 |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2349 Y = ((RY*r + GY*g + BY*b)>>RGB2YUV_SHIFT) + 16; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2350 ydst[2*i+1] = Y; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2351 } |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2352 udst += chromStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2353 vdst += chromStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2354 ydst += lumStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2355 src += srcStride; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2356 } |
18861 | 2357 } |
2358 | |
27703
3815517f49d4
Mark variation-specific interleaveBytes static.
flameeyes
parents:
27690
diff
changeset
|
2359 static void RENAME(interleaveBytes)(uint8_t *src1, uint8_t *src2, uint8_t *dest, |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2360 long width, long height, long src1Stride, |
29481 | 2361 long src2Stride, long dstStride) |
2362 { | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2363 long h; |
18861 | 2364 |
29481 | 2365 for (h=0; h < height; h++) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2366 long w; |
18861 | 2367 |
28276 | 2368 #if HAVE_MMX |
2369 #if HAVE_SSE2 | |
27744 | 2370 __asm__( |
29480 | 2371 "xor %%"REG_a", %%"REG_a" \n\t" |
2372 "1: \n\t" | |
2373 PREFETCH" 64(%1, %%"REG_a") \n\t" | |
2374 PREFETCH" 64(%2, %%"REG_a") \n\t" | |
2375 "movdqa (%1, %%"REG_a"), %%xmm0 \n\t" | |
2376 "movdqa (%1, %%"REG_a"), %%xmm1 \n\t" | |
2377 "movdqa (%2, %%"REG_a"), %%xmm2 \n\t" | |
2378 "punpcklbw %%xmm2, %%xmm0 \n\t" | |
2379 "punpckhbw %%xmm2, %%xmm1 \n\t" | |
2380 "movntdq %%xmm0, (%0, %%"REG_a", 2) \n\t" | |
2381 "movntdq %%xmm1, 16(%0, %%"REG_a", 2) \n\t" | |
2382 "add $16, %%"REG_a" \n\t" | |
2383 "cmp %3, %%"REG_a" \n\t" | |
2384 " jb 1b \n\t" | |
2385 ::"r"(dest), "r"(src1), "r"(src2), "r" ((x86_reg)width-15) | |
2386 : "memory", "%"REG_a"" | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2387 ); |
18861 | 2388 #else |
27744 | 2389 __asm__( |
29480 | 2390 "xor %%"REG_a", %%"REG_a" \n\t" |
2391 "1: \n\t" | |
2392 PREFETCH" 64(%1, %%"REG_a") \n\t" | |
2393 PREFETCH" 64(%2, %%"REG_a") \n\t" | |
2394 "movq (%1, %%"REG_a"), %%mm0 \n\t" | |
2395 "movq 8(%1, %%"REG_a"), %%mm2 \n\t" | |
2396 "movq %%mm0, %%mm1 \n\t" | |
2397 "movq %%mm2, %%mm3 \n\t" | |
2398 "movq (%2, %%"REG_a"), %%mm4 \n\t" | |
2399 "movq 8(%2, %%"REG_a"), %%mm5 \n\t" | |
2400 "punpcklbw %%mm4, %%mm0 \n\t" | |
2401 "punpckhbw %%mm4, %%mm1 \n\t" | |
2402 "punpcklbw %%mm5, %%mm2 \n\t" | |
2403 "punpckhbw %%mm5, %%mm3 \n\t" | |
2404 MOVNTQ" %%mm0, (%0, %%"REG_a", 2) \n\t" | |
2405 MOVNTQ" %%mm1, 8(%0, %%"REG_a", 2) \n\t" | |
2406 MOVNTQ" %%mm2, 16(%0, %%"REG_a", 2) \n\t" | |
2407 MOVNTQ" %%mm3, 24(%0, %%"REG_a", 2) \n\t" | |
2408 "add $16, %%"REG_a" \n\t" | |
2409 "cmp %3, %%"REG_a" \n\t" | |
2410 " jb 1b \n\t" | |
2411 ::"r"(dest), "r"(src1), "r"(src2), "r" ((x86_reg)width-15) | |
2412 : "memory", "%"REG_a | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2413 ); |
18861 | 2414 #endif |
29481 | 2415 for (w= (width&(~15)); w < width; w++) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2416 dest[2*w+0] = src1[w]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2417 dest[2*w+1] = src2[w]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2418 } |
18861 | 2419 #else |
29481 | 2420 for (w=0; w < width; w++) { |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2421 dest[2*w+0] = src1[w]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2422 dest[2*w+1] = src2[w]; |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2423 } |
18861 | 2424 #endif |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2425 dest += dstStride; |
18861 | 2426 src1 += src1Stride; |
2427 src2 += src2Stride; | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2428 } |
28276 | 2429 #if HAVE_MMX |
27744 | 2430 __asm__( |
29480 | 2431 EMMS" \n\t" |
2432 SFENCE" \n\t" | |
2433 ::: "memory" | |
2434 ); | |
18861 | 2435 #endif |
2436 } | |
2437 | |
2438 static inline void RENAME(vu9_to_vu12)(const uint8_t *src1, const uint8_t *src2, | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2439 uint8_t *dst1, uint8_t *dst2, |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2440 long width, long height, |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2441 long srcStride1, long srcStride2, |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2442 long dstStride1, long dstStride2) |
18861 | 2443 { |
28968 | 2444 x86_reg y; |
2445 long x,w,h; | |
18861 | 2446 w=width/2; h=height/2; |
28276 | 2447 #if HAVE_MMX |
27744 | 2448 __asm__ volatile( |
29480 | 2449 PREFETCH" %0 \n\t" |
2450 PREFETCH" %1 \n\t" | |
2451 ::"m"(*(src1+srcStride1)),"m"(*(src2+srcStride2)):"memory"); | |
18861 | 2452 #endif |
29481 | 2453 for (y=0;y<h;y++) { |
29480 | 2454 const uint8_t* s1=src1+srcStride1*(y>>1); |
2455 uint8_t* d=dst1+dstStride1*y; | |
2456 x=0; | |
28276 | 2457 #if HAVE_MMX |
29481 | 2458 for (;x<w-31;x+=32) { |
29480 | 2459 __asm__ volatile( |
2460 PREFETCH" 32%1 \n\t" | |
2461 "movq %1, %%mm0 \n\t" | |
2462 "movq 8%1, %%mm2 \n\t" | |
2463 "movq 16%1, %%mm4 \n\t" | |
2464 "movq 24%1, %%mm6 \n\t" | |
2465 "movq %%mm0, %%mm1 \n\t" | |
2466 "movq %%mm2, %%mm3 \n\t" | |
2467 "movq %%mm4, %%mm5 \n\t" | |
2468 "movq %%mm6, %%mm7 \n\t" | |
2469 "punpcklbw %%mm0, %%mm0 \n\t" | |
2470 "punpckhbw %%mm1, %%mm1 \n\t" | |
2471 "punpcklbw %%mm2, %%mm2 \n\t" | |
2472 "punpckhbw %%mm3, %%mm3 \n\t" | |
2473 "punpcklbw %%mm4, %%mm4 \n\t" | |
2474 "punpckhbw %%mm5, %%mm5 \n\t" | |
2475 "punpcklbw %%mm6, %%mm6 \n\t" | |
2476 "punpckhbw %%mm7, %%mm7 \n\t" | |
2477 MOVNTQ" %%mm0, %0 \n\t" | |
2478 MOVNTQ" %%mm1, 8%0 \n\t" | |
2479 MOVNTQ" %%mm2, 16%0 \n\t" | |
2480 MOVNTQ" %%mm3, 24%0 \n\t" | |
2481 MOVNTQ" %%mm4, 32%0 \n\t" | |
2482 MOVNTQ" %%mm5, 40%0 \n\t" | |
2483 MOVNTQ" %%mm6, 48%0 \n\t" | |
2484 MOVNTQ" %%mm7, 56%0" | |
2485 :"=m"(d[2*x]) | |
2486 :"m"(s1[x]) | |
2487 :"memory"); | |
2488 } | |
18861 | 2489 #endif |
29480 | 2490 for (;x<w;x++) d[2*x]=d[2*x+1]=s1[x]; |
18861 | 2491 } |
29481 | 2492 for (y=0;y<h;y++) { |
29480 | 2493 const uint8_t* s2=src2+srcStride2*(y>>1); |
2494 uint8_t* d=dst2+dstStride2*y; | |
2495 x=0; | |
28276 | 2496 #if HAVE_MMX |
29481 | 2497 for (;x<w-31;x+=32) { |
29480 | 2498 __asm__ volatile( |
2499 PREFETCH" 32%1 \n\t" | |
2500 "movq %1, %%mm0 \n\t" | |
2501 "movq 8%1, %%mm2 \n\t" | |
2502 "movq 16%1, %%mm4 \n\t" | |
2503 "movq 24%1, %%mm6 \n\t" | |
2504 "movq %%mm0, %%mm1 \n\t" | |
2505 "movq %%mm2, %%mm3 \n\t" | |
2506 "movq %%mm4, %%mm5 \n\t" | |
2507 "movq %%mm6, %%mm7 \n\t" | |
2508 "punpcklbw %%mm0, %%mm0 \n\t" | |
2509 "punpckhbw %%mm1, %%mm1 \n\t" | |
2510 "punpcklbw %%mm2, %%mm2 \n\t" | |
2511 "punpckhbw %%mm3, %%mm3 \n\t" | |
2512 "punpcklbw %%mm4, %%mm4 \n\t" | |
2513 "punpckhbw %%mm5, %%mm5 \n\t" | |
2514 "punpcklbw %%mm6, %%mm6 \n\t" | |
2515 "punpckhbw %%mm7, %%mm7 \n\t" | |
2516 MOVNTQ" %%mm0, %0 \n\t" | |
2517 MOVNTQ" %%mm1, 8%0 \n\t" | |
2518 MOVNTQ" %%mm2, 16%0 \n\t" | |
2519 MOVNTQ" %%mm3, 24%0 \n\t" | |
2520 MOVNTQ" %%mm4, 32%0 \n\t" | |
2521 MOVNTQ" %%mm5, 40%0 \n\t" | |
2522 MOVNTQ" %%mm6, 48%0 \n\t" | |
2523 MOVNTQ" %%mm7, 56%0" | |
2524 :"=m"(d[2*x]) | |
2525 :"m"(s2[x]) | |
2526 :"memory"); | |
2527 } | |
18861 | 2528 #endif |
29480 | 2529 for (;x<w;x++) d[2*x]=d[2*x+1]=s2[x]; |
18861 | 2530 } |
28276 | 2531 #if HAVE_MMX |
27744 | 2532 __asm__( |
29480 | 2533 EMMS" \n\t" |
2534 SFENCE" \n\t" | |
2535 ::: "memory" | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2536 ); |
18861 | 2537 #endif |
2538 } | |
2539 | |
2540 static inline void RENAME(yvu9_to_yuy2)(const uint8_t *src1, const uint8_t *src2, const uint8_t *src3, | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2541 uint8_t *dst, |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2542 long width, long height, |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2543 long srcStride1, long srcStride2, |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2544 long srcStride3, long dstStride) |
18861 | 2545 { |
28968 | 2546 x86_reg x; |
28957 | 2547 long y,w,h; |
18861 | 2548 w=width/2; h=height; |
29481 | 2549 for (y=0;y<h;y++) { |
29480 | 2550 const uint8_t* yp=src1+srcStride1*y; |
2551 const uint8_t* up=src2+srcStride2*(y>>2); | |
2552 const uint8_t* vp=src3+srcStride3*(y>>2); | |
2553 uint8_t* d=dst+dstStride*y; | |
2554 x=0; | |
28276 | 2555 #if HAVE_MMX |
29481 | 2556 for (;x<w-7;x+=8) { |
29480 | 2557 __asm__ volatile( |
2558 PREFETCH" 32(%1, %0) \n\t" | |
2559 PREFETCH" 32(%2, %0) \n\t" | |
2560 PREFETCH" 32(%3, %0) \n\t" | |
2561 "movq (%1, %0, 4), %%mm0 \n\t" /* Y0Y1Y2Y3Y4Y5Y6Y7 */ | |
2562 "movq (%2, %0), %%mm1 \n\t" /* U0U1U2U3U4U5U6U7 */ | |
2563 "movq (%3, %0), %%mm2 \n\t" /* V0V1V2V3V4V5V6V7 */ | |
2564 "movq %%mm0, %%mm3 \n\t" /* Y0Y1Y2Y3Y4Y5Y6Y7 */ | |
2565 "movq %%mm1, %%mm4 \n\t" /* U0U1U2U3U4U5U6U7 */ | |
2566 "movq %%mm2, %%mm5 \n\t" /* V0V1V2V3V4V5V6V7 */ | |
2567 "punpcklbw %%mm1, %%mm1 \n\t" /* U0U0 U1U1 U2U2 U3U3 */ | |
2568 "punpcklbw %%mm2, %%mm2 \n\t" /* V0V0 V1V1 V2V2 V3V3 */ | |
2569 "punpckhbw %%mm4, %%mm4 \n\t" /* U4U4 U5U5 U6U6 U7U7 */ | |
2570 "punpckhbw %%mm5, %%mm5 \n\t" /* V4V4 V5V5 V6V6 V7V7 */ | |
18861 | 2571 |
29480 | 2572 "movq %%mm1, %%mm6 \n\t" |
2573 "punpcklbw %%mm2, %%mm1 \n\t" /* U0V0 U0V0 U1V1 U1V1*/ | |
2574 "punpcklbw %%mm1, %%mm0 \n\t" /* Y0U0 Y1V0 Y2U0 Y3V0*/ | |
2575 "punpckhbw %%mm1, %%mm3 \n\t" /* Y4U1 Y5V1 Y6U1 Y7V1*/ | |
2576 MOVNTQ" %%mm0, (%4, %0, 8) \n\t" | |
2577 MOVNTQ" %%mm3, 8(%4, %0, 8) \n\t" | |
23129 | 2578 |
29480 | 2579 "punpckhbw %%mm2, %%mm6 \n\t" /* U2V2 U2V2 U3V3 U3V3*/ |
2580 "movq 8(%1, %0, 4), %%mm0 \n\t" | |
2581 "movq %%mm0, %%mm3 \n\t" | |
2582 "punpcklbw %%mm6, %%mm0 \n\t" /* Y U2 Y V2 Y U2 Y V2*/ | |
2583 "punpckhbw %%mm6, %%mm3 \n\t" /* Y U3 Y V3 Y U3 Y V3*/ | |
2584 MOVNTQ" %%mm0, 16(%4, %0, 8) \n\t" | |
2585 MOVNTQ" %%mm3, 24(%4, %0, 8) \n\t" | |
18861 | 2586 |
29480 | 2587 "movq %%mm4, %%mm6 \n\t" |
2588 "movq 16(%1, %0, 4), %%mm0 \n\t" | |
2589 "movq %%mm0, %%mm3 \n\t" | |
2590 "punpcklbw %%mm5, %%mm4 \n\t" | |
2591 "punpcklbw %%mm4, %%mm0 \n\t" /* Y U4 Y V4 Y U4 Y V4*/ | |
2592 "punpckhbw %%mm4, %%mm3 \n\t" /* Y U5 Y V5 Y U5 Y V5*/ | |
2593 MOVNTQ" %%mm0, 32(%4, %0, 8) \n\t" | |
2594 MOVNTQ" %%mm3, 40(%4, %0, 8) \n\t" | |
23129 | 2595 |
29480 | 2596 "punpckhbw %%mm5, %%mm6 \n\t" |
2597 "movq 24(%1, %0, 4), %%mm0 \n\t" | |
2598 "movq %%mm0, %%mm3 \n\t" | |
2599 "punpcklbw %%mm6, %%mm0 \n\t" /* Y U6 Y V6 Y U6 Y V6*/ | |
2600 "punpckhbw %%mm6, %%mm3 \n\t" /* Y U7 Y V7 Y U7 Y V7*/ | |
2601 MOVNTQ" %%mm0, 48(%4, %0, 8) \n\t" | |
2602 MOVNTQ" %%mm3, 56(%4, %0, 8) \n\t" | |
18861 | 2603 |
29480 | 2604 : "+r" (x) |
2605 : "r"(yp), "r" (up), "r"(vp), "r"(d) | |
2606 :"memory"); | |
2607 } | |
18861 | 2608 #endif |
29481 | 2609 for (; x<w; x++) { |
29480 | 2610 const long x2 = x<<2; |
2611 d[8*x+0] = yp[x2]; | |
2612 d[8*x+1] = up[x]; | |
2613 d[8*x+2] = yp[x2+1]; | |
2614 d[8*x+3] = vp[x]; | |
2615 d[8*x+4] = yp[x2+2]; | |
2616 d[8*x+5] = up[x]; | |
2617 d[8*x+6] = yp[x2+3]; | |
2618 d[8*x+7] = vp[x]; | |
2619 } | |
18861 | 2620 } |
28276 | 2621 #if HAVE_MMX |
27744 | 2622 __asm__( |
29480 | 2623 EMMS" \n\t" |
2624 SFENCE" \n\t" | |
2625 ::: "memory" | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2626 ); |
18861 | 2627 #endif |
2628 } | |
22960 | 2629 |
28962 | 2630 static void RENAME(extract_even)(const uint8_t *src, uint8_t *dst, x86_reg count) |
2631 { | |
2632 dst += count; | |
2633 src += 2*count; | |
2634 count= - count; | |
2635 | |
2636 #if HAVE_MMX | |
29481 | 2637 if(count <= -16) { |
28962 | 2638 count += 15; |
2639 __asm__ volatile( | |
2640 "pcmpeqw %%mm7, %%mm7 \n\t" | |
2641 "psrlw $8, %%mm7 \n\t" | |
2642 "1: \n\t" | |
2643 "movq -30(%1, %0, 2), %%mm0 \n\t" | |
2644 "movq -22(%1, %0, 2), %%mm1 \n\t" | |
2645 "movq -14(%1, %0, 2), %%mm2 \n\t" | |
2646 "movq -6(%1, %0, 2), %%mm3 \n\t" | |
2647 "pand %%mm7, %%mm0 \n\t" | |
2648 "pand %%mm7, %%mm1 \n\t" | |
2649 "pand %%mm7, %%mm2 \n\t" | |
2650 "pand %%mm7, %%mm3 \n\t" | |
2651 "packuswb %%mm1, %%mm0 \n\t" | |
2652 "packuswb %%mm3, %%mm2 \n\t" | |
2653 MOVNTQ" %%mm0,-15(%2, %0) \n\t" | |
2654 MOVNTQ" %%mm2,- 7(%2, %0) \n\t" | |
2655 "add $16, %0 \n\t" | |
2656 " js 1b \n\t" | |
2657 : "+r"(count) | |
2658 : "r"(src), "r"(dst) | |
2659 ); | |
2660 count -= 15; | |
2661 } | |
2662 #endif | |
29481 | 2663 while(count<0) { |
28962 | 2664 dst[count]= src[2*count]; |
2665 count++; | |
2666 } | |
2667 } | |
2668 | |
2669 static void RENAME(extract_even2)(const uint8_t *src, uint8_t *dst0, uint8_t *dst1, x86_reg count) | |
2670 { | |
2671 dst0+= count; | |
2672 dst1+= count; | |
2673 src += 4*count; | |
2674 count= - count; | |
2675 #if HAVE_MMX | |
29481 | 2676 if(count <= -8) { |
28962 | 2677 count += 7; |
2678 __asm__ volatile( | |
2679 "pcmpeqw %%mm7, %%mm7 \n\t" | |
2680 "psrlw $8, %%mm7 \n\t" | |
2681 "1: \n\t" | |
2682 "movq -28(%1, %0, 4), %%mm0 \n\t" | |
2683 "movq -20(%1, %0, 4), %%mm1 \n\t" | |
2684 "movq -12(%1, %0, 4), %%mm2 \n\t" | |
2685 "movq -4(%1, %0, 4), %%mm3 \n\t" | |
2686 "pand %%mm7, %%mm0 \n\t" | |
2687 "pand %%mm7, %%mm1 \n\t" | |
2688 "pand %%mm7, %%mm2 \n\t" | |
2689 "pand %%mm7, %%mm3 \n\t" | |
2690 "packuswb %%mm1, %%mm0 \n\t" | |
2691 "packuswb %%mm3, %%mm2 \n\t" | |
2692 "movq %%mm0, %%mm1 \n\t" | |
2693 "movq %%mm2, %%mm3 \n\t" | |
2694 "psrlw $8, %%mm0 \n\t" | |
2695 "psrlw $8, %%mm2 \n\t" | |
2696 "pand %%mm7, %%mm1 \n\t" | |
2697 "pand %%mm7, %%mm3 \n\t" | |
2698 "packuswb %%mm2, %%mm0 \n\t" | |
2699 "packuswb %%mm3, %%mm1 \n\t" | |
2700 MOVNTQ" %%mm0,- 7(%3, %0) \n\t" | |
2701 MOVNTQ" %%mm1,- 7(%2, %0) \n\t" | |
2702 "add $8, %0 \n\t" | |
2703 " js 1b \n\t" | |
2704 : "+r"(count) | |
2705 : "r"(src), "r"(dst0), "r"(dst1) | |
2706 ); | |
2707 count -= 7; | |
2708 } | |
2709 #endif | |
29481 | 2710 while(count<0) { |
28962 | 2711 dst0[count]= src[4*count+0]; |
2712 dst1[count]= src[4*count+2]; | |
2713 count++; | |
2714 } | |
2715 } | |
2716 | |
28994
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2717 static void RENAME(extract_even2avg)(const uint8_t *src0, const uint8_t *src1, uint8_t *dst0, uint8_t *dst1, x86_reg count) |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2718 { |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2719 dst0 += count; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2720 dst1 += count; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2721 src0 += 4*count; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2722 src1 += 4*count; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2723 count= - count; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2724 #ifdef PAVGB |
29481 | 2725 if(count <= -8) { |
28994
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2726 count += 7; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2727 __asm__ volatile( |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2728 "pcmpeqw %%mm7, %%mm7 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2729 "psrlw $8, %%mm7 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2730 "1: \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2731 "movq -28(%1, %0, 4), %%mm0 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2732 "movq -20(%1, %0, 4), %%mm1 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2733 "movq -12(%1, %0, 4), %%mm2 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2734 "movq -4(%1, %0, 4), %%mm3 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2735 PAVGB" -28(%2, %0, 4), %%mm0 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2736 PAVGB" -20(%2, %0, 4), %%mm1 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2737 PAVGB" -12(%2, %0, 4), %%mm2 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2738 PAVGB" - 4(%2, %0, 4), %%mm3 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2739 "pand %%mm7, %%mm0 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2740 "pand %%mm7, %%mm1 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2741 "pand %%mm7, %%mm2 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2742 "pand %%mm7, %%mm3 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2743 "packuswb %%mm1, %%mm0 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2744 "packuswb %%mm3, %%mm2 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2745 "movq %%mm0, %%mm1 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2746 "movq %%mm2, %%mm3 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2747 "psrlw $8, %%mm0 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2748 "psrlw $8, %%mm2 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2749 "pand %%mm7, %%mm1 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2750 "pand %%mm7, %%mm3 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2751 "packuswb %%mm2, %%mm0 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2752 "packuswb %%mm3, %%mm1 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2753 MOVNTQ" %%mm0,- 7(%4, %0) \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2754 MOVNTQ" %%mm1,- 7(%3, %0) \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2755 "add $8, %0 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2756 " js 1b \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2757 : "+r"(count) |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2758 : "r"(src0), "r"(src1), "r"(dst0), "r"(dst1) |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2759 ); |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2760 count -= 7; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2761 } |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2762 #endif |
29481 | 2763 while(count<0) { |
28995
d50adcfcf99c
10l: C code of extract_even2avg(), extract_odd2() and extract_odd2avg() was
michael
parents:
28994
diff
changeset
|
2764 dst0[count]= (src0[4*count+0]+src1[4*count+0])>>1; |
d50adcfcf99c
10l: C code of extract_even2avg(), extract_odd2() and extract_odd2avg() was
michael
parents:
28994
diff
changeset
|
2765 dst1[count]= (src0[4*count+2]+src1[4*count+2])>>1; |
28994
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2766 count++; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2767 } |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2768 } |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2769 |
28962 | 2770 static void RENAME(extract_odd2)(const uint8_t *src, uint8_t *dst0, uint8_t *dst1, x86_reg count) |
2771 { | |
2772 dst0+= count; | |
2773 dst1+= count; | |
2774 src += 4*count; | |
2775 count= - count; | |
2776 #if HAVE_MMX | |
29481 | 2777 if(count <= -8) { |
28962 | 2778 count += 7; |
2779 __asm__ volatile( | |
2780 "pcmpeqw %%mm7, %%mm7 \n\t" | |
2781 "psrlw $8, %%mm7 \n\t" | |
2782 "1: \n\t" | |
2783 "movq -28(%1, %0, 4), %%mm0 \n\t" | |
2784 "movq -20(%1, %0, 4), %%mm1 \n\t" | |
2785 "movq -12(%1, %0, 4), %%mm2 \n\t" | |
2786 "movq -4(%1, %0, 4), %%mm3 \n\t" | |
2787 "psrlw $8, %%mm0 \n\t" | |
2788 "psrlw $8, %%mm1 \n\t" | |
2789 "psrlw $8, %%mm2 \n\t" | |
2790 "psrlw $8, %%mm3 \n\t" | |
2791 "packuswb %%mm1, %%mm0 \n\t" | |
2792 "packuswb %%mm3, %%mm2 \n\t" | |
2793 "movq %%mm0, %%mm1 \n\t" | |
2794 "movq %%mm2, %%mm3 \n\t" | |
2795 "psrlw $8, %%mm0 \n\t" | |
2796 "psrlw $8, %%mm2 \n\t" | |
2797 "pand %%mm7, %%mm1 \n\t" | |
2798 "pand %%mm7, %%mm3 \n\t" | |
2799 "packuswb %%mm2, %%mm0 \n\t" | |
2800 "packuswb %%mm3, %%mm1 \n\t" | |
2801 MOVNTQ" %%mm0,- 7(%3, %0) \n\t" | |
2802 MOVNTQ" %%mm1,- 7(%2, %0) \n\t" | |
2803 "add $8, %0 \n\t" | |
2804 " js 1b \n\t" | |
2805 : "+r"(count) | |
2806 : "r"(src), "r"(dst0), "r"(dst1) | |
2807 ); | |
2808 count -= 7; | |
2809 } | |
2810 #endif | |
28995
d50adcfcf99c
10l: C code of extract_even2avg(), extract_odd2() and extract_odd2avg() was
michael
parents:
28994
diff
changeset
|
2811 src++; |
29481 | 2812 while(count<0) { |
28962 | 2813 dst0[count]= src[4*count+0]; |
2814 dst1[count]= src[4*count+2]; | |
2815 count++; | |
2816 } | |
2817 } | |
2818 | |
28994
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2819 static void RENAME(extract_odd2avg)(const uint8_t *src0, const uint8_t *src1, uint8_t *dst0, uint8_t *dst1, x86_reg count) |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2820 { |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2821 dst0 += count; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2822 dst1 += count; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2823 src0 += 4*count; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2824 src1 += 4*count; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2825 count= - count; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2826 #ifdef PAVGB |
29481 | 2827 if(count <= -8) { |
28994
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2828 count += 7; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2829 __asm__ volatile( |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2830 "pcmpeqw %%mm7, %%mm7 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2831 "psrlw $8, %%mm7 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2832 "1: \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2833 "movq -28(%1, %0, 4), %%mm0 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2834 "movq -20(%1, %0, 4), %%mm1 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2835 "movq -12(%1, %0, 4), %%mm2 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2836 "movq -4(%1, %0, 4), %%mm3 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2837 PAVGB" -28(%2, %0, 4), %%mm0 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2838 PAVGB" -20(%2, %0, 4), %%mm1 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2839 PAVGB" -12(%2, %0, 4), %%mm2 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2840 PAVGB" - 4(%2, %0, 4), %%mm3 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2841 "psrlw $8, %%mm0 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2842 "psrlw $8, %%mm1 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2843 "psrlw $8, %%mm2 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2844 "psrlw $8, %%mm3 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2845 "packuswb %%mm1, %%mm0 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2846 "packuswb %%mm3, %%mm2 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2847 "movq %%mm0, %%mm1 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2848 "movq %%mm2, %%mm3 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2849 "psrlw $8, %%mm0 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2850 "psrlw $8, %%mm2 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2851 "pand %%mm7, %%mm1 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2852 "pand %%mm7, %%mm3 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2853 "packuswb %%mm2, %%mm0 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2854 "packuswb %%mm3, %%mm1 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2855 MOVNTQ" %%mm0,- 7(%4, %0) \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2856 MOVNTQ" %%mm1,- 7(%3, %0) \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2857 "add $8, %0 \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2858 " js 1b \n\t" |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2859 : "+r"(count) |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2860 : "r"(src0), "r"(src1), "r"(dst0), "r"(dst1) |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2861 ); |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2862 count -= 7; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2863 } |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2864 #endif |
28995
d50adcfcf99c
10l: C code of extract_even2avg(), extract_odd2() and extract_odd2avg() was
michael
parents:
28994
diff
changeset
|
2865 src0++; |
d50adcfcf99c
10l: C code of extract_even2avg(), extract_odd2() and extract_odd2avg() was
michael
parents:
28994
diff
changeset
|
2866 src1++; |
29481 | 2867 while(count<0) { |
28995
d50adcfcf99c
10l: C code of extract_even2avg(), extract_odd2() and extract_odd2avg() was
michael
parents:
28994
diff
changeset
|
2868 dst0[count]= (src0[4*count+0]+src1[4*count+0])>>1; |
d50adcfcf99c
10l: C code of extract_even2avg(), extract_odd2() and extract_odd2avg() was
michael
parents:
28994
diff
changeset
|
2869 dst1[count]= (src0[4*count+2]+src1[4*count+2])>>1; |
28994
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2870 count++; |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2871 } |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2872 } |
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2873 |
28962 | 2874 static void RENAME(yuyvtoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, |
2875 long width, long height, | |
2876 long lumStride, long chromStride, long srcStride) | |
2877 { | |
2878 long y; | |
2879 const long chromWidth= -((-width)>>1); | |
2880 | |
29481 | 2881 for (y=0; y<height; y++) { |
28962 | 2882 RENAME(extract_even)(src, ydst, width); |
29481 | 2883 if(y&1) { |
28994
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2884 RENAME(extract_odd2avg)(src-srcStride, src, udst, vdst, chromWidth); |
28962 | 2885 udst+= chromStride; |
2886 vdst+= chromStride; | |
2887 } | |
2888 | |
2889 src += srcStride; | |
2890 ydst+= lumStride; | |
2891 } | |
2892 #if HAVE_MMX | |
2893 __asm__( | |
29480 | 2894 EMMS" \n\t" |
2895 SFENCE" \n\t" | |
2896 ::: "memory" | |
28962 | 2897 ); |
2898 #endif | |
2899 } | |
2900 | |
2901 static void RENAME(yuyvtoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, | |
2902 long width, long height, | |
2903 long lumStride, long chromStride, long srcStride) | |
2904 { | |
2905 long y; | |
2906 const long chromWidth= -((-width)>>1); | |
2907 | |
29481 | 2908 for (y=0; y<height; y++) { |
28962 | 2909 RENAME(extract_even)(src, ydst, width); |
2910 RENAME(extract_odd2)(src, udst, vdst, chromWidth); | |
2911 | |
2912 src += srcStride; | |
2913 ydst+= lumStride; | |
2914 udst+= chromStride; | |
2915 vdst+= chromStride; | |
2916 } | |
2917 #if HAVE_MMX | |
2918 __asm__( | |
29480 | 2919 EMMS" \n\t" |
2920 SFENCE" \n\t" | |
2921 ::: "memory" | |
28962 | 2922 ); |
2923 #endif | |
2924 } | |
2925 | |
2926 static void RENAME(uyvytoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, | |
2927 long width, long height, | |
2928 long lumStride, long chromStride, long srcStride) | |
2929 { | |
2930 long y; | |
2931 const long chromWidth= -((-width)>>1); | |
2932 | |
29481 | 2933 for (y=0; y<height; y++) { |
28962 | 2934 RENAME(extract_even)(src+1, ydst, width); |
29481 | 2935 if(y&1) { |
28994
a03804d10dbf
Average chroma of 2 lines in packed 422 -> planar 420.
michael
parents:
28968
diff
changeset
|
2936 RENAME(extract_even2avg)(src-srcStride, src, udst, vdst, chromWidth); |
28962 | 2937 udst+= chromStride; |
2938 vdst+= chromStride; | |
2939 } | |
2940 | |
2941 src += srcStride; | |
2942 ydst+= lumStride; | |
2943 } | |
2944 #if HAVE_MMX | |
2945 __asm__( | |
29480 | 2946 EMMS" \n\t" |
2947 SFENCE" \n\t" | |
2948 ::: "memory" | |
28962 | 2949 ); |
2950 #endif | |
2951 } | |
2952 | |
2953 static void RENAME(uyvytoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, | |
2954 long width, long height, | |
2955 long lumStride, long chromStride, long srcStride) | |
2956 { | |
2957 long y; | |
2958 const long chromWidth= -((-width)>>1); | |
2959 | |
29481 | 2960 for (y=0; y<height; y++) { |
28962 | 2961 RENAME(extract_even)(src+1, ydst, width); |
2962 RENAME(extract_even2)(src, udst, vdst, chromWidth); | |
2963 | |
2964 src += srcStride; | |
2965 ydst+= lumStride; | |
2966 udst+= chromStride; | |
2967 vdst+= chromStride; | |
2968 } | |
2969 #if HAVE_MMX | |
2970 __asm__( | |
29480 | 2971 EMMS" \n\t" |
2972 SFENCE" \n\t" | |
2973 ::: "memory" | |
28962 | 2974 ); |
2975 #endif | |
2976 } | |
2977 | |
29481 | 2978 static inline void RENAME(rgb2rgb_init)(void) |
2979 { | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2980 rgb15to16 = RENAME(rgb15to16); |
27486 | 2981 rgb15tobgr24 = RENAME(rgb15tobgr24); |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2982 rgb15to32 = RENAME(rgb15to32); |
27486 | 2983 rgb16tobgr24 = RENAME(rgb16tobgr24); |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2984 rgb16to32 = RENAME(rgb16to32); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2985 rgb16to15 = RENAME(rgb16to15); |
27486 | 2986 rgb24tobgr16 = RENAME(rgb24tobgr16); |
2987 rgb24tobgr15 = RENAME(rgb24tobgr15); | |
2988 rgb24tobgr32 = RENAME(rgb24tobgr32); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2989 rgb32to16 = RENAME(rgb32to16); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2990 rgb32to15 = RENAME(rgb32to15); |
27486 | 2991 rgb32tobgr24 = RENAME(rgb32tobgr24); |
2992 rgb24to15 = RENAME(rgb24to15); | |
2993 rgb24to16 = RENAME(rgb24to16); | |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2994 rgb24tobgr24 = RENAME(rgb24tobgr24); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2995 rgb32tobgr32 = RENAME(rgb32tobgr32); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2996 rgb32tobgr16 = RENAME(rgb32tobgr16); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2997 rgb32tobgr15 = RENAME(rgb32tobgr15); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2998 yv12toyuy2 = RENAME(yv12toyuy2); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
2999 yv12touyvy = RENAME(yv12touyvy); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
3000 yuv422ptoyuy2 = RENAME(yuv422ptoyuy2); |
27495 | 3001 yuv422ptouyvy = RENAME(yuv422ptouyvy); |
23140
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
3002 yuy2toyv12 = RENAME(yuy2toyv12); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
3003 // yvu9toyv12 = RENAME(yvu9toyv12); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
3004 planar2x = RENAME(planar2x); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
3005 rgb24toyv12 = RENAME(rgb24toyv12); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
3006 interleaveBytes = RENAME(interleaveBytes); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
3007 vu9_to_vu12 = RENAME(vu9_to_vu12); |
4d3870361b73
cosmetics attack, part I: Remove all tabs and prettyprint/reindent the code.
diego
parents:
23139
diff
changeset
|
3008 yvu9_to_yuy2 = RENAME(yvu9_to_yuy2); |
28962 | 3009 |
3010 uyvytoyuv420 = RENAME(uyvytoyuv420); | |
3011 uyvytoyuv422 = RENAME(uyvytoyuv422); | |
3012 yuyvtoyuv420 = RENAME(yuyvtoyuv420); | |
3013 yuyvtoyuv422 = RENAME(yuyvtoyuv422); | |
22960 | 3014 } |