avcodec/x86/h264_intrapred: SSE2 impl. of pred8x8l_top_dc_8

Deprecate MMX with less instruction count. Remove the SSSE3 impl. as we
no longer use palignr.

pred8x8l_top_dc_8_mmxext:                                8.7 ( 2.29x)
pred8x8l_top_dc_8_ssse3:                                 7.9 ( 2.51x)
pred8x8l_top_dc_8_sse2:                                  6.7 ( 3.01x)

Signed-off-by: Zuxy Meng <zuxy.meng@gmail.com>
This commit is contained in:
Zuxy Meng
2026-04-21 20:43:03 -07:00
committed by kierank
parent f16c3cc5aa
commit 34dfa8bf2b
2 changed files with 32 additions and 48 deletions

View File

@@ -805,57 +805,43 @@ cglobal pred8x8_tm_vp8_8, 2,3,6
; void ff_pred8x8l_top_dc_8(uint8_t *src, int has_topleft, int has_topright,
; ptrdiff_t stride)
;-----------------------------------------------------------------------------
%macro PRED8x8L_TOP_DC 0
cglobal pred8x8l_top_dc_8, 4,4
INIT_XMM sse2
cglobal pred8x8l_top_dc_8, 4,4,6
sub r0, r3
pxor mm7, mm7
movq mm0, [r0-8]
movq mm3, [r0]
movq mm1, [r0+8]
movq mm2, mm3
movq mm4, mm3
PALIGNR mm2, mm0, 7, mm0
PALIGNR mm1, mm4, 1, mm4
movu m2, [r0-8]
movu m3, [r0]
mova m1, m3
psrldq m2, 7
psrldq m1, 1
test r1d, r1d ; top_left
jz .fix_lt_2
jnz .has_topleft
pxor m5, m3, m2
psllq m5, 56
psrlq m5, 56
pxor m2, m5
.has_topleft:
test r2d, r2d ; top_right
jz .fix_tr_1
jmp .body
.fix_lt_2:
movq mm5, mm3
pxor mm5, mm2
psllq mm5, 56
psrlq mm5, 56
pxor mm2, mm5
test r2d, r2d ; top_right
jnz .body
.fix_tr_1:
movq mm5, mm3
pxor mm5, mm1
psrlq mm5, 56
psllq mm5, 56
pxor mm1, mm5
.body:
PRED4x4_LOWPASS mm0, mm2, mm1, mm3, mm5
psadbw mm7, mm0
paddw mm7, [pw_4]
psrlw mm7, 3
pshufw mm7, mm7, 0
packuswb mm7, mm7
jnz .has_topright
pxor m5, m3, m1
psrlq m5, 56
psllq m5, 56
pxor m1, m5
.has_topright:
pxor m4, m4
PRED4x4_LOWPASS m0, m2, m1, m3, m5
psadbw m4, m0
paddw m4, [pw_4]
psrlw m4, 3
SPLATW m4, m4, 0
packuswb m4, m4
%rep 3
movq [r0+r3*1], mm7
movq [r0+r3*2], mm7
movq [r0+r3*1], m4
movq [r0+r3*2], m4
lea r0, [r0+r3*2]
%endrep
movq [r0+r3*1], mm7
movq [r0+r3*2], mm7
movq [r0+r3*1], m4
movq [r0+r3*2], m4
RET
%endmacro
INIT_MMX mmxext
PRED8x8L_TOP_DC
INIT_MMX ssse3
PRED8x8L_TOP_DC
;-----------------------------------------------------------------------------
; void ff_pred8x8l_dc_8(uint8_t *src, int has_topleft, int has_topright,

View File

@@ -124,8 +124,7 @@ PRED8x8(plane, 8, ssse3)
PRED8x8(tm_vp8, 8, sse2)
PRED8x8(tm_vp8, 8, ssse3)
PRED8x8L(top_dc, 8, mmxext)
PRED8x8L(top_dc, 8, ssse3)
PRED8x8L(top_dc, 8, sse2)
PRED8x8L(dc, 8, mmxext)
PRED8x8L(dc, 8, ssse3)
PRED8x8L(horizontal, 8, mmxext)
@@ -164,7 +163,6 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int codec_id,
if (bit_depth == 8) {
if (EXTERNAL_MMXEXT(cpu_flags)) {
h->pred8x8l [TOP_DC_PRED ] = ff_pred8x8l_top_dc_8_mmxext;
h->pred8x8l [DC_PRED ] = ff_pred8x8l_dc_8_mmxext;
h->pred8x8l [HOR_PRED ] = ff_pred8x8l_horizontal_8_mmxext;
h->pred8x8l [VERT_PRED ] = ff_pred8x8l_vertical_8_mmxext;
@@ -197,6 +195,7 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int codec_id,
if (EXTERNAL_SSE2(cpu_flags)) {
h->pred16x16[HOR_PRED8x8 ] = ff_pred16x16_horizontal_8_sse2;
h->pred16x16[DC_PRED8x8 ] = ff_pred16x16_dc_8_sse2;
h->pred8x8l [TOP_DC_PRED ] = ff_pred8x8l_top_dc_8_sse2;
h->pred8x8l [DIAG_DOWN_LEFT_PRED ] = ff_pred8x8l_down_left_8_sse2;
h->pred8x8l [DIAG_DOWN_RIGHT_PRED ] = ff_pred8x8l_down_right_8_sse2;
h->pred8x8l [VERT_RIGHT_PRED ] = ff_pred8x8l_vertical_right_8_sse2;
@@ -231,7 +230,6 @@ av_cold void ff_h264_pred_init_x86(H264PredContext *h, int codec_id,
h->pred16x16[DC_PRED8x8 ] = ff_pred16x16_dc_8_ssse3;
if (chroma_format_idc <= 1)
h->pred8x8 [HOR_PRED8x8 ] = ff_pred8x8_horizontal_8_ssse3;
h->pred8x8l [TOP_DC_PRED ] = ff_pred8x8l_top_dc_8_ssse3;
h->pred8x8l [DC_PRED ] = ff_pred8x8l_dc_8_ssse3;
h->pred8x8l [HOR_PRED ] = ff_pred8x8l_horizontal_8_ssse3;
h->pred8x8l [VERT_PRED ] = ff_pred8x8l_vertical_8_ssse3;