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