Line data Source code
1 : // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 : // Use of this source code is governed by a BSD-style license that can be
3 : // found in the LICENSE file.
4 :
5 : #include "yuv_row.h"
6 : #include "mozilla/SSE.h"
7 :
8 : #define DCHECK(a)
9 :
10 : extern "C" {
11 :
12 : #if defined(ARCH_CPU_X86_64)
13 :
14 : // We don't need CPUID guards here, since x86-64 implies SSE2.
15 :
16 : // AMD64 ABI uses register paremters.
17 0 : void FastConvertYUVToRGB32Row(const uint8* y_buf, // rdi
18 : const uint8* u_buf, // rsi
19 : const uint8* v_buf, // rdx
20 : uint8* rgb_buf, // rcx
21 : int width) { // r8
22 : asm(
23 : "jmp 1f\n"
24 : "0:"
25 : "movzb (%1),%%r10\n"
26 : "add $0x1,%1\n"
27 : "movzb (%2),%%r11\n"
28 : "add $0x1,%2\n"
29 : "movq 2048(%5,%%r10,8),%%xmm0\n"
30 : "movzb (%0),%%r10\n"
31 : "movq 4096(%5,%%r11,8),%%xmm1\n"
32 : "movzb 0x1(%0),%%r11\n"
33 : "paddsw %%xmm1,%%xmm0\n"
34 : "movq (%5,%%r10,8),%%xmm2\n"
35 : "add $0x2,%0\n"
36 : "movq (%5,%%r11,8),%%xmm3\n"
37 : "paddsw %%xmm0,%%xmm2\n"
38 : "paddsw %%xmm0,%%xmm3\n"
39 : "shufps $0x44,%%xmm3,%%xmm2\n"
40 : "psraw $0x6,%%xmm2\n"
41 : "packuswb %%xmm2,%%xmm2\n"
42 : "movq %%xmm2,0x0(%3)\n"
43 : "add $0x8,%3\n"
44 : "1:"
45 : "sub $0x2,%4\n"
46 : "jns 0b\n"
47 :
48 : "2:"
49 : "add $0x1,%4\n"
50 : "js 3f\n"
51 :
52 : "movzb (%1),%%r10\n"
53 : "movq 2048(%5,%%r10,8),%%xmm0\n"
54 : "movzb (%2),%%r10\n"
55 : "movq 4096(%5,%%r10,8),%%xmm1\n"
56 : "paddsw %%xmm1,%%xmm0\n"
57 : "movzb (%0),%%r10\n"
58 : "movq (%5,%%r10,8),%%xmm1\n"
59 : "paddsw %%xmm0,%%xmm1\n"
60 : "psraw $0x6,%%xmm1\n"
61 : "packuswb %%xmm1,%%xmm1\n"
62 : "movd %%xmm1,0x0(%3)\n"
63 : "3:"
64 : :
65 : : "r"(y_buf), // %0
66 : "r"(u_buf), // %1
67 : "r"(v_buf), // %2
68 : "r"(rgb_buf), // %3
69 : "r"(width), // %4
70 : "r" (kCoefficientsRgbY) // %5
71 : : "memory", "r10", "r11", "xmm0", "xmm1", "xmm2", "xmm3"
72 0 : );
73 0 : }
74 :
75 0 : void ScaleYUVToRGB32Row(const uint8* y_buf, // rdi
76 : const uint8* u_buf, // rsi
77 : const uint8* v_buf, // rdx
78 : uint8* rgb_buf, // rcx
79 : int width, // r8
80 : int source_dx) { // r9
81 : asm(
82 : "xor %%r11,%%r11\n"
83 : "sub $0x2,%4\n"
84 : "js 1f\n"
85 :
86 : "0:"
87 : "mov %%r11,%%r10\n"
88 : "sar $0x11,%%r10\n"
89 : "movzb (%1,%%r10,1),%%rax\n"
90 : "movq 2048(%5,%%rax,8),%%xmm0\n"
91 : "movzb (%2,%%r10,1),%%rax\n"
92 : "movq 4096(%5,%%rax,8),%%xmm1\n"
93 : "lea (%%r11,%6),%%r10\n"
94 : "sar $0x10,%%r11\n"
95 : "movzb (%0,%%r11,1),%%rax\n"
96 : "paddsw %%xmm1,%%xmm0\n"
97 : "movq (%5,%%rax,8),%%xmm1\n"
98 : "lea (%%r10,%6),%%r11\n"
99 : "sar $0x10,%%r10\n"
100 : "movzb (%0,%%r10,1),%%rax\n"
101 : "movq (%5,%%rax,8),%%xmm2\n"
102 : "paddsw %%xmm0,%%xmm1\n"
103 : "paddsw %%xmm0,%%xmm2\n"
104 : "shufps $0x44,%%xmm2,%%xmm1\n"
105 : "psraw $0x6,%%xmm1\n"
106 : "packuswb %%xmm1,%%xmm1\n"
107 : "movq %%xmm1,0x0(%3)\n"
108 : "add $0x8,%3\n"
109 : "sub $0x2,%4\n"
110 : "jns 0b\n"
111 :
112 : "1:"
113 : "add $0x1,%4\n"
114 : "js 2f\n"
115 :
116 : "mov %%r11,%%r10\n"
117 : "sar $0x11,%%r10\n"
118 : "movzb (%1,%%r10,1),%%rax\n"
119 : "movq 2048(%5,%%rax,8),%%xmm0\n"
120 : "movzb (%2,%%r10,1),%%rax\n"
121 : "movq 4096(%5,%%rax,8),%%xmm1\n"
122 : "paddsw %%xmm1,%%xmm0\n"
123 : "sar $0x10,%%r11\n"
124 : "movzb (%0,%%r11,1),%%rax\n"
125 : "movq (%5,%%rax,8),%%xmm1\n"
126 : "paddsw %%xmm0,%%xmm1\n"
127 : "psraw $0x6,%%xmm1\n"
128 : "packuswb %%xmm1,%%xmm1\n"
129 : "movd %%xmm1,0x0(%3)\n"
130 :
131 : "2:"
132 : :
133 : : "r"(y_buf), // %0
134 : "r"(u_buf), // %1
135 : "r"(v_buf), // %2
136 : "r"(rgb_buf), // %3
137 : "r"(width), // %4
138 : "r" (kCoefficientsRgbY), // %5
139 0 : "r"(static_cast<long>(source_dx)) // %6
140 : : "memory", "r10", "r11", "rax", "xmm0", "xmm1", "xmm2"
141 0 : );
142 0 : }
143 :
144 0 : void LinearScaleYUVToRGB32Row(const uint8* y_buf,
145 : const uint8* u_buf,
146 : const uint8* v_buf,
147 : uint8* rgb_buf,
148 : int width,
149 : int source_dx) {
150 : asm(
151 : "xor %%r11,%%r11\n" // x = 0
152 : "sub $0x2,%4\n"
153 : "js 2f\n"
154 : "cmp $0x20000,%6\n" // if source_dx >= 2.0
155 : "jl 0f\n"
156 : "mov $0x8000,%%r11\n" // x = 0.5 for 1/2 or less
157 : "0:"
158 :
159 : "1:"
160 : "mov %%r11,%%r10\n"
161 : "sar $0x11,%%r10\n"
162 :
163 : "movzb (%1, %%r10, 1), %%r13 \n"
164 : "movzb 1(%1, %%r10, 1), %%r14 \n"
165 : "mov %%r11, %%rax \n"
166 : "and $0x1fffe, %%rax \n"
167 : "imul %%rax, %%r14 \n"
168 : "xor $0x1fffe, %%rax \n"
169 : "imul %%rax, %%r13 \n"
170 : "add %%r14, %%r13 \n"
171 : "shr $17, %%r13 \n"
172 : "movq 2048(%5,%%r13,8), %%xmm0\n"
173 :
174 : "movzb (%2, %%r10, 1), %%r13 \n"
175 : "movzb 1(%2, %%r10, 1), %%r14 \n"
176 : "mov %%r11, %%rax \n"
177 : "and $0x1fffe, %%rax \n"
178 : "imul %%rax, %%r14 \n"
179 : "xor $0x1fffe, %%rax \n"
180 : "imul %%rax, %%r13 \n"
181 : "add %%r14, %%r13 \n"
182 : "shr $17, %%r13 \n"
183 : "movq 4096(%5,%%r13,8), %%xmm1\n"
184 :
185 : "mov %%r11, %%rax \n"
186 : "lea (%%r11,%6),%%r10\n"
187 : "sar $0x10,%%r11\n"
188 : "paddsw %%xmm1,%%xmm0\n"
189 :
190 : "movzb (%0, %%r11, 1), %%r13 \n"
191 : "movzb 1(%0, %%r11, 1), %%r14 \n"
192 : "and $0xffff, %%rax \n"
193 : "imul %%rax, %%r14 \n"
194 : "xor $0xffff, %%rax \n"
195 : "imul %%rax, %%r13 \n"
196 : "add %%r14, %%r13 \n"
197 : "shr $16, %%r13 \n"
198 : "movq (%5,%%r13,8),%%xmm1\n"
199 :
200 : "mov %%r10, %%rax \n"
201 : "lea (%%r10,%6),%%r11\n"
202 : "sar $0x10,%%r10\n"
203 :
204 : "movzb (%0,%%r10,1), %%r13 \n"
205 : "movzb 1(%0,%%r10,1), %%r14 \n"
206 : "and $0xffff, %%rax \n"
207 : "imul %%rax, %%r14 \n"
208 : "xor $0xffff, %%rax \n"
209 : "imul %%rax, %%r13 \n"
210 : "add %%r14, %%r13 \n"
211 : "shr $16, %%r13 \n"
212 : "movq (%5,%%r13,8),%%xmm2\n"
213 :
214 : "paddsw %%xmm0,%%xmm1\n"
215 : "paddsw %%xmm0,%%xmm2\n"
216 : "shufps $0x44,%%xmm2,%%xmm1\n"
217 : "psraw $0x6,%%xmm1\n"
218 : "packuswb %%xmm1,%%xmm1\n"
219 : "movq %%xmm1,0x0(%3)\n"
220 : "add $0x8,%3\n"
221 : "sub $0x2,%4\n"
222 : "jns 1b\n"
223 :
224 : "2:"
225 : "add $0x1,%4\n"
226 : "js 3f\n"
227 :
228 : "mov %%r11,%%r10\n"
229 : "sar $0x11,%%r10\n"
230 :
231 : "movzb (%1,%%r10,1), %%r13 \n"
232 : "movq 2048(%5,%%r13,8),%%xmm0\n"
233 :
234 : "movzb (%2,%%r10,1), %%r13 \n"
235 : "movq 4096(%5,%%r13,8),%%xmm1\n"
236 :
237 : "paddsw %%xmm1,%%xmm0\n"
238 : "sar $0x10,%%r11\n"
239 :
240 : "movzb (%0,%%r11,1), %%r13 \n"
241 : "movq (%5,%%r13,8),%%xmm1\n"
242 :
243 : "paddsw %%xmm0,%%xmm1\n"
244 : "psraw $0x6,%%xmm1\n"
245 : "packuswb %%xmm1,%%xmm1\n"
246 : "movd %%xmm1,0x0(%3)\n"
247 :
248 : "3:"
249 : :
250 : : "r"(y_buf), // %0
251 : "r"(u_buf), // %1
252 : "r"(v_buf), // %2
253 : "r"(rgb_buf), // %3
254 : "r"(width), // %4
255 : "r" (kCoefficientsRgbY), // %5
256 0 : "r"(static_cast<long>(source_dx)) // %6
257 : : "memory", "r10", "r11", "r13", "r14", "rax", "xmm0", "xmm1", "xmm2"
258 0 : );
259 0 : }
260 :
261 : #elif defined(MOZILLA_MAY_SUPPORT_SSE) && defined(ARCH_CPU_X86_32) && !defined(__PIC__)
262 :
263 : // PIC version is slower because less registers are available, so
264 : // non-PIC is used on platforms where it is possible.
265 : void FastConvertYUVToRGB32Row_SSE(const uint8* y_buf,
266 : const uint8* u_buf,
267 : const uint8* v_buf,
268 : uint8* rgb_buf,
269 : int width);
270 : asm(
271 : ".text\n"
272 : ".global FastConvertYUVToRGB32Row_SSE\n"
273 : ".type FastConvertYUVToRGB32Row_SSE, @function\n"
274 : "FastConvertYUVToRGB32Row_SSE:\n"
275 : "pusha\n"
276 : "mov 0x24(%esp),%edx\n"
277 : "mov 0x28(%esp),%edi\n"
278 : "mov 0x2c(%esp),%esi\n"
279 : "mov 0x30(%esp),%ebp\n"
280 : "mov 0x34(%esp),%ecx\n"
281 : "jmp 1f\n"
282 :
283 : "0:"
284 : "movzbl (%edi),%eax\n"
285 : "add $0x1,%edi\n"
286 : "movzbl (%esi),%ebx\n"
287 : "add $0x1,%esi\n"
288 : "movq kCoefficientsRgbY+2048(,%eax,8),%mm0\n"
289 : "movzbl (%edx),%eax\n"
290 : "paddsw kCoefficientsRgbY+4096(,%ebx,8),%mm0\n"
291 : "movzbl 0x1(%edx),%ebx\n"
292 : "movq kCoefficientsRgbY(,%eax,8),%mm1\n"
293 : "add $0x2,%edx\n"
294 : "movq kCoefficientsRgbY(,%ebx,8),%mm2\n"
295 : "paddsw %mm0,%mm1\n"
296 : "paddsw %mm0,%mm2\n"
297 : "psraw $0x6,%mm1\n"
298 : "psraw $0x6,%mm2\n"
299 : "packuswb %mm2,%mm1\n"
300 : "movntq %mm1,0x0(%ebp)\n"
301 : "add $0x8,%ebp\n"
302 : "1:"
303 : "sub $0x2,%ecx\n"
304 : "jns 0b\n"
305 :
306 : "and $0x1,%ecx\n"
307 : "je 2f\n"
308 :
309 : "movzbl (%edi),%eax\n"
310 : "movq kCoefficientsRgbY+2048(,%eax,8),%mm0\n"
311 : "movzbl (%esi),%eax\n"
312 : "paddsw kCoefficientsRgbY+4096(,%eax,8),%mm0\n"
313 : "movzbl (%edx),%eax\n"
314 : "movq kCoefficientsRgbY(,%eax,8),%mm1\n"
315 : "paddsw %mm0,%mm1\n"
316 : "psraw $0x6,%mm1\n"
317 : "packuswb %mm1,%mm1\n"
318 : "movd %mm1,0x0(%ebp)\n"
319 : "2:"
320 : "popa\n"
321 : "ret\n"
322 : #if !defined(XP_MACOSX)
323 : ".previous\n"
324 : #endif
325 : );
326 :
327 : void FastConvertYUVToRGB32Row(const uint8* y_buf,
328 : const uint8* u_buf,
329 : const uint8* v_buf,
330 : uint8* rgb_buf,
331 : int width)
332 : {
333 : if (mozilla::supports_sse()) {
334 : FastConvertYUVToRGB32Row_SSE(y_buf, u_buf, v_buf, rgb_buf, width);
335 : return;
336 : }
337 :
338 : FastConvertYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf, width, 1);
339 : }
340 :
341 :
342 : void ScaleYUVToRGB32Row_SSE(const uint8* y_buf,
343 : const uint8* u_buf,
344 : const uint8* v_buf,
345 : uint8* rgb_buf,
346 : int width,
347 : int source_dx);
348 : asm(
349 : ".text\n"
350 : ".global ScaleYUVToRGB32Row_SSE\n"
351 : ".type ScaleYUVToRGB32Row_SSE, @function\n"
352 : "ScaleYUVToRGB32Row_SSE:\n"
353 : "pusha\n"
354 : "mov 0x24(%esp),%edx\n"
355 : "mov 0x28(%esp),%edi\n"
356 : "mov 0x2c(%esp),%esi\n"
357 : "mov 0x30(%esp),%ebp\n"
358 : "mov 0x34(%esp),%ecx\n"
359 : "xor %ebx,%ebx\n"
360 : "jmp 1f\n"
361 :
362 : "0:"
363 : "mov %ebx,%eax\n"
364 : "sar $0x11,%eax\n"
365 : "movzbl (%edi,%eax,1),%eax\n"
366 : "movq kCoefficientsRgbY+2048(,%eax,8),%mm0\n"
367 : "mov %ebx,%eax\n"
368 : "sar $0x11,%eax\n"
369 : "movzbl (%esi,%eax,1),%eax\n"
370 : "paddsw kCoefficientsRgbY+4096(,%eax,8),%mm0\n"
371 : "mov %ebx,%eax\n"
372 : "add 0x38(%esp),%ebx\n"
373 : "sar $0x10,%eax\n"
374 : "movzbl (%edx,%eax,1),%eax\n"
375 : "movq kCoefficientsRgbY(,%eax,8),%mm1\n"
376 : "mov %ebx,%eax\n"
377 : "add 0x38(%esp),%ebx\n"
378 : "sar $0x10,%eax\n"
379 : "movzbl (%edx,%eax,1),%eax\n"
380 : "movq kCoefficientsRgbY(,%eax,8),%mm2\n"
381 : "paddsw %mm0,%mm1\n"
382 : "paddsw %mm0,%mm2\n"
383 : "psraw $0x6,%mm1\n"
384 : "psraw $0x6,%mm2\n"
385 : "packuswb %mm2,%mm1\n"
386 : "movntq %mm1,0x0(%ebp)\n"
387 : "add $0x8,%ebp\n"
388 : "1:"
389 : "sub $0x2,%ecx\n"
390 : "jns 0b\n"
391 :
392 : "and $0x1,%ecx\n"
393 : "je 2f\n"
394 :
395 : "mov %ebx,%eax\n"
396 : "sar $0x11,%eax\n"
397 : "movzbl (%edi,%eax,1),%eax\n"
398 : "movq kCoefficientsRgbY+2048(,%eax,8),%mm0\n"
399 : "mov %ebx,%eax\n"
400 : "sar $0x11,%eax\n"
401 : "movzbl (%esi,%eax,1),%eax\n"
402 : "paddsw kCoefficientsRgbY+4096(,%eax,8),%mm0\n"
403 : "mov %ebx,%eax\n"
404 : "sar $0x10,%eax\n"
405 : "movzbl (%edx,%eax,1),%eax\n"
406 : "movq kCoefficientsRgbY(,%eax,8),%mm1\n"
407 : "paddsw %mm0,%mm1\n"
408 : "psraw $0x6,%mm1\n"
409 : "packuswb %mm1,%mm1\n"
410 : "movd %mm1,0x0(%ebp)\n"
411 :
412 : "2:"
413 : "popa\n"
414 : "ret\n"
415 : #if !defined(XP_MACOSX)
416 : ".previous\n"
417 : #endif
418 : );
419 :
420 : void ScaleYUVToRGB32Row(const uint8* y_buf,
421 : const uint8* u_buf,
422 : const uint8* v_buf,
423 : uint8* rgb_buf,
424 : int width,
425 : int source_dx)
426 : {
427 : if (mozilla::supports_sse()) {
428 : ScaleYUVToRGB32Row_SSE(y_buf, u_buf, v_buf, rgb_buf,
429 : width, source_dx);
430 : return;
431 : }
432 :
433 : ScaleYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf,
434 : width, source_dx);
435 : }
436 :
437 : void LinearScaleYUVToRGB32Row_SSE(const uint8* y_buf,
438 : const uint8* u_buf,
439 : const uint8* v_buf,
440 : uint8* rgb_buf,
441 : int width,
442 : int source_dx);
443 : asm(
444 : ".text\n"
445 : ".global LinearScaleYUVToRGB32Row_SSE\n"
446 : ".type LinearScaleYUVToRGB32Row_SSE, @function\n"
447 : "LinearScaleYUVToRGB32Row_SSE:\n"
448 : "pusha\n"
449 : "mov 0x24(%esp),%edx\n"
450 : "mov 0x28(%esp),%edi\n"
451 : "mov 0x30(%esp),%ebp\n"
452 :
453 : // source_width = width * source_dx + ebx
454 : "mov 0x34(%esp), %ecx\n"
455 : "imull 0x38(%esp), %ecx\n"
456 : "mov %ecx, 0x34(%esp)\n"
457 :
458 : "mov 0x38(%esp), %ecx\n"
459 : "xor %ebx,%ebx\n" // x = 0
460 : "cmp $0x20000,%ecx\n" // if source_dx >= 2.0
461 : "jl 1f\n"
462 : "mov $0x8000,%ebx\n" // x = 0.5 for 1/2 or less
463 : "jmp 1f\n"
464 :
465 : "0:"
466 : "mov %ebx,%eax\n"
467 : "sar $0x11,%eax\n"
468 :
469 : "movzbl (%edi,%eax,1),%ecx\n"
470 : "movzbl 1(%edi,%eax,1),%esi\n"
471 : "mov %ebx,%eax\n"
472 : "andl $0x1fffe, %eax \n"
473 : "imul %eax, %esi \n"
474 : "xorl $0x1fffe, %eax \n"
475 : "imul %eax, %ecx \n"
476 : "addl %esi, %ecx \n"
477 : "shrl $17, %ecx \n"
478 : "movq kCoefficientsRgbY+2048(,%ecx,8),%mm0\n"
479 :
480 : "mov 0x2c(%esp),%esi\n"
481 : "mov %ebx,%eax\n"
482 : "sar $0x11,%eax\n"
483 :
484 : "movzbl (%esi,%eax,1),%ecx\n"
485 : "movzbl 1(%esi,%eax,1),%esi\n"
486 : "mov %ebx,%eax\n"
487 : "andl $0x1fffe, %eax \n"
488 : "imul %eax, %esi \n"
489 : "xorl $0x1fffe, %eax \n"
490 : "imul %eax, %ecx \n"
491 : "addl %esi, %ecx \n"
492 : "shrl $17, %ecx \n"
493 : "paddsw kCoefficientsRgbY+4096(,%ecx,8),%mm0\n"
494 :
495 : "mov %ebx,%eax\n"
496 : "sar $0x10,%eax\n"
497 : "movzbl (%edx,%eax,1),%ecx\n"
498 : "movzbl 1(%edx,%eax,1),%esi\n"
499 : "mov %ebx,%eax\n"
500 : "add 0x38(%esp),%ebx\n"
501 : "andl $0xffff, %eax \n"
502 : "imul %eax, %esi \n"
503 : "xorl $0xffff, %eax \n"
504 : "imul %eax, %ecx \n"
505 : "addl %esi, %ecx \n"
506 : "shrl $16, %ecx \n"
507 : "movq kCoefficientsRgbY(,%ecx,8),%mm1\n"
508 :
509 : "cmp 0x34(%esp), %ebx\n"
510 : "jge 2f\n"
511 :
512 : "mov %ebx,%eax\n"
513 : "sar $0x10,%eax\n"
514 : "movzbl (%edx,%eax,1),%ecx\n"
515 : "movzbl 1(%edx,%eax,1),%esi\n"
516 : "mov %ebx,%eax\n"
517 : "add 0x38(%esp),%ebx\n"
518 : "andl $0xffff, %eax \n"
519 : "imul %eax, %esi \n"
520 : "xorl $0xffff, %eax \n"
521 : "imul %eax, %ecx \n"
522 : "addl %esi, %ecx \n"
523 : "shrl $16, %ecx \n"
524 : "movq kCoefficientsRgbY(,%ecx,8),%mm2\n"
525 :
526 : "paddsw %mm0,%mm1\n"
527 : "paddsw %mm0,%mm2\n"
528 : "psraw $0x6,%mm1\n"
529 : "psraw $0x6,%mm2\n"
530 : "packuswb %mm2,%mm1\n"
531 : "movntq %mm1,0x0(%ebp)\n"
532 : "add $0x8,%ebp\n"
533 :
534 : "1:"
535 : "cmp 0x34(%esp), %ebx\n"
536 : "jl 0b\n"
537 : "popa\n"
538 : "ret\n"
539 :
540 : "2:"
541 : "paddsw %mm0, %mm1\n"
542 : "psraw $6, %mm1\n"
543 : "packuswb %mm1, %mm1\n"
544 : "movd %mm1, (%ebp)\n"
545 : "popa\n"
546 : "ret\n"
547 : #if !defined(XP_MACOSX)
548 : ".previous\n"
549 : #endif
550 : );
551 :
552 : void LinearScaleYUVToRGB32Row(const uint8* y_buf,
553 : const uint8* u_buf,
554 : const uint8* v_buf,
555 : uint8* rgb_buf,
556 : int width,
557 : int source_dx)
558 : {
559 : if (mozilla::supports_sse()) {
560 : LinearScaleYUVToRGB32Row_SSE(y_buf, u_buf, v_buf, rgb_buf,
561 : width, source_dx);
562 : return;
563 : }
564 :
565 : LinearScaleYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf,
566 : width, source_dx);
567 : }
568 :
569 : #elif defined(MOZILLA_MAY_SUPPORT_SSE) && defined(ARCH_CPU_X86_32) && defined(__PIC__)
570 :
571 : void PICConvertYUVToRGB32Row_SSE(const uint8* y_buf,
572 : const uint8* u_buf,
573 : const uint8* v_buf,
574 : uint8* rgb_buf,
575 : int width,
576 : const int16 *kCoefficientsRgbY);
577 :
578 : asm(
579 : ".text\n"
580 : #if defined(XP_MACOSX)
581 : "_PICConvertYUVToRGB32Row_SSE:\n"
582 : #else
583 : "PICConvertYUVToRGB32Row_SSE:\n"
584 : #endif
585 : "pusha\n"
586 : "mov 0x24(%esp),%edx\n"
587 : "mov 0x28(%esp),%edi\n"
588 : "mov 0x2c(%esp),%esi\n"
589 : "mov 0x30(%esp),%ebp\n"
590 : "mov 0x38(%esp),%ecx\n"
591 :
592 : "jmp 1f\n"
593 :
594 : "0:"
595 : "movzbl (%edi),%eax\n"
596 : "add $0x1,%edi\n"
597 : "movzbl (%esi),%ebx\n"
598 : "add $0x1,%esi\n"
599 : "movq 2048(%ecx,%eax,8),%mm0\n"
600 : "movzbl (%edx),%eax\n"
601 : "paddsw 4096(%ecx,%ebx,8),%mm0\n"
602 : "movzbl 0x1(%edx),%ebx\n"
603 : "movq 0(%ecx,%eax,8),%mm1\n"
604 : "add $0x2,%edx\n"
605 : "movq 0(%ecx,%ebx,8),%mm2\n"
606 : "paddsw %mm0,%mm1\n"
607 : "paddsw %mm0,%mm2\n"
608 : "psraw $0x6,%mm1\n"
609 : "psraw $0x6,%mm2\n"
610 : "packuswb %mm2,%mm1\n"
611 : "movntq %mm1,0x0(%ebp)\n"
612 : "add $0x8,%ebp\n"
613 : "1:"
614 : "subl $0x2,0x34(%esp)\n"
615 : "jns 0b\n"
616 :
617 : "andl $0x1,0x34(%esp)\n"
618 : "je 2f\n"
619 :
620 : "movzbl (%edi),%eax\n"
621 : "movq 2048(%ecx,%eax,8),%mm0\n"
622 : "movzbl (%esi),%eax\n"
623 : "paddsw 4096(%ecx,%eax,8),%mm0\n"
624 : "movzbl (%edx),%eax\n"
625 : "movq 0(%ecx,%eax,8),%mm1\n"
626 : "paddsw %mm0,%mm1\n"
627 : "psraw $0x6,%mm1\n"
628 : "packuswb %mm1,%mm1\n"
629 : "movd %mm1,0x0(%ebp)\n"
630 : "2:"
631 : "popa\n"
632 : "ret\n"
633 : #if !defined(XP_MACOSX)
634 : ".previous\n"
635 : #endif
636 : );
637 :
638 : void FastConvertYUVToRGB32Row(const uint8* y_buf,
639 : const uint8* u_buf,
640 : const uint8* v_buf,
641 : uint8* rgb_buf,
642 : int width)
643 : {
644 : if (mozilla::supports_sse()) {
645 : PICConvertYUVToRGB32Row_SSE(y_buf, u_buf, v_buf, rgb_buf, width,
646 : &kCoefficientsRgbY[0][0]);
647 : return;
648 : }
649 :
650 : FastConvertYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf, width, 1);
651 : }
652 :
653 : void PICScaleYUVToRGB32Row_SSE(const uint8* y_buf,
654 : const uint8* u_buf,
655 : const uint8* v_buf,
656 : uint8* rgb_buf,
657 : int width,
658 : int source_dx,
659 : const int16 *kCoefficientsRgbY);
660 :
661 : asm(
662 : ".text\n"
663 : #if defined(XP_MACOSX)
664 : "_PICScaleYUVToRGB32Row_SSE:\n"
665 : #else
666 : "PICScaleYUVToRGB32Row_SSE:\n"
667 : #endif
668 : "pusha\n"
669 : "mov 0x24(%esp),%edx\n"
670 : "mov 0x28(%esp),%edi\n"
671 : "mov 0x2c(%esp),%esi\n"
672 : "mov 0x30(%esp),%ebp\n"
673 : "mov 0x3c(%esp),%ecx\n"
674 : "xor %ebx,%ebx\n"
675 : "jmp 1f\n"
676 :
677 : "0:"
678 : "mov %ebx,%eax\n"
679 : "sar $0x11,%eax\n"
680 : "movzbl (%edi,%eax,1),%eax\n"
681 : "movq 2048(%ecx,%eax,8),%mm0\n"
682 : "mov %ebx,%eax\n"
683 : "sar $0x11,%eax\n"
684 : "movzbl (%esi,%eax,1),%eax\n"
685 : "paddsw 4096(%ecx,%eax,8),%mm0\n"
686 : "mov %ebx,%eax\n"
687 : "add 0x38(%esp),%ebx\n"
688 : "sar $0x10,%eax\n"
689 : "movzbl (%edx,%eax,1),%eax\n"
690 : "movq 0(%ecx,%eax,8),%mm1\n"
691 : "mov %ebx,%eax\n"
692 : "add 0x38(%esp),%ebx\n"
693 : "sar $0x10,%eax\n"
694 : "movzbl (%edx,%eax,1),%eax\n"
695 : "movq 0(%ecx,%eax,8),%mm2\n"
696 : "paddsw %mm0,%mm1\n"
697 : "paddsw %mm0,%mm2\n"
698 : "psraw $0x6,%mm1\n"
699 : "psraw $0x6,%mm2\n"
700 : "packuswb %mm2,%mm1\n"
701 : "movntq %mm1,0x0(%ebp)\n"
702 : "add $0x8,%ebp\n"
703 : "1:"
704 : "subl $0x2,0x34(%esp)\n"
705 : "jns 0b\n"
706 :
707 : "andl $0x1,0x34(%esp)\n"
708 : "je 2f\n"
709 :
710 : "mov %ebx,%eax\n"
711 : "sar $0x11,%eax\n"
712 : "movzbl (%edi,%eax,1),%eax\n"
713 : "movq 2048(%ecx,%eax,8),%mm0\n"
714 : "mov %ebx,%eax\n"
715 : "sar $0x11,%eax\n"
716 : "movzbl (%esi,%eax,1),%eax\n"
717 : "paddsw 4096(%ecx,%eax,8),%mm0\n"
718 : "mov %ebx,%eax\n"
719 : "sar $0x10,%eax\n"
720 : "movzbl (%edx,%eax,1),%eax\n"
721 : "movq 0(%ecx,%eax,8),%mm1\n"
722 : "paddsw %mm0,%mm1\n"
723 : "psraw $0x6,%mm1\n"
724 : "packuswb %mm1,%mm1\n"
725 : "movd %mm1,0x0(%ebp)\n"
726 :
727 : "2:"
728 : "popa\n"
729 : "ret\n"
730 : #if !defined(XP_MACOSX)
731 : ".previous\n"
732 : #endif
733 : );
734 :
735 : void ScaleYUVToRGB32Row(const uint8* y_buf,
736 : const uint8* u_buf,
737 : const uint8* v_buf,
738 : uint8* rgb_buf,
739 : int width,
740 : int source_dx)
741 : {
742 : if (mozilla::supports_sse()) {
743 : PICScaleYUVToRGB32Row_SSE(y_buf, u_buf, v_buf, rgb_buf, width, source_dx,
744 : &kCoefficientsRgbY[0][0]);
745 : return;
746 : }
747 :
748 : ScaleYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf, width, source_dx);
749 : }
750 :
751 : void PICLinearScaleYUVToRGB32Row_SSE(const uint8* y_buf,
752 : const uint8* u_buf,
753 : const uint8* v_buf,
754 : uint8* rgb_buf,
755 : int width,
756 : int source_dx,
757 : const int16 *kCoefficientsRgbY);
758 :
759 : asm(
760 : ".text\n"
761 : #if defined(XP_MACOSX)
762 : "_PICLinearScaleYUVToRGB32Row_SSE:\n"
763 : #else
764 : "PICLinearScaleYUVToRGB32Row_SSE:\n"
765 : #endif
766 : "pusha\n"
767 : "mov 0x24(%esp),%edx\n"
768 : "mov 0x30(%esp),%ebp\n"
769 : "mov 0x34(%esp),%ecx\n"
770 : "mov 0x3c(%esp),%edi\n"
771 : "xor %ebx,%ebx\n"
772 :
773 : // source_width = width * source_dx + ebx
774 : "mov 0x34(%esp), %ecx\n"
775 : "imull 0x38(%esp), %ecx\n"
776 : "mov %ecx, 0x34(%esp)\n"
777 :
778 : "mov 0x38(%esp), %ecx\n"
779 : "xor %ebx,%ebx\n" // x = 0
780 : "cmp $0x20000,%ecx\n" // if source_dx >= 2.0
781 : "jl 1f\n"
782 : "mov $0x8000,%ebx\n" // x = 0.5 for 1/2 or less
783 : "jmp 1f\n"
784 :
785 : "0:"
786 : "mov 0x28(%esp),%esi\n"
787 : "mov %ebx,%eax\n"
788 : "sar $0x11,%eax\n"
789 :
790 : "movzbl (%esi,%eax,1),%ecx\n"
791 : "movzbl 1(%esi,%eax,1),%esi\n"
792 : "mov %ebx,%eax\n"
793 : "andl $0x1fffe, %eax \n"
794 : "imul %eax, %esi \n"
795 : "xorl $0x1fffe, %eax \n"
796 : "imul %eax, %ecx \n"
797 : "addl %esi, %ecx \n"
798 : "shrl $17, %ecx \n"
799 : "movq 2048(%edi,%ecx,8),%mm0\n"
800 :
801 : "mov 0x2c(%esp),%esi\n"
802 : "mov %ebx,%eax\n"
803 : "sar $0x11,%eax\n"
804 :
805 : "movzbl (%esi,%eax,1),%ecx\n"
806 : "movzbl 1(%esi,%eax,1),%esi\n"
807 : "mov %ebx,%eax\n"
808 : "andl $0x1fffe, %eax \n"
809 : "imul %eax, %esi \n"
810 : "xorl $0x1fffe, %eax \n"
811 : "imul %eax, %ecx \n"
812 : "addl %esi, %ecx \n"
813 : "shrl $17, %ecx \n"
814 : "paddsw 4096(%edi,%ecx,8),%mm0\n"
815 :
816 : "mov %ebx,%eax\n"
817 : "sar $0x10,%eax\n"
818 : "movzbl (%edx,%eax,1),%ecx\n"
819 : "movzbl 1(%edx,%eax,1),%esi\n"
820 : "mov %ebx,%eax\n"
821 : "add 0x38(%esp),%ebx\n"
822 : "andl $0xffff, %eax \n"
823 : "imul %eax, %esi \n"
824 : "xorl $0xffff, %eax \n"
825 : "imul %eax, %ecx \n"
826 : "addl %esi, %ecx \n"
827 : "shrl $16, %ecx \n"
828 : "movq (%edi,%ecx,8),%mm1\n"
829 :
830 : "cmp 0x34(%esp), %ebx\n"
831 : "jge 2f\n"
832 :
833 : "mov %ebx,%eax\n"
834 : "sar $0x10,%eax\n"
835 : "movzbl (%edx,%eax,1),%ecx\n"
836 : "movzbl 1(%edx,%eax,1),%esi\n"
837 : "mov %ebx,%eax\n"
838 : "add 0x38(%esp),%ebx\n"
839 : "andl $0xffff, %eax \n"
840 : "imul %eax, %esi \n"
841 : "xorl $0xffff, %eax \n"
842 : "imul %eax, %ecx \n"
843 : "addl %esi, %ecx \n"
844 : "shrl $16, %ecx \n"
845 : "movq (%edi,%ecx,8),%mm2\n"
846 :
847 : "paddsw %mm0,%mm1\n"
848 : "paddsw %mm0,%mm2\n"
849 : "psraw $0x6,%mm1\n"
850 : "psraw $0x6,%mm2\n"
851 : "packuswb %mm2,%mm1\n"
852 : "movntq %mm1,0x0(%ebp)\n"
853 : "add $0x8,%ebp\n"
854 :
855 : "1:"
856 : "cmp %ebx, 0x34(%esp)\n"
857 : "jg 0b\n"
858 : "popa\n"
859 : "ret\n"
860 :
861 : "2:"
862 : "paddsw %mm0, %mm1\n"
863 : "psraw $6, %mm1\n"
864 : "packuswb %mm1, %mm1\n"
865 : "movd %mm1, (%ebp)\n"
866 : "popa\n"
867 : "ret\n"
868 : #if !defined(XP_MACOSX)
869 : ".previous\n"
870 : #endif
871 : );
872 :
873 :
874 : void LinearScaleYUVToRGB32Row(const uint8* y_buf,
875 : const uint8* u_buf,
876 : const uint8* v_buf,
877 : uint8* rgb_buf,
878 : int width,
879 : int source_dx)
880 : {
881 : if (mozilla::supports_sse()) {
882 : PICLinearScaleYUVToRGB32Row_SSE(y_buf, u_buf, v_buf, rgb_buf, width,
883 : source_dx, &kCoefficientsRgbY[0][0]);
884 : return;
885 : }
886 :
887 : LinearScaleYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf, width, source_dx);
888 : }
889 : #else
890 : void FastConvertYUVToRGB32Row(const uint8* y_buf,
891 : const uint8* u_buf,
892 : const uint8* v_buf,
893 : uint8* rgb_buf,
894 : int width) {
895 : FastConvertYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf, width, 1);
896 : }
897 :
898 : void ScaleYUVToRGB32Row(const uint8* y_buf,
899 : const uint8* u_buf,
900 : const uint8* v_buf,
901 : uint8* rgb_buf,
902 : int width,
903 : int source_dx) {
904 : ScaleYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf, width, source_dx);
905 : }
906 :
907 : void LinearScaleYUVToRGB32Row(const uint8* y_buf,
908 : const uint8* u_buf,
909 : const uint8* v_buf,
910 : uint8* rgb_buf,
911 : int width,
912 : int source_dx) {
913 : LinearScaleYUVToRGB32Row_C(y_buf, u_buf, v_buf, rgb_buf, width, source_dx);
914 : }
915 : #endif
916 :
917 : }
|