dct-a.asm
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:16k
源码类别:

Audio

开发平台:

Visual C++

  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. %include "x86inc.asm"
  25. %include "x86util.asm"
  26. SECTION_RODATA
  27. pw_1:  times 8 dw 1
  28. pw_32: times 8 dw 32
  29. pb_sub4frame:   db 0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15
  30. pb_scan4framea: db 12,13,6,7,14,15,0,1,8,9,2,3,4,5,10,11
  31. pb_scan4frameb: db 0,1,8,9,2,3,4,5,10,11,12,13,6,7,14,15
  32. SECTION .text
  33. %macro HADAMARD4_1D 4
  34.     SUMSUB_BADC m%2, m%1, m%4, m%3
  35.     SUMSUB_BADC m%4, m%2, m%3, m%1
  36.     SWAP %1, %4, %3
  37. %endmacro
  38. ;-----------------------------------------------------------------------------
  39. ; void x264_dct4x4dc_mmx( int16_t d[4][4] )
  40. ;-----------------------------------------------------------------------------
  41. cglobal x264_dct4x4dc_mmx, 1,1
  42.     movq   m0, [r0+ 0]
  43.     movq   m1, [r0+ 8]
  44.     movq   m2, [r0+16]
  45.     movq   m3, [r0+24]
  46.     HADAMARD4_1D  0,1,2,3
  47.     TRANSPOSE4x4W 0,1,2,3,4
  48.     HADAMARD4_1D  0,1,2,3
  49.     movq   m6, [pw_1 GLOBAL]
  50.     paddw  m0, m6
  51.     paddw  m1, m6
  52.     paddw  m2, m6
  53.     paddw  m3, m6
  54.     psraw  m0, 1
  55.     psraw  m1, 1
  56.     psraw  m2, 1
  57.     psraw  m3, 1
  58.     movq  [r0+0], m0
  59.     movq  [r0+8], m1
  60.     movq [r0+16], m2
  61.     movq [r0+24], m3
  62.     RET
  63. ;-----------------------------------------------------------------------------
  64. ; void x264_idct4x4dc_mmx( int16_t d[4][4] )
  65. ;-----------------------------------------------------------------------------
  66. cglobal x264_idct4x4dc_mmx, 1,1
  67.     movq  m0, [r0+ 0]
  68.     movq  m1, [r0+ 8]
  69.     movq  m2, [r0+16]
  70.     movq  m3, [r0+24]
  71.     HADAMARD4_1D  0,1,2,3
  72.     TRANSPOSE4x4W 0,1,2,3,4
  73.     HADAMARD4_1D  0,1,2,3
  74.     movq  [r0+ 0], m0
  75.     movq  [r0+ 8], m1
  76.     movq  [r0+16], m2
  77.     movq  [r0+24], m3
  78.     RET
  79. %macro DCT4_1D 5
  80.     SUMSUB_BADC m%4, m%1, m%3, m%2
  81.     SUMSUB_BA   m%3, m%4
  82.     SUMSUB2_AB  m%1, m%2, m%5
  83.     SWAP %1, %3, %4, %5, %2
  84. %endmacro
  85. %macro IDCT4_1D 6
  86.     SUMSUB_BA   m%3, m%1
  87.     SUMSUBD2_AB m%2, m%4, m%6, m%5
  88.     SUMSUB_BADC m%2, m%3, m%5, m%1
  89.     SWAP %1, %2, %5, %4, %3
  90. %endmacro
  91. ;-----------------------------------------------------------------------------
  92. ; void x264_sub4x4_dct_mmx( int16_t dct[4][4], uint8_t *pix1, uint8_t *pix2 )
  93. ;-----------------------------------------------------------------------------
  94. cglobal x264_sub4x4_dct_mmx, 3,3
  95. .skip_prologue:
  96. %macro SUB_DCT4 1
  97.     LOAD_DIFF  m0, m6, m7, [r1+0*FENC_STRIDE], [r2+0*FDEC_STRIDE]
  98.     LOAD_DIFF  m1, m6, m7, [r1+1*FENC_STRIDE], [r2+1*FDEC_STRIDE]
  99.     LOAD_DIFF  m2, m6, m7, [r1+2*FENC_STRIDE], [r2+2*FDEC_STRIDE]
  100.     LOAD_DIFF  m3, m6, m7, [r1+3*FENC_STRIDE], [r2+3*FDEC_STRIDE]
  101.     DCT4_1D 0,1,2,3,4
  102.     TRANSPOSE%1 0,1,2,3,4
  103.     DCT4_1D 0,1,2,3,4
  104.     movq  [r0+ 0], m0
  105.     movq  [r0+ 8], m1
  106.     movq  [r0+16], m2
  107.     movq  [r0+24], m3
  108. %endmacro
  109.     SUB_DCT4 4x4W
  110.     RET
  111. ;-----------------------------------------------------------------------------
  112. ; void x264_add4x4_idct_mmx( uint8_t *p_dst, int16_t dct[4][4] )
  113. ;-----------------------------------------------------------------------------
  114. cglobal x264_add4x4_idct_mmx, 2,2
  115. .skip_prologue:
  116.     movq  m0, [r1+ 0]
  117.     movq  m1, [r1+ 8]
  118.     movq  m2, [r1+16]
  119.     movq  m3, [r1+24]
  120. %macro ADD_IDCT4 1
  121.     IDCT4_1D 0,1,2,3,4,5
  122.     TRANSPOSE%1 0,1,2,3,4
  123.     paddw m0, [pw_32 GLOBAL]
  124.     IDCT4_1D 0,1,2,3,4,5
  125.     pxor  m7, m7
  126.     STORE_DIFF  m0, m4, m7, [r0+0*FDEC_STRIDE]
  127.     STORE_DIFF  m1, m4, m7, [r0+1*FDEC_STRIDE]
  128.     STORE_DIFF  m2, m4, m7, [r0+2*FDEC_STRIDE]
  129.     STORE_DIFF  m3, m4, m7, [r0+3*FDEC_STRIDE]
  130. %endmacro
  131.     ADD_IDCT4 4x4W
  132.     RET
  133. INIT_XMM
  134. cglobal x264_sub8x8_dct_sse2, 3,3
  135. .skip_prologue:
  136.     call .8x4
  137.     add  r0, 64
  138.     add  r1, 4*FENC_STRIDE
  139.     add  r2, 4*FDEC_STRIDE
  140. .8x4:
  141.     SUB_DCT4 2x4x4W
  142.     movhps [r0+32], m0
  143.     movhps [r0+40], m1
  144.     movhps [r0+48], m2
  145.     movhps [r0+56], m3
  146.     ret
  147. cglobal x264_add8x8_idct_sse2, 2,2
  148. .skip_prologue:
  149.     call .8x4
  150.     add  r1, 64
  151.     add  r0, 4*FDEC_STRIDE
  152. .8x4:
  153.     movq   m0, [r1+ 0]
  154.     movq   m1, [r1+ 8]
  155.     movq   m2, [r1+16]
  156.     movq   m3, [r1+24]
  157.     movhps m0, [r1+32]
  158.     movhps m1, [r1+40]
  159.     movhps m2, [r1+48]
  160.     movhps m3, [r1+56]
  161.     ADD_IDCT4 2x4x4W
  162.     ret
  163. ;-----------------------------------------------------------------------------
  164. ; void x264_sub8x8_dct_mmx( int16_t dct[4][4][4], uint8_t *pix1, uint8_t *pix2 )
  165. ;-----------------------------------------------------------------------------
  166. %macro SUB_NxN_DCT 6
  167. cglobal %1, 3,3
  168. .skip_prologue:
  169.     call %2
  170.     add  r0, %3
  171.     add  r1, %4-%5-%6*FENC_STRIDE
  172.     add  r2, %4-%5-%6*FDEC_STRIDE
  173.     call %2
  174.     add  r0, %3
  175.     add  r1, (%4-%6)*FENC_STRIDE-%5-%4
  176.     add  r2, (%4-%6)*FDEC_STRIDE-%5-%4
  177.     call %2
  178.     add  r0, %3
  179.     add  r1, %4-%5-%6*FENC_STRIDE
  180.     add  r2, %4-%5-%6*FDEC_STRIDE
  181.     jmp  %2
  182. %endmacro
  183. ;-----------------------------------------------------------------------------
  184. ; void x264_add8x8_idct_mmx( uint8_t *pix, int16_t dct[4][4][4] )
  185. ;-----------------------------------------------------------------------------
  186. %macro ADD_NxN_IDCT 6
  187. cglobal %1, 2,2
  188. .skip_prologue:
  189.     call %2
  190.     add  r0, %4-%5-%6*FDEC_STRIDE
  191.     add  r1, %3
  192.     call %2
  193.     add  r0, (%4-%6)*FDEC_STRIDE-%5-%4
  194.     add  r1, %3
  195.     call %2
  196.     add  r0, %4-%5-%6*FDEC_STRIDE
  197.     add  r1, %3
  198.     jmp  %2
  199. %endmacro
  200. %ifndef ARCH_X86_64
  201. SUB_NxN_DCT  x264_sub8x8_dct_mmx,    x264_sub4x4_dct_mmx  %+ .skip_prologue, 32, 4, 0, 0
  202. ADD_NxN_IDCT x264_add8x8_idct_mmx,   x264_add4x4_idct_mmx %+ .skip_prologue, 32, 4, 0, 0
  203. SUB_NxN_DCT  x264_sub16x16_dct_mmx,  x264_sub8x8_dct_mmx  %+ .skip_prologue, 32, 8, 4, 4
  204. ADD_NxN_IDCT x264_add16x16_idct_mmx, x264_add8x8_idct_mmx %+ .skip_prologue, 32, 8, 4, 4
  205. cextern x264_sub8x8_dct8_mmx.skip_prologue
  206. cextern x264_add8x8_idct8_mmx.skip_prologue
  207. SUB_NxN_DCT  x264_sub16x16_dct8_mmx,  x264_sub8x8_dct8_mmx  %+ .skip_prologue, 128, 8, 0, 0
  208. ADD_NxN_IDCT x264_add16x16_idct8_mmx, x264_add8x8_idct8_mmx %+ .skip_prologue, 128, 8, 0, 0
  209. %define x264_sub8x8_dct8_sse2 x264_sub8x8_dct8_sse2.skip_prologue
  210. %define x264_add8x8_idct8_sse2 x264_add8x8_idct8_sse2.skip_prologue
  211. %endif
  212. SUB_NxN_DCT  x264_sub16x16_dct_sse2,  x264_sub8x8_dct_sse2  %+ .skip_prologue, 64, 8, 0, 4
  213. ADD_NxN_IDCT x264_add16x16_idct_sse2, x264_add8x8_idct_sse2 %+ .skip_prologue, 64, 8, 0, 4
  214. cextern x264_sub8x8_dct8_sse2
  215. cextern x264_add8x8_idct8_sse2
  216. SUB_NxN_DCT  x264_sub16x16_dct8_sse2,  x264_sub8x8_dct8_sse2,  128, 8, 0, 0
  217. ADD_NxN_IDCT x264_add16x16_idct8_sse2, x264_add8x8_idct8_sse2, 128, 8, 0, 0
  218. ;-----------------------------------------------------------------------------
  219. ; void x264_zigzag_scan_8x8_frame_ssse3( int16_t level[64], int16_t dct[8][8] )
  220. ;-----------------------------------------------------------------------------
  221. %macro SCAN_8x8 1
  222. cglobal x264_zigzag_scan_8x8_frame_%1, 2,2
  223.     movdqa    xmm0, [r1]
  224.     movdqa    xmm1, [r1+16]
  225.     movdq2q    mm0, xmm0
  226.     PALIGNR   xmm1, xmm1, 14, xmm2
  227.     movdq2q    mm1, xmm1
  228.     movdqa    xmm2, [r1+32]
  229.     movdqa    xmm3, [r1+48]
  230.     PALIGNR   xmm2, xmm2, 12, xmm4
  231.     movdq2q    mm2, xmm2
  232.     PALIGNR   xmm3, xmm3, 10, xmm4
  233.     movdq2q    mm3, xmm3
  234.     punpckhwd xmm0, xmm1
  235.     punpckhwd xmm2, xmm3
  236.     movq       mm4, mm1
  237.     movq       mm5, mm1
  238.     movq       mm6, mm2
  239.     movq       mm7, mm3
  240.     punpckhwd  mm1, mm0
  241.     psllq      mm0, 16
  242.     psrlq      mm3, 16
  243.     punpckhdq  mm1, mm1
  244.     punpckhdq  mm2, mm0
  245.     punpcklwd  mm0, mm4
  246.     punpckhwd  mm4, mm3
  247.     punpcklwd  mm4, mm2
  248.     punpckhdq  mm0, mm2
  249.     punpcklwd  mm6, mm3
  250.     punpcklwd  mm5, mm7
  251.     punpcklwd  mm5, mm6
  252.     movdqa    xmm4, [r1+64]
  253.     movdqa    xmm5, [r1+80]
  254.     movdqa    xmm6, [r1+96]
  255.     movdqa    xmm7, [r1+112]
  256.     movq [r0+2*00], mm0
  257.     movq [r0+2*04], mm4
  258.     movd [r0+2*08], mm1
  259.     movq [r0+2*36], mm5
  260.     movq [r0+2*46], mm6
  261.     PALIGNR   xmm4, xmm4, 14, xmm3
  262.     movdq2q    mm4, xmm4
  263.     PALIGNR   xmm5, xmm5, 12, xmm3
  264.     movdq2q    mm5, xmm5
  265.     PALIGNR   xmm6, xmm6, 10, xmm3
  266.     movdq2q    mm6, xmm6
  267. %ifidn %1, ssse3
  268.     PALIGNR   xmm7, xmm7, 8, xmm3
  269.     movdq2q    mm7, xmm7
  270. %else
  271.     movhlps   xmm3, xmm7
  272.     movlhps   xmm7, xmm7
  273.     movdq2q    mm7, xmm3
  274. %endif
  275.     punpckhwd xmm4, xmm5
  276.     punpckhwd xmm6, xmm7
  277.     movq       mm0, mm4
  278.     movq       mm1, mm5
  279.     movq       mm3, mm7
  280.     punpcklwd  mm7, mm6
  281.     psrlq      mm6, 16
  282.     punpcklwd  mm4, mm6
  283.     punpcklwd  mm5, mm4
  284.     punpckhdq  mm4, mm3
  285.     punpcklwd  mm3, mm6
  286.     punpckhwd  mm3, mm4
  287.     punpckhwd  mm0, mm1
  288.     punpckldq  mm4, mm0
  289.     punpckhdq  mm0, mm6
  290.     pshufw     mm4, mm4, 0x6c
  291.     movq [r0+2*14], mm4
  292.     movq [r0+2*25], mm0
  293.     movd [r0+2*54], mm7
  294.     movq [r0+2*56], mm5
  295.     movq [r0+2*60], mm3
  296.     movdqa    xmm3, xmm0
  297.     movdqa    xmm7, xmm4
  298.     punpckldq xmm0, xmm2
  299.     punpckldq xmm4, xmm6
  300.     punpckhdq xmm3, xmm2
  301.     punpckhdq xmm7, xmm6
  302.     pshufhw   xmm0, xmm0, 0x1b
  303.     pshuflw   xmm4, xmm4, 0x1b
  304.     pshufhw   xmm3, xmm3, 0x1b
  305.     pshuflw   xmm7, xmm7, 0x1b
  306.     movlps [r0+2*10], xmm0
  307.     movhps [r0+2*17], xmm0
  308.     movlps [r0+2*21], xmm3
  309.     movlps [r0+2*28], xmm4
  310.     movhps [r0+2*32], xmm3
  311.     movhps [r0+2*39], xmm4
  312.     movlps [r0+2*43], xmm7
  313.     movhps [r0+2*50], xmm7
  314.     RET
  315. %endmacro
  316. INIT_XMM
  317. %define PALIGNR PALIGNR_MMX
  318. SCAN_8x8 sse2
  319. %define PALIGNR PALIGNR_SSSE3
  320. SCAN_8x8 ssse3
  321. ;-----------------------------------------------------------------------------
  322. ; void x264_zigzag_scan_8x8_frame_mmxext( int16_t level[64], int16_t dct[8][8] )
  323. ;-----------------------------------------------------------------------------
  324. cglobal x264_zigzag_scan_8x8_frame_mmxext, 2,2
  325.     movq       mm0, [r1]
  326.     movq       mm1, [r1+2*8]
  327.     movq       mm2, [r1+2*14]
  328.     movq       mm3, [r1+2*21]
  329.     movq       mm4, [r1+2*28]
  330.     movq       mm5, mm0
  331.     movq       mm6, mm1
  332.     psrlq      mm0, 16
  333.     punpckldq  mm1, mm1
  334.     punpcklwd  mm5, mm6
  335.     punpckhwd  mm1, mm3
  336.     punpckhwd  mm6, mm0
  337.     punpckldq  mm5, mm0
  338.     movq       mm7, [r1+2*52]
  339.     movq       mm0, [r1+2*60]
  340.     punpckhwd  mm1, mm2
  341.     punpcklwd  mm2, mm4
  342.     punpckhwd  mm4, mm3
  343.     punpckldq  mm3, mm3
  344.     punpckhwd  mm3, mm2
  345.     movq      [r0], mm5
  346.     movq  [r0+2*4], mm1
  347.     movq  [r0+2*8], mm6
  348.     punpcklwd  mm6, mm0
  349.     punpcklwd  mm6, mm7
  350.     movq       mm1, [r1+2*32]
  351.     movq       mm5, [r1+2*39]
  352.     movq       mm2, [r1+2*46]
  353.     movq [r0+2*35], mm3
  354.     movq [r0+2*47], mm4
  355.     punpckhwd  mm7, mm0
  356.     psllq      mm0, 16
  357.     movq       mm3, mm5
  358.     punpcklwd  mm5, mm1
  359.     punpckhwd  mm1, mm2
  360.     punpckhdq  mm3, mm3
  361.     movq [r0+2*52], mm6
  362.     movq [r0+2*13], mm5
  363.     movq       mm4, [r1+2*11]
  364.     movq       mm6, [r1+2*25]
  365.     punpcklwd  mm5, mm7
  366.     punpcklwd  mm1, mm3
  367.     punpckhdq  mm0, mm7
  368.     movq       mm3, [r1+2*4]
  369.     movq       mm7, [r1+2*18]
  370.     punpcklwd  mm2, mm5
  371.     movq [r0+2*25], mm1
  372.     movq       mm1, mm4
  373.     movq       mm5, mm6
  374.     punpcklwd  mm4, mm3
  375.     punpcklwd  mm6, mm7
  376.     punpckhwd  mm1, mm3
  377.     punpckhwd  mm5, mm7
  378.     movq       mm3, mm6
  379.     movq       mm7, mm5
  380.     punpckldq  mm6, mm4
  381.     punpckldq  mm5, mm1
  382.     punpckhdq  mm3, mm4
  383.     punpckhdq  mm7, mm1
  384.     movq       mm4, [r1+2*35]
  385.     movq       mm1, [r1+2*49]
  386.     pshufw     mm6, mm6, 0x1b
  387.     pshufw     mm5, mm5, 0x1b
  388.     movq [r0+2*60], mm0
  389.     movq [r0+2*56], mm2
  390.     movq       mm0, [r1+2*42]
  391.     movq       mm2, [r1+2*56]
  392.     movq [r0+2*17], mm3
  393.     movq [r0+2*32], mm7
  394.     movq [r0+2*10], mm6
  395.     movq [r0+2*21], mm5
  396.     movq       mm3, mm0
  397.     movq       mm7, mm2
  398.     punpcklwd  mm0, mm4
  399.     punpcklwd  mm2, mm1
  400.     punpckhwd  mm3, mm4
  401.     punpckhwd  mm7, mm1
  402.     movq       mm4, mm2
  403.     movq       mm1, mm7
  404.     punpckhdq  mm2, mm0
  405.     punpckhdq  mm7, mm3
  406.     punpckldq  mm4, mm0
  407.     punpckldq  mm1, mm3
  408.     pshufw     mm2, mm2, 0x1b
  409.     pshufw     mm7, mm7, 0x1b
  410.     movq [r0+2*28], mm4
  411.     movq [r0+2*43], mm1
  412.     movq [r0+2*39], mm2
  413.     movq [r0+2*50], mm7
  414.     RET
  415. ;-----------------------------------------------------------------------------
  416. ; void x264_zigzag_scan_4x4_frame_mmx( int16_t level[16], int16_t dct[4][4] )
  417. ;-----------------------------------------------------------------------------
  418. cglobal x264_zigzag_scan_4x4_frame_mmx, 2,2
  419.     movq       mm0, [r1]
  420.     movq       mm1, [r1+8]
  421.     movq       mm2, [r1+16]
  422.     movq       mm3, [r1+24]
  423.     movq       mm4, mm0
  424.     movq       mm5, mm1
  425.     movq       mm6, mm2
  426.     movq       mm7, mm3
  427.     psllq      mm3, 16
  428.     psrlq      mm0, 16
  429.     punpckldq  mm2, mm2
  430.     punpckhdq  mm1, mm1
  431.     punpcklwd  mm4, mm5
  432.     punpcklwd  mm5, mm3
  433.     punpckldq  mm4, mm0
  434.     punpckhwd  mm5, mm2
  435.     punpckhwd  mm0, mm6
  436.     punpckhwd  mm6, mm7
  437.     punpcklwd  mm1, mm0
  438.     punpckhdq  mm3, mm6
  439.     movq      [r0], mm4
  440.     movq    [r0+8], mm5
  441.     movq   [r0+16], mm1
  442.     movq   [r0+24], mm3
  443.     RET
  444. ;-----------------------------------------------------------------------------
  445. ; void x264_zigzag_scan_4x4_frame_ssse3( int16_t level[16], int16_t dct[4][4] )
  446. ;-----------------------------------------------------------------------------
  447. cglobal x264_zigzag_scan_4x4_frame_ssse3, 2,2
  448.     movdqa    xmm1, [r1+16]
  449.     movdqa    xmm0, [r1]
  450.     pshufb    xmm1, [pb_scan4frameb GLOBAL]
  451.     pshufb    xmm0, [pb_scan4framea GLOBAL]
  452.     movdqa    xmm2, xmm1
  453.     psrldq    xmm1, 6
  454.     palignr   xmm2, xmm0, 6
  455.     pslldq    xmm0, 10
  456.     palignr   xmm1, xmm0, 10
  457.     movdqa    [r0], xmm2
  458.     movdqa [r0+16], xmm1
  459.     RET
  460. ;-----------------------------------------------------------------------------
  461. ; void x264_zigzag_scan_4x4_field_mmxext( int16_t level[16], int16_t dct[4][4] )
  462. ;-----------------------------------------------------------------------------
  463. ; sse2 is only 1 cycle faster, and ssse3/pshufb is slower on core2
  464. cglobal x264_zigzag_scan_4x4_field_mmxext, 2,3
  465.     pshufw     mm0, [r1+4], 0xd2
  466.     movq       mm1, [r1+16]
  467.     movq       mm2, [r1+24]
  468.     movq    [r0+4], mm0
  469.     movq   [r0+16], mm1
  470.     movq   [r0+24], mm2
  471.     mov        r2d, [r1]
  472.     mov       [r0], r2d
  473.     mov        r2d, [r1+12]
  474.     mov    [r0+12], r2d
  475.     RET
  476. ;-----------------------------------------------------------------------------
  477. ; void x264_zigzag_sub_4x4_frame_ssse3( int16_t level[16], const uint8_t *src, uint8_t *dst )
  478. ;-----------------------------------------------------------------------------
  479. cglobal x264_zigzag_sub_4x4_frame_ssse3, 3,3
  480.     movd      xmm0, [r1+0*FENC_STRIDE]
  481.     movd      xmm1, [r1+1*FENC_STRIDE]
  482.     movd      xmm2, [r1+2*FENC_STRIDE]
  483.     movd      xmm3, [r1+3*FENC_STRIDE]
  484.     movd      xmm4, [r2+0*FDEC_STRIDE]
  485.     movd      xmm5, [r2+1*FDEC_STRIDE]
  486.     movd      xmm6, [r2+2*FDEC_STRIDE]
  487.     movd      xmm7, [r2+3*FDEC_STRIDE]
  488.     movd      [r2+0*FDEC_STRIDE], xmm0
  489.     movd      [r2+1*FDEC_STRIDE], xmm1
  490.     movd      [r2+2*FDEC_STRIDE], xmm2
  491.     movd      [r2+3*FDEC_STRIDE], xmm3
  492.     punpckldq xmm0, xmm1
  493.     punpckldq xmm2, xmm3
  494.     punpckldq xmm4, xmm5
  495.     punpckldq xmm6, xmm7
  496.     movlhps   xmm0, xmm2
  497.     movlhps   xmm4, xmm6
  498.     movdqa    xmm7, [pb_sub4frame GLOBAL]
  499.     pshufb    xmm0, xmm7
  500.     pshufb    xmm4, xmm7
  501.     pxor      xmm6, xmm6
  502.     movdqa    xmm1, xmm0
  503.     movdqa    xmm5, xmm4
  504.     punpcklbw xmm0, xmm6
  505.     punpckhbw xmm1, xmm6
  506.     punpcklbw xmm4, xmm6
  507.     punpckhbw xmm5, xmm6
  508.     psubw     xmm0, xmm4
  509.     psubw     xmm1, xmm5
  510.     movdqa    [r0], xmm0
  511.     movdqa [r0+16], xmm1
  512.     RET