]> git.sesse.net Git - x264/blob - common/x86/x86util.asm
MBAFF: Create a VSAD DSP function
[x264] / common / x86 / x86util.asm
1 ;*****************************************************************************
2 ;* x86util.asm: x86 utility macros
3 ;*****************************************************************************
4 ;* Copyright (C) 2008-2011 x264 project
5 ;*
6 ;* Authors: Holger Lubitz <holger@lubitz.org>
7 ;*          Loren Merritt <lorenm@u.washington.edu>
8 ;*
9 ;* This program is free software; you can redistribute it and/or modify
10 ;* it under the terms of the GNU General Public License as published by
11 ;* the Free Software Foundation; either version 2 of the License, or
12 ;* (at your option) any later version.
13 ;*
14 ;* This program 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
17 ;* GNU General Public License for more details.
18 ;*
19 ;* You should have received a copy of the GNU General Public License
20 ;* along with this program; if not, write to the Free Software
21 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
22 ;*
23 ;* This program is also available under a commercial proprietary license.
24 ;* For more information, contact us at licensing@x264.com.
25 ;*****************************************************************************
26
27 %assign FENC_STRIDE 16
28 %assign FDEC_STRIDE 32
29
30 %assign SIZEOF_PIXEL 1
31 %assign SIZEOF_DCTCOEF 2
32 %define pixel byte
33 %ifdef HIGH_BIT_DEPTH
34     %assign SIZEOF_PIXEL 2
35     %assign SIZEOF_DCTCOEF 4
36     %define pixel word
37 %endif
38
39 %assign FENC_STRIDEB SIZEOF_PIXEL*FENC_STRIDE
40 %assign FDEC_STRIDEB SIZEOF_PIXEL*FDEC_STRIDE
41
42 %assign PIXEL_MAX ((1 << BIT_DEPTH)-1)
43
44 %macro SBUTTERFLY 4
45 %if avx_enabled == 0
46     mova      m%4, m%2
47     punpckl%1 m%2, m%3
48     punpckh%1 m%4, m%3
49 %else
50     punpckh%1 m%4, m%2, m%3
51     punpckl%1 m%2, m%3
52 %endif
53     SWAP %3, %4
54 %endmacro
55
56 %macro SBUTTERFLY2 4
57     punpckl%1 m%4, m%2, m%3
58     punpckh%1 m%2, m%2, m%3
59     SWAP %2, %4, %3
60 %endmacro
61
62 %macro TRANSPOSE4x4W 5
63     SBUTTERFLY wd, %1, %2, %5
64     SBUTTERFLY wd, %3, %4, %5
65     SBUTTERFLY dq, %1, %3, %5
66     SBUTTERFLY dq, %2, %4, %5
67     SWAP %2, %3
68 %endmacro
69
70 %macro TRANSPOSE2x4x4W 5
71     SBUTTERFLY wd,  %1, %2, %5
72     SBUTTERFLY wd,  %3, %4, %5
73     SBUTTERFLY dq,  %1, %3, %5
74     SBUTTERFLY dq,  %2, %4, %5
75     SBUTTERFLY qdq, %1, %2, %5
76     SBUTTERFLY qdq, %3, %4, %5
77 %endmacro
78
79 %macro TRANSPOSE4x4D 5
80     SBUTTERFLY dq,  %1, %2, %5
81     SBUTTERFLY dq,  %3, %4, %5
82     SBUTTERFLY qdq, %1, %3, %5
83     SBUTTERFLY qdq, %2, %4, %5
84     SWAP %2, %3
85 %endmacro
86
87 %macro TRANSPOSE8x8W 9-11
88 %ifdef ARCH_X86_64
89     SBUTTERFLY wd,  %1, %2, %9
90     SBUTTERFLY wd,  %3, %4, %9
91     SBUTTERFLY wd,  %5, %6, %9
92     SBUTTERFLY wd,  %7, %8, %9
93     SBUTTERFLY dq,  %1, %3, %9
94     SBUTTERFLY dq,  %2, %4, %9
95     SBUTTERFLY dq,  %5, %7, %9
96     SBUTTERFLY dq,  %6, %8, %9
97     SBUTTERFLY qdq, %1, %5, %9
98     SBUTTERFLY qdq, %2, %6, %9
99     SBUTTERFLY qdq, %3, %7, %9
100     SBUTTERFLY qdq, %4, %8, %9
101     SWAP %2, %5
102     SWAP %4, %7
103 %else
104 ; in:  m0..m7, unless %11 in which case m6 is in %9
105 ; out: m0..m7, unless %11 in which case m4 is in %10
106 ; spills into %9 and %10
107 %if %0<11
108     movdqa %9, m%7
109 %endif
110     SBUTTERFLY wd,  %1, %2, %7
111     movdqa %10, m%2
112     movdqa m%7, %9
113     SBUTTERFLY wd,  %3, %4, %2
114     SBUTTERFLY wd,  %5, %6, %2
115     SBUTTERFLY wd,  %7, %8, %2
116     SBUTTERFLY dq,  %1, %3, %2
117     movdqa %9, m%3
118     movdqa m%2, %10
119     SBUTTERFLY dq,  %2, %4, %3
120     SBUTTERFLY dq,  %5, %7, %3
121     SBUTTERFLY dq,  %6, %8, %3
122     SBUTTERFLY qdq, %1, %5, %3
123     SBUTTERFLY qdq, %2, %6, %3
124     movdqa %10, m%2
125     movdqa m%3, %9
126     SBUTTERFLY qdq, %3, %7, %2
127     SBUTTERFLY qdq, %4, %8, %2
128     SWAP %2, %5
129     SWAP %4, %7
130 %if %0<11
131     movdqa m%5, %10
132 %endif
133 %endif
134 %endmacro
135
136 %macro ABS1_MMX 2    ; a, tmp
137     pxor    %2, %2
138     psubw   %2, %1
139     pmaxsw  %1, %2
140 %endmacro
141
142 %macro ABS2_MMX 4    ; a, b, tmp0, tmp1
143     pxor    %3, %3
144     pxor    %4, %4
145     psubw   %3, %1
146     psubw   %4, %2
147     pmaxsw  %1, %3
148     pmaxsw  %2, %4
149 %endmacro
150
151 %macro ABS1_SSSE3 2
152     pabsw   %1, %1
153 %endmacro
154
155 %macro ABS2_SSSE3 4
156     pabsw   %1, %1
157     pabsw   %2, %2
158 %endmacro
159
160 %macro ABSB_MMX 2
161     pxor    %2, %2
162     psubb   %2, %1
163     pminub  %1, %2
164 %endmacro
165
166 %macro ABSB2_MMX 4
167     pxor    %3, %3
168     pxor    %4, %4
169     psubb   %3, %1
170     psubb   %4, %2
171     pminub  %1, %3
172     pminub  %2, %4
173 %endmacro
174
175 %macro ABSD2_MMX 4
176     pxor    %3, %3
177     pxor    %4, %4
178     pcmpgtd %3, %1
179     pcmpgtd %4, %2
180     pxor    %1, %3
181     pxor    %2, %4
182     psubd   %1, %3
183     psubd   %2, %4
184 %endmacro
185
186 %macro ABSB_SSSE3 2
187     pabsb   %1, %1
188 %endmacro
189
190 %macro ABSB2_SSSE3 4
191     pabsb   %1, %1
192     pabsb   %2, %2
193 %endmacro
194
195 %macro ABS4 6
196     ABS2 %1, %2, %5, %6
197     ABS2 %3, %4, %5, %6
198 %endmacro
199
200 %define ABS1 ABS1_MMX
201 %define ABS2 ABS2_MMX
202 %define ABSB ABSB_MMX
203 %define ABSB2 ABSB2_MMX
204
205 %macro SPLATB_MMX 3
206     movd      %1, [%2-3] ;to avoid crossing a cacheline
207     punpcklbw %1, %1
208     SPLATW    %1, %1, 3
209 %endmacro
210
211 %macro SPLATB_SSSE3 3
212     movd      %1, [%2-3]
213     pshufb    %1, %3
214 %endmacro
215
216 %macro PALIGNR_MMX 4-5 ; [dst,] src1, src2, imm, tmp
217     %define %%dst %1
218 %if %0==5
219 %ifnidn %1, %2
220     mova    %%dst, %2
221 %endif
222     %rotate 1
223 %endif
224 %ifnidn %4, %2
225     mova    %4, %2
226 %endif
227 %if mmsize==8
228     psllq   %%dst, (8-%3)*8
229     psrlq   %4, %3*8
230 %else
231     pslldq  %%dst, 16-%3
232     psrldq  %4, %3
233 %endif
234     por     %%dst, %4
235 %endmacro
236
237 %macro PALIGNR_SSSE3 4-5
238 %if %0==5
239     palignr %1, %2, %3, %4
240 %else
241     palignr %1, %2, %3
242 %endif
243 %endmacro
244
245 %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
246 %ifnum %5
247     pand   m%3, m%5, m%4 ; src .. y6 .. y4
248     pand   m%1, m%5, m%2 ; dst .. y6 .. y4
249 %else
250     mova   m%1, %5
251     pand   m%3, m%1, m%4 ; src .. y6 .. y4
252     pand   m%1, m%1, m%2 ; dst .. y6 .. y4
253 %endif
254     psrlw  m%2, 8        ; dst .. y7 .. y5
255     psrlw  m%4, 8        ; src .. y7 .. y5
256 %endmacro
257
258 %macro SUMSUB_BA 3-4
259 %if %0==3
260     padd%1  m%2, m%3
261     padd%1  m%3, m%3
262     psub%1  m%3, m%2
263 %else
264 %if avx_enabled == 0
265     mova    m%4, m%2
266     padd%1  m%2, m%3
267     psub%1  m%3, m%4
268 %else
269     padd%1  m%4, m%2, m%3
270     psub%1  m%3, m%2
271     SWAP    %2, %4
272 %endif
273 %endif
274 %endmacro
275
276 %macro SUMSUB_BADC 5-6
277 %if %0==6
278     SUMSUB_BA %1, %2, %3, %6
279     SUMSUB_BA %1, %4, %5, %6
280 %else
281     padd%1  m%2, m%3
282     padd%1  m%4, m%5
283     padd%1  m%3, m%3
284     padd%1  m%5, m%5
285     psub%1  m%3, m%2
286     psub%1  m%5, m%4
287 %endif
288 %endmacro
289
290 %macro HADAMARD4_V 4+
291     SUMSUB_BADC w, %1, %2, %3, %4
292     SUMSUB_BADC w, %1, %3, %2, %4
293 %endmacro
294
295 %macro HADAMARD8_V 8+
296     SUMSUB_BADC w, %1, %2, %3, %4
297     SUMSUB_BADC w, %5, %6, %7, %8
298     SUMSUB_BADC w, %1, %3, %2, %4
299     SUMSUB_BADC w, %5, %7, %6, %8
300     SUMSUB_BADC w, %1, %5, %2, %6
301     SUMSUB_BADC w, %3, %7, %4, %8
302 %endmacro
303
304 %macro TRANS_SSE2 5-6
305 ; TRANSPOSE2x2
306 ; %1: transpose width (d/q) - use SBUTTERFLY qdq for dq
307 ; %2: ord/unord (for compat with sse4, unused)
308 ; %3/%4: source regs
309 ; %5/%6: tmp regs
310 %ifidn %1, d
311 %define mask [mask_10]
312 %define shift 16
313 %elifidn %1, q
314 %define mask [mask_1100]
315 %define shift 32
316 %endif
317 %if %0==6 ; less dependency if we have two tmp
318     mova   m%5, mask   ; ff00
319     mova   m%6, m%4    ; x5x4
320     psll%1 m%4, shift  ; x4..
321     pand   m%6, m%5    ; x5..
322     pandn  m%5, m%3    ; ..x0
323     psrl%1 m%3, shift  ; ..x1
324     por    m%4, m%5    ; x4x0
325     por    m%3, m%6    ; x5x1
326 %else ; more dependency, one insn less. sometimes faster, sometimes not
327     mova   m%5, m%4    ; x5x4
328     psll%1 m%4, shift  ; x4..
329     pxor   m%4, m%3    ; (x4^x1)x0
330     pand   m%4, mask   ; (x4^x1)..
331     pxor   m%3, m%4    ; x4x0
332     psrl%1 m%4, shift  ; ..(x1^x4)
333     pxor   m%5, m%4    ; x5x1
334     SWAP   %4, %3, %5
335 %endif
336 %endmacro
337
338 %macro TRANS_SSE4 5-6 ; see above
339 %ifidn %1, d
340 %ifidn %2, ord
341     psrl%1  m%5, m%3, 16
342     pblendw m%5, m%4, 10101010b
343     psll%1  m%4, 16
344     pblendw m%4, m%3, 01010101b
345     SWAP     %3, %5
346 %else
347 %if avx_enabled == 0
348     mova    m%5, m%3
349     pblendw m%3, m%4, 10101010b
350 %else
351     pblendw m%5, m%3, m%4, 10101010b
352     SWAP     %3, %5
353 %endif
354     psll%1  m%4, 16
355     psrl%1  m%5, 16
356     por     m%4, m%5
357 %endif
358 %elifidn %1, q
359     shufps m%5, m%3, m%4, 11011101b
360     shufps m%3, m%4, 10001000b
361     SWAP    %4, %5
362 %endif
363 %endmacro
364
365 %macro HADAMARD 5-6
366 ; %1=distance in words (0 for vertical pass, 1/2/4 for horizontal passes)
367 ; %2=sumsub/max/amax (sum and diff / maximum / maximum of absolutes)
368 ; %3/%4: regs
369 ; %5(%6): tmpregs
370 %if %1!=0 ; have to reorder stuff for horizontal op
371     %ifidn %2, sumsub
372          %define ORDER ord
373          ; sumsub needs order because a-b != b-a unless a=b
374     %else
375          %define ORDER unord
376          ; if we just max, order doesn't matter (allows pblendw+or in sse4)
377     %endif
378     %if %1==1
379          TRANS d, ORDER, %3, %4, %5, %6
380     %elif %1==2
381          %if mmsize==8
382              SBUTTERFLY dq, %3, %4, %5
383          %else
384              TRANS q, ORDER, %3, %4, %5, %6
385          %endif
386     %elif %1==4
387          SBUTTERFLY qdq, %3, %4, %5
388     %endif
389 %endif
390 %ifidn %2, sumsub
391     SUMSUB_BA w, %3, %4, %5
392 %else
393     %ifidn %2, amax
394         %if %0==6
395             ABS2 m%3, m%4, m%5, m%6
396         %else
397             ABS1 m%3, m%5
398             ABS1 m%4, m%5
399         %endif
400     %endif
401     pmaxsw m%3, m%4
402 %endif
403 %endmacro
404
405
406 %macro HADAMARD2_2D 6-7 sumsub
407     HADAMARD 0, sumsub, %1, %2, %5
408     HADAMARD 0, sumsub, %3, %4, %5
409     SBUTTERFLY %6, %1, %2, %5
410 %ifnum %7
411     HADAMARD 0, amax, %1, %2, %5, %7
412 %else
413     HADAMARD 0, %7, %1, %2, %5
414 %endif
415     SBUTTERFLY %6, %3, %4, %5
416 %ifnum %7
417     HADAMARD 0, amax, %3, %4, %5, %7
418 %else
419     HADAMARD 0, %7, %3, %4, %5
420 %endif
421 %endmacro
422
423 %macro HADAMARD4_2D 5-6 sumsub
424     HADAMARD2_2D %1, %2, %3, %4, %5, wd
425     HADAMARD2_2D %1, %3, %2, %4, %5, dq, %6
426     SWAP %2, %3
427 %endmacro
428
429 %macro HADAMARD4_2D_SSE 5-6 sumsub
430     HADAMARD  0, sumsub, %1, %2, %5 ; 1st V row 0 + 1
431     HADAMARD  0, sumsub, %3, %4, %5 ; 1st V row 2 + 3
432     SBUTTERFLY   wd, %1, %2, %5     ; %1: m0 1+0 %2: m1 1+0
433     SBUTTERFLY   wd, %3, %4, %5     ; %3: m0 3+2 %4: m1 3+2
434     HADAMARD2_2D %1, %3, %2, %4, %5, dq
435     SBUTTERFLY  qdq, %1, %2, %5
436     HADAMARD  0, %6, %1, %2, %5     ; 2nd H m1/m0 row 0+1
437     SBUTTERFLY  qdq, %3, %4, %5
438     HADAMARD  0, %6, %3, %4, %5     ; 2nd H m1/m0 row 2+3
439 %endmacro
440
441 %macro HADAMARD8_2D 9-10 sumsub
442     HADAMARD2_2D %1, %2, %3, %4, %9, wd
443     HADAMARD2_2D %5, %6, %7, %8, %9, wd
444     HADAMARD2_2D %1, %3, %2, %4, %9, dq
445     HADAMARD2_2D %5, %7, %6, %8, %9, dq
446     HADAMARD2_2D %1, %5, %3, %7, %9, qdq, %10
447     HADAMARD2_2D %2, %6, %4, %8, %9, qdq, %10
448 %ifnidn %10, amax
449     SWAP %2, %5
450     SWAP %4, %7
451 %endif
452 %endmacro
453
454 %macro SUMSUB2_AB 4
455 %ifnum %3
456     psub%1  m%4, m%2, m%3
457     psub%1  m%4, m%3
458     padd%1  m%2, m%2
459     padd%1  m%2, m%3
460 %else
461     mova    m%4, m%2
462     padd%1  m%2, m%2
463     padd%1  m%2, %3
464     psub%1  m%4, %3
465     psub%1  m%4, %3
466 %endif
467 %endmacro
468
469 %macro SUMSUB2_BA 4
470 %if avx_enabled == 0
471     mova    m%4, m%2
472     padd%1  m%2, m%3
473     padd%1  m%2, m%3
474     psub%1  m%3, m%4
475     psub%1  m%3, m%4
476 %else
477     padd%1  m%4, m%2, m%3
478     padd%1  m%4, m%3
479     psub%1  m%3, m%2
480     psub%1  m%3, m%2
481     SWAP     %2,  %4
482 %endif
483 %endmacro
484
485 %macro SUMSUBD2_AB 5
486 %ifnum %4
487     psra%1  m%5, m%2, 1  ; %3: %3>>1
488     psra%1  m%4, m%3, 1  ; %2: %2>>1
489     padd%1  m%4, m%2     ; %3: %3>>1+%2
490     psub%1  m%5, m%3     ; %2: %2>>1-%3
491     SWAP     %2, %5
492     SWAP     %3, %4
493 %else
494     mova    %5, m%2
495     mova    %4, m%3
496     psra%1  m%3, 1  ; %3: %3>>1
497     psra%1  m%2, 1  ; %2: %2>>1
498     padd%1  m%3, %5 ; %3: %3>>1+%2
499     psub%1  m%2, %4 ; %2: %2>>1-%3
500 %endif
501 %endmacro
502
503 %macro DCT4_1D 5
504 %ifnum %5
505     SUMSUB_BADC w, %4, %1, %3, %2, %5
506     SUMSUB_BA   w, %3, %4, %5
507     SUMSUB2_AB  w, %1, %2, %5
508     SWAP %1, %3, %4, %5, %2
509 %else
510     SUMSUB_BADC w, %4, %1, %3, %2
511     SUMSUB_BA   w, %3, %4
512     mova     [%5], m%2
513     SUMSUB2_AB  w, %1, [%5], %2
514     SWAP %1, %3, %4, %2
515 %endif
516 %endmacro
517
518 %macro IDCT4_1D 6-7
519 %ifnum %6
520     SUMSUBD2_AB %1, %3, %5, %7, %6
521     ; %3: %3>>1-%5 %5: %3+%5>>1
522     SUMSUB_BA   %1, %4, %2, %7
523     ; %4: %2+%4 %2: %2-%4
524     SUMSUB_BADC %1, %5, %4, %3, %2, %7
525     ; %5: %2+%4 + (%3+%5>>1)
526     ; %4: %2+%4 - (%3+%5>>1)
527     ; %3: %2-%4 + (%3>>1-%5)
528     ; %2: %2-%4 - (%3>>1-%5)
529 %else
530 %ifidn %1, w
531     SUMSUBD2_AB %1, %3, %5, [%6], [%6+16]
532 %else
533     SUMSUBD2_AB %1, %3, %5, [%6], [%6+32]
534 %endif
535     SUMSUB_BA   %1, %4, %2
536     SUMSUB_BADC %1, %5, %4, %3, %2
537 %endif
538     SWAP %2, %5, %4
539     ; %2: %2+%4 + (%3+%5>>1) row0
540     ; %3: %2-%4 + (%3>>1-%5) row1
541     ; %4: %2-%4 - (%3>>1-%5) row2
542     ; %5: %2+%4 - (%3+%5>>1) row3
543 %endmacro
544
545
546 %macro LOAD_DIFF 5
547 %ifdef HIGH_BIT_DEPTH
548     mova       %1, %4
549     psubw      %1, %5
550 %elifidn %3, none
551     movh       %1, %4
552     movh       %2, %5
553     punpcklbw  %1, %2
554     punpcklbw  %2, %2
555     psubw      %1, %2
556 %else
557     movh       %1, %4
558     punpcklbw  %1, %3
559     movh       %2, %5
560     punpcklbw  %2, %3
561     psubw      %1, %2
562 %endif
563 %endmacro
564
565 %macro LOAD_DIFF8x4_SSE2 8
566     LOAD_DIFF  m%1, m%5, m%6, [%7+%1*FENC_STRIDE], [%8+%1*FDEC_STRIDE]
567     LOAD_DIFF  m%2, m%5, m%6, [%7+%2*FENC_STRIDE], [%8+%2*FDEC_STRIDE]
568     LOAD_DIFF  m%3, m%5, m%6, [%7+%3*FENC_STRIDE], [%8+%3*FDEC_STRIDE]
569     LOAD_DIFF  m%4, m%5, m%6, [%7+%4*FENC_STRIDE], [%8+%4*FDEC_STRIDE]
570 %endmacro
571
572 %macro LOAD_DIFF8x4_SSSE3 8 ; 4x dst, 1x tmp, 1x mul, 2x ptr
573     movh       m%2, [%8+%1*FDEC_STRIDE]
574     movh       m%1, [%7+%1*FENC_STRIDE]
575     punpcklbw  m%1, m%2
576     movh       m%3, [%8+%2*FDEC_STRIDE]
577     movh       m%2, [%7+%2*FENC_STRIDE]
578     punpcklbw  m%2, m%3
579     movh       m%4, [%8+%3*FDEC_STRIDE]
580     movh       m%3, [%7+%3*FENC_STRIDE]
581     punpcklbw  m%3, m%4
582     movh       m%5, [%8+%4*FDEC_STRIDE]
583     movh       m%4, [%7+%4*FENC_STRIDE]
584     punpcklbw  m%4, m%5
585     pmaddubsw  m%1, m%6
586     pmaddubsw  m%2, m%6
587     pmaddubsw  m%3, m%6
588     pmaddubsw  m%4, m%6
589 %endmacro
590
591 %macro STORE_DCT 6
592     movq   [%5+%6+ 0], m%1
593     movq   [%5+%6+ 8], m%2
594     movq   [%5+%6+16], m%3
595     movq   [%5+%6+24], m%4
596     movhps [%5+%6+32], m%1
597     movhps [%5+%6+40], m%2
598     movhps [%5+%6+48], m%3
599     movhps [%5+%6+56], m%4
600 %endmacro
601
602 %macro STORE_IDCT 4
603     movhps [r0-4*FDEC_STRIDE], %1
604     movh   [r0-3*FDEC_STRIDE], %1
605     movhps [r0-2*FDEC_STRIDE], %2
606     movh   [r0-1*FDEC_STRIDE], %2
607     movhps [r0+0*FDEC_STRIDE], %3
608     movh   [r0+1*FDEC_STRIDE], %3
609     movhps [r0+2*FDEC_STRIDE], %4
610     movh   [r0+3*FDEC_STRIDE], %4
611 %endmacro
612
613 %macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
614     LOAD_DIFF m%1, m%5, m%7, [%8],      [%9]
615     LOAD_DIFF m%2, m%6, m%7, [%8+r1],   [%9+r3]
616     LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3]
617     LOAD_DIFF m%4, m%6, m%7, [%8+r4],   [%9+r5]
618 %if %10
619     lea %8, [%8+4*r1]
620     lea %9, [%9+4*r3]
621 %endif
622 %endmacro
623
624 %macro DIFFx2 6-7
625     movh       %3, %5
626     punpcklbw  %3, %4
627     psraw      %1, 6
628     paddsw     %1, %3
629     movh       %3, %6
630     punpcklbw  %3, %4
631     psraw      %2, 6
632     paddsw     %2, %3
633     packuswb   %2, %1
634 %endmacro
635
636 %macro STORE_DIFF 4
637     movh       %2, %4
638     punpcklbw  %2, %3
639     psraw      %1, 6
640     paddsw     %1, %2
641     packuswb   %1, %1
642     movh       %4, %1
643 %endmacro
644
645 %macro CLIPW 3 ;(dst, min, max)
646     pmaxsw %1, %2
647     pminsw %1, %3
648 %endmacro
649
650 %macro HADDD 2 ; sum junk
651 %if mmsize == 16
652     movhlps %2, %1
653     paddd   %1, %2
654     pshuflw %2, %1, 0xE
655     paddd   %1, %2
656 %else
657     pshufw  %2, %1, 0xE
658     paddd   %1, %2
659 %endif
660 %endmacro
661
662 %macro HADDW 2
663     pmaddwd %1, [pw_1]
664     HADDD   %1, %2
665 %endmacro
666
667 %macro HADDUW 2
668     psrld %2, %1, 16
669     pslld %1, 16
670     psrld %1, 16
671     paddd %1, %2
672     HADDD %1, %2
673 %endmacro
674
675 %macro FIX_STRIDES 1-*
676 %ifdef HIGH_BIT_DEPTH
677 %rep %0
678     add %1, %1
679     %rotate 1
680 %endrep
681 %endif
682 %endmacro
683
684 %macro SPLATW 2-3 0
685 %if mmsize == 16
686     pshuflw    %1, %2, (%3)*0x55
687     punpcklqdq %1, %1
688 %else
689     pshufw     %1, %2, (%3)*0x55
690 %endif
691 %endmacro
692
693 %macro SPLATD 2-3 0
694 %if mmsize == 16
695     pshufd %1, %2, (%3)*0x55
696 %else
697     pshufw %1, %2, (%3)*0x11 + ((%3)+1)*0x44
698 %endif
699 %endmacro