Merge commit '740b0bf03b4bb8b0a0e964750817ac0363a33c55'
[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 ; void ff_diff_int16(uint8_t *dst, const uint8_t *src1, const uint8_t *src2,
31 ;                    unsigned mask, int w);
32 %macro INT16_LOOP 2 ; %1 = a/u (aligned/unaligned), %2 = add/sub
33     movd    m4, maskd
34     SPLATW  m4, m4
35     add     wd, wd
36     test    wq, 2*mmsize - 1
37     jz %%.tomainloop
38     push  tmpq
39 %%.wordloop:
40     sub     wq, 2
41 %ifidn %2, add
42     mov   tmpw, [srcq+wq]
43     add   tmpw, [dstq+wq]
44 %else
45     mov   tmpw, [src1q+wq]
46     sub   tmpw, [src2q+wq]
47 %endif
48     and   tmpw, maskw
49     mov     [dstq+wq], tmpw
50     test    wq, 2*mmsize - 1
51     jnz %%.wordloop
52     pop   tmpq
53 %%.tomainloop:
54 %ifidn %2, add
55     add     srcq, wq
56 %else
57     add     src1q, wq
58     add     src2q, wq
59 %endif
60     add     dstq, wq
61     neg     wq
62     jz      %%.end
63 %%.loop:
64 %ifidn %2, add
65     mov%1   m0, [srcq+wq]
66     mov%1   m1, [dstq+wq]
67     mov%1   m2, [srcq+wq+mmsize]
68     mov%1   m3, [dstq+wq+mmsize]
69 %else
70     mov%1   m0, [src1q+wq]
71     mov%1   m1, [src2q+wq]
72     mov%1   m2, [src1q+wq+mmsize]
73     mov%1   m3, [src2q+wq+mmsize]
74 %endif
75     p%2w    m0, m1
76     p%2w    m2, m3
77     pand    m0, m4
78     pand    m2, m4
79     mov%1   [dstq+wq]       , m0
80     mov%1   [dstq+wq+mmsize], m2
81     add     wq, 2*mmsize
82     jl %%.loop
83 %%.end:
84     RET
85 %endmacro
86
87 %if ARCH_X86_32
88 INIT_MMX mmx
89 cglobal diff_int16, 5,5,5, dst, src1, src2, mask, w, tmp
90     INT16_LOOP a, sub
91 %endif
92
93 INIT_XMM sse2
94 cglobal diff_int16, 5,5,5, dst, src1, src2, mask, w, tmp
95     test src1q, mmsize-1
96     jnz .unaligned
97     test src2q, mmsize-1
98     jnz .unaligned
99     test dstq, mmsize-1
100     jnz .unaligned
101     INT16_LOOP a, sub
102 .unaligned:
103     INT16_LOOP u, sub
104
105 INIT_MMX mmxext
106 cglobal sub_hfyu_median_pred_int16, 7,7,0, dst, src1, src2, mask, w, left, left_top
107     add      wd, wd
108     movd    mm7, maskd
109     SPLATW  mm7, mm7
110     movq    mm0, [src1q]
111     movq    mm2, [src2q]
112     psllq   mm0, 16
113     psllq   mm2, 16
114     movd    mm6, [left_topq]
115     por     mm0, mm6
116     movd    mm6, [leftq]
117     por     mm2, mm6
118     xor     maskq, maskq
119 .loop:
120     movq    mm1, [src1q + maskq]
121     movq    mm3, [src2q + maskq]
122     movq    mm4, mm2
123     psubw   mm2, mm0
124     paddw   mm2, mm1
125     pand    mm2, mm7
126     movq    mm5, mm4
127     pmaxsw  mm4, mm1
128     pminsw  mm1, mm5
129     pminsw  mm4, mm2
130     pmaxsw  mm4, mm1
131     psubw   mm3, mm4
132     pand    mm3, mm7
133     movq    [dstq + maskq], mm3
134     add     maskq, 8
135     movq    mm0, [src1q + maskq - 2]
136     movq    mm2, [src2q + maskq - 2]
137     cmp     maskq, wq
138         jb .loop
139     movzx maskd, word [src1q + wq - 2]
140     mov [left_topq], maskd
141     movzx maskd, word [src2q + wq - 2]
142     mov [leftq], maskd
143     RET