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

Audio

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* pixel-sse2.asm: h264 encoder library
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2005 x264 project
  5. ;*
  6. ;* Authors: Alex Izvorski <aizvorksi@gmail.com>
  7. ;*
  8. ;* This program is free software; you can redistribute it and/or modify
  9. ;* it under the terms of the GNU General Public License as published by
  10. ;* the Free Software Foundation; either version 2 of the License, or
  11. ;* (at your option) any later version.
  12. ;*
  13. ;* This program is distributed in the hope that it will be useful,
  14. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. ;* GNU General Public License for more details.
  17. ;*
  18. ;* You should have received a copy of the GNU General Public License
  19. ;* along with this program; if not, write to the Free Software
  20. ;* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  21. ;*****************************************************************************
  22. BITS 32
  23. ;=============================================================================
  24. ; Macros and other preprocessor constants
  25. ;=============================================================================
  26. %include "i386inc.asm"
  27. SECTION_RODATA
  28. pd_0000ffff: times 4 dd 0x0000ffff
  29. SECTION .text
  30. cglobal x264_pixel_sad_16x16_sse2
  31. cglobal x264_pixel_sad_16x8_sse2
  32. cglobal x264_pixel_ssd_16x16_sse2
  33. cglobal x264_pixel_ssd_16x8_sse2
  34. cglobal x264_pixel_satd_8x4_sse2
  35. cglobal x264_pixel_satd_8x8_sse2
  36. cglobal x264_pixel_satd_16x8_sse2
  37. cglobal x264_pixel_satd_8x16_sse2
  38. cglobal x264_pixel_satd_16x16_sse2
  39. %macro SAD_INC_4x16P_SSE2 0
  40.     movdqu  xmm1,   [ecx]
  41.     movdqu  xmm2,   [ecx+edx]
  42.     lea     ecx,    [ecx+2*edx]
  43.     movdqu  xmm3,   [ecx]
  44.     movdqu  xmm4,   [ecx+edx]
  45.     psadbw  xmm1,   [eax]
  46.     psadbw  xmm2,   [eax+ebx]
  47.     lea     eax,    [eax+2*ebx]
  48.     psadbw  xmm3,   [eax]
  49.     psadbw  xmm4,   [eax+ebx]
  50.     lea     eax,    [eax+2*ebx]
  51.     lea     ecx,    [ecx+2*edx]
  52.     paddw   xmm1,   xmm2
  53.     paddw   xmm3,   xmm4
  54.     paddw   xmm0,   xmm1
  55.     paddw   xmm0,   xmm3
  56. %endmacro
  57. %macro SAD_START_SSE2 0
  58.     push    ebx
  59.     mov     eax,    [esp+ 8]    ; pix1
  60.     mov     ebx,    [esp+12]    ; stride1
  61.     mov     ecx,    [esp+16]    ; pix2
  62.     mov     edx,    [esp+20]    ; stride2
  63. %endmacro
  64. %macro SAD_END_SSE2 0
  65.     movdqa  xmm1, xmm0
  66.     psrldq  xmm0,  8
  67.     paddw   xmm0, xmm1
  68.     movd    eax,  xmm0
  69.     pop ebx
  70.     ret
  71. %endmacro
  72. ALIGN 16
  73. ;-----------------------------------------------------------------------------
  74. ;   int __cdecl x264_pixel_sad_16x16_sse2 (uint8_t *, int, uint8_t *, int )
  75. ;-----------------------------------------------------------------------------
  76. x264_pixel_sad_16x16_sse2:
  77.     SAD_START_SSE2
  78.     movdqu xmm0, [ecx]
  79.     movdqu xmm1, [ecx+edx]
  80.     lea    ecx,  [ecx+2*edx]
  81.     movdqu xmm2, [ecx]
  82.     movdqu xmm3, [ecx+edx]
  83.     lea    ecx,  [ecx+2*edx]
  84.     psadbw xmm0, [eax]
  85.     psadbw xmm1, [eax+ebx]
  86.     lea    eax,  [eax+2*ebx]
  87.     movdqu xmm4, [ecx]
  88.     paddw  xmm0, xmm1
  89.     psadbw xmm2, [eax]
  90.     psadbw xmm3, [eax+ebx]
  91.     lea    eax,  [eax+2*ebx]
  92.     movdqu xmm5, [ecx+edx]
  93.     lea    ecx,  [ecx+2*edx]
  94.     paddw  xmm2, xmm3
  95.     movdqu xmm6, [ecx]
  96.     movdqu xmm7, [ecx+edx]
  97.     lea    ecx,  [ecx+2*edx]
  98.     paddw  xmm0, xmm2
  99.     psadbw xmm4, [eax]
  100.     psadbw xmm5, [eax+ebx]
  101.     lea    eax,  [eax+2*ebx]
  102.     movdqu xmm1, [ecx]
  103.     paddw  xmm4, xmm5
  104.     psadbw xmm6, [eax]
  105.     psadbw xmm7, [eax+ebx]
  106.     lea    eax,  [eax+2*ebx]
  107.     movdqu xmm2, [ecx+edx]
  108.     lea    ecx,  [ecx+2*edx]
  109.     paddw  xmm6, xmm7
  110.     movdqu xmm3, [ecx]
  111.     paddw  xmm0, xmm4
  112.     movdqu xmm4, [ecx+edx]
  113.     lea    ecx,  [ecx+2*edx]
  114.     paddw  xmm0, xmm6
  115.     psadbw xmm1, [eax]
  116.     psadbw xmm2, [eax+ebx]
  117.     lea    eax,  [eax+2*ebx]
  118.     movdqu xmm5, [ecx]
  119.     paddw  xmm1, xmm2
  120.     psadbw xmm3, [eax]
  121.     psadbw xmm4, [eax+ebx]
  122.     lea    eax,  [eax+2*ebx]
  123.     movdqu xmm6, [ecx+edx]
  124.     lea    ecx,  [ecx+2*edx]
  125.     paddw  xmm3, xmm4
  126.     movdqu xmm7, [ecx]
  127.     paddw  xmm0, xmm1
  128.     movdqu xmm1, [ecx+edx]
  129.     paddw  xmm0, xmm3
  130.     psadbw xmm5, [eax]
  131.     psadbw xmm6, [eax+ebx]
  132.     lea    eax,  [eax+2*ebx]
  133.     paddw  xmm5, xmm6
  134.     psadbw xmm7, [eax]
  135.     psadbw xmm1, [eax+ebx]
  136.     paddw  xmm7, xmm1
  137.     paddw  xmm0, xmm5
  138.     paddw  xmm0, xmm7
  139.     SAD_END_SSE2
  140. ALIGN 16
  141. ;-----------------------------------------------------------------------------
  142. ;   int __cdecl x264_pixel_sad_16x8_sse2 (uint8_t *, int, uint8_t *, int )
  143. ;-----------------------------------------------------------------------------
  144. x264_pixel_sad_16x8_sse2:
  145.     SAD_START_SSE2
  146.     pxor    xmm0,   xmm0
  147.     SAD_INC_4x16P_SSE2
  148.     SAD_INC_4x16P_SSE2
  149.     SAD_END_SSE2
  150. %macro SSD_INC_2x16P_SSE2 0
  151.     movdqu  xmm1,   [eax]
  152.     movdqu  xmm2,   [ecx]
  153.     movdqu  xmm3,   [eax+ebx]
  154.     movdqu  xmm4,   [ecx+edx]
  155.     movdqa  xmm5,   xmm1
  156.     movdqa  xmm6,   xmm3
  157.     psubusb xmm1,   xmm2
  158.     psubusb xmm3,   xmm4
  159.     psubusb xmm2,   xmm5
  160.     psubusb xmm4,   xmm6
  161.     por     xmm1,   xmm2
  162.     por     xmm3,   xmm4
  163.     movdqa  xmm2,   xmm1
  164.     movdqa  xmm4,   xmm3
  165.     punpcklbw xmm1, xmm7
  166.     punpckhbw xmm2, xmm7
  167.     punpcklbw xmm3, xmm7
  168.     punpckhbw xmm4, xmm7
  169.     pmaddwd xmm1,   xmm1
  170.     pmaddwd xmm2,   xmm2
  171.     pmaddwd xmm3,   xmm3
  172.     pmaddwd xmm4,   xmm4
  173.     lea     eax,    [eax+2*ebx]
  174.     lea     ecx,    [ecx+2*edx]
  175.     paddd   xmm1,   xmm2
  176.     paddd   xmm3,   xmm4
  177.     paddd   xmm0,   xmm1
  178.     paddd   xmm0,   xmm3
  179. %endmacro
  180. %macro SSD_INC_8x16P_SSE2 0
  181.     SSD_INC_2x16P_SSE2
  182.     SSD_INC_2x16P_SSE2
  183.     SSD_INC_2x16P_SSE2
  184.     SSD_INC_2x16P_SSE2
  185. %endmacro
  186. %macro SSD_START_SSE2 0
  187.     push    ebx
  188.     mov     eax,    [esp+ 8]    ; pix1
  189.     mov     ebx,    [esp+12]    ; stride1
  190.     mov     ecx,    [esp+16]    ; pix2
  191.     mov     edx,    [esp+20]    ; stride2
  192.     pxor    xmm7,   xmm7         ; zero
  193.     pxor    xmm0,   xmm0         ; mm0 holds the sum
  194. %endmacro
  195. %macro SSD_END_SSE2 0
  196.     movdqa  xmm1,   xmm0
  197.     psrldq  xmm1,    8
  198.     paddd   xmm0,   xmm1
  199.     movdqa  xmm1,   xmm0
  200.     psrldq  xmm1,    4
  201.     paddd   xmm0,   xmm1
  202.     movd    eax,    xmm0
  203.     pop ebx
  204.     ret
  205. %endmacro
  206. ALIGN 16
  207. ;-----------------------------------------------------------------------------
  208. ;   int __cdecl x264_pixel_ssd_16x16_sse2 (uint8_t *, int, uint8_t *, int )
  209. ;-----------------------------------------------------------------------------
  210. x264_pixel_ssd_16x16_sse2:
  211.     SSD_START_SSE2
  212.     SSD_INC_8x16P_SSE2
  213.     SSD_INC_8x16P_SSE2
  214.     SSD_END_SSE2
  215. ALIGN 16
  216. ;-----------------------------------------------------------------------------
  217. ;   int __cdecl x264_pixel_ssd_16x8_sse2 (uint8_t *, int, uint8_t *, int )
  218. ;-----------------------------------------------------------------------------
  219. x264_pixel_ssd_16x8_sse2:
  220.     SSD_START_SSE2
  221.     SSD_INC_8x16P_SSE2
  222.     SSD_END_SSE2
  223. ; %1=(row2, row0) %2=(row3, row1) %3=junk
  224. ; output in %1=(row3, row0) and %3=(row2, row1)
  225. %macro HADAMARD4x4_SSE2 3
  226.     movdqa     %3, %1
  227.     paddw      %1, %2
  228.     psubw      %3, %2
  229.     movdqa     %2, %1
  230.     punpcklqdq %1, %3
  231.     punpckhqdq %2, %3
  232.     movdqa     %3, %1
  233.     paddw      %1, %2
  234.     psubw      %3, %2
  235. %endmacro
  236. ;;; two HADAMARD4x4_SSE2 running side-by-side
  237. %macro HADAMARD4x4_TWO_SSE2 6    ; a02 a13 junk1 b02 b13 junk2 (1=4 2=5 3=6)
  238.     movdqa     %3, %1
  239.     movdqa     %6, %4
  240.     paddw      %1, %2
  241.     paddw      %4, %5
  242.     psubw      %3, %2
  243.     psubw      %6, %5
  244.     movdqa     %2, %1
  245.     movdqa     %5, %4
  246.     punpcklqdq %1, %3
  247.     punpcklqdq %4, %6
  248.     punpckhqdq %2, %3
  249.     punpckhqdq %5, %6
  250.     movdqa     %3, %1
  251.     movdqa     %6, %4
  252.     paddw      %1, %2
  253.     paddw      %4, %5
  254.     psubw      %3, %2
  255.     psubw      %6, %5
  256. %endmacro
  257. %macro TRANSPOSE4x4_TWIST_SSE2 3    ; %1=(row3, row0) %2=(row2, row1) %3=junk, output in %1 and %2
  258.     movdqa     %3, %1
  259.     punpcklwd  %1, %2
  260.     punpckhwd  %2, %3             ; backwards because the high quadwords are already swapped
  261.     movdqa     %3, %1
  262.     punpckldq  %1, %2
  263.     punpckhdq  %3, %2
  264.     movdqa     %2, %1
  265.     punpcklqdq %1, %3
  266.     punpckhqdq %2, %3
  267. %endmacro
  268. ;;; two TRANSPOSE4x4_TWIST_SSE2 running side-by-side
  269. %macro TRANSPOSE4x4_TWIST_TWO_SSE2 6    ; a02 a13 junk1 b02 b13 junk2 (1=4 2=5 3=6)
  270.     movdqa     %3, %1
  271.     movdqa     %6, %4
  272.     punpcklwd  %1, %2
  273.     punpcklwd  %4, %5
  274.     punpckhwd  %2, %3
  275.     punpckhwd  %5, %6
  276.     movdqa     %3, %1
  277.     movdqa     %6, %4
  278.     punpckldq  %1, %2
  279.     punpckldq  %4, %5
  280.     punpckhdq  %3, %2
  281.     punpckhdq  %6, %5
  282.     movdqa     %2, %1
  283.     movdqa     %5, %4
  284.     punpcklqdq %1, %3
  285.     punpcklqdq %4, %6
  286.     punpckhqdq %2, %3
  287.     punpckhqdq %5, %6
  288. %endmacro
  289. ;;; loads the difference of two 4x4 blocks into xmm0,xmm1 and xmm4,xmm5 in interleaved-row order
  290. ;;; destroys xmm2, 3
  291. ;;; the value in xmm7 doesn't matter: it's only subtracted from itself
  292. %macro LOAD4x8_DIFF_SSE2 0
  293.     movq      xmm0, [eax]
  294.     movq      xmm4, [ecx]
  295.     punpcklbw xmm0, xmm7
  296.     punpcklbw xmm4, xmm7
  297.     psubw     xmm0, xmm4
  298.     movq      xmm1, [eax+ebx]
  299.     movq      xmm5, [ecx+edx]
  300.     lea       eax,  [eax+2*ebx]
  301.     lea       ecx,  [ecx+2*edx]
  302.     punpcklbw xmm1, xmm7
  303.     punpcklbw xmm5, xmm7
  304.     psubw     xmm1, xmm5
  305.     movq       xmm2, [eax]
  306.     movq       xmm4, [ecx]
  307.     punpcklbw  xmm2, xmm7
  308.     punpcklbw  xmm4, xmm7
  309.     psubw      xmm2, xmm4
  310.     movdqa     xmm4, xmm0
  311.     punpcklqdq xmm0, xmm2        ; rows 0 and 2
  312.     punpckhqdq xmm4, xmm2        ; next 4x4 rows 0 and 2
  313.     movq       xmm3, [eax+ebx]
  314.     movq       xmm5, [ecx+edx]
  315.     lea        eax,  [eax+2*ebx]
  316.     lea        ecx,  [ecx+2*edx]
  317.     punpcklbw  xmm3, xmm7
  318.     punpcklbw  xmm5, xmm7
  319.     psubw      xmm3, xmm5
  320.     movdqa     xmm5, xmm1
  321.     punpcklqdq xmm1, xmm3        ; rows 1 and 3
  322.     punpckhqdq xmm5, xmm3        ; next 4x4 rows 1 and 3
  323. %endmacro
  324. %macro SUM4x4_SSE2 4    ; 02 13 junk sum
  325.     pxor    %3, %3
  326.     psubw   %3, %1
  327.     pmaxsw  %1, %3
  328.     pxor    %3, %3
  329.     psubw   %3, %2
  330.     pmaxsw  %2, %3
  331.     paddusw %4, %1
  332.     paddusw %4, %2
  333. %endmacro
  334. ;;; two SUM4x4_SSE2 running side-by-side
  335. %macro SUM4x4_TWO_SSE2 7    ; a02 a13 junk1 b02 b13 junk2 (1=4 2=5 3=6) sum
  336.     pxor    %3, %3
  337.     pxor    %6, %6
  338.     psubw   %3, %1
  339.     psubw   %6, %4
  340.     pmaxsw  %1, %3
  341.     pmaxsw  %4, %6
  342.     pxor    %3, %3
  343.     pxor    %6, %6
  344.     psubw   %3, %2
  345.     psubw   %6, %5
  346.     pmaxsw  %2, %3
  347.     pmaxsw  %5, %6
  348.     paddusw %1, %2
  349.     paddusw %4, %5
  350.     paddusw %7, %1
  351.     paddusw %7, %4
  352. %endmacro
  353. %macro SUM_MM_SSE2 2    ; sum junk
  354.     ; ebx is no longer used at this point, so no push needed
  355.     picgetgot ebx
  356.     ; each column sum of SATD is necessarily even, so we don't lose any precision by shifting first.
  357.     psrlw   %1, 1
  358.     movdqa  %2, %1
  359.     psrldq  %1, 2
  360.     paddusw %1, %2
  361.     pand    %1, [pd_0000ffff GOT_ebx]
  362.     movdqa  %2, %1
  363.     psrldq  %1, 4
  364.     paddd   %1, %2
  365.     movdqa  %2, %1
  366.     psrldq  %1, 8
  367.     paddd   %1, %2
  368.     movd    eax,%1
  369. %endmacro
  370. %macro SATD_TWO_SSE2 0
  371.     LOAD4x8_DIFF_SSE2
  372.     HADAMARD4x4_TWO_SSE2        xmm0, xmm1, xmm2, xmm4, xmm5, xmm3
  373.     TRANSPOSE4x4_TWIST_TWO_SSE2 xmm0, xmm2, xmm1, xmm4, xmm3, xmm5
  374.     HADAMARD4x4_TWO_SSE2        xmm0, xmm2, xmm1, xmm4, xmm3, xmm5
  375.     SUM4x4_TWO_SSE2             xmm0, xmm1, xmm2, xmm4, xmm5, xmm3, xmm6
  376. %endmacro
  377. %macro SATD_START 0
  378.     push    ebx
  379.     mov     eax,    [esp+ 8]    ; pix1
  380.     mov     ebx,    [esp+12]    ; stride1
  381.     mov     ecx,    [esp+16]    ; pix2
  382.     mov     edx,    [esp+20]    ; stride2
  383.     pxor    xmm6,    xmm6
  384. %endmacro
  385. %macro SATD_END 0
  386.     SUM_MM_SSE2  xmm6, xmm7
  387.     pop     ebx
  388.     ret
  389. %endmacro
  390. ALIGN 16
  391. ;-----------------------------------------------------------------------------
  392. ;   int __cdecl x264_pixel_satd_16x16_sse2 (uint8_t *, int, uint8_t *, int )
  393. ;-----------------------------------------------------------------------------
  394. x264_pixel_satd_16x16_sse2:
  395.     SATD_START
  396.     SATD_TWO_SSE2
  397.     SATD_TWO_SSE2
  398.     SATD_TWO_SSE2
  399.     SATD_TWO_SSE2
  400.     mov     eax,    [esp+ 8]
  401.     mov     ecx,    [esp+16]
  402.     lea     eax,    [eax+8]
  403.     lea     ecx,    [ecx+8]
  404.     SATD_TWO_SSE2
  405.     SATD_TWO_SSE2
  406.     SATD_TWO_SSE2
  407.     SATD_TWO_SSE2
  408.     SATD_END
  409. ALIGN 16
  410. ;-----------------------------------------------------------------------------
  411. ;   int __cdecl x264_pixel_satd_8x16_sse2 (uint8_t *, int, uint8_t *, int )
  412. ;-----------------------------------------------------------------------------
  413. x264_pixel_satd_8x16_sse2:
  414.     SATD_START
  415.     SATD_TWO_SSE2
  416.     SATD_TWO_SSE2
  417.     SATD_TWO_SSE2
  418.     SATD_TWO_SSE2
  419.     SATD_END
  420. ALIGN 16
  421. ;-----------------------------------------------------------------------------
  422. ;   int __cdecl x264_pixel_satd_16x8_sse2 (uint8_t *, int, uint8_t *, int )
  423. ;-----------------------------------------------------------------------------
  424. x264_pixel_satd_16x8_sse2:
  425.     SATD_START
  426.     SATD_TWO_SSE2
  427.     SATD_TWO_SSE2
  428.     mov     eax,    [esp+ 8]
  429.     mov     ecx,    [esp+16]
  430.     lea     eax,    [eax+8]
  431.     lea     ecx,    [ecx+8]
  432.     SATD_TWO_SSE2
  433.     SATD_TWO_SSE2
  434.     SATD_END
  435. ALIGN 16
  436. ;-----------------------------------------------------------------------------
  437. ;   int __cdecl x264_pixel_satd_8x8_sse2 (uint8_t *, int, uint8_t *, int )
  438. ;-----------------------------------------------------------------------------
  439. x264_pixel_satd_8x8_sse2:
  440.     SATD_START
  441.     SATD_TWO_SSE2
  442.     SATD_TWO_SSE2
  443.     SATD_END
  444. ALIGN 16
  445. ;-----------------------------------------------------------------------------
  446. ;   int __cdecl x264_pixel_satd_8x4_sse2 (uint8_t *, int, uint8_t *, int )
  447. ;-----------------------------------------------------------------------------
  448. x264_pixel_satd_8x4_sse2:
  449.     SATD_START
  450.     SATD_TWO_SSE2
  451.     SATD_END