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