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

Audio

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* mc.asm: h264 encoder library
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2003 x264 project
  5. ;* $Id: mc.asm,v 1.3 2004/06/18 01:59:58 chenm001 Exp $
  6. ;*
  7. ;* Authors: Min Chen <chenm001.163.com> (converted to nasm)
  8. ;*          Laurent Aimar <fenrir@via.ecp.fr> (init algorithm)
  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.05.17 portab mc_copy_w4/8/16 (CM)                                   *
  29. ;*                                                                           *
  30. ;*****************************************************************************
  31. BITS 64
  32. ;=============================================================================
  33. ; Macros and other preprocessor constants
  34. ;=============================================================================
  35. %include "amd64inc.asm"
  36. ;=============================================================================
  37. ; Constants
  38. ;=============================================================================
  39. SECTION .rodata
  40. ALIGN 16
  41. pw_4:  times 4 dw  4
  42. pw_8:  times 4 dw  8
  43. pw_32: times 4 dw 32
  44. pw_64: times 4 dw 64
  45. ;=============================================================================
  46. ; Code
  47. ;=============================================================================
  48. SECTION .text
  49. cglobal x264_pixel_avg_w4_mmxext
  50. cglobal x264_pixel_avg_w8_mmxext
  51. cglobal x264_pixel_avg_w16_mmxext
  52. cglobal x264_pixel_avg_w16_sse2
  53. cglobal x264_pixel_avg_weight_4x4_mmxext
  54. cglobal x264_pixel_avg_weight_w8_mmxext
  55. cglobal x264_pixel_avg_weight_w16_mmxext
  56. cglobal x264_mc_copy_w4_mmxext
  57. cglobal x264_mc_copy_w8_mmxext
  58. cglobal x264_mc_copy_w16_mmxext
  59. cglobal x264_mc_copy_w16_sse2
  60. cglobal x264_mc_chroma_mmxext
  61. ;=============================================================================
  62. ; pixel avg
  63. ;=============================================================================
  64. ALIGN 16
  65. ;-----------------------------------------------------------------------------
  66. ; void x264_pixel_avg_w4_mmxext( uint8_t *dst,  int i_dst_stride,
  67. ;                                uint8_t *src1, int i_src1_stride,
  68. ;                                uint8_t *src2, int i_src2_stride,
  69. ;                                int i_height );
  70. ;-----------------------------------------------------------------------------
  71. x264_pixel_avg_w4_mmxext:
  72.     mov         r10, parm5q         ; src2
  73.     movsxd      r11, parm6d         ; i_src2_stride
  74.     movsxd      rax, parm7d         ; i_height
  75. ALIGN 4
  76. .height_loop    
  77.     movd        mm0, [parm3q]
  78.     pavgb       mm0, [r10]
  79.     movd        mm1, [parm3q+parm4q]
  80.     pavgb       mm1, [r10+r11]
  81.     movd        [parm1q], mm0
  82.     movd        [parm1q+parm2q], mm1
  83.     dec         rax
  84.     dec         rax
  85.     lea         parm3q, [parm3q+parm4q*2]
  86.     lea         r10, [r10+r11*2]
  87.     lea         parm1q, [parm1q+parm2q*2]
  88.     jne         .height_loop
  89.     ret
  90.                           
  91. ALIGN 16
  92. ;-----------------------------------------------------------------------------
  93. ; void x264_pixel_avg_w8_mmxext( uint8_t *dst,  int i_dst_stride,
  94. ;                                uint8_t *src1, int i_src1_stride,
  95. ;                                uint8_t *src2, int i_src2_stride,
  96. ;                                int i_height );
  97. ;-----------------------------------------------------------------------------
  98. x264_pixel_avg_w8_mmxext:
  99.     mov         r10, parm5q         ; src2
  100.     movsxd      r11, parm6d         ; i_src2_stride
  101.     movsxd      rax, parm7d         ; i_height
  102. ALIGN 4
  103. .height_loop    
  104.     movq        mm0, [parm3q]
  105.     pavgb       mm0, [r10]
  106.     movq        [parm1q], mm0
  107.     dec         rax
  108.     lea         parm3q, [parm3q+parm4q]
  109.     lea         r10, [r10+r11]
  110.     lea         parm1q, [parm1q+parm2q]
  111.     jne         .height_loop
  112.     ret
  113. ALIGN 16
  114. ;-----------------------------------------------------------------------------
  115. ; void x264_pixel_avg_w16_mmxext( uint8_t *dst,  int i_dst_stride,
  116. ;                                 uint8_t *src1, int i_src1_stride,
  117. ;                                 uint8_t *src2, int i_src2_stride,
  118. ;                                 int i_height );
  119. ;-----------------------------------------------------------------------------
  120. x264_pixel_avg_w16_mmxext:
  121.     mov         r10, parm5q         ; src2
  122.     movsxd      r11, parm6d         ; i_src2_stride
  123.     movsxd      rax, parm7d         ; i_height
  124. ALIGN 4
  125. .height_loop    
  126.     movq        mm0, [parm3q  ]
  127.     movq        mm1, [parm3q+8]
  128.     pavgb       mm0, [r10  ]
  129.     pavgb       mm1, [r10+8]
  130.     movq        [parm1q  ], mm0
  131.     movq        [parm1q+8], mm1
  132.     dec         rax
  133.     lea         parm3q, [parm3q+parm4q]
  134.     lea         r10, [r10+r11]
  135.     lea         parm1q, [parm1q+parm2q]
  136.     jne         .height_loop
  137.     ret
  138. ALIGN 16
  139. ;-----------------------------------------------------------------------------
  140. ; void x264_pixel_avg_w16_sse2( uint8_t *dst,  int i_dst_stride,
  141. ;                               uint8_t *src1, int i_src1_stride,
  142. ;                               uint8_t *src2, int i_src2_stride,
  143. ;                               int i_height );
  144. ;-----------------------------------------------------------------------------
  145. x264_pixel_avg_w16_sse2:
  146.     mov         r10, parm5q         ; src2
  147.     movsxd      r11, parm6d         ; i_src2_stride
  148.     movsxd      rax, parm7d         ; i_height
  149. ALIGN 4
  150. .height_loop    
  151.     movdqu      xmm0, [parm3q]
  152.     pavgb       xmm0, [r10]
  153.     movdqu      [parm1q], xmm0
  154.     dec         rax
  155.     lea         parm3q, [parm3q+parm4q]
  156.     lea         r10, [r10+r11]
  157.     lea         parm1q, [parm1q+parm2q]
  158.     jne         .height_loop
  159.     ret
  160. ;=============================================================================
  161. ; weighted prediction
  162. ;=============================================================================
  163. ; implicit bipred only:
  164. ; assumes log2_denom = 5, offset = 0, weight1 + weight2 = 64
  165. %macro BIWEIGHT_4P_MMX 2
  166.     movd      mm0, %1
  167.     movd      mm1, %2
  168.     punpcklbw mm0, mm7
  169.     punpcklbw mm1, mm7
  170.     pmullw    mm0, mm4
  171.     pmullw    mm1, mm5
  172.     paddw     mm0, mm1
  173.     paddw     mm0, mm6
  174.     psraw     mm0, 6
  175.     pmaxsw    mm0, mm7
  176.     packuswb  mm0, mm0
  177.     movd      %1,  mm0
  178. %endmacro
  179. %macro BIWEIGHT_START_MMX 0
  180. ;   mov     rdi, rdi      ; dst
  181. ;   movsxd  rsi, esi      ; i_dst
  182. ;   mov     rdx, rdx      ; src
  183. ;   movsxd  rcx, ecx      ; i_src
  184. ;   movsxd  r8,  r8d      ; i_weight_dst
  185. ;   movsxd  r9,  r9d      ; i_height
  186.     mov     r11d, parm6d  ; i_height
  187.     movd    mm4, parm5d
  188.     pshufw  mm4, mm4, 0   ; weight_dst
  189.     movq    mm5, [pw_64 GLOBAL]
  190.     psubw   mm5, mm4      ; weight_src
  191.     movq    mm6, [pw_32 GLOBAL] ; rounding
  192.     pxor    mm7, mm7
  193.     ALIGN 4
  194.     .height_loop
  195. %endmacro
  196. ALIGN 16
  197. ;-----------------------------------------------------------------------------
  198. ;   int x264_pixel_avg_weight_w16_mmxext( uint8_t *dst, int, uint8_t *src, int, int i_weight, int )
  199. ;-----------------------------------------------------------------------------
  200. x264_pixel_avg_weight_w16_mmxext:
  201.     BIWEIGHT_START_MMX
  202.     BIWEIGHT_4P_MMX  [parm1q   ], [parm3q   ]
  203.     BIWEIGHT_4P_MMX  [parm1q+ 4], [parm3q+ 4]
  204.     BIWEIGHT_4P_MMX  [parm1q+ 8], [parm3q+ 8]
  205.     BIWEIGHT_4P_MMX  [parm1q+12], [parm3q+12]
  206.     add  parm1q, parm2q
  207.     add  parm3q, parm4q
  208.     dec  r11d
  209.     jnz  .height_loop
  210.     ret
  211. ALIGN 16
  212. ;-----------------------------------------------------------------------------
  213. ;   int x264_pixel_avg_weight_w8_mmxext( uint8_t *, int, uint8_t *, int, int, int )
  214. ;-----------------------------------------------------------------------------
  215. x264_pixel_avg_weight_w8_mmxext:
  216.     BIWEIGHT_START_MMX
  217.     BIWEIGHT_4P_MMX  [parm1q         ], [parm3q         ]
  218.     BIWEIGHT_4P_MMX  [parm1q+4       ], [parm3q+4       ]
  219.     BIWEIGHT_4P_MMX  [parm1q+parm2q  ], [parm3q+parm4q  ]
  220.     BIWEIGHT_4P_MMX  [parm1q+parm2q+4], [parm3q+parm4q+4]
  221.     lea  parm1q, [parm1q+parm2q*2]
  222.     lea  parm3q, [parm3q+parm4q*2]
  223.     sub  r11d, byte 2
  224.     jnz  .height_loop
  225.     ret
  226. ALIGN 16
  227. ;-----------------------------------------------------------------------------
  228. ;   int x264_pixel_avg_weight_4x4_mmxext( uint8_t *, int, uint8_t *, int, int )
  229. ;-----------------------------------------------------------------------------
  230. x264_pixel_avg_weight_4x4_mmxext:
  231.     BIWEIGHT_START_MMX
  232.     BIWEIGHT_4P_MMX  [parm1q         ], [parm3q         ]
  233.     BIWEIGHT_4P_MMX  [parm1q+parm2q  ], [parm3q+parm4q  ]
  234.     BIWEIGHT_4P_MMX  [parm1q+parm2q*2], [parm3q+parm4q*2]
  235.     add  parm1q, parm2q
  236.     add  parm3q, parm4q
  237.     BIWEIGHT_4P_MMX  [parm1q+parm2q*2], [parm3q+parm4q*2]
  238.     ret
  239. ;=============================================================================
  240. ; pixel copy
  241. ;=============================================================================
  242. ALIGN 16
  243. ;-----------------------------------------------------------------------------
  244. ;  void x264_mc_copy_w4_mmxext( uint8_t *dst, int i_dst_stride,
  245. ;                               uint8_t *src, int i_src_stride, int i_height )
  246. ;-----------------------------------------------------------------------------
  247. x264_mc_copy_w4_mmxext:
  248.     mov     eax, parm5d         ; i_height
  249.     
  250. ALIGN 4
  251. .height_loop
  252.     mov     r10d, [parm3q]
  253.     mov     r11d, [parm3q+parm4q]
  254.     mov     [parm1q], r10d
  255.     mov     [parm1q+parm2q], r11d
  256.     lea     parm3q, [parm3q+parm4q*2]
  257.     lea     parm1q, [parm1q+parm2q*2]
  258.     dec     eax
  259.     dec     eax
  260.     jne     .height_loop
  261.     ret
  262. ALIGN 16
  263. ;-----------------------------------------------------------------------------
  264. ;   void x264_mc_copy_w8_mmxext( uint8_t *dst, int i_dst_stride,
  265. ;                                uint8_t *src, int i_src_stride, int i_height )
  266. ;-----------------------------------------------------------------------------
  267. x264_mc_copy_w8_mmxext:
  268.     mov     eax, parm5d         ; i_height
  269.     lea     r10, [parm4q+parm4q*2] ; 3 * i_src_stride
  270.     lea     r11, [parm2q+parm2q*2] ; 3 * i_dst_stride
  271. ALIGN 4
  272. .height_loop
  273.     movq    mm0, [parm3q]
  274.     movq    mm1, [parm3q+parm4q]
  275.     movq    mm2, [parm3q+parm4q*2]
  276.     movq    mm3, [parm3q+r10]
  277.     movq    [parm1q], mm0
  278.     movq    [parm1q+parm2q], mm1
  279.     movq    [parm1q+parm2q*2], mm2
  280.     movq    [parm1q+r11], mm3
  281.     lea     parm3q, [parm3q+parm4q*4]
  282.     lea     parm1q, [parm1q+parm2q*4]
  283.     
  284.     sub     eax, byte 4
  285.     jnz     .height_loop
  286.     ret
  287. ALIGN 16
  288. ;-----------------------------------------------------------------------------
  289. ;   void x264_mc_copy_w16_mmxext( uint8_t *dst, int i_dst_stride,
  290. ;                                 uint8_t *src, int i_src_stride, int i_height )
  291. ;-----------------------------------------------------------------------------
  292. x264_mc_copy_w16_mmxext:
  293.     mov     eax, parm5d         ; i_height
  294.     
  295.     lea     r10, [parm4q+parm4q*2] ; 3 * i_src_stride
  296.     lea     r11, [parm2q+parm2q*2] ; 3 * i_dst_stride
  297. ALIGN 4
  298. .height_loop
  299.     movq    mm0, [parm3q]
  300.     movq    mm1, [parm3q+8]
  301.     movq    mm2, [parm3q+parm4q]
  302.     movq    mm3, [parm3q+parm4q+8]
  303.     movq    mm4, [parm3q+parm4q*2]
  304.     movq    mm5, [parm3q+parm4q*2+8]
  305.     movq    mm6, [parm3q+r10]
  306.     movq    mm7, [parm3q+r10+8]
  307.     movq    [parm1q], mm0
  308.     movq    [parm1q+8], mm1
  309.     movq    [parm1q+parm2q], mm2
  310.     movq    [parm1q+parm2q+8], mm3
  311.     movq    [parm1q+parm2q*2], mm4
  312.     movq    [parm1q+parm2q*2+8], mm5
  313.     movq    [parm1q+r11], mm6
  314.     movq    [parm1q+r11+8], mm7
  315.     lea     parm3q, [parm3q+parm4q*4]
  316.     lea     parm1q, [parm1q+parm2q*4]
  317.     sub     eax, byte 4
  318.     jnz     .height_loop
  319.     
  320.     ret
  321. ALIGN 16
  322. ;-----------------------------------------------------------------------------
  323. ;   void x264_mc_copy_w16_sse2( uint8_t *dst, int i_dst_stride, uint8_t *src, int i_src_stride, int i_height )
  324. ;-----------------------------------------------------------------------------
  325. x264_mc_copy_w16_sse2:
  326.     mov     eax, parm5d         ; i_height
  327. ALIGN 4
  328. .height_loop
  329.     movdqu  xmm0, [parm3q]
  330.     movdqu  xmm1, [parm3q+parm4q]
  331.     movdqu  [parm1q], xmm0
  332.     movdqu  [parm1q+parm2q], xmm1
  333.     dec     eax
  334.     dec     eax
  335.     lea     parm3q, [parm3q+parm4q*2]
  336.     lea     parm1q, [parm1q+parm2q*2]
  337.     jnz     .height_loop
  338.     
  339.     ret
  340. ;=============================================================================
  341. ; chroma MC
  342. ;=============================================================================
  343. ALIGN 16
  344. ;-----------------------------------------------------------------------------
  345. ;   void x264_mc_chroma_mmxext( uint8_t *src, int i_src_stride,
  346. ;                               uint8_t *dst, int i_dst_stride,
  347. ;                               int dx, int dy,
  348. ;                               int i_width, int i_height )
  349. ;-----------------------------------------------------------------------------
  350. x264_mc_chroma_mmxext:
  351.     movd    mm0, parm5d
  352.     movd    mm1, parm6d
  353.     pxor    mm3, mm3
  354.     pshufw  mm5, mm0, 0    ; mm5 - dx
  355.     pshufw  mm6, mm1, 0    ; mm6 - dy
  356.     movq    mm4, [pw_8 GLOBAL]
  357.     movq    mm0, mm4
  358.     psubw   mm4, mm5            ; mm4 - 8-dx
  359.     psubw   mm0, mm6            ; mm0 - 8-dy
  360.     movq    mm7, mm5
  361.     pmullw  mm5, mm0            ; mm5 = dx*(8-dy) =     cB
  362.     pmullw  mm7, mm6            ; mm7 = dx*dy =         cD
  363.     pmullw  mm6, mm4            ; mm6 = (8-dx)*dy =     cC
  364.     pmullw  mm4, mm0            ; mm4 = (8-dx)*(8-dy) = cA
  365.     mov     rax, parm1q
  366.     mov     r10, parm3q
  367.     mov     r11d, parm8d
  368. ALIGN 4
  369. .height_loop
  370.     movd    mm1, [rax+parm2q]
  371.     movd    mm0, [rax]
  372.     punpcklbw mm1, mm3          ; 00 px1 | 00 px2 | 00 px3 | 00 px4
  373.     punpcklbw mm0, mm3
  374.     pmullw  mm1, mm6            ; 2nd line * cC
  375.     pmullw  mm0, mm4            ; 1st line * cA
  376.     paddw   mm0, mm1            ; mm0 <- result
  377.     movd    mm2, [rax+1]
  378.     movd    mm1, [rax+parm2q+1]
  379.     punpcklbw mm2, mm3
  380.     punpcklbw mm1, mm3
  381.     paddw   mm0, [pw_32 GLOBAL]
  382.     pmullw  mm2, mm5            ; line * cB
  383.     pmullw  mm1, mm7            ; line * cD
  384.     paddw   mm0, mm2
  385.     paddw   mm0, mm1
  386.     psrlw   mm0, 6
  387.     packuswb mm0, mm3           ; 00 00 00 00 px1 px2 px3 px4
  388.     movd    [r10], mm0
  389.     add     rax, parm2q
  390.     add     r10, parm4q         ; i_dst_stride
  391.     dec     r11d
  392.     jnz     .height_loop
  393.     sub     parm7d, 8
  394.     jnz     .finish             ; width != 8 so assume 4
  395.     mov     r10, parm3q         ; dst
  396.     mov     rax, parm1q         ; src
  397.     mov     r11d, parm8d        ; i_height
  398.     add     r10, 4
  399.     add     rax, 4
  400.     jmp    .height_loop
  401. .finish
  402.     ret