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