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