]> git.sesse.net Git - x264/blob - common/x86/predict-a.asm
1d590de31f8e5fe82acbf486c9d9215c78cae74a
[x264] / common / x86 / predict-a.asm
1 ;*****************************************************************************
2 ;* predict-a.asm: x86 intra prediction
3 ;*****************************************************************************
4 ;* Copyright (C) 2005-2010 x264 project
5 ;*
6 ;* Authors: Loren Merritt <lorenm@u.washington.edu>
7 ;*          Holger Lubitz <holger@lubitz.org>
8 ;*          Fiona Glaser <fiona@x264.com>
9 ;*
10 ;* This program is free software; you can redistribute it and/or modify
11 ;* it under the terms of the GNU General Public License as published by
12 ;* the Free Software Foundation; either version 2 of the License, or
13 ;* (at your option) any later version.
14 ;*
15 ;* This program is distributed in the hope that it will be useful,
16 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ;* GNU General Public License for more details.
19 ;*
20 ;* You should have received a copy of the GNU General Public License
21 ;* along with this program; if not, write to the Free Software
22 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
23 ;*
24 ;* This program is also available under a commercial proprietary license.
25 ;* For more information, contact us at licensing@x264.com.
26 ;*****************************************************************************
27
28 %include "x86inc.asm"
29 %include "x86util.asm"
30
31 SECTION_RODATA
32
33 pw_76543210:
34 pw_3210:    dw 0, 1, 2, 3, 4, 5, 6, 7
35 pb_00s_ff:  times 8 db 0
36 pb_0s_ff:   times 7 db 0
37             db 0xff
38
39 SECTION .text
40
41 cextern pb_0
42 cextern pb_1
43 cextern pb_3
44 cextern pw_1
45 cextern pw_2
46 cextern pw_4
47 cextern pw_8
48 cextern pw_ff00
49 cextern pb_reverse
50
51 %macro STORE8x8 2
52     add r0, 4*FDEC_STRIDEB
53     mova        [r0 + -4*FDEC_STRIDEB], %1
54     mova        [r0 + -3*FDEC_STRIDEB], %1
55     mova        [r0 + -2*FDEC_STRIDEB], %1
56     mova        [r0 + -1*FDEC_STRIDEB], %1
57     mova        [r0 +  0*FDEC_STRIDEB], %2
58     mova        [r0 +  1*FDEC_STRIDEB], %2
59     mova        [r0 +  2*FDEC_STRIDEB], %2
60     mova        [r0 +  3*FDEC_STRIDEB], %2
61 %endmacro
62
63 %macro STORE16x16 2-4
64 %ifidn %0, 4
65     mov         r1d, 8
66 .loop:
67     mova        [r0 + 0*FDEC_STRIDEB + 0], %1
68     mova        [r0 + 1*FDEC_STRIDEB + 0], %1
69     mova        [r0 + 0*FDEC_STRIDEB + 8], %2
70     mova        [r0 + 1*FDEC_STRIDEB + 8], %2
71     mova        [r0 + 0*FDEC_STRIDEB +16], %3
72     mova        [r0 + 1*FDEC_STRIDEB +16], %3
73     mova        [r0 + 0*FDEC_STRIDEB +24], %4
74     mova        [r0 + 1*FDEC_STRIDEB +24], %4
75     add         r0, 2*FDEC_STRIDEB
76     dec         r1d
77     jg          .loop
78 %else
79     mov         r1d, 4
80 .loop:
81     mova        [r0 + 0*FDEC_STRIDE], %1
82     mova        [r0 + 1*FDEC_STRIDE], %1
83     mova        [r0 + 2*FDEC_STRIDE], %1
84     mova        [r0 + 3*FDEC_STRIDE], %1
85     mova        [r0 + 0*FDEC_STRIDE + 8], %2
86     mova        [r0 + 1*FDEC_STRIDE + 8], %2
87     mova        [r0 + 2*FDEC_STRIDE + 8], %2
88     mova        [r0 + 3*FDEC_STRIDE + 8], %2
89     add         r0, 4*FDEC_STRIDE
90     dec         r1d
91     jg          .loop
92 %endif
93 %endmacro
94
95 %macro STORE16x16_SSE2 1-2
96 %ifidn %0,2
97     mov r1d, 4
98 .loop
99     mova      [r0+0*FDEC_STRIDEB+ 0], %1
100     mova      [r0+0*FDEC_STRIDEB+16], %2
101     mova      [r0+1*FDEC_STRIDEB+ 0], %1
102     mova      [r0+1*FDEC_STRIDEB+16], %2
103     mova      [r0+2*FDEC_STRIDEB+ 0], %1
104     mova      [r0+2*FDEC_STRIDEB+16], %2
105     mova      [r0+3*FDEC_STRIDEB+ 0], %1
106     mova      [r0+3*FDEC_STRIDEB+16], %2
107     add       r0, 4*FDEC_STRIDEB
108     dec       r1d
109     jg        .loop
110 %else
111     add r0, 4*FDEC_STRIDEB
112     mova      [r0 + -4*FDEC_STRIDEB], %1
113     mova      [r0 + -3*FDEC_STRIDEB], %1
114     mova      [r0 + -2*FDEC_STRIDEB], %1
115     mova      [r0 + -1*FDEC_STRIDEB], %1
116     mova      [r0 +  0*FDEC_STRIDEB], %1
117     mova      [r0 +  1*FDEC_STRIDEB], %1
118     mova      [r0 +  2*FDEC_STRIDEB], %1
119     mova      [r0 +  3*FDEC_STRIDEB], %1
120     add r0, 8*FDEC_STRIDEB
121     mova      [r0 + -4*FDEC_STRIDEB], %1
122     mova      [r0 + -3*FDEC_STRIDEB], %1
123     mova      [r0 + -2*FDEC_STRIDEB], %1
124     mova      [r0 + -1*FDEC_STRIDEB], %1
125     mova      [r0 +  0*FDEC_STRIDEB], %1
126     mova      [r0 +  1*FDEC_STRIDEB], %1
127     mova      [r0 +  2*FDEC_STRIDEB], %1
128     mova      [r0 +  3*FDEC_STRIDEB], %1
129 %endif
130 %endmacro
131
132 ; dest, left, right, src, tmp
133 ; output: %1 = (t[n-1] + t[n]*2 + t[n+1] + 2) >> 2
134 %macro PRED8x8_LOWPASS 5-6
135 %ifidn %1, w
136     mova        %2, %5
137     paddw       %3, %4
138     psrlw       %3, 1
139     pavgw       %2, %3
140 %else
141     mova        %6, %3
142     pavgb       %3, %4
143     pxor        %4, %6
144     mova        %2, %5
145     pand        %4, [pb_1]
146     psubusb     %3, %4
147     pavgb       %2, %3
148 %endif
149 %endmacro
150
151 %macro LOAD_PLANE_ARGS 0
152 %ifdef ARCH_X86_64
153     movd        mm0, r1d
154     movd        mm2, r2d
155     movd        mm4, r3d
156     pshufw      mm0, mm0, 0
157     pshufw      mm2, mm2, 0
158     pshufw      mm4, mm4, 0
159 %else
160     pshufw      mm0, r1m, 0
161     pshufw      mm2, r2m, 0
162     pshufw      mm4, r3m, 0
163 %endif
164 %endmacro
165
166 ;-----------------------------------------------------------------------------
167 ; void predict_4x4_ddl( pixel *src )
168 ;-----------------------------------------------------------------------------
169 %macro PREDICT_4x4_DDL 4
170 cglobal predict_4x4_ddl_%1, 1,1
171     movu    m1, [r0-FDEC_STRIDEB]
172     mova    m2, m1
173     mova    m3, m1
174     mova    m4, m1
175     psll%2  m1, %3
176     pxor    m2, m1
177     psrl%2  m2, %3
178     pxor    m3, m2
179     PRED8x8_LOWPASS %4, m0, m1, m3, m4, m5
180
181 %assign Y 0
182 %rep 4
183     psrl%2      m0, %3
184     movh        [r0+Y*FDEC_STRIDEB], m0
185 %assign Y (Y+1)
186 %endrep
187
188     RET
189 %endmacro
190
191 %ifdef HIGH_BIT_DEPTH
192 INIT_XMM
193 PREDICT_4x4_DDL sse2, dq, 2, w
194 INIT_MMX
195 %define PALIGNR PALIGNR_MMX
196 cglobal predict_4x4_ddl_mmxext, 1,2
197     mova    m1, [r0-2*FDEC_STRIDE+4]
198     mova    m2, [r0-2*FDEC_STRIDE+0]
199     mova    m3, [r0-2*FDEC_STRIDE+2]
200     PRED8x8_LOWPASS w, m0, m1, m2, m3
201     mova    [r0+0*FDEC_STRIDE], m0
202
203     mova    m5, [r0-2*FDEC_STRIDE+6]
204     mova    m6, [r0-2*FDEC_STRIDE+8]
205     pshufw  m7, m6, 0xF9
206     PRED8x8_LOWPASS w, m4, m7, m5, m6
207     mova    [r0+6*FDEC_STRIDE], m4
208
209     psllq   m0, 16
210     PALIGNR m4, m0, 6, m1
211     mova    [r0+4*FDEC_STRIDE], m4
212
213     psllq   m0, 16
214     PALIGNR m4, m0, 6, m0
215     mova    [r0+2*FDEC_STRIDE], m4
216     RET
217 %else
218 INIT_MMX
219 PREDICT_4x4_DDL mmxext, q , 8, b
220 %endif
221
222 ;-----------------------------------------------------------------------------
223 ; void predict_4x4_ddr( pixel *src )
224 ;-----------------------------------------------------------------------------
225 %macro PREDICT_4x4 7
226 cglobal predict_4x4_ddr_%1, 1,1
227     movu      m1, [r0+1*FDEC_STRIDEB-8*SIZEOF_PIXEL]
228     movq      m2, [r0+0*FDEC_STRIDEB-8]
229 %ifdef HIGH_BIT_DEPTH
230     movh      m4, [r0-1*FDEC_STRIDEB-4*SIZEOF_PIXEL]
231     punpckl%2 m2, m4
232     movh      m3, [r0-1*FDEC_STRIDEB]
233     punpckh%3 m1, m2
234     PALIGNR   m3, m1, 5*SIZEOF_PIXEL, m1
235     mova      m1, m3
236     movhps    m4, [r0+2*FDEC_STRIDEB-4*SIZEOF_PIXEL]
237     PALIGNR   m3, m4, 7*SIZEOF_PIXEL, m4
238     mova      m2, m3
239     movhps    m4, [r0+3*FDEC_STRIDEB-4*SIZEOF_PIXEL]
240     PALIGNR   m3, m4, 7*SIZEOF_PIXEL, m4
241 %else
242     punpckh%2 m2, [r0-1*FDEC_STRIDEB-8*SIZEOF_PIXEL]
243     movh      m3, [r0-1*FDEC_STRIDEB]
244     punpckh%3 m1, m2
245     PALIGNR   m3, m1, 5*SIZEOF_PIXEL, m1
246     mova      m1, m3
247     PALIGNR   m3, [r0+2*FDEC_STRIDEB-8*SIZEOF_PIXEL], 7*SIZEOF_PIXEL, m4
248     mova      m2, m3
249     PALIGNR   m3, [r0+3*FDEC_STRIDEB-8*SIZEOF_PIXEL], 7*SIZEOF_PIXEL, m4
250 %endif
251     PRED8x8_LOWPASS %5, m0, m3, m1, m2, m4
252 %assign Y 3
253     movh      [r0+Y*FDEC_STRIDEB], m0
254 %rep 3
255 %assign Y (Y-1)
256     psrl%4    m0, %7
257     movh      [r0+Y*FDEC_STRIDEB], m0
258 %endrep
259     RET
260
261 cglobal predict_4x4_vr_%1, 1,1,6*(mmsize/16)
262     movh    m0, [r0-1*FDEC_STRIDEB]                                       ; ........t3t2t1t0
263     mova    m5, m0
264 %ifdef HIGH_BIT_DEPTH
265     movhps  m1, [r0-1*FDEC_STRIDEB-4*SIZEOF_PIXEL]
266     PALIGNR m0, m1, 7*SIZEOF_PIXEL, m1                                    ; ......t3t2t1t0lt
267     pavg%5  m5, m0
268     movhps  m1, [r0+0*FDEC_STRIDEB-4*SIZEOF_PIXEL]
269     PALIGNR m0, m1, 7*SIZEOF_PIXEL, m1                                    ; ....t3t2t1t0ltl0
270     mova    m1, m0
271     movhps  m2, [r0+1*FDEC_STRIDEB-4*SIZEOF_PIXEL]
272     PALIGNR m0, m2, 7*SIZEOF_PIXEL, m2                                    ; ..t3t2t1t0ltl0l1
273     mova    m2, m0
274     movhps  m3, [r0+2*FDEC_STRIDEB-4*SIZEOF_PIXEL]
275     PALIGNR m0, m3, 7*SIZEOF_PIXEL, m3                                    ; t3t2t1t0ltl0l1l2
276 %else
277     PALIGNR m0, [r0-1*FDEC_STRIDEB-8*SIZEOF_PIXEL], 7*SIZEOF_PIXEL, m1    ; ......t3t2t1t0lt
278     pavg%5  m5, m0
279     PALIGNR m0, [r0+0*FDEC_STRIDEB-8*SIZEOF_PIXEL], 7*SIZEOF_PIXEL, m1    ; ....t3t2t1t0ltl0
280     mova    m1, m0
281     PALIGNR m0, [r0+1*FDEC_STRIDEB-8*SIZEOF_PIXEL], 7*SIZEOF_PIXEL, m2    ; ..t3t2t1t0ltl0l1
282     mova    m2, m0
283     PALIGNR m0, [r0+2*FDEC_STRIDEB-8*SIZEOF_PIXEL], 7*SIZEOF_PIXEL, m3    ; t3t2t1t0ltl0l1l2
284 %endif
285     PRED8x8_LOWPASS %5, m3, m1, m0, m2, m4
286     mova    m1, m3
287     psrl%4  m3, %7*2
288     psll%4  m1, %7*6
289     movh    [r0+0*FDEC_STRIDEB], m5
290     movh    [r0+1*FDEC_STRIDEB], m3
291     PALIGNR m5, m1, 7*SIZEOF_PIXEL, m2
292     psll%4  m1, %7
293     movh    [r0+2*FDEC_STRIDEB], m5
294     PALIGNR m3, m1, 7*SIZEOF_PIXEL, m1
295     movh    [r0+3*FDEC_STRIDEB], m3
296     RET
297
298 cglobal predict_4x4_hd_%1, 1,1,6*(mmsize/16)
299     movh      m0, [r0-1*FDEC_STRIDEB-4*SIZEOF_PIXEL] ; lt ..
300 %ifdef HIGH_BIT_DEPTH
301     movh      m1, [r0-1*FDEC_STRIDEB]
302     punpckl%6 m0, m1                                 ; t3 t2 t1 t0 lt .. .. ..
303     psll%4    m0, %7                                 ; t2 t1 t0 lt .. .. .. ..
304     movh      m1, [r0+3*FDEC_STRIDEB-4*SIZEOF_PIXEL] ; l3
305     movh      m2, [r0+2*FDEC_STRIDEB-4*SIZEOF_PIXEL]
306     punpckl%2 m1, m2                                 ; l2 l3
307     movh      m2, [r0+1*FDEC_STRIDEB-4*SIZEOF_PIXEL] ; l1
308     movh      m3, [r0+0*FDEC_STRIDEB-4*SIZEOF_PIXEL]
309     punpckl%2 m2, m3                                 ; l0 l1
310 %else
311     punpckl%6 m0, [r0-1*FDEC_STRIDEB]                ; t3 t2 t1 t0 lt .. .. ..
312     psll%4    m0, %7                                 ; t2 t1 t0 lt .. .. .. ..
313     movu      m1, [r0+3*FDEC_STRIDEB-8*SIZEOF_PIXEL] ; l3
314     punpckh%2 m1, [r0+2*FDEC_STRIDEB-8*SIZEOF_PIXEL] ; l2 l3
315     movu      m2, [r0+1*FDEC_STRIDEB-8*SIZEOF_PIXEL] ; l1
316     punpckh%2 m2, [r0+0*FDEC_STRIDEB-8*SIZEOF_PIXEL] ; l0 l1
317 %endif
318     punpckh%3 m1, m2                                 ; l0 l1 l2 l3
319     punpckh%6 m1, m0                                 ; t2 t1 t0 lt l0 l1 l2 l3
320     mova      m0, m1
321     mova      m2, m1
322     mova      m5, m1
323     psrl%4    m0, %7*2                               ; .. .. t2 t1 t0 lt l0 l1
324     psrl%4    m2, %7                                 ; .. t2 t1 t0 lt l0 l1 l2
325     pavg%5    m5, m2
326     PRED8x8_LOWPASS %5, m3, m1, m0, m2, m4
327     punpckl%2 m5, m3
328     psrl%4    m3, %7*4
329     PALIGNR   m3, m5, 6*SIZEOF_PIXEL, m4
330 %assign Y 3
331     movh      [r0+Y*FDEC_STRIDEB], m5
332 %rep 2
333 %assign Y (Y-1)
334     psrl%4    m5, %7*2
335     movh      [r0+Y*FDEC_STRIDEB], m5
336 %endrep
337     movh      [r0+0*FDEC_STRIDEB], m3
338     RET
339 %endmacro
340
341 %ifdef HIGH_BIT_DEPTH
342 INIT_XMM
343 %define PALIGNR PALIGNR_SSSE3
344 PREDICT_4x4 ssse3 , wd, dq, dq, w, qdq, 2
345 %else
346 INIT_MMX
347 %define PALIGNR PALIGNR_MMX
348 PREDICT_4x4 mmxext, bw, wd, q , b, dq , 8
349 %define PALIGNR PALIGNR_SSSE3
350 PREDICT_4x4 ssse3 , bw, wd, q , b, dq , 8
351 %endif
352
353 ;-----------------------------------------------------------------------------
354 ; void predict_4x4_hu( pixel *src )
355 ;-----------------------------------------------------------------------------
356 %ifdef HIGH_BIT_DEPTH
357 INIT_XMM
358 cglobal predict_4x4_hu_sse2, 1,1,6
359     movq      mm0, [r0+0*FDEC_STRIDEB-4*2]
360     punpckhwd mm0, [r0+1*FDEC_STRIDEB-4*2]
361     movq      mm1, [r0+2*FDEC_STRIDEB-4*2]
362     punpckhwd mm1, [r0+3*FDEC_STRIDEB-4*2]
363     punpckhdq mm0, mm1
364     pshufw    mm1, mm1, 0xFF
365     movq2dq    m0, mm0
366     movq2dq    m1, mm1
367     punpcklqdq m0, m1
368     mova       m2, m0
369     mova       m3, m0
370     mova       m1, m0
371     psrldq     m2, 4
372     psrldq     m3, 2
373     pavgw      m1, m3
374     PRED8x8_LOWPASS w, m4, m0, m2, m3, m5
375     punpcklwd  m1, m4
376
377     movq       [r0+0*FDEC_STRIDEB], m1
378     psrldq     m1, 4
379     movq       [r0+1*FDEC_STRIDEB], m1
380     psrldq     m1, 4
381     movq       [r0+2*FDEC_STRIDEB], m1
382     movq       [r0+3*FDEC_STRIDEB], mm1
383     RET
384
385 %else
386 INIT_MMX
387 cglobal predict_4x4_hu_mmxext, 1,1
388     movq      mm0, [r0+0*FDEC_STRIDE-8]
389     punpckhbw mm0, [r0+1*FDEC_STRIDE-8]
390     movq      mm1, [r0+2*FDEC_STRIDE-8]
391     punpckhbw mm1, [r0+3*FDEC_STRIDE-8]
392     punpckhwd mm0, mm1
393     movq      mm1, mm0
394     punpckhbw mm1, mm1
395     pshufw    mm1, mm1, 0xFF
396     punpckhdq mm0, mm1
397     movq      mm2, mm0
398     movq      mm3, mm0
399     movq      mm7, mm0
400     psrlq     mm2, 16
401     psrlq     mm3, 8
402     pavgb     mm7, mm3
403     PRED8x8_LOWPASS b, mm4, mm0, mm2, mm3, mm5
404     punpcklbw mm7, mm4
405 %assign Y 0
406     movd    [r0+Y*FDEC_STRIDE], mm7
407 %rep 2
408 %assign Y (Y+1)
409     psrlq    mm7, 16
410     movd    [r0+Y*FDEC_STRIDE], mm7
411 %endrep
412     movd    [r0+3*FDEC_STRIDE], mm1
413     RET
414 %endif ; HIGH_BIT_DEPTH
415
416 ;-----------------------------------------------------------------------------
417 ; void predict_4x4_vl( pixel *src )
418 ;-----------------------------------------------------------------------------
419 %macro PREDICT_4x4_V1 4
420 cglobal predict_4x4_vl_%1, 1,1,6*(mmsize/16)
421     movu        m1, [r0-FDEC_STRIDEB]
422     mova        m3, m1
423     mova        m2, m1
424     psrl%2      m3, %3
425     psrl%2      m2, %3*2
426     mova        m4, m3
427     pavg%4      m4, m1
428     PRED8x8_LOWPASS %4, m0, m1, m2, m3, m5
429
430     movh        [r0+0*FDEC_STRIDEB], m4
431     movh        [r0+1*FDEC_STRIDEB], m0
432     psrl%2      m4, %3
433     psrl%2      m0, %3
434     movh        [r0+2*FDEC_STRIDEB], m4
435     movh        [r0+3*FDEC_STRIDEB], m0
436     RET
437 %endmacro
438
439 %ifdef HIGH_BIT_DEPTH
440 INIT_XMM
441 PREDICT_4x4_V1 sse2, dq, 2, w
442
443 INIT_MMX
444 %define PALIGNR PALIGNR_MMX
445 cglobal predict_4x4_vl_mmxext, 1,4
446     mova    m1, [r0-FDEC_STRIDEB+0]
447     mova    m2, [r0-FDEC_STRIDEB+8]
448     mova    m3, m2
449     PALIGNR m2, m1, 4, m6
450     PALIGNR m3, m1, 2, m5
451     mova    m4, m3
452     pavgw   m4, m1
453     mova    [r0+0*FDEC_STRIDEB], m4
454     psrlq   m4, 16
455     mova    [r0+2*FDEC_STRIDEB], m4
456     PRED8x8_LOWPASS w, m0, m1, m2, m3, m6
457     mova    [r0+1*FDEC_STRIDEB], m0
458     psrlq   m0, 16
459     mova    [r0+3*FDEC_STRIDEB], m0
460
461     movzx   r1d, word [r0-FDEC_STRIDEB+ 8]
462     movzx   r2d, word [r0-FDEC_STRIDEB+10]
463     movzx   r3d, word [r0-FDEC_STRIDEB+12]
464     lea     r1d, [r1+r2+1]
465     add     r3d, r2d
466     lea     r3d, [r3+r1+1]
467     shr     r1d, 1
468     shr     r3d, 2
469     mov     [r0+2*FDEC_STRIDEB+6], r1w
470     mov     [r0+3*FDEC_STRIDEB+6], r3w
471     RET
472 %else
473 INIT_MMX
474 PREDICT_4x4_V1 mmxext, q , 8, b
475 %endif
476
477 ;-----------------------------------------------------------------------------
478 ; void predict_4x4_dc( pixel *src )
479 ;-----------------------------------------------------------------------------
480 %ifdef HIGH_BIT_DEPTH
481 INIT_MMX
482 cglobal predict_4x4_dc_mmxext, 1,1
483     mova   m2, [r0+0*FDEC_STRIDEB-4*SIZEOF_PIXEL]
484     paddw  m2, [r0+1*FDEC_STRIDEB-4*SIZEOF_PIXEL]
485     paddw  m2, [r0+2*FDEC_STRIDEB-4*SIZEOF_PIXEL]
486     paddw  m2, [r0+3*FDEC_STRIDEB-4*SIZEOF_PIXEL]
487     psrlq  m2, 48
488     mova   m0, [r0-FDEC_STRIDEB]
489     HADDW  m0, m1
490     paddw  m0, [pw_4]
491     paddw  m0, m2
492     psrlw  m0, 3
493     SPLATW m0, m0
494     mova   [r0+0*FDEC_STRIDEB], m0
495     mova   [r0+1*FDEC_STRIDEB], m0
496     mova   [r0+2*FDEC_STRIDEB], m0
497     mova   [r0+3*FDEC_STRIDEB], m0
498     RET
499
500 %else
501 INIT_MMX
502 cglobal predict_4x4_dc_mmxext, 1,4
503     pxor   mm7, mm7
504     movd   mm0, [r0-FDEC_STRIDE]
505     psadbw mm0, mm7
506     movd   r3d, mm0
507     movzx  r1d, byte [r0-1]
508 %assign n 1
509 %rep 3
510     movzx  r2d, byte [r0+FDEC_STRIDE*n-1]
511     add    r1d, r2d
512 %assign n n+1
513 %endrep
514     lea    r1d, [r1+r3+4]
515     shr    r1d, 3
516     imul   r1d, 0x01010101
517     mov   [r0+FDEC_STRIDE*0], r1d
518     mov   [r0+FDEC_STRIDE*1], r1d
519     mov   [r0+FDEC_STRIDE*2], r1d
520     mov   [r0+FDEC_STRIDE*3], r1d
521     RET
522 %endif ; HIGH_BIT_DEPTH
523
524 %macro PREDICT_FILTER 1
525 ;-----------------------------------------------------------------------------
526 ;void predict_8x8_filter( uint8_t *src, uint8_t edge[33], int i_neighbor, int i_filters )
527 ;-----------------------------------------------------------------------------
528 INIT_MMX
529 cglobal predict_8x8_filter_%1, 4,5
530     add          r0, 0x58
531 %define src r0-0x58
532 %ifndef ARCH_X86_64
533     mov          r4, r1
534 %define t1 r4
535 %define t4 r1
536 %else
537 %define t1 r1
538 %define t4 r4
539 %endif
540     test        r3b, 0x01
541     je .check_top
542     movq        mm0, [src+0*FDEC_STRIDE-8]
543     punpckhbw   mm0, [src-1*FDEC_STRIDE-8]
544     movq        mm1, [src+2*FDEC_STRIDE-8]
545     punpckhbw   mm1, [src+1*FDEC_STRIDE-8]
546     punpckhwd   mm1, mm0
547     movq        mm2, [src+4*FDEC_STRIDE-8]
548     punpckhbw   mm2, [src+3*FDEC_STRIDE-8]
549     movq        mm3, [src+6*FDEC_STRIDE-8]
550     punpckhbw   mm3, [src+5*FDEC_STRIDE-8]
551     punpckhwd   mm3, mm2
552     punpckhdq   mm3, mm1
553     movq        mm0, [src+7*FDEC_STRIDE-8]
554     movq        mm1, [src-1*FDEC_STRIDE]
555     movq        mm4, mm3
556     movq        mm2, mm3
557     PALIGNR     mm4, mm0, 7, mm0
558     PALIGNR     mm1, mm2, 1, mm2
559     test        r2b, 0x08
560     je .fix_lt_1
561 .do_left:
562     movq        mm0, mm4
563     PRED8x8_LOWPASS b, mm2, mm1, mm4, mm3, mm5
564     movq     [t1+8], mm2
565     movq        mm4, mm0
566     PRED8x8_LOWPASS b, mm1, mm3, mm0, mm4, mm5
567     movd         t4, mm1
568     mov      [t1+7], t4b
569 .check_top:
570     test        r3b, 0x02
571     je .done
572     movq        mm0, [src-1*FDEC_STRIDE-8]
573     movq        mm3, [src-1*FDEC_STRIDE]
574     movq        mm1, [src-1*FDEC_STRIDE+8]
575     movq        mm2, mm3
576     movq        mm4, mm3
577     PALIGNR     mm2, mm0, 7, mm0
578     PALIGNR     mm1, mm4, 1, mm4
579     test        r2b, 0x08
580     je .fix_lt_2
581     test        r2b, 0x04
582     je .fix_tr_1
583 .do_top:
584     PRED8x8_LOWPASS b, mm4, mm2, mm1, mm3, mm5
585     movq    [t1+16], mm4
586     test        r3b, 0x04
587     je .done
588     test        r2b, 0x04
589     je .fix_tr_2
590     movq        mm0, [src-1*FDEC_STRIDE+8]
591     movq        mm5, mm0
592     movq        mm2, mm0
593     movq        mm4, mm0
594     psrlq       mm5, 56
595     PALIGNR     mm2, mm3, 7, mm3
596     PALIGNR     mm5, mm4, 1, mm4
597     PRED8x8_LOWPASS b, mm1, mm2, mm5, mm0, mm4
598     jmp .do_topright
599 .fix_tr_2:
600     punpckhbw   mm3, mm3
601     pshufw      mm1, mm3, 0xFF
602 .do_topright:
603     movq    [t1+24], mm1
604     psrlq       mm1, 56
605     movd         t4, mm1
606     mov     [t1+32], t4b
607 .done:
608     REP_RET
609 .fix_lt_1:
610     movq        mm5, mm3
611     pxor        mm5, mm4
612     psrlq       mm5, 56
613     psllq       mm5, 48
614     pxor        mm1, mm5
615     jmp .do_left
616 .fix_lt_2:
617     movq        mm5, mm3
618     pxor        mm5, mm2
619     psllq       mm5, 56
620     psrlq       mm5, 56
621     pxor        mm2, mm5
622     test        r2b, 0x04
623     jne .do_top
624 .fix_tr_1:
625     movq        mm5, mm3
626     pxor        mm5, mm1
627     psrlq       mm5, 56
628     psllq       mm5, 56
629     pxor        mm1, mm5
630     jmp .do_top
631 %endmacro
632
633 %define PALIGNR PALIGNR_MMX
634 INIT_MMX
635 PREDICT_FILTER mmxext
636 %define PALIGNR PALIGNR_SSSE3
637 PREDICT_FILTER ssse3
638
639 ;-----------------------------------------------------------------------------
640 ; void predict_8x8_v( pixel *src, pixel *edge )
641 ;-----------------------------------------------------------------------------
642 %macro PREDICT_8x8_V 1
643 cglobal predict_8x8_v_%1, 2,2
644     mova        m0, [r1+16*SIZEOF_PIXEL]
645     STORE8x8    m0, m0
646     RET
647 %endmacro
648
649 %ifdef HIGH_BIT_DEPTH
650 INIT_XMM
651 PREDICT_8x8_V sse2
652 %else
653 INIT_MMX
654 PREDICT_8x8_V mmxext
655 %endif
656
657 ;-----------------------------------------------------------------------------
658 ; void predict_8x8_h( pixel *src, pixel edge[33] )
659 ;-----------------------------------------------------------------------------
660 %macro PREDICT_8x8_H 3
661 cglobal predict_8x8_h_%1, 2,2
662     movu      m1, [r1+7*SIZEOF_PIXEL]
663     add       r0, 4*FDEC_STRIDEB
664     mova      m2, m1
665     punpckh%2 m1, m1
666     punpckl%2 m2, m2
667 %assign n 0
668 %rep 8
669 %assign i 1+n/4
670     SPLAT%3 m0, m %+ i, (3-n)&3
671     mova [r0+(n-4)*FDEC_STRIDEB], m0
672 %assign n n+1
673 %endrep
674     RET
675 %endmacro
676
677 %ifdef HIGH_BIT_DEPTH
678 INIT_XMM
679 PREDICT_8x8_H sse2  , wd, D
680 %else
681 INIT_MMX
682 PREDICT_8x8_H mmxext, bw, W
683 %endif
684
685 ;-----------------------------------------------------------------------------
686 ; void predict_8x8_dc( pixel *src, pixel *edge );
687 ;-----------------------------------------------------------------------------
688 %ifdef HIGH_BIT_DEPTH
689 INIT_XMM
690 cglobal predict_8x8_dc_sse2, 2,2
691     movu        m0, [r1+14]
692     paddw       m0, [r1+32]
693     HADDW       m0, m1
694     paddw       m0, [pw_8]
695     psrlw       m0, 4
696     SPLATW      m0, m0
697     STORE8x8    m0, m0
698     REP_RET
699
700 %else
701 INIT_MMX
702 cglobal predict_8x8_dc_mmxext, 2,2
703     pxor        mm0, mm0
704     pxor        mm1, mm1
705     psadbw      mm0, [r1+7]
706     psadbw      mm1, [r1+16]
707     paddw       mm0, [pw_8]
708     paddw       mm0, mm1
709     psrlw       mm0, 4
710     pshufw      mm0, mm0, 0
711     packuswb    mm0, mm0
712     STORE8x8    mm0, mm0
713     RET
714 %endif ; HIGH_BIT_DEPTH
715
716 ;-----------------------------------------------------------------------------
717 ; void predict_8x8_dc_top ( pixel *src, pixel *edge );
718 ; void predict_8x8_dc_left( pixel *src, pixel *edge );
719 ;-----------------------------------------------------------------------------
720 %ifdef HIGH_BIT_DEPTH
721 %macro PRED8x8_DC 3
722 cglobal %1, 2,2
723     %3          m0, [r1+%2]
724     HADDW       m0, m1
725     paddw       m0, [pw_4]
726     psrlw       m0, 3
727     SPLATW      m0, m0
728     STORE8x8    m0, m0
729     RET
730 %endmacro
731 INIT_XMM
732 PRED8x8_DC predict_8x8_dc_top_sse2 , 32, mova
733 PRED8x8_DC predict_8x8_dc_left_sse2, 14, movu
734
735 %else
736 %macro PRED8x8_DC 2
737 cglobal %1, 2,2
738     pxor        mm0, mm0
739     psadbw      mm0, [r1+%2]
740     paddw       mm0, [pw_4]
741     psrlw       mm0, 3
742     pshufw      mm0, mm0, 0
743     packuswb    mm0, mm0
744     STORE8x8    mm0, mm0
745     RET
746 %endmacro
747 INIT_MMX
748 PRED8x8_DC predict_8x8_dc_top_mmxext, 16
749 PRED8x8_DC predict_8x8_dc_left_mmxext, 7
750 %endif ; HIGH_BIT_DEPTH
751
752 %ifndef ARCH_X86_64
753 ; sse2 is faster even on amd, so there's no sense in spending exe size on these
754 ; functions if we know sse2 is available.
755 INIT_MMX
756 ;-----------------------------------------------------------------------------
757 ; void predict_8x8_ddl( uint8_t *src, uint8_t *edge )
758 ;-----------------------------------------------------------------------------
759 cglobal predict_8x8_ddl_mmxext, 2,2
760     movq        mm5, [r1+16]
761     movq        mm2, [r1+17]
762     movq        mm3, [r1+23]
763     movq        mm4, [r1+25]
764     movq        mm1, mm5
765     psllq       mm1, 8
766     add          r0, FDEC_STRIDE*4
767     PRED8x8_LOWPASS b, mm0, mm1, mm2, mm5, mm7
768     PRED8x8_LOWPASS b, mm1, mm3, mm4, [r1+24], mm6
769 %assign Y 3
770 %rep 6
771     movq        [r0+Y*FDEC_STRIDE], mm1
772     movq        mm2, mm0
773     psllq       mm1, 8
774     psrlq       mm2, 56
775     psllq       mm0, 8
776     por         mm1, mm2
777 %assign Y (Y-1)
778 %endrep
779     movq        [r0+Y*FDEC_STRIDE], mm1
780     psllq       mm1, 8
781     psrlq       mm0, 56
782     por         mm1, mm0
783 %assign Y (Y-1)
784     movq        [r0+Y*FDEC_STRIDE], mm1
785     RET
786
787 ;-----------------------------------------------------------------------------
788 ; void predict_8x8_ddr( uint8_t *src, uint8_t *edge )
789 ;-----------------------------------------------------------------------------
790 cglobal predict_8x8_ddr_mmxext, 2,2
791     movq        mm1, [r1+7]
792     movq        mm2, [r1+9]
793     movq        mm3, [r1+15]
794     movq        mm4, [r1+17]
795     add          r0, FDEC_STRIDE*4
796     PRED8x8_LOWPASS b, mm0, mm1, mm2, [r1+8], mm7
797     PRED8x8_LOWPASS b, mm1, mm3, mm4, [r1+16], mm6
798 %assign Y 3
799 %rep 6
800     movq        [r0+Y*FDEC_STRIDE], mm0
801     movq        mm2, mm1
802     psrlq       mm0, 8
803     psllq       mm2, 56
804     psrlq       mm1, 8
805     por         mm0, mm2
806 %assign Y (Y-1)
807 %endrep
808     movq        [r0+Y*FDEC_STRIDE], mm0
809     psrlq       mm0, 8
810     psllq       mm1, 56
811     por         mm0, mm1
812 %assign Y (Y-1)
813     movq        [r0+Y*FDEC_STRIDE], mm0
814     RET
815
816 ;-----------------------------------------------------------------------------
817 ; void predict_8x8_hu( uint8_t *src, uint8_t *edge )
818 ;-----------------------------------------------------------------------------
819 %define PALIGNR PALIGNR_MMX
820 cglobal predict_8x8_hu_mmxext, 2,2
821     movq    mm1, [r1+7]         ; l0 l1 l2 l3 l4 l5 l6 l7
822     add      r0, 4*FDEC_STRIDE
823     pshufw  mm0, mm1, 00011011b ; l6 l7 l4 l5 l2 l3 l0 l1
824     psllq   mm1, 56             ; l7 .. .. .. .. .. .. ..
825     movq    mm2, mm0
826     psllw   mm0, 8
827     psrlw   mm2, 8
828     por     mm2, mm0            ; l7 l6 l5 l4 l3 l2 l1 l0
829     movq    mm3, mm2
830     movq    mm4, mm2
831     movq    mm5, mm2
832     psrlq   mm2, 8
833     psrlq   mm3, 16
834     por     mm2, mm1            ; l7 l7 l6 l5 l4 l3 l2 l1
835     punpckhbw mm1, mm1
836     por     mm3, mm1            ; l7 l7 l7 l6 l5 l4 l3 l2
837     pavgb   mm4, mm2
838     PRED8x8_LOWPASS b, mm1, mm3, mm5, mm2, mm6
839     movq    mm5, mm4
840     punpcklbw mm4, mm1          ; p4 p3 p2 p1
841     punpckhbw mm5, mm1          ; p8 p7 p6 p5
842     movq    mm6, mm5
843     movq    mm7, mm5
844     movq    mm0, mm5
845     PALIGNR mm5, mm4, 2, mm1
846     pshufw  mm1, mm6, 11111001b
847     PALIGNR mm6, mm4, 4, mm2
848     pshufw  mm2, mm7, 11111110b
849     PALIGNR mm7, mm4, 6, mm3
850     pshufw  mm3, mm0, 11111111b
851     movq   [r0-4*FDEC_STRIDE], mm4
852     movq   [r0-3*FDEC_STRIDE], mm5
853     movq   [r0-2*FDEC_STRIDE], mm6
854     movq   [r0-1*FDEC_STRIDE], mm7
855     movq   [r0+0*FDEC_STRIDE], mm0
856     movq   [r0+1*FDEC_STRIDE], mm1
857     movq   [r0+2*FDEC_STRIDE], mm2
858     movq   [r0+3*FDEC_STRIDE], mm3
859     RET
860
861 ;-----------------------------------------------------------------------------
862 ; void predict_8x8_vr_core( uint8_t *src, uint8_t *edge )
863 ;-----------------------------------------------------------------------------
864
865 ; fills only some pixels:
866 ; f01234567
867 ; 0........
868 ; 1,,,,,,,,
869 ; 2 .......
870 ; 3 ,,,,,,,
871 ; 4  ......
872 ; 5  ,,,,,,
873 ; 6   .....
874 ; 7   ,,,,,
875
876 cglobal predict_8x8_vr_core_mmxext, 2,2
877     movq        mm2, [r1+16]
878     movq        mm3, [r1+15]
879     movq        mm1, [r1+14]
880     movq        mm4, mm3
881     pavgb       mm3, mm2
882     add          r0, FDEC_STRIDE*4
883     PRED8x8_LOWPASS b, mm0, mm1, mm2, mm4, mm7
884
885 %assign Y -4
886 %rep 3
887     movq        [r0+ Y   *FDEC_STRIDE], mm3
888     movq        [r0+(Y+1)*FDEC_STRIDE], mm0
889     psllq       mm3, 8
890     psllq       mm0, 8
891 %assign Y (Y+2)
892 %endrep
893     movq        [r0+ Y   *FDEC_STRIDE], mm3
894     movq        [r0+(Y+1)*FDEC_STRIDE], mm0
895
896     RET
897
898 ;-----------------------------------------------------------------------------
899 ; void predict_8x8c_p_core( uint8_t *src, int i00, int b, int c )
900 ;-----------------------------------------------------------------------------
901 cglobal predict_8x8c_p_core_mmxext, 1,2
902     LOAD_PLANE_ARGS
903     movq        mm1, mm2
904     pmullw      mm2, [pw_3210]
905     psllw       mm1, 2
906     paddsw      mm0, mm2        ; mm0 = {i+0*b, i+1*b, i+2*b, i+3*b}
907     paddsw      mm1, mm0        ; mm1 = {i+4*b, i+5*b, i+6*b, i+7*b}
908
909     mov         r1d, 8
910 ALIGN 4
911 .loop:
912     movq        mm5, mm0
913     movq        mm6, mm1
914     psraw       mm5, 5
915     psraw       mm6, 5
916     packuswb    mm5, mm6
917     movq        [r0], mm5
918
919     paddsw      mm0, mm4
920     paddsw      mm1, mm4
921     add         r0, FDEC_STRIDE
922     dec         r1d
923     jg          .loop
924     REP_RET
925
926 ;-----------------------------------------------------------------------------
927 ; void predict_16x16_p_core( uint8_t *src, int i00, int b, int c )
928 ;-----------------------------------------------------------------------------
929 cglobal predict_16x16_p_core_mmxext, 1,2
930     LOAD_PLANE_ARGS
931     movq        mm5, mm2
932     movq        mm1, mm2
933     pmullw      mm5, [pw_3210]
934     psllw       mm2, 3
935     psllw       mm1, 2
936     movq        mm3, mm2
937     paddsw      mm0, mm5        ; mm0 = {i+ 0*b, i+ 1*b, i+ 2*b, i+ 3*b}
938     paddsw      mm1, mm0        ; mm1 = {i+ 4*b, i+ 5*b, i+ 6*b, i+ 7*b}
939     paddsw      mm2, mm0        ; mm2 = {i+ 8*b, i+ 9*b, i+10*b, i+11*b}
940     paddsw      mm3, mm1        ; mm3 = {i+12*b, i+13*b, i+14*b, i+15*b}
941
942     mov         r1d, 16
943 ALIGN 4
944 .loop:
945     movq        mm5, mm0
946     movq        mm6, mm1
947     psraw       mm5, 5
948     psraw       mm6, 5
949     packuswb    mm5, mm6
950     movq        [r0], mm5
951
952     movq        mm5, mm2
953     movq        mm6, mm3
954     psraw       mm5, 5
955     psraw       mm6, 5
956     packuswb    mm5, mm6
957     movq        [r0+8], mm5
958
959     paddsw      mm0, mm4
960     paddsw      mm1, mm4
961     paddsw      mm2, mm4
962     paddsw      mm3, mm4
963     add         r0, FDEC_STRIDE
964     dec         r1d
965     jg          .loop
966     REP_RET
967
968 %endif ; !ARCH_X86_64
969
970 INIT_XMM
971 ;-----------------------------------------------------------------------------
972 ; void predict_8x8_ddl( uint8_t *src, uint8_t *edge )
973 ;-----------------------------------------------------------------------------
974 cglobal predict_8x8_ddl_sse2, 2,2
975     movdqa      xmm3, [r1+16]
976     movdqu      xmm2, [r1+17]
977     movdqa      xmm1, xmm3
978     pslldq      xmm1, 1
979     add          r0, FDEC_STRIDE*4
980     PRED8x8_LOWPASS b, xmm0, xmm1, xmm2, xmm3, xmm4
981
982 %assign Y -4
983 %rep 8
984     psrldq      xmm0, 1
985     movq        [r0+Y*FDEC_STRIDE], xmm0
986 %assign Y (Y+1)
987 %endrep
988     RET
989
990 ;-----------------------------------------------------------------------------
991 ; void predict_8x8_ddr( uint8_t *src, uint8_t *edge )
992 ;-----------------------------------------------------------------------------
993 cglobal predict_8x8_ddr_sse2, 2,2
994     movdqu      xmm3, [r1+8]
995     movdqu      xmm1, [r1+7]
996     movdqa      xmm2, xmm3
997     psrldq      xmm2, 1
998     add           r0, FDEC_STRIDE*4
999     PRED8x8_LOWPASS b, xmm0, xmm1, xmm2, xmm3, xmm4
1000
1001     movdqa      xmm1, xmm0
1002     psrldq      xmm1, 1
1003 %assign Y 3
1004 %rep 3
1005     movq        [r0+Y*FDEC_STRIDE], xmm0
1006     movq        [r0+(Y-1)*FDEC_STRIDE], xmm1
1007     psrldq      xmm0, 2
1008     psrldq      xmm1, 2
1009 %assign Y (Y-2)
1010 %endrep
1011     movq        [r0-3*FDEC_STRIDE], xmm0
1012     movq        [r0-4*FDEC_STRIDE], xmm1
1013
1014     RET
1015
1016 ;-----------------------------------------------------------------------------
1017 ; void predict_8x8_vl( uint8_t *src, uint8_t *edge )
1018 ;-----------------------------------------------------------------------------
1019 cglobal predict_8x8_vl_sse2, 2,2
1020     movdqa      xmm4, [r1+16]
1021     movdqa      xmm2, xmm4
1022     movdqa      xmm1, xmm4
1023     movdqa      xmm3, xmm4
1024     psrldq      xmm2, 1
1025     pslldq      xmm1, 1
1026     pavgb       xmm3, xmm2
1027     add           r0, FDEC_STRIDE*4
1028     PRED8x8_LOWPASS b, xmm0, xmm1, xmm2, xmm4, xmm5
1029 ; xmm0: (t0 + 2*t1 + t2 + 2) >> 2
1030 ; xmm3: (t0 + t1 + 1) >> 1
1031
1032 %assign Y -4
1033 %rep 3
1034     psrldq      xmm0, 1
1035     movq        [r0+ Y   *FDEC_STRIDE], xmm3
1036     movq        [r0+(Y+1)*FDEC_STRIDE], xmm0
1037     psrldq      xmm3, 1
1038 %assign Y (Y+2)
1039 %endrep
1040     psrldq      xmm0, 1
1041     movq        [r0+ Y   *FDEC_STRIDE], xmm3
1042     movq        [r0+(Y+1)*FDEC_STRIDE], xmm0
1043
1044     RET
1045
1046 ;-----------------------------------------------------------------------------
1047 ; void predict_8x8_vr( uint8_t *src, uint8_t *edge )
1048 ;-----------------------------------------------------------------------------
1049 cglobal predict_8x8_vr_sse2, 2,2,7
1050     movdqu      xmm0, [r1+8]
1051     movdqa      xmm6, [pw_ff00]
1052     add         r0, 4*FDEC_STRIDE
1053     movdqa      xmm1, xmm0
1054     movdqa      xmm2, xmm0
1055     movdqa      xmm3, xmm0
1056     pslldq      xmm0, 1
1057     pslldq      xmm1, 2
1058     pavgb       xmm2, xmm0
1059     PRED8x8_LOWPASS b, xmm4, xmm3, xmm1, xmm0, xmm5
1060     pandn       xmm6, xmm4
1061     movdqa      xmm5, xmm4
1062     psrlw       xmm4, 8
1063     packuswb    xmm6, xmm4
1064     movhlps     xmm4, xmm6
1065     movhps [r0-3*FDEC_STRIDE], xmm5
1066     movhps [r0-4*FDEC_STRIDE], xmm2
1067     psrldq      xmm5, 4
1068     movss       xmm5, xmm6
1069     psrldq      xmm2, 4
1070     movss       xmm2, xmm4
1071 %assign Y 3
1072 %rep 3
1073     psrldq      xmm5, 1
1074     psrldq      xmm2, 1
1075     movq        [r0+Y*FDEC_STRIDE], xmm5
1076     movq        [r0+(Y-1)*FDEC_STRIDE], xmm2
1077 %assign Y (Y-2)
1078 %endrep
1079     RET
1080
1081 INIT_MMX
1082 ;-----------------------------------------------------------------------------
1083 ; void predict_8x8_hd( uint8_t *src, uint8_t *edge )
1084 ;-----------------------------------------------------------------------------
1085 %define PALIGNR PALIGNR_MMX
1086 cglobal predict_8x8_hd_mmxext, 2,2
1087     add     r0, 4*FDEC_STRIDE
1088     movq    mm0, [r1]           ; l7 .. .. .. .. .. .. ..
1089     movq    mm1, [r1+8]         ; lt l0 l1 l2 l3 l4 l5 l6
1090     movq    mm2, [r1+16]        ; t7 t6 t5 t4 t3 t2 t1 t0
1091     movq    mm3, mm1            ; lt l0 l1 l2 l3 l4 l5 l6
1092     movq    mm4, mm2            ; t7 t6 t5 t4 t3 t2 t1 t0
1093     PALIGNR mm2, mm1, 7, mm5    ; t6 t5 t4 t3 t2 t1 t0 lt
1094     PALIGNR mm1, mm0, 7, mm6    ; l0 l1 l2 l3 l4 l5 l6 l7
1095     PALIGNR mm4, mm3, 1, mm7    ; t0 lt l0 l1 l2 l3 l4 l5
1096     movq    mm5, mm3
1097     pavgb   mm3, mm1
1098     PRED8x8_LOWPASS b, mm0, mm4, mm1, mm5, mm7
1099     movq    mm4, mm2
1100     movq    mm1, mm2            ; t6 t5 t4 t3 t2 t1 t0 lt
1101     psrlq   mm4, 16             ; .. .. t6 t5 t4 t3 t2 t1
1102     psrlq   mm1, 8              ; .. t6 t5 t4 t3 t2 t1 t0
1103     PRED8x8_LOWPASS b, mm6, mm4, mm2, mm1, mm5
1104                                 ; .. p11 p10 p9
1105     movq    mm7, mm3
1106     punpcklbw mm3, mm0          ; p4 p3 p2 p1
1107     punpckhbw mm7, mm0          ; p8 p7 p6 p5
1108     movq    mm1, mm7
1109     movq    mm0, mm7
1110     movq    mm4, mm7
1111     movq   [r0+3*FDEC_STRIDE], mm3
1112     PALIGNR mm7, mm3, 2, mm5
1113     movq   [r0+2*FDEC_STRIDE], mm7
1114     PALIGNR mm1, mm3, 4, mm5
1115     movq   [r0+1*FDEC_STRIDE], mm1
1116     PALIGNR mm0, mm3, 6, mm3
1117     movq    [r0+0*FDEC_STRIDE], mm0
1118     movq    mm2, mm6
1119     movq    mm3, mm6
1120     movq   [r0-1*FDEC_STRIDE], mm4
1121     PALIGNR mm6, mm4, 2, mm5
1122     movq   [r0-2*FDEC_STRIDE], mm6
1123     PALIGNR mm2, mm4, 4, mm5
1124     movq   [r0-3*FDEC_STRIDE], mm2
1125     PALIGNR mm3, mm4, 6, mm4
1126     movq   [r0-4*FDEC_STRIDE], mm3
1127     RET
1128
1129 ;-----------------------------------------------------------------------------
1130 ; void predict_8x8_hd( uint8_t *src, uint8_t *edge )
1131 ;-----------------------------------------------------------------------------
1132 %macro PREDICT_8x8_HD 1
1133 cglobal predict_8x8_hd_%1, 2,2
1134     add       r0, 4*FDEC_STRIDE
1135     movdqa  xmm0, [r1]
1136     movdqa  xmm1, [r1+16]
1137     movdqa  xmm2, xmm1
1138     movdqa  xmm3, xmm1
1139     PALIGNR xmm1, xmm0, 7, xmm4
1140     PALIGNR xmm2, xmm0, 9, xmm5
1141     PALIGNR xmm3, xmm0, 8, xmm0
1142     movdqa  xmm4, xmm1
1143     pavgb   xmm4, xmm3
1144     PRED8x8_LOWPASS b, xmm0, xmm1, xmm2, xmm3, xmm5
1145     punpcklbw xmm4, xmm0
1146     movhlps xmm0, xmm4
1147
1148 %assign Y 3
1149 %rep 3
1150     movq   [r0+(Y)*FDEC_STRIDE], xmm4
1151     movq   [r0+(Y-4)*FDEC_STRIDE], xmm0
1152     psrldq xmm4, 2
1153     psrldq xmm0, 2
1154 %assign Y (Y-1)
1155 %endrep
1156     movq   [r0+(Y)*FDEC_STRIDE], xmm4
1157     movq   [r0+(Y-4)*FDEC_STRIDE], xmm0
1158     RET
1159 %endmacro
1160
1161 INIT_XMM
1162 PREDICT_8x8_HD sse2
1163 %define PALIGNR PALIGNR_SSSE3
1164 PREDICT_8x8_HD ssse3
1165 INIT_MMX
1166 %define PALIGNR PALIGNR_MMX
1167
1168 ;-----------------------------------------------------------------------------
1169 ; void predict_8x8_hu( uint8_t *src, uint8_t *edge )
1170 ;-----------------------------------------------------------------------------
1171 %macro PREDICT_8x8_HU 1
1172 cglobal predict_8x8_hu_%1, 2,2
1173     add        r0, 4*FDEC_STRIDE
1174 %ifidn %1, ssse3
1175     movq      mm5, [r1+7]
1176     movq      mm6, [pb_reverse]
1177     movq      mm1, mm5
1178     movq      mm2, mm5
1179     movq      mm3, mm5
1180     pshufb    mm5, mm6
1181     psrlq     mm6, 8
1182     pshufb    mm2, mm6
1183     psrlq     mm6, 8
1184     pshufb    mm3, mm6
1185     movq      mm4, mm5
1186 %else
1187     movq      mm1, [r1+7]           ; l0 l1 l2 l3 l4 l5 l6 l7
1188     pshufw    mm0, mm1, 00011011b   ; l6 l7 l4 l5 l2 l3 l0 l1
1189     movq      mm2, mm0
1190     psllw     mm0, 8
1191     psrlw     mm2, 8
1192     por       mm2, mm0              ; l7 l6 l5 l4 l3 l2 l1 l0
1193     psllq     mm1, 56               ; l7 .. .. .. .. .. .. ..
1194     movq      mm3, mm2
1195     movq      mm4, mm2
1196     movq      mm5, mm2
1197     psrlq     mm2, 8
1198     psrlq     mm3, 16
1199     por       mm2, mm1              ; l7 l7 l6 l5 l4 l3 l2 l1
1200     punpckhbw mm1, mm1
1201     por       mm3, mm1              ; l7 l7 l7 l6 l5 l4 l3 l2
1202 %endif
1203     pavgb     mm4, mm2
1204     PRED8x8_LOWPASS b, mm1, mm3, mm5, mm2, mm6
1205
1206     movq2dq   xmm0, mm4
1207     movq2dq   xmm1, mm1
1208     punpcklbw xmm0, xmm1
1209     punpckhbw  mm4, mm1
1210 %assign Y -4
1211 %rep 3
1212     movq     [r0+Y*FDEC_STRIDE], xmm0
1213     psrldq    xmm0, 2
1214 %assign Y (Y+1)
1215 %endrep
1216     pshufw     mm5, mm4, 11111001b
1217     pshufw     mm6, mm4, 11111110b
1218     pshufw     mm7, mm4, 11111111b
1219     movq     [r0+Y*FDEC_STRIDE], xmm0
1220     movq     [r0+0*FDEC_STRIDE], mm4
1221     movq     [r0+1*FDEC_STRIDE], mm5
1222     movq     [r0+2*FDEC_STRIDE], mm6
1223     movq     [r0+3*FDEC_STRIDE], mm7
1224     RET
1225 %endmacro
1226
1227 PREDICT_8x8_HU sse2
1228 PREDICT_8x8_HU ssse3
1229
1230 ;-----------------------------------------------------------------------------
1231 ; void predict_8x8c_v( uint8_t *src )
1232 ;-----------------------------------------------------------------------------
1233 cglobal predict_8x8c_v_mmx, 1,1
1234     movq        mm0, [r0 - FDEC_STRIDE]
1235     STORE8x8    mm0, mm0
1236     RET
1237
1238 ;-----------------------------------------------------------------------------
1239 ; void predict_8x8c_h( uint8_t *src )
1240 ;-----------------------------------------------------------------------------
1241
1242 %macro PRED_8x8C_H 1
1243 cglobal predict_8x8c_h_%1, 1,1
1244 %ifidn %1, ssse3
1245     mova   m1, [pb_3]
1246 %endif
1247     add    r0, FDEC_STRIDE*4
1248 %assign n -4
1249 %rep 8
1250     SPLATB m0, r0+FDEC_STRIDE*n-1, m1
1251     mova [r0+FDEC_STRIDE*n], m0
1252 %assign n n+1
1253 %endrep
1254     RET
1255 %endmacro
1256
1257 INIT_MMX
1258 %define SPLATB SPLATB_MMX
1259 PRED_8x8C_H mmxext
1260 %define SPLATB SPLATB_SSSE3
1261 PRED_8x8C_H ssse3
1262
1263 ;-----------------------------------------------------------------------------
1264 ; void predict_8x8c_dc( pixel *src )
1265 ;-----------------------------------------------------------------------------
1266
1267 %macro PREDICT_8x8C_DC 1
1268 cglobal predict_8x8c_dc_%1, 1,3
1269     pxor      m7, m7
1270 %ifdef HIGH_BIT_DEPTH
1271     movq      m0, [r0-FDEC_STRIDEB+0]
1272     movq      m1, [r0-FDEC_STRIDEB+8]
1273     HADDW     m0, m2
1274     HADDW     m1, m2
1275 %else
1276     movd      m0, [r0-FDEC_STRIDEB+0]
1277     movd      m1, [r0-FDEC_STRIDEB+4]
1278     psadbw    m0, m7            ; s0
1279     psadbw    m1, m7            ; s1
1280 %endif
1281     add       r0, FDEC_STRIDEB*4
1282
1283     movzx    r1d, pixel [r0-FDEC_STRIDEB*4-SIZEOF_PIXEL]
1284     movzx    r2d, pixel [r0-FDEC_STRIDEB*3-SIZEOF_PIXEL]
1285     add      r1d, r2d
1286     movzx    r2d, pixel [r0-FDEC_STRIDEB*2-SIZEOF_PIXEL]
1287     add      r1d, r2d
1288     movzx    r2d, pixel [r0-FDEC_STRIDEB*1-SIZEOF_PIXEL]
1289     add      r1d, r2d
1290     movd      m2, r1d            ; s2
1291
1292     movzx    r1d, pixel [r0+FDEC_STRIDEB*0-SIZEOF_PIXEL]
1293     movzx    r2d, pixel [r0+FDEC_STRIDEB*1-SIZEOF_PIXEL]
1294     add      r1d, r2d
1295     movzx    r2d, pixel [r0+FDEC_STRIDEB*2-SIZEOF_PIXEL]
1296     add      r1d, r2d
1297     movzx    r2d, pixel [r0+FDEC_STRIDEB*3-SIZEOF_PIXEL]
1298     add      r1d, r2d
1299     movd      m3, r1d            ; s3
1300
1301     punpcklwd m0, m1
1302     punpcklwd m2, m3
1303     punpckldq m0, m2            ; s0, s1, s2, s3
1304     pshufw    m3, m0, 11110110b ; s2, s1, s3, s3
1305     pshufw    m0, m0, 01110100b ; s0, s1, s3, s1
1306     paddw     m0, m3
1307     psrlw     m0, 2
1308     pavgw     m0, m7            ; s0+s2, s1, s3, s1+s3
1309 %ifdef HIGH_BIT_DEPTH
1310 %ifidn %1, sse2
1311     movq2dq   xmm0, m0
1312     punpcklwd xmm0, xmm0
1313     pshufd    xmm1, xmm0, 11111010b
1314     punpckldq xmm0, xmm0
1315 %assign n 0
1316 %rep 8
1317 %assign i (0 + (n/4))
1318     movdqa [r0+FDEC_STRIDEB*(n-4)+0], xmm %+ i
1319 %assign n n+1
1320 %endrep
1321 %else
1322     pshufw    m1, m0, 0x00
1323     pshufw    m2, m0, 0x55
1324     pshufw    m3, m0, 0xaa
1325     pshufw    m4, m0, 0xff
1326 %assign n 0
1327 %rep 8
1328 %assign i (1 + (n/4)*2)
1329 %assign j (2 + (n/4)*2)
1330     movq [r0+FDEC_STRIDEB*(n-4)+0], m %+ i
1331     movq [r0+FDEC_STRIDEB*(n-4)+8], m %+ j
1332 %assign n n+1
1333 %endrep
1334 %endif
1335 %else
1336     packuswb  m0, m0
1337     punpcklbw m0, m0
1338     movq      m1, m0
1339     punpcklbw m0, m0
1340     punpckhbw m1, m1
1341 %assign n 0
1342 %rep 8
1343 %assign i (0 + (n/4))
1344     movq [r0+FDEC_STRIDEB*(n-4)], m %+ i
1345 %assign n n+1
1346 %endrep
1347 %endif
1348     RET
1349 %endmacro
1350
1351 INIT_MMX
1352 PREDICT_8x8C_DC mmxext
1353 %ifdef HIGH_BIT_DEPTH
1354 PREDICT_8x8C_DC sse2
1355 %endif
1356
1357 cglobal predict_8x8c_dc_top_mmxext, 1,1
1358     movq        mm0, [r0 - FDEC_STRIDE]
1359     pxor        mm1, mm1
1360     pxor        mm2, mm2
1361     punpckhbw   mm1, mm0
1362     punpcklbw   mm0, mm2
1363     psadbw      mm1, mm2        ; s1
1364     psadbw      mm0, mm2        ; s0
1365     psrlw       mm1, 1
1366     psrlw       mm0, 1
1367     pavgw       mm1, mm2
1368     pavgw       mm0, mm2
1369     pshufw      mm1, mm1, 0
1370     pshufw      mm0, mm0, 0     ; dc0 (w)
1371     packuswb    mm0, mm1        ; dc0,dc1 (b)
1372     STORE8x8    mm0, mm0
1373     RET
1374
1375 ;-----------------------------------------------------------------------------
1376 ; void predict_8x8c_p_core( uint8_t *src, int i00, int b, int c )
1377 ;-----------------------------------------------------------------------------
1378
1379 cglobal predict_8x8c_p_core_sse2, 1,1
1380     movd        xmm0, r1m
1381     movd        xmm2, r2m
1382     movd        xmm4, r3m
1383     pshuflw     xmm0, xmm0, 0
1384     pshuflw     xmm2, xmm2, 0
1385     pshuflw     xmm4, xmm4, 0
1386     punpcklqdq  xmm0, xmm0
1387     punpcklqdq  xmm2, xmm2
1388     punpcklqdq  xmm4, xmm4
1389     pmullw      xmm2, [pw_76543210]
1390     paddsw      xmm0, xmm2        ; xmm0 = {i+0*b, i+1*b, i+2*b, i+3*b, i+4*b, i+5*b, i+6*b, i+7*b}
1391     movdqa      xmm3, xmm0
1392     paddsw      xmm3, xmm4
1393     paddsw      xmm4, xmm4
1394 call .loop
1395     add           r0, FDEC_STRIDE*4
1396 .loop:
1397     movdqa      xmm5, xmm0
1398     movdqa      xmm1, xmm3
1399     psraw       xmm0, 5
1400     psraw       xmm3, 5
1401     packuswb    xmm0, xmm3
1402     movq        [r0+FDEC_STRIDE*0], xmm0
1403     movhps      [r0+FDEC_STRIDE*1], xmm0
1404     paddsw      xmm5, xmm4
1405     paddsw      xmm1, xmm4
1406     movdqa      xmm0, xmm5
1407     movdqa      xmm3, xmm1
1408     psraw       xmm5, 5
1409     psraw       xmm1, 5
1410     packuswb    xmm5, xmm1
1411     movq        [r0+FDEC_STRIDE*2], xmm5
1412     movhps      [r0+FDEC_STRIDE*3], xmm5
1413     paddsw      xmm0, xmm4
1414     paddsw      xmm3, xmm4
1415     RET
1416
1417 ;-----------------------------------------------------------------------------
1418 ; void predict_16x16_p_core( uint8_t *src, int i00, int b, int c )
1419 ;-----------------------------------------------------------------------------
1420 cglobal predict_16x16_p_core_sse2, 1,2,8
1421     movd        xmm0, r1m
1422     movd        xmm1, r2m
1423     movd        xmm2, r3m
1424     pshuflw     xmm0, xmm0, 0
1425     pshuflw     xmm1, xmm1, 0
1426     pshuflw     xmm2, xmm2, 0
1427     punpcklqdq  xmm0, xmm0
1428     punpcklqdq  xmm1, xmm1
1429     punpcklqdq  xmm2, xmm2
1430     movdqa      xmm3, xmm1
1431     pmullw      xmm3, [pw_76543210]
1432     psllw       xmm1, 3
1433     paddsw      xmm0, xmm3  ; xmm0 = {i+ 0*b, i+ 1*b, i+ 2*b, i+ 3*b, i+ 4*b, i+ 5*b, i+ 6*b, i+ 7*b}
1434     paddsw      xmm1, xmm0  ; xmm1 = {i+ 8*b, i+ 9*b, i+10*b, i+11*b, i+12*b, i+13*b, i+14*b, i+15*b}
1435     movdqa      xmm7, xmm2
1436     paddsw      xmm7, xmm7
1437     mov         r1d, 8
1438 ALIGN 4
1439 .loop:
1440     movdqa      xmm3, xmm0
1441     movdqa      xmm4, xmm1
1442     movdqa      xmm5, xmm0
1443     movdqa      xmm6, xmm1
1444     psraw       xmm3, 5
1445     psraw       xmm4, 5
1446     paddsw      xmm5, xmm2
1447     paddsw      xmm6, xmm2
1448     psraw       xmm5, 5
1449     psraw       xmm6, 5
1450     packuswb    xmm3, xmm4
1451     packuswb    xmm5, xmm6
1452     movdqa      [r0+FDEC_STRIDE*0], xmm3
1453     movdqa      [r0+FDEC_STRIDE*1], xmm5
1454     paddsw      xmm0, xmm7
1455     paddsw      xmm1, xmm7
1456     add         r0, FDEC_STRIDE*2
1457     dec         r1d
1458     jg          .loop
1459     REP_RET
1460
1461 ;-----------------------------------------------------------------------------
1462 ; void predict_16x16_v( pixel *src )
1463 ;-----------------------------------------------------------------------------
1464 %ifdef HIGH_BIT_DEPTH
1465 INIT_MMX
1466 cglobal predict_16x16_v_mmx, 1,2
1467     mova        m0, [r0 - FDEC_STRIDEB+ 0]
1468     mova        m1, [r0 - FDEC_STRIDEB+ 8]
1469     mova        m2, [r0 - FDEC_STRIDEB+16]
1470     mova        m3, [r0 - FDEC_STRIDEB+24]
1471     STORE16x16  m0, m1, m2, m3
1472     REP_RET
1473 INIT_XMM
1474 cglobal predict_16x16_v_sse2, 2,2
1475     mova      m0, [r0 - FDEC_STRIDEB+ 0]
1476     mova      m1, [r0 - FDEC_STRIDEB+16]
1477     STORE16x16_SSE2 m0, m1
1478     REP_RET
1479 %else
1480 INIT_MMX
1481 cglobal predict_16x16_v_mmx, 1,2
1482     movq        m0, [r0 - FDEC_STRIDE + 0]
1483     movq        m1, [r0 - FDEC_STRIDE + 8]
1484     STORE16x16  m0, m1
1485     REP_RET
1486 INIT_XMM
1487 cglobal predict_16x16_v_sse2, 1,1
1488     movdqa      xmm0, [r0 - FDEC_STRIDE]
1489     STORE16x16_SSE2 xmm0
1490     RET
1491 %endif
1492
1493 ;-----------------------------------------------------------------------------
1494 ; void predict_16x16_h( pixel *src )
1495 ;-----------------------------------------------------------------------------
1496 %macro PRED_16x16_H 1
1497 cglobal predict_16x16_h_%1, 1,2
1498     mov r1, 12*FDEC_STRIDEB
1499 %ifdef HIGH_BIT_DEPTH
1500 .vloop:
1501 %assign n 0
1502 %rep 4
1503     movd        m0, [r0+r1+n*FDEC_STRIDEB-2*SIZEOF_PIXEL]
1504     SPLATW      m0, m0, 1
1505     mova [r0+r1+n*FDEC_STRIDEB+ 0], m0
1506     mova [r0+r1+n*FDEC_STRIDEB+16], m0
1507 %if mmsize==8
1508     mova [r0+r1+n*FDEC_STRIDEB+ 8], m0
1509     mova [r0+r1+n*FDEC_STRIDEB+24], m0
1510 %endif
1511 %assign n n+1
1512 %endrep
1513
1514 %else
1515 %ifidn %1, ssse3
1516     mova   m1, [pb_3]
1517 %endif
1518 .vloop:
1519 %assign n 0
1520 %rep 4
1521     SPLATB m0, r0+r1+FDEC_STRIDE*n-1, m1
1522     mova [r0+r1+FDEC_STRIDE*n], m0
1523 %if mmsize==8
1524     mova [r0+r1+FDEC_STRIDE*n+8], m0
1525 %endif
1526 %assign n n+1
1527 %endrep
1528 %endif ; HIGH_BIT_DEPTH
1529     sub r1, 4*FDEC_STRIDEB
1530     jge .vloop
1531     REP_RET
1532 %endmacro
1533
1534 INIT_MMX
1535 %define SPLATB SPLATB_MMX
1536 PRED_16x16_H mmxext
1537 INIT_XMM
1538 %ifdef HIGH_BIT_DEPTH
1539 PRED_16x16_H sse2
1540 %else
1541 ;no SSE2 for 8-bit, it's slower than MMX on all systems that don't support SSSE3
1542 %define SPLATB SPLATB_SSSE3
1543 PRED_16x16_H ssse3
1544 %endif
1545
1546 ;-----------------------------------------------------------------------------
1547 ; void predict_16x16_dc_core( pixel *src, int i_dc_left )
1548 ;-----------------------------------------------------------------------------
1549
1550 %macro PRED16x16_DC 2
1551 %ifdef HIGH_BIT_DEPTH
1552     mova       m0, [r0 - FDEC_STRIDEB+ 0]
1553     paddw      m0, [r0 - FDEC_STRIDEB+ 8]
1554     paddw      m0, [r0 - FDEC_STRIDEB+16]
1555     paddw      m0, [r0 - FDEC_STRIDEB+24]
1556     HADDW      m0, m1
1557     paddw      m0, %1
1558     psrlw      m0, %2
1559     SPLATW     m0, m0
1560     STORE16x16 m0, m0, m0, m0
1561 %else
1562     pxor        m0, m0
1563     pxor        m1, m1
1564     psadbw      m0, [r0 - FDEC_STRIDE]
1565     psadbw      m1, [r0 - FDEC_STRIDE + 8]
1566     paddusw     m0, m1
1567     paddusw     m0, %1
1568     psrlw       m0, %2                      ; dc
1569     pshufw      m0, m0, 0
1570     packuswb    m0, m0                      ; dc in bytes
1571     STORE16x16  m0, m0
1572 %endif
1573 %endmacro
1574
1575 INIT_MMX
1576 cglobal predict_16x16_dc_core_mmxext, 1,2
1577 %ifdef ARCH_X86_64
1578     movd         m6, r1d
1579     PRED16x16_DC m6, 5
1580 %else
1581     PRED16x16_DC r1m, 5
1582 %endif
1583     REP_RET
1584
1585 INIT_MMX
1586 cglobal predict_16x16_dc_top_mmxext, 1,2
1587     PRED16x16_DC [pw_8], 4
1588     REP_RET
1589
1590 INIT_MMX
1591 %ifdef HIGH_BIT_DEPTH
1592 cglobal predict_16x16_dc_left_core_mmxext, 1,2
1593     movd       m0, r1m
1594     SPLATW     m0, m0
1595     STORE16x16 m0, m0, m0, m0
1596     REP_RET
1597 %else
1598 cglobal predict_16x16_dc_left_core_mmxext, 1,1
1599     movd       m0, r1m
1600     pshufw     m0, m0, 0
1601     packuswb   m0, m0
1602     STORE16x16 m0, m0
1603     REP_RET
1604 %endif
1605
1606 ;-----------------------------------------------------------------------------
1607 ; void predict_16x16_dc_core( pixel *src, int i_dc_left )
1608 ;-----------------------------------------------------------------------------
1609
1610 %macro PRED16x16_DC_SSE2 2
1611 %ifdef HIGH_BIT_DEPTH
1612     mova       m0, [r0 - FDEC_STRIDEB+ 0]
1613     paddw      m0, [r0 - FDEC_STRIDEB+16]
1614     HADDW      m0, m2
1615     paddw      m0, %1
1616     psrlw      m0, %2
1617     SPLATW     m0, m0
1618     STORE16x16_SSE2 m0, m0
1619 %else
1620     pxor        m0, m0
1621     psadbw      m0, [r0 - FDEC_STRIDE]
1622     movhlps     m1, m0
1623     paddw       m0, m1
1624     paddusw     m0, %1
1625     psrlw       m0, %2              ; dc
1626     SPLATW      m0, m0
1627     packuswb    m0, m0              ; dc in bytes
1628     STORE16x16_SSE2 m0
1629 %endif
1630 %endmacro
1631
1632 INIT_XMM
1633 cglobal predict_16x16_dc_core_sse2, 2,2,4
1634     movd       m3, r1m
1635     PRED16x16_DC_SSE2 m3, 5
1636     REP_RET
1637
1638 cglobal predict_16x16_dc_top_sse2, 1,2
1639     PRED16x16_DC_SSE2 [pw_8], 4
1640     REP_RET
1641
1642 INIT_XMM
1643 %ifdef HIGH_BIT_DEPTH
1644 cglobal predict_16x16_dc_left_core_sse2, 1,2
1645     movd       m0, r1m
1646     SPLATW     m0, m0
1647     STORE16x16_SSE2 m0, m0
1648     REP_RET
1649 %else
1650 cglobal predict_16x16_dc_left_core_sse2, 1,1
1651     movd       m0, r1m
1652     SPLATW     m0, m0
1653     packuswb   m0, m0
1654     STORE16x16_SSE2 m0
1655     RET
1656 %endif