Mercurial > libavcodec.hg
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" |