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