History

x86/dsputilenc: implement SSE2 versions of pix_{sum16, norm1}

James Almer committed 12 years ago

Commit 561bfc81 parent d2282713 files · +72 −40Browse files

Unified · Split

3 files
  1. libavcodec/x86/dsputilenc.asm +63 −40
  2. libavcodec/x86/dsputilenc_mmx.c +4 −0
  3. libavutil/x86/x86util.asm +5 −0
libavcodec/x86/dsputilenc.asm+63−40
@@ -23,6 +23,10 @@ · 22 unmodified lines
23 23
24%include "libavutil/x86/x86util.asm"24%include "libavutil/x86/x86util.asm"
25 25
26SECTION_RODATA
27
28cextern pw_1
29
26SECTION .text30SECTION .text
27 31
28%macro DIFF_PIXELS_1 432%macro DIFF_PIXELS_1 4
@@ -439,73 +443,92 @@ cglobal diff_pixels, 4, 5, 5 · 410 unmodified lines
439 jne .loop443 jne .loop
440 RET444 RET
441 445
442INIT_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)
444cglobal pix_sum16, 2, 3447; %1 = number of xmm registers used
448; %2 = number of loops
449%macro PIX_SUM16 2
450cglobal pix_sum16, 2, 3, %1
445 movsxdifnidn r1, r1d451 movsxdifnidn r1, r1d
446 mov r2, r1452 mov r2, %2
447 neg r2453 pxor m5, m5
448 shl r2, 4454 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, m7460 mova m1, [r0+r1]
458 punpckhbw m1, m7461%endif
459 punpcklbw m2, m7462 punpckhbw m2, m0, m5
460 punpckhbw m3, m7463 punpcklbw m0, m5
464 punpckhbw m3, m1, m5
465 punpcklbw m1, m5
461 paddw m1, m0466 paddw m1, m0
462 paddw m3, m2467 paddw m3, m2
463 paddw m3, m1468 paddw m3, m1
464 paddw m6, m3469 paddw m4, m3
465 add r2, r1470%if mmsize == 8
466 js .loop471 add r0, r1
467 mova m5, m6472%else
468 psrlq m6, 32473 lea r0, [r0+r1*2]
469 paddw m6, m5474%endif
470 mova m5, m6475 dec r2
471 psrlq m6, 16476 jne .loop
472 paddw m6, m5477 HADDW m4, m5
473 movd eax, m6478 movd eax, m4
474 and eax, 0xffff479 and eax, 0xffff
475 RET480 RET
481%endmacro
476 482
477INIT_MMX mmx483INIT_MMX mmx
484PIX_SUM16 0, 16
485INIT_XMM sse2
486PIX_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)
479cglobal pix_norm1, 2, 4489; %1 = number of xmm registers used
490; %2 = number of loops
491%macro PIX_NORM1 2
492cglobal pix_norm1, 2, 3, %1
480 movsxdifnidn r1, r1d493 movsxdifnidn r1, r1d
481 mov r2, 16494 mov r2, %2
482 pxor m0, m0495 pxor m0, m0
483 pxor m7, m7496 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, m2501%else
488 punpckhbw m1, m0502 mova m3, [r0+r1]
503%endif
504 punpckhbw m1, m2, m0
489 punpcklbw m2, m0505 punpcklbw m2, m0
490 mova m4, m3506 punpckhbw m4, m3, m0
491 punpckhbw m3, m0507 punpcklbw m3, m0
492 punpcklbw m4, m0
493 pmaddwd m1, m1508 pmaddwd m1, m1
494 pmaddwd m2, m2509 pmaddwd m2, m2
495 pmaddwd m3, m3510 pmaddwd m3, m3
496 pmaddwd m4, m4511 pmaddwd m4, m4
497 paddd m2, m1512 paddd m2, m1
498 paddd m4, m3513 paddd m4, m3
499 paddd m7, m2514 paddd m5, m2
515 paddd m5, m4
516%if mmsize == 8
500 add r0, r1517 add r0, r1
501 paddd m7, m4518%else
519 lea r0, [r0+r1*2]
520%endif
502 dec r2521 dec r2
503 jne .loop522 jne .loop
504 mova m1, m7523 HADDD m5, m1
505 psrlq m7, 32524 movd eax, m5
506 paddd m1, m7
507 movd eax, m1
508 RET525 RET
526%endmacro
527
528INIT_MMX mmx
529PIX_NORM1 0, 16
530INIT_XMM sse2
531PIX_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)
libavcodec/x86/dsputilenc_mmx.c+4−0
@@ -38,7 +38,9 @@ void ff_diff_pixels_mmx(int16_t *block, const uint8_t *s1, const uint8_t *s2, · 37 unmodified lines
38void ff_diff_pixels_sse2(int16_t *block, const uint8_t *s1, const uint8_t *s2,38void ff_diff_pixels_sse2(int16_t *block, const uint8_t *s1, const uint8_t *s2,
39 int stride);39 int stride);
40int ff_pix_sum16_mmx(uint8_t *pix, int line_size);40int ff_pix_sum16_mmx(uint8_t *pix, int line_size);
41int ff_pix_sum16_sse2(uint8_t *pix, int line_size);
41int ff_pix_norm1_mmx(uint8_t *pix, int line_size);42int ff_pix_norm1_mmx(uint8_t *pix, int line_size);
43int ff_pix_norm1_sse2(uint8_t *pix, int line_size);
42int ff_sum_abs_dctelem_mmx(int16_t *block);44int ff_sum_abs_dctelem_mmx(int16_t *block);
43int ff_sum_abs_dctelem_mmxext(int16_t *block);45int ff_sum_abs_dctelem_mmxext(int16_t *block);
44int ff_sum_abs_dctelem_sse2(int16_t *block);46int 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_STACK914#if HAVE_ALIGNED_STACK
911 c->hadamard8_diff[0] = ff_hadamard8_diff16_sse2;915 c->hadamard8_diff[0] = ff_hadamard8_diff16_sse2;
libavutil/x86/x86util.asm+5−0
@@ -288,7 +288,12 @@ · 287 unmodified lines
288 paddd %1, %2288 paddd %1, %2
289%endif289%endif
290%if notcpuflag(xop) || sizeof%1 != 16290%if notcpuflag(xop) || sizeof%1 != 16
291%if cpuflag(mmxext)
291 PSHUFLW %2, %1, q0032292 PSHUFLW %2, %1, q0032
293%else ; mmx
294 mova %2, %1
295 psrlq %2, 32
296%endif
292 paddd %1, %2297 paddd %1, %2
293%endif298%endif
294%undef %1299%undef %1

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t