[cvs] / xvidcore / src / dct / x86_asm / idct_3dne.asm Repository:
ViewVC logotype

Annotation of /xvidcore/src/dct/x86_asm/idct_3dne.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.6 - (view) (download)

1 : edgomez 1.3 ;/****************************************************************************
2 :     ; *
3 :     ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - MMX and XMM forward discrete cosine transform -
5 :     ; *
6 :     ; * Copyright(C) 2001 Peter Ross <pross@xvid.org>
7 :     ; * 2002 Jaan Kalda
8 :     ; *
9 :     ; * This program is free software; you can redistribute it and/or modify it
10 :     ; * under the terms of the GNU General Public License as published by
11 :     ; * the Free Software Foundation; either version 2 of the License, or
12 :     ; * (at your option) any later version.
13 :     ; *
14 :     ; * This program is distributed in the hope that it will be useful,
15 :     ; * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 :     ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 :     ; * GNU General Public License for more details.
18 :     ; *
19 :     ; * You should have received a copy of the GNU General Public License
20 :     ; * along with this program; if not, write to the Free Software
21 :     ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 :     ; *
23 :     ; * $Id$
24 :     ; *
25 :     ; ***************************************************************************/
26 :    
27 :     ; ****************************************************************************
28 :     ;
29 : edgomez 1.2 ; Originally provided by Intel at AP-922
30 :     ; http://developer.intel.com/vtune/cbts/strmsimd/922down.htm
31 :     ; (See more app notes at http://developer.intel.com/vtune/cbts/strmsimd/appnotes.htm)
32 :     ; but in a limited edition.
33 :     ; New macro implements a column part for precise iDCT
34 : edgomez 1.3 ; The routine precision now satisfies IEEE standard 1180-1990.
35 : edgomez 1.2 ;
36 : edgomez 1.3 ; Copyright(C) 2000-2001 Peter Gubanov <peter@elecard.net.ru>
37 :     ; Rounding trick Copyright(C) 2000 Michel Lespinasse <walken@zoy.org>
38 : edgomez 1.2 ;
39 :     ; http://www.elecard.com/peter/idct.html
40 :     ; http://www.linuxvideo.org/mpeg2dec/
41 :     ;
42 : edgomez 1.3 ; ***************************************************************************/
43 : edgomez 1.2 ;
44 :     ; These examples contain code fragments for first stage iDCT 8x8
45 :     ; (for rows) and first stage DCT 8x8 (for columns)
46 :     ;
47 : edgomez 1.3
48 :     ; ***************************************************************************/
49 :     ; this 3dne function is compatible with iSSE, but is optimized specifically for
50 :     ; K7 pipelines (ca 5% gain), for implementation details see the idct_mmx.asm
51 :     ; file
52 : edgomez 1.2 ;
53 : edgomez 1.3 ; ----------------------------------------------------------------------------
54 :     ; Athlon optimizations contributed by Jaan Kalda
55 :     ;-----------------------------------------------------------------------------
56 : edgomez 1.2
57 : edgomez 1.3 BITS 32
58 : edgomez 1.2
59 : edgomez 1.3 ;=============================================================================
60 :     ; Macros and other preprocessor constants
61 :     ;=============================================================================
62 : edgomez 1.2
63 : edgomez 1.3 %macro cglobal 1
64 : edgomez 1.2 %ifdef PREFIX
65 : edgomez 1.5 %ifdef MARK_FUNCS
66 : edgomez 1.6 global _%1:function %1.endfunc-%1
67 :     %define %1 _%1:function %1.endfunc-%1
68 : edgomez 1.5 %else
69 :     global _%1
70 :     %define %1 _%1
71 :     %endif
72 : edgomez 1.2 %else
73 : edgomez 1.5 %ifdef MARK_FUNCS
74 : edgomez 1.6 global %1:function %1.endfunc-%1
75 : edgomez 1.5 %else
76 :     global %1
77 :     %endif
78 : edgomez 1.2 %endif
79 :     %endmacro
80 :    
81 : edgomez 1.3 %define BITS_INV_ACC 5 ; 4 or 5 for IEEE
82 : edgomez 1.2 %define SHIFT_INV_ROW 16 - BITS_INV_ACC
83 :     %define SHIFT_INV_COL 1 + BITS_INV_ACC
84 :     %define RND_INV_ROW 1024 * (6 - BITS_INV_ACC) ; 1 << (SHIFT_INV_ROW-1)
85 :     %define RND_INV_COL 16 * (BITS_INV_ACC - 3) ; 1 << (SHIFT_INV_COL-1)
86 : edgomez 1.3 %define RND_INV_CORR RND_INV_COL - 1 ; correction -1.0 and round
87 : edgomez 1.2
88 : edgomez 1.3 %define BITS_FRW_ACC 3 ; 2 or 3 for accuracy
89 : edgomez 1.2 %define SHIFT_FRW_COL BITS_FRW_ACC
90 :     %define SHIFT_FRW_ROW BITS_FRW_ACC + 17
91 : edgomez 1.3 %define RND_FRW_ROW 262144*(BITS_FRW_ACC - 1) ; 1 << (SHIFT_FRW_ROW-1)
92 :    
93 :     ;=============================================================================
94 :     ; Local Data (Read Only)
95 :     ;=============================================================================
96 : edgomez 1.2
97 :     %ifdef FORMAT_COFF
98 : edgomez 1.4 SECTION .rodata
99 : edgomez 1.2 %else
100 : edgomez 1.4 SECTION .rodata align=16
101 : edgomez 1.2 %endif
102 :    
103 : edgomez 1.3 ;-----------------------------------------------------------------------------
104 :     ; Various memory constants (trigonometric values or rounding values)
105 :     ;-----------------------------------------------------------------------------
106 : edgomez 1.2
107 : edgomez 1.3 ALIGN 16
108 :     one_corr:
109 :     dw 1, 1, 1, 1
110 :     round_inv_row:
111 :     dd RND_INV_ROW, RND_INV_ROW
112 :     round_inv_col:
113 :     dw RND_INV_COL, RND_INV_COL, RND_INV_COL, RND_INV_COL
114 :     round_inv_corr:
115 :     dw RND_INV_CORR, RND_INV_CORR, RND_INV_CORR, RND_INV_CORR
116 :     round_frw_row:
117 :     dd RND_FRW_ROW, RND_FRW_ROW
118 :     tg_1_16:
119 :     dw 13036, 13036, 13036, 13036 ; tg * (2<<16) + 0.5
120 :     tg_2_16:
121 :     dw 27146, 27146, 27146, 27146 ; tg * (2<<16) + 0.5
122 :     tg_3_16:
123 :     dw -21746, -21746, -21746, -21746 ; tg * (2<<16) + 0.5
124 :     cos_4_16:
125 :     dw -19195, -19195, -19195, -19195 ; cos * (2<<16) + 0.5
126 :     ocos_4_16:
127 :     dw 23170, 23170, 23170, 23170 ; cos * (2<<15) + 0.5
128 :     otg_3_16:
129 :     dw 21895, 21895, 21895, 21895 ; tg * (2<<16) + 0.5
130 : edgomez 1.2
131 :     %if SHIFT_INV_ROW == 12 ; assume SHIFT_INV_ROW == 12
132 : edgomez 1.3 rounder_0:
133 :     dd 65536, 65536
134 :     rounder_4:
135 :     dd 0, 0
136 :     rounder_1:
137 :     dd 7195, 7195
138 :     rounder_7
139 :     dd 1024, 1024
140 :     rounder_2:
141 :     dd 4520, 4520
142 :     rounder_6:
143 :     dd 1024, 1024
144 :     rounder_3:
145 :     dd 2407, 2407
146 :     rounder_5:
147 :     dd 240, 240
148 : edgomez 1.2
149 :     %elif SHIFT_INV_ROW == 11 ; assume SHIFT_INV_ROW == 11
150 : edgomez 1.3 rounder_0:
151 :     dd 65536, 65536
152 :     rounder_4:
153 :     dd 0, 0
154 :     rounder_1:
155 :     dd 3597, 3597
156 :     rounder_7:
157 :     dd 512, 512
158 :     rounder_2:
159 :     dd 2260, 2260
160 :     rounder_6:
161 :     dd 512, 512
162 :     rounder_3:
163 :     dd 1203, 1203
164 :     rounder_5:
165 :     dd 120, 120
166 : edgomez 1.2 %else
167 :    
168 : edgomez 1.3 %error invalid SHIFT_INV_ROW
169 : edgomez 1.2
170 :     %endif
171 :    
172 :     ;-----------------------------------------------------------------------------
173 : edgomez 1.3 ; Tables for xmm processors
174 : edgomez 1.2 ;-----------------------------------------------------------------------------
175 :    
176 :     ; %3 for rows 0,4 - constants are multiplied by cos_4_16
177 : edgomez 1.3 tab_i_04_xmm:
178 :     dw 16384, 21407, 16384, 8867 ; movq-> w05 w04 w01 w00
179 :     dw 16384, 8867, -16384, -21407 ; w07 w06 w03 w02
180 :     dw 16384, -8867, 16384, -21407 ; w13 w12 w09 w08
181 :     dw -16384, 21407, 16384, -8867 ; w15 w14 w11 w10
182 :     dw 22725, 19266, 19266, -4520 ; w21 w20 w17 w16
183 :     dw 12873, 4520, -22725, -12873 ; w23 w22 w19 w18
184 :     dw 12873, -22725, 4520, -12873 ; w29 w28 w25 w24
185 :     dw 4520, 19266, 19266, -22725 ; w31 w30 w27 w26
186 : edgomez 1.2
187 :     ; %3 for rows 1,7 - constants are multiplied by cos_1_16
188 : edgomez 1.3 tab_i_17_xmm:
189 :     dw 22725, 29692, 22725, 12299 ; movq-> w05 w04 w01 w00
190 :     dw 22725, 12299, -22725, -29692 ; w07 w06 w03 w02
191 :     dw 22725, -12299, 22725, -29692 ; w13 w12 w09 w08
192 :     dw -22725, 29692, 22725, -12299 ; w15 w14 w11 w10
193 :     dw 31521, 26722, 26722, -6270 ; w21 w20 w17 w16
194 :     dw 17855, 6270, -31521, -17855 ; w23 w22 w19 w18
195 :     dw 17855, -31521, 6270, -17855 ; w29 w28 w25 w24
196 :     dw 6270, 26722, 26722, -31521 ; w31 w30 w27 w26
197 : edgomez 1.2
198 :     ; %3 for rows 2,6 - constants are multiplied by cos_2_16
199 : edgomez 1.3 tab_i_26_xmm:
200 :     dw 21407, 27969, 21407, 11585 ; movq-> w05 w04 w01 w00
201 :     dw 21407, 11585, -21407, -27969 ; w07 w06 w03 w02
202 :     dw 21407, -11585, 21407, -27969 ; w13 w12 w09 w08
203 :     dw -21407, 27969, 21407, -11585 ; w15 w14 w11 w10
204 :     dw 29692, 25172, 25172, -5906 ; w21 w20 w17 w16
205 :     dw 16819, 5906, -29692, -16819 ; w23 w22 w19 w18
206 :     dw 16819, -29692, 5906, -16819 ; w29 w28 w25 w24
207 :     dw 5906, 25172, 25172, -29692 ; w31 w30 w27 w26
208 : edgomez 1.2
209 :     ; %3 for rows 3,5 - constants are multiplied by cos_3_16
210 : edgomez 1.3 tab_i_35_xmm:
211 :     dw 19266, 25172, 19266, 10426 ; movq-> w05 w04 w01 w00
212 :     dw 19266, 10426, -19266, -25172 ; w07 w06 w03 w02
213 :     dw 19266, -10426, 19266, -25172 ; w13 w12 w09 w08
214 :     dw -19266, 25172, 19266, -10426 ; w15 w14 w11 w10
215 :     dw 26722, 22654, 22654, -5315 ; w21 w20 w17 w16
216 :     dw 15137, 5315, -26722, -15137 ; w23 w22 w19 w18
217 :     dw 15137, -26722, 5315, -15137 ; w29 w28 w25 w24
218 :     dw 5315, 22654, 22654, -26722 ; w31 w30 w27 w26
219 : edgomez 1.2
220 :     ;=============================================================================
221 : edgomez 1.3 ; Code
222 : edgomez 1.2 ;=============================================================================
223 :    
224 : edgomez 1.3 SECTION .text
225 :    
226 :     cglobal idct_3dne
227 :    
228 : edgomez 1.2 ;-----------------------------------------------------------------------------
229 : edgomez 1.3 ; void idct_3dne(uint16_t block[64]);
230 : edgomez 1.2 ;-----------------------------------------------------------------------------
231 :    
232 : edgomez 1.3 ALIGN 16
233 :     idct_3dne:
234 :     mov eax, [esp+4]
235 :    
236 :     ; DCT_8_INV_ROW_1_s [eax+64], [eax+64], tab_i_04_sse, rounder_4 ;rounder_4=0
237 :     pshufw mm0, [eax+64],10001000b ; x2 x0 x2 x0
238 :     movq mm3, [tab_i_04_xmm] ; 3 ; w05 w04 w01 w00
239 :     pshufw mm1, [eax+64+8],10001000b ; x6 x4 x6 x4
240 :     movq mm4, [tab_i_04_xmm+8] ; 4 ; w07 w06 w03 w02
241 :     pshufw mm2, [eax+64],11011101b ; x3 x1 x3 x1
242 :     pshufw mm5, [eax+64+8],11011101b ; x7 x5 x7 x5
243 :     movq mm6, [tab_i_04_xmm+32] ; 6 ; w21 w20 w17 w16
244 :     pmaddwd mm3, mm0 ; x2*w05+x0*w04 x2*w01+x0*w00
245 :     movq mm7, [tab_i_04_xmm+40] ; 7 ; w23 w22 w19 w18 ;
246 :     pmaddwd mm0, [tab_i_04_xmm+16]; x2*w13+x0*w12 x2*w09+x0*w08
247 :     pmaddwd mm4, mm1 ; x6*w07+x4*w06 x6*w03+x4*w02
248 :     pmaddwd mm1, [tab_i_04_xmm+24]; x6*w15+x4*w14 x6*w11+x4*w10
249 :     pmaddwd mm6, mm2 ; x3*w21+x1*w20 x3*w17+x1*w16
250 :     pmaddwd mm2, [tab_i_04_xmm+48]; x3*w29+x1*w28 x3*w25+x1*w24
251 :     pmaddwd mm7, mm5 ; 7 ; x7*w23+x5*w22 x7*w19+x5*w18 ; w23 w22 w19 w18
252 :     pmaddwd mm5, [tab_i_04_xmm+56]; x7*w31+x5*w30 x7*w27+x5*w26
253 :     paddd mm3, mm4 ; 4 free ; a1=sum(even1) a0=sum(even0)
254 :     paddd mm0, mm1 ; 1 free ; a3=sum(even3) a2=sum(even2)
255 :     pshufw mm1, [eax+80+8],10001000b ; x6 x4 x6 x4
256 :     movq mm4, mm3 ; 4 ; a1 a0
257 :     paddd mm6, mm7 ; 7 free ; b1=sum(odd1) b0=sum(odd0)
258 :     paddd mm2, mm5 ; 5 free ; b3=sum(odd3) b2=sum(odd2)
259 :     pshufw mm5, [eax+80],10001000b; x2 x0 x2 x0 mm5 & mm0 exchanged for next cycle
260 :     movq mm7, mm0 ; 7 ; a3 a2
261 :     psubd mm4, mm6 ; 6 free ; a1-b1 a0-b0
262 :     paddd mm6, mm3 ; mm6 = mm3+mm6+mm5+mm4; a1+b1 a0+b0
263 :     movq mm3, [tab_i_35_xmm] ; 3 ; w05 w04 w01 w00
264 :     psubd mm7, mm2 ; ; a3-b3 a2-b2
265 :     paddd mm0, mm2 ; 0 free a3+b3 a2+b2
266 :     pshufw mm2, [eax+80],11011101b; x3 x1 x3 x1
267 :     pmaddwd mm3, mm5 ; x2*w05+x0*w04 x2*w01+x0*w00
268 :     pmaddwd mm5, [tab_i_35_xmm+16]; x2*w13+x0*w12 x2*w09+x0*w08
269 :     psrad mm4, SHIFT_INV_ROW ; y6=a1-b1 y7=a0-b0
270 :     psrad mm7, SHIFT_INV_ROW ; y4=a3-b3 y5=a2-b2
271 :     psrad mm6, SHIFT_INV_ROW ; y1=a1+b1 y0=a0+b0
272 :     psrad mm0, SHIFT_INV_ROW ; y3=a3+b3 y2=a2+b2
273 :     packssdw mm7, mm4 ; 4 ; y6 y7 y4 y5
274 :     packssdw mm6, mm0 ; 0 free ; y3 y2 y1 y0
275 :     pshufw mm0, [eax+80+8],11011101b ; x7 x5 x7 x5
276 :     movq [eax+64], mm6 ; 3 ; save y3 y2 y1 y0 stall2
277 :    
278 :     ; DCT_8_INV_ROW_1_s [eax+80], [eax+80], tab_i_35_xmm, rounder_5
279 :     movq mm4, [tab_i_35_xmm+8] ; 4 ; w07 w06 w03 w02
280 :     movq mm6, [tab_i_35_xmm+32] ; 6 ; w21 w20 w17 w16
281 :     pshufw mm7, mm7, 10110001b ; y7 y6 y5 y4
282 :     paddd mm3, [rounder_5] ; +rounder stall 6
283 :     paddd mm5, [rounder_5] ; +rounder
284 :     movq [eax+64+8], mm7 ; 7 ; save y7 y6 y5 y4
285 :     movq mm7, [tab_i_35_xmm+40] ; 7 ; w23 w22 w19 w18
286 :     pmaddwd mm4, mm1 ; x6*w07+x4*w06 x6*w03+x4*w02
287 :     pmaddwd mm1, [tab_i_35_xmm+24]; x6*w15+x4*w14 x6*w11+x4*w10
288 :     pmaddwd mm6, mm2 ; x3*w21+x1*w20 x3*w17+x1*w16
289 :     pmaddwd mm2, [tab_i_35_xmm+48]; x3*w29+x1*w28 x3*w25+x1*w24
290 :     pmaddwd mm7, mm0 ; 7 ; x7*w23+x5*w22 x7*w19+x5*w18 ; w23 w22 w19 w18
291 :     pmaddwd mm0, [tab_i_35_xmm+56]; x7*w31+x5*w30 x7*w27+x5*w26
292 :     paddd mm3, mm4 ; 4 free ; a1=sum(even1) a0=sum(even0)
293 :     paddd mm5, mm1 ; 1 free ; a3=sum(even3) a2=sum(even2)
294 :     pshufw mm1, [eax+96+8],10001000b ; x6 x4 x6 x4
295 :     movq mm4, mm3 ; 4 ; a1 a0
296 :     paddd mm6, mm7 ; 7 free ; b1=sum(odd1) b0=sum(odd0)
297 :     paddd mm2, mm0 ; 5 free ; b3=sum(odd3) b2=sum(odd2)
298 :     pshufw mm0, [eax+96],10001000b ; x2 x0 x2 x0
299 :     movq mm7, mm5 ; 7 ; a3 a2
300 :     psubd mm4, mm6 ; 6 free ; a1-b1 a0-b0 stall 5
301 :     paddd mm6, mm3 ; mm3 = mm3+mm6+mm5+mm4; a1+b1 a0+b0
302 :     movq mm3, [tab_i_26_xmm] ; 3 ; w05 w04 w01 w00
303 :     psubd mm7, mm2 ; ; a3-b3 a2-b2
304 :     paddd mm5, mm2 ; 0 free a3+b3 a2+b2
305 :     pshufw mm2, [eax+96],11011101b; x3 x1 x3 x1
306 :     pmaddwd mm3, mm0 ; x2*w05+x0*w04 x2*w01+x0*w00
307 :     pmaddwd mm0, [tab_i_26_xmm+16]; x2*w13+x0*w12 x2*w09+x0*w08
308 :     psrad mm4, SHIFT_INV_ROW ; y6=a1-b1 y7=a0-b0
309 :     psrad mm7, SHIFT_INV_ROW ; y4=a3-b3 y5=a2-b2
310 :     psrad mm6, SHIFT_INV_ROW ; y1=a1+b1 y0=a0+b0
311 :     psrad mm5, SHIFT_INV_ROW ; y3=a3+b3 y2=a2+b2
312 :     packssdw mm7, mm4 ; 4 ; y6 y7 y4 y5
313 :     packssdw mm6, mm5 ; 0 free ; y3 y2 y1 y0
314 :     pshufw mm5, [eax+96+8],11011101b ; x7 x5 x7 x5
315 :     movq [eax+80], mm6 ; 3 ; save y3 y2 y1 y0
316 :    
317 :     ; DCT_8_INV_ROW_1_s [eax+96], [eax+96], tab_i_26_xmm, rounder_6
318 :     movq mm4, [tab_i_26_xmm+8] ; 4 ; w07 w06 w03 w02
319 :     movq mm6, [tab_i_26_xmm+32] ; 6 ; w21 w20 w17 w16
320 :     pshufw mm7, mm7, 10110001b ; y7 y6 y5 y4 STALL 6
321 :     paddd mm3, [rounder_6] ; +rounder
322 :     paddd mm0, [rounder_6] ; +rounder
323 :     movq [eax+80+8], mm7 ; 7 ; save y7 y6
324 :     movq mm7, [tab_i_26_xmm+40] ; 7 ; w23 w22 w19 w18
325 :     pmaddwd mm4, mm1 ; x6*w07+x4*w06 x6*w03+x4*w02
326 :     pmaddwd mm1, [tab_i_26_xmm+24]; x6*w15+x4*w14 x6*w11+x4*w10
327 :     pmaddwd mm6, mm2 ; x3*w21+x1*w20 x3*w17+x1*w16
328 :     pmaddwd mm2, [tab_i_26_xmm+48]; x3*w29+x1*w28 x3*w25+x1*w24
329 :     pmaddwd mm7, mm5 ; 7 ; x7*w23+x5*w22 x7*w19+x5*w18 ; w23 w22 w19 w18
330 :     pmaddwd mm5, [tab_i_26_xmm+56]; x7*w31+x5*w30 x7*w27+x5*w26
331 :     paddd mm3, mm4 ; 4 free ; a1=sum(even1) a0=sum(even0)
332 :     paddd mm0, mm1 ; 1 free ; a3=sum(even3) a2=sum(even2)
333 :     pshufw mm1, [eax+112+8],10001000b ; x6 x4 x6 x4
334 :     movq mm4, mm3 ; 4 ; a1 a0
335 :     paddd mm6, mm7 ; 7 free ; b1=sum(odd1) b0=sum(odd0)
336 :     paddd mm2, mm5 ; 5 free ; b3=sum(odd3) b2=sum(odd2)
337 :     pshufw mm5, [eax+112],10001000b; x2 x0 x2 x0 mm5 & mm0 exchanged for next cycle
338 :     movq mm7, mm0 ; 7 ; a3 a2
339 :     psubd mm4, mm6 ; 6 free ; a1-b1 a0-b0
340 :     paddd mm6, mm3 ; mm6 = mm3+mm6+mm5+mm4; a1+b1 a0+b0
341 :     movq mm3, [tab_i_17_xmm] ; 3 ; w05 w04 w01 w00
342 :     psubd mm7, mm2 ; ; a3-b3 a2-b2
343 :     paddd mm0, mm2 ; 0 free a3+b3 a2+b2
344 :     pshufw mm2, [eax+112],11011101b; x3 x1 x3 x1
345 :     pmaddwd mm3, mm5 ; x2*w05+x0*w04 x2*w01+x0*w00
346 :     pmaddwd mm5, [tab_i_17_xmm+16]; x2*w13+x0*w12 x2*w09+x0*w08
347 :     psrad mm4, SHIFT_INV_ROW ; y6=a1-b1 y7=a0-b0
348 :     psrad mm7, SHIFT_INV_ROW ; y4=a3-b3 y5=a2-b2
349 :     psrad mm6, SHIFT_INV_ROW ; y1=a1+b1 y0=a0+b0
350 :     psrad mm0, SHIFT_INV_ROW ; y3=a3+b3 y2=a2+b2
351 :     packssdw mm7, mm4 ; 4 ; y6 y7 y4 y5
352 :     packssdw mm6, mm0 ; 0 free ; y3 y2 y1 y0
353 :     pshufw mm0, [eax+112+8],11011101b ; x7 x5 x7 x5
354 :     movq [eax+96], mm6 ; 3 ; save y3 y2 y1 y0 stall2
355 :    
356 :     ; DCT_8_INV_ROW_1_s [eax+112], [eax+112], tab_i_17_xmm, rounder_7
357 :     movq mm4, [tab_i_17_xmm+8] ; 4 ; w07 w06 w03 w02
358 :     movq mm6, [tab_i_17_xmm+32] ; 6 ; w21 w20 w17 w16
359 :     pshufw mm7, mm7, 10110001b ; y7 y6 y5 y4
360 :     paddd mm3, [rounder_7] ; +rounder stall 6
361 :     paddd mm5, [rounder_7] ; +rounder
362 :     movq [eax+96+8], mm7 ; 7 ; save y7 y6 y5 y4
363 :     movq mm7, [tab_i_17_xmm+40] ; 7 ; w23 w22 w19 w18
364 :     pmaddwd mm4, mm1 ; x6*w07+x4*w06 x6*w03+x4*w02
365 :     pmaddwd mm1, [tab_i_17_xmm+24]; x6*w15+x4*w14 x6*w11+x4*w10
366 :     pmaddwd mm6, mm2 ; x3*w21+x1*w20 x3*w17+x1*w16
367 :     pmaddwd mm2, [tab_i_17_xmm+48]; x3*w29+x1*w28 x3*w25+x1*w24
368 :     pmaddwd mm7, mm0 ; 7 ; x7*w23+x5*w22 x7*w19+x5*w18 ; w23 w22 w19 w18
369 :     pmaddwd mm0, [tab_i_17_xmm+56]; x7*w31+x5*w30 x7*w27+x5*w26
370 :     paddd mm3, mm4 ; 4 free ; a1=sum(even1) a0=sum(even0)
371 :     paddd mm5, mm1 ; 1 free ; a3=sum(even3) a2=sum(even2)
372 :     pshufw mm1, [eax+0+8],10001000b; x6 x4 x6 x4
373 :     movq mm4, mm3 ; 4 ; a1 a0
374 :     paddd mm6, mm7 ; 7 free ; b1=sum(odd1) b0=sum(odd0)
375 :     paddd mm2, mm0 ; 5 free ; b3=sum(odd3) b2=sum(odd2)
376 :     pshufw mm0, [eax+0],10001000b ; x2 x0 x2 x0
377 :     movq mm7, mm5 ; 7 ; a3 a2
378 :     psubd mm4, mm6 ; 6 free ; a1-b1 a0-b0 stall 5
379 :     paddd mm6, mm3 ; mm3 = mm3+mm6+mm5+mm4; a1+b1 a0+b0
380 :     movq mm3, [tab_i_04_xmm] ; 3 ; w05 w04 w01 w00
381 :     psubd mm7, mm2 ; ; a3-b3 a2-b2
382 :     paddd mm5, mm2 ; 0 free a3+b3 a2+b2
383 :     pshufw mm2, [eax+0],11011101b ; x3 x1 x3 x1
384 :     pmaddwd mm3, mm0 ; x2*w05+x0*w04 x2*w01+x0*w00
385 :     pmaddwd mm0, [tab_i_04_xmm+16]; x2*w13+x0*w12 x2*w09+x0*w08
386 :     psrad mm4, SHIFT_INV_ROW ; y6=a1-b1 y7=a0-b0
387 :     psrad mm7, SHIFT_INV_ROW ; y4=a3-b3 y5=a2-b2
388 :     psrad mm6, SHIFT_INV_ROW ; y1=a1+b1 y0=a0+b0
389 :     psrad mm5, SHIFT_INV_ROW ; y3=a3+b3 y2=a2+b2
390 :     packssdw mm7, mm4 ; 4 ; y6 y7 y4 y5
391 :     packssdw mm6, mm5 ; 0 free ; y3 y2 y1 y0
392 :     pshufw mm5, [eax+0+8],11011101b; x7 x5 x7 x5
393 :     movq [eax+112], mm6 ; 3 ; save y3 y2 y1 y0
394 :    
395 :     ; DCT_8_INV_ROW_1_s [eax+0], 0, tab_i_04_xmm, rounder_0
396 :     movq mm4, [tab_i_04_xmm+8] ; 4 ; w07 w06 w03 w02
397 :     movq mm6, [tab_i_04_xmm+32] ; 6 ; w21 w20 w17 w16
398 :     pshufw mm7, mm7, 10110001b ; y7 y6 y5 y4 STALL 6
399 :     paddd mm3, [rounder_0] ; +rounder
400 :     paddd mm0, [rounder_0] ; +rounder
401 :     movq [eax+112+8], mm7 ; 7 ; save y7 y6
402 :     movq mm7, [tab_i_04_xmm+40] ; 7 ; w23 w22 w19 w18
403 :     pmaddwd mm4, mm1 ; x6*w07+x4*w06 x6*w03+x4*w02
404 :     pmaddwd mm1, [tab_i_04_xmm+24]; x6*w15+x4*w14 x6*w11+x4*w10
405 :     pmaddwd mm6, mm2 ; x3*w21+x1*w20 x3*w17+x1*w16
406 :     pmaddwd mm2, [tab_i_04_xmm+48]; x3*w29+x1*w28 x3*w25+x1*w24
407 :     pmaddwd mm7, mm5 ; 7 ; x7*w23+x5*w22 x7*w19+x5*w18 ; w23 w22 w19 w18
408 :     pmaddwd mm5, [tab_i_04_xmm+56]; x7*w31+x5*w30 x7*w27+x5*w26
409 :     paddd mm3, mm4 ; 4 free ; a1=sum(even1) a0=sum(even0)
410 :     paddd mm0, mm1 ; 1
411 :     pshufw mm1, [eax+16+8],10001000b ; x6 x4 x6 x4
412 :     movq mm4, mm3 ; 4 ; a1 a0
413 :     paddd mm6, mm7 ; 7 free ; b1=sum(odd1) b0=sum(odd0)
414 :     paddd mm2, mm5 ; 5 free ; b3=sum(odd3) b2=sum(odd2)
415 :     pshufw mm5, [eax+16],10001000b; x2 x0 x2 x0 mm5 & mm0 exchanged for next cycle
416 :     movq mm7, mm0 ; 7 ; a3 a2
417 :     psubd mm4, mm6 ; 6 free ; a1-b1 a0-b0
418 :     paddd mm6, mm3 ; mm6 = mm3+mm6+mm5+mm4; a1+b1 a0+b0
419 :     movq mm3, [tab_i_17_xmm] ; 3 ; w05 w04 w01 w00
420 :     psubd mm7, mm2 ; ; a3-b3 a2-b2
421 :     paddd mm0, mm2 ; 0 free a3+b3 a2+b2
422 :     pshufw mm2, [eax+16],11011101b; x3 x1 x3 x1
423 :     pmaddwd mm3, mm5 ; x2*w05+x0*w04 x2*w01+x0*w00
424 :     pmaddwd mm5, [tab_i_17_xmm+16]; x2*w13+x0*w12 x2*w09+x0*w08
425 :     psrad mm4, SHIFT_INV_ROW ; y6=a1-b1 y7=a0-b0
426 :     psrad mm7, SHIFT_INV_ROW ; y4=a3-b3 y5=a2-b2
427 :     psrad mm6, SHIFT_INV_ROW ; y1=a1+b1 y0=a0+b0
428 :     psrad mm0, SHIFT_INV_ROW ; y3=a3+b3 y2=a2+b2
429 :     packssdw mm7, mm4 ; 4 ; y6 y7 y4 y5
430 :     packssdw mm6, mm0 ; 0 free ; y3 y2 y1 y0
431 :     pshufw mm0, [eax+16+8],11011101b ; x7 x5 x7 x5
432 :     movq [eax+0], mm6 ; 3 ; save y3 y2 y1 y0 stall2
433 :    
434 :     ; DCT_8_INV_ROW_1_s [eax+16], 16, tab_i_17_xmm, rounder_1
435 :     movq mm4, [tab_i_17_xmm+8] ; 4 ; w07 w06 w03 w02
436 :     movq mm6, [tab_i_17_xmm+32] ; 6 ; w21 w20 w17 w16
437 :     pshufw mm7, mm7, 10110001b ; y7 y6 y5 y4
438 :     paddd mm3, [rounder_1] ; +rounder stall 6
439 :     paddd mm5, [rounder_1] ; +rounder
440 :     movq [eax+0+8], mm7 ; 7 ; save y7 y6 y5 y4
441 :     movq mm7, [tab_i_17_xmm+40] ; 7 ; w23 w22 w19 w18
442 :     pmaddwd mm4, mm1 ; x6*w07+x4*w06 x6*w03+x4*w02
443 :     pmaddwd mm1, [tab_i_17_xmm+24]; x6*w15+x4*w14 x6*w11+x4*w10
444 :     pmaddwd mm6, mm2 ; x3*w21+x1*w20 x3*w17+x1*w16
445 :     pmaddwd mm2, [tab_i_17_xmm+48]; x3*w29+x1*w28 x3*w25+x1*w24
446 :     pmaddwd mm7, mm0 ; 7 ; x7*w23+x5*w22 x7*w19+x5*w18 ; w23 w22 w19 w18
447 :     pmaddwd mm0, [tab_i_17_xmm+56]; x7*w31+x5*w30 x7*w27+x5*w26
448 :     paddd mm3, mm4 ; 4 free ; a1=sum(even1) a0=sum(even0)
449 :     paddd mm5, mm1 ; 1 free ; a3=sum(even3) a2=sum(even2)
450 :     pshufw mm1, [eax+32+8],10001000b ; x6 x4 x6 x4
451 :     movq mm4, mm3 ; 4 ; a1 a0
452 :     paddd mm6, mm7 ; 7 free ; b1=sum(odd1) b0=sum(odd0)
453 :     paddd mm2, mm0 ; 5 free ; b3=sum(odd3) b2=sum(odd2)
454 :     pshufw mm0, [eax+32],10001000b; x2 x0 x2 x0
455 :     movq mm7, mm5 ; 7 ; a3 a2
456 :     psubd mm4, mm6 ; 6 free ; a1-b1 a0-b0 stall 5
457 :     paddd mm6, mm3 ; mm3 = mm3+mm6+mm5+mm4; a1+b1 a0+b0
458 :     movq mm3, [tab_i_26_xmm] ; 3 ; w05 w04 w01 w00
459 :     psubd mm7, mm2 ; ; a3-b3 a2-b2
460 :     paddd mm5, mm2 ; 0 free a3+b3 a2+b2
461 :     pshufw mm2, [eax+32],11011101b; x3 x1 x3 x1
462 :     pmaddwd mm3, mm0 ; x2*w05+x0*w04 x2*w01+x0*w00
463 :     pmaddwd mm0, [tab_i_26_xmm+16]; x2*w13+x0*w12 x2*w09+x0*w08
464 :     psrad mm4, SHIFT_INV_ROW ; y6=a1-b1 y7=a0-b0
465 :     psrad mm7, SHIFT_INV_ROW ; y4=a3-b3 y5=a2-b2
466 :     psrad mm6, SHIFT_INV_ROW ; y1=a1+b1 y0=a0+b0
467 :     psrad mm5, SHIFT_INV_ROW ; y3=a3+b3 y2=a2+b2
468 :     packssdw mm7, mm4 ; 4 ; y6 y7 y4 y5
469 :     packssdw mm6, mm5 ; 0 free ; y3 y2 y1 y0
470 :     pshufw mm5, [eax+32+8],11011101b ; x7 x5 x7 x5
471 :     movq [eax+16], mm6 ; 3 ; save y3 y2 y1 y0
472 :    
473 :     ; DCT_8_INV_ROW_1_s [eax+32], 32, tab_i_26_xmm, rounder_2
474 :     movq mm4, [tab_i_26_xmm+8] ; 4 ; w07 w06 w03 w02
475 :     movq mm6, [tab_i_26_xmm+32] ; 6 ; w21 w20 w17 w16
476 :     pshufw mm7, mm7, 10110001b ; y7 y6 y5 y4 STALL 6
477 :     paddd mm3, [rounder_2] ; +rounder
478 :     paddd mm0, [rounder_2] ; +rounder
479 :     movq [eax+16+8], mm7 ; 7 ; save y7 y6
480 :     movq mm7, [tab_i_26_xmm+40] ; 7 ; w23 w22 w19 w18
481 :     pmaddwd mm4, mm1 ; x6*w07+x4*w06 x6*w03+x4*w02
482 :     pmaddwd mm1, [tab_i_26_xmm+24]; x6*w15+x4*w14 x6*w11+x4*w10
483 :     pmaddwd mm6, mm2 ; x3*w21+x1*w20 x3*w17+x1*w16
484 :     pmaddwd mm2, [tab_i_26_xmm+48]; x3*w29+x1*w28 x3*w25+x1*w24
485 :     pmaddwd mm7, mm5 ; 7 ; x7*w23+x5*w22 x7*w19+x5*w18 ; w23 w22 w19 w18
486 :     pmaddwd mm5, [tab_i_26_xmm+56]; x7*w31+x5*w30 x7*w27+x5*w26
487 :     paddd mm3, mm4 ; 4 free ; a1=sum(even1) a0=sum(even0)
488 :     paddd mm0, mm1 ; 1 free ; a3=sum(even3) a2=sum(even2)
489 :     pshufw mm1, [eax+48+8],10001000b ; x6 x4 x6 x4
490 :     movq mm4, mm3 ; 4 ; a1 a0
491 :     paddd mm6, mm7 ; 7 free ; b1=sum(odd1) b0=sum(odd0)
492 :     paddd mm2, mm5 ; 5 free ; b3=sum(odd3) b2=sum(odd2)
493 :     pshufw mm5, [eax+48],10001000b; x2 x0 x2 x0 mm5 & mm0 exchanged for next cycle
494 :     movq mm7, mm0 ; 7 ; a3 a2
495 :     psubd mm4, mm6 ; 6 free ; a1-b1 a0-b0
496 :     paddd mm6, mm3 ; mm6 = mm3+mm6+mm5+mm4; a1+b1 a0+b0
497 :     movq mm3, [tab_i_35_xmm] ; 3 ; w05 w04 w01 w00
498 :     psubd mm7, mm2 ; ; a3-b3 a2-b2
499 :     paddd mm0, mm2 ; 0 free a3+b3 a2+b2
500 :     pshufw mm2, [eax+48],11011101b; x3 x1 x3 x1
501 :     pmaddwd mm3, mm5 ; x2*w05+x0*w04 x2*w01+x0*w00
502 :     pmaddwd mm5, [tab_i_35_xmm+16]; x2*w13+x0*w12 x2*w09+x0*w08
503 :     psrad mm4, SHIFT_INV_ROW ; y6=a1-b1 y7=a0-b0
504 :     psrad mm7, SHIFT_INV_ROW ; y4=a3-b3 y5=a2-b2
505 :     psrad mm6, SHIFT_INV_ROW ; y1=a1+b1 y0=a0+b0
506 :     psrad mm0, SHIFT_INV_ROW ; y3=a3+b3 y2=a2+b2
507 :     packssdw mm7, mm4 ; 4 ; y6 y7 y4 y5
508 :     packssdw mm6, mm0 ; 0 free ; y3 y2 y1 y0
509 :     pshufw mm0, [eax+48+8],11011101b ; x7 x5 x7 x5
510 :     movq [eax+32], mm6 ; 3 ; save y3 y2 y1 y0 stall2
511 :    
512 :     ; DCT_8_INV_ROW_1_s [eax+48], [eax+48], tab_i_35_xmm, rounder_3
513 :     movq mm4, [tab_i_35_xmm+8] ; 4 ; w07 w06 w03 w02
514 :     movq mm6, [tab_i_35_xmm+32] ; 6 ; w21 w20 w17 w16
515 :     pshufw mm7, mm7, 10110001b ; y7 y6 y5 y4
516 :     paddd mm3, [rounder_3] ; +rounder stall 6
517 :     paddd mm5, [rounder_3] ; +rounder
518 :     movq [eax+32+8], mm7 ; 7 ; save y7 y6 y5 y4
519 :     movq mm7, [tab_i_35_xmm+40] ; 7 ; w23 w22 w19 w18
520 :     pmaddwd mm4, mm1 ; x6*w07+x4*w06 x6*w03+x4*w02
521 :     pmaddwd mm1, [tab_i_35_xmm+24]; x6*w15+x4*w14 x6*w11+x4*w10
522 :     pmaddwd mm6, mm2 ; x3*w21+x1*w20 x3*w17+x1*w16
523 :     pmaddwd mm2, [tab_i_35_xmm+48]; x3*w29+x1*w28 x3*w25+x1*w24
524 :     pmaddwd mm7, mm0 ; 7 ; x7*w23+x5*w22 x7*w19+x5*w18 ; w23 w22 w19 w18
525 :     pmaddwd mm0, [tab_i_35_xmm+56]; x7*w31+x5*w30 x7*w27+x5*w26
526 :     paddd mm3, mm4 ; 4 free ; a1=sum(even1) a0=sum(even0)
527 :     paddd mm5, mm1 ; mm1 free ; a3=sum(even3) a2=sum(even2)
528 :     movq mm1, [tg_3_16]
529 :     movq mm4, mm3 ; 4 ; a1 a0
530 :     paddd mm6, mm7 ; 7 free ; b1=sum(odd1) b0=sum(odd0)
531 :     paddd mm2, mm0 ; 5 free ; b3=sum(odd3) b2=sum(odd2)
532 :     movq mm0, [tg_3_16]
533 :     movq mm7, mm5 ; 7 ; a3 a2
534 :     psubd mm4, mm6 ; 6 free ; a1-b1 a0-b0
535 :     paddd mm3, mm6 ; mm3 = mm3+mm6+mm5+mm4; a1+b1 a0+b0
536 :     psubd mm7, mm2 ; ; a3-b3 a2-b2
537 :     paddd mm2, mm5 ; 0 free a3+b3 a2+b2
538 :     movq mm5, [eax+16*5]
539 :     psrad mm4, SHIFT_INV_ROW ; y6=a1-b1 y7=a0-b0
540 :     psrad mm7, SHIFT_INV_ROW ; y4=a3-b3 y5=a2-b2
541 :     psrad mm3, SHIFT_INV_ROW ; y1=a1+b1 y0=a0+b0
542 :     psrad mm2, SHIFT_INV_ROW ; y3=a3+b3 y2=a2+b2
543 :     movq mm6, [eax+16*1]
544 :     packssdw mm7, mm4 ; 4 ; y6 y7 y4 y5
545 :     movq mm4, [tg_1_16]
546 :     packssdw mm3, mm2 ; 0 free ; y3 y2 y1 y0
547 :     pshufw mm2, mm7, 10110001b ; y7 y6 y5 y4
548 :    
549 :     ; DCT_8_INV_COL_4 [eax+0],[eax+0]
550 :     ; movq mm3,mmword ptr [eax+16*3]
551 :     movq mm7, [eax+16*7]
552 :     pmulhw mm0, mm3 ; x3*(tg_3_16-1)
553 :     pmulhw mm1, mm5 ; x5*(tg_3_16-1)
554 :     movq [eax+48+8], mm2 ; 7 ; save y7 y6 y5 y4
555 :     movq mm2, mm4 ; tg_1_16
556 :     pmulhw mm4, mm7 ; x7*tg_1_16
557 :     paddsw mm0, mm3 ; x3*tg_3_16
558 :     pmulhw mm2, mm6 ; x1*tg_1_16
559 :     paddsw mm1, mm3 ; x3+x5*(tg_3_16-1)
560 :     psubsw mm0, mm5 ; x3*tg_3_16-x5 = tm35
561 :     movq [eax+48], mm3 ; 3 ; save y3 y2 y1 y0
562 :     movq mm3, [ocos_4_16]
563 :     paddsw mm1, mm5 ; x3+x5*tg_3_16 = tp35
564 :     paddsw mm4, mm6 ; x1+tg_1_16*x7 = tp17
565 :     psubsw mm2, mm7 ; x1*tg_1_16-x7 = tm17
566 :     movq mm5, mm4 ; tp17
567 :     movq mm6, mm2 ; tm17
568 :     paddsw mm5, mm1 ; tp17+tp35 = b0
569 :     psubsw mm6, mm0 ; tm17-tm35 = b3
570 :     psubsw mm4, mm1 ; tp17-tp35 = t1
571 :     paddsw mm2, mm0 ; tm17+tm35 = t2
572 :     movq mm7, [tg_2_16]
573 :     movq mm1, mm4 ; t1
574 :     movq [eax+3*16], mm5 ; save b0
575 :     paddsw mm1, mm2 ; t1+t2
576 :     movq [eax+5*16], mm6 ; save b3
577 :     psubsw mm4, mm2 ; t1-t2
578 :     movq mm5, [eax+2*16]
579 :     movq mm0, mm7 ; tg_2_16
580 :     movq mm6, [eax+6*16]
581 :     pmulhw mm0, mm5 ; x2*tg_2_16
582 :     pmulhw mm7, mm6 ; x6*tg_2_16
583 : edgomez 1.2 ; slot
584 : edgomez 1.3 pmulhw mm1, mm3 ; ocos_4_16*(t1+t2) = b1/2
585 : edgomez 1.2 ; slot
586 : edgomez 1.3 movq mm2, [eax+0*16]
587 :     pmulhw mm4, mm3 ; ocos_4_16*(t1-t2) = b2/2
588 :     psubsw mm0, mm6 ; t2*tg_2_16-x6 = tm26
589 :     movq mm3, [eax+0*16] ; x0
590 :     movq mm6, [eax+4*16]
591 :     paddsw mm7, mm5 ; x2+x6*tg_2_16 = tp26
592 :     paddsw mm2, mm6 ; x0+x4 = tp04
593 :     psubsw mm3, mm6 ; x0-x4 = tm04
594 :     movq mm5, mm2 ; tp04
595 :     movq mm6, mm3 ; tm04
596 :     psubsw mm2, mm7 ; tp04-tp26 = a3
597 :     paddsw mm3, mm0 ; tm04+tm26 = a1
598 :     paddsw mm1, mm1 ; b1
599 :     paddsw mm4, mm4 ; b2
600 :     paddsw mm5, mm7 ; tp04+tp26 = a0
601 :     psubsw mm6, mm0 ; tm04-tm26 = a2
602 :     movq mm7, mm3 ; a1
603 :     movq mm0, mm6 ; a2
604 :     paddsw mm3, mm1 ; a1+b1
605 :     paddsw mm6, mm4 ; a2+b2
606 :     psraw mm3, SHIFT_INV_COL ; dst1
607 :     psubsw mm7, mm1 ; a1-b1
608 :     psraw mm6, SHIFT_INV_COL ; dst2
609 :     psubsw mm0, mm4 ; a2-b2
610 :     movq mm1, [eax+3*16] ; load b0
611 :     psraw mm7, SHIFT_INV_COL ; dst6
612 :     movq mm4, mm5 ; a0
613 :     psraw mm0, SHIFT_INV_COL ; dst5
614 :     movq [eax+1*16], mm3
615 :     paddsw mm5, mm1 ; a0+b0
616 :     movq [eax+2*16], mm6
617 :     psubsw mm4, mm1 ; a0-b0
618 :     movq mm3, [eax+5*16] ; load b3
619 :     psraw mm5, SHIFT_INV_COL ; dst0
620 :     movq mm6, mm2 ; a3
621 :     psraw mm4, SHIFT_INV_COL ; dst7
622 :     movq [eax+5*16], mm0
623 :     movq mm0, [tg_3_16]
624 :     paddsw mm2, mm3 ; a3+b3
625 :     movq [eax+6*16], mm7
626 :     psubsw mm6, mm3 ; a3-b3
627 :     movq mm3, [eax+8+16*3]
628 :     movq [eax+0*16], mm5
629 :     psraw mm2, SHIFT_INV_COL ; dst3
630 :     movq [eax+7*16], mm4
631 :    
632 :     ; DCT_8_INV_COL_4 [eax+8],[eax+8]
633 :     movq mm1, mm0 ; tg_3_16
634 :     movq mm5, [eax+8+16*5]
635 :     psraw mm6, SHIFT_INV_COL ; dst4
636 :     pmulhw mm0, mm3 ; x3*(tg_3_16-1)
637 :     movq mm4, [tg_1_16]
638 :     pmulhw mm1, mm5 ; x5*(tg_3_16-1)
639 :     movq mm7, [eax+8+16*7]
640 :     movq [eax+3*16], mm2
641 :     movq mm2, mm4 ; tg_1_16
642 :     movq [eax+4*16], mm6
643 :     movq mm6, [eax+8+16*1]
644 :     pmulhw mm4, mm7 ; x7*tg_1_16
645 :     paddsw mm0, mm3 ; x3*tg_3_16
646 :     pmulhw mm2, mm6 ; x1*tg_1_16
647 :     paddsw mm1, mm3 ; x3+x5*(tg_3_16-1)
648 :     psubsw mm0, mm5 ; x3*tg_3_16-x5 = tm35
649 :     movq mm3, [ocos_4_16]
650 :     paddsw mm1, mm5 ; x3+x5*tg_3_16 = tp35
651 :     paddsw mm4, mm6 ; x1+tg_1_16*x7 = tp17
652 :     psubsw mm2, mm7 ; x1*tg_1_16-x7 = tm17
653 :     movq mm5, mm4 ; tp17
654 :     movq mm6, mm2 ; tm17
655 :     paddsw mm5, mm1 ; tp17+tp35 = b0
656 :     psubsw mm4, mm1 ; tp17-tp35 = t1
657 :     paddsw mm2, mm0 ; tm17+tm35 = t2
658 :     movq mm7, [tg_2_16]
659 :     movq mm1, mm4 ; t1
660 :     psubsw mm6, mm0 ; tm17-tm35 = b3
661 :     movq [eax+8+3*16], mm5 ; save b0
662 :     movq [eax+8+5*16], mm6 ; save b3
663 :     psubsw mm4, mm2 ; t1-t2
664 :     movq mm5, [eax+8+2*16]
665 :     movq mm0, mm7 ; tg_2_16
666 :     movq mm6, [eax+8+6*16]
667 :     paddsw mm1, mm2 ; t1+t2
668 :     pmulhw mm0, mm5 ; x2*tg_2_16
669 :     pmulhw mm7, mm6 ; x6*tg_2_16
670 :     movq mm2, [eax+8+0*16]
671 :     pmulhw mm4, mm3 ; ocos_4_16*(t1-t2) = b2/2
672 :     psubsw mm0, mm6 ; t2*tg_2_16-x6 = tm26
673 : edgomez 1.2 ; slot
674 : edgomez 1.3 pmulhw mm1, mm3 ; ocos_4_16*(t1+t2) = b1/2
675 : edgomez 1.2 ; slot
676 : edgomez 1.3 movq mm3, [eax+8+0*16] ; x0
677 :     movq mm6, [eax+8+4*16]
678 :     paddsw mm7, mm5 ; x2+x6*tg_2_16 = tp26
679 :     paddsw mm2, mm6 ; x0+x4 = tp04
680 :     psubsw mm3, mm6 ; x0-x4 = tm04
681 :     movq mm5, mm2 ; tp04
682 :     movq mm6, mm3 ; tm04
683 :     psubsw mm2, mm7 ; tp04-tp26 = a3
684 :     paddsw mm3, mm0 ; tm04+tm26 = a1
685 :     paddsw mm1, mm1 ; b1
686 :     paddsw mm4, mm4 ; b2
687 :     paddsw mm5, mm7 ; tp04+tp26 = a0
688 :     psubsw mm6, mm0 ; tm04-tm26 = a2
689 :     movq mm7, mm3 ; a1
690 :     movq mm0, mm6 ; a2
691 :     paddsw mm3, mm1 ; a1+b1
692 :     paddsw mm6, mm4 ; a2+b2
693 :     psraw mm3, SHIFT_INV_COL ; dst1
694 :     psubsw mm7, mm1 ; a1-b1
695 :     psraw mm6, SHIFT_INV_COL ; dst2
696 :     psubsw mm0, mm4 ; a2-b2
697 :     movq mm1, [eax+8+3*16] ; load b0
698 :     psraw mm7, SHIFT_INV_COL ; dst6
699 :     movq mm4, mm5 ; a0
700 :     psraw mm0, SHIFT_INV_COL ; dst5
701 :     movq [eax+8+1*16], mm3
702 :     paddsw mm5, mm1 ; a0+b0
703 :     movq [eax+8+2*16], mm6
704 :     psubsw mm4, mm1 ; a0-b0
705 :     movq mm3, [eax+8+5*16] ; load b3
706 :     psraw mm5, SHIFT_INV_COL ; dst0
707 :     movq mm6, mm2 ; a3
708 :     psraw mm4, SHIFT_INV_COL ; dst7
709 :     movq [eax+8+5*16], mm0
710 :     paddsw mm2, mm3 ; a3+b3
711 :     movq [eax+8+6*16], mm7
712 :     psubsw mm6, mm3 ; a3-b3
713 :     movq [eax+8+0*16], mm5
714 :     psraw mm2, SHIFT_INV_COL ; dst3
715 :     movq [eax+8+7*16], mm4
716 :     psraw mm6, SHIFT_INV_COL ; dst4
717 :     movq [eax+8+3*16], mm2
718 :     movq [eax+8+4*16], mm6
719 : edgomez 1.2
720 : edgomez 1.3 ret
721 : edgomez 1.6 .endfunc
722 :    

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4