]> git.sesse.net Git - x264/blob - common/x86/quant-a.asm
A few tweaks to decimate asm
[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 ;*          Christian Heine <sennindemokrit@gmx.net>
8 ;*
9 ;* This program is free software; you can redistribute it and/or modify
10 ;* it under the terms of the GNU General Public License as published by
11 ;* the Free Software Foundation; either version 2 of the License, or
12 ;* (at your option) any later version.
13 ;*
14 ;* This program is distributed in the hope that it will be useful,
15 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 ;* GNU General Public License for more details.
18 ;*
19 ;* You should have received a copy of the GNU General Public License
20 ;* along with this program; if not, write to the Free Software
21 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
22 ;*****************************************************************************
23
24 %include "x86inc.asm"
25 %include "x86util.asm"
26
27 SECTION_RODATA
28 pb_1:     times 16 db 1
29 pw_1:     times 8 dw 1
30 pd_1:     times 4 dd 1
31
32 %macro DQM4 3
33     dw %1, %2, %1, %2, %2, %3, %2, %3
34 %endmacro
35 %macro DQM8 6
36     dw %1, %4, %5, %4, %1, %4, %5, %4
37     dw %4, %2, %6, %2, %4, %2, %6, %2
38     dw %5, %6, %3, %6, %5, %6, %3, %6
39     ; last line not used, just padding for power-of-2 stride
40     times 8 dw 0
41 %endmacro
42
43 dequant4_scale:
44     DQM4 10, 13, 16
45     DQM4 11, 14, 18
46     DQM4 13, 16, 20
47     DQM4 14, 18, 23
48     DQM4 16, 20, 25
49     DQM4 18, 23, 29
50
51 dequant8_scale:
52     DQM8 20, 18, 32, 19, 25, 24
53     DQM8 22, 19, 35, 21, 28, 26
54     DQM8 26, 23, 42, 24, 33, 31
55     DQM8 28, 25, 45, 26, 35, 33
56     DQM8 32, 28, 51, 30, 40, 38
57     DQM8 36, 32, 58, 34, 46, 43
58
59 decimate_mask_table4:
60     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
61     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
62     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
63     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
64     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
65     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
66     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
67     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
68     db 13,16,16,20,10,13,13,17,13,16,16,20,13,17,16,20,17,20,20,24
69
70 SECTION .text
71
72 %macro QUANT_DC_START 0
73     movd       m6, r1m     ; mf
74     movd       m7, r2m     ; bias
75 %ifidn m0, mm0
76     pshufw     m6, m6, 0
77     pshufw     m7, m7, 0
78 %else
79     pshuflw    m6, m6, 0
80     pshuflw    m7, m7, 0
81     punpcklqdq m6, m6
82     punpcklqdq m7, m7
83 %endif
84 %endmacro
85
86 %macro PABSW_MMX 2
87     pxor       %1, %1
88     pcmpgtw    %1, %2
89     pxor       %2, %1
90     psubw      %2, %1
91     SWAP       %1, %2
92 %endmacro
93
94 %macro PSIGNW_MMX 2
95     pxor       %1, %2
96     psubw      %1, %2
97 %endmacro
98
99 %macro PABSW_SSSE3 2
100     pabsw      %1, %2
101 %endmacro
102
103 %macro PSIGNW_SSSE3 2
104     psignw     %1, %2
105 %endmacro
106
107 %macro QUANT_ONE 3
108 ;;; %1      (m64)       dct[y][x]
109 ;;; %2      (m64/mmx)   mf[y][x] or mf[0][0] (as uint16_t)
110 ;;; %3      (m64/mmx)   bias[y][x] or bias[0][0] (as uint16_t)
111     mova       m1, %1   ; load dct coeffs
112     PABSW      m0, m1
113     paddusw    m0, %3   ; round
114     pmulhuw    m0, %2   ; divide
115     PSIGNW     m0, m1   ; restore sign
116     mova       %1, m0   ; store
117 %endmacro
118
119 ;-----------------------------------------------------------------------------
120 ; void x264_quant_4x4_dc_mmxext( int16_t dct[16], int mf, int bias )
121 ;-----------------------------------------------------------------------------
122 %macro QUANT_DC 2
123 cglobal %1, 1,1
124     QUANT_DC_START
125 %assign x 0
126 %rep %2
127     QUANT_ONE [r0+x], m6, m7
128 %assign x x+mmsize
129 %endrep
130     RET
131 %endmacro
132
133 ;-----------------------------------------------------------------------------
134 ; void x264_quant_4x4_mmx( int16_t dct[16], uint16_t mf[16], uint16_t bias[16] )
135 ;-----------------------------------------------------------------------------
136 %macro QUANT_AC 2
137 cglobal %1, 3,3
138 %assign x 0
139 %rep %2
140     QUANT_ONE [r0+x], [r1+x], [r2+x]
141 %assign x x+mmsize
142 %endrep
143     RET
144 %endmacro
145
146 INIT_MMX
147 %define PABSW PABSW_MMX
148 %define PSIGNW PSIGNW_MMX
149 QUANT_DC x264_quant_2x2_dc_mmxext, 1
150 %ifndef ARCH_X86_64 ; not needed because sse2 is faster
151 QUANT_DC x264_quant_4x4_dc_mmxext, 4
152 QUANT_AC x264_quant_4x4_mmx, 4
153 QUANT_AC x264_quant_8x8_mmx, 16
154 %endif
155
156 INIT_XMM
157 QUANT_DC x264_quant_4x4_dc_sse2, 2
158 QUANT_AC x264_quant_4x4_sse2, 2
159 QUANT_AC x264_quant_8x8_sse2, 8
160
161 %define PABSW PABSW_SSSE3
162 %define PSIGNW PSIGNW_SSSE3
163 QUANT_DC x264_quant_4x4_dc_ssse3, 2
164 QUANT_AC x264_quant_4x4_ssse3, 2
165 QUANT_AC x264_quant_8x8_ssse3, 8
166
167 INIT_MMX
168 QUANT_DC x264_quant_2x2_dc_ssse3, 1
169
170
171
172 ;=============================================================================
173 ; dequant
174 ;=============================================================================
175
176 %macro DEQUANT16_L 3
177 ;;; %1      dct[y][x]
178 ;;; %2,%3   dequant_mf[i_mf][y][x]
179 ;;; m5      i_qbits
180
181     mova     m0, %2
182     packssdw m0, %3
183     pmullw   m0, %1
184     psllw    m0, m5
185     mova     %1, m0
186 %endmacro
187
188 %macro DEQUANT32_R 3
189 ;;; %1      dct[y][x]
190 ;;; %2,%3   dequant_mf[i_mf][y][x]
191 ;;; m5      -i_qbits
192 ;;; m6      f
193 ;;; m7      0
194
195     mova      m0, %1
196     mova      m1, m0
197     punpcklwd m0, m7
198     punpckhwd m1, m7
199     pmaddwd   m0, %2
200     pmaddwd   m1, %3
201     paddd     m0, m6
202     paddd     m1, m6
203     psrad     m0, m5
204     psrad     m1, m5
205     packssdw  m0, m1
206     mova      %1, m0
207 %endmacro
208
209 %macro DEQUANT_LOOP 3
210 %if 8*(%2-2*%3)
211     mov t0d, 8*(%2-2*%3)
212 %%loop:
213     %1 [r0+t0+8*%3], [r1+t0*2+16*%3], [r1+t0*2+24*%3]
214     %1 [r0+t0     ], [r1+t0*2      ], [r1+t0*2+ 8*%3]
215     sub t0d, 16*%3
216     jge %%loop
217     rep ret
218 %else
219     %1 [r0+8*%3], [r1+16*%3], [r1+24*%3]
220     %1 [r0     ], [r1      ], [r1+ 8*%3]
221     ret
222 %endif
223 %endmacro
224
225 %macro DEQUANT16_FLAT 2-8
226     mova   m0, %1
227 %assign i %0-2
228 %rep %0-1
229 %if i
230     mova   m %+ i, [r0+%2]
231     pmullw m %+ i, m0
232 %else
233     pmullw m0, [r0+%2]
234 %endif
235     psllw  m %+ i, m7
236     mova   [r0+%2], m %+ i
237     %assign i i-1
238     %rotate 1
239 %endrep
240 %endmacro
241
242 %ifdef ARCH_X86_64
243     %define t0  r4
244     %define t0d r4d
245     %define t1  r3
246     %define t1d r3d
247     %define t2  r2
248     %define t2d r2d
249 %else
250     %define t0  r2
251     %define t0d r2d
252     %define t1  r0
253     %define t1d r0d
254     %define t2  r1
255     %define t2d r1d
256 %endif
257
258 ;-----------------------------------------------------------------------------
259 ; void x264_dequant_4x4_mmx( int16_t dct[4][4], int dequant_mf[6][4][4], int i_qp )
260 ;-----------------------------------------------------------------------------
261 %macro DEQUANT 4
262 cglobal x264_dequant_%2x%2_%1, 0,3
263     movifnidn t2d, r2m
264     imul t0d, t2d, 0x2b
265     shr  t0d, 8     ; i_qbits = i_qp / 6
266     lea  t1, [t0*3]
267     sub  t2d, t1d
268     sub  t2d, t1d   ; i_mf = i_qp % 6
269     shl  t2d, %3+2
270 %ifdef ARCH_X86_64
271     add  r1, t2     ; dequant_mf[i_mf]
272 %else
273     add  r1, r1m    ; dequant_mf[i_mf]
274     mov  r0, r0m    ; dct
275 %endif
276     sub  t0d, %3
277     jl   .rshift32  ; negative qbits => rightshift
278
279 .lshift:
280     movd m5, t0d
281     DEQUANT_LOOP DEQUANT16_L, %2*%2/4, %4
282
283 .rshift32:
284     neg   t0d
285     movd  m5, t0d
286     mova  m6, [pd_1 GLOBAL]
287     pxor  m7, m7
288     pslld m6, m5
289     psrld m6, 1
290     DEQUANT_LOOP DEQUANT32_R, %2*%2/4, %4
291
292 cglobal x264_dequant_%2x%2_flat16_%1, 0,3
293     movifnidn t2d, r2m
294 %if %2 == 8
295     cmp  t2d, 12
296     jl x264_dequant_%2x%2_%1
297     sub  t2d, 12
298 %endif
299     imul t0d, t2d, 0x2b
300     shr  t0d, 8     ; i_qbits = i_qp / 6
301     lea  t1, [t0*3]
302     sub  t2d, t1d
303     sub  t2d, t1d   ; i_mf = i_qp % 6
304     shl  t2d, %3
305 %ifdef PIC
306     lea  r1, [dequant%2_scale GLOBAL]
307     add  r1, t2
308 %else
309     lea  r1, [dequant%2_scale + t2 GLOBAL]
310 %endif
311     movifnidn r0d, r0m
312     movd m7, t0d
313 %if %2 == 4
314 %ifidn %1, mmx
315     DEQUANT16_FLAT [r1], 0, 16
316     DEQUANT16_FLAT [r1+8], 8, 24
317 %else
318     DEQUANT16_FLAT [r1], 0, 16
319 %endif
320 %elifidn %1, mmx
321     DEQUANT16_FLAT [r1], 0, 8, 64, 72
322     DEQUANT16_FLAT [r1+16], 16, 24, 48, 56
323     DEQUANT16_FLAT [r1+16], 80, 88, 112, 120
324     DEQUANT16_FLAT [r1+32], 32, 40, 96, 104
325 %else
326     DEQUANT16_FLAT [r1], 0, 64
327     DEQUANT16_FLAT [r1+16], 16, 48, 80, 112
328     DEQUANT16_FLAT [r1+32], 32, 96
329 %endif
330     ret
331 %endmacro ; DEQUANT
332
333 %ifndef ARCH_X86_64
334 INIT_MMX
335 DEQUANT mmx, 4, 4, 1
336 DEQUANT mmx, 8, 6, 1
337 %endif
338 INIT_XMM
339 DEQUANT sse2, 4, 4, 2
340 DEQUANT sse2, 8, 6, 2
341
342
343
344 ;-----------------------------------------------------------------------------
345 ; void x264_denoise_dct_mmx( int16_t *dct, uint32_t *sum, uint16_t *offset, int size )
346 ;-----------------------------------------------------------------------------
347 %macro DENOISE_DCT 1
348 cglobal x264_denoise_dct_%1, 4,5
349     movzx     r4d, word [r0] ; backup DC coefficient
350     pxor      m7, m7
351 .loop:
352     sub       r3, mmsize
353     mova      m2, [r0+r3*2+0*mmsize]
354     mova      m3, [r0+r3*2+1*mmsize]
355     PABSW     m0, m2
356     PABSW     m1, m3
357     mova      m4, m0
358     mova      m5, m1
359     psubusw   m0, [r2+r3*2+0*mmsize]
360     psubusw   m1, [r2+r3*2+1*mmsize]
361     PSIGNW    m0, m2
362     PSIGNW    m1, m3
363     mova      [r0+r3*2+0*mmsize], m0
364     mova      [r0+r3*2+1*mmsize], m1
365     mova      m2, m4
366     mova      m3, m5
367     punpcklwd m4, m7
368     punpckhwd m2, m7
369     punpcklwd m5, m7
370     punpckhwd m3, m7
371     paddd     m4, [r1+r3*4+0*mmsize]
372     paddd     m2, [r1+r3*4+1*mmsize]
373     paddd     m5, [r1+r3*4+2*mmsize]
374     paddd     m3, [r1+r3*4+3*mmsize]
375     mova      [r1+r3*4+0*mmsize], m4
376     mova      [r1+r3*4+1*mmsize], m2
377     mova      [r1+r3*4+2*mmsize], m5
378     mova      [r1+r3*4+3*mmsize], m3
379     jg .loop
380     mov       [r0], r4w ; restore DC coefficient
381     RET
382 %endmacro
383
384 %define PABSW PABSW_MMX
385 %define PSIGNW PSIGNW_MMX
386 %ifndef ARCH_X86_64
387 INIT_MMX
388 DENOISE_DCT mmx
389 %endif
390 INIT_XMM
391 DENOISE_DCT sse2
392 %define PABSW PABSW_SSSE3
393 %define PSIGNW PSIGNW_SSSE3
394 DENOISE_DCT ssse3
395
396
397
398 ;-----------------------------------------------------------------------------
399 ; int x264_decimate_score( int16_t *dct )
400 ;-----------------------------------------------------------------------------
401
402 %macro DECIMATE_MASK_SSE2 6
403 %ifidn %5, ssse3
404     pabsw    xmm0, [%3+ 0]
405     pabsw    xmm1, [%3+16]
406 %else
407     movdqa   xmm0, [%3+ 0]
408     movdqa   xmm1, [%3+16]
409     ABS2_MMX xmm0, xmm1, xmm3, xmm4
410 %endif
411     packsswb xmm0, xmm1
412     pxor     xmm2, xmm2
413     pcmpeqb  xmm2, xmm0
414     pcmpgtb  xmm0, %4
415     pmovmskb %1, xmm2
416     pmovmskb %2, xmm0
417 %endmacro
418
419 %macro DECIMATE_MASK_MMX 6
420     movq      mm0, [%3+ 0]
421     movq      mm1, [%3+ 8]
422     movq      mm2, [%3+16]
423     movq      mm3, [%3+24]
424     ABS2_MMX  mm0, mm1, mm4, mm5
425     ABS2_MMX  mm2, mm3, mm4, mm5
426     packsswb  mm0, mm1
427     packsswb  mm2, mm3
428     pxor      mm4, mm4
429     pxor      mm5, mm5
430     pcmpeqb   mm4, mm0
431     pcmpeqb   mm5, mm2
432     pcmpgtb   mm0, %4
433     pcmpgtb   mm2, %4
434     pmovmskb   %6, mm4
435     pmovmskb   %1, mm5
436     shl        %1, 8
437     or         %1, %6
438     pmovmskb   %6, mm0
439     pmovmskb   %2, mm2
440     shl        %2, 8
441     or         %2, %6
442 %endmacro
443
444 cextern x264_decimate_table4
445 cextern x264_decimate_table8
446
447 %macro DECIMATE4x4 2
448
449 ;A LUT is faster than bsf on AMD processors, and no slower on Intel
450 ;This is not true for score64.
451 cglobal x264_decimate_score%1_%2, 1,3
452 %ifdef PIC
453     lea r10, [x264_decimate_table4 GLOBAL]
454     lea r11, [decimate_mask_table4 GLOBAL]
455     %define table r10
456     %define mask_table r11
457 %else
458     %define table x264_decimate_table4
459     %define mask_table decimate_mask_table4
460 %endif
461     DECIMATE_MASK edx, eax, r0, [pb_1 GLOBAL], %2, ecx
462     xor   edx, 0xffff
463     je   .ret
464     test  eax, eax
465     jne  .ret9
466 %if %1==15
467     shr   edx, 1
468 %endif
469     movzx ecx, dl
470     movzx eax, byte [mask_table + rcx]
471     cmp   edx, ecx
472     je   .ret
473     bsr   ecx, ecx
474     shr   edx, 1
475     shr   edx, cl
476     bsf   ecx, edx
477     shr   edx, 1
478     shr   edx, cl
479     add    al, byte [table + rcx]
480     add    al, byte [mask_table + rdx]
481 .ret:
482     REP_RET
483 .ret9:
484     mov   eax, 9
485     RET
486
487 %endmacro
488
489 %ifndef ARCH_X86_64
490 %define DECIMATE_MASK DECIMATE_MASK_MMX
491 DECIMATE4x4 15, mmxext
492 DECIMATE4x4 16, mmxext
493 %endif
494 %define DECIMATE_MASK DECIMATE_MASK_SSE2
495 DECIMATE4x4 15, sse2
496 DECIMATE4x4 15, ssse3
497 DECIMATE4x4 16, sse2
498 DECIMATE4x4 16, ssse3
499
500 %macro DECIMATE8x8 1
501
502 %ifdef ARCH_X86_64
503 cglobal x264_decimate_score64_%1, 1,4
504 %ifdef PIC
505     lea r10, [x264_decimate_table8 GLOBAL]
506     %define table r10
507 %else
508     %define table x264_decimate_table8
509 %endif
510     mova  m7, [pb_1 GLOBAL]
511     DECIMATE_MASK r1d, eax, r0, m7, %1, null
512     test  eax, eax
513     jne  .ret9
514     DECIMATE_MASK r2d, eax, r0+32, m7, %1, null
515     shl   r2d, 16
516     or    r1d, r2d
517     DECIMATE_MASK r2d, r3d, r0+64, m7, %1, null
518     shl   r2, 32
519     or    eax, r3d
520     or    r1, r2
521     DECIMATE_MASK r2d, r3d, r0+96, m7, %1, null
522     shl   r2, 48
523     or    r1, r2
524     xor   r1, -1
525     je   .ret
526     or    eax, r3d
527     jne  .ret9
528 .loop:
529     bsf   rcx, r1
530     shr   r1, cl
531     add   al, byte [table + rcx]
532     shr   r1, 1
533     jne  .loop
534 .ret:
535     REP_RET
536 .ret9:
537     mov   eax, 9
538     RET
539
540 %else ; ARCH
541 %ifidn %1, mmxext
542 cglobal x264_decimate_score64_%1, 1,6
543 %else
544 cglobal x264_decimate_score64_%1, 1,5
545 %endif
546     mova  m7, [pb_1 GLOBAL]
547     DECIMATE_MASK r3, r2, r0, m7, %1, r5
548     test  r2, r2
549     jne  .ret9
550     DECIMATE_MASK r4, r2, r0+32, m7, %1, r5
551     shl   r4, 16
552     or    r3, r4
553     DECIMATE_MASK r4, r1, r0+64, m7, %1, r5
554     or    r2, r1
555     DECIMATE_MASK r1, r0, r0+96, m7, %1, r5
556     shl   r1, 16
557     or    r4, r1
558     xor   r3, -1
559     je   .tryret
560     xor   r4, -1
561 .cont
562     or    r0, r2
563     jne  .ret9      ;r0 is zero at this point, so we don't need to zero it
564 .loop:
565     bsf   ecx, r3
566     test  r3, r3
567     je   .largerun
568     shrd  r3, r4, cl
569     shr   r4, cl
570     add   r0b, byte [x264_decimate_table8 + ecx]
571     shrd  r3, r4, 1
572     shr   r4, 1
573     cmp   r0, 6     ;score64's threshold is never higher than 6
574     jge  .ret9      ;this early termination is only useful on 32-bit because it can be done in the latency after shrd
575     test  r3, r3
576     jne  .loop
577     test  r4, r4
578     jne  .loop
579 .ret:
580     REP_RET
581 .tryret:
582     xor   r4, -1
583     jne  .cont
584     REP_RET
585 .ret9:
586     mov   eax, 9
587     RET
588 .largerun:
589     mov   r3, r4
590     xor   r4, r4
591     bsf   ecx, r3
592     shr   r3, cl
593     shr   r3, 1
594     jne  .loop
595     REP_RET
596 %endif ; ARCH
597
598 %endmacro
599
600 %ifndef ARCH_X86_64
601 INIT_MMX
602 %define DECIMATE_MASK DECIMATE_MASK_MMX
603 DECIMATE8x8 mmxext
604 %endif
605 INIT_XMM
606 %define DECIMATE_MASK DECIMATE_MASK_SSE2
607 DECIMATE8x8 sse2
608 DECIMATE8x8 ssse3
609