Bump dates to 2011
[x262.git] / 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     ABS2    m1, m2, m5, m6
47     ABS2    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     ABS2    m1, m2, m5, m6
66     ABS2    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     ABS2    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 4
91 cglobal pixel_sad_%1x%2_%4, 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
106 %define ABS1 ABS1_MMX
107 %define ABS2 ABS2_MMX
108 SAD_MMX 16, 16, 1, mmxext
109 SAD_MMX 16,  8, 1, mmxext
110 SAD_MMX  8, 16, 2, mmxext
111 SAD_MMX  8,  8, 2, mmxext
112 SAD_MMX  8,  4, 2, mmxext
113 SAD_MMX  4,  8, 2, mmxext
114 SAD_MMX  4,  4, 2, mmxext
115 %define ABS1 ABS1_SSSE3
116 %define ABS2 ABS2_SSSE3
117 SAD_MMX  4,  8, 2, ssse3
118 SAD_MMX  4,  4, 2, ssse3
119 %undef ABS1
120 %undef ABS2
121
122 ;=============================================================================
123 ; SAD XMM
124 ;=============================================================================
125
126 %macro SAD_INC_2x16P_XMM 0
127     movu    m1, [r2+ 0]
128     movu    m2, [r2+16]
129     movu    m3, [r2+2*r3+ 0]
130     movu    m4, [r2+2*r3+16]
131     psubw   m1, [r0+ 0]
132     psubw   m2, [r0+16]
133     psubw   m3, [r0+2*r1+ 0]
134     psubw   m4, [r0+2*r1+16]
135     ABS2    m1, m2, m5, m6
136     lea     r0, [r0+4*r1]
137     lea     r2, [r2+4*r3]
138     ABS2    m3, m4, m7, m5
139     paddw   m1, m2
140     paddw   m3, m4
141     paddw   m0, m1
142     paddw   m0, m3
143 %endmacro
144
145 %macro SAD_INC_2x8P_XMM 0
146     movu    m1, [r2]
147     movu    m2, [r2+2*r3]
148     psubw   m1, [r0]
149     psubw   m2, [r0+2*r1]
150     ABS2    m1, m2, m3, m4
151     lea     r0, [r0+4*r1]
152     lea     r2, [r2+4*r3]
153     paddw   m0, m1
154     paddw   m0, m2
155 %endmacro
156
157 ;-----------------------------------------------------------------------------
158 ; int pixel_sad_NxM( uint16_t *, int, uint16_t *, int )
159 ;-----------------------------------------------------------------------------
160 %macro SAD_XMM 3
161 cglobal pixel_sad_%1x%2_%3, 4,4,8
162     pxor    m0, m0
163 %rep %2/2
164     SAD_INC_2x%1P_XMM
165 %endrep
166     HADDW   m0, m1
167     movd   eax, m0
168     RET
169 %endmacro
170
171 INIT_XMM
172 %define ABS1 ABS1_MMX
173 %define ABS2 ABS2_MMX
174 SAD_XMM 16, 16, sse2
175 SAD_XMM 16,  8, sse2
176 SAD_XMM  8, 16, sse2
177 SAD_XMM  8,  8, sse2
178 SAD_XMM  8,  4, sse2
179 %define movdqu movdqa
180 SAD_XMM 16, 16, sse2_aligned
181 SAD_XMM 16,  8, sse2_aligned
182 SAD_XMM  8, 16, sse2_aligned
183 SAD_XMM  8,  8, sse2_aligned
184 %undef movdqu
185 %define ABS1 ABS1_SSSE3
186 %define ABS2 ABS2_SSSE3
187 SAD_XMM 16, 16, ssse3
188 SAD_XMM 16,  8, ssse3
189 SAD_XMM  8, 16, ssse3
190 SAD_XMM  8,  8, ssse3
191 SAD_XMM  8,  4, ssse3
192 %define movdqu movdqa
193 SAD_XMM 16, 16, ssse3_aligned
194 SAD_XMM 16,  8, ssse3_aligned
195 SAD_XMM  8, 16, ssse3_aligned
196 SAD_XMM  8,  8, ssse3_aligned
197 %undef movdqu
198 %undef ABS1
199 %undef ABS2
200
201 ;=============================================================================
202 ; SAD x3/x4
203 ;=============================================================================
204
205 %macro SAD_X3_INC_P 0
206     add     r0, 4*FENC_STRIDE
207     lea     r1, [r1+4*r4]
208     lea     r2, [r2+4*r4]
209     lea     r3, [r3+4*r4]
210 %endmacro
211
212 %macro SAD_X3_ONE_START 0
213     mova    m3, [r0]
214     movu    m0, [r1]
215     movu    m1, [r2]
216     movu    m2, [r3]
217     psubw   m0, m3
218     psubw   m1, m3
219     psubw   m2, m3
220     ABS2    m0, m1, m4, m5
221     ABS1    m2, m6
222 %endmacro
223
224 %macro SAD_X3_ONE 2
225     mova    m6, [r0+%1]
226     movu    m3, [r1+%2]
227     movu    m4, [r2+%2]
228     movu    m5, [r3+%2]
229     psubw   m3, m6
230     psubw   m4, m6
231     psubw   m5, m6
232     ABS2    m3, m4, m7, m6
233     ABS1    m5, m6
234     paddw   m0, m3
235     paddw   m1, m4
236     paddw   m2, m5
237 %endmacro
238
239 %macro SAD_X3_END 2
240 %if mmsize == 8 && %1*%2 == 256
241     HADDUW   m0, m3
242     HADDUW   m1, m4
243     HADDUW   m2, m5
244 %else
245     HADDW    m0, m3
246     HADDW    m1, m4
247     HADDW    m2, m5
248 %endif
249 %ifdef UNIX64
250     movd [r5+0], m0
251     movd [r5+4], m1
252     movd [r5+8], m2
253 %else
254     mov      r0, r5mp
255     movd [r0+0], m0
256     movd [r0+4], m1
257     movd [r0+8], m2
258 %endif
259     RET
260 %endmacro
261
262 %macro SAD_X4_INC_P 0
263     add     r0, 4*FENC_STRIDE
264     lea     r1, [r1+4*r5]
265     lea     r2, [r2+4*r5]
266     lea     r3, [r3+4*r5]
267     lea     r4, [r4+4*r5]
268 %endmacro
269
270 %macro SAD_X4_ONE_START 0
271     mova    m4, [r0]
272     movu    m0, [r1]
273     movu    m1, [r2]
274     movu    m2, [r3]
275     movu    m3, [r4]
276     psubw   m0, m4
277     psubw   m1, m4
278     psubw   m2, m4
279     psubw   m3, m4
280     ABS2    m0, m1, m5, m6
281     ABS2    m2, m3, m4, m7
282 %endmacro
283
284 %macro SAD_X4_ONE 2
285     mova    m4, [r0+%1]
286     movu    m5, [r1+%2]
287     movu    m6, [r2+%2]
288 %if num_mmregs > 8
289     movu    m7, [r3+%2]
290     movu    m8, [r4+%2]
291     psubw   m5, m4
292     psubw   m6, m4
293     psubw   m7, m4
294     psubw   m8, m4
295     ABS2    m5, m6, m9, m10
296     ABS2    m7, m8, m9, m10
297     paddw   m0, m5
298     paddw   m1, m6
299     paddw   m2, m7
300     paddw   m3, m8
301 %elifidn ABS1, ABS1_SSSE3
302     movu    m7, [r3+%2]
303     psubw   m5, m4
304     psubw   m6, m4
305     psubw   m7, m4
306     movu    m4, [r4+%2]
307     pabsw   m5, m5
308     psubw   m4, [r0+%1]
309     pabsw   m6, m6
310     pabsw   m7, m7
311     pabsw   m4, m4
312     paddw   m0, m5
313     paddw   m1, m6
314     paddw   m2, m7
315     paddw   m3, m4
316 %else ; num_mmregs == 8 && !ssse3
317     psubw   m5, m4
318     psubw   m6, m4
319     ABS1    m5, m7
320     ABS1    m6, m7
321     paddw   m0, m5
322     paddw   m1, m6
323     movu    m5, [r3+%2]
324     movu    m6, [r4+%2]
325     psubw   m5, m4
326     psubw   m6, m4
327     ABS2    m5, m6, m7, m4
328     paddw   m2, m5
329     paddw   m3, m6
330 %endif
331 %endmacro
332
333 %macro SAD_X4_END 2
334 %if mmsize == 8 && %1*%2 == 256
335     HADDUW    m0, m4
336     HADDUW    m1, m5
337     HADDUW    m2, m6
338     HADDUW    m3, m7
339 %else
340     HADDW     m0, m4
341     HADDW     m1, m5
342     HADDW     m2, m6
343     HADDW     m3, m7
344 %endif
345     mov       r0, r6mp
346     movd [r0+ 0], m0
347     movd [r0+ 4], m1
348     movd [r0+ 8], m2
349     movd [r0+12], m3
350     RET
351 %endmacro
352
353 %macro SAD_X_2xNP 4
354     %assign x %3
355 %rep %4
356     SAD_X%1_ONE x*mmsize, x*mmsize
357     SAD_X%1_ONE 2*FENC_STRIDE+x*mmsize, 2*%2+x*mmsize
358     %assign x x+1
359 %endrep
360 %endmacro
361
362 ;-----------------------------------------------------------------------------
363 ; void pixel_sad_xK_MxN( uint16_t *fenc, uint16_t *pix0, uint16_t *pix1,
364 ;                        uint16_t *pix2, int i_stride, int scores[3] )
365 ;-----------------------------------------------------------------------------
366 %macro SAD_X 4
367 cglobal pixel_sad_x%1_%2x%3_%4, 6,7,XMM_REGS
368     %assign regnum %1+1
369     %xdefine STRIDE r %+ regnum
370 %ifdef WIN64
371     movsxd STRIDE, STRIDE %+ d
372 %endif
373     mov     r6, %3/2-1
374     SAD_X%1_ONE_START
375     SAD_X%1_ONE 2*FENC_STRIDE, 2*STRIDE
376     SAD_X_2xNP %1, STRIDE, 1, %2/(mmsize/2)-1
377 .loop:
378     SAD_X%1_INC_P
379     dec     r6
380     SAD_X_2xNP %1, STRIDE, 0, %2/(mmsize/2)
381     jg .loop
382 %if %1 == 4
383     mov     r6, r6m
384 %endif
385     SAD_X%1_END %2, %3
386 %endmacro
387
388 INIT_MMX
389 %define XMM_REGS 0
390 %define ABS1 ABS1_MMX
391 %define ABS2 ABS2_MMX
392 SAD_X 3, 16, 16, mmxext
393 SAD_X 3, 16,  8, mmxext
394 SAD_X 3,  8, 16, mmxext
395 SAD_X 3,  8,  8, mmxext
396 SAD_X 3,  8,  4, mmxext
397 SAD_X 3,  4,  8, mmxext
398 SAD_X 3,  4,  4, mmxext
399 SAD_X 4, 16, 16, mmxext
400 SAD_X 4, 16,  8, mmxext
401 SAD_X 4,  8, 16, mmxext
402 SAD_X 4,  8,  8, mmxext
403 SAD_X 4,  8,  4, mmxext
404 SAD_X 4,  4,  8, mmxext
405 SAD_X 4,  4,  4, mmxext
406 %define ABS1 ABS1_SSSE3
407 %define ABS2 ABS2_SSSE3
408 SAD_X 3,  4,  8, ssse3
409 SAD_X 3,  4,  4, ssse3
410 SAD_X 4,  4,  8, ssse3
411 SAD_X 4,  4,  4, ssse3
412 INIT_XMM
413 %define XMM_REGS 9
414 SAD_X 3, 16, 16, ssse3
415 SAD_X 3, 16,  8, ssse3
416 SAD_X 3,  8, 16, ssse3
417 SAD_X 3,  8,  8, ssse3
418 SAD_X 3,  8,  4, ssse3
419 SAD_X 4, 16, 16, ssse3
420 SAD_X 4, 16,  8, ssse3
421 SAD_X 4,  8, 16, ssse3
422 SAD_X 4,  8,  8, ssse3
423 SAD_X 4,  8,  4, ssse3
424 %define XMM_REGS 11
425 %define ABS1 ABS1_MMX
426 %define ABS2 ABS2_MMX
427 SAD_X 3, 16, 16, sse2
428 SAD_X 3, 16,  8, sse2
429 SAD_X 3,  8, 16, sse2
430 SAD_X 3,  8,  8, sse2
431 SAD_X 3,  8,  4, sse2
432 SAD_X 4, 16, 16, sse2
433 SAD_X 4, 16,  8, sse2
434 SAD_X 4,  8, 16, sse2
435 SAD_X 4,  8,  8, sse2
436 SAD_X 4,  8,  4, sse2
437 %undef ABS1
438 %undef ABS2