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
2323
2424 %include "libavutil/x86/x86util.asm"
2525
26+SECTION_RODATA
27+
28+cextern pw_1
29+
2630 SECTION .text
2731
2832 %macro DIFF_PIXELS_1 4
@@ -439,73 +443,92 @@ cglobal diff_pixels, 4, 5, 5 · 410 unmodified lines
439443 jne .loop
440444 RET
441445
442−INIT_MMX mmx
443446 ; 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
445451 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
452455 .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
461466 paddw m1, m0
462467 paddw m3, m2
463468 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
474479 and eax, 0xffff
475480 RET
481+%endmacro
476482
477483 INIT_MMX mmx
484+PIX_SUM16 0, 16
485+INIT_XMM sse2
486+PIX_SUM16 6, 8
487+
478488 ; 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
480493 movsxdifnidn r1, r1d
481− mov r2, 16
494+ mov r2, %2
482495 pxor m0, m0
483− pxor m7, m7
496+ pxor m5, m5
484497 .loop:
485498 mova m2, [r0+0]
499+%if mmsize == 8
486500 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
489505 punpcklbw m2, m0
490− mova m4, m3
491− punpckhbw m3, m0
492− punpcklbw m4, m0
506+ punpckhbw m4, m3, m0
507+ punpcklbw m3, m0
493508 pmaddwd m1, m1
494509 pmaddwd m2, m2
495510 pmaddwd m3, m3
496511 pmaddwd m4, m4
497512 paddd m2, m1
498513 paddd m4, m3
499− paddd m7, m2
514+ paddd m5, m2
515+ paddd m5, m4
516+%if mmsize == 8
500517 add r0, r1
501− paddd m7, m4
518+%else
519+ lea r0, [r0+r1*2]
520+%endif
502521 dec r2
503522 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
508525 RET
526+%endmacro
527+
528+INIT_MMX mmx
529+PIX_NORM1 0, 16
530+INIT_XMM sse2
531+PIX_NORM1 6, 8
509532
510533 ;-----------------------------------------------
511534 ;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
3838 void ff_diff_pixels_sse2(int16_t *block, const uint8_t *s1, const uint8_t *s2,
3939 int stride);
4040 int ff_pix_sum16_mmx(uint8_t *pix, int line_size);
41+int ff_pix_sum16_sse2(uint8_t *pix, int line_size);
4142 int ff_pix_norm1_mmx(uint8_t *pix, int line_size);
43+int ff_pix_norm1_sse2(uint8_t *pix, int line_size);
4244 int ff_sum_abs_dctelem_mmx(int16_t *block);
4345 int ff_sum_abs_dctelem_mmxext(int16_t *block);
4446 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
906908 c->sse[0] = ff_sse16_sse2;
907909 c->sum_abs_dctelem = ff_sum_abs_dctelem_sse2;
908910 c->diff_pixels = ff_diff_pixels_sse2;
911+ c->pix_sum = ff_pix_sum16_sse2;
912+ c->pix_norm1 = ff_pix_norm1_sse2;
909913
910914 #if HAVE_ALIGNED_STACK
911915 c->hadamard8_diff[0] = ff_hadamard8_diff16_sse2;
libavutil/x86/x86util.asm+5−0
@@ -288,7 +288,12 @@ · 287 unmodified lines
288288 paddd %1, %2
289289 %endif
290290 %if notcpuflag(xop) || sizeof%1 != 16
291+%if cpuflag(mmxext)
291292 PSHUFLW %2, %1, q0032
293+%else ; mmx
294+ mova %2, %1
295+ psrlq %2, 32
296+%endif
292297 paddd %1, %2
293298 %endif
294299 %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