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