]> git.sesse.net Git - x264/blob - common/x86/quant-a.asm
Try 8x8 transform analysis even when sub8x8 partitions are present
[x264] / common / x86 / quant-a.asm
1 ;*****************************************************************************
2 ;* quant-a.asm: x86 quantization and level-run
3 ;*****************************************************************************
4 ;* Copyright (C) 2005-2012 x264 project
5 ;*
6 ;* Authors: Loren Merritt <lorenm@u.washington.edu>
7 ;*          Fiona Glaser <fiona@x264.com>
8 ;*          Christian Heine <sennindemokrit@gmx.net>
9 ;*          Oskar Arvidsson <oskar@irock.se>
10 ;*          Henrik Gramner <hengar-6@student.ltu.se>
11 ;*
12 ;* This program is free software; you can redistribute it and/or modify
13 ;* it under the terms of the GNU General Public License as published by
14 ;* the Free Software Foundation; either version 2 of the License, or
15 ;* (at your option) any later version.
16 ;*
17 ;* This program is distributed in the hope that it will be useful,
18 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 ;* GNU General Public License for more details.
21 ;*
22 ;* You should have received a copy of the GNU General Public License
23 ;* along with this program; if not, write to the Free Software
24 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
25 ;*
26 ;* This program is also available under a commercial proprietary license.
27 ;* For more information, contact us at licensing@x264.com.
28 ;*****************************************************************************
29
30 %include "x86inc.asm"
31 %include "x86util.asm"
32
33 SECTION_RODATA
34
35 %macro DQM4 3
36     dw %1, %2, %1, %2, %2, %3, %2, %3
37 %endmacro
38 %macro DQM8 6
39     dw %1, %4, %5, %4, %1, %4, %5, %4
40     dw %4, %2, %6, %2, %4, %2, %6, %2
41     dw %5, %6, %3, %6, %5, %6, %3, %6
42     ; last line not used, just padding for power-of-2 stride
43     times 8 dw 0
44 %endmacro
45
46 dequant4_scale:
47     DQM4 10, 13, 16
48     DQM4 11, 14, 18
49     DQM4 13, 16, 20
50     DQM4 14, 18, 23
51     DQM4 16, 20, 25
52     DQM4 18, 23, 29
53
54 dequant8_scale:
55     DQM8 20, 18, 32, 19, 25, 24
56     DQM8 22, 19, 35, 21, 28, 26
57     DQM8 26, 23, 42, 24, 33, 31
58     DQM8 28, 25, 45, 26, 35, 33
59     DQM8 32, 28, 51, 30, 40, 38
60     DQM8 36, 32, 58, 34, 46, 43
61
62 decimate_mask_table4:
63     db  0,3,2,6,2,5,5,9,1,5,4,8,5,8,8,12,1,4,4,8,4,7,7,11,4,8,7,11,8,11,11,15,1,4
64     db  3,7,4,7,7,11,3,7,6,10,7,10,10,14,4,7,7,11,7,10,10,14,7,11,10,14,11,14,14
65     db 18,0,4,3,7,3,6,6,10,3,7,6,10,7,10,10,14,3,6,6,10,6,9,9,13,6,10,9,13,10,13
66     db 13,17,4,7,6,10,7,10,10,14,6,10,9,13,10,13,13,17,7,10,10,14,10,13,13,17,10
67     db 14,13,17,14,17,17,21,0,3,3,7,3,6,6,10,2,6,5,9,6,9,9,13,3,6,6,10,6,9,9,13
68     db  6,10,9,13,10,13,13,17,3,6,5,9,6,9,9,13,5,9,8,12,9,12,12,16,6,9,9,13,9,12
69     db 12,16,9,13,12,16,13,16,16,20,3,7,6,10,6,9,9,13,6,10,9,13,10,13,13,17,6,9
70     db  9,13,9,12,12,16,9,13,12,16,13,16,16,20,7,10,9,13,10,13,13,17,9,13,12,16
71     db 13,16,16,20,10,13,13,17,13,16,16,20,13,17,16,20,17,20,20,24
72
73 chroma_dc_dct_mask_mmx: dw 0, 0,-1,-1, 0, 0,-1,-1
74 chroma_dc_dmf_mask_mmx: dw 0, 0,-1,-1, 0,-1,-1, 0
75 chroma_dc_dct_mask:     dw 1, 1,-1,-1, 1, 1,-1,-1
76 chroma_dc_dmf_mask:     dw 1, 1,-1,-1, 1,-1,-1, 1
77
78 SECTION .text
79
80 cextern pb_1
81 cextern pw_1
82 cextern pd_1
83 cextern pb_01
84 cextern pd_1024
85
86 %macro QUANT_DC_START 0
87     movd       m6, r1m     ; mf
88     movd       m7, r2m     ; bias
89 %if HIGH_BIT_DEPTH
90     SPLATD     m6, m6
91     SPLATD     m7, m7
92 %elif cpuflag(sse4) ; ssse3, but not faster on conroe
93     mova       m5, [pb_01]
94     pshufb     m6, m5
95     pshufb     m7, m5
96 %else
97     SPLATW     m6, m6
98     SPLATW     m7, m7
99 %endif
100 %endmacro
101
102 %macro QUANT_END 0
103     xor      eax, eax
104 %if cpuflag(sse4)
105     ptest     m5, m5
106 %else ; !sse4
107 %if ARCH_X86_64
108 %if mmsize == 16
109     packsswb  m5, m5
110 %endif
111     movq     rcx, m5
112     test     rcx, rcx
113 %else
114 %if mmsize == 16
115     pxor      m4, m4
116     pcmpeqb   m5, m4
117     pmovmskb ecx, m5
118     cmp      ecx, (1<<mmsize)-1
119 %else
120     packsswb  m5, m5
121     movd     ecx, m5
122     test     ecx, ecx
123 %endif
124 %endif
125 %endif ; cpuflag
126     setne     al
127 %endmacro
128
129 %if HIGH_BIT_DEPTH
130 %macro QUANT_ONE_DC 4
131 %if cpuflag(sse4)
132     mova        m0, [%1]
133     ABSD        m1, m0
134     paddd       m1, %3
135     pmulld      m1, %2
136     psrad       m1, 16
137 %else ; !sse4
138     mova        m0, [%1]
139     ABSD        m1, m0
140     paddd       m1, %3
141     mova        m2, m1
142     psrlq       m2, 32
143     pmuludq     m1, %2
144     pmuludq     m2, %2
145     psllq       m2, 32
146     paddd       m1, m2
147     psrld       m1, 16
148 %endif ; cpuflag
149     PSIGND      m1, m0
150     mova      [%1], m1
151     ACCUM     por, 5, 1, %4
152 %endmacro
153
154 %macro QUANT_TWO_DC 4
155 %if cpuflag(sse4)
156     mova        m0, [%1       ]
157     mova        m1, [%1+mmsize]
158     ABSD        m2, m0
159     ABSD        m3, m1
160     paddd       m2, %3
161     paddd       m3, %3
162     pmulld      m2, %2
163     pmulld      m3, %2
164     psrad       m2, 16
165     psrad       m3, 16
166     PSIGND      m2, m0
167     PSIGND      m3, m1
168     mova [%1       ], m2
169     mova [%1+mmsize], m3
170     ACCUM      por, 5, 2, %4
171     por         m5, m3
172 %else ; !sse4
173     QUANT_ONE_DC %1, %2, %3, %4
174     QUANT_ONE_DC %1+mmsize, %2, %3, %4+mmsize
175 %endif ; cpuflag
176 %endmacro
177
178 %macro QUANT_ONE_AC_MMX 4
179     mova        m0, [%1]
180     mova        m2, [%2]
181     ABSD        m1, m0
182     mova        m4, m2
183     paddd       m1, [%3]
184     mova        m3, m1
185     psrlq       m4, 32
186     psrlq       m3, 32
187     pmuludq     m1, m2
188     pmuludq     m3, m4
189     psllq       m3, 32
190     paddd       m1, m3
191     psrad       m1, 16
192     PSIGND      m1, m0
193     mova      [%1], m1
194     ACCUM      por, 5, 1, %4
195 %endmacro
196
197 %macro QUANT_TWO_AC 4
198 %if cpuflag(sse4)
199     mova        m0, [%1       ]
200     mova        m1, [%1+mmsize]
201     ABSD        m2, m0
202     ABSD        m3, m1
203     paddd       m2, [%3       ]
204     paddd       m3, [%3+mmsize]
205     pmulld      m2, [%2       ]
206     pmulld      m3, [%2+mmsize]
207     psrad       m2, 16
208     psrad       m3, 16
209     PSIGND      m2, m0
210     PSIGND      m3, m1
211     mova [%1       ], m2
212     mova [%1+mmsize], m3
213     ACCUM      por, 5, 2, %4
214     por         m5, m3
215 %else ; !sse4
216     QUANT_ONE_AC_MMX %1, %2, %3, %4
217     QUANT_ONE_AC_MMX %1+mmsize, %2+mmsize, %3+mmsize, %4+mmsize
218 %endif ; cpuflag
219 %endmacro
220
221 ;-----------------------------------------------------------------------------
222 ; int quant_2x2( int32_t dct[M*N], int mf, int bias )
223 ;-----------------------------------------------------------------------------
224 %macro QUANT_DC 2
225 cglobal quant_%1x%2_dc, 3,3,8
226     QUANT_DC_START
227 %if %1*%2 <= mmsize/4
228     QUANT_ONE_DC r0, m6, m7, 0
229 %else
230 %assign x 0
231 %rep %1*%2/(mmsize/2)
232     QUANT_TWO_DC r0+x, m6, m7, x
233 %assign x x+mmsize*2
234 %endrep
235 %endif
236     QUANT_END
237     RET
238 %endmacro
239
240 ;-----------------------------------------------------------------------------
241 ; int quant_MxN( int32_t dct[M*N], uint32_t mf[M*N], uint32_t bias[M*N] )
242 ;-----------------------------------------------------------------------------
243 %macro QUANT_AC 2
244 cglobal quant_%1x%2, 3,3,8
245 %assign x 0
246 %rep %1*%2/(mmsize/2)
247     QUANT_TWO_AC r0+x, r1+x, r2+x, x
248 %assign x x+mmsize*2
249 %endrep
250     QUANT_END
251     RET
252 %endmacro
253
254 INIT_XMM sse2
255 QUANT_DC 2, 2
256 QUANT_DC 4, 4
257 QUANT_AC 4, 4
258 QUANT_AC 8, 8
259
260 INIT_XMM ssse3
261 QUANT_DC 2, 2
262 QUANT_DC 4, 4
263 QUANT_AC 4, 4
264 QUANT_AC 8, 8
265
266 INIT_XMM sse4
267 QUANT_DC 2, 2
268 QUANT_DC 4, 4
269 QUANT_AC 4, 4
270 QUANT_AC 8, 8
271
272 %endif ; HIGH_BIT_DEPTH
273
274 %if HIGH_BIT_DEPTH == 0
275 %macro QUANT_ONE 4
276 ;;; %1      (m64)       dct[y][x]
277 ;;; %2      (m64/mmx)   mf[y][x] or mf[0][0] (as uint16_t)
278 ;;; %3      (m64/mmx)   bias[y][x] or bias[0][0] (as uint16_t)
279     mova       m1, %1   ; load dct coeffs
280     ABSW       m0, m1, sign
281     paddusw    m0, %3   ; round
282     pmulhuw    m0, %2   ; divide
283     PSIGNW     m0, m1   ; restore sign
284     mova       %1, m0   ; store
285     ACCUM     por, 5, 0, %4
286 %endmacro
287
288 %macro QUANT_TWO 7
289     mova       m1, %1
290     mova       m3, %2
291     ABSW       m0, m1, sign
292     ABSW       m2, m3, sign
293     paddusw    m0, %5
294     paddusw    m2, %6
295     pmulhuw    m0, %3
296     pmulhuw    m2, %4
297     PSIGNW     m0, m1
298     PSIGNW     m2, m3
299     mova       %1, m0
300     mova       %2, m2
301     ACCUM     por, 5, 0, %7
302     por        m5, m2
303 %endmacro
304
305 ;-----------------------------------------------------------------------------
306 ; void quant_4x4_dc( int16_t dct[16], int mf, int bias )
307 ;-----------------------------------------------------------------------------
308 %macro QUANT_DC 2-3 0
309 cglobal %1, 1,1,%3
310     QUANT_DC_START
311 %if %2==1
312     QUANT_ONE [r0], m6, m7, 0
313 %else
314 %assign x 0
315 %rep %2/2
316     QUANT_TWO [r0+x], [r0+x+mmsize], m6, m6, m7, m7, x
317 %assign x x+mmsize*2
318 %endrep
319 %endif
320     QUANT_END
321     RET
322 %endmacro
323
324 ;-----------------------------------------------------------------------------
325 ; int quant_4x4( int16_t dct[16], uint16_t mf[16], uint16_t bias[16] )
326 ;-----------------------------------------------------------------------------
327 %macro QUANT_AC 2
328 cglobal %1, 3,3
329 %assign x 0
330 %rep %2/2
331     QUANT_TWO [r0+x], [r0+x+mmsize], [r1+x], [r1+x+mmsize], [r2+x], [r2+x+mmsize], x
332 %assign x x+mmsize*2
333 %endrep
334     QUANT_END
335     RET
336 %endmacro
337
338 INIT_MMX mmx2
339 QUANT_DC quant_2x2_dc, 1
340 %if ARCH_X86_64 == 0 ; not needed because sse2 is faster
341 QUANT_DC quant_4x4_dc, 4
342 INIT_MMX mmx
343 QUANT_AC quant_4x4, 4
344 QUANT_AC quant_8x8, 16
345 %endif
346
347 INIT_XMM sse2
348 QUANT_DC quant_4x4_dc, 2, 8
349 QUANT_AC quant_4x4, 2
350 QUANT_AC quant_8x8, 8
351
352 INIT_XMM ssse3
353 QUANT_DC quant_4x4_dc, 2, 8
354 QUANT_AC quant_4x4, 2
355 QUANT_AC quant_8x8, 8
356
357 INIT_MMX ssse3
358 QUANT_DC quant_2x2_dc, 1
359
360 INIT_XMM sse4
361 ;Not faster on Conroe, so only used in SSE4 versions
362 QUANT_DC quant_4x4_dc, 2, 8
363 QUANT_AC quant_4x4, 2
364 QUANT_AC quant_8x8, 8
365 %endif ; !HIGH_BIT_DEPTH
366
367
368
369 ;=============================================================================
370 ; dequant
371 ;=============================================================================
372
373 %macro DEQUANT16_L 3
374 ;;; %1      dct[y][x]
375 ;;; %2,%3   dequant_mf[i_mf][y][x]
376 ;;; m2      i_qbits
377     mova     m0, %2
378 %if HIGH_BIT_DEPTH
379     pmaddwd  m0, %1
380     pslld    m0, m2
381 %else
382     packssdw m0, %3
383     pmullw   m0, %1
384     psllw    m0, m2
385 %endif
386     mova     %1, m0
387 %endmacro
388
389 %macro DEQUANT32_R 3
390 ;;; %1      dct[y][x]
391 ;;; %2,%3   dequant_mf[i_mf][y][x]
392 ;;; m2      -i_qbits
393 ;;; m3      f
394 ;;; m4      0
395     mova      m0, %1
396 %if HIGH_BIT_DEPTH
397     pmadcswd  m0, m0, %2, m3
398     psrad     m0, m2
399 %else
400     punpckhwd m1, m0, m4
401     punpcklwd m0, m4
402     pmadcswd  m0, m0, %2, m3
403     pmadcswd  m1, m1, %3, m3
404     psrad     m0, m2
405     psrad     m1, m2
406     packssdw  m0, m1
407 %endif
408     mova      %1, m0
409 %endmacro
410
411 %macro DEQUANT_LOOP 3
412 %if 8*(%2-2*%3)
413     mov t0d, 8*(%2-2*%3)
414 %%loop:
415     %1 [r0+(t0     )*SIZEOF_PIXEL], [r1+t0*2      ], [r1+t0*2+ 8*%3]
416     %1 [r0+(t0+8*%3)*SIZEOF_PIXEL], [r1+t0*2+16*%3], [r1+t0*2+24*%3]
417     sub t0d, 16*%3
418     jge %%loop
419     REP_RET
420 %else
421     %1 [r0+(8*%3)*SIZEOF_PIXEL], [r1+16*%3], [r1+24*%3]
422     %1 [r0+(0   )*SIZEOF_PIXEL], [r1+0    ], [r1+ 8*%3]
423     RET
424 %endif
425 %endmacro
426
427 %macro DEQUANT16_FLAT 2-5
428     mova   m0, %1
429     psllw  m0, m4
430 %assign i %0-2
431 %rep %0-1
432 %if i
433     mova   m %+ i, [r0+%2]
434     pmullw m %+ i, m0
435 %else
436     pmullw m0, [r0+%2]
437 %endif
438     mova   [r0+%2], m %+ i
439     %assign i i-1
440     %rotate 1
441 %endrep
442 %endmacro
443
444 %if WIN64
445     DECLARE_REG_TMP 6,3,2
446 %elif ARCH_X86_64
447     DECLARE_REG_TMP 4,3,2
448 %else
449     DECLARE_REG_TMP 2,0,1
450 %endif
451
452 %macro DEQUANT_START 2
453     movifnidn t2d, r2m
454     imul t0d, t2d, 0x2b
455     shr  t0d, 8     ; i_qbits = i_qp / 6
456     lea  t1, [t0*3]
457     sub  t2d, t1d
458     sub  t2d, t1d   ; i_mf = i_qp % 6
459     shl  t2d, %1
460 %if ARCH_X86_64
461     add  r1, t2     ; dequant_mf[i_mf]
462 %else
463     add  r1, r1mp   ; dequant_mf[i_mf]
464     mov  r0, r0mp   ; dct
465 %endif
466     sub  t0d, %2
467     jl   .rshift32  ; negative qbits => rightshift
468 %endmacro
469
470 ;-----------------------------------------------------------------------------
471 ; void dequant_4x4( dctcoef dct[4][4], int dequant_mf[6][4][4], int i_qp )
472 ;-----------------------------------------------------------------------------
473 %macro DEQUANT 3
474 cglobal dequant_%1x%1, 0,3,6
475 .skip_prologue:
476     DEQUANT_START %2+2, %2
477
478 .lshift:
479     movd m2, t0d
480     DEQUANT_LOOP DEQUANT16_L, %1*%1/4, %3
481
482 .rshift32:
483     neg   t0d
484     movd  m2, t0d
485     mova  m3, [pd_1]
486     pxor  m4, m4
487     pslld m3, m2
488     psrld m3, 1
489     DEQUANT_LOOP DEQUANT32_R, %1*%1/4, %3
490
491 %if HIGH_BIT_DEPTH == 0 && notcpuflag(avx)
492 cglobal dequant_%1x%1_flat16, 0,3
493     movifnidn t2d, r2m
494 %if %1 == 8
495     cmp  t2d, 12
496     jl dequant_%1x%1 %+ SUFFIX %+ .skip_prologue
497     sub  t2d, 12
498 %endif
499     imul t0d, t2d, 0x2b
500     shr  t0d, 8     ; i_qbits = i_qp / 6
501     lea  t1, [t0*3]
502     sub  t2d, t1d
503     sub  t2d, t1d   ; i_mf = i_qp % 6
504     shl  t2d, %2
505 %ifdef PIC
506     lea  r1, [dequant%1_scale]
507     add  r1, t2
508 %else
509     lea  r1, [dequant%1_scale + t2]
510 %endif
511     movifnidn r0, r0mp
512     movd m4, t0d
513 %if %1 == 4
514 %if mmsize == 8
515     DEQUANT16_FLAT [r1], 0, 16
516     DEQUANT16_FLAT [r1+8], 8, 24
517 %else
518     DEQUANT16_FLAT [r1], 0, 16
519 %endif
520 %elif mmsize == 8
521     DEQUANT16_FLAT [r1], 0, 8, 64, 72
522     DEQUANT16_FLAT [r1+16], 16, 24, 48, 56
523     DEQUANT16_FLAT [r1+16], 80, 88, 112, 120
524     DEQUANT16_FLAT [r1+32], 32, 40, 96, 104
525 %else
526     DEQUANT16_FLAT [r1], 0, 64
527     DEQUANT16_FLAT [r1+16], 16, 48, 80, 112
528     DEQUANT16_FLAT [r1+32], 32, 96
529 %endif
530     RET
531 %endif ; !HIGH_BIT_DEPTH && !AVX
532 %endmacro ; DEQUANT
533
534 %if HIGH_BIT_DEPTH
535 INIT_XMM sse2
536 DEQUANT 4, 4, 1
537 DEQUANT 8, 6, 1
538 INIT_XMM xop
539 DEQUANT 4, 4, 1
540 DEQUANT 8, 6, 1
541 %else
542 %if ARCH_X86_64 == 0
543 INIT_MMX mmx
544 DEQUANT 4, 4, 1
545 DEQUANT 8, 6, 1
546 %endif
547 INIT_XMM sse2
548 DEQUANT 4, 4, 2
549 DEQUANT 8, 6, 2
550 INIT_XMM avx
551 DEQUANT 4, 4, 2
552 DEQUANT 8, 6, 2
553 INIT_XMM xop
554 DEQUANT 4, 4, 2
555 DEQUANT 8, 6, 2
556 %endif
557
558 %macro DEQUANT_DC 2
559 cglobal dequant_4x4dc, 0,3,6
560     DEQUANT_START 6, 6
561
562 .lshift:
563     movd     m3, [r1]
564     movd     m2, t0d
565     pslld    m3, m2
566     SPLAT%1  m3, m3, 0
567 %assign x 0
568 %rep SIZEOF_PIXEL*16/mmsize
569     mova     m0, [r0+mmsize*0+x]
570     mova     m1, [r0+mmsize*1+x]
571     %2       m0, m3
572     %2       m1, m3
573     mova     [r0+mmsize*0+x], m0
574     mova     [r0+mmsize*1+x], m1
575 %assign x x+mmsize*2
576 %endrep
577     RET
578
579 .rshift32:
580     neg   t0d
581     movd  m3, t0d
582     mova  m4, [p%1_1]
583     mova  m5, m4
584     pslld m4, m3
585     psrld m4, 1
586     movd  m2, [r1]
587 %assign x 0
588 %if HIGH_BIT_DEPTH
589     pshufd m2, m2, 0
590 %rep SIZEOF_PIXEL*32/mmsize
591     mova      m0, [r0+x]
592     pmadcswd  m0, m0, m2, m4
593     psrad     m0, m3
594     mova      [r0+x], m0
595 %assign x x+mmsize
596 %endrep
597
598 %else ; !HIGH_BIT_DEPTH
599     PSHUFLW   m2, m2, 0
600     punpcklwd m2, m4
601 %rep SIZEOF_PIXEL*32/mmsize
602     mova      m0, [r0+x]
603     punpckhwd m1, m0, m5
604     punpcklwd m0, m5
605     pmaddwd   m0, m2
606     pmaddwd   m1, m2
607     psrad     m0, m3
608     psrad     m1, m3
609     packssdw  m0, m1
610     mova      [r0+x], m0
611 %assign x x+mmsize
612 %endrep
613 %endif ; !HIGH_BIT_DEPTH
614     RET
615 %endmacro
616
617 %if HIGH_BIT_DEPTH
618 INIT_XMM sse2
619 DEQUANT_DC d, pmaddwd
620 INIT_XMM xop
621 DEQUANT_DC d, pmaddwd
622 %else
623 %if ARCH_X86_64 == 0
624 INIT_MMX mmx2
625 DEQUANT_DC w, pmullw
626 %endif
627 INIT_XMM sse2
628 DEQUANT_DC w, pmullw
629 INIT_XMM avx
630 DEQUANT_DC w, pmullw
631 %endif
632
633 ; t4 is eax for return value.
634 %if ARCH_X86_64
635     DECLARE_REG_TMP 0,1,2,3,6,4  ; Identical for both Windows and *NIX
636 %else
637     DECLARE_REG_TMP 4,1,2,3,0,5
638 %endif
639
640 ;-----------------------------------------------------------------------------
641 ; x264_optimize_chroma_2x2_dc( dctcoef dct[4], int dequant_mf )
642 ;-----------------------------------------------------------------------------
643
644 %macro OPTIMIZE_CHROMA_2x2_DC 0
645 %assign %%regs 5
646 %if cpuflag(sse4)
647     %assign %%regs %%regs-1
648 %endif
649 %if ARCH_X86_64 == 0
650     %assign %%regs %%regs+1      ; t0-t4 are volatile on x86-64
651 %endif
652 cglobal optimize_chroma_2x2_dc, 0,%%regs,7
653     movifnidn t0, r0mp
654     movd      m2, r1m
655     movq      m1, [t0]
656 %if cpuflag(sse4)
657     pcmpeqb   m4, m4
658     pslld     m4, 11
659 %else
660     pxor      m4, m4
661 %endif
662 %if cpuflag(ssse3)
663     mova      m3, [chroma_dc_dct_mask]
664     mova      m5, [chroma_dc_dmf_mask]
665 %else
666     mova      m3, [chroma_dc_dct_mask_mmx]
667     mova      m5, [chroma_dc_dmf_mask_mmx]
668 %endif
669     pshuflw   m2, m2, 0
670     pshufd    m0, m1, q0101      ;  1  0  3  2  1  0  3  2
671     punpcklqdq m2, m2
672     punpcklqdq m1, m1            ;  3  2  1  0  3  2  1  0
673     mova      m6, [pd_1024]      ; 32<<5, elements are shifted 5 bits to the left
674     PSIGNW    m0, m3             ; -1 -0  3  2 -1 -0  3  2
675     PSIGNW    m2, m5             ;  +  -  -  +  -  -  +  +
676     paddw     m0, m1             ; -1+3 -0+2  1+3  0+2 -1+3 -0+2  1+3  0+2
677     pmaddwd   m0, m2             ;  0-1-2+3  0-1+2-3  0+1-2-3  0+1+2+3  * dmf
678     punpcklwd m1, m1
679     psrad     m2, 16             ;  +  -  -  +
680     mov      t1d, 3
681     paddd     m0, m6
682     xor      t4d, t4d
683 %if notcpuflag(ssse3)
684     psrad     m1, 31             ; has to be 0 or -1 in order for PSIGND_MMX to work correctly
685 %endif
686 %if cpuflag(sse4)
687     ptest     m0, m4
688 %else
689     mova      m6, m0
690     SWAP       0, 6
691     psrad     m6, 11
692     pcmpeqd   m6, m4
693     pmovmskb t5d, m6
694     cmp      t5d, 0xffff
695 %endif
696     jz .ret                      ; if the DC coefficients already round to zero, terminate early
697     mova      m3, m0
698 .outer_loop:
699     movsx    t3d, word [t0+2*t1] ; dct[coeff]
700     pshufd    m6, m1, q3333
701     pshufd    m1, m1, q2100      ; move the next element to high dword
702     PSIGND    m5, m2, m6
703     test     t3d, t3d
704     jz .loop_end
705 .outer_loop_0:
706     mov      t2d, t3d
707     sar      t3d, 31
708     or       t3d, 1
709 .inner_loop:
710     psubd     m3, m5             ; coeff -= sign
711     pxor      m6, m0, m3
712 %if cpuflag(sse4)
713     ptest     m6, m4
714 %else
715     psrad     m6, 11
716     pcmpeqd   m6, m4
717     pmovmskb t5d, m6
718     cmp      t5d, 0xffff
719 %endif
720     jz .round_coeff
721     paddd     m3, m5             ; coeff += sign
722     mov      t4d, 1
723 .loop_end:
724     dec      t1d
725     jz .last_coeff
726     pshufd    m2, m2, q1320      ;  -  +  -  +  /  -  -  +  +
727     jg .outer_loop
728 .ret:
729     REP_RET
730 .round_coeff:
731     sub      t2d, t3d
732     mov [t0+2*t1], t2w
733     jnz .inner_loop
734     jmp .loop_end
735 .last_coeff:
736     movsx    t3d, word [t0]
737     punpcklqdq m2, m2            ;  +  +  +  +
738     PSIGND    m5, m2, m1
739     test     t3d, t3d
740     jnz .outer_loop_0
741     REP_RET
742 %endmacro
743
744 %if HIGH_BIT_DEPTH == 0
745 INIT_XMM sse2
746 OPTIMIZE_CHROMA_2x2_DC
747 INIT_XMM ssse3
748 OPTIMIZE_CHROMA_2x2_DC
749 INIT_XMM sse4
750 OPTIMIZE_CHROMA_2x2_DC
751 INIT_XMM avx
752 OPTIMIZE_CHROMA_2x2_DC
753 %endif ; !HIGH_BIT_DEPTH
754
755 %if HIGH_BIT_DEPTH
756 ;-----------------------------------------------------------------------------
757 ; void denoise_dct( int32_t *dct, uint32_t *sum, uint32_t *offset, int size )
758 ;-----------------------------------------------------------------------------
759 %macro DENOISE_DCT 0
760 cglobal denoise_dct, 4,4,8
761     pxor      m6, m6
762     movsxdifnidn r3, r3d
763 .loop:
764     mova      m2, [r0+r3*4-2*mmsize]
765     mova      m3, [r0+r3*4-1*mmsize]
766     ABSD      m0, m2
767     ABSD      m1, m3
768     mova      m4, m0
769     mova      m5, m1
770     psubd     m0, [r2+r3*4-2*mmsize]
771     psubd     m1, [r2+r3*4-1*mmsize]
772     pcmpgtd   m7, m0, m6
773     pand      m0, m7
774     pcmpgtd   m7, m1, m6
775     pand      m1, m7
776     PSIGND    m0, m2
777     PSIGND    m1, m3
778     mova      [r0+r3*4-2*mmsize], m0
779     mova      [r0+r3*4-1*mmsize], m1
780     paddd     m4, [r1+r3*4-2*mmsize]
781     paddd     m5, [r1+r3*4-1*mmsize]
782     mova      [r1+r3*4-2*mmsize], m4
783     mova      [r1+r3*4-1*mmsize], m5
784     sub       r3, mmsize/2
785     jg .loop
786     REP_RET
787 %endmacro
788
789 %if ARCH_X86_64 == 0
790 INIT_MMX mmx
791 DENOISE_DCT
792 %endif
793 INIT_XMM sse2
794 DENOISE_DCT
795 INIT_XMM ssse3
796 DENOISE_DCT
797 INIT_XMM avx
798 DENOISE_DCT
799
800 %else ; !HIGH_BIT_DEPTH
801
802 ;-----------------------------------------------------------------------------
803 ; void denoise_dct( int16_t *dct, uint32_t *sum, uint16_t *offset, int size )
804 ;-----------------------------------------------------------------------------
805 %macro DENOISE_DCT 0
806 cglobal denoise_dct, 4,4,7
807     pxor      m6, m6
808     movsxdifnidn r3, r3d
809 .loop:
810     mova      m2, [r0+r3*2-2*mmsize]
811     mova      m3, [r0+r3*2-1*mmsize]
812     ABSW      m0, m2, sign
813     ABSW      m1, m3, sign
814     psubusw   m4, m0, [r2+r3*2-2*mmsize]
815     psubusw   m5, m1, [r2+r3*2-1*mmsize]
816     PSIGNW    m4, m2
817     PSIGNW    m5, m3
818     mova      [r0+r3*2-2*mmsize], m4
819     mova      [r0+r3*2-1*mmsize], m5
820     punpcklwd m2, m0, m6
821     punpcklwd m3, m1, m6
822     punpckhwd m0, m6
823     punpckhwd m1, m6
824     paddd     m2, [r1+r3*4-4*mmsize]
825     paddd     m0, [r1+r3*4-3*mmsize]
826     paddd     m3, [r1+r3*4-2*mmsize]
827     paddd     m1, [r1+r3*4-1*mmsize]
828     mova      [r1+r3*4-4*mmsize], m2
829     mova      [r1+r3*4-3*mmsize], m0
830     mova      [r1+r3*4-2*mmsize], m3
831     mova      [r1+r3*4-1*mmsize], m1
832     sub       r3, mmsize
833     jg .loop
834     REP_RET
835 %endmacro
836
837 %if ARCH_X86_64 == 0
838 INIT_MMX mmx
839 DENOISE_DCT
840 %endif
841 INIT_XMM sse2
842 DENOISE_DCT
843 INIT_XMM ssse3
844 DENOISE_DCT
845 INIT_XMM avx
846 DENOISE_DCT
847
848 %endif ; !HIGH_BIT_DEPTH
849
850 ;-----------------------------------------------------------------------------
851 ; int decimate_score( dctcoef *dct )
852 ;-----------------------------------------------------------------------------
853
854 %macro DECIMATE_MASK 5
855 %if mmsize==16
856 %if HIGH_BIT_DEPTH
857     movdqa   xmm0, [%3+ 0]
858     movdqa   xmm1, [%3+32]
859     packssdw xmm0, [%3+16]
860     packssdw xmm1, [%3+48]
861     ABSW2    xmm0, xmm1, xmm0, xmm1, xmm3, xmm4
862 %else
863     ABSW     xmm0, [%3+ 0], xmm3
864     ABSW     xmm1, [%3+16], xmm4
865 %endif
866     packsswb xmm0, xmm1
867     pxor     xmm2, xmm2
868     pcmpeqb  xmm2, xmm0
869     pcmpgtb  xmm0, %4
870     pmovmskb %1, xmm2
871     pmovmskb %2, xmm0
872
873 %else ; mmsize==8
874 %if HIGH_BIT_DEPTH
875     movq      mm0, [%3+ 0]
876     movq      mm1, [%3+16]
877     movq      mm2, [%3+32]
878     movq      mm3, [%3+48]
879     packssdw  mm0, [%3+ 8]
880     packssdw  mm1, [%3+24]
881     packssdw  mm2, [%3+40]
882     packssdw  mm3, [%3+56]
883 %else
884     movq      mm0, [%3+ 0]
885     movq      mm1, [%3+ 8]
886     movq      mm2, [%3+16]
887     movq      mm3, [%3+24]
888 %endif
889     ABSW2     mm0, mm1, mm0, mm1, mm6, mm7
890     ABSW2     mm2, mm3, mm2, mm3, mm6, mm7
891     packsswb  mm0, mm1
892     packsswb  mm2, mm3
893     pxor      mm4, mm4
894     pxor      mm6, mm6
895     pcmpeqb   mm4, mm0
896     pcmpeqb   mm6, mm2
897     pcmpgtb   mm0, %4
898     pcmpgtb   mm2, %4
899     pmovmskb   %5, mm4
900     pmovmskb   %1, mm6
901     shl        %1, 8
902     or         %1, %5
903     pmovmskb   %5, mm0
904     pmovmskb   %2, mm2
905     shl        %2, 8
906     or         %2, %5
907 %endif
908 %endmacro
909
910 cextern decimate_table4
911 cextern decimate_table8
912
913 %macro DECIMATE4x4 1
914
915 ;A LUT is faster than bsf on older AMD processors.
916 ;This is not true for score64.
917 cglobal decimate_score%1, 1,3
918 %ifdef PIC
919     lea r4, [decimate_table4]
920     lea r5, [decimate_mask_table4]
921     %define table r4
922     %define mask_table r5
923 %else
924     %define table decimate_table4
925     %define mask_table decimate_mask_table4
926 %endif
927     DECIMATE_MASK edx, eax, r0, [pb_1], ecx
928     xor   edx, 0xffff
929     je   .ret
930     test  eax, eax
931     jne  .ret9
932 %if %1==15
933     shr   edx, 1
934 %endif
935 %if cpuflag(slowctz)
936     movzx ecx, dl
937     movzx eax, byte [mask_table + rcx]
938     cmp   edx, ecx
939     je   .ret
940     bsr   ecx, ecx
941     shr   edx, 1
942     shr   edx, cl
943     bsf   ecx, edx
944     shr   edx, 1
945     shr   edx, cl
946     add    al, byte [table + rcx]
947     add    al, byte [mask_table + rdx]
948 %else
949 .loop:
950     tzcnt ecx, edx
951     shr   edx, cl
952     add    al, byte [table + rcx]
953     shr   edx, 1
954     jne  .loop
955 %endif
956 .ret:
957     RET
958 .ret9:
959     mov   eax, 9
960     RET
961
962 %endmacro
963
964 %if ARCH_X86_64 == 0
965 INIT_MMX mmx2
966 DECIMATE4x4 15
967 DECIMATE4x4 16
968 INIT_MMX mmx2, slowctz
969 DECIMATE4x4 15
970 DECIMATE4x4 16
971 %endif
972 INIT_XMM sse2
973 DECIMATE4x4 15
974 DECIMATE4x4 16
975 INIT_XMM sse2, slowctz
976 DECIMATE4x4 15
977 DECIMATE4x4 16
978 INIT_XMM ssse3
979 DECIMATE4x4 15
980 DECIMATE4x4 16
981 INIT_XMM ssse3, slowctz
982 DECIMATE4x4 15
983 DECIMATE4x4 16
984
985 %macro DECIMATE8x8 0
986
987 %if ARCH_X86_64
988 cglobal decimate_score64, 1,5
989 %ifdef PIC
990     lea r4, [decimate_table8]
991     %define table r4
992 %else
993     %define table decimate_table8
994 %endif
995     mova  m5, [pb_1]
996     DECIMATE_MASK r1d, eax, r0+SIZEOF_DCTCOEF* 0, m5, null
997     test  eax, eax
998     jne  .ret9
999     DECIMATE_MASK r2d, eax, r0+SIZEOF_DCTCOEF*16, m5, null
1000     shl   r2d, 16
1001     or    r1d, r2d
1002     DECIMATE_MASK r2d, r3d, r0+SIZEOF_DCTCOEF*32, m5, null
1003     shl   r2, 32
1004     or    eax, r3d
1005     or    r1, r2
1006     DECIMATE_MASK r2d, r3d, r0+SIZEOF_DCTCOEF*48, m5, null
1007     shl   r2, 48
1008     or    r1, r2
1009     xor   r1, -1
1010     je   .ret
1011     add   eax, r3d
1012     jne  .ret9
1013 .loop:
1014     tzcnt rcx, r1
1015     shr   r1, cl
1016     add   al, byte [table + rcx]
1017     shr   r1, 1
1018     jne  .loop
1019 .ret:
1020     REP_RET
1021 .ret9:
1022     mov   eax, 9
1023     RET
1024
1025 %else ; ARCH
1026 %if mmsize == 8
1027 cglobal decimate_score64, 1,6
1028 %else
1029 cglobal decimate_score64, 1,5
1030 %endif
1031     mova  m5, [pb_1]
1032     DECIMATE_MASK r3, r2, r0+SIZEOF_DCTCOEF* 0, m5, r5
1033     test  r2, r2
1034     jne  .ret9
1035     DECIMATE_MASK r4, r2, r0+SIZEOF_DCTCOEF*16, m5, r5
1036     shl   r4, 16
1037     or    r3, r4
1038     DECIMATE_MASK r4, r1, r0+SIZEOF_DCTCOEF*32, m5, r5
1039     or    r2, r1
1040     DECIMATE_MASK r1, r0, r0+SIZEOF_DCTCOEF*48, m5, r5
1041     shl   r1, 16
1042     or    r4, r1
1043     xor   r3, -1
1044     je   .tryret
1045     xor   r4, -1
1046 .cont:
1047     add   r0, r2
1048     jne  .ret9      ;r0 is zero at this point, so we don't need to zero it
1049 .loop:
1050     tzcnt ecx, r3
1051     test  r3, r3
1052     je   .largerun
1053     shrd  r3, r4, cl
1054     shr   r4, cl
1055     add   r0b, byte [decimate_table8 + ecx]
1056     shrd  r3, r4, 1
1057     shr   r4, 1
1058     cmp   r0, 6     ;score64's threshold is never higher than 6
1059     jge  .ret9      ;this early termination is only useful on 32-bit because it can be done in the latency after shrd
1060     test  r3, r3
1061     jne  .loop
1062     test  r4, r4
1063     jne  .loop
1064 .ret:
1065     REP_RET
1066 .tryret:
1067     xor   r4, -1
1068     jne  .cont
1069     REP_RET
1070 .ret9:
1071     mov   eax, 9
1072     RET
1073 .largerun:
1074     mov   r3, r4
1075     xor   r4, r4
1076     tzcnt ecx, r3
1077     shr   r3, cl
1078     shr   r3, 1
1079     jne  .loop
1080     REP_RET
1081 %endif ; ARCH
1082
1083 %endmacro
1084
1085 %if ARCH_X86_64 == 0
1086 INIT_MMX mmx2
1087 DECIMATE8x8
1088 %endif
1089 INIT_XMM sse2
1090 DECIMATE8x8
1091 INIT_XMM ssse3
1092 DECIMATE8x8
1093
1094 ;-----------------------------------------------------------------------------
1095 ; int coeff_last( dctcoef *dct )
1096 ;-----------------------------------------------------------------------------
1097
1098 %macro BSR 3
1099 %if cpuflag(lzcnt)
1100     lzcnt %1, %2
1101     xor %1, %3
1102 %else
1103     bsr %1, %2
1104 %endif
1105 %endmacro
1106
1107 %macro LZCOUNT 3
1108 %if cpuflag(lzcnt)
1109     lzcnt %1, %2
1110 %else
1111     bsr %1, %2
1112     xor %1, %3
1113 %endif
1114 %endmacro
1115
1116 %if HIGH_BIT_DEPTH
1117 %macro LAST_MASK 3-4
1118 %if %1 == 4
1119     movq     mm0, [%3]
1120     packssdw mm0, [%3+8]
1121     packsswb mm0, mm0
1122     pcmpeqb  mm0, mm2
1123     pmovmskb  %2, mm0
1124 %elif mmsize == 16
1125     movdqa   xmm0, [%3+ 0]
1126 %if %1 == 8
1127     packssdw xmm0, [%3+16]
1128     packsswb xmm0, xmm0
1129 %else
1130     movdqa   xmm1, [%3+32]
1131     packssdw xmm0, [%3+16]
1132     packssdw xmm1, [%3+48]
1133     packsswb xmm0, xmm1
1134 %endif
1135     pcmpeqb  xmm0, xmm2
1136     pmovmskb   %2, xmm0
1137 %elif %1 == 8
1138     movq     mm0, [%3+ 0]
1139     movq     mm1, [%3+16]
1140     packssdw mm0, [%3+ 8]
1141     packssdw mm1, [%3+24]
1142     packsswb mm0, mm1
1143     pcmpeqb  mm0, mm2
1144     pmovmskb  %2, mm0
1145 %else
1146     movq     mm0, [%3+ 0]
1147     movq     mm1, [%3+16]
1148     packssdw mm0, [%3+ 8]
1149     packssdw mm1, [%3+24]
1150     movq     mm3, [%3+32]
1151     movq     mm4, [%3+48]
1152     packssdw mm3, [%3+40]
1153     packssdw mm4, [%3+56]
1154     packsswb mm0, mm1
1155     packsswb mm3, mm4
1156     pcmpeqb  mm0, mm2
1157     pcmpeqb  mm3, mm2
1158     pmovmskb  %2, mm0
1159     pmovmskb  %4, mm3
1160     shl       %4, 8
1161     or        %2, %4
1162 %endif
1163 %endmacro
1164
1165 %macro COEFF_LAST4 0
1166 cglobal coeff_last4, 1,3
1167     pxor mm2, mm2
1168     LAST_MASK 4, r1d, r0
1169     xor  r1d, 0xff
1170     shr  r1d, 4
1171     BSR  eax, r1d, 0x1f
1172     RET
1173 %endmacro
1174
1175 INIT_MMX mmx2
1176 COEFF_LAST4
1177 INIT_MMX mmx2, lzcnt
1178 COEFF_LAST4
1179
1180 %macro COEFF_LAST8 0
1181 cglobal coeff_last8, 1,3
1182     pxor m2, m2
1183     LAST_MASK 8, r1d, r0
1184 %if mmsize == 16
1185     xor r1d, 0xffff
1186     shr r1d, 8
1187 %else
1188     xor r1d, 0xff
1189 %endif
1190     BSR eax, r1d, 0x1f
1191     RET
1192 %endmacro
1193
1194 %if ARCH_X86_64 == 0
1195 INIT_MMX mmx2
1196 COEFF_LAST8
1197 %endif
1198 INIT_XMM sse2
1199 COEFF_LAST8
1200 INIT_XMM sse2, lzcnt
1201 COEFF_LAST8
1202
1203 %else ; !HIGH_BIT_DEPTH
1204 %macro LAST_MASK 3-4
1205 %if %1 <= 8
1206     movq     mm0, [%3+ 0]
1207 %if %1 == 4
1208     packsswb mm0, mm0
1209 %else
1210     packsswb mm0, [%3+ 8]
1211 %endif
1212     pcmpeqb  mm0, mm2
1213     pmovmskb  %2, mm0
1214 %elif mmsize == 16
1215     movdqa   xmm0, [%3+ 0]
1216     packsswb xmm0, [%3+16]
1217     pcmpeqb  xmm0, xmm2
1218     pmovmskb   %2, xmm0
1219 %else
1220     movq     mm0, [%3+ 0]
1221     movq     mm1, [%3+16]
1222     packsswb mm0, [%3+ 8]
1223     packsswb mm1, [%3+24]
1224     pcmpeqb  mm0, mm2
1225     pcmpeqb  mm1, mm2
1226     pmovmskb  %2, mm0
1227     pmovmskb  %4, mm1
1228     shl       %4, 8
1229     or        %2, %4
1230 %endif
1231 %endmacro
1232
1233 %macro COEFF_LAST48 0
1234 %if ARCH_X86_64
1235 cglobal coeff_last4, 1,1
1236     BSR  rax, [r0], 0x3f
1237     shr  eax, 4
1238     RET
1239 %else
1240 cglobal coeff_last4, 0,3
1241     mov   edx, r0mp
1242     mov   eax, [edx+4]
1243     xor   ecx, ecx
1244     test  eax, eax
1245     cmovz eax, [edx]
1246     setnz cl
1247     BSR   eax, eax, 0x1f
1248     shr   eax, 4
1249     lea   eax, [eax+ecx*2]
1250     RET
1251 %endif
1252
1253 cglobal coeff_last8, 1,3
1254     pxor m2, m2
1255     LAST_MASK 8, r1d, r0, r2d
1256     xor r1d, 0xff
1257     BSR eax, r1d, 0x1f
1258     RET
1259 %endmacro
1260
1261 INIT_MMX mmx2
1262 COEFF_LAST48
1263 INIT_MMX mmx2, lzcnt
1264 COEFF_LAST48
1265 %endif ; HIGH_BIT_DEPTH
1266
1267 %macro COEFF_LAST 0
1268 cglobal coeff_last15, 1,3
1269     pxor m2, m2
1270     LAST_MASK 15, r1d, r0-SIZEOF_DCTCOEF, r2d
1271     xor r1d, 0xffff
1272     BSR eax, r1d, 0x1f
1273     dec eax
1274     RET
1275
1276 cglobal coeff_last16, 1,3
1277     pxor m2, m2
1278     LAST_MASK 16, r1d, r0, r2d
1279     xor r1d, 0xffff
1280     BSR eax, r1d, 0x1f
1281     RET
1282
1283 %if ARCH_X86_64 == 0
1284 cglobal coeff_last64, 1, 5-mmsize/16
1285     pxor m2, m2
1286     LAST_MASK 16, r2d, r0+SIZEOF_DCTCOEF* 32, r4d
1287     LAST_MASK 16, r3d, r0+SIZEOF_DCTCOEF* 48, r4d
1288     shl r3d, 16
1289     or  r2d, r3d
1290     xor r2d, -1
1291     jne .secondhalf
1292     LAST_MASK 16, r1d, r0+SIZEOF_DCTCOEF* 0, r4d
1293     LAST_MASK 16, r3d, r0+SIZEOF_DCTCOEF*16, r4d
1294     shl r3d, 16
1295     or  r1d, r3d
1296     not r1d
1297     BSR eax, r1d, 0x1f
1298     RET
1299 .secondhalf:
1300     BSR eax, r2d, 0x1f
1301     add eax, 32
1302     RET
1303 %else
1304 cglobal coeff_last64, 1,4
1305     pxor m2, m2
1306     LAST_MASK 16, r1d, r0+SIZEOF_DCTCOEF* 0
1307     LAST_MASK 16, r2d, r0+SIZEOF_DCTCOEF*16
1308     LAST_MASK 16, r3d, r0+SIZEOF_DCTCOEF*32
1309     LAST_MASK 16, r0d, r0+SIZEOF_DCTCOEF*48
1310     shl r2d, 16
1311     shl r0d, 16
1312     or  r1d, r2d
1313     or  r3d, r0d
1314     shl  r3, 32
1315     or   r1, r3
1316     not  r1
1317     BSR rax, r1, 0x3f
1318     RET
1319 %endif
1320 %endmacro
1321
1322 %if ARCH_X86_64 == 0
1323 INIT_MMX mmx2
1324 COEFF_LAST
1325 %endif
1326 INIT_XMM sse2
1327 COEFF_LAST
1328 INIT_XMM sse2, lzcnt
1329 COEFF_LAST
1330
1331 ;-----------------------------------------------------------------------------
1332 ; int coeff_level_run( dctcoef *dct, run_level_t *runlevel )
1333 ;-----------------------------------------------------------------------------
1334
1335 ; t6 = eax for return, t3 = ecx for shift, t[01] = r[01] for x86_64 args
1336 %if WIN64
1337     DECLARE_REG_TMP 3,1,2,0,4,5,6
1338 %elif ARCH_X86_64
1339     DECLARE_REG_TMP 0,1,2,3,4,5,6
1340 %else
1341     DECLARE_REG_TMP 6,3,2,1,4,5,0
1342 %endif
1343
1344 %macro COEFF_LEVELRUN 1
1345 cglobal coeff_level_run%1,0,7
1346     movifnidn t0, r0mp
1347     movifnidn t1, r1mp
1348     pxor    m2, m2
1349     LAST_MASK %1, t5d, t0-(%1&1)*SIZEOF_DCTCOEF, t4d
1350 %if %1==15
1351     shr    t5d, 1
1352 %elif %1==8
1353     and    t5d, 0xff
1354 %elif %1==4
1355     and    t5d, 0xf
1356 %endif
1357     xor    t5d, (1<<%1)-1
1358     mov [t1+4], t5d
1359     shl    t5d, 32-%1
1360     mov    t4d, %1-1
1361     LZCOUNT t3d, t5d, 0x1f
1362     xor    t6d, t6d
1363     add    t5d, t5d
1364     sub    t4d, t3d
1365     shl    t5d, t3b
1366     mov   [t1], t4d
1367 .loop:
1368     LZCOUNT t3d, t5d, 0x1f
1369 %if HIGH_BIT_DEPTH
1370     mov    t2d, [t0+t4*4]
1371 %else
1372     mov    t2w, [t0+t4*2]
1373 %endif
1374     inc    t3d
1375     shl    t5d, t3b
1376 %if HIGH_BIT_DEPTH
1377     mov   [t1+t6*4+ 8], t2d
1378 %else
1379     mov   [t1+t6*2+ 8], t2w
1380 %endif
1381     inc    t6d
1382     sub    t4d, t3d
1383     jge .loop
1384     REP_RET
1385 %endmacro
1386
1387 INIT_MMX mmx2
1388 %if ARCH_X86_64 == 0
1389 COEFF_LEVELRUN 15
1390 COEFF_LEVELRUN 16
1391 %endif
1392 COEFF_LEVELRUN 4
1393 COEFF_LEVELRUN 8
1394 INIT_XMM sse2
1395 %if HIGH_BIT_DEPTH
1396 COEFF_LEVELRUN 8
1397 %endif
1398 COEFF_LEVELRUN 15
1399 COEFF_LEVELRUN 16
1400 INIT_XMM sse2, lzcnt
1401 %if HIGH_BIT_DEPTH
1402 COEFF_LEVELRUN 8
1403 %endif
1404 COEFF_LEVELRUN 15
1405 COEFF_LEVELRUN 16
1406 INIT_MMX mmx2, lzcnt
1407 COEFF_LEVELRUN 4
1408 COEFF_LEVELRUN 8