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