]> git.sesse.net Git - x264/blob - common/x86/sad16-a.asm
Optimize x86 intra_sa8d_x3_8x8
[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 ;-----------------------------------------------------------------------------
351 ; void pixel_sad_xK_MxN( uint16_t *fenc, uint16_t *pix0, uint16_t *pix1,
352 ;                        uint16_t *pix2, int i_stride, int scores[3] )
353 ;-----------------------------------------------------------------------------
354 %macro SAD_X 3
355 cglobal pixel_sad_x%1_%2x%3, 6,7,XMM_REGS
356     %assign regnum %1+1
357     %xdefine STRIDE r %+ regnum
358 %ifdef WIN64
359     movsxd STRIDE, STRIDE %+ d
360 %endif
361     mov     r6, %3/2-1
362     SAD_X%1_ONE_START
363     SAD_X%1_ONE 2*FENC_STRIDE, 2*STRIDE
364     SAD_X_2xNP %1, STRIDE, 1, %2/(mmsize/2)-1
365 .loop:
366     SAD_X%1_INC_P
367     dec     r6
368     SAD_X_2xNP %1, STRIDE, 0, %2/(mmsize/2)
369     jg .loop
370 %if %1 == 4
371     mov     r6, r6m
372 %endif
373     SAD_X%1_END %2, %3
374 %endmacro
375
376 INIT_MMX mmx2
377 %define XMM_REGS 0
378 SAD_X 3, 16, 16
379 SAD_X 3, 16,  8
380 SAD_X 3,  8, 16
381 SAD_X 3,  8,  8
382 SAD_X 3,  8,  4
383 SAD_X 3,  4,  8
384 SAD_X 3,  4,  4
385 SAD_X 4, 16, 16
386 SAD_X 4, 16,  8
387 SAD_X 4,  8, 16
388 SAD_X 4,  8,  8
389 SAD_X 4,  8,  4
390 SAD_X 4,  4,  8
391 SAD_X 4,  4,  4
392 INIT_MMX ssse3
393 SAD_X 3,  4,  8
394 SAD_X 3,  4,  4
395 SAD_X 4,  4,  8
396 SAD_X 4,  4,  4
397 INIT_XMM ssse3
398 %define XMM_REGS 9
399 SAD_X 3, 16, 16
400 SAD_X 3, 16,  8
401 SAD_X 3,  8, 16
402 SAD_X 3,  8,  8
403 SAD_X 3,  8,  4
404 SAD_X 4, 16, 16
405 SAD_X 4, 16,  8
406 SAD_X 4,  8, 16
407 SAD_X 4,  8,  8
408 SAD_X 4,  8,  4
409 INIT_XMM sse2
410 %define XMM_REGS 11
411 SAD_X 3, 16, 16
412 SAD_X 3, 16,  8
413 SAD_X 3,  8, 16
414 SAD_X 3,  8,  8
415 SAD_X 3,  8,  4
416 SAD_X 4, 16, 16
417 SAD_X 4, 16,  8
418 SAD_X 4,  8, 16
419 SAD_X 4,  8,  8
420 SAD_X 4,  8,  4