]> git.sesse.net Git - x264/blob - common/x86/quant-a.asm
645bdc10393c98754383f2dfef464ec10958f663
[x264] / common / x86 / quant-a.asm
1 ;*****************************************************************************
2 ;* quant-a.asm: x86 quantization and level-run
3 ;*****************************************************************************
4 ;* Copyright (C) 2005-2013 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 5
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 5
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     ACCUM      por, %5, 3, %4+mmsize
215 %else ; !sse4
216     QUANT_ONE_AC_MMX %1, %2, %3, %4, %5
217     QUANT_ONE_AC_MMX %1+mmsize, %2+mmsize, %3+mmsize, %4+mmsize, %5
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, 5
248 %assign x x+mmsize*2
249 %endrep
250     QUANT_END
251     RET
252 %endmacro
253
254 %macro QUANT_4x4 2
255     QUANT_TWO_AC r0+%1+mmsize*0, r1+mmsize*0, r2+mmsize*0, mmsize*0, %2
256     QUANT_TWO_AC r0+%1+mmsize*2, r1+mmsize*2, r2+mmsize*2, mmsize*2, %2
257 %endmacro
258
259 %macro QUANT_4x4x4 0
260 cglobal quant_4x4x4, 3,3,8
261     QUANT_4x4  0, 5
262     QUANT_4x4 64, 6
263     add       r0, 128
264     packssdw  m5, m6
265     QUANT_4x4  0, 6
266     QUANT_4x4 64, 7
267     packssdw  m6, m7
268     packssdw  m5, m6
269     packssdw  m5, m5  ; AA BB CC DD
270     packsswb  m5, m5  ; A B C D
271     pxor      m4, m4
272     pcmpeqb   m5, m4
273     pmovmskb eax, m5
274     not      eax
275     and      eax, 0xf
276     RET
277 %endmacro
278
279 INIT_XMM sse2
280 QUANT_DC 2, 2
281 QUANT_DC 4, 4
282 QUANT_AC 4, 4
283 QUANT_AC 8, 8
284 QUANT_4x4x4
285
286 INIT_XMM ssse3
287 QUANT_DC 2, 2
288 QUANT_DC 4, 4
289 QUANT_AC 4, 4
290 QUANT_AC 8, 8
291 QUANT_4x4x4
292
293 INIT_XMM sse4
294 QUANT_DC 2, 2
295 QUANT_DC 4, 4
296 QUANT_AC 4, 4
297 QUANT_AC 8, 8
298 QUANT_4x4x4
299
300 %endif ; HIGH_BIT_DEPTH
301
302 %if HIGH_BIT_DEPTH == 0
303 %macro QUANT_ONE 4
304 ;;; %1      (m64)       dct[y][x]
305 ;;; %2      (m64/mmx)   mf[y][x] or mf[0][0] (as uint16_t)
306 ;;; %3      (m64/mmx)   bias[y][x] or bias[0][0] (as uint16_t)
307     mova       m1, %1   ; load dct coeffs
308     ABSW       m0, m1, sign
309     paddusw    m0, %3   ; round
310     pmulhuw    m0, %2   ; divide
311     PSIGNW     m0, m1   ; restore sign
312     mova       %1, m0   ; store
313     ACCUM     por, 5, 0, %4
314 %endmacro
315
316 %macro QUANT_TWO 8
317     mova       m1, %1
318     mova       m3, %2
319     ABSW       m0, m1, sign
320     ABSW       m2, m3, sign
321     paddusw    m0, %5
322     paddusw    m2, %6
323     pmulhuw    m0, %3
324     pmulhuw    m2, %4
325     PSIGNW     m0, m1
326     PSIGNW     m2, m3
327     mova       %1, m0
328     mova       %2, m2
329     ACCUM     por, %8, 0, %7
330     ACCUM     por, %8, 2, %7+mmsize
331 %endmacro
332
333 ;-----------------------------------------------------------------------------
334 ; void quant_4x4_dc( int16_t dct[16], int mf, int bias )
335 ;-----------------------------------------------------------------------------
336 %macro QUANT_DC 2-3 0
337 cglobal %1, 1,1,%3
338     QUANT_DC_START
339 %if %2==1
340     QUANT_ONE [r0], m6, m7, 0
341 %else
342 %assign x 0
343 %rep %2/2
344     QUANT_TWO [r0+x], [r0+x+mmsize], m6, m6, m7, m7, x, 5
345 %assign x x+mmsize*2
346 %endrep
347 %endif
348     QUANT_END
349     RET
350 %endmacro
351
352 ;-----------------------------------------------------------------------------
353 ; int quant_4x4( int16_t dct[16], uint16_t mf[16], uint16_t bias[16] )
354 ;-----------------------------------------------------------------------------
355 %macro QUANT_AC 2
356 cglobal %1, 3,3
357 %assign x 0
358 %rep %2/2
359     QUANT_TWO [r0+x], [r0+x+mmsize], [r1+x], [r1+x+mmsize], [r2+x], [r2+x+mmsize], x, 5
360 %assign x x+mmsize*2
361 %endrep
362     QUANT_END
363     RET
364 %endmacro
365
366 %macro QUANT_4x4 2
367 %if UNIX64
368     QUANT_TWO [r0+%1+mmsize*0], [r0+%1+mmsize*1], m8, m9, m10, m11, mmsize*0, %2
369 %else
370     QUANT_TWO [r0+%1+mmsize*0], [r0+%1+mmsize*1], [r1+mmsize*0], [r1+mmsize*1], [r2+mmsize*0], [r2+mmsize*1], mmsize*0, %2
371 %if mmsize==8
372     QUANT_TWO [r0+%1+mmsize*2], [r0+%1+mmsize*3], [r1+mmsize*2], [r1+mmsize*3], [r2+mmsize*2], [r2+mmsize*3], mmsize*2, %2
373 %endif
374 %endif
375 %endmacro
376
377 %macro QUANT_4x4x4 0
378 cglobal quant_4x4x4, 3,3,7
379 %if UNIX64
380     mova      m8, [r1+mmsize*0]
381     mova      m9, [r1+mmsize*1]
382     mova     m10, [r2+mmsize*0]
383     mova     m11, [r2+mmsize*1]
384 %endif
385     QUANT_4x4  0, 4
386     QUANT_4x4 32, 5
387     packssdw  m4, m5
388     QUANT_4x4 64, 5
389     QUANT_4x4 96, 6
390     packssdw  m5, m6
391     packssdw  m4, m5
392 %if mmsize == 16
393     packssdw  m4, m4  ; AA BB CC DD
394 %endif
395     packsswb  m4, m4  ; A B C D
396     pxor      m3, m3
397     pcmpeqb   m4, m3
398     pmovmskb eax, m4
399     not      eax
400     and      eax, 0xf
401     RET
402 %endmacro
403
404 INIT_MMX mmx2
405 QUANT_DC quant_2x2_dc, 1
406 %if ARCH_X86_64 == 0 ; not needed because sse2 is faster
407 QUANT_DC quant_4x4_dc, 4
408 INIT_MMX mmx
409 QUANT_AC quant_4x4, 4
410 QUANT_AC quant_8x8, 16
411 QUANT_4x4x4
412 %endif
413
414 INIT_XMM sse2
415 QUANT_DC quant_4x4_dc, 2, 8
416 QUANT_AC quant_4x4, 2
417 QUANT_AC quant_8x8, 8
418 QUANT_4x4x4
419
420 INIT_XMM ssse3
421 QUANT_DC quant_4x4_dc, 2, 8
422 QUANT_AC quant_4x4, 2
423 QUANT_AC quant_8x8, 8
424 QUANT_4x4x4
425
426 INIT_MMX ssse3
427 QUANT_DC quant_2x2_dc, 1
428
429 INIT_XMM sse4
430 ;Not faster on Conroe, so only used in SSE4 versions
431 QUANT_DC quant_4x4_dc, 2, 8
432 QUANT_AC quant_4x4, 2
433 QUANT_AC quant_8x8, 8
434 %endif ; !HIGH_BIT_DEPTH
435
436
437
438 ;=============================================================================
439 ; dequant
440 ;=============================================================================
441
442 %macro DEQUANT16_L 3
443 ;;; %1      dct[y][x]
444 ;;; %2,%3   dequant_mf[i_mf][y][x]
445 ;;; m2      i_qbits
446     mova     m0, %2
447 %if HIGH_BIT_DEPTH
448     pmaddwd  m0, %1
449     pslld    m0, m2
450 %else
451     packssdw m0, %3
452     pmullw   m0, %1
453     psllw    m0, m2
454 %endif
455     mova     %1, m0
456 %endmacro
457
458 %macro DEQUANT32_R 3
459 ;;; %1      dct[y][x]
460 ;;; %2,%3   dequant_mf[i_mf][y][x]
461 ;;; m2      -i_qbits
462 ;;; m3      f
463 ;;; m4      0
464     mova      m0, %1
465 %if HIGH_BIT_DEPTH
466     pmadcswd  m0, m0, %2, m3
467     psrad     m0, m2
468 %else
469     punpckhwd m1, m0, m4
470     punpcklwd m0, m4
471     pmadcswd  m0, m0, %2, m3
472     pmadcswd  m1, m1, %3, m3
473     psrad     m0, m2
474     psrad     m1, m2
475     packssdw  m0, m1
476 %endif
477     mova      %1, m0
478 %endmacro
479
480 %macro DEQUANT_LOOP 3
481 %if 8*(%2-2*%3)
482     mov t0d, 8*(%2-2*%3)
483 %%loop:
484     %1 [r0+(t0     )*SIZEOF_PIXEL], [r1+t0*2      ], [r1+t0*2+ 8*%3]
485     %1 [r0+(t0+8*%3)*SIZEOF_PIXEL], [r1+t0*2+16*%3], [r1+t0*2+24*%3]
486     sub t0d, 16*%3
487     jge %%loop
488     RET
489 %else
490     %1 [r0+(8*%3)*SIZEOF_PIXEL], [r1+16*%3], [r1+24*%3]
491     %1 [r0+(0   )*SIZEOF_PIXEL], [r1+0    ], [r1+ 8*%3]
492     RET
493 %endif
494 %endmacro
495
496 %macro DEQUANT16_FLAT 2-5
497     mova   m0, %1
498     psllw  m0, m4
499 %assign i %0-2
500 %rep %0-1
501 %if i
502     mova   m %+ i, [r0+%2]
503     pmullw m %+ i, m0
504 %else
505     pmullw m0, [r0+%2]
506 %endif
507     mova   [r0+%2], m %+ i
508     %assign i i-1
509     %rotate 1
510 %endrep
511 %endmacro
512
513 %if WIN64
514     DECLARE_REG_TMP 6,3,2
515 %elif ARCH_X86_64
516     DECLARE_REG_TMP 4,3,2
517 %else
518     DECLARE_REG_TMP 2,0,1
519 %endif
520
521 %macro DEQUANT_START 2
522     movifnidn t2d, r2m
523     imul t0d, t2d, 0x2b
524     shr  t0d, 8     ; i_qbits = i_qp / 6
525     lea  t1, [t0*3]
526     sub  t2d, t1d
527     sub  t2d, t1d   ; i_mf = i_qp % 6
528     shl  t2d, %1
529 %if ARCH_X86_64
530     add  r1, t2     ; dequant_mf[i_mf]
531 %else
532     add  r1, r1mp   ; dequant_mf[i_mf]
533     mov  r0, r0mp   ; dct
534 %endif
535     sub  t0d, %2
536     jl   .rshift32  ; negative qbits => rightshift
537 %endmacro
538
539 ;-----------------------------------------------------------------------------
540 ; void dequant_4x4( dctcoef dct[4][4], int dequant_mf[6][4][4], int i_qp )
541 ;-----------------------------------------------------------------------------
542 %macro DEQUANT 3
543 cglobal dequant_%1x%1, 0,3,6
544 .skip_prologue:
545     DEQUANT_START %2+2, %2
546
547 .lshift:
548     movd m2, t0d
549     DEQUANT_LOOP DEQUANT16_L, %1*%1/4, %3
550
551 .rshift32:
552     neg   t0d
553     movd  m2, t0d
554     mova  m3, [pd_1]
555     pxor  m4, m4
556     pslld m3, m2
557     psrld m3, 1
558     DEQUANT_LOOP DEQUANT32_R, %1*%1/4, %3
559
560 %if HIGH_BIT_DEPTH == 0 && notcpuflag(avx)
561 cglobal dequant_%1x%1_flat16, 0,3
562     movifnidn t2d, r2m
563 %if %1 == 8
564     cmp  t2d, 12
565     jl dequant_%1x%1 %+ SUFFIX %+ .skip_prologue
566     sub  t2d, 12
567 %endif
568     imul t0d, t2d, 0x2b
569     shr  t0d, 8     ; i_qbits = i_qp / 6
570     lea  t1, [t0*3]
571     sub  t2d, t1d
572     sub  t2d, t1d   ; i_mf = i_qp % 6
573     shl  t2d, %2
574 %ifdef PIC
575     lea  r1, [dequant%1_scale]
576     add  r1, t2
577 %else
578     lea  r1, [dequant%1_scale + t2]
579 %endif
580     movifnidn r0, r0mp
581     movd m4, t0d
582 %if %1 == 4
583 %if mmsize == 8
584     DEQUANT16_FLAT [r1], 0, 16
585     DEQUANT16_FLAT [r1+8], 8, 24
586 %else
587     DEQUANT16_FLAT [r1], 0, 16
588 %endif
589 %elif mmsize == 8
590     DEQUANT16_FLAT [r1], 0, 8, 64, 72
591     DEQUANT16_FLAT [r1+16], 16, 24, 48, 56
592     DEQUANT16_FLAT [r1+16], 80, 88, 112, 120
593     DEQUANT16_FLAT [r1+32], 32, 40, 96, 104
594 %else
595     DEQUANT16_FLAT [r1], 0, 64
596     DEQUANT16_FLAT [r1+16], 16, 48, 80, 112
597     DEQUANT16_FLAT [r1+32], 32, 96
598 %endif
599     RET
600 %endif ; !HIGH_BIT_DEPTH && !AVX
601 %endmacro ; DEQUANT
602
603 %if HIGH_BIT_DEPTH
604 INIT_XMM sse2
605 DEQUANT 4, 4, 1
606 DEQUANT 8, 6, 1
607 INIT_XMM xop
608 DEQUANT 4, 4, 1
609 DEQUANT 8, 6, 1
610 %else
611 %if ARCH_X86_64 == 0
612 INIT_MMX mmx
613 DEQUANT 4, 4, 1
614 DEQUANT 8, 6, 1
615 %endif
616 INIT_XMM sse2
617 DEQUANT 4, 4, 2
618 DEQUANT 8, 6, 2
619 INIT_XMM avx
620 DEQUANT 4, 4, 2
621 DEQUANT 8, 6, 2
622 INIT_XMM xop
623 DEQUANT 4, 4, 2
624 DEQUANT 8, 6, 2
625 %endif
626
627 %macro DEQUANT_DC 2
628 cglobal dequant_4x4dc, 0,3,6
629     DEQUANT_START 6, 6
630
631 .lshift:
632     movd     m3, [r1]
633     movd     m2, t0d
634     pslld    m3, m2
635     SPLAT%1  m3, m3, 0
636 %assign x 0
637 %rep SIZEOF_PIXEL*16/mmsize
638     mova     m0, [r0+mmsize*0+x]
639     mova     m1, [r0+mmsize*1+x]
640     %2       m0, m3
641     %2       m1, m3
642     mova     [r0+mmsize*0+x], m0
643     mova     [r0+mmsize*1+x], m1
644 %assign x x+mmsize*2
645 %endrep
646     RET
647
648 .rshift32:
649     neg   t0d
650     movd  m3, t0d
651     mova  m4, [p%1_1]
652     mova  m5, m4
653     pslld m4, m3
654     psrld m4, 1
655     movd  m2, [r1]
656 %assign x 0
657 %if HIGH_BIT_DEPTH
658     pshufd m2, m2, 0
659 %rep SIZEOF_PIXEL*32/mmsize
660     mova      m0, [r0+x]
661     pmadcswd  m0, m0, m2, m4
662     psrad     m0, m3
663     mova      [r0+x], m0
664 %assign x x+mmsize
665 %endrep
666
667 %else ; !HIGH_BIT_DEPTH
668     PSHUFLW   m2, m2, 0
669     punpcklwd m2, m4
670 %rep SIZEOF_PIXEL*32/mmsize
671     mova      m0, [r0+x]
672     punpckhwd m1, m0, m5
673     punpcklwd m0, m5
674     pmaddwd   m0, m2
675     pmaddwd   m1, m2
676     psrad     m0, m3
677     psrad     m1, m3
678     packssdw  m0, m1
679     mova      [r0+x], m0
680 %assign x x+mmsize
681 %endrep
682 %endif ; !HIGH_BIT_DEPTH
683     RET
684 %endmacro
685
686 %if HIGH_BIT_DEPTH
687 INIT_XMM sse2
688 DEQUANT_DC d, pmaddwd
689 INIT_XMM xop
690 DEQUANT_DC d, pmaddwd
691 %else
692 %if ARCH_X86_64 == 0
693 INIT_MMX mmx2
694 DEQUANT_DC w, pmullw
695 %endif
696 INIT_XMM sse2
697 DEQUANT_DC w, pmullw
698 INIT_XMM avx
699 DEQUANT_DC w, pmullw
700 %endif
701
702 ; t4 is eax for return value.
703 %if ARCH_X86_64
704     DECLARE_REG_TMP 0,1,2,3,6,4  ; Identical for both Windows and *NIX
705 %else
706     DECLARE_REG_TMP 4,1,2,3,0,5
707 %endif
708
709 ;-----------------------------------------------------------------------------
710 ; x264_optimize_chroma_2x2_dc( dctcoef dct[4], int dequant_mf )
711 ;-----------------------------------------------------------------------------
712
713 %macro OPTIMIZE_CHROMA_2x2_DC 0
714 %assign %%regs 5
715 %if cpuflag(sse4)
716     %assign %%regs %%regs-1
717 %endif
718 %if ARCH_X86_64 == 0
719     %assign %%regs %%regs+1      ; t0-t4 are volatile on x86-64
720 %endif
721 cglobal optimize_chroma_2x2_dc, 0,%%regs,7
722     movifnidn t0, r0mp
723     movd      m2, r1m
724     movq      m1, [t0]
725 %if cpuflag(sse4)
726     pcmpeqb   m4, m4
727     pslld     m4, 11
728 %else
729     pxor      m4, m4
730 %endif
731 %if cpuflag(ssse3)
732     mova      m3, [chroma_dc_dct_mask]
733     mova      m5, [chroma_dc_dmf_mask]
734 %else
735     mova      m3, [chroma_dc_dct_mask_mmx]
736     mova      m5, [chroma_dc_dmf_mask_mmx]
737 %endif
738     pshuflw   m2, m2, 0
739     pshufd    m0, m1, q0101      ;  1  0  3  2  1  0  3  2
740     punpcklqdq m2, m2
741     punpcklqdq m1, m1            ;  3  2  1  0  3  2  1  0
742     mova      m6, [pd_1024]      ; 32<<5, elements are shifted 5 bits to the left
743     PSIGNW    m0, m3             ; -1 -0  3  2 -1 -0  3  2
744     PSIGNW    m2, m5             ;  +  -  -  +  -  -  +  +
745     paddw     m0, m1             ; -1+3 -0+2  1+3  0+2 -1+3 -0+2  1+3  0+2
746     pmaddwd   m0, m2             ;  0-1-2+3  0-1+2-3  0+1-2-3  0+1+2+3  * dmf
747     punpcklwd m1, m1
748     psrad     m2, 16             ;  +  -  -  +
749     mov      t1d, 3
750     paddd     m0, m6
751     xor      t4d, t4d
752 %if notcpuflag(ssse3)
753     psrad     m1, 31             ; has to be 0 or -1 in order for PSIGND_MMX to work correctly
754 %endif
755 %if cpuflag(sse4)
756     ptest     m0, m4
757 %else
758     mova      m6, m0
759     SWAP       0, 6
760     psrad     m6, 11
761     pcmpeqd   m6, m4
762     pmovmskb t5d, m6
763     cmp      t5d, 0xffff
764 %endif
765     jz .ret                      ; if the DC coefficients already round to zero, terminate early
766     mova      m3, m0
767 .outer_loop:
768     movsx    t3d, word [t0+2*t1] ; dct[coeff]
769     pshufd    m6, m1, q3333
770     pshufd    m1, m1, q2100      ; move the next element to high dword
771     PSIGND    m5, m2, m6
772     test     t3d, t3d
773     jz .loop_end
774 .outer_loop_0:
775     mov      t2d, t3d
776     sar      t3d, 31
777     or       t3d, 1
778 .inner_loop:
779     psubd     m3, m5             ; coeff -= sign
780     pxor      m6, m0, m3
781 %if cpuflag(sse4)
782     ptest     m6, m4
783 %else
784     psrad     m6, 11
785     pcmpeqd   m6, m4
786     pmovmskb t5d, m6
787     cmp      t5d, 0xffff
788 %endif
789     jz .round_coeff
790     paddd     m3, m5             ; coeff += sign
791     mov      t4d, 1
792 .loop_end:
793     dec      t1d
794     jz .last_coeff
795     pshufd    m2, m2, q1320      ;  -  +  -  +  /  -  -  +  +
796     jg .outer_loop
797 .ret:
798     REP_RET
799 .round_coeff:
800     sub      t2d, t3d
801     mov [t0+2*t1], t2w
802     jnz .inner_loop
803     jmp .loop_end
804 .last_coeff:
805     movsx    t3d, word [t0]
806     punpcklqdq m2, m2            ;  +  +  +  +
807     PSIGND    m5, m2, m1
808     test     t3d, t3d
809     jnz .outer_loop_0
810     RET
811 %endmacro
812
813 %if HIGH_BIT_DEPTH == 0
814 INIT_XMM sse2
815 OPTIMIZE_CHROMA_2x2_DC
816 INIT_XMM ssse3
817 OPTIMIZE_CHROMA_2x2_DC
818 INIT_XMM sse4
819 OPTIMIZE_CHROMA_2x2_DC
820 INIT_XMM avx
821 OPTIMIZE_CHROMA_2x2_DC
822 %endif ; !HIGH_BIT_DEPTH
823
824 %if HIGH_BIT_DEPTH
825 ;-----------------------------------------------------------------------------
826 ; void denoise_dct( int32_t *dct, uint32_t *sum, uint32_t *offset, int size )
827 ;-----------------------------------------------------------------------------
828 %macro DENOISE_DCT 0
829 cglobal denoise_dct, 4,4,8
830     pxor      m6, m6
831     movsxdifnidn r3, r3d
832 .loop:
833     mova      m2, [r0+r3*4-2*mmsize]
834     mova      m3, [r0+r3*4-1*mmsize]
835     ABSD      m0, m2
836     ABSD      m1, m3
837     mova      m4, m0
838     mova      m5, m1
839     psubd     m0, [r2+r3*4-2*mmsize]
840     psubd     m1, [r2+r3*4-1*mmsize]
841     pcmpgtd   m7, m0, m6
842     pand      m0, m7
843     pcmpgtd   m7, m1, m6
844     pand      m1, m7
845     PSIGND    m0, m2
846     PSIGND    m1, m3
847     mova      [r0+r3*4-2*mmsize], m0
848     mova      [r0+r3*4-1*mmsize], m1
849     paddd     m4, [r1+r3*4-2*mmsize]
850     paddd     m5, [r1+r3*4-1*mmsize]
851     mova      [r1+r3*4-2*mmsize], m4
852     mova      [r1+r3*4-1*mmsize], m5
853     sub       r3, mmsize/2
854     jg .loop
855     RET
856 %endmacro
857
858 %if ARCH_X86_64 == 0
859 INIT_MMX mmx
860 DENOISE_DCT
861 %endif
862 INIT_XMM sse2
863 DENOISE_DCT
864 INIT_XMM ssse3
865 DENOISE_DCT
866 INIT_XMM avx
867 DENOISE_DCT
868
869 %else ; !HIGH_BIT_DEPTH
870
871 ;-----------------------------------------------------------------------------
872 ; void denoise_dct( int16_t *dct, uint32_t *sum, uint16_t *offset, int size )
873 ;-----------------------------------------------------------------------------
874 %macro DENOISE_DCT 0
875 cglobal denoise_dct, 4,4,7
876     pxor      m6, m6
877     movsxdifnidn r3, r3d
878 .loop:
879     mova      m2, [r0+r3*2-2*mmsize]
880     mova      m3, [r0+r3*2-1*mmsize]
881     ABSW      m0, m2, sign
882     ABSW      m1, m3, sign
883     psubusw   m4, m0, [r2+r3*2-2*mmsize]
884     psubusw   m5, m1, [r2+r3*2-1*mmsize]
885     PSIGNW    m4, m2
886     PSIGNW    m5, m3
887     mova      [r0+r3*2-2*mmsize], m4
888     mova      [r0+r3*2-1*mmsize], m5
889     punpcklwd m2, m0, m6
890     punpcklwd m3, m1, m6
891     punpckhwd m0, m6
892     punpckhwd m1, m6
893     paddd     m2, [r1+r3*4-4*mmsize]
894     paddd     m0, [r1+r3*4-3*mmsize]
895     paddd     m3, [r1+r3*4-2*mmsize]
896     paddd     m1, [r1+r3*4-1*mmsize]
897     mova      [r1+r3*4-4*mmsize], m2
898     mova      [r1+r3*4-3*mmsize], m0
899     mova      [r1+r3*4-2*mmsize], m3
900     mova      [r1+r3*4-1*mmsize], m1
901     sub       r3, mmsize
902     jg .loop
903     RET
904 %endmacro
905
906 %if ARCH_X86_64 == 0
907 INIT_MMX mmx
908 DENOISE_DCT
909 %endif
910 INIT_XMM sse2
911 DENOISE_DCT
912 INIT_XMM ssse3
913 DENOISE_DCT
914 INIT_XMM avx
915 DENOISE_DCT
916
917 %endif ; !HIGH_BIT_DEPTH
918
919 ;-----------------------------------------------------------------------------
920 ; int decimate_score( dctcoef *dct )
921 ;-----------------------------------------------------------------------------
922
923 %macro DECIMATE_MASK 5
924 %if mmsize==16
925 %if HIGH_BIT_DEPTH
926     movdqa   xmm0, [%3+ 0]
927     movdqa   xmm1, [%3+32]
928     packssdw xmm0, [%3+16]
929     packssdw xmm1, [%3+48]
930     ABSW2    xmm0, xmm1, xmm0, xmm1, xmm3, xmm4
931 %else
932     ABSW     xmm0, [%3+ 0], xmm3
933     ABSW     xmm1, [%3+16], xmm4
934 %endif
935     packsswb xmm0, xmm1
936     pxor     xmm2, xmm2
937     pcmpeqb  xmm2, xmm0
938     pcmpgtb  xmm0, %4
939     pmovmskb %1, xmm2
940     pmovmskb %2, xmm0
941
942 %else ; mmsize==8
943 %if HIGH_BIT_DEPTH
944     movq      mm0, [%3+ 0]
945     movq      mm1, [%3+16]
946     movq      mm2, [%3+32]
947     movq      mm3, [%3+48]
948     packssdw  mm0, [%3+ 8]
949     packssdw  mm1, [%3+24]
950     packssdw  mm2, [%3+40]
951     packssdw  mm3, [%3+56]
952 %else
953     movq      mm0, [%3+ 0]
954     movq      mm1, [%3+ 8]
955     movq      mm2, [%3+16]
956     movq      mm3, [%3+24]
957 %endif
958     ABSW2     mm0, mm1, mm0, mm1, mm6, mm7
959     ABSW2     mm2, mm3, mm2, mm3, mm6, mm7
960     packsswb  mm0, mm1
961     packsswb  mm2, mm3
962     pxor      mm4, mm4
963     pxor      mm6, mm6
964     pcmpeqb   mm4, mm0
965     pcmpeqb   mm6, mm2
966     pcmpgtb   mm0, %4
967     pcmpgtb   mm2, %4
968     pmovmskb   %5, mm4
969     pmovmskb   %1, mm6
970     shl        %1, 8
971     or         %1, %5
972     pmovmskb   %5, mm0
973     pmovmskb   %2, mm2
974     shl        %2, 8
975     or         %2, %5
976 %endif
977 %endmacro
978
979 cextern decimate_table4
980 cextern decimate_table8
981
982 %macro DECIMATE4x4 1
983
984 ;A LUT is faster than bsf on older AMD processors.
985 ;This is not true for score64.
986 cglobal decimate_score%1, 1,3
987 %ifdef PIC
988     lea r4, [decimate_table4]
989     lea r5, [decimate_mask_table4]
990     %define table r4
991     %define mask_table r5
992 %else
993     %define table decimate_table4
994     %define mask_table decimate_mask_table4
995 %endif
996     DECIMATE_MASK edx, eax, r0, [pb_1], ecx
997     xor   edx, 0xffff
998     je   .ret
999     test  eax, eax
1000     jne  .ret9
1001 %if %1==15
1002     shr   edx, 1
1003 %endif
1004 %if cpuflag(slowctz)
1005     movzx ecx, dl
1006     movzx eax, byte [mask_table + rcx]
1007     cmp   edx, ecx
1008     je   .ret
1009     bsr   ecx, ecx
1010     shr   edx, 1
1011     shr   edx, cl
1012     bsf   ecx, edx
1013     shr   edx, 1
1014     shr   edx, cl
1015     add    al, byte [table + rcx]
1016     add    al, byte [mask_table + rdx]
1017 %else
1018 .loop:
1019     tzcnt ecx, edx
1020     shr   edx, cl
1021     add    al, byte [table + rcx]
1022     shr   edx, 1
1023     jne  .loop
1024 %endif
1025 .ret:
1026     REP_RET
1027 .ret9:
1028     mov   eax, 9
1029     RET
1030
1031 %endmacro
1032
1033 %if ARCH_X86_64 == 0
1034 INIT_MMX mmx2
1035 DECIMATE4x4 15
1036 DECIMATE4x4 16
1037 INIT_MMX mmx2, slowctz
1038 DECIMATE4x4 15
1039 DECIMATE4x4 16
1040 %endif
1041 INIT_XMM sse2
1042 DECIMATE4x4 15
1043 DECIMATE4x4 16
1044 INIT_XMM sse2, slowctz
1045 DECIMATE4x4 15
1046 DECIMATE4x4 16
1047 INIT_XMM ssse3
1048 DECIMATE4x4 15
1049 DECIMATE4x4 16
1050 INIT_XMM ssse3, slowctz
1051 DECIMATE4x4 15
1052 DECIMATE4x4 16
1053
1054 %macro DECIMATE8x8 0
1055
1056 %if ARCH_X86_64
1057 cglobal decimate_score64, 1,5
1058 %ifdef PIC
1059     lea r4, [decimate_table8]
1060     %define table r4
1061 %else
1062     %define table decimate_table8
1063 %endif
1064     mova  m5, [pb_1]
1065     DECIMATE_MASK r1d, eax, r0+SIZEOF_DCTCOEF* 0, m5, null
1066     test  eax, eax
1067     jne  .ret9
1068     DECIMATE_MASK r2d, eax, r0+SIZEOF_DCTCOEF*16, m5, null
1069     shl   r2d, 16
1070     or    r1d, r2d
1071     DECIMATE_MASK r2d, r3d, r0+SIZEOF_DCTCOEF*32, m5, null
1072     shl   r2, 32
1073     or    eax, r3d
1074     or    r1, r2
1075     DECIMATE_MASK r2d, r3d, r0+SIZEOF_DCTCOEF*48, m5, null
1076     shl   r2, 48
1077     or    r1, r2
1078     xor   r1, -1
1079     je   .ret
1080     add   eax, r3d
1081     jne  .ret9
1082 .loop:
1083     tzcnt rcx, r1
1084     shr   r1, cl
1085     add   al, byte [table + rcx]
1086     shr   r1, 1
1087     jne  .loop
1088 .ret:
1089     REP_RET
1090 .ret9:
1091     mov   eax, 9
1092     RET
1093
1094 %else ; ARCH
1095 %if mmsize == 8
1096 cglobal decimate_score64, 1,6
1097 %else
1098 cglobal decimate_score64, 1,5
1099 %endif
1100     mova  m5, [pb_1]
1101     DECIMATE_MASK r3, r2, r0+SIZEOF_DCTCOEF* 0, m5, r5
1102     test  r2, r2
1103     jne  .ret9
1104     DECIMATE_MASK r4, r2, r0+SIZEOF_DCTCOEF*16, m5, r5
1105     shl   r4, 16
1106     or    r3, r4
1107     DECIMATE_MASK r4, r1, r0+SIZEOF_DCTCOEF*32, m5, r5
1108     or    r2, r1
1109     DECIMATE_MASK r1, r0, r0+SIZEOF_DCTCOEF*48, m5, r5
1110     shl   r1, 16
1111     or    r4, r1
1112     xor   r3, -1
1113     je   .tryret
1114     xor   r4, -1
1115 .cont:
1116     add   r0, r2
1117     jne  .ret9      ;r0 is zero at this point, so we don't need to zero it
1118 .loop:
1119     tzcnt ecx, r3
1120     test  r3, r3
1121     je   .largerun
1122     shrd  r3, r4, cl
1123     shr   r4, cl
1124     add   r0b, byte [decimate_table8 + ecx]
1125     shrd  r3, r4, 1
1126     shr   r4, 1
1127     cmp   r0, 6     ;score64's threshold is never higher than 6
1128     jge  .ret9      ;this early termination is only useful on 32-bit because it can be done in the latency after shrd
1129     test  r3, r3
1130     jne  .loop
1131     test  r4, r4
1132     jne  .loop
1133 .ret:
1134     REP_RET
1135 .tryret:
1136     xor   r4, -1
1137     jne  .cont
1138     RET
1139 .ret9:
1140     mov   eax, 9
1141     RET
1142 .largerun:
1143     mov   r3, r4
1144     xor   r4, r4
1145     tzcnt ecx, r3
1146     shr   r3, cl
1147     shr   r3, 1
1148     jne  .loop
1149     RET
1150 %endif ; ARCH
1151
1152 %endmacro
1153
1154 %if ARCH_X86_64 == 0
1155 INIT_MMX mmx2
1156 DECIMATE8x8
1157 %endif
1158 INIT_XMM sse2
1159 DECIMATE8x8
1160 INIT_XMM ssse3
1161 DECIMATE8x8
1162
1163 ;-----------------------------------------------------------------------------
1164 ; int coeff_last( dctcoef *dct )
1165 ;-----------------------------------------------------------------------------
1166
1167 %macro BSR 3
1168 %if cpuflag(lzcnt)
1169     lzcnt %1, %2
1170     xor %1, %3
1171 %else
1172     bsr %1, %2
1173 %endif
1174 %endmacro
1175
1176 %macro LZCOUNT 3
1177 %if cpuflag(lzcnt)
1178     lzcnt %1, %2
1179 %else
1180     bsr %1, %2
1181     xor %1, %3
1182 %endif
1183 %endmacro
1184
1185 %if HIGH_BIT_DEPTH
1186 %macro LAST_MASK 3-4
1187 %if %1 == 4
1188     movq     mm0, [%3]
1189     packssdw mm0, [%3+8]
1190     packsswb mm0, mm0
1191     pcmpeqb  mm0, mm2
1192     pmovmskb  %2, mm0
1193 %elif mmsize == 16
1194     movdqa   xmm0, [%3+ 0]
1195 %if %1 == 8
1196     packssdw xmm0, [%3+16]
1197     packsswb xmm0, xmm0
1198 %else
1199     movdqa   xmm1, [%3+32]
1200     packssdw xmm0, [%3+16]
1201     packssdw xmm1, [%3+48]
1202     packsswb xmm0, xmm1
1203 %endif
1204     pcmpeqb  xmm0, xmm2
1205     pmovmskb   %2, xmm0
1206 %elif %1 == 8
1207     movq     mm0, [%3+ 0]
1208     movq     mm1, [%3+16]
1209     packssdw mm0, [%3+ 8]
1210     packssdw mm1, [%3+24]
1211     packsswb mm0, mm1
1212     pcmpeqb  mm0, mm2
1213     pmovmskb  %2, mm0
1214 %else
1215     movq     mm0, [%3+ 0]
1216     movq     mm1, [%3+16]
1217     packssdw mm0, [%3+ 8]
1218     packssdw mm1, [%3+24]
1219     movq     mm3, [%3+32]
1220     movq     mm4, [%3+48]
1221     packssdw mm3, [%3+40]
1222     packssdw mm4, [%3+56]
1223     packsswb mm0, mm1
1224     packsswb mm3, mm4
1225     pcmpeqb  mm0, mm2
1226     pcmpeqb  mm3, mm2
1227     pmovmskb  %2, mm0
1228     pmovmskb  %4, mm3
1229     shl       %4, 8
1230     or        %2, %4
1231 %endif
1232 %endmacro
1233
1234 %macro COEFF_LAST4 0
1235 cglobal coeff_last4, 1,3
1236     pxor mm2, mm2
1237     LAST_MASK 4, r1d, r0
1238     xor  r1d, 0xff
1239     shr  r1d, 4
1240     BSR  eax, r1d, 0x1f
1241     RET
1242 %endmacro
1243
1244 INIT_MMX mmx2
1245 COEFF_LAST4
1246 INIT_MMX mmx2, lzcnt
1247 COEFF_LAST4
1248
1249 %macro COEFF_LAST8 0
1250 cglobal coeff_last8, 1,3
1251     pxor m2, m2
1252     LAST_MASK 8, r1d, r0
1253 %if mmsize == 16
1254     xor r1d, 0xffff
1255     shr r1d, 8
1256 %else
1257     xor r1d, 0xff
1258 %endif
1259     BSR eax, r1d, 0x1f
1260     RET
1261 %endmacro
1262
1263 %if ARCH_X86_64 == 0
1264 INIT_MMX mmx2
1265 COEFF_LAST8
1266 %endif
1267 INIT_XMM sse2
1268 COEFF_LAST8
1269 INIT_XMM sse2, lzcnt
1270 COEFF_LAST8
1271
1272 %else ; !HIGH_BIT_DEPTH
1273 %macro LAST_MASK 3-4
1274 %if %1 <= 8
1275     movq     mm0, [%3+ 0]
1276 %if %1 == 4
1277     packsswb mm0, mm0
1278 %else
1279     packsswb mm0, [%3+ 8]
1280 %endif
1281     pcmpeqb  mm0, mm2
1282     pmovmskb  %2, mm0
1283 %elif mmsize == 16
1284     movdqa   xmm0, [%3+ 0]
1285     packsswb xmm0, [%3+16]
1286     pcmpeqb  xmm0, xmm2
1287     pmovmskb   %2, xmm0
1288 %else
1289     movq     mm0, [%3+ 0]
1290     movq     mm1, [%3+16]
1291     packsswb mm0, [%3+ 8]
1292     packsswb mm1, [%3+24]
1293     pcmpeqb  mm0, mm2
1294     pcmpeqb  mm1, mm2
1295     pmovmskb  %2, mm0
1296     pmovmskb  %4, mm1
1297     shl       %4, 8
1298     or        %2, %4
1299 %endif
1300 %endmacro
1301
1302 %macro COEFF_LAST48 0
1303 %if ARCH_X86_64
1304 cglobal coeff_last4, 1,1
1305     BSR  rax, [r0], 0x3f
1306     shr  eax, 4
1307     RET
1308 %else
1309 cglobal coeff_last4, 0,3
1310     mov   edx, r0mp
1311     mov   eax, [edx+4]
1312     xor   ecx, ecx
1313     test  eax, eax
1314     cmovz eax, [edx]
1315     setnz cl
1316     BSR   eax, eax, 0x1f
1317     shr   eax, 4
1318     lea   eax, [eax+ecx*2]
1319     RET
1320 %endif
1321
1322 cglobal coeff_last8, 1,3
1323     pxor m2, m2
1324     LAST_MASK 8, r1d, r0, r2d
1325     xor r1d, 0xff
1326     BSR eax, r1d, 0x1f
1327     RET
1328 %endmacro
1329
1330 INIT_MMX mmx2
1331 COEFF_LAST48
1332 INIT_MMX mmx2, lzcnt
1333 COEFF_LAST48
1334 %endif ; HIGH_BIT_DEPTH
1335
1336 %macro COEFF_LAST 0
1337 cglobal coeff_last15, 1,3
1338     pxor m2, m2
1339     LAST_MASK 15, r1d, r0-SIZEOF_DCTCOEF, r2d
1340     xor r1d, 0xffff
1341     BSR eax, r1d, 0x1f
1342     dec eax
1343     RET
1344
1345 cglobal coeff_last16, 1,3
1346     pxor m2, m2
1347     LAST_MASK 16, r1d, r0, r2d
1348     xor r1d, 0xffff
1349     BSR eax, r1d, 0x1f
1350     RET
1351
1352 %if ARCH_X86_64 == 0
1353 cglobal coeff_last64, 1, 5-mmsize/16
1354     pxor m2, m2
1355     LAST_MASK 16, r2d, r0+SIZEOF_DCTCOEF* 32, r4d
1356     LAST_MASK 16, r3d, r0+SIZEOF_DCTCOEF* 48, r4d
1357     shl r3d, 16
1358     or  r2d, r3d
1359     xor r2d, -1
1360     jne .secondhalf
1361     LAST_MASK 16, r1d, r0+SIZEOF_DCTCOEF* 0, r4d
1362     LAST_MASK 16, r3d, r0+SIZEOF_DCTCOEF*16, r4d
1363     shl r3d, 16
1364     or  r1d, r3d
1365     not r1d
1366     BSR eax, r1d, 0x1f
1367     RET
1368 .secondhalf:
1369     BSR eax, r2d, 0x1f
1370     add eax, 32
1371     RET
1372 %else
1373 cglobal coeff_last64, 1,3
1374     pxor m2, m2
1375     LAST_MASK 16, r1d, r0+SIZEOF_DCTCOEF* 0
1376     LAST_MASK 16, r2d, r0+SIZEOF_DCTCOEF*16
1377     shl r2d, 16
1378     or  r1d, r2d
1379     LAST_MASK 16, r2d, r0+SIZEOF_DCTCOEF*32
1380     LAST_MASK 16, r0d, r0+SIZEOF_DCTCOEF*48
1381     shl r0d, 16
1382     or  r2d, r0d
1383     shl  r2, 32
1384     or   r1, r2
1385     not  r1
1386     BSR rax, r1, 0x3f
1387     RET
1388 %endif
1389 %endmacro
1390
1391 %if ARCH_X86_64 == 0
1392 INIT_MMX mmx2
1393 COEFF_LAST
1394 %endif
1395 INIT_XMM sse2
1396 COEFF_LAST
1397 INIT_XMM sse2, lzcnt
1398 COEFF_LAST
1399
1400 ;-----------------------------------------------------------------------------
1401 ; int coeff_level_run( dctcoef *dct, run_level_t *runlevel )
1402 ;-----------------------------------------------------------------------------
1403
1404 ; t6 = eax for return, t3 = ecx for shift, t[01] = r[01] for x86_64 args
1405 %if WIN64
1406     DECLARE_REG_TMP 3,1,2,0,4,5,6
1407 %elif ARCH_X86_64
1408     DECLARE_REG_TMP 0,1,2,3,4,5,6
1409 %else
1410     DECLARE_REG_TMP 6,3,2,1,4,5,0
1411 %endif
1412
1413 %macro COEFF_LEVELRUN 1
1414 cglobal coeff_level_run%1,0,7
1415     movifnidn t0, r0mp
1416     movifnidn t1, r1mp
1417     pxor    m2, m2
1418     LAST_MASK %1, t5d, t0-(%1&1)*SIZEOF_DCTCOEF, t4d
1419 %if %1==15
1420     shr    t5d, 1
1421 %elif %1==8
1422     and    t5d, 0xff
1423 %elif %1==4
1424     and    t5d, 0xf
1425 %endif
1426     xor    t5d, (1<<%1)-1
1427     mov [t1+4], t5d
1428     shl    t5d, 32-%1
1429     mov    t4d, %1-1
1430     LZCOUNT t3d, t5d, 0x1f
1431     xor    t6d, t6d
1432     add    t5d, t5d
1433     sub    t4d, t3d
1434     shl    t5d, t3b
1435     mov   [t1], t4d
1436 .loop:
1437     LZCOUNT t3d, t5d, 0x1f
1438 %if HIGH_BIT_DEPTH
1439     mov    t2d, [t0+t4*4]
1440 %else
1441     mov    t2w, [t0+t4*2]
1442 %endif
1443     inc    t3d
1444     shl    t5d, t3b
1445 %if HIGH_BIT_DEPTH
1446     mov   [t1+t6*4+ 8], t2d
1447 %else
1448     mov   [t1+t6*2+ 8], t2w
1449 %endif
1450     inc    t6d
1451     sub    t4d, t3d
1452     jge .loop
1453     RET
1454 %endmacro
1455
1456 INIT_MMX mmx2
1457 %if ARCH_X86_64 == 0
1458 COEFF_LEVELRUN 15
1459 COEFF_LEVELRUN 16
1460 %endif
1461 COEFF_LEVELRUN 4
1462 COEFF_LEVELRUN 8
1463 INIT_XMM sse2
1464 %if HIGH_BIT_DEPTH
1465 COEFF_LEVELRUN 8
1466 %endif
1467 COEFF_LEVELRUN 15
1468 COEFF_LEVELRUN 16
1469 INIT_XMM sse2, lzcnt
1470 %if HIGH_BIT_DEPTH
1471 COEFF_LEVELRUN 8
1472 %endif
1473 COEFF_LEVELRUN 15
1474 COEFF_LEVELRUN 16
1475 INIT_MMX mmx2, lzcnt
1476 COEFF_LEVELRUN 4
1477 COEFF_LEVELRUN 8