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

Audio

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* mc-a2.asm: h264 encoder library
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2005-2008 x264 project
  5. ;*
  6. ;* Authors: Loren Merritt <lorenm@u.washington.edu>
  7. ;*          Jason Garrett-Glaser <darkshikari@gmail.com>
  8. ;*          Mathieu Monnier <manao@melix.net>
  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. SECTION_RODATA
  26. pw_1:  times 8 dw 1
  27. pw_16: times 8 dw 16
  28. pw_32: times 8 dw 32
  29. SECTION .text
  30. %macro LOAD_ADD 3
  31.     movh       %1, %2
  32.     movh       m7, %3
  33.     punpcklbw  %1, m0
  34.     punpcklbw  m7, m0
  35.     paddw      %1, m7
  36. %endmacro
  37. %macro FILT_V2 0
  38.     psubw  m1, m2  ; a-b
  39.     psubw  m4, m5
  40.     psubw  m2, m3  ; b-c
  41.     psubw  m5, m6
  42.     psllw  m2, 2
  43.     psllw  m5, 2
  44.     psubw  m1, m2  ; a-5*b+4*c
  45.     psubw  m4, m5
  46.     psllw  m3, 4
  47.     psllw  m6, 4
  48.     paddw  m1, m3  ; a-5*b+20*c
  49.     paddw  m4, m6
  50. %endmacro
  51. %macro FILT_H 3
  52.     psubw  %1, %2  ; a-b
  53.     psraw  %1, 2   ; (a-b)/4
  54.     psubw  %1, %2  ; (a-b)/4-b
  55.     paddw  %1, %3  ; (a-b)/4-b+c
  56.     psraw  %1, 2   ; ((a-b)/4-b+c)/4
  57.     paddw  %1, %3  ; ((a-b)/4-b+c)/4+c = (a-5*b+20*c)/16
  58. %endmacro
  59. %macro FILT_H2 0
  60.     psubw  m1, m2
  61.     psubw  m4, m5
  62.     psraw  m1, 2
  63.     psraw  m4, 2
  64.     psubw  m1, m2
  65.     psubw  m4, m5
  66.     paddw  m1, m3
  67.     paddw  m4, m6
  68.     psraw  m1, 2
  69.     psraw  m4, 2
  70.     paddw  m1, m3
  71.     paddw  m4, m6
  72. %endmacro
  73. %macro FILT_PACK 1
  74.     paddw     m1, m7
  75.     paddw     m4, m7
  76.     psraw     m1, %1
  77.     psraw     m4, %1
  78.     packuswb  m1, m4
  79. %endmacro
  80. %macro PALIGNR_MMX 4
  81.     %ifnidn %4, %2
  82.     mova    %4, %2
  83.     %endif
  84.     %if mmsize == 8
  85.     psllq   %1, (8-%3)*8
  86.     psrlq   %4, %3*8
  87.     %else
  88.     pslldq  %1, 16-%3
  89.     psrldq  %4, %3
  90.     %endif
  91.     por     %1, %4
  92. %endmacro
  93. %macro PALIGNR_SSSE3 4
  94.     palignr %1, %2, %3
  95. %endmacro
  96. INIT_MMX
  97. %macro HPEL_V 1
  98. ;-----------------------------------------------------------------------------
  99. ; void x264_hpel_filter_v_mmxext( uint8_t *dst, uint8_t *src, int16_t *buf, int stride, int width );
  100. ;-----------------------------------------------------------------------------
  101. cglobal x264_hpel_filter_v_%1, 5,6
  102.     lea r5, [r1+r3]
  103.     sub r1, r3
  104.     sub r1, r3
  105.     add r0, r4
  106.     lea r2, [r2+r4*2]
  107.     neg r4
  108.     pxor m0, m0
  109. .loop:
  110.     prefetcht0 [r5+r3*2+64]
  111.     LOAD_ADD  m1, [r1     ], [r5+r3*2] ; a0
  112.     LOAD_ADD  m2, [r1+r3  ], [r5+r3  ] ; b0
  113.     LOAD_ADD  m3, [r1+r3*2], [r5     ] ; c0
  114.     LOAD_ADD  m4, [r1     +mmsize/2], [r5+r3*2+mmsize/2] ; a1
  115.     LOAD_ADD  m5, [r1+r3  +mmsize/2], [r5+r3  +mmsize/2] ; b1
  116.     LOAD_ADD  m6, [r1+r3*2+mmsize/2], [r5     +mmsize/2] ; c1
  117.     FILT_V2
  118.     mova      m7, [pw_16 GLOBAL]
  119.     mova      [r2+r4*2], m1
  120.     mova      [r2+r4*2+mmsize], m4
  121.     paddw     m1, m7
  122.     paddw     m4, m7
  123.     psraw     m1, 5
  124.     psraw     m4, 5
  125.     packuswb  m1, m4
  126.     movnt     [r0+r4], m1
  127.     add r1, mmsize
  128.     add r5, mmsize
  129.     add r4, mmsize
  130.     jl .loop
  131.     REP_RET
  132. %endmacro
  133. HPEL_V mmxext
  134. ;-----------------------------------------------------------------------------
  135. ; void x264_hpel_filter_c_mmxext( uint8_t *dst, int16_t *buf, int width );
  136. ;-----------------------------------------------------------------------------
  137. cglobal x264_hpel_filter_c_mmxext, 3,3
  138.     add r0, r2
  139.     lea r1, [r1+r2*2]
  140.     neg r2
  141.     %define src r1+r2*2
  142.     movq m7, [pw_32 GLOBAL]
  143. .loop:
  144.     movq   m1, [src-4]
  145.     movq   m2, [src-2]
  146.     movq   m3, [src  ]
  147.     movq   m4, [src+4]
  148.     movq   m5, [src+6]
  149.     paddw  m3, [src+2]  ; c0
  150.     paddw  m2, m4       ; b0
  151.     paddw  m1, m5       ; a0
  152.     movq   m6, [src+8]
  153.     paddw  m4, [src+14] ; a1
  154.     paddw  m5, [src+12] ; b1
  155.     paddw  m6, [src+10] ; c1
  156.     FILT_H2
  157.     FILT_PACK 6
  158.     movntq [r0+r2], m1
  159.     add r2, 8
  160.     jl .loop
  161.     REP_RET
  162. ;-----------------------------------------------------------------------------
  163. ; void x264_hpel_filter_h_mmxext( uint8_t *dst, uint8_t *src, int width );
  164. ;-----------------------------------------------------------------------------
  165. cglobal x264_hpel_filter_h_mmxext, 3,3
  166.     add r0, r2
  167.     add r1, r2
  168.     neg r2
  169.     %define src r1+r2
  170.     pxor m0, m0
  171. .loop:
  172.     movd       m1, [src-2]
  173.     movd       m2, [src-1]
  174.     movd       m3, [src  ]
  175.     movd       m6, [src+1]
  176.     movd       m4, [src+2]
  177.     movd       m5, [src+3]
  178.     punpcklbw  m1, m0
  179.     punpcklbw  m2, m0
  180.     punpcklbw  m3, m0
  181.     punpcklbw  m6, m0
  182.     punpcklbw  m4, m0
  183.     punpcklbw  m5, m0
  184.     paddw      m3, m6 ; c0
  185.     paddw      m2, m4 ; b0
  186.     paddw      m1, m5 ; a0
  187.     movd       m7, [src+7]
  188.     movd       m6, [src+6]
  189.     punpcklbw  m7, m0
  190.     punpcklbw  m6, m0
  191.     paddw      m4, m7 ; c1
  192.     paddw      m5, m6 ; b1
  193.     movd       m7, [src+5]
  194.     movd       m6, [src+4]
  195.     punpcklbw  m7, m0
  196.     punpcklbw  m6, m0
  197.     paddw      m6, m7 ; a1
  198.     movq       m7, [pw_1 GLOBAL]
  199.     FILT_H2
  200.     FILT_PACK 1
  201.     movntq     [r0+r2], m1
  202.     add r2, 8
  203.     jl .loop
  204.     REP_RET
  205. INIT_XMM
  206. %macro HPEL_C 1
  207. ;-----------------------------------------------------------------------------
  208. ; void x264_hpel_filter_c_sse2( uint8_t *dst, int16_t *buf, int width );
  209. ;-----------------------------------------------------------------------------
  210. cglobal x264_hpel_filter_c_%1, 3,3
  211.     add r0, r2
  212.     lea r1, [r1+r2*2]
  213.     neg r2
  214.     %define src r1+r2*2
  215. %ifidn %1, ssse3
  216.     mova    m7, [pw_32 GLOBAL]
  217.     %define tpw_32 m7
  218. %elifdef ARCH_X86_64
  219.     mova    m8, [pw_32 GLOBAL]
  220.     %define tpw_32 m8
  221. %else
  222.     %define tpw_32 [pw_32 GLOBAL]
  223. %endif
  224. .loop:
  225.     mova    m6, [src-16]
  226.     mova    m2, [src]
  227.     mova    m3, [src+16]
  228.     mova    m0, m2
  229.     mova    m1, m2
  230.     mova    m4, m3
  231.     mova    m5, m3
  232.     PALIGNR m3, m2, 2, m7
  233.     PALIGNR m4, m2, 4, m7
  234.     PALIGNR m5, m2, 6, m7
  235.     PALIGNR m0, m6, 12, m7
  236.     PALIGNR m1, m6, 14, m7
  237.     paddw   m2, m3
  238.     paddw   m1, m4
  239.     paddw   m0, m5
  240.     FILT_H  m0, m1, m2
  241.     paddw   m0, tpw_32
  242.     psraw   m0, 6
  243.     packuswb m0, m0
  244.     movq [r0+r2], m0
  245.     add r2, 8
  246.     jl .loop
  247.     REP_RET
  248. %endmacro
  249. ;-----------------------------------------------------------------------------
  250. ; void x264_hpel_filter_h_sse2( uint8_t *dst, uint8_t *src, int width );
  251. ;-----------------------------------------------------------------------------
  252. cglobal x264_hpel_filter_h_sse2, 3,3
  253.     add r0, r2
  254.     add r1, r2
  255.     neg r2
  256.     %define src r1+r2
  257.     pxor m0, m0
  258. .loop:
  259.     movh       m1, [src-2]
  260.     movh       m2, [src-1]
  261.     movh       m3, [src  ]
  262.     movh       m4, [src+1]
  263.     movh       m5, [src+2]
  264.     movh       m6, [src+3]
  265.     punpcklbw  m1, m0
  266.     punpcklbw  m2, m0
  267.     punpcklbw  m3, m0
  268.     punpcklbw  m4, m0
  269.     punpcklbw  m5, m0
  270.     punpcklbw  m6, m0
  271.     paddw      m3, m4 ; c0
  272.     paddw      m2, m5 ; b0
  273.     paddw      m1, m6 ; a0
  274.     movh       m4, [src+6]
  275.     movh       m5, [src+7]
  276.     movh       m6, [src+10]
  277.     movh       m7, [src+11]
  278.     punpcklbw  m4, m0
  279.     punpcklbw  m5, m0
  280.     punpcklbw  m6, m0
  281.     punpcklbw  m7, m0
  282.     paddw      m5, m6 ; b1
  283.     paddw      m4, m7 ; a1
  284.     movh       m6, [src+8]
  285.     movh       m7, [src+9]
  286.     punpcklbw  m6, m0
  287.     punpcklbw  m7, m0
  288.     paddw      m6, m7 ; c1
  289.     mova       m7, [pw_1 GLOBAL] ; FIXME xmm8
  290.     FILT_H2
  291.     FILT_PACK 1
  292.     movntdq    [r0+r2], m1
  293.     add r2, 16
  294.     jl .loop
  295.     REP_RET
  296. %define PALIGNR PALIGNR_MMX
  297. HPEL_V sse2
  298. HPEL_C sse2
  299. %define PALIGNR PALIGNR_SSSE3
  300. HPEL_C ssse3
  301. cglobal x264_sfence
  302.     sfence
  303.     ret
  304. ;-----------------------------------------------------------------------------
  305. ; void x264_plane_copy_mmxext( uint8_t *dst, int i_dst,
  306. ;                              uint8_t *src, int i_src, int w, int h)
  307. ;-----------------------------------------------------------------------------
  308. cglobal x264_plane_copy_mmxext, 6,7
  309.     movsxdifnidn r1, r1d
  310.     movsxdifnidn r3, r3d
  311.     add    r4d, 3
  312.     and    r4d, ~3
  313.     mov    r6d, r4d
  314.     and    r6d, ~15
  315.     sub    r1,  r6
  316.     sub    r3,  r6
  317. .loopy:
  318.     mov    r6d, r4d
  319.     sub    r6d, 64
  320.     jl     .endx
  321. .loopx:
  322.     prefetchnta [r2+256]
  323.     movq   mm0, [r2   ]
  324.     movq   mm1, [r2+ 8]
  325.     movq   mm2, [r2+16]
  326.     movq   mm3, [r2+24]
  327.     movq   mm4, [r2+32]
  328.     movq   mm5, [r2+40]
  329.     movq   mm6, [r2+48]
  330.     movq   mm7, [r2+56]
  331.     movntq [r0   ], mm0
  332.     movntq [r0+ 8], mm1
  333.     movntq [r0+16], mm2
  334.     movntq [r0+24], mm3
  335.     movntq [r0+32], mm4
  336.     movntq [r0+40], mm5
  337.     movntq [r0+48], mm6
  338.     movntq [r0+56], mm7
  339.     add    r2,  64
  340.     add    r0,  64
  341.     sub    r6d, 64
  342.     jge    .loopx
  343. .endx:
  344.     prefetchnta [r2+256]
  345.     add    r6d, 48
  346.     jl .end16
  347. .loop16:
  348.     movq   mm0, [r2  ]
  349.     movq   mm1, [r2+8]
  350.     movntq [r0  ], mm0
  351.     movntq [r0+8], mm1
  352.     add    r2,  16
  353.     add    r0,  16
  354.     sub    r6d, 16
  355.     jge    .loop16
  356. .end16:
  357.     add    r6d, 12
  358.     jl .end4
  359. .loop4:
  360.     movd   mm2, [r2+r6]
  361.     movd   [r0+r6], mm2
  362.     sub    r6d, 4
  363.     jge .loop4
  364. .end4:
  365.     add    r2, r3
  366.     add    r0, r1
  367.     dec    r5d
  368.     jg     .loopy
  369.     sfence
  370.     emms
  371.     RET
  372. ; These functions are not general-use; not only do the SSE ones require aligned input,
  373. ; but they also will fail if given a non-mod16 size or a size less than 64.
  374. ; memzero SSE will fail for non-mod128.
  375. ;-----------------------------------------------------------------------------
  376. ; void *x264_memcpy_aligned_mmx( void *dst, const void *src, size_t n );
  377. ;-----------------------------------------------------------------------------
  378. cglobal x264_memcpy_aligned_mmx, 3,3
  379.     test r2d, 16
  380.     jz .copy32
  381.     sub r2d, 16
  382.     movq mm0, [r1 + r2 + 0]
  383.     movq mm1, [r1 + r2 + 8]
  384.     movq [r0 + r2 + 0], mm0
  385.     movq [r0 + r2 + 8], mm1
  386. .copy32:
  387.     sub r2d, 32
  388.     movq mm0, [r1 + r2 +  0]
  389.     movq mm1, [r1 + r2 +  8]
  390.     movq mm2, [r1 + r2 + 16]
  391.     movq mm3, [r1 + r2 + 24]
  392.     movq [r0 + r2 +  0], mm0
  393.     movq [r0 + r2 +  8], mm1
  394.     movq [r0 + r2 + 16], mm2
  395.     movq [r0 + r2 + 24], mm3
  396.     jg .copy32
  397.     REP_RET
  398. ;-----------------------------------------------------------------------------
  399. ; void *x264_memcpy_aligned_sse2( void *dst, const void *src, size_t n );
  400. ;-----------------------------------------------------------------------------
  401. cglobal x264_memcpy_aligned_sse2, 3,3
  402.     test r2d, 16
  403.     jz .copy32
  404.     sub r2d, 16
  405.     movdqa xmm0, [r1 + r2]
  406.     movdqa [r0 + r2], xmm0
  407. .copy32:
  408.     test r2d, 32
  409.     jz .copy64
  410.     sub r2d, 32
  411.     movdqa xmm0, [r1 + r2 +  0]
  412.     movdqa [r0 + r2 +  0], xmm0
  413.     movdqa xmm1, [r1 + r2 + 16]
  414.     movdqa [r0 + r2 + 16], xmm1
  415. .copy64:
  416.     sub r2d, 64
  417.     movdqa xmm0, [r1 + r2 +  0]
  418.     movdqa [r0 + r2 +  0], xmm0
  419.     movdqa xmm1, [r1 + r2 + 16]
  420.     movdqa [r0 + r2 + 16], xmm1
  421.     movdqa xmm2, [r1 + r2 + 32]
  422.     movdqa [r0 + r2 + 32], xmm2
  423.     movdqa xmm3, [r1 + r2 + 48]
  424.     movdqa [r0 + r2 + 48], xmm3
  425.     jg .copy64
  426.     REP_RET
  427. ;-----------------------------------------------------------------------------
  428. ; void *x264_memzero_aligned( void *dst, size_t n );
  429. ;-----------------------------------------------------------------------------
  430. %macro MEMZERO 1
  431. cglobal x264_memzero_aligned_%1, 2,2
  432.     pxor m0, m0
  433. .loop:
  434.     sub r1d, mmsize*8
  435. %assign i 0
  436. %rep 8
  437.     mova [r0 + r1 + i], m0
  438. %assign i i+mmsize
  439. %endrep
  440.     jg .loop
  441.     REP_RET
  442. %endmacro
  443. INIT_MMX
  444. MEMZERO mmx
  445. INIT_XMM
  446. MEMZERO sse2
  447. %macro FILT8x4 7
  448.     mova      %3, [r0+%7]
  449.     mova      %4, [r0+r5+%7]
  450.     pavgb     %3, %4
  451.     pavgb     %4, [r0+r5*2+%7]
  452.     PALIGNR   %1, %3, 1, m6
  453.     PALIGNR   %2, %4, 1, m6
  454.     pavgb     %1, %3
  455.     pavgb     %2, %4
  456.     mova      %5, %1
  457.     mova      %6, %2
  458.     pand      %1, m7
  459.     pand      %2, m7
  460.     psrlw     %5, 8
  461.     psrlw     %6, 8
  462. %endmacro
  463. %macro FILT16x2 4
  464.     mova      m3, [r0+%4+mmsize]
  465.     mova      m2, [r0+%4]
  466.     pavgb     m3, [r0+%4+r5+mmsize]
  467.     pavgb     m2, [r0+%4+r5]
  468.     PALIGNR   %1, m3, 1, m6
  469.     pavgb     %1, m3
  470.     PALIGNR   m3, m2, 1, m6
  471.     pavgb     m3, m2
  472.     mova      m5, m3
  473.     mova      m4, %1
  474.     pand      m3, m7
  475.     pand      %1, m7
  476.     psrlw     m5, 8
  477.     psrlw     m4, 8
  478.     packuswb  m3, %1
  479.     packuswb  m5, m4
  480.     mova    [%2], m3
  481.     mova    [%3], m5
  482.     mova      %1, m2
  483. %endmacro
  484. %macro FILT8x2U 3
  485.     mova      m3, [r0+%3+8]
  486.     mova      m2, [r0+%3]
  487.     pavgb     m3, [r0+%3+r5+8]
  488.     pavgb     m2, [r0+%3+r5]
  489.     mova      m1, [r0+%3+9]
  490.     mova      m0, [r0+%3+1]
  491.     pavgb     m1, [r0+%3+r5+9]
  492.     pavgb     m0, [r0+%3+r5+1]
  493.     pavgb     m1, m3
  494.     pavgb     m0, m2
  495.     mova      m3, m1
  496.     mova      m2, m0
  497.     pand      m1, m7
  498.     pand      m0, m7
  499.     psrlw     m3, 8
  500.     psrlw     m2, 8
  501.     packuswb  m0, m1
  502.     packuswb  m2, m3
  503.     mova    [%1], m0
  504.     mova    [%2], m2
  505. %endmacro
  506. ;-----------------------------------------------------------------------------
  507. ; void frame_init_lowres_core( uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc,
  508. ;                              int src_stride, int dst_stride, int width, int height )
  509. ;-----------------------------------------------------------------------------
  510. %macro FRAME_INIT_LOWRES 1 ; FIXME
  511. cglobal x264_frame_init_lowres_core_%1, 6,7
  512.     ; src += 2*(height-1)*stride + 2*width
  513.     mov      r6d, r8m
  514.     dec      r6d
  515.     imul     r6d, r5d
  516.     add      r6d, r7m
  517.     lea       r0, [r0+r6*2]
  518.     ; dst += (height-1)*stride + width
  519.     mov      r6d, r8m
  520.     dec      r6d
  521.     imul     r6d, r6m
  522.     add      r6d, r7m
  523.     add       r1, r6
  524.     add       r2, r6
  525.     add       r3, r6
  526.     add       r4, r6
  527.     ; gap = stride - width
  528.     mov      r6d, r6m
  529.     sub      r6d, r7m
  530.     PUSH      r6
  531.     %define dst_gap [rsp+gprsize]
  532.     mov      r6d, r5d
  533.     sub      r6d, r7m
  534.     shl      r6d, 1
  535.     PUSH      r6
  536.     %define src_gap [rsp]
  537. %if mmsize == 16
  538.     ; adjust for the odd end case
  539.     mov      r6d, r7m
  540.     and      r6d, 8
  541.     sub       r1, r6
  542.     sub       r2, r6
  543.     sub       r3, r6
  544.     sub       r4, r6
  545.     add  dst_gap, r6d
  546. %endif ; mmsize
  547.     pcmpeqb   m7, m7
  548.     psrlw     m7, 8
  549. .vloop:
  550.     mov      r6d, r7m
  551. %ifnidn %1, mmxext
  552.     mova      m0, [r0]
  553.     mova      m1, [r0+r5]
  554.     pavgb     m0, m1
  555.     pavgb     m1, [r0+r5*2]
  556. %endif
  557. %if mmsize == 16
  558.     test     r6d, 8
  559.     jz .hloop
  560.     sub       r0, 16
  561.     FILT8x4   m0, m1, m2, m3, m4, m5, 0
  562.     packuswb  m0, m4
  563.     packuswb  m1, m5
  564.     movq    [r1], m0
  565.     movhps  [r2], m0
  566.     movq    [r3], m1
  567.     movhps  [r4], m1
  568.     mova      m0, m2
  569.     mova      m1, m3
  570.     sub      r6d, 8
  571. %endif ; mmsize
  572. .hloop:
  573.     sub       r0, mmsize*2
  574.     sub       r1, mmsize
  575.     sub       r2, mmsize
  576.     sub       r3, mmsize
  577.     sub       r4, mmsize
  578. %ifdef m8
  579.     FILT8x4   m0, m1, m2, m3, m10, m11, mmsize
  580.     mova      m8, m0
  581.     mova      m9, m1
  582.     FILT8x4   m2, m3, m0, m1, m4, m5, 0
  583.     packuswb  m2, m8
  584.     packuswb  m3, m9
  585.     packuswb  m4, m10
  586.     packuswb  m5, m11
  587.     mova    [r1], m2
  588.     mova    [r2], m4
  589.     mova    [r3], m3
  590.     mova    [r4], m5
  591. %elifidn %1, mmxext
  592.     FILT8x2U  r1, r2, 0
  593.     FILT8x2U  r3, r4, r5
  594. %else
  595.     FILT16x2  m0, r1, r2, 0
  596.     FILT16x2  m1, r3, r4, r5
  597. %endif
  598.     sub      r6d, mmsize
  599.     jg .hloop
  600. .skip:
  601.     mov       r6, dst_gap
  602.     sub       r0, src_gap
  603.     sub       r1, r6
  604.     sub       r2, r6
  605.     sub       r3, r6
  606.     sub       r4, r6
  607.     dec    dword r8m
  608.     jg .vloop
  609.     ADD      rsp, 2*gprsize
  610.     emms
  611.     RET
  612. %endmacro ; FRAME_INIT_LOWRES
  613. INIT_MMX
  614. %define PALIGNR PALIGNR_MMX
  615. FRAME_INIT_LOWRES mmxext
  616. %ifndef ARCH_X86_64
  617. FRAME_INIT_LOWRES cache32_mmxext
  618. %endif
  619. INIT_XMM
  620. FRAME_INIT_LOWRES sse2
  621. %define PALIGNR PALIGNR_SSSE3
  622. FRAME_INIT_LOWRES ssse3