x86: SSE2/AVX idct_dequant_2x4_(dc|dconly)
[x264/x264-sandbox.git] / common / x86 / quant-a.asm
1 ;*****************************************************************************
2 ;* quant-a.asm: x86 quantization and level-run
3 ;*****************************************************************************
4 ;* Copyright (C) 2005-2016 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 <henrik@gramner.com>
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 32
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     dw %4, %2, %6, %2, %4, %2, %6, %2
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 chroma_dc_dct_mask_mmx: dw 0, 0,-1,-1, 0, 0,-1,-1
73 chroma_dc_dmf_mask_mmx: dw 0, 0,-1,-1, 0,-1,-1, 0
74 chroma_dc_dct_mask:     dw 1, 1,-1,-1, 1, 1,-1,-1
75 chroma_dc_dmf_mask:     dw 1, 1,-1,-1, 1,-1,-1, 1
76
77 %if HIGH_BIT_DEPTH==0
78 dct_coef_shuffle:
79 %macro DCT_COEF_SHUFFLE 8
80     %assign y x
81     %rep 8
82         %rep 7
83             %rotate (~(y>>7))&1
84             %assign y y<<((~(y>>7))&1)
85         %endrep
86         db %1*2
87         %rotate 1
88         %assign y y<<1
89     %endrep
90 %endmacro
91 %assign x 0
92 %rep 256
93     DCT_COEF_SHUFFLE 7, 6, 5, 4, 3, 2, 1, 0
94 %assign x x+1
95 %endrep
96 %endif
97
98 SECTION .text
99
100 cextern pb_1
101 cextern pw_1
102 cextern pw_2
103 cextern pw_256
104 cextern pd_1
105 cextern pb_01
106 cextern pd_1024
107 cextern deinterleave_shufd
108 cextern popcnt_table
109
110 %macro QUANT_DC_START 2
111     movd      xm%1, r1m     ; mf
112     movd      xm%2, r2m     ; bias
113 %if cpuflag(avx2)
114     vpbroadcastdct m%1, xm%1
115     vpbroadcastdct m%2, xm%2
116 %elif HIGH_BIT_DEPTH
117     SPLATD     m%1, m%1
118     SPLATD     m%2, m%2
119 %elif cpuflag(sse4) ; ssse3, but not faster on conroe
120     mova       m5, [pb_01]
121     pshufb     m%1, m5
122     pshufb     m%2, m5
123 %else
124     SPLATW     m%1, m%1
125     SPLATW     m%2, m%2
126 %endif
127 %endmacro
128
129 %macro QUANT_END 0
130     xor      eax, eax
131 %if cpuflag(sse4)
132     ptest     m5, m5
133 %else ; !sse4
134 %if ARCH_X86_64
135 %if mmsize == 16
136     packsswb  m5, m5
137 %endif
138     movq     rcx, m5
139     test     rcx, rcx
140 %else
141 %if mmsize == 16
142     pxor      m4, m4
143     pcmpeqb   m5, m4
144     pmovmskb ecx, m5
145     cmp      ecx, (1<<mmsize)-1
146 %else
147     packsswb  m5, m5
148     movd     ecx, m5
149     test     ecx, ecx
150 %endif
151 %endif
152 %endif ; cpuflag
153     setne     al
154 %endmacro
155
156 %if HIGH_BIT_DEPTH
157 %macro QUANT_ONE_DC 4
158 %if cpuflag(sse4)
159     mova        m0, [%1]
160     ABSD        m1, m0
161     paddd       m1, %3
162     pmulld      m1, %2
163     psrad       m1, 16
164 %else ; !sse4
165     mova        m0, [%1]
166     ABSD        m1, m0
167     paddd       m1, %3
168     mova        m2, m1
169     psrlq       m2, 32
170     pmuludq     m1, %2
171     pmuludq     m2, %2
172     psllq       m2, 32
173     paddd       m1, m2
174     psrld       m1, 16
175 %endif ; cpuflag
176     PSIGND      m1, m0
177     mova      [%1], m1
178     ACCUM     por, 5, 1, %4
179 %endmacro
180
181 %macro QUANT_TWO_DC 4
182 %if cpuflag(sse4)
183     mova        m0, [%1       ]
184     mova        m1, [%1+mmsize]
185     ABSD        m2, m0
186     ABSD        m3, m1
187     paddd       m2, %3
188     paddd       m3, %3
189     pmulld      m2, %2
190     pmulld      m3, %2
191     psrad       m2, 16
192     psrad       m3, 16
193     PSIGND      m2, m0
194     PSIGND      m3, m1
195     mova [%1       ], m2
196     mova [%1+mmsize], m3
197     ACCUM      por, 5, 2, %4
198     por         m5, m3
199 %else ; !sse4
200     QUANT_ONE_DC %1, %2, %3, %4
201     QUANT_ONE_DC %1+mmsize, %2, %3, %4+mmsize
202 %endif ; cpuflag
203 %endmacro
204
205 %macro QUANT_ONE_AC_MMX 5
206     mova        m0, [%1]
207     mova        m2, [%2]
208     ABSD        m1, m0
209     mova        m4, m2
210     paddd       m1, [%3]
211     mova        m3, m1
212     psrlq       m4, 32
213     psrlq       m3, 32
214     pmuludq     m1, m2
215     pmuludq     m3, m4
216     psllq       m3, 32
217     paddd       m1, m3
218     psrad       m1, 16
219     PSIGND      m1, m0
220     mova      [%1], m1
221     ACCUM      por, %5, 1, %4
222 %endmacro
223
224 %macro QUANT_TWO_AC 5
225 %if cpuflag(sse4)
226     mova        m0, [%1       ]
227     mova        m1, [%1+mmsize]
228     ABSD        m2, m0
229     ABSD        m3, m1
230     paddd       m2, [%3       ]
231     paddd       m3, [%3+mmsize]
232     pmulld      m2, [%2       ]
233     pmulld      m3, [%2+mmsize]
234     psrad       m2, 16
235     psrad       m3, 16
236     PSIGND      m2, m0
237     PSIGND      m3, m1
238     mova [%1       ], m2
239     mova [%1+mmsize], m3
240     ACCUM      por, %5, 2, %4
241     por        m%5, m3
242 %else ; !sse4
243     QUANT_ONE_AC_MMX %1, %2, %3, %4, %5
244     QUANT_ONE_AC_MMX %1+mmsize, %2+mmsize, %3+mmsize, 1, %5
245 %endif ; cpuflag
246 %endmacro
247
248 ;-----------------------------------------------------------------------------
249 ; int quant_2x2( int32_t dct[M*N], int mf, int bias )
250 ;-----------------------------------------------------------------------------
251 %macro QUANT_DC 2
252 cglobal quant_%1x%2_dc, 3,3,8
253     QUANT_DC_START 6,7
254 %if %1*%2 <= mmsize/4
255     QUANT_ONE_DC r0, m6, m7, 0
256 %else
257 %assign x 0
258 %rep %1*%2/(mmsize/2)
259     QUANT_TWO_DC r0+x, m6, m7, x
260 %assign x x+mmsize*2
261 %endrep
262 %endif
263     QUANT_END
264     RET
265 %endmacro
266
267 ;-----------------------------------------------------------------------------
268 ; int quant_MxN( int32_t dct[M*N], uint32_t mf[M*N], uint32_t bias[M*N] )
269 ;-----------------------------------------------------------------------------
270 %macro QUANT_AC 2
271 cglobal quant_%1x%2, 3,3,8
272 %assign x 0
273 %rep %1*%2/(mmsize/2)
274     QUANT_TWO_AC r0+x, r1+x, r2+x, x, 5
275 %assign x x+mmsize*2
276 %endrep
277     QUANT_END
278     RET
279 %endmacro
280
281 %macro QUANT_4x4 2
282     QUANT_TWO_AC r0+%1+mmsize*0, r1+mmsize*0, r2+mmsize*0, 0, %2
283     QUANT_TWO_AC r0+%1+mmsize*2, r1+mmsize*2, r2+mmsize*2, 1, %2
284 %endmacro
285
286 %macro QUANT_4x4x4 0
287 cglobal quant_4x4x4, 3,3,8
288     QUANT_4x4  0, 5
289     QUANT_4x4 64, 6
290     add       r0, 128
291     packssdw  m5, m6
292     QUANT_4x4  0, 6
293     QUANT_4x4 64, 7
294     packssdw  m6, m7
295     packssdw  m5, m6  ; AAAA BBBB CCCC DDDD
296     pxor      m4, m4
297     pcmpeqd   m5, m4
298     movmskps eax, m5
299     xor      eax, 0xf
300     RET
301 %endmacro
302
303 INIT_XMM sse2
304 QUANT_DC 2, 2
305 QUANT_DC 4, 4
306 QUANT_AC 4, 4
307 QUANT_AC 8, 8
308 QUANT_4x4x4
309
310 INIT_XMM ssse3
311 QUANT_DC 2, 2
312 QUANT_DC 4, 4
313 QUANT_AC 4, 4
314 QUANT_AC 8, 8
315 QUANT_4x4x4
316
317 INIT_XMM sse4
318 QUANT_DC 2, 2
319 QUANT_DC 4, 4
320 QUANT_AC 4, 4
321 QUANT_AC 8, 8
322 QUANT_4x4x4
323
324 INIT_YMM avx2
325 QUANT_DC 4, 4
326 QUANT_AC 4, 4
327 QUANT_AC 8, 8
328
329 INIT_YMM avx2
330 cglobal quant_4x4x4, 3,3,6
331     QUANT_TWO_AC r0,    r1, r2, 0, 4
332     QUANT_TWO_AC r0+64, r1, r2, 0, 5
333     add       r0, 128
334     packssdw  m4, m5
335     QUANT_TWO_AC r0,    r1, r2, 0, 5
336     QUANT_TWO_AC r0+64, r1, r2, 0, 1
337     packssdw  m5, m1
338     packssdw  m4, m5
339     pxor      m3, m3
340     pcmpeqd   m4, m3
341     movmskps eax, m4
342     mov      edx, eax
343     shr      eax, 4
344     and      eax, edx
345     xor      eax, 0xf
346     RET
347
348 %endif ; HIGH_BIT_DEPTH
349
350 %if HIGH_BIT_DEPTH == 0
351 %macro QUANT_ONE 5
352 ;;; %1      (m64)       dct[y][x]
353 ;;; %2      (m64/mmx)   mf[y][x] or mf[0][0] (as uint16_t)
354 ;;; %3      (m64/mmx)   bias[y][x] or bias[0][0] (as uint16_t)
355     mova       m1, %1   ; load dct coeffs
356     ABSW       m0, m1, sign
357     paddusw    m0, %3   ; round
358     pmulhuw    m0, %2   ; divide
359     PSIGNW     m0, m1   ; restore sign
360     mova       %1, m0   ; store
361     ACCUM     por, %5, 0, %4
362 %endmacro
363
364 %macro QUANT_TWO 8
365     mova       m1, %1
366     mova       m3, %2
367     ABSW       m0, m1, sign
368     ABSW       m2, m3, sign
369     paddusw    m0, %5
370     paddusw    m2, %6
371     pmulhuw    m0, %3
372     pmulhuw    m2, %4
373     PSIGNW     m0, m1
374     PSIGNW     m2, m3
375     mova       %1, m0
376     mova       %2, m2
377     ACCUM     por, %8, 0, %7
378     ACCUM     por, %8, 2, %7+mmsize
379 %endmacro
380
381 ;-----------------------------------------------------------------------------
382 ; void quant_4x4_dc( int16_t dct[16], int mf, int bias )
383 ;-----------------------------------------------------------------------------
384 %macro QUANT_DC 2-3 0
385 cglobal %1, 1,1,%3
386 %if %2==1
387     QUANT_DC_START 2,3
388     QUANT_ONE [r0], m2, m3, 0, 5
389 %else
390     QUANT_DC_START 4,6
391 %assign x 0
392 %rep %2/2
393     QUANT_TWO [r0+x], [r0+x+mmsize], m4, m4, m6, m6, x, 5
394 %assign x x+mmsize*2
395 %endrep
396 %endif
397     QUANT_END
398     RET
399 %endmacro
400
401 ;-----------------------------------------------------------------------------
402 ; int quant_4x4( int16_t dct[16], uint16_t mf[16], uint16_t bias[16] )
403 ;-----------------------------------------------------------------------------
404 %macro QUANT_AC 2
405 cglobal %1, 3,3
406 %if %2==1
407     QUANT_ONE [r0], [r1], [r2], 0, 5
408 %else
409 %assign x 0
410 %rep %2/2
411     QUANT_TWO [r0+x], [r0+x+mmsize], [r1+x], [r1+x+mmsize], [r2+x], [r2+x+mmsize], x, 5
412 %assign x x+mmsize*2
413 %endrep
414 %endif
415     QUANT_END
416     RET
417 %endmacro
418
419 %macro QUANT_4x4 2
420 %if UNIX64
421     QUANT_TWO [r0+%1+mmsize*0], [r0+%1+mmsize*1], m8, m9, m10, m11, mmsize*0, %2
422 %else
423     QUANT_TWO [r0+%1+mmsize*0], [r0+%1+mmsize*1], [r1+mmsize*0], [r1+mmsize*1], [r2+mmsize*0], [r2+mmsize*1], mmsize*0, %2
424 %if mmsize==8
425     QUANT_TWO [r0+%1+mmsize*2], [r0+%1+mmsize*3], [r1+mmsize*2], [r1+mmsize*3], [r2+mmsize*2], [r2+mmsize*3], mmsize*2, %2
426 %endif
427 %endif
428 %endmacro
429
430 %macro QUANT_4x4x4 0
431 cglobal quant_4x4x4, 3,3,7
432 %if UNIX64
433     mova      m8, [r1+mmsize*0]
434     mova      m9, [r1+mmsize*1]
435     mova     m10, [r2+mmsize*0]
436     mova     m11, [r2+mmsize*1]
437 %endif
438     QUANT_4x4  0, 4
439     QUANT_4x4 32, 5
440     packssdw  m4, m5
441     QUANT_4x4 64, 5
442     QUANT_4x4 96, 6
443     packssdw  m5, m6
444     packssdw  m4, m5  ; AAAA BBBB CCCC DDDD
445     pxor      m3, m3
446     pcmpeqd   m4, m3
447     movmskps eax, m4
448     xor      eax, 0xf
449     RET
450 %endmacro
451
452 INIT_MMX mmx2
453 QUANT_DC quant_2x2_dc, 1
454 %if ARCH_X86_64 == 0 ; not needed because sse2 is faster
455 QUANT_DC quant_4x4_dc, 4
456 INIT_MMX mmx2
457 QUANT_AC quant_4x4, 4
458 QUANT_AC quant_8x8, 16
459 %endif
460
461 INIT_XMM sse2
462 QUANT_DC quant_4x4_dc, 2, 7
463 QUANT_AC quant_4x4, 2
464 QUANT_AC quant_8x8, 8
465 QUANT_4x4x4
466
467 INIT_XMM ssse3
468 QUANT_DC quant_4x4_dc, 2, 7
469 QUANT_AC quant_4x4, 2
470 QUANT_AC quant_8x8, 8
471 QUANT_4x4x4
472
473 INIT_MMX ssse3
474 QUANT_DC quant_2x2_dc, 1
475
476 INIT_XMM sse4
477 ;Not faster on Conroe, so only used in SSE4 versions
478 QUANT_DC quant_4x4_dc, 2, 7
479 QUANT_AC quant_4x4, 2
480 QUANT_AC quant_8x8, 8
481
482 INIT_YMM avx2
483 QUANT_AC quant_4x4, 1
484 QUANT_AC quant_8x8, 4
485 QUANT_DC quant_4x4_dc, 1, 6
486
487 INIT_YMM avx2
488 cglobal quant_4x4x4, 3,3,6
489     mova      m2, [r1]
490     mova      m3, [r2]
491     QUANT_ONE [r0+ 0], m2, m3, 0, 4
492     QUANT_ONE [r0+32], m2, m3, 0, 5
493     packssdw  m4, m5
494     QUANT_ONE [r0+64], m2, m3, 0, 5
495     QUANT_ONE [r0+96], m2, m3, 0, 1
496     packssdw  m5, m1
497     packssdw  m4, m5
498     pxor      m3, m3
499     pcmpeqd   m4, m3
500     movmskps eax, m4
501     mov      edx, eax
502     shr      eax, 4
503     and      eax, edx
504     xor      eax, 0xf
505     RET
506 %endif ; !HIGH_BIT_DEPTH
507
508
509
510 ;=============================================================================
511 ; dequant
512 ;=============================================================================
513
514 %macro DEQUANT16_L 4
515 ;;; %1      dct[y][x]
516 ;;; %2,%3   dequant_mf[i_mf][y][x]
517 ;;; m2      i_qbits
518 %if HIGH_BIT_DEPTH
519     mova     m0, %1
520     mova     m1, %4
521     pmaddwd  m0, %2
522     pmaddwd  m1, %3
523     pslld    m0, xm2
524     pslld    m1, xm2
525     mova     %1, m0
526     mova     %4, m1
527 %else
528     mova     m0, %2
529     packssdw m0, %3
530 %if mmsize==32
531     vpermq   m0, m0, q3120
532 %endif
533     pmullw   m0, %1
534     psllw    m0, xm2
535     mova     %1, m0
536 %endif
537 %endmacro
538
539 %macro DEQUANT32_R 4
540 ;;; %1      dct[y][x]
541 ;;; %2,%3   dequant_mf[i_mf][y][x]
542 ;;; m2      -i_qbits
543 ;;; m3      f
544 ;;; m4      0
545 %if HIGH_BIT_DEPTH
546     mova      m0, %1
547     mova      m1, %4
548     pmadcswd  m0, m0, %2, m3
549     pmadcswd  m1, m1, %3, m3
550     psrad     m0, xm2
551     psrad     m1, xm2
552     mova      %1, m0
553     mova      %4, m1
554 %else
555 %if mmsize == 32
556     pmovzxwd  m0, %1
557     pmovzxwd  m1, %4
558 %else
559     mova      m0, %1
560     punpckhwd m1, m0, m4
561     punpcklwd m0, m4
562 %endif
563     pmadcswd  m0, m0, %2, m3
564     pmadcswd  m1, m1, %3, m3
565     psrad     m0, xm2
566     psrad     m1, xm2
567     packssdw  m0, m1
568 %if mmsize == 32
569     vpermq    m0, m0, q3120
570 %endif
571     mova      %1, m0
572 %endif
573 %endmacro
574
575 %macro DEQUANT_LOOP 3
576 %if 8*(%2-2*%3) > 0
577     mov t0d, 8*(%2-2*%3)
578 %%loop:
579     %1 [r0+(t0     )*SIZEOF_PIXEL], [r1+t0*2      ], [r1+t0*2+ 8*%3], [r0+(t0+ 4*%3)*SIZEOF_PIXEL]
580     %1 [r0+(t0+8*%3)*SIZEOF_PIXEL], [r1+t0*2+16*%3], [r1+t0*2+24*%3], [r0+(t0+12*%3)*SIZEOF_PIXEL]
581     sub t0d, 16*%3
582     jge %%loop
583     RET
584 %else
585 %if mmsize < 32
586     %1 [r0+(8*%3)*SIZEOF_PIXEL], [r1+16*%3], [r1+24*%3], [r0+(12*%3)*SIZEOF_PIXEL]
587 %endif
588     %1 [r0+(0   )*SIZEOF_PIXEL], [r1+0    ], [r1+ 8*%3], [r0+( 4*%3)*SIZEOF_PIXEL]
589     RET
590 %endif
591 %endmacro
592
593 %macro DEQUANT16_FLAT 2-5
594     mova   m0, %1
595     psllw  m0, m4
596 %assign i %0-2
597 %rep %0-1
598 %if i
599     mova   m %+ i, [r0+%2]
600     pmullw m %+ i, m0
601 %else
602     pmullw m0, [r0+%2]
603 %endif
604     mova   [r0+%2], m %+ i
605     %assign i i-1
606     %rotate 1
607 %endrep
608 %endmacro
609
610 %if ARCH_X86_64
611     DECLARE_REG_TMP 6,3,2
612 %else
613     DECLARE_REG_TMP 2,0,1
614 %endif
615
616 %macro DEQUANT_START 2
617     movifnidn t2d, r2m
618     imul t0d, t2d, 0x2b
619     shr  t0d, 8     ; i_qbits = i_qp / 6
620     lea  t1d, [t0*5]
621     sub  t2d, t0d
622     sub  t2d, t1d   ; i_mf = i_qp % 6
623     shl  t2d, %1
624 %if ARCH_X86_64
625     add  r1, t2     ; dequant_mf[i_mf]
626 %else
627     add  r1, r1mp   ; dequant_mf[i_mf]
628     mov  r0, r0mp   ; dct
629 %endif
630     sub  t0d, %2
631     jl   .rshift32  ; negative qbits => rightshift
632 %endmacro
633
634 ;-----------------------------------------------------------------------------
635 ; void dequant_4x4( dctcoef dct[4][4], int dequant_mf[6][4][4], int i_qp )
636 ;-----------------------------------------------------------------------------
637 %macro DEQUANT 3
638 cglobal dequant_%1x%1, 0,3,6
639 .skip_prologue:
640     DEQUANT_START %2+2, %2
641
642 .lshift:
643     movd xm2, t0d
644     DEQUANT_LOOP DEQUANT16_L, %1*%1/4, %3
645
646 .rshift32:
647     neg   t0d
648     mova  m3, [pd_1]
649     movd xm2, t0d
650     pslld m3, xm2
651     pxor  m4, m4
652     psrld m3, 1
653     DEQUANT_LOOP DEQUANT32_R, %1*%1/4, %3
654
655 %if HIGH_BIT_DEPTH == 0 && (notcpuflag(avx) || mmsize == 32)
656 cglobal dequant_%1x%1_flat16, 0,3
657     movifnidn t2d, r2m
658 %if %1 == 8
659     cmp  t2d, 12
660     jl dequant_%1x%1 %+ SUFFIX %+ .skip_prologue
661     sub  t2d, 12
662 %endif
663     imul t0d, t2d, 0x2b
664     shr  t0d, 8     ; i_qbits = i_qp / 6
665     lea  t1d, [t0*5]
666     sub  t2d, t0d
667     sub  t2d, t1d   ; i_mf = i_qp % 6
668     shl  t2d, %2
669 %ifdef PIC
670     lea  r1, [dequant%1_scale]
671     add  r1, t2
672 %else
673     lea  r1, [dequant%1_scale + t2]
674 %endif
675     movifnidn r0, r0mp
676     movd xm4, t0d
677 %if %1 == 4
678 %if mmsize == 8
679     DEQUANT16_FLAT [r1], 0, 16
680     DEQUANT16_FLAT [r1+8], 8, 24
681 %elif mmsize == 16
682     DEQUANT16_FLAT [r1], 0, 16
683 %else
684     vbroadcasti128 m0, [r1]
685     psllw  m0, xm4
686     pmullw m0, [r0]
687     mova [r0], m0
688 %endif
689 %elif mmsize == 8
690     DEQUANT16_FLAT [r1], 0, 8, 64, 72
691     DEQUANT16_FLAT [r1+16], 16, 24, 48, 56
692     DEQUANT16_FLAT [r1+16], 80, 88, 112, 120
693     DEQUANT16_FLAT [r1+32], 32, 40, 96, 104
694 %elif mmsize == 16
695     DEQUANT16_FLAT [r1], 0, 64
696     DEQUANT16_FLAT [r1+16], 16, 48, 80, 112
697     DEQUANT16_FLAT [r1+32], 32, 96
698 %else
699     mova   m1, [r1+ 0]
700     mova   m2, [r1+32]
701     psllw  m1, xm4
702     psllw  m2, xm4
703     pmullw m0, m1, [r0+ 0]
704     pmullw m3, m2, [r0+32]
705     pmullw m4, m1, [r0+64]
706     pmullw m5, m2, [r0+96]
707     mova [r0+ 0], m0
708     mova [r0+32], m3
709     mova [r0+64], m4
710     mova [r0+96], m5
711 %endif
712     RET
713 %endif ; !HIGH_BIT_DEPTH && !AVX
714 %endmacro ; DEQUANT
715
716 %if HIGH_BIT_DEPTH
717 INIT_XMM sse2
718 DEQUANT 4, 4, 2
719 DEQUANT 8, 6, 2
720 INIT_XMM xop
721 DEQUANT 4, 4, 2
722 DEQUANT 8, 6, 2
723 INIT_YMM avx2
724 DEQUANT 4, 4, 4
725 DEQUANT 8, 6, 4
726 %else
727 %if ARCH_X86_64 == 0
728 INIT_MMX mmx
729 DEQUANT 4, 4, 1
730 DEQUANT 8, 6, 1
731 %endif
732 INIT_XMM sse2
733 DEQUANT 4, 4, 2
734 DEQUANT 8, 6, 2
735 INIT_XMM avx
736 DEQUANT 4, 4, 2
737 DEQUANT 8, 6, 2
738 INIT_XMM xop
739 DEQUANT 4, 4, 2
740 DEQUANT 8, 6, 2
741 INIT_YMM avx2
742 DEQUANT 4, 4, 4
743 DEQUANT 8, 6, 4
744 %endif
745
746 %macro DEQUANT_DC 2
747 cglobal dequant_4x4dc, 0,3,6
748     DEQUANT_START 6, 6
749
750 .lshift:
751 %if cpuflag(avx2)
752     vpbroadcastdct m3, [r1]
753 %else
754     movd    xm3, [r1]
755     SPLAT%1  m3, xm3
756 %endif
757     movd    xm2, t0d
758     pslld    m3, xm2
759 %assign %%x 0
760 %rep SIZEOF_PIXEL*32/mmsize
761     %2       m0, m3, [r0+%%x]
762     mova     [r0+%%x], m0
763 %assign %%x %%x+mmsize
764 %endrep
765     RET
766
767 .rshift32:
768     neg      t0d
769 %if cpuflag(avx2)
770     vpbroadcastdct m2, [r1]
771 %else
772     movd     xm2, [r1]
773 %endif
774     mova      m5, [p%1_1]
775     movd     xm3, t0d
776     pslld     m4, m5, xm3
777     psrld     m4, 1
778 %if HIGH_BIT_DEPTH
779 %if notcpuflag(avx2)
780     pshufd    m2, m2, 0
781 %endif
782 %assign %%x 0
783 %rep SIZEOF_PIXEL*32/mmsize
784     pmadcswd  m0, m2, [r0+%%x], m4
785     psrad     m0, xm3
786     mova      [r0+%%x], m0
787 %assign %%x %%x+mmsize
788 %endrep
789
790 %else ; !HIGH_BIT_DEPTH
791 %if notcpuflag(avx2)
792     PSHUFLW   m2, m2, 0
793 %endif
794     punpcklwd m2, m4
795 %assign %%x 0
796 %rep SIZEOF_PIXEL*32/mmsize
797     mova      m0, [r0+%%x]
798     punpckhwd m1, m0, m5
799     punpcklwd m0, m5
800     pmaddwd   m0, m2
801     pmaddwd   m1, m2
802     psrad     m0, xm3
803     psrad     m1, xm3
804     packssdw  m0, m1
805     mova      [r0+%%x], m0
806 %assign %%x %%x+mmsize
807 %endrep
808 %endif ; !HIGH_BIT_DEPTH
809     RET
810 %endmacro
811
812 %if HIGH_BIT_DEPTH
813 INIT_XMM sse2
814 DEQUANT_DC d, pmaddwd
815 INIT_XMM xop
816 DEQUANT_DC d, pmaddwd
817 INIT_YMM avx2
818 DEQUANT_DC d, pmaddwd
819 %else
820 %if ARCH_X86_64 == 0
821 INIT_MMX mmx2
822 DEQUANT_DC w, pmullw
823 %endif
824 INIT_XMM sse2
825 DEQUANT_DC w, pmullw
826 INIT_XMM avx
827 DEQUANT_DC w, pmullw
828 INIT_YMM avx2
829 DEQUANT_DC w, pmullw
830 %endif
831
832 %macro PEXTRW 4
833     %if cpuflag(sse4)
834         pextrw %1, %2, %3
835     %else
836         ; pextrw with a memory destination requires SSE4.1, go through a GPR as a fallback
837         %if %3
838             pextrw %4d, %2, %3
839         %else
840             movd %4d, %2
841         %endif
842         mov %1, %4w
843     %endif
844 %endmacro
845
846 ;-----------------------------------------------------------------------------
847 ; void idct_dequant_2x4_dc( dctcoef dct[8], dctcoef dct4x4[8][16], int dequant_mf[6][16], int i_qp )
848 ; void idct_dequant_2x4_dconly( dctcoef dct[8], int dequant_mf[6][16], int i_qp )
849 ;-----------------------------------------------------------------------------
850
851 %macro DEQUANT_2x4_DC 1
852 %ifidn %1, dconly
853     DECLARE_REG_TMP 6,3,2
854     %define %%args dct, dmf, qp
855 %else
856     DECLARE_REG_TMP 6,4,3
857     %define %%args dct, dct4x4, dmf, qp
858 %endif
859
860 %if ARCH_X86_64 == 0
861     DECLARE_REG_TMP 2,0,1
862 %endif
863
864 cglobal idct_dequant_2x4_%1, 0,3,5, %%args
865     movifnidn  t2d, qpm
866     imul       t0d, t2d, 0x2b
867     shr        t0d, 8         ; qp / 6
868     lea        t1d, [t0*5]
869     sub        t2d, t0d
870     sub        t2d, t1d       ; qp % 6
871     shl        t2d, 6         ; 16 * sizeof(int)
872 %if ARCH_X86_64
873     imul       t2d, [dmfq+t2], -0xffff ; (-dmf) << 16 | dmf
874 %else
875     mov       dctq, dctmp
876     add         t2, dmfmp
877     imul       t2d, [t2], -0xffff
878 %endif
879 %if HIGH_BIT_DEPTH
880     mova        m0, [dctq]
881     mova        m1, [dctq+16]
882     SUMSUB_BA    d, 1, 0, 2   ; 16-bit intermediate precision is enough for the first two sumsub steps,
883     packssdw    m1, m0        ; and by packing to words we can use pmaddwd instead of pmulld later.
884 %else
885     movq        m0, [dctq]
886     movq        m1, [dctq+8]
887     SUMSUB_BA    w, 1, 0, 2
888     punpcklqdq  m1, m0        ; a0 a1 a2 a3 a4 a5 a6 a7
889 %endif
890     pshufd      m0, m1, q2301 ; a2 a3 a0 a1 a6 a7 a4 a5
891     movd        m3, t2d
892     pshuflw     m3, m3, q1000 ; +  +  +  -
893     SUMSUB_BA    w, 0, 1, 2
894     punpcklqdq  m3, m3        ; +  +  +  -  +  +  +  -
895     pshufd      m1, m1, q0022
896     sub        t0d, 6
897     jl .rshift
898     movd        m2, t0d
899     psllw       m3, m2
900     pmaddwd     m0, m3
901     pmaddwd     m1, m3
902     jmp .end
903 .rshift:
904     neg        t0d
905     movd        m2, t0d
906     pcmpeqd     m4, m4
907     pmaddwd     m0, m3
908     pmaddwd     m1, m3
909     pslld       m4, m2
910     psrad       m4, 1
911     psubd       m0, m4 ; + 1 << (qp/6-1)
912     psubd       m1, m4
913     psrad       m0, m2
914     psrad       m1, m2
915 .end:
916 %ifidn %1, dconly
917 %if HIGH_BIT_DEPTH
918     mova    [dctq], m0
919     mova [dctq+16], m1
920 %else
921     packssdw    m0, m1
922     mova    [dctq], m0
923 %endif
924 %else
925     movifnidn dct4x4q, dct4x4mp
926 %if HIGH_BIT_DEPTH
927     movd   [dct4x4q+0*64], m0
928 %if cpuflag(sse4)
929     pextrd [dct4x4q+1*64], m0, 1
930     add    dct4x4q, 4*64
931     pextrd [dct4x4q-2*64], m0, 2
932     pextrd [dct4x4q-1*64], m0, 3
933     movd   [dct4x4q+0*64], m1
934     pextrd [dct4x4q+1*64], m1, 1
935     pextrd [dct4x4q+2*64], m1, 2
936     pextrd [dct4x4q+3*64], m1, 3
937 %else
938     MOVHL       m2, m0
939     psrlq       m0, 32
940     movd   [dct4x4q+1*64], m0
941     add    dct4x4q, 4*64
942     movd   [dct4x4q-2*64], m2
943     psrlq       m2, 32
944     movd   [dct4x4q-1*64], m2
945     movd   [dct4x4q+0*64], m1
946     MOVHL       m2, m1
947     psrlq       m1, 32
948     movd   [dct4x4q+1*64], m1
949     movd   [dct4x4q+2*64], m2
950     psrlq       m2, 32
951     movd   [dct4x4q+3*64], m2
952 %endif
953 %else
954     PEXTRW [dct4x4q+0*32], m0, 0, eax
955     PEXTRW [dct4x4q+1*32], m0, 2, eax
956     PEXTRW [dct4x4q+2*32], m0, 4, eax
957     PEXTRW [dct4x4q+3*32], m0, 6, eax
958     add    dct4x4q, 4*32
959     PEXTRW [dct4x4q+0*32], m1, 0, eax
960     PEXTRW [dct4x4q+1*32], m1, 2, eax
961     PEXTRW [dct4x4q+2*32], m1, 4, eax
962     PEXTRW [dct4x4q+3*32], m1, 6, eax
963 %endif
964 %endif
965     RET
966 %endmacro
967
968 ; sse4 reduces code size compared to sse2 but isn't any faster, so just go with sse2+avx
969 INIT_XMM sse2
970 DEQUANT_2x4_DC dc
971 DEQUANT_2x4_DC dconly
972 INIT_XMM avx
973 DEQUANT_2x4_DC dc
974 DEQUANT_2x4_DC dconly
975
976 ; t4 is eax for return value.
977 %if ARCH_X86_64
978     DECLARE_REG_TMP 0,1,2,3,6,4  ; Identical for both Windows and *NIX
979 %else
980     DECLARE_REG_TMP 4,1,2,3,0,5
981 %endif
982
983 ;-----------------------------------------------------------------------------
984 ; x264_optimize_chroma_2x2_dc( dctcoef dct[4], int dequant_mf )
985 ;-----------------------------------------------------------------------------
986
987 %macro OPTIMIZE_CHROMA_2x2_DC 0
988 cglobal optimize_chroma_2x2_dc, 0,6-cpuflag(sse4),7
989     movifnidn t0, r0mp
990     movd      m2, r1m
991     movq      m1, [t0]
992 %if cpuflag(sse4)
993     pcmpeqb   m4, m4
994     pslld     m4, 11
995 %else
996     pxor      m4, m4
997 %endif
998 %if cpuflag(ssse3)
999     mova      m3, [chroma_dc_dct_mask]
1000     mova      m5, [chroma_dc_dmf_mask]
1001 %else
1002     mova      m3, [chroma_dc_dct_mask_mmx]
1003     mova      m5, [chroma_dc_dmf_mask_mmx]
1004 %endif
1005     pshuflw   m2, m2, 0
1006     pshufd    m0, m1, q0101      ;  1  0  3  2  1  0  3  2
1007     punpcklqdq m2, m2
1008     punpcklqdq m1, m1            ;  3  2  1  0  3  2  1  0
1009     mova      m6, [pd_1024]      ; 32<<5, elements are shifted 5 bits to the left
1010     PSIGNW    m0, m3             ; -1 -0  3  2 -1 -0  3  2
1011     PSIGNW    m2, m5             ;  +  -  -  +  -  -  +  +
1012     paddw     m0, m1             ; -1+3 -0+2  1+3  0+2 -1+3 -0+2  1+3  0+2
1013     pmaddwd   m0, m2             ;  0-1-2+3  0-1+2-3  0+1-2-3  0+1+2+3  * dmf
1014     punpcklwd m1, m1
1015     psrad     m2, 16             ;  +  -  -  +
1016     mov      t1d, 3
1017     paddd     m0, m6
1018     xor      t4d, t4d
1019 %if notcpuflag(ssse3)
1020     psrad     m1, 31             ; has to be 0 or -1 in order for PSIGND_MMX to work correctly
1021 %endif
1022 %if cpuflag(sse4)
1023     ptest     m0, m4
1024 %else
1025     mova      m6, m0
1026     SWAP       0, 6
1027     psrad     m6, 11
1028     pcmpeqd   m6, m4
1029     pmovmskb t5d, m6
1030     cmp      t5d, 0xffff
1031 %endif
1032     jz .ret                      ; if the DC coefficients already round to zero, terminate early
1033     mova      m3, m0
1034 .outer_loop:
1035     movsx    t3d, word [t0+2*t1] ; dct[coeff]
1036     pshufd    m6, m1, q3333
1037     pshufd    m1, m1, q2100      ; move the next element to high dword
1038     PSIGND    m5, m2, m6
1039     test     t3d, t3d
1040     jz .loop_end
1041 .outer_loop_0:
1042     mov      t2d, t3d
1043     sar      t3d, 31
1044     or       t3d, 1
1045 .inner_loop:
1046     psubd     m3, m5             ; coeff -= sign
1047     pxor      m6, m0, m3
1048 %if cpuflag(sse4)
1049     ptest     m6, m4
1050 %else
1051     psrad     m6, 11
1052     pcmpeqd   m6, m4
1053     pmovmskb t5d, m6
1054     cmp      t5d, 0xffff
1055 %endif
1056     jz .round_coeff
1057     paddd     m3, m5             ; coeff += sign
1058     mov      t4d, 1
1059 .loop_end:
1060     dec      t1d
1061     jz .last_coeff
1062     pshufd    m2, m2, q1320      ;  -  +  -  +  /  -  -  +  +
1063     jg .outer_loop
1064 .ret:
1065     REP_RET
1066 .round_coeff:
1067     sub      t2d, t3d
1068     mov [t0+2*t1], t2w
1069     jnz .inner_loop
1070     jmp .loop_end
1071 .last_coeff:
1072     movsx    t3d, word [t0]
1073     punpcklqdq m2, m2            ;  +  +  +  +
1074     PSIGND    m5, m2, m1
1075     test     t3d, t3d
1076     jnz .outer_loop_0
1077     RET
1078 %endmacro
1079
1080 %if HIGH_BIT_DEPTH == 0
1081 INIT_XMM sse2
1082 OPTIMIZE_CHROMA_2x2_DC
1083 INIT_XMM ssse3
1084 OPTIMIZE_CHROMA_2x2_DC
1085 INIT_XMM sse4
1086 OPTIMIZE_CHROMA_2x2_DC
1087 INIT_XMM avx
1088 OPTIMIZE_CHROMA_2x2_DC
1089 %endif ; !HIGH_BIT_DEPTH
1090
1091 %if HIGH_BIT_DEPTH
1092 ;-----------------------------------------------------------------------------
1093 ; void denoise_dct( int32_t *dct, uint32_t *sum, uint32_t *offset, int size )
1094 ;-----------------------------------------------------------------------------
1095 %macro DENOISE_DCT 0
1096 cglobal denoise_dct, 4,4,6
1097     pxor      m5, m5
1098     movsxdifnidn r3, r3d
1099 .loop:
1100     mova      m2, [r0+r3*4-2*mmsize]
1101     mova      m3, [r0+r3*4-1*mmsize]
1102     ABSD      m0, m2
1103     ABSD      m1, m3
1104     paddd     m4, m0, [r1+r3*4-2*mmsize]
1105     psubd     m0, [r2+r3*4-2*mmsize]
1106     mova      [r1+r3*4-2*mmsize], m4
1107     paddd     m4, m1, [r1+r3*4-1*mmsize]
1108     psubd     m1, [r2+r3*4-1*mmsize]
1109     mova      [r1+r3*4-1*mmsize], m4
1110     pcmpgtd   m4, m0, m5
1111     pand      m0, m4
1112     pcmpgtd   m4, m1, m5
1113     pand      m1, m4
1114     PSIGND    m0, m2
1115     PSIGND    m1, m3
1116     mova      [r0+r3*4-2*mmsize], m0
1117     mova      [r0+r3*4-1*mmsize], m1
1118     sub      r3d, mmsize/2
1119     jg .loop
1120     RET
1121 %endmacro
1122
1123 %if ARCH_X86_64 == 0
1124 INIT_MMX mmx
1125 DENOISE_DCT
1126 %endif
1127 INIT_XMM sse2
1128 DENOISE_DCT
1129 INIT_XMM ssse3
1130 DENOISE_DCT
1131 INIT_XMM avx
1132 DENOISE_DCT
1133 INIT_YMM avx2
1134 DENOISE_DCT
1135
1136 %else ; !HIGH_BIT_DEPTH
1137
1138 ;-----------------------------------------------------------------------------
1139 ; void denoise_dct( int16_t *dct, uint32_t *sum, uint16_t *offset, int size )
1140 ;-----------------------------------------------------------------------------
1141 %macro DENOISE_DCT 0
1142 cglobal denoise_dct, 4,4,7
1143     pxor      m6, m6
1144     movsxdifnidn r3, r3d
1145 .loop:
1146     mova      m2, [r0+r3*2-2*mmsize]
1147     mova      m3, [r0+r3*2-1*mmsize]
1148     ABSW      m0, m2, sign
1149     ABSW      m1, m3, sign
1150     psubusw   m4, m0, [r2+r3*2-2*mmsize]
1151     psubusw   m5, m1, [r2+r3*2-1*mmsize]
1152     PSIGNW    m4, m2
1153     PSIGNW    m5, m3
1154     mova      [r0+r3*2-2*mmsize], m4
1155     mova      [r0+r3*2-1*mmsize], m5
1156     punpcklwd m2, m0, m6
1157     punpcklwd m3, m1, m6
1158     punpckhwd m0, m6
1159     punpckhwd m1, m6
1160     paddd     m2, [r1+r3*4-4*mmsize]
1161     paddd     m0, [r1+r3*4-3*mmsize]
1162     paddd     m3, [r1+r3*4-2*mmsize]
1163     paddd     m1, [r1+r3*4-1*mmsize]
1164     mova      [r1+r3*4-4*mmsize], m2
1165     mova      [r1+r3*4-3*mmsize], m0
1166     mova      [r1+r3*4-2*mmsize], m3
1167     mova      [r1+r3*4-1*mmsize], m1
1168     sub       r3, mmsize
1169     jg .loop
1170     RET
1171 %endmacro
1172
1173 %if ARCH_X86_64 == 0
1174 INIT_MMX mmx
1175 DENOISE_DCT
1176 %endif
1177 INIT_XMM sse2
1178 DENOISE_DCT
1179 INIT_XMM ssse3
1180 DENOISE_DCT
1181 INIT_XMM avx
1182 DENOISE_DCT
1183
1184 INIT_YMM avx2
1185 cglobal denoise_dct, 4,4,4
1186     pxor      m3, m3
1187     movsxdifnidn r3, r3d
1188 .loop:
1189     mova      m1, [r0+r3*2-mmsize]
1190     pabsw     m0, m1
1191     psubusw   m2, m0, [r2+r3*2-mmsize]
1192     vpermq    m0, m0, q3120
1193     psignw    m2, m1
1194     mova [r0+r3*2-mmsize], m2
1195     punpcklwd m1, m0, m3
1196     punpckhwd m0, m3
1197     paddd     m1, [r1+r3*4-2*mmsize]
1198     paddd     m0, [r1+r3*4-1*mmsize]
1199     mova      [r1+r3*4-2*mmsize], m1
1200     mova      [r1+r3*4-1*mmsize], m0
1201     sub       r3, mmsize/2
1202     jg .loop
1203     RET
1204
1205 %endif ; !HIGH_BIT_DEPTH
1206
1207 ;-----------------------------------------------------------------------------
1208 ; int decimate_score( dctcoef *dct )
1209 ;-----------------------------------------------------------------------------
1210
1211 %macro DECIMATE_MASK 5
1212 %if mmsize==16
1213 %if HIGH_BIT_DEPTH
1214     movdqa    m0, [%3+ 0]
1215     movdqa    m1, [%3+32]
1216     packssdw  m0, [%3+16]
1217     packssdw  m1, [%3+48]
1218     ABSW2     m0, m1, m0, m1, m3, m4
1219 %else
1220     ABSW      m0, [%3+ 0], m3
1221     ABSW      m1, [%3+16], m4
1222 %endif
1223     packsswb  m0, m1
1224     pxor      m2, m2
1225     pcmpeqb   m2, m0
1226     pcmpgtb   m0, %4
1227     pmovmskb  %1, m2
1228     pmovmskb  %2, m0
1229 %else ; mmsize==8
1230 %if HIGH_BIT_DEPTH
1231     movq      m0, [%3+ 0]
1232     movq      m1, [%3+16]
1233     movq      m2, [%3+32]
1234     movq      m3, [%3+48]
1235     packssdw  m0, [%3+ 8]
1236     packssdw  m1, [%3+24]
1237     packssdw  m2, [%3+40]
1238     packssdw  m3, [%3+56]
1239 %else
1240     movq      m0, [%3+ 0]
1241     movq      m1, [%3+ 8]
1242     movq      m2, [%3+16]
1243     movq      m3, [%3+24]
1244 %endif
1245     ABSW2     m0, m1, m0, m1, m6, m7
1246     ABSW2     m2, m3, m2, m3, m6, m7
1247     packsswb  m0, m1
1248     packsswb  m2, m3
1249     pxor      m4, m4
1250     pxor      m6, m6
1251     pcmpeqb   m4, m0
1252     pcmpeqb   m6, m2
1253     pcmpgtb   m0, %4
1254     pcmpgtb   m2, %4
1255     pmovmskb  %5, m4
1256     pmovmskb  %1, m6
1257     shl       %1, 8
1258     or        %1, %5
1259     pmovmskb  %5, m0
1260     pmovmskb  %2, m2
1261     shl       %2, 8
1262     or        %2, %5
1263 %endif
1264 %endmacro
1265
1266 cextern decimate_table4
1267 cextern decimate_table8
1268
1269 %macro DECIMATE4x4 1
1270
1271 cglobal decimate_score%1, 1,3
1272 %ifdef PIC
1273     lea r4, [decimate_table4]
1274     lea r5, [decimate_mask_table4]
1275     %define table r4
1276     %define mask_table r5
1277 %else
1278     %define table decimate_table4
1279     %define mask_table decimate_mask_table4
1280 %endif
1281     DECIMATE_MASK edx, eax, r0, [pb_1], ecx
1282     xor   edx, 0xffff
1283     je   .ret
1284     test  eax, eax
1285     jne  .ret9
1286 %if %1==15
1287     shr   edx, 1
1288 %endif
1289     movzx ecx, dl
1290     movzx eax, byte [mask_table + rcx]
1291     cmp   edx, ecx
1292     je   .ret
1293     bsr   ecx, ecx
1294     shr   edx, 1
1295     shr   edx, cl
1296     tzcnt ecx, edx
1297     shr   edx, 1
1298     shr   edx, cl
1299     add    al, byte [table + rcx]
1300     add    al, byte [mask_table + rdx]
1301 .ret:
1302     REP_RET
1303 .ret9:
1304     mov   eax, 9
1305     RET
1306
1307 %endmacro
1308
1309 %if ARCH_X86_64 == 0
1310 INIT_MMX mmx2
1311 DECIMATE4x4 15
1312 DECIMATE4x4 16
1313 %endif
1314 INIT_XMM sse2
1315 DECIMATE4x4 15
1316 DECIMATE4x4 16
1317 INIT_XMM ssse3
1318 DECIMATE4x4 15
1319 DECIMATE4x4 16
1320
1321 ; 2x gt1 output, 2x nz output, 1x mask
1322 %macro DECIMATE_MASK64_AVX2 5
1323     pabsw     m0, [r0+ 0]
1324     pabsw     m2, [r0+32]
1325     pabsw     m1, [r0+64]
1326     pabsw     m3, [r0+96]
1327     packsswb  m0, m2
1328     packsswb  m1, m3
1329     pcmpgtb   m2, m0, %5    ; the > 1 checks don't care about order, so
1330     pcmpgtb   m3, m1, %5    ; we can save latency by doing them here
1331     pmovmskb  %1, m2
1332     pmovmskb  %2, m3
1333     or        %1, %2
1334     jne .ret9
1335     vpermq    m0, m0, q3120
1336     vpermq    m1, m1, q3120
1337     pxor      m4, m4
1338     pcmpeqb   m0, m4
1339     pcmpeqb   m1, m4
1340     pmovmskb  %3, m0
1341     pmovmskb  %4, m1
1342 %endmacro
1343
1344 %macro DECIMATE8x8 0
1345
1346 %if ARCH_X86_64
1347 cglobal decimate_score64, 1,5
1348 %ifdef PIC
1349     lea r4, [decimate_table8]
1350     %define table r4
1351 %else
1352     %define table decimate_table8
1353 %endif
1354     mova  m5, [pb_1]
1355 %if mmsize==32
1356     DECIMATE_MASK64_AVX2 eax, r2d, r1d, r3d, m5
1357     shl   r3, 32
1358     or    r1, r3
1359     xor   r1, -1
1360     je  .ret
1361 %else
1362     DECIMATE_MASK r1d, eax, r0+SIZEOF_DCTCOEF* 0, m5, null
1363     test eax, eax
1364     jne  .ret9
1365     DECIMATE_MASK r2d, eax, r0+SIZEOF_DCTCOEF*16, m5, null
1366     shl  r2d, 16
1367     or   r1d, r2d
1368     DECIMATE_MASK r2d, r3d, r0+SIZEOF_DCTCOEF*32, m5, null
1369     shl   r2, 32
1370     or   eax, r3d
1371     or    r1, r2
1372     DECIMATE_MASK r2d, r3d, r0+SIZEOF_DCTCOEF*48, m5, null
1373     shl   r2, 48
1374     or    r1, r2
1375     xor   r1, -1
1376     je   .ret
1377     add  eax, r3d
1378     jne  .ret9
1379 %endif
1380     mov   al, -6
1381 .loop:
1382     tzcnt rcx, r1
1383     shr   r1, cl
1384     add   al, byte [table + rcx]
1385     jge  .ret9
1386     shr   r1, 1
1387     jne  .loop
1388     add   al, 6
1389 .ret:
1390     REP_RET
1391 .ret9:
1392     mov  eax, 9
1393     RET
1394
1395 %else ; ARCH
1396 %if mmsize == 8
1397 cglobal decimate_score64, 1,6
1398 %else
1399 cglobal decimate_score64, 1,5
1400 %endif
1401     mova  m5, [pb_1]
1402 %if mmsize==32
1403     DECIMATE_MASK64_AVX2 r0, r2, r3, r4, m5
1404     xor   r3, -1
1405     je .tryret
1406     xor   r4, -1
1407 .cont:
1408 %else
1409     DECIMATE_MASK r3, r2, r0+SIZEOF_DCTCOEF* 0, m5, r5
1410     test  r2, r2
1411     jne  .ret9
1412     DECIMATE_MASK r4, r2, r0+SIZEOF_DCTCOEF*16, m5, r5
1413     shl   r4, 16
1414     or    r3, r4
1415     DECIMATE_MASK r4, r1, r0+SIZEOF_DCTCOEF*32, m5, r5
1416     or    r2, r1
1417     DECIMATE_MASK r1, r0, r0+SIZEOF_DCTCOEF*48, m5, r5
1418     shl   r1, 16
1419     or    r4, r1
1420     xor   r3, -1
1421     je   .tryret
1422     xor   r4, -1
1423 .cont:
1424     add   r0, r2
1425     jne  .ret9
1426 %endif
1427     mov   al, -6
1428 .loop:
1429     tzcnt ecx, r3
1430     test  r3, r3
1431     je   .largerun
1432     shrd  r3, r4, cl
1433     shr   r4, cl
1434     add   al, byte [decimate_table8 + ecx]
1435     jge  .ret9
1436     shrd  r3, r4, 1
1437     shr   r4, 1
1438     test  r3, r3
1439     jne  .loop
1440     test  r4, r4
1441     jne  .loop
1442     add   al, 6
1443 .ret:
1444     REP_RET
1445 .tryret:
1446     xor   r4, -1
1447     jne  .cont
1448     RET
1449 .ret9:
1450     mov   eax, 9
1451     RET
1452 .largerun:
1453     mov   r3, r4
1454     xor   r4, r4
1455     tzcnt ecx, r3
1456     shr   r3, cl
1457     shr   r3, 1
1458     jne  .loop
1459     add   al, 6
1460     RET
1461 %endif ; ARCH
1462
1463 %endmacro
1464
1465 %if ARCH_X86_64 == 0
1466 INIT_MMX mmx2
1467 DECIMATE8x8
1468 %endif
1469 INIT_XMM sse2
1470 DECIMATE8x8
1471 INIT_XMM ssse3
1472 DECIMATE8x8
1473 INIT_YMM avx2
1474 DECIMATE8x8
1475
1476 ;-----------------------------------------------------------------------------
1477 ; int coeff_last( dctcoef *dct )
1478 ;-----------------------------------------------------------------------------
1479
1480 %macro BSR 3
1481 %if cpuflag(lzcnt)
1482     lzcnt %1, %2
1483     xor %1, %3
1484 %else
1485     bsr %1, %2
1486 %endif
1487 %endmacro
1488
1489 %macro LZCOUNT 3
1490 %if cpuflag(lzcnt)
1491     lzcnt %1, %2
1492 %else
1493     bsr %1, %2
1494     xor %1, %3
1495 %endif
1496 %endmacro
1497
1498 %if HIGH_BIT_DEPTH
1499 %macro LAST_MASK 3-4
1500 %if %1 == 4
1501     movq     mm0, [%3]
1502     packssdw mm0, [%3+8]
1503     packsswb mm0, mm0
1504     pcmpeqb  mm0, mm2
1505     pmovmskb  %2, mm0
1506 %elif mmsize == 16
1507     movdqa   xmm0, [%3+ 0]
1508 %if %1 == 8
1509     packssdw xmm0, [%3+16]
1510     packsswb xmm0, xmm0
1511 %else
1512     movdqa   xmm1, [%3+32]
1513     packssdw xmm0, [%3+16]
1514     packssdw xmm1, [%3+48]
1515     packsswb xmm0, xmm1
1516 %endif
1517     pcmpeqb  xmm0, xmm2
1518     pmovmskb   %2, xmm0
1519 %elif %1 == 8
1520     movq     mm0, [%3+ 0]
1521     movq     mm1, [%3+16]
1522     packssdw mm0, [%3+ 8]
1523     packssdw mm1, [%3+24]
1524     packsswb mm0, mm1
1525     pcmpeqb  mm0, mm2
1526     pmovmskb  %2, mm0
1527 %else
1528     movq     mm0, [%3+ 0]
1529     movq     mm1, [%3+16]
1530     packssdw mm0, [%3+ 8]
1531     packssdw mm1, [%3+24]
1532     movq     mm3, [%3+32]
1533     movq     mm4, [%3+48]
1534     packssdw mm3, [%3+40]
1535     packssdw mm4, [%3+56]
1536     packsswb mm0, mm1
1537     packsswb mm3, mm4
1538     pcmpeqb  mm0, mm2
1539     pcmpeqb  mm3, mm2
1540     pmovmskb  %2, mm0
1541     pmovmskb  %4, mm3
1542     shl       %4, 8
1543     or        %2, %4
1544 %endif
1545 %endmacro
1546
1547 %macro COEFF_LAST4 0
1548 cglobal coeff_last4, 1,3
1549     pxor mm2, mm2
1550     LAST_MASK 4, r1d, r0
1551     xor  r1d, 0xff
1552     shr  r1d, 4
1553     BSR  eax, r1d, 0x1f
1554     RET
1555 %endmacro
1556
1557 INIT_MMX mmx2
1558 COEFF_LAST4
1559 INIT_MMX mmx2, lzcnt
1560 COEFF_LAST4
1561
1562 %macro COEFF_LAST8 0
1563 cglobal coeff_last8, 1,3
1564     pxor m2, m2
1565     LAST_MASK 8, r1d, r0
1566 %if mmsize == 16
1567     xor r1d, 0xffff
1568     shr r1d, 8
1569 %else
1570     xor r1d, 0xff
1571 %endif
1572     BSR eax, r1d, 0x1f
1573     RET
1574 %endmacro
1575
1576 %if ARCH_X86_64 == 0
1577 INIT_MMX mmx2
1578 COEFF_LAST8
1579 %endif
1580 INIT_XMM sse2
1581 COEFF_LAST8
1582 INIT_XMM sse2, lzcnt
1583 COEFF_LAST8
1584
1585 %else ; !HIGH_BIT_DEPTH
1586 %macro LAST_MASK 3-4
1587 %if %1 <= 8
1588     movq     mm0, [%3+ 0]
1589 %if %1 == 4
1590     packsswb mm0, mm0
1591 %else
1592     packsswb mm0, [%3+ 8]
1593 %endif
1594     pcmpeqb  mm0, mm2
1595     pmovmskb  %2, mm0
1596 %elif mmsize == 16
1597     movdqa   xmm0, [%3+ 0]
1598     packsswb xmm0, [%3+16]
1599     pcmpeqb  xmm0, xmm2
1600     pmovmskb   %2, xmm0
1601 %else
1602     movq     mm0, [%3+ 0]
1603     movq     mm1, [%3+16]
1604     packsswb mm0, [%3+ 8]
1605     packsswb mm1, [%3+24]
1606     pcmpeqb  mm0, mm2
1607     pcmpeqb  mm1, mm2
1608     pmovmskb  %2, mm0
1609     pmovmskb  %4, mm1
1610     shl       %4, 8
1611     or        %2, %4
1612 %endif
1613 %endmacro
1614
1615 %macro COEFF_LAST48 0
1616 %if ARCH_X86_64
1617 cglobal coeff_last4, 1,1
1618     BSR  rax, [r0], 0x3f
1619     shr  eax, 4
1620     RET
1621 %else
1622 cglobal coeff_last4, 0,3
1623     mov   edx, r0mp
1624     mov   eax, [edx+4]
1625     xor   ecx, ecx
1626     test  eax, eax
1627     cmovz eax, [edx]
1628     setnz cl
1629     BSR   eax, eax, 0x1f
1630     shr   eax, 4
1631     lea   eax, [eax+ecx*2]
1632     RET
1633 %endif
1634
1635 cglobal coeff_last8, 1,3
1636     pxor m2, m2
1637     LAST_MASK 8, r1d, r0, r2d
1638     xor r1d, 0xff
1639     BSR eax, r1d, 0x1f
1640     RET
1641 %endmacro
1642
1643 INIT_MMX mmx2
1644 COEFF_LAST48
1645 INIT_MMX mmx2, lzcnt
1646 COEFF_LAST48
1647 %endif ; HIGH_BIT_DEPTH
1648
1649 %macro COEFF_LAST 0
1650 cglobal coeff_last15, 1,3
1651     pxor m2, m2
1652     LAST_MASK 15, r1d, r0-SIZEOF_DCTCOEF, r2d
1653     xor r1d, 0xffff
1654     BSR eax, r1d, 0x1f
1655     dec eax
1656     RET
1657
1658 cglobal coeff_last16, 1,3
1659     pxor m2, m2
1660     LAST_MASK 16, r1d, r0, r2d
1661     xor r1d, 0xffff
1662     BSR eax, r1d, 0x1f
1663     RET
1664
1665 %if ARCH_X86_64 == 0
1666 cglobal coeff_last64, 1, 4-mmsize/16
1667     pxor m2, m2
1668     LAST_MASK 16, r1d, r0+SIZEOF_DCTCOEF* 32, r3d
1669     LAST_MASK 16, r2d, r0+SIZEOF_DCTCOEF* 48, r3d
1670     shl r2d, 16
1671     or  r1d, r2d
1672     xor r1d, -1
1673     jne .secondhalf
1674     LAST_MASK 16, r1d, r0+SIZEOF_DCTCOEF* 0, r3d
1675     LAST_MASK 16, r2d, r0+SIZEOF_DCTCOEF*16, r3d
1676     shl r2d, 16
1677     or  r1d, r2d
1678     not r1d
1679     BSR eax, r1d, 0x1f
1680     RET
1681 .secondhalf:
1682     BSR eax, r1d, 0x1f
1683     add eax, 32
1684     RET
1685 %else
1686 cglobal coeff_last64, 1,3
1687     pxor m2, m2
1688     LAST_MASK 16, r1d, r0+SIZEOF_DCTCOEF* 0
1689     LAST_MASK 16, r2d, r0+SIZEOF_DCTCOEF*16
1690     shl r2d, 16
1691     or  r1d, r2d
1692     LAST_MASK 16, r2d, r0+SIZEOF_DCTCOEF*32
1693     LAST_MASK 16, r0d, r0+SIZEOF_DCTCOEF*48
1694     shl r0d, 16
1695     or  r2d, r0d
1696     shl  r2, 32
1697     or   r1, r2
1698     not  r1
1699     BSR rax, r1, 0x3f
1700     RET
1701 %endif
1702 %endmacro
1703
1704 %if ARCH_X86_64 == 0
1705 INIT_MMX mmx2
1706 COEFF_LAST
1707 %endif
1708 INIT_XMM sse2
1709 COEFF_LAST
1710 INIT_XMM sse2, lzcnt
1711 COEFF_LAST
1712
1713 %macro LAST_MASK_AVX2 2
1714 %if HIGH_BIT_DEPTH
1715     mova     m0, [%2+ 0]
1716     packssdw m0, [%2+32]
1717     mova     m1, [%2+64]
1718     packssdw m1, [%2+96]
1719     packsswb m0, m1
1720     mova     m1, [deinterleave_shufd]
1721     vpermd   m0, m1, m0
1722 %else
1723     mova     m0, [%2+ 0]
1724     packsswb m0, [%2+32]
1725     vpermq   m0, m0, q3120
1726 %endif
1727     pcmpeqb  m0, m2
1728     pmovmskb %1, m0
1729 %endmacro
1730
1731 %if ARCH_X86_64 == 0
1732 INIT_YMM avx2,lzcnt
1733 cglobal coeff_last64, 1,2
1734     pxor m2, m2
1735     LAST_MASK_AVX2 r1d, r0+SIZEOF_DCTCOEF*32
1736     xor r1d, -1
1737     jne .secondhalf
1738     LAST_MASK_AVX2 r1d, r0+SIZEOF_DCTCOEF* 0
1739     not r1d
1740     BSR eax, r1d, 0x1f
1741     RET
1742 .secondhalf:
1743     BSR eax, r1d, 0x1f
1744     add eax, 32
1745     RET
1746 %else
1747 INIT_YMM avx2,lzcnt
1748 cglobal coeff_last64, 1,3
1749     pxor m2, m2
1750     LAST_MASK_AVX2 r1d, r0+SIZEOF_DCTCOEF* 0
1751     LAST_MASK_AVX2 r2d, r0+SIZEOF_DCTCOEF*32
1752     shl  r2, 32
1753     or   r1, r2
1754     not  r1
1755     BSR rax, r1, 0x3f
1756     RET
1757 %endif
1758
1759 ;-----------------------------------------------------------------------------
1760 ; int coeff_level_run( dctcoef *dct, run_level_t *runlevel )
1761 ;-----------------------------------------------------------------------------
1762
1763 struc levelrun
1764     .last: resd 1
1765     .mask: resd 1
1766     align 16, resb 1
1767     .level: resw 16
1768 endstruc
1769
1770 ; t6 = eax for return, t3 = ecx for shift, t[01] = r[01] for x86_64 args
1771 %if WIN64
1772     DECLARE_REG_TMP 3,1,2,0,4,5,6
1773 %elif ARCH_X86_64
1774     DECLARE_REG_TMP 0,1,2,3,4,5,6
1775 %else
1776     DECLARE_REG_TMP 6,3,2,1,4,5,0
1777 %endif
1778
1779 %macro COEFF_LEVELRUN 1
1780 cglobal coeff_level_run%1,0,7
1781     movifnidn t0, r0mp
1782     movifnidn t1, r1mp
1783     pxor    m2, m2
1784     xor    t3d, t3d
1785     LAST_MASK %1, t5d, t0-(%1&1)*SIZEOF_DCTCOEF, t4d
1786 %if %1==15
1787     shr    t5d, 1
1788 %elif %1==8
1789     and    t5d, 0xff
1790 %elif %1==4
1791     and    t5d, 0xf
1792 %endif
1793     xor    t5d, (1<<%1)-1
1794     mov [t1+levelrun.mask], t5d
1795     shl    t5d, 32-%1
1796     mov    t4d, %1-1
1797     LZCOUNT t3d, t5d, 0x1f
1798     xor    t6d, t6d
1799     add    t5d, t5d
1800     sub    t4d, t3d
1801     shl    t5d, t3b
1802     mov [t1+levelrun.last], t4d
1803 .loop:
1804     LZCOUNT t3d, t5d, 0x1f
1805 %if HIGH_BIT_DEPTH
1806     mov    t2d, [t0+t4*4]
1807 %else
1808     mov    t2w, [t0+t4*2]
1809 %endif
1810     inc    t3d
1811     shl    t5d, t3b
1812 %if HIGH_BIT_DEPTH
1813     mov   [t1+t6*4+levelrun.level], t2d
1814 %else
1815     mov   [t1+t6*2+levelrun.level], t2w
1816 %endif
1817     inc    t6d
1818     sub    t4d, t3d
1819     jge .loop
1820     RET
1821 %endmacro
1822
1823 INIT_MMX mmx2
1824 %if ARCH_X86_64 == 0
1825 COEFF_LEVELRUN 15
1826 COEFF_LEVELRUN 16
1827 %endif
1828 COEFF_LEVELRUN 4
1829 COEFF_LEVELRUN 8
1830 INIT_XMM sse2
1831 %if HIGH_BIT_DEPTH
1832 COEFF_LEVELRUN 8
1833 %endif
1834 COEFF_LEVELRUN 15
1835 COEFF_LEVELRUN 16
1836 INIT_XMM sse2, lzcnt
1837 %if HIGH_BIT_DEPTH
1838 COEFF_LEVELRUN 8
1839 %endif
1840 COEFF_LEVELRUN 15
1841 COEFF_LEVELRUN 16
1842 INIT_MMX mmx2, lzcnt
1843 COEFF_LEVELRUN 4
1844 COEFF_LEVELRUN 8
1845
1846 ; Similar to the one above, but saves the DCT
1847 ; coefficients in m0/m1 so we don't have to load
1848 ; them later.
1849 %macro LAST_MASK_LUT 3
1850     pxor     xm5, xm5
1851 %if %1 <= 8
1852     mova      m0, [%3]
1853     packsswb  m2, m0, m0
1854 %else
1855     mova     xm0, [%3+ 0]
1856     mova     xm1, [%3+16]
1857     packsswb xm2, xm0, xm1
1858 %if mmsize==32
1859     vinserti128 m0, m0, xm1, 1
1860 %endif
1861 %endif
1862     pcmpeqb  xm2, xm5
1863     pmovmskb  %2, xm2
1864 %endmacro
1865
1866 %macro COEFF_LEVELRUN_LUT 1
1867 cglobal coeff_level_run%1,2,4+(%1/9)
1868 %ifdef PIC
1869     lea       r5, [$$]
1870     %define GLOBAL +r5-$$
1871 %else
1872     %define GLOBAL
1873 %endif
1874     LAST_MASK_LUT %1, eax, r0-(%1&1)*SIZEOF_DCTCOEF
1875 %if %1==15
1876     shr     eax, 1
1877 %elif %1==8
1878     and     eax, 0xff
1879 %elif %1==4
1880     and     eax, 0xf
1881 %endif
1882     xor     eax, (1<<%1)-1
1883     mov [r1+levelrun.mask], eax
1884 %if %1==15
1885     add     eax, eax
1886 %endif
1887 %if %1 > 8
1888 %if ARCH_X86_64
1889     mov     r4d, eax
1890     shr     r4d, 8
1891 %else
1892     movzx   r4d, ah ; first 8 bits
1893 %endif
1894 %endif
1895     movzx   r2d, al ; second 8 bits
1896     shl     eax, 32-%1-(%1&1)
1897     LZCOUNT eax, eax, 0x1f
1898     mov     r3d, %1-1
1899     sub     r3d, eax
1900     mov [r1+levelrun.last], r3d
1901 ; Here we abuse pshufb, combined with a lookup table, to do a gather
1902 ; operation based on a bitmask. For example:
1903 ;
1904 ; dct 15-8 (input): 0  0  4  0  0 -2  1  0
1905 ; dct  7-0 (input): 0  0 -1  0  0  0  0 15
1906 ; bitmask 1:        0  0  1  0  0  1  1  0
1907 ; bitmask 2:        0  0  1  0  0  0  0  1
1908 ; gather 15-8:      4 -2  1 __ __ __ __ __
1909 ; gather  7-0:     -1 15 __ __ __ __ __ __
1910 ; levels (output):  4 -2  1 -1 15 __ __ __ __ __ __ __ __ __ __ __
1911 ;
1912 ; The overlapping, dependent stores almost surely cause a mess of
1913 ; forwarding issues, but it's still enormously faster.
1914 %if %1 > 8
1915     movzx   eax, byte [popcnt_table+r4 GLOBAL]
1916     movzx   r3d, byte [popcnt_table+r2 GLOBAL]
1917 %if mmsize==16
1918     movh      m3, [dct_coef_shuffle+r4*8 GLOBAL]
1919     movh      m2, [dct_coef_shuffle+r2*8 GLOBAL]
1920     mova      m4, [pw_256]
1921 ; Storing 8 bytes of shuffle constant and converting it (unpack + or)
1922 ; is neutral to slightly faster in local speed measurements, but it
1923 ; cuts the table size in half, which is surely a big cache win.
1924     punpcklbw m3, m3
1925     punpcklbw m2, m2
1926     por       m3, m4
1927     por       m2, m4
1928     pshufb    m1, m3
1929     pshufb    m0, m2
1930     mova [r1+levelrun.level], m1
1931 ; This obnoxious unaligned store messes with store forwarding and
1932 ; stalls the CPU to no end, but merging the two registers before
1933 ; storing requires a variable 128-bit shift. Emulating this does
1934 ; work, but requires a lot of ops and the gain is tiny and
1935 ; inconsistent, so we'll err on the side of fewer instructions.
1936     movu [r1+rax*2+levelrun.level], m0
1937 %else ; mmsize==32
1938     movq     xm2, [dct_coef_shuffle+r4*8 GLOBAL]
1939     vinserti128 m2, m2, [dct_coef_shuffle+r2*8 GLOBAL], 1
1940     punpcklbw m2, m2
1941     por       m2, [pw_256]
1942     pshufb    m0, m2
1943     vextracti128 [r1+levelrun.level], m0, 1
1944     movu [r1+rax*2+levelrun.level], xm0
1945 %endif
1946     add     eax, r3d
1947 %else
1948     movzx   eax, byte [popcnt_table+r2 GLOBAL]
1949     movh m1, [dct_coef_shuffle+r2*8 GLOBAL]
1950     punpcklbw m1, m1
1951     por       m1, [pw_256]
1952     pshufb    m0, m1
1953     mova [r1+levelrun.level], m0
1954 %endif
1955     RET
1956 %endmacro
1957
1958 %if HIGH_BIT_DEPTH==0
1959 INIT_MMX ssse3
1960 COEFF_LEVELRUN_LUT 4
1961 INIT_XMM ssse3
1962 COEFF_LEVELRUN_LUT 8
1963 COEFF_LEVELRUN_LUT 15
1964 COEFF_LEVELRUN_LUT 16
1965 INIT_MMX ssse3, lzcnt
1966 COEFF_LEVELRUN_LUT 4
1967 INIT_XMM ssse3, lzcnt
1968 COEFF_LEVELRUN_LUT 8
1969 COEFF_LEVELRUN_LUT 15
1970 COEFF_LEVELRUN_LUT 16
1971 INIT_XMM avx2, lzcnt
1972 COEFF_LEVELRUN_LUT 15
1973 COEFF_LEVELRUN_LUT 16
1974 %endif