]> git.sesse.net Git - x264/blob - common/x86/pixel-32.asm
Update source file headers
[x264] / common / x86 / pixel-32.asm
1 ;*****************************************************************************
2 ;* pixel-32.asm: x86_32 pixel metrics
3 ;*****************************************************************************
4 ;* Copyright (C) 2003-2010 x264 project
5 ;*
6 ;* Authors: Loren Merritt <lorenm@u.washington.edu>
7 ;*          Laurent Aimar <fenrir@via.ecp.fr>
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 ;* This program is also available under a commercial proprietary license.
24 ;* For more information, contact us at licensing@x264.com.
25 ;*****************************************************************************
26
27 %include "x86inc.asm"
28 %include "x86util.asm"
29
30 SECTION .text
31 INIT_MMX
32
33 %macro LOAD_DIFF_4x8P 1 ; dx
34     LOAD_DIFF  m0, m7, none, [r0+%1],      [r2+%1]
35     LOAD_DIFF  m1, m6, none, [r0+%1+r1],   [r2+%1+r3]
36     LOAD_DIFF  m2, m7, none, [r0+%1+r1*2], [r2+%1+r3*2]
37     LOAD_DIFF  m3, m6, none, [r0+%1+r4],   [r2+%1+r5]
38     lea  r0, [r0+4*r1]
39     lea  r2, [r2+4*r3]
40     LOAD_DIFF  m4, m7, none, [r0+%1],      [r2+%1]
41     LOAD_DIFF  m5, m6, none, [r0+%1+r1],   [r2+%1+r3]
42     LOAD_DIFF  m6, m7, none, [r0+%1+r1*2], [r2+%1+r3*2]
43     movq [spill], m5
44     LOAD_DIFF  m7, m5, none, [r0+%1+r4],   [r2+%1+r5]
45     movq m5, [spill]
46 %endmacro
47
48 %macro SUM4x8_MM 0
49     movq [spill],   m6
50     movq [spill+8], m7
51     ABS2     m0, m1, m6, m7
52     ABS2     m2, m3, m6, m7
53     paddw    m0, m2
54     paddw    m1, m3
55     movq     m6, [spill]
56     movq     m7, [spill+8]
57     ABS2     m4, m5, m2, m3
58     ABS2     m6, m7, m2, m3
59     paddw    m4, m6
60     paddw    m5, m7
61     paddw    m0, m4
62     paddw    m1, m5
63     paddw    m0, m1
64 %endmacro
65
66 ;-----------------------------------------------------------------------------
67 ; int pixel_sa8d_8x8( uint8_t *, int, uint8_t *, int )
68 ;-----------------------------------------------------------------------------
69 cglobal pixel_sa8d_8x8_internal_mmxext
70     push   r0
71     push   r2
72     sub    esp, 0x74
73 %define args  esp+0x74
74 %define spill esp+0x60 ; +16
75 %define trans esp+0    ; +96
76     LOAD_DIFF_4x8P 0
77     HADAMARD8_V m0, m1, m2, m3, m4, m5, m6, m7
78
79     movq   [spill], m1
80     TRANSPOSE4x4W 4, 5, 6, 7, 1
81     movq   [trans+0x00], m4
82     movq   [trans+0x08], m5
83     movq   [trans+0x10], m6
84     movq   [trans+0x18], m7
85     movq   m1, [spill]
86     TRANSPOSE4x4W 0, 1, 2, 3, 4
87     movq   [trans+0x20], m0
88     movq   [trans+0x28], m1
89     movq   [trans+0x30], m2
90     movq   [trans+0x38], m3
91
92     mov    r0, [args+4]
93     mov    r2, [args]
94     LOAD_DIFF_4x8P 4
95     HADAMARD8_V m0, m1, m2, m3, m4, m5, m6, m7
96
97     movq   [spill], m7
98     TRANSPOSE4x4W 0, 1, 2, 3, 7
99     movq   [trans+0x40], m0
100     movq   [trans+0x48], m1
101     movq   [trans+0x50], m2
102     movq   [trans+0x58], m3
103     movq   m7, [spill]
104     TRANSPOSE4x4W 4, 5, 6, 7, 1
105     movq   m0, [trans+0x00]
106     movq   m1, [trans+0x08]
107     movq   m2, [trans+0x10]
108     movq   m3, [trans+0x18]
109
110     HADAMARD8_V m0, m1, m2, m3, m4, m5, m6, m7
111     SUM4x8_MM
112     movq   [trans], m0
113
114     movq   m0, [trans+0x20]
115     movq   m1, [trans+0x28]
116     movq   m2, [trans+0x30]
117     movq   m3, [trans+0x38]
118     movq   m4, [trans+0x40]
119     movq   m5, [trans+0x48]
120     movq   m6, [trans+0x50]
121     movq   m7, [trans+0x58]
122
123     HADAMARD8_V m0, m1, m2, m3, m4, m5, m6, m7
124     SUM4x8_MM
125
126     pavgw  m0, [trans]
127     add   esp, 0x7c
128     ret
129 %undef args
130 %undef spill
131 %undef trans
132
133 %macro SUM_MM_X3 8 ; 3x sum, 4x tmp, op
134     pxor        %7, %7
135     pshufw      %4, %1, 01001110b
136     pshufw      %5, %2, 01001110b
137     pshufw      %6, %3, 01001110b
138     paddusw     %1, %4
139     paddusw     %2, %5
140     paddusw     %3, %6
141     punpcklwd   %1, %7
142     punpcklwd   %2, %7
143     punpcklwd   %3, %7
144     pshufw      %4, %1, 01001110b
145     pshufw      %5, %2, 01001110b
146     pshufw      %6, %3, 01001110b
147     %8          %1, %4
148     %8          %2, %5
149     %8          %3, %6
150 %endmacro
151
152 %macro LOAD_4x8P 1 ; dx
153     pxor        m7, m7
154     movd        m6, [eax+%1+7*FENC_STRIDE]
155     movd        m0, [eax+%1+0*FENC_STRIDE]
156     movd        m1, [eax+%1+1*FENC_STRIDE]
157     movd        m2, [eax+%1+2*FENC_STRIDE]
158     movd        m3, [eax+%1+3*FENC_STRIDE]
159     movd        m4, [eax+%1+4*FENC_STRIDE]
160     movd        m5, [eax+%1+5*FENC_STRIDE]
161     punpcklbw   m6, m7
162     punpcklbw   m0, m7
163     punpcklbw   m1, m7
164     movq   [spill], m6
165     punpcklbw   m2, m7
166     punpcklbw   m3, m7
167     movd        m6, [eax+%1+6*FENC_STRIDE]
168     punpcklbw   m4, m7
169     punpcklbw   m5, m7
170     punpcklbw   m6, m7
171     movq        m7, [spill]
172 %endmacro
173
174 ;-----------------------------------------------------------------------------
175 ; void intra_sa8d_x3_8x8_core( uint8_t *fenc, int16_t edges[2][8], int *res )
176 ;-----------------------------------------------------------------------------
177 cglobal intra_sa8d_x3_8x8_core_mmxext
178     mov    eax, [esp+4]
179     mov    ecx, [esp+8]
180     sub    esp, 0x70
181 %define args  esp+0x74
182 %define spill esp+0x60 ; +16
183 %define trans esp+0    ; +96
184 %define sum   esp+0    ; +32
185     LOAD_4x8P 0
186     HADAMARD8_V m0, m1, m2, m3, m4, m5, m6, m7
187
188     movq   [spill], m0
189     TRANSPOSE4x4W 4, 5, 6, 7, 0
190     movq   [trans+0x00], m4
191     movq   [trans+0x08], m5
192     movq   [trans+0x10], m6
193     movq   [trans+0x18], m7
194     movq   m0, [spill]
195     TRANSPOSE4x4W 0, 1, 2, 3, 4
196     movq   [trans+0x20], m0
197     movq   [trans+0x28], m1
198     movq   [trans+0x30], m2
199     movq   [trans+0x38], m3
200
201     LOAD_4x8P 4
202     HADAMARD8_V m0, m1, m2, m3, m4, m5, m6, m7
203
204     movq   [spill], m7
205     TRANSPOSE4x4W 0, 1, 2, 3, 7
206     movq   [trans+0x40], m0
207     movq   [trans+0x48], m1
208     movq   [trans+0x50], m2
209     movq   [trans+0x58], m3
210     movq   m7, [spill]
211     TRANSPOSE4x4W 4, 5, 6, 7, 0
212     movq   m0, [trans+0x00]
213     movq   m1, [trans+0x08]
214     movq   m2, [trans+0x10]
215     movq   m3, [trans+0x18]
216
217     HADAMARD8_V m0, m1, m2, m3, m4, m5, m6, m7
218
219     movq [spill+0], m0
220     movq [spill+8], m1
221     ABS2     m2, m3, m0, m1
222     ABS2     m4, m5, m0, m1
223     paddw    m2, m4
224     paddw    m3, m5
225     ABS2     m6, m7, m4, m5
226     movq     m0, [spill+0]
227     movq     m1, [spill+8]
228     paddw    m2, m6
229     paddw    m3, m7
230     paddw    m2, m3
231     ABS1     m1, m4
232     paddw    m2, m1 ; 7x4 sum
233     movq     m7, m0
234     movq     m1, [ecx+8] ; left bottom
235     psllw    m1, 3
236     psubw    m7, m1
237     ABS2     m0, m7, m5, m3
238     paddw    m0, m2
239     paddw    m7, m2
240     movq [sum+0], m0 ; dc
241     movq [sum+8], m7 ; left
242
243     movq   m0, [trans+0x20]
244     movq   m1, [trans+0x28]
245     movq   m2, [trans+0x30]
246     movq   m3, [trans+0x38]
247     movq   m4, [trans+0x40]
248     movq   m5, [trans+0x48]
249     movq   m6, [trans+0x50]
250     movq   m7, [trans+0x58]
251
252     HADAMARD8_V m0, m1, m2, m3, m4, m5, m6, m7
253
254     movd   [sum+0x10], m0
255     movd   [sum+0x12], m1
256     movd   [sum+0x14], m2
257     movd   [sum+0x16], m3
258     movd   [sum+0x18], m4
259     movd   [sum+0x1a], m5
260     movd   [sum+0x1c], m6
261     movd   [sum+0x1e], m7
262
263     movq [spill],   m0
264     movq [spill+8], m1
265     ABS2     m2, m3, m0, m1
266     ABS2     m4, m5, m0, m1
267     paddw    m2, m4
268     paddw    m3, m5
269     paddw    m2, m3
270     movq     m0, [spill]
271     movq     m1, [spill+8]
272     ABS2     m6, m7, m4, m5
273     ABS1     m1, m3
274     paddw    m2, m7
275     paddw    m1, m6
276     paddw    m2, m1 ; 7x4 sum
277     movq     m1, m0
278
279     movq     m7, [ecx+0]
280     psllw    m7, 3   ; left top
281
282     movzx   edx, word [ecx+0]
283     add      dx,  [ecx+16]
284     lea     edx, [4*edx+32]
285     and     edx, -64
286     movd     m6, edx ; dc
287
288     psubw    m1, m7
289     psubw    m0, m6
290     ABS2     m0, m1, m5, m6
291     movq     m3, [sum+0] ; dc
292     paddw    m0, m2
293     paddw    m1, m2
294     movq     m2, m0
295     paddw    m0, m3
296     paddw    m1, [sum+8] ; h
297     psrlq    m2, 16
298     paddw    m2, m3
299
300     movq     m3, [ecx+16] ; top left
301     movq     m4, [ecx+24] ; top right
302     psllw    m3, 3
303     psllw    m4, 3
304     psubw    m3, [sum+16]
305     psubw    m4, [sum+24]
306     ABS2     m3, m4, m5, m6
307     paddw    m2, m3
308     paddw    m2, m4 ; v
309
310     SUM_MM_X3 m0, m1, m2, m3, m4, m5, m6, paddd
311     mov     eax, [args+8]
312     movd    ecx, m2
313     movd    edx, m1
314     add     ecx, 2
315     add     edx, 2
316     shr     ecx, 2
317     shr     edx, 2
318     mov [eax+0], ecx ; i8x8_v satd
319     mov [eax+4], edx ; i8x8_h satd
320     movd    ecx, m0
321     add     ecx, 2
322     shr     ecx, 2
323     mov [eax+8], ecx ; i8x8_dc satd
324
325     add     esp, 0x70
326     ret
327 %undef args
328 %undef spill
329 %undef trans
330 %undef sum
331
332
333
334 ;-----------------------------------------------------------------------------
335 ; void pixel_ssim_4x4x2_core( const uint8_t *pix1, int stride1,
336 ;                             const uint8_t *pix2, int stride2, int sums[2][4] )
337 ;-----------------------------------------------------------------------------
338 cglobal pixel_ssim_4x4x2_core_mmxext
339     push     ebx
340     push     edi
341     mov      ebx, [esp+16]
342     mov      edx, [esp+24]
343     mov      edi, 4
344     pxor      m0, m0
345 .loop:
346     mov      eax, [esp+12]
347     mov      ecx, [esp+20]
348     add      eax, edi
349     add      ecx, edi
350     pxor      m1, m1
351     pxor      m2, m2
352     pxor      m3, m3
353     pxor      m4, m4
354 %rep 4
355     movd      m5, [eax]
356     movd      m6, [ecx]
357     punpcklbw m5, m0
358     punpcklbw m6, m0
359     paddw     m1, m5
360     paddw     m2, m6
361     movq      m7, m5
362     pmaddwd   m5, m5
363     pmaddwd   m7, m6
364     pmaddwd   m6, m6
365     paddd     m3, m5
366     paddd     m4, m7
367     paddd     m3, m6
368     add      eax, ebx
369     add      ecx, edx
370 %endrep
371     mov      eax, [esp+28]
372     lea      eax, [eax+edi*4]
373     pshufw    m5, m1, 0xE
374     pshufw    m6, m2, 0xE
375     paddusw   m1, m5
376     paddusw   m2, m6
377     punpcklwd m1, m2
378     pshufw    m2, m1, 0xE
379     pshufw    m5, m3, 0xE
380     pshufw    m6, m4, 0xE
381     paddusw   m1, m2
382     paddd     m3, m5
383     paddd     m4, m6
384     punpcklwd m1, m0
385     punpckldq m3, m4
386     movq [eax+0], m1
387     movq [eax+8], m3
388     sub      edi, 4
389     jge .loop
390     pop       edi
391     pop       ebx
392     emms
393     ret
394