avcodec/vp9: avx2 implementation of ipred_dl_16x16_16
[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 %if HAVE_AVX2_EXTERNAL
851 INIT_YMM avx2
852 cglobal vp9_ipred_dl_16x16_16, 2, 4, 5, dst, stride, l, a
853     movifnidn               aq, amp
854     mova                    m0, [aq]                   ; abcdefghijklmnop
855     vpbroadcastw           xm1, [aq+30]                ; pppppppp
856     vperm2i128              m2, m0, m1, q0201          ; ijklmnoppppppppp
857     vpalignr                m3, m2, m0, 2              ; bcdefghijklmnopp
858     vpalignr                m4, m2, m0, 4              ; cdefghijklmnoppp
859     LOWPASS                  0,  3,  4                 ; BCDEFGHIJKLMNOPp
860     vperm2i128              m2, m0, m1, q0201          ; JKLMNOPppppppppp
861     DEFINE_ARGS dst, stride, stride3, cnt
862     mov                   cntd, 2
863     lea               stride3q, [strideq*3]
864 .loop:
865     mova      [dstq+strideq*0], m0
866     vpalignr                m3, m2, m0, 2
867     vpalignr                m4, m2, m0, 4
868     mova      [dstq+strideq*1], m3
869     mova      [dstq+strideq*2], m4
870     vpalignr                m3, m2, m0, 6
871     vpalignr                m4, m2, m0, 8
872     mova      [dstq+stride3q ], m3
873     lea                   dstq, [dstq+strideq*4]
874     mova      [dstq+strideq*0], m4
875     vpalignr                m3, m2, m0, 10
876     vpalignr                m4, m2, m0, 12
877     mova      [dstq+strideq*1], m3
878     mova      [dstq+strideq*2], m4
879     vpalignr                m3, m2, m0, 14
880     mova      [dstq+stride3q ], m3
881     lea                   dstq, [dstq+strideq*4]
882     mova                    m0, m2
883     vperm2i128              m2, m2, m2, q0101          ; pppppppppppppppp
884     dec                   cntd
885     jg .loop
886     RET
887 %endif
888
889 %macro DR_FUNCS 1 ; stack_mem_for_32x32_32bit_function
890 cglobal vp9_ipred_dr_4x4_16, 4, 4, 3, dst, stride, l, a
891     movh                    m0, [lq]                ; wxyz....
892     movhps                  m0, [aq-2]              ; wxyz*abc
893     movd                    m1, [aq+6]              ; d.......
894     PALIGNR                 m1, m0, 2, m2           ; xyz*abcd
895     psrldq                  m2, m1, 2               ; yz*abcd.
896     LOWPASS                  0, 1, 2                ; XYZ#ABC.
897     DEFINE_ARGS dst, stride, stride3
898     lea               stride3q, [strideq*3]
899
900     movh      [dstq+stride3q ], m0
901     psrldq                  m0, 2                   ; YZ#ABC..
902     movh      [dstq+strideq*2], m0
903     psrldq                  m0, 2                   ; Z#ABC...
904     movh      [dstq+strideq*1], m0
905     psrldq                  m0, 2                   ; #ABC....
906     movh      [dstq+strideq*0], m0
907     RET
908
909 cglobal vp9_ipred_dr_8x8_16, 4, 4, 5, dst, stride, l, a
910     mova                    m0, [lq]                ; stuvwxyz
911     movu                    m1, [aq-2]              ; *abcdefg
912     mova                    m2, [aq]                ; abcdefgh
913     psrldq                  m3, m2, 2               ; bcdefgh.
914     LOWPASS                  3,  2, 1               ; ABCDEFG.
915     PALIGNR                 m1, m0, 2, m4           ; tuvwxyz*
916     PALIGNR                 m2, m1, 2, m4           ; uvwxyz*a
917     LOWPASS                  2,  1, 0               ; TUVWXYZ#
918     DEFINE_ARGS dst, stride, dst4, stride3
919     lea               stride3q, [strideq*3]
920     lea                  dst4q, [dstq+strideq*4]
921
922     movhps [dstq +stride3q +0], m2
923     movh   [dstq+ stride3q +8], m3
924     mova   [dst4q+stride3q +0], m2
925     PALIGNR                 m1, m3, m2, 2, m0
926     psrldq                  m3, 2
927     movhps [dstq +strideq*2+0], m1
928     movh   [dstq+ strideq*2+8], m3
929     mova   [dst4q+strideq*2+0], m1
930     PALIGNR                 m2, m3, m1, 2, m0
931     psrldq                  m3, 2
932     movhps [dstq +strideq*1+0], m2
933     movh   [dstq+ strideq*1+8], m3
934     mova   [dst4q+strideq*1+0], m2
935     PALIGNR                 m1, m3, m2, 2, m0
936     psrldq                  m3, 2
937     movhps [dstq +strideq*0+0], m1
938     movh   [dstq+ strideq*0+8], m3
939     mova   [dst4q+strideq*0+0], m1
940     RET
941
942 cglobal vp9_ipred_dr_16x16_16, 4, 4, 7, dst, stride, l, a
943     mova                    m0, [lq]                ; klmnopqr
944     mova                    m1, [lq+mmsize]         ; stuvwxyz
945     movu                    m2, [aq-2]              ; *abcdefg
946     movu                    m3, [aq+mmsize-2]       ; hijklmno
947     mova                    m4, [aq]                ; abcdefgh
948     mova                    m5, [aq+mmsize]         ; ijklmnop
949     psrldq                  m6, m5, 2               ; jklmnop.
950     LOWPASS                  6,  5, 3               ; IJKLMNO.
951     PALIGNR                 m5, m4, 2, m3           ; bcdefghi
952     LOWPASS                  5,  4, 2               ; ABCDEFGH
953     PALIGNR                 m2, m1, 2, m3           ; tuvwxyz*
954     PALIGNR                 m4, m2, 2, m3           ; uvwxyz*a
955     LOWPASS                  4,  2, 1               ; TUVWXYZ#
956     PALIGNR                 m1, m0, 2, m3           ; lmnopqrs
957     PALIGNR                 m2, m1, 2, m3           ; mnopqrst
958     LOWPASS                  2, 1, 0                ; LMNOPQRS
959     DEFINE_ARGS dst, stride, dst8, cnt
960     lea                  dst8q, [dstq+strideq*8]
961     mov                   cntd, 8
962
963 .loop:
964     sub                  dst8q, strideq
965     mova  [dst8q+strideq*0+ 0], m4
966     mova  [dst8q+strideq*0+16], m5
967     mova  [dst8q+strideq*8+ 0], m2
968     mova  [dst8q+strideq*8+16], m4
969 %if cpuflag(avx)
970     vpalignr                m2, m4, m2, 2
971     vpalignr                m4, m5, m4, 2
972     vpalignr                m5, m6, m5, 2
973 %else
974     PALIGNR                 m0, m4, m2, 2, m1
975     mova                    m2, m0
976     PALIGNR                 m0, m5, m4, 2, m1
977     mova                    m4, m0
978     PALIGNR                 m0, m6, m5, 2, m1
979     mova                    m5, m0
980 %endif
981     psrldq                  m6, 2
982     dec                   cntd
983     jg .loop
984     RET
985
986 cglobal vp9_ipred_dr_32x32_16, 4, 5, 10 + notcpuflag(ssse3), \
987                                %1 * ARCH_X86_32 * -mmsize, dst, stride, l, a
988     mova                    m0, [aq+mmsize*3]       ; a[24-31]
989     movu                    m1, [aq+mmsize*3-2]     ; a[23-30]
990     psrldq                  m2, m0, 2               ; a[25-31].
991     LOWPASS                  2,  0, 1               ; A[24-30].
992     mova                    m1, [aq+mmsize*2]       ; a[16-23]
993     movu                    m3, [aq+mmsize*2-2]     ; a[15-22]
994     PALIGNR                 m0, m1, 2, m4           ; a[17-24]
995     LOWPASS                  0,  1, 3               ; A[16-23]
996     mova                    m3, [aq+mmsize*1]       ; a[8-15]
997     movu                    m4, [aq+mmsize*1-2]     ; a[7-14]
998     PALIGNR                 m1, m3, 2, m5           ; a[9-16]
999     LOWPASS                  1,  3, 4               ; A[8-15]
1000     mova                    m4, [aq+mmsize*0]       ; a[0-7]
1001     movu                    m5, [aq+mmsize*0-2]     ; *a[0-6]
1002     PALIGNR                 m3, m4, 2, m6           ; a[1-8]
1003     LOWPASS                  3,  4, 5               ; A[0-7]
1004     SCRATCH                  1,  8, rsp+0*mmsize
1005     SCRATCH                  3,  9, rsp+1*mmsize
1006 %if notcpuflag(ssse3)
1007     SCRATCH                  0, 10, rsp+2*mmsize
1008 %endif
1009     mova                    m6, [lq+mmsize*3]       ; l[24-31]
1010     PALIGNR                 m5, m6, 2, m0           ; l[25-31]*
1011     PALIGNR                 m4, m5, 2, m0           ; l[26-31]*a
1012     LOWPASS                  4,  5, 6               ; L[25-31]#
1013     mova                    m7, [lq+mmsize*2]       ; l[16-23]
1014     PALIGNR                 m6, m7, 2, m0           ; l[17-24]
1015     PALIGNR                 m5, m6, 2, m0           ; l[18-25]
1016     LOWPASS                  5,  6, 7               ; L[17-24]
1017     mova                    m1, [lq+mmsize*1]       ; l[8-15]
1018     PALIGNR                 m7, m1, 2, m0           ; l[9-16]
1019     PALIGNR                 m6, m7, 2, m0           ; l[10-17]
1020     LOWPASS                  6,  7, 1               ; L[9-16]
1021     mova                    m3, [lq+mmsize*0]       ; l[0-7]
1022     PALIGNR                 m1, m3, 2, m0           ; l[1-8]
1023     PALIGNR                 m7, m1, 2, m0           ; l[2-9]
1024     LOWPASS                  7,  1, 3               ; L[1-8]
1025 %if cpuflag(ssse3)
1026 %if cpuflag(avx)
1027     UNSCRATCH                1,  8, rsp+0*mmsize
1028 %endif
1029     UNSCRATCH                3,  9, rsp+1*mmsize
1030 %else
1031     UNSCRATCH                0, 10, rsp+2*mmsize
1032 %endif
1033     DEFINE_ARGS dst8, stride, stride8, stride24, cnt
1034     lea               stride8q, [strideq*8]
1035     lea              stride24q, [stride8q*3]
1036     lea                  dst8q, [dst8q+strideq*8]
1037     mov                   cntd, 8
1038
1039 .loop:
1040     sub                  dst8q, strideq
1041 %if notcpuflag(avx)
1042     UNSCRATCH                1,  8, rsp+0*mmsize
1043 %if notcpuflag(ssse3)
1044     UNSCRATCH                3,  9, rsp+1*mmsize
1045 %endif
1046 %endif
1047     mova [dst8q+stride8q*0+ 0], m4
1048     mova [dst8q+stride8q*0+16], m3
1049     mova [dst8q+stride8q*0+32], m1
1050     mova [dst8q+stride8q*0+48], m0
1051     mova [dst8q+stride8q*1+ 0], m5
1052     mova [dst8q+stride8q*1+16], m4
1053     mova [dst8q+stride8q*1+32], m3
1054     mova [dst8q+stride8q*1+48], m1
1055     mova [dst8q+stride8q*2+ 0], m6
1056     mova [dst8q+stride8q*2+16], m5
1057     mova [dst8q+stride8q*2+32], m4
1058     mova [dst8q+stride8q*2+48], m3
1059     mova [dst8q+stride24q + 0], m7
1060     mova [dst8q+stride24q +16], m6
1061     mova [dst8q+stride24q +32], m5
1062     mova [dst8q+stride24q +48], m4
1063 %if cpuflag(avx)
1064     vpalignr                m7, m6, m7, 2
1065     vpalignr                m6, m5, m6, 2
1066     vpalignr                m5, m4, m5, 2
1067     vpalignr                m4, m3, m4, 2
1068     vpalignr                m3, m1, m3, 2
1069     vpalignr                m1, m0, m1, 2
1070     vpalignr                m0, m2, m0, 2
1071 %else
1072     SCRATCH                  2,  8, rsp+0*mmsize
1073 %if notcpuflag(ssse3)
1074     SCRATCH                  0,  9, rsp+1*mmsize
1075 %endif
1076     PALIGNR                 m2, m6, m7, 2, m0
1077     mova                    m7, m2
1078     PALIGNR                 m2, m5, m6, 2, m0
1079     mova                    m6, m2
1080     PALIGNR                 m2, m4, m5, 2, m0
1081     mova                    m5, m2
1082     PALIGNR                 m2, m3, m4, 2, m0
1083     mova                    m4, m2
1084     PALIGNR                 m2, m1, m3, 2, m0
1085     mova                    m3, m2
1086 %if notcpuflag(ssse3)
1087     UNSCRATCH                0,  9, rsp+1*mmsize
1088     SCRATCH                  3,  9, rsp+1*mmsize
1089 %endif
1090     PALIGNR                 m2, m0, m1, 2, m3
1091     mova                    m1, m2
1092     UNSCRATCH                2,  8, rsp+0*mmsize
1093     SCRATCH                  1,  8, rsp+0*mmsize
1094     PALIGNR                 m1, m2, m0, 2, m3
1095     mova                    m0, m1
1096 %endif
1097     psrldq                  m2, 2
1098     dec                   cntd
1099     jg .loop
1100     RET
1101 %endmacro
1102
1103 INIT_XMM sse2
1104 DR_FUNCS 3
1105 INIT_XMM ssse3
1106 DR_FUNCS 2
1107 INIT_XMM avx
1108 DR_FUNCS 2
1109
1110 %macro VL_FUNCS 1 ; stack_mem_for_32x32_32bit_function
1111 cglobal vp9_ipred_vl_4x4_16, 2, 4, 3, dst, stride, l, a
1112     movifnidn               aq, amp
1113     movu                    m0, [aq]                ; abcdefgh
1114     psrldq                  m1, m0, 2               ; bcdefgh.
1115     psrldq                  m2, m0, 4               ; cdefgh..
1116     LOWPASS                  2,  1, 0               ; BCDEFGH.
1117     pavgw                   m1, m0                  ; ABCDEFG.
1118     DEFINE_ARGS dst, stride, stride3
1119     lea               stride3q, [strideq*3]
1120
1121     movh      [dstq+strideq*0], m1
1122     movh      [dstq+strideq*1], m2
1123     psrldq                  m1, 2
1124     psrldq                  m2, 2
1125     movh      [dstq+strideq*2], m1
1126     movh      [dstq+stride3q ], m2
1127     RET
1128
1129 cglobal vp9_ipred_vl_8x8_16, 2, 4, 4, dst, stride, l, a
1130     movifnidn               aq, amp
1131     mova                    m0, [aq]                ; abcdefgh
1132 %if cpuflag(ssse3)
1133     mova                    m3, [pb_2to15_14_15]
1134 %endif
1135     SHIFT_RIGHTx2           m1, m2, m0, m3          ; bcdefghh/cdefghhh
1136     LOWPASS                  2,  1, 0               ; BCDEFGHh
1137     pavgw                   m1, m0                  ; ABCDEFGh
1138     DEFINE_ARGS dst, stride, stride3
1139     lea               stride3q, [strideq*3]
1140
1141     mova      [dstq+strideq*0], m1
1142     mova      [dstq+strideq*1], m2
1143     SHIFT_RIGHT             m1, m1, m3
1144     SHIFT_RIGHT             m2, m2, m3
1145     mova      [dstq+strideq*2], m1
1146     mova      [dstq+stride3q ], m2
1147     lea                   dstq, [dstq+strideq*4]
1148     SHIFT_RIGHT             m1, m1, m3
1149     SHIFT_RIGHT             m2, m2, m3
1150     mova      [dstq+strideq*0], m1
1151     mova      [dstq+strideq*1], m2
1152     SHIFT_RIGHT             m1, m1, m3
1153     SHIFT_RIGHT             m2, m2, m3
1154     mova      [dstq+strideq*2], m1
1155     mova      [dstq+stride3q ], m2
1156     RET
1157
1158 cglobal vp9_ipred_vl_16x16_16, 2, 4, 6, dst, stride, l, a
1159     movifnidn               aq, amp
1160     mova                    m0, [aq]
1161     mova                    m1, [aq+mmsize]
1162     PALIGNR                 m2, m1, m0, 2, m3
1163     PALIGNR                 m3, m1, m0, 4, m4
1164     LOWPASS                  3,  2,  0
1165     pavgw                   m2, m0
1166 %if cpuflag(ssse3)
1167     mova                    m4, [pb_2to15_14_15]
1168 %endif
1169     SHIFT_RIGHTx2           m5, m0, m1, m4
1170     LOWPASS                  0,  5,  1
1171     pavgw                   m1, m5
1172     DEFINE_ARGS dst, stride, cnt
1173     mov                   cntd, 8
1174
1175 .loop:
1176     mova   [dstq+strideq*0+ 0], m2
1177     mova   [dstq+strideq*0+16], m1
1178     mova   [dstq+strideq*1+ 0], m3
1179     mova   [dstq+strideq*1+16], m0
1180     lea                   dstq, [dstq+strideq*2]
1181 %if cpuflag(avx)
1182     vpalignr                m2, m1, m2, 2
1183     vpalignr                m3, m0, m3, 2
1184 %else
1185     PALIGNR                 m5, m1, m2, 2, m4
1186     mova                    m2, m5
1187     PALIGNR                 m5, m0, m3, 2, m4
1188     mova                    m3, m5
1189 %endif
1190     SHIFT_RIGHT             m1, m1, m4
1191     SHIFT_RIGHT             m0, m0, m4
1192     dec                   cntd
1193     jg .loop
1194     RET
1195
1196 cglobal vp9_ipred_vl_32x32_16, 2, 5, 11, %1 * mmsize * ARCH_X86_32, dst, stride, l, a
1197     movifnidn               aq, amp
1198     mova                    m0, [aq+mmsize*0]
1199     mova                    m1, [aq+mmsize*1]
1200     mova                    m2, [aq+mmsize*2]
1201     PALIGNR                 m6, m1, m0, 2, m5
1202     PALIGNR                 m7, m1, m0, 4, m5
1203     LOWPASS                  7,  6,  0
1204     pavgw                   m6, m0
1205     SCRATCH                  6,  8, rsp+0*mmsize
1206     PALIGNR                 m4, m2, m1, 2, m0
1207     PALIGNR                 m5, m2, m1, 4, m0
1208     LOWPASS                  5,  4,  1
1209     pavgw                   m4, m1
1210     mova                    m0, [aq+mmsize*3]
1211     PALIGNR                 m1, m0, m2, 2, m6
1212     PALIGNR                 m3, m0, m2, 4, m6
1213     LOWPASS                  3,  1,  2
1214     pavgw                   m2, m1
1215 %if cpuflag(ssse3)
1216     PRELOAD                 10, pb_2to15_14_15, shuf
1217 %endif
1218     SHIFT_RIGHTx2           m6, m1, m0, reg_shuf
1219     LOWPASS                  1,  6,  0
1220     pavgw                   m0, m6
1221 %if ARCH_X86_64
1222     pshufd                  m9, m6, q3333
1223 %endif
1224 %if cpuflag(avx)
1225     UNSCRATCH                6,  8, rsp+0*mmsize
1226 %endif
1227     DEFINE_ARGS dst, stride, cnt, stride16, stride17
1228     mov              stride16q, strideq
1229     mov                   cntd, 8
1230     shl              stride16q, 4
1231     lea              stride17q, [stride16q+strideq]
1232
1233     ; FIXME m8 is unused for avx, so we could save one register here for win64
1234 .loop:
1235 %if notcpuflag(avx)
1236     UNSCRATCH                6,  8, rsp+0*mmsize
1237 %endif
1238     mova   [dstq+strideq*0+ 0], m6
1239     mova   [dstq+strideq*0+16], m4
1240     mova   [dstq+strideq*0+32], m2
1241     mova   [dstq+strideq*0+48], m0
1242     mova   [dstq+strideq*1+ 0], m7
1243     mova   [dstq+strideq*1+16], m5
1244     mova   [dstq+strideq*1+32], m3
1245     mova   [dstq+strideq*1+48], m1
1246     mova   [dstq+stride16q+ 0], m4
1247     mova   [dstq+stride16q+16], m2
1248     mova   [dstq+stride16q+32], m0
1249 %if ARCH_X86_64
1250     mova   [dstq+stride16q+48], m9
1251 %endif
1252     mova   [dstq+stride17q+ 0], m5
1253     mova   [dstq+stride17q+16], m3
1254     mova   [dstq+stride17q+32], m1
1255 %if ARCH_X86_64
1256     mova   [dstq+stride17q+48], m9
1257 %endif
1258     lea                   dstq, [dstq+strideq*2]
1259 %if cpuflag(avx)
1260     vpalignr                m6, m4, m6, 2
1261     vpalignr                m4, m2, m4, 2
1262     vpalignr                m2, m0, m2, 2
1263     vpalignr                m7, m5, m7, 2
1264     vpalignr                m5, m3, m5, 2
1265     vpalignr                m3, m1, m3, 2
1266 %else
1267     SCRATCH                  3,  8, rsp+0*mmsize
1268 %if notcpuflag(ssse3)
1269     SCRATCH                  1, 10, rsp+1*mmsize
1270 %endif
1271     PALIGNR                 m3, m4, m6, 2, m1
1272     mova                    m6, m3
1273     PALIGNR                 m3, m2, m4, 2, m1
1274     mova                    m4, m3
1275     PALIGNR                 m3, m0, m2, 2, m1
1276     mova                    m2, m3
1277     PALIGNR                 m3, m5, m7, 2, m1
1278     mova                    m7, m3
1279     UNSCRATCH                3,  8, rsp+0*mmsize
1280     SCRATCH                  6,  8, rsp+0*mmsize
1281 %if notcpuflag(ssse3)
1282     UNSCRATCH                1, 10, rsp+1*mmsize
1283     SCRATCH                  7, 10, rsp+1*mmsize
1284 %endif
1285     PALIGNR                 m6, m3, m5, 2, m7
1286     mova                    m5, m6
1287     PALIGNR                 m6, m1, m3, 2, m7
1288     mova                    m3, m6
1289 %if notcpuflag(ssse3)
1290     UNSCRATCH                7, 10, rsp+1*mmsize
1291 %endif
1292 %endif
1293     SHIFT_RIGHT             m1, m1, reg_shuf
1294     SHIFT_RIGHT             m0, m0, reg_shuf
1295     dec                   cntd
1296     jg .loop
1297
1298 %if ARCH_X86_32
1299     DEFINE_ARGS dst, stride, stride3
1300     lea               stride3q, [strideq*3]
1301 %assign %%n 0
1302 %rep 4
1303     mova   [dstq+strideq*0+48], m0
1304     mova   [dstq+strideq*1+48], m0
1305     mova   [dstq+strideq*2+48], m0
1306     mova   [dstq+stride3q +48], m0
1307 %if %%n < 3
1308     lea                   dstq, [dstq+strideq*4]
1309 %endif
1310 %assign %%n (%%n+1)
1311 %endrep
1312 %endif
1313     RET
1314 %endmacro
1315
1316 INIT_XMM sse2
1317 VL_FUNCS 2
1318 INIT_XMM ssse3
1319 VL_FUNCS 1
1320 INIT_XMM avx
1321 VL_FUNCS 1
1322
1323 %macro VR_FUNCS 0
1324 cglobal vp9_ipred_vr_4x4_16, 4, 4, 3, dst, stride, l, a
1325     movu                    m0, [aq-2]
1326     movhps                  m1, [lq]
1327     PALIGNR                 m0, m1, 10, m2          ; xyz*abcd
1328     pslldq                  m1, m0, 2               ; .xyz*abc
1329     pslldq                  m2, m0, 4               ; ..xyz*ab
1330     LOWPASS                  2,  1, 0               ; ..YZ#ABC
1331     pavgw                   m1, m0                  ; ....#ABC
1332     DEFINE_ARGS dst, stride, stride3
1333     lea               stride3q, [strideq*3]
1334
1335     movhps    [dstq+strideq*0], m1
1336     movhps    [dstq+strideq*1], m2
1337     shufps                  m0, m2, m1, q3210
1338 %if cpuflag(ssse3)
1339     pshufb                  m2, [pb_4_5_8to13_8x0]
1340 %else
1341     pshuflw                 m2, m2, q2222
1342     psrldq                  m2, 6
1343 %endif
1344     psrldq                  m0, 6
1345     movh      [dstq+strideq*2], m0
1346     movh      [dstq+stride3q ], m2
1347     RET
1348
1349 cglobal vp9_ipred_vr_8x8_16, 4, 4, 5, dst, stride, l, a
1350     movu                    m1, [aq-2]              ; *abcdefg
1351     movu                    m2, [lq]                ; stuvwxyz
1352     mova                    m0, [aq]                ; abcdefgh
1353     PALIGNR                 m3, m1, m2, 14, m4      ; z*abcdef
1354     LOWPASS                  3,  1,  0
1355     pavgw                   m0, m1
1356     PALIGNR                 m1, m2,  2, m4          ; tuvwxyz*
1357     pslldq                  m4, m2,  2              ; .stuvwxy
1358     LOWPASS                  4,  2,  1
1359     DEFINE_ARGS dst, stride, stride3
1360     lea               stride3q, [strideq*3]
1361
1362     mova      [dstq+strideq*0], m0
1363     mova      [dstq+strideq*1], m3
1364     PALIGNR                 m0, m4, 14, m1
1365     pslldq                  m4, 2
1366     PALIGNR                 m3, m4, 14, m1
1367     pslldq                  m4, 2
1368     mova      [dstq+strideq*2], m0
1369     mova      [dstq+stride3q ], m3
1370     lea                   dstq, [dstq+strideq*4]
1371     PALIGNR                 m0, m4, 14, m1
1372     pslldq                  m4, 2
1373     PALIGNR                 m3, m4, 14, m1
1374     pslldq                  m4, 2
1375     mova      [dstq+strideq*0], m0
1376     mova      [dstq+strideq*1], m3
1377     PALIGNR                 m0, m4, 14, m1
1378     pslldq                  m4, 2
1379     PALIGNR                 m3, m4, 14, m4
1380     mova      [dstq+strideq*2], m0
1381     mova      [dstq+stride3q ], m3
1382     RET
1383
1384 cglobal vp9_ipred_vr_16x16_16, 4, 4, 8, dst, stride, l, a
1385     movu                    m1, [aq-2]              ; *abcdefg
1386     movu                    m2, [aq+mmsize-2]       ; hijklmno
1387     mova                    m3, [aq]                ; abcdefgh
1388     mova                    m4, [aq+mmsize]         ; ijklmnop
1389     mova                    m5, [lq+mmsize]         ; stuvwxyz
1390     PALIGNR                 m0, m1, m5, 14, m6      ; z*abcdef
1391     movu                    m6, [aq+mmsize-4]       ; ghijklmn
1392     LOWPASS                  6,  2,  4
1393     pavgw                   m2, m4
1394     LOWPASS                  0,  1,  3
1395     pavgw                   m3, m1
1396     PALIGNR                 m1, m5,  2, m7          ; tuvwxyz*
1397     movu                    m7, [lq+mmsize-2]       ; rstuvwxy
1398     LOWPASS                  1,  5,  7
1399     movu                    m5, [lq+2]              ; lmnopqrs
1400     pslldq                  m4, m5,  2              ; .lmnopqr
1401     pslldq                  m7, m5,  4              ; ..lmnopq
1402     LOWPASS                  5,  4,  7
1403     psrld                   m4, m1, 16
1404     psrld                   m7, m5, 16
1405     pand                    m1, [pd_65535]
1406     pand                    m5, [pd_65535]
1407     packssdw                m7, m4
1408     packssdw                m5, m1
1409     DEFINE_ARGS dst, stride, cnt
1410     mov                   cntd, 8
1411
1412 .loop:
1413     mova   [dstq+strideq*0+ 0], m3
1414     mova   [dstq+strideq*0+16], m2
1415     mova   [dstq+strideq*1+ 0], m0
1416     mova   [dstq+strideq*1+16], m6
1417     lea                   dstq, [dstq+strideq*2]
1418     PALIGNR                 m2, m3, 14, m4
1419     PALIGNR                 m3, m7, 14, m4
1420     pslldq                  m7, 2
1421     PALIGNR                 m6, m0, 14, m4
1422     PALIGNR                 m0, m5, 14, m4
1423     pslldq                  m5, 2
1424     dec                   cntd
1425     jg .loop
1426     RET
1427
1428 cglobal vp9_ipred_vr_32x32_16, 4, 5, 14, 6 * mmsize * ARCH_X86_32, dst, stride, l, a
1429     movu                    m0, [aq+mmsize*0-2]     ; *a[0-6]
1430     movu                    m1, [aq+mmsize*1-2]     ; a[7-14]
1431     movu                    m2, [aq+mmsize*2-2]     ; a[15-22]
1432     movu                    m3, [aq+mmsize*3-2]     ; a[23-30]
1433     mova                    m4, [aq+mmsize*3+0]     ; a[24-31]
1434     movu                    m5, [aq+mmsize*3-4]     ; a[22-29]
1435     LOWPASS                  5,  3,  4              ; A[23-30]
1436     SCRATCH                  5,  8, rsp+0*mmsize
1437     pavgw                   m3, m4
1438     mova                    m4, [aq+mmsize*2+0]     ; a[16-23]
1439     movu                    m6, [aq+mmsize*2-4]     ; a[14-21]
1440     LOWPASS                  6,  2,  4              ; A[15-22]
1441     SCRATCH                  6,  9, rsp+1*mmsize
1442     pavgw                   m2, m4
1443     mova                    m4, [aq+mmsize*1+0]     ; a[8-15]
1444     movu                    m7, [aq+mmsize*1-4]     ; a[6-13]
1445     LOWPASS                  7,  1,  4              ; A[7-14]
1446     SCRATCH                  7, 10, rsp+2*mmsize
1447     pavgw                   m1, m4
1448     mova                    m4, [aq+mmsize*0+0]     ; a[0-7]
1449     mova                    m5, [lq+mmsize*3+0]     ; l[24-31]
1450     PALIGNR                 m6, m0, m5, 14, m7      ; l[31]*a[0-5]
1451     LOWPASS                  6,  0,  4              ; #A[0-6]
1452     SCRATCH                  6, 11, rsp+3*mmsize
1453     pavgw                   m4, m0
1454     PALIGNR                 m0, m5,  2, m7          ; l[25-31]*
1455     movu                    m7, [lq+mmsize*3-2]     ; l[23-30]
1456     LOWPASS                  0,  5,  7              ; L[24-31]
1457     movu                    m5, [lq+mmsize*2-2]     ; l[15-22]
1458     mova                    m7, [lq+mmsize*2+0]     ; l[16-23]
1459     movu                    m6, [lq+mmsize*2+2]     ; l[17-24]
1460     LOWPASS                  5,  7,  6              ; L[16-23]
1461     psrld                   m7, m0, 16
1462     psrld                   m6, m5, 16
1463     pand                    m0, [pd_65535]
1464     pand                    m5, [pd_65535]
1465     packssdw                m6, m7
1466     packssdw                m5, m0
1467     SCRATCH                  5, 12, rsp+4*mmsize
1468     SCRATCH                  6, 13, rsp+5*mmsize
1469     movu                    m6, [lq+mmsize*1-2]     ; l[7-14]
1470     mova                    m0, [lq+mmsize*1+0]     ; l[8-15]
1471     movu                    m5, [lq+mmsize*1+2]     ; l[9-16]
1472     LOWPASS                  6,  0,  5              ; L[8-15]
1473     movu                    m0, [lq+mmsize*0+2]     ; l[1-8]
1474     pslldq                  m5, m0,  2              ; .l[1-7]
1475     pslldq                  m7, m0,  4              ; ..l[1-6]
1476     LOWPASS                  0,  5,  7
1477     psrld                   m5, m6, 16
1478     psrld                   m7, m0, 16
1479     pand                    m6, [pd_65535]
1480     pand                    m0, [pd_65535]
1481     packssdw                m7, m5
1482     packssdw                m0, m6
1483     UNSCRATCH                6, 13, rsp+5*mmsize
1484     DEFINE_ARGS dst, stride, stride16, cnt, stride17
1485     mov              stride16q, strideq
1486     mov                   cntd, 8
1487     shl              stride16q, 4
1488 %if ARCH_X86_64
1489     lea              stride17q, [stride16q+strideq]
1490 %endif
1491
1492 .loop:
1493     mova   [dstq+strideq*0+ 0], m4
1494     mova   [dstq+strideq*0+16], m1
1495     mova   [dstq+strideq*0+32], m2
1496     mova   [dstq+strideq*0+48], m3
1497 %if ARCH_X86_64
1498     mova   [dstq+strideq*1+ 0], m11
1499     mova   [dstq+strideq*1+16], m10
1500     mova   [dstq+strideq*1+32], m9
1501     mova   [dstq+strideq*1+48], m8
1502 %endif
1503     mova   [dstq+stride16q+ 0], m6
1504     mova   [dstq+stride16q+16], m4
1505     mova   [dstq+stride16q+32], m1
1506     mova   [dstq+stride16q+48], m2
1507 %if ARCH_X86_64
1508     mova   [dstq+stride17q+ 0], m12
1509     mova   [dstq+stride17q+16], m11
1510     mova   [dstq+stride17q+32], m10
1511     mova   [dstq+stride17q+48], m9
1512 %endif
1513     lea                   dstq, [dstq+strideq*2]
1514     PALIGNR                 m3, m2,  14, m5
1515     PALIGNR                 m2, m1,  14, m5
1516     PALIGNR                 m1, m4,  14, m5
1517     PALIGNR                 m4, m6,  14, m5
1518     PALIGNR                 m6, m7,  14, m5
1519     pslldq                  m7, 2
1520 %if ARCH_X86_64
1521     PALIGNR                 m8, m9,  14, m5
1522     PALIGNR                 m9, m10, 14, m5
1523     PALIGNR                m10, m11, 14, m5
1524     PALIGNR                m11, m12, 14, m5
1525     PALIGNR                m12, m0,  14, m5
1526     pslldq                  m0, 2
1527 %endif
1528     dec                   cntd
1529     jg .loop
1530
1531 %if ARCH_X86_32
1532     UNSCRATCH                5, 12, rsp+4*mmsize
1533     UNSCRATCH                4, 11, rsp+3*mmsize
1534     UNSCRATCH                3, 10, rsp+2*mmsize
1535     UNSCRATCH                2,  9, rsp+1*mmsize
1536     UNSCRATCH                1,  8, rsp+0*mmsize
1537     mov                   dstq, dstm
1538     mov                   cntd, 8
1539     add                   dstq, strideq
1540 .loop2:
1541     mova   [dstq+strideq*0+ 0], m4
1542     mova   [dstq+strideq*0+16], m3
1543     mova   [dstq+strideq*0+32], m2
1544     mova   [dstq+strideq*0+48], m1
1545     mova   [dstq+stride16q+ 0], m5
1546     mova   [dstq+stride16q+16], m4
1547     mova   [dstq+stride16q+32], m3
1548     mova   [dstq+stride16q+48], m2
1549     lea                   dstq, [dstq+strideq*2]
1550     PALIGNR                 m1, m2,  14, m6
1551     PALIGNR                 m2, m3,  14, m6
1552     PALIGNR                 m3, m4,  14, m6
1553     PALIGNR                 m4, m5,  14, m6
1554     PALIGNR                 m5, m0,  14, m6
1555     pslldq                  m0, 2
1556     dec                   cntd
1557     jg .loop2
1558 %endif
1559     RET
1560 %endmacro
1561
1562 INIT_XMM sse2
1563 VR_FUNCS
1564 INIT_XMM ssse3
1565 VR_FUNCS
1566 INIT_XMM avx
1567 VR_FUNCS
1568
1569 %macro HU_FUNCS 1 ; stack_mem_for_32x32_32bit_function
1570 cglobal vp9_ipred_hu_4x4_16, 3, 3, 3, dst, stride, l, a
1571     movh                    m0, [lq]                ; abcd
1572 %if cpuflag(ssse3)
1573     pshufb                  m0, [pb_0to7_67x4]      ; abcddddd
1574 %else
1575     punpcklqdq              m0, m0
1576     pshufhw                 m0, m0, q3333           ; abcddddd
1577 %endif
1578     psrldq                  m1, m0,  2              ; bcddddd.
1579     psrldq                  m2, m0,  4              ; cddddd..
1580     LOWPASS                  2,  1,  0              ; BCDddd..
1581     pavgw                   m1, m0                  ; abcddddd
1582     SBUTTERFLY          wd,  1,  2,  0              ; aBbCcDdd, dddddddd
1583     PALIGNR                 m2, m1,  4, m0          ; bCcDdddd
1584     DEFINE_ARGS dst, stride, stride3
1585     lea               stride3q, [strideq*3]
1586
1587     movh      [dstq+strideq*0], m1                  ; aBbC
1588     movh      [dstq+strideq*1], m2                  ; bCcD
1589     movhps    [dstq+strideq*2], m1                  ; cDdd
1590     movhps    [dstq+stride3q ], m2                  ; dddd
1591     RET
1592
1593 cglobal vp9_ipred_hu_8x8_16, 3, 3, 4, dst, stride, l, a
1594     mova                    m0, [lq]
1595 %if cpuflag(ssse3)
1596     mova                    m3, [pb_2to15_14_15]
1597 %endif
1598     SHIFT_RIGHTx2           m1, m2, m0, m3
1599     LOWPASS                  2,  1,  0
1600     pavgw                   m1, m0
1601     SBUTTERFLY          wd,  1,  2,  0
1602     shufps                  m0, m1, m2, q1032
1603     pshufd                  m3, m2, q3332
1604     DEFINE_ARGS dst, stride, stride3
1605     lea               stride3q, [strideq*3]
1606
1607     mova     [dstq+strideq *0], m1
1608     mova     [dstq+strideq *2], m0
1609     mova     [dstq+strideq *4], m2
1610     mova     [dstq+stride3q*2], m3
1611     add                   dstq, strideq
1612 %if cpuflag(avx)
1613     vpalignr                m1, m2, m1, 4
1614 %else
1615     PALIGNR                 m0, m2, m1, 4, m3
1616     mova                    m1, m0
1617 %endif
1618     pshufd                  m2, m2, q3321
1619     shufps                  m0, m1, m2, q1032
1620     pshufd                  m3, m2, q3332
1621     mova     [dstq+strideq *0], m1
1622     mova     [dstq+strideq *2], m0
1623     mova     [dstq+strideq *4], m2
1624     mova     [dstq+stride3q*2], m3
1625     RET
1626
1627 cglobal vp9_ipred_hu_16x16_16, 3, 4, 6 + notcpuflag(ssse3), dst, stride, l, a
1628     mova                    m0, [lq]
1629     mova                    m3, [lq+mmsize]
1630     movu                    m1, [lq+2]
1631     movu                    m2, [lq+4]
1632     LOWPASS                  2,  1,  0
1633     pavgw                   m1, m0
1634     SBUTTERFLY           wd, 1,  2,  0
1635 %if cpuflag(ssse3)
1636     mova                    m5, [pb_2to15_14_15]
1637 %endif
1638     SHIFT_RIGHTx2           m0, m4, m3, m5
1639     LOWPASS                  4,  0,  3
1640     pavgw                   m3, m0
1641     SBUTTERFLY           wd, 3,  4,  5
1642     pshufd                  m0, m0, q3333
1643     DEFINE_ARGS dst, stride, stride3, cnt
1644     lea               stride3q, [strideq*3]
1645     mov                   cntd, 4
1646
1647 .loop:
1648     mova  [dstq+strideq *0+ 0], m1
1649     mova  [dstq+strideq *0+16], m2
1650     mova  [dstq+strideq *4+ 0], m2
1651     mova  [dstq+strideq *4+16], m3
1652     mova  [dstq+strideq *8+ 0], m3
1653     mova  [dstq+strideq *8+16], m4
1654     mova  [dstq+stride3q*4+ 0], m4
1655     mova  [dstq+stride3q*4+16], m0
1656     add                   dstq, strideq
1657 %if cpuflag(avx)
1658     vpalignr                m1, m2, m1, 4
1659     vpalignr                m2, m3, m2, 4
1660     vpalignr                m3, m4, m3, 4
1661     vpalignr                m4, m0, m4, 4
1662 %else
1663     PALIGNR                 m5, m2, m1, 4, m6
1664     mova                    m1, m5
1665     PALIGNR                 m5, m3, m2, 4, m6
1666     mova                    m2, m5
1667     PALIGNR                 m5, m4, m3, 4, m6
1668     mova                    m3, m5
1669     PALIGNR                 m5, m0, m4, 4, m6
1670     mova                    m4, m5
1671 %endif
1672     dec                   cntd
1673     jg .loop
1674     RET
1675
1676 cglobal vp9_ipred_hu_32x32_16, 3, 7, 10 + notcpuflag(ssse3), \
1677                                %1 * -mmsize * ARCH_X86_32, dst, stride, l, a
1678     mova                    m2, [lq+mmsize*0+0]
1679     movu                    m1, [lq+mmsize*0+2]
1680     movu                    m0, [lq+mmsize*0+4]
1681     LOWPASS                  0,  1,  2
1682     pavgw                   m1, m2
1683     SBUTTERFLY           wd, 1,  0,  2
1684     SCRATCH                  1,  8, rsp+0*mmsize
1685     mova                    m4, [lq+mmsize*1+0]
1686     movu                    m3, [lq+mmsize*1+2]
1687     movu                    m2, [lq+mmsize*1+4]
1688     LOWPASS                  2,  3,  4
1689     pavgw                   m3, m4
1690     SBUTTERFLY           wd, 3,  2,  4
1691     mova                    m6, [lq+mmsize*2+0]
1692     movu                    m5, [lq+mmsize*2+2]
1693     movu                    m4, [lq+mmsize*2+4]
1694     LOWPASS                  4,  5,  6
1695     pavgw                   m5, m6
1696     SBUTTERFLY           wd, 5,  4,  6
1697     mova                    m7, [lq+mmsize*3+0]
1698     SCRATCH                  0,  9, rsp+1*mmsize
1699 %if cpuflag(ssse3)
1700     mova                    m0, [pb_2to15_14_15]
1701 %endif
1702     SHIFT_RIGHTx2           m1, m6, m7, m0
1703     LOWPASS                  6,  1,  7
1704     pavgw                   m7, m1
1705     SBUTTERFLY           wd, 7,  6,  0
1706     pshufd                  m1, m1, q3333
1707     UNSCRATCH                0,  9, rsp+1*mmsize
1708     DEFINE_ARGS dst, stride, cnt, stride3, stride4, stride20, stride28
1709     lea               stride3q, [strideq*3]
1710     lea               stride4q, [strideq*4]
1711     lea              stride28q, [stride4q*8]
1712     lea              stride20q, [stride4q*5]
1713     sub              stride28q, stride4q
1714     mov                   cntd, 4
1715
1716 .loop:
1717 %if ARCH_X86_64
1718     SWAP                     1,  8
1719 %else
1720     mova        [rsp+1*mmsize], m1
1721     mova                    m1, [rsp+0*mmsize]
1722 %endif
1723     mova  [dstq+strideq *0+ 0], m1
1724     mova  [dstq+strideq *0+16], m0
1725     mova  [dstq+strideq *0+32], m3
1726     mova  [dstq+strideq *0+48], m2
1727     mova  [dstq+stride4q*1+ 0], m0
1728     mova  [dstq+stride4q*1+16], m3
1729     mova  [dstq+stride4q*1+32], m2
1730     mova  [dstq+stride4q*1+48], m5
1731     mova  [dstq+stride4q*2+ 0], m3
1732     mova  [dstq+stride4q*2+16], m2
1733     mova  [dstq+stride4q*2+32], m5
1734     mova  [dstq+stride4q*2+48], m4
1735 %if cpuflag(avx)
1736     vpalignr                m1, m0, m1, 4
1737     vpalignr                m0, m3, m0, 4
1738     vpalignr                m3, m2, m3, 4
1739 %else
1740     SCRATCH                  6,  9, rsp+2*mmsize
1741 %if notcpuflag(ssse3)
1742     SCRATCH                  7, 10, rsp+3*mmsize
1743 %endif
1744     PALIGNR                 m6, m0, m1, 4, m7
1745     mova                    m1, m6
1746     PALIGNR                 m6, m3, m0, 4, m7
1747     mova                    m0, m6
1748     PALIGNR                 m6, m2, m3, 4, m7
1749     mova                    m3, m6
1750     UNSCRATCH                6,  9, rsp+2*mmsize
1751     SCRATCH                  0,  9, rsp+2*mmsize
1752 %if notcpuflag(ssse3)
1753     UNSCRATCH                7, 10, rsp+3*mmsize
1754     SCRATCH                  3, 10, rsp+3*mmsize
1755 %endif
1756 %endif
1757 %if ARCH_X86_64
1758     SWAP                     1,  8
1759 %else
1760     mova        [rsp+0*mmsize], m1
1761     mova                    m1, [rsp+1*mmsize]
1762 %endif
1763     mova  [dstq+stride3q*4+ 0], m2
1764     mova  [dstq+stride3q*4+16], m5
1765     mova  [dstq+stride3q*4+32], m4
1766     mova  [dstq+stride3q*4+48], m7
1767     mova  [dstq+stride4q*4+ 0], m5
1768     mova  [dstq+stride4q*4+16], m4
1769     mova  [dstq+stride4q*4+32], m7
1770     mova  [dstq+stride4q*4+48], m6
1771     mova  [dstq+stride20q + 0], m4
1772     mova  [dstq+stride20q +16], m7
1773     mova  [dstq+stride20q +32], m6
1774     mova  [dstq+stride20q +48], m1
1775     mova  [dstq+stride3q*8+ 0], m7
1776     mova  [dstq+stride3q*8+16], m6
1777     mova  [dstq+stride3q*8+32], m1
1778     mova  [dstq+stride3q*8+48], m1
1779     mova  [dstq+stride28q + 0], m6
1780     mova  [dstq+stride28q +16], m1
1781     mova  [dstq+stride28q +32], m1
1782     mova  [dstq+stride28q +48], m1
1783 %if cpuflag(avx)
1784     vpalignr                m2, m5, m2, 4
1785     vpalignr                m5, m4, m5, 4
1786     vpalignr                m4, m7, m4, 4
1787     vpalignr                m7, m6, m7, 4
1788     vpalignr                m6, m1, m6, 4
1789 %else
1790     PALIGNR                 m0, m5, m2, 4, m3
1791     mova                    m2, m0
1792     PALIGNR                 m0, m4, m5, 4, m3
1793     mova                    m5, m0
1794     PALIGNR                 m0, m7, m4, 4, m3
1795     mova                    m4, m0
1796     PALIGNR                 m0, m6, m7, 4, m3
1797     mova                    m7, m0
1798     PALIGNR                 m0, m1, m6, 4, m3
1799     mova                    m6, m0
1800     UNSCRATCH                0,  9, rsp+2*mmsize
1801 %if notcpuflag(ssse3)
1802     UNSCRATCH                3, 10, rsp+3*mmsize
1803 %endif
1804 %endif
1805     add                   dstq, strideq
1806     dec                   cntd
1807     jg .loop
1808     RET
1809 %endmacro
1810
1811 INIT_XMM sse2
1812 HU_FUNCS 4
1813 INIT_XMM ssse3
1814 HU_FUNCS 3
1815 INIT_XMM avx
1816 HU_FUNCS 2
1817
1818 %macro HD_FUNCS 0
1819 cglobal vp9_ipred_hd_4x4_16, 4, 4, 4, dst, stride, l, a
1820     movh                    m0, [lq]
1821     movhps                  m0, [aq-2]
1822     psrldq                  m1, m0, 2
1823     psrldq                  m2, m0, 4
1824     LOWPASS                  2,  1,  0
1825     pavgw                   m1, m0
1826     punpcklwd               m1, m2
1827     DEFINE_ARGS dst, stride, stride3
1828     lea               stride3q, [strideq*3]
1829
1830     movh      [dstq+stride3q ], m1
1831     movhps    [dstq+strideq*1], m1
1832     movhlps                 m2, m2
1833     PALIGNR                 m2, m1, 4, m0
1834     movh      [dstq+strideq*2], m2
1835     movhps    [dstq+strideq*0], m2
1836     RET
1837
1838 cglobal vp9_ipred_hd_8x8_16, 4, 4, 5, dst, stride, l, a
1839     mova                    m0, [lq]
1840     movu                    m1, [aq-2]
1841     PALIGNR                 m2, m1, m0, 2, m3
1842     PALIGNR                 m3, m1, m0, 4, m4
1843     LOWPASS                  3,  2,  0
1844     pavgw                   m2, m0
1845     SBUTTERFLY           wd, 2,  3,  0
1846     psrldq                  m0, m1,  2
1847     psrldq                  m4, m1,  4
1848     LOWPASS                  1,  0,  4
1849     DEFINE_ARGS dst8, mstride, cnt
1850     lea                  dst8q, [dst8q+mstrideq*8]
1851     neg               mstrideq
1852     mov                   cntd, 4
1853
1854 .loop:
1855     add                  dst8q, mstrideq
1856     mova    [dst8q+mstrideq*0], m2
1857     mova    [dst8q+mstrideq*4], m3
1858 %if cpuflag(avx)
1859     vpalignr                m2, m3, m2, 4
1860     vpalignr                m3, m1, m3, 4
1861 %else
1862     PALIGNR                 m0, m3, m2, 4, m4
1863     mova                    m2, m0
1864     PALIGNR                 m0, m1, m3, 4, m4
1865     mova                    m3, m0
1866 %endif
1867     psrldq                  m1, 4
1868     dec                   cntd
1869     jg .loop
1870     RET
1871
1872 cglobal vp9_ipred_hd_16x16_16, 4, 4, 8, dst, stride, l, a
1873     mova                    m2, [lq]
1874     movu                    m1, [lq+2]
1875     movu                    m0, [lq+4]
1876     LOWPASS                  0,  1,  2
1877     pavgw                   m1, m2
1878     mova                    m4, [lq+mmsize]
1879     movu                    m5, [aq-2]
1880     PALIGNR                 m3, m5, m4, 2, m6
1881     PALIGNR                 m2, m5, m4, 4, m6
1882     LOWPASS                  2,  3,  4
1883     pavgw                   m3, m4
1884     SBUTTERFLY           wd, 1,  0,  4
1885     SBUTTERFLY           wd, 3,  2,  4
1886     mova                    m6, [aq]
1887     movu                    m4, [aq+2]
1888     LOWPASS                  4,  6,  5
1889     movu                    m5, [aq+mmsize-2]
1890     psrldq                  m6, m5,  2
1891     psrldq                  m7, m5,  4
1892     LOWPASS                  5,  6,  7
1893     DEFINE_ARGS dst, mstride, mstride3, cnt
1894     lea                   dstq, [dstq+mstrideq*8]
1895     lea                   dstq, [dstq+mstrideq*8]
1896     neg               mstrideq
1897     lea              mstride3q, [mstrideq*3]
1898     mov                   cntd, 4
1899
1900 .loop:
1901     add                  dstq, mstrideq
1902     mova [dstq+mstride3q*4+ 0], m2
1903     mova [dstq+mstride3q*4+16], m4
1904     mova [dstq+mstrideq *8+ 0], m3
1905     mova [dstq+mstrideq *8+16], m2
1906     mova [dstq+mstrideq *4+ 0], m0
1907     mova [dstq+mstrideq *4+16], m3
1908     mova [dstq+mstrideq *0+ 0], m1
1909     mova [dstq+mstrideq *0+16], m0
1910 %if cpuflag(avx)
1911     vpalignr                m1, m0, m1, 4
1912     vpalignr                m0, m3, m0, 4
1913     vpalignr                m3, m2, m3, 4
1914     vpalignr                m2, m4, m2, 4
1915     vpalignr                m4, m5, m4, 4
1916 %else
1917     PALIGNR                 m6, m0, m1, 4, m7
1918     mova                    m1, m6
1919     PALIGNR                 m6, m3, m0, 4, m7
1920     mova                    m0, m6
1921     PALIGNR                 m6, m2, m3, 4, m7
1922     mova                    m3, m6
1923     PALIGNR                 m6, m4, m2, 4, m7
1924     mova                    m2, m6
1925     PALIGNR                 m6, m5, m4, 4, m7
1926     mova                    m4, m6
1927 %endif
1928     psrldq                  m5, 4
1929     dec                   cntd
1930     jg .loop
1931     RET
1932
1933 cglobal vp9_ipred_hd_32x32_16, 4, 4 + 3 * ARCH_X86_64, 14, \
1934                                10 * -mmsize * ARCH_X86_32, dst, stride, l, a
1935     mova                    m2, [lq+mmsize*0+0]
1936     movu                    m1, [lq+mmsize*0+2]
1937     movu                    m0, [lq+mmsize*0+4]
1938     LOWPASS                  0,  1,  2
1939     pavgw                   m1, m2
1940     SBUTTERFLY           wd, 1,  0,  2
1941     mova                    m4, [lq+mmsize*1+0]
1942     movu                    m3, [lq+mmsize*1+2]
1943     movu                    m2, [lq+mmsize*1+4]
1944     LOWPASS                  2,  3,  4
1945     pavgw                   m3, m4
1946     SBUTTERFLY           wd, 3,  2,  4
1947     SCRATCH                  0,  8, rsp+0*mmsize
1948     SCRATCH                  1,  9, rsp+1*mmsize
1949     SCRATCH                  2, 10, rsp+2*mmsize
1950     SCRATCH                  3, 11, rsp+3*mmsize
1951     mova                    m6, [lq+mmsize*2+0]
1952     movu                    m5, [lq+mmsize*2+2]
1953     movu                    m4, [lq+mmsize*2+4]
1954     LOWPASS                  4,  5,  6
1955     pavgw                   m5, m6
1956     SBUTTERFLY           wd, 5,  4,  6
1957     mova                    m0, [lq+mmsize*3+0]
1958     movu                    m1, [aq+mmsize*0-2]
1959     PALIGNR                 m7, m1, m0, 2, m2
1960     PALIGNR                 m6, m1, m0, 4, m2
1961     LOWPASS                  6,  7,  0
1962     pavgw                   m7, m0
1963     SBUTTERFLY           wd, 7,  6,  0
1964     mova                    m2, [aq+mmsize*0+0]
1965     movu                    m0, [aq+mmsize*0+2]
1966     LOWPASS                  0,  2,  1
1967     movu                    m1, [aq+mmsize*1-2]
1968     mova                    m2, [aq+mmsize*1+0]
1969     movu                    m3, [aq+mmsize*1+2]
1970     LOWPASS                  1,  2,  3
1971     SCRATCH                  6, 12, rsp+6*mmsize
1972     SCRATCH                  7, 13, rsp+7*mmsize
1973     movu                    m2, [aq+mmsize*2-2]
1974     mova                    m3, [aq+mmsize*2+0]
1975     movu                    m6, [aq+mmsize*2+2]
1976     LOWPASS                  2,  3,  6
1977     movu                    m3, [aq+mmsize*3-2]
1978     psrldq                  m6, m3,  2
1979     psrldq                  m7, m3,  4
1980     LOWPASS                  3,  6,  7
1981     UNSCRATCH                6, 12, rsp+6*mmsize
1982     UNSCRATCH                7, 13, rsp+7*mmsize
1983 %if ARCH_X86_32
1984     mova        [rsp+4*mmsize], m4
1985     mova        [rsp+5*mmsize], m5
1986     ; we already backed up m6/m7 earlier on x86-32 in SCRATCH, so we don't need
1987     ; to do it again here
1988 %endif
1989     DEFINE_ARGS dst, stride, cnt, stride3, stride4, stride20, stride28
1990     mov                   cntd, 4
1991     lea               stride3q, [strideq*3]
1992 %if ARCH_X86_64
1993     lea               stride4q, [strideq*4]
1994     lea              stride28q, [stride4q*8]
1995     lea              stride20q, [stride4q*5]
1996     sub              stride28q, stride4q
1997 %endif
1998     add                   dstq, stride3q
1999
2000     ; x86-32 doesn't have enough registers, so on that platform, we split
2001     ; the loop in 2... Otherwise you spend most of the loop (un)scratching
2002 .loop:
2003 %if ARCH_X86_64
2004     mova  [dstq+stride28q + 0], m9
2005     mova  [dstq+stride28q +16], m8
2006     mova  [dstq+stride28q +32], m11
2007     mova  [dstq+stride28q +48], m10
2008     mova  [dstq+stride3q*8+ 0], m8
2009     mova  [dstq+stride3q*8+16], m11
2010     mova  [dstq+stride3q*8+32], m10
2011     mova  [dstq+stride3q*8+48], m5
2012     mova  [dstq+stride20q + 0], m11
2013     mova  [dstq+stride20q +16], m10
2014     mova  [dstq+stride20q +32], m5
2015     mova  [dstq+stride20q +48], m4
2016     mova  [dstq+stride4q*4+ 0], m10
2017     mova  [dstq+stride4q*4+16], m5
2018     mova  [dstq+stride4q*4+32], m4
2019     mova  [dstq+stride4q*4+48], m7
2020 %endif
2021     mova  [dstq+stride3q*4+ 0], m5
2022     mova  [dstq+stride3q*4+16], m4
2023     mova  [dstq+stride3q*4+32], m7
2024     mova  [dstq+stride3q*4+48], m6
2025     mova  [dstq+strideq* 8+ 0], m4
2026     mova  [dstq+strideq* 8+16], m7
2027     mova  [dstq+strideq* 8+32], m6
2028     mova  [dstq+strideq* 8+48], m0
2029     mova  [dstq+strideq* 4+ 0], m7
2030     mova  [dstq+strideq* 4+16], m6
2031     mova  [dstq+strideq* 4+32], m0
2032     mova  [dstq+strideq* 4+48], m1
2033     mova  [dstq+strideq* 0+ 0], m6
2034     mova  [dstq+strideq* 0+16], m0
2035     mova  [dstq+strideq* 0+32], m1
2036     mova  [dstq+strideq* 0+48], m2
2037     sub                   dstq, strideq
2038 %if cpuflag(avx)
2039 %if ARCH_X86_64
2040     vpalignr                m9, m8,  m9,  4
2041     vpalignr                m8, m11, m8,  4
2042     vpalignr               m11, m10, m11, 4
2043     vpalignr               m10, m5,  m10, 4
2044 %endif
2045     vpalignr                m5, m4,  m5,  4
2046     vpalignr                m4, m7,  m4,  4
2047     vpalignr                m7, m6,  m7,  4
2048     vpalignr                m6, m0,  m6,  4
2049     vpalignr                m0, m1,  m0,  4
2050     vpalignr                m1, m2,  m1,  4
2051     vpalignr                m2, m3,  m2,  4
2052 %else
2053 %if ARCH_X86_64
2054     PALIGNR                m12, m8,  m9,  4, m13
2055     mova                    m9, m12
2056     PALIGNR                m12, m11, m8,  4, m13
2057     mova                    m8, m12
2058     PALIGNR                m12, m10, m11, 4, m13
2059     mova                   m11, m12
2060     PALIGNR                m12, m5,  m10, 4, m13
2061     mova                   m10, m12
2062 %endif
2063     SCRATCH                  3, 12, rsp+8*mmsize, sh
2064 %if notcpuflag(ssse3)
2065     SCRATCH                  2, 13, rsp+9*mmsize
2066 %endif
2067     PALIGNR                 m3, m4,  m5,  4, m2
2068     mova                    m5, m3
2069     PALIGNR                 m3, m7,  m4,  4, m2
2070     mova                    m4, m3
2071     PALIGNR                 m3, m6,  m7,  4, m2
2072     mova                    m7, m3
2073     PALIGNR                 m3, m0,  m6,  4, m2
2074     mova                    m6, m3
2075     PALIGNR                 m3, m1,  m0,  4, m2
2076     mova                    m0, m3
2077 %if notcpuflag(ssse3)
2078     UNSCRATCH                2, 13, rsp+9*mmsize
2079     SCRATCH                  0, 13, rsp+9*mmsize
2080 %endif
2081     PALIGNR                 m3, m2,  m1,  4, m0
2082     mova                    m1, m3
2083     PALIGNR                 m3, reg_sh,  m2,  4, m0
2084     mova                    m2, m3
2085 %if notcpuflag(ssse3)
2086     UNSCRATCH                0, 13, rsp+9*mmsize
2087 %endif
2088     UNSCRATCH                3, 12, rsp+8*mmsize, sh
2089 %endif
2090     psrldq                  m3, 4
2091     dec                   cntd
2092     jg .loop
2093
2094 %if ARCH_X86_32
2095     UNSCRATCH                0,  8, rsp+0*mmsize
2096     UNSCRATCH                1,  9, rsp+1*mmsize
2097     UNSCRATCH                2, 10, rsp+2*mmsize
2098     UNSCRATCH                3, 11, rsp+3*mmsize
2099     mova                    m4, [rsp+4*mmsize]
2100     mova                    m5, [rsp+5*mmsize]
2101     mova                    m6, [rsp+6*mmsize]
2102     mova                    m7, [rsp+7*mmsize]
2103     DEFINE_ARGS dst, stride, stride5, stride3
2104     lea               stride5q, [strideq*5]
2105     lea                   dstq, [dstq+stride5q*4]
2106     DEFINE_ARGS dst, stride, cnt, stride3
2107     mov                   cntd, 4
2108 .loop_2:
2109     mova  [dstq+stride3q*4+ 0], m1
2110     mova  [dstq+stride3q*4+16], m0
2111     mova  [dstq+stride3q*4+32], m3
2112     mova  [dstq+stride3q*4+48], m2
2113     mova  [dstq+strideq* 8+ 0], m0
2114     mova  [dstq+strideq* 8+16], m3
2115     mova  [dstq+strideq* 8+32], m2
2116     mova  [dstq+strideq* 8+48], m5
2117     mova  [dstq+strideq* 4+ 0], m3
2118     mova  [dstq+strideq* 4+16], m2
2119     mova  [dstq+strideq* 4+32], m5
2120     mova  [dstq+strideq* 4+48], m4
2121     mova  [dstq+strideq* 0+ 0], m2
2122     mova  [dstq+strideq* 0+16], m5
2123     mova  [dstq+strideq* 0+32], m4
2124     mova  [dstq+strideq* 0+48], m7
2125     sub                   dstq, strideq
2126 %if cpuflag(avx)
2127     vpalignr                m1, m0,  m1,  4
2128     vpalignr                m0, m3,  m0,  4
2129     vpalignr                m3, m2,  m3,  4
2130     vpalignr                m2, m5,  m2,  4
2131     vpalignr                m5, m4,  m5,  4
2132     vpalignr                m4, m7,  m4,  4
2133     vpalignr                m7, m6,  m7,  4
2134 %else
2135     SCRATCH                  6, 12, rsp+8*mmsize, sh
2136 %if notcpuflag(ssse3)
2137     SCRATCH                  7, 13, rsp+9*mmsize
2138 %endif
2139     PALIGNR                 m6, m0,  m1,  4, m7
2140     mova                    m1, m6
2141     PALIGNR                 m6, m3,  m0,  4, m7
2142     mova                    m0, m6
2143     PALIGNR                 m6, m2,  m3,  4, m7
2144     mova                    m3, m6
2145     PALIGNR                 m6, m5,  m2,  4, m7
2146     mova                    m2, m6
2147     PALIGNR                 m6, m4,  m5,  4, m7
2148     mova                    m5, m6
2149 %if notcpuflag(ssse3)
2150     UNSCRATCH                7, 13, rsp+9*mmsize
2151     SCRATCH                  5, 13, rsp+9*mmsize
2152 %endif
2153     PALIGNR                 m6, m7,  m4,  4, m5
2154     mova                    m4, m6
2155     PALIGNR                 m6, reg_sh,  m7,  4, m5
2156     mova                    m7, m6
2157 %if notcpuflag(ssse3)
2158     UNSCRATCH                5, 13, rsp+9*mmsize
2159 %endif
2160     UNSCRATCH                6, 12, rsp+8*mmsize, sh
2161 %endif
2162     psrldq                  m6, 4
2163     dec                   cntd
2164     jg .loop_2
2165 %endif
2166     RET
2167 %endmacro
2168
2169 INIT_XMM sse2
2170 HD_FUNCS
2171 INIT_XMM ssse3
2172 HD_FUNCS
2173 INIT_XMM avx
2174 HD_FUNCS