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