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