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

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 32
  32. ;=============================================================================
  33. ; Macros and other preprocessor constants
  34. ;=============================================================================
  35. %include "i386inc.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.     push        ebp
  73.     push        ebx
  74.     push        esi
  75.     push        edi
  76.     mov         edi, [esp+20]       ; dst
  77.     mov         ebx, [esp+28]       ; src1
  78.     mov         ecx, [esp+36]       ; src2
  79.     mov         esi, [esp+24]       ; i_dst_stride
  80.     mov         eax, [esp+32]       ; i_src1_stride
  81.     mov         edx, [esp+40]       ; i_src2_stride
  82.     mov         ebp, [esp+44]       ; i_height
  83. ALIGN 4
  84. .height_loop:    
  85.     movd        mm0, [ebx]
  86.     pavgb       mm0, [ecx]
  87.     movd        mm1, [ebx+eax]
  88.     pavgb       mm1, [ecx+edx]
  89.     movd        [edi], mm0
  90.     movd        [edi+esi], mm1
  91.     dec         ebp
  92.     dec         ebp
  93.     lea         ebx, [ebx+eax*2]
  94.     lea         ecx, [ecx+edx*2]
  95.     lea         edi, [edi+esi*2]
  96.     jne         .height_loop
  97.     pop         edi
  98.     pop         esi
  99.     pop         ebx
  100.     pop         ebp
  101.     ret
  102.                           
  103. ALIGN 16
  104. ;-----------------------------------------------------------------------------
  105. ; void x264_pixel_avg_w8_mmxext( uint8_t *dst,  int i_dst_stride,
  106. ;                                uint8_t *src1, int i_src1_stride,
  107. ;                                uint8_t *src2, int i_src2_stride,
  108. ;                                int i_height );
  109. ;-----------------------------------------------------------------------------
  110. x264_pixel_avg_w8_mmxext:
  111.     push        ebp
  112.     push        ebx
  113.     push        esi
  114.     push        edi
  115.     mov         edi, [esp+20]       ; dst
  116.     mov         ebx, [esp+28]       ; src1
  117.     mov         ecx, [esp+36]       ; src2
  118.     mov         esi, [esp+24]       ; i_dst_stride
  119.     mov         eax, [esp+32]       ; i_src1_stride
  120.     mov         edx, [esp+40]       ; i_src2_stride
  121.     mov         ebp, [esp+44]       ; i_height
  122. ALIGN 4
  123. .height_loop:    
  124.     movq        mm0, [ebx]
  125.     pavgb       mm0, [ecx]
  126.     movq        [edi], mm0
  127.     dec         ebp
  128.     lea         ebx, [ebx+eax]
  129.     lea         ecx, [ecx+edx]
  130.     lea         edi, [edi+esi]
  131.     jne         .height_loop
  132.     pop         edi
  133.     pop         esi
  134.     pop         ebx
  135.     pop         ebp
  136.     ret
  137. ALIGN 16
  138. ;-----------------------------------------------------------------------------
  139. ; void x264_pixel_avg_w16_mmxext( uint8_t *dst,  int i_dst_stride,
  140. ;                                 uint8_t *src1, int i_src1_stride,
  141. ;                                 uint8_t *src2, int i_src2_stride,
  142. ;                                 int i_height );
  143. ;-----------------------------------------------------------------------------
  144. x264_pixel_avg_w16_mmxext:
  145.     push        ebp
  146.     push        ebx
  147.     push        esi
  148.     push        edi
  149.     mov         edi, [esp+20]       ; dst
  150.     mov         ebx, [esp+28]       ; src1
  151.     mov         ecx, [esp+36]       ; src2
  152.     mov         esi, [esp+24]       ; i_dst_stride
  153.     mov         eax, [esp+32]       ; i_src1_stride
  154.     mov         edx, [esp+40]       ; i_src2_stride
  155.     mov         ebp, [esp+44]       ; i_height
  156. ALIGN 4
  157. .height_loop:    
  158.     movq        mm0, [ebx  ]
  159.     movq        mm1, [ebx+8]
  160.     pavgb       mm0, [ecx  ]
  161.     pavgb       mm1, [ecx+8]
  162.     movq        [edi  ], mm0
  163.     movq        [edi+8], mm1
  164.     dec         ebp
  165.     lea         ebx, [ebx+eax]
  166.     lea         ecx, [ecx+edx]
  167.     lea         edi, [edi+esi]
  168.     jne         .height_loop
  169.     pop         edi
  170.     pop         esi
  171.     pop         ebx
  172.     pop         ebp
  173.     ret
  174. ALIGN 16
  175. ;-----------------------------------------------------------------------------
  176. ; void x264_pixel_avg_w16_sse2( uint8_t *dst,  int i_dst_stride,
  177. ;                               uint8_t *src1, int i_src1_stride,
  178. ;                               uint8_t *src2, int i_src2_stride,
  179. ;                               int i_height );
  180. ;-----------------------------------------------------------------------------
  181. x264_pixel_avg_w16_sse2:
  182.     push        ebp
  183.     push        ebx
  184.     push        esi
  185.     push        edi
  186.     mov         edi, [esp+20]       ; dst
  187.     mov         ebx, [esp+28]       ; src1
  188.     mov         ecx, [esp+36]       ; src2
  189.     mov         esi, [esp+24]       ; i_dst_stride
  190.     mov         eax, [esp+32]       ; i_src1_stride
  191.     mov         edx, [esp+40]       ; i_src2_stride
  192.     mov         ebp, [esp+44]       ; i_height
  193. ALIGN 4
  194. .height_loop:    
  195.     movdqu      xmm0, [ebx]
  196.     pavgb       xmm0, [ecx]
  197.     movdqu      [edi], xmm0
  198.     dec         ebp
  199.     lea         ebx, [ebx+eax]
  200.     lea         ecx, [ecx+edx]
  201.     lea         edi, [edi+esi]
  202.     jne         .height_loop
  203.     pop         edi
  204.     pop         esi
  205.     pop         ebx
  206.     pop         ebp
  207.     ret
  208. ;=============================================================================
  209. ; weighted prediction
  210. ;=============================================================================
  211. ; implicit bipred only:
  212. ; assumes log2_denom = 5, offset = 0, weight1 + weight2 = 64
  213. %macro BIWEIGHT_4P_MMX 2
  214.     movd      mm0, %1
  215.     movd      mm1, %2
  216.     punpcklbw mm0, mm7
  217.     punpcklbw mm1, mm7
  218.     pmullw    mm0, mm4
  219.     pmullw    mm1, mm5
  220.     paddw     mm0, mm1
  221.     paddw     mm0, mm6
  222.     psraw     mm0, 6
  223.     pmaxsw    mm0, mm7
  224.     packuswb  mm0, mm0
  225.     movd      %1,  mm0
  226. %endmacro
  227. %macro BIWEIGHT_START_MMX 0
  228.     push    edi
  229.     push    esi
  230.     picpush ebx
  231.     picgetgot ebx
  232.     mov     edi, [picesp+12]    ; dst
  233.     mov     esi, [picesp+16]    ; i_dst
  234.     mov     edx, [picesp+20]    ; src
  235.     mov     ecx, [picesp+24]    ; i_src
  236.     pshufw  mm4, [picesp+28], 0  ; weight_dst
  237.     movq    mm5, [pw_64 GOT_ebx]
  238.     psubw   mm5, mm4             ; weight_src
  239.     movq    mm6, [pw_32 GOT_ebx] ; rounding
  240.     pxor    mm7, mm7
  241. %endmacro
  242. %macro BIWEIGHT_END_MMX 0
  243.     picpop  ebx
  244.     pop     esi
  245.     pop     edi
  246.     ret
  247. %endmacro
  248. ALIGN 16
  249. ;-----------------------------------------------------------------------------
  250. ;   int __cdecl x264_pixel_avg_weight_w16_mmxext( uint8_t *, int, uint8_t *, int, int, int )
  251. ;-----------------------------------------------------------------------------
  252. x264_pixel_avg_weight_w16_mmxext:
  253.     BIWEIGHT_START_MMX
  254.     mov     eax, [picesp+32] ; i_height
  255.     ALIGN 4
  256.     .height_loop:
  257.     BIWEIGHT_4P_MMX  [edi   ], [edx   ]
  258.     BIWEIGHT_4P_MMX  [edi+ 4], [edx+ 4]
  259.     BIWEIGHT_4P_MMX  [edi+ 8], [edx+ 8]
  260.     BIWEIGHT_4P_MMX  [edi+12], [edx+12]
  261.     add  edi, esi
  262.     add  edx, ecx
  263.     dec  eax
  264.     jnz  .height_loop
  265.     BIWEIGHT_END_MMX
  266. ALIGN 16
  267. ;-----------------------------------------------------------------------------
  268. ;   int __cdecl x264_pixel_avg_weight_w8_mmxext( uint8_t *, int, uint8_t *, int, int, int )
  269. ;-----------------------------------------------------------------------------
  270. x264_pixel_avg_weight_w8_mmxext:
  271.     BIWEIGHT_START_MMX
  272.     mov     eax, [picesp+32]
  273.     ALIGN 4
  274. .height_loop:
  275.     BIWEIGHT_4P_MMX  [edi      ], [edx      ]
  276.     BIWEIGHT_4P_MMX  [edi+4    ], [edx+4    ]
  277.     BIWEIGHT_4P_MMX  [edi+esi  ], [edx+ecx  ]
  278.     BIWEIGHT_4P_MMX  [edi+esi+4], [edx+ecx+4]
  279.     lea  edi, [edi+esi*2]
  280.     lea  edx, [edx+ecx*2]
  281.     sub  eax, byte 2
  282.     jnz  .height_loop
  283.     BIWEIGHT_END_MMX
  284. ALIGN 16
  285. ;-----------------------------------------------------------------------------
  286. ;   int __cdecl x264_pixel_avg_weight_4x4_mmxext( uint8_t *, int, uint8_t *, int, int )
  287. ;-----------------------------------------------------------------------------
  288. x264_pixel_avg_weight_4x4_mmxext:
  289.     BIWEIGHT_START_MMX
  290.     BIWEIGHT_4P_MMX  [edi      ], [edx      ]
  291.     BIWEIGHT_4P_MMX  [edi+esi  ], [edx+ecx  ]
  292.     BIWEIGHT_4P_MMX  [edi+esi*2], [edx+ecx*2]
  293.     add  edi, esi
  294.     add  edx, ecx
  295.     BIWEIGHT_4P_MMX  [edi+esi*2], [edx+ecx*2]
  296.     BIWEIGHT_END_MMX
  297. ;=============================================================================
  298. ; pixel copy
  299. ;=============================================================================
  300. ALIGN 16
  301. ;-----------------------------------------------------------------------------
  302. ;  void x264_mc_copy_w4_mmxext( uint8_t *src, int i_src_stride,
  303. ;                               uint8_t *dst, int i_dst_stride, int i_height )
  304. ;-----------------------------------------------------------------------------
  305. x264_mc_copy_w4_mmxext:
  306.     push    ebx
  307.     push    esi
  308.     push    edi
  309.     mov     esi, [esp+24]       ; src
  310.     mov     edi, [esp+16]       ; dst
  311.     mov     ebx, [esp+28]       ; i_src_stride
  312.     mov     edx, [esp+20]       ; i_dst_stride
  313.     mov     ecx, [esp+32]       ; i_height
  314. ALIGN 4
  315. .height_loop:
  316.     mov     eax, [esi]
  317.     mov     [edi], eax
  318.     mov     eax, [esi+ebx]
  319.     mov     [edi+edx], eax
  320.     lea     esi, [esi+ebx*2]
  321.     lea     edi, [edi+edx*2]
  322.     dec     ecx
  323.     dec     ecx
  324.     jne     .height_loop
  325.     pop     edi
  326.     pop     esi
  327.     pop     ebx
  328.     ret
  329. ALIGN 16
  330. ;-----------------------------------------------------------------------------
  331. ;   void x264_mc_copy_w8_mmxext( uint8_t *src, int i_src_stride,
  332. ;                                uint8_t *dst, int i_dst_stride, int i_height )
  333. ;-----------------------------------------------------------------------------
  334. x264_mc_copy_w8_mmxext:
  335.     push    ebx
  336.     push    esi
  337.     push    edi
  338.     mov     esi, [esp+24]       ; src
  339.     mov     edi, [esp+16]       ; dst
  340.     mov     ebx, [esp+28]       ; i_src_stride
  341.     mov     edx, [esp+20]       ; i_dst_stride
  342.     mov     ecx, [esp+32]       ; i_height
  343. ALIGN 4
  344. .height_loop:
  345.     movq    mm0, [esi]
  346.     movq    [edi], mm0
  347.     movq    mm1, [esi+ebx]
  348.     movq    [edi+edx], mm1
  349.     movq    mm2, [esi+ebx*2]
  350.     movq    [edi+edx*2], mm2
  351.     lea     esi, [esi+ebx*2]
  352.     lea     edi, [edi+edx*2]
  353.     movq    mm3, [esi+ebx]
  354.     movq    [edi+edx], mm3
  355.     lea     esi, [esi+ebx*2]
  356.     lea     edi, [edi+edx*2]
  357.     
  358.     sub     ecx, byte 4
  359.     jnz     .height_loop
  360.     pop     edi
  361.     pop     esi
  362.     pop     ebx
  363.     ret
  364. ALIGN 16
  365. ;-----------------------------------------------------------------------------
  366. ;   void x264_mc_copy_w16_mmxext( uint8_t *src, int i_src_stride,
  367. ;                                 uint8_t *dst, int i_dst_stride, int i_height )
  368. ;-----------------------------------------------------------------------------
  369. x264_mc_copy_w16_mmxext:
  370.     push    ebx
  371.     push    esi
  372.     push    edi
  373.     mov     esi, [esp+24]       ; src
  374.     mov     edi, [esp+16]       ; dst
  375.     mov     ebx, [esp+28]       ; i_src_stride
  376.     mov     edx, [esp+20]       ; i_dst_stride
  377.     mov     ecx, [esp+32]       ; i_height
  378. ALIGN 4
  379. .height_loop:
  380.     movq    mm0, [esi]
  381.     movq    mm1, [esi+8]
  382.     movq    [edi], mm0
  383.     movq    [edi+8], mm1
  384.     movq    mm2, [esi+ebx]
  385.     movq    mm3, [esi+ebx+8]
  386.     movq    [edi+edx], mm2
  387.     movq    [edi+edx+8], mm3
  388.     movq    mm4, [esi+ebx*2]
  389.     movq    mm5, [esi+ebx*2+8]
  390.     movq    [edi+edx*2], mm4
  391.     movq    [edi+edx*2+8], mm5
  392.     lea     esi, [esi+ebx*2]
  393.     lea     edi, [edi+edx*2]
  394.     movq    mm6, [esi+ebx]
  395.     movq    mm7, [esi+ebx+8]
  396.     movq    [edi+edx], mm6
  397.     movq    [edi+edx+8], mm7
  398.     lea     esi, [esi+ebx*2]
  399.     lea     edi, [edi+edx*2]
  400.     sub     ecx, byte 4
  401.     jnz     .height_loop
  402.     
  403.     pop     edi
  404.     pop     esi
  405.     pop     ebx
  406.     ret
  407. ALIGN 16
  408. ;-----------------------------------------------------------------------------
  409. ;   void x264_mc_copy_w16_sse2( uint8_t *src, int i_src_stride, uint8_t *dst, int i_dst_stride, int i_height )
  410. ;-----------------------------------------------------------------------------
  411. x264_mc_copy_w16_sse2:
  412.     push    ebx
  413.     push    esi
  414.     push    edi
  415.     mov     esi, [esp+24]       ; src
  416.     mov     edi, [esp+16]       ; dst
  417.     mov     ebx, [esp+28]       ; i_src_stride
  418.     mov     edx, [esp+20]       ; i_dst_stride
  419.     mov     ecx, [esp+32]       ; i_height
  420. ALIGN 4
  421. .height_loop:
  422.     movdqu  xmm0, [esi]
  423.     movdqu  xmm1, [esi+ebx]
  424.     movdqu  [edi], xmm0
  425.     movdqu  [edi+edx], xmm1
  426.     dec     ecx
  427.     dec     ecx
  428.     lea     esi, [esi+ebx*2]
  429.     lea     edi, [edi+edx*2]
  430.     jnz     .height_loop
  431.     
  432.     pop     edi
  433.     pop     esi
  434.     pop     ebx
  435.     ret
  436. ;=============================================================================
  437. ; chroma MC
  438. ;=============================================================================
  439. ALIGN 16
  440. ;-----------------------------------------------------------------------------
  441. ;   void x264_mc_chroma_mmxext( uint8_t *src, int i_src_stride,
  442. ;                               uint8_t *dst, int i_dst_stride,
  443. ;                               int dx, int dy,
  444. ;                               int i_width, int i_height )
  445. ;-----------------------------------------------------------------------------
  446. x264_mc_chroma_mmxext:
  447.     picpush ebx
  448.     picgetgot ebx
  449.     pxor    mm3, mm3
  450.     pshufw  mm5, [picesp+20], 0    ; mm5 = dx
  451.     pshufw  mm6, [picesp+24], 0    ; mm6 = dy
  452.     movq    mm4, [pw_8 GOT_ebx]
  453.     movq    mm0, mm4
  454.     psubw   mm4, mm5            ; mm4 = 8-dx
  455.     psubw   mm0, mm6            ; mm0 = 8-dy
  456.     movq    mm7, mm5
  457.     pmullw  mm5, mm0            ; mm5 = dx*(8-dy) =     cB
  458.     pmullw  mm7, mm6            ; mm7 = dx*dy =         cD
  459.     pmullw  mm6, mm4            ; mm6 = (8-dx)*dy =     cC
  460.     pmullw  mm4, mm0            ; mm4 = (8-dx)*(8-dy) = cA
  461.     push    edi
  462.     mov     eax, [picesp+4+4]   ; src
  463.     mov     edi, [picesp+4+12]  ; dst
  464.     mov     ecx, [picesp+4+8]   ; i_src_stride
  465.     mov     edx, [picesp+4+32]  ; i_height
  466. ALIGN 4
  467. .height_loop:
  468.     movd    mm1, [eax+ecx]
  469.     movd    mm0, [eax]
  470.     punpcklbw mm1, mm3          ; 00 px1 | 00 px2 | 00 px3 | 00 px4
  471.     punpcklbw mm0, mm3
  472.     pmullw  mm1, mm6            ; 2nd line * cC
  473.     pmullw  mm0, mm4            ; 1st line * cA
  474.     paddw   mm0, mm1            ; mm0 <- result
  475.     movd    mm2, [eax+1]
  476.     movd    mm1, [eax+ecx+1]
  477.     punpcklbw mm2, mm3
  478.     punpcklbw mm1, mm3
  479.     paddw   mm0, [pw_32 GOT_ebx]
  480.     pmullw  mm2, mm5            ; line * cB
  481.     pmullw  mm1, mm7            ; line * cD
  482.     paddw   mm0, mm2
  483.     paddw   mm0, mm1
  484.     psrlw   mm0, 6
  485.     packuswb mm0, mm3           ; 00 00 00 00 px1 px2 px3 px4
  486.     movd    [edi], mm0
  487.     add     eax, ecx
  488.     add     edi, [picesp+4+16]
  489.     dec     edx
  490.     jnz     .height_loop
  491.     sub     [picesp+4+28], dword 8
  492.     jnz     .finish            ; width != 8 so assume 4
  493.     mov     edi, [picesp+4+12] ; dst
  494.     mov     eax, [picesp+4+4]  ; src
  495.     mov     edx, [picesp+4+32] ; i_height
  496.     add     edi, 4
  497.     add     eax, 4
  498.     jmp    .height_loop
  499. .finish:
  500.     pop     edi
  501.     picpop  ebx
  502.     ret