H.264: Add optimizations to predict x86 assembly.

Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
pull/2/head
Daniel Kang 14 years ago committed by Ronald S. Bultje
parent 505345ed5d
commit 406fbd24dc
  1. 5
      libavcodec/x86/h264_intrapred.asm
  2. 1117
      libavcodec/x86/h264_intrapred_10bit.asm
  3. 29
      libavcodec/x86/h264_intrapred_init.c

@ -2611,12 +2611,11 @@ cglobal pred4x4_down_left_mmxext, 3,3
punpckldq m1, [r1] punpckldq m1, [r1]
movq m2, m1 movq m2, m1
movq m3, m1 movq m3, m1
movq m4, m1
psllq m1, 8 psllq m1, 8
pxor m2, m1 pxor m2, m1
psrlq m2, 8 psrlq m2, 8
pxor m3, m2 pxor m2, m3
PRED4x4_LOWPASS m0, m1, m3, m4, m5 PRED4x4_LOWPASS m0, m1, m2, m3, m4
lea r1, [r0+r2*2] lea r1, [r0+r2*2]
psrlq m0, 8 psrlq m0, 8
movd [r0+r2*1], m0 movd [r0+r2*1], m0

File diff suppressed because it is too large Load Diff

@ -45,7 +45,6 @@ void ff_pred8x8_ ## TYPE ## _ ## DEPTH ## _ ## OPT (uint8_t *src, int stride);
PRED8x8(dc, 10, mmxext) PRED8x8(dc, 10, mmxext)
PRED8x8(dc, 10, sse2) PRED8x8(dc, 10, sse2)
PRED8x8(top_dc, 10, mmxext)
PRED8x8(top_dc, 10, sse2) PRED8x8(top_dc, 10, sse2)
PRED8x8(plane, 10, sse2) PRED8x8(plane, 10, sse2)
PRED8x8(vertical, 10, sse2) PRED8x8(vertical, 10, sse2)
@ -55,23 +54,28 @@ PRED8x8(horizontal, 10, sse2)
void ff_pred8x8l_ ## TYPE ## _ ## DEPTH ## _ ## OPT (uint8_t *src, int has_topleft, int has_topright, int stride); void ff_pred8x8l_ ## TYPE ## _ ## DEPTH ## _ ## OPT (uint8_t *src, int has_topleft, int has_topright, int stride);
PRED8x8L(dc, 10, sse2) PRED8x8L(dc, 10, sse2)
PRED8x8L(dc, 10, ssse3) PRED8x8L(dc, 10, avx)
PRED8x8L(128_dc, 10, mmxext) PRED8x8L(128_dc, 10, mmxext)
PRED8x8L(128_dc, 10, sse2) PRED8x8L(128_dc, 10, sse2)
PRED8x8L(top_dc, 10, sse2) PRED8x8L(top_dc, 10, sse2)
PRED8x8L(top_dc, 10, ssse3) PRED8x8L(top_dc, 10, avx)
PRED8x8L(vertical, 10, sse2) PRED8x8L(vertical, 10, sse2)
PRED8x8L(vertical, 10, ssse3) PRED8x8L(vertical, 10, avx)
PRED8x8L(horizontal, 10, sse2) PRED8x8L(horizontal, 10, sse2)
PRED8x8L(horizontal, 10, ssse3) PRED8x8L(horizontal, 10, ssse3)
PRED8x8L(horizontal, 10, avx)
PRED8x8L(down_left, 10, sse2) PRED8x8L(down_left, 10, sse2)
PRED8x8L(down_left, 10, ssse3) PRED8x8L(down_left, 10, ssse3)
PRED8x8L(down_left, 10, avx)
PRED8x8L(down_right, 10, sse2) PRED8x8L(down_right, 10, sse2)
PRED8x8L(down_right, 10, ssse3) PRED8x8L(down_right, 10, ssse3)
PRED8x8L(down_right, 10, avx)
PRED8x8L(vertical_right, 10, sse2) PRED8x8L(vertical_right, 10, sse2)
PRED8x8L(vertical_right, 10, ssse3) PRED8x8L(vertical_right, 10, ssse3)
PRED8x8L(vertical_right, 10, avx)
PRED8x8L(horizontal_up, 10, sse2) PRED8x8L(horizontal_up, 10, sse2)
PRED8x8L(horizontal_up, 10, ssse3) PRED8x8L(horizontal_up, 10, ssse3)
PRED8x8L(horizontal_up, 10, avx)
#define PRED16x16(TYPE, DEPTH, OPT)\ #define PRED16x16(TYPE, DEPTH, OPT)\
void ff_pred16x16_ ## TYPE ## _ ## DEPTH ## _ ## OPT (uint8_t *src, int stride); void ff_pred16x16_ ## TYPE ## _ ## DEPTH ## _ ## OPT (uint8_t *src, int stride);
@ -298,7 +302,6 @@ void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth
h->pred4x4[HOR_UP_PRED ] = ff_pred4x4_horizontal_up_10_mmxext; h->pred4x4[HOR_UP_PRED ] = ff_pred4x4_horizontal_up_10_mmxext;
h->pred8x8[DC_PRED8x8 ] = ff_pred8x8_dc_10_mmxext; h->pred8x8[DC_PRED8x8 ] = ff_pred8x8_dc_10_mmxext;
h->pred8x8[TOP_DC_PRED8x8 ] = ff_pred8x8_top_dc_10_mmxext;
h->pred8x8l[DC_128_PRED ] = ff_pred8x8l_128_dc_10_mmxext; h->pred8x8l[DC_128_PRED ] = ff_pred8x8l_128_dc_10_mmxext;
@ -344,18 +347,28 @@ void ff_h264_pred_init_x86(H264PredContext *h, int codec_id, const int bit_depth
h->pred4x4[VERT_RIGHT_PRED ] = ff_pred4x4_vertical_right_10_ssse3; h->pred4x4[VERT_RIGHT_PRED ] = ff_pred4x4_vertical_right_10_ssse3;
h->pred4x4[HOR_DOWN_PRED ] = ff_pred4x4_horizontal_down_10_ssse3; h->pred4x4[HOR_DOWN_PRED ] = ff_pred4x4_horizontal_down_10_ssse3;
h->pred8x8l[VERT_PRED ] = ff_pred8x8l_vertical_10_ssse3;
h->pred8x8l[HOR_PRED ] = ff_pred8x8l_horizontal_10_ssse3; h->pred8x8l[HOR_PRED ] = ff_pred8x8l_horizontal_10_ssse3;
h->pred8x8l[DC_PRED ] = ff_pred8x8l_dc_10_ssse3;
h->pred8x8l[TOP_DC_PRED ] = ff_pred8x8l_top_dc_10_ssse3;
h->pred8x8l[DIAG_DOWN_LEFT_PRED ] = ff_pred8x8l_down_left_10_ssse3; h->pred8x8l[DIAG_DOWN_LEFT_PRED ] = ff_pred8x8l_down_left_10_ssse3;
h->pred8x8l[DIAG_DOWN_RIGHT_PRED] = ff_pred8x8l_down_right_10_ssse3;
h->pred8x8l[VERT_RIGHT_PRED ] = ff_pred8x8l_vertical_right_10_ssse3;
h->pred8x8l[HOR_UP_PRED ] = ff_pred8x8l_horizontal_up_10_ssse3;
} }
#if HAVE_AVX #if HAVE_AVX
if (mm_flags & AV_CPU_FLAG_AVX) { if (mm_flags & AV_CPU_FLAG_AVX) {
h->pred4x4[DIAG_DOWN_LEFT_PRED ] = ff_pred4x4_down_left_10_avx; h->pred4x4[DIAG_DOWN_LEFT_PRED ] = ff_pred4x4_down_left_10_avx;
h->pred4x4[DIAG_DOWN_RIGHT_PRED] = ff_pred4x4_down_right_10_avx; h->pred4x4[DIAG_DOWN_RIGHT_PRED] = ff_pred4x4_down_right_10_avx;
h->pred4x4[VERT_LEFT_PRED ] = ff_pred4x4_vertical_left_10_avx;
h->pred4x4[VERT_RIGHT_PRED ] = ff_pred4x4_vertical_right_10_avx; h->pred4x4[VERT_RIGHT_PRED ] = ff_pred4x4_vertical_right_10_avx;
h->pred4x4[HOR_DOWN_PRED ] = ff_pred4x4_horizontal_down_10_avx; h->pred4x4[HOR_DOWN_PRED ] = ff_pred4x4_horizontal_down_10_avx;
h->pred8x8l[VERT_PRED ] = ff_pred8x8l_vertical_10_avx;
h->pred8x8l[HOR_PRED ] = ff_pred8x8l_horizontal_10_avx;
h->pred8x8l[DC_PRED ] = ff_pred8x8l_dc_10_avx;
h->pred8x8l[TOP_DC_PRED ] = ff_pred8x8l_top_dc_10_avx;
h->pred8x8l[DIAG_DOWN_RIGHT_PRED] = ff_pred8x8l_down_right_10_avx;
h->pred8x8l[DIAG_DOWN_LEFT_PRED ] = ff_pred8x8l_down_left_10_avx;
h->pred8x8l[VERT_RIGHT_PRED ] = ff_pred8x8l_vertical_right_10_avx;
h->pred8x8l[HOR_UP_PRED ] = ff_pred8x8l_horizontal_up_10_avx;
} }
#endif /* HAVE_AVX */ #endif /* HAVE_AVX */
} }

Loading…
Cancel
Save