8e3dba7b0dea405d183ee5f1c35c27bd587a29ad
[x264/x264-sandbox.git] / common / x86 / sad16-a.asm
1 ;*****************************************************************************
2 ;* sad16-a.asm: x86 high depth sad functions
3 ;*****************************************************************************
4 ;* Copyright (C) 2010-2013 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 *, intptr_t, uint16_t *, intptr_t )
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 *, intptr_t, uint16_t *, intptr_t )
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 %if 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, intptr_t 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     mov     r6, %3/2-1
412     SAD_X%1_ONE_START
413     SAD_X%1_ONE 2*FENC_STRIDE, 2*STRIDE
414     SAD_X_2xNP %1, STRIDE, 1, %2/(mmsize/2)-1
415 .loop:
416     SAD_X%1_INC_P
417     SAD_X_2xNP %1, STRIDE, 0, %2/(mmsize/2)
418     dec     r6
419     jg .loop
420 %if %1 == 4
421     mov     r6, r6m
422 %endif
423     SAD_X%1_END %2, %3
424 %endmacro
425
426 INIT_MMX mmx2
427 %define XMM_REGS 0
428 SAD_X 3, 16, 16
429 SAD_X 3, 16,  8
430 SAD_X 3,  8, 16
431 SAD_X 3,  8,  8
432 SAD_X 3,  8,  4
433 SAD_X 3,  4,  8
434 SAD_X 3,  4,  4
435 SAD_X 4, 16, 16
436 SAD_X 4, 16,  8
437 SAD_X 4,  8, 16
438 SAD_X 4,  8,  8
439 SAD_X 4,  8,  4
440 SAD_X 4,  4,  8
441 SAD_X 4,  4,  4
442 INIT_MMX ssse3
443 SAD_X 3,  4,  8
444 SAD_X 3,  4,  4
445 SAD_X 4,  4,  8
446 SAD_X 4,  4,  4
447 INIT_XMM ssse3
448 %define XMM_REGS 9
449 SAD_X 3, 16, 16
450 SAD_X 3, 16,  8
451 SAD_X 3,  8, 16
452 SAD_X 3,  8,  8
453 SAD_X 3,  8,  4
454 SAD_X 4, 16, 16
455 SAD_X 4, 16,  8
456 SAD_X 4,  8, 16
457 SAD_X 4,  8,  8
458 SAD_X 4,  8,  4
459 INIT_XMM sse2
460 %define XMM_REGS 11
461 SAD_X 3, 16, 16
462 SAD_X 3, 16,  8
463 SAD_X 3,  8, 16
464 SAD_X 3,  8,  8
465 SAD_X 3,  8,  4
466 SAD_X 4, 16, 16
467 SAD_X 4, 16,  8
468 SAD_X 4,  8, 16
469 SAD_X 4,  8,  8
470 SAD_X 4,  8,  4
471
472 ;-----------------------------------------------------------------------------
473 ; void intra_sad_x3_4x4( uint16_t *fenc, uint16_t *fdec, int res[3] );
474 ;-----------------------------------------------------------------------------
475
476 %macro INTRA_SAD_X3_4x4 0
477 cglobal intra_sad_x3_4x4, 3,3,7
478     movq      m0, [r1-1*FDEC_STRIDEB]
479     movq      m1, [r0+0*FENC_STRIDEB]
480     movq      m2, [r0+2*FENC_STRIDEB]
481     pshuflw   m6, m0, q1032
482     paddw     m6, m0
483     pshuflw   m5, m6, q2301
484     paddw     m6, m5
485     punpcklqdq m6, m6       ;A+B+C+D 8 times
486     punpcklqdq m0, m0
487     movhps    m1, [r0+1*FENC_STRIDEB]
488     movhps    m2, [r0+3*FENC_STRIDEB]
489     psubw     m3, m1, m0
490     psubw     m0, m2
491     ABSW      m3, m3, m5
492     ABSW      m0, m0, m5
493     paddw     m0, m3
494     HADDW     m0, m5
495     movd    [r2], m0 ;V prediction cost
496     movd      m3, [r1+0*FDEC_STRIDEB-4]
497     movhps    m3, [r1+1*FDEC_STRIDEB-8]
498     movd      m4, [r1+2*FDEC_STRIDEB-4]
499     movhps    m4, [r1+3*FDEC_STRIDEB-8]
500     pshufhw   m3, m3, q3333
501     pshufhw   m4, m4, q3333
502     pshuflw   m3, m3, q1111 ; FF FF EE EE
503     pshuflw   m4, m4, q1111 ; HH HH GG GG
504     paddw     m5, m3, m4
505     pshufd    m0, m5, q1032
506     paddw     m5, m6
507     paddw     m5, m0
508     paddw     m5, [pw_4]
509     psrlw     m5, 3
510     psubw     m6, m5, m2
511     psubw     m5, m1
512     psubw     m1, m3
513     psubw     m2, m4
514     ABSW      m5, m5, m0
515     ABSW      m6, m6, m0
516     ABSW      m1, m1, m0
517     ABSW      m2, m2, m0
518     paddw     m5, m6
519     paddw     m1, m2
520     HADDW     m5, m0
521     HADDW     m1, m2
522     movd  [r2+8], m5        ;DC prediction cost
523     movd  [r2+4], m1        ;H prediction cost
524     RET
525 %endmacro
526
527 INIT_XMM sse2
528 INTRA_SAD_X3_4x4
529 INIT_XMM ssse3
530 INTRA_SAD_X3_4x4
531 INIT_XMM avx
532 INTRA_SAD_X3_4x4
533
534 ;-----------------------------------------------------------------------------
535 ; void intra_sad_x3_8x8( pixel *fenc, pixel edge[36], int res[3] );
536 ;-----------------------------------------------------------------------------
537
538 ;m0 = DC
539 ;m6 = V
540 ;m7 = H
541 ;m1 = DC score
542 ;m2 = V score
543 ;m3 = H score
544 ;m5 = temp
545 ;m4 = pixel row
546
547 %macro INTRA_SAD_HVDC_ITER 2
548     mova        m4, [r0+(%1-4)*FENC_STRIDEB]
549     psubw       m4, m0
550     ABSW        m4, m4, m5
551     ACCUM    paddw, 1, 4, %1
552     mova        m4, [r0+(%1-4)*FENC_STRIDEB]
553     psubw       m4, m6
554     ABSW        m4, m4, m5
555     ACCUM    paddw, 2, 4, %1
556     pshufd      m5, m7, %2
557     psubw       m5, [r0+(%1-4)*FENC_STRIDEB]
558     ABSW        m5, m5, m4
559     ACCUM    paddw, 3, 5, %1
560 %endmacro
561
562 %macro INTRA_SAD_X3_8x8 0
563 cglobal intra_sad_x3_8x8, 3,3,8
564     add         r0, 4*FENC_STRIDEB
565     movu        m0, [r1+7*SIZEOF_PIXEL]
566     mova        m6, [r1+16*SIZEOF_PIXEL] ;V prediction
567     mova        m7, m0
568     paddw       m0, m6
569     punpckhwd   m7, m7
570     HADDW       m0, m4
571     paddw       m0, [pw_8]
572     psrlw       m0, 4
573     SPLATW      m0, m0
574     INTRA_SAD_HVDC_ITER 0, q3333
575     INTRA_SAD_HVDC_ITER 1, q2222
576     INTRA_SAD_HVDC_ITER 2, q1111
577     INTRA_SAD_HVDC_ITER 3, q0000
578     movq        m7, [r1+7*SIZEOF_PIXEL]
579     punpcklwd   m7, m7
580     INTRA_SAD_HVDC_ITER 4, q3333
581     INTRA_SAD_HVDC_ITER 5, q2222
582     INTRA_SAD_HVDC_ITER 6, q1111
583     INTRA_SAD_HVDC_ITER 7, q0000
584     HADDW       m2, m4
585     HADDW       m3, m4
586     HADDW       m1, m4
587     movd    [r2+0], m2
588     movd    [r2+4], m3
589     movd    [r2+8], m1
590     RET
591 %endmacro
592
593 INIT_XMM sse2
594 INTRA_SAD_X3_8x8
595 INIT_XMM ssse3
596 INTRA_SAD_X3_8x8