]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/vp9itxfm_16bpp.asm
vp9: add itxfm_add eob shortcuts to 10/12bpp functions.
[ffmpeg] / libavcodec / x86 / vp9itxfm_16bpp.asm
1 ;******************************************************************************
2 ;* VP9 inverse transform x86 SIMD optimizations
3 ;*
4 ;* Copyright (C) 2015 Ronald S. Bultje <rsbultje gmail com>
5 ;*
6 ;* This file is part of FFmpeg.
7 ;*
8 ;* FFmpeg is free software; you can redistribute it and/or
9 ;* modify it under the terms of the GNU Lesser General Public
10 ;* License as published by the Free Software Foundation; either
11 ;* version 2.1 of the License, or (at your option) any later version.
12 ;*
13 ;* FFmpeg is distributed in the hope that it will be useful,
14 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 ;* Lesser General Public License for more details.
17 ;*
18 ;* You should have received a copy of the GNU Lesser General Public
19 ;* License along with FFmpeg; if not, write to the Free Software
20 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 ;******************************************************************************
22
23 %include "libavutil/x86/x86util.asm"
24 %include "vp9itxfm_template.asm"
25
26 SECTION_RODATA
27
28 cextern pw_8
29 cextern pw_1023
30 cextern pw_2048
31 cextern pw_4095
32 cextern pw_m1
33 cextern pd_1
34 cextern pd_16
35 cextern pd_32
36 cextern pd_8192
37
38 pd_8: times 4 dd 8
39 pd_3fff: times 4 dd 0x3fff
40
41 ; FIXME these should probably be shared between 8bpp and 10/12bpp
42 pw_m11585_11585: times 4 dw -11585, 11585
43 pw_11585_11585: times 8 dw 11585
44 pw_m15137_6270: times 4 dw -15137, 6270
45 pw_6270_15137: times 4 dw 6270, 15137
46 pw_11585x2: times 8 dw 11585*2
47
48 pw_5283_13377: times 4 dw 5283, 13377
49 pw_9929_13377: times 4 dw 9929, 13377
50 pw_15212_m13377: times 4 dw 15212, -13377
51 pw_15212_9929: times 4 dw 15212, 9929
52 pw_m5283_m15212: times 4 dw -5283, -15212
53 pw_13377x2: times 8 dw 13377*2
54 pw_m13377_13377: times 4 dw -13377, 13377
55 pw_13377_0: times 4 dw 13377, 0
56 pw_9929_m5283: times 4 dw 9929, -5283
57
58 pw_3196_16069: times 4 dw 3196, 16069
59 pw_m16069_3196: times 4 dw -16069, 3196
60 pw_13623_9102: times 4 dw 13623, 9102
61 pw_m9102_13623: times 4 dw -9102, 13623
62
63 pw_1606_16305: times 4 dw 1606, 16305
64 pw_m16305_1606: times 4 dw -16305, 1606
65 pw_12665_10394: times 4 dw 12665, 10394
66 pw_m10394_12665: times 4 dw -10394, 12665
67 pw_7723_14449: times 4 dw 7723, 14449
68 pw_m14449_7723: times 4 dw -14449, 7723
69 pw_15679_4756: times 4 dw 15679, 4756
70 pw_m4756_15679: times 4 dw -4756, 15679
71 pw_15137_6270: times 4 dw 15137, 6270
72 pw_m6270_15137: times 4 dw -6270, 15137
73
74 pw_804_16364: times 4 dw 804, 16364
75 pw_m16364_804: times 4 dw -16364, 804
76 pw_12140_11003: times 4 dw 12140, 11003
77 pw_m11003_12140: times 4 dw -11003, 12140
78 pw_7005_14811: times 4 dw 7005, 14811
79 pw_m14811_7005: times 4 dw -14811, 7005
80 pw_15426_5520: times 4 dw 15426, 5520
81 pw_m5520_15426: times 4 dw -5520, 15426
82 pw_16069_3196: times 4 dw 16069, 3196
83 pw_m3196_16069: times 4 dw -3196, 16069
84 pw_3981_15893: times 4 dw 3981, 15893
85 pw_m15893_3981: times 4 dw -15893, 3981
86 pw_14053_8423: times 4 dw 14053, 8423
87 pw_m8423_14053: times 4 dw -8423, 14053
88 pw_9760_13160: times 4 dw 9760, 13160
89 pw_m13160_9760: times 4 dw -13160, 9760
90 pw_16207_2404: times 4 dw 16207, 2404
91 pw_m2404_16207: times 4 dw -2404, 16207
92 pw_9102_13623: times 4 dw 9102, 13623
93 pw_m13623_9102: times 4 dw -13623, 9102
94 pw_m11585_m11585: times 8 dw -11585
95
96 pw_m3196_m16069: times 4 dw -3196, -16069
97 pw_m13623_m9102: times 4 dw -13623, -9102
98 pw_m6270_m15137: times 4 dw -6270, -15137
99
100 default_8x8:
101 times 12 db 1
102 times 52 db 2
103 row_8x8:
104 times 18 db 1
105 times 46 db 2
106 col_8x8:
107 times 6 db 1
108 times 58 db 2
109 default_16x16:
110 times 10 db 1
111 times 28 db 2
112 times 51 db 3
113 times 167 db 4
114 row_16x16:
115 times 21 db 1
116 times 45 db 2
117 times 60 db 3
118 times 130 db 4
119 col_16x16:
120 times 5 db 1
121 times 12 db 2
122 times 25 db 3
123 times 214 db 4
124 default_32x32:
125 times 9 db 1
126 times 25 db 2
127 times 36 db 3
128 times 65 db 4
129 times 105 db 5
130 times 96 db 6
131 times 112 db 7
132 times 576 db 8
133
134 SECTION .text
135
136 %macro VP9_STORE_2X 6-7 dstq ; reg1, reg2, tmp1, tmp2, min, max, dst
137     mova               m%3, [%7]
138     mova               m%4, [%7+strideq]
139     paddw              m%3, m%1
140     paddw              m%4, m%2
141     pmaxsw             m%3, m%5
142     pmaxsw             m%4, m%5
143     pminsw             m%3, m%6
144     pminsw             m%4, m%6
145     mova              [%7], m%3
146     mova      [%7+strideq], m%4
147 %endmacro
148
149 %macro ZERO_BLOCK 4 ; mem, stride, nnzcpl, zero_reg
150 %assign %%y 0
151 %rep %3
152 %assign %%x 0
153 %rep %3*4/mmsize
154     mova      [%1+%%y+%%x], %4
155 %assign %%x (%%x+mmsize)
156 %endrep
157 %assign %%y (%%y+%2)
158 %endrep
159 %endmacro
160
161 ; the input coefficients are scaled up by 2 bit (which we downscale immediately
162 ; in the iwht), and is otherwise orthonormally increased by 1 bit per iwht_1d.
163 ; therefore, a diff of 10-12+sign bit will fit in 12-14+sign bit after scaling,
164 ; i.e. everything can be done in 15+1bpp words. Since the quant fractional bits
165 ; add 2 bits, we need to scale before converting to word in 12bpp, since the
166 ; input will be 16+sign bit which doesn't fit in 15+sign words, but in 10bpp
167 ; we can scale after converting to words (which is half the instructions),
168 ; since the input is only 14+sign bit, which fits in 15+sign words directly.
169
170 %macro IWHT4_FN 2 ; bpp, max
171 cglobal vp9_iwht_iwht_4x4_add_%1, 3, 3, 8, dst, stride, block, eob
172     mova                m7, [pw_%2]
173     mova                m0, [blockq+0*16+0]
174     mova                m1, [blockq+1*16+0]
175 %if %1 >= 12
176     mova                m4, [blockq+0*16+8]
177     mova                m5, [blockq+1*16+8]
178     psrad               m0, 2
179     psrad               m1, 2
180     psrad               m4, 2
181     psrad               m5, 2
182     packssdw            m0, m4
183     packssdw            m1, m5
184 %else
185     packssdw            m0, [blockq+0*16+8]
186     packssdw            m1, [blockq+1*16+8]
187     psraw               m0, 2
188     psraw               m1, 2
189 %endif
190     mova                m2, [blockq+2*16+0]
191     mova                m3, [blockq+3*16+0]
192 %if %1 >= 12
193     mova                m4, [blockq+2*16+8]
194     mova                m5, [blockq+3*16+8]
195     psrad               m2, 2
196     psrad               m3, 2
197     psrad               m4, 2
198     psrad               m5, 2
199     packssdw            m2, m4
200     packssdw            m3, m5
201 %else
202     packssdw            m2, [blockq+2*16+8]
203     packssdw            m3, [blockq+3*16+8]
204     psraw               m2, 2
205     psraw               m3, 2
206 %endif
207
208     VP9_IWHT4_1D
209     TRANSPOSE4x4W        0, 1, 2, 3, 4
210     VP9_IWHT4_1D
211
212     pxor                m6, m6
213     VP9_STORE_2X         0, 1, 4, 5, 6, 7
214     lea               dstq, [dstq+strideq*2]
215     VP9_STORE_2X         2, 3, 4, 5, 6, 7
216     ZERO_BLOCK      blockq, 16, 4, m6
217     RET
218 %endmacro
219
220 INIT_MMX mmxext
221 IWHT4_FN 10, 1023
222 INIT_MMX mmxext
223 IWHT4_FN 12, 4095
224
225 %macro VP9_IDCT4_WRITEOUT 0
226 %if cpuflag(ssse3)
227     mova                m5, [pw_2048]
228     pmulhrsw            m0, m5
229     pmulhrsw            m1, m5
230     pmulhrsw            m2, m5
231     pmulhrsw            m3, m5
232 %else
233     mova                m5, [pw_8]
234     paddw               m0, m5
235     paddw               m1, m5
236     paddw               m2, m5
237     paddw               m3, m5
238     psraw               m0, 4
239     psraw               m1, 4
240     psraw               m2, 4
241     psraw               m3, 4
242 %endif
243     mova                m5, [pw_1023]
244     VP9_STORE_2X         0,  1,  6,  7,  4,  5
245     lea               dstq, [dstq+2*strideq]
246     VP9_STORE_2X         2,  3,  6,  7,  4,  5
247 %endmacro
248
249 %macro DC_ONLY 2 ; shift, zero
250     mov              coefd, dword [blockq]
251     movd          [blockq], %2
252     imul             coefd, 11585
253     add              coefd, 8192
254     sar              coefd, 14
255     imul             coefd, 11585
256     add              coefd, ((1 << (%1 - 1)) << 14) + 8192
257     sar              coefd, 14 + %1
258 %endmacro
259
260 ; 4x4 coefficients are 5+depth+sign bits, so for 10bpp, everything still fits
261 ; in 15+1 words without additional effort, since the coefficients are 15bpp.
262
263 %macro IDCT4_10_FN 0
264 cglobal vp9_idct_idct_4x4_add_10, 4, 4, 8, dst, stride, block, eob
265     cmp               eobd, 1
266     jg .idctfull
267
268     ; dc-only
269     pxor                m4, m4
270 %if cpuflag(ssse3)
271     movd                m0, [blockq]
272     movd          [blockq], m4
273     mova                m5, [pw_11585x2]
274     pmulhrsw            m0, m5
275     pmulhrsw            m0, m5
276 %else
277     DEFINE_ARGS dst, stride, block, coef
278     DC_ONLY              4, m4
279     movd                m0, coefd
280 %endif
281     pshufw              m0, m0, 0
282     mova                m5, [pw_1023]
283 %if cpuflag(ssse3)
284     pmulhrsw            m0, [pw_2048]       ; (x*2048 + (1<<14))>>15 <=> (x+8)>>4
285 %endif
286     VP9_STORE_2X         0,  0,  6,  7,  4,  5
287     lea               dstq, [dstq+2*strideq]
288     VP9_STORE_2X         0,  0,  6,  7,  4,  5
289     RET
290
291 .idctfull:
292     mova                m0, [blockq+0*16+0]
293     mova                m1, [blockq+1*16+0]
294     packssdw            m0, [blockq+0*16+8]
295     packssdw            m1, [blockq+1*16+8]
296     mova                m2, [blockq+2*16+0]
297     mova                m3, [blockq+3*16+0]
298     packssdw            m2, [blockq+2*16+8]
299     packssdw            m3, [blockq+3*16+8]
300
301 %if cpuflag(ssse3)
302     mova                m6, [pw_11585x2]
303 %endif
304     mova                m7, [pd_8192]       ; rounding
305     VP9_IDCT4_1D
306     TRANSPOSE4x4W  0, 1, 2, 3, 4
307     VP9_IDCT4_1D
308
309     pxor                m4, m4
310     ZERO_BLOCK      blockq, 16, 4, m4
311     VP9_IDCT4_WRITEOUT
312     RET
313 %endmacro
314
315 INIT_MMX mmxext
316 IDCT4_10_FN
317 INIT_MMX ssse3
318 IDCT4_10_FN
319
320 %macro IADST4_FN 4
321 cglobal vp9_%1_%3_4x4_add_10, 3, 3, 0, dst, stride, block, eob
322 %if WIN64 && notcpuflag(ssse3)
323     WIN64_SPILL_XMM 8
324 %endif
325     movdqa            xmm5, [pd_8192]
326     mova                m0, [blockq+0*16+0]
327     mova                m1, [blockq+1*16+0]
328     packssdw            m0, [blockq+0*16+8]
329     packssdw            m1, [blockq+1*16+8]
330     mova                m2, [blockq+2*16+0]
331     mova                m3, [blockq+3*16+0]
332     packssdw            m2, [blockq+2*16+8]
333     packssdw            m3, [blockq+3*16+8]
334
335 %if cpuflag(ssse3)
336     mova                m6, [pw_11585x2]
337 %endif
338 %ifnidn %1%3, iadstiadst
339     movdq2q             m7, xmm5
340 %endif
341     VP9_%2_1D
342     TRANSPOSE4x4W  0, 1, 2, 3, 4
343     VP9_%4_1D
344
345     pxor                m4, m4
346     ZERO_BLOCK      blockq, 16, 4, m4
347     VP9_IDCT4_WRITEOUT
348     RET
349 %endmacro
350
351 INIT_MMX sse2
352 IADST4_FN idct,  IDCT4,  iadst, IADST4
353 IADST4_FN iadst, IADST4, idct,  IDCT4
354 IADST4_FN iadst, IADST4, iadst, IADST4
355
356 INIT_MMX ssse3
357 IADST4_FN idct,  IDCT4,  iadst, IADST4
358 IADST4_FN iadst, IADST4, idct,  IDCT4
359 IADST4_FN iadst, IADST4, iadst, IADST4
360
361 ; inputs and outputs are dwords, coefficients are words
362 ;
363 ; dst1 = src1 * coef1 + src2 * coef2 + rnd >> 14
364 ; dst2 = src1 * coef2 - src2 * coef1 + rnd >> 14
365 %macro SUMSUB_MUL 6 ; src/dst 1-2, tmp1-2, coef1-2
366     pand               m%3, m%1, [pd_3fff]
367     pand               m%4, m%2, [pd_3fff]
368     psrad              m%1, 14
369     psrad              m%2, 14
370     packssdw           m%4, m%2
371     packssdw           m%3, m%1
372     punpckhwd          m%2, m%4, m%3
373     punpcklwd          m%4, m%3
374     pmaddwd            m%3, m%4, [pw_%6_%5]
375     pmaddwd            m%1, m%2, [pw_%6_%5]
376     pmaddwd            m%4, [pw_m%5_%6]
377     pmaddwd            m%2, [pw_m%5_%6]
378     paddd              m%3, [pd_8192]
379     paddd              m%4, [pd_8192]
380     psrad              m%3, 14
381     psrad              m%4, 14
382     paddd              m%1, m%3
383     paddd              m%2, m%4
384 %endmacro
385
386 %macro IDCT4_12BPP_1D 0-6 0, 1, 2, 3, 4, 5
387     SUMSUB_MUL          %1, %3, %5, %6, 11585, 11585
388     SUMSUB_MUL          %2, %4, %5, %6, 15137,  6270
389     SUMSUB_BA        d, %2, %1, %5
390     SUMSUB_BA        d, %4, %3, %5
391     SWAP                %2, %4, %1
392 %endmacro
393
394 %macro STORE_4x4 6 ; tmp1-2, reg1-2, min, max
395     movh               m%1, [dstq+strideq*0]
396     movh               m%2, [dstq+strideq*2]
397     movhps             m%1, [dstq+strideq*1]
398     movhps             m%2, [dstq+stride3q ]
399     paddw              m%1, m%3
400     paddw              m%2, m%4
401     pmaxsw             m%1, %5
402     pmaxsw             m%2, %5
403     pminsw             m%1, %6
404     pminsw             m%2, %6
405     movh   [dstq+strideq*0], m%1
406     movhps [dstq+strideq*1], m%1
407     movh   [dstq+strideq*2], m%2
408     movhps [dstq+stride3q ], m%2
409 %endmacro
410
411 %macro ROUND_AND_STORE_4x4 8 ; reg1-4, min, max, rnd, shift
412     paddd              m%1, %7
413     paddd              m%2, %7
414     paddd              m%3, %7
415     paddd              m%4, %7
416     psrad              m%1, %8
417     psrad              m%2, %8
418     psrad              m%3, %8
419     psrad              m%4, %8
420     packssdw           m%1, m%2
421     packssdw           m%3, m%4
422     STORE_4x4           %2, %4, %1, %3, %5, %6
423 %endmacro
424
425 INIT_XMM sse2
426 cglobal vp9_idct_idct_4x4_add_12, 4, 4, 6, dst, stride, block, eob
427     cmp               eobd, 1
428     jg .idctfull
429
430     ; dc-only - this is special, since for 4x4 12bpp, the max coef size is
431     ; 17+sign bpp. Since the multiply is with 11585, which is 14bpp, the
432     ; result of each multiply is 31+sign bit, i.e. it _exactly_ fits in a
433     ; dword. After the final shift (4), the result is 13+sign bits, so we
434     ; don't need any additional processing to fit it in a word
435     DEFINE_ARGS dst, stride, block, coef
436     pxor                m4, m4
437     DC_ONLY              4, m4
438     movd                m0, coefd
439     pshuflw             m0, m0, q0000
440     punpcklqdq          m0, m0
441     mova                m5, [pw_4095]
442     DEFINE_ARGS dst, stride, stride3
443     lea           stride3q, [strideq*3]
444     STORE_4x4            1, 3, 0, 0, m4, m5
445     RET
446
447 .idctfull:
448     DEFINE_ARGS dst, stride, block, eob
449     mova                m0, [blockq+0*16]
450     mova                m1, [blockq+1*16]
451     mova                m2, [blockq+2*16]
452     mova                m3, [blockq+3*16]
453
454     IDCT4_12BPP_1D
455     TRANSPOSE4x4D        0, 1, 2, 3, 4
456     IDCT4_12BPP_1D
457
458     pxor                m4, m4
459     ZERO_BLOCK      blockq, 16, 4, m4
460
461     ; writeout
462     DEFINE_ARGS dst, stride, stride3
463     lea           stride3q, [strideq*3]
464     mova                m5, [pw_4095]
465     ROUND_AND_STORE_4x4  0, 1, 2, 3, m4, m5, [pd_8], 4
466     RET
467
468 %macro SCRATCH 3-4
469 %if ARCH_X86_64
470     SWAP                %1, %2
471 %if %0 == 4
472 %define reg_%4 m%2
473 %endif
474 %else
475     mova              [%3], m%1
476 %if %0 == 4
477 %define reg_%4 [%3]
478 %endif
479 %endif
480 %endmacro
481
482 %macro UNSCRATCH 3-4
483 %if ARCH_X86_64
484     SWAP                %1, %2
485 %else
486     mova               m%1, [%3]
487 %endif
488 %if %0 == 4
489 %undef reg_%4
490 %endif
491 %endmacro
492
493 ; out0 =  5283 * in0 + 13377 + in1 + 15212 * in2 +  9929 * in3 + rnd >> 14
494 ; out1 =  9929 * in0 + 13377 * in1 -  5283 * in2 - 15282 * in3 + rnd >> 14
495 ; out2 = 13377 * in0               - 13377 * in2 + 13377 * in3 + rnd >> 14
496 ; out3 = 15212 * in0 - 13377 * in1 +  9929 * in2 -  5283 * in3 + rnd >> 14
497 %macro IADST4_12BPP_1D 0
498     pand                m4, m0, [pd_3fff]
499     pand                m5, m1, [pd_3fff]
500     psrad               m0, 14
501     psrad               m1, 14
502     packssdw            m5, m1
503     packssdw            m4, m0
504     punpckhwd           m1, m4, m5
505     punpcklwd           m4, m5
506     pand                m5, m2, [pd_3fff]
507     pand                m6, m3, [pd_3fff]
508     psrad               m2, 14
509     psrad               m3, 14
510     packssdw            m6, m3
511     packssdw            m5, m2
512     punpckhwd           m3, m5, m6
513     punpcklwd           m5, m6
514     SCRATCH              1,  8, rsp+0*mmsize, a
515     SCRATCH              5,  9, rsp+1*mmsize, b
516
517     ; m1/3 have the high bits of 0,1,2,3
518     ; m4/5 have the low bits of 0,1,2,3
519     ; m0/2/6/7 are free
520
521     pmaddwd             m7, reg_b, [pw_15212_9929]
522     pmaddwd             m6, m4, [pw_5283_13377]
523     pmaddwd             m2, m3, [pw_15212_9929]
524     pmaddwd             m0, reg_a, [pw_5283_13377]
525     paddd               m6, m7
526     paddd               m0, m2
527     pmaddwd             m7, reg_b, [pw_m13377_13377]
528     pmaddwd             m2, m4, [pw_13377_0]
529     pmaddwd             m1, m3, [pw_m13377_13377]
530     pmaddwd             m5, reg_a, [pw_13377_0]
531     paddd               m2, m7
532     paddd               m1, m5
533     paddd               m6, [pd_8192]
534     paddd               m2, [pd_8192]
535     psrad               m6, 14
536     psrad               m2, 14
537     paddd               m0, m6                      ; t0
538     paddd               m2, m1                      ; t2
539
540     pmaddwd             m1, reg_b, [pw_m5283_m15212]
541     pmaddwd             m6, m4, [pw_9929_13377]
542     pmaddwd             m7, m3, [pw_m5283_m15212]
543     pmaddwd             m5, reg_a, [pw_9929_13377]
544     paddd               m6, m1
545     paddd               m7, m5
546     UNSCRATCH            5,  9, rsp+1*mmsize, b
547     pmaddwd             m5, [pw_9929_m5283]
548     pmaddwd             m4, [pw_15212_m13377]
549     pmaddwd             m3, [pw_9929_m5283]
550     UNSCRATCH            1,  8, rsp+0*mmsize, a
551     pmaddwd             m1, [pw_15212_m13377]
552     paddd               m4, m5
553     paddd               m3, m1
554     paddd               m6, [pd_8192]
555     paddd               m4, [pd_8192]
556     psrad               m6, 14
557     psrad               m4, 14
558     paddd               m7, m6                      ; t1
559     paddd               m3, m4                      ; t3
560
561     SWAP                 1, 7
562 %endmacro
563
564 %macro IADST4_12BPP_FN 4
565 cglobal vp9_%1_%3_4x4_add_12, 3, 3, 10, 2 * ARCH_X86_32 * mmsize, dst, stride, block, eob
566     mova                m0, [blockq+0*16]
567     mova                m1, [blockq+1*16]
568     mova                m2, [blockq+2*16]
569     mova                m3, [blockq+3*16]
570
571     %2_12BPP_1D
572     TRANSPOSE4x4D        0, 1, 2, 3, 4
573     %4_12BPP_1D
574
575     pxor                m4, m4
576     ZERO_BLOCK      blockq, 16, 4, m4
577
578     ; writeout
579     DEFINE_ARGS dst, stride, stride3
580     lea           stride3q, [strideq*3]
581     mova                m5, [pw_4095]
582     ROUND_AND_STORE_4x4  0, 1, 2, 3, m4, m5, [pd_8], 4
583     RET
584 %endmacro
585
586 INIT_XMM sse2
587 IADST4_12BPP_FN idct,  IDCT4,  iadst, IADST4
588 IADST4_12BPP_FN iadst, IADST4, idct,  IDCT4
589 IADST4_12BPP_FN iadst, IADST4, iadst, IADST4
590
591 ; the following line has not been executed at the end of this macro:
592 ; UNSCRATCH            6, 8, rsp+%3*mmsize
593 %macro IDCT8_1D 1-3 2 * mmsize, 17 ; src, src_stride, stack_offset
594     mova                m0, [%1+0*%2]
595     mova                m2, [%1+2*%2]
596     mova                m4, [%1+4*%2]
597     mova                m6, [%1+6*%2]
598     IDCT4_12BPP_1D       0, 2, 4, 6, 1, 3           ; m0/2/4/6 have t0/1/2/3
599     SCRATCH              4, 8, rsp+(%3+0)*mmsize
600     SCRATCH              6, 9, rsp+(%3+1)*mmsize
601     mova                m1, [%1+1*%2]
602     mova                m3, [%1+3*%2]
603     mova                m5, [%1+5*%2]
604     mova                m7, [%1+7*%2]
605     SUMSUB_MUL           1, 7, 4, 6, 16069,  3196   ; m1=t7a, m7=t4a
606     SUMSUB_MUL           5, 3, 4, 6,  9102, 13623   ; m5=t6a, m3=t5a
607     SUMSUB_BA         d, 3, 7, 4                    ; m3=t4, m7=t5a
608     SUMSUB_BA         d, 5, 1, 4                    ; m5=t7, m1=t6a
609     SUMSUB_MUL           1, 7, 4, 6, 11585, 11585   ; m1=t6, m7=t5
610     SUMSUB_BA         d, 5, 0, 4                    ; m5=out0, m0=out7
611     SUMSUB_BA         d, 1, 2, 4                    ; m1=out1, m2=out6
612     UNSCRATCH            4, 8, rsp+(%3+0)*mmsize
613     UNSCRATCH            6, 9, rsp+(%3+1)*mmsize
614     SCRATCH              2, 8, rsp+(%3+0)*mmsize
615     SUMSUB_BA         d, 7, 4, 2                    ; m7=out2, m4=out5
616     SUMSUB_BA         d, 3, 6, 2                    ; m3=out3, m6=out4
617     SWAP                 0, 5, 4, 6, 2, 7
618 %endmacro
619
620 %macro STORE_2x8 5-7 dstq, strideq ; tmp1-2, reg, min, max
621     mova               m%1, [%6+%7*0]
622     mova               m%2, [%6+%7*1]
623     paddw              m%1, m%3
624     paddw              m%2, m%3
625     pmaxsw             m%1, %4
626     pmaxsw             m%2, %4
627     pminsw             m%1, %5
628     pminsw             m%2, %5
629     mova         [%6+%7*0], m%1
630     mova         [%6+%7*1], m%2
631 %endmacro
632
633 %macro PRELOAD 2-3
634 %if ARCH_X86_64
635     mova               m%1, [%2]
636 %if %0 == 3
637 %define reg_%3 m%1
638 %endif
639 %elif %0 == 3
640 %define reg_%3 [%2]
641 %endif
642 %endmacro
643
644 ; FIXME we can use the intermediate storage (rsp[0-15]) on x86-32 for temp
645 ; storage also instead of allocating two more stack spaces. This doesn't
646 ; matter much but it's something...
647 INIT_XMM sse2
648 cglobal vp9_idct_idct_8x8_add_10, 4, 6 + ARCH_X86_64, 10, \
649                                   17 * mmsize + 2 * ARCH_X86_32 * mmsize, \
650                                   dst, stride, block, eob
651     mova                m0, [pw_1023]
652     cmp               eobd, 1
653     jg .idctfull
654
655     ; dc-only - the 10bit version can be done entirely in 32bit, since the max
656     ; coef values are 16+sign bit, and the coef is 14bit, so 30+sign easily
657     ; fits in 32bit
658     DEFINE_ARGS dst, stride, block, coef
659     pxor                m2, m2
660     DC_ONLY              5, m2
661     movd                m1, coefd
662     pshuflw             m1, m1, q0000
663     punpcklqdq          m1, m1
664     DEFINE_ARGS dst, stride, cnt
665     mov               cntd, 4
666 .loop_dc:
667     STORE_2x8            3, 4, 1, m2, m0
668     lea               dstq, [dstq+strideq*2]
669     dec               cntd
670     jg .loop_dc
671     RET
672
673 .idctfull:
674     mova   [rsp+16*mmsize], m0
675     DEFINE_ARGS dst, stride, block, cnt, ptr, skip, dstbak
676 %if ARCH_X86_64
677     mov            dstbakq, dstq
678     movsxd            cntq, cntd
679 %endif
680 %ifdef PIC
681     lea               ptrq, [default_8x8]
682     movzx             cntd, byte [ptrq+cntq-1]
683 %else
684     movzx             cntd, byte [default_8x8+cntq-1]
685 %endif
686     mov              skipd, 2
687     sub              skipd, cntd
688     mov               ptrq, rsp
689 .loop_1:
690     IDCT8_1D        blockq
691
692     TRANSPOSE4x4D        0, 1, 2, 3, 6
693     mova  [ptrq+ 0*mmsize], m0
694     mova  [ptrq+ 2*mmsize], m1
695     mova  [ptrq+ 4*mmsize], m2
696     mova  [ptrq+ 6*mmsize], m3
697     UNSCRATCH            6, 8, rsp+17*mmsize
698     TRANSPOSE4x4D        4, 5, 6, 7, 0
699     mova  [ptrq+ 1*mmsize], m4
700     mova  [ptrq+ 3*mmsize], m5
701     mova  [ptrq+ 5*mmsize], m6
702     mova  [ptrq+ 7*mmsize], m7
703     add               ptrq, 8 * mmsize
704     add             blockq, mmsize
705     dec               cntd
706     jg .loop_1
707
708     ; zero-pad the remainder (skipped cols)
709     test             skipd, skipd
710     jz .end
711     add              skipd, skipd
712     lea             blockq, [blockq+skipq*(mmsize/2)]
713     pxor                m0, m0
714 .loop_z:
715     mova   [ptrq+mmsize*0], m0
716     mova   [ptrq+mmsize*1], m0
717     mova   [ptrq+mmsize*2], m0
718     mova   [ptrq+mmsize*3], m0
719     add               ptrq, 4 * mmsize
720     dec              skipd
721     jg .loop_z
722 .end:
723
724     DEFINE_ARGS dst, stride, block, cnt, ptr, stride3, dstbak
725     lea           stride3q, [strideq*3]
726     mov               cntd, 2
727     mov               ptrq, rsp
728 .loop_2:
729     IDCT8_1D          ptrq
730
731     pxor                m6, m6
732     PRELOAD              9, rsp+16*mmsize, max
733     ROUND_AND_STORE_4x4  0, 1, 2, 3, m6, reg_max, [pd_16], 5
734     lea               dstq, [dstq+strideq*4]
735     UNSCRATCH            0, 8, rsp+17*mmsize
736     ROUND_AND_STORE_4x4  4, 5, 0, 7, m6, reg_max, [pd_16], 5
737     add               ptrq, 16
738 %if ARCH_X86_64
739     lea               dstq, [dstbakq+8]
740 %else
741     mov               dstq, dstm
742     add               dstq, 8
743 %endif
744     dec               cntd
745     jg .loop_2
746
747     ; m6 is still zero
748     ZERO_BLOCK blockq-2*mmsize, 32, 8, m6
749     RET
750
751 %macro DC_ONLY_64BIT 2 ; shift, zero
752 %if ARCH_X86_64
753     movsxd           coefq, dword [blockq]
754     movd          [blockq], %2
755     imul             coefq, 11585
756     add              coefq, 8192
757     sar              coefq, 14
758     imul             coefq, 11585
759     add              coefq, ((1 << (%1 - 1)) << 14) + 8192
760     sar              coefq, 14 + %1
761 %else
762     mov              coefd, dword [blockq]
763     movd          [blockq], %2
764     DEFINE_ARGS dst, stride, cnt, coef, coefl
765     mov               cntd, 2
766 .loop_dc_calc:
767     mov             coefld, coefd
768     sar              coefd, 14
769     and             coefld, 0x3fff
770     imul             coefd, 11585
771     imul            coefld, 11585
772     add             coefld, 8192
773     sar             coefld, 14
774     add              coefd, coefld
775     dec               cntd
776     jg .loop_dc_calc
777     add              coefd, 1 << (%1 - 1)
778     sar              coefd, %1
779 %endif
780 %endmacro
781
782 INIT_XMM sse2
783 cglobal vp9_idct_idct_8x8_add_12, 4, 6 + ARCH_X86_64, 10, \
784                                   17 * mmsize + 2 * ARCH_X86_32 * mmsize, \
785                                   dst, stride, block, eob
786     mova                m0, [pw_4095]
787     cmp               eobd, 1
788     jg mangle(private_prefix %+ _ %+ vp9_idct_idct_8x8_add_10 %+ SUFFIX).idctfull
789
790     ; dc-only - unfortunately, this one can overflow, since coefs are 18+sign
791     ; bpp, and 18+14+sign does not fit in 32bit, so we do 2-stage multiplies
792     DEFINE_ARGS dst, stride, block, coef, coefl
793     pxor                m2, m2
794     DC_ONLY_64BIT        5, m2
795     movd                m1, coefd
796     pshuflw             m1, m1, q0000
797     punpcklqdq          m1, m1
798     DEFINE_ARGS dst, stride, cnt
799     mov               cntd, 4
800 .loop_dc:
801     STORE_2x8            3, 4, 1, m2, m0
802     lea               dstq, [dstq+strideq*2]
803     dec               cntd
804     jg .loop_dc
805     RET
806
807 ; inputs and outputs are dwords, coefficients are words
808 ;
809 ; dst1[hi]:dst3[lo] = src1 * coef1 + src2 * coef2
810 ; dst2[hi]:dst4[lo] = src1 * coef2 - src2 * coef1
811 %macro SUMSUB_MUL_D 6 ; src/dst 1-2, dst3-4, coef1-2
812     pand               m%3, m%1, [pd_3fff]
813     pand               m%4, m%2, [pd_3fff]
814     psrad              m%1, 14
815     psrad              m%2, 14
816     packssdw           m%4, m%2
817     packssdw           m%3, m%1
818     punpckhwd          m%2, m%4, m%3
819     punpcklwd          m%4, m%3
820     pmaddwd            m%3, m%4, [pw_%6_%5]
821     pmaddwd            m%1, m%2, [pw_%6_%5]
822     pmaddwd            m%4, [pw_m%5_%6]
823     pmaddwd            m%2, [pw_m%5_%6]
824 %endmacro
825
826 ; dst1 = src2[hi]:src4[lo] + src1[hi]:src3[lo] + rnd >> 14
827 ; dst2 = src2[hi]:src4[lo] - src1[hi]:src3[lo] + rnd >> 14
828 %macro SUMSUB_PACK_D 5 ; src/dst 1-2, src3-4, tmp
829     SUMSUB_BA        d, %1, %2, %5
830     SUMSUB_BA        d, %3, %4, %5
831     paddd              m%3, [pd_8192]
832     paddd              m%4, [pd_8192]
833     psrad              m%3, 14
834     psrad              m%4, 14
835     paddd              m%1, m%3
836     paddd              m%2, m%4
837 %endmacro
838
839 %macro NEGD 1
840 %if cpuflag(ssse3)
841     psignd              %1, [pw_m1]
842 %else
843     pxor                %1, [pw_m1]
844     paddd               %1, [pd_1]
845 %endif
846 %endmacro
847
848 ; the following line has not been executed at the end of this macro:
849 ; UNSCRATCH            6, 8, rsp+17*mmsize
850 %macro IADST8_1D 1 ; src
851     mova                m0, [%1+ 0*mmsize]
852     mova                m3, [%1+ 6*mmsize]
853     mova                m4, [%1+ 8*mmsize]
854     mova                m7, [%1+14*mmsize]
855     SUMSUB_MUL_D         7, 0, 1, 2, 16305,  1606       ; m7/1=t0a, m0/2=t1a
856     SUMSUB_MUL_D         3, 4, 5, 6, 10394, 12665       ; m3/5=t4a, m4/6=t5a
857     SCRATCH              0, 8, rsp+17*mmsize
858     SUMSUB_PACK_D        3, 7, 5, 1, 0                  ; m3=t0, m7=t4
859     UNSCRATCH            0, 8, rsp+17*mmsize
860     SUMSUB_PACK_D        4, 0, 6, 2, 1                  ; m4=t1, m0=t5
861
862     SCRATCH              3, 8, rsp+17*mmsize
863     SCRATCH              4, 9, rsp+18*mmsize
864     SCRATCH              7, 10, rsp+19*mmsize
865     SCRATCH              0, 11, rsp+20*mmsize
866
867     mova                m1, [%1+ 2*mmsize]
868     mova                m2, [%1+ 4*mmsize]
869     mova                m5, [%1+10*mmsize]
870     mova                m6, [%1+12*mmsize]
871     SUMSUB_MUL_D         5, 2, 3, 4, 14449,  7723       ; m5/8=t2a, m2/9=t3a
872     SUMSUB_MUL_D         1, 6, 7, 0,  4756, 15679       ; m1/10=t6a, m6/11=t7a
873     SCRATCH              2, 12, rsp+21*mmsize
874     SUMSUB_PACK_D        1, 5, 7, 3, 2                  ; m1=t2, m5=t6
875     UNSCRATCH            2, 12, rsp+21*mmsize
876     SUMSUB_PACK_D        6, 2, 0, 4, 3                  ; m6=t3, m2=t7
877
878     UNSCRATCH            7, 10, rsp+19*mmsize
879     UNSCRATCH            0, 11, rsp+20*mmsize
880     SCRATCH              1, 10, rsp+19*mmsize
881     SCRATCH              6, 11, rsp+20*mmsize
882
883     SUMSUB_MUL_D         7, 0, 3, 4, 15137,  6270       ; m7/8=t4a, m0/9=t5a
884     SUMSUB_MUL_D         2, 5, 1, 6,  6270, 15137       ; m2/10=t7a, m5/11=t6a
885     SCRATCH              2, 12, rsp+21*mmsize
886     SUMSUB_PACK_D        5, 7, 6, 3, 2                  ; m5=-out1, m7=t6
887     UNSCRATCH            2, 12, rsp+21*mmsize
888     NEGD                m5                              ; m5=out1
889     SUMSUB_PACK_D        2, 0, 1, 4, 3                  ; m2=out6, m0=t7
890     SUMSUB_MUL           7, 0, 3, 4, 11585, 11585       ; m7=out2, m0=-out5
891     NEGD                m0                              ; m0=out5
892
893     UNSCRATCH            3, 8, rsp+17*mmsize
894     UNSCRATCH            4, 9, rsp+18*mmsize
895     UNSCRATCH            1, 10, rsp+19*mmsize
896     UNSCRATCH            6, 11, rsp+20*mmsize
897     SCRATCH              2, 8, rsp+17*mmsize
898     SCRATCH              0, 9, rsp+18*mmsize
899
900     SUMSUB_BA         d, 1, 3,  2                       ; m1=out0, m3=t2
901     SUMSUB_BA         d, 6, 4,  2                       ; m6=-out7, m4=t3
902     NEGD                m6                              ; m6=out7
903     SUMSUB_MUL           3, 4,  2,  0, 11585, 11585     ; m3=-out3, m4=out4
904     NEGD                m3                              ; m3=out3
905
906     UNSCRATCH            0, 9, rsp+18*mmsize
907
908     SWAP                 0, 1, 5
909     SWAP                 2, 7, 6
910 %endmacro
911
912 %macro IADST8_FN 5
913 cglobal vp9_%1_%3_8x8_add_10, 4, 6 + ARCH_X86_64, 16, \
914                               16 * mmsize + ARCH_X86_32 * 6 * mmsize, \
915                               dst, stride, block, eob
916     mova                m0, [pw_1023]
917
918 .body:
919     mova   [rsp+16*mmsize], m0
920     DEFINE_ARGS dst, stride, block, cnt, ptr, skip, dstbak
921 %if ARCH_X86_64
922     mov            dstbakq, dstq
923     movsxd            cntq, cntd
924 %endif
925 %ifdef PIC
926     lea               ptrq, [%5_8x8]
927     movzx             cntd, byte [ptrq+cntq-1]
928 %else
929     movzx             cntd, byte [%5_8x8+cntq-1]
930 %endif
931     mov              skipd, 2
932     sub              skipd, cntd
933     mov               ptrq, rsp
934 .loop_1:
935     %2_1D           blockq
936
937     TRANSPOSE4x4D        0, 1, 2, 3, 6
938     mova  [ptrq+ 0*mmsize], m0
939     mova  [ptrq+ 2*mmsize], m1
940     mova  [ptrq+ 4*mmsize], m2
941     mova  [ptrq+ 6*mmsize], m3
942     UNSCRATCH            6, 8, rsp+17*mmsize
943     TRANSPOSE4x4D        4, 5, 6, 7, 0
944     mova  [ptrq+ 1*mmsize], m4
945     mova  [ptrq+ 3*mmsize], m5
946     mova  [ptrq+ 5*mmsize], m6
947     mova  [ptrq+ 7*mmsize], m7
948     add               ptrq, 8 * mmsize
949     add             blockq, mmsize
950     dec               cntd
951     jg .loop_1
952
953     ; zero-pad the remainder (skipped cols)
954     test             skipd, skipd
955     jz .end
956     add              skipd, skipd
957     lea             blockq, [blockq+skipq*(mmsize/2)]
958     pxor                m0, m0
959 .loop_z:
960     mova   [ptrq+mmsize*0], m0
961     mova   [ptrq+mmsize*1], m0
962     mova   [ptrq+mmsize*2], m0
963     mova   [ptrq+mmsize*3], m0
964     add               ptrq, 4 * mmsize
965     dec              skipd
966     jg .loop_z
967 .end:
968
969     DEFINE_ARGS dst, stride, block, cnt, ptr, stride3, dstbak
970     lea           stride3q, [strideq*3]
971     mov               cntd, 2
972     mov               ptrq, rsp
973 .loop_2:
974     %4_1D             ptrq
975
976     pxor                m6, m6
977     PRELOAD              9, rsp+16*mmsize, max
978     ROUND_AND_STORE_4x4  0, 1, 2, 3, m6, reg_max, [pd_16], 5
979     lea               dstq, [dstq+strideq*4]
980     UNSCRATCH            0, 8, rsp+17*mmsize
981     ROUND_AND_STORE_4x4  4, 5, 0, 7, m6, reg_max, [pd_16], 5
982     add               ptrq, 16
983 %if ARCH_X86_64
984     lea               dstq, [dstbakq+8]
985 %else
986     mov               dstq, dstm
987     add               dstq, 8
988 %endif
989     dec               cntd
990     jg .loop_2
991
992     ; m6 is still zero
993     ZERO_BLOCK blockq-2*mmsize, 32, 8, m6
994     RET
995
996 cglobal vp9_%1_%3_8x8_add_12, 4, 6 + ARCH_X86_64, 16, \
997                               16 * mmsize + ARCH_X86_32 * 6 * mmsize, \
998                               dst, stride, block, eob
999     mova                m0, [pw_4095]
1000     jmp mangle(private_prefix %+ _ %+ vp9_%1_%3_8x8_add_10 %+ SUFFIX).body
1001 %endmacro
1002
1003 INIT_XMM sse2
1004 IADST8_FN idct,  IDCT8,  iadst, IADST8, row
1005 IADST8_FN iadst, IADST8, idct,  IDCT8,  col
1006 IADST8_FN iadst, IADST8, iadst, IADST8, default
1007
1008 %macro IDCT16_1D 1-4 4 * mmsize, 65, 67 ; src, src_stride, stack_offset, mm32bit_stack_offset
1009     IDCT8_1D            %1, %2 * 2, %4              ; m0-3=t0-3a, m4-5/m8|r67/m7=t4-7
1010     ; SCRATCH            6, 8, rsp+(%4+0)*mmsize    ; t6
1011     SCRATCH              0, 15, rsp+(%4+7)*mmsize   ; t0a
1012     SCRATCH              1, 14, rsp+(%4+6)*mmsize   ; t1a
1013     SCRATCH              2, 13, rsp+(%4+5)*mmsize   ; t2a
1014     SCRATCH              3, 12, rsp+(%4+4)*mmsize   ; t3a
1015     SCRATCH              4, 11, rsp+(%4+3)*mmsize   ; t4
1016     mova [rsp+(%3+0)*mmsize], m5                    ; t5
1017     mova [rsp+(%3+1)*mmsize], m7                    ; t7
1018
1019     mova                m0, [%1+ 1*%2]              ; in1
1020     mova                m3, [%1+ 7*%2]              ; in7
1021     mova                m4, [%1+ 9*%2]              ; in9
1022     mova                m7, [%1+15*%2]              ; in15
1023
1024     SUMSUB_MUL           0, 7, 1, 2, 16305,  1606   ; m0=t15a, m7=t8a
1025     SUMSUB_MUL           4, 3, 1, 2, 10394, 12665   ; m4=t14a, m3=t9a
1026     SUMSUB_BA         d, 3, 7, 1                    ; m3=t8, m7=t9
1027     SUMSUB_BA         d, 4, 0, 1                    ; m4=t15,m0=t14
1028     SUMSUB_MUL           0, 7, 1, 2, 15137,  6270   ; m0=t14a, m7=t9a
1029
1030     mova                m1, [%1+ 3*%2]              ; in3
1031     mova                m2, [%1+ 5*%2]              ; in5
1032     mova                m5, [%1+11*%2]              ; in11
1033     mova                m6, [%1+13*%2]              ; in13
1034
1035     SCRATCH              0,  9, rsp+(%4+1)*mmsize
1036     SCRATCH              7, 10, rsp+(%4+2)*mmsize
1037
1038     SUMSUB_MUL           2, 5, 0, 7, 14449,  7723   ; m2=t13a, m5=t10a
1039     SUMSUB_MUL           6, 1, 0, 7,  4756, 15679   ; m6=t12a, m1=t11a
1040     SUMSUB_BA         d, 5, 1, 0                    ; m5=t11,m1=t10
1041     SUMSUB_BA         d, 2, 6, 0                    ; m2=t12,m6=t13
1042     NEGD                m1                          ; m1=-t10
1043     SUMSUB_MUL           1, 6, 0, 7, 15137,  6270   ; m1=t13a, m6=t10a
1044
1045     UNSCRATCH            7, 10, rsp+(%4+2)*mmsize
1046     SUMSUB_BA         d, 5, 3, 0                    ; m5=t8a, m3=t11a
1047     SUMSUB_BA         d, 6, 7, 0                    ; m6=t9,  m7=t10
1048     SUMSUB_BA         d, 2, 4, 0                    ; m2=t15a,m4=t12a
1049     SCRATCH              5, 10, rsp+(%4+2)*mmsize
1050     SUMSUB_MUL           4, 3, 0, 5, 11585, 11585   ; m4=t12, m3=t11
1051     UNSCRATCH            0, 9, rsp+(%4+1)*mmsize
1052     SUMSUB_BA         d, 1, 0, 5                    ; m1=t14, m0=t13
1053     SCRATCH              6, 9, rsp+(%4+1)*mmsize
1054     SUMSUB_MUL           0, 7, 6, 5, 11585, 11585   ; m0=t13a,m7=t10a
1055
1056     ; order: 15|r74,14|r73,13|r72,12|r71,11|r70,r65,8|r67,r66,10|r69,9|r68,7,3,4,0,1,2
1057     ; free: 6,5
1058
1059     UNSCRATCH            5, 15, rsp+(%4+7)*mmsize
1060     SUMSUB_BA         d, 2, 5, 6                    ; m2=out0, m5=out15
1061     SCRATCH              5, 15, rsp+(%4+7)*mmsize
1062     UNSCRATCH            5, 14, rsp+(%4+6)*mmsize
1063     SUMSUB_BA         d, 1, 5, 6                    ; m1=out1, m5=out14
1064     SCRATCH              5, 14, rsp+(%4+6)*mmsize
1065     UNSCRATCH            5, 13, rsp+(%4+5)*mmsize
1066     SUMSUB_BA         d, 0, 5, 6                    ; m0=out2, m5=out13
1067     SCRATCH              5, 13, rsp+(%4+5)*mmsize
1068     UNSCRATCH            5, 12, rsp+(%4+4)*mmsize
1069     SUMSUB_BA         d, 4, 5, 6                    ; m4=out3, m5=out12
1070     SCRATCH              5, 12, rsp+(%4+4)*mmsize
1071     UNSCRATCH            5, 11, rsp+(%4+3)*mmsize
1072     SUMSUB_BA         d, 3, 5, 6                    ; m3=out4, m5=out11
1073     SCRATCH              4, 11, rsp+(%4+3)*mmsize
1074     mova                m4, [rsp+(%3+0)*mmsize]
1075     SUMSUB_BA         d, 7, 4, 6                    ; m7=out5, m4=out10
1076     mova [rsp+(%3+0)*mmsize], m5
1077     UNSCRATCH            5, 8, rsp+(%4+0)*mmsize
1078     UNSCRATCH            6, 9, rsp+(%4+1)*mmsize
1079     SCRATCH              2, 8, rsp+(%4+0)*mmsize
1080     SCRATCH              1, 9, rsp+(%4+1)*mmsize
1081     UNSCRATCH            1, 10, rsp+(%4+2)*mmsize
1082     SCRATCH              0, 10, rsp+(%4+2)*mmsize
1083     mova                m0, [rsp+(%3+1)*mmsize]
1084     SUMSUB_BA         d, 6, 5, 2                    ; m6=out6, m5=out9
1085     SUMSUB_BA         d, 1, 0, 2                    ; m1=out7, m0=out8
1086
1087     SWAP                 0, 3, 1, 7, 2, 6, 4
1088
1089     ; output order: 8-11|r67-70=out0-3
1090     ;               0-6,r65=out4-11
1091     ;               12-15|r71-74=out12-15
1092 %endmacro
1093
1094 INIT_XMM sse2
1095 cglobal vp9_idct_idct_16x16_add_10, 4, 6 + ARCH_X86_64, 16, \
1096                                     67 * mmsize + ARCH_X86_32 * 8 * mmsize, \
1097                                     dst, stride, block, eob
1098     mova                m0, [pw_1023]
1099     cmp               eobd, 1
1100     jg .idctfull
1101
1102     ; dc-only - the 10bit version can be done entirely in 32bit, since the max
1103     ; coef values are 17+sign bit, and the coef is 14bit, so 31+sign easily
1104     ; fits in 32bit
1105     DEFINE_ARGS dst, stride, block, coef
1106     pxor                m2, m2
1107     DC_ONLY              6, m2
1108     movd                m1, coefd
1109     pshuflw             m1, m1, q0000
1110     punpcklqdq          m1, m1
1111     DEFINE_ARGS dst, stride, cnt
1112     mov               cntd, 8
1113 .loop_dc:
1114     STORE_2x8            3, 4, 1, m2, m0, dstq,         mmsize
1115     STORE_2x8            3, 4, 1, m2, m0, dstq+strideq, mmsize
1116     lea               dstq, [dstq+strideq*2]
1117     dec               cntd
1118     jg .loop_dc
1119     RET
1120
1121 .idctfull:
1122     mova   [rsp+64*mmsize], m0
1123     DEFINE_ARGS dst, stride, block, cnt, ptr, skip, dstbak
1124 %if ARCH_X86_64
1125     mov            dstbakq, dstq
1126     movsxd            cntq, cntd
1127 %endif
1128 %ifdef PIC
1129     lea               ptrq, [default_16x16]
1130     movzx             cntd, byte [ptrq+cntq-1]
1131 %else
1132     movzx             cntd, byte [default_16x16+cntq-1]
1133 %endif
1134     mov              skipd, 4
1135     sub              skipd, cntd
1136     mov               ptrq, rsp
1137 .loop_1:
1138     IDCT16_1D       blockq
1139
1140     TRANSPOSE4x4D        0, 1, 2, 3, 7
1141     mova  [ptrq+ 1*mmsize], m0
1142     mova  [ptrq+ 5*mmsize], m1
1143     mova  [ptrq+ 9*mmsize], m2
1144     mova  [ptrq+13*mmsize], m3
1145     mova                m7, [rsp+65*mmsize]
1146     TRANSPOSE4x4D        4, 5, 6, 7, 0
1147     mova  [ptrq+ 2*mmsize], m4
1148     mova  [ptrq+ 6*mmsize], m5
1149     mova  [ptrq+10*mmsize], m6
1150     mova  [ptrq+14*mmsize], m7
1151     UNSCRATCH               0, 8, rsp+67*mmsize
1152     UNSCRATCH               1, 9, rsp+68*mmsize
1153     UNSCRATCH               2, 10, rsp+69*mmsize
1154     UNSCRATCH               3, 11, rsp+70*mmsize
1155     TRANSPOSE4x4D        0, 1, 2, 3, 7
1156     mova  [ptrq+ 0*mmsize], m0
1157     mova  [ptrq+ 4*mmsize], m1
1158     mova  [ptrq+ 8*mmsize], m2
1159     mova  [ptrq+12*mmsize], m3
1160     UNSCRATCH               4, 12, rsp+71*mmsize
1161     UNSCRATCH               5, 13, rsp+72*mmsize
1162     UNSCRATCH               6, 14, rsp+73*mmsize
1163     UNSCRATCH               7, 15, rsp+74*mmsize
1164     TRANSPOSE4x4D        4, 5, 6, 7, 0
1165     mova  [ptrq+ 3*mmsize], m4
1166     mova  [ptrq+ 7*mmsize], m5
1167     mova  [ptrq+11*mmsize], m6
1168     mova  [ptrq+15*mmsize], m7
1169     add               ptrq, 16 * mmsize
1170     add             blockq, mmsize
1171     dec               cntd
1172     jg .loop_1
1173
1174     ; zero-pad the remainder (skipped cols)
1175     test             skipd, skipd
1176     jz .end
1177     add              skipd, skipd
1178     lea             blockq, [blockq+skipq*(mmsize/2)]
1179     pxor                m0, m0
1180 .loop_z:
1181     mova   [ptrq+mmsize*0], m0
1182     mova   [ptrq+mmsize*1], m0
1183     mova   [ptrq+mmsize*2], m0
1184     mova   [ptrq+mmsize*3], m0
1185     mova   [ptrq+mmsize*4], m0
1186     mova   [ptrq+mmsize*5], m0
1187     mova   [ptrq+mmsize*6], m0
1188     mova   [ptrq+mmsize*7], m0
1189     add               ptrq, 8 * mmsize
1190     dec              skipd
1191     jg .loop_z
1192 .end:
1193
1194     DEFINE_ARGS dst, stride, block, cnt, ptr, stride3, dstbak
1195     lea           stride3q, [strideq*3]
1196     mov               cntd, 4
1197     mov               ptrq, rsp
1198 .loop_2:
1199     IDCT16_1D         ptrq
1200
1201     pxor               m7, m7
1202     lea               dstq, [dstq+strideq*4]
1203     ROUND_AND_STORE_4x4  0, 1, 2, 3, m7, [rsp+64*mmsize], [pd_32], 6
1204     lea               dstq, [dstq+strideq*4]
1205     mova                m0, [rsp+65*mmsize]
1206     ROUND_AND_STORE_4x4  4, 5, 6, 0, m7, [rsp+64*mmsize], [pd_32], 6
1207
1208 %if ARCH_X86_64
1209     DEFINE_ARGS dstbak, stride, block, cnt, ptr, stride3, dst
1210 %else
1211     mov               dstq, dstm
1212 %endif
1213     UNSCRATCH               0, 8, rsp+67*mmsize
1214     UNSCRATCH               1, 9, rsp+68*mmsize
1215     UNSCRATCH               2, 10, rsp+69*mmsize
1216     UNSCRATCH               3, 11, rsp+70*mmsize
1217     ROUND_AND_STORE_4x4  0, 1, 2, 3, m7, [rsp+64*mmsize], [pd_32], 6
1218 %if ARCH_X86_64
1219     DEFINE_ARGS dst, stride, block, cnt, ptr, stride3, dstbak
1220     lea               dstq, [dstbakq+stride3q*4]
1221 %else
1222     lea               dstq, [dstq+stride3q*4]
1223 %endif
1224     UNSCRATCH               4, 12, rsp+71*mmsize
1225     UNSCRATCH               5, 13, rsp+72*mmsize
1226     UNSCRATCH               6, 14, rsp+73*mmsize
1227     UNSCRATCH               0, 15, rsp+74*mmsize
1228     ROUND_AND_STORE_4x4  4, 5, 6, 0, m7, [rsp+64*mmsize], [pd_32], 6
1229
1230     add               ptrq, mmsize
1231 %if ARCH_X86_64
1232     add            dstbakq, 8
1233     mov               dstq, dstbakq
1234 %else
1235     add         dword dstm, 8
1236     mov               dstq, dstm
1237 %endif
1238     dec               cntd
1239     jg .loop_2
1240
1241     ; m7 is still zero
1242     ZERO_BLOCK blockq-4*mmsize, 64, 16, m7
1243     RET
1244
1245 INIT_XMM sse2
1246 cglobal vp9_idct_idct_16x16_add_12, 4, 6 + ARCH_X86_64, 16, \
1247                                     67 * mmsize + ARCH_X86_32 * 8 * mmsize, \
1248                                     dst, stride, block, eob
1249     mova                m0, [pw_4095]
1250     cmp               eobd, 1
1251     jg mangle(private_prefix %+ _ %+ vp9_idct_idct_16x16_add_10 %+ SUFFIX).idctfull
1252
1253     ; dc-only - unfortunately, this one can overflow, since coefs are 19+sign
1254     ; bpp, and 19+14+sign does not fit in 32bit, so we do 2-stage multiplies
1255     DEFINE_ARGS dst, stride, block, coef, coefl
1256     pxor                m2, m2
1257     DC_ONLY_64BIT        6, m2
1258     movd                m1, coefd
1259     pshuflw             m1, m1, q0000
1260     punpcklqdq          m1, m1
1261     DEFINE_ARGS dst, stride, cnt
1262     mov               cntd, 8
1263 .loop_dc:
1264     STORE_2x8            3, 4, 1, m2, m0, dstq,         mmsize
1265     STORE_2x8            3, 4, 1, m2, m0, dstq+strideq, mmsize
1266     lea               dstq, [dstq+strideq*2]
1267     dec               cntd
1268     jg .loop_dc
1269     RET
1270
1271 ; r65-69 are available for spills
1272 ; r70-77 are available on x86-32 only (x86-64 should use m8-15)
1273 ; output should be in m8-11|r70-73, m0-6,r65 and m12-15|r74-77
1274 %macro IADST16_1D 1 ; src
1275     mova                m0, [%1+ 0*4*mmsize]        ; in0
1276     mova                m1, [%1+ 7*4*mmsize]        ; in7
1277     mova                m2, [%1+ 8*4*mmsize]        ; in8
1278     mova                m3, [%1+15*4*mmsize]        ; in15
1279     SUMSUB_MUL_D         3, 0, 4, 5, 16364,  804    ; m3/4=t0, m0/5=t1
1280     SUMSUB_MUL_D         1, 2, 6, 7, 11003, 12140   ; m1/6=t8, m2/7=t9
1281     SCRATCH              0, 8, rsp+70*mmsize
1282     SUMSUB_PACK_D        1, 3, 6, 4, 0              ; m1=t0a, m3=t8a
1283     UNSCRATCH            0, 8, rsp+70*mmsize
1284     SUMSUB_PACK_D        2, 0, 7, 5, 4              ; m2=t1a, m0=t9a
1285     mova   [rsp+67*mmsize], m1
1286     SCRATCH              2, 9, rsp+71*mmsize
1287     SCRATCH              3, 12, rsp+74*mmsize
1288     SCRATCH              0, 13, rsp+75*mmsize
1289
1290     mova                m0, [%1+ 3*4*mmsize]        ; in3
1291     mova                m1, [%1+ 4*4*mmsize]        ; in4
1292     mova                m2, [%1+11*4*mmsize]        ; in11
1293     mova                m3, [%1+12*4*mmsize]        ; in12
1294     SUMSUB_MUL_D         2, 1, 4, 5, 14811,  7005   ; m2/4=t4, m1/5=t5
1295     SUMSUB_MUL_D         0, 3, 6, 7,  5520, 15426   ; m0/6=t12, m3/7=t13
1296     SCRATCH              1, 10, rsp+72*mmsize
1297     SUMSUB_PACK_D        0, 2, 6, 4, 1              ; m0=t4a, m2=t12a
1298     UNSCRATCH            1, 10, rsp+72*mmsize
1299     SUMSUB_PACK_D        3, 1, 7, 5, 4              ; m3=t5a, m1=t13a
1300     SCRATCH              0, 15, rsp+77*mmsize
1301     SCRATCH              3, 11, rsp+73*mmsize
1302
1303     UNSCRATCH            0, 12, rsp+74*mmsize       ; t8a
1304     UNSCRATCH            3, 13, rsp+75*mmsize       ; t9a
1305     SUMSUB_MUL_D         0, 3, 4, 5, 16069,  3196   ; m0/4=t8, m3/5=t9
1306     SUMSUB_MUL_D         1, 2, 6, 7,  3196, 16069   ; m1/6=t13, m2/7=t12
1307     SCRATCH              1, 12, rsp+74*mmsize
1308     SUMSUB_PACK_D        2, 0, 7, 4, 1              ; m2=t8a, m0=t12a
1309     UNSCRATCH            1, 12, rsp+74*mmsize
1310     SUMSUB_PACK_D        1, 3, 6, 5, 4              ; m1=t9a, m3=t13a
1311     mova   [rsp+65*mmsize], m2
1312     mova   [rsp+66*mmsize], m1
1313     SCRATCH              0, 8, rsp+70*mmsize
1314     SCRATCH              3, 12, rsp+74*mmsize
1315
1316     mova                m0, [%1+ 2*4*mmsize]        ; in2
1317     mova                m1, [%1+ 5*4*mmsize]        ; in5
1318     mova                m2, [%1+10*4*mmsize]        ; in10
1319     mova                m3, [%1+13*4*mmsize]        ; in13
1320     SUMSUB_MUL_D         3, 0, 4, 5, 15893,  3981   ; m3/4=t2, m0/5=t3
1321     SUMSUB_MUL_D         1, 2, 6, 7,  8423, 14053   ; m1/6=t10, m2/7=t11
1322     SCRATCH              0, 10, rsp+72*mmsize
1323     SUMSUB_PACK_D        1, 3, 6, 4, 0              ; m1=t2a, m3=t10a
1324     UNSCRATCH            0, 10, rsp+72*mmsize
1325     SUMSUB_PACK_D        2, 0, 7, 5, 4              ; m2=t3a, m0=t11a
1326     mova   [rsp+68*mmsize], m1
1327     mova   [rsp+69*mmsize], m2
1328     SCRATCH              3, 13, rsp+75*mmsize
1329     SCRATCH              0, 14, rsp+76*mmsize
1330
1331     mova                m0, [%1+ 1*4*mmsize]        ; in1
1332     mova                m1, [%1+ 6*4*mmsize]        ; in6
1333     mova                m2, [%1+ 9*4*mmsize]        ; in9
1334     mova                m3, [%1+14*4*mmsize]        ; in14
1335     SUMSUB_MUL_D         2, 1, 4, 5, 13160,  9760   ; m2/4=t6, m1/5=t7
1336     SUMSUB_MUL_D         0, 3, 6, 7,  2404, 16207   ; m0/6=t14, m3/7=t15
1337     SCRATCH              1, 10, rsp+72*mmsize
1338     SUMSUB_PACK_D        0, 2, 6, 4, 1              ; m0=t6a, m2=t14a
1339     UNSCRATCH            1, 10, rsp+72*mmsize
1340     SUMSUB_PACK_D        3, 1, 7, 5, 4              ; m3=t7a, m1=t15a
1341
1342     UNSCRATCH            4, 13, rsp+75*mmsize       ; t10a
1343     UNSCRATCH            5, 14, rsp+76*mmsize       ; t11a
1344     SCRATCH              0, 13, rsp+75*mmsize
1345     SCRATCH              3, 14, rsp+76*mmsize
1346     SUMSUB_MUL_D         4, 5, 6, 7,  9102, 13623   ; m4/6=t10, m5/7=t11
1347     SUMSUB_MUL_D         1, 2, 0, 3, 13623,  9102   ; m1/0=t15, m2/3=t14
1348     SCRATCH              0, 10, rsp+72*mmsize
1349     SUMSUB_PACK_D        2, 4, 3, 6, 0              ; m2=t10a, m4=t14a
1350     UNSCRATCH            0, 10, rsp+72*mmsize
1351     SUMSUB_PACK_D        1, 5, 0, 7, 6              ; m1=t11a, m5=t15a
1352
1353     UNSCRATCH            0, 8, rsp+70*mmsize        ; t12a
1354     UNSCRATCH            3, 12, rsp+74*mmsize       ; t13a
1355     SCRATCH              2, 8, rsp+70*mmsize
1356     SCRATCH              1, 12, rsp+74*mmsize
1357     SUMSUB_MUL_D         0, 3, 1, 2, 15137,  6270   ; m0/1=t12, m3/2=t13
1358     SUMSUB_MUL_D         5, 4, 7, 6,  6270, 15137   ; m5/7=t15, m4/6=t14
1359     SCRATCH              2, 10, rsp+72*mmsize
1360     SUMSUB_PACK_D        4, 0, 6, 1, 2              ; m4=out2, m0=t14a
1361     UNSCRATCH            2, 10, rsp+72*mmsize
1362     SUMSUB_PACK_D        5, 3, 7, 2, 1              ; m5=-out13, m3=t15a
1363     NEGD                m5                          ; m5=out13
1364
1365     UNSCRATCH            1, 9, rsp+71*mmsize        ; t1a
1366     mova                m2, [rsp+68*mmsize]         ; t2a
1367     UNSCRATCH            6, 13, rsp+75*mmsize       ; t6a
1368     UNSCRATCH            7, 14, rsp+76*mmsize       ; t7a
1369     SCRATCH              4, 10, rsp+72*mmsize
1370     SCRATCH              5, 13, rsp+75*mmsize
1371     UNSCRATCH            4, 15, rsp+77*mmsize       ; t4a
1372     UNSCRATCH            5, 11, rsp+73*mmsize       ; t5a
1373     SCRATCH              0, 14, rsp+76*mmsize
1374     SCRATCH              3, 15, rsp+77*mmsize
1375     mova                m0, [rsp+67*mmsize]         ; t0a
1376     SUMSUB_BA         d, 4, 0, 3                    ; m4=t0, m0=t4
1377     SUMSUB_BA         d, 5, 1, 3                    ; m5=t1, m1=t5
1378     SUMSUB_BA         d, 6, 2, 3                    ; m6=t2, m2=t6
1379     SCRATCH              4, 9, rsp+71*mmsize
1380     mova                m3, [rsp+69*mmsize]         ; t3a
1381     SUMSUB_BA         d, 7, 3, 4                    ; m7=t3, m3=t7
1382
1383     mova   [rsp+67*mmsize], m5
1384     mova   [rsp+68*mmsize], m6
1385     mova   [rsp+69*mmsize], m7
1386     SUMSUB_MUL_D         0, 1, 4, 5, 15137,  6270   ; m0/4=t4a, m1/5=t5a
1387     SUMSUB_MUL_D         3, 2, 7, 6,  6270, 15137   ; m3/7=t7a, m2/6=t6a
1388     SCRATCH              1, 11, rsp+73*mmsize
1389     SUMSUB_PACK_D        2, 0, 6, 4, 1              ; m2=-out3, m0=t6
1390     NEGD                m2                          ; m2=out3
1391     UNSCRATCH            1, 11, rsp+73*mmsize
1392     SUMSUB_PACK_D        3, 1, 7, 5, 4              ; m3=out12, m1=t7
1393     SCRATCH              2, 11, rsp+73*mmsize
1394     UNSCRATCH            2, 12, rsp+74*mmsize       ; t11a
1395     SCRATCH              3, 12, rsp+74*mmsize
1396
1397     UNSCRATCH            3, 8, rsp+70*mmsize        ; t10a
1398     mova                m4, [rsp+65*mmsize]         ; t8a
1399     mova                m5, [rsp+66*mmsize]         ; t9a
1400     SUMSUB_BA         d, 3, 4, 6                    ; m3=-out1, m4=t10
1401     NEGD                m3                          ; m3=out1
1402     SUMSUB_BA         d, 2, 5, 6                    ; m2=out14, m5=t11
1403     UNSCRATCH            6, 9, rsp+71*mmsize        ; t0
1404     UNSCRATCH            7, 14, rsp+76*mmsize       ; t14a
1405     SCRATCH              3, 9, rsp+71*mmsize
1406     SCRATCH              2, 14, rsp+76*mmsize
1407
1408     SUMSUB_MUL           1, 0, 2, 3, 11585, 11585   ; m1=out4, m0=out11
1409     mova   [rsp+65*mmsize], m0
1410     SUMSUB_MUL           5, 4, 2, 3, 11585, 11585   ; m5=out6, m4=out9
1411     UNSCRATCH            0, 15, rsp+77*mmsize       ; t15a
1412     SUMSUB_MUL           7, 0, 2, 3, 11585, m11585  ; m7=out10, m0=out5
1413
1414     mova                m2, [rsp+68*mmsize]         ; t2
1415     SUMSUB_BA         d, 2, 6, 3                    ; m2=out0, m6=t2a
1416     SCRATCH              2, 8, rsp+70*mmsize
1417     mova                m2, [rsp+67*mmsize]         ; t1
1418     mova                m3, [rsp+69*mmsize]         ; t3
1419     mova   [rsp+67*mmsize], m7
1420     SUMSUB_BA         d, 3, 2, 7                    ; m3=-out15, m2=t3a
1421     NEGD                m3                          ; m3=out15
1422     SCRATCH              3, 15, rsp+77*mmsize
1423     SUMSUB_MUL           6, 2, 7, 3, 11585, m11585  ; m6=out8, m2=out7
1424     mova                m7, [rsp+67*mmsize]
1425
1426     SWAP                 0, 1
1427     SWAP                 2, 5, 4, 6, 7, 3
1428 %endmacro
1429
1430 %macro IADST16_FN 7
1431 cglobal vp9_%1_%4_16x16_add_10, 4, 6 + ARCH_X86_64, 16, \
1432                                 70 * mmsize + ARCH_X86_32 * 8 * mmsize, \
1433                                 dst, stride, block, eob
1434     mova                m0, [pw_1023]
1435
1436 .body:
1437     mova   [rsp+64*mmsize], m0
1438     DEFINE_ARGS dst, stride, block, cnt, ptr, skip, dstbak
1439 %if ARCH_X86_64
1440     mov            dstbakq, dstq
1441     movsxd            cntq, cntd
1442 %endif
1443 %ifdef PIC
1444     lea               ptrq, [%7_16x16]
1445     movzx             cntd, byte [ptrq+cntq-1]
1446 %else
1447     movzx             cntd, byte [%7_16x16+cntq-1]
1448 %endif
1449     mov              skipd, 4
1450     sub              skipd, cntd
1451     mov               ptrq, rsp
1452 .loop_1:
1453     %2_1D           blockq
1454
1455     TRANSPOSE4x4D        0, 1, 2, 3, 7
1456     mova  [ptrq+ 1*mmsize], m0
1457     mova  [ptrq+ 5*mmsize], m1
1458     mova  [ptrq+ 9*mmsize], m2
1459     mova  [ptrq+13*mmsize], m3
1460     mova                m7, [rsp+65*mmsize]
1461     TRANSPOSE4x4D        4, 5, 6, 7, 0
1462     mova  [ptrq+ 2*mmsize], m4
1463     mova  [ptrq+ 6*mmsize], m5
1464     mova  [ptrq+10*mmsize], m6
1465     mova  [ptrq+14*mmsize], m7
1466     UNSCRATCH               0, 8, rsp+(%3+0)*mmsize
1467     UNSCRATCH               1, 9, rsp+(%3+1)*mmsize
1468     UNSCRATCH               2, 10, rsp+(%3+2)*mmsize
1469     UNSCRATCH               3, 11, rsp+(%3+3)*mmsize
1470     TRANSPOSE4x4D        0, 1, 2, 3, 7
1471     mova  [ptrq+ 0*mmsize], m0
1472     mova  [ptrq+ 4*mmsize], m1
1473     mova  [ptrq+ 8*mmsize], m2
1474     mova  [ptrq+12*mmsize], m3
1475     UNSCRATCH               4, 12, rsp+(%3+4)*mmsize
1476     UNSCRATCH               5, 13, rsp+(%3+5)*mmsize
1477     UNSCRATCH               6, 14, rsp+(%3+6)*mmsize
1478     UNSCRATCH               7, 15, rsp+(%3+7)*mmsize
1479     TRANSPOSE4x4D        4, 5, 6, 7, 0
1480     mova  [ptrq+ 3*mmsize], m4
1481     mova  [ptrq+ 7*mmsize], m5
1482     mova  [ptrq+11*mmsize], m6
1483     mova  [ptrq+15*mmsize], m7
1484     add               ptrq, 16 * mmsize
1485     add             blockq, mmsize
1486     dec               cntd
1487     jg .loop_1
1488
1489     ; zero-pad the remainder (skipped cols)
1490     test             skipd, skipd
1491     jz .end
1492     add              skipd, skipd
1493     lea             blockq, [blockq+skipq*(mmsize/2)]
1494     pxor                m0, m0
1495 .loop_z:
1496     mova   [ptrq+mmsize*0], m0
1497     mova   [ptrq+mmsize*1], m0
1498     mova   [ptrq+mmsize*2], m0
1499     mova   [ptrq+mmsize*3], m0
1500     mova   [ptrq+mmsize*4], m0
1501     mova   [ptrq+mmsize*5], m0
1502     mova   [ptrq+mmsize*6], m0
1503     mova   [ptrq+mmsize*7], m0
1504     add               ptrq, 8 * mmsize
1505     dec              skipd
1506     jg .loop_z
1507 .end:
1508
1509     DEFINE_ARGS dst, stride, block, cnt, ptr, stride3, dstbak
1510     lea           stride3q, [strideq*3]
1511     mov               cntd, 4
1512     mov               ptrq, rsp
1513 .loop_2:
1514     %5_1D             ptrq
1515
1516     pxor                m7, m7
1517     lea               dstq, [dstq+strideq*4]
1518     ROUND_AND_STORE_4x4  0, 1, 2, 3, m7, [rsp+64*mmsize], [pd_32], 6
1519     lea               dstq, [dstq+strideq*4]
1520     mova                m0, [rsp+65*mmsize]
1521     ROUND_AND_STORE_4x4  4, 5, 6, 0, m7, [rsp+64*mmsize], [pd_32], 6
1522
1523 %if ARCH_X86_64
1524     DEFINE_ARGS dstbak, stride, block, cnt, ptr, stride3, dst
1525 %else
1526     mov               dstq, dstm
1527 %endif
1528     UNSCRATCH               0, 8, rsp+(%6+0)*mmsize
1529     UNSCRATCH               1, 9, rsp+(%6+1)*mmsize
1530     UNSCRATCH               2, 10, rsp+(%6+2)*mmsize
1531     UNSCRATCH               3, 11, rsp+(%6+3)*mmsize
1532     ROUND_AND_STORE_4x4  0, 1, 2, 3, m7, [rsp+64*mmsize], [pd_32], 6
1533 %if ARCH_X86_64
1534     DEFINE_ARGS dst, stride, block, cnt, ptr, stride3, dstbak
1535     lea               dstq, [dstbakq+stride3q*4]
1536 %else
1537     lea               dstq, [dstq+stride3q*4]
1538 %endif
1539     UNSCRATCH               4, 12, rsp+(%6+4)*mmsize
1540     UNSCRATCH               5, 13, rsp+(%6+5)*mmsize
1541     UNSCRATCH               6, 14, rsp+(%6+6)*mmsize
1542     UNSCRATCH               0, 15, rsp+(%6+7)*mmsize
1543     ROUND_AND_STORE_4x4  4, 5, 6, 0, m7, [rsp+64*mmsize], [pd_32], 6
1544
1545     add               ptrq, mmsize
1546 %if ARCH_X86_64
1547     add            dstbakq, 8
1548     mov               dstq, dstbakq
1549 %else
1550     add         dword dstm, 8
1551     mov               dstq, dstm
1552 %endif
1553     dec               cntd
1554     jg .loop_2
1555
1556     ; m7 is still zero
1557     ZERO_BLOCK blockq-4*mmsize, 64, 16, m7
1558     RET
1559
1560 cglobal vp9_%1_%4_16x16_add_12, 4, 6 + ARCH_X86_64, 16, \
1561                                 70 * mmsize + ARCH_X86_32 * 8 * mmsize, \
1562                                 dst, stride, block, eob
1563     mova                m0, [pw_4095]
1564     jmp mangle(private_prefix %+ _ %+ vp9_%1_%4_16x16_add_10 %+ SUFFIX).body
1565 %endmacro
1566
1567 INIT_XMM sse2
1568 IADST16_FN idct,  IDCT16,  67, iadst, IADST16, 70, row
1569 IADST16_FN iadst, IADST16, 70, idct,  IDCT16,  67, col
1570 IADST16_FN iadst, IADST16, 70, iadst, IADST16, 70, default
1571
1572 %macro IDCT32_1D 2-3 8 * mmsize; pass[1/2], src, src_stride
1573     IDCT16_1D %2, 2 * %3, 272, 257
1574 %if ARCH_X86_64
1575     mova  [rsp+257*mmsize], m8
1576     mova  [rsp+258*mmsize], m9
1577     mova  [rsp+259*mmsize], m10
1578     mova  [rsp+260*mmsize], m11
1579     mova  [rsp+261*mmsize], m12
1580     mova  [rsp+262*mmsize], m13
1581     mova  [rsp+263*mmsize], m14
1582     mova  [rsp+264*mmsize], m15
1583 %endif
1584     mova  [rsp+265*mmsize], m0
1585     mova  [rsp+266*mmsize], m1
1586     mova  [rsp+267*mmsize], m2
1587     mova  [rsp+268*mmsize], m3
1588     mova  [rsp+269*mmsize], m4
1589     mova  [rsp+270*mmsize], m5
1590     mova  [rsp+271*mmsize], m6
1591
1592     ; r257-260: t0-3
1593     ; r265-272: t4/5a/6a/7/8/9a/10/11a
1594     ; r261-264: t12a/13/14a/15
1595     ; r273-274 is free as scratch space, and 275-282 mirrors m8-15 on 32bit
1596
1597     mova                m0, [%2+ 1*%3]              ; in1
1598     mova                m1, [%2+15*%3]              ; in15
1599     mova                m2, [%2+17*%3]              ; in17
1600     mova                m3, [%2+31*%3]              ; in31
1601     SUMSUB_MUL           0, 3, 4, 5, 16364,  804    ; m0=t31a, m3=t16a
1602     SUMSUB_MUL           2, 1, 4, 5, 11003, 12140   ; m2=t30a, m1=t17a
1603     SUMSUB_BA         d, 1, 3, 4                    ; m1=t16, m3=t17
1604     SUMSUB_BA         d, 2, 0, 4                    ; m2=t31, m0=t30
1605     SUMSUB_MUL           0, 3, 4, 5, 16069,  3196   ; m0=t30a, m3=t17a
1606     SCRATCH              0, 8, rsp+275*mmsize
1607     SCRATCH              2, 9, rsp+276*mmsize
1608
1609     ; end of stage 1-3 first quart
1610
1611     mova                m0, [%2+ 7*%3]              ; in7
1612     mova                m2, [%2+ 9*%3]              ; in9
1613     mova                m4, [%2+23*%3]              ; in23
1614     mova                m5, [%2+25*%3]              ; in25
1615     SUMSUB_MUL           2, 4, 6, 7, 14811,  7005   ; m2=t29a, m4=t18a
1616     SUMSUB_MUL           5, 0, 6, 7,  5520, 15426   ; m5=t28a, m0=t19a
1617     SUMSUB_BA         d, 4, 0, 6                    ; m4=t19, m0=t18
1618     SUMSUB_BA         d, 2, 5, 6                    ; m2=t28, m5=t29
1619     SUMSUB_MUL           5, 0, 6, 7,  3196, m16069  ; m5=t29a, m0=t18a
1620
1621     ; end of stage 1-3 second quart
1622
1623     SUMSUB_BA         d, 4, 1, 6                    ; m4=t16a, m1=t19a
1624     SUMSUB_BA         d, 0, 3, 6                    ; m0=t17, m3=t18
1625     UNSCRATCH            6, 8, rsp+275*mmsize       ; t30a
1626     UNSCRATCH            7, 9, rsp+276*mmsize       ; t31
1627     mova  [rsp+273*mmsize], m4
1628     mova  [rsp+274*mmsize], m0
1629     SUMSUB_BA         d, 2, 7, 0                    ; m2=t31a, m7=t28a
1630     SUMSUB_BA         d, 5, 6, 0                    ; m5=t30, m6=t29
1631     SUMSUB_MUL           6, 3, 0, 4, 15137,  6270   ; m6=t29a, m3=t18a
1632     SUMSUB_MUL           7, 1, 0, 4, 15137,  6270   ; m7=t28, m1=t19
1633     SCRATCH              3, 10, rsp+277*mmsize
1634     SCRATCH              1, 11, rsp+278*mmsize
1635     SCRATCH              7, 12, rsp+279*mmsize
1636     SCRATCH              6, 13, rsp+280*mmsize
1637     SCRATCH              5, 14, rsp+281*mmsize
1638     SCRATCH              2, 15, rsp+282*mmsize
1639
1640     ; end of stage 4-5 first half
1641
1642     mova                m0, [%2+ 5*%3]              ; in5
1643     mova                m1, [%2+11*%3]              ; in11
1644     mova                m2, [%2+21*%3]              ; in21
1645     mova                m3, [%2+27*%3]              ; in27
1646     SUMSUB_MUL           0, 3, 4, 5, 15893,  3981   ; m0=t27a, m3=t20a
1647     SUMSUB_MUL           2, 1, 4, 5,  8423, 14053   ; m2=t26a, m1=t21a
1648     SUMSUB_BA         d, 1, 3, 4                    ; m1=t20, m3=t21
1649     SUMSUB_BA         d, 2, 0, 4                    ; m2=t27, m0=t26
1650     SUMSUB_MUL           0, 3, 4, 5,  9102, 13623   ; m0=t26a, m3=t21a
1651     SCRATCH              0, 8, rsp+275*mmsize
1652     SCRATCH              2, 9, rsp+276*mmsize
1653
1654     ; end of stage 1-3 third quart
1655
1656     mova                m0, [%2+ 3*%3]              ; in3
1657     mova                m2, [%2+13*%3]              ; in13
1658     mova                m4, [%2+19*%3]              ; in19
1659     mova                m5, [%2+29*%3]              ; in29
1660     SUMSUB_MUL           2, 4, 6, 7, 13160,  9760   ; m2=t25a, m4=t22a
1661     SUMSUB_MUL           5, 0, 6, 7,  2404, 16207   ; m5=t24a, m0=t23a
1662     SUMSUB_BA         d, 4, 0, 6                    ; m4=t23, m0=t22
1663     SUMSUB_BA         d, 2, 5, 6                    ; m2=t24, m5=t25
1664     SUMSUB_MUL           5, 0, 6, 7, 13623, m9102   ; m5=t25a, m0=t22a
1665
1666     ; end of stage 1-3 fourth quart
1667
1668     SUMSUB_BA         d, 1, 4, 6                    ; m1=t23a, m4=t20a
1669     SUMSUB_BA         d, 3, 0, 6                    ; m3=t22, m0=t21
1670     UNSCRATCH            6, 8, rsp+275*mmsize       ; t26a
1671     UNSCRATCH            7, 9, rsp+276*mmsize       ; t27
1672     SCRATCH              3, 8, rsp+275*mmsize
1673     SCRATCH              1, 9, rsp+276*mmsize
1674     SUMSUB_BA         d, 7, 2, 1                    ; m7=t24a, m2=t27a
1675     SUMSUB_BA         d, 6, 5, 1                    ; m6=t25, m5=t26
1676     SUMSUB_MUL           2, 4, 1, 3,  6270, m15137  ; m2=t27, m4=t20
1677     SUMSUB_MUL           5, 0, 1, 3,  6270, m15137  ; m5=t26a, m0=t21a
1678
1679     ; end of stage 4-5 second half
1680
1681     UNSCRATCH            1, 12, rsp+279*mmsize      ; t28
1682     UNSCRATCH            3, 13, rsp+280*mmsize      ; t29a
1683     SCRATCH              4, 12, rsp+279*mmsize
1684     SCRATCH              0, 13, rsp+280*mmsize
1685     SUMSUB_BA         d, 5, 3, 0                    ; m5=t29, m3=t26
1686     SUMSUB_BA         d, 2, 1, 0                    ; m2=t28a, m1=t27a
1687     UNSCRATCH            0, 14, rsp+281*mmsize      ; t30
1688     UNSCRATCH            4, 15, rsp+282*mmsize      ; t31a
1689     SCRATCH              2, 14, rsp+281*mmsize
1690     SCRATCH              5, 15, rsp+282*mmsize
1691     SUMSUB_BA         d, 6, 0, 2                    ; m6=t30a, m0=t25a
1692     SUMSUB_BA         d, 7, 4, 2                    ; m7=t31, m4=t24
1693
1694     mova                m2, [rsp+273*mmsize]        ; t16a
1695     mova                m5, [rsp+274*mmsize]        ; t17
1696     mova  [rsp+273*mmsize], m6
1697     mova  [rsp+274*mmsize], m7
1698     UNSCRATCH            6, 10, rsp+277*mmsize      ; t18a
1699     UNSCRATCH            7, 11, rsp+278*mmsize      ; t19
1700     SCRATCH              4, 10, rsp+277*mmsize
1701     SCRATCH              0, 11, rsp+278*mmsize
1702     UNSCRATCH            4, 12, rsp+279*mmsize      ; t20
1703     UNSCRATCH            0, 13, rsp+280*mmsize      ; t21a
1704     SCRATCH              3, 12, rsp+279*mmsize
1705     SCRATCH              1, 13, rsp+280*mmsize
1706     SUMSUB_BA         d, 0, 6, 1                    ; m0=t18, m6=t21
1707     SUMSUB_BA         d, 4, 7, 1                    ; m4=t19a, m7=t20a
1708     UNSCRATCH            3, 8, rsp+275*mmsize       ; t22
1709     UNSCRATCH            1, 9, rsp+276*mmsize       ; t23a
1710     SCRATCH              0, 8, rsp+275*mmsize
1711     SCRATCH              4, 9, rsp+276*mmsize
1712     SUMSUB_BA         d, 3, 5, 0                    ; m3=t17a, m5=t22a
1713     SUMSUB_BA         d, 1, 2, 0                    ; m1=t16, m2=t23
1714
1715     ; end of stage 6
1716
1717     UNSCRATCH            0, 10, rsp+277*mmsize      ; t24
1718     UNSCRATCH            4, 11, rsp+278*mmsize      ; t25a
1719     SCRATCH              1, 10, rsp+277*mmsize
1720     SCRATCH              3, 11, rsp+278*mmsize
1721     SUMSUB_MUL           0, 2, 1, 3, 11585, 11585   ; m0=t24a, m2=t23a
1722     SUMSUB_MUL           4, 5, 1, 3, 11585, 11585   ; m4=t25, m5=t22
1723     UNSCRATCH            1, 12, rsp+279*mmsize      ; t26
1724     UNSCRATCH            3, 13, rsp+280*mmsize      ; t27a
1725     SCRATCH              0, 12, rsp+279*mmsize
1726     SCRATCH              4, 13, rsp+280*mmsize
1727     SUMSUB_MUL           3, 7, 0, 4, 11585, 11585   ; m3=t27, m7=t20
1728     SUMSUB_MUL           1, 6, 0, 4, 11585, 11585   ; m1=t26a, m6=t21a
1729
1730     ; end of stage 7
1731
1732     mova                m0, [rsp+269*mmsize]        ; t8
1733     mova                m4, [rsp+270*mmsize]        ; t9a
1734     mova  [rsp+269*mmsize], m1                      ; t26a
1735     mova  [rsp+270*mmsize], m3                      ; t27
1736     mova                m3, [rsp+271*mmsize]        ; t10
1737     SUMSUB_BA         d, 2, 0, 1                    ; m2=out8, m0=out23
1738     SUMSUB_BA         d, 5, 4, 1                    ; m5=out9, m4=out22
1739     SUMSUB_BA         d, 6, 3, 1                    ; m6=out10, m3=out21
1740     mova                m1, [rsp+272*mmsize]        ; t11a
1741     mova  [rsp+271*mmsize], m0
1742     SUMSUB_BA         d, 7, 1, 0                    ; m7=out11, m1=out20
1743
1744 %if %1 == 1
1745     TRANSPOSE4x4D        2, 5, 6, 7, 0
1746     mova  [ptrq+ 2*mmsize], m2
1747     mova  [ptrq+10*mmsize], m5
1748     mova  [ptrq+18*mmsize], m6
1749     mova  [ptrq+26*mmsize], m7
1750 %else ; %1 == 2
1751     pxor                m0, m0
1752     lea               dstq, [dstq+strideq*8]
1753     ROUND_AND_STORE_4x4  2, 5, 6, 7, m0, [rsp+256*mmsize], [pd_32], 6
1754 %endif
1755     mova                m2, [rsp+271*mmsize]
1756 %if %1 == 1
1757     TRANSPOSE4x4D        1, 3, 4, 2, 0
1758     mova  [ptrq+ 5*mmsize], m1
1759     mova  [ptrq+13*mmsize], m3
1760     mova  [ptrq+21*mmsize], m4
1761     mova  [ptrq+29*mmsize], m2
1762 %else ; %1 == 2
1763     lea               dstq, [dstq+stride3q*4]
1764     ROUND_AND_STORE_4x4  1, 3, 4, 2, m0, [rsp+256*mmsize], [pd_32], 6
1765 %endif
1766
1767     ; end of last stage + store for out8-11 and out20-23
1768
1769     UNSCRATCH            0, 9, rsp+276*mmsize       ; t19a
1770     UNSCRATCH            1, 8, rsp+275*mmsize       ; t18
1771     UNSCRATCH            2, 11, rsp+278*mmsize      ; t17a
1772     UNSCRATCH            3, 10, rsp+277*mmsize      ; t16
1773     mova                m7, [rsp+261*mmsize]        ; t12a
1774     mova                m6, [rsp+262*mmsize]        ; t13
1775     mova                m5, [rsp+263*mmsize]        ; t14a
1776     SUMSUB_BA         d, 0, 7, 4                    ; m0=out12, m7=out19
1777     SUMSUB_BA         d, 1, 6, 4                    ; m1=out13, m6=out18
1778     SUMSUB_BA         d, 2, 5, 4                    ; m2=out14, m5=out17
1779     mova                m4, [rsp+264*mmsize]        ; t15
1780     SCRATCH              7, 8, rsp+275*mmsize
1781     SUMSUB_BA         d, 3, 4, 7                    ; m3=out15, m4=out16
1782
1783 %if %1 == 1
1784     TRANSPOSE4x4D        0, 1, 2, 3, 7
1785     mova  [ptrq+ 3*mmsize], m0
1786     mova  [ptrq+11*mmsize], m1
1787     mova  [ptrq+19*mmsize], m2
1788     mova  [ptrq+27*mmsize], m3
1789 %else ; %1 == 2
1790 %if ARCH_X86_64
1791     SWAP                 7, 9
1792     lea               dstq, [dstbakq+stride3q*4]
1793 %else ; x86-32
1794     pxor                m7, m7
1795     mov               dstq, dstm
1796     lea               dstq, [dstq+stride3q*4]
1797 %endif
1798     ROUND_AND_STORE_4x4  0, 1, 2, 3, m7, [rsp+256*mmsize], [pd_32], 6
1799 %endif
1800     UNSCRATCH            0, 8, rsp+275*mmsize       ; out19
1801 %if %1 == 1
1802     TRANSPOSE4x4D        4, 5, 6, 0, 7
1803     mova  [ptrq+ 4*mmsize], m4
1804     mova  [ptrq+12*mmsize], m5
1805     mova  [ptrq+20*mmsize], m6
1806     mova  [ptrq+28*mmsize], m0
1807 %else ; %1 == 2
1808     lea               dstq, [dstq+strideq*4]
1809     ROUND_AND_STORE_4x4  4, 5, 6, 0, m7, [rsp+256*mmsize], [pd_32], 6
1810 %endif
1811
1812     ; end of last stage + store for out12-19
1813
1814 %if ARCH_X86_64
1815     SWAP                 7, 8
1816 %endif
1817     mova                m7, [rsp+257*mmsize]        ; t0
1818     mova                m6, [rsp+258*mmsize]        ; t1
1819     mova                m5, [rsp+259*mmsize]        ; t2
1820     mova                m4, [rsp+260*mmsize]        ; t3
1821     mova                m0, [rsp+274*mmsize]        ; t31
1822     mova                m1, [rsp+273*mmsize]        ; t30a
1823     UNSCRATCH            2, 15, rsp+282*mmsize      ; t29
1824     SUMSUB_BA         d, 0, 7, 3                    ; m0=out0, m7=out31
1825     SUMSUB_BA         d, 1, 6, 3                    ; m1=out1, m6=out30
1826     SUMSUB_BA         d, 2, 5, 3                    ; m2=out2, m5=out29
1827     SCRATCH              0, 9, rsp+276*mmsize
1828     UNSCRATCH            3, 14, rsp+281*mmsize      ; t28a
1829     SUMSUB_BA         d, 3, 4, 0                    ; m3=out3, m4=out28
1830
1831 %if %1 == 1
1832     TRANSPOSE4x4D        4, 5, 6, 7, 0
1833     mova  [ptrq+ 7*mmsize], m4
1834     mova  [ptrq+15*mmsize], m5
1835     mova  [ptrq+23*mmsize], m6
1836     mova  [ptrq+31*mmsize], m7
1837 %else ; %1 == 2
1838 %if ARCH_X86_64
1839     SWAP                 0, 8
1840 %else ; x86-32
1841     pxor                m0, m0
1842 %endif
1843     lea               dstq, [dstq+stride3q*4]
1844     ROUND_AND_STORE_4x4  4, 5, 6, 7, m0, [rsp+256*mmsize], [pd_32], 6
1845 %endif
1846     UNSCRATCH            7, 9, rsp+276*mmsize       ; out0
1847 %if %1 == 1
1848     TRANSPOSE4x4D        7, 1, 2, 3, 0
1849     mova  [ptrq+ 0*mmsize], m7
1850     mova  [ptrq+ 8*mmsize], m1
1851     mova  [ptrq+16*mmsize], m2
1852     mova  [ptrq+24*mmsize], m3
1853 %else ; %1 == 2
1854 %if ARCH_X86_64
1855     DEFINE_ARGS dstbak, stride, block, cnt, ptr, stride3, dst
1856 %else ; x86-32
1857     mov               dstq, dstm
1858 %endif
1859     ROUND_AND_STORE_4x4  7, 1, 2, 3, m0, [rsp+256*mmsize], [pd_32], 6
1860 %if ARCH_X86_64
1861     DEFINE_ARGS dst, stride, block, cnt, ptr, stride3, dstbak
1862 %endif
1863 %endif
1864
1865     ; end of last stage + store for out0-3 and out28-31
1866
1867 %if ARCH_X86_64
1868     SWAP                 0, 8
1869 %endif
1870     mova                m7, [rsp+265*mmsize]        ; t4
1871     mova                m6, [rsp+266*mmsize]        ; t5a
1872     mova                m5, [rsp+267*mmsize]        ; t6a
1873     mova                m4, [rsp+268*mmsize]        ; t7
1874     mova                m0, [rsp+270*mmsize]        ; t27
1875     mova                m1, [rsp+269*mmsize]        ; t26a
1876     UNSCRATCH            2, 13, rsp+280*mmsize      ; t25
1877     SUMSUB_BA         d, 0, 7, 3                    ; m0=out4, m7=out27
1878     SUMSUB_BA         d, 1, 6, 3                    ; m1=out5, m6=out26
1879     SUMSUB_BA         d, 2, 5, 3                    ; m2=out6, m5=out25
1880     UNSCRATCH            3, 12, rsp+279*mmsize      ; t24a
1881     SCRATCH              7, 9, rsp+276*mmsize
1882     SUMSUB_BA         d, 3, 4, 7                    ; m3=out7, m4=out24
1883
1884 %if %1 == 1
1885     TRANSPOSE4x4D        0, 1, 2, 3, 7
1886     mova  [ptrq+ 1*mmsize], m0
1887     mova  [ptrq+ 9*mmsize], m1
1888     mova  [ptrq+17*mmsize], m2
1889     mova  [ptrq+25*mmsize], m3
1890 %else ; %1 == 2
1891 %if ARCH_X86_64
1892     SWAP                 7, 8
1893     lea               dstq, [dstbakq+strideq*4]
1894 %else ; x86-32
1895     pxor                m7, m7
1896     lea               dstq, [dstq+strideq*4]
1897 %endif
1898     ROUND_AND_STORE_4x4  0, 1, 2, 3, m7, [rsp+256*mmsize], [pd_32], 6
1899 %endif
1900     UNSCRATCH            0, 9, rsp+276*mmsize       ; out27
1901 %if %1 == 1
1902     TRANSPOSE4x4D        4, 5, 6, 0, 7
1903     mova  [ptrq+ 6*mmsize], m4
1904     mova  [ptrq+14*mmsize], m5
1905     mova  [ptrq+22*mmsize], m6
1906     mova  [ptrq+30*mmsize], m0
1907 %else ; %1 == 2
1908 %if ARCH_X86_64
1909     lea               dstq, [dstbakq+stride3q*8]
1910 %else
1911     mov               dstq, dstm
1912     lea               dstq, [dstq+stride3q*8]
1913 %endif
1914     ROUND_AND_STORE_4x4  4, 5, 6, 0, m7, [rsp+256*mmsize], [pd_32], 6
1915 %endif
1916
1917     ; end of last stage + store for out4-7 and out24-27
1918 %endmacro
1919
1920 INIT_XMM sse2
1921 cglobal vp9_idct_idct_32x32_add_10, 4, 6 + ARCH_X86_64, 16, \
1922                                     275 * mmsize + ARCH_X86_32 * 8 * mmsize, \
1923                                     dst, stride, block, eob
1924     mova                m0, [pw_1023]
1925     cmp               eobd, 1
1926     jg .idctfull
1927
1928     ; dc-only - the 10bit version can be done entirely in 32bit, since the max
1929     ; coef values are 17+sign bit, and the coef is 14bit, so 31+sign easily
1930     ; fits in 32bit
1931     DEFINE_ARGS dst, stride, block, coef
1932     pxor                m2, m2
1933     DC_ONLY              6, m2
1934     movd                m1, coefd
1935     pshuflw             m1, m1, q0000
1936     punpcklqdq          m1, m1
1937     DEFINE_ARGS dst, stride, cnt
1938     mov               cntd, 32
1939 .loop_dc:
1940     STORE_2x8            3, 4, 1, m2, m0, dstq,          mmsize
1941     STORE_2x8            3, 4, 1, m2, m0, dstq+mmsize*2, mmsize
1942     add               dstq, strideq
1943     dec               cntd
1944     jg .loop_dc
1945     RET
1946
1947 .idctfull:
1948     mova  [rsp+256*mmsize], m0
1949     DEFINE_ARGS dst, stride, block, cnt, ptr, skip, dstbak
1950 %if ARCH_X86_64
1951     mov            dstbakq, dstq
1952     movsxd            cntq, cntd
1953 %endif
1954 %ifdef PIC
1955     lea               ptrq, [default_32x32]
1956     movzx             cntd, byte [ptrq+cntq-1]
1957 %else
1958     movzx             cntd, byte [default_32x32+cntq-1]
1959 %endif
1960     mov              skipd, 8
1961     sub              skipd, cntd
1962     mov               ptrq, rsp
1963 .loop_1:
1964     IDCT32_1D            1, blockq
1965
1966     add               ptrq, 32 * mmsize
1967     add             blockq, mmsize
1968     dec               cntd
1969     jg .loop_1
1970
1971     ; zero-pad the remainder (skipped cols)
1972     test             skipd, skipd
1973     jz .end
1974     shl              skipd, 2
1975     lea             blockq, [blockq+skipq*(mmsize/4)]
1976     pxor                m0, m0
1977 .loop_z:
1978     mova   [ptrq+mmsize*0], m0
1979     mova   [ptrq+mmsize*1], m0
1980     mova   [ptrq+mmsize*2], m0
1981     mova   [ptrq+mmsize*3], m0
1982     mova   [ptrq+mmsize*4], m0
1983     mova   [ptrq+mmsize*5], m0
1984     mova   [ptrq+mmsize*6], m0
1985     mova   [ptrq+mmsize*7], m0
1986     add               ptrq, 8 * mmsize
1987     dec              skipd
1988     jg .loop_z
1989 .end:
1990
1991     DEFINE_ARGS dst, stride, block, cnt, ptr, stride3, dstbak
1992     lea           stride3q, [strideq*3]
1993     mov               cntd, 8
1994     mov               ptrq, rsp
1995 .loop_2:
1996     IDCT32_1D            2, ptrq
1997
1998     add               ptrq, mmsize
1999 %if ARCH_X86_64
2000     add            dstbakq, 8
2001     mov               dstq, dstbakq
2002 %else
2003     add         dword dstm, 8
2004     mov               dstq, dstm
2005 %endif
2006     dec               cntd
2007     jg .loop_2
2008
2009     ; m7 is still zero
2010     ZERO_BLOCK blockq-8*mmsize, 128, 32, m7
2011     RET
2012
2013 INIT_XMM sse2
2014 cglobal vp9_idct_idct_32x32_add_12, 4, 6 + ARCH_X86_64, 16, \
2015                                     275 * mmsize + ARCH_X86_32 * 8 * mmsize, \
2016                                     dst, stride, block, eob
2017     mova                m0, [pw_4095]
2018     cmp               eobd, 1
2019     jg mangle(private_prefix %+ _ %+ vp9_idct_idct_32x32_add_10 %+ SUFFIX).idctfull
2020
2021     ; dc-only - unfortunately, this one can overflow, since coefs are 19+sign
2022     ; bpp, and 19+14+sign does not fit in 32bit, so we do 2-stage multiplies
2023     DEFINE_ARGS dst, stride, block, coef, coefl
2024     pxor                m2, m2
2025     DC_ONLY_64BIT        6, m2
2026     movd                m1, coefd
2027     pshuflw             m1, m1, q0000
2028     punpcklqdq          m1, m1
2029     DEFINE_ARGS dst, stride, cnt
2030     mov               cntd, 32
2031 .loop_dc:
2032     STORE_2x8            3, 4, 1, m2, m0, dstq,          mmsize
2033     STORE_2x8            3, 4, 1, m2, m0, dstq+mmsize*2, mmsize
2034     add               dstq, strideq
2035     dec               cntd
2036     jg .loop_dc
2037     RET