Mercurial > mplayer.hg
annotate libswscale/rgb2rgb_template.c @ 29794:df1826dcdb2d
Disable audio when initializing the filter chain fails (can happen e.g. when the hwmpa
decoder is used but the hardware does not support hardware MPEG audio).
Otherwise this will lead to a crash later on when the decode code tries to access
the audio filter chain.
author | reimar |
---|---|
date | Fri, 06 Nov 2009 15:56:30 +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 } |