]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/h264_idct_10bit.asm
x86: fix build without inline asm
[ffmpeg] / libavcodec / x86 / h264_idct_10bit.asm
1 ;*****************************************************************************
2 ;* MMX/SSE2/AVX-optimized 10-bit H.264 iDCT code
3 ;*****************************************************************************
4 ;* Copyright (C) 2005-2011 x264 project
5 ;*
6 ;* Authors: Daniel Kang <daniel.d.kang@gmail.com>
7 ;*
8 ;* This file is part of Libav.
9 ;*
10 ;* Libav is free software; you can redistribute it and/or
11 ;* modify it under the terms of the GNU Lesser General Public
12 ;* License as published by the Free Software Foundation; either
13 ;* version 2.1 of the License, or (at your option) any later version.
14 ;*
15 ;* Libav 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 GNU
18 ;* Lesser General Public License for more details.
19 ;*
20 ;* You should have received a copy of the GNU Lesser General Public
21 ;* License along with Libav; if not, write to the Free Software
22 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 ;******************************************************************************
24
25 %include "libavutil/x86/x86util.asm"
26
27 SECTION_RODATA
28
29 pw_pixel_max: times 8 dw ((1 << 10)-1)
30 pd_32:        times 4 dd 32
31
32 SECTION .text
33
34 ;-----------------------------------------------------------------------------
35 ; void h264_idct_add(pixel *dst, dctcoef *block, int stride)
36 ;-----------------------------------------------------------------------------
37 %macro STORE_DIFFx2 6
38     psrad       %1, 6
39     psrad       %2, 6
40     packssdw    %1, %2
41     movq        %3, [%5]
42     movhps      %3, [%5+%6]
43     paddsw      %1, %3
44     CLIPW       %1, %4, [pw_pixel_max]
45     movq      [%5], %1
46     movhps [%5+%6], %1
47 %endmacro
48
49 %macro STORE_DIFF16 5
50     psrad       %1, 6
51     psrad       %2, 6
52     packssdw    %1, %2
53     paddsw      %1, [%5]
54     CLIPW       %1, %3, %4
55     mova      [%5], %1
56 %endmacro
57
58 ;dst, in, stride
59 %macro IDCT4_ADD_10 3
60     mova  m0, [%2+ 0]
61     mova  m1, [%2+16]
62     mova  m2, [%2+32]
63     mova  m3, [%2+48]
64     IDCT4_1D d,0,1,2,3,4,5
65     TRANSPOSE4x4D 0,1,2,3,4
66     paddd m0, [pd_32]
67     IDCT4_1D d,0,1,2,3,4,5
68     pxor  m5, m5
69     STORE_DIFFx2 m0, m1, m4, m5, %1, %3
70     lea   %1, [%1+%3*2]
71     STORE_DIFFx2 m2, m3, m4, m5, %1, %3
72 %endmacro
73
74 %macro IDCT_ADD_10 0
75 cglobal h264_idct_add_10, 3,3
76     IDCT4_ADD_10 r0, r1, r2
77     RET
78 %endmacro
79
80 INIT_XMM sse2
81 IDCT_ADD_10
82 INIT_XMM avx
83 IDCT_ADD_10
84
85 ;-----------------------------------------------------------------------------
86 ; h264_idct_add16(pixel *dst, const int *block_offset, dctcoef *block, int stride, const uint8_t nnzc[6*8])
87 ;-----------------------------------------------------------------------------
88 ;;;;;;; NO FATE SAMPLES TRIGGER THIS
89 %macro ADD4x4IDCT 0
90 add4x4_idct %+ SUFFIX:
91     add   r5, r0
92     mova  m0, [r2+ 0]
93     mova  m1, [r2+16]
94     mova  m2, [r2+32]
95     mova  m3, [r2+48]
96     IDCT4_1D d,0,1,2,3,4,5
97     TRANSPOSE4x4D 0,1,2,3,4
98     paddd m0, [pd_32]
99     IDCT4_1D d,0,1,2,3,4,5
100     pxor  m5, m5
101     STORE_DIFFx2 m0, m1, m4, m5, r5, r3
102     lea   r5, [r5+r3*2]
103     STORE_DIFFx2 m2, m3, m4, m5, r5, r3
104     ret
105 %endmacro
106
107 INIT_XMM sse2
108 ALIGN 16
109 ADD4x4IDCT
110 INIT_XMM avx
111 ALIGN 16
112 ADD4x4IDCT
113
114 %macro ADD16_OP 2
115     cmp          byte [r4+%2], 0
116     jz .skipblock%1
117     mov         r5d, [r1+%1*4]
118     call add4x4_idct %+ SUFFIX
119 .skipblock%1:
120 %if %1<15
121     add          r2, 64
122 %endif
123 %endmacro
124
125 %macro IDCT_ADD16_10 0
126 cglobal h264_idct_add16_10, 5,6
127     ADD16_OP 0, 4+1*8
128     ADD16_OP 1, 5+1*8
129     ADD16_OP 2, 4+2*8
130     ADD16_OP 3, 5+2*8
131     ADD16_OP 4, 6+1*8
132     ADD16_OP 5, 7+1*8
133     ADD16_OP 6, 6+2*8
134     ADD16_OP 7, 7+2*8
135     ADD16_OP 8, 4+3*8
136     ADD16_OP 9, 5+3*8
137     ADD16_OP 10, 4+4*8
138     ADD16_OP 11, 5+4*8
139     ADD16_OP 12, 6+3*8
140     ADD16_OP 13, 7+3*8
141     ADD16_OP 14, 6+4*8
142     ADD16_OP 15, 7+4*8
143     REP_RET
144 %endmacro
145
146 INIT_XMM sse2
147 IDCT_ADD16_10
148 INIT_XMM avx
149 IDCT_ADD16_10
150
151 ;-----------------------------------------------------------------------------
152 ; void h264_idct_dc_add(pixel *dst, dctcoef *block, int stride)
153 ;-----------------------------------------------------------------------------
154 %macro IDCT_DC_ADD_OP_10 3
155     pxor      m5, m5
156 %if avx_enabled
157     paddw     m1, m0, [%1+0   ]
158     paddw     m2, m0, [%1+%2  ]
159     paddw     m3, m0, [%1+%2*2]
160     paddw     m4, m0, [%1+%3  ]
161 %else
162     mova      m1, [%1+0   ]
163     mova      m2, [%1+%2  ]
164     mova      m3, [%1+%2*2]
165     mova      m4, [%1+%3  ]
166     paddw     m1, m0
167     paddw     m2, m0
168     paddw     m3, m0
169     paddw     m4, m0
170 %endif
171     CLIPW     m1, m5, m6
172     CLIPW     m2, m5, m6
173     CLIPW     m3, m5, m6
174     CLIPW     m4, m5, m6
175     mova [%1+0   ], m1
176     mova [%1+%2  ], m2
177     mova [%1+%2*2], m3
178     mova [%1+%3  ], m4
179 %endmacro
180
181 INIT_MMX mmxext
182 cglobal h264_idct_dc_add_10,3,3
183     movd      m0, [r1]
184     paddd     m0, [pd_32]
185     psrad     m0, 6
186     lea       r1, [r2*3]
187     pshufw    m0, m0, 0
188     mova      m6, [pw_pixel_max]
189     IDCT_DC_ADD_OP_10 r0, r2, r1
190     RET
191
192 ;-----------------------------------------------------------------------------
193 ; void h264_idct8_dc_add(pixel *dst, dctcoef *block, int stride)
194 ;-----------------------------------------------------------------------------
195 %macro IDCT8_DC_ADD 0
196 cglobal h264_idct8_dc_add_10,3,3,7
197     mov      r1d, [r1]
198     add       r1, 32
199     sar       r1, 6
200     movd      m0, r1d
201     lea       r1, [r2*3]
202     SPLATW    m0, m0, 0
203     mova      m6, [pw_pixel_max]
204     IDCT_DC_ADD_OP_10 r0, r2, r1
205     lea       r0, [r0+r2*4]
206     IDCT_DC_ADD_OP_10 r0, r2, r1
207     RET
208 %endmacro
209
210 INIT_XMM sse2
211 IDCT8_DC_ADD
212 INIT_XMM avx
213 IDCT8_DC_ADD
214
215 ;-----------------------------------------------------------------------------
216 ; h264_idct_add16intra(pixel *dst, const int *block_offset, dctcoef *block, int stride, const uint8_t nnzc[6*8])
217 ;-----------------------------------------------------------------------------
218 %macro AC 1
219 .ac%1:
220     mov  r5d, [r1+(%1+0)*4]
221     call add4x4_idct %+ SUFFIX
222     mov  r5d, [r1+(%1+1)*4]
223     add  r2, 64
224     call add4x4_idct %+ SUFFIX
225     add  r2, 64
226     jmp .skipadd%1
227 %endmacro
228
229 %assign last_block 16
230 %macro ADD16_OP_INTRA 2
231     cmp      word [r4+%2], 0
232     jnz .ac%1
233     mov      r5d, [r2+ 0]
234     or       r5d, [r2+64]
235     jz .skipblock%1
236     mov      r5d, [r1+(%1+0)*4]
237     call idct_dc_add %+ SUFFIX
238 .skipblock%1:
239 %if %1<last_block-2
240     add       r2, 128
241 %endif
242 .skipadd%1:
243 %endmacro
244
245 %macro IDCT_ADD16INTRA_10 0
246 idct_dc_add %+ SUFFIX:
247     add       r5, r0
248     movq      m0, [r2+ 0]
249     movhps    m0, [r2+64]
250     paddd     m0, [pd_32]
251     psrad     m0, 6
252     pshufhw   m0, m0, 0
253     pshuflw   m0, m0, 0
254     lea       r6, [r3*3]
255     mova      m6, [pw_pixel_max]
256     IDCT_DC_ADD_OP_10 r5, r3, r6
257     ret
258
259 cglobal h264_idct_add16intra_10,5,7,8
260     ADD16_OP_INTRA 0, 4+1*8
261     ADD16_OP_INTRA 2, 4+2*8
262     ADD16_OP_INTRA 4, 6+1*8
263     ADD16_OP_INTRA 6, 6+2*8
264     ADD16_OP_INTRA 8, 4+3*8
265     ADD16_OP_INTRA 10, 4+4*8
266     ADD16_OP_INTRA 12, 6+3*8
267     ADD16_OP_INTRA 14, 6+4*8
268     REP_RET
269     AC 8
270     AC 10
271     AC 12
272     AC 14
273     AC 0
274     AC 2
275     AC 4
276     AC 6
277 %endmacro
278
279 INIT_XMM sse2
280 IDCT_ADD16INTRA_10
281 INIT_XMM avx
282 IDCT_ADD16INTRA_10
283
284 %assign last_block 36
285 ;-----------------------------------------------------------------------------
286 ; h264_idct_add8(pixel **dst, const int *block_offset, dctcoef *block, int stride, const uint8_t nnzc[6*8])
287 ;-----------------------------------------------------------------------------
288 %macro IDCT_ADD8 0
289 cglobal h264_idct_add8_10,5,8,7
290 %if ARCH_X86_64
291     mov      r7, r0
292 %endif
293     add      r2, 1024
294     mov      r0, [r0]
295     ADD16_OP_INTRA 16, 4+ 6*8
296     ADD16_OP_INTRA 18, 4+ 7*8
297     add      r2, 1024-128*2
298 %if ARCH_X86_64
299     mov      r0, [r7+gprsize]
300 %else
301     mov      r0, r0m
302     mov      r0, [r0+gprsize]
303 %endif
304     ADD16_OP_INTRA 32, 4+11*8
305     ADD16_OP_INTRA 34, 4+12*8
306     REP_RET
307     AC 16
308     AC 18
309     AC 32
310     AC 34
311
312 %endmacro ; IDCT_ADD8
313
314 INIT_XMM sse2
315 IDCT_ADD8
316 INIT_XMM avx
317 IDCT_ADD8
318
319 ;-----------------------------------------------------------------------------
320 ; void h264_idct8_add(pixel *dst, dctcoef *block, int stride)
321 ;-----------------------------------------------------------------------------
322 %macro IDCT8_1D 2
323     SWAP      0, 1
324     psrad     m4, m5, 1
325     psrad     m1, m0, 1
326     paddd     m4, m5
327     paddd     m1, m0
328     paddd     m4, m7
329     paddd     m1, m5
330     psubd     m4, m0
331     paddd     m1, m3
332
333     psubd     m0, m3
334     psubd     m5, m3
335     paddd     m0, m7
336     psubd     m5, m7
337     psrad     m3, 1
338     psrad     m7, 1
339     psubd     m0, m3
340     psubd     m5, m7
341
342     SWAP      1, 7
343     psrad     m1, m7, 2
344     psrad     m3, m4, 2
345     paddd     m3, m0
346     psrad     m0, 2
347     paddd     m1, m5
348     psrad     m5, 2
349     psubd     m0, m4
350     psubd     m7, m5
351
352     SWAP      5, 6
353     psrad     m4, m2, 1
354     psrad     m6, m5, 1
355     psubd     m4, m5
356     paddd     m6, m2
357
358     mova      m2, %1
359     mova      m5, %2
360     SUMSUB_BA d, 5, 2
361     SUMSUB_BA d, 6, 5
362     SUMSUB_BA d, 4, 2
363     SUMSUB_BA d, 7, 6
364     SUMSUB_BA d, 0, 4
365     SUMSUB_BA d, 3, 2
366     SUMSUB_BA d, 1, 5
367     SWAP      7, 6, 4, 5, 2, 3, 1, 0 ; 70315246 -> 01234567
368 %endmacro
369
370 %macro IDCT8_1D_FULL 1
371     mova         m7, [%1+112*2]
372     mova         m6, [%1+ 96*2]
373     mova         m5, [%1+ 80*2]
374     mova         m3, [%1+ 48*2]
375     mova         m2, [%1+ 32*2]
376     mova         m1, [%1+ 16*2]
377     IDCT8_1D   [%1], [%1+ 64*2]
378 %endmacro
379
380 ; %1=int16_t *block, %2=int16_t *dstblock
381 %macro IDCT8_ADD_SSE_START 2
382     IDCT8_1D_FULL %1
383 %if ARCH_X86_64
384     TRANSPOSE4x4D  0,1,2,3,8
385     mova    [%2    ], m0
386     TRANSPOSE4x4D  4,5,6,7,8
387     mova    [%2+8*2], m4
388 %else
389     mova         [%1], m7
390     TRANSPOSE4x4D   0,1,2,3,7
391     mova           m7, [%1]
392     mova    [%2     ], m0
393     mova    [%2+16*2], m1
394     mova    [%2+32*2], m2
395     mova    [%2+48*2], m3
396     TRANSPOSE4x4D   4,5,6,7,3
397     mova    [%2+ 8*2], m4
398     mova    [%2+24*2], m5
399     mova    [%2+40*2], m6
400     mova    [%2+56*2], m7
401 %endif
402 %endmacro
403
404 ; %1=uint8_t *dst, %2=int16_t *block, %3=int stride
405 %macro IDCT8_ADD_SSE_END 3
406     IDCT8_1D_FULL %2
407     mova  [%2     ], m6
408     mova  [%2+16*2], m7
409
410     pxor         m7, m7
411     STORE_DIFFx2 m0, m1, m6, m7, %1, %3
412     lea          %1, [%1+%3*2]
413     STORE_DIFFx2 m2, m3, m6, m7, %1, %3
414     mova         m0, [%2     ]
415     mova         m1, [%2+16*2]
416     lea          %1, [%1+%3*2]
417     STORE_DIFFx2 m4, m5, m6, m7, %1, %3
418     lea          %1, [%1+%3*2]
419     STORE_DIFFx2 m0, m1, m6, m7, %1, %3
420 %endmacro
421
422 %macro IDCT8_ADD 0
423 cglobal h264_idct8_add_10, 3,4,16
424 %if UNIX64 == 0
425     %assign pad 16-gprsize-(stack_offset&15)
426     sub  rsp, pad
427     call h264_idct8_add1_10 %+ SUFFIX
428     add  rsp, pad
429     RET
430 %endif
431
432 ALIGN 16
433 ; TODO: does not need to use stack
434 h264_idct8_add1_10 %+ SUFFIX:
435 %assign pad 256+16-gprsize
436     sub          rsp, pad
437     add   dword [r1], 32
438
439 %if ARCH_X86_64
440     IDCT8_ADD_SSE_START r1, rsp
441     SWAP 1,  9
442     SWAP 2, 10
443     SWAP 3, 11
444     SWAP 5, 13
445     SWAP 6, 14
446     SWAP 7, 15
447     IDCT8_ADD_SSE_START r1+16, rsp+128
448     PERMUTE 1,9, 2,10, 3,11, 5,1, 6,2, 7,3, 9,13, 10,14, 11,15, 13,5, 14,6, 15,7
449     IDCT8_1D [rsp], [rsp+128]
450     SWAP 0,  8
451     SWAP 1,  9
452     SWAP 2, 10
453     SWAP 3, 11
454     SWAP 4, 12
455     SWAP 5, 13
456     SWAP 6, 14
457     SWAP 7, 15
458     IDCT8_1D [rsp+16], [rsp+144]
459     psrad         m8, 6
460     psrad         m0, 6
461     packssdw      m8, m0
462     paddsw        m8, [r0]
463     pxor          m0, m0
464     CLIPW         m8, m0, [pw_pixel_max]
465     mova        [r0], m8
466     mova          m8, [pw_pixel_max]
467     STORE_DIFF16  m9, m1, m0, m8, r0+r2
468     lea           r0, [r0+r2*2]
469     STORE_DIFF16 m10, m2, m0, m8, r0
470     STORE_DIFF16 m11, m3, m0, m8, r0+r2
471     lea           r0, [r0+r2*2]
472     STORE_DIFF16 m12, m4, m0, m8, r0
473     STORE_DIFF16 m13, m5, m0, m8, r0+r2
474     lea           r0, [r0+r2*2]
475     STORE_DIFF16 m14, m6, m0, m8, r0
476     STORE_DIFF16 m15, m7, m0, m8, r0+r2
477 %else
478     IDCT8_ADD_SSE_START r1,    rsp
479     IDCT8_ADD_SSE_START r1+16, rsp+128
480     lea           r3, [r0+8]
481     IDCT8_ADD_SSE_END r0, rsp,    r2
482     IDCT8_ADD_SSE_END r3, rsp+16, r2
483 %endif ; ARCH_X86_64
484
485     add          rsp, pad
486     ret
487 %endmacro
488
489 INIT_XMM sse2
490 IDCT8_ADD
491 INIT_XMM avx
492 IDCT8_ADD
493
494 ;-----------------------------------------------------------------------------
495 ; h264_idct8_add4(pixel **dst, const int *block_offset, dctcoef *block, int stride, const uint8_t nnzc[6*8])
496 ;-----------------------------------------------------------------------------
497 ;;;;;;; NO FATE SAMPLES TRIGGER THIS
498 %macro IDCT8_ADD4_OP 2
499     cmp       byte [r4+%2], 0
500     jz .skipblock%1
501     mov      r0d, [r6+%1*4]
502     add       r0, r5
503     call h264_idct8_add1_10 %+ SUFFIX
504 .skipblock%1:
505 %if %1<12
506     add       r1, 256
507 %endif
508 %endmacro
509
510 %macro IDCT8_ADD4 0
511 cglobal h264_idct8_add4_10, 0,7,16
512     %assign pad 16-gprsize-(stack_offset&15)
513     SUB      rsp, pad
514     mov       r5, r0mp
515     mov       r6, r1mp
516     mov       r1, r2mp
517     mov      r2d, r3m
518     movifnidn r4, r4mp
519     IDCT8_ADD4_OP  0, 4+1*8
520     IDCT8_ADD4_OP  4, 6+1*8
521     IDCT8_ADD4_OP  8, 4+3*8
522     IDCT8_ADD4_OP 12, 6+3*8
523     ADD       rsp, pad
524     RET
525 %endmacro ; IDCT8_ADD4
526
527 INIT_XMM sse2
528 IDCT8_ADD4
529 INIT_XMM avx
530 IDCT8_ADD4