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

Audio

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* mc-a2.asm: h264 encoder library
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2005 x264 project
  5. ;*
  6. ;* This program is free software; you can redistribute it and/or modify
  7. ;* it under the terms of the GNU General Public License as published by
  8. ;* the Free Software Foundation; either version 2 of the License, or
  9. ;* (at your option) any later version.
  10. ;*
  11. ;* This program is distributed in the hope that it will be useful,
  12. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ;* GNU General Public License for more details.
  15. ;*
  16. ;* You should have received a copy of the GNU General Public License
  17. ;* along with this program; if not, write to the Free Software
  18. ;* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  19. ;*****************************************************************************
  20. BITS 32
  21. ;=============================================================================
  22. ; Macros and other preprocessor constants
  23. ;=============================================================================
  24. %include "i386inc.asm"
  25. ;=============================================================================
  26. ; Read only data
  27. ;=============================================================================
  28. SECTION_RODATA
  29. ALIGN 16
  30. mmx_dw_one:
  31.     times 4 dw 16
  32. mmx_dd_one:
  33.     times 2 dd 512
  34. mmx_dw_20:
  35.     times 4 dw 20
  36. mmx_dw_5:
  37.     times 4 dw -5
  38. %assign twidth  0
  39. %assign theight 4
  40. %assign tdstp1  8
  41. %assign tdstp2  12
  42. %assign tdst1   16
  43. %assign tdst2   20
  44. %assign tsrc    24
  45. %assign tsrcp   28
  46. %assign toffset 32
  47. %assign tbuffer 36
  48. ;=============================================================================
  49. ; Macros
  50. ;=============================================================================
  51. %macro LOAD_4 9
  52.     movd %1, %5
  53.     movd %2, %6
  54.     movd %3, %7
  55.     movd %4, %8
  56.     punpcklbw %1, %9
  57.     punpcklbw %2, %9
  58.     punpcklbw %3, %9
  59.     punpcklbw %4, %9
  60. %endmacro
  61. %macro FILT_2 2
  62.     psubw %1, %2
  63.     psllw %2, 2
  64.     psubw %1, %2
  65. %endmacro
  66. %macro FILT_4 3
  67.     paddw %2, %3
  68.     psllw %2, 2
  69.     paddw %1, %2
  70.     psllw %2, 2
  71.     paddw %1, %2
  72. %endmacro
  73. %macro FILT_6 4
  74.     psubw %1, %2
  75.     psllw %2, 2
  76.     psubw %1, %2
  77.     paddw %1, %3
  78.     paddw %1, %4
  79.     psraw %1, 5
  80. %endmacro
  81. %macro FILT_ALL 1
  82.     LOAD_4      mm1, mm2, mm3, mm4, [%1], [%1 + ecx], [%1 + 2 * ecx], [%1 + ebx], mm0
  83.     FILT_2      mm1, mm2
  84.     movd        mm5, [%1 + 4 * ecx]
  85.     movd        mm6, [%1 + edx]
  86.     FILT_4      mm1, mm3, mm4
  87.     punpcklbw   mm5, mm0
  88.     punpcklbw   mm6, mm0
  89.     psubw       mm1, mm5
  90.     psllw       mm5, 2
  91.     psubw       mm1, mm5
  92.     paddw       mm1, mm6
  93. %endmacro
  94. ;=============================================================================
  95. ; Code
  96. ;=============================================================================
  97. SECTION .text
  98. cglobal x264_horizontal_filter_mmxext
  99. cglobal x264_center_filter_mmxext
  100. ;-----------------------------------------------------------------------------
  101. ;
  102. ; void x264_center_filter_mmxext( uint8_t *dst1, int i_dst1_stride,
  103. ;                                 uint8_t *dst2, int i_dst2_stride,
  104. ;                                  uint8_t *src, int i_src_stride,
  105. ;                                  int i_width, int i_height );
  106. ;
  107. ;-----------------------------------------------------------------------------
  108. ALIGN 16
  109. x264_center_filter_mmxext :
  110.     push        edi
  111.     push        esi
  112.     push        ebx
  113.     push        ebp
  114.     mov         edx,      [esp + 40]         ; src_stride
  115.     lea         edx,      [edx + edx + 18 + tbuffer]
  116.     sub         esp,      edx
  117.     mov         [esp + toffset] ,edx
  118.     
  119.     mov         eax,      [esp + edx + 20]   ; dst1
  120.     mov         [esp + tdst1]   ,eax
  121.     
  122.     mov         eax,      [esp + edx + 28]   ; dst2
  123.     mov         [esp + tdst2]   ,eax
  124.     
  125.     mov         eax,      [esp + edx + 44]   ; width
  126.     mov         [esp + twidth]  ,eax
  127.     
  128.     mov         eax,      [esp + edx + 48]   ; height
  129.     mov         [esp + theight] ,eax
  130.     
  131.     mov         eax,      [esp + edx + 24]   ; dst1_stride
  132.     mov         [esp + tdstp1]  ,eax
  133.     
  134.     mov         eax,      [esp + edx + 32]   ; dst2_stride
  135.     mov         [esp + tdstp2]  ,eax
  136.     mov         ecx,      [esp + edx + 40]   ; src_stride
  137.     mov         [esp + tsrcp]   ,ecx
  138.     
  139.     mov         eax,      [esp + edx + 36]   ; src
  140.     sub         eax,      ecx
  141.     sub         eax,      ecx
  142.     mov         [esp + tsrc]    ,eax         ; src - 2 * src_stride
  143.     lea         ebx,      [ecx + ecx * 2]    ; 3 * src_stride
  144.     lea         edx,      [ecx + ecx * 4]    ; 5 * src_stride
  145.     picpush     ebx
  146.     picgetgot   ebx
  147.     pxor        mm0,      mm0                ; 0 ---> mm0
  148. loopcy:
  149.     mov         edi,    [picesp + tdst1]
  150.     lea         ebp,    [picesp + tbuffer]
  151.     mov         esi,    [picesp + tsrc]
  152.     movq        mm7,    [mmx_dw_one GOT_ebx]
  153.     picpop      ebx
  154.     FILT_ALL    esi
  155.     pshufw      mm2,    mm1, 0
  156.     movq        [ebp + 8],  mm1
  157.     movq        [ebp],  mm2
  158.     paddw       mm1,    mm7
  159.     psraw       mm1,    5
  160.     packuswb    mm1,    mm1
  161.     movd        [edi],  mm1
  162.     mov         eax,    8
  163.     add         esi,    4
  164. loopcx1:
  165.     FILT_ALL    esi
  166.     movq        [ebp + 2 * eax],  mm1
  167.     paddw       mm1,    mm7
  168.     psraw       mm1,    5
  169.     packuswb    mm1,    mm1
  170.     movd        [edi + eax - 4],  mm1
  171.     add         esi,    4
  172.     add         eax,    4
  173.     cmp         eax,    [esp + twidth]
  174.     jnz         loopcx1
  175.     FILT_ALL    esi
  176.     pshufw      mm2,    mm1,  7
  177.     movq        [ebp + 2 * eax],  mm1
  178.     movq        [ebp + 2 * eax + 8],  mm2
  179.     paddw       mm1,    mm7
  180.     psraw       mm1,    5
  181.     packuswb    mm1,    mm1
  182.     movd        [edi + eax - 4],  mm1
  183.     mov         esi,    [esp + tsrc]
  184.     add         esi,    ecx
  185.     mov         [esp + tsrc],  esi
  186.     add         edi,    [esp + tdstp1]
  187.     mov         [esp + tdst1], edi
  188.     mov         edi,    [esp + tdst2]
  189. ;   mov         eax,    [esp + twidth]
  190.     sub         eax,    4
  191.     picpush     ebx
  192.     picgetgot   ebx
  193. loopcx2:
  194.     movq        mm2,    [picesp + 2 * eax + 2  + 4 + tbuffer]
  195.     movq        mm3,    [picesp + 2 * eax + 4  + 4 + tbuffer]
  196.     movq        mm4,    [picesp + 2 * eax + 6  + 4 + tbuffer]
  197.     movq        mm5,    [picesp + 2 * eax + 8  + 4 + tbuffer]
  198.     movq        mm1,    [picesp + 2 * eax      + 4 + tbuffer]
  199.     movq        mm6,    [picesp + 2 * eax + 10 + 4 + tbuffer]
  200.     paddw       mm2,    mm5
  201.     paddw       mm3,    mm4
  202.     paddw       mm1,    mm6
  203.     movq        mm5,    [mmx_dw_20 GOT_ebx]
  204.     movq        mm4,    [mmx_dw_5 GOT_ebx]
  205.     movq        mm6,    mm1
  206.     pxor        mm7,    mm7
  207.     punpckhwd   mm5,    mm2
  208.     punpcklwd   mm4,    mm3
  209.     punpcklwd   mm2,    [mmx_dw_20 GOT_ebx]
  210.     punpckhwd   mm3,    [mmx_dw_5 GOT_ebx]
  211.     pcmpgtw     mm7,    mm1
  212.     pmaddwd     mm2,    mm4
  213.     pmaddwd     mm3,    mm5
  214.     punpcklwd   mm1,    mm7
  215.     punpckhwd   mm6,    mm7
  216.     paddd       mm2,    mm1
  217.     paddd       mm3,    mm6
  218.     paddd       mm2,    [mmx_dd_one GOT_ebx]
  219.     paddd       mm3,    [mmx_dd_one GOT_ebx]
  220.     psrad       mm2,    10
  221.     psrad       mm3,    10
  222.     packssdw    mm2,    mm3
  223.     packuswb    mm2,    mm0
  224.     movd        [edi + eax], mm2
  225.     sub         eax,    4
  226.     jge         loopcx2
  227.     add         edi,    [picesp + tdstp2]
  228.     mov         [picesp + tdst2], edi
  229.     mov         ebp,    [picesp + theight]
  230.     dec         ebp
  231.     test        ebp,    ebp
  232.     mov         [picesp + theight], ebp
  233.     jnz         loopcy
  234.     picpop      ebx
  235.     add         esp,    [esp + toffset]
  236.     pop         ebp
  237.     pop         ebx
  238.     pop         esi
  239.     pop         edi
  240.     ret
  241. ;-----------------------------------------------------------------------------
  242. ;
  243. ; void x264_horizontal_filter_mmxext( uint8_t *dst, int i_dst_stride,
  244. ;                                     uint8_t *src, int i_src_stride,
  245. ;                                     int i_width, int i_height );
  246. ;
  247. ;-----------------------------------------------------------------------------
  248. ALIGN 16
  249. x264_horizontal_filter_mmxext :
  250.     push edi
  251.     push esi
  252.     mov         edi,    [esp + 12]           ; dst
  253.     mov         esi,    [esp + 20]           ; src
  254.     pxor        mm0,    mm0
  255.     picpush     ebx
  256.     picgetgot   ebx
  257.     movq        mm7,    [mmx_dw_one GOT_ebx]
  258.     picpop      ebx
  259.     mov         ecx,    [esp + 32]           ; height
  260.     sub         esi,    2
  261. loophy:
  262.     dec         ecx
  263.     xor         eax,    eax
  264. loophx:
  265.     prefetchnta [esi + eax + 48]       
  266.     LOAD_4      mm1,    mm2, mm3, mm4, [esi + eax], [esi + eax + 1], [esi + eax + 2], [esi + eax + 3], mm0
  267.     FILT_2      mm1,    mm2
  268.     movd        mm5,    [esi + eax + 4]
  269.     movd        mm6,    [esi + eax + 5]
  270.     FILT_4      mm1,    mm3, mm4
  271.     movd        mm2,    [esi + eax + 4]
  272.     movd        mm3,    [esi + eax + 6]
  273.     punpcklbw   mm5,    mm0
  274.     punpcklbw   mm6,    mm0
  275.     FILT_6      mm1,    mm5, mm6, mm7
  276.     movd        mm4,    [esi + eax + 7]
  277.     movd        mm5,    [esi + eax + 8]
  278.     punpcklbw   mm2,    mm0
  279.     punpcklbw   mm3,    mm0                  ; mm2(1), mm3(20), mm6(-5) ready
  280.     FILT_2      mm2,    mm6
  281.     movd        mm6,    [esi + eax + 9]
  282.     punpcklbw   mm4,    mm0
  283.     punpcklbw   mm5,    mm0                  ; mm2(1-5), mm3(20), mm4(20), mm5(-5) ready
  284.     FILT_4      mm2,    mm3, mm4
  285.     punpcklbw   mm6,    mm0
  286.     FILT_6      mm2,    mm5, mm6, mm7
  287.     packuswb    mm1,    mm2
  288.     movq        [edi + eax],  mm1
  289.     add         eax,    8
  290.     cmp         eax,    [esp + 28]           ; width
  291.     jnz         loophx
  292.     add         esi,    [esp + 24]           ; src_pitch
  293.     add         edi,    [esp + 16]           ; dst_pitch
  294.     test        ecx,    ecx
  295.     jnz         loophy
  296.     pop         esi
  297.     pop         edi
  298.     ret