]> git.sesse.net Git - x264/blob - common/x86/dct-a.asm
add date and compiler to `x264 --version`
[x264] / common / x86 / dct-a.asm
1 ;*****************************************************************************
2 ;* dct-a.asm: h264 encoder library
3 ;*****************************************************************************
4 ;* Copyright (C) 2003-2008 x264 project
5 ;*
6 ;* Authors: Laurent Aimar <fenrir@via.ecp.fr>
7 ;*          Loren Merritt <lorenm@u.washington.edu>
8 ;*          Min Chen <chenm001.163.com>
9 ;*
10 ;* This program is free software; you can redistribute it and/or modify
11 ;* it under the terms of the GNU General Public License as published by
12 ;* the Free Software Foundation; either version 2 of the License, or
13 ;* (at your option) any later version.
14 ;*
15 ;* This program is distributed in the hope that it will be useful,
16 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ;* GNU General Public License for more details.
19 ;*
20 ;* You should have received a copy of the GNU General Public License
21 ;* along with this program; if not, write to the Free Software
22 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
23 ;*****************************************************************************
24
25 %include "x86inc.asm"
26 %include "x86util.asm"
27
28 SECTION_RODATA
29 pw_32: times 8 dw 32
30 pw_8000: times 8 dw 0x8000
31 pb_sub4frame:   db 0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15
32 pb_scan4framea: db 12,13,6,7,14,15,0,1,8,9,2,3,4,5,10,11
33 pb_scan4frameb: db 0,1,8,9,2,3,4,5,10,11,12,13,6,7,14,15
34
35 SECTION .text
36
37 %macro HADAMARD4_1D 4
38     SUMSUB_BADC m%2, m%1, m%4, m%3
39     SUMSUB_BADC m%4, m%2, m%3, m%1
40     SWAP %1, %4, %3
41 %endmacro
42
43 %macro SUMSUB_17BIT 4 ; a, b, tmp, 0x8000
44     movq  m%3, m%4
45     paddw m%1, m%4
46     psubw m%3, m%2
47     paddw m%2, m%4
48     pavgw m%3, m%1
49     pavgw m%2, m%1
50     psubw m%3, m%4
51     psubw m%2, m%4
52     SWAP %1, %2, %3
53 %endmacro
54
55 ;-----------------------------------------------------------------------------
56 ; void x264_dct4x4dc_mmx( int16_t d[4][4] )
57 ;-----------------------------------------------------------------------------
58 cglobal x264_dct4x4dc_mmx, 1,1
59     movq   m0, [r0+ 0]
60     movq   m1, [r0+ 8]
61     movq   m2, [r0+16]
62     movq   m3, [r0+24]
63     movq   m7, [pw_8000 GLOBAL] ; convert to unsigned and back, so that pavgw works
64     HADAMARD4_1D  0,1,2,3
65     TRANSPOSE4x4W 0,1,2,3,4
66     SUMSUB_BADC m1, m0, m3, m2
67     SWAP 0,1
68     SWAP 2,3
69     SUMSUB_17BIT 0,2,4,7
70     SUMSUB_17BIT 1,3,5,7
71     movq  [r0+0], m0
72     movq  [r0+8], m2
73     movq [r0+16], m3
74     movq [r0+24], m1
75     RET
76
77 ;-----------------------------------------------------------------------------
78 ; void x264_idct4x4dc_mmx( int16_t d[4][4] )
79 ;-----------------------------------------------------------------------------
80 cglobal x264_idct4x4dc_mmx, 1,1
81     movq  m0, [r0+ 0]
82     movq  m1, [r0+ 8]
83     movq  m2, [r0+16]
84     movq  m3, [r0+24]
85     HADAMARD4_1D  0,1,2,3
86     TRANSPOSE4x4W 0,1,2,3,4
87     HADAMARD4_1D  0,1,2,3
88     movq  [r0+ 0], m0
89     movq  [r0+ 8], m1
90     movq  [r0+16], m2
91     movq  [r0+24], m3
92     RET
93
94 %macro DCT4_1D 5
95     SUMSUB_BADC m%4, m%1, m%3, m%2
96     SUMSUB_BA   m%3, m%4
97     SUMSUB2_AB  m%1, m%2, m%5
98     SWAP %1, %3, %4, %5, %2
99 %endmacro
100
101 %macro IDCT4_1D 6
102     SUMSUB_BA   m%3, m%1
103     SUMSUBD2_AB m%2, m%4, m%6, m%5
104     SUMSUB_BADC m%2, m%3, m%5, m%1
105     SWAP %1, %2, %5, %4, %3
106 %endmacro
107
108 ;-----------------------------------------------------------------------------
109 ; void x264_sub4x4_dct_mmx( int16_t dct[4][4], uint8_t *pix1, uint8_t *pix2 )
110 ;-----------------------------------------------------------------------------
111 cglobal x264_sub4x4_dct_mmx, 3,3
112 .skip_prologue:
113 %macro SUB_DCT4 1
114     LOAD_DIFF  m0, m6, m7, [r1+0*FENC_STRIDE], [r2+0*FDEC_STRIDE]
115     LOAD_DIFF  m1, m6, m7, [r1+1*FENC_STRIDE], [r2+1*FDEC_STRIDE]
116     LOAD_DIFF  m2, m6, m7, [r1+2*FENC_STRIDE], [r2+2*FDEC_STRIDE]
117     LOAD_DIFF  m3, m6, m7, [r1+3*FENC_STRIDE], [r2+3*FDEC_STRIDE]
118     DCT4_1D 0,1,2,3,4
119     TRANSPOSE%1 0,1,2,3,4
120     DCT4_1D 0,1,2,3,4
121     movq  [r0+ 0], m0
122     movq  [r0+ 8], m1
123     movq  [r0+16], m2
124     movq  [r0+24], m3
125 %endmacro
126     SUB_DCT4 4x4W
127     RET
128
129 ;-----------------------------------------------------------------------------
130 ; void x264_add4x4_idct_mmx( uint8_t *p_dst, int16_t dct[4][4] )
131 ;-----------------------------------------------------------------------------
132 cglobal x264_add4x4_idct_mmx, 2,2
133 .skip_prologue:
134     movq  m0, [r1+ 0]
135     movq  m1, [r1+ 8]
136     movq  m2, [r1+16]
137     movq  m3, [r1+24]
138 %macro ADD_IDCT4 1
139     IDCT4_1D 0,1,2,3,4,5
140     TRANSPOSE%1 0,1,2,3,4
141     paddw m0, [pw_32 GLOBAL]
142     IDCT4_1D 0,1,2,3,4,5
143     pxor  m7, m7
144     STORE_DIFF  m0, m4, m7, [r0+0*FDEC_STRIDE]
145     STORE_DIFF  m1, m4, m7, [r0+1*FDEC_STRIDE]
146     STORE_DIFF  m2, m4, m7, [r0+2*FDEC_STRIDE]
147     STORE_DIFF  m3, m4, m7, [r0+3*FDEC_STRIDE]
148 %endmacro
149     ADD_IDCT4 4x4W
150     RET
151
152 INIT_XMM
153
154 cglobal x264_sub8x8_dct_sse2, 3,3
155 .skip_prologue:
156     call .8x4
157     add  r0, 64
158     add  r1, 4*FENC_STRIDE
159     add  r2, 4*FDEC_STRIDE
160 .8x4:
161     SUB_DCT4 2x4x4W
162     movhps [r0+32], m0
163     movhps [r0+40], m1
164     movhps [r0+48], m2
165     movhps [r0+56], m3
166     ret
167
168 cglobal x264_add8x8_idct_sse2, 2,2
169 .skip_prologue:
170     call .8x4
171     add  r1, 64
172     add  r0, 4*FDEC_STRIDE
173 .8x4:
174     movq   m0, [r1+ 0]
175     movq   m1, [r1+ 8]
176     movq   m2, [r1+16]
177     movq   m3, [r1+24]
178     movhps m0, [r1+32]
179     movhps m1, [r1+40]
180     movhps m2, [r1+48]
181     movhps m3, [r1+56]
182     ADD_IDCT4 2x4x4W
183     ret
184
185 ;-----------------------------------------------------------------------------
186 ; void x264_sub8x8_dct_mmx( int16_t dct[4][4][4], uint8_t *pix1, uint8_t *pix2 )
187 ;-----------------------------------------------------------------------------
188 %macro SUB_NxN_DCT 6
189 cglobal %1, 3,3
190 .skip_prologue:
191     call %2
192     add  r0, %3
193     add  r1, %4-%5-%6*FENC_STRIDE
194     add  r2, %4-%5-%6*FDEC_STRIDE
195     call %2
196     add  r0, %3
197     add  r1, (%4-%6)*FENC_STRIDE-%5-%4
198     add  r2, (%4-%6)*FDEC_STRIDE-%5-%4
199     call %2
200     add  r0, %3
201     add  r1, %4-%5-%6*FENC_STRIDE
202     add  r2, %4-%5-%6*FDEC_STRIDE
203     jmp  %2
204 %endmacro
205
206 ;-----------------------------------------------------------------------------
207 ; void x264_add8x8_idct_mmx( uint8_t *pix, int16_t dct[4][4][4] )
208 ;-----------------------------------------------------------------------------
209 %macro ADD_NxN_IDCT 6
210 cglobal %1, 2,2
211 .skip_prologue:
212     call %2
213     add  r0, %4-%5-%6*FDEC_STRIDE
214     add  r1, %3
215     call %2
216     add  r0, (%4-%6)*FDEC_STRIDE-%5-%4
217     add  r1, %3
218     call %2
219     add  r0, %4-%5-%6*FDEC_STRIDE
220     add  r1, %3
221     jmp  %2
222 %endmacro
223
224 %ifndef ARCH_X86_64
225 SUB_NxN_DCT  x264_sub8x8_dct_mmx,    x264_sub4x4_dct_mmx  %+ .skip_prologue, 32, 4, 0, 0
226 ADD_NxN_IDCT x264_add8x8_idct_mmx,   x264_add4x4_idct_mmx %+ .skip_prologue, 32, 4, 0, 0
227 SUB_NxN_DCT  x264_sub16x16_dct_mmx,  x264_sub8x8_dct_mmx  %+ .skip_prologue, 32, 8, 4, 4
228 ADD_NxN_IDCT x264_add16x16_idct_mmx, x264_add8x8_idct_mmx %+ .skip_prologue, 32, 8, 4, 4
229
230 cextern x264_sub8x8_dct8_mmx.skip_prologue
231 cextern x264_add8x8_idct8_mmx.skip_prologue
232 SUB_NxN_DCT  x264_sub16x16_dct8_mmx,  x264_sub8x8_dct8_mmx  %+ .skip_prologue, 128, 8, 0, 0
233 ADD_NxN_IDCT x264_add16x16_idct8_mmx, x264_add8x8_idct8_mmx %+ .skip_prologue, 128, 8, 0, 0
234 %define x264_sub8x8_dct8_sse2 x264_sub8x8_dct8_sse2.skip_prologue
235 %define x264_add8x8_idct8_sse2 x264_add8x8_idct8_sse2.skip_prologue
236 %endif
237
238 SUB_NxN_DCT  x264_sub16x16_dct_sse2,  x264_sub8x8_dct_sse2  %+ .skip_prologue, 64, 8, 0, 4
239 ADD_NxN_IDCT x264_add16x16_idct_sse2, x264_add8x8_idct_sse2 %+ .skip_prologue, 64, 8, 0, 4
240
241 cextern x264_sub8x8_dct8_sse2
242 cextern x264_add8x8_idct8_sse2
243 SUB_NxN_DCT  x264_sub16x16_dct8_sse2,  x264_sub8x8_dct8_sse2,  128, 8, 0, 0
244 ADD_NxN_IDCT x264_add16x16_idct8_sse2, x264_add8x8_idct8_sse2, 128, 8, 0, 0
245
246 ;-----------------------------------------------------------------------------
247 ; void x264_zigzag_scan_8x8_frame_ssse3( int16_t level[64], int16_t dct[8][8] )
248 ;-----------------------------------------------------------------------------
249 %macro SCAN_8x8 1
250 cglobal x264_zigzag_scan_8x8_frame_%1, 2,2
251     movdqa    xmm0, [r1]
252     movdqa    xmm1, [r1+16]
253     movdq2q    mm0, xmm0
254     PALIGNR   xmm1, xmm1, 14, xmm2
255     movdq2q    mm1, xmm1
256
257     movdqa    xmm2, [r1+32]
258     movdqa    xmm3, [r1+48]
259     PALIGNR   xmm2, xmm2, 12, xmm4
260     movdq2q    mm2, xmm2
261     PALIGNR   xmm3, xmm3, 10, xmm4
262     movdq2q    mm3, xmm3
263
264     punpckhwd xmm0, xmm1
265     punpckhwd xmm2, xmm3
266
267     movq       mm4, mm1
268     movq       mm5, mm1
269     movq       mm6, mm2
270     movq       mm7, mm3
271     punpckhwd  mm1, mm0
272     psllq      mm0, 16
273     psrlq      mm3, 16
274     punpckhdq  mm1, mm1
275     punpckhdq  mm2, mm0
276     punpcklwd  mm0, mm4
277     punpckhwd  mm4, mm3
278     punpcklwd  mm4, mm2
279     punpckhdq  mm0, mm2
280     punpcklwd  mm6, mm3
281     punpcklwd  mm5, mm7
282     punpcklwd  mm5, mm6
283
284     movdqa    xmm4, [r1+64]
285     movdqa    xmm5, [r1+80]
286     movdqa    xmm6, [r1+96]
287     movdqa    xmm7, [r1+112]
288
289     movq [r0+2*00], mm0
290     movq [r0+2*04], mm4
291     movd [r0+2*08], mm1
292     movq [r0+2*36], mm5
293     movq [r0+2*46], mm6
294
295     PALIGNR   xmm4, xmm4, 14, xmm3
296     movdq2q    mm4, xmm4
297     PALIGNR   xmm5, xmm5, 12, xmm3
298     movdq2q    mm5, xmm5
299     PALIGNR   xmm6, xmm6, 10, xmm3
300     movdq2q    mm6, xmm6
301 %ifidn %1, ssse3
302     PALIGNR   xmm7, xmm7, 8, xmm3
303     movdq2q    mm7, xmm7
304 %else
305     movhlps   xmm3, xmm7
306     punpcklqdq xmm7, xmm7
307     movdq2q    mm7, xmm3
308 %endif
309
310     punpckhwd xmm4, xmm5
311     punpckhwd xmm6, xmm7
312
313     movq       mm0, mm4
314     movq       mm1, mm5
315     movq       mm3, mm7
316     punpcklwd  mm7, mm6
317     psrlq      mm6, 16
318     punpcklwd  mm4, mm6
319     punpcklwd  mm5, mm4
320     punpckhdq  mm4, mm3
321     punpcklwd  mm3, mm6
322     punpckhwd  mm3, mm4
323     punpckhwd  mm0, mm1
324     punpckldq  mm4, mm0
325     punpckhdq  mm0, mm6
326     pshufw     mm4, mm4, 0x6c
327
328     movq [r0+2*14], mm4
329     movq [r0+2*25], mm0
330     movd [r0+2*54], mm7
331     movq [r0+2*56], mm5
332     movq [r0+2*60], mm3
333
334     movdqa    xmm3, xmm0
335     movdqa    xmm7, xmm4
336     punpckldq xmm0, xmm2
337     punpckldq xmm4, xmm6
338     punpckhdq xmm3, xmm2
339     punpckhdq xmm7, xmm6
340     pshufhw   xmm0, xmm0, 0x1b
341     pshuflw   xmm4, xmm4, 0x1b
342     pshufhw   xmm3, xmm3, 0x1b
343     pshuflw   xmm7, xmm7, 0x1b
344
345     movlps [r0+2*10], xmm0
346     movhps [r0+2*17], xmm0
347     movlps [r0+2*21], xmm3
348     movlps [r0+2*28], xmm4
349     movhps [r0+2*32], xmm3
350     movhps [r0+2*39], xmm4
351     movlps [r0+2*43], xmm7
352     movhps [r0+2*50], xmm7
353
354     RET
355 %endmacro
356
357 INIT_XMM
358 %define PALIGNR PALIGNR_MMX
359 SCAN_8x8 sse2
360 %define PALIGNR PALIGNR_SSSE3
361 SCAN_8x8 ssse3
362
363 ;-----------------------------------------------------------------------------
364 ; void x264_zigzag_scan_8x8_frame_mmxext( int16_t level[64], int16_t dct[8][8] )
365 ;-----------------------------------------------------------------------------
366 cglobal x264_zigzag_scan_8x8_frame_mmxext, 2,2
367     movq       mm0, [r1]
368     movq       mm1, [r1+2*8]
369     movq       mm2, [r1+2*14]
370     movq       mm3, [r1+2*21]
371     movq       mm4, [r1+2*28]
372     movq       mm5, mm0
373     movq       mm6, mm1
374     psrlq      mm0, 16
375     punpckldq  mm1, mm1
376     punpcklwd  mm5, mm6
377     punpckhwd  mm1, mm3
378     punpckhwd  mm6, mm0
379     punpckldq  mm5, mm0
380     movq       mm7, [r1+2*52]
381     movq       mm0, [r1+2*60]
382     punpckhwd  mm1, mm2
383     punpcklwd  mm2, mm4
384     punpckhwd  mm4, mm3
385     punpckldq  mm3, mm3
386     punpckhwd  mm3, mm2
387     movq      [r0], mm5
388     movq  [r0+2*4], mm1
389     movq  [r0+2*8], mm6
390     punpcklwd  mm6, mm0
391     punpcklwd  mm6, mm7
392     movq       mm1, [r1+2*32]
393     movq       mm5, [r1+2*39]
394     movq       mm2, [r1+2*46]
395     movq [r0+2*35], mm3
396     movq [r0+2*47], mm4
397     punpckhwd  mm7, mm0
398     psllq      mm0, 16
399     movq       mm3, mm5
400     punpcklwd  mm5, mm1
401     punpckhwd  mm1, mm2
402     punpckhdq  mm3, mm3
403     movq [r0+2*52], mm6
404     movq [r0+2*13], mm5
405     movq       mm4, [r1+2*11]
406     movq       mm6, [r1+2*25]
407     punpcklwd  mm5, mm7
408     punpcklwd  mm1, mm3
409     punpckhdq  mm0, mm7
410     movq       mm3, [r1+2*4]
411     movq       mm7, [r1+2*18]
412     punpcklwd  mm2, mm5
413     movq [r0+2*25], mm1
414     movq       mm1, mm4
415     movq       mm5, mm6
416     punpcklwd  mm4, mm3
417     punpcklwd  mm6, mm7
418     punpckhwd  mm1, mm3
419     punpckhwd  mm5, mm7
420     movq       mm3, mm6
421     movq       mm7, mm5
422     punpckldq  mm6, mm4
423     punpckldq  mm5, mm1
424     punpckhdq  mm3, mm4
425     punpckhdq  mm7, mm1
426     movq       mm4, [r1+2*35]
427     movq       mm1, [r1+2*49]
428     pshufw     mm6, mm6, 0x1b
429     pshufw     mm5, mm5, 0x1b
430     movq [r0+2*60], mm0
431     movq [r0+2*56], mm2
432     movq       mm0, [r1+2*42]
433     movq       mm2, [r1+2*56]
434     movq [r0+2*17], mm3
435     movq [r0+2*32], mm7
436     movq [r0+2*10], mm6
437     movq [r0+2*21], mm5
438     movq       mm3, mm0
439     movq       mm7, mm2
440     punpcklwd  mm0, mm4
441     punpcklwd  mm2, mm1
442     punpckhwd  mm3, mm4
443     punpckhwd  mm7, mm1
444     movq       mm4, mm2
445     movq       mm1, mm7
446     punpckhdq  mm2, mm0
447     punpckhdq  mm7, mm3
448     punpckldq  mm4, mm0
449     punpckldq  mm1, mm3
450     pshufw     mm2, mm2, 0x1b
451     pshufw     mm7, mm7, 0x1b
452     movq [r0+2*28], mm4
453     movq [r0+2*43], mm1
454     movq [r0+2*39], mm2
455     movq [r0+2*50], mm7
456     RET
457
458 ;-----------------------------------------------------------------------------
459 ; void x264_zigzag_scan_4x4_frame_mmx( int16_t level[16], int16_t dct[4][4] )
460 ;-----------------------------------------------------------------------------
461 cglobal x264_zigzag_scan_4x4_frame_mmx, 2,2
462     movq       mm0, [r1]
463     movq       mm1, [r1+8]
464     movq       mm2, [r1+16]
465     movq       mm3, [r1+24]
466     movq       mm4, mm0
467     movq       mm5, mm1
468     movq       mm6, mm2
469     movq       mm7, mm3
470     psllq      mm3, 16
471     psrlq      mm0, 16
472     punpckldq  mm2, mm2
473     punpckhdq  mm1, mm1
474     punpcklwd  mm4, mm5
475     punpcklwd  mm5, mm3
476     punpckldq  mm4, mm0
477     punpckhwd  mm5, mm2
478     punpckhwd  mm0, mm6
479     punpckhwd  mm6, mm7
480     punpcklwd  mm1, mm0
481     punpckhdq  mm3, mm6
482     movq      [r0], mm4
483     movq    [r0+8], mm5
484     movq   [r0+16], mm1
485     movq   [r0+24], mm3
486     RET
487
488 ;-----------------------------------------------------------------------------
489 ; void x264_zigzag_scan_4x4_frame_ssse3( int16_t level[16], int16_t dct[4][4] )
490 ;-----------------------------------------------------------------------------
491 cglobal x264_zigzag_scan_4x4_frame_ssse3, 2,2
492     movdqa    xmm1, [r1+16]
493     movdqa    xmm0, [r1]
494     pshufb    xmm1, [pb_scan4frameb GLOBAL]
495     pshufb    xmm0, [pb_scan4framea GLOBAL]
496     movdqa    xmm2, xmm1
497     psrldq    xmm1, 6
498     palignr   xmm2, xmm0, 6
499     pslldq    xmm0, 10
500     palignr   xmm1, xmm0, 10
501     movdqa    [r0], xmm2
502     movdqa [r0+16], xmm1
503     RET
504
505 ;-----------------------------------------------------------------------------
506 ; void x264_zigzag_scan_4x4_field_mmxext( int16_t level[16], int16_t dct[4][4] )
507 ;-----------------------------------------------------------------------------
508 ; sse2 is only 1 cycle faster, and ssse3/pshufb is slower on core2
509 cglobal x264_zigzag_scan_4x4_field_mmxext, 2,3
510     pshufw     mm0, [r1+4], 0xd2
511     movq       mm1, [r1+16]
512     movq       mm2, [r1+24]
513     movq    [r0+4], mm0
514     movq   [r0+16], mm1
515     movq   [r0+24], mm2
516     mov        r2d, [r1]
517     mov       [r0], r2d
518     mov        r2d, [r1+12]
519     mov    [r0+12], r2d
520     RET
521
522 ;-----------------------------------------------------------------------------
523 ; void x264_zigzag_sub_4x4_frame_ssse3( int16_t level[16], const uint8_t *src, uint8_t *dst )
524 ;-----------------------------------------------------------------------------
525 cglobal x264_zigzag_sub_4x4_frame_ssse3, 3,3
526     movd      xmm0, [r1+0*FENC_STRIDE]
527     movd      xmm1, [r1+1*FENC_STRIDE]
528     movd      xmm2, [r1+2*FENC_STRIDE]
529     movd      xmm3, [r1+3*FENC_STRIDE]
530     movd      xmm4, [r2+0*FDEC_STRIDE]
531     movd      xmm5, [r2+1*FDEC_STRIDE]
532     movd      xmm6, [r2+2*FDEC_STRIDE]
533     movd      xmm7, [r2+3*FDEC_STRIDE]
534     movd      [r2+0*FDEC_STRIDE], xmm0
535     movd      [r2+1*FDEC_STRIDE], xmm1
536     movd      [r2+2*FDEC_STRIDE], xmm2
537     movd      [r2+3*FDEC_STRIDE], xmm3
538     punpckldq xmm0, xmm1
539     punpckldq xmm2, xmm3
540     punpckldq xmm4, xmm5
541     punpckldq xmm6, xmm7
542     punpcklqdq xmm0, xmm2
543     punpcklqdq xmm4, xmm6
544     movdqa    xmm7, [pb_sub4frame GLOBAL]
545     pshufb    xmm0, xmm7
546     pshufb    xmm4, xmm7
547     pxor      xmm6, xmm6
548     movdqa    xmm1, xmm0
549     movdqa    xmm5, xmm4
550     punpcklbw xmm0, xmm6
551     punpckhbw xmm1, xmm6
552     punpcklbw xmm4, xmm6
553     punpckhbw xmm5, xmm6
554     psubw     xmm0, xmm4
555     psubw     xmm1, xmm5
556     movdqa    [r0], xmm0
557     movdqa [r0+16], xmm1
558     RET
559
560 INIT_MMX
561 cglobal x264_zigzag_interleave_8x8_cavlc_mmx, 2,3
562     mov    r2d, 24
563 .loop:
564     movq   m0, [r1+r2*4+ 0]
565     movq   m1, [r1+r2*4+ 8]
566     movq   m2, [r1+r2*4+16]
567     movq   m3, [r1+r2*4+24]
568     TRANSPOSE4x4W 0,1,2,3,4
569     movq   [r0+r2+ 0], m0
570     movq   [r0+r2+32], m1
571     movq   [r0+r2+64], m2
572     movq   [r0+r2+96], m3
573     sub    r2d, 8
574     jge .loop
575     REP_RET