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

Audio

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* pixel.asm: h264 encoder library
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2003 x264 project
  5. ;* $Id: pixel.asm,v 1.1 2004/06/03 19:27:07 fenrir Exp $
  6. ;*
  7. ;* Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8. ;*
  9. ;* This program is free software; you can redistribute it and/or modify
  10. ;* it under the terms of the GNU General Public License as published by
  11. ;* the Free Software Foundation; either version 2 of the License, or
  12. ;* (at your option) any later version.
  13. ;*
  14. ;* This program is distributed in the hope that it will be useful,
  15. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. ;* GNU General Public License for more details.
  18. ;*
  19. ;* You should have received a copy of the GNU General Public License
  20. ;* along with this program; if not, write to the Free Software
  21. ;* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22. ;*****************************************************************************
  23. BITS 32
  24. ;=============================================================================
  25. ; Macros and other preprocessor constants
  26. ;=============================================================================
  27. %include "i386inc.asm"
  28. %macro SAD_INC_2x16P 0
  29.     movq    mm1,    [eax]
  30.     movq    mm2,    [eax+8]
  31.     movq    mm3,    [eax+ebx]
  32.     movq    mm4,    [eax+ebx+8]
  33.     psadbw  mm1,    [ecx]
  34.     psadbw  mm2,    [ecx+8]
  35.     psadbw  mm3,    [ecx+edx]
  36.     psadbw  mm4,    [ecx+edx+8]
  37.     lea     eax,    [eax+2*ebx]
  38.     paddw   mm1,    mm2
  39.     paddw   mm3,    mm4
  40.     lea     ecx,    [ecx+2*edx]
  41.     paddw   mm0,    mm1
  42.     paddw   mm0,    mm3
  43. %endmacro
  44. %macro SAD_INC_2x8P 0
  45.     movq    mm1,    [eax]
  46.     movq    mm2,    [eax+ebx]
  47.     psadbw  mm1,    [ecx]
  48.     psadbw  mm2,    [ecx+edx]
  49.     lea     eax,    [eax+2*ebx]
  50.     paddw   mm0,    mm1
  51.     paddw   mm0,    mm2
  52.     lea     ecx,    [ecx+2*edx]
  53. %endmacro
  54. %macro SAD_INC_2x4P 0
  55.     movd    mm1,    [eax]
  56.     movd    mm2,    [ecx]
  57.     movd    mm3,    [eax+ebx]
  58.     movd    mm4,    [ecx+edx]
  59.     psadbw  mm1,    mm2
  60.     psadbw  mm3,    mm4
  61.     paddw   mm0,    mm1
  62.     paddw   mm0,    mm3
  63.     lea     eax,    [eax+2*ebx]
  64.     lea     ecx,    [ecx+2*edx]
  65. %endmacro
  66. %macro SSD_INC_1x16P 0
  67.     movq    mm1,    [eax]
  68.     movq    mm2,    [ecx]
  69.     movq    mm3,    [eax+8]
  70.     movq    mm4,    [ecx+8]
  71.     movq    mm5,    mm2
  72.     movq    mm6,    mm4
  73.     psubusb mm2,    mm1
  74.     psubusb mm4,    mm3
  75.     psubusb mm1,    mm5
  76.     psubusb mm3,    mm6
  77.     por     mm1,    mm2
  78.     por     mm3,    mm4
  79.     movq    mm2,    mm1
  80.     movq    mm4,    mm3
  81.     punpcklbw mm1,  mm7
  82.     punpcklbw mm3,  mm7
  83.     punpckhbw mm2,  mm7
  84.     punpckhbw mm4,  mm7
  85.     pmaddwd mm1,    mm1
  86.     pmaddwd mm2,    mm2
  87.     pmaddwd mm3,    mm3
  88.     pmaddwd mm4,    mm4
  89.     add     eax,    ebx
  90.     add     ecx,    edx
  91.     paddd   mm0,    mm1
  92.     paddd   mm0,    mm2
  93.     paddd   mm0,    mm3
  94.     paddd   mm0,    mm4
  95. %endmacro
  96. %macro SSD_INC_1x8P 0
  97.     movq    mm1,    [eax]
  98.     movq    mm2,    [ecx]
  99.     movq    mm5,    mm2
  100.     psubusb mm2,    mm1
  101.     psubusb mm1,    mm5
  102.     por     mm1,    mm2         ; mm1 = 8bit abs diff
  103.     movq    mm2,    mm1
  104.     punpcklbw mm1,  mm7
  105.     punpckhbw mm2,  mm7         ; (mm1,mm2) = 16bit abs diff
  106.     pmaddwd mm1,    mm1
  107.     pmaddwd mm2,    mm2
  108.     add     eax,    ebx
  109.     add     ecx,    edx
  110.     paddd   mm0,    mm1
  111.     paddd   mm0,    mm2
  112. %endmacro
  113. %macro SSD_INC_1x4P 0
  114.     movd    mm1,    [eax]
  115.     movd    mm2,    [ecx]
  116.     movq    mm5,    mm2
  117.     psubusb mm2,    mm1
  118.     psubusb mm1,    mm5
  119.     por     mm1,    mm2
  120.     punpcklbw mm1,  mm7
  121.     pmaddwd mm1,    mm1
  122.     add     eax,    ebx
  123.     add     ecx,    edx
  124.     paddd   mm0,    mm1
  125. %endmacro
  126. %macro SSD_INC_8x16P 0
  127.     SSD_INC_1x16P
  128.     SSD_INC_1x16P
  129.     SSD_INC_1x16P
  130.     SSD_INC_1x16P
  131.     SSD_INC_1x16P
  132.     SSD_INC_1x16P
  133.     SSD_INC_1x16P
  134.     SSD_INC_1x16P
  135. %endmacro
  136. %macro SSD_INC_4x8P 0
  137.     SSD_INC_1x8P
  138.     SSD_INC_1x8P
  139.     SSD_INC_1x8P
  140.     SSD_INC_1x8P
  141. %endmacro
  142. %macro SSD_INC_4x4P 0
  143.     SSD_INC_1x4P
  144.     SSD_INC_1x4P
  145.     SSD_INC_1x4P
  146.     SSD_INC_1x4P
  147. %endmacro
  148. %macro LOAD_DIFF_4P 4  ; MMP, MMT, [pix1], [pix2]
  149.     movd        %1, %3
  150.     movd        %2, %4
  151.     punpcklbw   %1, %2
  152.     punpcklbw   %2, %2
  153.     psubw       %1, %2
  154. %endmacro
  155. %macro LOAD_DIFF_INC_4x4 10 ; p1,p2,p3,p4, t, pix1, i_pix1, pix2, i_pix2, offset
  156.     LOAD_DIFF_4P %1, %5, [%6+%10],    [%8+%10]
  157.     LOAD_DIFF_4P %2, %5, [%6+%7+%10], [%8+%9+%10]
  158.     lea %6, [%6+2*%7]
  159.     lea %8, [%8+2*%9]
  160.     LOAD_DIFF_4P %3, %5, [%6+%10],    [%8+%10]
  161.     LOAD_DIFF_4P %4, %5, [%6+%7+%10], [%8+%9+%10]
  162.     lea %6, [%6+2*%7]
  163.     lea %8, [%8+2*%9]
  164. %endmacro
  165. %macro LOAD_DIFF_4x4 10 ; p1,p2,p3,p4, t, pix1, i_pix1, pix2, i_pix2, offset
  166.     LOAD_DIFF_4P %1, %5, [%6+%10],      [%8+%10]
  167.     LOAD_DIFF_4P %3, %5, [%6+2*%7+%10], [%8+2*%9+%10]
  168.     add     %6, %7
  169.     add     %8, %9
  170.     LOAD_DIFF_4P %2, %5, [%6+%10],      [%8+%10]
  171.     LOAD_DIFF_4P %4, %5, [%6+2*%7+%10], [%8+2*%9+%10]
  172. %endmacro
  173. %macro HADAMARD4_SUB_BADC 4
  174.     paddw %1,   %2
  175.     paddw %3,   %4
  176.     paddw %2,   %2
  177.     paddw %4,   %4
  178.     psubw %2,   %1
  179.     psubw %4,   %3
  180. %endmacro
  181. %macro HADAMARD4x4 4
  182.     HADAMARD4_SUB_BADC %1, %2, %3, %4
  183.     HADAMARD4_SUB_BADC %1, %3, %2, %4
  184. %endmacro
  185. %macro SBUTTERFLYwd 3
  186.     movq        %3, %1
  187.     punpcklwd   %1, %2
  188.     punpckhwd   %3, %2
  189. %endmacro
  190. %macro SBUTTERFLYdq 3
  191.     movq        %3, %1
  192.     punpckldq   %1, %2
  193.     punpckhdq   %3, %2
  194. %endmacro
  195. %macro TRANSPOSE4x4 5   ; abcd-t -> adtc
  196.     SBUTTERFLYwd %1, %2, %5
  197.     SBUTTERFLYwd %3, %4, %2
  198.     SBUTTERFLYdq %1, %3, %4
  199.     SBUTTERFLYdq %5, %2, %3
  200. %endmacro
  201. %macro MMX_ABS 2        ; mma, mmt
  202.     pxor    %2, %2
  203.     psubw   %2, %1
  204.     pmaxsw  %1, %2
  205. %endmacro
  206. %macro HADAMARD4x4_SUM 1    ; %1 - dest (row sum of one block)
  207.     HADAMARD4x4 mm4, mm5, mm6, mm7
  208.     TRANSPOSE4x4 mm4, mm5, mm6, mm7, %1
  209.     HADAMARD4x4 mm4, mm7, %1, mm6
  210.     MMX_ABS     mm4, mm5
  211.     MMX_ABS     mm7, mm5
  212.     MMX_ABS     %1,  mm5
  213.     MMX_ABS     mm6, mm5
  214.     paddw       %1,  mm4
  215.     paddw       mm6, mm7
  216.     pavgw       %1,  mm6
  217. %endmacro
  218. ;=============================================================================
  219. ; Code
  220. ;=============================================================================
  221. SECTION .text
  222. cglobal x264_pixel_sad_16x16_mmxext
  223. cglobal x264_pixel_sad_16x8_mmxext
  224. cglobal x264_pixel_sad_8x16_mmxext
  225. cglobal x264_pixel_sad_8x8_mmxext
  226. cglobal x264_pixel_sad_8x4_mmxext
  227. cglobal x264_pixel_sad_4x8_mmxext
  228. cglobal x264_pixel_sad_4x4_mmxext
  229. cglobal x264_pixel_sad_pde_16x16_mmxext
  230. cglobal x264_pixel_sad_pde_16x8_mmxext
  231. cglobal x264_pixel_sad_pde_8x16_mmxext
  232. cglobal x264_pixel_ssd_16x16_mmxext
  233. cglobal x264_pixel_ssd_16x8_mmxext
  234. cglobal x264_pixel_ssd_8x16_mmxext
  235. cglobal x264_pixel_ssd_8x8_mmxext
  236. cglobal x264_pixel_ssd_8x4_mmxext
  237. cglobal x264_pixel_ssd_4x8_mmxext
  238. cglobal x264_pixel_ssd_4x4_mmxext
  239. cglobal x264_pixel_satd_4x4_mmxext
  240. cglobal x264_pixel_satd_4x8_mmxext
  241. cglobal x264_pixel_satd_8x4_mmxext
  242. cglobal x264_pixel_satd_8x8_mmxext
  243. cglobal x264_pixel_satd_16x8_mmxext
  244. cglobal x264_pixel_satd_8x16_mmxext
  245. cglobal x264_pixel_satd_16x16_mmxext
  246. %macro SAD_START 0
  247.     push    ebx
  248.     mov     eax,    [esp+ 8]    ; pix1
  249.     mov     ebx,    [esp+12]    ; stride1
  250.     mov     ecx,    [esp+16]    ; pix2
  251.     mov     edx,    [esp+20]    ; stride2
  252.     pxor    mm0,    mm0
  253. %endmacro
  254. %macro SAD_END 0
  255.     movd eax,    mm0
  256.     pop ebx
  257.     ret
  258. %endmacro
  259. ALIGN 16
  260. ;-----------------------------------------------------------------------------
  261. ;   int __cdecl x264_pixel_sad_16x16_mmxext (uint8_t *, int, uint8_t *, int )
  262. ;-----------------------------------------------------------------------------
  263. x264_pixel_sad_16x16_mmxext:
  264.     SAD_START
  265.     SAD_INC_2x16P
  266.     SAD_INC_2x16P
  267.     SAD_INC_2x16P
  268.     SAD_INC_2x16P
  269.     SAD_INC_2x16P
  270.     SAD_INC_2x16P
  271.     SAD_INC_2x16P
  272.     SAD_INC_2x16P
  273.     SAD_END
  274. ALIGN 16
  275. ;-----------------------------------------------------------------------------
  276. ;   int __cdecl x264_pixel_sad_16x8_mmxext (uint8_t *, int, uint8_t *, int )
  277. ;-----------------------------------------------------------------------------
  278. x264_pixel_sad_16x8_mmxext:
  279.     SAD_START
  280.     SAD_INC_2x16P
  281.     SAD_INC_2x16P
  282.     SAD_INC_2x16P
  283.     SAD_INC_2x16P
  284.     SAD_END
  285. ALIGN 16
  286. ;-----------------------------------------------------------------------------
  287. ;   int __cdecl x264_pixel_sad_8x16_mmxext (uint8_t *, int, uint8_t *, int )
  288. ;-----------------------------------------------------------------------------
  289. x264_pixel_sad_8x16_mmxext:
  290.     SAD_START
  291.     SAD_INC_2x8P
  292.     SAD_INC_2x8P
  293.     SAD_INC_2x8P
  294.     SAD_INC_2x8P
  295.     SAD_INC_2x8P
  296.     SAD_INC_2x8P
  297.     SAD_INC_2x8P
  298.     SAD_INC_2x8P
  299.     SAD_END
  300. ALIGN 16
  301. ;-----------------------------------------------------------------------------
  302. ;   int __cdecl x264_pixel_sad_8x8_mmxext (uint8_t *, int, uint8_t *, int )
  303. ;-----------------------------------------------------------------------------
  304. x264_pixel_sad_8x8_mmxext:
  305.     SAD_START
  306.     SAD_INC_2x8P
  307.     SAD_INC_2x8P
  308.     SAD_INC_2x8P
  309.     SAD_INC_2x8P
  310.     SAD_END
  311. ALIGN 16
  312. ;-----------------------------------------------------------------------------
  313. ;   int __cdecl x264_pixel_sad_8x4_mmxext (uint8_t *, int, uint8_t *, int )
  314. ;-----------------------------------------------------------------------------
  315. x264_pixel_sad_8x4_mmxext:
  316.     SAD_START
  317.     SAD_INC_2x8P
  318.     SAD_INC_2x8P
  319.     SAD_END
  320. ALIGN 16
  321. ;-----------------------------------------------------------------------------
  322. ;   int __cdecl x264_pixel_sad_4x8_mmxext (uint8_t *, int, uint8_t *, int )
  323. ;-----------------------------------------------------------------------------
  324. x264_pixel_sad_4x8_mmxext:
  325.     SAD_START
  326.     SAD_INC_2x4P
  327.     SAD_INC_2x4P
  328.     SAD_INC_2x4P
  329.     SAD_INC_2x4P
  330.     SAD_END
  331. ALIGN 16
  332. ;-----------------------------------------------------------------------------
  333. ;   int __cdecl x264_pixel_sad_4x4_mmxext (uint8_t *, int, uint8_t *, int )
  334. ;-----------------------------------------------------------------------------
  335. x264_pixel_sad_4x4_mmxext:
  336.     SAD_START
  337.     SAD_INC_2x4P
  338.     SAD_INC_2x4P
  339.     SAD_END
  340. %macro PDE_CHECK 0
  341.     movd ebx, mm0
  342.     cmp  ebx, [esp+24] ; prev_score
  343.     jl   .continue
  344.     pop  ebx
  345.     mov  eax, 0xffff
  346.     ret
  347. ALIGN 4
  348. .continue:
  349.     mov  ebx, [esp+12]
  350. %endmacro
  351. ALIGN 16
  352. ;-----------------------------------------------------------------------------
  353. ;   int __cdecl x264_pixel_sad_pde_16x16_mmxext (uint8_t *, int, uint8_t *, int, int )
  354. ;-----------------------------------------------------------------------------
  355. x264_pixel_sad_pde_16x16_mmxext:
  356.     SAD_START
  357.     SAD_INC_2x16P
  358.     SAD_INC_2x16P
  359.     SAD_INC_2x16P
  360.     SAD_INC_2x16P
  361.     PDE_CHECK
  362.     SAD_INC_2x16P
  363.     SAD_INC_2x16P
  364.     SAD_INC_2x16P
  365.     SAD_INC_2x16P
  366.     SAD_END
  367. ALIGN 16
  368. ;-----------------------------------------------------------------------------
  369. ;   int __cdecl x264_pixel_sad_pde_16x8_mmxext (uint8_t *, int, uint8_t *, int, int )
  370. ;-----------------------------------------------------------------------------
  371. x264_pixel_sad_pde_16x8_mmxext:
  372.     SAD_START
  373.     SAD_INC_2x16P
  374.     SAD_INC_2x16P
  375.     PDE_CHECK
  376.     SAD_INC_2x16P
  377.     SAD_INC_2x16P
  378.     SAD_END
  379. ALIGN 16
  380. ;-----------------------------------------------------------------------------
  381. ;   int __cdecl x264_pixel_sad_pde_8x16_mmxext (uint8_t *, int, uint8_t *, int, int )
  382. ;-----------------------------------------------------------------------------
  383. x264_pixel_sad_pde_8x16_mmxext:
  384.     SAD_START
  385.     SAD_INC_2x8P
  386.     SAD_INC_2x8P
  387.     SAD_INC_2x8P
  388.     SAD_INC_2x8P
  389.     PDE_CHECK
  390.     SAD_INC_2x8P
  391.     SAD_INC_2x8P
  392.     SAD_INC_2x8P
  393.     SAD_INC_2x8P
  394.     SAD_END
  395. %macro SSD_START 0
  396.     push    ebx
  397.     mov     eax,    [esp+ 8]    ; pix1
  398.     mov     ebx,    [esp+12]    ; stride1
  399.     mov     ecx,    [esp+16]    ; pix2
  400.     mov     edx,    [esp+20]    ; stride2
  401.     pxor    mm7,    mm7         ; zero
  402.     pxor    mm0,    mm0         ; mm0 holds the sum
  403. %endmacro
  404. %macro SSD_END 0
  405.     movq    mm1,    mm0
  406.     psrlq   mm1,    32
  407.     paddd   mm0,    mm1
  408.     movd    eax,    mm0
  409.     pop ebx
  410.     ret
  411. %endmacro
  412. ALIGN 16
  413. ;-----------------------------------------------------------------------------
  414. ;   int __cdecl x264_pixel_ssd_16x16_mmxext (uint8_t *, int, uint8_t *, int )
  415. ;-----------------------------------------------------------------------------
  416. x264_pixel_ssd_16x16_mmxext:
  417.     SSD_START
  418.     SSD_INC_8x16P
  419.     SSD_INC_8x16P
  420.     SSD_END
  421. ALIGN 16
  422. x264_pixel_ssd_16x8_mmxext:
  423.     SSD_START
  424.     SSD_INC_8x16P
  425.     SSD_END
  426. ALIGN 16
  427. x264_pixel_ssd_8x16_mmxext:
  428.     SSD_START
  429.     SSD_INC_4x8P
  430.     SSD_INC_4x8P
  431.     SSD_INC_4x8P
  432.     SSD_INC_4x8P
  433.     SSD_END
  434. ALIGN 16
  435. x264_pixel_ssd_8x8_mmxext:
  436.     SSD_START
  437.     SSD_INC_4x8P
  438.     SSD_INC_4x8P
  439.     SSD_END
  440. ALIGN 16
  441. x264_pixel_ssd_8x4_mmxext:
  442.     SSD_START
  443.     SSD_INC_4x8P
  444.     SSD_END
  445. ALIGN 16
  446. x264_pixel_ssd_4x8_mmxext:
  447.     SSD_START
  448.     SSD_INC_4x4P
  449.     SSD_INC_4x4P
  450.     SSD_END
  451. ALIGN 16
  452. x264_pixel_ssd_4x4_mmxext:
  453.     SSD_START
  454.     SSD_INC_4x4P
  455.     SSD_END
  456. %macro SATD_START 0
  457.     push        ebx
  458.     mov         eax, [esp+ 8]       ; pix1
  459.     mov         ebx, [esp+12]       ; stride1
  460.     mov         ecx, [esp+16]       ; pix2
  461.     mov         edx, [esp+20]       ; stride2
  462. %endmacro
  463. %macro SATD_END 0
  464.     pshufw      mm1, mm0, 01001110b
  465.     paddw       mm0, mm1
  466.     pshufw      mm1, mm0, 10110001b
  467.     paddw       mm0, mm1
  468.     movd        eax, mm0
  469.     and         eax, 0xffff
  470.     pop         ebx
  471.     ret
  472. %endmacro
  473. ALIGN 16
  474. ;-----------------------------------------------------------------------------
  475. ;   int __cdecl x264_pixel_satd_4x4_mmxext (uint8_t *, int, uint8_t *, int )
  476. ;-----------------------------------------------------------------------------
  477. x264_pixel_satd_4x4_mmxext:
  478.     SATD_START
  479.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm0, eax, ebx, ecx, edx, 0
  480.     HADAMARD4x4_SUM     mm0
  481.     SATD_END
  482. ALIGN 16
  483. ;-----------------------------------------------------------------------------
  484. ;   int __cdecl x264_pixel_satd_4x8_mmxext (uint8_t *, int, uint8_t *, int )
  485. ;-----------------------------------------------------------------------------
  486. x264_pixel_satd_4x8_mmxext:
  487.     SATD_START
  488.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm0, eax, ebx, ecx, edx, 0
  489.     HADAMARD4x4_SUM     mm0
  490.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm1, eax, ebx, ecx, edx, 0
  491.     HADAMARD4x4_SUM     mm1
  492.     paddw       mm0, mm1
  493.     SATD_END
  494. ALIGN 16
  495. ;-----------------------------------------------------------------------------
  496. ;   int __cdecl x264_pixel_satd_8x4_mmxext (uint8_t *, int, uint8_t *, int )
  497. ;-----------------------------------------------------------------------------
  498. x264_pixel_satd_8x4_mmxext:
  499.     SATD_START
  500.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm0, eax, ebx, ecx, edx, 0
  501.     HADAMARD4x4_SUM     mm0
  502.     sub         eax, ebx
  503.     sub         ecx, edx
  504.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm1, eax, ebx, ecx, edx, 4
  505.     HADAMARD4x4_SUM     mm1
  506.     paddw       mm0, mm1
  507.     SATD_END
  508. ALIGN 16
  509. ;-----------------------------------------------------------------------------
  510. ;   int __cdecl x264_pixel_satd_8x8_mmxext (uint8_t *, int, uint8_t *, int )
  511. ;-----------------------------------------------------------------------------
  512. x264_pixel_satd_8x8_mmxext:
  513.     SATD_START
  514.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm0, eax, ebx, ecx, edx, 0
  515.     HADAMARD4x4_SUM     mm0
  516.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm1, eax, ebx, ecx, edx, 0
  517.     HADAMARD4x4_SUM     mm1
  518.     mov         eax, [esp+ 8]       ; pix1
  519.     mov         ecx, [esp+16]       ; pix2
  520.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, eax, ebx, ecx, edx, 4
  521.     HADAMARD4x4_SUM     mm2
  522.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, eax, ebx, ecx, edx, 4
  523.     HADAMARD4x4_SUM     mm3
  524.     paddw       mm0, mm1
  525.     paddw       mm2, mm3
  526.     paddw       mm0, mm2
  527.     SATD_END
  528. ALIGN 16
  529. ;-----------------------------------------------------------------------------
  530. ;   int __cdecl x264_pixel_satd_16x8_mmxext (uint8_t *, int, uint8_t *, int )
  531. ;-----------------------------------------------------------------------------
  532. x264_pixel_satd_16x8_mmxext:
  533.     SATD_START
  534.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm0, eax, ebx, ecx, edx, 0
  535.     HADAMARD4x4_SUM     mm0
  536.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm1, eax, ebx, ecx, edx, 0
  537.     HADAMARD4x4_SUM     mm1
  538.     mov         eax, [esp+ 8]       ; pix1
  539.     mov         ecx, [esp+16]       ; pix2
  540.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, eax, ebx, ecx, edx, 4
  541.     HADAMARD4x4_SUM     mm2
  542.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, eax, ebx, ecx, edx, 4
  543.     HADAMARD4x4_SUM     mm3
  544.     paddw       mm0, mm1
  545.     paddw       mm2, mm3
  546.     paddw       mm0, mm2
  547.     mov         eax, [esp+ 8]       ; pix1
  548.     mov         ecx, [esp+16]       ; pix2
  549.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm1, eax, ebx, ecx, edx, 8
  550.     HADAMARD4x4_SUM     mm1
  551.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm2, eax, ebx, ecx, edx, 8
  552.     HADAMARD4x4_SUM     mm2
  553.     paddw       mm1, mm2
  554.     mov         eax, [esp+ 8]       ; pix1
  555.     mov         ecx, [esp+16]       ; pix2
  556.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, eax, ebx, ecx, edx, 12
  557.     HADAMARD4x4_SUM     mm2
  558.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, eax, ebx, ecx, edx, 12
  559.     HADAMARD4x4_SUM     mm3
  560.     paddw       mm0, mm1
  561.     paddw       mm2, mm3
  562.     paddw       mm0, mm2
  563.     SATD_END
  564. ALIGN 16
  565. ;-----------------------------------------------------------------------------
  566. ;   int __cdecl x264_pixel_satd_8x16_mmxext (uint8_t *, int, uint8_t *, int )
  567. ;-----------------------------------------------------------------------------
  568. x264_pixel_satd_8x16_mmxext:
  569.     SATD_START
  570.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm0, eax, ebx, ecx, edx, 0
  571.     HADAMARD4x4_SUM     mm0
  572.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm1, eax, ebx, ecx, edx, 0
  573.     HADAMARD4x4_SUM     mm1
  574.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, eax, ebx, ecx, edx, 0
  575.     HADAMARD4x4_SUM     mm2
  576.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, eax, ebx, ecx, edx, 0
  577.     HADAMARD4x4_SUM     mm3
  578.     paddw       mm0, mm1
  579.     paddw       mm2, mm3
  580.     paddw       mm0, mm2
  581.     mov         eax, [esp+ 8]       ; pix1
  582.     mov         ecx, [esp+16]       ; pix2
  583.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm1, eax, ebx, ecx, edx, 4
  584.     HADAMARD4x4_SUM     mm1
  585.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, eax, ebx, ecx, edx, 4
  586.     HADAMARD4x4_SUM     mm2
  587.     paddw       mm1, mm2
  588.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, eax, ebx, ecx, edx, 4
  589.     HADAMARD4x4_SUM     mm2
  590.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, eax, ebx, ecx, edx, 4
  591.     HADAMARD4x4_SUM     mm3
  592.     paddw       mm0, mm1
  593.     paddw       mm2, mm3
  594.     paddw       mm0, mm2
  595.     SATD_END
  596. ALIGN 16
  597. ;-----------------------------------------------------------------------------
  598. ;   int __cdecl x264_pixel_satd_16x16_mmxext (uint8_t *, int, uint8_t *, int )
  599. ;-----------------------------------------------------------------------------
  600. x264_pixel_satd_16x16_mmxext:
  601.     SATD_START
  602.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm0, eax, ebx, ecx, edx, 0
  603.     HADAMARD4x4_SUM     mm0
  604.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm1, eax, ebx, ecx, edx, 0
  605.     HADAMARD4x4_SUM     mm1
  606.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, eax, ebx, ecx, edx, 0
  607.     HADAMARD4x4_SUM     mm2
  608.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, eax, ebx, ecx, edx, 0
  609.     HADAMARD4x4_SUM     mm3
  610.     paddw       mm0, mm1
  611.     paddw       mm2, mm3
  612.     paddw       mm0, mm2
  613.     mov         eax, [esp+ 8]       ; pix1
  614.     mov         ecx, [esp+16]       ; pix2
  615.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm1, eax, ebx, ecx, edx, 4
  616.     HADAMARD4x4_SUM     mm1
  617.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, eax, ebx, ecx, edx, 4
  618.     HADAMARD4x4_SUM     mm2
  619.     paddw       mm1, mm2
  620.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, eax, ebx, ecx, edx, 4
  621.     HADAMARD4x4_SUM     mm2
  622.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, eax, ebx, ecx, edx, 4
  623.     HADAMARD4x4_SUM     mm3
  624.     paddw       mm0, mm1
  625.     paddw       mm2, mm3
  626.     paddw       mm0, mm2
  627.     mov         eax, [esp+ 8]       ; pix1
  628.     mov         ecx, [esp+16]       ; pix2
  629.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm1, eax, ebx, ecx, edx, 8
  630.     HADAMARD4x4_SUM     mm1
  631.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, eax, ebx, ecx, edx, 8
  632.     HADAMARD4x4_SUM     mm2
  633.     paddw       mm1, mm2
  634.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, eax, ebx, ecx, edx, 8
  635.     HADAMARD4x4_SUM     mm2
  636.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, eax, ebx, ecx, edx, 8
  637.     HADAMARD4x4_SUM     mm3
  638.     paddw       mm0, mm1
  639.     paddw       mm2, mm3
  640.     paddw       mm0, mm2
  641.     mov         eax, [esp+ 8]       ; pix1
  642.     mov         ecx, [esp+16]       ; pix2
  643.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm1, eax, ebx, ecx, edx, 12
  644.     HADAMARD4x4_SUM     mm1
  645.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, eax, ebx, ecx, edx, 12
  646.     HADAMARD4x4_SUM     mm2
  647.     paddw       mm1, mm2
  648.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, eax, ebx, ecx, edx, 12
  649.     HADAMARD4x4_SUM     mm2
  650.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, eax, ebx, ecx, edx, 12
  651.     HADAMARD4x4_SUM     mm3
  652.     paddw       mm0, mm1
  653.     paddw       mm2, mm3
  654.     paddw       mm0, mm2
  655.     pxor        mm3, mm3
  656.     pshufw      mm1, mm0, 01001110b
  657.     paddw       mm0, mm1
  658.     punpcklwd   mm0, mm3
  659.     pshufw      mm1, mm0, 01001110b
  660.     paddd       mm0, mm1
  661.     movd        eax, mm0
  662.     pop         ebx
  663.     ret