yading@11
|
1 ;*****************************************************************************
|
yading@11
|
2 ;* x86util.asm
|
yading@11
|
3 ;*****************************************************************************
|
yading@11
|
4 ;* Copyright (C) 2008-2010 x264 project
|
yading@11
|
5 ;*
|
yading@11
|
6 ;* Authors: Loren Merritt <lorenm@u.washington.edu>
|
yading@11
|
7 ;* Holger Lubitz <holger@lubitz.org>
|
yading@11
|
8 ;*
|
yading@11
|
9 ;* This file is part of FFmpeg.
|
yading@11
|
10 ;*
|
yading@11
|
11 ;* FFmpeg is free software; you can redistribute it and/or
|
yading@11
|
12 ;* modify it under the terms of the GNU Lesser General Public
|
yading@11
|
13 ;* License as published by the Free Software Foundation; either
|
yading@11
|
14 ;* version 2.1 of the License, or (at your option) any later version.
|
yading@11
|
15 ;*
|
yading@11
|
16 ;* FFmpeg is distributed in the hope that it will be useful,
|
yading@11
|
17 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@11
|
18 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@11
|
19 ;* Lesser General Public License for more details.
|
yading@11
|
20 ;*
|
yading@11
|
21 ;* You should have received a copy of the GNU Lesser General Public
|
yading@11
|
22 ;* License along with FFmpeg; if not, write to the Free Software
|
yading@11
|
23 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@11
|
24 ;******************************************************************************
|
yading@11
|
25
|
yading@11
|
26 %define private_prefix ff
|
yading@11
|
27 %define public_prefix avpriv
|
yading@11
|
28 %define cpuflags_mmxext cpuflags_mmx2
|
yading@11
|
29
|
yading@11
|
30 %include "libavutil/x86/x86inc.asm"
|
yading@11
|
31
|
yading@11
|
32 %macro SBUTTERFLY 4
|
yading@11
|
33 %if avx_enabled == 0
|
yading@11
|
34 mova m%4, m%2
|
yading@11
|
35 punpckl%1 m%2, m%3
|
yading@11
|
36 punpckh%1 m%4, m%3
|
yading@11
|
37 %else
|
yading@11
|
38 punpckh%1 m%4, m%2, m%3
|
yading@11
|
39 punpckl%1 m%2, m%3
|
yading@11
|
40 %endif
|
yading@11
|
41 SWAP %3, %4
|
yading@11
|
42 %endmacro
|
yading@11
|
43
|
yading@11
|
44 %macro SBUTTERFLY2 4
|
yading@11
|
45 punpckl%1 m%4, m%2, m%3
|
yading@11
|
46 punpckh%1 m%2, m%2, m%3
|
yading@11
|
47 SWAP %2, %4, %3
|
yading@11
|
48 %endmacro
|
yading@11
|
49
|
yading@11
|
50 %macro SBUTTERFLYPS 3
|
yading@11
|
51 unpcklps m%3, m%1, m%2
|
yading@11
|
52 unpckhps m%1, m%1, m%2
|
yading@11
|
53 SWAP %1, %3, %2
|
yading@11
|
54 %endmacro
|
yading@11
|
55
|
yading@11
|
56 %macro TRANSPOSE4x4B 5
|
yading@11
|
57 SBUTTERFLY bw, %1, %2, %5
|
yading@11
|
58 SBUTTERFLY bw, %3, %4, %5
|
yading@11
|
59 SBUTTERFLY wd, %1, %3, %5
|
yading@11
|
60 SBUTTERFLY wd, %2, %4, %5
|
yading@11
|
61 SWAP %2, %3
|
yading@11
|
62 %endmacro
|
yading@11
|
63
|
yading@11
|
64 %macro TRANSPOSE4x4W 5
|
yading@11
|
65 SBUTTERFLY wd, %1, %2, %5
|
yading@11
|
66 SBUTTERFLY wd, %3, %4, %5
|
yading@11
|
67 SBUTTERFLY dq, %1, %3, %5
|
yading@11
|
68 SBUTTERFLY dq, %2, %4, %5
|
yading@11
|
69 SWAP %2, %3
|
yading@11
|
70 %endmacro
|
yading@11
|
71
|
yading@11
|
72 %macro TRANSPOSE2x4x4W 5
|
yading@11
|
73 SBUTTERFLY wd, %1, %2, %5
|
yading@11
|
74 SBUTTERFLY wd, %3, %4, %5
|
yading@11
|
75 SBUTTERFLY dq, %1, %3, %5
|
yading@11
|
76 SBUTTERFLY dq, %2, %4, %5
|
yading@11
|
77 SBUTTERFLY qdq, %1, %2, %5
|
yading@11
|
78 SBUTTERFLY qdq, %3, %4, %5
|
yading@11
|
79 %endmacro
|
yading@11
|
80
|
yading@11
|
81 %macro TRANSPOSE4x4D 5
|
yading@11
|
82 SBUTTERFLY dq, %1, %2, %5
|
yading@11
|
83 SBUTTERFLY dq, %3, %4, %5
|
yading@11
|
84 SBUTTERFLY qdq, %1, %3, %5
|
yading@11
|
85 SBUTTERFLY qdq, %2, %4, %5
|
yading@11
|
86 SWAP %2, %3
|
yading@11
|
87 %endmacro
|
yading@11
|
88
|
yading@11
|
89 ; identical behavior to TRANSPOSE4x4D, but using SSE1 float ops
|
yading@11
|
90 %macro TRANSPOSE4x4PS 5
|
yading@11
|
91 SBUTTERFLYPS %1, %2, %5
|
yading@11
|
92 SBUTTERFLYPS %3, %4, %5
|
yading@11
|
93 movlhps m%5, m%1, m%3
|
yading@11
|
94 movhlps m%3, m%1
|
yading@11
|
95 SWAP %5, %1
|
yading@11
|
96 movlhps m%5, m%2, m%4
|
yading@11
|
97 movhlps m%4, m%2
|
yading@11
|
98 SWAP %5, %2, %3
|
yading@11
|
99 %endmacro
|
yading@11
|
100
|
yading@11
|
101 %macro TRANSPOSE8x8W 9-11
|
yading@11
|
102 %if ARCH_X86_64
|
yading@11
|
103 SBUTTERFLY wd, %1, %2, %9
|
yading@11
|
104 SBUTTERFLY wd, %3, %4, %9
|
yading@11
|
105 SBUTTERFLY wd, %5, %6, %9
|
yading@11
|
106 SBUTTERFLY wd, %7, %8, %9
|
yading@11
|
107 SBUTTERFLY dq, %1, %3, %9
|
yading@11
|
108 SBUTTERFLY dq, %2, %4, %9
|
yading@11
|
109 SBUTTERFLY dq, %5, %7, %9
|
yading@11
|
110 SBUTTERFLY dq, %6, %8, %9
|
yading@11
|
111 SBUTTERFLY qdq, %1, %5, %9
|
yading@11
|
112 SBUTTERFLY qdq, %2, %6, %9
|
yading@11
|
113 SBUTTERFLY qdq, %3, %7, %9
|
yading@11
|
114 SBUTTERFLY qdq, %4, %8, %9
|
yading@11
|
115 SWAP %2, %5
|
yading@11
|
116 SWAP %4, %7
|
yading@11
|
117 %else
|
yading@11
|
118 ; in: m0..m7, unless %11 in which case m6 is in %9
|
yading@11
|
119 ; out: m0..m7, unless %11 in which case m4 is in %10
|
yading@11
|
120 ; spills into %9 and %10
|
yading@11
|
121 %if %0<11
|
yading@11
|
122 movdqa %9, m%7
|
yading@11
|
123 %endif
|
yading@11
|
124 SBUTTERFLY wd, %1, %2, %7
|
yading@11
|
125 movdqa %10, m%2
|
yading@11
|
126 movdqa m%7, %9
|
yading@11
|
127 SBUTTERFLY wd, %3, %4, %2
|
yading@11
|
128 SBUTTERFLY wd, %5, %6, %2
|
yading@11
|
129 SBUTTERFLY wd, %7, %8, %2
|
yading@11
|
130 SBUTTERFLY dq, %1, %3, %2
|
yading@11
|
131 movdqa %9, m%3
|
yading@11
|
132 movdqa m%2, %10
|
yading@11
|
133 SBUTTERFLY dq, %2, %4, %3
|
yading@11
|
134 SBUTTERFLY dq, %5, %7, %3
|
yading@11
|
135 SBUTTERFLY dq, %6, %8, %3
|
yading@11
|
136 SBUTTERFLY qdq, %1, %5, %3
|
yading@11
|
137 SBUTTERFLY qdq, %2, %6, %3
|
yading@11
|
138 movdqa %10, m%2
|
yading@11
|
139 movdqa m%3, %9
|
yading@11
|
140 SBUTTERFLY qdq, %3, %7, %2
|
yading@11
|
141 SBUTTERFLY qdq, %4, %8, %2
|
yading@11
|
142 SWAP %2, %5
|
yading@11
|
143 SWAP %4, %7
|
yading@11
|
144 %if %0<11
|
yading@11
|
145 movdqa m%5, %10
|
yading@11
|
146 %endif
|
yading@11
|
147 %endif
|
yading@11
|
148 %endmacro
|
yading@11
|
149
|
yading@11
|
150 ; PABSW macro assumes %1 != %2, while ABS1/2 macros work in-place
|
yading@11
|
151 %macro PABSW 2
|
yading@11
|
152 %if cpuflag(ssse3)
|
yading@11
|
153 pabsw %1, %2
|
yading@11
|
154 %elif cpuflag(mmxext)
|
yading@11
|
155 pxor %1, %1
|
yading@11
|
156 psubw %1, %2
|
yading@11
|
157 pmaxsw %1, %2
|
yading@11
|
158 %else
|
yading@11
|
159 pxor %1, %1
|
yading@11
|
160 pcmpgtw %1, %2
|
yading@11
|
161 pxor %2, %1
|
yading@11
|
162 psubw %2, %1
|
yading@11
|
163 SWAP %1, %2
|
yading@11
|
164 %endif
|
yading@11
|
165 %endmacro
|
yading@11
|
166
|
yading@11
|
167 %macro PSIGNW_MMX 2
|
yading@11
|
168 pxor %1, %2
|
yading@11
|
169 psubw %1, %2
|
yading@11
|
170 %endmacro
|
yading@11
|
171
|
yading@11
|
172 %macro PSIGNW_SSSE3 2
|
yading@11
|
173 psignw %1, %2
|
yading@11
|
174 %endmacro
|
yading@11
|
175
|
yading@11
|
176 %macro ABS1 2
|
yading@11
|
177 %if cpuflag(ssse3)
|
yading@11
|
178 pabsw %1, %1
|
yading@11
|
179 %elif cpuflag(mmxext) ; a, tmp
|
yading@11
|
180 pxor %2, %2
|
yading@11
|
181 psubw %2, %1
|
yading@11
|
182 pmaxsw %1, %2
|
yading@11
|
183 %else ; a, tmp
|
yading@11
|
184 pxor %2, %2
|
yading@11
|
185 pcmpgtw %2, %1
|
yading@11
|
186 pxor %1, %2
|
yading@11
|
187 psubw %1, %2
|
yading@11
|
188 %endif
|
yading@11
|
189 %endmacro
|
yading@11
|
190
|
yading@11
|
191 %macro ABS2 4
|
yading@11
|
192 %if cpuflag(ssse3)
|
yading@11
|
193 pabsw %1, %1
|
yading@11
|
194 pabsw %2, %2
|
yading@11
|
195 %elif cpuflag(mmxext) ; a, b, tmp0, tmp1
|
yading@11
|
196 pxor %3, %3
|
yading@11
|
197 pxor %4, %4
|
yading@11
|
198 psubw %3, %1
|
yading@11
|
199 psubw %4, %2
|
yading@11
|
200 pmaxsw %1, %3
|
yading@11
|
201 pmaxsw %2, %4
|
yading@11
|
202 %else ; a, b, tmp0, tmp1
|
yading@11
|
203 pxor %3, %3
|
yading@11
|
204 pxor %4, %4
|
yading@11
|
205 pcmpgtw %3, %1
|
yading@11
|
206 pcmpgtw %4, %2
|
yading@11
|
207 pxor %1, %3
|
yading@11
|
208 pxor %2, %4
|
yading@11
|
209 psubw %1, %3
|
yading@11
|
210 psubw %2, %4
|
yading@11
|
211 %endif
|
yading@11
|
212 %endmacro
|
yading@11
|
213
|
yading@11
|
214 %macro ABSB 2 ; source mmreg, temp mmreg (unused for ssse3)
|
yading@11
|
215 %if cpuflag(ssse3)
|
yading@11
|
216 pabsb %1, %1
|
yading@11
|
217 %else
|
yading@11
|
218 pxor %2, %2
|
yading@11
|
219 psubb %2, %1
|
yading@11
|
220 pminub %1, %2
|
yading@11
|
221 %endif
|
yading@11
|
222 %endmacro
|
yading@11
|
223
|
yading@11
|
224 %macro ABSB2 4 ; src1, src2, tmp1, tmp2 (tmp1/2 unused for SSSE3)
|
yading@11
|
225 %if cpuflag(ssse3)
|
yading@11
|
226 pabsb %1, %1
|
yading@11
|
227 pabsb %2, %2
|
yading@11
|
228 %else
|
yading@11
|
229 pxor %3, %3
|
yading@11
|
230 pxor %4, %4
|
yading@11
|
231 psubb %3, %1
|
yading@11
|
232 psubb %4, %2
|
yading@11
|
233 pminub %1, %3
|
yading@11
|
234 pminub %2, %4
|
yading@11
|
235 %endif
|
yading@11
|
236 %endmacro
|
yading@11
|
237
|
yading@11
|
238 %macro ABSD2_MMX 4
|
yading@11
|
239 pxor %3, %3
|
yading@11
|
240 pxor %4, %4
|
yading@11
|
241 pcmpgtd %3, %1
|
yading@11
|
242 pcmpgtd %4, %2
|
yading@11
|
243 pxor %1, %3
|
yading@11
|
244 pxor %2, %4
|
yading@11
|
245 psubd %1, %3
|
yading@11
|
246 psubd %2, %4
|
yading@11
|
247 %endmacro
|
yading@11
|
248
|
yading@11
|
249 %macro ABS4 6
|
yading@11
|
250 ABS2 %1, %2, %5, %6
|
yading@11
|
251 ABS2 %3, %4, %5, %6
|
yading@11
|
252 %endmacro
|
yading@11
|
253
|
yading@11
|
254 %macro SPLATB_LOAD 3
|
yading@11
|
255 %if cpuflag(ssse3)
|
yading@11
|
256 movd %1, [%2-3]
|
yading@11
|
257 pshufb %1, %3
|
yading@11
|
258 %else
|
yading@11
|
259 movd %1, [%2-3] ;to avoid crossing a cacheline
|
yading@11
|
260 punpcklbw %1, %1
|
yading@11
|
261 SPLATW %1, %1, 3
|
yading@11
|
262 %endif
|
yading@11
|
263 %endmacro
|
yading@11
|
264
|
yading@11
|
265 %macro SPLATB_REG 3
|
yading@11
|
266 %if cpuflag(ssse3)
|
yading@11
|
267 movd %1, %2d
|
yading@11
|
268 pshufb %1, %3
|
yading@11
|
269 %else
|
yading@11
|
270 movd %1, %2d
|
yading@11
|
271 punpcklbw %1, %1
|
yading@11
|
272 SPLATW %1, %1, 0
|
yading@11
|
273 %endif
|
yading@11
|
274 %endmacro
|
yading@11
|
275
|
yading@11
|
276 %macro PALIGNR 4-5
|
yading@11
|
277 %if cpuflag(ssse3)
|
yading@11
|
278 %if %0==5
|
yading@11
|
279 palignr %1, %2, %3, %4
|
yading@11
|
280 %else
|
yading@11
|
281 palignr %1, %2, %3
|
yading@11
|
282 %endif
|
yading@11
|
283 %elif cpuflag(mmx) ; [dst,] src1, src2, imm, tmp
|
yading@11
|
284 %define %%dst %1
|
yading@11
|
285 %if %0==5
|
yading@11
|
286 %ifnidn %1, %2
|
yading@11
|
287 mova %%dst, %2
|
yading@11
|
288 %endif
|
yading@11
|
289 %rotate 1
|
yading@11
|
290 %endif
|
yading@11
|
291 %ifnidn %4, %2
|
yading@11
|
292 mova %4, %2
|
yading@11
|
293 %endif
|
yading@11
|
294 %if mmsize==8
|
yading@11
|
295 psllq %%dst, (8-%3)*8
|
yading@11
|
296 psrlq %4, %3*8
|
yading@11
|
297 %else
|
yading@11
|
298 pslldq %%dst, 16-%3
|
yading@11
|
299 psrldq %4, %3
|
yading@11
|
300 %endif
|
yading@11
|
301 por %%dst, %4
|
yading@11
|
302 %endif
|
yading@11
|
303 %endmacro
|
yading@11
|
304
|
yading@11
|
305 %macro PAVGB 2
|
yading@11
|
306 %if cpuflag(mmxext)
|
yading@11
|
307 pavgb %1, %2
|
yading@11
|
308 %elif cpuflag(3dnow)
|
yading@11
|
309 pavgusb %1, %2
|
yading@11
|
310 %endif
|
yading@11
|
311 %endmacro
|
yading@11
|
312
|
yading@11
|
313 %macro PSHUFLW 1+
|
yading@11
|
314 %if mmsize == 8
|
yading@11
|
315 pshufw %1
|
yading@11
|
316 %else
|
yading@11
|
317 pshuflw %1
|
yading@11
|
318 %endif
|
yading@11
|
319 %endmacro
|
yading@11
|
320
|
yading@11
|
321 %macro PSWAPD 2
|
yading@11
|
322 %if cpuflag(mmxext)
|
yading@11
|
323 pshufw %1, %2, q1032
|
yading@11
|
324 %elif cpuflag(3dnowext)
|
yading@11
|
325 pswapd %1, %2
|
yading@11
|
326 %elif cpuflag(3dnow)
|
yading@11
|
327 movq %1, %2
|
yading@11
|
328 psrlq %1, 32
|
yading@11
|
329 punpckldq %1, %2
|
yading@11
|
330 %endif
|
yading@11
|
331 %endmacro
|
yading@11
|
332
|
yading@11
|
333 %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
|
yading@11
|
334 %ifnum %5
|
yading@11
|
335 pand m%3, m%5, m%4 ; src .. y6 .. y4
|
yading@11
|
336 pand m%1, m%5, m%2 ; dst .. y6 .. y4
|
yading@11
|
337 %else
|
yading@11
|
338 mova m%1, %5
|
yading@11
|
339 pand m%3, m%1, m%4 ; src .. y6 .. y4
|
yading@11
|
340 pand m%1, m%1, m%2 ; dst .. y6 .. y4
|
yading@11
|
341 %endif
|
yading@11
|
342 psrlw m%2, 8 ; dst .. y7 .. y5
|
yading@11
|
343 psrlw m%4, 8 ; src .. y7 .. y5
|
yading@11
|
344 %endmacro
|
yading@11
|
345
|
yading@11
|
346 %macro SUMSUB_BA 3-4
|
yading@11
|
347 %if %0==3
|
yading@11
|
348 padd%1 m%2, m%3
|
yading@11
|
349 padd%1 m%3, m%3
|
yading@11
|
350 psub%1 m%3, m%2
|
yading@11
|
351 %else
|
yading@11
|
352 %if avx_enabled == 0
|
yading@11
|
353 mova m%4, m%2
|
yading@11
|
354 padd%1 m%2, m%3
|
yading@11
|
355 psub%1 m%3, m%4
|
yading@11
|
356 %else
|
yading@11
|
357 padd%1 m%4, m%2, m%3
|
yading@11
|
358 psub%1 m%3, m%2
|
yading@11
|
359 SWAP %2, %4
|
yading@11
|
360 %endif
|
yading@11
|
361 %endif
|
yading@11
|
362 %endmacro
|
yading@11
|
363
|
yading@11
|
364 %macro SUMSUB_BADC 5-6
|
yading@11
|
365 %if %0==6
|
yading@11
|
366 SUMSUB_BA %1, %2, %3, %6
|
yading@11
|
367 SUMSUB_BA %1, %4, %5, %6
|
yading@11
|
368 %else
|
yading@11
|
369 padd%1 m%2, m%3
|
yading@11
|
370 padd%1 m%4, m%5
|
yading@11
|
371 padd%1 m%3, m%3
|
yading@11
|
372 padd%1 m%5, m%5
|
yading@11
|
373 psub%1 m%3, m%2
|
yading@11
|
374 psub%1 m%5, m%4
|
yading@11
|
375 %endif
|
yading@11
|
376 %endmacro
|
yading@11
|
377
|
yading@11
|
378 %macro SUMSUB2_AB 4
|
yading@11
|
379 %ifnum %3
|
yading@11
|
380 psub%1 m%4, m%2, m%3
|
yading@11
|
381 psub%1 m%4, m%3
|
yading@11
|
382 padd%1 m%2, m%2
|
yading@11
|
383 padd%1 m%2, m%3
|
yading@11
|
384 %else
|
yading@11
|
385 mova m%4, m%2
|
yading@11
|
386 padd%1 m%2, m%2
|
yading@11
|
387 padd%1 m%2, %3
|
yading@11
|
388 psub%1 m%4, %3
|
yading@11
|
389 psub%1 m%4, %3
|
yading@11
|
390 %endif
|
yading@11
|
391 %endmacro
|
yading@11
|
392
|
yading@11
|
393 %macro SUMSUB2_BA 4
|
yading@11
|
394 %if avx_enabled == 0
|
yading@11
|
395 mova m%4, m%2
|
yading@11
|
396 padd%1 m%2, m%3
|
yading@11
|
397 padd%1 m%2, m%3
|
yading@11
|
398 psub%1 m%3, m%4
|
yading@11
|
399 psub%1 m%3, m%4
|
yading@11
|
400 %else
|
yading@11
|
401 padd%1 m%4, m%2, m%3
|
yading@11
|
402 padd%1 m%4, m%3
|
yading@11
|
403 psub%1 m%3, m%2
|
yading@11
|
404 psub%1 m%3, m%2
|
yading@11
|
405 SWAP %2, %4
|
yading@11
|
406 %endif
|
yading@11
|
407 %endmacro
|
yading@11
|
408
|
yading@11
|
409 %macro SUMSUBD2_AB 5
|
yading@11
|
410 %ifnum %4
|
yading@11
|
411 psra%1 m%5, m%2, 1 ; %3: %3>>1
|
yading@11
|
412 psra%1 m%4, m%3, 1 ; %2: %2>>1
|
yading@11
|
413 padd%1 m%4, m%2 ; %3: %3>>1+%2
|
yading@11
|
414 psub%1 m%5, m%3 ; %2: %2>>1-%3
|
yading@11
|
415 SWAP %2, %5
|
yading@11
|
416 SWAP %3, %4
|
yading@11
|
417 %else
|
yading@11
|
418 mova %5, m%2
|
yading@11
|
419 mova %4, m%3
|
yading@11
|
420 psra%1 m%3, 1 ; %3: %3>>1
|
yading@11
|
421 psra%1 m%2, 1 ; %2: %2>>1
|
yading@11
|
422 padd%1 m%3, %5 ; %3: %3>>1+%2
|
yading@11
|
423 psub%1 m%2, %4 ; %2: %2>>1-%3
|
yading@11
|
424 %endif
|
yading@11
|
425 %endmacro
|
yading@11
|
426
|
yading@11
|
427 %macro DCT4_1D 5
|
yading@11
|
428 %ifnum %5
|
yading@11
|
429 SUMSUB_BADC w, %4, %1, %3, %2, %5
|
yading@11
|
430 SUMSUB_BA w, %3, %4, %5
|
yading@11
|
431 SUMSUB2_AB w, %1, %2, %5
|
yading@11
|
432 SWAP %1, %3, %4, %5, %2
|
yading@11
|
433 %else
|
yading@11
|
434 SUMSUB_BADC w, %4, %1, %3, %2
|
yading@11
|
435 SUMSUB_BA w, %3, %4
|
yading@11
|
436 mova [%5], m%2
|
yading@11
|
437 SUMSUB2_AB w, %1, [%5], %2
|
yading@11
|
438 SWAP %1, %3, %4, %2
|
yading@11
|
439 %endif
|
yading@11
|
440 %endmacro
|
yading@11
|
441
|
yading@11
|
442 %macro IDCT4_1D 6-7
|
yading@11
|
443 %ifnum %6
|
yading@11
|
444 SUMSUBD2_AB %1, %3, %5, %7, %6
|
yading@11
|
445 ; %3: %3>>1-%5 %5: %3+%5>>1
|
yading@11
|
446 SUMSUB_BA %1, %4, %2, %7
|
yading@11
|
447 ; %4: %2+%4 %2: %2-%4
|
yading@11
|
448 SUMSUB_BADC %1, %5, %4, %3, %2, %7
|
yading@11
|
449 ; %5: %2+%4 + (%3+%5>>1)
|
yading@11
|
450 ; %4: %2+%4 - (%3+%5>>1)
|
yading@11
|
451 ; %3: %2-%4 + (%3>>1-%5)
|
yading@11
|
452 ; %2: %2-%4 - (%3>>1-%5)
|
yading@11
|
453 %else
|
yading@11
|
454 %ifidn %1, w
|
yading@11
|
455 SUMSUBD2_AB %1, %3, %5, [%6], [%6+16]
|
yading@11
|
456 %else
|
yading@11
|
457 SUMSUBD2_AB %1, %3, %5, [%6], [%6+32]
|
yading@11
|
458 %endif
|
yading@11
|
459 SUMSUB_BA %1, %4, %2
|
yading@11
|
460 SUMSUB_BADC %1, %5, %4, %3, %2
|
yading@11
|
461 %endif
|
yading@11
|
462 SWAP %2, %5, %4
|
yading@11
|
463 ; %2: %2+%4 + (%3+%5>>1) row0
|
yading@11
|
464 ; %3: %2-%4 + (%3>>1-%5) row1
|
yading@11
|
465 ; %4: %2-%4 - (%3>>1-%5) row2
|
yading@11
|
466 ; %5: %2+%4 - (%3+%5>>1) row3
|
yading@11
|
467 %endmacro
|
yading@11
|
468
|
yading@11
|
469
|
yading@11
|
470 %macro LOAD_DIFF 5
|
yading@11
|
471 %ifidn %3, none
|
yading@11
|
472 movh %1, %4
|
yading@11
|
473 movh %2, %5
|
yading@11
|
474 punpcklbw %1, %2
|
yading@11
|
475 punpcklbw %2, %2
|
yading@11
|
476 psubw %1, %2
|
yading@11
|
477 %else
|
yading@11
|
478 movh %1, %4
|
yading@11
|
479 punpcklbw %1, %3
|
yading@11
|
480 movh %2, %5
|
yading@11
|
481 punpcklbw %2, %3
|
yading@11
|
482 psubw %1, %2
|
yading@11
|
483 %endif
|
yading@11
|
484 %endmacro
|
yading@11
|
485
|
yading@11
|
486 %macro STORE_DCT 6
|
yading@11
|
487 movq [%5+%6+ 0], m%1
|
yading@11
|
488 movq [%5+%6+ 8], m%2
|
yading@11
|
489 movq [%5+%6+16], m%3
|
yading@11
|
490 movq [%5+%6+24], m%4
|
yading@11
|
491 movhps [%5+%6+32], m%1
|
yading@11
|
492 movhps [%5+%6+40], m%2
|
yading@11
|
493 movhps [%5+%6+48], m%3
|
yading@11
|
494 movhps [%5+%6+56], m%4
|
yading@11
|
495 %endmacro
|
yading@11
|
496
|
yading@11
|
497 %macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
|
yading@11
|
498 LOAD_DIFF m%1, m%5, m%7, [%8], [%9]
|
yading@11
|
499 LOAD_DIFF m%2, m%6, m%7, [%8+r1], [%9+r3]
|
yading@11
|
500 LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3]
|
yading@11
|
501 LOAD_DIFF m%4, m%6, m%7, [%8+r4], [%9+r5]
|
yading@11
|
502 %if %10
|
yading@11
|
503 lea %8, [%8+4*r1]
|
yading@11
|
504 lea %9, [%9+4*r3]
|
yading@11
|
505 %endif
|
yading@11
|
506 %endmacro
|
yading@11
|
507
|
yading@11
|
508 %macro DIFFx2 6-7
|
yading@11
|
509 movh %3, %5
|
yading@11
|
510 punpcklbw %3, %4
|
yading@11
|
511 psraw %1, 6
|
yading@11
|
512 paddsw %1, %3
|
yading@11
|
513 movh %3, %6
|
yading@11
|
514 punpcklbw %3, %4
|
yading@11
|
515 psraw %2, 6
|
yading@11
|
516 paddsw %2, %3
|
yading@11
|
517 packuswb %2, %1
|
yading@11
|
518 %endmacro
|
yading@11
|
519
|
yading@11
|
520 %macro STORE_DIFF 4
|
yading@11
|
521 movh %2, %4
|
yading@11
|
522 punpcklbw %2, %3
|
yading@11
|
523 psraw %1, 6
|
yading@11
|
524 paddsw %1, %2
|
yading@11
|
525 packuswb %1, %1
|
yading@11
|
526 movh %4, %1
|
yading@11
|
527 %endmacro
|
yading@11
|
528
|
yading@11
|
529 %macro STORE_DIFFx2 8 ; add1, add2, reg1, reg2, zero, shift, source, stride
|
yading@11
|
530 movh %3, [%7]
|
yading@11
|
531 movh %4, [%7+%8]
|
yading@11
|
532 psraw %1, %6
|
yading@11
|
533 psraw %2, %6
|
yading@11
|
534 punpcklbw %3, %5
|
yading@11
|
535 punpcklbw %4, %5
|
yading@11
|
536 paddw %3, %1
|
yading@11
|
537 paddw %4, %2
|
yading@11
|
538 packuswb %3, %5
|
yading@11
|
539 packuswb %4, %5
|
yading@11
|
540 movh [%7], %3
|
yading@11
|
541 movh [%7+%8], %4
|
yading@11
|
542 %endmacro
|
yading@11
|
543
|
yading@11
|
544 %macro PMINUB 3 ; dst, src, ignored
|
yading@11
|
545 %if cpuflag(mmxext)
|
yading@11
|
546 pminub %1, %2
|
yading@11
|
547 %else ; dst, src, tmp
|
yading@11
|
548 mova %3, %1
|
yading@11
|
549 psubusb %3, %2
|
yading@11
|
550 psubb %1, %3
|
yading@11
|
551 %endif
|
yading@11
|
552 %endmacro
|
yading@11
|
553
|
yading@11
|
554 %macro SPLATW 2-3 0
|
yading@11
|
555 %if mmsize == 16
|
yading@11
|
556 pshuflw %1, %2, (%3)*0x55
|
yading@11
|
557 punpcklqdq %1, %1
|
yading@11
|
558 %elif cpuflag(mmxext)
|
yading@11
|
559 pshufw %1, %2, (%3)*0x55
|
yading@11
|
560 %else
|
yading@11
|
561 %ifnidn %1, %2
|
yading@11
|
562 mova %1, %2
|
yading@11
|
563 %endif
|
yading@11
|
564 %if %3 & 2
|
yading@11
|
565 punpckhwd %1, %1
|
yading@11
|
566 %else
|
yading@11
|
567 punpcklwd %1, %1
|
yading@11
|
568 %endif
|
yading@11
|
569 %if %3 & 1
|
yading@11
|
570 punpckhwd %1, %1
|
yading@11
|
571 %else
|
yading@11
|
572 punpcklwd %1, %1
|
yading@11
|
573 %endif
|
yading@11
|
574 %endif
|
yading@11
|
575 %endmacro
|
yading@11
|
576
|
yading@11
|
577 %macro SPLATD 1
|
yading@11
|
578 %if mmsize == 8
|
yading@11
|
579 punpckldq %1, %1
|
yading@11
|
580 %elif cpuflag(sse2)
|
yading@11
|
581 pshufd %1, %1, 0
|
yading@11
|
582 %elif cpuflag(sse)
|
yading@11
|
583 shufps %1, %1, 0
|
yading@11
|
584 %endif
|
yading@11
|
585 %endmacro
|
yading@11
|
586
|
yading@11
|
587 %macro CLIPW 3 ;(dst, min, max)
|
yading@11
|
588 pmaxsw %1, %2
|
yading@11
|
589 pminsw %1, %3
|
yading@11
|
590 %endmacro
|
yading@11
|
591
|
yading@11
|
592 %macro PMINSD_MMX 3 ; dst, src, tmp
|
yading@11
|
593 mova %3, %2
|
yading@11
|
594 pcmpgtd %3, %1
|
yading@11
|
595 pxor %1, %2
|
yading@11
|
596 pand %1, %3
|
yading@11
|
597 pxor %1, %2
|
yading@11
|
598 %endmacro
|
yading@11
|
599
|
yading@11
|
600 %macro PMAXSD_MMX 3 ; dst, src, tmp
|
yading@11
|
601 mova %3, %1
|
yading@11
|
602 pcmpgtd %3, %2
|
yading@11
|
603 pand %1, %3
|
yading@11
|
604 pandn %3, %2
|
yading@11
|
605 por %1, %3
|
yading@11
|
606 %endmacro
|
yading@11
|
607
|
yading@11
|
608 %macro CLIPD_MMX 3-4 ; src/dst, min, max, tmp
|
yading@11
|
609 PMINSD_MMX %1, %3, %4
|
yading@11
|
610 PMAXSD_MMX %1, %2, %4
|
yading@11
|
611 %endmacro
|
yading@11
|
612
|
yading@11
|
613 %macro CLIPD_SSE2 3-4 ; src/dst, min (float), max (float), unused
|
yading@11
|
614 cvtdq2ps %1, %1
|
yading@11
|
615 minps %1, %3
|
yading@11
|
616 maxps %1, %2
|
yading@11
|
617 cvtps2dq %1, %1
|
yading@11
|
618 %endmacro
|
yading@11
|
619
|
yading@11
|
620 %macro CLIPD_SSE41 3-4 ; src/dst, min, max, unused
|
yading@11
|
621 pminsd %1, %3
|
yading@11
|
622 pmaxsd %1, %2
|
yading@11
|
623 %endmacro
|
yading@11
|
624
|
yading@11
|
625 %macro VBROADCASTSS 2 ; dst xmm/ymm, src m32
|
yading@11
|
626 %if cpuflag(avx)
|
yading@11
|
627 vbroadcastss %1, %2
|
yading@11
|
628 %else ; sse
|
yading@11
|
629 movss %1, %2
|
yading@11
|
630 shufps %1, %1, 0
|
yading@11
|
631 %endif
|
yading@11
|
632 %endmacro
|
yading@11
|
633
|
yading@11
|
634 %macro VBROADCASTSD 2 ; dst xmm/ymm, src m64
|
yading@11
|
635 %if cpuflag(avx) && mmsize == 32
|
yading@11
|
636 vbroadcastsd %1, %2
|
yading@11
|
637 %elif cpuflag(sse3)
|
yading@11
|
638 movddup %1, %2
|
yading@11
|
639 %else ; sse2
|
yading@11
|
640 movsd %1, %2
|
yading@11
|
641 movlhps %1, %1
|
yading@11
|
642 %endif
|
yading@11
|
643 %endmacro
|
yading@11
|
644
|
yading@11
|
645 %macro SHUFFLE_MASK_W 8
|
yading@11
|
646 %rep 8
|
yading@11
|
647 %if %1>=0x80
|
yading@11
|
648 db %1, %1
|
yading@11
|
649 %else
|
yading@11
|
650 db %1*2
|
yading@11
|
651 db %1*2+1
|
yading@11
|
652 %endif
|
yading@11
|
653 %rotate 1
|
yading@11
|
654 %endrep
|
yading@11
|
655 %endmacro
|
yading@11
|
656
|
yading@11
|
657 %macro PMOVSXWD 2; dst, src
|
yading@11
|
658 %if cpuflag(sse4)
|
yading@11
|
659 pmovsxwd %1, %2
|
yading@11
|
660 %else
|
yading@11
|
661 %ifnidn %1, %2
|
yading@11
|
662 mova %1, %2
|
yading@11
|
663 %endif
|
yading@11
|
664 punpcklwd %1, %1
|
yading@11
|
665 psrad %1, 16
|
yading@11
|
666 %endif
|
yading@11
|
667 %endmacro
|