avcodec/huffyuvdspenc : reorganize diff_int16
[ffmpeg.git] / libavcodec / x86 / huffyuvencdsp.asm
1 ;************************************************************************
2 ;* SIMD-optimized HuffYUV encoding functions
3 ;* Copyright (c) 2000, 2001 Fabrice Bellard
4 ;* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5 ;*
6 ;* MMX optimization by Nick Kurshev <nickols_k@mail.ru>
7 ;* Conversion to NASM format by Tiancheng "Timothy" Gu <timothygu99@gmail.com>
8 ;*
9 ;* This file is part of FFmpeg.
10 ;*
11 ;* FFmpeg is free software; you can redistribute it and/or
12 ;* modify it under the terms of the GNU Lesser General Public
13 ;* License as published by the Free Software Foundation; either
14 ;* version 2.1 of the License, or (at your option) any later version.
15 ;*
16 ;* FFmpeg is distributed in the hope that it will be useful,
17 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19 ;* Lesser General Public License for more details.
20 ;*
21 ;* You should have received a copy of the GNU Lesser General Public
22 ;* License along with FFmpeg; if not, write to the Free Software
23 ;* 51, Inc., Foundation Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 ;******************************************************************************
25
26 %include "libavutil/x86/x86util.asm"
27
28 SECTION .text
29
30 %include "libavcodec/x86/huffyuvdsp_template.asm"
31
32 ;------------------------------------------------------------------------------
33 ; void ff_diff_int16(uint8_t *dst, const uint8_t *src1, const uint8_t *src2,
34 ;                    unsigned mask, int w);
35 ;------------------------------------------------------------------------------
36
37 %macro DIFF_INT16 0
38 cglobal diff_int16, 5,5,5, dst, src1, src2, mask, w, tmp
39 %if mmsize > 8
40     test src1q, mmsize-1
41     jnz .unaligned
42     test src2q, mmsize-1
43     jnz .unaligned
44     test dstq, mmsize-1
45     jnz .unaligned
46 %endif
47     INT16_LOOP a, sub
48 %if mmsize > 8
49 .unaligned:
50     INT16_LOOP u, sub
51 %endif
52 %endmacro
53
54 %if ARCH_X86_32
55 INIT_MMX mmx
56 DIFF_INT16
57 %endif
58
59 INIT_XMM sse2
60 DIFF_INT16
61
62
63 INIT_MMX mmxext
64 cglobal sub_hfyu_median_pred_int16, 7,7,0, dst, src1, src2, mask, w, left, left_top
65     add      wd, wd
66     movd    mm7, maskd
67     SPLATW  mm7, mm7
68     movq    mm0, [src1q]
69     movq    mm2, [src2q]
70     psllq   mm0, 16
71     psllq   mm2, 16
72     movd    mm6, [left_topq]
73     por     mm0, mm6
74     movd    mm6, [leftq]
75     por     mm2, mm6
76     xor     maskq, maskq
77 .loop:
78     movq    mm1, [src1q + maskq]
79     movq    mm3, [src2q + maskq]
80     movq    mm4, mm2
81     psubw   mm2, mm0
82     paddw   mm2, mm1
83     pand    mm2, mm7
84     movq    mm5, mm4
85     pmaxsw  mm4, mm1
86     pminsw  mm1, mm5
87     pminsw  mm4, mm2
88     pmaxsw  mm4, mm1
89     psubw   mm3, mm4
90     pand    mm3, mm7
91     movq    [dstq + maskq], mm3
92     add     maskq, 8
93     movq    mm0, [src1q + maskq - 2]
94     movq    mm2, [src2q + maskq - 2]
95     cmp     maskq, wq
96         jb .loop
97     movzx maskd, word [src1q + wq - 2]
98     mov [left_topq], maskd
99     movzx maskd, word [src2q + wq - 2]
100     mov [leftq], maskd
101     RET