diff options
author | Jason Garrett-Glaser <darkshikari@gmail.com> | 2010-07-23 06:02:52 +0000 |
---|---|---|
committer | Jason Garrett-Glaser <darkshikari@gmail.com> | 2010-07-23 06:02:52 +0000 |
commit | 3ae079a3c8be54cc3c9c7e68c8b2324f3a4e4253 (patch) | |
tree | 40ed03ae012a9e053643a2b1da000be0e1a32aa6 /libavcodec/x86/vp8dsp.asm | |
parent | 3df56f411810c665704518e0e9e083b02eaca573 (diff) | |
download | ffmpeg-3ae079a3c8be54cc3c9c7e68c8b2324f3a4e4253.tar.gz |
VP8: optimize DC-only chroma case in the same way as luma.
Add MMX idct_dc_add4uv function for this case.
~40% faster chroma idct.
Originally committed as revision 24455 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/x86/vp8dsp.asm')
-rw-r--r-- | libavcodec/x86/vp8dsp.asm | 47 |
1 files changed, 44 insertions, 3 deletions
diff --git a/libavcodec/x86/vp8dsp.asm b/libavcodec/x86/vp8dsp.asm index 70fe9d3bfe..4aa901e27f 100644 --- a/libavcodec/x86/vp8dsp.asm +++ b/libavcodec/x86/vp8dsp.asm @@ -976,11 +976,11 @@ cglobal vp8_idct_dc_add_sse4, 3, 3, 6 RET ;----------------------------------------------------------------------------- -; void vp8_idct_dc_add4_<opt>(uint8_t *dst, DCTELEM block[4][16], int stride); +; void vp8_idct_dc_add4y_<opt>(uint8_t *dst, DCTELEM block[4][16], int stride); ;----------------------------------------------------------------------------- INIT_MMX -cglobal vp8_idct_dc_add4_mmx, 3, 3 +cglobal vp8_idct_dc_add4y_mmx, 3, 3 ; load data movd m0, [r1+32*0] ; A movd m1, [r1+32*2] ; C @@ -1015,7 +1015,7 @@ cglobal vp8_idct_dc_add4_mmx, 3, 3 RET INIT_XMM -cglobal vp8_idct_dc_add4_sse2, 3, 3 +cglobal vp8_idct_dc_add4y_sse2, 3, 3, 6 ; load data movd m0, [r1+32*0] ; A movd m1, [r1+32*2] ; C @@ -1045,6 +1045,47 @@ cglobal vp8_idct_dc_add4_sse2, 3, 3 RET ;----------------------------------------------------------------------------- +; void vp8_idct_dc_add4uv_<opt>(uint8_t *dst, DCTELEM block[4][16], int stride); +;----------------------------------------------------------------------------- + +INIT_MMX +cglobal vp8_idct_dc_add4uv_mmx, 3, 3 + ; load data + movd m0, [r1+32*0] ; A + movd m1, [r1+32*2] ; C + punpcklwd m0, [r1+32*1] ; A B + punpcklwd m1, [r1+32*3] ; C D + punpckldq m0, m1 ; A B C D + pxor m6, m6 + + ; calculate DC + paddw m0, [pw_4] + movd [r1+32*0], m6 + movd [r1+32*1], m6 + movd [r1+32*2], m6 + movd [r1+32*3], m6 + psraw m0, 3 + psubw m6, m0 + packuswb m0, m0 + packuswb m6, m6 + punpcklbw m0, m0 ; AABBCCDD + punpcklbw m6, m6 ; AABBCCDD + movq m1, m0 + movq m7, m6 + punpcklbw m0, m0 ; AAAABBBB + punpckhbw m1, m1 ; CCCCDDDD + punpcklbw m6, m6 ; AAAABBBB + punpckhbw m7, m7 ; CCCCDDDD + + ; add DC + lea r1, [r0+r2*2] + ADD_DC m0, m6, 0, mova + lea r0, [r0+r2*4] + lea r1, [r1+r2*4] + ADD_DC m1, m7, 0, mova + RET + +;----------------------------------------------------------------------------- ; void vp8_idct_add_<opt>(uint8_t *dst, DCTELEM block[16], int stride); ;----------------------------------------------------------------------------- |