avfilter/avfiltergraph: fix constant string comparision
[ffmpeg.git] / libavutil / x86 / x86util.asm
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 ; expands to [base],...,[base+7*stride]
33 %define PASS8ROWS(base, base3, stride, stride3) \
34 [base], [base + stride], [base + 2*stride], [base3], \
35 [base3 + stride], [base3 + 2*stride], [base3 + stride3], [base3 + stride*4]
36
37 ; Interleave low src0 with low src1 and store in src0,
38 ; interleave high src0 with high src1 and store in src1.
39 ; %1 - types
40 ; %2 - index of the register with src0
41 ; %3 - index of the register with src1
42 ; %4 - index of the register for intermediate results
43 ; example for %1 - wd: input: src0: x0 x1 x2 x3 z0 z1 z2 z3
44 ; src1: y0 y1 y2 y3 q0 q1 q2 q3
45 ; output: src0: x0 y0 x1 y1 x2 y2 x3 y3
46 ; src1: z0 q0 z1 q1 z2 q2 z3 q3
47 %macro SBUTTERFLY 4
48 %ifidn %1, dqqq
49 vperm2i128 m%4, m%2, m%3, q0301
50 vinserti128 m%2, m%2, xm%3, 1
51 %elif avx_enabled == 0
52 mova m%4, m%2
53 punpckl%1 m%2, m%3
54 punpckh%1 m%4, m%3
55 %else
56 punpckh%1 m%4, m%2, m%3
57 punpckl%1 m%2, m%3
58 %endif
59 SWAP %3, %4
60 %endmacro
61
62 %macro SBUTTERFLY2 4
63 punpckl%1 m%4, m%2, m%3
64 punpckh%1 m%2, m%2, m%3
65 SWAP %2, %4, %3
66 %endmacro
67
68 %macro SBUTTERFLYPS 3
69 unpcklps m%3, m%1, m%2
70 unpckhps m%1, m%1, m%2
71 SWAP %1, %3, %2
72 %endmacro
73
74 %macro SBUTTERFLYPD 3
75 movlhps m%3, m%1, m%2
76 movhlps m%2, m%2, m%1
77 SWAP %1, %3
78 %endmacro
79
80 %macro TRANSPOSE4x4B 5
81 SBUTTERFLY bw, %1, %2, %5
82 SBUTTERFLY bw, %3, %4, %5
83 SBUTTERFLY wd, %1, %3, %5
84 SBUTTERFLY wd, %2, %4, %5
85 SWAP %2, %3
86 %endmacro
87
88 %macro TRANSPOSE4x4W 5
89 SBUTTERFLY wd, %1, %2, %5
90 SBUTTERFLY wd, %3, %4, %5
91 SBUTTERFLY dq, %1, %3, %5
92 SBUTTERFLY dq, %2, %4, %5
93 SWAP %2, %3
94 %endmacro
95
96 %macro TRANSPOSE2x4x4B 5
97 SBUTTERFLY bw, %1, %2, %5
98 SBUTTERFLY bw, %3, %4, %5
99 SBUTTERFLY wd, %1, %3, %5
100 SBUTTERFLY wd, %2, %4, %5
101 SBUTTERFLY dq, %1, %2, %5
102 SBUTTERFLY dq, %3, %4, %5
103 %endmacro
104
105 %macro TRANSPOSE2x4x4W 5
106 SBUTTERFLY wd, %1, %2, %5
107 SBUTTERFLY wd, %3, %4, %5
108 SBUTTERFLY dq, %1, %3, %5
109 SBUTTERFLY dq, %2, %4, %5
110 SBUTTERFLY qdq, %1, %2, %5
111 SBUTTERFLY qdq, %3, %4, %5
112 %endmacro
113
114 %macro TRANSPOSE4x4D 5
115 SBUTTERFLY dq, %1, %2, %5
116 SBUTTERFLY dq, %3, %4, %5
117 SBUTTERFLY qdq, %1, %3, %5
118 SBUTTERFLY qdq, %2, %4, %5
119 SWAP %2, %3
120 %endmacro
121
122 ; identical behavior to TRANSPOSE4x4D, but using SSE1 float ops
123 %macro TRANSPOSE4x4PS 5
124 SBUTTERFLYPS %1, %2, %5
125 SBUTTERFLYPS %3, %4, %5
126 SBUTTERFLYPD %1, %3, %5
127 SBUTTERFLYPD %2, %4, %5
128 SWAP %2, %3
129 %endmacro
130
131 %macro TRANSPOSE8x4D 9-11
132 %if ARCH_X86_64
133 SBUTTERFLY dq, %1, %2, %9
134 SBUTTERFLY dq, %3, %4, %9
135 SBUTTERFLY dq, %5, %6, %9
136 SBUTTERFLY dq, %7, %8, %9
137 SBUTTERFLY qdq, %1, %3, %9
138 SBUTTERFLY qdq, %2, %4, %9
139 SBUTTERFLY qdq, %5, %7, %9
140 SBUTTERFLY qdq, %6, %8, %9
141 SWAP %2, %5
142 SWAP %4, %7
143 %else
144 ; in: m0..m7
145 ; out: m0..m7, unless %11 in which case m2 is in %9
146 ; spills into %9 and %10
147 movdqa %9, m%7
148 SBUTTERFLY dq, %1, %2, %7
149 movdqa %10, m%2
150 movdqa m%7, %9
151 SBUTTERFLY dq, %3, %4, %2
152 SBUTTERFLY dq, %5, %6, %2
153 SBUTTERFLY dq, %7, %8, %2
154 SBUTTERFLY qdq, %1, %3, %2
155 movdqa %9, m%3
156 movdqa m%2, %10
157 SBUTTERFLY qdq, %2, %4, %3
158 SBUTTERFLY qdq, %5, %7, %3
159 SBUTTERFLY qdq, %6, %8, %3
160 SWAP %2, %5
161 SWAP %4, %7
162 %if %0<11
163 movdqa m%3, %9
164 %endif
165 %endif
166 %endmacro
167
168 %macro TRANSPOSE8x8W 9-11
169 %if ARCH_X86_64
170 SBUTTERFLY wd, %1, %2, %9
171 SBUTTERFLY wd, %3, %4, %9
172 SBUTTERFLY wd, %5, %6, %9
173 SBUTTERFLY wd, %7, %8, %9
174 SBUTTERFLY dq, %1, %3, %9
175 SBUTTERFLY dq, %2, %4, %9
176 SBUTTERFLY dq, %5, %7, %9
177 SBUTTERFLY dq, %6, %8, %9
178 SBUTTERFLY qdq, %1, %5, %9
179 SBUTTERFLY qdq, %2, %6, %9
180 SBUTTERFLY qdq, %3, %7, %9
181 SBUTTERFLY qdq, %4, %8, %9
182 SWAP %2, %5
183 SWAP %4, %7
184 %else
185 ; in: m0..m7, unless %11 in which case m6 is in %9
186 ; out: m0..m7, unless %11 in which case m4 is in %10
187 ; spills into %9 and %10
188 %if %0<11
189 movdqa %9, m%7
190 %endif
191 SBUTTERFLY wd, %1, %2, %7
192 movdqa %10, m%2
193 movdqa m%7, %9
194 SBUTTERFLY wd, %3, %4, %2
195 SBUTTERFLY wd, %5, %6, %2
196 SBUTTERFLY wd, %7, %8, %2
197 SBUTTERFLY dq, %1, %3, %2
198 movdqa %9, m%3
199 movdqa m%2, %10
200 SBUTTERFLY dq, %2, %4, %3
201 SBUTTERFLY dq, %5, %7, %3
202 SBUTTERFLY dq, %6, %8, %3
203 SBUTTERFLY qdq, %1, %5, %3
204 SBUTTERFLY qdq, %2, %6, %3
205 movdqa %10, m%2
206 movdqa m%3, %9
207 SBUTTERFLY qdq, %3, %7, %2
208 SBUTTERFLY qdq, %4, %8, %2
209 SWAP %2, %5
210 SWAP %4, %7
211 %if %0<11
212 movdqa m%5, %10
213 %endif
214 %endif
215 %endmacro
216
217 %macro TRANSPOSE16x16W 18-19
218 ; in: m0..m15, unless %19 in which case m6 is in %17
219 ; out: m0..m15, unless %19 in which case m4 is in %18
220 ; spills into %17 and %18
221 %if %0 < 19
222 mova %17, m%7
223 %endif
224
225 SBUTTERFLY dqqq, %1, %9, %7
226 SBUTTERFLY dqqq, %2, %10, %7
227 SBUTTERFLY dqqq, %3, %11, %7
228 SBUTTERFLY dqqq, %4, %12, %7
229 SBUTTERFLY dqqq, %5, %13, %7
230 SBUTTERFLY dqqq, %6, %14, %7
231 mova %18, m%14
232 mova m%7, %17
233 SBUTTERFLY dqqq, %7, %15, %14
234 SBUTTERFLY dqqq, %8, %16, %14
235
236 SBUTTERFLY wd, %1, %2, %14
237 SBUTTERFLY wd, %3, %4, %14
238 SBUTTERFLY wd, %5, %6, %14
239 SBUTTERFLY wd, %7, %8, %14
240 SBUTTERFLY wd, %9, %10, %14
241 SBUTTERFLY wd, %11, %12, %14
242 mova %17, m%12
243 mova m%14, %18
244 SBUTTERFLY wd, %13, %14, %12
245 SBUTTERFLY wd, %15, %16, %12
246
247 SBUTTERFLY dq, %1, %3, %12
248 SBUTTERFLY dq, %2, %4, %12
249 SBUTTERFLY dq, %5, %7, %12
250 SBUTTERFLY dq, %6, %8, %12
251 SBUTTERFLY dq, %9, %11, %12
252 mova %18, m%11
253 mova m%12, %17
254 SBUTTERFLY dq, %10, %12, %11
255 SBUTTERFLY dq, %13, %15, %11
256 SBUTTERFLY dq, %14, %16, %11
257
258 SBUTTERFLY qdq, %1, %5, %11
259 SBUTTERFLY qdq, %2, %6, %11
260 SBUTTERFLY qdq, %3, %7, %11
261 SBUTTERFLY qdq, %4, %8, %11
262
263 SWAP %2, %5
264 SWAP %4, %7
265
266 SBUTTERFLY qdq, %9, %13, %11
267 SBUTTERFLY qdq, %10, %14, %11
268 mova m%11, %18
269 mova %18, m%5
270 SBUTTERFLY qdq, %11, %15, %5
271 SBUTTERFLY qdq, %12, %16, %5
272
273 %if %0 < 19
274 mova m%5, %18
275 %endif
276
277 SWAP %10, %13
278 SWAP %12, %15
279 %endmacro
280
281 %macro TRANSPOSE_8X8B 8
282 %if mmsize == 8
283 %error "This macro does not support mmsize == 8"
284 %endif
285 punpcklbw m%1, m%2
286 punpcklbw m%3, m%4
287 punpcklbw m%5, m%6
288 punpcklbw m%7, m%8
289 TRANSPOSE4x4W %1, %3, %5, %7, %2
290 MOVHL m%2, m%1
291 MOVHL m%4, m%3
292 MOVHL m%6, m%5
293 MOVHL m%8, m%7
294 %endmacro
295
296 ; PABSW macro assumes %1 != %2, while ABS1/2 macros work in-place
297 %macro PABSW 2
298 %if cpuflag(ssse3)
299 pabsw %1, %2
300 %elif cpuflag(mmxext)
301 pxor %1, %1
302 psubw %1, %2
303 pmaxsw %1, %2
304 %else
305 pxor %1, %1
306 pcmpgtw %1, %2
307 pxor %2, %1
308 psubw %2, %1
309 SWAP %1, %2
310 %endif
311 %endmacro
312
313 %macro PSIGNW 2
314 %if cpuflag(ssse3)
315 psignw %1, %2
316 %else
317 pxor %1, %2
318 psubw %1, %2
319 %endif
320 %endmacro
321
322 %macro ABS1 2
323 %if cpuflag(ssse3)
324 pabsw %1, %1
325 %elif cpuflag(mmxext) ; a, tmp
326 pxor %2, %2
327 psubw %2, %1
328 pmaxsw %1, %2
329 %else ; a, tmp
330 pxor %2, %2
331 pcmpgtw %2, %1
332 pxor %1, %2
333 psubw %1, %2
334 %endif
335 %endmacro
336
337 %macro ABS2 4
338 %if cpuflag(ssse3)
339 pabsw %1, %1
340 pabsw %2, %2
341 %elif cpuflag(mmxext) ; a, b, tmp0, tmp1
342 pxor %3, %3
343 pxor %4, %4
344 psubw %3, %1
345 psubw %4, %2
346 pmaxsw %1, %3
347 pmaxsw %2, %4
348 %else ; a, b, tmp0, tmp1
349 pxor %3, %3
350 pxor %4, %4
351 pcmpgtw %3, %1
352 pcmpgtw %4, %2
353 pxor %1, %3
354 pxor %2, %4
355 psubw %1, %3
356 psubw %2, %4
357 %endif
358 %endmacro
359
360 %macro ABSB 2 ; source mmreg, temp mmreg (unused for SSSE3)
361 %if cpuflag(ssse3)
362 pabsb %1, %1
363 %else
364 pxor %2, %2
365 psubb %2, %1
366 pminub %1, %2
367 %endif
368 %endmacro
369
370 %macro ABSB2 4 ; src1, src2, tmp1, tmp2 (tmp1/2 unused for SSSE3)
371 %if cpuflag(ssse3)
372 pabsb %1, %1
373 pabsb %2, %2
374 %else
375 pxor %3, %3
376 pxor %4, %4
377 psubb %3, %1
378 psubb %4, %2
379 pminub %1, %3
380 pminub %2, %4
381 %endif
382 %endmacro
383
384 %macro ABSD2 4
385 pxor %3, %3
386 pxor %4, %4
387 pcmpgtd %3, %1
388 pcmpgtd %4, %2
389 pxor %1, %3
390 pxor %2, %4
391 psubd %1, %3
392 psubd %2, %4
393 %endmacro
394
395 %macro ABS4 6
396 ABS2 %1, %2, %5, %6
397 ABS2 %3, %4, %5, %6
398 %endmacro
399
400 %macro SPLATB_LOAD 3
401 %if cpuflag(ssse3)
402 movd %1, [%2-3]
403 pshufb %1, %3
404 %else
405 movd %1, [%2-3] ;to avoid crossing a cacheline
406 punpcklbw %1, %1
407 SPLATW %1, %1, 3
408 %endif
409 %endmacro
410
411 %macro SPLATB_REG 3
412 %if cpuflag(ssse3)
413 movd %1, %2d
414 pshufb %1, %3
415 %else
416 movd %1, %2d
417 punpcklbw %1, %1
418 SPLATW %1, %1, 0
419 %endif
420 %endmacro
421
422 %macro HADDD 2 ; sum junk
423 %if sizeof%1 == 32
424 %define %2 xmm%2
425 vextracti128 %2, %1, 1
426 %define %1 xmm%1
427 paddd %1, %2
428 %endif
429 %if mmsize >= 16
430 %if cpuflag(xop) && sizeof%1 == 16
431 vphadddq %1, %1
432 %endif
433 movhlps %2, %1
434 paddd %1, %2
435 %endif
436 %if notcpuflag(xop) || sizeof%1 != 16
437 %if cpuflag(mmxext)
438 PSHUFLW %2, %1, q0032
439 %else ; mmx
440 mova %2, %1
441 psrlq %2, 32
442 %endif
443 paddd %1, %2
444 %endif
445 %undef %1
446 %undef %2
447 %endmacro
448
449 %macro HADDW 2 ; reg, tmp
450 %if cpuflag(xop) && sizeof%1 == 16
451 vphaddwq %1, %1
452 movhlps %2, %1
453 paddd %1, %2
454 %else
455 pmaddwd %1, [pw_1]
456 HADDD %1, %2
457 %endif
458 %endmacro
459
460 %macro HADDPS 3 ; dst, src, tmp
461 %if cpuflag(sse3)
462 haddps %1, %1, %2
463 %else
464 movaps %3, %1
465 shufps %1, %2, q2020
466 shufps %3, %2, q3131
467 addps %1, %3
468 %endif
469 %endmacro
470
471 %macro PALIGNR 4-5
472 %if cpuflag(ssse3)
473 %if %0==5
474 palignr %1, %2, %3, %4
475 %else
476 palignr %1, %2, %3
477 %endif
478 %else ; [dst,] src1, src2, imm, tmp
479 %define %%dst %1
480 %if %0==5
481 %ifnidn %1, %2
482 mova %%dst, %2
483 %endif
484 %rotate 1
485 %endif
486 %ifnidn %4, %2
487 mova %4, %2
488 %endif
489 %if mmsize==8
490 psllq %%dst, (8-%3)*8
491 psrlq %4, %3*8
492 %else
493 pslldq %%dst, 16-%3
494 psrldq %4, %3
495 %endif
496 por %%dst, %4
497 %endif
498 %endmacro
499
500 %macro PAVGB 2-4
501 %if cpuflag(mmxext)
502 pavgb %1, %2
503 %elif cpuflag(3dnow)
504 pavgusb %1, %2
505 %elif cpuflag(mmx)
506 movu %3, %2
507 por %3, %1
508 pxor %1, %2
509 pand %1, %4
510 psrlq %1, 1
511 psubb %3, %1
512 SWAP %1, %3
513 %endif
514 %endmacro
515
516 %macro PSHUFLW 1+
517 %if mmsize == 8
518 pshufw %1
519 %else
520 pshuflw %1
521 %endif
522 %endmacro
523
524 %macro PSWAPD 2
525 %if cpuflag(mmxext)
526 pshufw %1, %2, q1032
527 %elif cpuflag(3dnowext)
528 pswapd %1, %2
529 %elif cpuflag(3dnow)
530 movq %1, %2
531 psrlq %1, 32
532 punpckldq %1, %2
533 %endif
534 %endmacro
535
536 %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
537 %ifnum %5
538 pand m%3, m%5, m%4 ; src .. y6 .. y4
539 pand m%1, m%5, m%2 ; dst .. y6 .. y4
540 %else
541 mova m%1, %5
542 pand m%3, m%1, m%4 ; src .. y6 .. y4
543 pand m%1, m%1, m%2 ; dst .. y6 .. y4
544 %endif
545 psrlw m%2, 8 ; dst .. y7 .. y5
546 psrlw m%4, 8 ; src .. y7 .. y5
547 %endmacro
548
549 %macro SUMSUB_BA 3-4
550 %if %0==3
551 padd%1 m%2, m%3
552 padd%1 m%3, m%3
553 psub%1 m%3, m%2
554 %else
555 %if avx_enabled == 0
556 mova m%4, m%2
557 padd%1 m%2, m%3
558 psub%1 m%3, m%4
559 %else
560 padd%1 m%4, m%2, m%3
561 psub%1 m%3, m%2
562 SWAP %2, %4
563 %endif
564 %endif
565 %endmacro
566
567 %macro SUMSUB_BADC 5-6
568 %if %0==6
569 SUMSUB_BA %1, %2, %3, %6
570 SUMSUB_BA %1, %4, %5, %6
571 %else
572 padd%1 m%2, m%3
573 padd%1 m%4, m%5
574 padd%1 m%3, m%3
575 padd%1 m%5, m%5
576 psub%1 m%3, m%2
577 psub%1 m%5, m%4
578 %endif
579 %endmacro
580
581 %macro SUMSUB2_AB 4
582 %ifnum %3
583 psub%1 m%4, m%2, m%3
584 psub%1 m%4, m%3
585 padd%1 m%2, m%2
586 padd%1 m%2, m%3
587 %else
588 mova m%4, m%2
589 padd%1 m%2, m%2
590 padd%1 m%2, %3
591 psub%1 m%4, %3
592 psub%1 m%4, %3
593 %endif
594 %endmacro
595
596 %macro SUMSUB2_BA 4
597 %if avx_enabled == 0
598 mova m%4, m%2
599 padd%1 m%2, m%3
600 padd%1 m%2, m%3
601 psub%1 m%3, m%4
602 psub%1 m%3, m%4
603 %else
604 padd%1 m%4, m%2, m%3
605 padd%1 m%4, m%3
606 psub%1 m%3, m%2
607 psub%1 m%3, m%2
608 SWAP %2, %4
609 %endif
610 %endmacro
611
612 %macro SUMSUBD2_AB 5
613 %ifnum %4
614 psra%1 m%5, m%2, 1 ; %3: %3>>1
615 psra%1 m%4, m%3, 1 ; %2: %2>>1
616 padd%1 m%4, m%2 ; %3: %3>>1+%2
617 psub%1 m%5, m%3 ; %2: %2>>1-%3
618 SWAP %2, %5
619 SWAP %3, %4
620 %else
621 mova %5, m%2
622 mova %4, m%3
623 psra%1 m%3, 1 ; %3: %3>>1
624 psra%1 m%2, 1 ; %2: %2>>1
625 padd%1 m%3, %5 ; %3: %3>>1+%2
626 psub%1 m%2, %4 ; %2: %2>>1-%3
627 %endif
628 %endmacro
629
630 %macro DCT4_1D 5
631 %ifnum %5
632 SUMSUB_BADC w, %4, %1, %3, %2, %5
633 SUMSUB_BA w, %3, %4, %5
634 SUMSUB2_AB w, %1, %2, %5
635 SWAP %1, %3, %4, %5, %2
636 %else
637 SUMSUB_BADC w, %4, %1, %3, %2
638 SUMSUB_BA w, %3, %4
639 mova [%5], m%2
640 SUMSUB2_AB w, %1, [%5], %2
641 SWAP %1, %3, %4, %2
642 %endif
643 %endmacro
644
645 %macro IDCT4_1D 6-7
646 %ifnum %6
647 SUMSUBD2_AB %1, %3, %5, %7, %6
648 ; %3: %3>>1-%5 %5: %3+%5>>1
649 SUMSUB_BA %1, %4, %2, %7
650 ; %4: %2+%4 %2: %2-%4
651 SUMSUB_BADC %1, %5, %4, %3, %2, %7
652 ; %5: %2+%4 + (%3+%5>>1)
653 ; %4: %2+%4 - (%3+%5>>1)
654 ; %3: %2-%4 + (%3>>1-%5)
655 ; %2: %2-%4 - (%3>>1-%5)
656 %else
657 %ifidn %1, w
658 SUMSUBD2_AB %1, %3, %5, [%6], [%6+16]
659 %else
660 SUMSUBD2_AB %1, %3, %5, [%6], [%6+32]
661 %endif
662 SUMSUB_BA %1, %4, %2
663 SUMSUB_BADC %1, %5, %4, %3, %2
664 %endif
665 SWAP %2, %5, %4
666 ; %2: %2+%4 + (%3+%5>>1) row0
667 ; %3: %2-%4 + (%3>>1-%5) row1
668 ; %4: %2-%4 - (%3>>1-%5) row2
669 ; %5: %2+%4 - (%3+%5>>1) row3
670 %endmacro
671
672
673 %macro LOAD_DIFF 5
674 %ifidn %3, none
675 movh %1, %4
676 movh %2, %5
677 punpcklbw %1, %2
678 punpcklbw %2, %2
679 psubw %1, %2
680 %else
681 movh %1, %4
682 punpcklbw %1, %3
683 movh %2, %5
684 punpcklbw %2, %3
685 psubw %1, %2
686 %endif
687 %endmacro
688
689 %macro STORE_DCT 6
690 movq [%5+%6+ 0], m%1
691 movq [%5+%6+ 8], m%2
692 movq [%5+%6+16], m%3
693 movq [%5+%6+24], m%4
694 movhps [%5+%6+32], m%1
695 movhps [%5+%6+40], m%2
696 movhps [%5+%6+48], m%3
697 movhps [%5+%6+56], m%4
698 %endmacro
699
700 %macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
701 LOAD_DIFF m%1, m%5, m%7, [%8], [%9]
702 LOAD_DIFF m%2, m%6, m%7, [%8+r1], [%9+r3]
703 LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3]
704 LOAD_DIFF m%4, m%6, m%7, [%8+r4], [%9+r5]
705 %if %10
706 lea %8, [%8+4*r1]
707 lea %9, [%9+4*r3]
708 %endif
709 %endmacro
710
711 %macro DIFFx2 6-7
712 movh %3, %5
713 punpcklbw %3, %4
714 psraw %1, 6
715 paddsw %1, %3
716 movh %3, %6
717 punpcklbw %3, %4
718 psraw %2, 6
719 paddsw %2, %3
720 packuswb %2, %1
721 %endmacro
722
723 %macro STORE_DIFF 4
724 movh %2, %4
725 punpcklbw %2, %3
726 psraw %1, 6
727 paddsw %1, %2
728 packuswb %1, %1
729 movh %4, %1
730 %endmacro
731
732 %macro STORE_DIFFx2 8 ; add1, add2, reg1, reg2, zero, shift, source, stride
733 movh %3, [%7]
734 movh %4, [%7+%8]
735 psraw %1, %6
736 psraw %2, %6
737 punpcklbw %3, %5
738 punpcklbw %4, %5
739 paddw %3, %1
740 paddw %4, %2
741 packuswb %3, %5
742 packuswb %4, %5
743 movh [%7], %3
744 movh [%7+%8], %4
745 %endmacro
746
747 %macro PMINUB 3 ; dst, src, ignored
748 %if cpuflag(mmxext)
749 pminub %1, %2
750 %else ; dst, src, tmp
751 mova %3, %1
752 psubusb %3, %2
753 psubb %1, %3
754 %endif
755 %endmacro
756
757 %macro SPLATW 2-3 0
758 %if cpuflag(avx2) && %3 == 0
759 vpbroadcastw %1, %2
760 %elif mmsize == 16
761 pshuflw %1, %2, (%3)*0x55
762 punpcklqdq %1, %1
763 %elif cpuflag(mmxext)
764 pshufw %1, %2, (%3)*0x55
765 %else
766 %ifnidn %1, %2
767 mova %1, %2
768 %endif
769 %if %3 & 2
770 punpckhwd %1, %1
771 %else
772 punpcklwd %1, %1
773 %endif
774 %if %3 & 1
775 punpckhwd %1, %1
776 %else
777 punpcklwd %1, %1
778 %endif
779 %endif
780 %endmacro
781
782 %macro SPLATD 1
783 %if mmsize == 8
784 punpckldq %1, %1
785 %elif cpuflag(sse2)
786 pshufd %1, %1, 0
787 %elif cpuflag(sse)
788 shufps %1, %1, 0
789 %endif
790 %endmacro
791
792 %macro CLIPUB 3 ;(dst, min, max)
793 pmaxub %1, %2
794 pminub %1, %3
795 %endmacro
796
797 %macro CLIPW 3 ;(dst, min, max)
798 pmaxsw %1, %2
799 pminsw %1, %3
800 %endmacro
801
802 %macro PMINSD 3 ; dst, src, tmp/unused
803 %if cpuflag(sse4)
804 pminsd %1, %2
805 %else
806 mova %3, %2
807 pcmpgtd %3, %1
808 pxor %1, %2
809 pand %1, %3
810 pxor %1, %2
811 %endif
812 %endmacro
813
814 %macro PMAXSD 3 ; dst, src, tmp/unused
815 %if cpuflag(sse4)
816 pmaxsd %1, %2
817 %else
818 mova %3, %1
819 pcmpgtd %3, %2
820 pand %1, %3
821 pandn %3, %2
822 por %1, %3
823 %endif
824 %endmacro
825
826 %macro CLIPD 3-4
827 %if cpuflag(sse4); src/dst, min, max, unused
828 pminsd %1, %3
829 pmaxsd %1, %2
830 %elif cpuflag(sse2) ; src/dst, min (float), max (float), unused
831 cvtdq2ps %1, %1
832 minps %1, %3
833 maxps %1, %2
834 cvtps2dq %1, %1
835 %else ; src/dst, min, max, tmp
836 PMINSD %1, %3, %4
837 PMAXSD %1, %2, %4
838 %endif
839 %endmacro
840
841 %macro VBROADCASTSS 2 ; dst xmm/ymm, src m32/xmm
842 %if cpuflag(avx2)
843 vbroadcastss %1, %2
844 %elif cpuflag(avx)
845 %ifnum sizeof%2 ; avx1 register
846 shufps xmm%1, xmm%2, xmm%2, q0000
847 %if sizeof%1 >= 32 ; mmsize>=32
848 vinsertf128 %1, %1, xmm%1, 1
849 %endif
850 %else ; avx1 memory
851 vbroadcastss %1, %2
852 %endif
853 %else
854 %ifnum sizeof%2 ; sse register
855 shufps %1, %2, %2, q0000
856 %else ; sse memory
857 movss %1, %2
858 shufps %1, %1, 0
859 %endif
860 %endif
861 %endmacro
862
863 %macro VBROADCASTSD 2 ; dst xmm/ymm, src m64
864 %if cpuflag(avx) && mmsize == 32
865 vbroadcastsd %1, %2
866 %elif cpuflag(sse3)
867 movddup %1, %2
868 %else ; sse2
869 movsd %1, %2
870 movlhps %1, %1
871 %endif
872 %endmacro
873
874 %macro VPBROADCASTD 2 ; dst xmm/ymm, src m32/xmm
875 %if cpuflag(avx2)
876 vpbroadcastd %1, %2
877 %elif cpuflag(avx) && sizeof%1 >= 32
878 %error vpbroadcastd not possible with ymm on avx1. try vbroadcastss
879 %else
880 %ifnum sizeof%2 ; sse2 register
881 pshufd %1, %2, q0000
882 %else ; sse memory
883 movd %1, %2
884 pshufd %1, %1, 0
885 %endif
886 %endif
887 %endmacro
888
889 %macro VBROADCASTI128 2 ; dst xmm/ymm, src : 128bits val
890 %if mmsize > 16
891 vbroadcasti128 %1, %2
892 %else
893 mova %1, %2
894 %endif
895 %endmacro
896
897 %macro SHUFFLE_MASK_W 8
898 %rep 8
899 %if %1>=0x80
900 db %1, %1
901 %else
902 db %1*2
903 db %1*2+1
904 %endif
905 %rotate 1
906 %endrep
907 %endmacro
908
909 %macro PMOVSXWD 2; dst, src
910 %if cpuflag(sse4)
911 pmovsxwd %1, %2
912 %else
913 %ifnidn %1, %2
914 mova %1, %2
915 %endif
916 punpcklwd %1, %1
917 psrad %1, 16
918 %endif
919 %endmacro
920
921 ; Wrapper for non-FMA version of fmaddps
922 %macro FMULADD_PS 5
923 %if cpuflag(fma3) || cpuflag(fma4)
924 fmaddps %1, %2, %3, %4
925 %elifidn %1, %4
926 mulps %5, %2, %3
927 addps %1, %4, %5
928 %else
929 mulps %1, %2, %3
930 addps %1, %4
931 %endif
932 %endmacro
933
934 %macro LSHIFT 2
935 %if mmsize > 8
936 pslldq %1, %2
937 %else
938 psllq %1, 8*(%2)
939 %endif
940 %endmacro
941
942 %macro RSHIFT 2
943 %if mmsize > 8
944 psrldq %1, %2
945 %else
946 psrlq %1, 8*(%2)
947 %endif
948 %endmacro
949
950 %macro MOVHL 2 ; dst, src
951 %ifidn %1, %2
952 punpckhqdq %1, %2
953 %elif cpuflag(avx)
954 punpckhqdq %1, %2, %2
955 %elif cpuflag(sse4)
956 pshufd %1, %2, q3232 ; pshufd is slow on some older CPUs, so only use it on more modern ones
957 %else
958 movhlps %1, %2 ; may cause an int/float domain transition and has a dependency on dst
959 %endif
960 %endmacro
961
962 ; Horizontal Sum of Packed Single precision floats
963 ; The resulting sum is in all elements.
964 %macro HSUMPS 2 ; dst/src, tmp
965 %if cpuflag(avx)
966 %if sizeof%1>=32 ; avx
967 vperm2f128 %2, %1, %1, (0)*16+(1)
968 addps %1, %2
969 %endif
970 shufps %2, %1, %1, q1032
971 addps %1, %2
972 shufps %2, %1, %1, q0321
973 addps %1, %2
974 %else ; this form is a bit faster than the short avx-like emulation.
975 movaps %2, %1
976 shufps %1, %1, q1032
977 addps %1, %2
978 movaps %2, %1
979 shufps %1, %1, q0321
980 addps %1, %2
981 ; all %1 members should be equal for as long as float a+b==b+a
982 %endif
983 %endmacro
984
985 ; Emulate blendvps if not available
986 ;
987 ; src_b is destroyed when using emulation with logical operands
988 ; SSE41 blendv instruction is hard coded to use xmm0 as mask
989 %macro BLENDVPS 3 ; dst/src_a, src_b, mask
990 %if cpuflag(avx)
991 blendvps %1, %1, %2, %3
992 %elif cpuflag(sse4)
993 %ifnidn %3,xmm0
994 %error sse41 blendvps uses xmm0 as default 3d operand, you used %3
995 %endif
996 blendvps %1, %2, %3
997 %else
998 xorps %2, %1
999 andps %2, %3
1000 xorps %1, %2
1001 %endif
1002 %endmacro
1003
1004 ; Emulate pblendvb if not available
1005 ;
1006 ; src_b is destroyed when using emulation with logical operands
1007 ; SSE41 blendv instruction is hard coded to use xmm0 as mask
1008 %macro PBLENDVB 3 ; dst/src_a, src_b, mask
1009 %if cpuflag(avx)
1010 %if cpuflag(avx) && notcpuflag(avx2) && sizeof%1 >= 32
1011 %error pblendb not possible with ymm on avx1, try blendvps.
1012 %endif
1013 pblendvb %1, %1, %2, %3
1014 %elif cpuflag(sse4)
1015 %ifnidn %3,xmm0
1016 %error sse41 pblendvd uses xmm0 as default 3d operand, you used %3
1017 %endif
1018 pblendvb %1, %2, %3
1019 %else
1020 pxor %2, %1
1021 pand %2, %3
1022 pxor %1, %2
1023 %endif
1024 %endmacro