]> git.sesse.net Git - x264/blob - common/x86/dct-64.asm
Bump dates to 2011
[x264] / common / x86 / dct-64.asm
1 ;*****************************************************************************
2 ;* dct-64.asm: x86_64 transform and zigzag
3 ;*****************************************************************************
4 ;* Copyright (C) 2003-2011 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 ;*
11 ;* This program is free software; you can redistribute it and/or modify
12 ;* it under the terms of the GNU General Public License as published by
13 ;* the Free Software Foundation; either version 2 of the License, or
14 ;* (at your option) any later version.
15 ;*
16 ;* This program is distributed in the hope that it will be useful,
17 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 ;* GNU General Public License for more details.
20 ;*
21 ;* You should have received a copy of the GNU General Public License
22 ;* along with this program; if not, write to the Free Software
23 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
24 ;*
25 ;* This program is also available under a commercial proprietary license.
26 ;* For more information, contact us at licensing@x264.com.
27 ;*****************************************************************************
28
29 %include "x86inc.asm"
30 %include "x86util.asm"
31
32 SECTION .text
33
34 %ifndef HIGH_BIT_DEPTH
35 cextern pw_32
36 cextern hsub_mul
37 INIT_XMM
38
39 %macro DCT8_1D 10
40     SUMSUB_BA w, m%5, m%4 ; %5=s34, %4=d34
41     SUMSUB_BA w, m%6, m%3 ; %6=s25, %3=d25
42     SUMSUB_BA w, m%7, m%2 ; %7=s16, %2=d16
43     SUMSUB_BA w, m%8, m%1 ; %8=s07, %1=d07
44
45     SUMSUB_BA w, m%6, m%7, m%10 ; %6=a1, %7=a3
46     SUMSUB_BA w, m%5, m%8, m%10 ; %5=a0, %8=a2
47
48     movdqa  m%9, m%1
49     psraw   m%9, 1
50     paddw   m%9, m%1
51     paddw   m%9, m%2
52     paddw   m%9, m%3 ; %9=a4
53
54     movdqa  m%10, m%4
55     psraw   m%10, 1
56     paddw   m%10, m%4
57     paddw   m%10, m%2
58     psubw   m%10, m%3 ; %10=a7
59
60     SUMSUB_BA w, m%4, m%1
61     psubw   m%1, m%3
62     psubw   m%4, m%2
63     psraw   m%3, 1
64     psraw   m%2, 1
65     psubw   m%1, m%3 ; %1=a5
66     psubw   m%4, m%2 ; %4=a6
67
68     movdqa  m%2, m%10
69     psraw   m%2, 2
70     paddw   m%2, m%9 ; %2=b1
71     psraw   m%9, 2
72     psubw   m%9, m%10 ; %9=b7
73
74     SUMSUB_BA w, m%6, m%5, m%10 ; %6=b0, %5=b4
75
76     movdqa  m%3, m%7
77     psraw   m%3, 1
78     paddw   m%3, m%8 ; %3=b2
79     psraw   m%8, 1
80     psubw   m%8, m%7 ; %8=b6
81
82     movdqa  m%7, m%4
83     psraw   m%7, 2
84     paddw   m%7, m%1 ; %7=b3
85     psraw   m%1, 2
86     psubw   m%4, m%1 ; %4=b5
87
88     SWAP %1, %6, %4, %7, %8, %9
89 %endmacro
90
91 %macro IDCT8_1D 10
92     SUMSUB_BA w, m%5, m%1, m%9 ; %5=a0, %1=a2
93
94     movdqa  m%9, m%2
95     psraw   m%9, 1
96     paddw   m%9, m%2
97     paddw   m%9, m%4
98     paddw   m%9, m%6 ; %9=a7
99
100     movdqa  m%10, m%3
101     psraw   m%3, 1
102     psubw   m%3, m%7 ; %3=a4
103     psraw   m%7, 1
104     paddw   m%7, m%10 ; %7=a6
105
106     movdqa  m%10, m%6
107     psraw   m%10, 1
108     paddw   m%10, m%6
109     paddw   m%10, m%8
110     psubw   m%10, m%2 ; %10=a5
111
112     psubw   m%2, m%4
113     psubw   m%6, m%4
114     paddw   m%2, m%8
115     psubw   m%6, m%8
116     psraw   m%4, 1
117     psraw   m%8, 1
118     psubw   m%2, m%4 ; %2=a3
119     psubw   m%6, m%8 ; %6=a1
120
121     movdqa  m%4, m%9
122     psraw   m%4, 2
123     paddw   m%4, m%6 ; %4=b1
124     psraw   m%6, 2
125     psubw   m%9, m%6 ; %9=b7
126
127     SUMSUB_BA w, m%7, m%5, m%6 ; %7=b0, %5=b6
128     SUMSUB_BA w, m%3, m%1, m%6 ; %3=b2, %1=b4
129
130     movdqa  m%8, m%10
131     psraw   m%8, 2
132     paddw   m%8, m%2 ; %8=b3
133     psraw   m%2, 2
134     psubw   m%2, m%10 ; %2=b5
135
136     SUMSUB_BA w, m%9, m%7, m%6 ; %9=c0, %7=c7
137     SUMSUB_BA w, m%2, m%3, m%6 ; %2=c1, %3=c6
138     SUMSUB_BA w, m%8, m%1, m%6 ; %8=c2, %1=c5
139     SUMSUB_BA w, m%4, m%5, m%6 ; %4=c3, %5=c4
140
141     SWAP %1, %9, %6
142     SWAP %3, %8, %7
143 %endmacro
144
145 %macro DCT_SUB8 1
146 cglobal sub8x8_dct_%1, 3,3,11
147     add r2, 4*FDEC_STRIDE
148 %ifnidn %1, sse2
149     mova m7, [hsub_mul]
150 %endif
151 %ifdef WIN64
152     call .skip_prologue
153     RET
154 %endif
155 global sub8x8_dct_%1.skip_prologue
156 .skip_prologue:
157     SWAP 7, 9
158     LOAD_DIFF8x4 0, 1, 2, 3, 8, 9, r1, r2-4*FDEC_STRIDE
159     LOAD_DIFF8x4 4, 5, 6, 7, 8, 9, r1, r2-4*FDEC_STRIDE
160     DCT4_1D 0, 1, 2, 3, 8
161     TRANSPOSE2x4x4W 0, 1, 2, 3, 8
162     DCT4_1D 4, 5, 6, 7, 8
163     TRANSPOSE2x4x4W 4, 5, 6, 7, 8
164     DCT4_1D 0, 1, 2, 3, 8
165     STORE_DCT 0, 1, 2, 3, r0, 0
166     DCT4_1D 4, 5, 6, 7, 8
167     STORE_DCT 4, 5, 6, 7, r0, 64
168     ret
169
170 ;-----------------------------------------------------------------------------
171 ; void sub8x8_dct8( int16_t dct[8][8], uint8_t *pix1, uint8_t *pix2 )
172 ;-----------------------------------------------------------------------------
173 cglobal sub8x8_dct8_%1, 3,3,11
174     add r2, 4*FDEC_STRIDE
175 %ifnidn %1, sse2
176     mova m7, [hsub_mul]
177 %endif
178 %ifdef WIN64
179     call .skip_prologue
180     RET
181 %endif
182 global sub8x8_dct8_%1.skip_prologue
183 .skip_prologue:
184     SWAP 7, 10
185     LOAD_DIFF8x4  0, 1, 2, 3, 4, 10, r1, r2-4*FDEC_STRIDE
186     LOAD_DIFF8x4  4, 5, 6, 7, 8, 10, r1, r2-4*FDEC_STRIDE
187     DCT8_1D       0,1,2,3,4,5,6,7,8,9
188     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,8
189     DCT8_1D       0,1,2,3,4,5,6,7,8,9
190     movdqa  [r0+0x00], m0
191     movdqa  [r0+0x10], m1
192     movdqa  [r0+0x20], m2
193     movdqa  [r0+0x30], m3
194     movdqa  [r0+0x40], m4
195     movdqa  [r0+0x50], m5
196     movdqa  [r0+0x60], m6
197     movdqa  [r0+0x70], m7
198     ret
199 %endmacro
200
201 %define LOAD_DIFF8x4 LOAD_DIFF8x4_SSE2
202 %define movdqa movaps
203 %define punpcklqdq movlhps
204 DCT_SUB8 sse2
205 %undef movdqa
206 %undef punpcklqdq
207 %define LOAD_DIFF8x4 LOAD_DIFF8x4_SSSE3
208 DCT_SUB8 ssse3
209
210 ;-----------------------------------------------------------------------------
211 ; void add8x8_idct8( uint8_t *p_dst, int16_t dct[8][8] )
212 ;-----------------------------------------------------------------------------
213 cglobal add8x8_idct8_sse2, 2,2,11
214     add r0, 4*FDEC_STRIDE
215     pxor m7, m7
216 %ifdef WIN64
217     call .skip_prologue
218     RET
219 %endif
220 global add8x8_idct8_sse2.skip_prologue
221 .skip_prologue:
222     SWAP 7, 9
223     movdqa  m0, [r1+0x00]
224     movdqa  m1, [r1+0x10]
225     movdqa  m2, [r1+0x20]
226     movdqa  m3, [r1+0x30]
227     movdqa  m4, [r1+0x40]
228     movdqa  m5, [r1+0x50]
229     movdqa  m6, [r1+0x60]
230     movdqa  m7, [r1+0x70]
231     IDCT8_1D      0,1,2,3,4,5,6,7,8,10
232     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,8
233     paddw         m0, [pw_32] ; rounding for the >>6 at the end
234     IDCT8_1D      0,1,2,3,4,5,6,7,8,10
235     DIFFx2 m0, m1, m8, m9, [r0-4*FDEC_STRIDE], [r0-3*FDEC_STRIDE]
236     DIFFx2 m2, m3, m8, m9, [r0-2*FDEC_STRIDE], [r0-1*FDEC_STRIDE]
237     DIFFx2 m4, m5, m8, m9, [r0+0*FDEC_STRIDE], [r0+1*FDEC_STRIDE]
238     DIFFx2 m6, m7, m8, m9, [r0+2*FDEC_STRIDE], [r0+3*FDEC_STRIDE]
239     STORE_IDCT m1, m3, m5, m7
240     ret
241
242 ;-----------------------------------------------------------------------------
243 ; void add8x8_idct( uint8_t *pix, int16_t dct[4][4][4] )
244 ;-----------------------------------------------------------------------------
245 cglobal add8x8_idct_sse2, 2,2,11
246     add  r0, 4*FDEC_STRIDE
247     pxor m7, m7
248 %ifdef WIN64
249     call .skip_prologue
250     RET
251 %endif
252 global add8x8_idct_sse2.skip_prologue
253 .skip_prologue:
254     SWAP 7, 9
255     mova   m0, [r1+ 0]
256     mova   m2, [r1+16]
257     mova   m1, [r1+32]
258     mova   m3, [r1+48]
259     SBUTTERFLY qdq, 0, 1, 4
260     SBUTTERFLY qdq, 2, 3, 4
261     mova   m4, [r1+64]
262     mova   m6, [r1+80]
263     mova   m5, [r1+96]
264     mova   m7, [r1+112]
265     SBUTTERFLY qdq, 4, 5, 8
266     SBUTTERFLY qdq, 6, 7, 8
267     IDCT4_1D w,0,1,2,3,8,10
268     TRANSPOSE2x4x4W 0,1,2,3,8
269     IDCT4_1D w,4,5,6,7,8,10
270     TRANSPOSE2x4x4W 4,5,6,7,8
271     paddw m0, [pw_32]
272     IDCT4_1D w,0,1,2,3,8,10
273     paddw m4, [pw_32]
274     IDCT4_1D w,4,5,6,7,8,10
275     DIFFx2 m0, m1, m8, m9, [r0-4*FDEC_STRIDE], [r0-3*FDEC_STRIDE]
276     DIFFx2 m2, m3, m8, m9, [r0-2*FDEC_STRIDE], [r0-1*FDEC_STRIDE]
277     DIFFx2 m4, m5, m8, m9, [r0+0*FDEC_STRIDE], [r0+1*FDEC_STRIDE]
278     DIFFx2 m6, m7, m8, m9, [r0+2*FDEC_STRIDE], [r0+3*FDEC_STRIDE]
279     STORE_IDCT m1, m3, m5, m7
280     ret
281 %endif ; !HIGH_BIT_DEPTH