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