]> git.sesse.net Git - x264/blob - common/x86/dct-64.asm
merge x86_32 and x86_64 asm, with macros to abstract calling convention and register...
[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 ;*          Min Chen <chenm001.163.com> (converted to nasm)
8 ;*          Loren Merritt <lorenm@u.washington.edu> (dct8)
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., 59 Temple Place - Suite 330, 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 %macro LOAD_DIFF_8P 5
33     movq        %1, %4
34     punpcklbw   %1, %3
35     movq        %2, %5
36     punpcklbw   %2, %3
37     psubw       %1, %2
38 %endmacro
39
40 %macro SUMSUB_BA 2
41     paddw   %1, %2
42     paddw   %2, %2
43     psubw   %2, %1
44 %endmacro
45
46 %macro SBUTTERFLY 5
47     mov%1       %5, %3
48     punpckl%2   %3, %4
49     punpckh%2   %5, %4
50 %endmacro
51
52 ;-----------------------------------------------------------------------------
53 ; input ABCDEFGH output AFHDTECB 
54 ;-----------------------------------------------------------------------------
55 %macro TRANSPOSE8x8W 9
56     SBUTTERFLY dqa, wd, %1, %2, %9
57     SBUTTERFLY dqa, wd, %3, %4, %2
58     SBUTTERFLY dqa, wd, %5, %6, %4
59     SBUTTERFLY dqa, wd, %7, %8, %6
60     SBUTTERFLY dqa, dq, %1, %3, %8
61     SBUTTERFLY dqa, dq, %9, %2, %3
62     SBUTTERFLY dqa, dq, %5, %7, %2
63     SBUTTERFLY dqa, dq, %4, %6, %7
64     SBUTTERFLY dqa, qdq, %1, %5, %6
65     SBUTTERFLY dqa, qdq, %9, %4, %5
66     SBUTTERFLY dqa, qdq, %8, %2, %4
67     SBUTTERFLY dqa, qdq, %3, %7, %2
68 %endmacro
69
70 %macro STORE_DIFF_8P 4
71     psraw       %1, 6
72     movq        %2, %4
73     punpcklbw   %2, %3
74     paddsw      %1, %2
75     packuswb    %1, %1  
76     movq        %4, %1
77 %endmacro
78
79 SECTION .text
80
81 ; in:  ABCDEFGH
82 ; out: FBCGEDHI
83 %macro DCT8_1D 10
84     SUMSUB_BA  %8, %1 ; %8=s07, %1=d07
85     SUMSUB_BA  %7, %2 ; %7=s16, %2=d16
86     SUMSUB_BA  %6, %3 ; %6=s25, %3=d25
87     SUMSUB_BA  %5, %4 ; %5=s34, %4=d34
88
89     SUMSUB_BA  %5, %8 ; %5=a0, %8=a2
90     SUMSUB_BA  %6, %7 ; %6=a1, %7=a3
91
92     movdqa  %9, %1
93     psraw   %9, 1
94     paddw   %9, %1
95     paddw   %9, %2
96     paddw   %9, %3 ; %9=a4
97
98     movdqa  %10, %4
99     psraw   %10, 1
100     paddw   %10, %4
101     paddw   %10, %2
102     psubw   %10, %3 ; %10=a7
103
104     SUMSUB_BA  %4, %1
105     psubw   %1, %3
106     psubw   %4, %2
107     psraw   %3, 1
108     psraw   %2, 1
109     psubw   %1, %3 ; %1=a5
110     psubw   %4, %2 ; %4=a6
111
112     SUMSUB_BA  %6, %5 ; %6=b0, %5=b4
113
114     movdqa  %2, %10
115     psraw   %2, 2
116     paddw   %2, %9 ; %2=b1
117     psraw   %9, 2
118     psubw   %9, %10 ; %9=b7
119
120     movdqa  %3, %7
121     psraw   %3, 1
122     paddw   %3, %8 ; %3=b2
123     psraw   %8, 1
124     psubw   %8, %7 ; %8=b6
125
126     movdqa  %7, %4
127     psraw   %7, 2
128     paddw   %7, %1 ; %7=b3
129     psraw   %1, 2
130     psubw   %4, %1 ; %4=b5
131 %endmacro
132
133 ;-----------------------------------------------------------------------------
134 ; void x264_sub8x8_dct8_sse2( int16_t dct[8][8], uint8_t *pix1, uint8_t *pix2 )
135 ;-----------------------------------------------------------------------------
136 cglobal x264_sub8x8_dct8_sse2
137     pxor  xmm9, xmm9
138     LOAD_DIFF_8P  xmm0, xmm8, xmm9, [parm2q+0*FENC_STRIDE], [parm3q+0*FDEC_STRIDE]
139     LOAD_DIFF_8P  xmm1, xmm8, xmm9, [parm2q+1*FENC_STRIDE], [parm3q+1*FDEC_STRIDE]
140     LOAD_DIFF_8P  xmm2, xmm8, xmm9, [parm2q+2*FENC_STRIDE], [parm3q+2*FDEC_STRIDE]
141     LOAD_DIFF_8P  xmm3, xmm8, xmm9, [parm2q+3*FENC_STRIDE], [parm3q+3*FDEC_STRIDE]
142     LOAD_DIFF_8P  xmm4, xmm8, xmm9, [parm2q+4*FENC_STRIDE], [parm3q+4*FDEC_STRIDE]
143     LOAD_DIFF_8P  xmm5, xmm8, xmm9, [parm2q+5*FENC_STRIDE], [parm3q+5*FDEC_STRIDE]
144     LOAD_DIFF_8P  xmm6, xmm8, xmm9, [parm2q+6*FENC_STRIDE], [parm3q+6*FDEC_STRIDE]
145     LOAD_DIFF_8P  xmm7, xmm8, xmm9, [parm2q+7*FENC_STRIDE], [parm3q+7*FDEC_STRIDE]
146
147     DCT8_1D       xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9
148     TRANSPOSE8x8W xmm5, xmm1, xmm2, xmm6, xmm4, xmm3, xmm7, xmm8, xmm0
149     DCT8_1D       xmm5, xmm3, xmm8, xmm6, xmm0, xmm4, xmm2, xmm1, xmm7, xmm9
150
151     movdqa  [parm1q+0x00], xmm4
152     movdqa  [parm1q+0x10], xmm3
153     movdqa  [parm1q+0x20], xmm8
154     movdqa  [parm1q+0x30], xmm2
155     movdqa  [parm1q+0x40], xmm0
156     movdqa  [parm1q+0x50], xmm6
157     movdqa  [parm1q+0x60], xmm1
158     movdqa  [parm1q+0x70], xmm7
159     ret
160
161
162 ; in:  ABCDEFGH
163 ; out: IBHDEACG
164 %macro IDCT8_1D 10
165     SUMSUB_BA  %5, %1 ; %5=a0, %1=a2
166     movdqa  %10, %3
167     psraw   %3, 1
168     psubw   %3, %7 ; %3=a4
169     psraw   %7, 1
170     paddw   %7, %10 ; %7=a6
171
172     movdqa  %9, %2
173     psraw   %9, 1
174     paddw   %9, %2
175     paddw   %9, %4
176     paddw   %9, %6 ; %9=a7
177     
178     movdqa  %10, %6
179     psraw   %10, 1
180     paddw   %10, %6
181     paddw   %10, %8
182     psubw   %10, %2 ; %10=a5
183
184     psubw   %2, %4
185     psubw   %6, %4
186     paddw   %2, %8
187     psubw   %6, %8
188     psraw   %4, 1
189     psraw   %8, 1
190     psubw   %2, %4 ; %2=a3
191     psubw   %6, %8 ; %6=a1
192
193     SUMSUB_BA %7, %5 ; %7=b0, %5=b6
194     SUMSUB_BA %3, %1 ; %3=b2, %1=b4
195
196     movdqa  %4, %9
197     psraw   %4, 2
198     paddw   %4, %6 ; %4=b1
199     psraw   %6, 2
200     psubw   %9, %6 ; %9=b7
201
202     movdqa  %8, %10
203     psraw   %8, 2
204     paddw   %8, %2 ; %8=b3
205     psraw   %2, 2
206     psubw   %2, %10 ; %2=b5
207
208     SUMSUB_BA %9, %7 ; %9=c0, %7=c7
209     SUMSUB_BA %2, %3 ; %2=c1, %3=c6
210     SUMSUB_BA %8, %1 ; %8=c2, %1=c5
211     SUMSUB_BA %4, %5 ; %4=c3, %5=c4
212 %endmacro
213
214 ;-----------------------------------------------------------------------------
215 ; void x264_add8x8_idct8_sse2( uint8_t *p_dst, int16_t dct[8][8] )
216 ;-----------------------------------------------------------------------------
217 cglobal x264_add8x8_idct8_sse2
218     movdqa  xmm0, [parm2q+0x00]
219     movdqa  xmm1, [parm2q+0x10]
220     movdqa  xmm2, [parm2q+0x20]
221     movdqa  xmm3, [parm2q+0x30]
222     movdqa  xmm4, [parm2q+0x40]
223     movdqa  xmm5, [parm2q+0x50]
224     movdqa  xmm6, [parm2q+0x60]
225     movdqa  xmm7, [parm2q+0x70]
226
227     IDCT8_1D      xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm9, xmm8
228     TRANSPOSE8x8W xmm9, xmm1, xmm7, xmm3, xmm4, xmm0, xmm2, xmm6, xmm5
229     paddw         xmm9, [pw_32 GLOBAL] ; rounding for the >>6 at the end
230     IDCT8_1D      xmm9, xmm0, xmm6, xmm3, xmm5, xmm4, xmm7, xmm1, xmm8, xmm2
231  
232     pxor  xmm15, xmm15
233     STORE_DIFF_8P xmm8, xmm14, xmm15, [parm1q+0*FDEC_STRIDE]
234     STORE_DIFF_8P xmm0, xmm14, xmm15, [parm1q+1*FDEC_STRIDE]
235     STORE_DIFF_8P xmm1, xmm14, xmm15, [parm1q+2*FDEC_STRIDE]
236     STORE_DIFF_8P xmm3, xmm14, xmm15, [parm1q+3*FDEC_STRIDE]
237     STORE_DIFF_8P xmm5, xmm14, xmm15, [parm1q+4*FDEC_STRIDE]
238     STORE_DIFF_8P xmm9, xmm14, xmm15, [parm1q+5*FDEC_STRIDE]
239     STORE_DIFF_8P xmm6, xmm14, xmm15, [parm1q+6*FDEC_STRIDE]
240     STORE_DIFF_8P xmm7, xmm14, xmm15, [parm1q+7*FDEC_STRIDE]
241     ret
242
243