]> git.sesse.net Git - x264/blob - common/x86/dct-64.asm
Fix all aliasing violations
[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: 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
26 %include "x86inc.asm"
27 %include "x86util.asm"
28
29 SECTION_RODATA
30 pw_32: times 8 dw 32
31 hsub_mul: times 8 db 1, -1
32
33 SECTION .text
34 INIT_XMM
35
36 %macro DCT8_1D 10
37     SUMSUB_BA  m%5, m%4 ; %5=s34, %4=d34
38     SUMSUB_BA  m%6, m%3 ; %6=s25, %3=d25
39     SUMSUB_BA  m%7, m%2 ; %7=s16, %2=d16
40     SUMSUB_BA  m%8, m%1 ; %8=s07, %1=d07
41
42     SUMSUB_BA  m%6, m%7, m%10 ; %6=a1, %7=a3
43     SUMSUB_BA  m%5, m%8, m%10 ; %5=a0, %8=a2
44
45     movdqa  m%9, m%1
46     psraw   m%9, 1
47     paddw   m%9, m%1
48     paddw   m%9, m%2
49     paddw   m%9, m%3 ; %9=a4
50
51     movdqa  m%10, m%4
52     psraw   m%10, 1
53     paddw   m%10, m%4
54     paddw   m%10, m%2
55     psubw   m%10, m%3 ; %10=a7
56
57     SUMSUB_BA  m%4, m%1
58     psubw   m%1, m%3
59     psubw   m%4, m%2
60     psraw   m%3, 1
61     psraw   m%2, 1
62     psubw   m%1, m%3 ; %1=a5
63     psubw   m%4, m%2 ; %4=a6
64
65     movdqa  m%2, m%10
66     psraw   m%2, 2
67     paddw   m%2, m%9 ; %2=b1
68     psraw   m%9, 2
69     psubw   m%9, m%10 ; %9=b7
70
71     SUMSUB_BA  m%6, m%5, m%10 ; %6=b0, %5=b4
72
73     movdqa  m%3, m%7
74     psraw   m%3, 1
75     paddw   m%3, m%8 ; %3=b2
76     psraw   m%8, 1
77     psubw   m%8, m%7 ; %8=b6
78
79     movdqa  m%7, m%4
80     psraw   m%7, 2
81     paddw   m%7, m%1 ; %7=b3
82     psraw   m%1, 2
83     psubw   m%4, m%1 ; %4=b5
84
85     SWAP %1, %6, %4, %7, %8, %9
86 %endmacro
87
88 %macro IDCT8_1D 10
89     SUMSUB_BA  m%5, m%1, m%9 ; %5=a0, %1=a2
90
91     movdqa  m%9, m%2
92     psraw   m%9, 1
93     paddw   m%9, m%2
94     paddw   m%9, m%4
95     paddw   m%9, m%6 ; %9=a7
96
97     movdqa  m%10, m%3
98     psraw   m%3, 1
99     psubw   m%3, m%7 ; %3=a4
100     psraw   m%7, 1
101     paddw   m%7, m%10 ; %7=a6
102
103     movdqa  m%10, m%6
104     psraw   m%10, 1
105     paddw   m%10, m%6
106     paddw   m%10, m%8
107     psubw   m%10, m%2 ; %10=a5
108
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 ; %2=a3
116     psubw   m%6, m%8 ; %6=a1
117
118     movdqa  m%4, m%9
119     psraw   m%4, 2
120     paddw   m%4, m%6 ; %4=b1
121     psraw   m%6, 2
122     psubw   m%9, m%6 ; %9=b7
123
124     SUMSUB_BA m%7, m%5, m%6 ; %7=b0, %5=b6
125     SUMSUB_BA m%3, m%1, m%6; %3=b2, %1=b4
126
127     movdqa  m%8, m%10
128     psraw   m%8, 2
129     paddw   m%8, m%2 ; %8=b3
130     psraw   m%2, 2
131     psubw   m%2, m%10 ; %2=b5
132
133     SUMSUB_BA m%9, m%7, m%6 ; %9=c0, %7=c7
134     SUMSUB_BA m%2, m%3, m%6 ; %2=c1, %3=c6
135     SUMSUB_BA m%8, m%1, m%6 ; %8=c2, %1=c5
136     SUMSUB_BA m%4, m%5, m%6 ; %4=c3, %5=c4
137
138     SWAP %1, %9, %6
139     SWAP %3, %8, %7
140 %endmacro
141
142 %macro DCT_SUB8 1
143 cglobal x264_sub8x8_dct_%1, 3,3,11
144     add r2, 4*FDEC_STRIDE
145 %ifnidn %1, sse2
146     mova m7, [hsub_mul GLOBAL]
147 %endif
148 %ifdef WIN64
149     call .skip_prologue
150     RET
151 %endif
152 global x264_sub8x8_dct_%1.skip_prologue
153 .skip_prologue:
154     SWAP 7, 9
155     LOAD_DIFF8x4 0, 1, 2, 3, 8, 9, r1, r2-4*FDEC_STRIDE
156     LOAD_DIFF8x4 4, 5, 6, 7, 8, 9, r1, r2-4*FDEC_STRIDE
157     DCT4_1D 0, 1, 2, 3, 8
158     TRANSPOSE2x4x4W 0, 1, 2, 3, 8
159     DCT4_1D 4, 5, 6, 7, 8
160     TRANSPOSE2x4x4W 4, 5, 6, 7, 8
161     DCT4_1D 0, 1, 2, 3, 8
162     STORE_DCT 0, 1, 2, 3, r0, 0
163     DCT4_1D 4, 5, 6, 7, 8
164     STORE_DCT 4, 5, 6, 7, r0, 64
165     ret
166
167 ;-----------------------------------------------------------------------------
168 ; void x264_sub8x8_dct8_sse2( int16_t dct[8][8], uint8_t *pix1, uint8_t *pix2 )
169 ;-----------------------------------------------------------------------------
170 cglobal x264_sub8x8_dct8_%1, 3,3,11
171     add r2, 4*FDEC_STRIDE
172 %ifnidn %1, sse2
173     mova m7, [hsub_mul GLOBAL]
174 %endif
175 %ifdef WIN64
176     call .skip_prologue
177     RET
178 %endif
179 global x264_sub8x8_dct8_%1.skip_prologue
180 .skip_prologue:
181     SWAP 7, 10
182     LOAD_DIFF8x4  0, 1, 2, 3, 4, 10, r1, r2-4*FDEC_STRIDE
183     LOAD_DIFF8x4  4, 5, 6, 7, 8, 10, r1, r2-4*FDEC_STRIDE
184     DCT8_1D       0,1,2,3,4,5,6,7,8,9
185     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,8
186     DCT8_1D       0,1,2,3,4,5,6,7,8,9
187     movdqa  [r0+0x00], m0
188     movdqa  [r0+0x10], m1
189     movdqa  [r0+0x20], m2
190     movdqa  [r0+0x30], m3
191     movdqa  [r0+0x40], m4
192     movdqa  [r0+0x50], m5
193     movdqa  [r0+0x60], m6
194     movdqa  [r0+0x70], m7
195     ret
196 %endmacro
197
198 %define LOAD_DIFF8x4 LOAD_DIFF8x4_SSE2
199 %define movdqa movaps
200 %define punpcklqdq movlhps
201 DCT_SUB8 sse2
202 %undef movdqa
203 %undef punpcklqdq
204 %define LOAD_DIFF8x4 LOAD_DIFF8x4_SSSE3
205 DCT_SUB8 ssse3
206
207 ;-----------------------------------------------------------------------------
208 ; void x264_add8x8_idct8_sse2( uint8_t *p_dst, int16_t dct[8][8] )
209 ;-----------------------------------------------------------------------------
210 cglobal x264_add8x8_idct8_sse2, 2,2,11
211     add r0, 4*FDEC_STRIDE
212     pxor m7, m7
213 %ifdef WIN64
214     call .skip_prologue
215     RET
216 %endif
217 global x264_add8x8_idct8_sse2.skip_prologue
218 .skip_prologue:
219     SWAP 7, 9
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     IDCT8_1D      0,1,2,3,4,5,6,7,8,10
229     TRANSPOSE8x8W 0,1,2,3,4,5,6,7,8
230     paddw         m0, [pw_32 GLOBAL] ; rounding for the >>6 at the end
231     IDCT8_1D      0,1,2,3,4,5,6,7,8,10
232     DIFFx2 m0, m1, m8, m9, [r0-4*FDEC_STRIDE], [r0-3*FDEC_STRIDE]
233     DIFFx2 m2, m3, m8, m9, [r0-2*FDEC_STRIDE], [r0-1*FDEC_STRIDE]
234     DIFFx2 m4, m5, m8, m9, [r0+0*FDEC_STRIDE], [r0+1*FDEC_STRIDE]
235     DIFFx2 m6, m7, m8, m9, [r0+2*FDEC_STRIDE], [r0+3*FDEC_STRIDE]
236     STORE_IDCT m1, m3, m5, m7
237     ret
238
239 ;-----------------------------------------------------------------------------
240 ; void x264_add8x8_idct_sse2( uint8_t *pix, int16_t dct[4][4][4] )
241 ;-----------------------------------------------------------------------------
242 cglobal x264_add8x8_idct_sse2, 2,2,11
243     add  r0, 4*FDEC_STRIDE
244     pxor m7, m7
245 %ifdef WIN64
246     call .skip_prologue
247     RET
248 %endif
249 global x264_add8x8_idct_sse2.skip_prologue
250 .skip_prologue:
251     SWAP 7, 9
252     mova   m0, [r1+ 0]
253     mova   m2, [r1+16]
254     mova   m1, [r1+32]
255     mova   m3, [r1+48]
256     SBUTTERFLY qdq, 0, 1, 4
257     SBUTTERFLY qdq, 2, 3, 4
258     mova   m4, [r1+64]
259     mova   m6, [r1+80]
260     mova   m5, [r1+96]
261     mova   m7, [r1+112]
262     SBUTTERFLY qdq, 4, 5, 8
263     SBUTTERFLY qdq, 6, 7, 8
264     IDCT4_1D 0,1,2,3,8,10
265     TRANSPOSE2x4x4W 0,1,2,3,8
266     IDCT4_1D 4,5,6,7,8,10
267     TRANSPOSE2x4x4W 4,5,6,7,8
268     paddw m0, [pw_32 GLOBAL]
269     IDCT4_1D 0,1,2,3,8,10
270     paddw m4, [pw_32 GLOBAL]
271     IDCT4_1D 4,5,6,7,8,10
272     DIFFx2 m0, m1, m8, m9, [r0-4*FDEC_STRIDE], [r0-3*FDEC_STRIDE]
273     DIFFx2 m2, m3, m8, m9, [r0-2*FDEC_STRIDE], [r0-1*FDEC_STRIDE]
274     DIFFx2 m4, m5, m8, m9, [r0+0*FDEC_STRIDE], [r0+1*FDEC_STRIDE]
275     DIFFx2 m6, m7, m8, m9, [r0+2*FDEC_STRIDE], [r0+3*FDEC_STRIDE]
276     STORE_IDCT m1, m3, m5, m7
277     ret