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 64
  24. ;=============================================================================
  25. ; Macros and other preprocessor constants
  26. ;=============================================================================
  27. %include "amd64inc.asm"
  28. %macro SAD_INC_2x16P 0
  29.     movq    mm1,    [parm1q]
  30.     movq    mm2,    [parm1q+8]
  31.     movq    mm3,    [parm1q+parm2q]
  32.     movq    mm4,    [parm1q+parm2q+8]
  33.     psadbw  mm1,    [parm3q]
  34.     psadbw  mm2,    [parm3q+8]
  35.     psadbw  mm3,    [parm3q+parm4q]
  36.     psadbw  mm4,    [parm3q+parm4q+8]
  37.     lea     parm1q, [parm1q+2*parm2q]
  38.     paddw   mm1,    mm2
  39.     paddw   mm3,    mm4
  40.     lea     parm3q, [parm3q+2*parm4q]
  41.     paddw   mm0,    mm1
  42.     paddw   mm0,    mm3
  43. %endmacro
  44. %macro SAD_INC_2x8P 0
  45.     movq    mm1,    [parm1q]
  46.     movq    mm2,    [parm1q+parm2q]
  47.     psadbw  mm1,    [parm3q]
  48.     psadbw  mm2,    [parm3q+parm4q]
  49.     lea     parm1q,    [parm1q+2*parm2q]
  50.     paddw   mm0,    mm1
  51.     paddw   mm0,    mm2
  52.     lea     parm3q, [parm3q+2*parm4q]
  53. %endmacro
  54. %macro SAD_INC_2x4P 0
  55.     movd    mm1,    [parm1q]
  56.     movd    mm2,    [parm3q]
  57.     movd    mm3,    [parm1q+parm2q]
  58.     movd    mm4,    [parm3q+parm4q]
  59.     psadbw  mm1,    mm2
  60.     psadbw  mm3,    mm4
  61.     paddw   mm0,    mm1
  62.     paddw   mm0,    mm3
  63.     lea     parm1q, [parm1q+2*parm2q]
  64.     lea     parm3q, [parm3q+2*parm4q]
  65. %endmacro
  66. %macro SSD_INC_1x16P 0
  67.     movq    mm1,    [rax]
  68.     movq    mm2,    [rcx]
  69.     movq    mm3,    [rax+8]
  70.     movq    mm4,    [rcx+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     rax,    rbx
  90.     add     rcx,    rdx
  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,    [rax]
  98.     movq    mm2,    [rcx]
  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     rax,    rbx
  109.     add     rcx,    rdx
  110.     paddd   mm0,    mm1
  111.     paddd   mm0,    mm2
  112. %endmacro
  113. %macro SSD_INC_1x4P 0
  114.     movd    mm1,    [rax]
  115.     movd    mm2,    [rcx]
  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     rax,    rbx
  123.     add     rcx,    rdx
  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.     pxor    mm0,    mm0
  248. %endmacro
  249. %macro SAD_END 0
  250.     movd    eax, mm0
  251.     ret
  252. %endmacro
  253. ALIGN 16
  254. ;-----------------------------------------------------------------------------
  255. ;   int x264_pixel_sad_16x16_mmxext (uint8_t *, int, uint8_t *, int )
  256. ;-----------------------------------------------------------------------------
  257. x264_pixel_sad_16x16_mmxext:
  258.     SAD_START
  259.     SAD_INC_2x16P
  260.     SAD_INC_2x16P
  261.     SAD_INC_2x16P
  262.     SAD_INC_2x16P
  263.     SAD_INC_2x16P
  264.     SAD_INC_2x16P
  265.     SAD_INC_2x16P
  266.     SAD_INC_2x16P
  267.     SAD_END
  268. ALIGN 16
  269. ;-----------------------------------------------------------------------------
  270. ;   int x264_pixel_sad_16x8_mmxext (uint8_t *, int, uint8_t *, int )
  271. ;-----------------------------------------------------------------------------
  272. x264_pixel_sad_16x8_mmxext:
  273.     SAD_START
  274.     SAD_INC_2x16P
  275.     SAD_INC_2x16P
  276.     SAD_INC_2x16P
  277.     SAD_INC_2x16P
  278.     SAD_END
  279. ALIGN 16
  280. ;-----------------------------------------------------------------------------
  281. ;   int x264_pixel_sad_8x16_mmxext (uint8_t *, int, uint8_t *, int )
  282. ;-----------------------------------------------------------------------------
  283. x264_pixel_sad_8x16_mmxext:
  284.     SAD_START
  285.     SAD_INC_2x8P
  286.     SAD_INC_2x8P
  287.     SAD_INC_2x8P
  288.     SAD_INC_2x8P
  289.     SAD_INC_2x8P
  290.     SAD_INC_2x8P
  291.     SAD_INC_2x8P
  292.     SAD_INC_2x8P
  293.     SAD_END
  294. ALIGN 16
  295. ;-----------------------------------------------------------------------------
  296. ;   int x264_pixel_sad_8x8_mmxext (uint8_t *, int, uint8_t *, int )
  297. ;-----------------------------------------------------------------------------
  298. x264_pixel_sad_8x8_mmxext:
  299.     SAD_START
  300.     SAD_INC_2x8P
  301.     SAD_INC_2x8P
  302.     SAD_INC_2x8P
  303.     SAD_INC_2x8P
  304.     SAD_END
  305. ALIGN 16
  306. ;-----------------------------------------------------------------------------
  307. ;   int x264_pixel_sad_8x4_mmxext (uint8_t *, int, uint8_t *, int )
  308. ;-----------------------------------------------------------------------------
  309. x264_pixel_sad_8x4_mmxext:
  310.     SAD_START
  311.     SAD_INC_2x8P
  312.     SAD_INC_2x8P
  313.     SAD_END
  314. ALIGN 16
  315. ;-----------------------------------------------------------------------------
  316. ;   int x264_pixel_sad_4x8_mmxext (uint8_t *, int, uint8_t *, int )
  317. ;-----------------------------------------------------------------------------
  318. x264_pixel_sad_4x8_mmxext:
  319.     SAD_START
  320.     SAD_INC_2x4P
  321.     SAD_INC_2x4P
  322.     SAD_INC_2x4P
  323.     SAD_INC_2x4P
  324.     SAD_END
  325. ALIGN 16
  326. ;-----------------------------------------------------------------------------
  327. ;   int x264_pixel_sad_4x4_mmxext (uint8_t *, int, uint8_t *, int )
  328. ;-----------------------------------------------------------------------------
  329. x264_pixel_sad_4x4_mmxext:
  330.     SAD_START
  331.     SAD_INC_2x4P
  332.     SAD_INC_2x4P
  333.     SAD_END
  334. %macro PDE_CHECK 0
  335.     movd eax, mm0
  336.     cmp  eax, parm5d ; prev_score
  337.     jl   .continue
  338.     ret
  339. ALIGN 4
  340. .continue:
  341. %endmacro
  342. ALIGN 16
  343. ;-----------------------------------------------------------------------------
  344. ;   int __cdecl x264_pixel_sad_pde_16x16_mmxext (uint8_t *, int, uint8_t *, int, int )
  345. ;-----------------------------------------------------------------------------
  346. x264_pixel_sad_pde_16x16_mmxext:
  347.     SAD_START
  348.     SAD_INC_2x16P
  349.     SAD_INC_2x16P
  350.     SAD_INC_2x16P
  351.     SAD_INC_2x16P
  352.     PDE_CHECK
  353.     SAD_INC_2x16P
  354.     SAD_INC_2x16P
  355.     SAD_INC_2x16P
  356.     SAD_INC_2x16P
  357.     SAD_END
  358. ALIGN 16
  359. ;-----------------------------------------------------------------------------
  360. ;   int __cdecl x264_pixel_sad_pde_16x8_mmxext (uint8_t *, int, uint8_t *, int, int )
  361. ;-----------------------------------------------------------------------------
  362. x264_pixel_sad_pde_16x8_mmxext:
  363.     SAD_START
  364.     SAD_INC_2x16P
  365.     SAD_INC_2x16P
  366.     PDE_CHECK
  367.     SAD_INC_2x16P
  368.     SAD_INC_2x16P
  369.     SAD_END
  370. ALIGN 16
  371. ;-----------------------------------------------------------------------------
  372. ;   int __cdecl x264_pixel_sad_pde_8x16_mmxext (uint8_t *, int, uint8_t *, int, int )
  373. ;-----------------------------------------------------------------------------
  374. x264_pixel_sad_pde_8x16_mmxext:
  375.     SAD_START
  376.     SAD_INC_2x8P
  377.     SAD_INC_2x8P
  378.     SAD_INC_2x8P
  379.     SAD_INC_2x8P
  380.     PDE_CHECK
  381.     SAD_INC_2x8P
  382.     SAD_INC_2x8P
  383.     SAD_INC_2x8P
  384.     SAD_INC_2x8P
  385.     SAD_END
  386. %macro SSD_START 0
  387.     firstpush rbx
  388.     pushreg   rbx
  389.     endprolog
  390.     mov     rax, parm1q         ; pix1 =parm1
  391.     movsxd  rbx, parm2d         ; stride1 =parm2
  392. %ifdef WIN64
  393.     mov     rcx, parm3q
  394.     movsxd  rdx, parm4d
  395. %else
  396.    xchg     rcx, rdx
  397. %endif
  398.     pxor    mm7,    mm7         ; zero
  399.     pxor    mm0,    mm0         ; mm0 holds the sum
  400. %endmacro
  401. %macro SSD_END 0
  402.     movq    mm1,    mm0
  403.     psrlq   mm1,    32
  404.     paddd   mm0,    mm1
  405.     movd    eax,    mm0
  406.     pop rbx
  407.     ret
  408.     endfunc
  409. %endmacro
  410. ALIGN 16
  411. ;-----------------------------------------------------------------------------
  412. ;   int x264_pixel_ssd_16x16_mmxext (uint8_t *, int, uint8_t *, int )
  413. ;-----------------------------------------------------------------------------
  414. x264_pixel_ssd_16x16_mmxext:
  415.     SSD_START
  416.     SSD_INC_8x16P
  417.     SSD_INC_8x16P
  418.     SSD_END
  419. ALIGN 16
  420. x264_pixel_ssd_16x8_mmxext:
  421.     SSD_START
  422.     SSD_INC_8x16P
  423.     SSD_END
  424. ALIGN 16
  425. x264_pixel_ssd_8x16_mmxext:
  426.     SSD_START
  427.     SSD_INC_4x8P
  428.     SSD_INC_4x8P
  429.     SSD_INC_4x8P
  430.     SSD_INC_4x8P
  431.     SSD_END
  432. ALIGN 16
  433. x264_pixel_ssd_8x8_mmxext:
  434.     SSD_START
  435.     SSD_INC_4x8P
  436.     SSD_INC_4x8P
  437.     SSD_END
  438. ALIGN 16
  439. x264_pixel_ssd_8x4_mmxext:
  440.     SSD_START
  441.     SSD_INC_4x8P
  442.     SSD_END
  443. ALIGN 16
  444. x264_pixel_ssd_4x8_mmxext:
  445.     SSD_START
  446.     SSD_INC_4x4P
  447.     SSD_INC_4x4P
  448.     SSD_END
  449. ALIGN 16
  450. x264_pixel_ssd_4x4_mmxext:
  451.     SSD_START
  452.     SSD_INC_4x4P
  453.     SSD_END
  454. %macro SATD_START 0
  455. ;   mov     rdi, rdi            ; pix1
  456. ;   movsxd  rsi, esi            ; stride1
  457. ;   mov     rdx, rdx            ; pix2
  458. ;   movsxd  rcx, ecx            ; stride2
  459. %endmacro
  460. %macro SATD_END 0
  461.     pshufw      mm1, mm0, 01001110b
  462.     paddw       mm0, mm1
  463.     pshufw      mm1, mm0, 10110001b
  464.     paddw       mm0, mm1
  465.     movd        eax, mm0
  466.     and         eax, 0xffff
  467.     ret
  468. %endmacro
  469. ALIGN 16
  470. ;-----------------------------------------------------------------------------
  471. ;   int x264_pixel_satd_4x4_mmxext (uint8_t *, int, uint8_t *, int )
  472. ;-----------------------------------------------------------------------------
  473. x264_pixel_satd_4x4_mmxext:
  474.     SATD_START
  475.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm0, parm1q, parm2q, parm3q, parm4q, 0
  476.     HADAMARD4x4_SUM     mm0
  477.     SATD_END
  478. ALIGN 16
  479. ;-----------------------------------------------------------------------------
  480. ;   int x264_pixel_satd_4x8_mmxext (uint8_t *, int, uint8_t *, int )
  481. ;-----------------------------------------------------------------------------
  482. x264_pixel_satd_4x8_mmxext:
  483.     SATD_START
  484.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm0, parm1q, parm2q, parm3q, parm4q, 0
  485.     HADAMARD4x4_SUM     mm0
  486.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm1, parm1q, parm2q, parm3q, parm4q, 0
  487.     HADAMARD4x4_SUM     mm1
  488.     paddw       mm0, mm1
  489.     SATD_END
  490. ALIGN 16
  491. ;-----------------------------------------------------------------------------
  492. ;   int x264_pixel_satd_8x4_mmxext (uint8_t *, int, uint8_t *, int )
  493. ;-----------------------------------------------------------------------------
  494. x264_pixel_satd_8x4_mmxext:
  495.     SATD_START
  496.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm0, parm1q, parm2q, parm3q, parm4q, 0
  497.     HADAMARD4x4_SUM     mm0
  498.     sub         parm1q, parm2q
  499.     sub         parm3q, parm4q
  500.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm1, parm1q, parm2q, parm3q, parm4q, 4
  501.     HADAMARD4x4_SUM     mm1
  502.     paddw       mm0, mm1
  503.     SATD_END
  504. ALIGN 16
  505. ;-----------------------------------------------------------------------------
  506. ;   int x264_pixel_satd_8x8_mmxext (uint8_t *, int, uint8_t *, int )
  507. ;-----------------------------------------------------------------------------
  508. x264_pixel_satd_8x8_mmxext:
  509.     SATD_START
  510.     mov         r10, parm1q        ; pix1
  511.     mov         r11, parm3q        ; pix2
  512.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm0, parm1q, parm2q, parm3q, parm4q, 0
  513.     HADAMARD4x4_SUM     mm0
  514.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm1, parm1q, parm2q, parm3q, parm4q, 0
  515.     HADAMARD4x4_SUM     mm1
  516.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, r10, parm2q, r11, parm4q, 4
  517.     HADAMARD4x4_SUM     mm2
  518.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, r10, parm2q, r11, parm4q, 4
  519.     HADAMARD4x4_SUM     mm3
  520.     paddw       mm0, mm1
  521.     paddw       mm2, mm3
  522.     paddw       mm0, mm2
  523.     SATD_END
  524. ALIGN 16
  525. ;-----------------------------------------------------------------------------
  526. ;   int x264_pixel_satd_16x8_mmxext (uint8_t *, int, uint8_t *, int )
  527. ;-----------------------------------------------------------------------------
  528. x264_pixel_satd_16x8_mmxext:
  529.     SATD_START
  530.     mov         r10, parm1q
  531.     mov         r11, parm3q
  532.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm0, parm1q, parm2q, parm3q, parm4q, 0
  533.     HADAMARD4x4_SUM     mm0
  534.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm1, parm1q, parm2q, parm3q, parm4q, 0
  535.     HADAMARD4x4_SUM     mm1
  536.     mov         parm1q, r10
  537.     mov         parm3q, r11
  538.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, parm1q, parm2q, parm3q, parm4q, 4
  539.     HADAMARD4x4_SUM     mm2
  540.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, parm1q, parm2q, parm3q, parm4q, 4
  541.     HADAMARD4x4_SUM     mm3
  542.     paddw       mm0, mm1
  543.     paddw       mm2, mm3
  544.     paddw       mm0, mm2
  545.     mov         parm1q, r10
  546.     mov         parm3q, r11
  547.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm1, parm1q, parm2q, parm3q, parm4q, 8
  548.     HADAMARD4x4_SUM     mm1
  549.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm2, parm1q, parm2q, parm3q, parm4q, 8
  550.     HADAMARD4x4_SUM     mm2
  551.     paddw       mm1, mm2
  552.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, r10, parm2q, r11, parm4q, 12
  553.     HADAMARD4x4_SUM     mm2
  554.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, r10, parm2q, r11, parm4q, 12
  555.     HADAMARD4x4_SUM     mm3
  556.     paddw       mm0, mm1
  557.     paddw       mm2, mm3
  558.     paddw       mm0, mm2
  559.     SATD_END
  560. ALIGN 16
  561. ;-----------------------------------------------------------------------------
  562. ;   int x264_pixel_satd_8x16_mmxext (uint8_t *, int, uint8_t *, int )
  563. ;-----------------------------------------------------------------------------
  564. x264_pixel_satd_8x16_mmxext:
  565.     SATD_START
  566.     mov         r10, parm1q
  567.     mov         r11, parm3q
  568.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm0, parm1q, parm2q, parm3q, parm4q, 0
  569.     HADAMARD4x4_SUM     mm0
  570.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm1, parm1q, parm2q, parm3q, parm4q, 0
  571.     HADAMARD4x4_SUM     mm1
  572.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, parm1q, parm2q, parm3q, parm4q, 0
  573.     HADAMARD4x4_SUM     mm2
  574.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, parm1q, parm2q, parm3q, parm4q, 0
  575.     HADAMARD4x4_SUM     mm3
  576.     paddw       mm0, mm1
  577.     paddw       mm2, mm3
  578.     paddw       mm0, mm2
  579.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm1, r10, parm2q, r11, parm4q, 4
  580.     HADAMARD4x4_SUM     mm1
  581.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, r10, parm2q, r11, parm4q, 4
  582.     HADAMARD4x4_SUM     mm2
  583.     paddw       mm1, mm2
  584.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, r10, parm2q, r11, parm4q, 4
  585.     HADAMARD4x4_SUM     mm2
  586.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, r10, parm2q, r11, parm4q, 4
  587.     HADAMARD4x4_SUM     mm3
  588.     paddw       mm0, mm1
  589.     paddw       mm2, mm3
  590.     paddw       mm0, mm2
  591.     SATD_END
  592. ALIGN 16
  593. ;-----------------------------------------------------------------------------
  594. ;   int x264_pixel_satd_16x16_mmxext (uint8_t *, int, uint8_t *, int )
  595. ;-----------------------------------------------------------------------------
  596. x264_pixel_satd_16x16_mmxext:
  597.     SATD_START
  598.     mov         r10, parm1q
  599.     mov         r11, parm3q
  600.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm0, parm1q, parm2q, parm3q, parm4q, 0
  601.     HADAMARD4x4_SUM     mm0
  602.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm1, parm1q, parm2q, parm3q, parm4q, 0
  603.     HADAMARD4x4_SUM     mm1
  604.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, parm1q, parm2q, parm3q, parm4q, 0
  605.     HADAMARD4x4_SUM     mm2
  606.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, parm1q, parm2q, parm3q, parm4q, 0
  607.     HADAMARD4x4_SUM     mm3
  608.     paddw       mm0, mm1
  609.     paddw       mm2, mm3
  610.     paddw       mm0, mm2
  611.     mov         parm1q, r10
  612.     mov         parm3q, r11
  613.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm1, parm1q, parm2q, parm3q, parm4q, 4
  614.     HADAMARD4x4_SUM     mm1
  615.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, parm1q, parm2q, parm3q, parm4q, 4
  616.     HADAMARD4x4_SUM     mm2
  617.     paddw       mm1, mm2
  618.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, parm1q, parm2q, parm3q, parm4q, 4
  619.     HADAMARD4x4_SUM     mm2
  620.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, parm1q, parm2q, parm3q, parm4q, 4
  621.     HADAMARD4x4_SUM     mm3
  622.     paddw       mm0, mm1
  623.     paddw       mm2, mm3
  624.     paddw       mm0, mm2
  625.     mov         parm1q, r10
  626.     mov         parm3q, r11
  627.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm1, parm1q, parm2q, parm3q, parm4q, 8
  628.     HADAMARD4x4_SUM     mm1
  629.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, parm1q, parm2q, parm3q, parm4q, 8
  630.     HADAMARD4x4_SUM     mm2
  631.     paddw       mm1, mm2
  632.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, parm1q, parm2q, parm3q, parm4q, 8
  633.     HADAMARD4x4_SUM     mm2
  634.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, parm1q, parm2q, parm3q, parm4q, 8
  635.     HADAMARD4x4_SUM     mm3
  636.     paddw       mm0, mm1
  637.     paddw       mm2, mm3
  638.     paddw       mm0, mm2
  639.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm1, r10, parm2q, r11, parm4q, 12
  640.     HADAMARD4x4_SUM     mm1
  641.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, r10, parm2q, r11, parm4q, 12
  642.     HADAMARD4x4_SUM     mm2
  643.     paddw       mm1, mm2
  644.     LOAD_DIFF_INC_4x4   mm4, mm5, mm6, mm7, mm2, r10, parm2q, r11, parm4q, 12
  645.     HADAMARD4x4_SUM     mm2
  646.     LOAD_DIFF_4x4       mm4, mm5, mm6, mm7, mm3, r10, parm2q, r11, parm4q, 12
  647.     HADAMARD4x4_SUM     mm3
  648.     paddw       mm0, mm1
  649.     paddw       mm2, mm3
  650.     paddw       mm0, mm2
  651.     pxor        mm3, mm3
  652.     pshufw      mm1, mm0, 01001110b
  653.     paddw       mm0, mm1
  654.     punpcklwd   mm0, mm3
  655.     pshufw      mm1, mm0, 01001110b
  656.     paddd       mm0, mm1
  657.     movd        eax, mm0
  658.     ret