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

Audio

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* dct.asm: h264 encoder library
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2003 x264 project
  5. ;* $Id: dct.asm,v 1.1 2004/06/03 19:27:07 fenrir Exp $
  6. ;*
  7. ;* Authors: Min Chen <chenm001.163.com> (converted to nasm)
  8. ;*          Laurent Aimar <fenrir@via.ecp.fr> (initial version)
  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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23. ;*****************************************************************************
  24. ;*****************************************************************************
  25. ;*                                                                           *
  26. ;*  Revision history:                                                        *
  27. ;*                                                                           *
  28. ;*  2004.04.28  portab all 4x4 function to nasm (CM)                         *
  29. ;*                                                                           *
  30. ;*****************************************************************************
  31. BITS 64
  32. ;=============================================================================
  33. ; Macros and other preprocessor constants
  34. ;=============================================================================
  35. %include "amd64inc.asm"
  36. %macro MMX_ZERO 1
  37.     pxor    %1, %1
  38. %endmacro
  39. %macro MMX_LOAD_DIFF_4P 5
  40.     movd        %1, %4
  41.     punpcklbw   %1, %3
  42.     movd        %2, %5
  43.     punpcklbw   %2, %3
  44.     psubw       %1, %2
  45. %endmacro
  46. %macro MMX_LOAD_DIFF_8P 5
  47.     movq        %1, %4
  48.     punpcklbw   %1, %3
  49.     movq        %2, %5
  50.     punpcklbw   %2, %3
  51.     psubw       %1, %2
  52. %endmacro
  53. %macro MMX_SUMSUB_BA 2
  54.     paddw   %1, %2
  55.     paddw   %2, %2
  56.     psubw   %2, %1
  57. %endmacro
  58. %macro MMX_SUMSUB_BADC 4
  59.     paddw   %1, %2
  60.     paddw   %3, %4
  61.     paddw   %2, %2
  62.     paddw   %4, %4
  63.     psubw   %2, %1
  64.     psubw   %4, %3
  65. %endmacro
  66. %macro MMX_SUMSUB2_AB 3
  67.     movq    %3, %1
  68.     paddw   %1, %1
  69.     paddw   %1, %2
  70.     psubw   %3, %2
  71.     psubw   %3, %2
  72. %endmacro
  73. %macro MMX_SUMSUBD2_AB 4
  74.     movq    %4, %1
  75.     movq    %3, %2
  76.     psraw   %2, 1
  77.     psraw   %4, 1
  78.     paddw   %1, %2
  79.     psubw   %4, %3
  80. %endmacro
  81. %macro SBUTTERFLY 5
  82.     mov%1       %5, %3
  83.     punpckl%2   %3, %4
  84.     punpckh%2   %5, %4
  85. %endmacro
  86. ;-----------------------------------------------------------------------------
  87. ; input ABCD output ADTC
  88. ;-----------------------------------------------------------------------------
  89. %macro MMX_TRANSPOSE 5
  90.     SBUTTERFLY q, wd, %1, %2, %5
  91.     SBUTTERFLY q, wd, %3, %4, %2
  92.     SBUTTERFLY q, dq, %1, %3, %4
  93.     SBUTTERFLY q, dq, %5, %2, %3
  94. %endmacro
  95. ;-----------------------------------------------------------------------------
  96. ; input ABCDEFGH output AFHDTECB 
  97. ;-----------------------------------------------------------------------------
  98. %macro SSE2_TRANSPOSE8x8 9
  99.     SBUTTERFLY dqa, wd, %1, %2, %9
  100.     SBUTTERFLY dqa, wd, %3, %4, %2
  101.     SBUTTERFLY dqa, wd, %5, %6, %4
  102.     SBUTTERFLY dqa, wd, %7, %8, %6
  103.     SBUTTERFLY dqa, dq, %1, %3, %8
  104.     SBUTTERFLY dqa, dq, %9, %2, %3
  105.     SBUTTERFLY dqa, dq, %5, %7, %2
  106.     SBUTTERFLY dqa, dq, %4, %6, %7
  107.     SBUTTERFLY dqa, qdq, %1, %5, %6
  108.     SBUTTERFLY dqa, qdq, %9, %4, %5
  109.     SBUTTERFLY dqa, qdq, %8, %2, %4
  110.     SBUTTERFLY dqa, qdq, %3, %7, %2
  111. %endmacro
  112. %macro MMX_STORE_DIFF_4P 5
  113.     paddw       %1, %3
  114.     psraw       %1, 6
  115.     movd        %2, %5
  116.     punpcklbw   %2, %4
  117.     paddsw      %1, %2
  118.     packuswb    %1, %1
  119.     movd        %5, %1
  120. %endmacro
  121. %macro MMX_STORE_DIFF_8P 4
  122.     psraw       %1, 6
  123.     movq        %2, %4
  124.     punpcklbw   %2, %3
  125.     paddsw      %1, %2
  126.     packuswb    %1, %1  
  127.     movq        %4, %1
  128. %endmacro
  129. ;=============================================================================
  130. ; Constants
  131. ;=============================================================================
  132. SECTION .rodata align=16
  133. pw_1:  times 8 dw 1
  134. pw_32: times 8 dw 32
  135. ;=============================================================================
  136. ; Code
  137. ;=============================================================================
  138. SECTION .text
  139. cglobal x264_dct4x4dc_mmxext
  140. ALIGN 16
  141. ;-----------------------------------------------------------------------------
  142. ;   void dct4x4dc( int16_t d[4][4] )
  143. ;-----------------------------------------------------------------------------
  144. x264_dct4x4dc_mmxext:
  145.     movq    mm0,        [parm1q+ 0]
  146.     movq    mm1,        [parm1q+ 8]
  147.     movq    mm2,        [parm1q+16]
  148.     movq    mm3,        [parm1q+24]
  149.     MMX_SUMSUB_BADC     mm1, mm0, mm3, mm2          ; mm1=s01  mm0=d01  mm3=s23  mm2=d23
  150.     MMX_SUMSUB_BADC     mm3, mm1, mm2, mm0          ; mm3=s01+s23  mm1=s01-s23  mm2=d01+d23  mm0=d01-d23
  151.     MMX_TRANSPOSE       mm3, mm1, mm0, mm2, mm4     ; in: mm3, mm1, mm0, mm2  out: mm3, mm2, mm4, mm0 
  152.     MMX_SUMSUB_BADC     mm2, mm3, mm0, mm4          ; mm2=s01  mm3=d01  mm0=s23  mm4=d23
  153.     MMX_SUMSUB_BADC     mm0, mm2, mm4, mm3          ; mm0=s01+s23  mm2=s01-s23  mm4=d01+d23  mm3=d01-d23
  154.     MMX_TRANSPOSE       mm0, mm2, mm3, mm4, mm1     ; in: mm0, mm2, mm3, mm4  out: mm0, mm4, mm1, mm3
  155.     movq    mm6,        [pw_1 GLOBAL]
  156.     paddw   mm0,        mm6
  157.     paddw   mm4,        mm6
  158.     psraw   mm0,        1
  159.     movq    [parm1q+ 0],mm0
  160.     psraw   mm4,        1
  161.     movq    [parm1q+ 8],mm4
  162.     paddw   mm1,        mm6
  163.     paddw   mm3,        mm6
  164.     psraw   mm1,        1
  165.     movq    [parm1q+16],mm1
  166.     psraw   mm3,        1
  167.     movq    [parm1q+24],mm3
  168.     ret
  169. cglobal x264_idct4x4dc_mmxext
  170. ALIGN 16
  171. ;-----------------------------------------------------------------------------
  172. ;   void x264_idct4x4dc_mmxext( int16_t d[4][4] )
  173. ;-----------------------------------------------------------------------------
  174. x264_idct4x4dc_mmxext:
  175.     movq    mm0, [parm1q+ 0]
  176.     movq    mm1, [parm1q+ 8]
  177.     movq    mm2, [parm1q+16]
  178.     movq    mm3, [parm1q+24]
  179.     MMX_SUMSUB_BADC     mm1, mm0, mm3, mm2          ; mm1=s01  mm0=d01  mm3=s23  mm2=d23
  180.     MMX_SUMSUB_BADC     mm3, mm1, mm2, mm0          ; mm3=s01+s23 mm1=s01-s23 mm2=d01+d23 mm0=d01-d23
  181.     MMX_TRANSPOSE       mm3, mm1, mm0, mm2, mm4     ; in: mm3, mm1, mm0, mm2  out: mm3, mm2, mm4, mm0 
  182.     MMX_SUMSUB_BADC     mm2, mm3, mm0, mm4          ; mm2=s01  mm3=d01  mm0=s23  mm4=d23
  183.     MMX_SUMSUB_BADC     mm0, mm2, mm4, mm3          ; mm0=s01+s23  mm2=s01-s23  mm4=d01+d23  mm3=d01-d23
  184.     MMX_TRANSPOSE       mm0, mm2, mm3, mm4, mm1     ; in: mm0, mm2, mm3, mm4  out: mm0, mm4, mm1, mm3
  185.     movq    [parm1q+ 0], mm0
  186.     movq    [parm1q+ 8], mm4
  187.     movq    [parm1q+16], mm1
  188.     movq    [parm1q+24], mm3
  189.     ret
  190. cglobal x264_sub4x4_dct_mmxext
  191. ALIGN 16
  192. ;-----------------------------------------------------------------------------
  193. ;   void x264_sub4x4_dct_mmxext( int16_t dct[4][4], uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2 )
  194. ;-----------------------------------------------------------------------------
  195. x264_sub4x4_dct_mmxext:
  196.     firstpush  rbx
  197.     pushreg    rbx
  198.     endprolog
  199.     
  200.     mov     r10, parm1q     ; dct
  201.     mov     rax, parm2q     ; pix1
  202. %ifdef WIN64
  203.     mov     rcx, parm4q     ; pix2
  204.     movsxd  rdx, dword [rsp+40+8] ; i_pix2
  205.     movsxd  rbx, parm3d     ; i_pix1
  206. %else
  207.     movsxd  rbx, parm3d     ; i_pix1
  208.     movsxd  rdx, parm5d     ; i_pix2
  209. %endif
  210.     MMX_ZERO    mm7
  211.     ; Load 4 lines
  212.     MMX_LOAD_DIFF_4P    mm0, mm6, mm7, [rax      ], [rcx]
  213.     MMX_LOAD_DIFF_4P    mm1, mm6, mm7, [rax+rbx  ], [rcx+rdx]
  214.     MMX_LOAD_DIFF_4P    mm2, mm6, mm7, [rax+rbx*2], [rcx+rdx*2]
  215.     add     rax, rbx
  216.     add     rcx, rdx
  217.     MMX_LOAD_DIFF_4P    mm3, mm6, mm7, [rax+rbx*2], [rcx+rdx*2]
  218.     MMX_SUMSUB_BADC     mm3, mm0, mm2, mm1          ; mm3=s03  mm0=d03  mm2=s12  mm1=d12
  219.     MMX_SUMSUB_BA       mm2, mm3                    ; mm2=s03+s12      mm3=s03-s12
  220.     MMX_SUMSUB2_AB      mm0, mm1, mm4               ; mm0=2.d03+d12    mm4=d03-2.d12
  221.     ; transpose in: mm2, mm0, mm3, mm4, out: mm2, mm4, mm1, mm3
  222.     MMX_TRANSPOSE       mm2, mm0, mm3, mm4, mm1
  223.     MMX_SUMSUB_BADC     mm3, mm2, mm1, mm4          ; mm3=s03  mm2=d03  mm1=s12  mm4=d12
  224.     MMX_SUMSUB_BA       mm1, mm3                    ; mm1=s03+s12      mm3=s03-s12
  225.     MMX_SUMSUB2_AB      mm2, mm4, mm0               ; mm2=2.d03+d12    mm0=d03-2.d12
  226.     ; transpose in: mm1, mm2, mm3, mm0, out: mm1, mm0, mm4, mm3
  227.     MMX_TRANSPOSE       mm1, mm2, mm3, mm0, mm4
  228.     movq    [r10+ 0],   mm1 ; dct
  229.     movq    [r10+ 8],   mm0
  230.     movq    [r10+16],   mm4
  231.     movq    [r10+24],   mm3
  232.     pop     rbx
  233.     ret
  234.     endfunc
  235. cglobal x264_add4x4_idct_mmxext
  236. ALIGN 16
  237. ;-----------------------------------------------------------------------------
  238. ;   void x264_add4x4_idct_mmxext( uint8_t *p_dst, int i_dst, int16_t dct[4][4] )
  239. ;-----------------------------------------------------------------------------
  240. x264_add4x4_idct_mmxext:
  241.     ; Load dct coeffs
  242.     movq    mm0, [parm3q+ 0] ; dct
  243.     movq    mm4, [parm3q+ 8]
  244.     movq    mm3, [parm3q+16]
  245.     movq    mm1, [parm3q+24]
  246.     
  247.     mov     rax, parm1q      ; p_dst
  248.     movsxd  rcx, parm2d      ; i_dst
  249.     lea     rdx, [rcx+rcx*2]
  250.     ; out:mm0, mm1, mm2, mm3
  251.     MMX_TRANSPOSE       mm0, mm4, mm3, mm1, mm2
  252.     MMX_SUMSUB_BA       mm2, mm0                        ; mm2=s02  mm0=d02
  253.     MMX_SUMSUBD2_AB     mm1, mm3, mm5, mm4              ; mm1=s13  mm4=d13 ( well 1 + 3>>1 and 1>>1 + 3)
  254.     MMX_SUMSUB_BADC     mm1, mm2, mm4, mm0              ; mm1=s02+s13  mm2=s02-s13  mm4=d02+d13  mm0=d02-d13
  255.     ; in: mm1, mm4, mm0, mm2  out: mm1, mm2, mm3, mm0
  256.     MMX_TRANSPOSE       mm1, mm4, mm0, mm2, mm3
  257.     MMX_SUMSUB_BA       mm3, mm1                        ; mm3=s02  mm1=d02
  258.     MMX_SUMSUBD2_AB     mm2, mm0, mm5, mm4              ; mm2=s13  mm4=d13 ( well 1 + 3>>1 and 1>>1 + 3)
  259.     MMX_SUMSUB_BADC     mm2, mm3, mm4, mm1              ; mm2=s02+s13  mm3=s02-s13  mm4=d02+d13  mm1=d02-d13
  260.     MMX_ZERO            mm7
  261.     movq                mm6, [pw_32 GLOBAL]
  262.     
  263.     MMX_STORE_DIFF_4P   mm2, mm0, mm6, mm7, [rax]
  264.     MMX_STORE_DIFF_4P   mm4, mm0, mm6, mm7, [rax+rcx]
  265.     MMX_STORE_DIFF_4P   mm1, mm0, mm6, mm7, [rax+rcx*2]
  266.     MMX_STORE_DIFF_4P   mm3, mm0, mm6, mm7, [rax+rdx]
  267.     ret
  268. ; =============================================================================
  269. ; 8x8 Transform
  270. ; =============================================================================
  271. ; in:  ABCDEFGH
  272. ; out: FBCGEDHI
  273. %macro DCT8_1D 10
  274.     MMX_SUMSUB_BA  %8, %1 ; %8=s07, %1=d07
  275.     MMX_SUMSUB_BA  %7, %2 ; %7=s16, %2=d16
  276.     MMX_SUMSUB_BA  %6, %3 ; %6=s25, %3=d25
  277.     MMX_SUMSUB_BA  %5, %4 ; %5=s34, %4=d34
  278.     MMX_SUMSUB_BA  %5, %8 ; %5=a0, %8=a2
  279.     MMX_SUMSUB_BA  %6, %7 ; %6=a1, %7=a3
  280.     movdqa  %9, %1
  281.     psraw   %9, 1
  282.     paddw   %9, %1
  283.     paddw   %9, %2
  284.     paddw   %9, %3 ; %9=a4
  285.     movdqa  %10, %4
  286.     psraw   %10, 1
  287.     paddw   %10, %4
  288.     paddw   %10, %2
  289.     psubw   %10, %3 ; %10=a7
  290.     MMX_SUMSUB_BA  %4, %1
  291.     psubw   %1, %3
  292.     psubw   %4, %2
  293.     psraw   %3, 1
  294.     psraw   %2, 1
  295.     psubw   %1, %3 ; %1=a5
  296.     psubw   %4, %2 ; %4=a6
  297.     MMX_SUMSUB_BA  %6, %5 ; %6=b0, %5=b4
  298.     movdqa  %2, %10
  299.     psraw   %2, 2
  300.     paddw   %2, %9 ; %2=b1
  301.     psraw   %9, 2
  302.     psubw   %9, %10 ; %9=b7
  303.     movdqa  %3, %7
  304.     psraw   %3, 1
  305.     paddw   %3, %8 ; %3=b2
  306.     psraw   %8, 1
  307.     psubw   %8, %7 ; %8=b6
  308.     movdqa  %7, %4
  309.     psraw   %7, 2
  310.     paddw   %7, %1 ; %7=b3
  311.     psraw   %1, 2
  312.     psubw   %4, %1 ; %4=b5
  313. %endmacro
  314. cglobal x264_sub8x8_dct8_sse2
  315. ALIGN 16
  316. ;-----------------------------------------------------------------------------
  317. ;   void __cdecl x264_sub8x8_dct8_sse2( int16_t dct[8][8], uint8_t *pix1, int i_pix1, uint8_t *pix2, int i_pix2 )
  318. ;-----------------------------------------------------------------------------
  319. x264_sub8x8_dct8_sse2:
  320. ;   mov     rdi, rdi        ; dct
  321. ;   mov     rsi, rsi        ; pix1
  322.     movsxd  rdx, edx        ; i_pix1
  323. ;   mov     rcx, rcx        ; pix2
  324.     movsxd  r8,  r8d        ; i_pix2
  325.     MMX_ZERO  xmm9
  326.     MMX_LOAD_DIFF_8P  xmm0, xmm8, xmm9, [rsi      ], [rcx]
  327.     MMX_LOAD_DIFF_8P  xmm1, xmm8, xmm9, [rsi+rdx  ], [rcx+r8]
  328.     MMX_LOAD_DIFF_8P  xmm2, xmm8, xmm9, [rsi+rdx*2], [rcx+r8*2]
  329.     lea  r9,  [rdx+rdx*2]
  330.     lea  r10, [r8+r8*2]
  331.     add  rsi, r9
  332.     add  rcx, r10
  333.     MMX_LOAD_DIFF_8P  xmm3, xmm8, xmm9, [rsi      ], [rcx]
  334.     MMX_LOAD_DIFF_8P  xmm4, xmm8, xmm9, [rsi+rdx  ], [rcx+r8]
  335.     MMX_LOAD_DIFF_8P  xmm5, xmm8, xmm9, [rsi+rdx*2], [rcx+r8*2]
  336.     MMX_LOAD_DIFF_8P  xmm6, xmm8, xmm9, [rsi+r9   ], [rcx+r10]
  337.     MMX_LOAD_DIFF_8P  xmm7, xmm8, xmm9, [rsi+rdx*4], [rcx+r8*4]
  338.     SSE2_TRANSPOSE8x8 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8
  339.     DCT8_1D           xmm0, xmm5, xmm7, xmm3, xmm8, xmm4, xmm2, xmm1, xmm6, xmm9
  340.     SSE2_TRANSPOSE8x8 xmm4, xmm5, xmm7, xmm2, xmm8, xmm3, xmm1, xmm6, xmm0
  341.     DCT8_1D           xmm4, xmm3, xmm6, xmm2, xmm0, xmm8, xmm7, xmm5, xmm1, xmm9
  342.     movdqa  [rdi+0x00], xmm8
  343.     movdqa  [rdi+0x10], xmm3
  344.     movdqa  [rdi+0x20], xmm6
  345.     movdqa  [rdi+0x30], xmm7
  346.     movdqa  [rdi+0x40], xmm0
  347.     movdqa  [rdi+0x50], xmm2
  348.     movdqa  [rdi+0x60], xmm5
  349.     movdqa  [rdi+0x70], xmm1
  350.     ret
  351. ; in:  ABCDEFGH
  352. ; out: IBHDEACG
  353. %macro IDCT8_1D 10
  354.     MMX_SUMSUB_BA  %5, %1 ; %5=a0, %1=a2
  355.     movdqa  %10, %3
  356.     psraw   %3, 1
  357.     psubw   %3, %7 ; %3=a4
  358.     psraw   %7, 1
  359.     paddw   %7, %10 ; %7=a6
  360.     movdqa  %9, %2
  361.     psraw   %9, 1
  362.     paddw   %9, %2
  363.     paddw   %9, %4
  364.     paddw   %9, %6 ; %9=a7
  365.     
  366.     movdqa  %10, %6
  367.     psraw   %10, 1
  368.     paddw   %10, %6
  369.     paddw   %10, %8
  370.     psubw   %10, %2 ; %10=a5
  371.     psubw   %2, %4
  372.     psubw   %6, %4
  373.     paddw   %2, %8
  374.     psubw   %6, %8
  375.     psraw   %4, 1
  376.     psraw   %8, 1
  377.     psubw   %2, %4 ; %2=a3
  378.     psubw   %6, %8 ; %6=a1
  379.     MMX_SUMSUB_BA %7, %5 ; %7=b0, %5=b6
  380.     MMX_SUMSUB_BA %3, %1 ; %3=b2, %1=b4
  381.     movdqa  %4, %9
  382.     psraw   %4, 2
  383.     paddw   %4, %6 ; %4=b1
  384.     psraw   %6, 2
  385.     psubw   %9, %6 ; %9=b7
  386.     movdqa  %8, %10
  387.     psraw   %8, 2
  388.     paddw   %8, %2 ; %8=b3
  389.     psraw   %2, 2
  390.     psubw   %2, %10 ; %2=b5
  391.     MMX_SUMSUB_BA %9, %7 ; %9=c0, %7=c7
  392.     MMX_SUMSUB_BA %2, %3 ; %2=c1, %3=c6
  393.     MMX_SUMSUB_BA %8, %1 ; %8=c2, %1=c5
  394.     MMX_SUMSUB_BA %4, %5 ; %4=c3, %5=c4
  395. %endmacro
  396. cglobal x264_add8x8_idct8_sse2
  397. ALIGN 16
  398. ;-----------------------------------------------------------------------------
  399. ;   void __cdecl x264_add8x8_idct8_sse2( uint8_t *p_dst, int i_dst, int16_t dct[8][8] )
  400. ;-----------------------------------------------------------------------------
  401. x264_add8x8_idct8_sse2:
  402.     movsxd  rsi, esi          ; i_dst
  403.     movdqa  xmm0, [rdx+0x00]  ; dct
  404.     movdqa  xmm1, [rdx+0x10]
  405.     movdqa  xmm2, [rdx+0x20]
  406.     movdqa  xmm3, [rdx+0x30]
  407.     movdqa  xmm4, [rdx+0x40]
  408.     movdqa  xmm5, [rdx+0x50]
  409.     movdqa  xmm6, [rdx+0x60]
  410.     movdqa  xmm7, [rdx+0x70]
  411.     SSE2_TRANSPOSE8x8 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8
  412.     IDCT8_1D          xmm0, xmm5, xmm7, xmm3, xmm8, xmm4, xmm2, xmm1, xmm9, xmm6
  413.     SSE2_TRANSPOSE8x8 xmm9, xmm5, xmm1, xmm3, xmm8, xmm0, xmm7, xmm2, xmm4
  414.     paddw             xmm9, [pw_32 GLOBAL] ; rounding for the >>6 at the end
  415.     IDCT8_1D          xmm9, xmm0, xmm2, xmm3, xmm4, xmm8, xmm1, xmm5, xmm6, xmm7
  416.  
  417.     MMX_ZERO  xmm15
  418.     MMX_STORE_DIFF_8P   xmm6, xmm14, xmm15, [rdi]
  419.     MMX_STORE_DIFF_8P   xmm0, xmm14, xmm15, [rdi+rsi]
  420.     MMX_STORE_DIFF_8P   xmm5, xmm14, xmm15, [rdi+rsi*2]
  421.     lea  rax, [rsi+rsi*2]
  422.     add  rdi, rax
  423.     MMX_STORE_DIFF_8P   xmm3, xmm14, xmm15, [rdi]
  424.     MMX_STORE_DIFF_8P   xmm4, xmm14, xmm15, [rdi+rsi]
  425.     MMX_STORE_DIFF_8P   xmm9, xmm14, xmm15, [rdi+rsi*2]
  426.     MMX_STORE_DIFF_8P   xmm2, xmm14, xmm15, [rdi+rax]
  427.     MMX_STORE_DIFF_8P   xmm1, xmm14, xmm15, [rdi+rsi*4]
  428.     ret