]> git.sesse.net Git - x264/blob - common/x86/quant-a.asm
Optimize x86 asm for Intel macro-op fusion
[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     pmaddwd   m0, %2
432     paddd     m0, m3
433     psrad     m0, m2
434 %else
435     punpckhwd m1, m0, m4
436     punpcklwd m0, m4
437     pmaddwd   m0, %2
438     pmaddwd   m1, %3
439     paddd     m0, m3
440     paddd     m1, m3
441     psrad     m0, m2
442     psrad     m1, m2
443     packssdw  m0, m1
444 %endif
445     mova      %1, m0
446 %endmacro
447
448 %macro DEQUANT_LOOP 3
449 %if 8*(%2-2*%3)
450     mov t0d, 8*(%2-2*%3)
451 %%loop:
452     %1 [r0+(t0     )*SIZEOF_PIXEL], [r1+t0*2      ], [r1+t0*2+ 8*%3]
453     %1 [r0+(t0+8*%3)*SIZEOF_PIXEL], [r1+t0*2+16*%3], [r1+t0*2+24*%3]
454     sub t0d, 16*%3
455     jge %%loop
456     REP_RET
457 %else
458     %1 [r0+(8*%3)*SIZEOF_PIXEL], [r1+16*%3], [r1+24*%3]
459     %1 [r0+(0   )*SIZEOF_PIXEL], [r1+0    ], [r1+ 8*%3]
460     RET
461 %endif
462 %endmacro
463
464 %macro DEQUANT16_FLAT 2-5
465     mova   m0, %1
466     psllw  m0, m4
467 %assign i %0-2
468 %rep %0-1
469 %if i
470     mova   m %+ i, [r0+%2]
471     pmullw m %+ i, m0
472 %else
473     pmullw m0, [r0+%2]
474 %endif
475     mova   [r0+%2], m %+ i
476     %assign i i-1
477     %rotate 1
478 %endrep
479 %endmacro
480
481 %ifdef WIN64
482     DECLARE_REG_TMP 6,3,2
483 %elifdef ARCH_X86_64
484     DECLARE_REG_TMP 4,3,2
485 %else
486     DECLARE_REG_TMP 2,0,1
487 %endif
488
489 %macro DEQUANT_START 2
490     movifnidn t2d, r2m
491     imul t0d, t2d, 0x2b
492     shr  t0d, 8     ; i_qbits = i_qp / 6
493     lea  t1, [t0*3]
494     sub  t2d, t1d
495     sub  t2d, t1d   ; i_mf = i_qp % 6
496     shl  t2d, %1
497 %ifdef ARCH_X86_64
498     add  r1, t2     ; dequant_mf[i_mf]
499 %else
500     add  r1, r1mp   ; dequant_mf[i_mf]
501     mov  r0, r0mp   ; dct
502 %endif
503     sub  t0d, %2
504     jl   .rshift32  ; negative qbits => rightshift
505 %endmacro
506
507 ;-----------------------------------------------------------------------------
508 ; void dequant_4x4( dctcoef dct[4][4], int dequant_mf[6][4][4], int i_qp )
509 ;-----------------------------------------------------------------------------
510 %macro DEQUANT 3
511 cglobal dequant_%1x%1, 0,3,6
512 .skip_prologue:
513     DEQUANT_START %2+2, %2
514
515 .lshift:
516     movd m2, t0d
517     DEQUANT_LOOP DEQUANT16_L, %1*%1/4, %3
518
519 .rshift32:
520     neg   t0d
521     movd  m2, t0d
522     mova  m3, [pd_1]
523     pxor  m4, m4
524     pslld m3, m2
525     psrld m3, 1
526     DEQUANT_LOOP DEQUANT32_R, %1*%1/4, %3
527
528 %ifndef HIGH_BIT_DEPTH
529 %if notcpuflag(avx)
530 cglobal dequant_%1x%1_flat16, 0,3
531     movifnidn t2d, r2m
532 %if %1 == 8
533     cmp  t2d, 12
534     jl dequant_%1x%1 %+ SUFFIX %+ .skip_prologue
535     sub  t2d, 12
536 %endif
537     imul t0d, t2d, 0x2b
538     shr  t0d, 8     ; i_qbits = i_qp / 6
539     lea  t1, [t0*3]
540     sub  t2d, t1d
541     sub  t2d, t1d   ; i_mf = i_qp % 6
542     shl  t2d, %2
543 %ifdef PIC
544     lea  r1, [dequant%1_scale]
545     add  r1, t2
546 %else
547     lea  r1, [dequant%1_scale + t2]
548 %endif
549     movifnidn r0, r0mp
550     movd m4, t0d
551 %if %1 == 4
552 %if mmsize == 8
553     DEQUANT16_FLAT [r1], 0, 16
554     DEQUANT16_FLAT [r1+8], 8, 24
555 %else
556     DEQUANT16_FLAT [r1], 0, 16
557 %endif
558 %elif mmsize == 8
559     DEQUANT16_FLAT [r1], 0, 8, 64, 72
560     DEQUANT16_FLAT [r1+16], 16, 24, 48, 56
561     DEQUANT16_FLAT [r1+16], 80, 88, 112, 120
562     DEQUANT16_FLAT [r1+32], 32, 40, 96, 104
563 %else
564     DEQUANT16_FLAT [r1], 0, 64
565     DEQUANT16_FLAT [r1+16], 16, 48, 80, 112
566     DEQUANT16_FLAT [r1+32], 32, 96
567 %endif
568     RET
569 %endif ; !AVX
570 %endif ; !HIGH_BIT_DEPTH
571 %endmacro ; DEQUANT
572
573 %ifdef HIGH_BIT_DEPTH
574 INIT_XMM sse2
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 %endif
590
591 %macro DEQUANT_DC 2
592 cglobal dequant_4x4dc, 0,3,6
593     DEQUANT_START 6, 6
594
595 .lshift:
596     movd     m3, [r1]
597     movd     m2, t0d
598     pslld    m3, m2
599     SPLAT%1  m3, m3, 0
600 %assign x 0
601 %rep SIZEOF_PIXEL*16/mmsize
602     mova     m0, [r0+mmsize*0+x]
603     mova     m1, [r0+mmsize*1+x]
604     %2       m0, m3
605     %2       m1, m3
606     mova     [r0+mmsize*0+x], m0
607     mova     [r0+mmsize*1+x], m1
608 %assign x x+mmsize*2
609 %endrep
610     RET
611
612 .rshift32:
613     neg   t0d
614     movd  m3, t0d
615     mova  m4, [p%1_1]
616     mova  m5, m4
617     pslld m4, m3
618     psrld m4, 1
619     movd  m2, [r1]
620 %assign x 0
621 %ifdef HIGH_BIT_DEPTH
622     pshufd m2, m2, 0
623 %rep SIZEOF_PIXEL*32/mmsize
624     mova      m0, [r0+x]
625     pmaddwd   m0, m2
626     paddd     m0, m4
627     psrad     m0, m3
628     mova      [r0+x], m0
629 %assign x x+mmsize
630 %endrep
631
632 %else ; !HIGH_BIT_DEPTH
633     PSHUFLW   m2, m2, 0
634     punpcklwd m2, m4
635 %rep SIZEOF_PIXEL*32/mmsize
636     mova      m0, [r0+x]
637     punpckhwd m1, m0, m5
638     punpcklwd m0, m5
639     pmaddwd   m0, m2
640     pmaddwd   m1, m2
641     psrad     m0, m3
642     psrad     m1, m3
643     packssdw  m0, m1
644     mova      [r0+x], m0
645 %assign x x+mmsize
646 %endrep
647 %endif ; !HIGH_BIT_DEPTH
648     RET
649 %endmacro
650
651 %ifdef HIGH_BIT_DEPTH
652 INIT_XMM sse2
653 DEQUANT_DC d, pmaddwd
654 %else
655 %ifndef ARCH_X86_64
656 INIT_MMX mmx2
657 DEQUANT_DC w, pmullw
658 %endif
659 INIT_XMM sse2
660 DEQUANT_DC w, pmullw
661 INIT_XMM avx
662 DEQUANT_DC w, pmullw
663 %endif
664
665 ; t4 is eax for return value.
666 %ifdef ARCH_X86_64
667     DECLARE_REG_TMP 0,1,2,3,6,4  ; Identical for both Windows and *NIX
668 %else
669     DECLARE_REG_TMP 4,1,2,3,0,5
670 %endif
671
672 ;-----------------------------------------------------------------------------
673 ; x264_optimize_chroma_2x2_dc( dctcoef dct[4], int dequant_mf )
674 ;-----------------------------------------------------------------------------
675
676 %macro OPTIMIZE_CHROMA_2x2_DC 0
677 %assign %%regs 5
678 %if cpuflag(sse4)
679     %assign %%regs %%regs-1
680 %endif
681 %ifndef ARCH_X86_64
682     %assign %%regs %%regs+1      ; t0-t4 are volatile on x86-64
683 %endif
684 cglobal optimize_chroma_2x2_dc, 0,%%regs,7
685     movifnidn t0, r0mp
686     movd      m2, r1m
687     movq      m1, [t0]
688 %if cpuflag(sse4)
689     pcmpeqb   m4, m4
690     pslld     m4, 11
691 %else
692     pxor      m4, m4
693 %endif
694 %if cpuflag(ssse3)
695     mova      m3, [chroma_dc_dct_mask]
696     mova      m5, [chroma_dc_dmf_mask]
697 %else
698     mova      m3, [chroma_dc_dct_mask_mmx]
699     mova      m5, [chroma_dc_dmf_mask_mmx]
700 %endif
701     pshuflw   m2, m2, 0
702     pshufd    m0, m1, q0101      ;  1  0  3  2  1  0  3  2
703     punpcklqdq m2, m2
704     punpcklqdq m1, m1            ;  3  2  1  0  3  2  1  0
705     mova      m6, [pd_1024]      ; 32<<5, elements are shifted 5 bits to the left
706     PSIGNW    m0, m3             ; -1 -0  3  2 -1 -0  3  2
707     PSIGNW    m2, m5             ;  +  -  -  +  -  -  +  +
708     paddw     m0, m1             ; -1+3 -0+2  1+3  0+2 -1+3 -0+2  1+3  0+2
709     pmaddwd   m0, m2             ;  0-1-2+3  0-1+2-3  0+1-2-3  0+1+2+3  * dmf
710     punpcklwd m1, m1
711     psrad     m2, 16             ;  +  -  -  +
712     mov      t1d, 3
713     paddd     m0, m6
714     xor      t4d, t4d
715 %if notcpuflag(ssse3)
716     psrad     m1, 31             ; has to be 0 or -1 in order for PSIGND_MMX to work correctly
717 %endif
718 %if cpuflag(sse4)
719     ptest     m0, m4
720 %else
721     mova      m6, m0
722     SWAP       0, 6
723     psrad     m6, 11
724     pcmpeqd   m6, m4
725     pmovmskb t5d, m6
726     cmp      t5d, 0xffff
727 %endif
728     jz .ret                      ; if the DC coefficients already round to zero, terminate early
729     mova      m3, m0
730 .outer_loop:
731     movsx    t3d, word [t0+2*t1] ; dct[coeff]
732     pshufd    m6, m1, q3333
733     pshufd    m1, m1, q2100      ; move the next element to high dword
734     PSIGND    m5, m2, m6
735     test     t3d, t3d
736     jz .loop_end
737 .outer_loop_0:
738     mov      t2d, t3d
739     sar      t3d, 31
740     or       t3d, 1
741 .inner_loop:
742     psubd     m3, m5             ; coeff -= sign
743     pxor      m6, m0, m3
744 %if cpuflag(sse4)
745     ptest     m6, m4
746 %else
747     psrad     m6, 11
748     pcmpeqd   m6, m4
749     pmovmskb t5d, m6
750     cmp      t5d, 0xffff
751 %endif
752     jz .round_coeff
753     paddd     m3, m5             ; coeff += sign
754     mov      t4d, 1
755 .loop_end:
756     dec      t1d
757     jz .last_coeff
758     pshufd    m2, m2, q1320      ;  -  +  -  +  /  -  -  +  +
759     jg .outer_loop
760 .ret:
761     REP_RET
762 .round_coeff:
763     sub      t2d, t3d
764     mov [t0+2*t1], t2w
765     jnz .inner_loop
766     jmp .loop_end
767 .last_coeff:
768     movsx    t3d, word [t0]
769     punpcklqdq m2, m2            ;  +  +  +  +
770     PSIGND    m5, m2, m1
771     test     t3d, t3d
772     jnz .outer_loop_0
773     REP_RET
774 %endmacro
775
776 %ifndef HIGH_BIT_DEPTH
777 INIT_XMM sse2
778 OPTIMIZE_CHROMA_2x2_DC
779 INIT_XMM ssse3
780 OPTIMIZE_CHROMA_2x2_DC
781 INIT_XMM sse4
782 OPTIMIZE_CHROMA_2x2_DC
783 INIT_XMM avx
784 OPTIMIZE_CHROMA_2x2_DC
785 %endif ; !HIGH_BIT_DEPTH
786
787 %ifdef HIGH_BIT_DEPTH
788 ;-----------------------------------------------------------------------------
789 ; void denoise_dct( int32_t *dct, uint32_t *sum, uint32_t *offset, int size )
790 ;-----------------------------------------------------------------------------
791 %macro DENOISE_DCT 0
792 cglobal denoise_dct, 4,4,8
793     pxor      m6, m6
794 .loop:
795     mova      m2, [r0+r3*4-2*mmsize]
796     mova      m3, [r0+r3*4-1*mmsize]
797     ABSD      m0, m2
798     ABSD      m1, m3
799     mova      m4, m0
800     mova      m5, m1
801     psubd     m0, [r2+r3*4-2*mmsize]
802     psubd     m1, [r2+r3*4-1*mmsize]
803     pcmpgtd   m7, m0, m6
804     pand      m0, m7
805     pcmpgtd   m7, m1, m6
806     pand      m1, m7
807     PSIGND    m0, m2
808     PSIGND    m1, m3
809     mova      [r0+r3*4-2*mmsize], m0
810     mova      [r0+r3*4-1*mmsize], m1
811     paddd     m4, [r1+r3*4-2*mmsize]
812     paddd     m5, [r1+r3*4-1*mmsize]
813     mova      [r1+r3*4-2*mmsize], m4
814     mova      [r1+r3*4-1*mmsize], m5
815     sub       r3, mmsize/2
816     jg .loop
817     REP_RET
818 %endmacro
819
820 %ifndef ARCH_X86_64
821 INIT_MMX mmx
822 DENOISE_DCT
823 %endif
824 INIT_XMM sse2
825 DENOISE_DCT
826 INIT_XMM ssse3
827 DENOISE_DCT
828 INIT_XMM avx
829 DENOISE_DCT
830
831 %else ; !HIGH_BIT_DEPTH
832
833 ;-----------------------------------------------------------------------------
834 ; void denoise_dct( int16_t *dct, uint32_t *sum, uint16_t *offset, int size )
835 ;-----------------------------------------------------------------------------
836 %macro DENOISE_DCT 0
837 cglobal denoise_dct, 4,4,7
838     pxor      m6, m6
839 .loop:
840     mova      m2, [r0+r3*2-2*mmsize]
841     mova      m3, [r0+r3*2-1*mmsize]
842     ABSW      m0, m2, sign
843     ABSW      m1, m3, sign
844     psubusw   m4, m0, [r2+r3*2-2*mmsize]
845     psubusw   m5, m1, [r2+r3*2-1*mmsize]
846     PSIGNW    m4, m2
847     PSIGNW    m5, m3
848     mova      [r0+r3*2-2*mmsize], m4
849     mova      [r0+r3*2-1*mmsize], m5
850     punpcklwd m2, m0, m6
851     punpcklwd m3, m1, m6
852     punpckhwd m0, m6
853     punpckhwd m1, m6
854     paddd     m2, [r1+r3*4-4*mmsize]
855     paddd     m0, [r1+r3*4-3*mmsize]
856     paddd     m3, [r1+r3*4-2*mmsize]
857     paddd     m1, [r1+r3*4-1*mmsize]
858     mova      [r1+r3*4-4*mmsize], m2
859     mova      [r1+r3*4-3*mmsize], m0
860     mova      [r1+r3*4-2*mmsize], m3
861     mova      [r1+r3*4-1*mmsize], m1
862     sub       r3, mmsize
863     jg .loop
864     REP_RET
865 %endmacro
866
867 %ifndef ARCH_X86_64
868 INIT_MMX mmx
869 DENOISE_DCT
870 %endif
871 INIT_XMM sse2
872 DENOISE_DCT
873 INIT_XMM ssse3
874 DENOISE_DCT
875 INIT_XMM avx
876 DENOISE_DCT
877
878 %endif ; !HIGH_BIT_DEPTH
879
880 ;-----------------------------------------------------------------------------
881 ; int decimate_score( dctcoef *dct )
882 ;-----------------------------------------------------------------------------
883
884 %macro DECIMATE_MASK 5
885 %if mmsize==16
886 %ifdef HIGH_BIT_DEPTH
887     movdqa   xmm0, [%3+ 0]
888     movdqa   xmm1, [%3+32]
889     packssdw xmm0, [%3+16]
890     packssdw xmm1, [%3+48]
891     ABSW2    xmm0, xmm1, xmm0, xmm1, xmm3, xmm4
892 %else
893     ABSW     xmm0, [%3+ 0], xmm3
894     ABSW     xmm1, [%3+16], xmm4
895 %endif
896     packsswb xmm0, xmm1
897     pxor     xmm2, xmm2
898     pcmpeqb  xmm2, xmm0
899     pcmpgtb  xmm0, %4
900     pmovmskb %1, xmm2
901     pmovmskb %2, xmm0
902
903 %else ; mmsize==8
904 %ifdef HIGH_BIT_DEPTH
905     movq      mm0, [%3+ 0]
906     movq      mm1, [%3+16]
907     movq      mm2, [%3+32]
908     movq      mm3, [%3+48]
909     packssdw  mm0, [%3+ 8]
910     packssdw  mm1, [%3+24]
911     packssdw  mm2, [%3+40]
912     packssdw  mm3, [%3+56]
913 %else
914     movq      mm0, [%3+ 0]
915     movq      mm1, [%3+ 8]
916     movq      mm2, [%3+16]
917     movq      mm3, [%3+24]
918 %endif
919     ABSW2     mm0, mm1, mm0, mm1, mm6, mm7
920     ABSW2     mm2, mm3, mm2, mm3, mm6, mm7
921     packsswb  mm0, mm1
922     packsswb  mm2, mm3
923     pxor      mm4, mm4
924     pxor      mm6, mm6
925     pcmpeqb   mm4, mm0
926     pcmpeqb   mm6, mm2
927     pcmpgtb   mm0, %4
928     pcmpgtb   mm2, %4
929     pmovmskb   %5, mm4
930     pmovmskb   %1, mm6
931     shl        %1, 8
932     or         %1, %5
933     pmovmskb   %5, mm0
934     pmovmskb   %2, mm2
935     shl        %2, 8
936     or         %2, %5
937 %endif
938 %endmacro
939
940 cextern decimate_table4
941 cextern decimate_table8
942
943 %macro DECIMATE4x4 1
944
945 ;A LUT is faster than bsf on AMD processors.
946 ;This is not true for score64.
947 cglobal decimate_score%1, 1,3
948 %ifdef PIC
949     lea r10, [decimate_table4]
950     lea r11, [decimate_mask_table4]
951     %define table r10
952     %define mask_table r11
953 %else
954     %define table decimate_table4
955     %define mask_table decimate_mask_table4
956 %endif
957     DECIMATE_MASK edx, eax, r0, [pb_1], ecx
958     xor   edx, 0xffff
959     je   .ret
960     test  eax, eax
961     jne  .ret9
962 %if %1==15
963     shr   edx, 1
964 %endif
965 %if cpuflag(slowctz)
966     movzx ecx, dl
967     movzx eax, byte [mask_table + rcx]
968     cmp   edx, ecx
969     je   .ret
970     bsr   ecx, ecx
971     shr   edx, 1
972     shr   edx, cl
973     bsf   ecx, edx
974     shr   edx, 1
975     shr   edx, cl
976     add    al, byte [table + rcx]
977     add    al, byte [mask_table + rdx]
978 %else
979 .loop:
980     bsf   ecx, edx
981     shr   edx, cl
982     add    al, byte [table + rcx]
983     shr   edx, 1
984     jne  .loop
985 %endif
986 .ret:
987     RET
988 .ret9:
989     mov   eax, 9
990     RET
991
992 %endmacro
993
994 %ifndef ARCH_X86_64
995 INIT_MMX mmx2
996 DECIMATE4x4 15
997 DECIMATE4x4 16
998 INIT_MMX mmx2, slowctz
999 DECIMATE4x4 15
1000 DECIMATE4x4 16
1001 %endif
1002 INIT_XMM sse2
1003 DECIMATE4x4 15
1004 DECIMATE4x4 16
1005 INIT_XMM sse2, slowctz
1006 DECIMATE4x4 15
1007 DECIMATE4x4 16
1008 INIT_XMM ssse3
1009 DECIMATE4x4 15
1010 DECIMATE4x4 16
1011 INIT_XMM ssse3, slowctz
1012 DECIMATE4x4 15
1013 DECIMATE4x4 16
1014
1015 %macro DECIMATE8x8 0
1016
1017 %ifdef ARCH_X86_64
1018 cglobal decimate_score64, 1,4
1019 %ifdef PIC
1020     lea r10, [decimate_table8]
1021     %define table r10
1022 %else
1023     %define table decimate_table8
1024 %endif
1025     mova  m5, [pb_1]
1026     DECIMATE_MASK r1d, eax, r0+SIZEOF_DCTCOEF* 0, m5, null
1027     test  eax, eax
1028     jne  .ret9
1029     DECIMATE_MASK r2d, eax, r0+SIZEOF_DCTCOEF*16, m5, null
1030     shl   r2d, 16
1031     or    r1d, r2d
1032     DECIMATE_MASK r2d, r3d, r0+SIZEOF_DCTCOEF*32, m5, null
1033     shl   r2, 32
1034     or    eax, r3d
1035     or    r1, r2
1036     DECIMATE_MASK r2d, r3d, r0+SIZEOF_DCTCOEF*48, m5, null
1037     shl   r2, 48
1038     or    r1, r2
1039     xor   r1, -1
1040     je   .ret
1041     add   eax, r3d
1042     jne  .ret9
1043 .loop:
1044     bsf   rcx, r1
1045     shr   r1, cl
1046     add   al, byte [table + rcx]
1047     shr   r1, 1
1048     jne  .loop
1049 .ret:
1050     REP_RET
1051 .ret9:
1052     mov   eax, 9
1053     RET
1054
1055 %else ; ARCH
1056 %if mmsize == 8
1057 cglobal decimate_score64, 1,6
1058 %else
1059 cglobal decimate_score64, 1,5
1060 %endif
1061     mova  m5, [pb_1]
1062     DECIMATE_MASK r3, r2, r0+SIZEOF_DCTCOEF* 0, m5, r5
1063     test  r2, r2
1064     jne  .ret9
1065     DECIMATE_MASK r4, r2, r0+SIZEOF_DCTCOEF*16, m5, r5
1066     shl   r4, 16
1067     or    r3, r4
1068     DECIMATE_MASK r4, r1, r0+SIZEOF_DCTCOEF*32, m5, r5
1069     or    r2, r1
1070     DECIMATE_MASK r1, r0, r0+SIZEOF_DCTCOEF*48, m5, r5
1071     shl   r1, 16
1072     or    r4, r1
1073     xor   r3, -1
1074     je   .tryret
1075     xor   r4, -1
1076 .cont:
1077     add   r0, r2
1078     jne  .ret9      ;r0 is zero at this point, so we don't need to zero it
1079 .loop:
1080     bsf   ecx, r3
1081     test  r3, r3
1082     je   .largerun
1083     shrd  r3, r4, cl
1084     shr   r4, cl
1085     add   r0b, byte [decimate_table8 + ecx]
1086     shrd  r3, r4, 1
1087     shr   r4, 1
1088     cmp   r0, 6     ;score64's threshold is never higher than 6
1089     jge  .ret9      ;this early termination is only useful on 32-bit because it can be done in the latency after shrd
1090     test  r3, r3
1091     jne  .loop
1092     test  r4, r4
1093     jne  .loop
1094 .ret:
1095     REP_RET
1096 .tryret:
1097     xor   r4, -1
1098     jne  .cont
1099     REP_RET
1100 .ret9:
1101     mov   eax, 9
1102     RET
1103 .largerun:
1104     mov   r3, r4
1105     xor   r4, r4
1106     bsf   ecx, r3
1107     shr   r3, cl
1108     shr   r3, 1
1109     jne  .loop
1110     REP_RET
1111 %endif ; ARCH
1112
1113 %endmacro
1114
1115 %ifndef ARCH_X86_64
1116 INIT_MMX mmx2
1117 DECIMATE8x8
1118 %endif
1119 INIT_XMM sse2
1120 DECIMATE8x8
1121 INIT_XMM ssse3
1122 DECIMATE8x8
1123
1124 ;-----------------------------------------------------------------------------
1125 ; int coeff_last( dctcoef *dct )
1126 ;-----------------------------------------------------------------------------
1127
1128 %macro BSR 3
1129 %if cpuflag(lzcnt)
1130     lzcnt %1, %2
1131     xor %1, %3
1132 %else
1133     bsr %1, %2
1134 %endif
1135 %endmacro
1136
1137 %macro LZCOUNT 3
1138 %if cpuflag(lzcnt)
1139     lzcnt %1, %2
1140 %else
1141     bsr %1, %2
1142     xor %1, %3
1143 %endif
1144 %endmacro
1145
1146 %ifdef HIGH_BIT_DEPTH
1147 %macro LAST_MASK 3-4
1148 %if %1 == 4
1149     movq     mm0, [%3]
1150     packssdw mm0, [%3+8]
1151     packsswb mm0, mm0
1152     pcmpeqb  mm0, mm2
1153     pmovmskb  %2, mm0
1154 %elif mmsize == 16
1155     movdqa   xmm0, [%3+ 0]
1156     movdqa   xmm1, [%3+32]
1157     packssdw xmm0, [%3+16]
1158     packssdw xmm1, [%3+48]
1159     packsswb xmm0, xmm1
1160     pcmpeqb  xmm0, xmm2
1161     pmovmskb   %2, xmm0
1162 %else
1163     movq     mm0, [%3+ 0]
1164     movq     mm1, [%3+16]
1165     packssdw mm0, [%3+ 8]
1166     packssdw mm1, [%3+24]
1167     movq     mm3, [%3+32]
1168     movq     mm4, [%3+48]
1169     packssdw mm3, [%3+40]
1170     packssdw mm4, [%3+56]
1171     packsswb mm0, mm1
1172     packsswb mm3, mm4
1173     pcmpeqb  mm0, mm2
1174     pcmpeqb  mm3, mm2
1175     pmovmskb  %2, mm0
1176     pmovmskb  %4, mm3
1177     shl       %4, 8
1178     or        %2, %4
1179 %endif
1180 %endmacro
1181
1182 %macro COEFF_LAST4 0
1183 cglobal coeff_last4, 1,3
1184     pxor mm2, mm2
1185     LAST_MASK 4, r1d, r0
1186     xor  r1d, 0xff
1187     shr  r1d, 4
1188     BSR  eax, r1d, 0x1f
1189     RET
1190 %endmacro
1191
1192 INIT_MMX mmx2
1193 COEFF_LAST4
1194 INIT_MMX mmx2, lzcnt
1195 COEFF_LAST4
1196
1197 %else ; !HIGH_BIT_DEPTH
1198 %macro LAST_MASK 3-4
1199 %if %1 == 4
1200     movq     mm0, [%3]
1201     packsswb mm0, mm0
1202     pcmpeqb  mm0, mm2
1203     pmovmskb  %2, mm0
1204 %elif mmsize == 16
1205     movdqa   xmm0, [%3+ 0]
1206     packsswb xmm0, [%3+16]
1207     pcmpeqb  xmm0, xmm2
1208     pmovmskb   %2, xmm0
1209 %else
1210     movq     mm0, [%3+ 0]
1211     movq     mm1, [%3+16]
1212     packsswb mm0, [%3+ 8]
1213     packsswb mm1, [%3+24]
1214     pcmpeqb  mm0, mm2
1215     pcmpeqb  mm1, mm2
1216     pmovmskb  %2, mm0
1217     pmovmskb  %4, mm1
1218     shl       %4, 8
1219     or        %2, %4
1220 %endif
1221 %endmacro
1222
1223 %macro COEFF_LAST4 0
1224 %ifdef ARCH_X86_64
1225 cglobal coeff_last4, 1,1
1226     BSR  rax, [r0], 0x3f
1227     shr  eax, 4
1228     RET
1229 %else
1230 cglobal coeff_last4, 0,3
1231     mov   edx, r0mp
1232     mov   eax, [edx+4]
1233     xor   ecx, ecx
1234     test  eax, eax
1235     cmovz eax, [edx]
1236     setnz cl
1237     BSR   eax, eax, 0x1f
1238     shr   eax, 4
1239     lea   eax, [eax+ecx*2]
1240     RET
1241 %endif
1242 %endmacro
1243
1244 INIT_MMX mmx2
1245 COEFF_LAST4
1246 INIT_MMX mmx2, lzcnt
1247 COEFF_LAST4
1248 %endif ; HIGH_BIT_DEPTH
1249
1250 %macro COEFF_LAST 0
1251 cglobal coeff_last15, 1,3
1252     pxor m2, m2
1253     LAST_MASK 15, r1d, r0-SIZEOF_DCTCOEF, r2d
1254     xor r1d, 0xffff
1255     BSR eax, r1d, 0x1f
1256     dec eax
1257     RET
1258
1259 cglobal coeff_last16, 1,3
1260     pxor m2, m2
1261     LAST_MASK 16, r1d, r0, r2d
1262     xor r1d, 0xffff
1263     BSR eax, r1d, 0x1f
1264     RET
1265
1266 %ifndef ARCH_X86_64
1267 cglobal coeff_last64, 1, 5-mmsize/16
1268     pxor m2, m2
1269     LAST_MASK 16, r2d, r0+SIZEOF_DCTCOEF* 32, r4d
1270     LAST_MASK 16, r3d, r0+SIZEOF_DCTCOEF* 48, r4d
1271     shl r3d, 16
1272     or  r2d, r3d
1273     xor r2d, -1
1274     jne .secondhalf
1275     LAST_MASK 16, r1d, r0+SIZEOF_DCTCOEF* 0, r4d
1276     LAST_MASK 16, r3d, r0+SIZEOF_DCTCOEF*16, r4d
1277     shl r3d, 16
1278     or  r1d, r3d
1279     not r1d
1280     BSR eax, r1d, 0x1f
1281     RET
1282 .secondhalf:
1283     BSR eax, r2d, 0x1f
1284     add eax, 32
1285     RET
1286 %else
1287 cglobal coeff_last64, 1,4
1288     pxor m2, m2
1289     LAST_MASK 16, r1d, r0+SIZEOF_DCTCOEF* 0
1290     LAST_MASK 16, r2d, r0+SIZEOF_DCTCOEF*16
1291     LAST_MASK 16, r3d, r0+SIZEOF_DCTCOEF*32
1292     LAST_MASK 16, r0d, r0+SIZEOF_DCTCOEF*48
1293     shl r2d, 16
1294     shl r0d, 16
1295     or  r1d, r2d
1296     or  r3d, r0d
1297     shl r3,  32
1298     or  r1,  r3
1299     not r1
1300     BSR rax, r1, 0x3f
1301     RET
1302 %endif
1303 %endmacro
1304
1305 %ifndef ARCH_X86_64
1306 INIT_MMX mmx2
1307 COEFF_LAST
1308 %endif
1309 INIT_XMM sse2
1310 COEFF_LAST
1311 INIT_XMM sse2, lzcnt
1312 COEFF_LAST
1313
1314 ;-----------------------------------------------------------------------------
1315 ; int coeff_level_run( dctcoef *dct, run_level_t *runlevel )
1316 ;-----------------------------------------------------------------------------
1317
1318 ; t6 = eax for return, t3 = ecx for shift, t[01] = r[01] for x86_64 args
1319 %ifdef WIN64
1320     DECLARE_REG_TMP 3,1,2,0,4,5,6
1321 %elifdef ARCH_X86_64
1322     DECLARE_REG_TMP 0,1,2,3,4,5,6
1323 %else
1324     DECLARE_REG_TMP 6,3,2,1,4,5,0
1325 %endif
1326
1327 %macro COEFF_LEVELRUN 1
1328 cglobal coeff_level_run%1,0,7
1329     movifnidn t0, r0mp
1330     movifnidn t1, r1mp
1331     pxor    m2, m2
1332     LAST_MASK %1, t5d, t0-(%1&1)*SIZEOF_DCTCOEF, t4d
1333     not    t5d
1334     shl    t5d, 32-((%1+1)&~1)
1335     mov    t4d, %1-1
1336     LZCOUNT t3d, t5d, 0x1f
1337     xor    t6d, t6d
1338     add    t5d, t5d
1339     sub    t4d, t3d
1340     shl    t5d, t3b
1341     mov   [t1], t4d
1342 .loop:
1343     LZCOUNT t3d, t5d, 0x1f
1344 %ifdef HIGH_BIT_DEPTH
1345     mov    t2d, [t0+t4*4]
1346     mov   [t1+t6  +4+16*4], t3b
1347     mov   [t1+t6*4+ 4], t2d
1348 %else
1349     mov    t2w, [t0+t4*2]
1350     mov   [t1+t6  +4+16*2], t3b
1351     mov   [t1+t6*2+ 4], t2w
1352 %endif
1353     inc    t3d
1354     shl    t5d, t3b
1355     inc    t6d
1356     sub    t4d, t3d
1357     jge .loop
1358     REP_RET
1359 %endmacro
1360
1361 INIT_MMX mmx2
1362 %ifndef ARCH_X86_64
1363 COEFF_LEVELRUN 15
1364 COEFF_LEVELRUN 16
1365 %endif
1366 COEFF_LEVELRUN 4
1367 INIT_XMM sse2
1368 COEFF_LEVELRUN 15
1369 COEFF_LEVELRUN 16
1370 INIT_XMM sse2, lzcnt
1371 COEFF_LEVELRUN 15
1372 COEFF_LEVELRUN 16
1373 INIT_MMX mmx2, lzcnt
1374 COEFF_LEVELRUN 4