vp9/x86: set correct number of registers used in intra pred asm
[ffmpeg.git] / libavcodec / x86 / vp9intrapred.asm
1 ;******************************************************************************
2 ;* VP9 Intra prediction SIMD optimizations
3 ;*
4 ;* Copyright (c) 2013 Ronald S. Bultje <rsbultje gmail com>
5 ;*
6 ;* Parts based on:
7 ;* H.264 intra prediction asm optimizations
8 ;* Copyright (c) 2010 Jason Garrett-Glaser
9 ;* Copyright (c) 2010 Holger Lubitz
10 ;* Copyright (c) 2010 Loren Merritt
11 ;* Copyright (c) 2010 Ronald S. Bultje
12 ;*
13 ;* This file is part of FFmpeg.
14 ;*
15 ;* FFmpeg is free software; you can redistribute it and/or
16 ;* modify it under the terms of the GNU Lesser General Public
17 ;* License as published by the Free Software Foundation; either
18 ;* version 2.1 of the License, or (at your option) any later version.
19 ;*
20 ;* FFmpeg is distributed in the hope that it will be useful,
21 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
22 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23 ;* Lesser General Public License for more details.
24 ;*
25 ;* You should have received a copy of the GNU Lesser General Public
26 ;* License along with FFmpeg; if not, write to the Free Software
27 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
28 ;******************************************************************************
29
30 %include "libavutil/x86/x86util.asm"
31
32 SECTION_RODATA
33
34 pw_m256: times 8 dw -256
35 pw_m255: times 8 dw -255
36 pw_512:  times 8 dw  512
37 pw_1024: times 8 dw 1024
38 pw_2048: times 8 dw 2048
39 pw_4096: times 8 dw 4096
40 pw_8192: times 8 dw 8192
41
42 pb_4x3_4x2_4x1_4x0: times 4 db 3
43                     times 4 db 2
44                     times 4 db 1
45                     times 4 db 0
46 pb_8x1_8x0:   times 8 db 1
47               times 8 db 0
48 pb_8x3_8x2:   times 8 db 3
49               times 8 db 2
50 pb_0to5_2x7:  db 0, 1, 2, 3, 4, 5, 7, 7
51               times 8 db -1
52 pb_0to6_9x7:  db 0, 1, 2, 3, 4, 5, 6
53               times 9 db 7
54 pb_1to6_10x7: db 1, 2, 3, 4, 5, 6
55               times 10 db 7
56 pb_2to6_3x7:
57 pb_2to6_11x7: db 2, 3, 4, 5, 6
58               times 11 db 7
59 pb_1toE_2xF:  db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15
60 pb_2toE_3xF:  db 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15
61 pb_13456_3xm1: db 1, 3, 4, 5, 6
62                times 3 db -1
63 pb_6012_4xm1: db 6, 0, 1, 2
64               times 4 db -1
65 pb_6xm1_246_8toE: times 6 db -1
66                   db 2, 4, 6, 8, 9, 10, 11, 12, 13, 14
67 pb_6xm1_BDF_0to6: times 6 db -1
68                   db 11, 13, 15, 0, 1, 2, 3, 4, 5, 6
69 pb_02468ACE_13579BDF: db 0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15
70 pb_7to1_9x0:  db 7, 6, 5, 4
71 pb_3to1_5x0:  db 3, 2, 1
72               times 9 db 0
73 pb_Fto0:      db 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
74
75 pb_2:  times 16 db 2
76 pb_15: times 16 db 15
77
78 cextern pb_1
79 cextern pb_3
80
81 SECTION .text
82
83 ; dc_NxN(uint8_t *dst, ptrdiff_t stride, const uint8_t *l, const uint8_t *a)
84
85 INIT_MMX ssse3
86 cglobal vp9_ipred_dc_4x4, 4, 4, 0, dst, stride, l, a
87     movd                    m0, [lq]
88     punpckldq               m0, [aq]
89     pxor                    m1, m1
90     psadbw                  m0, m1
91     pmulhrsw                m0, [pw_4096]
92     pshufb                  m0, m1
93     movd      [dstq+strideq*0], m0
94     movd      [dstq+strideq*1], m0
95     lea                   dstq, [dstq+strideq*2]
96     movd      [dstq+strideq*0], m0
97     movd      [dstq+strideq*1], m0
98     RET
99
100 INIT_MMX ssse3
101 cglobal vp9_ipred_dc_8x8, 4, 4, 0, dst, stride, l, a
102     movq                    m0, [lq]
103     movq                    m1, [aq]
104     DEFINE_ARGS dst, stride, stride3
105     lea               stride3q, [strideq*3]
106     pxor                    m2, m2
107     psadbw                  m0, m2
108     psadbw                  m1, m2
109     paddw                   m0, m1
110     pmulhrsw                m0, [pw_2048]
111     pshufb                  m0, m2
112     movq      [dstq+strideq*0], m0
113     movq      [dstq+strideq*1], m0
114     movq      [dstq+strideq*2], m0
115     movq      [dstq+stride3q ], m0
116     lea                   dstq, [dstq+strideq*4]
117     movq      [dstq+strideq*0], m0
118     movq      [dstq+strideq*1], m0
119     movq      [dstq+strideq*2], m0
120     movq      [dstq+stride3q ], m0
121     RET
122
123 INIT_XMM ssse3
124 cglobal vp9_ipred_dc_16x16, 4, 4, 3, dst, stride, l, a
125     mova                    m0, [lq]
126     mova                    m1, [aq]
127     DEFINE_ARGS dst, stride, stride3, cnt
128     lea               stride3q, [strideq*3]
129     pxor                    m2, m2
130     psadbw                  m0, m2
131     psadbw                  m1, m2
132     paddw                   m0, m1
133     movhlps                 m1, m0
134     paddw                   m0, m1
135     pmulhrsw                m0, [pw_1024]
136     pshufb                  m0, m2
137     mov                   cntd, 4
138 .loop:
139     mova      [dstq+strideq*0], m0
140     mova      [dstq+strideq*1], m0
141     mova      [dstq+strideq*2], m0
142     mova      [dstq+stride3q ], m0
143     lea                   dstq, [dstq+strideq*4]
144     dec                   cntd
145     jg .loop
146     RET
147
148 INIT_XMM ssse3
149 cglobal vp9_ipred_dc_32x32, 4, 4, 5, dst, stride, l, a
150     mova                    m0, [lq]
151     mova                    m1, [lq+16]
152     mova                    m2, [aq]
153     mova                    m3, [aq+16]
154     DEFINE_ARGS dst, stride, stride3, cnt
155     lea               stride3q, [strideq*3]
156     pxor                    m4, m4
157     psadbw                  m0, m4
158     psadbw                  m1, m4
159     psadbw                  m2, m4
160     psadbw                  m3, m4
161     paddw                   m0, m1
162     paddw                   m2, m3
163     paddw                   m0, m2
164     movhlps                 m1, m0
165     paddw                   m0, m1
166     pmulhrsw                m0, [pw_512]
167     pshufb                  m0, m4
168     mov                   cntd, 8
169 .loop:
170     mova   [dstq+strideq*0+ 0], m0
171     mova   [dstq+strideq*0+16], m0
172     mova   [dstq+strideq*1+ 0], m0
173     mova   [dstq+strideq*1+16], m0
174     mova   [dstq+strideq*2+ 0], m0
175     mova   [dstq+strideq*2+16], m0
176     mova   [dstq+stride3q + 0], m0
177     mova   [dstq+stride3q +16], m0
178     lea                   dstq, [dstq+strideq*4]
179     dec                   cntd
180     jg .loop
181     RET
182
183 ; dc_top/left_NxN(uint8_t *dst, ptrdiff_t stride, const uint8_t *l, const uint8_t *a)
184
185 %macro DC_1D_FUNCS 2 ; dir (top or left), arg (a or l)
186 INIT_MMX ssse3
187 cglobal vp9_ipred_dc_%1_4x4, 4, 4, 0, dst, stride, l, a
188     movd                    m0, [%2q]
189     pxor                    m1, m1
190     psadbw                  m0, m1
191     pmulhrsw                m0, [pw_8192]
192     pshufb                  m0, m1
193     movd      [dstq+strideq*0], m0
194     movd      [dstq+strideq*1], m0
195     lea                   dstq, [dstq+strideq*2]
196     movd      [dstq+strideq*0], m0
197     movd      [dstq+strideq*1], m0
198     RET
199
200 INIT_MMX ssse3
201 cglobal vp9_ipred_dc_%1_8x8, 4, 4, 0, dst, stride, l, a
202     movq                    m0, [%2q]
203     DEFINE_ARGS dst, stride, stride3
204     lea               stride3q, [strideq*3]
205     pxor                    m1, m1
206     psadbw                  m0, m1
207     pmulhrsw                m0, [pw_4096]
208     pshufb                  m0, m1
209     movq      [dstq+strideq*0], m0
210     movq      [dstq+strideq*1], m0
211     movq      [dstq+strideq*2], m0
212     movq      [dstq+stride3q ], m0
213     lea                   dstq, [dstq+strideq*4]
214     movq      [dstq+strideq*0], m0
215     movq      [dstq+strideq*1], m0
216     movq      [dstq+strideq*2], m0
217     movq      [dstq+stride3q ], m0
218     RET
219
220 INIT_XMM ssse3
221 cglobal vp9_ipred_dc_%1_16x16, 4, 4, 3, dst, stride, l, a
222     mova                    m0, [%2q]
223     DEFINE_ARGS dst, stride, stride3, cnt
224     lea               stride3q, [strideq*3]
225     pxor                    m2, m2
226     psadbw                  m0, m2
227     movhlps                 m1, m0
228     paddw                   m0, m1
229     pmulhrsw                m0, [pw_2048]
230     pshufb                  m0, m2
231     mov                   cntd, 4
232 .loop:
233     mova      [dstq+strideq*0], m0
234     mova      [dstq+strideq*1], m0
235     mova      [dstq+strideq*2], m0
236     mova      [dstq+stride3q ], m0
237     lea                   dstq, [dstq+strideq*4]
238     dec                   cntd
239     jg .loop
240     RET
241
242 INIT_XMM ssse3
243 cglobal vp9_ipred_dc_%1_32x32, 4, 4, 3, dst, stride, l, a
244     mova                    m0, [%2q]
245     mova                    m1, [%2q+16]
246     DEFINE_ARGS dst, stride, stride3, cnt
247     lea               stride3q, [strideq*3]
248     pxor                    m2, m2
249     psadbw                  m0, m2
250     psadbw                  m1, m2
251     paddw                   m0, m1
252     movhlps                 m1, m0
253     paddw                   m0, m1
254     pmulhrsw                m0, [pw_1024]
255     pshufb                  m0, m2
256     mov                   cntd, 8
257 .loop:
258     mova   [dstq+strideq*0+ 0], m0
259     mova   [dstq+strideq*0+16], m0
260     mova   [dstq+strideq*1+ 0], m0
261     mova   [dstq+strideq*1+16], m0
262     mova   [dstq+strideq*2+ 0], m0
263     mova   [dstq+strideq*2+16], m0
264     mova   [dstq+stride3q + 0], m0
265     mova   [dstq+stride3q +16], m0
266     lea                   dstq, [dstq+strideq*4]
267     dec                   cntd
268     jg .loop
269     RET
270 %endmacro
271
272 DC_1D_FUNCS top,  a
273 DC_1D_FUNCS left, l
274
275 ; v
276
277 INIT_MMX mmx
278 cglobal vp9_ipred_v_8x8, 4, 4, 0, dst, stride, l, a
279     movq                    m0, [aq]
280     DEFINE_ARGS dst, stride, stride3
281     lea               stride3q, [strideq*3]
282     movq      [dstq+strideq*0], m0
283     movq      [dstq+strideq*1], m0
284     movq      [dstq+strideq*2], m0
285     movq      [dstq+stride3q ], m0
286     lea                   dstq, [dstq+strideq*4]
287     movq      [dstq+strideq*0], m0
288     movq      [dstq+strideq*1], m0
289     movq      [dstq+strideq*2], m0
290     movq      [dstq+stride3q ], m0
291     RET
292
293 INIT_XMM sse2
294 cglobal vp9_ipred_v_16x16, 4, 4, 1, dst, stride, l, a
295     mova                    m0, [aq]
296     DEFINE_ARGS dst, stride, stride3, cnt
297     lea               stride3q, [strideq*3]
298     mov                   cntd, 4
299 .loop:
300     mova      [dstq+strideq*0], m0
301     mova      [dstq+strideq*1], m0
302     mova      [dstq+strideq*2], m0
303     mova      [dstq+stride3q ], m0
304     lea                   dstq, [dstq+strideq*4]
305     dec                   cntd
306     jg .loop
307     RET
308
309 INIT_XMM sse2
310 cglobal vp9_ipred_v_32x32, 4, 4, 2, dst, stride, l, a
311     mova                    m0, [aq]
312     mova                    m1, [aq+16]
313     DEFINE_ARGS dst, stride, stride3, cnt
314     lea               stride3q, [strideq*3]
315     mov                   cntd, 8
316 .loop:
317     mova   [dstq+strideq*0+ 0], m0
318     mova   [dstq+strideq*0+16], m1
319     mova   [dstq+strideq*1+ 0], m0
320     mova   [dstq+strideq*1+16], m1
321     mova   [dstq+strideq*2+ 0], m0
322     mova   [dstq+strideq*2+16], m1
323     mova   [dstq+stride3q + 0], m0
324     mova   [dstq+stride3q +16], m1
325     lea                   dstq, [dstq+strideq*4]
326     dec                   cntd
327     jg .loop
328     RET
329
330 ; h
331
332 INIT_XMM ssse3
333 cglobal vp9_ipred_h_4x4, 3, 4, 1, dst, stride, l, stride3
334     movd                    m0, [lq]
335     pshufb                  m0, [pb_4x3_4x2_4x1_4x0]
336     lea               stride3q, [strideq*3]
337     movd      [dstq+strideq*0], m0
338     psrldq                  m0, 4
339     movd      [dstq+strideq*1], m0
340     psrldq                  m0, 4
341     movd      [dstq+strideq*2], m0
342     psrldq                  m0, 4
343     movd      [dstq+stride3q ], m0
344     RET
345
346 %macro H_XMM_FUNCS 1
347 INIT_XMM %1
348 cglobal vp9_ipred_h_8x8, 3, 5, 4, dst, stride, l, stride3, cnt
349     mova                    m2, [pb_8x1_8x0]
350     mova                    m3, [pb_8x3_8x2]
351     lea               stride3q, [strideq*3]
352     mov                   cntq, 1
353 .loop:
354     movd                    m0, [lq+cntq*4]
355     pshufb                  m1, m0, m3
356     pshufb                  m0, m2
357     movq      [dstq+strideq*0], m1
358     movhps    [dstq+strideq*1], m1
359     movq      [dstq+strideq*2], m0
360     movhps    [dstq+stride3q ], m0
361     lea                   dstq, [dstq+strideq*4]
362     dec                   cntq
363     jge .loop
364     RET
365
366 INIT_XMM %1
367 cglobal vp9_ipred_h_16x16, 3, 5, 8, dst, stride, l, stride3, cnt
368     mova                    m5, [pb_1]
369     mova                    m6, [pb_2]
370     mova                    m7, [pb_3]
371     pxor                    m4, m4
372     lea               stride3q, [strideq*3]
373     mov                   cntq, 3
374 .loop:
375     movd                    m3, [lq+cntq*4]
376     pshufb                  m0, m3, m7
377     pshufb                  m1, m3, m6
378     mova      [dstq+strideq*0], m0
379     mova      [dstq+strideq*1], m1
380     pshufb                  m2, m3, m5
381     pshufb                  m3, m4
382     mova      [dstq+strideq*2], m2
383     mova      [dstq+stride3q ], m3
384     lea                   dstq, [dstq+strideq*4]
385     dec                   cntq
386     jge .loop
387     RET
388
389 INIT_XMM %1
390 cglobal vp9_ipred_h_32x32, 3, 5, 8, dst, stride, l, stride3, cnt
391     mova                    m5, [pb_1]
392     mova                    m6, [pb_2]
393     mova                    m7, [pb_3]
394     pxor                    m4, m4
395     lea               stride3q, [strideq*3]
396     mov                   cntq, 7
397 .loop:
398     movd                    m3, [lq+cntq*4]
399     pshufb                  m0, m3, m7
400     pshufb                  m1, m3, m6
401     mova   [dstq+strideq*0+ 0], m0
402     mova   [dstq+strideq*0+16], m0
403     mova   [dstq+strideq*1+ 0], m1
404     mova   [dstq+strideq*1+16], m1
405     pshufb                  m2, m3, m5
406     pshufb                  m3, m4
407     mova   [dstq+strideq*2+ 0], m2
408     mova   [dstq+strideq*2+16], m2
409     mova   [dstq+stride3q + 0], m3
410     mova   [dstq+stride3q +16], m3
411     lea                   dstq, [dstq+strideq*4]
412     dec                   cntq
413     jge .loop
414     RET
415 %endmacro
416
417 H_XMM_FUNCS ssse3
418 H_XMM_FUNCS avx
419
420 ; tm
421
422 INIT_MMX ssse3
423 cglobal vp9_ipred_tm_4x4, 4, 4, 0, dst, stride, l, a
424     pxor                    m1, m1
425     pinsrw                  m2, [aq-1], 0
426     movd                    m0, [aq]
427     DEFINE_ARGS dst, stride, l, cnt
428     mova                    m3, [pw_m256]
429     mova                    m4, [pw_m255]
430     pshufb                  m2, m3
431     punpcklbw               m0, m1
432     psubw                   m0, m2
433     mov                   cntq, 1
434 .loop:
435     pinsrw                  m2, [lq+cntq*2], 0
436     pshufb                  m1, m2, m4
437     pshufb                  m2, m3
438     paddw                   m1, m0
439     paddw                   m2, m0
440     packuswb                m1, m1
441     packuswb                m2, m2
442     movd      [dstq+strideq*0], m1
443     movd      [dstq+strideq*1], m2
444     lea                   dstq, [dstq+strideq*2]
445     dec                   cntq
446     jge .loop
447     RET
448
449 %macro TM_XMM_FUNCS 1
450 INIT_XMM %1
451 cglobal vp9_ipred_tm_8x8, 4, 4, 5, dst, stride, l, a
452     pxor                    m1, m1
453     pinsrw                  m2, [aq-1], 0
454     movh                    m0, [aq]
455     DEFINE_ARGS dst, stride, l, cnt
456     mova                    m3, [pw_m256]
457     mova                    m4, [pw_m255]
458     pshufb                  m2, m3
459     punpcklbw               m0, m1
460     psubw                   m0, m2
461     mov                   cntq, 3
462 .loop:
463     pinsrw                  m2, [lq+cntq*2], 0
464     pshufb                  m1, m2, m4
465     pshufb                  m2, m3
466     paddw                   m1, m0
467     paddw                   m2, m0
468     packuswb                m1, m2
469     movh      [dstq+strideq*0], m1
470     movhps    [dstq+strideq*1], m1
471     lea                   dstq, [dstq+strideq*2]
472     dec                   cntq
473     jge .loop
474     RET
475
476 INIT_XMM %1
477 cglobal vp9_ipred_tm_16x16, 4, 4, 8, dst, stride, l, a
478     pxor                    m3, m3
479     pinsrw                  m2, [aq-1], 0
480     mova                    m0, [aq]
481     DEFINE_ARGS dst, stride, l, cnt
482     mova                    m4, [pw_m256]
483     mova                    m5, [pw_m255]
484     pshufb                  m2, m4
485     punpckhbw               m1, m0, m3
486     punpcklbw               m0, m3
487     psubw                   m1, m2
488     psubw                   m0, m2
489     mov                   cntq, 7
490 .loop:
491     pinsrw                  m7, [lq+cntq*2], 0
492     pshufb                  m3, m7, m5
493     pshufb                  m7, m4
494     paddw                   m2, m3, m0
495     paddw                   m3, m1
496     paddw                   m6, m7, m0
497     paddw                   m7, m1
498     packuswb                m2, m3
499     packuswb                m6, m7
500     mova      [dstq+strideq*0], m2
501     mova      [dstq+strideq*1], m6
502     lea                   dstq, [dstq+strideq*2]
503     dec                   cntq
504     jge .loop
505     RET
506
507 %if ARCH_X86_64
508 INIT_XMM %1
509 cglobal vp9_ipred_tm_32x32, 4, 4, 14, dst, stride, l, a
510     pxor                    m5, m5
511     pinsrw                  m4, [aq-1], 0
512     mova                    m0, [aq]
513     mova                    m2, [aq+16]
514     DEFINE_ARGS dst, stride, l, cnt
515     mova                    m8, [pw_m256]
516     mova                    m9, [pw_m255]
517     pshufb                  m4, m8
518     punpckhbw               m1, m0,  m5
519     punpckhbw               m3, m2,  m5
520     punpcklbw               m0, m5
521     punpcklbw               m2, m5
522     psubw                   m1, m4
523     psubw                   m0, m4
524     psubw                   m3, m4
525     psubw                   m2, m4
526     mov                   cntq, 15
527 .loop:
528     pinsrw                 m13, [lq+cntq*2], 0
529     pshufb                  m7, m13, m9
530     pshufb                 m13, m8
531     paddw                   m4, m7,  m0
532     paddw                   m5, m7,  m1
533     paddw                   m6, m7,  m2
534     paddw                   m7, m3
535     paddw                  m10, m13, m0
536     paddw                  m11, m13, m1
537     paddw                  m12, m13, m2
538     paddw                  m13, m3
539     packuswb                m4, m5
540     packuswb                m6, m7
541     packuswb               m10, m11
542     packuswb               m12, m13
543     mova   [dstq+strideq*0+ 0], m4
544     mova   [dstq+strideq*0+16], m6
545     mova   [dstq+strideq*1+ 0], m10
546     mova   [dstq+strideq*1+16], m12
547     lea                   dstq, [dstq+strideq*2]
548     dec                   cntq
549     jge .loop
550     RET
551 %endif
552 %endmacro
553
554 TM_XMM_FUNCS ssse3
555 TM_XMM_FUNCS avx
556
557 ; dl
558
559 %macro LOWPASS 4 ; left [dst], center, right, tmp
560     pxor                   m%4, m%1, m%3
561     pand                   m%4, [pb_1]
562     pavgb                  m%1, m%3
563     psubusb                m%1, m%4
564     pavgb                  m%1, m%2
565 %endmacro
566
567 INIT_MMX ssse3
568 cglobal vp9_ipred_dl_4x4, 4, 4, 0, dst, stride, l, a
569     movq                    m1, [aq]
570     pshufb                  m0, m1, [pb_0to5_2x7]
571     pshufb                  m2, m1, [pb_2to6_3x7]
572     psrlq                   m1, 8
573     LOWPASS                  0, 1, 2, 3
574
575     pshufw                  m1, m0, q3321
576     movd      [dstq+strideq*0], m0
577     movd      [dstq+strideq*2], m1
578     psrlq                   m0, 8
579     psrlq                   m1, 8
580     add                   dstq, strideq
581     movd      [dstq+strideq*0], m0
582     movd      [dstq+strideq*2], m1
583     RET
584
585 %macro DL_XMM_FUNCS 1
586 INIT_XMM %1
587 cglobal vp9_ipred_dl_8x8, 4, 4, 4, dst, stride, stride5, a
588     movq                    m0, [aq]
589     lea               stride5q, [strideq*5]
590     pshufb                  m1, m0, [pb_1to6_10x7]
591     psrldq                  m2, m1, 1
592     shufps                  m0, m1, q3210
593     LOWPASS                  0, 1, 2, 3
594
595     pshufd                  m1, m0, q3321
596     movq      [dstq+strideq*0], m0
597     movq      [dstq+strideq*4], m1
598     psrldq                  m0, 1
599     psrldq                  m1, 1
600     movq      [dstq+strideq*1], m0
601     movq      [dstq+stride5q ], m1
602     lea                   dstq, [dstq+strideq*2]
603     psrldq                  m0, 1
604     psrldq                  m1, 1
605     movq      [dstq+strideq*0], m0
606     movq      [dstq+strideq*4], m1
607     psrldq                  m0, 1
608     psrldq                  m1, 1
609     movq      [dstq+strideq*1], m0
610     movq      [dstq+stride5q ], m1
611     RET
612
613 INIT_XMM %1
614 cglobal vp9_ipred_dl_16x16, 4, 4, 6, dst, stride, l, a
615     mova                    m5, [pb_1toE_2xF]
616     mova                    m0, [aq]
617     pshufb                  m1, m0, m5
618     pshufb                  m2, m1, m5
619     pshufb                  m4, m0, [pb_15]
620     LOWPASS                  0, 1, 2, 3
621     DEFINE_ARGS dst, stride, cnt, stride9
622     lea               stride9q, [strideq*3]
623     mov                   cntd, 4
624     lea               stride9q, [stride9q*3]
625
626 .loop:
627     movhlps                 m4, m0
628     mova      [dstq+strideq*0], m0
629     pshufb                  m0, m5
630     mova      [dstq+strideq*8], m4
631     movhlps                 m4, m0
632     mova      [dstq+strideq*1], m0
633     pshufb                  m0, m5
634     mova      [dstq+stride9q ], m4
635     lea                   dstq, [dstq+strideq*2]
636     dec                   cntd
637     jg .loop
638     RET
639
640 INIT_XMM %1
641 cglobal vp9_ipred_dl_32x32, 4, 5, 8, dst, stride, cnt, a, dst16
642     mova                    m5, [pb_1toE_2xF]
643     mova                    m0, [aq]
644     mova                    m1, [aq+16]
645     palignr                 m2, m1, m0, 1
646     palignr                 m3, m1, m0, 2
647     LOWPASS                  0, 2, 3, 4
648     pshufb                  m2, m1, m5
649     pshufb                  m3, m2, m5
650     pshufb                  m6, m1, [pb_15]
651     LOWPASS                  1, 2, 3, 4
652     mova                    m7, m6
653     lea                 dst16q, [dstq  +strideq*8]
654     mov                   cntd, 8
655     lea                 dst16q, [dst16q+strideq*8]
656 .loop:
657     movhlps                 m7, m1
658     mova [dstq  +strideq*0+ 0], m0
659     mova [dstq  +strideq*0+16], m1
660     movhps [dstq+strideq*8+ 0], m0
661     movq [dstq  +strideq*8+ 8], m1
662     mova [dstq  +strideq*8+16], m7
663     mova [dst16q+strideq*0+ 0], m1
664     mova [dst16q+strideq*0+16], m6
665     mova [dst16q+strideq*8+ 0], m7
666     mova [dst16q+strideq*8+16], m6
667 %if cpuflag(avx)
668     vpalignr                m0, m1, m0, 1
669     pshufb                  m1, m5
670 %else
671     palignr                 m2, m1, m0, 1
672     pshufb                  m1, m5
673     mova                    m0, m2
674 %endif
675     add                   dstq, strideq
676     add                 dst16q, strideq
677     dec                   cntd
678     jg .loop
679     RET
680 %endmacro
681
682 DL_XMM_FUNCS ssse3
683 DL_XMM_FUNCS avx
684
685 ; dr
686
687 INIT_MMX ssse3
688 cglobal vp9_ipred_dr_4x4, 4, 4, 0, dst, stride, l, a
689     movd                    m0, [lq]
690     punpckldq               m0, [aq-1]
691     movd                    m1, [aq+3]
692     DEFINE_ARGS dst, stride, stride3
693     lea               stride3q, [strideq*3]
694     palignr                 m1, m0, 1
695     psrlq                   m2, m1, 8
696     LOWPASS                  0, 1, 2, 3
697
698     movd      [dstq+stride3q ], m0
699     psrlq                   m0, 8
700     movd      [dstq+strideq*2], m0
701     psrlq                   m0, 8
702     movd      [dstq+strideq*1], m0
703     psrlq                   m0, 8
704     movd      [dstq+strideq*0], m0
705     RET
706
707 %macro DR_XMM_FUNCS 1
708 INIT_XMM %1
709 cglobal vp9_ipred_dr_8x8, 4, 4, 4, dst, stride, l, a
710     movq                    m1, [lq]
711     movhps                  m1, [aq-1]
712     movd                    m2, [aq+7]
713     DEFINE_ARGS dst, stride, stride3
714     lea               stride3q, [strideq*3]
715     pslldq                  m0, m1, 1
716     palignr                 m2, m1, 1
717     LOWPASS                  0, 1, 2, 3
718
719     movhps    [dstq+strideq*0], m0
720     pslldq                  m0, 1
721     movhps    [dstq+strideq*1], m0
722     pslldq                  m0, 1
723     movhps    [dstq+strideq*2], m0
724     pslldq                  m0, 1
725     movhps    [dstq+stride3q ], m0
726     pslldq                  m0, 1
727     lea                   dstq, [dstq+strideq*4]
728     movhps    [dstq+strideq*0], m0
729     pslldq                  m0, 1
730     movhps    [dstq+strideq*1], m0
731     pslldq                  m0, 1
732     movhps    [dstq+strideq*2], m0
733     pslldq                  m0, 1
734     movhps    [dstq+stride3q ], m0
735     RET
736
737 INIT_XMM %1
738 cglobal vp9_ipred_dr_16x16, 4, 4, 6, dst, stride, l, a
739     mova                    m1, [lq]
740     movu                    m2, [aq-1]
741     movd                    m4, [aq+15]
742     DEFINE_ARGS dst, stride, stride9, cnt
743     lea               stride9q, [strideq *3]
744     mov                   cntd, 4
745     lea               stride9q, [stride9q*3]
746     palignr                 m4, m2, 1
747     palignr                 m3, m2, m1, 15
748     LOWPASS                  3,  2, 4, 5
749     pslldq                  m0, m1, 1
750     palignr                 m2, m1, 1
751     LOWPASS                  0,  1, 2, 4
752
753 .loop:
754     mova    [dstq+strideq*0  ], m3
755     movhps  [dstq+strideq*8+0], m0
756     movq    [dstq+strideq*8+8], m3
757     palignr                 m3, m0, 15
758     pslldq                  m0, 1
759     mova    [dstq+strideq*1  ], m3
760     movhps  [dstq+stride9q +0], m0
761     movq    [dstq+stride9q +8], m3
762     palignr                 m3, m0, 15
763     pslldq                  m0, 1
764     lea                   dstq, [dstq+strideq*2]
765     dec                   cntd
766     jg .loop
767     RET
768
769 INIT_XMM %1
770 cglobal vp9_ipred_dr_32x32, 4, 4, 8, dst, stride, l, a
771     mova                    m1, [lq]
772     mova                    m2, [lq+16]
773     movu                    m3, [aq-1]
774     movu                    m4, [aq+15]
775     movd                    m5, [aq+31]
776     DEFINE_ARGS dst, stride, stride8, cnt
777     lea               stride8q, [strideq*8]
778     palignr                 m5, m4, 1
779     palignr                 m6, m4, m3, 15
780     LOWPASS                  5,  4,  6,  7
781     palignr                 m4, m3, 1
782     palignr                 m6, m3, m2, 15
783     LOWPASS                  4,  3,  6,  7
784     palignr                 m3, m2, 1
785     palignr                 m6, m2, m1, 15
786     LOWPASS                  3,  2,  6,  7
787     palignr                 m2, m1, 1
788     pslldq                  m0, m1, 1
789     LOWPASS                  2,  1,  0,  6
790     mov                   cntd, 16
791
792     ; out=m2/m3/m4/m5
793 .loop:
794     mova  [dstq+stride8q*0+ 0], m4
795     mova  [dstq+stride8q*0+16], m5
796     mova  [dstq+stride8q*2+ 0], m3
797     mova  [dstq+stride8q*2+16], m4
798     palignr                 m5, m4, 15
799     palignr                 m4, m3, 15
800     palignr                 m3, m2, 15
801     pslldq                  m2, 1
802     add                   dstq, strideq
803     dec                   cntd
804     jg .loop
805     RET
806 %endmacro
807
808 DR_XMM_FUNCS ssse3
809 DR_XMM_FUNCS avx
810
811 ; vl
812
813 INIT_MMX ssse3
814 cglobal vp9_ipred_vl_4x4, 4, 4, 0, dst, stride, l, a
815     movq                    m0, [aq]
816     psrlq                   m1, m0, 8
817     psrlq                   m2, m1, 8
818     LOWPASS                  2,  1, 0, 3
819     pavgb                   m1, m0
820     movq      [dstq+strideq*0], m1
821     movq      [dstq+strideq*1], m2
822     lea                   dstq, [dstq+strideq*2]
823     psrlq                   m1, 8
824     psrlq                   m2, 8
825     movq      [dstq+strideq*0], m1
826     movq      [dstq+strideq*1], m2
827     RET
828
829 %macro VL_XMM_FUNCS 1
830 INIT_XMM %1
831 cglobal vp9_ipred_vl_8x8, 4, 4, 4, dst, stride, l, a
832     movq                    m0, [aq]
833     pshufb                  m0, [pb_0to6_9x7]
834     DEFINE_ARGS dst, stride, stride3
835     lea               stride3q, [strideq*3]
836     psrldq                  m1, m0, 1
837     psrldq                  m2, m0, 2
838     LOWPASS                  2,  1,  0,  3
839     pavgb                   m1, m0
840
841     movq      [dstq+strideq*0], m1
842     movq      [dstq+strideq*1], m2
843     psrldq                  m1, 1
844     psrldq                  m2, 1
845     movq      [dstq+strideq*2], m1
846     movq      [dstq+stride3q ], m2
847     lea                   dstq, [dstq+strideq*4]
848     psrldq                  m1, 1
849     psrldq                  m2, 1
850     movq      [dstq+strideq*0], m1
851     movq      [dstq+strideq*1], m2
852     psrldq                  m1, 1
853     psrldq                  m2, 1
854     movq      [dstq+strideq*2], m1
855     movq      [dstq+stride3q ], m2
856     RET
857
858 INIT_XMM %1
859 cglobal vp9_ipred_vl_16x16, 4, 4, 5, dst, stride, l, a
860     mova                    m0, [aq]
861     mova                    m4, [pb_1toE_2xF]
862     DEFINE_ARGS dst, stride, stride3, cnt
863     lea               stride3q, [strideq*3]
864     pshufb                  m1, m0, m4
865     pshufb                  m2, m1, m4
866     LOWPASS                  2,  1,  0, 3
867     pavgb                   m1, m0
868     mov                   cntd, 4
869 .loop:
870     mova      [dstq+strideq*0], m1
871     mova      [dstq+strideq*1], m2
872     pshufb                  m1, m4
873     pshufb                  m2, m4
874     mova      [dstq+strideq*2], m1
875     mova      [dstq+stride3q ], m2
876     pshufb                  m1, m4
877     pshufb                  m2, m4
878     lea                   dstq, [dstq+strideq*4]
879     dec                   cntd
880     jg .loop
881     RET
882
883 INIT_XMM %1
884 cglobal vp9_ipred_vl_32x32, 4, 4, 7, dst, stride, l, a
885     mova                    m0, [aq]
886     mova                    m5, [aq+16]
887     mova                    m4, [pb_1toE_2xF]
888     DEFINE_ARGS dst, stride, dst16, cnt
889     palignr                 m2, m5, m0, 1
890     palignr                 m3, m5, m0, 2
891     lea                 dst16q, [dstq  +strideq*8]
892     LOWPASS                  3,  2,  0, 6
893     pavgb                   m2, m0
894     pshufb                  m0, m5, m4
895     pshufb                  m1, m0, m4
896     lea                 dst16q, [dst16q+strideq*8]
897     LOWPASS                  1,  0,  5, 6
898     pavgb                   m0, m5
899     pshufb                  m5, [pb_15]
900     mov                   cntd, 8
901
902 .loop:
903 %macro %%write 3
904     mova    [dstq+stride%1+ 0], %2
905     mova    [dstq+stride%1+16], %3
906     movhps  [dst16q+stride%1 ], %2
907     movu  [dst16q+stride%1+ 8], %3
908     movq  [dst16q+stride%1+24], m5
909 %if cpuflag(avx)
910     palignr                 %2, %3, %2, 1
911     pshufb                  %3, m4
912 %else
913     palignr                 m6, %3, %2, 1
914     pshufb                  %3, m4
915     mova                    %2, m6
916 %endif
917 %endmacro
918
919     %%write                q*0, m2, m0
920     %%write                q*1, m3, m1
921     lea                   dstq, [dstq  +strideq*2]
922     lea                 dst16q, [dst16q+strideq*2]
923     dec                   cntd
924     jg .loop
925     RET
926 %endmacro
927
928 VL_XMM_FUNCS ssse3
929 VL_XMM_FUNCS avx
930
931 ; vr
932
933 INIT_MMX ssse3
934 cglobal vp9_ipred_vr_4x4, 4, 4, 0, dst, stride, l, a
935     movq                    m1, [aq-1]
936     punpckldq               m2, [lq]
937     movd                    m0, [aq]
938     DEFINE_ARGS dst, stride, stride3
939     lea               stride3q, [strideq*3]
940     pavgb                   m0, m1
941     palignr                 m1, m2, 5
942     psrlq                   m2, m1, 8
943     psllq                   m3, m1, 8
944     LOWPASS                  2,  1, 3, 4
945
946     ; ABCD <- for the following predictor:
947     ; EFGH
948     ; IABC  | m0 contains ABCDxxxx
949     ; JEFG  | m2 contains xJIEFGHx
950
951     punpckldq               m0, m2
952     pshufb                  m2, [pb_13456_3xm1]
953     movd      [dstq+strideq*0], m0
954     pshufb                  m0, [pb_6012_4xm1]
955     movd      [dstq+stride3q ], m2
956     psrlq                   m2, 8
957     movd      [dstq+strideq*2], m0
958     movd      [dstq+strideq*1], m2
959     RET
960
961 %macro VR_XMM_FUNCS 1
962 INIT_XMM %1
963 cglobal vp9_ipred_vr_8x8, 4, 4, 5, dst, stride, l, a
964     movu                    m1, [aq-1]
965     movhps                  m2, [lq]
966     movq                    m0, [aq]
967     DEFINE_ARGS dst, stride, stride3
968     lea               stride3q, [strideq*3]
969     pavgb                   m0, m1
970     palignr                 m1, m2, 9
971     pslldq                  m2, m1, 1
972     pslldq                  m3, m1, 2
973     LOWPASS                  1,  2, 3, 4
974
975     ; ABCDEFGH <- for the following predictor:
976     ; IJKLMNOP
977     ; QABCDEFG  | m0 contains ABCDEFGHxxxxxxxx
978     ; RIJKLMNO  | m1 contains xxVUTSRQIJKLMNOP
979     ; SQABCDEF
980     ; TRIJKLMN
981     ; USQABCDE
982     ; VTRIJKLM
983
984     punpcklqdq              m0, m1 ; ABCDEFGHxxVUTSRQ
985     movq      [dstq+strideq*0], m0
986     pshufb                  m0, [pb_6xm1_BDF_0to6] ; xxxxxxUSQABCDEFG
987     movhps    [dstq+strideq*1], m1
988     pshufb                  m1, [pb_6xm1_246_8toE] ; xxxxxxVTRIJKLMNO
989     movhps    [dstq+strideq*2], m0
990     pslldq                  m0, 1
991     movhps    [dstq+stride3q ], m1
992     lea                   dstq, [dstq+strideq*4]
993     pslldq                  m1, 1
994     movhps    [dstq+strideq*0], m0
995     pslldq                  m0, 1
996     movhps    [dstq+strideq*1], m1
997     pslldq                  m1, 1
998     movhps    [dstq+strideq*2], m0
999     movhps    [dstq+stride3q ], m1
1000     RET
1001
1002 INIT_XMM %1
1003 cglobal vp9_ipred_vr_16x16, 4, 4, 6, dst, stride, l, a
1004     mova                    m0, [aq]
1005     movu                    m1, [aq-1]
1006     mova                    m2, [lq]
1007     DEFINE_ARGS dst, stride, stride3, cnt
1008     lea               stride3q, [strideq*3]
1009     palignr                 m3, m1, m2, 15
1010     LOWPASS                  3,  1,  0,  4
1011     pavgb                   m0, m1
1012     palignr                 m1, m2,  1
1013     pslldq                  m4, m2,  1
1014     LOWPASS                  1,  2,  4,  5
1015     pshufb                  m1, [pb_02468ACE_13579BDF]
1016     mov                   cntd, 4
1017
1018 .loop:
1019     movlhps                 m2, m1
1020     mova      [dstq+strideq*0], m0
1021     mova      [dstq+strideq*1], m3
1022     palignr                 m4, m0, m1, 15
1023     palignr                 m5, m3, m2, 15
1024     mova      [dstq+strideq*2], m4
1025     mova      [dstq+stride3q ], m5
1026     lea                   dstq, [dstq+strideq*4]
1027     palignr                 m0, m1, 14
1028     palignr                 m3, m2, 14
1029     pslldq                  m1, 2
1030     dec                   cntd
1031     jg .loop
1032     RET
1033
1034 %if ARCH_X86_64
1035 INIT_XMM %1
1036 cglobal vp9_ipred_vr_32x32, 4, 4, 9, dst, stride, l, a
1037     mova                    m0, [aq]
1038     mova                    m2, [aq+16]
1039     movu                    m1, [aq-1]
1040     palignr                 m3, m2, m0, 15
1041     palignr                 m4, m2, m0, 14
1042     LOWPASS                  4,  3,  2,  5
1043     pavgb                   m3, m2
1044     mova                    m2, [lq+16]
1045     palignr                 m5, m1, m2, 15
1046     LOWPASS                  5,  1,  0,  6
1047     pavgb                   m0, m1
1048     mova                    m6, [lq]
1049     palignr                 m1, m2,  1
1050     palignr                 m7, m2, m6, 15
1051     LOWPASS                  1,  2,  7,  8
1052     palignr                 m2, m6,  1
1053     pslldq                  m7, m6,  1
1054     LOWPASS                  2,  6,  7,  8
1055     pshufb                  m1, [pb_02468ACE_13579BDF]
1056     pshufb                  m2, [pb_02468ACE_13579BDF]
1057     DEFINE_ARGS dst, stride, dst16, cnt
1058     lea                 dst16q, [dstq  +strideq*8]
1059     lea                 dst16q, [dst16q+strideq*8]
1060     SBUTTERFLY             qdq,  2,  1,  6
1061     mov                   cntd, 8
1062
1063 .loop:
1064     ; even lines (0, 2, 4, ...): m1 | m0, m3
1065     ;  odd lines (1, 3, 5, ...): m2 | m5, m4
1066 %macro %%write 4
1067     mova    [dstq+stride%1+ 0], %3
1068     mova    [dstq+stride%1+16], %4
1069     movhps  [dst16q+stride%1 ], %2
1070     movu  [dst16q+stride%1+ 8], %3
1071     movq  [dst16q+stride%1+24], %4
1072     palignr                 %4, %3, 15
1073     palignr                 %3, %2, 15
1074     pslldq                  %2,  1
1075 %endmacro
1076
1077     %%write                q*0, m1, m0, m3
1078     %%write                q*1, m2, m5, m4
1079     lea                   dstq, [dstq  +strideq*2]
1080     lea                 dst16q, [dst16q+strideq*2]
1081     dec                   cntd
1082     jg .loop
1083     RET
1084 %endif
1085 %endmacro
1086
1087 VR_XMM_FUNCS ssse3
1088 VR_XMM_FUNCS avx
1089
1090 ; hd
1091
1092 INIT_MMX ssse3
1093 cglobal vp9_ipred_hd_4x4, 4, 4, 0, dst, stride, l, a
1094     movd                    m0, [lq]
1095     punpckldq               m0, [aq-1]
1096     DEFINE_ARGS dst, stride, stride3
1097     lea               stride3q, [strideq*3]
1098     psrlq                   m1, m0, 8
1099     psrlq                   m2, m1, 8
1100     LOWPASS                  2,  1, 0,  3
1101     pavgb                   m1, m0
1102
1103     ; DHIJ <- for the following predictor:
1104     ; CGDH
1105     ; BFCG  | m1 contains ABCDxxxx
1106     ; AEBF  | m2 contains EFGHIJxx
1107
1108     punpcklbw               m1, m2
1109     punpckhdq               m0, m1, m2
1110
1111     ; m1 contains AEBFCGDH
1112     ; m0 contains CGDHIJxx
1113
1114     movd      [dstq+stride3q ], m1
1115     movd      [dstq+strideq*1], m0
1116     psrlq                   m1, 16
1117     psrlq                   m0, 16
1118     movd      [dstq+strideq*2], m1
1119     movd      [dstq+strideq*0], m0
1120     RET
1121
1122 %macro HD_XMM_FUNCS 1
1123 INIT_XMM %1
1124 cglobal vp9_ipred_hd_8x8, 4, 4, 4, dst, stride, l, a
1125     movq                    m0, [lq]
1126     movhps                  m0, [aq-1]
1127     DEFINE_ARGS dst, stride, stride3, dst4
1128     lea               stride3q, [strideq*3]
1129     lea                  dst4q, [dstq+strideq*4]
1130     psrldq                  m1, m0, 1
1131     psrldq                  m2, m1, 1
1132     LOWPASS                  2,  1,  0,  3
1133     pavgb                   m1, m0
1134
1135     ; HPQRSTUV <- for the following predictor
1136     ; GOHPQRST
1137     ; FNGOHPQR  | m1 contains ABCDEFGHxxxxxxxx
1138     ; EMFNGOHP  | m2 contains IJKLMNOPQRSTUVxx
1139     ; DLEMFNGO
1140     ; CKDLEMFN
1141     ; BJCKDLEM
1142     ; AIBJCKDL
1143
1144     punpcklbw               m1, m2
1145     movhlps                 m2, m2
1146
1147     ; m1 contains AIBJCKDLEMFNGOHP
1148     ; m2 contains QRSTUVxxxxxxxxxx
1149
1150     movhps   [dstq +stride3q ], m1
1151     movq     [dst4q+stride3q ], m1
1152     palignr                 m3, m2, m1, 2
1153     movhps   [dstq +strideq*2], m3
1154     movq     [dst4q+strideq*2], m3
1155     palignr                 m3, m2, m1, 4
1156     movhps   [dstq +strideq*1], m3
1157     movq     [dst4q+strideq*1], m3
1158     palignr                 m2, m1, 6
1159     movhps   [dstq +strideq*0], m2
1160     movq     [dst4q+strideq*0], m2
1161     RET
1162
1163 INIT_XMM %1
1164 cglobal vp9_ipred_hd_16x16, 4, 6, 7, dst, stride, l, a
1165     mova                    m0, [lq]
1166     movu                    m3, [aq-1]
1167     DEFINE_ARGS dst, stride, stride4, dst4, dst8, dst12
1168     lea               stride4q, [strideq*4]
1169     lea                  dst4q, [dstq +stride4q]
1170     lea                  dst8q, [dst4q+stride4q]
1171     lea                 dst12q, [dst8q+stride4q]
1172     psrldq                  m4, m3,  1
1173     psrldq                  m5, m3,  2
1174     LOWPASS                  5,  4,  3,  6
1175     palignr                 m1, m3, m0,  1
1176     palignr                 m2, m3, m0,  2
1177     LOWPASS                  2,  1,  0,  6
1178     pavgb                   m1, m0
1179     SBUTTERFLY              bw,  1,  2,  6
1180
1181     ; I PROBABLY INVERTED L0 ad L16 here
1182     ; m1, m2, m5
1183 .loop:
1184     sub               stride4q, strideq
1185     movhps [dstq +stride4q +0], m2
1186     movq   [dstq +stride4q +8], m5
1187     mova   [dst4q+stride4q   ], m2
1188     movhps [dst8q+stride4q +0], m1
1189     movq   [dst8q+stride4q +8], m2
1190     mova  [dst12q+stride4q   ], m1
1191 %if cpuflag(avx)
1192     palignr                 m1, m2, m1, 2
1193     palignr                 m2, m5, m2, 2
1194 %else
1195     palignr                 m3, m2, m1, 2
1196     palignr                 m0, m5, m2, 2
1197     mova                    m1, m3
1198     mova                    m2, m0
1199 %endif
1200     psrldq                  m5, 2
1201     jg .loop
1202     RET
1203
1204 INIT_XMM %1
1205 cglobal vp9_ipred_hd_32x32, 4, 6, 8, dst, stride, l, a
1206     mova                    m0, [lq]
1207     mova                    m1, [lq+16]
1208     movu                    m2, [aq-1]
1209     movu                    m3, [aq+15]
1210     DEFINE_ARGS dst, stride, stride8, dst8, dst16, dst24
1211     lea               stride8q, [strideq*8]
1212     lea                  dst8q, [dstq  +stride8q]
1213     lea                 dst16q, [dst8q +stride8q]
1214     lea                 dst24q, [dst16q+stride8q]
1215     psrldq                  m4, m3,  1
1216     psrldq                  m5, m3,  2
1217     LOWPASS                  5,  4,  3,  6
1218     palignr                 m4, m3, m2,  2
1219     palignr                 m3, m2,  1
1220     LOWPASS                  4,  3,  2,  6
1221     palignr                 m3, m2, m1,  2
1222     palignr                 m2, m1,  1
1223     LOWPASS                  3,  2,  1,  6
1224     pavgb                   m2, m1
1225     palignr                 m6, m1, m0,  1
1226     palignr                 m1, m0,  2
1227     LOWPASS                  1,  6,  0,  7
1228     pavgb                   m0, m1
1229     SBUTTERFLY              bw,  2,  3,  6
1230     SBUTTERFLY              bw,  0,  1,  6
1231
1232     ; m0, m1, m2, m3, m4, m5
1233 .loop:
1234     sub               stride8q, strideq
1235     mova  [dstq  +stride8q+ 0], m3
1236     mova  [dstq  +stride8q+16], m4
1237     mova  [dst8q +stride8q+ 0], m2
1238     mova  [dst8q +stride8q+16], m3
1239     mova  [dst16q+stride8q+ 0], m1
1240     mova  [dst16q+stride8q+16], m2
1241     mova  [dst24q+stride8q+ 0], m0
1242     mova  [dst24q+stride8q+16], m1
1243 %if cpuflag(avx)
1244     palignr                 m0, m1, m0, 2
1245     palignr                 m1, m2, m1, 2
1246     palignr                 m2, m3, m2, 2
1247     palignr                 m3, m4, m3, 2
1248     palignr                 m4, m5, m4, 2
1249     psrldq                  m5, 2
1250 %else
1251     psrldq                  m6, m5, 2
1252     palignr                 m5, m4, 2
1253     palignr                 m4, m3, 2
1254     palignr                 m3, m2, 2
1255     palignr                 m2, m1, 2
1256     palignr                 m1, m0, 2
1257     mova                    m0, m1
1258     mova                    m1, m2
1259     mova                    m2, m3
1260     mova                    m3, m4
1261     mova                    m4, m5
1262     mova                    m5, m6
1263 %endif
1264     jg .loop
1265     RET
1266 %endmacro
1267
1268 HD_XMM_FUNCS ssse3
1269 HD_XMM_FUNCS avx
1270
1271 INIT_MMX ssse3
1272 cglobal vp9_ipred_hu_4x4, 3, 3, 0, dst, stride, l
1273     movd                    m0, [lq]
1274     pshufb                  m0, [pb_3to1_5x0]
1275     psrlq                   m1, m0, 8
1276     psrlq                   m2, m1, 8
1277     LOWPASS                  2,  1, 0, 3
1278     pavgb                   m1, m0
1279     DEFINE_ARGS dst, stride, stride3
1280     lea               stride3q, [strideq*3]
1281     SBUTTERFLY              bw,  1, 2, 0
1282     palignr                 m2, m1, 2
1283     movd      [dstq+strideq*0], m1
1284     movd      [dstq+strideq*1], m2
1285     punpckhdq               m1, m1
1286     punpckhdq               m2, m2
1287     movd      [dstq+strideq*2], m1
1288     movd      [dstq+stride3q ], m2
1289     RET
1290
1291 %macro HU_XMM_FUNCS 1
1292 INIT_XMM %1
1293 cglobal vp9_ipred_hu_8x8, 3, 4, 4, dst, stride, l
1294     movq                    m0, [lq]
1295     pshufb                  m0, [pb_7to1_9x0]
1296     psrldq                  m1, m0, 1
1297     psrldq                  m2, m1, 1
1298     LOWPASS                  2,  1, 0, 3
1299     pavgb                   m1, m0
1300     DEFINE_ARGS dst, stride, stride3, dst4
1301     lea               stride3q, [strideq*3]
1302     lea                  dst4q, [dstq+strideq*4]
1303     SBUTTERFLY              bw,  1, 2, 0
1304     movq     [dstq +strideq*0], m1
1305     movhps   [dst4q+strideq*0], m1
1306     palignr                 m0, m2, m1, 2
1307     movq     [dstq +strideq*1], m0
1308     movhps   [dst4q+strideq*1], m0
1309     palignr                 m0, m2, m1, 4
1310     movq     [dstq +strideq*2], m0
1311     movhps   [dst4q+strideq*2], m0
1312     palignr                 m2, m1, 6
1313     movq     [dstq +stride3q ], m2
1314     movhps   [dst4q+stride3q ], m2
1315     RET
1316
1317 INIT_XMM %1
1318 cglobal vp9_ipred_hu_16x16, 3, 4, 5, dst, stride, l
1319     mova                    m0, [lq]
1320     pshufb                  m0, [pb_Fto0]
1321     mova                    m3, [pb_2toE_3xF]
1322     pshufb                  m1, m0, [pb_1toE_2xF]
1323     pshufb                  m2, m0, m3
1324     LOWPASS                  2,  1,  0,  4
1325     pavgb                   m1, m0
1326     DEFINE_ARGS dst, stride, stride9, cnt
1327     lea                stride9q, [strideq *3]
1328     mov                   cntd,  4
1329     lea                stride9q, [stride9q*3]
1330     SBUTTERFLY              bw,  1,  2,  0
1331
1332 .loop:
1333     mova      [dstq+strideq*0], m1
1334     mova      [dstq+strideq*8], m2
1335     palignr                 m0, m2, m1, 2
1336     pshufb                  m2, m3
1337     mova      [dstq+strideq*1], m0
1338     mova      [dstq+stride9q ], m2
1339     palignr                 m1, m2, m0, 2
1340     pshufb                  m2, m3
1341     lea                   dstq, [dstq+strideq*2]
1342     dec                   cntd
1343     jg .loop
1344     RET
1345
1346 INIT_XMM %1
1347 cglobal vp9_ipred_hu_32x32, 3, 7, 7, dst, stride, l
1348     mova                    m0, [lq]
1349     mova                    m1, [lq+16]
1350     mova                    m2, [pb_Fto0]
1351     mova                    m4, [pb_2toE_3xF]
1352     pshufb                  m0, m2
1353     pshufb                  m1, m2
1354     palignr                 m2, m0, m1,  1
1355     palignr                 m3, m0, m1,  2
1356     LOWPASS                  3,  2,  1,  5
1357     pavgb                   m2, m1
1358     pshufb                  m1, m0, m4
1359     pshufb                  m5, m0, [pb_1toE_2xF]
1360     LOWPASS                  1,  5,  0,  6
1361     pavgb                   m0, m5
1362     DEFINE_ARGS dst, stride, cnt, stride0, dst8, dst16, dst24
1363     mov                   cntd,  8
1364     xor               stride0q, stride0q
1365     lea                  dst8q, [dstq  +strideq*8]
1366     lea                 dst16q, [dst8q +strideq*8]
1367     lea                 dst24q, [dst16q+strideq*8]
1368     SBUTTERFLY              bw,  0,  1,  5
1369     SBUTTERFLY              bw,  2,  3,  5
1370     pshufb                  m6, m1, [pb_15]
1371
1372 .loop:
1373     mova  [dstq  +stride0q+ 0], m2
1374     mova  [dstq  +stride0q+16], m3
1375     mova  [dst8q +stride0q+ 0], m3
1376     mova  [dst8q +stride0q+16], m0
1377     mova  [dst16q+stride0q+ 0], m0
1378     mova  [dst16q+stride0q+16], m1
1379     mova  [dst24q+stride0q+ 0], m1
1380     mova  [dst24q+stride0q+16], m6
1381 %if cpuflag(avx)
1382     palignr                 m2, m3, m2, 2
1383     palignr                 m3, m0, m3, 2
1384     palignr                 m0, m1, m0, 2
1385     pshufb                  m1, m4
1386 %else
1387     pshufb                  m5, m1, m4
1388     palignr                 m1, m0, 2
1389     palignr                 m0, m3, 2
1390     palignr                 m3, m2, 2
1391     mova                    m2, m3
1392     mova                    m3, m0
1393     mova                    m0, m1
1394     mova                    m1, m5
1395 %endif
1396     add               stride0q, strideq
1397     dec                   cntd
1398     jg .loop
1399     RET
1400 %endmacro
1401
1402 HU_XMM_FUNCS ssse3
1403 HU_XMM_FUNCS avx
1404
1405 ; FIXME 127, 128, 129 ?