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 64
  21. ;=============================================================================
  22. ; Macros and other preprocessor constants
  23. ;=============================================================================
  24. %include "amd64inc.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 tbuffer 0
  39. ;=============================================================================
  40. ; Macros
  41. ;=============================================================================
  42. %macro LOAD_4 9
  43.     movd %1, %5
  44.     movd %2, %6
  45.     movd %3, %7
  46.     movd %4, %8
  47.     punpcklbw %1, %9
  48.     punpcklbw %2, %9
  49.     punpcklbw %3, %9
  50.     punpcklbw %4, %9
  51. %endmacro
  52. %macro FILT_2 2
  53.     psubw %1, %2
  54.     psllw %2, 2
  55.     psubw %1, %2
  56. %endmacro
  57. %macro FILT_4 3
  58.     paddw %2, %3
  59.     psllw %2, 2
  60.     paddw %1, %2
  61.     psllw %2, 2
  62.     paddw %1, %2
  63. %endmacro
  64. %macro FILT_6 4
  65.     psubw %1, %2
  66.     psllw %2, 2
  67.     psubw %1, %2
  68.     paddw %1, %3
  69.     paddw %1, %4
  70.     psraw %1, 5
  71. %endmacro
  72. %macro FILT_ALL 1
  73.     LOAD_4      mm1, mm2, mm3, mm4, [%1], [%1 + rcx], [%1 + 2 * rcx], [%1 + rbx], mm0
  74.     FILT_2      mm1, mm2
  75.     movd        mm5, [%1 + 4 * rcx]
  76.     movd        mm6, [%1 + rdx]
  77.     FILT_4      mm1, mm3, mm4
  78.     punpcklbw   mm5, mm0
  79.     punpcklbw   mm6, mm0
  80.     psubw       mm1, mm5
  81.     psllw       mm5, 2
  82.     psubw       mm1, mm5
  83.     paddw       mm1, mm6
  84. %endmacro
  85. ;=============================================================================
  86. ; Code
  87. ;=============================================================================
  88. SECTION .text
  89. cglobal x264_horizontal_filter_mmxext
  90. cglobal x264_center_filter_mmxext
  91. ;-----------------------------------------------------------------------------
  92. ;
  93. ; void x264_center_filter_mmxext( uint8_t *dst1, int i_dst1_stride,
  94. ;                                 uint8_t *dst2, int i_dst2_stride,
  95. ;                                  uint8_t *src, int i_src_stride,
  96. ;                                  int i_width, int i_height );
  97. ;
  98. ;-----------------------------------------------------------------------------
  99. ALIGN 16
  100. x264_center_filter_mmxext :
  101.     push        r15
  102.     pushreg     r15
  103. %ifdef WIN64
  104.     push        rdi
  105.     pushreg     rdi
  106.     push        rsi
  107.     pushreg     rsi
  108. %endif
  109.     push        rbp
  110.     pushreg     rbp
  111.     push        rbx
  112.     pushreg     rbx
  113.     push        r12
  114.     pushreg     r12
  115.     push        r13
  116.     pushreg     r13
  117.     push        r14
  118.     pushreg     r14
  119.     lea         rbp,    [rsp]
  120.     setframe    rbp, 0
  121.     endprolog
  122. %ifdef WIN64
  123.     movsxd      r13,    dword [rsp+64+48]   ; src_stride
  124.     mov         r12,    [rsp+64+40]         ; src
  125. %else
  126.     movsxd      r13,    r9d                 ; src_stride
  127.     mov         r12,    r8                  ; src
  128. %endif
  129.     sub         r12,    r13
  130.     sub         r12,    r13                 ; tsrc = src - 2 * src_stride
  131.     ; use 24 instead of 18 (used in i386/mc-a2.asm) to keep rsp aligned
  132.     lea         rax,    [r13 + r13 + 24 + tbuffer]
  133.     sub         rsp,    rax
  134.     mov         r10,    parm3q                 ; dst2
  135.     movsxd      r11,    parm4d                 ; dst2_stride
  136.     mov         r8,     parm1q                 ; dst1
  137.     movsxd      r9,     parm2d                 ; dst1_stride
  138. %ifdef WIN64
  139.     movsxd      r14,    dword [rbp + 64 + 56]  ; width
  140.     movsxd      r15,    dword [rbp + 64 + 64]  ; height
  141. %else
  142.     movsxd      r14,    dword [rbp + 56]    ; width
  143.     movsxd      r15,    dword [rbp + 64]    ; height
  144. %endif
  145.     mov         rcx,    r13                 ; src_stride
  146.     lea         rbx,    [r13 + r13 * 2]     ; 3 * src_stride
  147.     lea         rdx,    [r13 + r13 * 4]     ; 5 * src_stride
  148.     pxor        mm0,    mm0                 ; 0 ---> mm0
  149.     movq        mm7,    [mmx_dd_one GLOBAL] ; for rounding
  150. .loopcy:
  151.     xor         rax,    rax
  152.     mov         rsi,    r12             ; tsrc
  153.     FILT_ALL    rsi
  154.     pshufw      mm2,    mm1, 0
  155.     movq        [rsp + tbuffer],  mm2
  156.     movq        [rsp + tbuffer + 8],  mm1
  157.     paddw       mm1,    [mmx_dw_one GLOBAL]
  158.     psraw       mm1,    5
  159.     packuswb    mm1,    mm1
  160.     movd        [r8],   mm1             ; dst1[0] = mm1
  161.     add         rax,    8
  162.     add         rsi,    4
  163.     lea         rdi,    [r8 - 4]        ; rdi = dst1 - 4
  164. .loopcx1:
  165.     FILT_ALL    rsi
  166.     movq        [rsp + tbuffer + 2 * rax],  mm1
  167.     paddw       mm1,    [mmx_dw_one GLOBAL]
  168.     psraw       mm1,    5
  169.     packuswb    mm1,    mm1
  170.     movd        [rdi + rax],  mm1   ; dst1[rax - 4] = mm1
  171.     add         rsi,    4
  172.     add         rax,    4
  173.     cmp         rax,    r14         ; cmp rax, width
  174.     jnz         .loopcx1
  175.     FILT_ALL    rsi
  176.     pshufw      mm2,    mm1,  7
  177.     movq        [rsp + tbuffer + 2 * rax],  mm1
  178.     movq        [rsp + tbuffer + 2 * rax + 8],  mm2
  179.     paddw       mm1,    [mmx_dw_one GLOBAL]
  180.     psraw       mm1,    5
  181.     packuswb    mm1,    mm1
  182.     movd        [rdi + rax],  mm1   ; dst1[rax - 4] = mm1
  183.     add         r12,    r13         ; tsrc = tsrc + src_stride
  184.     add         r8,     r9          ; dst1 = dst1 + dst1_stride
  185.     xor         rax,    rax
  186. .loopcx2:
  187.     movq        mm2,    [rsp + 2 * rax + 2  + 4 + tbuffer]
  188.     movq        mm3,    [rsp + 2 * rax + 4  + 4 + tbuffer]
  189.     movq        mm4,    [rsp + 2 * rax + 6  + 4 + tbuffer]
  190.     movq        mm5,    [rsp + 2 * rax + 8  + 4 + tbuffer]
  191.     movq        mm1,    [rsp + 2 * rax      + 4 + tbuffer]
  192.     movq        mm6,    [rsp + 2 * rax + 10 + 4 + tbuffer]
  193.     paddw       mm2,    mm5
  194.     paddw       mm3,    mm4
  195.     paddw       mm1,    mm6
  196.     movq        mm5,    [mmx_dw_20 GLOBAL]
  197.     movq        mm4,    [mmx_dw_5 GLOBAL]
  198.     movq        mm6,    mm1
  199.     pxor        mm7,    mm7
  200.     punpckhwd   mm5,    mm2
  201.     punpcklwd   mm4,    mm3
  202.     punpcklwd   mm2,    [mmx_dw_20 GLOBAL]
  203.     punpckhwd   mm3,    [mmx_dw_5 GLOBAL]
  204.     pcmpgtw     mm7,    mm1
  205.     pmaddwd     mm2,    mm4
  206.     pmaddwd     mm3,    mm5
  207.     punpcklwd   mm1,    mm7
  208.     punpckhwd   mm6,    mm7
  209.     paddd       mm2,    mm1
  210.     paddd       mm3,    mm6
  211.     paddd       mm2,    [mmx_dd_one GLOBAL]
  212.     paddd       mm3,    [mmx_dd_one GLOBAL]
  213.     psrad       mm2,    10
  214.     psrad       mm3,    10
  215.     packssdw    mm2,    mm3
  216.     packuswb    mm2,    mm0
  217.     movd        [r10 + rax], mm2    ; dst2[rax] = mm2
  218.     add         rax,    4
  219.     cmp         rax,    r14         ; cmp rax, width
  220.     jnz         .loopcx2
  221.     add         r10,    r11         ; dst2 += dst2_stride
  222.     dec         r15                 ; height
  223.     test        r15,    r15
  224.     jnz         .loopcy
  225.     lea         rsp,    [rbp]
  226.     pop         r14
  227.     pop         r13
  228.     pop         r12
  229.     pop         rbx
  230.     pop         rbp
  231. %ifdef WIN64
  232.     pop         rsi
  233.     pop         rdi
  234. %endif
  235.     pop         r15
  236.     ret
  237. ;-----------------------------------------------------------------------------
  238. ;
  239. ; void x264_horizontal_filter_mmxext( uint8_t *dst, int i_dst_stride,
  240. ;                                     uint8_t *src, int i_src_stride,
  241. ;                                     int i_width, int i_height );
  242. ;
  243. ;-----------------------------------------------------------------------------
  244. ALIGN 16
  245. x264_horizontal_filter_mmxext :
  246.     movsxd      r10,    parm2d               ; dst_stride
  247.     movsxd      r11,    parm4d               ; src_stride
  248. %ifdef WIN64
  249.     mov         rdx,    r8                   ; src
  250.     mov         r9,     rcx                  ; dst
  251.     movsxd      rcx,    parm6d               ; height
  252. %else
  253.     movsxd      rcx,    parm6d               ; height
  254.     mov         r9,     rdi                  ; dst
  255. %endif
  256.     
  257.     movsxd      r8,     parm5d               ; width
  258.     pxor        mm0,    mm0
  259.     movq        mm7,    [mmx_dw_one GLOBAL]
  260.     sub         rdx,    2
  261. loophy:
  262.     dec         rcx
  263.     xor         rax,    rax
  264. loophx:
  265.     prefetchnta [rdx + rax + 48]       
  266.     LOAD_4      mm1,    mm2, mm3, mm4, [rdx + rax], [rdx + rax + 1], [rdx + rax + 2], [rdx + rax + 3], mm0
  267.     FILT_2      mm1,    mm2
  268.     movd        mm5,    [rdx + rax + 4]
  269.     movd        mm6,    [rdx + rax + 5]
  270.     FILT_4      mm1,    mm3, mm4
  271.     movd        mm2,    [rdx + rax + 4]
  272.     movd        mm3,    [rdx + rax + 6]
  273.     punpcklbw   mm5,    mm0
  274.     punpcklbw   mm6,    mm0
  275.     FILT_6      mm1,    mm5, mm6, mm7
  276.     movd        mm4,    [rdx + rax + 7]
  277.     movd        mm5,    [rdx + rax + 8]
  278.     punpcklbw   mm2,    mm0
  279.     punpcklbw   mm3,    mm0                  ; mm2(1), mm3(20), mm6(-5) ready
  280.     FILT_2      mm2,    mm6
  281.     movd        mm6,    [rdx + rax + 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        [r9 + rax],  mm1
  289.     add         rax,    8
  290.     cmp         rax,    r8                   ; cmp rax, width
  291.     jnz         loophx
  292.     add         rdx,    r11                  ; src_pitch
  293.     add         r9,     r10                  ; dst_pitch
  294.     test        rcx,    rcx
  295.     jnz         loophy
  296.     ret