]> git.sesse.net Git - x264/blob - common/x86/sad16-a.asm
Bump dates to 2012
[x264] / common / x86 / sad16-a.asm
1 ;*****************************************************************************
2 ;* sad16-a.asm: x86 high depth sad functions
3 ;*****************************************************************************
4 ;* Copyright (C) 2010-2012 x264 project
5 ;*
6 ;* Authors: Oskar Arvidsson <oskar@irock.se>
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., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
21 ;*
22 ;* This program is also available under a commercial proprietary license.
23 ;* For more information, contact us at licensing@x264.com.
24 ;*****************************************************************************
25
26 %include "x86inc.asm"
27 %include "x86util.asm"
28
29 SECTION .text
30
31 cextern pw_1
32 cextern pw_4
33 cextern pw_8
34
35 ;=============================================================================
36 ; SAD MMX
37 ;=============================================================================
38
39 %macro SAD_INC_1x16P_MMX 0
40     movu    m1, [r0+ 0]
41     movu    m2, [r0+ 8]
42     movu    m3, [r0+16]
43     movu    m4, [r0+24]
44     psubw   m1, [r2+ 0]
45     psubw   m2, [r2+ 8]
46     psubw   m3, [r2+16]
47     psubw   m4, [r2+24]
48     ABSW2   m1, m2, m1, m2, m5, m6
49     ABSW2   m3, m4, m3, m4, m7, m5
50     lea     r0, [r0+2*r1]
51     lea     r2, [r2+2*r3]
52     paddw   m1, m2
53     paddw   m3, m4
54     paddw   m0, m1
55     paddw   m0, m3
56 %endmacro
57
58 %macro SAD_INC_2x8P_MMX 0
59     movu    m1, [r0+0]
60     movu    m2, [r0+8]
61     movu    m3, [r0+2*r1+0]
62     movu    m4, [r0+2*r1+8]
63     psubw   m1, [r2+0]
64     psubw   m2, [r2+8]
65     psubw   m3, [r2+2*r3+0]
66     psubw   m4, [r2+2*r3+8]
67     ABSW2   m1, m2, m1, m2, m5, m6
68     ABSW2   m3, m4, m3, m4, m7, m5
69     lea     r0, [r0+4*r1]
70     lea     r2, [r2+4*r3]
71     paddw   m1, m2
72     paddw   m3, m4
73     paddw   m0, m1
74     paddw   m0, m3
75 %endmacro
76
77 %macro SAD_INC_2x4P_MMX 0
78     movu    m1, [r0]
79     movu    m2, [r0+2*r1]
80     psubw   m1, [r2]
81     psubw   m2, [r2+2*r3]
82     ABSW2   m1, m2, m1, m2, m3, m4
83     lea     r0, [r0+4*r1]
84     lea     r2, [r2+4*r3]
85     paddw   m0, m1
86     paddw   m0, m2
87 %endmacro
88
89 ;-----------------------------------------------------------------------------
90 ; int pixel_sad_NxM( uint16_t *, int, uint16_t *, int )
91 ;-----------------------------------------------------------------------------
92 %macro SAD_MMX 3
93 cglobal pixel_sad_%1x%2, 4,4
94     pxor    m0, m0
95 %rep %2/%3
96     SAD_INC_%3x%1P_MMX
97 %endrep
98 %if %1*%2 == 256
99     HADDUW  m0, m1
100 %else
101     HADDW   m0, m1
102 %endif
103     movd   eax, m0
104     RET
105 %endmacro
106
107 INIT_MMX mmx2
108 SAD_MMX 16, 16, 1
109 SAD_MMX 16,  8, 1
110 SAD_MMX  8, 16, 2
111 SAD_MMX  8,  8, 2
112 SAD_MMX  8,  4, 2
113 SAD_MMX  4,  8, 2
114 SAD_MMX  4,  4, 2
115 INIT_MMX ssse3
116 SAD_MMX  4,  8, 2
117 SAD_MMX  4,  4, 2
118
119 ;=============================================================================
120 ; SAD XMM
121 ;=============================================================================
122
123 %macro SAD_INC_2x16P_XMM 0
124     movu    m1, [r2+ 0]
125     movu    m2, [r2+16]
126     movu    m3, [r2+2*r3+ 0]
127     movu    m4, [r2+2*r3+16]
128     psubw   m1, [r0+ 0]
129     psubw   m2, [r0+16]
130     psubw   m3, [r0+2*r1+ 0]
131     psubw   m4, [r0+2*r1+16]
132     ABSW2   m1, m2, m1, m2, m5, m6
133     lea     r0, [r0+4*r1]
134     lea     r2, [r2+4*r3]
135     ABSW2   m3, m4, m3, m4, m7, m5
136     paddw   m1, m2
137     paddw   m3, m4
138     paddw   m0, m1
139     paddw   m0, m3
140 %endmacro
141
142 %macro SAD_INC_2x8P_XMM 0
143     movu    m1, [r2]
144     movu    m2, [r2+2*r3]
145     psubw   m1, [r0]
146     psubw   m2, [r0+2*r1]
147     ABSW2   m1, m2, m1, m2, m3, m4
148     lea     r0, [r0+4*r1]
149     lea     r2, [r2+4*r3]
150     paddw   m0, m1
151     paddw   m0, m2
152 %endmacro
153
154 ;-----------------------------------------------------------------------------
155 ; int pixel_sad_NxM( uint16_t *, int, uint16_t *, int )
156 ;-----------------------------------------------------------------------------
157 %macro SAD_XMM 2
158 cglobal pixel_sad_%1x%2, 4,4,8
159     pxor    m0, m0
160 %rep %2/2
161     SAD_INC_2x%1P_XMM
162 %endrep
163     HADDW   m0, m1
164     movd   eax, m0
165     RET
166 %endmacro
167
168 INIT_XMM sse2
169 SAD_XMM 16, 16
170 SAD_XMM 16,  8
171 SAD_XMM  8, 16
172 SAD_XMM  8,  8
173 SAD_XMM  8,  4
174 INIT_XMM sse2, aligned
175 SAD_XMM 16, 16
176 SAD_XMM 16,  8
177 SAD_XMM  8, 16
178 SAD_XMM  8,  8
179 INIT_XMM ssse3
180 SAD_XMM 16, 16
181 SAD_XMM 16,  8
182 SAD_XMM  8, 16
183 SAD_XMM  8,  8
184 SAD_XMM  8,  4
185 INIT_XMM ssse3, aligned
186 SAD_XMM 16, 16
187 SAD_XMM 16,  8
188 SAD_XMM  8, 16
189 SAD_XMM  8,  8
190
191 ;=============================================================================
192 ; SAD x3/x4
193 ;=============================================================================
194
195 %macro SAD_X3_INC_P 0
196     add     r0, 4*FENC_STRIDE
197     lea     r1, [r1+4*r4]
198     lea     r2, [r2+4*r4]
199     lea     r3, [r3+4*r4]
200 %endmacro
201
202 %macro SAD_X3_ONE_START 0
203     mova    m3, [r0]
204     movu    m0, [r1]
205     movu    m1, [r2]
206     movu    m2, [r3]
207     psubw   m0, m3
208     psubw   m1, m3
209     psubw   m2, m3
210     ABSW2   m0, m1, m0, m1, m4, m5
211     ABSW    m2, m2, m6
212 %endmacro
213
214 %macro SAD_X3_ONE 2
215     mova    m6, [r0+%1]
216     movu    m3, [r1+%2]
217     movu    m4, [r2+%2]
218     movu    m5, [r3+%2]
219     psubw   m3, m6
220     psubw   m4, m6
221     psubw   m5, m6
222     ABSW2   m3, m4, m3, m4, m7, m6
223     ABSW    m5, m5, m6
224     paddw   m0, m3
225     paddw   m1, m4
226     paddw   m2, m5
227 %endmacro
228
229 %macro SAD_X3_END 2
230 %if mmsize == 8 && %1*%2 == 256
231     HADDUW   m0, m3
232     HADDUW   m1, m4
233     HADDUW   m2, m5
234 %else
235     HADDW    m0, m3
236     HADDW    m1, m4
237     HADDW    m2, m5
238 %endif
239 %ifdef UNIX64
240     movd [r5+0], m0
241     movd [r5+4], m1
242     movd [r5+8], m2
243 %else
244     mov      r0, r5mp
245     movd [r0+0], m0
246     movd [r0+4], m1
247     movd [r0+8], m2
248 %endif
249     RET
250 %endmacro
251
252 %macro SAD_X4_INC_P 0
253     add     r0, 4*FENC_STRIDE
254     lea     r1, [r1+4*r5]
255     lea     r2, [r2+4*r5]
256     lea     r3, [r3+4*r5]
257     lea     r4, [r4+4*r5]
258 %endmacro
259
260 %macro SAD_X4_ONE_START 0
261     mova    m4, [r0]
262     movu    m0, [r1]
263     movu    m1, [r2]
264     movu    m2, [r3]
265     movu    m3, [r4]
266     psubw   m0, m4
267     psubw   m1, m4
268     psubw   m2, m4
269     psubw   m3, m4
270     ABSW2   m0, m1, m0, m1, m5, m6
271     ABSW2   m2, m3, m2, m3, m4, m7
272 %endmacro
273
274 %macro SAD_X4_ONE 2
275     mova    m4, [r0+%1]
276     movu    m5, [r1+%2]
277     movu    m6, [r2+%2]
278 %if num_mmregs > 8
279     movu    m7, [r3+%2]
280     movu    m8, [r4+%2]
281     psubw   m5, m4
282     psubw   m6, m4
283     psubw   m7, m4
284     psubw   m8, m4
285     ABSW2   m5, m6, m5, m6, m9, m10
286     ABSW2   m7, m8, m7, m8, m9, m10
287     paddw   m0, m5
288     paddw   m1, m6
289     paddw   m2, m7
290     paddw   m3, m8
291 %elif cpuflag(ssse3)
292     movu    m7, [r3+%2]
293     psubw   m5, m4
294     psubw   m6, m4
295     psubw   m7, m4
296     movu    m4, [r4+%2]
297     pabsw   m5, m5
298     psubw   m4, [r0+%1]
299     pabsw   m6, m6
300     pabsw   m7, m7
301     pabsw   m4, m4
302     paddw   m0, m5
303     paddw   m1, m6
304     paddw   m2, m7
305     paddw   m3, m4
306 %else ; num_mmregs == 8 && !ssse3
307     psubw   m5, m4
308     psubw   m6, m4
309     ABSW    m5, m5, m7
310     ABSW    m6, m6, m7
311     paddw   m0, m5
312     paddw   m1, m6
313     movu    m5, [r3+%2]
314     movu    m6, [r4+%2]
315     psubw   m5, m4
316     psubw   m6, m4
317     ABSW2   m5, m6, m5, m6, m7, m4
318     paddw   m2, m5
319     paddw   m3, m6
320 %endif
321 %endmacro
322
323 %macro SAD_X4_END 2
324 %if mmsize == 8 && %1*%2 == 256
325     HADDUW    m0, m4
326     HADDUW    m1, m5
327     HADDUW    m2, m6
328     HADDUW    m3, m7
329 %else
330     HADDW     m0, m4
331     HADDW     m1, m5
332     HADDW     m2, m6
333     HADDW     m3, m7
334 %endif
335     mov       r0, r6mp
336     movd [r0+ 0], m0
337     movd [r0+ 4], m1
338     movd [r0+ 8], m2
339     movd [r0+12], m3
340     RET
341 %endmacro
342
343 %macro SAD_X_2xNP 4
344     %assign x %3
345 %rep %4
346     SAD_X%1_ONE x*mmsize, x*mmsize
347     SAD_X%1_ONE 2*FENC_STRIDE+x*mmsize, 2*%2+x*mmsize
348     %assign x x+1
349 %endrep
350 %endmacro
351
352 %macro PIXEL_VSAD 0
353 cglobal pixel_vsad, 3,3,8
354     mova      m0, [r0]
355     mova      m1, [r0+16]
356     mova      m2, [r0+2*r1]
357     mova      m3, [r0+2*r1+16]
358     lea       r0, [r0+4*r1]
359     psubw     m0, m2
360     psubw     m1, m3
361     ABSW2     m0, m1, m0, m1, m4, m5
362     paddw     m0, m1
363     sub      r2d, 2
364     je .end
365 .loop:
366     mova      m4, [r0]
367     mova      m5, [r0+16]
368     mova      m6, [r0+2*r1]
369     mova      m7, [r0+2*r1+16]
370     lea       r0, [r0+4*r1]
371     psubw     m2, m4
372     psubw     m3, m5
373     psubw     m4, m6
374     psubw     m5, m7
375     ABSW      m2, m2, m1
376     ABSW      m3, m3, m1
377     ABSW      m4, m4, m1
378     ABSW      m5, m5, m1
379     paddw     m0, m2
380     paddw     m0, m3
381     paddw     m0, m4
382     paddw     m0, m5
383     mova      m2, m6
384     mova      m3, m7
385     sub r2d, 2
386     jg .loop
387 .end:
388 %if BIT_DEPTH == 9
389     HADDW     m0, m1 ; max sum: 62(pixel diffs)*511(pixel_max)=31682
390 %else
391     HADDUW    m0, m1 ; max sum: 62(pixel diffs)*1023(pixel_max)=63426
392 %endif
393     movd     eax, m0
394     RET
395 %endmacro
396 INIT_XMM sse2
397 PIXEL_VSAD
398 INIT_XMM ssse3
399 PIXEL_VSAD
400 INIT_XMM xop
401 PIXEL_VSAD
402
403 ;-----------------------------------------------------------------------------
404 ; void pixel_sad_xK_MxN( uint16_t *fenc, uint16_t *pix0, uint16_t *pix1,
405 ;                        uint16_t *pix2, int i_stride, int scores[3] )
406 ;-----------------------------------------------------------------------------
407 %macro SAD_X 3
408 cglobal pixel_sad_x%1_%2x%3, 6,7,XMM_REGS
409     %assign regnum %1+1
410     %xdefine STRIDE r %+ regnum
411 %ifdef WIN64
412     movsxd STRIDE, STRIDE %+ d
413 %endif
414     mov     r6, %3/2-1
415     SAD_X%1_ONE_START
416     SAD_X%1_ONE 2*FENC_STRIDE, 2*STRIDE
417     SAD_X_2xNP %1, STRIDE, 1, %2/(mmsize/2)-1
418 .loop:
419     SAD_X%1_INC_P
420     SAD_X_2xNP %1, STRIDE, 0, %2/(mmsize/2)
421     dec     r6
422     jg .loop
423 %if %1 == 4
424     mov     r6, r6m
425 %endif
426     SAD_X%1_END %2, %3
427 %endmacro
428
429 INIT_MMX mmx2
430 %define XMM_REGS 0
431 SAD_X 3, 16, 16
432 SAD_X 3, 16,  8
433 SAD_X 3,  8, 16
434 SAD_X 3,  8,  8
435 SAD_X 3,  8,  4
436 SAD_X 3,  4,  8
437 SAD_X 3,  4,  4
438 SAD_X 4, 16, 16
439 SAD_X 4, 16,  8
440 SAD_X 4,  8, 16
441 SAD_X 4,  8,  8
442 SAD_X 4,  8,  4
443 SAD_X 4,  4,  8
444 SAD_X 4,  4,  4
445 INIT_MMX ssse3
446 SAD_X 3,  4,  8
447 SAD_X 3,  4,  4
448 SAD_X 4,  4,  8
449 SAD_X 4,  4,  4
450 INIT_XMM ssse3
451 %define XMM_REGS 9
452 SAD_X 3, 16, 16
453 SAD_X 3, 16,  8
454 SAD_X 3,  8, 16
455 SAD_X 3,  8,  8
456 SAD_X 3,  8,  4
457 SAD_X 4, 16, 16
458 SAD_X 4, 16,  8
459 SAD_X 4,  8, 16
460 SAD_X 4,  8,  8
461 SAD_X 4,  8,  4
462 INIT_XMM sse2
463 %define XMM_REGS 11
464 SAD_X 3, 16, 16
465 SAD_X 3, 16,  8
466 SAD_X 3,  8, 16
467 SAD_X 3,  8,  8
468 SAD_X 3,  8,  4
469 SAD_X 4, 16, 16
470 SAD_X 4, 16,  8
471 SAD_X 4,  8, 16
472 SAD_X 4,  8,  8
473 SAD_X 4,  8,  4
474
475 ;-----------------------------------------------------------------------------
476 ; void intra_sad_x3_4x4( uint16_t *fenc, uint16_t *fdec, int res[3] );
477 ;-----------------------------------------------------------------------------
478
479 %macro INTRA_SAD_X3_4x4 0
480 cglobal intra_sad_x3_4x4, 3,3,7
481     movq      m0, [r1-1*FDEC_STRIDEB]
482     movq      m1, [r0+0*FENC_STRIDEB]
483     movq      m2, [r0+2*FENC_STRIDEB]
484     pshuflw   m6, m0, q1032
485     paddw     m6, m0
486     pshuflw   m5, m6, q2301
487     paddw     m6, m5
488     punpcklqdq m6, m6       ;A+B+C+D 8 times
489     punpcklqdq m0, m0
490     movhps    m1, [r0+1*FENC_STRIDEB]
491     movhps    m2, [r0+3*FENC_STRIDEB]
492     psubw     m3, m1, m0
493     psubw     m0, m2
494     ABSW      m3, m3, m5
495     ABSW      m0, m0, m5
496     paddw     m0, m3
497     HADDW     m0, m5
498     movd    [r2], m0 ;V prediction cost
499     movd      m3, [r1+0*FDEC_STRIDEB-4]
500     movhps    m3, [r1+1*FDEC_STRIDEB-8]
501     movd      m4, [r1+2*FDEC_STRIDEB-4]
502     movhps    m4, [r1+3*FDEC_STRIDEB-8]
503     pshufhw   m3, m3, q3333
504     pshufhw   m4, m4, q3333
505     pshuflw   m3, m3, q1111 ; FF FF EE EE
506     pshuflw   m4, m4, q1111 ; HH HH GG GG
507     paddw     m5, m3, m4
508     pshufd    m0, m5, q1032
509     paddw     m5, m6
510     paddw     m5, m0
511     paddw     m5, [pw_4]
512     psrlw     m5, 3
513     psubw     m6, m5, m2
514     psubw     m5, m1
515     psubw     m1, m3
516     psubw     m2, m4
517     ABSW      m5, m5, m0
518     ABSW      m6, m6, m0
519     ABSW      m1, m1, m0
520     ABSW      m2, m2, m0
521     paddw     m5, m6
522     paddw     m1, m2
523     HADDW     m5, m0
524     HADDW     m1, m2
525     movd  [r2+8], m5        ;DC prediction cost
526     movd  [r2+4], m1        ;H prediction cost
527     RET
528 %endmacro
529
530 INIT_XMM sse2
531 INTRA_SAD_X3_4x4
532 INIT_XMM ssse3
533 INTRA_SAD_X3_4x4
534 INIT_XMM avx
535 INTRA_SAD_X3_4x4
536
537 ;-----------------------------------------------------------------------------
538 ; void intra_sad_x3_8x8( pixel *fenc, pixel edge[36], int res[3] );
539 ;-----------------------------------------------------------------------------
540
541 ;m0 = DC
542 ;m6 = V
543 ;m7 = H
544 ;m1 = DC score
545 ;m2 = V score
546 ;m3 = H score
547 ;m5 = temp
548 ;m4 = pixel row
549
550 %macro INTRA_SAD_HVDC_ITER 2
551     mova        m4, [r0+(%1-4)*FENC_STRIDEB]
552     psubw       m4, m0
553     ABSW        m4, m4, m5
554     ACCUM    paddw, 1, 4, %1
555     mova        m4, [r0+(%1-4)*FENC_STRIDEB]
556     psubw       m4, m6
557     ABSW        m4, m4, m5
558     ACCUM    paddw, 2, 4, %1
559     pshufd      m5, m7, %2
560     psubw       m5, [r0+(%1-4)*FENC_STRIDEB]
561     ABSW        m5, m5, m4
562     ACCUM    paddw, 3, 5, %1
563 %endmacro
564
565 %macro INTRA_SAD_X3_8x8 0
566 cglobal intra_sad_x3_8x8, 3,3,8
567     add         r0, 4*FENC_STRIDEB
568     movu        m0, [r1+7*SIZEOF_PIXEL]
569     mova        m6, [r1+16*SIZEOF_PIXEL] ;V prediction
570     mova        m7, m0
571     paddw       m0, m6
572     punpckhwd   m7, m7
573     HADDW       m0, m4
574     paddw       m0, [pw_8]
575     psrlw       m0, 4
576     SPLATW      m0, m0
577     INTRA_SAD_HVDC_ITER 0, q3333
578     INTRA_SAD_HVDC_ITER 1, q2222
579     INTRA_SAD_HVDC_ITER 2, q1111
580     INTRA_SAD_HVDC_ITER 3, q0000
581     movq        m7, [r1+7*SIZEOF_PIXEL]
582     punpcklwd   m7, m7
583     INTRA_SAD_HVDC_ITER 4, q3333
584     INTRA_SAD_HVDC_ITER 5, q2222
585     INTRA_SAD_HVDC_ITER 6, q1111
586     INTRA_SAD_HVDC_ITER 7, q0000
587     HADDW       m2, m4
588     HADDW       m3, m4
589     HADDW       m1, m4
590     movd    [r2+0], m2
591     movd    [r2+4], m3
592     movd    [r2+8], m1
593     RET
594 %endmacro
595
596 INIT_XMM sse2
597 INTRA_SAD_X3_8x8
598 INIT_XMM ssse3
599 INTRA_SAD_X3_8x8