x86: h264qpel: int --> ptrdiff_t for some line_size parameters
[ffmpeg.git] / libavcodec / x86 / qpel.asm
1 ;******************************************************************************
2 ;* MMX optimized DSP utils
3 ;* Copyright (c) 2008 Loren Merritt
4 ;* Copyright (c) 2003-2013 Michael Niedermayer
5 ;* Copyright (c) 2013 Daniel Kang
6 ;*
7 ;* This file is part of Libav.
8 ;*
9 ;* Libav is free software; you can redistribute it and/or
10 ;* modify it under the terms of the GNU Lesser General Public
11 ;* License as published by the Free Software Foundation; either
12 ;* version 2.1 of the License, or (at your option) any later version.
13 ;*
14 ;* Libav is distributed in the hope that it will be useful,
15 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 ;* Lesser General Public License for more details.
18 ;*
19 ;* You should have received a copy of the GNU Lesser General Public
20 ;* License along with Libav; if not, write to the Free Software
21 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 ;******************************************************************************
23
24 %include "libavutil/x86/x86util.asm"
25
26 SECTION .text
27
28 %macro op_avgh 3
29     movh   %3, %2
30     pavgb  %1, %3
31     movh   %2, %1
32 %endmacro
33
34 %macro op_avg 2
35     pavgb  %1, %2
36     mova   %2, %1
37 %endmacro
38
39 %macro op_puth 2-3
40     movh   %2, %1
41 %endmacro
42
43 %macro op_put 2
44     mova   %2, %1
45 %endmacro
46
47 ; void pixels4_l2_mmxext(uint8_t *dst, uint8_t *src1, uint8_t *src2, int dstStride, int src1Stride, int h)
48 %macro PIXELS4_L2 1
49 %define OP op_%1h
50 cglobal %1_pixels4_l2, 6,6
51     movsxdifnidn r3, r3d
52     movsxdifnidn r4, r4d
53     test        r5d, 1
54     je        .loop
55     movd         m0, [r1]
56     movd         m1, [r2]
57     add          r1, r4
58     add          r2, 4
59     pavgb        m0, m1
60     OP           m0, [r0], m3
61     add          r0, r3
62     dec         r5d
63 .loop:
64     mova         m0, [r1]
65     mova         m1, [r1+r4]
66     lea          r1, [r1+2*r4]
67     pavgb        m0, [r2]
68     pavgb        m1, [r2+4]
69     OP           m0, [r0], m3
70     OP           m1, [r0+r3], m3
71     lea          r0, [r0+2*r3]
72     mova         m0, [r1]
73     mova         m1, [r1+r4]
74     lea          r1, [r1+2*r4]
75     pavgb        m0, [r2+8]
76     pavgb        m1, [r2+12]
77     OP           m0, [r0], m3
78     OP           m1, [r0+r3], m3
79     lea          r0, [r0+2*r3]
80     add          r2, 16
81     sub         r5d, 4
82     jne       .loop
83     REP_RET
84 %endmacro
85
86 INIT_MMX mmxext
87 PIXELS4_L2 put
88 PIXELS4_L2 avg
89
90 ; void pixels8_l2_mmxext(uint8_t *dst, uint8_t *src1, uint8_t *src2, int dstStride, int src1Stride, int h)
91 %macro PIXELS8_L2 1
92 %define OP op_%1
93 cglobal %1_pixels8_l2, 6,6
94     movsxdifnidn r3, r3d
95     movsxdifnidn r4, r4d
96     test        r5d, 1
97     je        .loop
98     mova         m0, [r1]
99     mova         m1, [r2]
100     add          r1, r4
101     add          r2, 8
102     pavgb        m0, m1
103     OP           m0, [r0]
104     add          r0, r3
105     dec         r5d
106 .loop:
107     mova         m0, [r1]
108     mova         m1, [r1+r4]
109     lea          r1, [r1+2*r4]
110     pavgb        m0, [r2]
111     pavgb        m1, [r2+8]
112     OP           m0, [r0]
113     OP           m1, [r0+r3]
114     lea          r0, [r0+2*r3]
115     mova         m0, [r1]
116     mova         m1, [r1+r4]
117     lea          r1, [r1+2*r4]
118     pavgb        m0, [r2+16]
119     pavgb        m1, [r2+24]
120     OP           m0, [r0]
121     OP           m1, [r0+r3]
122     lea          r0, [r0+2*r3]
123     add          r2, 32
124     sub         r5d, 4
125     jne       .loop
126     REP_RET
127 %endmacro
128
129 INIT_MMX mmxext
130 PIXELS8_L2 put
131 PIXELS8_L2 avg
132
133 ; void pixels16_l2_mmxext(uint8_t *dst, uint8_t *src1, uint8_t *src2, int dstStride, int src1Stride, int h)
134 %macro PIXELS16_L2 1
135 %define OP op_%1
136 cglobal %1_pixels16_l2, 6,6
137     movsxdifnidn r3, r3d
138     movsxdifnidn r4, r4d
139     test        r5d, 1
140     je        .loop
141     mova         m0, [r1]
142     mova         m1, [r1+8]
143     pavgb        m0, [r2]
144     pavgb        m1, [r2+8]
145     add          r1, r4
146     add          r2, 16
147     OP           m0, [r0]
148     OP           m1, [r0+8]
149     add          r0, r3
150     dec         r5d
151 .loop:
152     mova         m0, [r1]
153     mova         m1, [r1+8]
154     add          r1, r4
155     pavgb        m0, [r2]
156     pavgb        m1, [r2+8]
157     OP           m0, [r0]
158     OP           m1, [r0+8]
159     add          r0, r3
160     mova         m0, [r1]
161     mova         m1, [r1+8]
162     add          r1, r4
163     pavgb        m0, [r2+16]
164     pavgb        m1, [r2+24]
165     OP           m0, [r0]
166     OP           m1, [r0+8]
167     add          r0, r3
168     add          r2, 32
169     sub         r5d, 2
170     jne       .loop
171     REP_RET
172 %endmacro
173
174 INIT_MMX mmxext
175 PIXELS16_L2 put
176 PIXELS16_L2 avg
177
178 INIT_MMX mmxext
179 ; void pixels(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
180 %macro PIXELS48 2
181 %if %2 == 4
182 %define OP movh
183 %else
184 %define OP mova
185 %endif
186 cglobal %1_pixels%2, 4,5
187     movsxdifnidn r2, r2d
188     lea          r4, [r2*3]
189 .loop:
190     OP           m0, [r1]
191     OP           m1, [r1+r2]
192     OP           m2, [r1+r2*2]
193     OP           m3, [r1+r4]
194     lea          r1, [r1+r2*4]
195 %ifidn %1, avg
196     pavgb        m0, [r0]
197     pavgb        m1, [r0+r2]
198     pavgb        m2, [r0+r2*2]
199     pavgb        m3, [r0+r4]
200 %endif
201     OP         [r0], m0
202     OP      [r0+r2], m1
203     OP    [r0+r2*2], m2
204     OP      [r0+r4], m3
205     sub         r3d, 4
206     lea          r0, [r0+r2*4]
207     jne       .loop
208     RET
209 %endmacro
210
211 PIXELS48 put, 4
212 PIXELS48 avg, 4
213 PIXELS48 put, 8
214 PIXELS48 avg, 8
215
216
217 INIT_XMM sse2
218 ; void put_pixels16_sse2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
219 cglobal put_pixels16, 4,5,4
220     lea          r4, [r2*3]
221 .loop:
222     movu         m0, [r1]
223     movu         m1, [r1+r2]
224     movu         m2, [r1+r2*2]
225     movu         m3, [r1+r4]
226     lea          r1, [r1+r2*4]
227     mova       [r0], m0
228     mova    [r0+r2], m1
229     mova  [r0+r2*2], m2
230     mova    [r0+r4], m3
231     sub         r3d, 4
232     lea          r0, [r0+r2*4]
233     jnz       .loop
234     REP_RET
235
236 ; void avg_pixels16_sse2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
237 cglobal avg_pixels16, 4,5,4
238     lea          r4, [r2*3]
239 .loop:
240     movu         m0, [r1]
241     movu         m1, [r1+r2]
242     movu         m2, [r1+r2*2]
243     movu         m3, [r1+r4]
244     lea          r1, [r1+r2*4]
245     pavgb        m0, [r0]
246     pavgb        m1, [r0+r2]
247     pavgb        m2, [r0+r2*2]
248     pavgb        m3, [r0+r4]
249     mova       [r0], m0
250     mova    [r0+r2], m1
251     mova  [r0+r2*2], m2
252     mova    [r0+r4], m3
253     sub         r3d, 4
254     lea          r0, [r0+r2*4]
255     jnz       .loop
256     REP_RET