]> git.sesse.net Git - x264/blob - common/x86/sad16-a.asm
50389651db08fe8db7f0bddc0767ae08cd455f1d
[x264] / common / x86 / sad16-a.asm
1 ;*****************************************************************************
2 ;* sad16-a.asm: x86 high depth sad functions
3 ;*****************************************************************************
4 ;* Copyright (C) 2010-2011 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
33 ;=============================================================================
34 ; SAD MMX
35 ;=============================================================================
36
37 %macro SAD_INC_1x16P_MMX 0
38     movu    m1, [r0+ 0]
39     movu    m2, [r0+ 8]
40     movu    m3, [r0+16]
41     movu    m4, [r0+24]
42     psubw   m1, [r2+ 0]
43     psubw   m2, [r2+ 8]
44     psubw   m3, [r2+16]
45     psubw   m4, [r2+24]
46     ABSW2   m1, m2, m1, m2, m5, m6
47     ABSW2   m3, m4, m3, m4, m7, m5
48     lea     r0, [r0+2*r1]
49     lea     r2, [r2+2*r3]
50     paddw   m1, m2
51     paddw   m3, m4
52     paddw   m0, m1
53     paddw   m0, m3
54 %endmacro
55
56 %macro SAD_INC_2x8P_MMX 0
57     movu    m1, [r0+0]
58     movu    m2, [r0+8]
59     movu    m3, [r0+2*r1+0]
60     movu    m4, [r0+2*r1+8]
61     psubw   m1, [r2+0]
62     psubw   m2, [r2+8]
63     psubw   m3, [r2+2*r3+0]
64     psubw   m4, [r2+2*r3+8]
65     ABSW2   m1, m2, m1, m2, m5, m6
66     ABSW2   m3, m4, m3, m4, m7, m5
67     lea     r0, [r0+4*r1]
68     lea     r2, [r2+4*r3]
69     paddw   m1, m2
70     paddw   m3, m4
71     paddw   m0, m1
72     paddw   m0, m3
73 %endmacro
74
75 %macro SAD_INC_2x4P_MMX 0
76     movu    m1, [r0]
77     movu    m2, [r0+2*r1]
78     psubw   m1, [r2]
79     psubw   m2, [r2+2*r3]
80     ABSW2   m1, m2, m1, m2, m3, m4
81     lea     r0, [r0+4*r1]
82     lea     r2, [r2+4*r3]
83     paddw   m0, m1
84     paddw   m0, m2
85 %endmacro
86
87 ;-----------------------------------------------------------------------------
88 ; int pixel_sad_NxM( uint16_t *, int, uint16_t *, int )
89 ;-----------------------------------------------------------------------------
90 %macro SAD_MMX 3
91 cglobal pixel_sad_%1x%2, 4,4
92     pxor    m0, m0
93 %rep %2/%3
94     SAD_INC_%3x%1P_MMX
95 %endrep
96 %if %1*%2 == 256
97     HADDUW  m0, m1
98 %else
99     HADDW   m0, m1
100 %endif
101     movd   eax, m0
102     RET
103 %endmacro
104
105 INIT_MMX mmx2
106 SAD_MMX 16, 16, 1
107 SAD_MMX 16,  8, 1
108 SAD_MMX  8, 16, 2
109 SAD_MMX  8,  8, 2
110 SAD_MMX  8,  4, 2
111 SAD_MMX  4,  8, 2
112 SAD_MMX  4,  4, 2
113 INIT_MMX ssse3
114 SAD_MMX  4,  8, 2
115 SAD_MMX  4,  4, 2
116
117 ;=============================================================================
118 ; SAD XMM
119 ;=============================================================================
120
121 %macro SAD_INC_2x16P_XMM 0
122     movu    m1, [r2+ 0]
123     movu    m2, [r2+16]
124     movu    m3, [r2+2*r3+ 0]
125     movu    m4, [r2+2*r3+16]
126     psubw   m1, [r0+ 0]
127     psubw   m2, [r0+16]
128     psubw   m3, [r0+2*r1+ 0]
129     psubw   m4, [r0+2*r1+16]
130     ABSW2   m1, m2, m1, m2, m5, m6
131     lea     r0, [r0+4*r1]
132     lea     r2, [r2+4*r3]
133     ABSW2   m3, m4, m3, m4, m7, m5
134     paddw   m1, m2
135     paddw   m3, m4
136     paddw   m0, m1
137     paddw   m0, m3
138 %endmacro
139
140 %macro SAD_INC_2x8P_XMM 0
141     movu    m1, [r2]
142     movu    m2, [r2+2*r3]
143     psubw   m1, [r0]
144     psubw   m2, [r0+2*r1]
145     ABSW2   m1, m2, m1, m2, m3, m4
146     lea     r0, [r0+4*r1]
147     lea     r2, [r2+4*r3]
148     paddw   m0, m1
149     paddw   m0, m2
150 %endmacro
151
152 ;-----------------------------------------------------------------------------
153 ; int pixel_sad_NxM( uint16_t *, int, uint16_t *, int )
154 ;-----------------------------------------------------------------------------
155 %macro SAD_XMM 2
156 cglobal pixel_sad_%1x%2, 4,4,8
157     pxor    m0, m0
158 %rep %2/2
159     SAD_INC_2x%1P_XMM
160 %endrep
161     HADDW   m0, m1
162     movd   eax, m0
163     RET
164 %endmacro
165
166 INIT_XMM sse2
167 SAD_XMM 16, 16
168 SAD_XMM 16,  8
169 SAD_XMM  8, 16
170 SAD_XMM  8,  8
171 SAD_XMM  8,  4
172 INIT_XMM sse2, aligned
173 SAD_XMM 16, 16
174 SAD_XMM 16,  8
175 SAD_XMM  8, 16
176 SAD_XMM  8,  8
177 INIT_XMM ssse3
178 SAD_XMM 16, 16
179 SAD_XMM 16,  8
180 SAD_XMM  8, 16
181 SAD_XMM  8,  8
182 SAD_XMM  8,  4
183 INIT_XMM ssse3, aligned
184 SAD_XMM 16, 16
185 SAD_XMM 16,  8
186 SAD_XMM  8, 16
187 SAD_XMM  8,  8
188
189 ;=============================================================================
190 ; SAD x3/x4
191 ;=============================================================================
192
193 %macro SAD_X3_INC_P 0
194     add     r0, 4*FENC_STRIDE
195     lea     r1, [r1+4*r4]
196     lea     r2, [r2+4*r4]
197     lea     r3, [r3+4*r4]
198 %endmacro
199
200 %macro SAD_X3_ONE_START 0
201     mova    m3, [r0]
202     movu    m0, [r1]
203     movu    m1, [r2]
204     movu    m2, [r3]
205     psubw   m0, m3
206     psubw   m1, m3
207     psubw   m2, m3
208     ABSW2   m0, m1, m0, m1, m4, m5
209     ABSW    m2, m2, m6
210 %endmacro
211
212 %macro SAD_X3_ONE 2
213     mova    m6, [r0+%1]
214     movu    m3, [r1+%2]
215     movu    m4, [r2+%2]
216     movu    m5, [r3+%2]
217     psubw   m3, m6
218     psubw   m4, m6
219     psubw   m5, m6
220     ABSW2   m3, m4, m3, m4, m7, m6
221     ABSW    m5, m5, m6
222     paddw   m0, m3
223     paddw   m1, m4
224     paddw   m2, m5
225 %endmacro
226
227 %macro SAD_X3_END 2
228 %if mmsize == 8 && %1*%2 == 256
229     HADDUW   m0, m3
230     HADDUW   m1, m4
231     HADDUW   m2, m5
232 %else
233     HADDW    m0, m3
234     HADDW    m1, m4
235     HADDW    m2, m5
236 %endif
237 %ifdef UNIX64
238     movd [r5+0], m0
239     movd [r5+4], m1
240     movd [r5+8], m2
241 %else
242     mov      r0, r5mp
243     movd [r0+0], m0
244     movd [r0+4], m1
245     movd [r0+8], m2
246 %endif
247     RET
248 %endmacro
249
250 %macro SAD_X4_INC_P 0
251     add     r0, 4*FENC_STRIDE
252     lea     r1, [r1+4*r5]
253     lea     r2, [r2+4*r5]
254     lea     r3, [r3+4*r5]
255     lea     r4, [r4+4*r5]
256 %endmacro
257
258 %macro SAD_X4_ONE_START 0
259     mova    m4, [r0]
260     movu    m0, [r1]
261     movu    m1, [r2]
262     movu    m2, [r3]
263     movu    m3, [r4]
264     psubw   m0, m4
265     psubw   m1, m4
266     psubw   m2, m4
267     psubw   m3, m4
268     ABSW2   m0, m1, m0, m1, m5, m6
269     ABSW2   m2, m3, m2, m3, m4, m7
270 %endmacro
271
272 %macro SAD_X4_ONE 2
273     mova    m4, [r0+%1]
274     movu    m5, [r1+%2]
275     movu    m6, [r2+%2]
276 %if num_mmregs > 8
277     movu    m7, [r3+%2]
278     movu    m8, [r4+%2]
279     psubw   m5, m4
280     psubw   m6, m4
281     psubw   m7, m4
282     psubw   m8, m4
283     ABSW2   m5, m6, m5, m6, m9, m10
284     ABSW2   m7, m8, m7, m8, m9, m10
285     paddw   m0, m5
286     paddw   m1, m6
287     paddw   m2, m7
288     paddw   m3, m8
289 %elif cpuflag(ssse3)
290     movu    m7, [r3+%2]
291     psubw   m5, m4
292     psubw   m6, m4
293     psubw   m7, m4
294     movu    m4, [r4+%2]
295     pabsw   m5, m5
296     psubw   m4, [r0+%1]
297     pabsw   m6, m6
298     pabsw   m7, m7
299     pabsw   m4, m4
300     paddw   m0, m5
301     paddw   m1, m6
302     paddw   m2, m7
303     paddw   m3, m4
304 %else ; num_mmregs == 8 && !ssse3
305     psubw   m5, m4
306     psubw   m6, m4
307     ABSW    m5, m5, m7
308     ABSW    m6, m6, m7
309     paddw   m0, m5
310     paddw   m1, m6
311     movu    m5, [r3+%2]
312     movu    m6, [r4+%2]
313     psubw   m5, m4
314     psubw   m6, m4
315     ABSW2   m5, m6, m5, m6, m7, m4
316     paddw   m2, m5
317     paddw   m3, m6
318 %endif
319 %endmacro
320
321 %macro SAD_X4_END 2
322 %if mmsize == 8 && %1*%2 == 256
323     HADDUW    m0, m4
324     HADDUW    m1, m5
325     HADDUW    m2, m6
326     HADDUW    m3, m7
327 %else
328     HADDW     m0, m4
329     HADDW     m1, m5
330     HADDW     m2, m6
331     HADDW     m3, m7
332 %endif
333     mov       r0, r6mp
334     movd [r0+ 0], m0
335     movd [r0+ 4], m1
336     movd [r0+ 8], m2
337     movd [r0+12], m3
338     RET
339 %endmacro
340
341 %macro SAD_X_2xNP 4
342     %assign x %3
343 %rep %4
344     SAD_X%1_ONE x*mmsize, x*mmsize
345     SAD_X%1_ONE 2*FENC_STRIDE+x*mmsize, 2*%2+x*mmsize
346     %assign x x+1
347 %endrep
348 %endmacro
349
350 %macro PIXEL_VSAD 0
351 cglobal pixel_vsad, 3,3,8
352     mova      m0, [r0]
353     mova      m1, [r0+16]
354     mova      m2, [r0+2*r1]
355     mova      m3, [r0+2*r1+16]
356     lea       r0, [r0+4*r1]
357     psubw     m0, m2
358     psubw     m1, m3
359     ABSW2     m0, m1, m0, m1, m4, m5
360     paddw     m0, m1
361     sub      r2d, 2
362     je .end
363 .loop:
364     mova      m4, [r0]
365     mova      m5, [r0+16]
366     mova      m6, [r0+2*r1]
367     mova      m7, [r0+2*r1+16]
368     lea       r0, [r0+4*r1]
369     psubw     m2, m4
370     psubw     m3, m5
371     psubw     m4, m6
372     psubw     m5, m7
373     ABSW      m2, m2, m1
374     ABSW      m3, m3, m1
375     ABSW      m4, m4, m1
376     ABSW      m5, m5, m1
377     paddw     m0, m2
378     paddw     m0, m3
379     paddw     m0, m4
380     paddw     m0, m5
381     mova      m2, m6
382     mova      m3, m7
383     sub r2d, 2
384     jg .loop
385 .end:
386 %if BIT_DEPTH == 9
387     HADDW     m0, m1 ; max sum: 62(pixel diffs)*511(pixel_max)=31682
388 %else
389     HADDUW    m0, m1 ; max sum: 62(pixel diffs)*1023(pixel_max)=63426
390 %endif
391     movd     eax, m0
392     RET
393 %endmacro
394 INIT_XMM sse2
395 PIXEL_VSAD
396 INIT_XMM ssse3
397 PIXEL_VSAD
398 INIT_XMM xop
399 PIXEL_VSAD
400
401 ;-----------------------------------------------------------------------------
402 ; void pixel_sad_xK_MxN( uint16_t *fenc, uint16_t *pix0, uint16_t *pix1,
403 ;                        uint16_t *pix2, int i_stride, int scores[3] )
404 ;-----------------------------------------------------------------------------
405 %macro SAD_X 3
406 cglobal pixel_sad_x%1_%2x%3, 6,7,XMM_REGS
407     %assign regnum %1+1
408     %xdefine STRIDE r %+ regnum
409 %ifdef WIN64
410     movsxd STRIDE, STRIDE %+ d
411 %endif
412     mov     r6, %3/2-1
413     SAD_X%1_ONE_START
414     SAD_X%1_ONE 2*FENC_STRIDE, 2*STRIDE
415     SAD_X_2xNP %1, STRIDE, 1, %2/(mmsize/2)-1
416 .loop:
417     SAD_X%1_INC_P
418     SAD_X_2xNP %1, STRIDE, 0, %2/(mmsize/2)
419     dec     r6
420     jg .loop
421 %if %1 == 4
422     mov     r6, r6m
423 %endif
424     SAD_X%1_END %2, %3
425 %endmacro
426
427 INIT_MMX mmx2
428 %define XMM_REGS 0
429 SAD_X 3, 16, 16
430 SAD_X 3, 16,  8
431 SAD_X 3,  8, 16
432 SAD_X 3,  8,  8
433 SAD_X 3,  8,  4
434 SAD_X 3,  4,  8
435 SAD_X 3,  4,  4
436 SAD_X 4, 16, 16
437 SAD_X 4, 16,  8
438 SAD_X 4,  8, 16
439 SAD_X 4,  8,  8
440 SAD_X 4,  8,  4
441 SAD_X 4,  4,  8
442 SAD_X 4,  4,  4
443 INIT_MMX ssse3
444 SAD_X 3,  4,  8
445 SAD_X 3,  4,  4
446 SAD_X 4,  4,  8
447 SAD_X 4,  4,  4
448 INIT_XMM ssse3
449 %define XMM_REGS 9
450 SAD_X 3, 16, 16
451 SAD_X 3, 16,  8
452 SAD_X 3,  8, 16
453 SAD_X 3,  8,  8
454 SAD_X 3,  8,  4
455 SAD_X 4, 16, 16
456 SAD_X 4, 16,  8
457 SAD_X 4,  8, 16
458 SAD_X 4,  8,  8
459 SAD_X 4,  8,  4
460 INIT_XMM sse2
461 %define XMM_REGS 11
462 SAD_X 3, 16, 16
463 SAD_X 3, 16,  8
464 SAD_X 3,  8, 16
465 SAD_X 3,  8,  8
466 SAD_X 3,  8,  4
467 SAD_X 4, 16, 16
468 SAD_X 4, 16,  8
469 SAD_X 4,  8, 16
470 SAD_X 4,  8,  8
471 SAD_X 4,  8,  4