avcodec/x86/hevc/add_res: Replace MMX with SSE2

Convert hevc_add_residual_4_10 to use SSE2 and remove declare_func_emms
in test code.

  hevc_add_res_4x4_10_c:          21.7
  hevc_add_res_4x4_10_mmxext:      9.4 ( 2.31x)
  hevc_add_res_4x4_10_sse2:        9.2 ( 2.35x)

Signed-off-by: Zuxy Meng <zuxy.meng@gmail.com>
This commit is contained in:
Zuxy Meng committed 2026-08-14 17:43:17 -07:00
1 parent 950a96bd25
commit cb98f5c3df
4 files changed
+16 -16

No files matched your search

+13 -11
View File
@@ -191,15 +191,17 @@ cglobal hevc_add_residual_32_8, 3, 5, 7
mova [%1+%3], m3
%endmacro
%macro ADD_RES_MMX_4_10 3
mova m0, [%1+0]
mova m1, [%1+%2]
paddw m0, [%3]
paddw m1, [%3+8]
%macro ADD_RES_SSE_4_10 3
movq m0, [%1+0]
movq m4, [%3]
paddw m0, m4
movq m1, [%1+%2]
movq m4, [%3+8]
paddw m1, m4
CLIPW m0, m2, m3
CLIPW m1, m2, m3
mova [%1+0], m0
mova [%1+%2], m1
movq [%1+0], m0
movq [%1+%2], m1
%endmacro
%macro ADD_RES_SSE_16_10 3
@@ -284,13 +286,13 @@ cglobal hevc_add_residual_32_8, 3, 5, 7
%endmacro
; void ff_hevc_add_residual_<4|8|16|32>_10(pixel *dst, const int16_t *block, ptrdiff_t stride)
INIT_MMX mmxext
INIT_XMM sse2
cglobal hevc_add_residual_4_10, 3, 3, 6
pxor m2, m2
mova m3, [max_pixels_10]
ADD_RES_MMX_4_10 r0, r2, r1
movq m3, [max_pixels_10]
ADD_RES_SSE_4_10 r0, r2, r1
lea r0, [r0+2*r2]
ADD_RES_MMX_4_10 r0, r2, r1+16
ADD_RES_SSE_4_10 r0, r2, r1+16
RET
INIT_XMM sse2
+1 -1
View File
@@ -174,7 +174,7 @@ void ff_hevc_add_residual_32_8_sse2(uint8_t *dst, const int16_t *res, ptrdiff_t
void ff_hevc_add_residual_32_8_avx2(uint8_t *dst, const int16_t *res, ptrdiff_t stride);
void ff_hevc_add_residual_4_10_mmxext(uint8_t *dst, const int16_t *res, ptrdiff_t stride);
void ff_hevc_add_residual_4_10_sse2(uint8_t *dst, const int16_t *res, ptrdiff_t stride);
void ff_hevc_add_residual_8_10_sse2(uint8_t *dst, const int16_t *res, ptrdiff_t stride);
void ff_hevc_add_residual_16_10_sse2(uint8_t *dst, const int16_t *res, ptrdiff_t stride);
void ff_hevc_add_residual_32_10_sse2(uint8_t *dst, const int16_t *res, ptrdiff_t stride);
+1 -3
View File
@@ -1002,9 +1002,6 @@ void ff_hevc_dsp_init_x86(HEVCDSPContext *c, const int bit_depth)
}
#endif
} else if (bit_depth == 10) {
if (EXTERNAL_MMXEXT(cpu_flags)) {
c->add_residual[0] = ff_hevc_add_residual_4_10_mmxext;
}
if (EXTERNAL_SSE2(cpu_flags)) {
c->hevc_v_loop_filter_chroma = ff_hevc_v_loop_filter_chroma_10_sse2;
c->hevc_h_loop_filter_chroma = ff_hevc_h_loop_filter_chroma_10_sse2;
@@ -1027,6 +1024,7 @@ void ff_hevc_dsp_init_x86(HEVCDSPContext *c, const int bit_depth)
c->idct[1] = ff_hevc_idct_8x8_10_sse2;
c->transform_4x4_luma = ff_hevc_transform_4x4_luma_10_sse2;
c->add_residual[0] = ff_hevc_add_residual_4_10_sse2;
c->add_residual[1] = ff_hevc_add_residual_8_10_sse2;
c->add_residual[2] = ff_hevc_add_residual_16_10_sse2;
c->add_residual[3] = ff_hevc_add_residual_32_10_sse2;
+1 -1
View File
@@ -50,7 +50,7 @@ static void compare_add_res(int size, ptrdiff_t stride, int overflow_test, int m
LOCAL_ALIGNED_32(uint8_t, dst0, [32 * 32 * 2]);
LOCAL_ALIGNED_32(uint8_t, dst1, [32 * 32 * 2]);
declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *dst, const int16_t *res, ptrdiff_t stride);
declare_func(void, uint8_t *dst, const int16_t *res, ptrdiff_t stride);
randomize_buffers(res0, size);
randomize_buffers2(dst0, size, mask);