comparison x86/dsputil_mmx_rnd_template.c @ 9445:41245484dc0b libavcodec

avg_ pixel functions need to use (dst+pix+1)>>1 to average with existing pixels, not (dst+pix)>>1. This makes the mmx functions bitexact with the C functions.
author conrad
date Wed, 15 Apr 2009 19:10:16 +0000
parents 04423b2f6e0b
children 36b60aa6bc75
comparison
equal deleted inserted replaced
9444:fe17033a79ed 9445:41245484dc0b
304 JUMPALIGN(); 304 JUMPALIGN();
305 do { 305 do {
306 __asm__ volatile( 306 __asm__ volatile(
307 "movd %0, %%mm0 \n\t" 307 "movd %0, %%mm0 \n\t"
308 "movd %1, %%mm1 \n\t" 308 "movd %1, %%mm1 \n\t"
309 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) 309 OP_AVG(%%mm0, %%mm1, %%mm2, %%mm6)
310 "movd %%mm2, %0 \n\t" 310 "movd %%mm2, %0 \n\t"
311 :"+m"(*block) 311 :"+m"(*block)
312 :"m"(*pixels) 312 :"m"(*pixels)
313 :"memory"); 313 :"memory");
314 pixels += line_size; 314 pixels += line_size;
324 JUMPALIGN(); 324 JUMPALIGN();
325 do { 325 do {
326 __asm__ volatile( 326 __asm__ volatile(
327 "movq %0, %%mm0 \n\t" 327 "movq %0, %%mm0 \n\t"
328 "movq %1, %%mm1 \n\t" 328 "movq %1, %%mm1 \n\t"
329 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) 329 OP_AVG(%%mm0, %%mm1, %%mm2, %%mm6)
330 "movq %%mm2, %0 \n\t" 330 "movq %%mm2, %0 \n\t"
331 :"+m"(*block) 331 :"+m"(*block)
332 :"m"(*pixels) 332 :"m"(*pixels)
333 :"memory"); 333 :"memory");
334 pixels += line_size; 334 pixels += line_size;
343 JUMPALIGN(); 343 JUMPALIGN();
344 do { 344 do {
345 __asm__ volatile( 345 __asm__ volatile(
346 "movq %0, %%mm0 \n\t" 346 "movq %0, %%mm0 \n\t"
347 "movq %1, %%mm1 \n\t" 347 "movq %1, %%mm1 \n\t"
348 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) 348 OP_AVG(%%mm0, %%mm1, %%mm2, %%mm6)
349 "movq %%mm2, %0 \n\t" 349 "movq %%mm2, %0 \n\t"
350 "movq 8%0, %%mm0 \n\t" 350 "movq 8%0, %%mm0 \n\t"
351 "movq 8%1, %%mm1 \n\t" 351 "movq 8%1, %%mm1 \n\t"
352 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) 352 OP_AVG(%%mm0, %%mm1, %%mm2, %%mm6)
353 "movq %%mm2, 8%0 \n\t" 353 "movq %%mm2, 8%0 \n\t"
354 :"+m"(*block) 354 :"+m"(*block)
355 :"m"(*pixels) 355 :"m"(*pixels)
356 :"memory"); 356 :"memory");
357 pixels += line_size; 357 pixels += line_size;
368 __asm__ volatile( 368 __asm__ volatile(
369 "movq %1, %%mm0 \n\t" 369 "movq %1, %%mm0 \n\t"
370 "movq 1%1, %%mm1 \n\t" 370 "movq 1%1, %%mm1 \n\t"
371 "movq %0, %%mm3 \n\t" 371 "movq %0, %%mm3 \n\t"
372 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) 372 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6)
373 PAVGB(%%mm3, %%mm2, %%mm0, %%mm6) 373 OP_AVG(%%mm3, %%mm2, %%mm0, %%mm6)
374 "movq %%mm0, %0 \n\t" 374 "movq %%mm0, %0 \n\t"
375 :"+m"(*block) 375 :"+m"(*block)
376 :"m"(*pixels) 376 :"m"(*pixels)
377 :"memory"); 377 :"memory");
378 pixels += line_size; 378 pixels += line_size;
388 __asm__ volatile( 388 __asm__ volatile(
389 "movq %1, %%mm0 \n\t" 389 "movq %1, %%mm0 \n\t"
390 "movq %2, %%mm1 \n\t" 390 "movq %2, %%mm1 \n\t"
391 "movq %0, %%mm3 \n\t" 391 "movq %0, %%mm3 \n\t"
392 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) 392 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6)
393 PAVGB(%%mm3, %%mm2, %%mm0, %%mm6) 393 OP_AVG(%%mm3, %%mm2, %%mm0, %%mm6)
394 "movq %%mm0, %0 \n\t" 394 "movq %%mm0, %0 \n\t"
395 :"+m"(*dst) 395 :"+m"(*dst)
396 :"m"(*src1), "m"(*src2) 396 :"m"(*src1), "m"(*src2)
397 :"memory"); 397 :"memory");
398 dst += dstStride; 398 dst += dstStride;
409 __asm__ volatile( 409 __asm__ volatile(
410 "movq %1, %%mm0 \n\t" 410 "movq %1, %%mm0 \n\t"
411 "movq 1%1, %%mm1 \n\t" 411 "movq 1%1, %%mm1 \n\t"
412 "movq %0, %%mm3 \n\t" 412 "movq %0, %%mm3 \n\t"
413 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) 413 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6)
414 PAVGB(%%mm3, %%mm2, %%mm0, %%mm6) 414 OP_AVG(%%mm3, %%mm2, %%mm0, %%mm6)
415 "movq %%mm0, %0 \n\t" 415 "movq %%mm0, %0 \n\t"
416 "movq 8%1, %%mm0 \n\t" 416 "movq 8%1, %%mm0 \n\t"
417 "movq 9%1, %%mm1 \n\t" 417 "movq 9%1, %%mm1 \n\t"
418 "movq 8%0, %%mm3 \n\t" 418 "movq 8%0, %%mm3 \n\t"
419 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) 419 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6)
420 PAVGB(%%mm3, %%mm2, %%mm0, %%mm6) 420 OP_AVG(%%mm3, %%mm2, %%mm0, %%mm6)
421 "movq %%mm0, 8%0 \n\t" 421 "movq %%mm0, 8%0 \n\t"
422 :"+m"(*block) 422 :"+m"(*block)
423 :"m"(*pixels) 423 :"m"(*pixels)
424 :"memory"); 424 :"memory");
425 pixels += line_size; 425 pixels += line_size;
435 __asm__ volatile( 435 __asm__ volatile(
436 "movq %1, %%mm0 \n\t" 436 "movq %1, %%mm0 \n\t"
437 "movq %2, %%mm1 \n\t" 437 "movq %2, %%mm1 \n\t"
438 "movq %0, %%mm3 \n\t" 438 "movq %0, %%mm3 \n\t"
439 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) 439 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6)
440 PAVGB(%%mm3, %%mm2, %%mm0, %%mm6) 440 OP_AVG(%%mm3, %%mm2, %%mm0, %%mm6)
441 "movq %%mm0, %0 \n\t" 441 "movq %%mm0, %0 \n\t"
442 "movq 8%1, %%mm0 \n\t" 442 "movq 8%1, %%mm0 \n\t"
443 "movq 8%2, %%mm1 \n\t" 443 "movq 8%2, %%mm1 \n\t"
444 "movq 8%0, %%mm3 \n\t" 444 "movq 8%0, %%mm3 \n\t"
445 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) 445 PAVGB(%%mm0, %%mm1, %%mm2, %%mm6)
446 PAVGB(%%mm3, %%mm2, %%mm0, %%mm6) 446 OP_AVG(%%mm3, %%mm2, %%mm0, %%mm6)
447 "movq %%mm0, 8%0 \n\t" 447 "movq %%mm0, 8%0 \n\t"
448 :"+m"(*dst) 448 :"+m"(*dst)
449 :"m"(*src1), "m"(*src2) 449 :"m"(*src1), "m"(*src2)
450 :"memory"); 450 :"memory");
451 dst += dstStride; 451 dst += dstStride;
464 "1: \n\t" 464 "1: \n\t"
465 "movq (%1, %3), %%mm1 \n\t" 465 "movq (%1, %3), %%mm1 \n\t"
466 "movq (%1, %%"REG_a"), %%mm2 \n\t" 466 "movq (%1, %%"REG_a"), %%mm2 \n\t"
467 PAVGBP(%%mm1, %%mm0, %%mm4, %%mm2, %%mm1, %%mm5) 467 PAVGBP(%%mm1, %%mm0, %%mm4, %%mm2, %%mm1, %%mm5)
468 "movq (%2), %%mm3 \n\t" 468 "movq (%2), %%mm3 \n\t"
469 PAVGB(%%mm3, %%mm4, %%mm0, %%mm6) 469 OP_AVG(%%mm3, %%mm4, %%mm0, %%mm6)
470 "movq (%2, %3), %%mm3 \n\t" 470 "movq (%2, %3), %%mm3 \n\t"
471 PAVGB(%%mm3, %%mm5, %%mm1, %%mm6) 471 OP_AVG(%%mm3, %%mm5, %%mm1, %%mm6)
472 "movq %%mm0, (%2) \n\t" 472 "movq %%mm0, (%2) \n\t"
473 "movq %%mm1, (%2, %3) \n\t" 473 "movq %%mm1, (%2, %3) \n\t"
474 "add %%"REG_a", %1 \n\t" 474 "add %%"REG_a", %1 \n\t"
475 "add %%"REG_a", %2 \n\t" 475 "add %%"REG_a", %2 \n\t"
476 476
477 "movq (%1, %3), %%mm1 \n\t" 477 "movq (%1, %3), %%mm1 \n\t"
478 "movq (%1, %%"REG_a"), %%mm0 \n\t" 478 "movq (%1, %%"REG_a"), %%mm0 \n\t"
479 PAVGBP(%%mm1, %%mm2, %%mm4, %%mm0, %%mm1, %%mm5) 479 PAVGBP(%%mm1, %%mm2, %%mm4, %%mm0, %%mm1, %%mm5)
480 "movq (%2), %%mm3 \n\t" 480 "movq (%2), %%mm3 \n\t"
481 PAVGB(%%mm3, %%mm4, %%mm2, %%mm6) 481 OP_AVG(%%mm3, %%mm4, %%mm2, %%mm6)
482 "movq (%2, %3), %%mm3 \n\t" 482 "movq (%2, %3), %%mm3 \n\t"
483 PAVGB(%%mm3, %%mm5, %%mm1, %%mm6) 483 OP_AVG(%%mm3, %%mm5, %%mm1, %%mm6)
484 "movq %%mm2, (%2) \n\t" 484 "movq %%mm2, (%2) \n\t"
485 "movq %%mm1, (%2, %3) \n\t" 485 "movq %%mm1, (%2, %3) \n\t"
486 "add %%"REG_a", %1 \n\t" 486 "add %%"REG_a", %1 \n\t"
487 "add %%"REG_a", %2 \n\t" 487 "add %%"REG_a", %2 \n\t"
488 488
531 "psrlw $2, %%mm5 \n\t" 531 "psrlw $2, %%mm5 \n\t"
532 "movq (%2, %%"REG_a"), %%mm3 \n\t" 532 "movq (%2, %%"REG_a"), %%mm3 \n\t"
533 "packuswb %%mm5, %%mm4 \n\t" 533 "packuswb %%mm5, %%mm4 \n\t"
534 "pcmpeqd %%mm2, %%mm2 \n\t" 534 "pcmpeqd %%mm2, %%mm2 \n\t"
535 "paddb %%mm2, %%mm2 \n\t" 535 "paddb %%mm2, %%mm2 \n\t"
536 PAVGB(%%mm3, %%mm4, %%mm5, %%mm2) 536 OP_AVG(%%mm3, %%mm4, %%mm5, %%mm2)
537 "movq %%mm5, (%2, %%"REG_a") \n\t" 537 "movq %%mm5, (%2, %%"REG_a") \n\t"
538 "add %3, %%"REG_a" \n\t" 538 "add %3, %%"REG_a" \n\t"
539 539
540 "movq (%1, %%"REG_a"), %%mm2 \n\t" // 0 <-> 2 1 <-> 3 540 "movq (%1, %%"REG_a"), %%mm2 \n\t" // 0 <-> 2 1 <-> 3
541 "movq 1(%1, %%"REG_a"), %%mm4 \n\t" 541 "movq 1(%1, %%"REG_a"), %%mm4 \n\t"
555 "psrlw $2, %%mm1 \n\t" 555 "psrlw $2, %%mm1 \n\t"
556 "movq (%2, %%"REG_a"), %%mm3 \n\t" 556 "movq (%2, %%"REG_a"), %%mm3 \n\t"
557 "packuswb %%mm1, %%mm0 \n\t" 557 "packuswb %%mm1, %%mm0 \n\t"
558 "pcmpeqd %%mm2, %%mm2 \n\t" 558 "pcmpeqd %%mm2, %%mm2 \n\t"
559 "paddb %%mm2, %%mm2 \n\t" 559 "paddb %%mm2, %%mm2 \n\t"
560 PAVGB(%%mm3, %%mm0, %%mm1, %%mm2) 560 OP_AVG(%%mm3, %%mm0, %%mm1, %%mm2)
561 "movq %%mm1, (%2, %%"REG_a") \n\t" 561 "movq %%mm1, (%2, %%"REG_a") \n\t"
562 "add %3, %%"REG_a" \n\t" 562 "add %3, %%"REG_a" \n\t"
563 563
564 "subl $2, %0 \n\t" 564 "subl $2, %0 \n\t"
565 "jnz 1b \n\t" 565 "jnz 1b \n\t"