]> git.sesse.net Git - x264/blob - common/x86/dct-64.asm
Update file headers throughout x264
[x264] / common / x86 / dct-64.asm
1 ;*****************************************************************************
2 ;* dct-64.asm: h264 encoder library
3 ;*****************************************************************************
4 ;* Copyright (C) 2003-2008 x264 project
5 ;*
6 ;* Authors: Laurent Aimar <fenrir@via.ecp.fr> (initial version)
7 ;*          Loren Merritt <lorenm@u.washington.edu> (dct8, misc)
8 ;*          Min Chen <chenm001.163.com> (converted to nasm)
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
27 SECTION_RODATA
28 pw_32: times 8 dw 32
29
30 SECTION .text
31
32 INIT_XMM
33
34 %macro LOAD_DIFF_8P 5
35     movq        %1, %4
36     punpcklbw   %1, %3
37     movq        %2, %5
38     punpcklbw   %2, %3
39     psubw       %1, %2
40 %endmacro
41
42 %macro SUMSUB_BA 2
43     paddw   %1, %2
44     paddw   %2, %2
45     psubw   %2, %1
46 %endmacro
47
48 %macro SBUTTERFLY 4
49     mova      m%4, m%2
50     punpckl%1 m%2, m%3
51     punpckh%1 m%4, m%3
52     SWAP %3, %4
53 %endmacro
54
55 %macro TRANSPOSE8x8W 9
56     SBUTTERFLY wd,  %1, %2, %9
57     SBUTTERFLY wd,  %3, %4, %9
58     SBUTTERFLY wd,  %5, %6, %9
59     SBUTTERFLY wd,  %7, %8, %9
60     SBUTTERFLY dq,  %1, %3, %9
61     SBUTTERFLY dq,  %2, %4, %9
62     SBUTTERFLY dq,  %5, %7, %9
63     SBUTTERFLY dq,  %6, %8, %9
64     SBUTTERFLY qdq, %1, %5, %9
65     SBUTTERFLY qdq, %2, %6, %9
66     SBUTTERFLY qdq, %3, %7, %9
67     SBUTTERFLY qdq, %4, %8, %9
68     SWAP %2, %5
69     SWAP %4, %7
70 %endmacro
71
72 %macro STORE_DIFF_8P 4
73     psraw       %1, 6
74     movq        %2, %4
75     punpcklbw   %2, %3
76     paddsw      %1, %2
77     packuswb    %1, %1  
78     movq        %4, %1
79 %endmacro
80
81 SECTION .text
82
83 %macro DCT8_1D 10
84     SUMSUB_BA  m%8, m%1 ; %8=s07, %1=d07
85     SUMSUB_BA  m%7, m%2 ; %7=s16, %2=d16
86     SUMSUB_BA  m%6, m%3 ; %6=s25, %3=d25
87     SUMSUB_BA  m%5, m%4 ; %5=s34, %4=d34
88
89     SUMSUB_BA  m%5, m%8 ; %5=a0, %8=a2
90     SUMSUB_BA  m%6, m%7 ; %6=a1, %7=a3
91
92     movdqa  m%9, m%1
93     psraw   m%9, 1
94     paddw   m%9, m%1
95     paddw   m%9, m%2
96     paddw   m%9, m%3 ; %9=a4
97
98     movdqa  m%10, m%4
99     psraw   m%10, 1
100     paddw   m%10, m%4
101     paddw   m%10, m%2
102     psubw   m%10, m%3 ; %10=a7
103
104     SUMSUB_BA  m%4, m%1
105     psubw   m%1, m%3
106     psubw   m%4, m%2
107     psraw   m%3, 1
108     psraw   m%2, 1
109     psubw   m%1, m%3 ; %1=a5
110     psubw   m%4, m%2 ; %4=a6
111
112     SUMSUB_BA  m%6, m%5 ; %6=b0, %5=b4
113
114     movdqa  m%2, m%10
115     psraw   m%2, 2
116     paddw   m%2, m%9 ; %2=b1
117     psraw   m%9, 2
118     psubw   m%9, m%10 ; %9=b7
119
120     movdqa  m%3, m%7
121     psraw   m%3, 1
122     paddw   m%3, m%8 ; %3=b2
123     psraw   m%8, 1
124     psubw   m%8, m%7 ; %8=b6
125
126     movdqa  m%7, m%4
127     psraw   m%7, 2
128     paddw   m%7, m%1 ; %7=b3
129     psraw   m%1, 2
130     psubw   m%4, m%1 ; %4=b5
131
132     SWAP %1, %6, %4, %7, %8, %9
133 %endmacro
134
135 ;-----------------------------------------------------------------------------
136 ; void x264_sub8x8_dct8_sse2( int16_t dct[8][8], uint8_t *pix1, uint8_t *pix2 )
137 ;-----------------------------------------------------------------------------
138 cglobal x264_sub8x8_dct8_sse2
139     LOAD_DIFF_8P  m0, m8, m9, [r1+0*FENC_STRIDE], [r2+0*FDEC_STRIDE]
140     LOAD_DIFF_8P  m1, m8, m9, [r1+1*FENC_STRIDE], [r2+1*FDEC_STRIDE]
141     LOAD_DIFF_8P  m2, m8, m9, [r1+2*FENC_STRIDE], [r2+2*FDEC_STRIDE]
142     LOAD_DIFF_8P  m3, m8, m9, [r1+3*FENC_STRIDE], [r2+3*FDEC_STRIDE]
143     LOAD_DIFF_8P  m4, m8, m9, [r1+4*FENC_STRIDE], [r2+4*FDEC_STRIDE]
144     LOAD_DIFF_8P  m5, m8, m9, [r1+5*FENC_STRIDE], [r2+5*FDEC_STRIDE]
145     LOAD_DIFF_8P  m6, m8, m9, [r1+6*FENC_STRIDE], [r2+6*FDEC_STRIDE]
146     LOAD_DIFF_8P  m7, m8, m9, [r1+7*FENC_STRIDE], [r2+7*FDEC_STRIDE]
147
148     DCT8_1D       0,1,2,3,4,5,6,7,8,9
149     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,8
150     DCT8_1D       0,1,2,3,4,5,6,7,8,9
151
152     movdqa  [r0+0x00], m0
153     movdqa  [r0+0x10], m1
154     movdqa  [r0+0x20], m2
155     movdqa  [r0+0x30], m3
156     movdqa  [r0+0x40], m4
157     movdqa  [r0+0x50], m5
158     movdqa  [r0+0x60], m6
159     movdqa  [r0+0x70], m7
160     ret
161
162
163 %macro IDCT8_1D 10
164     SUMSUB_BA  m%5, m%1 ; %5=a0, %1=a2
165     movdqa  m%10, m%3
166     psraw   m%3, 1
167     psubw   m%3, m%7 ; %3=a4
168     psraw   m%7, 1
169     paddw   m%7, m%10 ; %7=a6
170
171     movdqa  m%9, m%2
172     psraw   m%9, 1
173     paddw   m%9, m%2
174     paddw   m%9, m%4
175     paddw   m%9, m%6 ; %9=a7
176     
177     movdqa  m%10, m%6
178     psraw   m%10, 1
179     paddw   m%10, m%6
180     paddw   m%10, m%8
181     psubw   m%10, m%2 ; %10=a5
182
183     psubw   m%2, m%4
184     psubw   m%6, m%4
185     paddw   m%2, m%8
186     psubw   m%6, m%8
187     psraw   m%4, 1
188     psraw   m%8, 1
189     psubw   m%2, m%4 ; %2=a3
190     psubw   m%6, m%8 ; %6=a1
191
192     SUMSUB_BA m%7, m%5 ; %7=b0, %5=b6
193     SUMSUB_BA m%3, m%1 ; %3=b2, %1=b4
194
195     movdqa  m%4, m%9
196     psraw   m%4, 2
197     paddw   m%4, m%6 ; %4=b1
198     psraw   m%6, 2
199     psubw   m%9, m%6 ; %9=b7
200
201     movdqa  m%8, m%10
202     psraw   m%8, 2
203     paddw   m%8, m%2 ; %8=b3
204     psraw   m%2, 2
205     psubw   m%2, m%10 ; %2=b5
206
207     SUMSUB_BA m%9, m%7 ; %9=c0, %7=c7
208     SUMSUB_BA m%2, m%3 ; %2=c1, %3=c6
209     SUMSUB_BA m%8, m%1 ; %8=c2, %1=c5
210     SUMSUB_BA m%4, m%5 ; %4=c3, %5=c4
211
212     SWAP %1, %9, %6
213     SWAP %3, %8, %7
214 %endmacro
215
216 ;-----------------------------------------------------------------------------
217 ; void x264_add8x8_idct8_sse2( uint8_t *p_dst, int16_t dct[8][8] )
218 ;-----------------------------------------------------------------------------
219 cglobal x264_add8x8_idct8_sse2
220     movdqa  m0, [r1+0x00]
221     movdqa  m1, [r1+0x10]
222     movdqa  m2, [r1+0x20]
223     movdqa  m3, [r1+0x30]
224     movdqa  m4, [r1+0x40]
225     movdqa  m5, [r1+0x50]
226     movdqa  m6, [r1+0x60]
227     movdqa  m7, [r1+0x70]
228
229     IDCT8_1D      0,1,2,3,4,5,6,7,8,9
230     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,8
231     paddw         m0, [pw_32 GLOBAL] ; rounding for the >>6 at the end
232     IDCT8_1D      0,1,2,3,4,5,6,7,8,9
233  
234     pxor  m9, m9
235     STORE_DIFF_8P m0, m8, m9, [r0+0*FDEC_STRIDE]
236     STORE_DIFF_8P m1, m8, m9, [r0+1*FDEC_STRIDE]
237     STORE_DIFF_8P m2, m8, m9, [r0+2*FDEC_STRIDE]
238     STORE_DIFF_8P m3, m8, m9, [r0+3*FDEC_STRIDE]
239     STORE_DIFF_8P m4, m8, m9, [r0+4*FDEC_STRIDE]
240     STORE_DIFF_8P m5, m8, m9, [r0+5*FDEC_STRIDE]
241     STORE_DIFF_8P m6, m8, m9, [r0+6*FDEC_STRIDE]
242     STORE_DIFF_8P m7, m8, m9, [r0+7*FDEC_STRIDE]
243     ret
244
245