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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1877 - (view) (download)

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

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