]> git.sesse.net Git - x264/blob - common/x86/quant-a.asm
Remove unnecessary PIC support macros
[x264] / common / x86 / quant-a.asm
1 ;*****************************************************************************
2 ;* quant-a.asm: h264 encoder library
3 ;*****************************************************************************
4 ;* Copyright (C) 2005-2008 x264 project
5 ;*
6 ;* Authors: Loren Merritt <lorenm@u.washington.edu>
7 ;*          Fiona Glaser <fiona@x264.com>
8 ;*          Christian Heine <sennindemokrit@gmx.net>
9 ;*
10 ;* This program is free software; you can redistribute it and/or modify
11 ;* it under the terms of the GNU General Public License as published by
12 ;* the Free Software Foundation; either version 2 of the License, or
13 ;* (at your option) any later version.
14 ;*
15 ;* This program is distributed in the hope that it will be useful,
16 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ;* GNU General Public License for more details.
19 ;*
20 ;* You should have received a copy of the GNU General Public License
21 ;* along with this program; if not, write to the Free Software
22 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
23 ;*****************************************************************************
24
25 %include "x86inc.asm"
26 %include "x86util.asm"
27
28 SECTION_RODATA
29 pb_1:     times 16 db 1
30 pw_1:     times 8 dw 1
31 pd_1:     times 4 dd 1
32 pb_01:    times 8 db 0, 1
33
34 %macro DQM4 3
35     dw %1, %2, %1, %2, %2, %3, %2, %3
36 %endmacro
37 %macro DQM8 6
38     dw %1, %4, %5, %4, %1, %4, %5, %4
39     dw %4, %2, %6, %2, %4, %2, %6, %2
40     dw %5, %6, %3, %6, %5, %6, %3, %6
41     ; last line not used, just padding for power-of-2 stride
42     times 8 dw 0
43 %endmacro
44
45 dequant4_scale:
46     DQM4 10, 13, 16
47     DQM4 11, 14, 18
48     DQM4 13, 16, 20
49     DQM4 14, 18, 23
50     DQM4 16, 20, 25
51     DQM4 18, 23, 29
52
53 dequant8_scale:
54     DQM8 20, 18, 32, 19, 25, 24
55     DQM8 22, 19, 35, 21, 28, 26
56     DQM8 26, 23, 42, 24, 33, 31
57     DQM8 28, 25, 45, 26, 35, 33
58     DQM8 32, 28, 51, 30, 40, 38
59     DQM8 36, 32, 58, 34, 46, 43
60
61 decimate_mask_table4:
62     db  0,3,2,6,2,5,5,9,1,5,4,8,5,8,8,12,1,4,4,8,4,7,7,11,4,8,7,11,8,11,11,15,1,4
63     db  3,7,4,7,7,11,3,7,6,10,7,10,10,14,4,7,7,11,7,10,10,14,7,11,10,14,11,14,14
64     db 18,0,4,3,7,3,6,6,10,3,7,6,10,7,10,10,14,3,6,6,10,6,9,9,13,6,10,9,13,10,13
65     db 13,17,4,7,6,10,7,10,10,14,6,10,9,13,10,13,13,17,7,10,10,14,10,13,13,17,10
66     db 14,13,17,14,17,17,21,0,3,3,7,3,6,6,10,2,6,5,9,6,9,9,13,3,6,6,10,6,9,9,13
67     db  6,10,9,13,10,13,13,17,3,6,5,9,6,9,9,13,5,9,8,12,9,12,12,16,6,9,9,13,9,12
68     db 12,16,9,13,12,16,13,16,16,20,3,7,6,10,6,9,9,13,6,10,9,13,10,13,13,17,6,9
69     db  9,13,9,12,12,16,9,13,12,16,13,16,16,20,7,10,9,13,10,13,13,17,9,13,12,16
70     db 13,16,16,20,10,13,13,17,13,16,16,20,13,17,16,20,17,20,20,24
71
72 SECTION .text
73
74 %macro QUANT_DC_START_MMX 0
75     movd       m6, r1m     ; mf
76     movd       m7, r2m     ; bias
77 %ifidn m0, mm0
78     pshufw     m6, m6, 0
79     pshufw     m7, m7, 0
80 %else
81     pshuflw    m6, m6, 0
82     pshuflw    m7, m7, 0
83     punpcklqdq m6, m6
84     punpcklqdq m7, m7
85 %endif
86 %endmacro
87
88 %macro QUANT_DC_START_SSSE3 0
89     movdqa     m5, [pb_01]
90     movd       m6, r1m     ; mf
91     movd       m7, r2m     ; bias
92     pshufb     m6, m5
93     pshufb     m7, m5
94 %endmacro
95
96 %macro PABSW_MMX 2
97     pxor       %1, %1
98     pcmpgtw    %1, %2
99     pxor       %2, %1
100     psubw      %2, %1
101     SWAP       %1, %2
102 %endmacro
103
104 %macro PSIGNW_MMX 2
105     pxor       %1, %2
106     psubw      %1, %2
107 %endmacro
108
109 %macro PABSW_SSSE3 2
110     pabsw      %1, %2
111 %endmacro
112
113 %macro PSIGNW_SSSE3 2
114     psignw     %1, %2
115 %endmacro
116
117 %macro QUANT_ONE 4
118 ;;; %1      (m64)       dct[y][x]
119 ;;; %2      (m64/mmx)   mf[y][x] or mf[0][0] (as uint16_t)
120 ;;; %3      (m64/mmx)   bias[y][x] or bias[0][0] (as uint16_t)
121     mova       m1, %1   ; load dct coeffs
122     PABSW      m0, m1
123     paddusw    m0, %3   ; round
124     pmulhuw    m0, %2   ; divide
125     PSIGNW     m0, m1   ; restore sign
126     mova       %1, m0   ; store
127 %if %4
128     por        m5, m0
129 %else
130     SWAP       m5, m0
131 %endif
132 %endmacro
133
134 %macro QUANT_TWO 7
135     mova       m1, %1
136     mova       m3, %2
137     PABSW      m0, m1
138     PABSW      m2, m3
139     paddusw    m0, %5
140     paddusw    m2, %6
141     pmulhuw    m0, %3
142     pmulhuw    m2, %4
143     PSIGNW     m0, m1
144     PSIGNW     m2, m3
145     mova       %1, m0
146     mova       %2, m2
147 %if %7
148     por        m5, m0
149     por        m5, m2
150 %else
151     SWAP       m5, m0
152     por        m5, m2
153 %endif
154 %endmacro
155
156 %macro QUANT_END_MMX 0
157     xor      eax, eax
158 %ifndef ARCH_X86_64
159 %if mmsize==8
160     packsswb  m5, m5
161     movd     ecx, m5
162     test     ecx, ecx
163 %else
164     pxor      m4, m4
165     pcmpeqb   m5, m4
166     pmovmskb ecx, m5
167     cmp      ecx, (1<<mmsize)-1
168 %endif
169 %else
170 %if mmsize==16
171     packsswb  m5, m5
172 %endif
173     movq     rcx, m5
174     test     rcx, rcx
175 %endif
176     setne     al
177 %endmacro
178
179 %macro QUANT_END_SSE4 0
180     xor      eax, eax
181     ptest     m5, m5
182     setne     al
183 %endmacro
184
185 ;-----------------------------------------------------------------------------
186 ; void x264_quant_4x4_dc_mmxext( int16_t dct[16], int mf, int bias )
187 ;-----------------------------------------------------------------------------
188 %macro QUANT_DC 2-3 0
189 cglobal %1, 1,1,%3
190     QUANT_DC_START
191 %if %2==1
192     QUANT_ONE [r0], m6, m7, 0
193 %else
194 %assign x 0
195 %rep %2/2
196     QUANT_TWO [r0+x], [r0+x+mmsize], m6, m6, m7, m7, x
197 %assign x x+mmsize*2
198 %endrep
199 %endif
200     QUANT_END
201     RET
202 %endmacro
203
204 ;-----------------------------------------------------------------------------
205 ; int x264_quant_4x4_mmx( int16_t dct[16], uint16_t mf[16], uint16_t bias[16] )
206 ;-----------------------------------------------------------------------------
207 %macro QUANT_AC 2
208 cglobal %1, 3,3
209 %assign x 0
210 %rep %2/2
211     QUANT_TWO [r0+x], [r0+x+mmsize], [r1+x], [r1+x+mmsize], [r2+x], [r2+x+mmsize], x
212 %assign x x+mmsize*2
213 %endrep
214     QUANT_END
215     RET
216 %endmacro
217
218 INIT_MMX
219 %define QUANT_END QUANT_END_MMX
220 %define PABSW PABSW_MMX
221 %define PSIGNW PSIGNW_MMX
222 %define QUANT_DC_START QUANT_DC_START_MMX
223 QUANT_DC x264_quant_2x2_dc_mmxext, 1
224 %ifndef ARCH_X86_64 ; not needed because sse2 is faster
225 QUANT_DC x264_quant_4x4_dc_mmxext, 4
226 QUANT_AC x264_quant_4x4_mmx, 4
227 QUANT_AC x264_quant_8x8_mmx, 16
228 %endif
229
230 INIT_XMM
231 QUANT_DC x264_quant_4x4_dc_sse2, 2, 8
232 QUANT_AC x264_quant_4x4_sse2, 2
233 QUANT_AC x264_quant_8x8_sse2, 8
234
235 %define PABSW PABSW_SSSE3
236 %define PSIGNW PSIGNW_SSSE3
237 QUANT_DC x264_quant_4x4_dc_ssse3, 2, 8
238 QUANT_AC x264_quant_4x4_ssse3, 2
239 QUANT_AC x264_quant_8x8_ssse3, 8
240
241 INIT_MMX
242 QUANT_DC x264_quant_2x2_dc_ssse3, 1
243 %define QUANT_END QUANT_END_SSE4
244 ;Not faster on Conroe, so only used in SSE4 versions
245 %define QUANT_DC_START QUANT_DC_START_SSSE3
246 INIT_XMM
247 QUANT_DC x264_quant_4x4_dc_sse4, 2, 8
248 QUANT_AC x264_quant_4x4_sse4, 2
249 QUANT_AC x264_quant_8x8_sse4, 8
250
251
252
253 ;=============================================================================
254 ; dequant
255 ;=============================================================================
256
257 %macro DEQUANT16_L 3
258 ;;; %1      dct[y][x]
259 ;;; %2,%3   dequant_mf[i_mf][y][x]
260 ;;; m2      i_qbits
261
262     mova     m0, %2
263     packssdw m0, %3
264     pmullw   m0, %1
265     psllw    m0, m2
266     mova     %1, m0
267 %endmacro
268
269 %macro DEQUANT32_R 3
270 ;;; %1      dct[y][x]
271 ;;; %2,%3   dequant_mf[i_mf][y][x]
272 ;;; m2      -i_qbits
273 ;;; m3      f
274 ;;; m4      0
275
276     mova      m0, %1
277     mova      m1, m0
278     punpcklwd m0, m4
279     punpckhwd m1, m4
280     pmaddwd   m0, %2
281     pmaddwd   m1, %3
282     paddd     m0, m3
283     paddd     m1, m3
284     psrad     m0, m2
285     psrad     m1, m2
286     packssdw  m0, m1
287     mova      %1, m0
288 %endmacro
289
290 %macro DEQUANT_LOOP 3
291 %if 8*(%2-2*%3)
292     mov t0d, 8*(%2-2*%3)
293 %%loop:
294     %1 [r0+t0+8*%3], [r1+t0*2+16*%3], [r1+t0*2+24*%3]
295     %1 [r0+t0     ], [r1+t0*2      ], [r1+t0*2+ 8*%3]
296     sub t0d, 16*%3
297     jge %%loop
298     REP_RET
299 %else
300     %1 [r0+8*%3], [r1+16*%3], [r1+24*%3]
301     %1 [r0     ], [r1      ], [r1+ 8*%3]
302     RET
303 %endif
304 %endmacro
305
306 %macro DEQUANT16_FLAT 2-5
307     mova   m0, %1
308     psllw  m0, m4
309 %assign i %0-2
310 %rep %0-1
311 %if i
312     mova   m %+ i, [r0+%2]
313     pmullw m %+ i, m0
314 %else
315     pmullw m0, [r0+%2]
316 %endif
317     mova   [r0+%2], m %+ i
318     %assign i i-1
319     %rotate 1
320 %endrep
321 %endmacro
322
323 %ifdef WIN64
324     DECLARE_REG_TMP 6,3,2
325 %elifdef ARCH_X86_64
326     DECLARE_REG_TMP 4,3,2
327 %else
328     DECLARE_REG_TMP 2,0,1
329 %endif
330
331 %macro DEQUANT_START 2
332     movifnidn t2d, r2m
333     imul t0d, t2d, 0x2b
334     shr  t0d, 8     ; i_qbits = i_qp / 6
335     lea  t1, [t0*3]
336     sub  t2d, t1d
337     sub  t2d, t1d   ; i_mf = i_qp % 6
338     shl  t2d, %1
339 %ifdef ARCH_X86_64
340     add  r1, t2     ; dequant_mf[i_mf]
341 %else
342     add  r1, r1mp   ; dequant_mf[i_mf]
343     mov  r0, r0mp   ; dct
344 %endif
345     sub  t0d, %2
346     jl   .rshift32  ; negative qbits => rightshift
347 %endmacro
348
349 ;-----------------------------------------------------------------------------
350 ; void x264_dequant_4x4_mmx( int16_t dct[4][4], int dequant_mf[6][4][4], int i_qp )
351 ;-----------------------------------------------------------------------------
352 %macro DEQUANT 4
353 cglobal x264_dequant_%2x%2_%1, 0,3
354 .skip_prologue:
355     DEQUANT_START %3+2, %3
356
357 .lshift:
358     movd m2, t0d
359     DEQUANT_LOOP DEQUANT16_L, %2*%2/4, %4
360
361 .rshift32:
362     neg   t0d
363     movd  m2, t0d
364     mova  m3, [pd_1]
365     pxor  m4, m4
366     pslld m3, m2
367     psrld m3, 1
368     DEQUANT_LOOP DEQUANT32_R, %2*%2/4, %4
369
370 cglobal x264_dequant_%2x%2_flat16_%1, 0,3
371     movifnidn t2d, r2m
372 %if %2 == 8
373     cmp  t2d, 12
374     jl x264_dequant_%2x%2_%1.skip_prologue
375     sub  t2d, 12
376 %endif
377     imul t0d, t2d, 0x2b
378     shr  t0d, 8     ; i_qbits = i_qp / 6
379     lea  t1, [t0*3]
380     sub  t2d, t1d
381     sub  t2d, t1d   ; i_mf = i_qp % 6
382     shl  t2d, %3
383 %ifdef PIC
384     lea  r1, [dequant%2_scale]
385     add  r1, t2
386 %else
387     lea  r1, [dequant%2_scale + t2]
388 %endif
389     movifnidn r0, r0mp
390     movd m4, t0d
391 %if %2 == 4
392 %ifidn %1, mmx
393     DEQUANT16_FLAT [r1], 0, 16
394     DEQUANT16_FLAT [r1+8], 8, 24
395 %else
396     DEQUANT16_FLAT [r1], 0, 16
397 %endif
398 %elifidn %1, mmx
399     DEQUANT16_FLAT [r1], 0, 8, 64, 72
400     DEQUANT16_FLAT [r1+16], 16, 24, 48, 56
401     DEQUANT16_FLAT [r1+16], 80, 88, 112, 120
402     DEQUANT16_FLAT [r1+32], 32, 40, 96, 104
403 %else
404     DEQUANT16_FLAT [r1], 0, 64
405     DEQUANT16_FLAT [r1+16], 16, 48, 80, 112
406     DEQUANT16_FLAT [r1+32], 32, 96
407 %endif
408     RET
409 %endmacro ; DEQUANT
410
411 %ifndef ARCH_X86_64
412 INIT_MMX
413 DEQUANT mmx, 4, 4, 1
414 DEQUANT mmx, 8, 6, 1
415 %endif
416 INIT_XMM
417 DEQUANT sse2, 4, 4, 2
418 DEQUANT sse2, 8, 6, 2
419
420 %macro DEQUANT_DC 1
421 cglobal x264_dequant_4x4dc_%1, 0,3
422     DEQUANT_START 6, 6
423
424 .lshift:
425     movd   m3, [r1]
426     movd   m2, t0d
427     pslld  m3, m2
428 %if mmsize==16
429     pshuflw  m3, m3, 0
430     punpcklqdq m3, m3
431 %else
432     pshufw   m3, m3, 0
433 %endif
434 %assign x 0
435 %rep 16/mmsize
436     mova     m0, [r0+mmsize*0+x]
437     mova     m1, [r0+mmsize*1+x]
438     pmullw   m0, m3
439     pmullw   m1, m3
440     mova     [r0+mmsize*0+x], m0
441     mova     [r0+mmsize*1+x], m1
442 %assign x x+mmsize*2
443 %endrep
444     RET
445
446 .rshift32:
447     neg   t0d
448     movd  m3, t0d
449     mova  m4, [pw_1]
450     mova  m5, m4
451     pslld m4, m3
452     psrld m4, 1
453     movd  m2, [r1]
454 %if mmsize==8
455     punpcklwd m2, m2
456 %else
457     pshuflw m2, m2, 0
458 %endif
459     punpcklwd m2, m4
460 %assign x 0
461 %rep 32/mmsize
462     mova      m0, [r0+x]
463     mova      m1, m0
464     punpcklwd m0, m5
465     punpckhwd m1, m5
466     pmaddwd   m0, m2
467     pmaddwd   m1, m2
468     psrad     m0, m3
469     psrad     m1, m3
470     packssdw  m0, m1
471     mova      [r0+x], m0
472 %assign x x+mmsize
473 %endrep
474     RET
475 %endmacro
476
477 INIT_MMX
478 DEQUANT_DC mmxext
479 INIT_XMM
480 DEQUANT_DC sse2
481
482 ;-----------------------------------------------------------------------------
483 ; void x264_denoise_dct_mmx( int16_t *dct, uint32_t *sum, uint16_t *offset, int size )
484 ;-----------------------------------------------------------------------------
485 %macro DENOISE_DCT 1-2 0
486 cglobal x264_denoise_dct_%1, 4,5,%2
487     movzx     r4d, word [r0] ; backup DC coefficient
488     pxor      m6, m6
489 .loop:
490     sub       r3, mmsize
491     mova      m2, [r0+r3*2+0*mmsize]
492     mova      m3, [r0+r3*2+1*mmsize]
493     PABSW     m0, m2
494     PABSW     m1, m3
495     mova      m4, m0
496     mova      m5, m1
497     psubusw   m0, [r2+r3*2+0*mmsize]
498     psubusw   m1, [r2+r3*2+1*mmsize]
499     PSIGNW    m0, m2
500     PSIGNW    m1, m3
501     mova      [r0+r3*2+0*mmsize], m0
502     mova      [r0+r3*2+1*mmsize], m1
503     mova      m2, m4
504     mova      m3, m5
505     punpcklwd m4, m6
506     punpckhwd m2, m6
507     punpcklwd m5, m6
508     punpckhwd m3, m6
509     paddd     m4, [r1+r3*4+0*mmsize]
510     paddd     m2, [r1+r3*4+1*mmsize]
511     paddd     m5, [r1+r3*4+2*mmsize]
512     paddd     m3, [r1+r3*4+3*mmsize]
513     mova      [r1+r3*4+0*mmsize], m4
514     mova      [r1+r3*4+1*mmsize], m2
515     mova      [r1+r3*4+2*mmsize], m5
516     mova      [r1+r3*4+3*mmsize], m3
517     jg .loop
518     mov       [r0], r4w ; restore DC coefficient
519     RET
520 %endmacro
521
522 %define PABSW PABSW_MMX
523 %define PSIGNW PSIGNW_MMX
524 %ifndef ARCH_X86_64
525 INIT_MMX
526 DENOISE_DCT mmx
527 %endif
528 INIT_XMM
529 DENOISE_DCT sse2, 7
530 %define PABSW PABSW_SSSE3
531 %define PSIGNW PSIGNW_SSSE3
532 DENOISE_DCT ssse3, 7
533
534
535
536 ;-----------------------------------------------------------------------------
537 ; int x264_decimate_score( int16_t *dct )
538 ;-----------------------------------------------------------------------------
539
540 %macro DECIMATE_MASK_SSE2 6
541 %ifidn %5, ssse3
542     pabsw    xmm0, [%3+ 0]
543     pabsw    xmm1, [%3+16]
544 %else
545     movdqa   xmm0, [%3+ 0]
546     movdqa   xmm1, [%3+16]
547     ABS2_MMX xmm0, xmm1, xmm3, xmm4
548 %endif
549     packsswb xmm0, xmm1
550     pxor     xmm2, xmm2
551     pcmpeqb  xmm2, xmm0
552     pcmpgtb  xmm0, %4
553     pmovmskb %1, xmm2
554     pmovmskb %2, xmm0
555 %endmacro
556
557 %macro DECIMATE_MASK_MMX 6
558     movq      mm0, [%3+ 0]
559     movq      mm1, [%3+ 8]
560     movq      mm2, [%3+16]
561     movq      mm3, [%3+24]
562     ABS2_MMX  mm0, mm1, mm4, mm5
563     ABS2_MMX  mm2, mm3, mm4, mm5
564     packsswb  mm0, mm1
565     packsswb  mm2, mm3
566     pxor      mm4, mm4
567     pxor      mm5, mm5
568     pcmpeqb   mm4, mm0
569     pcmpeqb   mm5, mm2
570     pcmpgtb   mm0, %4
571     pcmpgtb   mm2, %4
572     pmovmskb   %6, mm4
573     pmovmskb   %1, mm5
574     shl        %1, 8
575     or         %1, %6
576     pmovmskb   %6, mm0
577     pmovmskb   %2, mm2
578     shl        %2, 8
579     or         %2, %6
580 %endmacro
581
582 cextern x264_decimate_table4
583 cextern x264_decimate_table8
584
585 %macro DECIMATE4x4 2
586
587 ;A LUT is faster than bsf on AMD processors, and no slower on Intel
588 ;This is not true for score64.
589 cglobal x264_decimate_score%1_%2, 1,3
590 %ifdef PIC
591     lea r10, [x264_decimate_table4]
592     lea r11, [decimate_mask_table4]
593     %define table r10
594     %define mask_table r11
595 %else
596     %define table x264_decimate_table4
597     %define mask_table decimate_mask_table4
598 %endif
599     DECIMATE_MASK edx, eax, r0, [pb_1], %2, ecx
600     xor   edx, 0xffff
601     je   .ret
602     test  eax, eax
603     jne  .ret9
604 %if %1==15
605     shr   edx, 1
606 %endif
607     movzx ecx, dl
608     movzx eax, byte [mask_table + rcx]
609     cmp   edx, ecx
610     je   .ret
611     bsr   ecx, ecx
612     shr   edx, 1
613     shr   edx, cl
614     bsf   ecx, edx
615     shr   edx, 1
616     shr   edx, cl
617     add    al, byte [table + rcx]
618     add    al, byte [mask_table + rdx]
619 .ret:
620     REP_RET
621 .ret9:
622     mov   eax, 9
623     RET
624
625 %endmacro
626
627 %ifndef ARCH_X86_64
628 %define DECIMATE_MASK DECIMATE_MASK_MMX
629 DECIMATE4x4 15, mmxext
630 DECIMATE4x4 16, mmxext
631 %endif
632 %define DECIMATE_MASK DECIMATE_MASK_SSE2
633 DECIMATE4x4 15, sse2
634 DECIMATE4x4 15, ssse3
635 DECIMATE4x4 16, sse2
636 DECIMATE4x4 16, ssse3
637
638 %macro DECIMATE8x8 1
639
640 %ifdef ARCH_X86_64
641 cglobal x264_decimate_score64_%1, 1,4
642 %ifdef PIC
643     lea r10, [x264_decimate_table8]
644     %define table r10
645 %else
646     %define table x264_decimate_table8
647 %endif
648     mova  m5, [pb_1]
649     DECIMATE_MASK r1d, eax, r0, m5, %1, null
650     test  eax, eax
651     jne  .ret9
652     DECIMATE_MASK r2d, eax, r0+32, m5, %1, null
653     shl   r2d, 16
654     or    r1d, r2d
655     DECIMATE_MASK r2d, r3d, r0+64, m5, %1, null
656     shl   r2, 32
657     or    eax, r3d
658     or    r1, r2
659     DECIMATE_MASK r2d, r3d, r0+96, m5, %1, null
660     shl   r2, 48
661     or    r1, r2
662     xor   r1, -1
663     je   .ret
664     or    eax, r3d
665     jne  .ret9
666 .loop:
667     bsf   rcx, r1
668     shr   r1, cl
669     add   al, byte [table + rcx]
670     shr   r1, 1
671     jne  .loop
672 .ret:
673     REP_RET
674 .ret9:
675     mov   eax, 9
676     RET
677
678 %else ; ARCH
679 %ifidn %1, mmxext
680 cglobal x264_decimate_score64_%1, 1,6
681 %else
682 cglobal x264_decimate_score64_%1, 1,5
683 %endif
684     mova  m7, [pb_1]
685     DECIMATE_MASK r3, r2, r0, m7, %1, r5
686     test  r2, r2
687     jne  .ret9
688     DECIMATE_MASK r4, r2, r0+32, m7, %1, r5
689     shl   r4, 16
690     or    r3, r4
691     DECIMATE_MASK r4, r1, r0+64, m7, %1, r5
692     or    r2, r1
693     DECIMATE_MASK r1, r0, r0+96, m7, %1, r5
694     shl   r1, 16
695     or    r4, r1
696     xor   r3, -1
697     je   .tryret
698     xor   r4, -1
699 .cont:
700     or    r0, r2
701     jne  .ret9      ;r0 is zero at this point, so we don't need to zero it
702 .loop:
703     bsf   ecx, r3
704     test  r3, r3
705     je   .largerun
706     shrd  r3, r4, cl
707     shr   r4, cl
708     add   r0b, byte [x264_decimate_table8 + ecx]
709     shrd  r3, r4, 1
710     shr   r4, 1
711     cmp   r0, 6     ;score64's threshold is never higher than 6
712     jge  .ret9      ;this early termination is only useful on 32-bit because it can be done in the latency after shrd
713     test  r3, r3
714     jne  .loop
715     test  r4, r4
716     jne  .loop
717 .ret:
718     REP_RET
719 .tryret:
720     xor   r4, -1
721     jne  .cont
722     REP_RET
723 .ret9:
724     mov   eax, 9
725     RET
726 .largerun:
727     mov   r3, r4
728     xor   r4, r4
729     bsf   ecx, r3
730     shr   r3, cl
731     shr   r3, 1
732     jne  .loop
733     REP_RET
734 %endif ; ARCH
735
736 %endmacro
737
738 %ifndef ARCH_X86_64
739 INIT_MMX
740 %define DECIMATE_MASK DECIMATE_MASK_MMX
741 DECIMATE8x8 mmxext
742 %endif
743 INIT_XMM
744 %define DECIMATE_MASK DECIMATE_MASK_SSE2
745 DECIMATE8x8 sse2
746 DECIMATE8x8 ssse3
747
748 ;-----------------------------------------------------------------------------
749 ; int x264_coeff_last( int16_t *dct )
750 ;-----------------------------------------------------------------------------
751
752 %macro LAST_MASK_SSE2 2-3
753     movdqa   xmm0, [%2+ 0]
754     packsswb xmm0, [%2+16]
755     pcmpeqb  xmm0, xmm2
756     pmovmskb   %1, xmm0
757 %endmacro
758
759 %macro LAST_MASK_MMX 3
760     movq     mm0, [%2+ 0]
761     movq     mm1, [%2+16]
762     packsswb mm0, [%2+ 8]
763     packsswb mm1, [%2+24]
764     pcmpeqb  mm0, mm2
765     pcmpeqb  mm1, mm2
766     pmovmskb  %1, mm0
767     pmovmskb  %3, mm1
768     shl       %3, 8
769     or        %1, %3
770 %endmacro
771
772 %macro LAST_X86 3
773     bsr %1, %2
774 %endmacro
775
776 %macro LAST_SSE4A 3
777     lzcnt %1, %2
778     xor %1, %3
779 %endmacro
780
781 %macro COEFF_LAST4 1
782 %ifdef ARCH_X86_64
783 cglobal x264_coeff_last4_%1, 1,1
784     LAST rax, [r0], 0x3f
785     shr eax, 4
786     RET
787 %else
788 cglobal x264_coeff_last4_%1, 0,3
789     mov   edx, r0mp
790     mov   eax, [edx+4]
791     xor   ecx, ecx
792     test  eax, eax
793     cmovz eax, [edx]
794     setnz cl
795     LAST  eax, eax, 0x1f
796     shr   eax, 4
797     lea   eax, [eax+ecx*2]
798     RET
799 %endif
800 %endmacro
801
802 %define LAST LAST_X86
803 COEFF_LAST4 mmxext
804 %define LAST LAST_SSE4A
805 COEFF_LAST4 mmxext_lzcnt
806
807 %macro COEFF_LAST 1
808 cglobal x264_coeff_last15_%1, 1,3
809     pxor m2, m2
810     LAST_MASK r1d, r0-2, r2d
811     xor r1d, 0xffff
812     LAST eax, r1d, 0x1f
813     dec eax
814     RET
815
816 cglobal x264_coeff_last16_%1, 1,3
817     pxor m2, m2
818     LAST_MASK r1d, r0, r2d
819     xor r1d, 0xffff
820     LAST eax, r1d, 0x1f
821     RET
822
823 %ifndef ARCH_X86_64
824 cglobal x264_coeff_last64_%1, 1, 5-mmsize/16
825     pxor m2, m2
826     LAST_MASK r2d, r0+64, r4d
827     LAST_MASK r3d, r0+96, r4d
828     shl r3d, 16
829     or  r2d, r3d
830     xor r2d, -1
831     jne .secondhalf
832     LAST_MASK r1d, r0, r4d
833     LAST_MASK r3d, r0+32, r4d
834     shl r3d, 16
835     or  r1d, r3d
836     not r1d
837     LAST eax, r1d, 0x1f
838     RET
839 .secondhalf:
840     LAST eax, r2d, 0x1f
841     add eax, 32
842     RET
843 %else
844 cglobal x264_coeff_last64_%1, 1,4
845     pxor m2, m2
846     LAST_MASK_SSE2 r1d, r0
847     LAST_MASK_SSE2 r2d, r0+32
848     LAST_MASK_SSE2 r3d, r0+64
849     LAST_MASK_SSE2 r0d, r0+96
850     shl r2d, 16
851     shl r0d, 16
852     or  r1d, r2d
853     or  r3d, r0d
854     shl r3,  32
855     or  r1,  r3
856     not r1
857     LAST rax, r1, 0x3f
858     RET
859 %endif
860 %endmacro
861
862 %define LAST LAST_X86
863 %ifndef ARCH_X86_64
864 INIT_MMX
865 %define LAST_MASK LAST_MASK_MMX
866 COEFF_LAST mmxext
867 %endif
868 INIT_XMM
869 %define LAST_MASK LAST_MASK_SSE2
870 COEFF_LAST sse2
871 %define LAST LAST_SSE4A
872 COEFF_LAST sse2_lzcnt
873
874 ;-----------------------------------------------------------------------------
875 ; int x264_coeff_level_run( int16_t *dct, x264_run_level_t *runlevel )
876 ;-----------------------------------------------------------------------------
877
878 %macro LAST_MASK4_MMX 2-3
879     movq     mm0, [%2]
880     packsswb mm0, mm0
881     pcmpeqb  mm0, mm2
882     pmovmskb  %1, mm0
883 %endmacro
884
885 %macro LZCOUNT_X86 3
886     bsr %1, %2
887     xor %1, %3
888 %endmacro
889
890 %macro LZCOUNT_SSE4A 3
891     lzcnt %1, %2
892 %endmacro
893
894 ; t6 = eax for return, t3 = ecx for shift, t[01] = r[01] for x86_64 args
895 %ifdef WIN64
896     DECLARE_REG_TMP 3,1,2,0,4,5,6
897 %elifdef ARCH_X86_64
898     DECLARE_REG_TMP 0,1,2,3,4,5,6
899 %else
900     DECLARE_REG_TMP 6,3,2,1,4,5,0
901 %endif
902
903 %macro COEFF_LEVELRUN 2
904 cglobal x264_coeff_level_run%2_%1,0,7
905     movifnidn t0, r0mp
906     movifnidn t1, r1mp
907     pxor    m2, m2
908     LAST_MASK t5d, t0-(%2&1)*2, t4d
909     not    t5d
910     shl    t5d, 32-((%2+1)&~1)
911     mov    t4d, %2-1
912     LZCOUNT t3d, t5d, 0x1f
913     xor    t6d, t6d
914     add    t5d, t5d
915     sub    t4d, t3d
916     shl    t5d, t3b
917     mov   [t1], t4d
918 .loop:
919     LZCOUNT t3d, t5d, 0x1f
920     mov    t2w, [t0+t4*2]
921     mov   [t1+t6  +36], t3b
922     mov   [t1+t6*2+ 4], t2w
923     inc    t3d
924     shl    t5d, t3b
925     inc    t6d
926     sub    t4d, t3d
927     jge .loop
928     REP_RET
929 %endmacro
930
931 INIT_MMX
932 %define LZCOUNT LZCOUNT_X86
933 %ifndef ARCH_X86_64
934 %define LAST_MASK LAST_MASK_MMX
935 COEFF_LEVELRUN mmxext, 15
936 COEFF_LEVELRUN mmxext, 16
937 %endif
938 %define LAST_MASK LAST_MASK4_MMX
939 COEFF_LEVELRUN mmxext, 4
940 INIT_XMM
941 %define LAST_MASK LAST_MASK_SSE2
942 COEFF_LEVELRUN sse2, 15
943 COEFF_LEVELRUN sse2, 16
944 %define LZCOUNT LZCOUNT_SSE4A
945 COEFF_LEVELRUN sse2_lzcnt, 15
946 COEFF_LEVELRUN sse2_lzcnt, 16
947 INIT_MMX
948 %define LAST_MASK LAST_MASK4_MMX
949 COEFF_LEVELRUN mmxext_lzcnt, 4