]> git.sesse.net Git - x264/blob - common/x86/predict-a.asm
BMI1 decimate functions
[x264] / common / x86 / predict-a.asm
1 ;*****************************************************************************
2 ;* predict-a.asm: x86 intra prediction
3 ;*****************************************************************************
4 ;* Copyright (C) 2005-2012 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 pw_43210123: dw -3, -2, -1, 0, 1, 2, 3, 4
36 pw_m3:       times 8 dw -3
37 pw_m7:       times 8 dw -7
38 pb_00s_ff:   times 8 db 0
39 pb_0s_ff:    times 7 db 0
40              db 0xff
41 shuf_fixtr:  db 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7
42 shuf_nop:    db 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
43 shuf_hu:     db 7,6,5,4,3,2,1,0,0,0,0,0,0,0,0,0
44 shuf_vr:     db 2,4,6,8,9,10,11,12,13,14,15,0,1,3,5,7
45 pw_reverse:  db 14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1
46
47 SECTION .text
48
49 cextern pb_0
50 cextern pb_1
51 cextern pb_3
52 cextern pw_1
53 cextern pw_2
54 cextern pw_4
55 cextern pw_8
56 cextern pw_16
57 cextern pw_00ff
58 cextern pw_pixel_max
59
60 %macro STORE8x8 2-4
61     add r0, 4*FDEC_STRIDEB
62     mova        [r0 + -4*FDEC_STRIDEB], %1
63     mova        [r0 + -3*FDEC_STRIDEB], %1
64     mova        [r0 + -2*FDEC_STRIDEB], %1
65     mova        [r0 + -1*FDEC_STRIDEB], %1
66     mova        [r0 +  0*FDEC_STRIDEB], %2
67     mova        [r0 +  1*FDEC_STRIDEB], %2
68     mova        [r0 +  2*FDEC_STRIDEB], %2
69     mova        [r0 +  3*FDEC_STRIDEB], %2
70 %endmacro
71
72 %macro STORE8x16 4
73     add r0, 4*FDEC_STRIDEB
74     mova        [r0 + -4*FDEC_STRIDEB], %1
75     mova        [r0 + -3*FDEC_STRIDEB], %1
76     mova        [r0 + -2*FDEC_STRIDEB], %1
77     mova        [r0 + -1*FDEC_STRIDEB], %1
78     add r0, 4*FDEC_STRIDEB
79     mova        [r0 + -4*FDEC_STRIDEB], %2
80     mova        [r0 + -3*FDEC_STRIDEB], %2
81     mova        [r0 + -2*FDEC_STRIDEB], %2
82     mova        [r0 + -1*FDEC_STRIDEB], %2
83     add r0, 4*FDEC_STRIDEB
84     mova        [r0 + -4*FDEC_STRIDEB], %3
85     mova        [r0 + -3*FDEC_STRIDEB], %3
86     mova        [r0 + -2*FDEC_STRIDEB], %3
87     mova        [r0 + -1*FDEC_STRIDEB], %3
88     mova        [r0 +  0*FDEC_STRIDEB], %4
89     mova        [r0 +  1*FDEC_STRIDEB], %4
90     mova        [r0 +  2*FDEC_STRIDEB], %4
91     mova        [r0 +  3*FDEC_STRIDEB], %4
92 %endmacro
93
94 %macro STORE16x16 2-4
95 %ifidn %0, 4
96     mov         r1d, 8
97 .loop:
98     mova        [r0 + 0*FDEC_STRIDEB + 0], %1
99     mova        [r0 + 1*FDEC_STRIDEB + 0], %1
100     mova        [r0 + 0*FDEC_STRIDEB + 8], %2
101     mova        [r0 + 1*FDEC_STRIDEB + 8], %2
102     mova        [r0 + 0*FDEC_STRIDEB +16], %3
103     mova        [r0 + 1*FDEC_STRIDEB +16], %3
104     mova        [r0 + 0*FDEC_STRIDEB +24], %4
105     mova        [r0 + 1*FDEC_STRIDEB +24], %4
106     add         r0, 2*FDEC_STRIDEB
107     dec         r1d
108     jg          .loop
109 %else
110     mov         r1d, 4
111 .loop:
112     mova        [r0 + 0*FDEC_STRIDE], %1
113     mova        [r0 + 1*FDEC_STRIDE], %1
114     mova        [r0 + 2*FDEC_STRIDE], %1
115     mova        [r0 + 3*FDEC_STRIDE], %1
116     mova        [r0 + 0*FDEC_STRIDE + 8], %2
117     mova        [r0 + 1*FDEC_STRIDE + 8], %2
118     mova        [r0 + 2*FDEC_STRIDE + 8], %2
119     mova        [r0 + 3*FDEC_STRIDE + 8], %2
120     add         r0, 4*FDEC_STRIDE
121     dec         r1d
122     jg          .loop
123 %endif
124 %endmacro
125
126 %macro STORE16x16_SSE2 1-2
127 %ifidn %0,2
128     mov r1d, 4
129 .loop
130     mova      [r0+0*FDEC_STRIDEB+ 0], %1
131     mova      [r0+0*FDEC_STRIDEB+16], %2
132     mova      [r0+1*FDEC_STRIDEB+ 0], %1
133     mova      [r0+1*FDEC_STRIDEB+16], %2
134     mova      [r0+2*FDEC_STRIDEB+ 0], %1
135     mova      [r0+2*FDEC_STRIDEB+16], %2
136     mova      [r0+3*FDEC_STRIDEB+ 0], %1
137     mova      [r0+3*FDEC_STRIDEB+16], %2
138     add       r0, 4*FDEC_STRIDEB
139     dec       r1d
140     jg        .loop
141 %else
142     add r0, 4*FDEC_STRIDEB
143     mova      [r0 + -4*FDEC_STRIDEB], %1
144     mova      [r0 + -3*FDEC_STRIDEB], %1
145     mova      [r0 + -2*FDEC_STRIDEB], %1
146     mova      [r0 + -1*FDEC_STRIDEB], %1
147     mova      [r0 +  0*FDEC_STRIDEB], %1
148     mova      [r0 +  1*FDEC_STRIDEB], %1
149     mova      [r0 +  2*FDEC_STRIDEB], %1
150     mova      [r0 +  3*FDEC_STRIDEB], %1
151     add r0, 8*FDEC_STRIDEB
152     mova      [r0 + -4*FDEC_STRIDEB], %1
153     mova      [r0 + -3*FDEC_STRIDEB], %1
154     mova      [r0 + -2*FDEC_STRIDEB], %1
155     mova      [r0 + -1*FDEC_STRIDEB], %1
156     mova      [r0 +  0*FDEC_STRIDEB], %1
157     mova      [r0 +  1*FDEC_STRIDEB], %1
158     mova      [r0 +  2*FDEC_STRIDEB], %1
159     mova      [r0 +  3*FDEC_STRIDEB], %1
160 %endif
161 %endmacro
162
163 ; dest, left, right, src, tmp
164 ; output: %1 = (t[n-1] + t[n]*2 + t[n+1] + 2) >> 2
165 %macro PRED8x8_LOWPASS 4-5
166 %if HIGH_BIT_DEPTH
167     paddw       %2, %3
168     psrlw       %2, 1
169     pavgw       %1, %4, %2
170 %else
171     mova        %5, %2
172     pavgb       %2, %3
173     pxor        %3, %5
174     pand        %3, [pb_1]
175     psubusb     %2, %3
176     pavgb       %1, %4, %2
177 %endif
178 %endmacro
179
180 ;-----------------------------------------------------------------------------
181 ; void predict_4x4_ddl( pixel *src )
182 ;-----------------------------------------------------------------------------
183 %macro PREDICT_4x4_DDL 0
184 cglobal predict_4x4_ddl, 1,1
185     movu    m1, [r0-FDEC_STRIDEB]
186     PSLLPIX m2, m1, 1
187     mova    m0, m1
188 %if HIGH_BIT_DEPTH
189     PSRLPIX m1, m1, 1
190     pshufhw m1, m1, q2210
191 %else
192     pxor    m1, m2
193     PSRLPIX m1, m1, 1
194     pxor    m1, m0
195 %endif
196     PRED8x8_LOWPASS m0, m2, m1, m0, m3
197
198 %assign Y 0
199 %rep 4
200     PSRLPIX m0, m0, 1
201     movh   [r0+Y*FDEC_STRIDEB], m0
202 %assign Y (Y+1)
203 %endrep
204
205     RET
206 %endmacro
207
208 %if HIGH_BIT_DEPTH
209 INIT_XMM sse2
210 PREDICT_4x4_DDL
211 INIT_XMM avx
212 PREDICT_4x4_DDL
213 INIT_MMX mmx2
214 cglobal predict_4x4_ddl, 1,2
215     movu    m1, [r0-FDEC_STRIDEB+4]
216     PRED8x8_LOWPASS m0, m1, [r0-FDEC_STRIDEB+0], [r0-FDEC_STRIDEB+2]
217     mova    m3, [r0-FDEC_STRIDEB+8]
218     mova    [r0+0*FDEC_STRIDEB], m0
219     pshufw  m4, m3, q3321
220     PRED8x8_LOWPASS m2, m4, [r0-FDEC_STRIDEB+6], m3
221     mova    [r0+3*FDEC_STRIDEB], m2
222     pshufw  m1, m0, q0021
223     punpckldq m1, m2
224     mova    [r0+1*FDEC_STRIDEB], m1
225     psllq   m0, 16
226     PALIGNR m2, m0, 6, m0
227     mova    [r0+2*FDEC_STRIDEB], m2
228     RET
229 %else ; !HIGH_BIT_DEPTH
230 INIT_MMX mmx2
231 PREDICT_4x4_DDL
232 %endif
233
234 ;-----------------------------------------------------------------------------
235 ; void predict_4x4_vr( pixel *src )
236 ;-----------------------------------------------------------------------------
237 %if HIGH_BIT_DEPTH == 0
238 INIT_MMX ssse3
239 cglobal predict_4x4_vr, 1,1
240     movd    m1, [r0-1*FDEC_STRIDEB]        ; ........t3t2t1t0
241     mova    m4, m1
242     palignr m1, [r0-1*FDEC_STRIDEB-8], 7   ; ......t3t2t1t0lt
243     pavgb   m4, m1
244     palignr m1, [r0+0*FDEC_STRIDEB-8], 7   ; ....t3t2t1t0ltl0
245     mova    m0, m1
246     palignr m1, [r0+1*FDEC_STRIDEB-8], 7   ; ..t3t2t1t0ltl0l1
247     mova    m2, m1
248     palignr m1, [r0+2*FDEC_STRIDEB-8], 7   ; t3t2t1t0ltl0l1l2
249     PRED8x8_LOWPASS m2, m0, m1, m2, m3
250     pshufw  m0, m2, 0
251     psrlq   m2, 16
252     movd    [r0+0*FDEC_STRIDEB], m4
253     palignr m4, m0, 7
254     movd    [r0+1*FDEC_STRIDEB], m2
255     psllq   m0, 8
256     movd    [r0+2*FDEC_STRIDEB], m4
257     palignr m2, m0, 7
258     movd    [r0+3*FDEC_STRIDEB], m2
259     RET
260 %endif ; !HIGH_BIT_DEPTH
261
262 ;-----------------------------------------------------------------------------
263 ; void predict_4x4_ddr( pixel *src )
264 ;-----------------------------------------------------------------------------
265 %macro PREDICT_4x4 4
266 cglobal predict_4x4_ddr, 1,1
267 %if HIGH_BIT_DEPTH
268     movu      m2, [r0-1*FDEC_STRIDEB-8]
269     pinsrw    m2, [r0+0*FDEC_STRIDEB-2], 2
270     pinsrw    m2, [r0+1*FDEC_STRIDEB-2], 1
271     pinsrw    m2, [r0+2*FDEC_STRIDEB-2], 0
272     movhps    m3, [r0+3*FDEC_STRIDEB-8]
273 %else ; !HIGH_BIT_DEPTH
274     movd      m0, [r0+2*FDEC_STRIDEB-4]
275     movd      m1, [r0+0*FDEC_STRIDEB-4]
276     punpcklbw m0, [r0+1*FDEC_STRIDEB-4]
277     punpcklbw m1, [r0-1*FDEC_STRIDEB-4]
278     punpckhwd m0, m1
279     movd      m2, [r0-1*FDEC_STRIDEB]
280 %if cpuflag(ssse3)
281     palignr   m2, m0, 4
282 %else
283     psllq     m2, 32
284     punpckhdq m0, m2
285     SWAP       2, 0
286 %endif
287     movd      m3, [r0+3*FDEC_STRIDEB-4]
288     psllq     m3, 32
289 %endif ; !HIGH_BIT_DEPTH
290
291     PSRLPIX   m1, m2, 1
292     mova      m0, m2
293     PALIGNR   m2, m3, 7*SIZEOF_PIXEL, m3
294     PRED8x8_LOWPASS m0, m2, m1, m0, m3
295 %assign Y 3
296     movh      [r0+Y*FDEC_STRIDEB], m0
297 %rep 3
298 %assign Y (Y-1)
299     PSRLPIX   m0, m0, 1
300     movh      [r0+Y*FDEC_STRIDEB], m0
301 %endrep
302     RET
303
304 ;-----------------------------------------------------------------------------
305 ; void predict_4x4_vr( pixel *src )
306 ;-----------------------------------------------------------------------------
307 cglobal predict_4x4_vr, 1,1
308 %if HIGH_BIT_DEPTH
309     movu      m1, [r0-1*FDEC_STRIDEB-8]
310     pinsrw    m1, [r0+0*FDEC_STRIDEB-2], 2
311     pinsrw    m1, [r0+1*FDEC_STRIDEB-2], 1
312     pinsrw    m1, [r0+2*FDEC_STRIDEB-2], 0
313 %else ; !HIGH_BIT_DEPTH
314     movd      m0, [r0+2*FDEC_STRIDEB-4]
315     movd      m1, [r0+0*FDEC_STRIDEB-4]
316     punpcklbw m0, [r0+1*FDEC_STRIDEB-4]
317     punpcklbw m1, [r0-1*FDEC_STRIDEB-4]
318     punpckhwd m0, m1
319     movd      m1, [r0-1*FDEC_STRIDEB]
320 %if cpuflag(ssse3)
321     palignr   m1, m0, 4
322 %else
323     psllq     m1, 32
324     punpckhdq m0, m1
325     SWAP       1, 0
326 %endif
327 %endif ; !HIGH_BIT_DEPTH
328     PSRLPIX   m2, m1, 1
329     PSRLPIX   m0, m1, 2
330     pavg%1    m4, m1, m2
331     PSRLPIX   m4, m4, 3
332     PRED8x8_LOWPASS m2, m0, m1, m2, m3
333     PSLLPIX   m0, m2, 6
334     PSRLPIX   m2, m2, 2
335     movh      [r0+0*FDEC_STRIDEB], m4
336     PALIGNR   m4, m0, 7*SIZEOF_PIXEL, m3
337     movh      [r0+1*FDEC_STRIDEB], m2
338     PSLLPIX   m0, m0, 1
339     movh      [r0+2*FDEC_STRIDEB], m4
340     PALIGNR   m2, m0, 7*SIZEOF_PIXEL, m0
341     movh      [r0+3*FDEC_STRIDEB], m2
342     RET
343
344 ;-----------------------------------------------------------------------------
345 ; void predict_4x4_hd( pixel *src )
346 ;-----------------------------------------------------------------------------
347 cglobal predict_4x4_hd, 1,1
348 %if HIGH_BIT_DEPTH
349     movu      m1, [r0-1*FDEC_STRIDEB-8]
350     PSLLPIX   m1, m1, 1
351     pinsrw    m1, [r0+0*FDEC_STRIDEB-2], 3
352     pinsrw    m1, [r0+1*FDEC_STRIDEB-2], 2
353     pinsrw    m1, [r0+2*FDEC_STRIDEB-2], 1
354     pinsrw    m1, [r0+3*FDEC_STRIDEB-2], 0
355 %else
356     movd      m0, [r0-1*FDEC_STRIDEB-4] ; lt ..
357     punpckldq m0, [r0-1*FDEC_STRIDEB]   ; t3 t2 t1 t0 lt .. .. ..
358     PSLLPIX   m0, m0, 1                 ; t2 t1 t0 lt .. .. .. ..
359     movd      m1, [r0+3*FDEC_STRIDEB-4] ; l3
360     punpcklbw m1, [r0+2*FDEC_STRIDEB-4] ; l2 l3
361     movd      m2, [r0+1*FDEC_STRIDEB-4] ; l1
362     punpcklbw m2, [r0+0*FDEC_STRIDEB-4] ; l0 l1
363     punpckh%3 m1, m2                    ; l0 l1 l2 l3
364     punpckh%4 m1, m0                    ; t2 t1 t0 lt l0 l1 l2 l3
365 %endif
366     PSRLPIX   m2, m1, 1                 ; .. t2 t1 t0 lt l0 l1 l2
367     PSRLPIX   m0, m1, 2                 ; .. .. t2 t1 t0 lt l0 l1
368     pavg%1    m5, m1, m2
369     PRED8x8_LOWPASS m3, m1, m0, m2, m4
370     punpckl%2 m5, m3
371     PSRLPIX   m3, m3, 4
372     PALIGNR   m3, m5, 6*SIZEOF_PIXEL, m4
373 %assign Y 3
374     movh      [r0+Y*FDEC_STRIDEB], m5
375 %rep 2
376 %assign Y (Y-1)
377     PSRLPIX   m5, m5, 2
378     movh      [r0+Y*FDEC_STRIDEB], m5
379 %endrep
380     movh      [r0+0*FDEC_STRIDEB], m3
381     RET
382 %endmacro ; PREDICT_4x4
383
384 ;-----------------------------------------------------------------------------
385 ; void predict_4x4_ddr( pixel *src )
386 ;-----------------------------------------------------------------------------
387 %if HIGH_BIT_DEPTH
388 INIT_MMX mmx2
389 cglobal predict_4x4_ddr, 1,1
390     mova      m0, [r0+1*FDEC_STRIDEB-8]
391     punpckhwd m0, [r0+0*FDEC_STRIDEB-8]
392     mova      m3, [r0+3*FDEC_STRIDEB-8]
393     punpckhwd m3, [r0+2*FDEC_STRIDEB-8]
394     punpckhdq m3, m0
395
396     pshufw  m0, m3, q3321
397     pinsrw  m0, [r0-1*FDEC_STRIDEB-2], 3
398     pshufw  m1, m0, q3321
399     PRED8x8_LOWPASS m0, m1, m3, m0
400     movq    [r0+3*FDEC_STRIDEB], m0
401
402     movq    m2, [r0-1*FDEC_STRIDEB-0]
403     pshufw  m4, m2, q2100
404     pinsrw  m4, [r0-1*FDEC_STRIDEB-2], 0
405     movq    m1, m4
406     PALIGNR m4, m3, 6, m3
407     PRED8x8_LOWPASS m1, m4, m2, m1
408     movq    [r0+0*FDEC_STRIDEB], m1
409
410     pshufw  m2, m0, q3321
411     punpckldq m2, m1
412     psllq   m0, 16
413     PALIGNR m1, m0, 6, m0
414     movq    [r0+1*FDEC_STRIDEB], m1
415     movq    [r0+2*FDEC_STRIDEB], m2
416     movd    [r0+3*FDEC_STRIDEB+4], m1
417     RET
418
419 ;-----------------------------------------------------------------------------
420 ; void predict_4x4_hd( pixel *src )
421 ;-----------------------------------------------------------------------------
422 cglobal predict_4x4_hd, 1,1
423     mova      m0, [r0+1*FDEC_STRIDEB-8]
424     punpckhwd m0, [r0+0*FDEC_STRIDEB-8]
425     mova      m1, [r0+3*FDEC_STRIDEB-8]
426     punpckhwd m1, [r0+2*FDEC_STRIDEB-8]
427     punpckhdq m1, m0
428     mova      m0, m1
429
430     movu      m3, [r0-1*FDEC_STRIDEB-2]
431     pshufw    m4, m1, q0032
432     mova      m7, m3
433     punpckldq m4, m3
434     PALIGNR   m3, m1, 2, m2
435     PRED8x8_LOWPASS m2, m4, m1, m3
436
437     pavgw     m0, m3
438     punpcklwd m5, m0, m2
439     punpckhwd m4, m0, m2
440     mova      [r0+3*FDEC_STRIDEB], m5
441     mova      [r0+1*FDEC_STRIDEB], m4
442     psrlq     m5, 32
443     punpckldq m5, m4
444     mova      [r0+2*FDEC_STRIDEB], m5
445
446     pshufw    m4, m7, q2100
447     mova      m6, [r0-1*FDEC_STRIDEB+0]
448     pinsrw    m4, [r0+0*FDEC_STRIDEB-2], 0
449     PRED8x8_LOWPASS m3, m4, m6, m7
450     PALIGNR   m3, m0, 6, m0
451     mova      [r0+0*FDEC_STRIDEB], m3
452     RET
453
454 INIT_XMM sse2
455 PREDICT_4x4 w, wd, dq, qdq
456 INIT_XMM ssse3
457 PREDICT_4x4 w, wd, dq, qdq
458 INIT_XMM avx
459 PREDICT_4x4 w, wd, dq, qdq
460 %else ; !HIGH_BIT_DEPTH
461 INIT_MMX mmx2
462 PREDICT_4x4 b, bw, wd, dq
463 INIT_MMX ssse3
464 %define predict_4x4_vr_ssse3 predict_4x4_vr_ssse3_cache64
465 PREDICT_4x4 b, bw, wd, dq
466 %endif
467
468 ;-----------------------------------------------------------------------------
469 ; void predict_4x4_hu( pixel *src )
470 ;-----------------------------------------------------------------------------
471 %if HIGH_BIT_DEPTH
472 INIT_MMX
473 cglobal predict_4x4_hu_mmx2, 1,1
474     movq      m0, [r0+0*FDEC_STRIDEB-8]
475     punpckhwd m0, [r0+1*FDEC_STRIDEB-8]
476     movq      m1, [r0+2*FDEC_STRIDEB-8]
477     punpckhwd m1, [r0+3*FDEC_STRIDEB-8]
478     punpckhdq m0, m1
479     pshufw    m1, m1, q3333
480     movq      [r0+3*FDEC_STRIDEB], m1
481     pshufw    m3, m0, q3321
482     pshufw    m4, m0, q3332
483     pavgw     m2, m0, m3
484     PRED8x8_LOWPASS m3, m0, m4, m3
485     punpcklwd m4, m2, m3
486     mova      [r0+0*FDEC_STRIDEB], m4
487     psrlq     m2, 16
488     psrlq     m3, 16
489     punpcklwd m2, m3
490     mova      [r0+1*FDEC_STRIDEB], m2
491     punpckhdq m2, m1
492     mova      [r0+2*FDEC_STRIDEB], m2
493     RET
494
495 %else ; !HIGH_BIT_DEPTH
496 INIT_MMX
497 cglobal predict_4x4_hu_mmx2, 1,1
498     movd      m1, [r0+0*FDEC_STRIDEB-4]
499     punpcklbw m1, [r0+1*FDEC_STRIDEB-4]
500     movd      m0, [r0+2*FDEC_STRIDEB-4]
501     punpcklbw m0, [r0+3*FDEC_STRIDEB-4]
502     punpckhwd m1, m0
503     movq      m0, m1
504     punpckhbw m1, m1
505     pshufw    m1, m1, q3333
506     punpckhdq m0, m1
507     movq      m2, m0
508     movq      m3, m0
509     movq      m5, m0
510     psrlq     m3, 8
511     psrlq     m2, 16
512     pavgb     m5, m3
513     PRED8x8_LOWPASS m3, m0, m2, m3, m4
514     movd      [r0+3*FDEC_STRIDEB], m1
515     punpcklbw m5, m3
516     movd      [r0+0*FDEC_STRIDEB], m5
517     psrlq     m5, 16
518     movd      [r0+1*FDEC_STRIDEB], m5
519     psrlq     m5, 16
520     movd      [r0+2*FDEC_STRIDEB], m5
521     RET
522 %endif ; HIGH_BIT_DEPTH
523
524 ;-----------------------------------------------------------------------------
525 ; void predict_4x4_vl( pixel *src )
526 ;-----------------------------------------------------------------------------
527 %macro PREDICT_4x4_V1 1
528 cglobal predict_4x4_vl, 1,1
529     movu        m1, [r0-FDEC_STRIDEB]
530     PSRLPIX     m3, m1, 1
531     PSRLPIX     m2, m1, 2
532     pavg%1      m4, m3, m1
533     PRED8x8_LOWPASS m0, m1, m2, m3, m5
534
535     movh        [r0+0*FDEC_STRIDEB], m4
536     movh        [r0+1*FDEC_STRIDEB], m0
537     PSRLPIX     m4, m4, 1
538     PSRLPIX     m0, m0, 1
539     movh        [r0+2*FDEC_STRIDEB], m4
540     movh        [r0+3*FDEC_STRIDEB], m0
541     RET
542 %endmacro
543
544 %if HIGH_BIT_DEPTH
545 INIT_XMM sse2
546 PREDICT_4x4_V1 w
547 INIT_XMM avx
548 PREDICT_4x4_V1 w
549
550 INIT_MMX mmx2
551 cglobal predict_4x4_vl, 1,4
552     mova    m1, [r0-FDEC_STRIDEB+0]
553     mova    m2, [r0-FDEC_STRIDEB+8]
554     mova    m0, m2
555     PALIGNR m2, m1, 4, m4
556     PALIGNR m0, m1, 2, m4
557     mova    m3, m0
558     pavgw   m3, m1
559     mova    [r0+0*FDEC_STRIDEB], m3
560     psrlq   m3, 16
561     mova    [r0+2*FDEC_STRIDEB], m3
562     PRED8x8_LOWPASS m0, m1, m2, m0
563     mova    [r0+1*FDEC_STRIDEB], m0
564     psrlq   m0, 16
565     mova    [r0+3*FDEC_STRIDEB], m0
566
567     movzx   r1d, word [r0-FDEC_STRIDEB+ 8]
568     movzx   r2d, word [r0-FDEC_STRIDEB+10]
569     movzx   r3d, word [r0-FDEC_STRIDEB+12]
570     lea     r1d, [r1+r2+1]
571     add     r3d, r2d
572     lea     r3d, [r3+r1+1]
573     shr     r1d, 1
574     shr     r3d, 2
575     mov     [r0+2*FDEC_STRIDEB+6], r1w
576     mov     [r0+3*FDEC_STRIDEB+6], r3w
577     RET
578 %else ; !HIGH_BIT_DEPTH
579 INIT_MMX mmx2
580 PREDICT_4x4_V1 b
581 %endif
582
583 ;-----------------------------------------------------------------------------
584 ; void predict_4x4_dc( pixel *src )
585 ;-----------------------------------------------------------------------------
586 INIT_MMX mmx2
587 %if HIGH_BIT_DEPTH
588 cglobal predict_4x4_dc, 1,1
589     mova   m2, [r0+0*FDEC_STRIDEB-4*SIZEOF_PIXEL]
590     paddw  m2, [r0+1*FDEC_STRIDEB-4*SIZEOF_PIXEL]
591     paddw  m2, [r0+2*FDEC_STRIDEB-4*SIZEOF_PIXEL]
592     paddw  m2, [r0+3*FDEC_STRIDEB-4*SIZEOF_PIXEL]
593     psrlq  m2, 48
594     mova   m0, [r0-FDEC_STRIDEB]
595     HADDW  m0, m1
596     paddw  m0, [pw_4]
597     paddw  m0, m2
598     psrlw  m0, 3
599     SPLATW m0, m0
600     mova   [r0+0*FDEC_STRIDEB], m0
601     mova   [r0+1*FDEC_STRIDEB], m0
602     mova   [r0+2*FDEC_STRIDEB], m0
603     mova   [r0+3*FDEC_STRIDEB], m0
604     RET
605
606 %else ; !HIGH_BIT_DEPTH
607 cglobal predict_4x4_dc, 1,4
608     pxor   mm7, mm7
609     movd   mm0, [r0-FDEC_STRIDEB]
610     psadbw mm0, mm7
611     movd   r3d, mm0
612     movzx  r1d, byte [r0-1]
613 %assign Y 1
614 %rep 3
615     movzx  r2d, byte [r0+FDEC_STRIDEB*Y-1]
616     add    r1d, r2d
617 %assign Y Y+1
618 %endrep
619     lea    r1d, [r1+r3+4]
620     shr    r1d, 3
621     imul   r1d, 0x01010101
622     mov   [r0+FDEC_STRIDEB*0], r1d
623     mov   [r0+FDEC_STRIDEB*1], r1d
624     mov   [r0+FDEC_STRIDEB*2], r1d
625     mov   [r0+FDEC_STRIDEB*3], r1d
626     RET
627 %endif ; HIGH_BIT_DEPTH
628
629 %macro PREDICT_FILTER 4
630 ;-----------------------------------------------------------------------------
631 ;void predict_8x8_filter( pixel *src, pixel edge[36], int i_neighbor, int i_filters )
632 ;-----------------------------------------------------------------------------
633 cglobal predict_8x8_filter, 4,6,6
634     add          r0, 0x58*SIZEOF_PIXEL
635 %define src r0-0x58*SIZEOF_PIXEL
636 %if ARCH_X86_64 == 0
637     mov          r4, r1
638 %define t1 r4
639 %define t4 r1
640 %else
641 %define t1 r1
642 %define t4 r4
643 %endif
644     test       r3b, 1
645     je .check_top
646     mov        t4d, r2d
647     and        t4d, 8
648     neg         t4
649     mova        m0, [src+0*FDEC_STRIDEB-8*SIZEOF_PIXEL]
650     punpckh%1%2 m0, [src+0*FDEC_STRIDEB-8*SIZEOF_PIXEL+t4*(FDEC_STRIDEB/8)]
651     mova        m1, [src+2*FDEC_STRIDEB-8*SIZEOF_PIXEL]
652     punpckh%1%2 m1, [src+1*FDEC_STRIDEB-8*SIZEOF_PIXEL]
653     punpckh%2%3 m1, m0
654     mova        m2, [src+4*FDEC_STRIDEB-8*SIZEOF_PIXEL]
655     punpckh%1%2 m2, [src+3*FDEC_STRIDEB-8*SIZEOF_PIXEL]
656     mova        m3, [src+6*FDEC_STRIDEB-8*SIZEOF_PIXEL]
657     punpckh%1%2 m3, [src+5*FDEC_STRIDEB-8*SIZEOF_PIXEL]
658     punpckh%2%3 m3, m2
659     punpckh%3%4 m3, m1
660     mova        m0, [src+7*FDEC_STRIDEB-8*SIZEOF_PIXEL]
661     mova        m1, [src-1*FDEC_STRIDEB]
662     PALIGNR     m4, m3, m0, 7*SIZEOF_PIXEL, m0
663     PALIGNR     m1, m1, m3, 1*SIZEOF_PIXEL, m2
664     PRED8x8_LOWPASS m3, m1, m4, m3, m5
665     mova        [t1+8*SIZEOF_PIXEL], m3
666     movzx      t4d, pixel [src+7*FDEC_STRIDEB-1*SIZEOF_PIXEL]
667     movzx      r5d, pixel [src+6*FDEC_STRIDEB-1*SIZEOF_PIXEL]
668     lea        t4d, [t4*3+2]
669     add        t4d, r5d
670     shr        t4d, 2
671     mov         [t1+7*SIZEOF_PIXEL], t4%1
672     mov         [t1+6*SIZEOF_PIXEL], t4%1
673     test       r3b, 2
674     je .done
675 .check_top:
676 %if SIZEOF_PIXEL==1 && cpuflag(ssse3)
677 INIT_XMM cpuname
678     movu        m3, [src-1*FDEC_STRIDEB]
679     movhps      m0, [src-1*FDEC_STRIDEB-8]
680     test       r2b, 8
681     je .fix_lt_2
682 .do_top:
683     and        r2d, 4
684 %ifdef PIC
685     lea         r3, [shuf_fixtr]
686     pshufb      m3, [r3+r2*4]
687 %else
688     pshufb      m3, [shuf_fixtr+r2*4] ; neighbor&MB_TOPRIGHT ? shuf_nop : shuf_fixtr
689 %endif
690     psrldq      m1, m3, 15
691     PALIGNR     m2, m3, m0, 15, m0
692     PALIGNR     m1, m3, 1, m5
693     PRED8x8_LOWPASS m0, m2, m1, m3, m5
694     mova        [t1+16*SIZEOF_PIXEL], m0
695     psrldq      m0, 15
696     movd        [t1+32*SIZEOF_PIXEL], m0
697 .done:
698     REP_RET
699 .fix_lt_2:
700     pslldq      m0, m3, 15
701     jmp .do_top
702
703 %else
704     mova        m0, [src-1*FDEC_STRIDEB-8*SIZEOF_PIXEL]
705     mova        m3, [src-1*FDEC_STRIDEB]
706     mova        m1, [src-1*FDEC_STRIDEB+8*SIZEOF_PIXEL]
707     test       r2b, 8
708     je .fix_lt_2
709     test       r2b, 4
710     je .fix_tr_1
711 .do_top:
712     PALIGNR     m2, m3, m0, 7*SIZEOF_PIXEL, m0
713     PALIGNR     m0, m1, m3, 1*SIZEOF_PIXEL, m5
714     PRED8x8_LOWPASS m4, m2, m0, m3, m5
715     mova        [t1+16*SIZEOF_PIXEL], m4
716     test       r3b, 4
717     je .done
718     PSRLPIX     m5, m1, 7
719     PALIGNR     m2, m1, m3, 7*SIZEOF_PIXEL, m3
720     PALIGNR     m5, m1, 1*SIZEOF_PIXEL, m4
721     PRED8x8_LOWPASS m0, m2, m5, m1, m4
722     mova        [t1+24*SIZEOF_PIXEL], m0
723     PSRLPIX     m0, m0, 7
724     movd        [t1+32*SIZEOF_PIXEL], m0
725 .done:
726     REP_RET
727 .fix_lt_2:
728     PSLLPIX     m0, m3, 7
729     test       r2b, 4
730     jne .do_top
731 .fix_tr_1:
732     punpckh%1%2 m1, m3, m3
733     pshuf%2     m1, m1, q3333
734     jmp .do_top
735 %endif
736 %endmacro
737
738 %if HIGH_BIT_DEPTH
739 INIT_XMM sse2
740 PREDICT_FILTER w, d, q, dq
741 INIT_XMM ssse3
742 PREDICT_FILTER w, d, q, dq
743 INIT_XMM avx
744 PREDICT_FILTER w, d, q, dq
745 %else
746 INIT_MMX mmx2
747 PREDICT_FILTER b, w, d, q
748 INIT_MMX ssse3
749 PREDICT_FILTER b, w, d, q
750 %endif
751
752 ;-----------------------------------------------------------------------------
753 ; void predict_8x8_v( pixel *src, pixel *edge )
754 ;-----------------------------------------------------------------------------
755 %macro PREDICT_8x8_V 0
756 cglobal predict_8x8_v, 2,2
757     mova        m0, [r1+16*SIZEOF_PIXEL]
758     STORE8x8    m0, m0
759     RET
760 %endmacro
761
762 %if HIGH_BIT_DEPTH
763 INIT_XMM sse2
764 PREDICT_8x8_V
765 %else
766 INIT_MMX mmx2
767 PREDICT_8x8_V
768 %endif
769
770 ;-----------------------------------------------------------------------------
771 ; void predict_8x8_h( pixel *src, pixel edge[36] )
772 ;-----------------------------------------------------------------------------
773 %macro PREDICT_8x8_H 2
774 cglobal predict_8x8_h, 2,2
775     movu      m1, [r1+7*SIZEOF_PIXEL]
776     add       r0, 4*FDEC_STRIDEB
777     punpckl%1 m2, m1, m1
778     punpckh%1 m1, m1
779 %assign Y 0
780 %rep 8
781 %assign i 1+Y/4
782     SPLAT%2 m0, m %+ i, (3-Y)&3
783     mova [r0+(Y-4)*FDEC_STRIDEB], m0
784 %assign Y Y+1
785 %endrep
786     RET
787 %endmacro
788
789 %if HIGH_BIT_DEPTH
790 INIT_XMM sse2
791 PREDICT_8x8_H wd, D
792 %else
793 INIT_MMX mmx2
794 PREDICT_8x8_H bw, W
795 %endif
796
797 ;-----------------------------------------------------------------------------
798 ; void predict_8x8_dc( pixel *src, pixel *edge );
799 ;-----------------------------------------------------------------------------
800 %if HIGH_BIT_DEPTH
801 INIT_XMM sse2
802 cglobal predict_8x8_dc, 2,2
803     movu        m0, [r1+14]
804     paddw       m0, [r1+32]
805     HADDW       m0, m1
806     paddw       m0, [pw_8]
807     psrlw       m0, 4
808     SPLATW      m0, m0
809     STORE8x8    m0, m0
810     REP_RET
811
812 %else ; !HIGH_BIT_DEPTH
813 INIT_MMX mmx2
814 cglobal predict_8x8_dc, 2,2
815     pxor        mm0, mm0
816     pxor        mm1, mm1
817     psadbw      mm0, [r1+7]
818     psadbw      mm1, [r1+16]
819     paddw       mm0, [pw_8]
820     paddw       mm0, mm1
821     psrlw       mm0, 4
822     pshufw      mm0, mm0, 0
823     packuswb    mm0, mm0
824     STORE8x8    mm0, mm0
825     RET
826 %endif ; HIGH_BIT_DEPTH
827
828 ;-----------------------------------------------------------------------------
829 ; void predict_8x8_dc_top ( pixel *src, pixel *edge );
830 ; void predict_8x8_dc_left( pixel *src, pixel *edge );
831 ;-----------------------------------------------------------------------------
832 %if HIGH_BIT_DEPTH
833 %macro PREDICT_8x8_DC 3
834 cglobal %1, 2,2
835     %3          m0, [r1+%2]
836     HADDW       m0, m1
837     paddw       m0, [pw_4]
838     psrlw       m0, 3
839     SPLATW      m0, m0
840     STORE8x8    m0, m0
841     RET
842 %endmacro
843 INIT_XMM sse2
844 PREDICT_8x8_DC predict_8x8_dc_top , 32, mova
845 PREDICT_8x8_DC predict_8x8_dc_left, 14, movu
846
847 %else ; !HIGH_BIT_DEPTH
848 %macro PREDICT_8x8_DC 2
849 cglobal %1, 2,2
850     pxor        mm0, mm0
851     psadbw      mm0, [r1+%2]
852     paddw       mm0, [pw_4]
853     psrlw       mm0, 3
854     pshufw      mm0, mm0, 0
855     packuswb    mm0, mm0
856     STORE8x8    mm0, mm0
857     RET
858 %endmacro
859 INIT_MMX
860 PREDICT_8x8_DC predict_8x8_dc_top_mmx2, 16
861 PREDICT_8x8_DC predict_8x8_dc_left_mmx2, 7
862 %endif ; HIGH_BIT_DEPTH
863
864 ; sse2 is faster even on amd for 8-bit, so there's no sense in spending exe
865 ; size on the 8-bit mmx functions below if we know sse2 is available.
866 %macro PREDICT_8x8_DDLR 0
867 ;-----------------------------------------------------------------------------
868 ; void predict_8x8_ddl( pixel *src, pixel *edge )
869 ;-----------------------------------------------------------------------------
870 cglobal predict_8x8_ddl, 2,2,7
871     mova        m0, [r1+16*SIZEOF_PIXEL]
872     mova        m1, [r1+24*SIZEOF_PIXEL]
873 %if cpuflag(cache64)
874     movd        m5, [r1+32*SIZEOF_PIXEL]
875     palignr     m3, m1, m0, 1*SIZEOF_PIXEL
876     palignr     m5, m5, m1, 1*SIZEOF_PIXEL
877     palignr     m4, m1, m0, 7*SIZEOF_PIXEL
878 %else
879     movu        m3, [r1+17*SIZEOF_PIXEL]
880     movu        m4, [r1+23*SIZEOF_PIXEL]
881     movu        m5, [r1+25*SIZEOF_PIXEL]
882 %endif
883     PSLLPIX     m2, m0, 1
884     add         r0, FDEC_STRIDEB*4
885     PRED8x8_LOWPASS m0, m2, m3, m0, m6
886     PRED8x8_LOWPASS m1, m4, m5, m1, m6
887     mova        [r0+3*FDEC_STRIDEB], m1
888 %assign Y 2
889 %rep 6
890     PALIGNR     m1, m0, 7*SIZEOF_PIXEL, m2
891     PSLLPIX     m0, m0, 1
892     mova        [r0+Y*FDEC_STRIDEB], m1
893 %assign Y (Y-1)
894 %endrep
895     PALIGNR     m1, m0, 7*SIZEOF_PIXEL, m0
896     mova        [r0+Y*FDEC_STRIDEB], m1
897     RET
898
899 ;-----------------------------------------------------------------------------
900 ; void predict_8x8_ddr( pixel *src, pixel *edge )
901 ;-----------------------------------------------------------------------------
902 cglobal predict_8x8_ddr, 2,2,7
903     add         r0, FDEC_STRIDEB*4
904     mova        m0, [r1+ 8*SIZEOF_PIXEL]
905     mova        m1, [r1+16*SIZEOF_PIXEL]
906     ; edge[] is 32byte aligned, so some of the unaligned loads are known to be not cachesplit
907     movu        m2, [r1+ 7*SIZEOF_PIXEL]
908     movu        m5, [r1+17*SIZEOF_PIXEL]
909 %if cpuflag(cache64)
910     palignr     m3, m1, m0, 1*SIZEOF_PIXEL
911     palignr     m4, m1, m0, 7*SIZEOF_PIXEL
912 %else
913     movu        m3, [r1+ 9*SIZEOF_PIXEL]
914     movu        m4, [r1+15*SIZEOF_PIXEL]
915 %endif
916     PRED8x8_LOWPASS m0, m2, m3, m0, m6
917     PRED8x8_LOWPASS m1, m4, m5, m1, m6
918     mova        [r0+3*FDEC_STRIDEB], m0
919 %assign Y -4
920 %rep 6
921     PALIGNR     m1, m0, 7*SIZEOF_PIXEL, m2
922     PSLLPIX     m0, m0, 1
923     mova        [r0+Y*FDEC_STRIDEB], m1
924 %assign Y (Y+1)
925 %endrep
926     PALIGNR     m1, m0, 7*SIZEOF_PIXEL, m0
927     mova        [r0+Y*FDEC_STRIDEB], m1
928     RET
929 %endmacro ; PREDICT_8x8_DDLR
930
931 %if HIGH_BIT_DEPTH
932 INIT_XMM sse2
933 PREDICT_8x8_DDLR
934 INIT_XMM ssse3
935 PREDICT_8x8_DDLR
936 INIT_XMM ssse3, cache64
937 PREDICT_8x8_DDLR
938 %elif ARCH_X86_64 == 0
939 INIT_MMX mmx2
940 PREDICT_8x8_DDLR
941 %endif
942
943 ;-----------------------------------------------------------------------------
944 ; void predict_8x8_hu( pixel *src, pixel *edge )
945 ;-----------------------------------------------------------------------------
946 %macro PREDICT_8x8_HU 2
947 cglobal predict_8x8_hu, 2,2,8
948     add       r0, 4*FDEC_STRIDEB
949 %if HIGH_BIT_DEPTH
950 %if cpuflag(ssse3)
951     movu      m5, [r1+7*SIZEOF_PIXEL]
952     pshufb    m5, [pw_reverse]
953 %else
954     movq      m6, [r1+7*SIZEOF_PIXEL]
955     movq      m5, [r1+11*SIZEOF_PIXEL]
956     pshuflw   m6, m6, q0123
957     pshuflw   m5, m5, q0123
958     movlhps   m5, m6
959 %endif ; cpuflag
960     psrldq    m2, m5, 2
961     pshufd    m3, m5, q0321
962     pshufhw   m2, m2, q2210
963     pshufhw   m3, m3, q1110
964     pavgw     m4, m5, m2
965 %else ; !HIGH_BIT_DEPTH
966     movu      m1, [r1+7*SIZEOF_PIXEL] ; l0 l1 l2 l3 l4 l5 l6 l7
967     pshufw    m0, m1, q0123           ; l6 l7 l4 l5 l2 l3 l0 l1
968     psllq     m1, 56                  ; l7 .. .. .. .. .. .. ..
969     mova      m2, m0
970     psllw     m0, 8
971     psrlw     m2, 8
972     por       m2, m0
973     mova      m3, m2
974     mova      m4, m2
975     mova      m5, m2                  ; l7 l6 l5 l4 l3 l2 l1 l0
976     psrlq     m3, 16
977     psrlq     m2, 8
978     por       m2, m1                  ; l7 l7 l6 l5 l4 l3 l2 l1
979     punpckhbw m1, m1
980     por       m3, m1                  ; l7 l7 l7 l6 l5 l4 l3 l2
981     pavgb     m4, m2
982 %endif ; !HIGH_BIT_DEPTH
983     PRED8x8_LOWPASS m2, m3, m5, m2, m6
984     punpckh%2 m0, m4, m2              ; p8 p7 p6 p5
985     punpckl%2 m4, m2                  ; p4 p3 p2 p1
986     PALIGNR   m5, m0, m4, 2*SIZEOF_PIXEL, m3
987     pshuf%1   m1, m0, q3321
988     PALIGNR   m6, m0, m4, 4*SIZEOF_PIXEL, m3
989     pshuf%1   m2, m0, q3332
990     PALIGNR   m7, m0, m4, 6*SIZEOF_PIXEL, m3
991     pshuf%1   m3, m0, q3333
992     mova      [r0-4*FDEC_STRIDEB], m4
993     mova      [r0-3*FDEC_STRIDEB], m5
994     mova      [r0-2*FDEC_STRIDEB], m6
995     mova      [r0-1*FDEC_STRIDEB], m7
996     mova      [r0+0*FDEC_STRIDEB], m0
997     mova      [r0+1*FDEC_STRIDEB], m1
998     mova      [r0+2*FDEC_STRIDEB], m2
999     mova      [r0+3*FDEC_STRIDEB], m3
1000     RET
1001 %endmacro
1002
1003 %if HIGH_BIT_DEPTH
1004 INIT_XMM sse2
1005 PREDICT_8x8_HU d, wd
1006 INIT_XMM ssse3
1007 PREDICT_8x8_HU d, wd
1008 INIT_XMM avx
1009 PREDICT_8x8_HU d, wd
1010 %elif ARCH_X86_64 == 0
1011 INIT_MMX mmx2
1012 PREDICT_8x8_HU w, bw
1013 %endif
1014
1015 ;-----------------------------------------------------------------------------
1016 ; void predict_8x8_vr( pixel *src, pixel *edge )
1017 ;-----------------------------------------------------------------------------
1018 %macro PREDICT_8x8_VR 1
1019 cglobal predict_8x8_vr, 2,3
1020     mova        m2, [r1+16*SIZEOF_PIXEL]
1021 %ifidn cpuname, ssse3
1022     mova        m0, [r1+8*SIZEOF_PIXEL]
1023     palignr     m3, m2, m0, 7*SIZEOF_PIXEL
1024     palignr     m1, m2, m0, 6*SIZEOF_PIXEL
1025 %else
1026     movu        m3, [r1+15*SIZEOF_PIXEL]
1027     movu        m1, [r1+14*SIZEOF_PIXEL]
1028 %endif
1029     pavg%1      m4, m3, m2
1030     add         r0, FDEC_STRIDEB*4
1031     PRED8x8_LOWPASS m3, m1, m2, m3, m5
1032     mova        [r0-4*FDEC_STRIDEB], m4
1033     mova        [r0-3*FDEC_STRIDEB], m3
1034     mova        m1, [r1+8*SIZEOF_PIXEL]
1035     PSLLPIX     m0, m1, 1
1036     PSLLPIX     m2, m1, 2
1037     PRED8x8_LOWPASS m0, m1, m2, m0, m6
1038
1039 %assign Y -2
1040 %rep 5
1041     PALIGNR     m4, m0, 7*SIZEOF_PIXEL, m5
1042     mova        [r0+Y*FDEC_STRIDEB], m4
1043     PSLLPIX     m0, m0, 1
1044     SWAP 3, 4
1045 %assign Y (Y+1)
1046 %endrep
1047     PALIGNR     m4, m0, 7*SIZEOF_PIXEL, m0
1048     mova        [r0+Y*FDEC_STRIDEB], m4
1049     RET
1050 %endmacro
1051
1052 %if HIGH_BIT_DEPTH
1053 INIT_XMM sse2
1054 PREDICT_8x8_VR w
1055 INIT_XMM ssse3
1056 PREDICT_8x8_VR w
1057 INIT_XMM avx
1058 PREDICT_8x8_VR w
1059 %elif ARCH_X86_64 == 0
1060 INIT_MMX mmx2
1061 PREDICT_8x8_VR b
1062 %endif
1063
1064 %macro LOAD_PLANE_ARGS 0
1065 %if ARCH_X86_64
1066     movd        mm0, r1d
1067     movd        mm2, r2d
1068     movd        mm4, r3d
1069     pshufw      mm0, mm0, 0
1070     pshufw      mm2, mm2, 0
1071     pshufw      mm4, mm4, 0
1072 %else
1073     pshufw      mm0, r1m, 0
1074     pshufw      mm2, r2m, 0
1075     pshufw      mm4, r3m, 0
1076 %endif
1077 %endmacro
1078
1079 ;-----------------------------------------------------------------------------
1080 ; void predict_8x8c_p_core( uint8_t *src, int i00, int b, int c )
1081 ;-----------------------------------------------------------------------------
1082 %if ARCH_X86_64 == 0 && HIGH_BIT_DEPTH == 0
1083 %macro PREDICT_CHROMA_P_MMX 1
1084 cglobal predict_8x%1c_p_core, 1,2
1085     LOAD_PLANE_ARGS
1086     movq        m1, m2
1087     pmullw      m2, [pw_3210]
1088     psllw       m1, 2
1089     paddsw      m0, m2        ; m0 = {i+0*b, i+1*b, i+2*b, i+3*b}
1090     paddsw      m1, m0        ; m1 = {i+4*b, i+5*b, i+6*b, i+7*b}
1091     mov         r1d, %1
1092 ALIGN 4
1093 .loop:
1094     movq        m5, m0
1095     movq        m6, m1
1096     psraw       m5, 5
1097     psraw       m6, 5
1098     packuswb    m5, m6
1099     movq        [r0], m5
1100
1101     paddsw      m0, m4
1102     paddsw      m1, m4
1103     add         r0, FDEC_STRIDE
1104     dec         r1d
1105     jg .loop
1106     REP_RET
1107 %endmacro ; PREDICT_CHROMA_P_MMX
1108
1109 INIT_MMX mmx2
1110 PREDICT_CHROMA_P_MMX 8
1111 PREDICT_CHROMA_P_MMX 16
1112 %endif ; !ARCH_X86_64 && !HIGH_BIT_DEPTH
1113
1114 %macro PREDICT_CHROMA_P_XMM 1
1115 %if HIGH_BIT_DEPTH
1116 cglobal predict_8x%1c_p_core, 1,2,7
1117     movd        m0, r1m
1118     movd        m2, r2m
1119     movd        m4, r3m
1120     mova        m3, [pw_pixel_max]
1121     pxor        m1, m1
1122     SPLATW      m0, m0, 0
1123     SPLATW      m2, m2, 0
1124     SPLATW      m4, m4, 0
1125     pmullw      m2, [pw_43210123] ; b
1126 %if %1 == 16
1127     pmullw      m5, m4, [pw_m7]   ; c
1128 %else
1129     pmullw      m5, m4, [pw_m3]
1130 %endif
1131     paddw       m5, [pw_16]
1132     mov        r1d, %1
1133 .loop:
1134     paddsw      m6, m2, m5
1135     paddsw      m6, m0
1136     psraw       m6, 5
1137     CLIPW       m6, m1, m3
1138     mova      [r0], m6
1139     paddw       m5, m4
1140     add         r0, FDEC_STRIDEB
1141     dec        r1d
1142     jg .loop
1143     REP_RET
1144 %else ; !HIGH_BIT_DEPTH
1145 cglobal predict_8x%1c_p_core, 1,2
1146     movd        m0, r1m
1147     movd        m2, r2m
1148     movd        m4, r3m
1149     SPLATW      m0, m0, 0
1150     SPLATW      m2, m2, 0
1151     SPLATW      m4, m4, 0
1152     pmullw      m2, [pw_76543210]
1153     paddsw      m0, m2            ; m0 = {i+0*b, i+1*b, i+2*b, i+3*b, i+4*b, i+5*b, i+6*b, i+7*b}
1154     paddsw      m3, m0, m4
1155     paddsw      m4, m4
1156     mov         r1d, %1/4
1157 .loop:
1158     paddsw      m1, m3, m4
1159     paddsw      m5, m0, m4
1160     psraw       m3, 5
1161     psraw       m0, 5
1162     packuswb    m0, m3
1163     movq        [r0+FDEC_STRIDE*0], m0
1164     movhps      [r0+FDEC_STRIDE*1], m0
1165     paddsw      m0, m5, m4
1166     paddsw      m3, m1, m4
1167     psraw       m5, 5
1168     psraw       m1, 5
1169     packuswb    m5, m1
1170     movq        [r0+FDEC_STRIDE*2], m5
1171     movhps      [r0+FDEC_STRIDE*3], m5
1172     add         r0, FDEC_STRIDE*4
1173     dec        r1d
1174     jg .loop
1175     RET
1176 %endif ; HIGH_BIT_DEPTH
1177 %endmacro ; PREDICT_CHROMA_P_XMM
1178
1179 INIT_XMM sse2
1180 PREDICT_CHROMA_P_XMM 8
1181 PREDICT_CHROMA_P_XMM 16
1182 INIT_XMM avx
1183 PREDICT_CHROMA_P_XMM 8
1184 PREDICT_CHROMA_P_XMM 16
1185
1186 ;-----------------------------------------------------------------------------
1187 ; void predict_16x16_p_core( uint8_t *src, int i00, int b, int c )
1188 ;-----------------------------------------------------------------------------
1189 %if ARCH_X86_64 == 0
1190 INIT_MMX mmx2
1191 cglobal predict_16x16_p_core, 1,2
1192     LOAD_PLANE_ARGS
1193     movq        mm5, mm2
1194     movq        mm1, mm2
1195     pmullw      mm5, [pw_3210]
1196     psllw       mm2, 3
1197     psllw       mm1, 2
1198     movq        mm3, mm2
1199     paddsw      mm0, mm5        ; mm0 = {i+ 0*b, i+ 1*b, i+ 2*b, i+ 3*b}
1200     paddsw      mm1, mm0        ; mm1 = {i+ 4*b, i+ 5*b, i+ 6*b, i+ 7*b}
1201     paddsw      mm2, mm0        ; mm2 = {i+ 8*b, i+ 9*b, i+10*b, i+11*b}
1202     paddsw      mm3, mm1        ; mm3 = {i+12*b, i+13*b, i+14*b, i+15*b}
1203
1204     mov         r1d, 16
1205 ALIGN 4
1206 .loop:
1207     movq        mm5, mm0
1208     movq        mm6, mm1
1209     psraw       mm5, 5
1210     psraw       mm6, 5
1211     packuswb    mm5, mm6
1212     movq        [r0], mm5
1213
1214     movq        mm5, mm2
1215     movq        mm6, mm3
1216     psraw       mm5, 5
1217     psraw       mm6, 5
1218     packuswb    mm5, mm6
1219     movq        [r0+8], mm5
1220
1221     paddsw      mm0, mm4
1222     paddsw      mm1, mm4
1223     paddsw      mm2, mm4
1224     paddsw      mm3, mm4
1225     add         r0, FDEC_STRIDE
1226     dec         r1d
1227     jg          .loop
1228     REP_RET
1229 %endif ; !ARCH_X86_64
1230
1231 %macro PREDICT_16x16_P 0
1232 cglobal predict_16x16_p_core, 1,2,8
1233     movd     m0, r1m
1234     movd     m1, r2m
1235     movd     m2, r3m
1236     SPLATW   m0, m0, 0
1237     SPLATW   m1, m1, 0
1238     SPLATW   m2, m2, 0
1239     pmullw   m3, m1, [pw_76543210]
1240     psllw    m1, 3
1241 %if HIGH_BIT_DEPTH
1242     pxor     m6, m6
1243     mov     r1d, 16
1244 .loop:
1245     mova     m4, m0
1246     mova     m5, m0
1247     mova     m7, m3
1248     paddsw   m7, m6
1249     paddsw   m4, m7
1250     paddsw   m7, m1
1251     paddsw   m5, m7
1252     psraw    m4, 5
1253     psraw    m5, 5
1254     CLIPW    m4, [pb_0], [pw_pixel_max]
1255     CLIPW    m5, [pb_0], [pw_pixel_max]
1256     mova   [r0], m4
1257     mova [r0+16], m5
1258     add      r0, FDEC_STRIDEB
1259     paddw    m6, m2
1260     dec      r1d
1261     jg       .loop
1262 %else ; !HIGH_BIT_DEPTH
1263     paddsw   m0, m3  ; m0 = {i+ 0*b, i+ 1*b, i+ 2*b, i+ 3*b, i+ 4*b, i+ 5*b, i+ 6*b, i+ 7*b}
1264     paddsw   m1, m0  ; m1 = {i+ 8*b, i+ 9*b, i+10*b, i+11*b, i+12*b, i+13*b, i+14*b, i+15*b}
1265     paddsw   m7, m2, m2
1266     mov     r1d, 8
1267 ALIGN 4
1268 .loop:
1269     psraw    m3, m0, 5
1270     psraw    m4, m1, 5
1271     paddsw   m5, m0, m2
1272     paddsw   m6, m1, m2
1273     psraw    m5, 5
1274     psraw    m6, 5
1275     packuswb m3, m4
1276     packuswb m5, m6
1277     mova [r0+FDEC_STRIDE*0], m3
1278     mova [r0+FDEC_STRIDE*1], m5
1279     paddsw   m0, m7
1280     paddsw   m1, m7
1281     add      r0, FDEC_STRIDE*2
1282     dec      r1d
1283     jg       .loop
1284 %endif ; !HIGH_BIT_DEPTH
1285     REP_RET
1286 %endmacro ; PREDICT_16x16_P
1287
1288 INIT_XMM sse2
1289 PREDICT_16x16_P
1290 %if HIGH_BIT_DEPTH == 0
1291 INIT_XMM avx
1292 PREDICT_16x16_P
1293 %endif
1294
1295 %if HIGH_BIT_DEPTH == 0
1296 %macro PREDICT_8x8 0
1297 ;-----------------------------------------------------------------------------
1298 ; void predict_8x8_ddl( uint8_t *src, uint8_t *edge )
1299 ;-----------------------------------------------------------------------------
1300 cglobal predict_8x8_ddl, 2,2
1301     mova        m0, [r1+16]
1302 %ifidn cpuname, ssse3
1303     movd        m2, [r1+32]
1304     palignr     m2, m0, 1
1305 %else
1306     movu        m2, [r1+17]
1307 %endif
1308     pslldq      m1, m0, 1
1309     add        r0, FDEC_STRIDE*4
1310     PRED8x8_LOWPASS m0, m1, m2, m0, m3
1311
1312 %assign Y -4
1313 %rep 8
1314     psrldq      m0, 1
1315     movq        [r0+Y*FDEC_STRIDE], m0
1316 %assign Y (Y+1)
1317 %endrep
1318     RET
1319
1320 %ifnidn cpuname, ssse3
1321 ;-----------------------------------------------------------------------------
1322 ; void predict_8x8_ddr( uint8_t *src, uint8_t *edge )
1323 ;-----------------------------------------------------------------------------
1324 cglobal predict_8x8_ddr, 2,2
1325     movu        m0, [r1+8]
1326     movu        m1, [r1+7]
1327     psrldq      m2, m0, 1
1328     add         r0, FDEC_STRIDE*4
1329     PRED8x8_LOWPASS m0, m1, m2, m0, m3
1330
1331     psrldq      m1, m0, 1
1332 %assign Y 3
1333 %rep 3
1334     movq        [r0+Y*FDEC_STRIDE], m0
1335     movq        [r0+(Y-1)*FDEC_STRIDE], m1
1336     psrldq      m0, 2
1337     psrldq      m1, 2
1338 %assign Y (Y-2)
1339 %endrep
1340     movq        [r0-3*FDEC_STRIDE], m0
1341     movq        [r0-4*FDEC_STRIDE], m1
1342     RET
1343
1344 ;-----------------------------------------------------------------------------
1345 ; void predict_8x8_vl( uint8_t *src, uint8_t *edge )
1346 ;-----------------------------------------------------------------------------
1347 cglobal predict_8x8_vl, 2,2
1348     mova        m0, [r1+16]
1349     pslldq      m1, m0, 1
1350     psrldq      m2, m0, 1
1351     pavgb       m3, m0, m2
1352     add         r0, FDEC_STRIDE*4
1353     PRED8x8_LOWPASS m0, m1, m2, m0, m5
1354 ; m0: (t0 + 2*t1 + t2 + 2) >> 2
1355 ; m3: (t0 + t1 + 1) >> 1
1356
1357 %assign Y -4
1358 %rep 3
1359     psrldq      m0, 1
1360     movq        [r0+ Y   *FDEC_STRIDE], m3
1361     movq        [r0+(Y+1)*FDEC_STRIDE], m0
1362     psrldq      m3, 1
1363 %assign Y (Y+2)
1364 %endrep
1365     psrldq      m0, 1
1366     movq        [r0+ Y   *FDEC_STRIDE], m3
1367     movq        [r0+(Y+1)*FDEC_STRIDE], m0
1368     RET
1369 %endif ; !ssse3
1370
1371 ;-----------------------------------------------------------------------------
1372 ; void predict_8x8_vr( uint8_t *src, uint8_t *edge )
1373 ;-----------------------------------------------------------------------------
1374 cglobal predict_8x8_vr, 2,2
1375     movu        m2, [r1+8]
1376     add         r0, 4*FDEC_STRIDE
1377     pslldq      m1, m2, 2
1378     pslldq      m0, m2, 1
1379     pavgb       m3, m2, m0
1380     PRED8x8_LOWPASS m0, m2, m1, m0, m4
1381     movhps      [r0-4*FDEC_STRIDE], m3
1382     movhps      [r0-3*FDEC_STRIDE], m0
1383 %if cpuflag(ssse3)
1384     movhlps     m3, m3
1385     pshufb      m0, [shuf_vr]
1386     palignr     m3, m0, 13
1387 %else
1388     mova        m2, m0
1389     mova        m1, [pw_00ff]
1390     pand        m1, m0
1391     psrlw       m0, 8
1392     packuswb    m1, m0
1393     pslldq      m1, 4
1394     movhlps     m3, m1
1395     shufps      m1, m2, q3210
1396     psrldq      m3, 5
1397     psrldq      m1, 5
1398     SWAP         0, 1
1399 %endif
1400     movq        [r0+3*FDEC_STRIDE], m0
1401     movq        [r0+2*FDEC_STRIDE], m3
1402     psrldq      m0, 1
1403     psrldq      m3, 1
1404     movq        [r0+1*FDEC_STRIDE], m0
1405     movq        [r0+0*FDEC_STRIDE], m3
1406     psrldq      m0, 1
1407     psrldq      m3, 1
1408     movq        [r0-1*FDEC_STRIDE], m0
1409     movq        [r0-2*FDEC_STRIDE], m3
1410     RET
1411 %endmacro ; PREDICT_8x8
1412
1413 INIT_XMM sse2
1414 PREDICT_8x8
1415 INIT_XMM ssse3
1416 PREDICT_8x8
1417 INIT_XMM avx
1418 PREDICT_8x8
1419
1420 %endif ; !HIGH_BIT_DEPTH
1421
1422 ;-----------------------------------------------------------------------------
1423 ; void predict_8x8_vl( pixel *src, pixel *edge )
1424 ;-----------------------------------------------------------------------------
1425 %macro PREDICT_8x8_VL_10 1
1426 cglobal predict_8x8_vl, 2,2,8
1427     mova         m0, [r1+16*SIZEOF_PIXEL]
1428     mova         m1, [r1+24*SIZEOF_PIXEL]
1429     PALIGNR      m2, m1, m0, SIZEOF_PIXEL*1, m4
1430     PSRLPIX      m4, m1, 1
1431     pavg%1       m6, m0, m2
1432     pavg%1       m7, m1, m4
1433     add          r0, FDEC_STRIDEB*4
1434     mova         [r0-4*FDEC_STRIDEB], m6
1435     PALIGNR      m3, m7, m6, SIZEOF_PIXEL*1, m5
1436     mova         [r0-2*FDEC_STRIDEB], m3
1437     PALIGNR      m3, m7, m6, SIZEOF_PIXEL*2, m5
1438     mova         [r0+0*FDEC_STRIDEB], m3
1439     PALIGNR      m7, m7, m6, SIZEOF_PIXEL*3, m5
1440     mova         [r0+2*FDEC_STRIDEB], m7
1441     PALIGNR      m3, m1, m0, SIZEOF_PIXEL*7, m6
1442     PSLLPIX      m5, m0, 1
1443     PRED8x8_LOWPASS m0, m5, m2, m0, m7
1444     PRED8x8_LOWPASS m1, m3, m4, m1, m7
1445     PALIGNR      m4, m1, m0, SIZEOF_PIXEL*1, m2
1446     mova         [r0-3*FDEC_STRIDEB], m4
1447     PALIGNR      m4, m1, m0, SIZEOF_PIXEL*2, m2
1448     mova         [r0-1*FDEC_STRIDEB], m4
1449     PALIGNR      m4, m1, m0, SIZEOF_PIXEL*3, m2
1450     mova         [r0+1*FDEC_STRIDEB], m4
1451     PALIGNR      m1, m1, m0, SIZEOF_PIXEL*4, m2
1452     mova         [r0+3*FDEC_STRIDEB], m1
1453     RET
1454 %endmacro
1455 %if HIGH_BIT_DEPTH
1456 INIT_XMM sse2
1457 PREDICT_8x8_VL_10 w
1458 INIT_XMM ssse3
1459 PREDICT_8x8_VL_10 w
1460 INIT_XMM avx
1461 PREDICT_8x8_VL_10 w
1462 %else
1463 INIT_MMX mmx2
1464 PREDICT_8x8_VL_10 b
1465 %endif
1466
1467 ;-----------------------------------------------------------------------------
1468 ; void predict_8x8_hd( pixel *src, pixel *edge )
1469 ;-----------------------------------------------------------------------------
1470 %macro PREDICT_8x8_HD 2
1471 cglobal predict_8x8_hd, 2,2
1472     add       r0, 4*FDEC_STRIDEB
1473     mova      m0, [r1+ 8*SIZEOF_PIXEL]     ; lt l0 l1 l2 l3 l4 l5 l6
1474     movu      m1, [r1+ 7*SIZEOF_PIXEL]     ; l0 l1 l2 l3 l4 l5 l6 l7
1475 %ifidn cpuname, ssse3
1476     mova      m2, [r1+16*SIZEOF_PIXEL]     ; t7 t6 t5 t4 t3 t2 t1 t0
1477     mova      m4, m2                       ; t7 t6 t5 t4 t3 t2 t1 t0
1478     palignr   m2, m0, 7*SIZEOF_PIXEL       ; t6 t5 t4 t3 t2 t1 t0 lt
1479     palignr   m4, m0, 1*SIZEOF_PIXEL       ; t0 lt l0 l1 l2 l3 l4 l5
1480 %else
1481     movu      m2, [r1+15*SIZEOF_PIXEL]
1482     movu      m4, [r1+ 9*SIZEOF_PIXEL]
1483 %endif ; cpuflag
1484     pavg%1    m3, m0, m1
1485     PRED8x8_LOWPASS m0, m4, m1, m0, m5
1486     PSRLPIX   m4, m2, 2                    ; .. .. t6 t5 t4 t3 t2 t1
1487     PSRLPIX   m1, m2, 1                    ; .. t6 t5 t4 t3 t2 t1 t0
1488     PRED8x8_LOWPASS m1, m4, m2, m1, m5
1489                                            ; .. p11 p10 p9
1490     punpckh%2 m2, m3, m0                   ; p8 p7 p6 p5
1491     punpckl%2 m3, m0                       ; p4 p3 p2 p1
1492     mova      [r0+3*FDEC_STRIDEB], m3
1493     PALIGNR   m0, m2, m3, 2*SIZEOF_PIXEL, m5
1494     mova      [r0+2*FDEC_STRIDEB], m0
1495     PALIGNR   m0, m2, m3, 4*SIZEOF_PIXEL, m5
1496     mova      [r0+1*FDEC_STRIDEB], m0
1497     PALIGNR   m0, m2, m3, 6*SIZEOF_PIXEL, m3
1498     mova      [r0+0*FDEC_STRIDEB], m0
1499     mova      [r0-1*FDEC_STRIDEB], m2
1500     PALIGNR   m0, m1, m2, 2*SIZEOF_PIXEL, m5
1501     mova      [r0-2*FDEC_STRIDEB], m0
1502     PALIGNR   m0, m1, m2, 4*SIZEOF_PIXEL, m5
1503     mova      [r0-3*FDEC_STRIDEB], m0
1504     PALIGNR   m1, m1, m2, 6*SIZEOF_PIXEL, m2
1505     mova      [r0-4*FDEC_STRIDEB], m1
1506     RET
1507 %endmacro
1508
1509 %if HIGH_BIT_DEPTH
1510 INIT_XMM sse2
1511 PREDICT_8x8_HD w, wd
1512 INIT_XMM ssse3
1513 PREDICT_8x8_HD w, wd
1514 INIT_XMM avx
1515 PREDICT_8x8_HD w, wd
1516 %else
1517 INIT_MMX mmx2
1518 PREDICT_8x8_HD b, bw
1519
1520 ;-----------------------------------------------------------------------------
1521 ; void predict_8x8_hd( uint8_t *src, uint8_t *edge )
1522 ;-----------------------------------------------------------------------------
1523 %macro PREDICT_8x8_HD 0
1524 cglobal predict_8x8_hd, 2,2
1525     add     r0, 4*FDEC_STRIDE
1526     movu    m1, [r1+7]
1527     movu    m3, [r1+8]
1528     movu    m2, [r1+9]
1529     pavgb   m4, m1, m3
1530     PRED8x8_LOWPASS m0, m1, m2, m3, m5
1531     punpcklbw m4, m0
1532     movhlps m0, m4
1533
1534 %assign Y 3
1535 %rep 3
1536     movq   [r0+(Y)*FDEC_STRIDE], m4
1537     movq   [r0+(Y-4)*FDEC_STRIDE], m0
1538     psrldq m4, 2
1539     psrldq m0, 2
1540 %assign Y (Y-1)
1541 %endrep
1542     movq   [r0+(Y)*FDEC_STRIDE], m4
1543     movq   [r0+(Y-4)*FDEC_STRIDE], m0
1544     RET
1545 %endmacro
1546
1547 INIT_XMM sse2
1548 PREDICT_8x8_HD
1549 INIT_XMM avx
1550 PREDICT_8x8_HD
1551 %endif ; HIGH_BIT_DEPTH
1552
1553 %if HIGH_BIT_DEPTH == 0
1554 ;-----------------------------------------------------------------------------
1555 ; void predict_8x8_hu( uint8_t *src, uint8_t *edge )
1556 ;-----------------------------------------------------------------------------
1557 INIT_MMX
1558 cglobal predict_8x8_hu_sse2, 2,2
1559     add        r0, 4*FDEC_STRIDE
1560     movq      mm1, [r1+7]           ; l0 l1 l2 l3 l4 l5 l6 l7
1561     pshufw    mm0, mm1, q0123       ; l6 l7 l4 l5 l2 l3 l0 l1
1562     movq      mm2, mm0
1563     psllw     mm0, 8
1564     psrlw     mm2, 8
1565     por       mm2, mm0              ; l7 l6 l5 l4 l3 l2 l1 l0
1566     psllq     mm1, 56               ; l7 .. .. .. .. .. .. ..
1567     movq      mm3, mm2
1568     movq      mm4, mm2
1569     movq      mm5, mm2
1570     psrlq     mm2, 8
1571     psrlq     mm3, 16
1572     por       mm2, mm1              ; l7 l7 l6 l5 l4 l3 l2 l1
1573     punpckhbw mm1, mm1
1574     por       mm3, mm1              ; l7 l7 l7 l6 l5 l4 l3 l2
1575     pavgb     mm4, mm2
1576     PRED8x8_LOWPASS mm1, mm3, mm5, mm2, mm6
1577
1578     movq2dq   xmm0, mm4
1579     movq2dq   xmm1, mm1
1580     punpcklbw xmm0, xmm1
1581     punpckhbw  mm4, mm1
1582 %assign Y -4
1583 %rep 3
1584     movq     [r0+Y*FDEC_STRIDE], xmm0
1585     psrldq    xmm0, 2
1586 %assign Y (Y+1)
1587 %endrep
1588     pshufw     mm5, mm4, q3321
1589     pshufw     mm6, mm4, q3332
1590     pshufw     mm7, mm4, q3333
1591     movq     [r0+Y*FDEC_STRIDE], xmm0
1592     movq     [r0+0*FDEC_STRIDE], mm4
1593     movq     [r0+1*FDEC_STRIDE], mm5
1594     movq     [r0+2*FDEC_STRIDE], mm6
1595     movq     [r0+3*FDEC_STRIDE], mm7
1596     RET
1597
1598 INIT_XMM
1599 cglobal predict_8x8_hu_ssse3, 2,2
1600     add       r0, 4*FDEC_STRIDE
1601     movq      m3, [r1+7]
1602     pshufb    m3, [shuf_hu]
1603     psrldq    m1, m3, 1
1604     psrldq    m2, m3, 2
1605     pavgb     m0, m1, m3
1606     PRED8x8_LOWPASS m1, m3, m2, m1, m4
1607     punpcklbw m0, m1
1608 %assign Y -4
1609 %rep 3
1610     movq   [r0+ Y   *FDEC_STRIDE], m0
1611     movhps [r0+(Y+4)*FDEC_STRIDE], m0
1612     psrldq    m0, 2
1613     pshufhw   m0, m0, q2210
1614 %assign Y (Y+1)
1615 %endrep
1616     movq   [r0+ Y   *FDEC_STRIDE], m0
1617     movhps [r0+(Y+4)*FDEC_STRIDE], m0
1618     RET
1619 %endif ; !HIGH_BIT_DEPTH
1620
1621 ;-----------------------------------------------------------------------------
1622 ; void predict_8x8c_v( uint8_t *src )
1623 ;-----------------------------------------------------------------------------
1624
1625 %macro PREDICT_8x8C_V 0
1626 cglobal predict_8x8c_v, 1,1
1627     mova        m0, [r0 - FDEC_STRIDEB]
1628     STORE8x8    m0, m0
1629     RET
1630 %endmacro
1631
1632 %if HIGH_BIT_DEPTH
1633 INIT_XMM sse2
1634 PREDICT_8x8C_V
1635 %else
1636 INIT_MMX mmx
1637 PREDICT_8x8C_V
1638 %endif
1639
1640 %if HIGH_BIT_DEPTH
1641
1642 INIT_MMX
1643 cglobal predict_8x8c_v_mmx, 1,1
1644     mova        m0, [r0 - FDEC_STRIDEB]
1645     mova        m1, [r0 - FDEC_STRIDEB + 8]
1646 %assign Y 0
1647 %rep 8
1648     mova        [r0 + (Y&1)*FDEC_STRIDEB], m0
1649     mova        [r0 + (Y&1)*FDEC_STRIDEB + 8], m1
1650 %if (Y&1) && (Y!=7)
1651     add         r0, FDEC_STRIDEB*2
1652 %endif
1653 %assign Y Y+1
1654 %endrep
1655     RET
1656
1657 %endif
1658
1659 %macro PREDICT_8x16C_V 0
1660 cglobal predict_8x16c_v, 1,1
1661     mova        m0, [r0 - FDEC_STRIDEB]
1662     STORE8x16    m0, m0, m0, m0
1663     RET
1664 %endmacro
1665
1666 %if HIGH_BIT_DEPTH
1667 INIT_XMM sse2
1668 PREDICT_8x16C_V
1669 %else
1670 INIT_MMX mmx
1671 PREDICT_8x16C_V
1672 %endif
1673
1674 ;-----------------------------------------------------------------------------
1675 ; void predict_8x8c_h( uint8_t *src )
1676 ;-----------------------------------------------------------------------------
1677 %if HIGH_BIT_DEPTH
1678
1679 %macro PREDICT_C_H 1
1680 cglobal predict_8x%1c_h, 1,1
1681     add        r0, FDEC_STRIDEB*4
1682 %assign Y -4
1683 %rep %1
1684     movd       m0, [r0+FDEC_STRIDEB*Y-SIZEOF_PIXEL*2]
1685     SPLATW     m0, m0, 1
1686     mova [r0+FDEC_STRIDEB*Y], m0
1687 %if mmsize == 8
1688     mova [r0+FDEC_STRIDEB*Y+8], m0
1689 %endif
1690 %assign Y Y+1
1691 %endrep
1692     RET
1693 %endmacro
1694
1695 INIT_MMX mmx2
1696 PREDICT_C_H 8
1697 PREDICT_C_H 16
1698 INIT_XMM sse2
1699 PREDICT_C_H 8
1700 PREDICT_C_H 16
1701
1702 %else ; !HIGH_BIT_DEPTH
1703
1704 %macro PREDICT_C_H_CORE 1
1705 %assign Y %1
1706 %rep 4
1707     SPLATB_LOAD m0, r0+FDEC_STRIDE*Y-1, m1
1708     mova [r0+FDEC_STRIDE*Y], m0
1709 %assign Y Y+1
1710 %endrep
1711 %endmacro
1712
1713 %macro PREDICT_C_H 1
1714 cglobal predict_8x%1c_h, 1,1
1715 %if cpuflag(ssse3)
1716     mova   m1, [pb_3]
1717 %endif
1718 %if %1==16
1719     add    r0, FDEC_STRIDE*4
1720     PREDICT_C_H_CORE -4
1721     add    r0, FDEC_STRIDE*4
1722     PREDICT_C_H_CORE -4
1723 %endif
1724     add    r0, FDEC_STRIDE*4
1725     PREDICT_C_H_CORE -4
1726     PREDICT_C_H_CORE 0
1727     RET
1728 %endmacro
1729
1730 INIT_MMX mmx2
1731 PREDICT_C_H 8
1732 PREDICT_C_H 16
1733 INIT_MMX ssse3
1734 PREDICT_C_H 8
1735 PREDICT_C_H 16
1736
1737 %endif
1738 ;-----------------------------------------------------------------------------
1739 ; void predict_8x8c_dc( pixel *src )
1740 ;-----------------------------------------------------------------------------
1741
1742 %macro LOAD_LEFT 1
1743     movzx    r1d, pixel [r0+FDEC_STRIDEB*(%1-4)-SIZEOF_PIXEL]
1744     movzx    r2d, pixel [r0+FDEC_STRIDEB*(%1-3)-SIZEOF_PIXEL]
1745     add      r1d, r2d
1746     movzx    r2d, pixel [r0+FDEC_STRIDEB*(%1-2)-SIZEOF_PIXEL]
1747     add      r1d, r2d
1748     movzx    r2d, pixel [r0+FDEC_STRIDEB*(%1-1)-SIZEOF_PIXEL]
1749     add      r1d, r2d
1750 %endmacro
1751
1752 %macro PREDICT_8x8C_DC 0
1753 cglobal predict_8x8c_dc, 1,3
1754     pxor      m7, m7
1755 %if HIGH_BIT_DEPTH
1756     movq      m0, [r0-FDEC_STRIDEB+0]
1757     movq      m1, [r0-FDEC_STRIDEB+8]
1758     HADDW     m0, m2
1759     HADDW     m1, m2
1760 %else ; !HIGH_BIT_DEPTH
1761     movd      m0, [r0-FDEC_STRIDEB+0]
1762     movd      m1, [r0-FDEC_STRIDEB+4]
1763     psadbw    m0, m7            ; s0
1764     psadbw    m1, m7            ; s1
1765 %endif
1766     add       r0, FDEC_STRIDEB*4
1767
1768     LOAD_LEFT 0                 ; s2
1769     movd      m2, r1d
1770     LOAD_LEFT 4                 ; s3
1771     movd      m3, r1d
1772
1773     punpcklwd m0, m1
1774     punpcklwd m2, m3
1775     punpckldq m0, m2            ; s0, s1, s2, s3
1776     pshufw    m3, m0, q3312     ; s2, s1, s3, s3
1777     pshufw    m0, m0, q1310     ; s0, s1, s3, s1
1778     paddw     m0, m3
1779     psrlw     m0, 2
1780     pavgw     m0, m7            ; s0+s2, s1, s3, s1+s3
1781 %if HIGH_BIT_DEPTH
1782 %if cpuflag(sse2)
1783     movq2dq   xmm0, m0
1784     punpcklwd xmm0, xmm0
1785     pshufd    xmm1, xmm0, q3322
1786     punpckldq xmm0, xmm0
1787 %assign Y 0
1788 %rep 8
1789 %assign i (0 + (Y/4))
1790     movdqa [r0+FDEC_STRIDEB*(Y-4)+0], xmm %+ i
1791 %assign Y Y+1
1792 %endrep
1793 %else ; !sse2
1794     pshufw    m1, m0, q0000
1795     pshufw    m2, m0, q1111
1796     pshufw    m3, m0, q2222
1797     pshufw    m4, m0, q3333
1798 %assign Y 0
1799 %rep 8
1800 %assign i (1 + (Y/4)*2)
1801 %assign j (2 + (Y/4)*2)
1802     movq [r0+FDEC_STRIDEB*(Y-4)+0], m %+ i
1803     movq [r0+FDEC_STRIDEB*(Y-4)+8], m %+ j
1804 %assign Y Y+1
1805 %endrep
1806 %endif
1807 %else ; !HIGH_BIT_DEPTH
1808     packuswb  m0, m0
1809     punpcklbw m0, m0
1810     movq      m1, m0
1811     punpcklbw m0, m0
1812     punpckhbw m1, m1
1813 %assign Y 0
1814 %rep 8
1815 %assign i (0 + (Y/4))
1816     movq [r0+FDEC_STRIDEB*(Y-4)], m %+ i
1817 %assign Y Y+1
1818 %endrep
1819 %endif
1820     RET
1821 %endmacro
1822
1823 INIT_MMX mmx2
1824 PREDICT_8x8C_DC
1825 %if HIGH_BIT_DEPTH
1826 INIT_MMX sse2
1827 PREDICT_8x8C_DC
1828 %endif
1829
1830 %if HIGH_BIT_DEPTH
1831 %macro STORE_4LINES 3
1832 %if cpuflag(sse2)
1833     movdqa [r0+FDEC_STRIDEB*(%3-4)], %1
1834     movdqa [r0+FDEC_STRIDEB*(%3-3)], %1
1835     movdqa [r0+FDEC_STRIDEB*(%3-2)], %1
1836     movdqa [r0+FDEC_STRIDEB*(%3-1)], %1
1837 %else
1838     movq [r0+FDEC_STRIDEB*(%3-4)+0], %1
1839     movq [r0+FDEC_STRIDEB*(%3-4)+8], %2
1840     movq [r0+FDEC_STRIDEB*(%3-3)+0], %1
1841     movq [r0+FDEC_STRIDEB*(%3-3)+8], %2
1842     movq [r0+FDEC_STRIDEB*(%3-2)+0], %1
1843     movq [r0+FDEC_STRIDEB*(%3-2)+8], %2
1844     movq [r0+FDEC_STRIDEB*(%3-1)+0], %1
1845     movq [r0+FDEC_STRIDEB*(%3-1)+8], %2
1846 %endif
1847 %endmacro
1848 %else
1849 %macro STORE_4LINES 2
1850     movq [r0+FDEC_STRIDEB*(%2-4)], %1
1851     movq [r0+FDEC_STRIDEB*(%2-3)], %1
1852     movq [r0+FDEC_STRIDEB*(%2-2)], %1
1853     movq [r0+FDEC_STRIDEB*(%2-1)], %1
1854 %endmacro
1855 %endif
1856
1857 %macro PREDICT_8x16C_DC 0
1858 cglobal predict_8x16c_dc, 1,3
1859     pxor      m7, m7
1860 %if HIGH_BIT_DEPTH
1861     movq      m0, [r0-FDEC_STRIDEB+0]
1862     movq      m1, [r0-FDEC_STRIDEB+8]
1863     HADDW     m0, m2
1864     HADDW     m1, m2
1865 %else
1866     movd      m0, [r0-FDEC_STRIDEB+0]
1867     movd      m1, [r0-FDEC_STRIDEB+4]
1868     psadbw    m0, m7            ; s0
1869     psadbw    m1, m7            ; s1
1870 %endif
1871     punpcklwd m0, m1            ; s0, s1
1872
1873     add       r0, FDEC_STRIDEB*4
1874     LOAD_LEFT 0                 ; s2
1875     pinsrw    m0, r1d, 2
1876     LOAD_LEFT 4                 ; s3
1877     pinsrw    m0, r1d, 3        ; s0, s1, s2, s3
1878     add       r0, FDEC_STRIDEB*8
1879     LOAD_LEFT 0                 ; s4
1880     pinsrw    m1, r1d, 2
1881     LOAD_LEFT 4                 ; s5
1882     pinsrw    m1, r1d, 3        ; s1, __, s4, s5
1883     sub       r0, FDEC_STRIDEB*8
1884
1885     pshufw    m2, m0, q1310     ; s0, s1, s3, s1
1886     pshufw    m0, m0, q3312     ; s2, s1, s3, s3
1887     pshufw    m3, m1, q0302     ; s4, s1, s5, s1
1888     pshufw    m1, m1, q3322     ; s4, s4, s5, s5
1889     paddw     m0, m2
1890     paddw     m1, m3
1891     psrlw     m0, 2
1892     psrlw     m1, 2
1893     pavgw     m0, m7
1894     pavgw     m1, m7
1895 %if HIGH_BIT_DEPTH
1896 %if cpuflag(sse2)
1897     movq2dq xmm0, m0
1898     movq2dq xmm1, m1
1899     punpcklwd xmm0, xmm0
1900     punpcklwd xmm1, xmm1
1901     pshufd    xmm2, xmm0, q3322
1902     pshufd    xmm3, xmm1, q3322
1903     punpckldq xmm0, xmm0
1904     punpckldq xmm1, xmm1
1905     STORE_4LINES xmm0, xmm0, 0
1906     STORE_4LINES xmm2, xmm2, 4
1907     STORE_4LINES xmm1, xmm1, 8
1908     STORE_4LINES xmm3, xmm3, 12
1909 %else
1910     pshufw    m2, m0, q0000
1911     pshufw    m3, m0, q1111
1912     pshufw    m4, m0, q2222
1913     pshufw    m5, m0, q3333
1914     STORE_4LINES m2, m3, 0
1915     STORE_4LINES m4, m5, 4
1916     pshufw    m2, m1, q0000
1917     pshufw    m3, m1, q1111
1918     pshufw    m4, m1, q2222
1919     pshufw    m5, m1, q3333
1920     STORE_4LINES m2, m3, 8
1921     STORE_4LINES m4, m5, 12
1922 %endif
1923 %else
1924     packuswb  m0, m0            ; dc0, dc1, dc2, dc3
1925     packuswb  m1, m1            ; dc4, dc5, dc6, dc7
1926     punpcklbw m0, m0
1927     punpcklbw m1, m1
1928     pshufw    m2, m0, q1100
1929     pshufw    m3, m0, q3322
1930     pshufw    m4, m1, q1100
1931     pshufw    m5, m1, q3322
1932     STORE_4LINES m2, 0
1933     STORE_4LINES m3, 4
1934     add       r0, FDEC_STRIDEB*8
1935     STORE_4LINES m4, 0
1936     STORE_4LINES m5, 4
1937 %endif
1938     RET
1939 %endmacro
1940
1941 INIT_MMX mmx2
1942 PREDICT_8x16C_DC
1943 %if HIGH_BIT_DEPTH
1944 INIT_MMX sse2
1945 PREDICT_8x16C_DC
1946 %endif
1947
1948 %macro PREDICT_C_DC_TOP 1
1949 %if HIGH_BIT_DEPTH
1950 INIT_XMM
1951 cglobal predict_8x%1c_dc_top_sse2, 1,1
1952     pxor        m2, m2
1953     mova        m0, [r0 - FDEC_STRIDEB]
1954     pshufd      m1, m0, q2301
1955     paddw       m0, m1
1956     pshuflw     m1, m0, q2301
1957     pshufhw     m1, m1, q2301
1958     paddw       m0, m1
1959     psrlw       m0, 1
1960     pavgw       m0, m2
1961     STORE8x%1   m0, m0, m0, m0
1962     RET
1963 %else ; !HIGH_BIT_DEPTH
1964 INIT_MMX
1965 cglobal predict_8x%1c_dc_top_mmx2, 1,1
1966     movq        mm0, [r0 - FDEC_STRIDE]
1967     pxor        mm1, mm1
1968     pxor        mm2, mm2
1969     punpckhbw   mm1, mm0
1970     punpcklbw   mm0, mm2
1971     psadbw      mm1, mm2        ; s1
1972     psadbw      mm0, mm2        ; s0
1973     psrlw       mm1, 1
1974     psrlw       mm0, 1
1975     pavgw       mm1, mm2
1976     pavgw       mm0, mm2
1977     pshufw      mm1, mm1, 0
1978     pshufw      mm0, mm0, 0     ; dc0 (w)
1979     packuswb    mm0, mm1        ; dc0,dc1 (b)
1980     STORE8x%1   mm0, mm0, mm0, mm0
1981     RET
1982 %endif
1983 %endmacro
1984
1985 PREDICT_C_DC_TOP 8
1986 PREDICT_C_DC_TOP 16
1987
1988 ;-----------------------------------------------------------------------------
1989 ; void predict_16x16_v( pixel *src )
1990 ;-----------------------------------------------------------------------------
1991 %if HIGH_BIT_DEPTH
1992 INIT_MMX
1993 cglobal predict_16x16_v_mmx2, 1,2
1994     mova        m0, [r0 - FDEC_STRIDEB+ 0]
1995     mova        m1, [r0 - FDEC_STRIDEB+ 8]
1996     mova        m2, [r0 - FDEC_STRIDEB+16]
1997     mova        m3, [r0 - FDEC_STRIDEB+24]
1998     STORE16x16  m0, m1, m2, m3
1999     REP_RET
2000 INIT_XMM
2001 cglobal predict_16x16_v_sse2, 2,2
2002     mova      m0, [r0 - FDEC_STRIDEB+ 0]
2003     mova      m1, [r0 - FDEC_STRIDEB+16]
2004     STORE16x16_SSE2 m0, m1
2005     REP_RET
2006 %else ; !HIGH_BIT_DEPTH
2007 INIT_MMX
2008 cglobal predict_16x16_v_mmx2, 1,2
2009     movq        m0, [r0 - FDEC_STRIDE + 0]
2010     movq        m1, [r0 - FDEC_STRIDE + 8]
2011     STORE16x16  m0, m1
2012     REP_RET
2013 INIT_XMM
2014 cglobal predict_16x16_v_sse2, 1,1
2015     movdqa      xmm0, [r0 - FDEC_STRIDE]
2016     STORE16x16_SSE2 xmm0
2017     RET
2018 %endif
2019
2020 ;-----------------------------------------------------------------------------
2021 ; void predict_16x16_h( pixel *src )
2022 ;-----------------------------------------------------------------------------
2023 %macro PREDICT_16x16_H 0
2024 cglobal predict_16x16_h, 1,2
2025     mov r1, 12*FDEC_STRIDEB
2026 %if HIGH_BIT_DEPTH
2027 .vloop:
2028 %assign Y 0
2029 %rep 4
2030     movd        m0, [r0+r1+Y*FDEC_STRIDEB-2*SIZEOF_PIXEL]
2031     SPLATW      m0, m0, 1
2032     mova [r0+r1+Y*FDEC_STRIDEB+ 0], m0
2033     mova [r0+r1+Y*FDEC_STRIDEB+16], m0
2034 %if mmsize==8
2035     mova [r0+r1+Y*FDEC_STRIDEB+ 8], m0
2036     mova [r0+r1+Y*FDEC_STRIDEB+24], m0
2037 %endif
2038 %assign Y Y+1
2039 %endrep
2040
2041 %else ; !HIGH_BIT_DEPTH
2042 %if cpuflag(ssse3)
2043     mova   m1, [pb_3]
2044 %endif
2045 .vloop:
2046 %assign Y 0
2047 %rep 4
2048     SPLATB_LOAD m0, r0+r1+FDEC_STRIDE*Y-1, m1
2049     mova [r0+r1+FDEC_STRIDE*Y], m0
2050 %if mmsize==8
2051     mova [r0+r1+FDEC_STRIDE*Y+8], m0
2052 %endif
2053 %assign Y Y+1
2054 %endrep
2055 %endif ; HIGH_BIT_DEPTH
2056     sub r1, 4*FDEC_STRIDEB
2057     jge .vloop
2058     REP_RET
2059 %endmacro
2060
2061 INIT_MMX mmx2
2062 PREDICT_16x16_H
2063 INIT_XMM sse2
2064 %if HIGH_BIT_DEPTH
2065 PREDICT_16x16_H
2066 %else
2067 ;no SSE2 for 8-bit, it's slower than MMX on all systems that don't support SSSE3
2068 INIT_XMM ssse3
2069 PREDICT_16x16_H
2070 %endif
2071
2072 ;-----------------------------------------------------------------------------
2073 ; void predict_16x16_dc_core( pixel *src, int i_dc_left )
2074 ;-----------------------------------------------------------------------------
2075
2076 %macro PRED16x16_DC 2
2077 %if HIGH_BIT_DEPTH
2078     mova       m0, [r0 - FDEC_STRIDEB+ 0]
2079     paddw      m0, [r0 - FDEC_STRIDEB+ 8]
2080     paddw      m0, [r0 - FDEC_STRIDEB+16]
2081     paddw      m0, [r0 - FDEC_STRIDEB+24]
2082     HADDW      m0, m1
2083     paddw      m0, %1
2084     psrlw      m0, %2
2085     SPLATW     m0, m0
2086     STORE16x16 m0, m0, m0, m0
2087 %else ; !HIGH_BIT_DEPTH
2088     pxor        m0, m0
2089     pxor        m1, m1
2090     psadbw      m0, [r0 - FDEC_STRIDE]
2091     psadbw      m1, [r0 - FDEC_STRIDE + 8]
2092     paddusw     m0, m1
2093     paddusw     m0, %1
2094     psrlw       m0, %2                      ; dc
2095     pshufw      m0, m0, 0
2096     packuswb    m0, m0                      ; dc in bytes
2097     STORE16x16  m0, m0
2098 %endif
2099 %endmacro
2100
2101 INIT_MMX mmx2
2102 cglobal predict_16x16_dc_core, 1,2
2103 %if ARCH_X86_64
2104     movd         m6, r1d
2105     PRED16x16_DC m6, 5
2106 %else
2107     PRED16x16_DC r1m, 5
2108 %endif
2109     REP_RET
2110
2111 INIT_MMX mmx2
2112 cglobal predict_16x16_dc_top, 1,2
2113     PRED16x16_DC [pw_8], 4
2114     REP_RET
2115
2116 INIT_MMX mmx2
2117 %if HIGH_BIT_DEPTH
2118 cglobal predict_16x16_dc_left_core, 1,2
2119     movd       m0, r1m
2120     SPLATW     m0, m0
2121     STORE16x16 m0, m0, m0, m0
2122     REP_RET
2123 %else ; !HIGH_BIT_DEPTH
2124 cglobal predict_16x16_dc_left_core, 1,1
2125     movd       m0, r1m
2126     pshufw     m0, m0, 0
2127     packuswb   m0, m0
2128     STORE16x16 m0, m0
2129     REP_RET
2130 %endif
2131
2132 ;-----------------------------------------------------------------------------
2133 ; void predict_16x16_dc_core( pixel *src, int i_dc_left )
2134 ;-----------------------------------------------------------------------------
2135
2136 %macro PRED16x16_DC_SSE2 2
2137 %if HIGH_BIT_DEPTH
2138     mova       m0, [r0 - FDEC_STRIDEB+ 0]
2139     paddw      m0, [r0 - FDEC_STRIDEB+16]
2140     HADDW      m0, m2
2141     paddw      m0, %1
2142     psrlw      m0, %2
2143     SPLATW     m0, m0
2144     STORE16x16_SSE2 m0, m0
2145 %else ; !HIGH_BIT_DEPTH
2146     pxor        m0, m0
2147     psadbw      m0, [r0 - FDEC_STRIDE]
2148     movhlps     m1, m0
2149     paddw       m0, m1
2150     paddusw     m0, %1
2151     psrlw       m0, %2              ; dc
2152     SPLATW      m0, m0
2153     packuswb    m0, m0              ; dc in bytes
2154     STORE16x16_SSE2 m0
2155 %endif
2156 %endmacro
2157
2158 INIT_XMM sse2
2159 cglobal predict_16x16_dc_core, 2,2,4
2160     movd       m3, r1m
2161     PRED16x16_DC_SSE2 m3, 5
2162     REP_RET
2163
2164 cglobal predict_16x16_dc_top, 1,2
2165     PRED16x16_DC_SSE2 [pw_8], 4
2166     REP_RET
2167
2168 INIT_XMM sse2
2169 %if HIGH_BIT_DEPTH
2170 cglobal predict_16x16_dc_left_core, 1,2
2171     movd       m0, r1m
2172     SPLATW     m0, m0
2173     STORE16x16_SSE2 m0, m0
2174     REP_RET
2175 %else ; !HIGH_BIT_DEPTH
2176 cglobal predict_16x16_dc_left_core, 1,1
2177     movd       m0, r1m
2178     SPLATW     m0, m0
2179     packuswb   m0, m0
2180     STORE16x16_SSE2 m0
2181     RET
2182 %endif