mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2026-11-06 05:17:42 +00:00
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:
1 parent
950a96bd25
commit
cb98f5c3df
4 files changed
+16
-16
No files matched your search
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user