avcodec/h264: mmx2, sse2, avx 10-bit h chroma deblock/loop filter
[ffmpeg.git] / libavcodec / x86 / vp9intrapred_16bpp.asm
1 ;******************************************************************************
2 ;* VP9 Intra prediction SIMD optimizations
3 ;*
4 ;* Copyright (c) 2015 Ronald S. Bultje <rsbultje gmail com>
5 ;* Copyright (c) 2015 Henrik Gramner <henrik gramner com>
6 ;*
7 ;* This file is part of FFmpeg.
8 ;*
9 ;* FFmpeg is free software; you can redistribute it and/or
10 ;* modify it under the terms of the GNU Lesser General Public
11 ;* License as published by the Free Software Foundation; either
12 ;* version 2.1 of the License, or (at your option) any later version.
13 ;*
14 ;* FFmpeg is distributed in the hope that it will be useful,
15 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 ;* Lesser General Public License for more details.
18 ;*
19 ;* You should have received a copy of the GNU Lesser General Public
20 ;* License along with FFmpeg; if not, write to the Free Software
21 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 ;******************************************************************************
23
24 %include "libavutil/x86/x86util.asm"
25
26 SECTION_RODATA 32
27
28 pd_2: times 8 dd 2
29 pd_4: times 8 dd 4
30 pd_8: times 8 dd 8
31
32 pb_2to15_14_15: db 2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,15
33 pb_4_5_8to13_8x0: db 4,5,8,9,10,11,12,13,0,0,0,0,0,0,0,0
34 pb_0to7_67x4: db 0,1,2,3,4,5,6,7,6,7,6,7,6,7,6,7
35
36 cextern pw_1
37 cextern pw_1023
38 cextern pw_4095
39 cextern pd_16
40 cextern pd_32
41 cextern pd_65535;
42
43 ; FIXME most top-only functions (ddl, vl, v, dc_top) can be modified to take
44 ; only 3 registers on x86-32, which would make it one cycle faster, but that
45 ; would make the code quite a bit uglier...
46
47 SECTION .text
48
49 %macro SCRATCH 3-4
50 %if ARCH_X86_64
51     SWAP                %1, %2
52 %if %0 == 4
53 %define reg_%4 m%2
54 %endif
55 %else
56     mova              [%3], m%1
57 %if %0 == 4
58 %define reg_%4 [%3]
59 %endif
60 %endif
61 %endmacro
62
63 %macro UNSCRATCH 3-4
64 %if ARCH_X86_64
65     SWAP                %1, %2
66 %else
67     mova               m%1, [%3]
68 %endif
69 %if %0 == 4
70 %undef reg_%4
71 %endif
72 %endmacro
73
74 %macro PRELOAD 2-3
75 %if ARCH_X86_64
76     mova               m%1, [%2]
77 %if %0 == 3
78 %define reg_%3 m%1
79 %endif
80 %elif %0 == 3
81 %define reg_%3 [%2]
82 %endif
83 %endmacro
84
85 INIT_MMX mmx
86 cglobal vp9_ipred_v_4x4_16, 2, 4, 1, dst, stride, l, a
87     movifnidn               aq, amp
88     mova                    m0, [aq]
89     DEFINE_ARGS dst, stride, stride3
90     lea               stride3q, [strideq*3]
91     mova      [dstq+strideq*0], m0
92     mova      [dstq+strideq*1], m0
93     mova      [dstq+strideq*2], m0
94     mova      [dstq+stride3q ], m0
95     RET
96
97 INIT_XMM sse
98 cglobal vp9_ipred_v_8x8_16, 2, 4, 1, dst, stride, l, a
99     movifnidn               aq, amp
100     mova                    m0, [aq]
101     DEFINE_ARGS dst, stride, stride3
102     lea               stride3q, [strideq*3]
103     mova      [dstq+strideq*0], m0
104     mova      [dstq+strideq*1], m0
105     mova      [dstq+strideq*2], m0
106     mova      [dstq+stride3q ], m0
107     lea                   dstq, [dstq+strideq*4]
108     mova      [dstq+strideq*0], m0
109     mova      [dstq+strideq*1], m0
110     mova      [dstq+strideq*2], m0
111     mova      [dstq+stride3q ], m0
112     RET
113
114 INIT_XMM sse
115 cglobal vp9_ipred_v_16x16_16, 2, 4, 2, dst, stride, l, a
116     movifnidn               aq, amp
117     mova                    m0, [aq]
118     mova                    m1, [aq+mmsize]
119     DEFINE_ARGS dst, stride, stride3, cnt
120     lea               stride3q, [strideq*3]
121     mov                   cntd, 4
122 .loop:
123     mova   [dstq+strideq*0+ 0], m0
124     mova   [dstq+strideq*0+16], m1
125     mova   [dstq+strideq*1+ 0], m0
126     mova   [dstq+strideq*1+16], m1
127     mova   [dstq+strideq*2+ 0], m0
128     mova   [dstq+strideq*2+16], m1
129     mova   [dstq+stride3q + 0], m0
130     mova   [dstq+stride3q +16], m1
131     lea                   dstq, [dstq+strideq*4]
132     dec               cntd
133     jg .loop
134     RET
135
136 INIT_XMM sse
137 cglobal vp9_ipred_v_32x32_16, 2, 4, 4, dst, stride, l, a
138     movifnidn               aq, amp
139     mova                    m0, [aq+mmsize*0]
140     mova                    m1, [aq+mmsize*1]
141     mova                    m2, [aq+mmsize*2]
142     mova                    m3, [aq+mmsize*3]
143     DEFINE_ARGS dst, stride, cnt
144     mov                   cntd, 16
145 .loop:
146     mova   [dstq+strideq*0+ 0], m0
147     mova   [dstq+strideq*0+16], m1
148     mova   [dstq+strideq*0+32], m2
149     mova   [dstq+strideq*0+48], m3
150     mova   [dstq+strideq*1+ 0], m0
151     mova   [dstq+strideq*1+16], m1
152     mova   [dstq+strideq*1+32], m2
153     mova   [dstq+strideq*1+48], m3
154     lea                   dstq, [dstq+strideq*2]
155     dec               cntd
156     jg .loop
157     RET
158
159 INIT_MMX mmxext
160 cglobal vp9_ipred_h_4x4_16, 3, 3, 4, dst, stride, l, a
161     mova                    m3, [lq]
162     DEFINE_ARGS dst, stride, stride3
163     lea               stride3q, [strideq*3]
164     pshufw                  m0, m3, q3333
165     pshufw                  m1, m3, q2222
166     pshufw                  m2, m3, q1111
167     pshufw                  m3, m3, q0000
168     mova      [dstq+strideq*0], m0
169     mova      [dstq+strideq*1], m1
170     mova      [dstq+strideq*2], m2
171     mova      [dstq+stride3q ], m3
172     RET
173
174 INIT_XMM sse2
175 cglobal vp9_ipred_h_8x8_16, 3, 3, 4, dst, stride, l, a
176     mova                    m2, [lq]
177     DEFINE_ARGS dst, stride, stride3
178     lea               stride3q, [strideq*3]
179     punpckhwd               m3, m2, m2
180     pshufd                  m0, m3, q3333
181     pshufd                  m1, m3, q2222
182     mova      [dstq+strideq*0], m0
183     mova      [dstq+strideq*1], m1
184     pshufd                  m0, m3, q1111
185     pshufd                  m1, m3, q0000
186     mova      [dstq+strideq*2], m0
187     mova      [dstq+stride3q ], m1
188     lea                   dstq, [dstq+strideq*4]
189     punpcklwd               m2, m2
190     pshufd                  m0, m2, q3333
191     pshufd                  m1, m2, q2222
192     mova      [dstq+strideq*0], m0
193     mova      [dstq+strideq*1], m1
194     pshufd                  m0, m2, q1111
195     pshufd                  m1, m2, q0000
196     mova      [dstq+strideq*2], m0
197     mova      [dstq+stride3q ], m1
198     RET
199
200 INIT_XMM sse2
201 cglobal vp9_ipred_h_16x16_16, 3, 5, 4, dst, stride, l, stride3, cnt
202     mov                   cntd, 3
203     lea               stride3q, [strideq*3]
204 .loop:
205     movh                    m3, [lq+cntq*8]
206     punpcklwd               m3, m3
207     pshufd                  m0, m3, q3333
208     pshufd                  m1, m3, q2222
209     pshufd                  m2, m3, q1111
210     pshufd                  m3, m3, q0000
211     mova    [dstq+strideq*0+ 0], m0
212     mova    [dstq+strideq*0+16], m0
213     mova    [dstq+strideq*1+ 0], m1
214     mova    [dstq+strideq*1+16], m1
215     mova    [dstq+strideq*2+ 0], m2
216     mova    [dstq+strideq*2+16], m2
217     mova    [dstq+stride3q + 0], m3
218     mova    [dstq+stride3q +16], m3
219     lea                   dstq, [dstq+strideq*4]
220     dec                   cntd
221     jge .loop
222     RET
223
224 INIT_XMM sse2
225 cglobal vp9_ipred_h_32x32_16, 3, 5, 4, dst, stride, l, stride3, cnt
226     mov                   cntd, 7
227     lea               stride3q, [strideq*3]
228 .loop:
229     movh                    m3, [lq+cntq*8]
230     punpcklwd               m3, m3
231     pshufd                  m0, m3, q3333
232     pshufd                  m1, m3, q2222
233     pshufd                  m2, m3, q1111
234     pshufd                  m3, m3, q0000
235     mova   [dstq+strideq*0+ 0], m0
236     mova   [dstq+strideq*0+16], m0
237     mova   [dstq+strideq*0+32], m0
238     mova   [dstq+strideq*0+48], m0
239     mova   [dstq+strideq*1+ 0], m1
240     mova   [dstq+strideq*1+16], m1
241     mova   [dstq+strideq*1+32], m1
242     mova   [dstq+strideq*1+48], m1
243     mova   [dstq+strideq*2+ 0], m2
244     mova   [dstq+strideq*2+16], m2
245     mova   [dstq+strideq*2+32], m2
246     mova   [dstq+strideq*2+48], m2
247     mova   [dstq+stride3q + 0], m3
248     mova   [dstq+stride3q +16], m3
249     mova   [dstq+stride3q +32], m3
250     mova   [dstq+stride3q +48], m3
251     lea                   dstq, [dstq+strideq*4]
252     dec                   cntd
253     jge .loop
254     RET
255
256 INIT_MMX mmxext
257 cglobal vp9_ipred_dc_4x4_16, 4, 4, 2, dst, stride, l, a
258     mova                    m0, [lq]
259     paddw                   m0, [aq]
260     DEFINE_ARGS dst, stride, stride3
261     lea               stride3q, [strideq*3]
262     pmaddwd                 m0, [pw_1]
263     pshufw                  m1, m0, q3232
264     paddd                   m0, [pd_4]
265     paddd                   m0, m1
266     psrad                   m0, 3
267     pshufw                  m0, m0, q0000
268     mova      [dstq+strideq*0], m0
269     mova      [dstq+strideq*1], m0
270     mova      [dstq+strideq*2], m0
271     mova      [dstq+stride3q ], m0
272     RET
273
274 INIT_XMM sse2
275 cglobal vp9_ipred_dc_8x8_16, 4, 4, 2, dst, stride, l, a
276     mova                    m0, [lq]
277     paddw                   m0, [aq]
278     DEFINE_ARGS dst, stride, stride3
279     lea               stride3q, [strideq*3]
280     pmaddwd                 m0, [pw_1]
281     pshufd                  m1, m0, q3232
282     paddd                   m0, m1
283     pshufd                  m1, m0, q1111
284     paddd                   m0, [pd_8]
285     paddd                   m0, m1
286     psrad                   m0, 4
287     pshuflw                 m0, m0, q0000
288     punpcklqdq              m0, m0
289     mova      [dstq+strideq*0], m0
290     mova      [dstq+strideq*1], m0
291     mova      [dstq+strideq*2], m0
292     mova      [dstq+stride3q ], m0
293     lea                   dstq, [dstq+strideq*4]
294     mova      [dstq+strideq*0], m0
295     mova      [dstq+strideq*1], m0
296     mova      [dstq+strideq*2], m0
297     mova      [dstq+stride3q ], m0
298     RET
299
300 INIT_XMM sse2
301 cglobal vp9_ipred_dc_16x16_16, 4, 4, 2, dst, stride, l, a
302     mova                    m0, [lq]
303     paddw                   m0, [lq+mmsize]
304     paddw                   m0, [aq]
305     paddw                   m0, [aq+mmsize]
306     DEFINE_ARGS dst, stride, stride3, cnt
307     lea               stride3q, [strideq*3]
308     mov                   cntd, 4
309     pmaddwd                 m0, [pw_1]
310     pshufd                  m1, m0, q3232
311     paddd                   m0, m1
312     pshufd                  m1, m0, q1111
313     paddd                   m0, [pd_16]
314     paddd                   m0, m1
315     psrad                   m0, 5
316     pshuflw                 m0, m0, q0000
317     punpcklqdq              m0, m0
318 .loop:
319     mova   [dstq+strideq*0+ 0], m0
320     mova   [dstq+strideq*0+16], m0
321     mova   [dstq+strideq*1+ 0], m0
322     mova   [dstq+strideq*1+16], m0
323     mova   [dstq+strideq*2+ 0], m0
324     mova   [dstq+strideq*2+16], m0
325     mova   [dstq+stride3q + 0], m0
326     mova   [dstq+stride3q +16], m0
327     lea                   dstq, [dstq+strideq*4]
328     dec                   cntd
329     jg .loop
330     RET
331
332 INIT_XMM sse2
333 cglobal vp9_ipred_dc_32x32_16, 4, 4, 2, dst, stride, l, a
334     mova                    m0, [lq+mmsize*0]
335     paddw                   m0, [lq+mmsize*1]
336     paddw                   m0, [lq+mmsize*2]
337     paddw                   m0, [lq+mmsize*3]
338     paddw                   m0, [aq+mmsize*0]
339     paddw                   m0, [aq+mmsize*1]
340     paddw                   m0, [aq+mmsize*2]
341     paddw                   m0, [aq+mmsize*3]
342     DEFINE_ARGS dst, stride, stride3, cnt
343     lea               stride3q, [strideq*3]
344     mov                   cntd, 16
345     pmaddwd                 m0, [pw_1]
346     pshufd                  m1, m0, q3232
347     paddd                   m0, m1
348     pshufd                  m1, m0, q1111
349     paddd                   m0, [pd_32]
350     paddd                   m0, m1
351     psrad                   m0, 6
352     pshuflw                 m0, m0, q0000
353     punpcklqdq              m0, m0
354 .loop:
355     mova   [dstq+strideq*0+ 0], m0
356     mova   [dstq+strideq*0+16], m0
357     mova   [dstq+strideq*0+32], m0
358     mova   [dstq+strideq*0+48], m0
359     mova   [dstq+strideq*1+ 0], m0
360     mova   [dstq+strideq*1+16], m0
361     mova   [dstq+strideq*1+32], m0
362     mova   [dstq+strideq*1+48], m0
363     lea                   dstq, [dstq+strideq*2]
364     dec                   cntd
365     jg .loop
366     RET
367
368 %macro DC_1D_FNS 2
369 INIT_MMX mmxext
370 cglobal vp9_ipred_dc_%1_4x4_16, 4, 4, 2, dst, stride, l, a
371     mova                    m0, [%2]
372     DEFINE_ARGS dst, stride, stride3
373     lea               stride3q, [strideq*3]
374     pmaddwd                 m0, [pw_1]
375     pshufw                  m1, m0, q3232
376     paddd                   m0, [pd_2]
377     paddd                   m0, m1
378     psrad                   m0, 2
379     pshufw                  m0, m0, q0000
380     mova      [dstq+strideq*0], m0
381     mova      [dstq+strideq*1], m0
382     mova      [dstq+strideq*2], m0
383     mova      [dstq+stride3q ], m0
384     RET
385
386 INIT_XMM sse2
387 cglobal vp9_ipred_dc_%1_8x8_16, 4, 4, 2, dst, stride, l, a
388     mova                    m0, [%2]
389     DEFINE_ARGS dst, stride, stride3
390     lea               stride3q, [strideq*3]
391     pmaddwd                 m0, [pw_1]
392     pshufd                  m1, m0, q3232
393     paddd                   m0, m1
394     pshufd                  m1, m0, q1111
395     paddd                   m0, [pd_4]
396     paddd                   m0, m1
397     psrad                   m0, 3
398     pshuflw                 m0, m0, q0000
399     punpcklqdq              m0, m0
400     mova      [dstq+strideq*0], m0
401     mova      [dstq+strideq*1], m0
402     mova      [dstq+strideq*2], m0
403     mova      [dstq+stride3q ], m0
404     lea                   dstq, [dstq+strideq*4]
405     mova      [dstq+strideq*0], m0
406     mova      [dstq+strideq*1], m0
407     mova      [dstq+strideq*2], m0
408     mova      [dstq+stride3q ], m0
409     RET
410
411 INIT_XMM sse2
412 cglobal vp9_ipred_dc_%1_16x16_16, 4, 4, 2, dst, stride, l, a
413     mova                    m0, [%2]
414     paddw                   m0, [%2+mmsize]
415     DEFINE_ARGS dst, stride, stride3, cnt
416     lea               stride3q, [strideq*3]
417     mov                   cntd, 4
418     pmaddwd                 m0, [pw_1]
419     pshufd                  m1, m0, q3232
420     paddd                   m0, m1
421     pshufd                  m1, m0, q1111
422     paddd                   m0, [pd_8]
423     paddd                   m0, m1
424     psrad                   m0, 4
425     pshuflw                 m0, m0, q0000
426     punpcklqdq              m0, m0
427 .loop:
428     mova   [dstq+strideq*0+ 0], m0
429     mova   [dstq+strideq*0+16], m0
430     mova   [dstq+strideq*1+ 0], m0
431     mova   [dstq+strideq*1+16], m0
432     mova   [dstq+strideq*2+ 0], m0
433     mova   [dstq+strideq*2+16], m0
434     mova   [dstq+stride3q + 0], m0
435     mova   [dstq+stride3q +16], m0
436     lea                   dstq, [dstq+strideq*4]
437     dec                   cntd
438     jg .loop
439     RET
440
441 INIT_XMM sse2
442 cglobal vp9_ipred_dc_%1_32x32_16, 4, 4, 2, dst, stride, l, a
443     mova                    m0, [%2+mmsize*0]
444     paddw                   m0, [%2+mmsize*1]
445     paddw                   m0, [%2+mmsize*2]
446     paddw                   m0, [%2+mmsize*3]
447     DEFINE_ARGS dst, stride, cnt
448     mov                   cntd, 16
449     pmaddwd                 m0, [pw_1]
450     pshufd                  m1, m0, q3232
451     paddd                   m0, m1
452     pshufd                  m1, m0, q1111
453     paddd                   m0, [pd_16]
454     paddd                   m0, m1
455     psrad                   m0, 5
456     pshuflw                 m0, m0, q0000
457     punpcklqdq              m0, m0
458 .loop:
459     mova   [dstq+strideq*0+ 0], m0
460     mova   [dstq+strideq*0+16], m0
461     mova   [dstq+strideq*0+32], m0
462     mova   [dstq+strideq*0+48], m0
463     mova   [dstq+strideq*1+ 0], m0
464     mova   [dstq+strideq*1+16], m0
465     mova   [dstq+strideq*1+32], m0
466     mova   [dstq+strideq*1+48], m0
467     lea                   dstq, [dstq+strideq*2]
468     dec                   cntd
469     jg .loop
470     RET
471 %endmacro
472
473 DC_1D_FNS top,  aq
474 DC_1D_FNS left, lq
475
476 INIT_MMX mmxext
477 cglobal vp9_ipred_tm_4x4_10, 4, 4, 6, dst, stride, l, a
478     mova                    m5, [pw_1023]
479 .body:
480     mova                    m4, [aq]
481     mova                    m3, [lq]
482     movd                    m0, [aq-4]
483     pshufw                  m0, m0, q1111
484     psubw                   m4, m0
485     DEFINE_ARGS dst, stride, stride3
486     lea               stride3q, [strideq*3]
487     pshufw                  m0, m3, q3333
488     pshufw                  m1, m3, q2222
489     pshufw                  m2, m3, q1111
490     pshufw                  m3, m3, q0000
491     paddw                   m0, m4
492     paddw                   m1, m4
493     paddw                   m2, m4
494     paddw                   m3, m4
495     pxor                    m4, m4
496     pmaxsw                  m0, m4
497     pmaxsw                  m1, m4
498     pmaxsw                  m2, m4
499     pmaxsw                  m3, m4
500     pminsw                  m0, m5
501     pminsw                  m1, m5
502     pminsw                  m2, m5
503     pminsw                  m3, m5
504     mova      [dstq+strideq*0], m0
505     mova      [dstq+strideq*1], m1
506     mova      [dstq+strideq*2], m2
507     mova      [dstq+stride3q ], m3
508     RET
509
510 cglobal vp9_ipred_tm_4x4_12, 4, 4, 6, dst, stride, l, a
511     mova                    m5, [pw_4095]
512     jmp mangle(private_prefix %+ _ %+ vp9_ipred_tm_4x4_10 %+ SUFFIX).body
513
514 INIT_XMM sse2
515 cglobal vp9_ipred_tm_8x8_10, 4, 5, 7, dst, stride, l, a
516     mova                    m4, [pw_1023]
517 .body:
518     pxor                    m6, m6
519     mova                    m5, [aq]
520     movd                    m0, [aq-4]
521     pshuflw                 m0, m0, q1111
522     punpcklqdq              m0, m0
523     psubw                   m5, m0
524     DEFINE_ARGS dst, stride, l, stride3, cnt
525     lea               stride3q, [strideq*3]
526     mov                   cntd, 1
527 .loop:
528     movh                    m3, [lq+cntq*8]
529     punpcklwd               m3, m3
530     pshufd                  m0, m3, q3333
531     pshufd                  m1, m3, q2222
532     pshufd                  m2, m3, q1111
533     pshufd                  m3, m3, q0000
534     paddw                   m0, m5
535     paddw                   m1, m5
536     paddw                   m2, m5
537     paddw                   m3, m5
538     pmaxsw                  m0, m6
539     pmaxsw                  m1, m6
540     pmaxsw                  m2, m6
541     pmaxsw                  m3, m6
542     pminsw                  m0, m4
543     pminsw                  m1, m4
544     pminsw                  m2, m4
545     pminsw                  m3, m4
546     mova      [dstq+strideq*0], m0
547     mova      [dstq+strideq*1], m1
548     mova      [dstq+strideq*2], m2
549     mova      [dstq+stride3q ], m3
550     lea                   dstq, [dstq+strideq*4]
551     dec                   cntd
552     jge .loop
553     RET
554
555 cglobal vp9_ipred_tm_8x8_12, 4, 5, 7, dst, stride, l, a
556     mova                    m4, [pw_4095]
557     jmp mangle(private_prefix %+ _ %+ vp9_ipred_tm_8x8_10 %+ SUFFIX).body
558
559 INIT_XMM sse2
560 cglobal vp9_ipred_tm_16x16_10, 4, 4, 8, dst, stride, l, a
561     mova                    m7, [pw_1023]
562 .body:
563     pxor                    m6, m6
564     mova                    m4, [aq]
565     mova                    m5, [aq+mmsize]
566     movd                    m0, [aq-4]
567     pshuflw                 m0, m0, q1111
568     punpcklqdq              m0, m0
569     psubw                   m4, m0
570     psubw                   m5, m0
571     DEFINE_ARGS dst, stride, l, cnt
572     mov                   cntd, 7
573 .loop:
574     movd                    m3, [lq+cntq*4]
575     punpcklwd               m3, m3
576     pshufd                  m2, m3, q1111
577     pshufd                  m3, m3, q0000
578     paddw                   m0, m2, m4
579     paddw                   m2, m5
580     paddw                   m1, m3, m4
581     paddw                   m3, m5
582     pmaxsw                  m0, m6
583     pmaxsw                  m2, m6
584     pmaxsw                  m1, m6
585     pmaxsw                  m3, m6
586     pminsw                  m0, m7
587     pminsw                  m2, m7
588     pminsw                  m1, m7
589     pminsw                  m3, m7
590     mova   [dstq+strideq*0+ 0], m0
591     mova   [dstq+strideq*0+16], m2
592     mova   [dstq+strideq*1+ 0], m1
593     mova   [dstq+strideq*1+16], m3
594     lea                   dstq, [dstq+strideq*2]
595     dec                   cntd
596     jge .loop
597     RET
598
599 cglobal vp9_ipred_tm_16x16_12, 4, 4, 8, dst, stride, l, a
600     mova                    m7, [pw_4095]
601     jmp mangle(private_prefix %+ _ %+ vp9_ipred_tm_16x16_10 %+ SUFFIX).body
602
603 INIT_XMM sse2
604 cglobal vp9_ipred_tm_32x32_10, 4, 4, 10, 32 * -ARCH_X86_32, dst, stride, l, a
605     mova                    m0, [pw_1023]
606 .body:
607     pxor                    m1, m1
608 %if ARCH_X86_64
609     SWAP                     0, 8
610     SWAP                     1, 9
611 %define reg_min m9
612 %define reg_max m8
613 %else
614     mova              [rsp+ 0], m0
615     mova              [rsp+16], m1
616 %define reg_min [rsp+16]
617 %define reg_max [rsp+ 0]
618 %endif
619
620     mova                    m4, [aq+mmsize*0]
621     mova                    m5, [aq+mmsize*1]
622     mova                    m6, [aq+mmsize*2]
623     mova                    m7, [aq+mmsize*3]
624     movd                    m0, [aq-4]
625     pshuflw                 m0, m0, q1111
626     punpcklqdq              m0, m0
627     psubw                   m4, m0
628     psubw                   m5, m0
629     psubw                   m6, m0
630     psubw                   m7, m0
631     DEFINE_ARGS dst, stride, l, cnt
632     mov                   cntd, 31
633 .loop:
634     pinsrw                  m3, [lq+cntq*2], 0
635     punpcklwd               m3, m3
636     pshufd                  m3, m3, q0000
637     paddw                   m0, m3, m4
638     paddw                   m1, m3, m5
639     paddw                   m2, m3, m6
640     paddw                   m3, m7
641     pmaxsw                  m0, reg_min
642     pmaxsw                  m1, reg_min
643     pmaxsw                  m2, reg_min
644     pmaxsw                  m3, reg_min
645     pminsw                  m0, reg_max
646     pminsw                  m1, reg_max
647     pminsw                  m2, reg_max
648     pminsw                  m3, reg_max
649     mova   [dstq+strideq*0+ 0], m0
650     mova   [dstq+strideq*0+16], m1
651     mova   [dstq+strideq*0+32], m2
652     mova   [dstq+strideq*0+48], m3
653     add                   dstq, strideq
654     dec                   cntd
655     jge .loop
656     RET
657
658 cglobal vp9_ipred_tm_32x32_12, 4, 4, 10, 32 * -ARCH_X86_32, dst, stride, l, a
659     mova                    m0, [pw_4095]
660     jmp mangle(private_prefix %+ _ %+ vp9_ipred_tm_32x32_10 %+ SUFFIX).body
661
662 ; Directional intra predicion functions
663 ;
664 ; in the functions below, 'abcdefgh' refers to above data (sometimes simply
665 ; abbreviated as a[N-M]). 'stuvwxyz' refers to left data (sometimes simply
666 ; abbreviated as l[N-M]). * is top-left data. ABCDEFG or A[N-M] is filtered
667 ; above data, STUVWXYZ or L[N-M] is filtered left data, and # is filtered
668 ; top-left data.
669
670 ; left=(left+2*center+right+2)>>2
671 %macro LOWPASS 3 ; left [dst], center, right
672     paddw                  m%1, m%3
673     psraw                  m%1, 1
674     pavgw                  m%1, m%2
675 %endmacro
676
677 ; abcdefgh (src) -> bcdefghh (dst)
678 ; dst/src can be the same register
679 %macro SHIFT_RIGHT 2-3 [pb_2to15_14_15] ; dst, src, [ssse3_shift_reg]
680 %if cpuflag(ssse3)
681     pshufb                  %1, %2, %3              ; abcdefgh -> bcdefghh
682 %else
683     psrldq                  %1, %2, 2               ; abcdefgh -> bcdefgh.
684     pshufhw                 %1, %1, q2210           ; bcdefgh. -> bcdefghh
685 %endif
686 %endmacro
687
688 ; abcdefgh (src) -> bcdefghh (dst1) and cdefghhh (dst2)
689 %macro SHIFT_RIGHTx2 3-4 [pb_2to15_14_15] ; dst1, dst2, src, [ssse3_shift_reg]
690 %if cpuflag(ssse3)
691     pshufb                  %1, %3, %4              ; abcdefgh -> bcdefghh
692     pshufb                  %2, %1, %4              ; bcdefghh -> cdefghhh
693 %else
694     psrldq                  %1, %3, 2               ; abcdefgh -> bcdefgh.
695     psrldq                  %2, %3, 4               ; abcdefgh -> cdefgh..
696     pshufhw                 %1, %1, q2210           ; bcdefgh. -> bcdefghh
697     pshufhw                 %2, %2, q1110           ; cdefgh.. -> cdefghhh
698 %endif
699 %endmacro
700
701 %macro DL_FUNCS 0
702 cglobal vp9_ipred_dl_4x4_16, 2, 4, 3, dst, stride, l, a
703     movifnidn               aq, amp
704     movu                    m1, [aq]                ; abcdefgh
705     pshufhw                 m0, m1, q3310           ; abcdefhh
706     SHIFT_RIGHT             m1, m1                  ; bcdefghh
707     psrldq                  m2, m1, 2               ; cdefghh.
708     LOWPASS                  0,  1,  2              ; BCDEFGh.
709     pshufd                  m1, m0, q3321           ; DEFGh...
710     movh      [dstq+strideq*0], m0
711     movh      [dstq+strideq*2], m1
712     add                   dstq, strideq
713     psrldq                  m0, 2                   ; CDEFGh..
714     psrldq                  m1, 2                   ; EFGh....
715     movh      [dstq+strideq*0], m0
716     movh      [dstq+strideq*2], m1
717     RET
718
719 cglobal vp9_ipred_dl_8x8_16, 2, 4, 5, dst, stride, l, a
720     movifnidn               aq, amp
721     mova                    m0, [aq]                ; abcdefgh
722 %if cpuflag(ssse3)
723     mova                    m4, [pb_2to15_14_15]
724 %endif
725     SHIFT_RIGHTx2           m1, m2, m0, m4          ; bcdefghh/cdefghhh
726     LOWPASS                  0,  1,  2              ; BCDEFGHh
727     shufps                  m1, m0, m2, q3332       ; FGHhhhhh
728     shufps                  m3, m0, m1, q2121       ; DEFGHhhh
729     DEFINE_ARGS dst, stride, stride5
730     lea               stride5q, [strideq*5]
731
732     mova      [dstq+strideq*0], m0
733     mova      [dstq+strideq*4], m1
734     SHIFT_RIGHT             m0, m0, m4              ; CDEFGHhh
735     pshuflw                 m1, m1, q3321           ; GHhhhhhh
736     pshufd                  m2, m0, q3321           ; EFGHhhhh
737     mova      [dstq+strideq*1], m0
738     mova      [dstq+stride5q ], m1
739     lea                   dstq, [dstq+strideq*2]
740     pshuflw                 m1, m1, q3321           ; Hhhhhhhh
741     mova      [dstq+strideq*0], m3
742     mova      [dstq+strideq*4], m1
743     pshuflw                 m1, m1, q3321           ; hhhhhhhh
744     mova      [dstq+strideq*1], m2
745     mova      [dstq+stride5q ], m1
746     RET
747
748 cglobal vp9_ipred_dl_16x16_16, 2, 4, 5, dst, stride, l, a
749     movifnidn               aq, amp
750     mova                    m0, [aq]                ; abcdefgh
751     mova                    m3, [aq+mmsize]         ; ijklmnop
752     PALIGNR                 m1, m3, m0, 2, m4       ; bcdefghi
753     PALIGNR                 m2, m3, m0, 4, m4       ; cdefghij
754     LOWPASS                  0,  1,  2              ; BCDEFGHI
755 %if cpuflag(ssse3)
756     mova                    m4, [pb_2to15_14_15]
757 %endif
758     SHIFT_RIGHTx2           m2, m1, m3, m4          ; jklmnopp/klmnoppp
759     LOWPASS                  1,  2,  3              ; JKLMNOPp
760     pshufd                  m2, m2, q3333           ; pppppppp
761     DEFINE_ARGS dst, stride, cnt
762     mov                   cntd, 8
763
764 .loop:
765     mova   [dstq+strideq*0+ 0], m0
766     mova   [dstq+strideq*0+16], m1
767     mova   [dstq+strideq*8+ 0], m1
768     mova   [dstq+strideq*8+16], m2
769     add                   dstq, strideq
770 %if cpuflag(avx)
771     vpalignr                m0, m1, m0, 2
772 %else
773     PALIGNR                 m3, m1, m0, 2, m4
774     mova                    m0, m3
775 %endif
776     SHIFT_RIGHT             m1, m1, m4
777     dec                   cntd
778     jg .loop
779     RET
780
781 cglobal vp9_ipred_dl_32x32_16, 2, 5, 7, dst, stride, l, a
782     movifnidn               aq, amp
783     mova                    m0, [aq+mmsize*0]       ; abcdefgh
784     mova                    m1, [aq+mmsize*1]       ; ijklmnop
785     mova                    m2, [aq+mmsize*2]       ; qrstuvwx
786     mova                    m3, [aq+mmsize*3]       ; yz012345
787     PALIGNR                 m4, m1, m0, 2, m6
788     PALIGNR                 m5, m1, m0, 4, m6
789     LOWPASS                  0,  4,  5              ; BCDEFGHI
790     PALIGNR                 m4, m2, m1, 2, m6
791     PALIGNR                 m5, m2, m1, 4, m6
792     LOWPASS                  1,  4,  5              ; JKLMNOPQ
793     PALIGNR                 m4, m3, m2, 2, m6
794     PALIGNR                 m5, m3, m2, 4, m6
795     LOWPASS                  2,  4,  5              ; RSTUVWXY
796 %if cpuflag(ssse3)
797     mova                    m6, [pb_2to15_14_15]
798 %endif
799     SHIFT_RIGHTx2           m4, m5, m3, m6
800     LOWPASS                  3,  4,  5              ; Z0123455
801     pshufd                  m4, m4, q3333           ; 55555555
802     DEFINE_ARGS dst, stride, stride8, stride24, cnt
803     mov                   cntd, 8
804     lea               stride8q, [strideq*8]
805     lea              stride24q, [stride8q*3]
806
807 .loop:
808     mova  [dstq+stride8q*0+ 0], m0
809     mova  [dstq+stride8q*0+16], m1
810     mova  [dstq+stride8q*0+32], m2
811     mova  [dstq+stride8q*0+48], m3
812     mova  [dstq+stride8q*1+ 0], m1
813     mova  [dstq+stride8q*1+16], m2
814     mova  [dstq+stride8q*1+32], m3
815     mova  [dstq+stride8q*1+48], m4
816     mova  [dstq+stride8q*2+ 0], m2
817     mova  [dstq+stride8q*2+16], m3
818     mova  [dstq+stride8q*2+32], m4
819     mova  [dstq+stride8q*2+48], m4
820     mova  [dstq+stride24q + 0], m3
821     mova  [dstq+stride24q +16], m4
822     mova  [dstq+stride24q +32], m4
823     mova  [dstq+stride24q +48], m4
824     add                   dstq, strideq
825 %if cpuflag(avx)
826     vpalignr                m0, m1, m0, 2
827     vpalignr                m1, m2, m1, 2
828     vpalignr                m2, m3, m2, 2
829 %else
830     PALIGNR                 m5, m1, m0, 2, m6
831     mova                    m0, m5
832     PALIGNR                 m5, m2, m1, 2, m6
833     mova                    m1, m5
834     PALIGNR                 m5, m3, m2, 2, m6
835     mova                    m2, m5
836 %endif
837     SHIFT_RIGHT             m3, m3, m6
838     dec                   cntd
839     jg .loop
840     RET
841 %endmacro
842
843 INIT_XMM sse2
844 DL_FUNCS
845 INIT_XMM ssse3
846 DL_FUNCS
847 INIT_XMM avx
848 DL_FUNCS
849
850 %macro DR_FUNCS 1 ; stack_mem_for_32x32_32bit_function
851 cglobal vp9_ipred_dr_4x4_16, 4, 4, 3, dst, stride, l, a
852     movh                    m0, [lq]                ; wxyz....
853     movhps                  m0, [aq-2]              ; wxyz*abc
854     movd                    m1, [aq+6]              ; d.......
855     PALIGNR                 m1, m0, 2, m2           ; xyz*abcd
856     psrldq                  m2, m1, 2               ; yz*abcd.
857     LOWPASS                  0, 1, 2                ; XYZ#ABC.
858     DEFINE_ARGS dst, stride, stride3
859     lea               stride3q, [strideq*3]
860
861     movh      [dstq+stride3q ], m0
862     psrldq                  m0, 2                   ; YZ#ABC..
863     movh      [dstq+strideq*2], m0
864     psrldq                  m0, 2                   ; Z#ABC...
865     movh      [dstq+strideq*1], m0
866     psrldq                  m0, 2                   ; #ABC....
867     movh      [dstq+strideq*0], m0
868     RET
869
870 cglobal vp9_ipred_dr_8x8_16, 4, 4, 5, dst, stride, l, a
871     mova                    m0, [lq]                ; stuvwxyz
872     movu                    m1, [aq-2]              ; *abcdefg
873     mova                    m2, [aq]                ; abcdefgh
874     psrldq                  m3, m2, 2               ; bcdefgh.
875     LOWPASS                  3,  2, 1               ; ABCDEFG.
876     PALIGNR                 m1, m0, 2, m4           ; tuvwxyz*
877     PALIGNR                 m2, m1, 2, m4           ; uvwxyz*a
878     LOWPASS                  2,  1, 0               ; TUVWXYZ#
879     DEFINE_ARGS dst, stride, dst4, stride3
880     lea               stride3q, [strideq*3]
881     lea                  dst4q, [dstq+strideq*4]
882
883     movhps [dstq +stride3q +0], m2
884     movh   [dstq+ stride3q +8], m3
885     mova   [dst4q+stride3q +0], m2
886     PALIGNR                 m1, m3, m2, 2, m0
887     psrldq                  m3, 2
888     movhps [dstq +strideq*2+0], m1
889     movh   [dstq+ strideq*2+8], m3
890     mova   [dst4q+strideq*2+0], m1
891     PALIGNR                 m2, m3, m1, 2, m0
892     psrldq                  m3, 2
893     movhps [dstq +strideq*1+0], m2
894     movh   [dstq+ strideq*1+8], m3
895     mova   [dst4q+strideq*1+0], m2
896     PALIGNR                 m1, m3, m2, 2, m0
897     psrldq                  m3, 2
898     movhps [dstq +strideq*0+0], m1
899     movh   [dstq+ strideq*0+8], m3
900     mova   [dst4q+strideq*0+0], m1
901     RET
902
903 cglobal vp9_ipred_dr_16x16_16, 4, 4, 7, dst, stride, l, a
904     mova                    m0, [lq]                ; klmnopqr
905     mova                    m1, [lq+mmsize]         ; stuvwxyz
906     movu                    m2, [aq-2]              ; *abcdefg
907     movu                    m3, [aq+mmsize-2]       ; hijklmno
908     mova                    m4, [aq]                ; abcdefgh
909     mova                    m5, [aq+mmsize]         ; ijklmnop
910     psrldq                  m6, m5, 2               ; jklmnop.
911     LOWPASS                  6,  5, 3               ; IJKLMNO.
912     PALIGNR                 m5, m4, 2, m3           ; bcdefghi
913     LOWPASS                  5,  4, 2               ; ABCDEFGH
914     PALIGNR                 m2, m1, 2, m3           ; tuvwxyz*
915     PALIGNR                 m4, m2, 2, m3           ; uvwxyz*a
916     LOWPASS                  4,  2, 1               ; TUVWXYZ#
917     PALIGNR                 m1, m0, 2, m3           ; lmnopqrs
918     PALIGNR                 m2, m1, 2, m3           ; mnopqrst
919     LOWPASS                  2, 1, 0                ; LMNOPQRS
920     DEFINE_ARGS dst, stride, dst8, cnt
921     lea                  dst8q, [dstq+strideq*8]
922     mov                   cntd, 8
923
924 .loop:
925     sub                  dst8q, strideq
926     mova  [dst8q+strideq*0+ 0], m4
927     mova  [dst8q+strideq*0+16], m5
928     mova  [dst8q+strideq*8+ 0], m2
929     mova  [dst8q+strideq*8+16], m4
930 %if cpuflag(avx)
931     vpalignr                m2, m4, m2, 2
932     vpalignr                m4, m5, m4, 2
933     vpalignr                m5, m6, m5, 2
934 %else
935     PALIGNR                 m0, m4, m2, 2, m1
936     mova                    m2, m0
937     PALIGNR                 m0, m5, m4, 2, m1
938     mova                    m4, m0
939     PALIGNR                 m0, m6, m5, 2, m1
940     mova                    m5, m0
941 %endif
942     psrldq                  m6, 2
943     dec                   cntd
944     jg .loop
945     RET
946
947 cglobal vp9_ipred_dr_32x32_16, 4, 5, 10 + notcpuflag(ssse3), \
948                                %1 * ARCH_X86_32 * -mmsize, dst, stride, l, a
949     mova                    m0, [aq+mmsize*3]       ; a[24-31]
950     movu                    m1, [aq+mmsize*3-2]     ; a[23-30]
951     psrldq                  m2, m0, 2               ; a[25-31].
952     LOWPASS                  2,  0, 1               ; A[24-30].
953     mova                    m1, [aq+mmsize*2]       ; a[16-23]
954     movu                    m3, [aq+mmsize*2-2]     ; a[15-22]
955     PALIGNR                 m0, m1, 2, m4           ; a[17-24]
956     LOWPASS                  0,  1, 3               ; A[16-23]
957     mova                    m3, [aq+mmsize*1]       ; a[8-15]
958     movu                    m4, [aq+mmsize*1-2]     ; a[7-14]
959     PALIGNR                 m1, m3, 2, m5           ; a[9-16]
960     LOWPASS                  1,  3, 4               ; A[8-15]
961     mova                    m4, [aq+mmsize*0]       ; a[0-7]
962     movu                    m5, [aq+mmsize*0-2]     ; *a[0-6]
963     PALIGNR                 m3, m4, 2, m6           ; a[1-8]
964     LOWPASS                  3,  4, 5               ; A[0-7]
965     SCRATCH                  1,  8, rsp+0*mmsize
966     SCRATCH                  3,  9, rsp+1*mmsize
967 %if notcpuflag(ssse3)
968     SCRATCH                  0, 10, rsp+2*mmsize
969 %endif
970     mova                    m6, [lq+mmsize*3]       ; l[24-31]
971     PALIGNR                 m5, m6, 2, m0           ; l[25-31]*
972     PALIGNR                 m4, m5, 2, m0           ; l[26-31]*a
973     LOWPASS                  4,  5, 6               ; L[25-31]#
974     mova                    m7, [lq+mmsize*2]       ; l[16-23]
975     PALIGNR                 m6, m7, 2, m0           ; l[17-24]
976     PALIGNR                 m5, m6, 2, m0           ; l[18-25]
977     LOWPASS                  5,  6, 7               ; L[17-24]
978     mova                    m1, [lq+mmsize*1]       ; l[8-15]
979     PALIGNR                 m7, m1, 2, m0           ; l[9-16]
980     PALIGNR                 m6, m7, 2, m0           ; l[10-17]
981     LOWPASS                  6,  7, 1               ; L[9-16]
982     mova                    m3, [lq+mmsize*0]       ; l[0-7]
983     PALIGNR                 m1, m3, 2, m0           ; l[1-8]
984     PALIGNR                 m7, m1, 2, m0           ; l[2-9]
985     LOWPASS                  7,  1, 3               ; L[1-8]
986 %if cpuflag(ssse3)
987 %if cpuflag(avx)
988     UNSCRATCH                1,  8, rsp+0*mmsize
989 %endif
990     UNSCRATCH                3,  9, rsp+1*mmsize
991 %else
992     UNSCRATCH                0, 10, rsp+2*mmsize
993 %endif
994     DEFINE_ARGS dst8, stride, stride8, stride24, cnt
995     lea               stride8q, [strideq*8]
996     lea              stride24q, [stride8q*3]
997     lea                  dst8q, [dst8q+strideq*8]
998     mov                   cntd, 8
999
1000 .loop:
1001     sub                  dst8q, strideq
1002 %if notcpuflag(avx)
1003     UNSCRATCH                1,  8, rsp+0*mmsize
1004 %if notcpuflag(ssse3)
1005     UNSCRATCH                3,  9, rsp+1*mmsize
1006 %endif
1007 %endif
1008     mova [dst8q+stride8q*0+ 0], m4
1009     mova [dst8q+stride8q*0+16], m3
1010     mova [dst8q+stride8q*0+32], m1
1011     mova [dst8q+stride8q*0+48], m0
1012     mova [dst8q+stride8q*1+ 0], m5
1013     mova [dst8q+stride8q*1+16], m4
1014     mova [dst8q+stride8q*1+32], m3
1015     mova [dst8q+stride8q*1+48], m1
1016     mova [dst8q+stride8q*2+ 0], m6
1017     mova [dst8q+stride8q*2+16], m5
1018     mova [dst8q+stride8q*2+32], m4
1019     mova [dst8q+stride8q*2+48], m3
1020     mova [dst8q+stride24q + 0], m7
1021     mova [dst8q+stride24q +16], m6
1022     mova [dst8q+stride24q +32], m5
1023     mova [dst8q+stride24q +48], m4
1024 %if cpuflag(avx)
1025     vpalignr                m7, m6, m7, 2
1026     vpalignr                m6, m5, m6, 2
1027     vpalignr                m5, m4, m5, 2
1028     vpalignr                m4, m3, m4, 2
1029     vpalignr                m3, m1, m3, 2
1030     vpalignr                m1, m0, m1, 2
1031     vpalignr                m0, m2, m0, 2
1032 %else
1033     SCRATCH                  2,  8, rsp+0*mmsize
1034 %if notcpuflag(ssse3)
1035     SCRATCH                  0,  9, rsp+1*mmsize
1036 %endif
1037     PALIGNR                 m2, m6, m7, 2, m0
1038     mova                    m7, m2
1039     PALIGNR                 m2, m5, m6, 2, m0
1040     mova                    m6, m2
1041     PALIGNR                 m2, m4, m5, 2, m0
1042     mova                    m5, m2
1043     PALIGNR                 m2, m3, m4, 2, m0
1044     mova                    m4, m2
1045     PALIGNR                 m2, m1, m3, 2, m0
1046     mova                    m3, m2
1047 %if notcpuflag(ssse3)
1048     UNSCRATCH                0,  9, rsp+1*mmsize
1049     SCRATCH                  3,  9, rsp+1*mmsize
1050 %endif
1051     PALIGNR                 m2, m0, m1, 2, m3
1052     mova                    m1, m2
1053     UNSCRATCH                2,  8, rsp+0*mmsize
1054     SCRATCH                  1,  8, rsp+0*mmsize
1055     PALIGNR                 m1, m2, m0, 2, m3
1056     mova                    m0, m1
1057 %endif
1058     psrldq                  m2, 2
1059     dec                   cntd
1060     jg .loop
1061     RET
1062 %endmacro
1063
1064 INIT_XMM sse2
1065 DR_FUNCS 3
1066 INIT_XMM ssse3
1067 DR_FUNCS 2
1068 INIT_XMM avx
1069 DR_FUNCS 2
1070
1071 %macro VL_FUNCS 1 ; stack_mem_for_32x32_32bit_function
1072 cglobal vp9_ipred_vl_4x4_16, 2, 4, 3, dst, stride, l, a
1073     movifnidn               aq, amp
1074     movu                    m0, [aq]                ; abcdefgh
1075     psrldq                  m1, m0, 2               ; bcdefgh.
1076     psrldq                  m2, m0, 4               ; cdefgh..
1077     LOWPASS                  2,  1, 0               ; BCDEFGH.
1078     pavgw                   m1, m0                  ; ABCDEFG.
1079     DEFINE_ARGS dst, stride, stride3
1080     lea               stride3q, [strideq*3]
1081
1082     movh      [dstq+strideq*0], m1
1083     movh      [dstq+strideq*1], m2
1084     psrldq                  m1, 2
1085     psrldq                  m2, 2
1086     movh      [dstq+strideq*2], m1
1087     movh      [dstq+stride3q ], m2
1088     RET
1089
1090 cglobal vp9_ipred_vl_8x8_16, 2, 4, 4, dst, stride, l, a
1091     movifnidn               aq, amp
1092     mova                    m0, [aq]                ; abcdefgh
1093 %if cpuflag(ssse3)
1094     mova                    m3, [pb_2to15_14_15]
1095 %endif
1096     SHIFT_RIGHTx2           m1, m2, m0, m3          ; bcdefghh/cdefghhh
1097     LOWPASS                  2,  1, 0               ; BCDEFGHh
1098     pavgw                   m1, m0                  ; ABCDEFGh
1099     DEFINE_ARGS dst, stride, stride3
1100     lea               stride3q, [strideq*3]
1101
1102     mova      [dstq+strideq*0], m1
1103     mova      [dstq+strideq*1], m2
1104     SHIFT_RIGHT             m1, m1, m3
1105     SHIFT_RIGHT             m2, m2, m3
1106     mova      [dstq+strideq*2], m1
1107     mova      [dstq+stride3q ], m2
1108     lea                   dstq, [dstq+strideq*4]
1109     SHIFT_RIGHT             m1, m1, m3
1110     SHIFT_RIGHT             m2, m2, m3
1111     mova      [dstq+strideq*0], m1
1112     mova      [dstq+strideq*1], m2
1113     SHIFT_RIGHT             m1, m1, m3
1114     SHIFT_RIGHT             m2, m2, m3
1115     mova      [dstq+strideq*2], m1
1116     mova      [dstq+stride3q ], m2
1117     RET
1118
1119 cglobal vp9_ipred_vl_16x16_16, 2, 4, 6, dst, stride, l, a
1120     movifnidn               aq, amp
1121     mova                    m0, [aq]
1122     mova                    m1, [aq+mmsize]
1123     PALIGNR                 m2, m1, m0, 2, m3
1124     PALIGNR                 m3, m1, m0, 4, m4
1125     LOWPASS                  3,  2,  0
1126     pavgw                   m2, m0
1127 %if cpuflag(ssse3)
1128     mova                    m4, [pb_2to15_14_15]
1129 %endif
1130     SHIFT_RIGHTx2           m5, m0, m1, m4
1131     LOWPASS                  0,  5,  1
1132     pavgw                   m1, m5
1133     DEFINE_ARGS dst, stride, cnt
1134     mov                   cntd, 8
1135
1136 .loop:
1137     mova   [dstq+strideq*0+ 0], m2
1138     mova   [dstq+strideq*0+16], m1
1139     mova   [dstq+strideq*1+ 0], m3
1140     mova   [dstq+strideq*1+16], m0
1141     lea                   dstq, [dstq+strideq*2]
1142 %if cpuflag(avx)
1143     vpalignr                m2, m1, m2, 2
1144     vpalignr                m3, m0, m3, 2
1145 %else
1146     PALIGNR                 m5, m1, m2, 2, m4
1147     mova                    m2, m5
1148     PALIGNR                 m5, m0, m3, 2, m4
1149     mova                    m3, m5
1150 %endif
1151     SHIFT_RIGHT             m1, m1, m4
1152     SHIFT_RIGHT             m0, m0, m4
1153     dec                   cntd
1154     jg .loop
1155     RET
1156
1157 cglobal vp9_ipred_vl_32x32_16, 2, 5, 11, %1 * mmsize * ARCH_X86_32, dst, stride, l, a
1158     movifnidn               aq, amp
1159     mova                    m0, [aq+mmsize*0]
1160     mova                    m1, [aq+mmsize*1]
1161     mova                    m2, [aq+mmsize*2]
1162     PALIGNR                 m6, m1, m0, 2, m5
1163     PALIGNR                 m7, m1, m0, 4, m5
1164     LOWPASS                  7,  6,  0
1165     pavgw                   m6, m0
1166     SCRATCH                  6,  8, rsp+0*mmsize
1167     PALIGNR                 m4, m2, m1, 2, m0
1168     PALIGNR                 m5, m2, m1, 4, m0
1169     LOWPASS                  5,  4,  1
1170     pavgw                   m4, m1
1171     mova                    m0, [aq+mmsize*3]
1172     PALIGNR                 m1, m0, m2, 2, m6
1173     PALIGNR                 m3, m0, m2, 4, m6
1174     LOWPASS                  3,  1,  2
1175     pavgw                   m2, m1
1176 %if cpuflag(ssse3)
1177     PRELOAD                 10, pb_2to15_14_15, shuf
1178 %endif
1179     SHIFT_RIGHTx2           m6, m1, m0, reg_shuf
1180     LOWPASS                  1,  6,  0
1181     pavgw                   m0, m6
1182 %if ARCH_X86_64
1183     pshufd                  m9, m6, q3333
1184 %endif
1185 %if cpuflag(avx)
1186     UNSCRATCH                6,  8, rsp+0*mmsize
1187 %endif
1188     DEFINE_ARGS dst, stride, cnt, stride16, stride17
1189     mov              stride16q, strideq
1190     mov                   cntd, 8
1191     shl              stride16q, 4
1192     lea              stride17q, [stride16q+strideq]
1193
1194     ; FIXME m8 is unused for avx, so we could save one register here for win64
1195 .loop:
1196 %if notcpuflag(avx)
1197     UNSCRATCH                6,  8, rsp+0*mmsize
1198 %endif
1199     mova   [dstq+strideq*0+ 0], m6
1200     mova   [dstq+strideq*0+16], m4
1201     mova   [dstq+strideq*0+32], m2
1202     mova   [dstq+strideq*0+48], m0
1203     mova   [dstq+strideq*1+ 0], m7
1204     mova   [dstq+strideq*1+16], m5
1205     mova   [dstq+strideq*1+32], m3
1206     mova   [dstq+strideq*1+48], m1
1207     mova   [dstq+stride16q+ 0], m4
1208     mova   [dstq+stride16q+16], m2
1209     mova   [dstq+stride16q+32], m0
1210 %if ARCH_X86_64
1211     mova   [dstq+stride16q+48], m9
1212 %endif
1213     mova   [dstq+stride17q+ 0], m5
1214     mova   [dstq+stride17q+16], m3
1215     mova   [dstq+stride17q+32], m1
1216 %if ARCH_X86_64
1217     mova   [dstq+stride17q+48], m9
1218 %endif
1219     lea                   dstq, [dstq+strideq*2]
1220 %if cpuflag(avx)
1221     vpalignr                m6, m4, m6, 2
1222     vpalignr                m4, m2, m4, 2
1223     vpalignr                m2, m0, m2, 2
1224     vpalignr                m7, m5, m7, 2
1225     vpalignr                m5, m3, m5, 2
1226     vpalignr                m3, m1, m3, 2
1227 %else
1228     SCRATCH                  3,  8, rsp+0*mmsize
1229 %if notcpuflag(ssse3)
1230     SCRATCH                  1, 10, rsp+1*mmsize
1231 %endif
1232     PALIGNR                 m3, m4, m6, 2, m1
1233     mova                    m6, m3
1234     PALIGNR                 m3, m2, m4, 2, m1
1235     mova                    m4, m3
1236     PALIGNR                 m3, m0, m2, 2, m1
1237     mova                    m2, m3
1238     PALIGNR                 m3, m5, m7, 2, m1
1239     mova                    m7, m3
1240     UNSCRATCH                3,  8, rsp+0*mmsize
1241     SCRATCH                  6,  8, rsp+0*mmsize
1242 %if notcpuflag(ssse3)
1243     UNSCRATCH                1, 10, rsp+1*mmsize
1244     SCRATCH                  7, 10, rsp+1*mmsize
1245 %endif
1246     PALIGNR                 m6, m3, m5, 2, m7
1247     mova                    m5, m6
1248     PALIGNR                 m6, m1, m3, 2, m7
1249     mova                    m3, m6
1250 %if notcpuflag(ssse3)
1251     UNSCRATCH                7, 10, rsp+1*mmsize
1252 %endif
1253 %endif
1254     SHIFT_RIGHT             m1, m1, reg_shuf
1255     SHIFT_RIGHT             m0, m0, reg_shuf
1256     dec                   cntd
1257     jg .loop
1258
1259 %if ARCH_X86_32
1260     DEFINE_ARGS dst, stride, stride3
1261     lea               stride3q, [strideq*3]
1262 %assign %%n 0
1263 %rep 4
1264     mova   [dstq+strideq*0+48], m0
1265     mova   [dstq+strideq*1+48], m0
1266     mova   [dstq+strideq*2+48], m0
1267     mova   [dstq+stride3q +48], m0
1268 %if %%n < 3
1269     lea                   dstq, [dstq+strideq*4]
1270 %endif
1271 %assign %%n (%%n+1)
1272 %endrep
1273 %endif
1274     RET
1275 %endmacro
1276
1277 INIT_XMM sse2
1278 VL_FUNCS 2
1279 INIT_XMM ssse3
1280 VL_FUNCS 1
1281 INIT_XMM avx
1282 VL_FUNCS 1
1283
1284 %macro VR_FUNCS 0
1285 cglobal vp9_ipred_vr_4x4_16, 4, 4, 3, dst, stride, l, a
1286     movu                    m0, [aq-2]
1287     movhps                  m1, [lq]
1288     PALIGNR                 m0, m1, 10, m2          ; xyz*abcd
1289     pslldq                  m1, m0, 2               ; .xyz*abc
1290     pslldq                  m2, m0, 4               ; ..xyz*ab
1291     LOWPASS                  2,  1, 0               ; ..YZ#ABC
1292     pavgw                   m1, m0                  ; ....#ABC
1293     DEFINE_ARGS dst, stride, stride3
1294     lea               stride3q, [strideq*3]
1295
1296     movhps    [dstq+strideq*0], m1
1297     movhps    [dstq+strideq*1], m2
1298     shufps                  m0, m2, m1, q3210
1299 %if cpuflag(ssse3)
1300     pshufb                  m2, [pb_4_5_8to13_8x0]
1301 %else
1302     pshuflw                 m2, m2, q2222
1303     psrldq                  m2, 6
1304 %endif
1305     psrldq                  m0, 6
1306     movh      [dstq+strideq*2], m0
1307     movh      [dstq+stride3q ], m2
1308     RET
1309
1310 cglobal vp9_ipred_vr_8x8_16, 4, 4, 5, dst, stride, l, a
1311     movu                    m1, [aq-2]              ; *abcdefg
1312     movu                    m2, [lq]                ; stuvwxyz
1313     mova                    m0, [aq]                ; abcdefgh
1314     PALIGNR                 m3, m1, m2, 14, m4      ; z*abcdef
1315     LOWPASS                  3,  1,  0
1316     pavgw                   m0, m1
1317     PALIGNR                 m1, m2,  2, m4          ; tuvwxyz*
1318     pslldq                  m4, m2,  2              ; .stuvwxy
1319     LOWPASS                  4,  2,  1
1320     DEFINE_ARGS dst, stride, stride3
1321     lea               stride3q, [strideq*3]
1322
1323     mova      [dstq+strideq*0], m0
1324     mova      [dstq+strideq*1], m3
1325     PALIGNR                 m0, m4, 14, m1
1326     pslldq                  m4, 2
1327     PALIGNR                 m3, m4, 14, m1
1328     pslldq                  m4, 2
1329     mova      [dstq+strideq*2], m0
1330     mova      [dstq+stride3q ], m3
1331     lea                   dstq, [dstq+strideq*4]
1332     PALIGNR                 m0, m4, 14, m1
1333     pslldq                  m4, 2
1334     PALIGNR                 m3, m4, 14, m1
1335     pslldq                  m4, 2
1336     mova      [dstq+strideq*0], m0
1337     mova      [dstq+strideq*1], m3
1338     PALIGNR                 m0, m4, 14, m1
1339     pslldq                  m4, 2
1340     PALIGNR                 m3, m4, 14, m4
1341     mova      [dstq+strideq*2], m0
1342     mova      [dstq+stride3q ], m3
1343     RET
1344
1345 cglobal vp9_ipred_vr_16x16_16, 4, 4, 8, dst, stride, l, a
1346     movu                    m1, [aq-2]              ; *abcdefg
1347     movu                    m2, [aq+mmsize-2]       ; hijklmno
1348     mova                    m3, [aq]                ; abcdefgh
1349     mova                    m4, [aq+mmsize]         ; ijklmnop
1350     mova                    m5, [lq+mmsize]         ; stuvwxyz
1351     PALIGNR                 m0, m1, m5, 14, m6      ; z*abcdef
1352     movu                    m6, [aq+mmsize-4]       ; ghijklmn
1353     LOWPASS                  6,  2,  4
1354     pavgw                   m2, m4
1355     LOWPASS                  0,  1,  3
1356     pavgw                   m3, m1
1357     PALIGNR                 m1, m5,  2, m7          ; tuvwxyz*
1358     movu                    m7, [lq+mmsize-2]       ; rstuvwxy
1359     LOWPASS                  1,  5,  7
1360     movu                    m5, [lq+2]              ; lmnopqrs
1361     pslldq                  m4, m5,  2              ; .lmnopqr
1362     pslldq                  m7, m5,  4              ; ..lmnopq
1363     LOWPASS                  5,  4,  7
1364     psrld                   m4, m1, 16
1365     psrld                   m7, m5, 16
1366     pand                    m1, [pd_65535]
1367     pand                    m5, [pd_65535]
1368     packssdw                m7, m4
1369     packssdw                m5, m1
1370     DEFINE_ARGS dst, stride, cnt
1371     mov                   cntd, 8
1372
1373 .loop:
1374     mova   [dstq+strideq*0+ 0], m3
1375     mova   [dstq+strideq*0+16], m2
1376     mova   [dstq+strideq*1+ 0], m0
1377     mova   [dstq+strideq*1+16], m6
1378     lea                   dstq, [dstq+strideq*2]
1379     PALIGNR                 m2, m3, 14, m4
1380     PALIGNR                 m3, m7, 14, m4
1381     pslldq                  m7, 2
1382     PALIGNR                 m6, m0, 14, m4
1383     PALIGNR                 m0, m5, 14, m4
1384     pslldq                  m5, 2
1385     dec                   cntd
1386     jg .loop
1387     RET
1388
1389 cglobal vp9_ipred_vr_32x32_16, 4, 5, 14, 6 * mmsize * ARCH_X86_32, dst, stride, l, a
1390     movu                    m0, [aq+mmsize*0-2]     ; *a[0-6]
1391     movu                    m1, [aq+mmsize*1-2]     ; a[7-14]
1392     movu                    m2, [aq+mmsize*2-2]     ; a[15-22]
1393     movu                    m3, [aq+mmsize*3-2]     ; a[23-30]
1394     mova                    m4, [aq+mmsize*3+0]     ; a[24-31]
1395     movu                    m5, [aq+mmsize*3-4]     ; a[22-29]
1396     LOWPASS                  5,  3,  4              ; A[23-30]
1397     SCRATCH                  5,  8, rsp+0*mmsize
1398     pavgw                   m3, m4
1399     mova                    m4, [aq+mmsize*2+0]     ; a[16-23]
1400     movu                    m6, [aq+mmsize*2-4]     ; a[14-21]
1401     LOWPASS                  6,  2,  4              ; A[15-22]
1402     SCRATCH                  6,  9, rsp+1*mmsize
1403     pavgw                   m2, m4
1404     mova                    m4, [aq+mmsize*1+0]     ; a[8-15]
1405     movu                    m7, [aq+mmsize*1-4]     ; a[6-13]
1406     LOWPASS                  7,  1,  4              ; A[7-14]
1407     SCRATCH                  7, 10, rsp+2*mmsize
1408     pavgw                   m1, m4
1409     mova                    m4, [aq+mmsize*0+0]     ; a[0-7]
1410     mova                    m5, [lq+mmsize*3+0]     ; l[24-31]
1411     PALIGNR                 m6, m0, m5, 14, m7      ; l[31]*a[0-5]
1412     LOWPASS                  6,  0,  4              ; #A[0-6]
1413     SCRATCH                  6, 11, rsp+3*mmsize
1414     pavgw                   m4, m0
1415     PALIGNR                 m0, m5,  2, m7          ; l[25-31]*
1416     movu                    m7, [lq+mmsize*3-2]     ; l[23-30]
1417     LOWPASS                  0,  5,  7              ; L[24-31]
1418     movu                    m5, [lq+mmsize*2-2]     ; l[15-22]
1419     mova                    m7, [lq+mmsize*2+0]     ; l[16-23]
1420     movu                    m6, [lq+mmsize*2+2]     ; l[17-24]
1421     LOWPASS                  5,  7,  6              ; L[16-23]
1422     psrld                   m7, m0, 16
1423     psrld                   m6, m5, 16
1424     pand                    m0, [pd_65535]
1425     pand                    m5, [pd_65535]
1426     packssdw                m6, m7
1427     packssdw                m5, m0
1428     SCRATCH                  5, 12, rsp+4*mmsize
1429     SCRATCH                  6, 13, rsp+5*mmsize
1430     movu                    m6, [lq+mmsize*1-2]     ; l[7-14]
1431     mova                    m0, [lq+mmsize*1+0]     ; l[8-15]
1432     movu                    m5, [lq+mmsize*1+2]     ; l[9-16]
1433     LOWPASS                  6,  0,  5              ; L[8-15]
1434     movu                    m0, [lq+mmsize*0+2]     ; l[1-8]
1435     pslldq                  m5, m0,  2              ; .l[1-7]
1436     pslldq                  m7, m0,  4              ; ..l[1-6]
1437     LOWPASS                  0,  5,  7
1438     psrld                   m5, m6, 16
1439     psrld                   m7, m0, 16
1440     pand                    m6, [pd_65535]
1441     pand                    m0, [pd_65535]
1442     packssdw                m7, m5
1443     packssdw                m0, m6
1444     UNSCRATCH                6, 13, rsp+5*mmsize
1445     DEFINE_ARGS dst, stride, stride16, cnt, stride17
1446     mov              stride16q, strideq
1447     mov                   cntd, 8
1448     shl              stride16q, 4
1449 %if ARCH_X86_64
1450     lea              stride17q, [stride16q+strideq]
1451 %endif
1452
1453 .loop:
1454     mova   [dstq+strideq*0+ 0], m4
1455     mova   [dstq+strideq*0+16], m1
1456     mova   [dstq+strideq*0+32], m2
1457     mova   [dstq+strideq*0+48], m3
1458 %if ARCH_X86_64
1459     mova   [dstq+strideq*1+ 0], m11
1460     mova   [dstq+strideq*1+16], m10
1461     mova   [dstq+strideq*1+32], m9
1462     mova   [dstq+strideq*1+48], m8
1463 %endif
1464     mova   [dstq+stride16q+ 0], m6
1465     mova   [dstq+stride16q+16], m4
1466     mova   [dstq+stride16q+32], m1
1467     mova   [dstq+stride16q+48], m2
1468 %if ARCH_X86_64
1469     mova   [dstq+stride17q+ 0], m12
1470     mova   [dstq+stride17q+16], m11
1471     mova   [dstq+stride17q+32], m10
1472     mova   [dstq+stride17q+48], m9
1473 %endif
1474     lea                   dstq, [dstq+strideq*2]
1475     PALIGNR                 m3, m2,  14, m5
1476     PALIGNR                 m2, m1,  14, m5
1477     PALIGNR                 m1, m4,  14, m5
1478     PALIGNR                 m4, m6,  14, m5
1479     PALIGNR                 m6, m7,  14, m5
1480     pslldq                  m7, 2
1481 %if ARCH_X86_64
1482     PALIGNR                 m8, m9,  14, m5
1483     PALIGNR                 m9, m10, 14, m5
1484     PALIGNR                m10, m11, 14, m5
1485     PALIGNR                m11, m12, 14, m5
1486     PALIGNR                m12, m0,  14, m5
1487     pslldq                  m0, 2
1488 %endif
1489     dec                   cntd
1490     jg .loop
1491
1492 %if ARCH_X86_32
1493     UNSCRATCH                5, 12, rsp+4*mmsize
1494     UNSCRATCH                4, 11, rsp+3*mmsize
1495     UNSCRATCH                3, 10, rsp+2*mmsize
1496     UNSCRATCH                2,  9, rsp+1*mmsize
1497     UNSCRATCH                1,  8, rsp+0*mmsize
1498     mov                   dstq, dstm
1499     mov                   cntd, 8
1500     add                   dstq, strideq
1501 .loop2:
1502     mova   [dstq+strideq*0+ 0], m4
1503     mova   [dstq+strideq*0+16], m3
1504     mova   [dstq+strideq*0+32], m2
1505     mova   [dstq+strideq*0+48], m1
1506     mova   [dstq+stride16q+ 0], m5
1507     mova   [dstq+stride16q+16], m4
1508     mova   [dstq+stride16q+32], m3
1509     mova   [dstq+stride16q+48], m2
1510     lea                   dstq, [dstq+strideq*2]
1511     PALIGNR                 m1, m2,  14, m6
1512     PALIGNR                 m2, m3,  14, m6
1513     PALIGNR                 m3, m4,  14, m6
1514     PALIGNR                 m4, m5,  14, m6
1515     PALIGNR                 m5, m0,  14, m6
1516     pslldq                  m0, 2
1517     dec                   cntd
1518     jg .loop2
1519 %endif
1520     RET
1521 %endmacro
1522
1523 INIT_XMM sse2
1524 VR_FUNCS
1525 INIT_XMM ssse3
1526 VR_FUNCS
1527 INIT_XMM avx
1528 VR_FUNCS
1529
1530 %macro HU_FUNCS 1 ; stack_mem_for_32x32_32bit_function
1531 cglobal vp9_ipred_hu_4x4_16, 3, 3, 3, dst, stride, l, a
1532     movh                    m0, [lq]                ; abcd
1533 %if cpuflag(ssse3)
1534     pshufb                  m0, [pb_0to7_67x4]      ; abcddddd
1535 %else
1536     punpcklqdq              m0, m0
1537     pshufhw                 m0, m0, q3333           ; abcddddd
1538 %endif
1539     psrldq                  m1, m0,  2              ; bcddddd.
1540     psrldq                  m2, m0,  4              ; cddddd..
1541     LOWPASS                  2,  1,  0              ; BCDddd..
1542     pavgw                   m1, m0                  ; abcddddd
1543     SBUTTERFLY          wd,  1,  2,  0              ; aBbCcDdd, dddddddd
1544     PALIGNR                 m2, m1,  4, m0          ; bCcDdddd
1545     DEFINE_ARGS dst, stride, stride3
1546     lea               stride3q, [strideq*3]
1547
1548     movh      [dstq+strideq*0], m1                  ; aBbC
1549     movh      [dstq+strideq*1], m2                  ; bCcD
1550     movhps    [dstq+strideq*2], m1                  ; cDdd
1551     movhps    [dstq+stride3q ], m2                  ; dddd
1552     RET
1553
1554 cglobal vp9_ipred_hu_8x8_16, 3, 3, 4, dst, stride, l, a
1555     mova                    m0, [lq]
1556 %if cpuflag(ssse3)
1557     mova                    m3, [pb_2to15_14_15]
1558 %endif
1559     SHIFT_RIGHTx2           m1, m2, m0, m3
1560     LOWPASS                  2,  1,  0
1561     pavgw                   m1, m0
1562     SBUTTERFLY          wd,  1,  2,  0
1563     shufps                  m0, m1, m2, q1032
1564     pshufd                  m3, m2, q3332
1565     DEFINE_ARGS dst, stride, stride3
1566     lea               stride3q, [strideq*3]
1567
1568     mova     [dstq+strideq *0], m1
1569     mova     [dstq+strideq *2], m0
1570     mova     [dstq+strideq *4], m2
1571     mova     [dstq+stride3q*2], m3
1572     add                   dstq, strideq
1573 %if cpuflag(avx)
1574     vpalignr                m1, m2, m1, 4
1575 %else
1576     PALIGNR                 m0, m2, m1, 4, m3
1577     mova                    m1, m0
1578 %endif
1579     pshufd                  m2, m2, q3321
1580     shufps                  m0, m1, m2, q1032
1581     pshufd                  m3, m2, q3332
1582     mova     [dstq+strideq *0], m1
1583     mova     [dstq+strideq *2], m0
1584     mova     [dstq+strideq *4], m2
1585     mova     [dstq+stride3q*2], m3
1586     RET
1587
1588 cglobal vp9_ipred_hu_16x16_16, 3, 4, 6 + notcpuflag(ssse3), dst, stride, l, a
1589     mova                    m0, [lq]
1590     mova                    m3, [lq+mmsize]
1591     movu                    m1, [lq+2]
1592     movu                    m2, [lq+4]
1593     LOWPASS                  2,  1,  0
1594     pavgw                   m1, m0
1595     SBUTTERFLY           wd, 1,  2,  0
1596 %if cpuflag(ssse3)
1597     mova                    m5, [pb_2to15_14_15]
1598 %endif
1599     SHIFT_RIGHTx2           m0, m4, m3, m5
1600     LOWPASS                  4,  0,  3
1601     pavgw                   m3, m0
1602     SBUTTERFLY           wd, 3,  4,  5
1603     pshufd                  m0, m0, q3333
1604     DEFINE_ARGS dst, stride, stride3, cnt
1605     lea               stride3q, [strideq*3]
1606     mov                   cntd, 4
1607
1608 .loop:
1609     mova  [dstq+strideq *0+ 0], m1
1610     mova  [dstq+strideq *0+16], m2
1611     mova  [dstq+strideq *4+ 0], m2
1612     mova  [dstq+strideq *4+16], m3
1613     mova  [dstq+strideq *8+ 0], m3
1614     mova  [dstq+strideq *8+16], m4
1615     mova  [dstq+stride3q*4+ 0], m4
1616     mova  [dstq+stride3q*4+16], m0
1617     add                   dstq, strideq
1618 %if cpuflag(avx)
1619     vpalignr                m1, m2, m1, 4
1620     vpalignr                m2, m3, m2, 4
1621     vpalignr                m3, m4, m3, 4
1622     vpalignr                m4, m0, m4, 4
1623 %else
1624     PALIGNR                 m5, m2, m1, 4, m6
1625     mova                    m1, m5
1626     PALIGNR                 m5, m3, m2, 4, m6
1627     mova                    m2, m5
1628     PALIGNR                 m5, m4, m3, 4, m6
1629     mova                    m3, m5
1630     PALIGNR                 m5, m0, m4, 4, m6
1631     mova                    m4, m5
1632 %endif
1633     dec                   cntd
1634     jg .loop
1635     RET
1636
1637 cglobal vp9_ipred_hu_32x32_16, 3, 7, 10 + notcpuflag(ssse3), \
1638                                %1 * -mmsize * ARCH_X86_32, dst, stride, l, a
1639     mova                    m2, [lq+mmsize*0+0]
1640     movu                    m1, [lq+mmsize*0+2]
1641     movu                    m0, [lq+mmsize*0+4]
1642     LOWPASS                  0,  1,  2
1643     pavgw                   m1, m2
1644     SBUTTERFLY           wd, 1,  0,  2
1645     SCRATCH                  1,  8, rsp+0*mmsize
1646     mova                    m4, [lq+mmsize*1+0]
1647     movu                    m3, [lq+mmsize*1+2]
1648     movu                    m2, [lq+mmsize*1+4]
1649     LOWPASS                  2,  3,  4
1650     pavgw                   m3, m4
1651     SBUTTERFLY           wd, 3,  2,  4
1652     mova                    m6, [lq+mmsize*2+0]
1653     movu                    m5, [lq+mmsize*2+2]
1654     movu                    m4, [lq+mmsize*2+4]
1655     LOWPASS                  4,  5,  6
1656     pavgw                   m5, m6
1657     SBUTTERFLY           wd, 5,  4,  6
1658     mova                    m7, [lq+mmsize*3+0]
1659     SCRATCH                  0,  9, rsp+1*mmsize
1660 %if cpuflag(ssse3)
1661     mova                    m0, [pb_2to15_14_15]
1662 %endif
1663     SHIFT_RIGHTx2           m1, m6, m7, m0
1664     LOWPASS                  6,  1,  7
1665     pavgw                   m7, m1
1666     SBUTTERFLY           wd, 7,  6,  0
1667     pshufd                  m1, m1, q3333
1668     UNSCRATCH                0,  9, rsp+1*mmsize
1669     DEFINE_ARGS dst, stride, cnt, stride3, stride4, stride20, stride28
1670     lea               stride3q, [strideq*3]
1671     lea               stride4q, [strideq*4]
1672     lea              stride28q, [stride4q*8]
1673     lea              stride20q, [stride4q*5]
1674     sub              stride28q, stride4q
1675     mov                   cntd, 4
1676
1677 .loop:
1678 %if ARCH_X86_64
1679     SWAP                     1,  8
1680 %else
1681     mova        [rsp+1*mmsize], m1
1682     mova                    m1, [rsp+0*mmsize]
1683 %endif
1684     mova  [dstq+strideq *0+ 0], m1
1685     mova  [dstq+strideq *0+16], m0
1686     mova  [dstq+strideq *0+32], m3
1687     mova  [dstq+strideq *0+48], m2
1688     mova  [dstq+stride4q*1+ 0], m0
1689     mova  [dstq+stride4q*1+16], m3
1690     mova  [dstq+stride4q*1+32], m2
1691     mova  [dstq+stride4q*1+48], m5
1692     mova  [dstq+stride4q*2+ 0], m3
1693     mova  [dstq+stride4q*2+16], m2
1694     mova  [dstq+stride4q*2+32], m5
1695     mova  [dstq+stride4q*2+48], m4
1696 %if cpuflag(avx)
1697     vpalignr                m1, m0, m1, 4
1698     vpalignr                m0, m3, m0, 4
1699     vpalignr                m3, m2, m3, 4
1700 %else
1701     SCRATCH                  6,  9, rsp+2*mmsize
1702 %if notcpuflag(ssse3)
1703     SCRATCH                  7, 10, rsp+3*mmsize
1704 %endif
1705     PALIGNR                 m6, m0, m1, 4, m7
1706     mova                    m1, m6
1707     PALIGNR                 m6, m3, m0, 4, m7
1708     mova                    m0, m6
1709     PALIGNR                 m6, m2, m3, 4, m7
1710     mova                    m3, m6
1711     UNSCRATCH                6,  9, rsp+2*mmsize
1712     SCRATCH                  0,  9, rsp+2*mmsize
1713 %if notcpuflag(ssse3)
1714     UNSCRATCH                7, 10, rsp+3*mmsize
1715     SCRATCH                  3, 10, rsp+3*mmsize
1716 %endif
1717 %endif
1718 %if ARCH_X86_64
1719     SWAP                     1,  8
1720 %else
1721     mova        [rsp+0*mmsize], m1
1722     mova                    m1, [rsp+1*mmsize]
1723 %endif
1724     mova  [dstq+stride3q*4+ 0], m2
1725     mova  [dstq+stride3q*4+16], m5
1726     mova  [dstq+stride3q*4+32], m4
1727     mova  [dstq+stride3q*4+48], m7
1728     mova  [dstq+stride4q*4+ 0], m5
1729     mova  [dstq+stride4q*4+16], m4
1730     mova  [dstq+stride4q*4+32], m7
1731     mova  [dstq+stride4q*4+48], m6
1732     mova  [dstq+stride20q + 0], m4
1733     mova  [dstq+stride20q +16], m7
1734     mova  [dstq+stride20q +32], m6
1735     mova  [dstq+stride20q +48], m1
1736     mova  [dstq+stride3q*8+ 0], m7
1737     mova  [dstq+stride3q*8+16], m6
1738     mova  [dstq+stride3q*8+32], m1
1739     mova  [dstq+stride3q*8+48], m1
1740     mova  [dstq+stride28q + 0], m6
1741     mova  [dstq+stride28q +16], m1
1742     mova  [dstq+stride28q +32], m1
1743     mova  [dstq+stride28q +48], m1
1744 %if cpuflag(avx)
1745     vpalignr                m2, m5, m2, 4
1746     vpalignr                m5, m4, m5, 4
1747     vpalignr                m4, m7, m4, 4
1748     vpalignr                m7, m6, m7, 4
1749     vpalignr                m6, m1, m6, 4
1750 %else
1751     PALIGNR                 m0, m5, m2, 4, m3
1752     mova                    m2, m0
1753     PALIGNR                 m0, m4, m5, 4, m3
1754     mova                    m5, m0
1755     PALIGNR                 m0, m7, m4, 4, m3
1756     mova                    m4, m0
1757     PALIGNR                 m0, m6, m7, 4, m3
1758     mova                    m7, m0
1759     PALIGNR                 m0, m1, m6, 4, m3
1760     mova                    m6, m0
1761     UNSCRATCH                0,  9, rsp+2*mmsize
1762 %if notcpuflag(ssse3)
1763     UNSCRATCH                3, 10, rsp+3*mmsize
1764 %endif
1765 %endif
1766     add                   dstq, strideq
1767     dec                   cntd
1768     jg .loop
1769     RET
1770 %endmacro
1771
1772 INIT_XMM sse2
1773 HU_FUNCS 4
1774 INIT_XMM ssse3
1775 HU_FUNCS 3
1776 INIT_XMM avx
1777 HU_FUNCS 2
1778
1779 %macro HD_FUNCS 0
1780 cglobal vp9_ipred_hd_4x4_16, 4, 4, 4, dst, stride, l, a
1781     movh                    m0, [lq]
1782     movhps                  m0, [aq-2]
1783     psrldq                  m1, m0, 2
1784     psrldq                  m2, m0, 4
1785     LOWPASS                  2,  1,  0
1786     pavgw                   m1, m0
1787     punpcklwd               m1, m2
1788     DEFINE_ARGS dst, stride, stride3
1789     lea               stride3q, [strideq*3]
1790
1791     movh      [dstq+stride3q ], m1
1792     movhps    [dstq+strideq*1], m1
1793     movhlps                 m2, m2
1794     PALIGNR                 m2, m1, 4, m0
1795     movh      [dstq+strideq*2], m2
1796     movhps    [dstq+strideq*0], m2
1797     RET
1798
1799 cglobal vp9_ipred_hd_8x8_16, 4, 4, 5, dst, stride, l, a
1800     mova                    m0, [lq]
1801     movu                    m1, [aq-2]
1802     PALIGNR                 m2, m1, m0, 2, m3
1803     PALIGNR                 m3, m1, m0, 4, m4
1804     LOWPASS                  3,  2,  0
1805     pavgw                   m2, m0
1806     SBUTTERFLY           wd, 2,  3,  0
1807     psrldq                  m0, m1,  2
1808     psrldq                  m4, m1,  4
1809     LOWPASS                  1,  0,  4
1810     DEFINE_ARGS dst8, mstride, cnt
1811     lea                  dst8q, [dst8q+mstrideq*8]
1812     neg               mstrideq
1813     mov                   cntd, 4
1814
1815 .loop:
1816     add                  dst8q, mstrideq
1817     mova    [dst8q+mstrideq*0], m2
1818     mova    [dst8q+mstrideq*4], m3
1819 %if cpuflag(avx)
1820     vpalignr                m2, m3, m2, 4
1821     vpalignr                m3, m1, m3, 4
1822 %else
1823     PALIGNR                 m0, m3, m2, 4, m4
1824     mova                    m2, m0
1825     PALIGNR                 m0, m1, m3, 4, m4
1826     mova                    m3, m0
1827 %endif
1828     psrldq                  m1, 4
1829     dec                   cntd
1830     jg .loop
1831     RET
1832
1833 cglobal vp9_ipred_hd_16x16_16, 4, 4, 8, dst, stride, l, a
1834     mova                    m2, [lq]
1835     movu                    m1, [lq+2]
1836     movu                    m0, [lq+4]
1837     LOWPASS                  0,  1,  2
1838     pavgw                   m1, m2
1839     mova                    m4, [lq+mmsize]
1840     movu                    m5, [aq-2]
1841     PALIGNR                 m3, m5, m4, 2, m6
1842     PALIGNR                 m2, m5, m4, 4, m6
1843     LOWPASS                  2,  3,  4
1844     pavgw                   m3, m4
1845     SBUTTERFLY           wd, 1,  0,  4
1846     SBUTTERFLY           wd, 3,  2,  4
1847     mova                    m6, [aq]
1848     movu                    m4, [aq+2]
1849     LOWPASS                  4,  6,  5
1850     movu                    m5, [aq+mmsize-2]
1851     psrldq                  m6, m5,  2
1852     psrldq                  m7, m5,  4
1853     LOWPASS                  5,  6,  7
1854     DEFINE_ARGS dst, mstride, mstride3, cnt
1855     lea                   dstq, [dstq+mstrideq*8]
1856     lea                   dstq, [dstq+mstrideq*8]
1857     neg               mstrideq
1858     lea              mstride3q, [mstrideq*3]
1859     mov                   cntd, 4
1860
1861 .loop:
1862     add                  dstq, mstrideq
1863     mova [dstq+mstride3q*4+ 0], m2
1864     mova [dstq+mstride3q*4+16], m4
1865     mova [dstq+mstrideq *8+ 0], m3
1866     mova [dstq+mstrideq *8+16], m2
1867     mova [dstq+mstrideq *4+ 0], m0
1868     mova [dstq+mstrideq *4+16], m3
1869     mova [dstq+mstrideq *0+ 0], m1
1870     mova [dstq+mstrideq *0+16], m0
1871 %if cpuflag(avx)
1872     vpalignr                m1, m0, m1, 4
1873     vpalignr                m0, m3, m0, 4
1874     vpalignr                m3, m2, m3, 4
1875     vpalignr                m2, m4, m2, 4
1876     vpalignr                m4, m5, m4, 4
1877 %else
1878     PALIGNR                 m6, m0, m1, 4, m7
1879     mova                    m1, m6
1880     PALIGNR                 m6, m3, m0, 4, m7
1881     mova                    m0, m6
1882     PALIGNR                 m6, m2, m3, 4, m7
1883     mova                    m3, m6
1884     PALIGNR                 m6, m4, m2, 4, m7
1885     mova                    m2, m6
1886     PALIGNR                 m6, m5, m4, 4, m7
1887     mova                    m4, m6
1888 %endif
1889     psrldq                  m5, 4
1890     dec                   cntd
1891     jg .loop
1892     RET
1893
1894 cglobal vp9_ipred_hd_32x32_16, 4, 4 + 3 * ARCH_X86_64, 14, \
1895                                10 * -mmsize * ARCH_X86_32, dst, stride, l, a
1896     mova                    m2, [lq+mmsize*0+0]
1897     movu                    m1, [lq+mmsize*0+2]
1898     movu                    m0, [lq+mmsize*0+4]
1899     LOWPASS                  0,  1,  2
1900     pavgw                   m1, m2
1901     SBUTTERFLY           wd, 1,  0,  2
1902     mova                    m4, [lq+mmsize*1+0]
1903     movu                    m3, [lq+mmsize*1+2]
1904     movu                    m2, [lq+mmsize*1+4]
1905     LOWPASS                  2,  3,  4
1906     pavgw                   m3, m4
1907     SBUTTERFLY           wd, 3,  2,  4
1908     SCRATCH                  0,  8, rsp+0*mmsize
1909     SCRATCH                  1,  9, rsp+1*mmsize
1910     SCRATCH                  2, 10, rsp+2*mmsize
1911     SCRATCH                  3, 11, rsp+3*mmsize
1912     mova                    m6, [lq+mmsize*2+0]
1913     movu                    m5, [lq+mmsize*2+2]
1914     movu                    m4, [lq+mmsize*2+4]
1915     LOWPASS                  4,  5,  6
1916     pavgw                   m5, m6
1917     SBUTTERFLY           wd, 5,  4,  6
1918     mova                    m0, [lq+mmsize*3+0]
1919     movu                    m1, [aq+mmsize*0-2]
1920     PALIGNR                 m7, m1, m0, 2, m2
1921     PALIGNR                 m6, m1, m0, 4, m2
1922     LOWPASS                  6,  7,  0
1923     pavgw                   m7, m0
1924     SBUTTERFLY           wd, 7,  6,  0
1925     mova                    m2, [aq+mmsize*0+0]
1926     movu                    m0, [aq+mmsize*0+2]
1927     LOWPASS                  0,  2,  1
1928     movu                    m1, [aq+mmsize*1-2]
1929     mova                    m2, [aq+mmsize*1+0]
1930     movu                    m3, [aq+mmsize*1+2]
1931     LOWPASS                  1,  2,  3
1932     SCRATCH                  6, 12, rsp+6*mmsize
1933     SCRATCH                  7, 13, rsp+7*mmsize
1934     movu                    m2, [aq+mmsize*2-2]
1935     mova                    m3, [aq+mmsize*2+0]
1936     movu                    m6, [aq+mmsize*2+2]
1937     LOWPASS                  2,  3,  6
1938     movu                    m3, [aq+mmsize*3-2]
1939     psrldq                  m6, m3,  2
1940     psrldq                  m7, m3,  4
1941     LOWPASS                  3,  6,  7
1942     UNSCRATCH                6, 12, rsp+6*mmsize
1943     UNSCRATCH                7, 13, rsp+7*mmsize
1944 %if ARCH_X86_32
1945     mova        [rsp+4*mmsize], m4
1946     mova        [rsp+5*mmsize], m5
1947     ; we already backed up m6/m7 earlier on x86-32 in SCRATCH, so we don't need
1948     ; to do it again here
1949 %endif
1950     DEFINE_ARGS dst, stride, cnt, stride3, stride4, stride20, stride28
1951     mov                   cntd, 4
1952     lea               stride3q, [strideq*3]
1953 %if ARCH_X86_64
1954     lea               stride4q, [strideq*4]
1955     lea              stride28q, [stride4q*8]
1956     lea              stride20q, [stride4q*5]
1957     sub              stride28q, stride4q
1958 %endif
1959     add                   dstq, stride3q
1960
1961     ; x86-32 doesn't have enough registers, so on that platform, we split
1962     ; the loop in 2... Otherwise you spend most of the loop (un)scratching
1963 .loop:
1964 %if ARCH_X86_64
1965     mova  [dstq+stride28q + 0], m9
1966     mova  [dstq+stride28q +16], m8
1967     mova  [dstq+stride28q +32], m11
1968     mova  [dstq+stride28q +48], m10
1969     mova  [dstq+stride3q*8+ 0], m8
1970     mova  [dstq+stride3q*8+16], m11
1971     mova  [dstq+stride3q*8+32], m10
1972     mova  [dstq+stride3q*8+48], m5
1973     mova  [dstq+stride20q + 0], m11
1974     mova  [dstq+stride20q +16], m10
1975     mova  [dstq+stride20q +32], m5
1976     mova  [dstq+stride20q +48], m4
1977     mova  [dstq+stride4q*4+ 0], m10
1978     mova  [dstq+stride4q*4+16], m5
1979     mova  [dstq+stride4q*4+32], m4
1980     mova  [dstq+stride4q*4+48], m7
1981 %endif
1982     mova  [dstq+stride3q*4+ 0], m5
1983     mova  [dstq+stride3q*4+16], m4
1984     mova  [dstq+stride3q*4+32], m7
1985     mova  [dstq+stride3q*4+48], m6
1986     mova  [dstq+strideq* 8+ 0], m4
1987     mova  [dstq+strideq* 8+16], m7
1988     mova  [dstq+strideq* 8+32], m6
1989     mova  [dstq+strideq* 8+48], m0
1990     mova  [dstq+strideq* 4+ 0], m7
1991     mova  [dstq+strideq* 4+16], m6
1992     mova  [dstq+strideq* 4+32], m0
1993     mova  [dstq+strideq* 4+48], m1
1994     mova  [dstq+strideq* 0+ 0], m6
1995     mova  [dstq+strideq* 0+16], m0
1996     mova  [dstq+strideq* 0+32], m1
1997     mova  [dstq+strideq* 0+48], m2
1998     sub                   dstq, strideq
1999 %if cpuflag(avx)
2000 %if ARCH_X86_64
2001     vpalignr                m9, m8,  m9,  4
2002     vpalignr                m8, m11, m8,  4
2003     vpalignr               m11, m10, m11, 4
2004     vpalignr               m10, m5,  m10, 4
2005 %endif
2006     vpalignr                m5, m4,  m5,  4
2007     vpalignr                m4, m7,  m4,  4
2008     vpalignr                m7, m6,  m7,  4
2009     vpalignr                m6, m0,  m6,  4
2010     vpalignr                m0, m1,  m0,  4
2011     vpalignr                m1, m2,  m1,  4
2012     vpalignr                m2, m3,  m2,  4
2013 %else
2014 %if ARCH_X86_64
2015     PALIGNR                m12, m8,  m9,  4, m13
2016     mova                    m9, m12
2017     PALIGNR                m12, m11, m8,  4, m13
2018     mova                    m8, m12
2019     PALIGNR                m12, m10, m11, 4, m13
2020     mova                   m11, m12
2021     PALIGNR                m12, m5,  m10, 4, m13
2022     mova                   m10, m12
2023 %endif
2024     SCRATCH                  3, 12, rsp+8*mmsize, sh
2025 %if notcpuflag(ssse3)
2026     SCRATCH                  2, 13, rsp+9*mmsize
2027 %endif
2028     PALIGNR                 m3, m4,  m5,  4, m2
2029     mova                    m5, m3
2030     PALIGNR                 m3, m7,  m4,  4, m2
2031     mova                    m4, m3
2032     PALIGNR                 m3, m6,  m7,  4, m2
2033     mova                    m7, m3
2034     PALIGNR                 m3, m0,  m6,  4, m2
2035     mova                    m6, m3
2036     PALIGNR                 m3, m1,  m0,  4, m2
2037     mova                    m0, m3
2038 %if notcpuflag(ssse3)
2039     UNSCRATCH                2, 13, rsp+9*mmsize
2040     SCRATCH                  0, 13, rsp+9*mmsize
2041 %endif
2042     PALIGNR                 m3, m2,  m1,  4, m0
2043     mova                    m1, m3
2044     PALIGNR                 m3, reg_sh,  m2,  4, m0
2045     mova                    m2, m3
2046 %if notcpuflag(ssse3)
2047     UNSCRATCH                0, 13, rsp+9*mmsize
2048 %endif
2049     UNSCRATCH                3, 12, rsp+8*mmsize, sh
2050 %endif
2051     psrldq                  m3, 4
2052     dec                   cntd
2053     jg .loop
2054
2055 %if ARCH_X86_32
2056     UNSCRATCH                0,  8, rsp+0*mmsize
2057     UNSCRATCH                1,  9, rsp+1*mmsize
2058     UNSCRATCH                2, 10, rsp+2*mmsize
2059     UNSCRATCH                3, 11, rsp+3*mmsize
2060     mova                    m4, [rsp+4*mmsize]
2061     mova                    m5, [rsp+5*mmsize]
2062     mova                    m6, [rsp+6*mmsize]
2063     mova                    m7, [rsp+7*mmsize]
2064     DEFINE_ARGS dst, stride, stride5, stride3
2065     lea               stride5q, [strideq*5]
2066     lea                   dstq, [dstq+stride5q*4]
2067     DEFINE_ARGS dst, stride, cnt, stride3
2068     mov                   cntd, 4
2069 .loop_2:
2070     mova  [dstq+stride3q*4+ 0], m1
2071     mova  [dstq+stride3q*4+16], m0
2072     mova  [dstq+stride3q*4+32], m3
2073     mova  [dstq+stride3q*4+48], m2
2074     mova  [dstq+strideq* 8+ 0], m0
2075     mova  [dstq+strideq* 8+16], m3
2076     mova  [dstq+strideq* 8+32], m2
2077     mova  [dstq+strideq* 8+48], m5
2078     mova  [dstq+strideq* 4+ 0], m3
2079     mova  [dstq+strideq* 4+16], m2
2080     mova  [dstq+strideq* 4+32], m5
2081     mova  [dstq+strideq* 4+48], m4
2082     mova  [dstq+strideq* 0+ 0], m2
2083     mova  [dstq+strideq* 0+16], m5
2084     mova  [dstq+strideq* 0+32], m4
2085     mova  [dstq+strideq* 0+48], m7
2086     sub                   dstq, strideq
2087 %if cpuflag(avx)
2088     vpalignr                m1, m0,  m1,  4
2089     vpalignr                m0, m3,  m0,  4
2090     vpalignr                m3, m2,  m3,  4
2091     vpalignr                m2, m5,  m2,  4
2092     vpalignr                m5, m4,  m5,  4
2093     vpalignr                m4, m7,  m4,  4
2094     vpalignr                m7, m6,  m7,  4
2095 %else
2096     SCRATCH                  6, 12, rsp+8*mmsize, sh
2097 %if notcpuflag(ssse3)
2098     SCRATCH                  7, 13, rsp+9*mmsize
2099 %endif
2100     PALIGNR                 m6, m0,  m1,  4, m7
2101     mova                    m1, m6
2102     PALIGNR                 m6, m3,  m0,  4, m7
2103     mova                    m0, m6
2104     PALIGNR                 m6, m2,  m3,  4, m7
2105     mova                    m3, m6
2106     PALIGNR                 m6, m5,  m2,  4, m7
2107     mova                    m2, m6
2108     PALIGNR                 m6, m4,  m5,  4, m7
2109     mova                    m5, m6
2110 %if notcpuflag(ssse3)
2111     UNSCRATCH                7, 13, rsp+9*mmsize
2112     SCRATCH                  5, 13, rsp+9*mmsize
2113 %endif
2114     PALIGNR                 m6, m7,  m4,  4, m5
2115     mova                    m4, m6
2116     PALIGNR                 m6, reg_sh,  m7,  4, m5
2117     mova                    m7, m6
2118 %if notcpuflag(ssse3)
2119     UNSCRATCH                5, 13, rsp+9*mmsize
2120 %endif
2121     UNSCRATCH                6, 12, rsp+8*mmsize, sh
2122 %endif
2123     psrldq                  m6, 4
2124     dec                   cntd
2125     jg .loop_2
2126 %endif
2127     RET
2128 %endmacro
2129
2130 INIT_XMM sse2
2131 HD_FUNCS
2132 INIT_XMM ssse3
2133 HD_FUNCS
2134 INIT_XMM avx
2135 HD_FUNCS