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