]> git.sesse.net Git - x264/blob - common/x86/pixel-32.asm
Fix regression in r922
[x264] / common / x86 / pixel-32.asm
1 ;*****************************************************************************
2 ;* pixel-32.asm: h264 encoder library
3 ;*****************************************************************************
4 ;* Copyright (C) 2003-2008 x264 project
5 ;*
6 ;* Authors: Laurent Aimar <fenrir@via.ecp.fr>
7 ;*          Loren Merritt <lorenm@u.washington.edu>
8 ;*
9 ;* This program is free software; you can redistribute it and/or modify
10 ;* it under the terms of the GNU General Public License as published by
11 ;* the Free Software Foundation; either version 2 of the License, or
12 ;* (at your option) any later version.
13 ;*
14 ;* This program is distributed in the hope that it will be useful,
15 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 ;* GNU General Public License for more details.
18 ;*
19 ;* You should have received a copy of the GNU General Public License
20 ;* along with this program; if not, write to the Free Software
21 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
22 ;*****************************************************************************
23
24 %include "x86inc.asm"
25 %include "x86util.asm"
26
27 SECTION .text
28
29 %macro SBUTTERFLY 5
30     mov%1     %5, %3
31     punpckl%2 %3, %4
32     punpckh%2 %5, %4
33 %endmacro
34
35 %macro TRANSPOSE4x4W 5   ; abcd-t -> adtc
36     SBUTTERFLY q, wd, %1, %2, %5
37     SBUTTERFLY q, wd, %3, %4, %2
38     SBUTTERFLY q, dq, %1, %3, %4
39     SBUTTERFLY q, dq, %5, %2, %3
40 %endmacro
41
42 %macro LOAD_DIFF_4P 4  ; mmp, mmt, dx, dy
43     movd        %1, [eax+ebx*%4+%3]
44     movd        %2, [ecx+edx*%4+%3]
45     punpcklbw   %1, %2
46     punpcklbw   %2, %2
47     psubw       %1, %2
48 %endmacro
49
50 %macro LOAD_DIFF_4x8P 1 ; dx
51     LOAD_DIFF_4P  mm0, mm7, %1, 0
52     LOAD_DIFF_4P  mm1, mm7, %1, 1
53     lea  eax, [eax+2*ebx]
54     lea  ecx, [ecx+2*edx]
55     LOAD_DIFF_4P  mm2, mm7, %1, 0
56     LOAD_DIFF_4P  mm3, mm7, %1, 1
57     lea  eax, [eax+2*ebx]
58     lea  ecx, [ecx+2*edx]
59     LOAD_DIFF_4P  mm4, mm7, %1, 0
60     LOAD_DIFF_4P  mm5, mm7, %1, 1
61     lea  eax, [eax+2*ebx]
62     lea  ecx, [ecx+2*edx]
63     LOAD_DIFF_4P  mm6, mm7, %1, 0
64     movq [spill], mm6
65     LOAD_DIFF_4P  mm7, mm6, %1, 1
66     movq mm6, [spill]
67 %endmacro
68
69 %macro SUM4x8_MM 0
70     movq [spill],   mm6
71     movq [spill+8], mm7
72     ABS2     mm0, mm1, mm6, mm7
73     ABS2     mm2, mm3, mm6, mm7
74     paddw    mm0, mm2
75     paddw    mm1, mm3
76     movq     mm6, [spill]
77     movq     mm7, [spill+8]
78     ABS2     mm4, mm5, mm2, mm3
79     ABS2     mm6, mm7, mm2, mm3
80     paddw    mm4, mm6
81     paddw    mm5, mm7
82     paddw    mm0, mm4
83     paddw    mm1, mm5
84     paddw    mm0, mm1
85 %endmacro
86
87 ;-----------------------------------------------------------------------------
88 ; int x264_pixel_sa8d_8x8_mmxext( uint8_t *, int, uint8_t *, int )
89 ;-----------------------------------------------------------------------------
90 cglobal x264_pixel_sa8d_8x8_mmxext
91     push   ebx
92     mov    eax, [esp+ 8]  ; pix1
93     mov    ebx, [esp+12]  ; stride1
94     mov    ecx, [esp+16]  ; pix2
95     mov    edx, [esp+20]  ; stride2
96     sub    esp, 0x70
97 %define args  esp+0x74
98 %define spill esp+0x60 ; +16
99 %define trans esp+0    ; +96
100     LOAD_DIFF_4x8P 0
101     HADAMARD8_1D mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7
102
103     movq   [spill], mm0
104     TRANSPOSE4x4W mm4, mm5, mm6, mm7, mm0
105     movq   [trans+0x00], mm4
106     movq   [trans+0x08], mm7
107     movq   [trans+0x10], mm0
108     movq   [trans+0x18], mm6
109     movq   mm0, [spill]
110     TRANSPOSE4x4W mm0, mm1, mm2, mm3, mm4
111     movq   [trans+0x20], mm0
112     movq   [trans+0x28], mm3
113     movq   [trans+0x30], mm4
114     movq   [trans+0x38], mm2
115
116     mov    eax, [args+4]
117     mov    ecx, [args+12]
118     LOAD_DIFF_4x8P 4
119     HADAMARD8_1D mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7
120
121     movq   [spill], mm7
122     TRANSPOSE4x4W mm0, mm1, mm2, mm3, mm7
123     movq   [trans+0x40], mm0
124     movq   [trans+0x48], mm3
125     movq   [trans+0x50], mm7
126     movq   [trans+0x58], mm2
127     movq   mm7, [spill]
128     TRANSPOSE4x4W mm4, mm5, mm6, mm7, mm0
129     movq   mm5, [trans+0x00]
130     movq   mm1, [trans+0x08]
131     movq   mm2, [trans+0x10]
132     movq   mm3, [trans+0x18]
133
134     HADAMARD8_1D mm5, mm1, mm2, mm3, mm4, mm7, mm0, mm6
135     SUM4x8_MM
136     movq   [trans], mm0
137
138     movq   mm0, [trans+0x20]
139     movq   mm1, [trans+0x28]
140     movq   mm2, [trans+0x30]
141     movq   mm3, [trans+0x38]
142     movq   mm4, [trans+0x40]
143     movq   mm5, [trans+0x48]
144     movq   mm6, [trans+0x50]
145     movq   mm7, [trans+0x58]
146     
147     HADAMARD8_1D mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7
148     SUM4x8_MM
149
150     pavgw  mm0, [esp]
151     pshufw mm1, mm0, 01001110b
152     paddw  mm0, mm1
153     pshufw mm1, mm0, 10110001b
154     paddw  mm0, mm1
155     movd   eax, mm0
156     and    eax, 0xffff
157     mov    ecx, eax ; preserve rounding for 16x16
158     add    eax, 1
159     shr    eax, 1
160     add    esp, 0x70
161     pop    ebx
162     ret
163 %undef args
164 %undef spill
165 %undef trans
166
167 %macro SUM_MM_X3 8 ; 3x sum, 4x tmp, op
168     pxor        %7, %7
169     pshufw      %4, %1, 01001110b
170     pshufw      %5, %2, 01001110b
171     pshufw      %6, %3, 01001110b
172     paddusw     %1, %4
173     paddusw     %2, %5
174     paddusw     %3, %6
175     punpcklwd   %1, %7
176     punpcklwd   %2, %7
177     punpcklwd   %3, %7
178     pshufw      %4, %1, 01001110b
179     pshufw      %5, %2, 01001110b
180     pshufw      %6, %3, 01001110b
181     %8          %1, %4
182     %8          %2, %5
183     %8          %3, %6
184 %endmacro
185
186 %macro LOAD_4x8P 1 ; dx
187     pxor        mm7, mm7
188     movd        mm6, [eax+%1+7*FENC_STRIDE]
189     movd        mm0, [eax+%1+0*FENC_STRIDE]
190     movd        mm1, [eax+%1+1*FENC_STRIDE]
191     movd        mm2, [eax+%1+2*FENC_STRIDE]
192     movd        mm3, [eax+%1+3*FENC_STRIDE]
193     movd        mm4, [eax+%1+4*FENC_STRIDE]
194     movd        mm5, [eax+%1+5*FENC_STRIDE]
195     punpcklbw   mm6, mm7
196     punpcklbw   mm0, mm7
197     punpcklbw   mm1, mm7
198     movq    [spill], mm6
199     punpcklbw   mm2, mm7
200     punpcklbw   mm3, mm7
201     movd        mm6, [eax+%1+6*FENC_STRIDE]
202     punpcklbw   mm4, mm7
203     punpcklbw   mm5, mm7
204     punpcklbw   mm6, mm7
205     movq        mm7, [spill]
206 %endmacro
207
208 ;-----------------------------------------------------------------------------
209 ; void x264_intra_sa8d_x3_8x8_core_mmxext( uint8_t *fenc, int16_t edges[2][8], int *res )
210 ;-----------------------------------------------------------------------------
211 cglobal x264_intra_sa8d_x3_8x8_core_mmxext
212     mov    eax, [esp+4]
213     mov    ecx, [esp+8]
214     sub    esp, 0x70
215 %define args  esp+0x74
216 %define spill esp+0x60 ; +16
217 %define trans esp+0    ; +96
218 %define sum   esp+0    ; +32
219     LOAD_4x8P 0
220     HADAMARD8_1D mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7
221
222     movq   [spill], mm0
223     TRANSPOSE4x4W mm4, mm5, mm6, mm7, mm0
224     movq   [trans+0x00], mm4
225     movq   [trans+0x08], mm7
226     movq   [trans+0x10], mm0
227     movq   [trans+0x18], mm6
228     movq   mm0, [spill]
229     TRANSPOSE4x4W mm0, mm1, mm2, mm3, mm4
230     movq   [trans+0x20], mm0
231     movq   [trans+0x28], mm3
232     movq   [trans+0x30], mm4
233     movq   [trans+0x38], mm2
234
235     LOAD_4x8P 4
236     HADAMARD8_1D mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7
237
238     movq   [spill], mm7
239     TRANSPOSE4x4W mm0, mm1, mm2, mm3, mm7
240     movq   [trans+0x40], mm0
241     movq   [trans+0x48], mm3
242     movq   [trans+0x50], mm7
243     movq   [trans+0x58], mm2
244     movq   mm7, [spill]
245     TRANSPOSE4x4W mm4, mm5, mm6, mm7, mm0
246     movq   mm5, [trans+0x00]
247     movq   mm1, [trans+0x08]
248     movq   mm2, [trans+0x10]
249     movq   mm3, [trans+0x18]
250
251     HADAMARD8_1D mm5, mm1, mm2, mm3, mm4, mm7, mm0, mm6
252
253     movq [spill+0], mm5
254     movq [spill+8], mm7
255     ABS2     mm0, mm1, mm5, mm7
256     ABS2     mm2, mm3, mm5, mm7
257     paddw    mm0, mm2
258     paddw    mm1, mm3
259     paddw    mm0, mm1
260     ABS2     mm4, mm6, mm2, mm3
261     movq     mm5, [spill+0]
262     movq     mm7, [spill+8]
263     paddw    mm0, mm4
264     paddw    mm0, mm6
265     ABS1     mm7, mm1
266     paddw    mm0, mm7 ; 7x4 sum
267     movq     mm6, mm5
268     movq     mm7, [ecx+8] ; left bottom
269     psllw    mm7, 3
270     psubw    mm6, mm7
271     ABS2     mm5, mm6, mm2, mm3
272     paddw    mm5, mm0
273     paddw    mm6, mm0
274     movq [sum+0], mm5 ; dc
275     movq [sum+8], mm6 ; left
276
277     movq   mm0, [trans+0x20]
278     movq   mm1, [trans+0x28]
279     movq   mm2, [trans+0x30]
280     movq   mm3, [trans+0x38]
281     movq   mm4, [trans+0x40]
282     movq   mm5, [trans+0x48]
283     movq   mm6, [trans+0x50]
284     movq   mm7, [trans+0x58]
285     
286     HADAMARD8_1D mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7
287
288     movd   [sum+0x10], mm0
289     movd   [sum+0x12], mm1
290     movd   [sum+0x14], mm2
291     movd   [sum+0x16], mm3
292     movd   [sum+0x18], mm4
293     movd   [sum+0x1a], mm5
294     movd   [sum+0x1c], mm6
295     movd   [sum+0x1e], mm7
296
297     movq [spill],   mm0
298     movq [spill+8], mm1
299     ABS2     mm2, mm3, mm0, mm1
300     ABS2     mm4, mm5, mm0, mm1
301     paddw    mm2, mm3
302     paddw    mm4, mm5
303     paddw    mm2, mm4
304     movq     mm0, [spill]
305     movq     mm1, [spill+8]
306     ABS2     mm6, mm7, mm4, mm5
307     ABS1     mm1, mm4
308     paddw    mm2, mm7
309     paddw    mm1, mm6
310     paddw    mm2, mm1 ; 7x4 sum
311     movq     mm1, mm0
312
313     movq     mm7, [ecx+0]
314     psllw    mm7, 3   ; left top
315
316     movzx    edx, word [ecx+0]
317     add      dx,  [ecx+16]
318     lea      edx, [4*edx+32]
319     and      edx, -64
320     movd     mm6, edx ; dc
321
322     psubw    mm1, mm7
323     psubw    mm0, mm6
324     ABS2     mm0, mm1, mm5, mm6
325     movq     mm3, [sum+0] ; dc
326     paddw    mm0, mm2
327     paddw    mm1, mm2
328     movq     mm2, mm0
329     paddw    mm0, mm3
330     paddw    mm1, [sum+8] ; h
331     psrlq    mm2, 16
332     paddw    mm2, mm3
333
334     movq     mm3, [ecx+16] ; top left
335     movq     mm4, [ecx+24] ; top right
336     psllw    mm3, 3
337     psllw    mm4, 3
338     psubw    mm3, [sum+16]
339     psubw    mm4, [sum+24]
340     ABS2     mm3, mm4, mm5, mm6
341     paddw    mm2, mm3
342     paddw    mm2, mm4 ; v
343
344     SUM_MM_X3   mm0, mm1, mm2, mm3, mm4, mm5, mm6, paddd
345     mov      eax, [args+8]
346     movd     ecx, mm2
347     movd     edx, mm1
348     add      ecx, 2
349     add      edx, 2
350     shr      ecx, 2
351     shr      edx, 2
352     mov      [eax+0], ecx ; i8x8_v satd
353     mov      [eax+4], edx ; i8x8_h satd
354     movd     ecx, mm0
355     add      ecx, 2
356     shr      ecx, 2
357     mov      [eax+8], ecx ; i8x8_dc satd
358
359     add      esp, 0x70
360     ret
361 %undef args
362 %undef spill
363 %undef trans
364 %undef sum
365
366
367
368 ;-----------------------------------------------------------------------------
369 ; void x264_pixel_ssim_4x4x2_core_mmxext( const uint8_t *pix1, int stride1,
370 ;                                         const uint8_t *pix2, int stride2, int sums[2][4] )
371 ;-----------------------------------------------------------------------------
372 cglobal x264_pixel_ssim_4x4x2_core_mmxext
373     push      ebx
374     push      edi
375     mov       ebx, [esp+16]
376     mov       edx, [esp+24]
377     mov       edi, 4
378     pxor      mm0, mm0
379 .loop:
380     mov       eax, [esp+12]
381     mov       ecx, [esp+20]
382     add       eax, edi
383     add       ecx, edi
384     pxor      mm1, mm1
385     pxor      mm2, mm2
386     pxor      mm3, mm3
387     pxor      mm4, mm4
388 %rep 4
389     movd      mm5, [eax]
390     movd      mm6, [ecx]
391     punpcklbw mm5, mm0
392     punpcklbw mm6, mm0
393     paddw     mm1, mm5
394     paddw     mm2, mm6
395     movq      mm7, mm5
396     pmaddwd   mm5, mm5
397     pmaddwd   mm7, mm6
398     pmaddwd   mm6, mm6
399     paddd     mm3, mm5
400     paddd     mm4, mm7
401     paddd     mm3, mm6
402     add       eax, ebx
403     add       ecx, edx
404 %endrep
405     mov       eax, [esp+28]
406     lea       eax, [eax+edi*4]
407     pshufw    mm5, mm1, 0xE
408     pshufw    mm6, mm2, 0xE
409     paddusw   mm1, mm5
410     paddusw   mm2, mm6
411     punpcklwd mm1, mm2
412     pshufw    mm2, mm1, 0xE
413     pshufw    mm5, mm3, 0xE
414     pshufw    mm6, mm4, 0xE
415     paddusw   mm1, mm2
416     paddd     mm3, mm5
417     paddd     mm4, mm6
418     punpcklwd mm1, mm0
419     punpckldq mm3, mm4
420     movq  [eax+0], mm1
421     movq  [eax+8], mm3
422     sub       edi, 4
423     jge       .loop
424     pop       edi
425     pop       ebx
426     emms
427     ret
428