From 17dc7c7a60798d3e1f78bad97423fb49c8dc1c1d Mon Sep 17 00:00:00 2001 From: Jason Garrett-Glaser Date: Thu, 1 Jul 2010 10:29:47 +0000 Subject: [PATCH] Fix h264/vp8 intra pred on Athlon XP Whose idea was it to have a CPU that didn't SIGILL on an invalid instruction? Originally committed as revision 23927 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/x86/h264_intrapred.asm | 29 ++++++++++++----------------- libavcodec/x86/h264dsp_mmx.c | 2 -- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/libavcodec/x86/h264_intrapred.asm b/libavcodec/x86/h264_intrapred.asm index d53b3d7f46..d36ecfb890 100644 --- a/libavcodec/x86/h264_intrapred.asm +++ b/libavcodec/x86/h264_intrapred.asm @@ -115,7 +115,7 @@ PRED16x16_H ssse3 ; void pred16x16_dc(uint8_t *src, int stride) ;----------------------------------------------------------------------------- -%macro PRED16x16_DC 2 +%macro PRED16x16_DC 1 cglobal pred16x16_dc_%1, 2,7 mov r4, r0 sub r0, r1 @@ -143,10 +143,6 @@ cglobal pred16x16_dc_%1, 2,7 movd m0, r2d punpcklbw m0, m0 pshufw m0, m0, 0 -%elifidn %1, sse - imul r2d, 0x01010101 - movd m0, r2d - shufps m0, m0, 0 %elifidn %1, sse2 movd m0, r2d punpcklbw m0, m0 @@ -161,18 +157,18 @@ cglobal pred16x16_dc_%1, 2,7 %if mmsize==8 mov r3d, 8 .loop: - %2 [r4+r1*0+0], m0 - %2 [r4+r1*0+8], m0 - %2 [r4+r1*1+0], m0 - %2 [r4+r1*1+8], m0 + mova [r4+r1*0+0], m0 + mova [r4+r1*0+8], m0 + mova [r4+r1*1+0], m0 + mova [r4+r1*1+8], m0 %else mov r3d, 4 .loop: - %2 [r4+r1*0], m0 - %2 [r4+r1*1], m0 + mova [r4+r1*0], m0 + mova [r4+r1*1], m0 lea r4, [r4+r1*2] - %2 [r4+r1*0], m0 - %2 [r4+r1*1], m0 + mova [r4+r1*0], m0 + mova [r4+r1*1], m0 %endif lea r4, [r4+r1*2] dec r3d @@ -181,11 +177,10 @@ cglobal pred16x16_dc_%1, 2,7 %endmacro INIT_MMX -PRED16x16_DC mmxext, movq +PRED16x16_DC mmxext INIT_XMM -PRED16x16_DC sse, movaps -PRED16x16_DC sse2, movdqa -PRED16x16_DC ssse3, movdqa +PRED16x16_DC sse2 +PRED16x16_DC ssse3 ;----------------------------------------------------------------------------- ; void pred16x16_tm_vp8(uint8_t *src, int stride) diff --git a/libavcodec/x86/h264dsp_mmx.c b/libavcodec/x86/h264dsp_mmx.c index 3c3eab0847..b9d2c32346 100644 --- a/libavcodec/x86/h264dsp_mmx.c +++ b/libavcodec/x86/h264dsp_mmx.c @@ -2329,7 +2329,6 @@ void ff_pred16x16_horizontal_mmx (uint8_t *src, int stride); void ff_pred16x16_horizontal_mmxext(uint8_t *src, int stride); void ff_pred16x16_horizontal_ssse3 (uint8_t *src, int stride); void ff_pred16x16_dc_mmxext (uint8_t *src, int stride); -void ff_pred16x16_dc_sse (uint8_t *src, int stride); void ff_pred16x16_dc_sse2 (uint8_t *src, int stride); void ff_pred16x16_dc_ssse3 (uint8_t *src, int stride); void ff_pred16x16_tm_vp8_mmx (uint8_t *src, int stride); @@ -2384,7 +2383,6 @@ void ff_h264_pred_init_x86(H264PredContext *h, int codec_id) if (mm_flags & FF_MM_SSE) { h->pred16x16[VERT_PRED8x8] = ff_pred16x16_vertical_sse; - h->pred16x16[DC_PRED8x8 ] = ff_pred16x16_dc_sse; } if (mm_flags & FF_MM_SSE2) {