]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/lossless_videodsp.asm
Merge commit '7597e6efe492cb2449bb771054d64cc7fdf62ff5'
[ffmpeg] / libavcodec / x86 / lossless_videodsp.asm
1 ;******************************************************************************
2 ;* SIMD lossless video DSP utils
3 ;* Copyright (c) 2008 Loren Merritt
4 ;* Copyright (c) 2014 Michael Niedermayer
5 ;*
6 ;* This file is part of FFmpeg.
7 ;*
8 ;* FFmpeg is free software; you can redistribute it and/or
9 ;* modify it under the terms of the GNU Lesser General Public
10 ;* License as published by the Free Software Foundation; either
11 ;* version 2.1 of the License, or (at your option) any later version.
12 ;*
13 ;* FFmpeg is distributed in the hope that it will be useful,
14 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 ;* Lesser General Public License for more details.
17 ;*
18 ;* You should have received a copy of the GNU Lesser General Public
19 ;* License along with FFmpeg; if not, write to the Free Software
20 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 ;******************************************************************************
22
23 %include "libavutil/x86/x86util.asm"
24
25 SECTION_RODATA
26
27 pb_ef: times 8 db 14,15
28 pb_67: times 8 db  6, 7
29 pb_zzzz2323zzzzabab: db -1,-1,-1,-1, 2, 3, 2, 3,-1,-1,-1,-1,10,11,10,11
30 pb_zzzzzzzz67676767: db -1,-1,-1,-1,-1,-1,-1,-1, 6, 7, 6, 7, 6, 7, 6, 7
31
32 SECTION_TEXT
33
34 %macro ADD_INT16_LOOP 1 ; %1 = is_aligned
35     movd      m4, maskd
36     SPLATW  m4, m4
37     add     wq, wq
38     test    wq, 2*mmsize - 1
39     jz %%.tomainloop
40 %%.wordloop:
41     sub     wq, 2
42     mov     ax, [srcq+wq]
43     add     ax, [dstq+wq]
44     and     ax, maskw
45     mov     [dstq+wq], ax
46     test    wq, 2*mmsize - 1
47     jnz %%.wordloop
48 %%.tomainloop:
49     add     srcq, wq
50     add     dstq, wq
51     neg     wq
52     jz      %%.end
53 %%.loop:
54 %if %1
55     mova    m0, [srcq+wq]
56     mova    m1, [dstq+wq]
57     mova    m2, [srcq+wq+mmsize]
58     mova    m3, [dstq+wq+mmsize]
59 %else
60     movu    m0, [srcq+wq]
61     movu    m1, [dstq+wq]
62     movu    m2, [srcq+wq+mmsize]
63     movu    m3, [dstq+wq+mmsize]
64 %endif
65     paddw   m0, m1
66     paddw   m2, m3
67     pand    m0, m4
68     pand    m2, m4
69 %if %1
70     mova    [dstq+wq]       , m0
71     mova    [dstq+wq+mmsize], m2
72 %else
73     movu    [dstq+wq]       , m0
74     movu    [dstq+wq+mmsize], m2
75 %endif
76     add     wq, 2*mmsize
77     jl %%.loop
78 %%.end:
79     RET
80 %endmacro
81
82 INIT_MMX mmx
83 cglobal add_int16, 4,4,5, dst, src, mask, w
84     ADD_INT16_LOOP 1
85
86 INIT_XMM sse2
87 cglobal add_int16, 4,4,5, dst, src, mask, w
88     test srcq, mmsize-1
89     jnz .unaligned
90     test dstq, mmsize-1
91     jnz .unaligned
92     ADD_INT16_LOOP 1
93 .unaligned:
94     ADD_INT16_LOOP 0
95
96 %macro ADD_HFYU_LEFT_LOOP_INT16 2 ; %1 = dst_is_aligned, %2 = src_is_aligned
97     add     wq, wq
98     add     srcq, wq
99     add     dstq, wq
100     neg     wq
101 %%.loop:
102 %if %2
103     mova    m1, [srcq+wq]
104 %else
105     movu    m1, [srcq+wq]
106 %endif
107     mova    m2, m1
108     pslld   m1, 16
109     paddw   m1, m2
110     mova    m2, m1
111
112     pshufb  m1, m3
113     paddw   m1, m2
114     pshufb  m0, m5
115 %if mmsize == 16
116     mova    m2, m1
117     pshufb  m1, m4
118     paddw   m1, m2
119 %endif
120     paddw   m0, m1
121     pand    m0, m7
122 %if %1
123     mova    [dstq+wq], m0
124 %else
125     movq    [dstq+wq], m0
126     movhps  [dstq+wq+8], m0
127 %endif
128     add     wq, mmsize
129     jl %%.loop
130     mov     eax, mmsize-1
131     sub     eax, wd
132     mov     wd, eax
133     shl     wd, 8
134     lea     eax, [wd+eax-1]
135     movd    m1, eax
136     pshufb  m0, m1
137     movd    eax, m0
138     RET
139 %endmacro
140
141 ; int add_hfyu_left_prediction_int16(uint16_t *dst, const uint16_t *src, unsigned mask, int w, int left)
142 INIT_MMX ssse3
143 cglobal add_hfyu_left_prediction_int16, 4,4,8, dst, src, mask, w, left
144 .skip_prologue:
145     mova    m5, [pb_67]
146     mova    m3, [pb_zzzz2323zzzzabab]
147     movd    m0, leftm
148     psllq   m0, 48
149     movd    m7, maskm
150     SPLATW  m7 ,m7
151     ADD_HFYU_LEFT_LOOP_INT16 1, 1
152
153 INIT_XMM sse4
154 cglobal add_hfyu_left_prediction_int16, 4,4,8, dst, src, mask, w, left
155     mova    m5, [pb_ef]
156     mova    m4, [pb_zzzzzzzz67676767]
157     mova    m3, [pb_zzzz2323zzzzabab]
158     movd    m0, leftm
159     pslldq  m0, 14
160     movd    m7, maskm
161     SPLATW  m7 ,m7
162     test    srcq, 15
163     jnz .src_unaligned
164     test    dstq, 15
165     jnz .dst_unaligned
166     ADD_HFYU_LEFT_LOOP_INT16 1, 1
167 .dst_unaligned:
168     ADD_HFYU_LEFT_LOOP_INT16 0, 1
169 .src_unaligned:
170     ADD_HFYU_LEFT_LOOP_INT16 0, 0