Unified · Split
| @@ -23,6 +23,10 @@ · 22 unmodified lines | ||
| 23 | 23 | |
| 24 | 24 | %include "libavutil/x86/x86util.asm" |
| 25 | 25 | |
| 26 | +SECTION_RODATA | |
| 27 | + | |
| 28 | +cextern pw_1 | |
| 29 | + | |
| 26 | 30 | SECTION .text |
| 27 | 31 | |
| 28 | 32 | %macro DIFF_PIXELS_1 4 |
| @@ -439,73 +443,92 @@ cglobal diff_pixels, 4, 5, 5 · 410 unmodified lines | ||
| 439 | 443 | jne .loop |
| 440 | 444 | RET |
| 441 | 445 | |
| 442 | −INIT_MMX mmx | |
| 443 | 446 | ; int ff_pix_sum16_mmx(uint8_t *pix, int line_size) |
| 444 | −cglobal pix_sum16, 2, 3 | |
| 447 | +; %1 = number of xmm registers used | |
| 448 | +; %2 = number of loops | |
| 449 | +%macro PIX_SUM16 2 | |
| 450 | +cglobal pix_sum16, 2, 3, %1 | |
| 445 | 451 | movsxdifnidn r1, r1d |
| 446 | − mov r2, r1 | |
| 447 | − neg r2 | |
| 448 | − shl r2, 4 | |
| 449 | − sub r0, r2 | |
| 450 | − pxor m7, m7 | |
| 451 | − pxor m6, m6 | |
| 452 | + mov r2, %2 | |
| 453 | + pxor m5, m5 | |
| 454 | + pxor m4, m4 | |
| 452 | 455 | .loop: |
| 453 | − mova m0, [r0+r2+0] | |
| 454 | − mova m1, [r0+r2+0] | |
| 455 | − mova m2, [r0+r2+8] | |
| 456 | − mova m3, [r0+r2+8] | |
| 457 | − punpcklbw m0, m7 | |
| 458 | − punpckhbw m1, m7 | |
| 459 | − punpcklbw m2, m7 | |
| 460 | − punpckhbw m3, m7 | |
| 456 | + mova m0, [r0] | |
| 457 | +%if mmsize == 8 | |
| 458 | + mova m1, [r0+8] | |
| 459 | +%else | |
| 460 | + mova m1, [r0+r1] | |
| 461 | +%endif | |
| 462 | + punpckhbw m2, m0, m5 | |
| 463 | + punpcklbw m0, m5 | |
| 464 | + punpckhbw m3, m1, m5 | |
| 465 | + punpcklbw m1, m5 | |
| 461 | 466 | paddw m1, m0 |
| 462 | 467 | paddw m3, m2 |
| 463 | 468 | paddw m3, m1 |
| 464 | − paddw m6, m3 | |
| 465 | − add r2, r1 | |
| 466 | − js .loop | |
| 467 | − mova m5, m6 | |
| 468 | − psrlq m6, 32 | |
| 469 | − paddw m6, m5 | |
| 470 | − mova m5, m6 | |
| 471 | − psrlq m6, 16 | |
| 472 | − paddw m6, m5 | |
| 473 | − movd eax, m6 | |
| 469 | + paddw m4, m3 | |
| 470 | +%if mmsize == 8 | |
| 471 | + add r0, r1 | |
| 472 | +%else | |
| 473 | + lea r0, [r0+r1*2] | |
| 474 | +%endif | |
| 475 | + dec r2 | |
| 476 | + jne .loop | |
| 477 | + HADDW m4, m5 | |
| 478 | + movd eax, m4 | |
| 474 | 479 | and eax, 0xffff |
| 475 | 480 | RET |
| 481 | +%endmacro | |
| 476 | 482 | |
| 477 | 483 | INIT_MMX mmx |
| 484 | +PIX_SUM16 0, 16 | |
| 485 | +INIT_XMM sse2 | |
| 486 | +PIX_SUM16 6, 8 | |
| 487 | + | |
| 478 | 488 | ; int ff_pix_norm1_mmx(uint8_t *pix, int line_size) |
| 479 | −cglobal pix_norm1, 2, 4 | |
| 489 | +; %1 = number of xmm registers used | |
| 490 | +; %2 = number of loops | |
| 491 | +%macro PIX_NORM1 2 | |
| 492 | +cglobal pix_norm1, 2, 3, %1 | |
| 480 | 493 | movsxdifnidn r1, r1d |
| 481 | − mov r2, 16 | |
| 494 | + mov r2, %2 | |
| 482 | 495 | pxor m0, m0 |
| 483 | − pxor m7, m7 | |
| 496 | + pxor m5, m5 | |
| 484 | 497 | .loop: |
| 485 | 498 | mova m2, [r0+0] |
| 499 | +%if mmsize == 8 | |
| 486 | 500 | mova m3, [r0+8] |
| 487 | − mova m1, m2 | |
| 488 | − punpckhbw m1, m0 | |
| 501 | +%else | |
| 502 | + mova m3, [r0+r1] | |
| 503 | +%endif | |
| 504 | + punpckhbw m1, m2, m0 | |
| 489 | 505 | punpcklbw m2, m0 |
| 490 | − mova m4, m3 | |
| 491 | − punpckhbw m3, m0 | |
| 492 | − punpcklbw m4, m0 | |
| 506 | + punpckhbw m4, m3, m0 | |
| 507 | + punpcklbw m3, m0 | |
| 493 | 508 | pmaddwd m1, m1 |
| 494 | 509 | pmaddwd m2, m2 |
| 495 | 510 | pmaddwd m3, m3 |
| 496 | 511 | pmaddwd m4, m4 |
| 497 | 512 | paddd m2, m1 |
| 498 | 513 | paddd m4, m3 |
| 499 | − paddd m7, m2 | |
| 514 | + paddd m5, m2 | |
| 515 | + paddd m5, m4 | |
| 516 | +%if mmsize == 8 | |
| 500 | 517 | add r0, r1 |
| 501 | − paddd m7, m4 | |
| 518 | +%else | |
| 519 | + lea r0, [r0+r1*2] | |
| 520 | +%endif | |
| 502 | 521 | dec r2 |
| 503 | 522 | jne .loop |
| 504 | − mova m1, m7 | |
| 505 | − psrlq m7, 32 | |
| 506 | − paddd m1, m7 | |
| 507 | − movd eax, m1 | |
| 523 | + HADDD m5, m1 | |
| 524 | + movd eax, m5 | |
| 508 | 525 | RET |
| 526 | +%endmacro | |
| 527 | + | |
| 528 | +INIT_MMX mmx | |
| 529 | +PIX_NORM1 0, 16 | |
| 530 | +INIT_XMM sse2 | |
| 531 | +PIX_NORM1 6, 8 | |
| 509 | 532 | |
| 510 | 533 | ;----------------------------------------------- |
| 511 | 534 | ;int ff_sum_abs_dctelem(int16_t *block) |
| @@ -38,7 +38,9 @@ void ff_diff_pixels_mmx(int16_t *block, const uint8_t *s1, const uint8_t *s2, · 37 unmodified lines | ||
| 38 | 38 | void ff_diff_pixels_sse2(int16_t *block, const uint8_t *s1, const uint8_t *s2, |
| 39 | 39 | int stride); |
| 40 | 40 | int ff_pix_sum16_mmx(uint8_t *pix, int line_size); |
| 41 | +int ff_pix_sum16_sse2(uint8_t *pix, int line_size); | |
| 41 | 42 | int ff_pix_norm1_mmx(uint8_t *pix, int line_size); |
| 43 | +int ff_pix_norm1_sse2(uint8_t *pix, int line_size); | |
| 42 | 44 | int ff_sum_abs_dctelem_mmx(int16_t *block); |
| 43 | 45 | int ff_sum_abs_dctelem_mmxext(int16_t *block); |
| 44 | 46 | int ff_sum_abs_dctelem_sse2(int16_t *block); |
| @@ -906,6 +908,8 @@ av_cold void ff_dsputilenc_init_mmx(DSPContext *c, AVCodecContext *avctx, · 861 unmodified lines | ||
| 906 | 908 | c->sse[0] = ff_sse16_sse2; |
| 907 | 909 | c->sum_abs_dctelem = ff_sum_abs_dctelem_sse2; |
| 908 | 910 | c->diff_pixels = ff_diff_pixels_sse2; |
| 911 | + c->pix_sum = ff_pix_sum16_sse2; | |
| 912 | + c->pix_norm1 = ff_pix_norm1_sse2; | |
| 909 | 913 | |
| 910 | 914 | #if HAVE_ALIGNED_STACK |
| 911 | 915 | c->hadamard8_diff[0] = ff_hadamard8_diff16_sse2; |
| @@ -288,7 +288,12 @@ · 287 unmodified lines | ||
| 288 | 288 | paddd %1, %2 |
| 289 | 289 | %endif |
| 290 | 290 | %if notcpuflag(xop) || sizeof%1 != 16 |
| 291 | +%if cpuflag(mmxext) | |
| 291 | 292 | PSHUFLW %2, %1, q0032 |
| 293 | +%else ; mmx | |
| 294 | + mova %2, %1 | |
| 295 | + psrlq %2, 32 | |
| 296 | +%endif | |
| 292 | 297 | paddd %1, %2 |
| 293 | 298 | %endif |
| 294 | 299 | %undef %1 |