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