Mercurial > mplayer.hg
annotate libswscale/rgb2rgb_template.c @ 32282:606e4157cd4c
Split alloc and init of context so that parameters can be set in the context
instead of requireing being passed through function parameters. This also
makes sws work with AVOptions.
author | michael |
---|---|
date | Sun, 26 Sep 2010 19:33:57 +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 } |