]> git.sesse.net Git - x264/blob - common/x86/dct-32.asm
Remove unnecessary PIC support macros
[x264] / common / x86 / dct-32.asm
1 ;*****************************************************************************
2 ;* dct-32.asm: h264 encoder library
3 ;*****************************************************************************
4 ;* Copyright (C) 2003-2008 x264 project
5 ;*
6 ;* Authors: Loren Merritt <lorenm@u.washington.edu>
7 ;*          Holger Lubitz <holger@lubitz.org>
8 ;*          Laurent Aimar <fenrir@via.ecp.fr>
9 ;*          Min Chen <chenm001.163.com>
10 ;*          Christian Heine <sennindemokrit@gmx.net>
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
27 %include "x86inc.asm"
28 %include "x86util.asm"
29
30 SECTION_RODATA
31
32 pw_32: times 8 dw 32
33 hsub_mul: times 8 db 1, -1
34
35 SECTION .text
36
37 ; in: m0..m7
38 ; out: 0,4,6 in mem, rest in regs
39 %macro DCT8_1D 9
40     SUMSUB_BA  m%8, m%1      ; %8 = s07, %1 = d07
41     SUMSUB_BA  m%7, m%2      ; %7 = s16, %2 = d16
42     SUMSUB_BA  m%6, m%3      ; %6 = s25, %3 = d25
43     SUMSUB_BA  m%5, m%4      ; %5 = s34, %4 = d34
44     SUMSUB_BA  m%5, m%8      ; %5 = a0,  %8 = a2
45     SUMSUB_BA  m%6, m%7      ; %6 = a1,  %7 = a3
46     SUMSUB_BA  m%6, m%5      ; %6 = dst0, %5 = dst4
47     mova    [%9+0x00], m%6
48     mova    [%9+0x40], m%5
49     mova    m%6, m%7         ; a3
50     psraw   m%6, 1           ; a3>>1
51     paddw   m%6, m%8         ; a2 + (a3>>1)
52     psraw   m%8, 1           ; a2>>1
53     psubw   m%8, m%7         ; (a2>>1) - a3
54     mova    [%9+0x60], m%8
55     mova    m%5, m%3
56     psraw   m%5, 1
57     paddw   m%5, m%3         ; d25+(d25>>1)
58     mova    m%7, m%1
59     psubw   m%7, m%4         ; a5 = d07-d34-(d25+(d25>>1))
60     psubw   m%7, m%5
61     mova    m%5, m%2
62     psraw   m%5, 1
63     paddw   m%5, m%2         ; d16+(d16>>1)
64     mova    m%8, m%1
65     paddw   m%8, m%4
66     psubw   m%8, m%5         ; a6 = d07+d34-(d16+(d16>>1))
67     mova    m%5, m%1
68     psraw   m%5, 1
69     paddw   m%5, m%1         ; d07+(d07>>1)
70     paddw   m%5, m%2
71     paddw   m%5, m%3         ; a4 = d16+d25+(d07+(d07>>1))
72     mova    m%1, m%4
73     psraw   m%1, 1
74     paddw   m%1, m%4         ; d34+(d34>>1)
75     paddw   m%1, m%2
76     psubw   m%1, m%3         ; a7 = d16-d25+(d34+(d34>>1))
77     mova    m%4, m%1
78     psraw   m%4, 2
79     paddw   m%4, m%5         ; a4 + (a7>>2)
80     mova    m%3, m%8
81     psraw   m%3, 2
82     paddw   m%3, m%7         ; a5 + (a6>>2)
83     psraw   m%5, 2
84     psraw   m%7, 2
85     psubw   m%5, m%1         ; (a4>>2) - a7
86     psubw   m%8, m%7         ; a6 - (a5>>2)
87     SWAP %2, %4, %3, %6, %8, %5
88 %endmacro
89
90 ; in: 0,4 in mem, rest in regs
91 ; out: m0..m7
92 %macro IDCT8_1D 9
93     mova      m%1, m%3
94     mova      m%5, m%7
95     psraw     m%3, 1
96     psraw     m%7, 1
97     psubw     m%3, m%5
98     paddw     m%7, m%1
99     mova      m%5, m%2
100     psraw     m%5, 1
101     paddw     m%5, m%2
102     paddw     m%5, m%4
103     paddw     m%5, m%6
104     mova      m%1, m%6
105     psraw     m%1, 1
106     paddw     m%1, m%6
107     paddw     m%1, m%8
108     psubw     m%1, m%2
109     psubw     m%2, m%4
110     psubw     m%6, m%4
111     paddw     m%2, m%8
112     psubw     m%6, m%8
113     psraw     m%4, 1
114     psraw     m%8, 1
115     psubw     m%2, m%4
116     psubw     m%6, m%8
117     mova      m%4, m%5
118     mova      m%8, m%1
119     psraw     m%4, 2
120     psraw     m%8, 2
121     paddw     m%4, m%6
122     paddw     m%8, m%2
123     psraw     m%6, 2
124     psraw     m%2, 2
125     psubw     m%5, m%6
126     psubw     m%2, m%1
127     mova      m%1, [%9+0x00]
128     mova      m%6, [%9+0x40]
129     SUMSUB_BA m%6, m%1
130     SUMSUB_BA m%7, m%6
131     SUMSUB_BA m%3, m%1
132     SUMSUB_BA m%5, m%7
133     SUMSUB_BA m%2, m%3
134     SUMSUB_BA m%8, m%1
135     SUMSUB_BA m%4, m%6
136     SWAP %1, %5, %6
137     SWAP %3, %8, %7
138 %endmacro
139
140 INIT_MMX
141 ALIGN 16
142 load_diff_4x8_mmx:
143     LOAD_DIFF m0, m7, none, [r1+0*FENC_STRIDE], [r2+0*FDEC_STRIDE]
144     LOAD_DIFF m1, m7, none, [r1+1*FENC_STRIDE], [r2+1*FDEC_STRIDE]
145     LOAD_DIFF m2, m7, none, [r1+2*FENC_STRIDE], [r2+2*FDEC_STRIDE]
146     LOAD_DIFF m3, m7, none, [r1+3*FENC_STRIDE], [r2+3*FDEC_STRIDE]
147     LOAD_DIFF m4, m7, none, [r1+4*FENC_STRIDE], [r2+4*FDEC_STRIDE]
148     LOAD_DIFF m5, m7, none, [r1+5*FENC_STRIDE], [r2+5*FDEC_STRIDE]
149     movq  [r0], m0
150     LOAD_DIFF m6, m7, none, [r1+6*FENC_STRIDE], [r2+6*FDEC_STRIDE]
151     LOAD_DIFF m7, m0, none, [r1+7*FENC_STRIDE], [r2+7*FDEC_STRIDE]
152     movq  m0, [r0]
153     ret
154
155 INIT_MMX
156 ALIGN 16
157 dct8_mmx:
158     DCT8_1D 0,1,2,3,4,5,6,7,r0
159     SAVE_MM_PERMUTATION dct8_mmx
160     ret
161
162 %macro SPILL_SHUFFLE 3-* ; ptr, list of regs, list of memory offsets
163     %xdefine %%base %1
164     %rep %0/2
165     %xdefine %%tmp m%2
166     %rotate %0/2
167     mova [%%base + %2*16], %%tmp
168     %rotate 1-%0/2
169     %endrep
170 %endmacro
171
172 %macro UNSPILL_SHUFFLE 3-*
173     %xdefine %%base %1
174     %rep %0/2
175     %xdefine %%tmp m%2
176     %rotate %0/2
177     mova %%tmp, [%%base + %2*16]
178     %rotate 1-%0/2
179     %endrep
180 %endmacro
181
182 %macro SPILL 2+ ; assume offsets are the same as reg numbers
183     SPILL_SHUFFLE %1, %2, %2
184 %endmacro
185
186 %macro UNSPILL 2+
187     UNSPILL_SHUFFLE %1, %2, %2
188 %endmacro
189
190 ;-----------------------------------------------------------------------------
191 ; void x264_sub8x8_dct8_mmx( int16_t dct[8][8], uint8_t *pix1, uint8_t *pix2 )
192 ;-----------------------------------------------------------------------------
193 cglobal x264_sub8x8_dct8_mmx, 3,3
194 global x264_sub8x8_dct8_mmx.skip_prologue
195 .skip_prologue:
196     INIT_MMX
197     call load_diff_4x8_mmx
198     call dct8_mmx
199     UNSPILL r0, 0
200     TRANSPOSE4x4W 0,1,2,3,4
201     SPILL r0, 0,1,2,3
202     UNSPILL r0, 4,6
203     TRANSPOSE4x4W 4,5,6,7,0
204     SPILL r0, 4,5,6,7
205     INIT_MMX
206     add   r1, 4
207     add   r2, 4
208     add   r0, 8
209     call load_diff_4x8_mmx
210     sub   r1, 4
211     sub   r2, 4
212     call dct8_mmx
213     sub   r0, 8
214     UNSPILL r0+8, 4,6
215     TRANSPOSE4x4W 4,5,6,7,0
216     SPILL r0+8, 4,5,6,7
217     UNSPILL r0+8, 0
218     TRANSPOSE4x4W 0,1,2,3,5
219     UNSPILL r0, 4,5,6,7
220     SPILL_SHUFFLE r0, 0,1,2,3, 4,5,6,7
221     movq  mm4, m6 ; depends on the permutation to not produce conflicts
222     movq  mm0, m4
223     movq  mm1, m5
224     movq  mm2, mm4
225     movq  mm3, m7
226     INIT_MMX
227     UNSPILL r0+8, 4,5,6,7
228     add   r0, 8
229     call dct8_mmx
230     sub   r0, 8
231     SPILL r0+8, 1,2,3,5,7
232     INIT_MMX
233     UNSPILL r0, 0,1,2,3,4,5,6,7
234     call dct8_mmx
235     SPILL r0, 1,2,3,5,7
236     ret
237
238 INIT_MMX
239 ALIGN 16
240 idct8_mmx:
241     IDCT8_1D 0,1,2,3,4,5,6,7,r1
242     SAVE_MM_PERMUTATION idct8_mmx
243     ret
244
245 %macro ADD_STORE_ROW 3
246     movq  m1, [r0+%1*FDEC_STRIDE]
247     movq  m2, m1
248     punpcklbw m1, m0
249     punpckhbw m2, m0
250     paddw m1, %2
251     paddw m2, %3
252     packuswb m1, m2
253     movq  [r0+%1*FDEC_STRIDE], m1
254 %endmacro
255
256 ;-----------------------------------------------------------------------------
257 ; void x264_add8x8_idct8_mmx( uint8_t *dst, int16_t dct[8][8] )
258 ;-----------------------------------------------------------------------------
259 cglobal x264_add8x8_idct8_mmx, 2,2
260 global x264_add8x8_idct8_mmx.skip_prologue
261 .skip_prologue:
262     INIT_MMX
263     add word [r1], 32
264     UNSPILL r1, 1,2,3,5,6,7
265     call idct8_mmx
266     SPILL r1, 7
267     TRANSPOSE4x4W 0,1,2,3,7
268     SPILL r1, 0,1,2,3
269     UNSPILL r1, 7
270     TRANSPOSE4x4W 4,5,6,7,0
271     SPILL r1, 4,5,6,7
272     INIT_MMX
273     UNSPILL r1+8, 1,2,3,5,6,7
274     add r1, 8
275     call idct8_mmx
276     sub r1, 8
277     SPILL r1+8, 7
278     TRANSPOSE4x4W 0,1,2,3,7
279     SPILL r1+8, 0,1,2,3
280     UNSPILL r1+8, 7
281     TRANSPOSE4x4W 4,5,6,7,0
282     SPILL r1+8, 4,5,6,7
283     INIT_MMX
284     movq  m3, [r1+0x08]
285     movq  m0, [r1+0x40]
286     movq  [r1+0x40], m3
287     movq  [r1+0x08], m0
288     ; memory layout at this time:
289     ; A0------ A1------
290     ; B0------ F0------
291     ; C0------ G0------
292     ; D0------ H0------
293     ; E0------ E1------
294     ; B1------ F1------
295     ; C1------ G1------
296     ; D1------ H1------
297     UNSPILL_SHUFFLE r1, 1,2,3, 5,6,7
298     UNSPILL r1+8, 5,6,7
299     add r1, 8
300     call idct8_mmx
301     sub r1, 8
302     psraw m0, 6
303     psraw m1, 6
304     psraw m2, 6
305     psraw m3, 6
306     psraw m4, 6
307     psraw m5, 6
308     psraw m6, 6
309     psraw m7, 6
310     movq  [r1+0x08], m0 ; mm4
311     movq  [r1+0x48], m4 ; mm5
312     movq  [r1+0x58], m5 ; mm0
313     movq  [r1+0x68], m6 ; mm2
314     movq  [r1+0x78], m7 ; mm6
315     movq  mm5, [r1+0x18]
316     movq  mm6, [r1+0x28]
317     movq  [r1+0x18], m1 ; mm1
318     movq  [r1+0x28], m2 ; mm7
319     movq  mm7, [r1+0x38]
320     movq  [r1+0x38], m3 ; mm3
321     movq  mm1, [r1+0x10]
322     movq  mm2, [r1+0x20]
323     movq  mm3, [r1+0x30]
324     call idct8_mmx
325     psraw m0, 6
326     psraw m1, 6
327     psraw m2, 6
328     psraw m3, 6
329     psraw m4, 6
330     psraw m5, 6
331     psraw m6, 6
332     psraw m7, 6
333     SPILL r1, 0,1,2
334     pxor  m0, m0
335     ADD_STORE_ROW 0, [r1+0x00], [r1+0x08]
336     ADD_STORE_ROW 1, [r1+0x10], [r1+0x18]
337     ADD_STORE_ROW 2, [r1+0x20], [r1+0x28]
338     ADD_STORE_ROW 3, m3, [r1+0x38]
339     ADD_STORE_ROW 4, m4, [r1+0x48]
340     ADD_STORE_ROW 5, m5, [r1+0x58]
341     ADD_STORE_ROW 6, m6, [r1+0x68]
342     ADD_STORE_ROW 7, m7, [r1+0x78]
343     ret
344
345 INIT_XMM
346 %macro DCT_SUB8 1
347 cglobal x264_sub8x8_dct_%1, 3,3
348     add r2, 4*FDEC_STRIDE
349 global x264_sub8x8_dct_%1.skip_prologue
350 .skip_prologue:
351 %ifnidn %1, sse2
352     mova m7, [hsub_mul]
353 %endif
354     LOAD_DIFF8x4 0, 1, 2, 3, 6, 7, r1, r2-4*FDEC_STRIDE
355     SPILL r0, 1,2
356     SWAP 2, 7
357     LOAD_DIFF8x4 4, 5, 6, 7, 1, 2, r1, r2-4*FDEC_STRIDE
358     UNSPILL r0, 1
359     SPILL r0, 7
360     SWAP 2, 7
361     UNSPILL r0, 2
362     DCT4_1D 0, 1, 2, 3, 7
363     TRANSPOSE2x4x4W 0, 1, 2, 3, 7
364     UNSPILL r0, 7
365     SPILL r0, 2
366     DCT4_1D 4, 5, 6, 7, 2
367     TRANSPOSE2x4x4W 4, 5, 6, 7, 2
368     UNSPILL r0, 2
369     SPILL r0, 6
370     DCT4_1D 0, 1, 2, 3, 6
371     UNSPILL r0, 6
372     STORE_DCT 0, 1, 2, 3, r0, 0
373     DCT4_1D 4, 5, 6, 7, 3
374     STORE_DCT 4, 5, 6, 7, r0, 64
375     ret
376
377 ;-----------------------------------------------------------------------------
378 ; void x264_sub8x8_dct8_sse2( int16_t dct[8][8], uint8_t *pix1, uint8_t *pix2 )
379 ;-----------------------------------------------------------------------------
380 cglobal x264_sub8x8_dct8_%1, 3,3
381     add r2, 4*FDEC_STRIDE
382 global x264_sub8x8_dct8_%1.skip_prologue
383 .skip_prologue:
384 %ifidn %1, sse2
385     LOAD_DIFF m0, m7, none, [r1+0*FENC_STRIDE], [r2-4*FDEC_STRIDE]
386     LOAD_DIFF m1, m7, none, [r1+1*FENC_STRIDE], [r2-3*FDEC_STRIDE]
387     LOAD_DIFF m2, m7, none, [r1+2*FENC_STRIDE], [r2-2*FDEC_STRIDE]
388     LOAD_DIFF m3, m7, none, [r1+3*FENC_STRIDE], [r2-1*FDEC_STRIDE]
389     LOAD_DIFF m4, m7, none, [r1+4*FENC_STRIDE], [r2+0*FDEC_STRIDE]
390     LOAD_DIFF m5, m7, none, [r1+5*FENC_STRIDE], [r2+1*FDEC_STRIDE]
391     SPILL r0, 0
392     LOAD_DIFF m6, m7, none, [r1+6*FENC_STRIDE], [r2+2*FDEC_STRIDE]
393     LOAD_DIFF m7, m0, none, [r1+7*FENC_STRIDE], [r2+3*FDEC_STRIDE]
394     UNSPILL r0, 0
395 %else
396     mova m7, [hsub_mul]
397     LOAD_DIFF8x4 0, 1, 2, 3, 4, 7, r1, r2-4*FDEC_STRIDE
398     SPILL r0, 0,1
399     SWAP 1, 7
400     LOAD_DIFF8x4 4, 5, 6, 7, 0, 1, r1, r2-4*FDEC_STRIDE
401     UNSPILL r0, 0,1
402 %endif
403     DCT8_1D 0,1,2,3,4,5,6,7,r0
404     UNSPILL r0, 0,4
405     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,[r0+0x60],[r0+0x40],1
406     UNSPILL r0, 4
407     DCT8_1D 0,1,2,3,4,5,6,7,r0
408     SPILL r0, 1,2,3,5,7
409     ret
410 %endmacro
411
412 %define LOAD_DIFF8x4 LOAD_DIFF8x4_SSE2
413 %define movdqa movaps
414 %define punpcklqdq movlhps
415 DCT_SUB8 sse2
416 %undef movdqa
417 %undef punpcklqdq
418 %define LOAD_DIFF8x4 LOAD_DIFF8x4_SSSE3
419 DCT_SUB8 ssse3
420
421 ;-----------------------------------------------------------------------------
422 ; void x264_add8x8_idct_sse2( uint8_t *pix, int16_t dct[4][4][4] )
423 ;-----------------------------------------------------------------------------
424 cglobal x264_add8x8_idct_sse2, 2,2
425     add r0, 4*FDEC_STRIDE
426 global x264_add8x8_idct_sse2.skip_prologue
427 .skip_prologue:
428     UNSPILL_SHUFFLE r1, 0,2,1,3, 0,1,2,3
429     SBUTTERFLY qdq, 0, 1, 4
430     SBUTTERFLY qdq, 2, 3, 4
431     UNSPILL_SHUFFLE r1, 4,6,5,7, 4,5,6,7
432     SPILL r1, 0
433     SBUTTERFLY qdq, 4, 5, 0
434     SBUTTERFLY qdq, 6, 7, 0
435     UNSPILL r1,0
436     IDCT4_1D 0,1,2,3,r1
437     SPILL r1, 4
438     TRANSPOSE2x4x4W 0,1,2,3,4
439     UNSPILL r1, 4
440     IDCT4_1D 4,5,6,7,r1
441     SPILL r1, 0
442     TRANSPOSE2x4x4W 4,5,6,7,0
443     UNSPILL r1, 0
444     paddw m0, [pw_32]
445     IDCT4_1D 0,1,2,3,r1
446     paddw m4, [pw_32]
447     IDCT4_1D 4,5,6,7,r1
448     SPILL r1, 6,7
449     pxor m7, m7
450     DIFFx2 m0, m1, m6, m7, [r0-4*FDEC_STRIDE], [r0-3*FDEC_STRIDE]; m5
451     DIFFx2 m2, m3, m6, m7, [r0-2*FDEC_STRIDE], [r0-1*FDEC_STRIDE]; m5
452     UNSPILL_SHUFFLE r1, 0,2, 6,7
453     DIFFx2 m4, m5, m6, m7, [r0+0*FDEC_STRIDE], [r0+1*FDEC_STRIDE]; m5
454     DIFFx2 m0, m2, m6, m7, [r0+2*FDEC_STRIDE], [r0+3*FDEC_STRIDE]; m5
455     STORE_IDCT m1, m3, m5, m2
456     ret
457
458 ;-----------------------------------------------------------------------------
459 ; void x264_add8x8_idct8_sse2( uint8_t *p_dst, int16_t dct[8][8] )
460 ;-----------------------------------------------------------------------------
461 cglobal x264_add8x8_idct8_sse2, 2,2
462     add r0, 4*FDEC_STRIDE
463 global x264_add8x8_idct8_sse2.skip_prologue
464 .skip_prologue:
465     UNSPILL r1, 1,2,3,5,6,7
466     IDCT8_1D   0,1,2,3,4,5,6,7,r1
467     SPILL r1, 6
468     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,[r1+0x60],[r1+0x40],1
469     paddw      m0, [pw_32]
470     SPILL r1, 0
471     IDCT8_1D   0,1,2,3,4,5,6,7,r1
472     SPILL r1, 6,7
473     pxor       m7, m7
474     DIFFx2 m0, m1, m6, m7, [r0-4*FDEC_STRIDE], [r0-3*FDEC_STRIDE]; m5
475     DIFFx2 m2, m3, m6, m7, [r0-2*FDEC_STRIDE], [r0-1*FDEC_STRIDE]; m5
476     UNSPILL_SHUFFLE r1, 0,2, 6,7
477     DIFFx2 m4, m5, m6, m7, [r0+0*FDEC_STRIDE], [r0+1*FDEC_STRIDE]; m5
478     DIFFx2 m0, m2, m6, m7, [r0+2*FDEC_STRIDE], [r0+3*FDEC_STRIDE]; m5
479     STORE_IDCT m1, m3, m5, m2
480     ret