]> git.sesse.net Git - x264/blob - common/amd64/pixel-a.asm
amd64 asm patch, part1.
[x264] / common / amd64 / pixel-a.asm
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
24 BITS 32
25
26 ;=============================================================================
27 ; Macros and other preprocessor constants
28 ;=============================================================================
29
30 %macro cglobal 1
31         %ifdef PREFIX
32                 global _%1
33                 %define %1 _%1
34         %else
35                 global %1
36         %endif
37 %endmacro
38
39 %macro SAD_INC_2x16P 0
40     movq    mm1,    [eax]
41     movq    mm2,    [ecx]
42     movq    mm3,    [eax+8]
43     movq    mm4,    [ecx+8]
44
45     psadbw  mm1,    mm2
46     psadbw  mm3,    mm4
47     paddw   mm0,    mm1
48     paddw   mm0,    mm3
49
50     movq    mm1,    [eax+ebx]
51     movq    mm2,    [ecx+edx]
52     movq    mm3,    [eax+ebx+8]
53     movq    mm4,    [ecx+edx+8]
54
55     psadbw  mm1,    mm2
56     psadbw  mm3,    mm4
57     paddw   mm0,    mm1
58     paddw   mm0,    mm3
59
60     lea     eax,    [eax+2*ebx]
61     lea     ecx,    [ecx+2*edx]
62 %endmacro
63
64 %macro SAD_INC_2x8P 0
65     movq    mm1,    [eax]
66     movq    mm2,    [ecx]
67     movq    mm3,    [eax+ebx]
68     movq    mm4,    [ecx+edx]
69
70     psadbw  mm1,    mm2
71     psadbw  mm3,    mm4
72     paddw   mm0,    mm1
73     paddw   mm0,    mm3
74
75     lea     eax,    [eax+2*ebx]
76     lea     ecx,    [ecx+2*edx]
77 %endmacro
78
79 %macro SAD_INC_2x4P 0
80     movd    mm1,    [eax]
81     movd    mm2,    [ecx]
82     movd    mm3,    [eax+ebx]
83     movd    mm4,    [ecx+edx]
84
85     psadbw  mm1,    mm2
86     psadbw  mm3,    mm4
87     paddw   mm0,    mm1
88     paddw   mm0,    mm3
89
90     lea     eax,    [eax+2*ebx]
91     lea     ecx,    [ecx+2*edx]
92 %endmacro
93
94 %macro SSD_INC_1x16P 0
95     movq    mm1,    [eax]
96     movq    mm2,    [ecx]
97     movq    mm3,    [eax+8]
98     movq    mm4,    [ecx+8]
99
100     movq    mm5,    mm2
101     movq    mm6,    mm4
102     psubusb mm2,    mm1
103     psubusb mm4,    mm3
104     psubusb mm1,    mm5
105     psubusb mm3,    mm6
106     por     mm1,    mm2
107     por     mm3,    mm4
108
109     movq    mm2,    mm1
110     movq    mm4,    mm3
111     punpcklbw mm1,  mm7
112     punpcklbw mm3,  mm7
113     punpckhbw mm2,  mm7
114     punpckhbw mm4,  mm7
115     pmaddwd mm1,    mm1
116     pmaddwd mm2,    mm2
117     pmaddwd mm3,    mm3
118     pmaddwd mm4,    mm4
119
120     add     eax,    ebx
121     add     ecx,    edx
122     paddd   mm0,    mm1
123     paddd   mm0,    mm2
124     paddd   mm0,    mm3
125     paddd   mm0,    mm4
126 %endmacro
127
128 %macro SSD_INC_1x8P 0
129     movq    mm1,    [eax]
130     movq    mm2,    [ecx]
131
132     movq    mm5,    mm2
133     psubusb mm2,    mm1
134     psubusb mm1,    mm5
135     por     mm1,    mm2         ; mm1 = 8bit abs diff
136
137     movq    mm2,    mm1
138     punpcklbw mm1,  mm7
139     punpckhbw mm2,  mm7         ; (mm1,mm2) = 16bit abs diff
140     pmaddwd mm1,    mm1
141     pmaddwd mm2,    mm2
142
143     add     eax,    ebx
144     add     ecx,    edx
145     paddd   mm0,    mm1
146     paddd   mm0,    mm2
147 %endmacro
148
149 %macro SSD_INC_1x4P 0
150     movd    mm1,    [eax]
151     movd    mm2,    [ecx]
152
153     movq    mm5,    mm2
154     psubusb mm2,    mm1
155     psubusb mm1,    mm5
156     por     mm1,    mm2
157     punpcklbw mm1,  mm7
158     pmaddwd mm1,    mm1
159
160     add     eax,    ebx
161     add     ecx,    edx
162     paddd   mm0,    mm1
163 %endmacro
164
165 %macro SSD_INC_8x16P 0
166     SSD_INC_1x16P
167     SSD_INC_1x16P
168     SSD_INC_1x16P
169     SSD_INC_1x16P
170     SSD_INC_1x16P
171     SSD_INC_1x16P
172     SSD_INC_1x16P
173     SSD_INC_1x16P
174 %endmacro
175
176 %macro SSD_INC_4x8P 0
177     SSD_INC_1x8P
178     SSD_INC_1x8P
179     SSD_INC_1x8P
180     SSD_INC_1x8P
181 %endmacro
182
183 %macro SSD_INC_4x4P 0
184     SSD_INC_1x4P
185     SSD_INC_1x4P
186     SSD_INC_1x4P
187     SSD_INC_1x4P
188 %endmacro
189
190 %macro LOAD_DIFF_4P 5  ; MMP, MMT, MMZ, [pix1], [pix2]
191     movd        %1, %4
192     punpcklbw   %1, %3
193     movd        %2, %5
194     punpcklbw   %2, %3
195     psubw       %1, %2
196 %endmacro
197
198 %macro LOAD_DIFF_INC_4x4 11 ; p1,p2,p3,p4, t, z, pix1, i_pix1, pix2, i_pix2, offset
199     LOAD_DIFF_4P %1, %5, %6, [%7+%11],    [%9+%11]
200     LOAD_DIFF_4P %2, %5, %6, [%7+%8+%11], [%9+%10+%11]
201     lea %7, [%7+2*%8]
202     lea %9, [%9+2*%10]
203     LOAD_DIFF_4P %3, %5, %6, [%7+%11],    [%9+%11]
204     LOAD_DIFF_4P %4, %5, %6, [%7+%8+%11], [%9+%10+%11]
205     lea %7, [%7+2*%8]
206     lea %9, [%9+2*%10]
207 %endmacro
208
209 %macro HADAMARD4_SUB_BADC 4
210     paddw %1,   %2
211     paddw %3,   %4
212     paddw %2,   %2
213     paddw %4,   %4
214     psubw %2,   %1
215     psubw %4,   %3
216 %endmacro
217
218 %macro HADAMARD4x4 4
219     HADAMARD4_SUB_BADC %1, %2, %3, %4
220     HADAMARD4_SUB_BADC %1, %3, %2, %4
221 %endmacro
222
223 %macro SBUTTERFLYwd 3
224     movq        %3, %1
225     punpcklwd   %1, %2
226     punpckhwd   %3, %2
227 %endmacro
228
229 %macro SBUTTERFLYdq 3
230     movq        %3, %1
231     punpckldq   %1, %2
232     punpckhdq   %3, %2
233 %endmacro
234
235 %macro TRANSPOSE4x4 5   ; abcd-t -> adtc
236     SBUTTERFLYwd %1, %2, %5
237     SBUTTERFLYwd %3, %4, %2
238     SBUTTERFLYdq %1, %3, %4
239     SBUTTERFLYdq %5, %2, %3
240 %endmacro
241
242 %macro MMX_ABS 2        ; mma, mmt
243     pxor    %2, %2
244     psubw   %2, %1
245     pmaxsw  %1, %2
246 %endmacro
247
248 %macro MMX_ABS_SUM 3    ; mma, mmt, mms
249     pxor    %2, %2
250     psubw   %2, %1
251     pmaxsw  %1, %2
252     paddusw %3, %1
253 %endmacro
254
255
256 %macro MMX_SUM_MM 2     ; mmv, mmt
257     movq    %2, %1
258     psrlq   %1, 32
259     paddusw %1, %2
260     movq    %2, %1
261     psrlq   %1, 16
262     paddusw %1, %2
263     movd    eax,%1
264     and     eax,0xffff
265     shr     eax,1
266 %endmacro
267
268 %macro HADAMARD4x4_FIRST 0
269     HADAMARD4x4 mm0, mm1, mm2, mm3
270     TRANSPOSE4x4 mm0, mm1, mm2, mm3, mm4
271     HADAMARD4x4 mm0, mm3, mm4, mm2
272     MMX_ABS     mm0, mm7
273     MMX_ABS_SUM mm3, mm7, mm0
274     MMX_ABS_SUM mm4, mm7, mm0
275     MMX_ABS_SUM mm2, mm7, mm0
276 %endmacro
277
278 %macro HADAMARD4x4_NEXT 0
279     HADAMARD4x4 mm1, mm2, mm3, mm4
280     TRANSPOSE4x4 mm1, mm2, mm3, mm4, mm5
281     HADAMARD4x4 mm1, mm4, mm5, mm3
282     MMX_ABS_SUM mm1, mm7, mm0
283     MMX_ABS_SUM mm4, mm7, mm0
284     MMX_ABS_SUM mm5, mm7, mm0
285     MMX_ABS_SUM mm3, mm7, mm0
286 %endmacro
287
288 ;=============================================================================
289 ; Code
290 ;=============================================================================
291
292 SECTION .text
293
294 cglobal x264_pixel_sad_16x16_mmxext
295 cglobal x264_pixel_sad_16x8_mmxext
296 cglobal x264_pixel_sad_8x16_mmxext
297 cglobal x264_pixel_sad_8x8_mmxext
298 cglobal x264_pixel_sad_8x4_mmxext
299 cglobal x264_pixel_sad_4x8_mmxext
300 cglobal x264_pixel_sad_4x4_mmxext
301
302 cglobal x264_pixel_ssd_16x16_mmxext
303 cglobal x264_pixel_ssd_16x8_mmxext
304 cglobal x264_pixel_ssd_8x16_mmxext
305 cglobal x264_pixel_ssd_8x8_mmxext
306 cglobal x264_pixel_ssd_8x4_mmxext
307 cglobal x264_pixel_ssd_4x8_mmxext
308 cglobal x264_pixel_ssd_4x4_mmxext
309
310 cglobal x264_pixel_satd_4x4_mmxext
311 cglobal x264_pixel_satd_4x8_mmxext
312 cglobal x264_pixel_satd_8x4_mmxext
313 cglobal x264_pixel_satd_8x8_mmxext
314 cglobal x264_pixel_satd_16x8_mmxext
315 cglobal x264_pixel_satd_8x16_mmxext
316 cglobal x264_pixel_satd_16x16_mmxext
317
318 %macro SAD_START 0
319     push    ebx
320
321     mov     eax,    [esp+ 8]    ; pix1
322     mov     ebx,    [esp+12]    ; stride1
323     mov     ecx,    [esp+16]    ; pix2
324     mov     edx,    [esp+20]    ; stride2
325
326     pxor    mm0,    mm0
327 %endmacro
328 %macro SAD_END 0
329     movd eax,    mm0
330
331     pop ebx
332     ret
333 %endmacro
334
335 ALIGN 16
336 ;-----------------------------------------------------------------------------
337 ;   int __cdecl x264_pixel_sad_16x16_mmxext (uint8_t *, int, uint8_t *, int )
338 ;-----------------------------------------------------------------------------
339 x264_pixel_sad_16x16_mmxext:
340     SAD_START
341     SAD_INC_2x16P
342     SAD_INC_2x16P
343     SAD_INC_2x16P
344     SAD_INC_2x16P
345     SAD_INC_2x16P
346     SAD_INC_2x16P
347     SAD_INC_2x16P
348     SAD_INC_2x16P
349     SAD_END
350
351 ALIGN 16
352 ;-----------------------------------------------------------------------------
353 ;   int __cdecl x264_pixel_sad_16x8_mmxext (uint8_t *, int, uint8_t *, int )
354 ;-----------------------------------------------------------------------------
355 x264_pixel_sad_16x8_mmxext:
356     SAD_START
357     SAD_INC_2x16P
358     SAD_INC_2x16P
359     SAD_INC_2x16P
360     SAD_INC_2x16P
361     SAD_END
362
363 ALIGN 16
364 ;-----------------------------------------------------------------------------
365 ;   int __cdecl x264_pixel_sad_8x16_mmxext (uint8_t *, int, uint8_t *, int )
366 ;-----------------------------------------------------------------------------
367 x264_pixel_sad_8x16_mmxext:
368     SAD_START
369     SAD_INC_2x8P
370     SAD_INC_2x8P
371     SAD_INC_2x8P
372     SAD_INC_2x8P
373     SAD_INC_2x8P
374     SAD_INC_2x8P
375     SAD_INC_2x8P
376     SAD_INC_2x8P
377     SAD_END
378
379 ALIGN 16
380 ;-----------------------------------------------------------------------------
381 ;   int __cdecl x264_pixel_sad_8x8_mmxext (uint8_t *, int, uint8_t *, int )
382 ;-----------------------------------------------------------------------------
383 x264_pixel_sad_8x8_mmxext:
384     SAD_START
385     SAD_INC_2x8P
386     SAD_INC_2x8P
387     SAD_INC_2x8P
388     SAD_INC_2x8P
389     SAD_END
390
391 ALIGN 16
392 ;-----------------------------------------------------------------------------
393 ;   int __cdecl x264_pixel_sad_8x4_mmxext (uint8_t *, int, uint8_t *, int )
394 ;-----------------------------------------------------------------------------
395 x264_pixel_sad_8x4_mmxext:
396     SAD_START
397     SAD_INC_2x8P
398     SAD_INC_2x8P
399     SAD_END
400
401 ALIGN 16
402 ;-----------------------------------------------------------------------------
403 ;   int __cdecl x264_pixel_sad_4x8_mmxext (uint8_t *, int, uint8_t *, int )
404 ;-----------------------------------------------------------------------------
405 x264_pixel_sad_4x8_mmxext:
406     SAD_START
407     SAD_INC_2x4P
408     SAD_INC_2x4P
409     SAD_INC_2x4P
410     SAD_INC_2x4P
411     SAD_END
412
413 ALIGN 16
414 ;-----------------------------------------------------------------------------
415 ;   int __cdecl x264_pixel_sad_4x4_mmxext (uint8_t *, int, uint8_t *, int )
416 ;-----------------------------------------------------------------------------
417 x264_pixel_sad_4x4_mmxext:
418     SAD_START
419     SAD_INC_2x4P
420     SAD_INC_2x4P
421     SAD_END
422
423
424
425 %macro SSD_START 0
426     push    ebx
427
428     mov     eax,    [esp+ 8]    ; pix1
429     mov     ebx,    [esp+12]    ; stride1
430     mov     ecx,    [esp+16]    ; pix2
431     mov     edx,    [esp+20]    ; stride2
432
433     pxor    mm7,    mm7         ; zero
434     pxor    mm0,    mm0         ; mm0 holds the sum
435 %endmacro
436
437 %macro SSD_END 0
438     movq    mm1,    mm0
439     psrlq   mm1,    32
440     paddd   mm0,    mm1
441     movd    eax,    mm0
442
443     pop ebx
444     ret
445 %endmacro
446
447 ALIGN 16
448 ;-----------------------------------------------------------------------------
449 ;   int __cdecl x264_pixel_ssd_16x16_mmxext (uint8_t *, int, uint8_t *, int )
450 ;-----------------------------------------------------------------------------
451 x264_pixel_ssd_16x16_mmxext:
452     SSD_START
453     SSD_INC_8x16P
454     SSD_INC_8x16P
455     SSD_END
456
457 ALIGN 16
458 x264_pixel_ssd_16x8_mmxext:
459     SSD_START
460     SSD_INC_8x16P
461     SSD_END
462
463 ALIGN 16
464 x264_pixel_ssd_8x16_mmxext:
465     SSD_START
466     SSD_INC_4x8P
467     SSD_INC_4x8P
468     SSD_INC_4x8P
469     SSD_INC_4x8P
470     SSD_END
471
472 ALIGN 16
473 x264_pixel_ssd_8x8_mmxext:
474     SSD_START
475     SSD_INC_4x8P
476     SSD_INC_4x8P
477     SSD_END
478
479 ALIGN 16
480 x264_pixel_ssd_8x4_mmxext:
481     SSD_START
482     SSD_INC_4x8P
483     SSD_END
484
485 ALIGN 16
486 x264_pixel_ssd_4x8_mmxext:
487     SSD_START
488     SSD_INC_4x4P
489     SSD_INC_4x4P
490     SSD_END
491
492 ALIGN 16
493 x264_pixel_ssd_4x4_mmxext:
494     SSD_START
495     SSD_INC_4x4P
496     SSD_END
497
498
499
500 ALIGN 16
501 ;-----------------------------------------------------------------------------
502 ;   int __cdecl x264_pixel_satd_4x4_mmxext (uint8_t *, int, uint8_t *, int )
503 ;-----------------------------------------------------------------------------
504 x264_pixel_satd_4x4_mmxext:
505     push    ebx
506
507     mov     eax,    [esp+ 8]    ; pix1
508     mov     ebx,    [esp+12]    ; stride1
509     mov     ecx,    [esp+16]    ; pix2
510     mov     edx,    [esp+20]    ; stride2
511
512     pxor    mm7,    mm7
513
514     LOAD_DIFF_4P mm0, mm6, mm7, [eax],       [ecx]
515     LOAD_DIFF_4P mm1, mm6, mm7, [eax+ebx],   [ecx+edx]
516     LOAD_DIFF_4P mm2, mm6, mm7, [eax+2*ebx], [ecx+2*edx]
517     add eax, ebx
518     add ecx, edx
519     LOAD_DIFF_4P mm3, mm6, mm7, [eax+2*ebx], [ecx+2*edx]
520
521     HADAMARD4x4_FIRST
522
523     MMX_SUM_MM  mm0, mm7
524     pop     ebx
525     ret
526
527 ALIGN 16
528 ;-----------------------------------------------------------------------------
529 ;   int __cdecl x264_pixel_satd_4x8_mmxext (uint8_t *, int, uint8_t *, int )
530 ;-----------------------------------------------------------------------------
531 x264_pixel_satd_4x8_mmxext:
532     push    ebx
533
534     mov     eax,    [esp+ 8]    ; pix1
535     mov     ebx,    [esp+12]    ; stride1
536     mov     ecx,    [esp+16]    ; pix2
537     mov     edx,    [esp+20]    ; stride2
538
539     pxor    mm7,    mm7
540
541     LOAD_DIFF_INC_4x4 mm0, mm1, mm2, mm3, mm6, mm7, eax, ebx, ecx, edx, 0
542     HADAMARD4x4_FIRST
543
544     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 0
545     HADAMARD4x4_NEXT
546
547     MMX_SUM_MM  mm0, mm7
548     pop     ebx
549     ret
550
551 ALIGN 16
552 ;-----------------------------------------------------------------------------
553 ;   int __cdecl x264_pixel_satd_8x4_mmxext (uint8_t *, int, uint8_t *, int )
554 ;-----------------------------------------------------------------------------
555 x264_pixel_satd_8x4_mmxext:
556     push    ebx
557
558     mov     eax,    [esp+ 8]    ; pix1
559     mov     ebx,    [esp+12]    ; stride1
560     mov     ecx,    [esp+16]    ; pix2
561     mov     edx,    [esp+20]    ; stride2
562
563     pxor    mm7,    mm7
564
565     LOAD_DIFF_INC_4x4 mm0, mm1, mm2, mm3, mm6, mm7, eax, ebx, ecx, edx, 0
566     HADAMARD4x4_FIRST
567
568     mov     eax,    [esp+ 8]    ; pix1
569     mov     ecx,    [esp+16]    ; pix2
570
571     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 4
572     HADAMARD4x4_NEXT
573
574     MMX_SUM_MM  mm0, mm7
575     pop     ebx
576     ret
577
578 ALIGN 16
579 ;-----------------------------------------------------------------------------
580 ;   int __cdecl x264_pixel_satd_8x8_mmxext (uint8_t *, int, uint8_t *, int )
581 ;-----------------------------------------------------------------------------
582 x264_pixel_satd_8x8_mmxext:
583     push    ebx
584
585     mov     eax,    [esp+ 8]    ; pix1
586     mov     ebx,    [esp+12]    ; stride1
587     mov     ecx,    [esp+16]    ; pix2
588     mov     edx,    [esp+20]    ; stride2
589
590     pxor    mm7,    mm7
591
592     LOAD_DIFF_INC_4x4 mm0, mm1, mm2, mm3, mm6, mm7, eax, ebx, ecx, edx, 0
593     HADAMARD4x4_FIRST
594
595     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 0
596     HADAMARD4x4_NEXT
597
598     mov     eax,    [esp+ 8]    ; pix1
599     mov     ecx,    [esp+16]    ; pix2
600
601     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 4
602     HADAMARD4x4_NEXT
603
604     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 4
605     HADAMARD4x4_NEXT
606
607     MMX_SUM_MM  mm0, mm7
608     pop     ebx
609     ret
610
611 ALIGN 16
612 ;-----------------------------------------------------------------------------
613 ;   int __cdecl x264_pixel_satd_16x8_mmxext (uint8_t *, int, uint8_t *, int )
614 ;-----------------------------------------------------------------------------
615 x264_pixel_satd_16x8_mmxext:
616     push    ebx
617     push    ebp
618
619     mov     eax,    [esp+12]    ; pix1
620     mov     ebx,    [esp+16]    ; stride1
621     mov     ecx,    [esp+20]    ; pix2
622     mov     edx,    [esp+24]    ; stride2
623
624     pxor    mm7,    mm7
625     xor     ebp,    ebp
626
627     LOAD_DIFF_INC_4x4 mm0, mm1, mm2, mm3, mm6, mm7, eax, ebx, ecx, edx, 0
628     HADAMARD4x4_FIRST
629
630     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 0
631     HADAMARD4x4_NEXT
632
633     mov     eax,    [esp+12]    ; pix1
634     mov     ecx,    [esp+20]    ; pix2
635
636     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 4
637     HADAMARD4x4_NEXT
638
639     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 4
640     HADAMARD4x4_NEXT
641
642     MMX_SUM_MM  mm0, mm7
643     mov     ebp, eax
644
645     mov     eax,    [esp+12]    ; pix1
646     mov     ecx,    [esp+20]    ; pix2
647
648     LOAD_DIFF_INC_4x4 mm0, mm1, mm2, mm3, mm6, mm7, eax, ebx, ecx, edx, 8
649     HADAMARD4x4_FIRST
650
651     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 8
652     HADAMARD4x4_NEXT
653
654     mov     eax,    [esp+12]    ; pix1
655     mov     ecx,    [esp+20]    ; pix2
656
657     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 12
658     HADAMARD4x4_NEXT
659
660     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 12
661     HADAMARD4x4_NEXT
662
663     MMX_SUM_MM  mm0, mm7
664     add         eax, ebp
665
666     pop     ebp
667     pop     ebx
668     ret
669
670 ALIGN 16
671 ;-----------------------------------------------------------------------------
672 ;   int __cdecl x264_pixel_satd_8x16_mmxext (uint8_t *, int, uint8_t *, int )
673 ;-----------------------------------------------------------------------------
674 x264_pixel_satd_8x16_mmxext:
675     push    ebx
676     push    ebp
677
678     mov     eax,    [esp+12]    ; pix1
679     mov     ebx,    [esp+16]    ; stride1
680     mov     ecx,    [esp+20]    ; pix2
681     mov     edx,    [esp+24]    ; stride2
682
683     pxor    mm7,    mm7
684     xor     ebp,    ebp
685
686     LOAD_DIFF_INC_4x4 mm0, mm1, mm2, mm3, mm6, mm7, eax, ebx, ecx, edx, 0
687     HADAMARD4x4_FIRST
688
689     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 0
690     HADAMARD4x4_NEXT
691
692     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 0
693     HADAMARD4x4_NEXT
694
695     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 0
696     HADAMARD4x4_NEXT
697
698     MMX_SUM_MM  mm0, mm7
699     mov     ebp, eax
700
701     mov     eax,    [esp+12]    ; pix1
702     mov     ecx,    [esp+20]    ; pix2
703
704     LOAD_DIFF_INC_4x4 mm0, mm1, mm2, mm3, mm6, mm7, eax, ebx, ecx, edx, 4
705     HADAMARD4x4_FIRST
706
707     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 4
708     HADAMARD4x4_NEXT
709
710     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 4
711     HADAMARD4x4_NEXT
712
713     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 4
714     HADAMARD4x4_NEXT
715
716     MMX_SUM_MM  mm0, mm7
717     add     eax,    ebp
718
719     pop     ebp
720     pop     ebx
721     ret
722
723 ALIGN 16
724 ;-----------------------------------------------------------------------------
725 ;   int __cdecl x264_pixel_satd_16x16_mmxext (uint8_t *, int, uint8_t *, int )
726 ;-----------------------------------------------------------------------------
727 x264_pixel_satd_16x16_mmxext:
728     push    ebx
729     push    ebp
730
731     mov     eax,    [esp+12]    ; pix1
732     mov     ebx,    [esp+16]    ; stride1
733     mov     ecx,    [esp+20]    ; pix2
734     mov     edx,    [esp+24]    ; stride2
735
736     pxor    mm7,    mm7
737     xor     ebp,    ebp
738
739     LOAD_DIFF_INC_4x4 mm0, mm1, mm2, mm3, mm6, mm7, eax, ebx, ecx, edx, 0
740     HADAMARD4x4_FIRST
741
742     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 0
743     HADAMARD4x4_NEXT
744
745     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 0
746     HADAMARD4x4_NEXT
747
748     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 0
749     HADAMARD4x4_NEXT
750
751     MMX_SUM_MM  mm0, mm7
752     mov     ebp, eax
753
754     mov     eax,    [esp+12]    ; pix1
755     mov     ecx,    [esp+20]    ; pix2
756
757     LOAD_DIFF_INC_4x4 mm0, mm1, mm2, mm3, mm6, mm7, eax, ebx, ecx, edx, 4
758     HADAMARD4x4_FIRST
759
760     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 4
761     HADAMARD4x4_NEXT
762
763     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 4
764     HADAMARD4x4_NEXT
765
766     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 4
767     HADAMARD4x4_NEXT
768
769     MMX_SUM_MM  mm0, mm7
770     add     ebp,    eax
771
772     mov     eax,    [esp+12]    ; pix1
773     mov     ecx,    [esp+20]    ; pix2
774
775     LOAD_DIFF_INC_4x4 mm0, mm1, mm2, mm3, mm6, mm7, eax, ebx, ecx, edx, 8
776     HADAMARD4x4_FIRST
777
778     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 8
779     HADAMARD4x4_NEXT
780
781     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 8
782     HADAMARD4x4_NEXT
783
784     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 8
785     HADAMARD4x4_NEXT
786
787     MMX_SUM_MM  mm0, mm7
788     add     ebp,    eax
789
790     mov     eax,    [esp+12]    ; pix1
791     mov     ecx,    [esp+20]    ; pix2
792
793     LOAD_DIFF_INC_4x4 mm0, mm1, mm2, mm3, mm6, mm7, eax, ebx, ecx, edx, 12
794     HADAMARD4x4_FIRST
795
796     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 12
797     HADAMARD4x4_NEXT
798
799     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 12
800     HADAMARD4x4_NEXT
801
802     LOAD_DIFF_INC_4x4 mm1, mm2, mm3, mm4, mm6, mm7, eax, ebx, ecx, edx, 12
803     HADAMARD4x4_NEXT
804
805     MMX_SUM_MM  mm0, mm7
806     add     eax,    ebp
807
808     pop     ebp
809     pop     ebx
810     ret
811