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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 154 - (view) (download)

1 : Isibaar 154 ;/******************************************************************************
2 :     ; * *
3 :     ; * This file is part of XviD, a free MPEG-4 video encoder/decoder *
4 :     ; * *
5 :     ; * This program is free software; you can redistribute it and/or modify it *
6 :     ; * under the terms of the GNU General Public License as published by *
7 :     ; * the Free Software Foundation; either version 2 of the License, or *
8 :     ; * (at your option) any later version. *
9 :     ; * *
10 :     ; * This program is distributed in the hope that it will be useful, but *
11 :     ; * WITHOUT ANY WARRANTY; without even the implied warranty of *
12 :     ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 :     ; * GNU General Public License for more details. *
14 :     ; * *
15 :     ; * You should have received a copy of the GNU General Public License *
16 :     ; * along with this program; if not, write to the Free Software *
17 :     ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
18 :     ; * *
19 :     ; ******************************************************************************/
20 :     ;
21 :     ;/******************************************************************************
22 :     ; * *
23 :     ; * fdct_mmx.asm, MMX optimized forward DCT *
24 :     ; * *
25 :     ; * Initial, but incomplete version provided by Intel at AppNote AP-922 *
26 :     ; * http://developer.intel.com/vtune/cbts/strmsimd/922down.htm *
27 :     ; * Copyright (C) 1999 Intel Corporation, *
28 :     ; * *
29 :     ; * completed and corrected in fdctmm32.c/fdctmm32.doc, *
30 :     ; * http://members.tripod.com/~liaor *
31 :     ; * Copyright (C) 2000 - Royce Shih-Wea Liao <liaor@iname.com>, *
32 :     ; * *
33 :     ; * ported to NASM and some minor changes *
34 :     ; * Copyright (C) 2001 - Michael Militzer <isibaar@xvid.org> *
35 :     ; * *
36 :     ; * For more information visit the XviD homepage: http://www.xvid.org *
37 :     ; * *
38 :     ; ******************************************************************************/
39 :     ;
40 :     ;/******************************************************************************
41 :     ; * *
42 :     ; * Revision history: *
43 :     ; * *
44 :     ; * 04.11.2001 loop unrolled (Isibaar) *
45 :     ; * 02.11.2001 initial version (Isibaar) *
46 :     ; * *
47 :     ; ******************************************************************************/
48 :    
49 :    
50 :     BITS 32
51 :    
52 :     %macro cglobal 1
53 :     %ifdef PREFIX
54 :     global _%1
55 :     %define %1 _%1
56 :     %else
57 :     global %1
58 :     %endif
59 :     %endmacro
60 :    
61 :     %define INP eax
62 :     %define TABLE ebx
63 :     %define TABLEF ebx
64 :     %define OUT ecx
65 :     %define round_frw_row edx
66 :    
67 :     %define INP_1 eax + 16
68 :     %define INP_2 eax + 32
69 :     %define INP_3 eax + 48
70 :     %define INP_4 eax + 64
71 :     %define INP_5 eax + 80
72 :     %define INP_6 eax + 96
73 :     %define INP_7 eax + 112
74 :    
75 :     %define OUT_1 ecx + 16
76 :     %define OUT_2 ecx + 32
77 :     %define OUT_3 ecx + 48
78 :     %define OUT_4 ecx + 64
79 :     %define OUT_5 ecx + 80
80 :     %define OUT_6 ecx + 96
81 :     %define OUT_7 ecx + 112
82 :     %define OUT_8 ecx + 128
83 :    
84 :     %define TABLE_1 ebx + 64
85 :     %define TABLE_2 ebx + 128
86 :     %define TABLE_3 ebx + 192
87 :     %define TABLE_4 ebx + 256
88 :     %define TABLE_5 ebx + 320
89 :     %define TABLE_6 ebx + 384
90 :     %define TABLE_7 ebx + 448
91 :    
92 :     %define x0 INP + 0*16
93 :     %define x1 INP + 1*16
94 :     %define x2 INP + 2*16
95 :     %define x3 INP + 3*16
96 :     %define x4 INP + 4*16
97 :     %define x5 INP + 5*16
98 :     %define x6 INP + 6*16
99 :     %define x7 INP + 7*16
100 :     %define y0 OUT + 0*16
101 :     %define y1 OUT + 1*16
102 :     %define y2 OUT + 2*16
103 :     %define y3 OUT + 3*16
104 :     %define y4 OUT + 4*16
105 :     %define y5 OUT + 5*16
106 :     %define y6 OUT + 6*16
107 :     %define y7 OUT + 7*16
108 :    
109 :     %define tg_1_16 (TABLEF + 0)
110 :     %define tg_2_16 (TABLEF + 8)
111 :     %define tg_3_16 (TABLEF + 16)
112 :     %define cos_4_16 (TABLEF + 24)
113 :     %define ocos_4_16 (TABLEF + 32)
114 :    
115 :     ;---added for sse2
116 :     %define tg_1_16_2 (TABLEF + 0)
117 :     %define tg_2_16_2 (TABLEF + 16)
118 :     %define tg_3_16_2 (TABLEF + 32)
119 :     %define cos_4_16_2 (TABLEF + 48)
120 :     %define ocos_4_16_2 (TABLEF + 64)
121 :     ;---
122 :    
123 :     %ifdef FORMAT_COFF
124 :     SECTION .data data
125 :     %else
126 :     SECTION .data data align=64
127 :     %endif
128 :    
129 :    
130 :     ALIGN 16
131 :    
132 :     RND_FRW_ROW equ (1 << (SHIFT_FRW_ROW-1))
133 :     SHIFT_FRW_ROW_CLIP1 equ (SHIFT_FRW_ROW - SHIFT_FRW_ROW_CLIP2)
134 :    
135 :     PASS1_BITS equ (2)
136 :     CONST_BITS equ (13)
137 :    
138 :     one_corr dw 1, 1, 1, 1
139 :    
140 :     ;---added for sse2
141 :     align 16
142 :     one_corr_2 dw 1, 1, 1, 1,
143 :     dw 1, 1, 1, 1
144 :     ;---
145 :    
146 :     r_frw_row dd RND_FRW_ROW, RND_FRW_ROW
147 :    
148 :    
149 :     tg_all_16 dw 13036, 13036, 13036, 13036, ; tg * (2<<16) + 0.5
150 :     dw 27146, 27146, 27146, 27146, ; tg * (2<<16) + 0.5
151 :     dw -21746, -21746, -21746, -21746, ; tg * (2<<16) + 0.5
152 :     dw -19195, -19195, -19195, -19195, ; cos * (2<<16) + 0.5
153 :     dw 23170, 23170, 23170, 23170 ; cos * (2<<15) + 0.5
154 :    
155 :     ;---added for sse2
156 :     align 16
157 :     tg_all_16_2 dw 13036, 13036, 13036, 13036, ; tg * (2<<16) + 0.5
158 :     dw 13036, 13036, 13036, 13036,
159 :     dw 27146, 27146, 27146, 27146, ; tg * (2<<16) + 0.5
160 :     dw 27146, 27146, 27146, 27146,
161 :     dw -21746, -21746, -21746, -21746, ; tg * (2<<16) + 0.5
162 :     dw -21746, -21746, -21746, -21746,
163 :     dw -19195, -19195, -19195, -19195, ; cos * (2<<16) + 0.5
164 :     dw -19195, -19195, -19195, -19195,
165 :     dw 23170, 23170, 23170, 23170 ; cos * (2<<15) + 0.5
166 :     dw 23170, 23170, 23170, 23170
167 :     ;---
168 :    
169 :     tab_frw_01234567
170 :     ; row0
171 :     dw 16384, 16384, 21407, -8867, ; w09 w01 w08 w00
172 :     dw 16384, 16384, 8867, -21407, ; w13 w05 w12 w04
173 :     dw 16384, -16384, 8867, 21407, ; w11 w03 w10 w02
174 :     dw -16384, 16384, -21407, -8867, ; w15 w07 w14 w06
175 :     dw 22725, 12873, 19266, -22725, ; w22 w20 w18 w16
176 :     dw 19266, 4520, -4520, -12873, ; w23 w21 w19 w17
177 :     dw 12873, 4520, 4520, 19266, ; w30 w28 w26 w24
178 :     dw -22725, 19266, -12873, -22725, ; w31 w29 w27 w25
179 :    
180 :     ; row1
181 :     dw 22725, 22725, 29692, -12299, ; w09 w01 w08 w00
182 :     dw 22725, 22725, 12299, -29692, ; w13 w05 w12 w04
183 :     dw 22725, -22725, 12299, 29692, ; w11 w03 w10 w02
184 :     dw -22725, 22725, -29692, -12299, ; w15 w07 w14 w06
185 :     dw 31521, 17855, 26722, -31521, ; w22 w20 w18 w16
186 :     dw 26722, 6270, -6270, -17855, ; w23 w21 w19 w17
187 :     dw 17855, 6270, 6270, 26722, ; w30 w28 w26 w24
188 :     dw -31521, 26722, -17855, -31521, ; w31 w29 w27 w25
189 :    
190 :     ; row2
191 :     dw 21407, 21407, 27969, -11585, ; w09 w01 w08 w00
192 :     dw 21407, 21407, 11585, -27969, ; w13 w05 w12 w04
193 :     dw 21407, -21407, 11585, 27969, ; w11 w03 w10 w02
194 :     dw -21407, 21407, -27969, -11585, ; w15 w07 w14 w06
195 :     dw 29692, 16819, 25172, -29692, ; w22 w20 w18 w16
196 :     dw 25172, 5906, -5906, -16819, ; w23 w21 w19 w17
197 :     dw 16819, 5906, 5906, 25172, ; w30 w28 w26 w24
198 :     dw -29692, 25172, -16819, -29692, ; w31 w29 w27 w25
199 :    
200 :     ; row3
201 :     dw 19266, 19266, 25172, -10426, ; w09 w01 w08 w00
202 :     dw 19266, 19266, 10426, -25172, ; w13 w05 w12 w04
203 :     dw 19266, -19266, 10426, 25172, ; w11 w03 w10 w02
204 :     dw -19266, 19266, -25172, -10426, ; w15 w07 w14 w06
205 :     dw 26722, 15137, 22654, -26722, ; w22 w20 w18 w16
206 :     dw 22654, 5315, -5315, -15137, ; w23 w21 w19 w17
207 :     dw 15137, 5315, 5315, 22654, ; w30 w28 w26 w24
208 :     dw -26722, 22654, -15137, -26722, ; w31 w29 w27 w25
209 :    
210 :     ; row4
211 :     dw 16384, 16384, 21407, -8867, ; w09 w01 w08 w00
212 :     dw 16384, 16384, 8867, -21407, ; w13 w05 w12 w04
213 :     dw 16384, -16384, 8867, 21407, ; w11 w03 w10 w02
214 :     dw -16384, 16384, -21407, -8867, ; w15 w07 w14 w06
215 :     dw 22725, 12873, 19266, -22725, ; w22 w20 w18 w16
216 :     dw 19266, 4520, -4520, -12873, ; w23 w21 w19 w17
217 :     dw 12873, 4520, 4520, 19266, ; w30 w28 w26 w24
218 :     dw -22725, 19266, -12873, -22725, ; w31 w29 w27 w25
219 :    
220 :     ; row5
221 :     dw 19266, 19266, 25172, -10426, ; w09 w01 w08 w00
222 :     dw 19266, 19266, 10426, -25172, ; w13 w05 w12 w04
223 :     dw 19266, -19266, 10426, 25172, ; w11 w03 w10 w02
224 :     dw -19266, 19266, -25172, -10426, ; w15 w07 w14 w06
225 :     dw 26722, 15137, 22654, -26722, ; w22 w20 w18 w16
226 :     dw 22654, 5315, -5315, -15137, ; w23 w21 w19 w17
227 :     dw 15137, 5315, 5315, 22654, ; w30 w28 w26 w24
228 :     dw -26722, 22654, -15137, -26722, ; w31 w29 w27 w25
229 :    
230 :     ; row6
231 :     dw 21407, 21407, 27969, -11585, ; w09 w01 w08 w00
232 :     dw 21407, 21407, 11585, -27969, ; w13 w05 w12 w04
233 :     dw 21407, -21407, 11585, 27969, ; w11 w03 w10 w02
234 :     dw -21407, 21407, -27969, -11585, ; w15 w07 w14 w06
235 :     dw 29692, 16819, 25172, -29692, ; w22 w20 w18 w16
236 :     dw 25172, 5906, -5906, -16819, ; w23 w21 w19 w17
237 :     dw 16819, 5906, 5906, 25172, ; w30 w28 w26 w24
238 :     dw -29692, 25172, -16819, -29692, ; w31 w29 w27 w25
239 :    
240 :     ; row7
241 :     dw 22725, 22725, 29692, -12299, ; w09 w01 w08 w00
242 :     dw 22725, 22725, 12299, -29692, ; w13 w05 w12 w04
243 :     dw 22725, -22725, 12299, 29692, ; w11 w03 w10 w02
244 :     dw -22725, 22725, -29692, -12299, ; w15 w07 w14 w06
245 :     dw 31521, 17855, 26722, -31521, ; w22 w20 w18 w16
246 :     dw 26722, 6270, -6270, -17855, ; w23 w21 w19 w17
247 :     dw 17855, 6270, 6270, 26722, ; w30 w28 w26 w24
248 :     dw -31521, 26722, -17855, -31521 ; w31 w29 w27 w25
249 :    
250 :     align 128
251 :    
252 :     FIX_1 dw 10703, 4433, 10703, 4433
253 :     dw 10703, 4433, 10703, 4433
254 :    
255 :     FIX_2 dw 4433, -10704, 4433, -10704
256 :     dw 4433, -10704, 4433, -10704
257 :    
258 :     rounder_5 dw 2+16,2+16,2+16,2+16,2+16,2+16,2+16,2+16
259 :     rounder_11 dd 1024,1024,1024,1024
260 :     rounder_18 dd 16384+131072,16384+131072,16384+131072,16384+131072
261 :    
262 :     align 128
263 :    
264 :     FIX_3 dw 6437, 2260, 6437, 2260
265 :     dw 6437, 2260, 6437, 2260
266 :     dw 11363, 9633, 11363, 9633
267 :     dw 11363, 9633, 11363, 9633
268 :    
269 :     FIX_4 dw -11362, -6436, -11362, -6436
270 :     dw -11362, -6436, -11362, -6436
271 :     dw 9633, -2259, 9633, -2259
272 :     dw 9633, -2259, 9633, -2259
273 :    
274 :     FIX_5 dw 2261, 9633, 2261, 9633
275 :     dw 2261, 9633, 2261, 9633
276 :     dw 6437, -11362, 6437, -11362
277 :     dw 6437, -11362, 6437, -11362
278 :    
279 :     FIX_6 dw 9633, -11363, 9633, -11363
280 :     dw 9633, -11363, 9633, -11363
281 :     dw 2260, -6436, 2260, -6436
282 :     dw 2260, -6436, 2260, -6436
283 :    
284 :     align 128
285 :     buffer dw 0,0,0,0,0,0,0,0
286 :     dw 0,0,0,0,0,0,0,0
287 :     dw 0,0,0,0,0,0,0,0
288 :     dw 0,0,0,0,0,0,0,0
289 :     dw 0,0,0,0,0,0,0,0
290 :     dw 0,0,0,0,0,0,0,0
291 :     dw 0,0,0,0,0,0,0,0
292 :     dw 0,0,0,0,0,0,0,0
293 :    
294 :     SECTION .text
295 :    
296 :     ALIGN 16
297 :    
298 :    
299 :     cglobal fdct_mmx
300 :     ;;void fdct_mmx(short *block);
301 :     fdct_mmx:
302 :    
303 :     push ebx
304 :    
305 :     mov INP, dword [esp + 8] ; block
306 :    
307 :     mov TABLEF, tg_all_16
308 :     mov OUT, INP
309 :    
310 :     movq mm0, [x1] ; 0 ; x1
311 :    
312 :     movq mm1, [x6] ; 1 ; x6
313 :     movq mm2, mm0 ; 2 ; x1
314 :    
315 :     movq mm3, [x2] ; 3 ; x2
316 :     paddsw mm0, mm1 ; t1 = x[1] + x[6]
317 :    
318 :     movq mm4, [x5] ; 4 ; x5
319 :     psllw mm0, SHIFT_FRW_COL ; t1
320 :    
321 :     movq mm5, [x0] ; 5 ; x0
322 :     paddsw mm4, mm3 ; t2 = x[2] + x[5]
323 :    
324 :     paddsw mm5, [x7] ; t0 = x[0] + x[7]
325 :     psllw mm4, SHIFT_FRW_COL ; t2
326 :    
327 :     movq mm6, mm0 ; 6 ; t1
328 :     psubsw mm2, mm1 ; 1 ; t6 = x[1] - x[6]
329 :    
330 :     movq mm1, [tg_2_16] ; 1 ; tg_2_16
331 :     psubsw mm0, mm4 ; tm12 = t1 - t2
332 :    
333 :     movq mm7, [x3] ; 7 ; x3
334 :     pmulhw mm1, mm0 ; tm12*tg_2_16
335 :    
336 :     paddsw mm7, [x4] ; t3 = x[3] + x[4]
337 :     psllw mm5, SHIFT_FRW_COL ; t0
338 :    
339 :     paddsw mm6, mm4 ; 4 ; tp12 = t1 + t2
340 :     psllw mm7, SHIFT_FRW_COL ; t3
341 :    
342 :     movq mm4, mm5 ; 4 ; t0
343 :     psubsw mm5, mm7 ; tm03 = t0 - t3
344 :    
345 :     paddsw mm1, mm5 ; y2 = tm03 + tm12*tg_2_16
346 :     paddsw mm4, mm7 ; 7 ; tp03 = t0 + t3
347 :    
348 :     por mm1, qword [one_corr] ; correction y2 +0.5
349 :     psllw mm2, SHIFT_FRW_COL+1 ; t6
350 :    
351 :     pmulhw mm5, [tg_2_16] ; tm03*tg_2_16
352 :     movq mm7, mm4 ; 7 ; tp03
353 :    
354 :     psubsw mm3, [x5] ; t5 = x[2] - x[5]
355 :     psubsw mm4, mm6 ; y4 = tp03 - tp12
356 :    
357 :     movq [y2], mm1 ; 1 ; save y2
358 :     paddsw mm7, mm6 ; 6 ; y0 = tp03 + tp12
359 :    
360 :     movq mm1, [x3] ; 1 ; x3
361 :     psllw mm3, SHIFT_FRW_COL+1 ; t5
362 :    
363 :     psubsw mm1, [x4] ; t4 = x[3] - x[4]
364 :     movq mm6, mm2 ; 6 ; t6
365 :    
366 :     movq [y4], mm4 ; 4 ; save y4
367 :     paddsw mm2, mm3 ; t6 + t5
368 :    
369 :     pmulhw mm2, [ocos_4_16] ; tp65 = (t6 + t5)*cos_4_16
370 :     psubsw mm6, mm3 ; 3 ; t6 - t5
371 :    
372 :     pmulhw mm6, [ocos_4_16] ; tm65 = (t6 - t5)*cos_4_16
373 :     psubsw mm5, mm0 ; 0 ; y6 = tm03*tg_2_16 - tm12
374 :    
375 :     por mm5, qword [one_corr] ; correction y6 +0.5
376 :     psllw mm1, SHIFT_FRW_COL ; t4
377 :    
378 :     por mm2, qword [one_corr] ; correction tp65 +0.5
379 :     movq mm4, mm1 ; 4 ; t4
380 :    
381 :     movq mm3, [x0] ; 3 ; x0
382 :     paddsw mm1, mm6 ; tp465 = t4 + tm65
383 :    
384 :     psubsw mm3, [x7] ; t7 = x[0] - x[7]
385 :     psubsw mm4, mm6 ; 6 ; tm465 = t4 - tm65
386 :    
387 :     movq mm0, [tg_1_16] ; 0 ; tg_1_16
388 :     psllw mm3, SHIFT_FRW_COL ; t7
389 :    
390 :     movq mm6, [tg_3_16] ; 6 ; tg_3_16
391 :     pmulhw mm0, mm1 ; tp465*tg_1_16
392 :    
393 :     movq [y0], mm7 ; 7 ; save y0
394 :     pmulhw mm6, mm4 ; tm465*tg_3_16
395 :    
396 :     movq [y6], mm5 ; 5 ; save y6
397 :     movq mm7, mm3 ; 7 ; t7
398 :    
399 :     movq mm5, [tg_3_16] ; 5 ; tg_3_16
400 :     psubsw mm7, mm2 ; tm765 = t7 - tp65
401 :    
402 :     paddsw mm3, mm2 ; 2 ; tp765 = t7 + tp65
403 :     pmulhw mm5, mm7 ; tm765*tg_3_16
404 :    
405 :     paddsw mm0, mm3 ; y1 = tp765 + tp465*tg_1_16
406 :     paddsw mm6, mm4 ; tm465*tg_3_16
407 :    
408 :     pmulhw mm3, [tg_1_16] ; tp765*tg_1_16
409 :    
410 :     por mm0, qword [one_corr] ; correction y1 +0.5
411 :     paddsw mm5, mm7 ; tm765*tg_3_16
412 :    
413 :     psubsw mm7, mm6 ; 6 ; y3 = tm765 - tm465*tg_3_16
414 :     add INP, 0x08
415 :    
416 :     movq [y1], mm0 ; 0 ; save y1
417 :     paddsw mm5, mm4 ; 4 ; y5 = tm765*tg_3_16 + tm465
418 :    
419 :     movq [y3], mm7 ; 7 ; save y3
420 :     psubsw mm3, mm1 ; 1 ; y7 = tp765*tg_1_16 - tp465
421 :    
422 :     movq [y5], mm5 ; 5 ; save y5
423 :    
424 :     movq mm0, [x1] ; 0 ; x1
425 :    
426 :     movq [y7], mm3 ; 3 ; save y7 (columns 0-4)
427 :    
428 :     movq mm1, [x6] ; 1 ; x6
429 :     movq mm2, mm0 ; 2 ; x1
430 :    
431 :     movq mm3, [x2] ; 3 ; x2
432 :     paddsw mm0, mm1 ; t1 = x[1] + x[6]
433 :    
434 :     movq mm4, [x5] ; 4 ; x5
435 :     psllw mm0, SHIFT_FRW_COL ; t1
436 :    
437 :     movq mm5, [x0] ; 5 ; x0
438 :     paddsw mm4, mm3 ; t2 = x[2] + x[5]
439 :    
440 :     paddsw mm5, [x7] ; t0 = x[0] + x[7]
441 :     psllw mm4, SHIFT_FRW_COL ; t2
442 :    
443 :     movq mm6, mm0 ; 6 ; t1
444 :     psubsw mm2, mm1 ; 1 ; t6 = x[1] - x[6]
445 :    
446 :     movq mm1, [tg_2_16] ; 1 ; tg_2_16
447 :     psubsw mm0, mm4 ; tm12 = t1 - t2
448 :    
449 :     movq mm7, [x3] ; 7 ; x3
450 :     pmulhw mm1, mm0 ; tm12*tg_2_16
451 :    
452 :     paddsw mm7, [x4] ; t3 = x[3] + x[4]
453 :     psllw mm5, SHIFT_FRW_COL ; t0
454 :    
455 :     paddsw mm6, mm4 ; 4 ; tp12 = t1 + t2
456 :     psllw mm7, SHIFT_FRW_COL ; t3
457 :    
458 :     movq mm4, mm5 ; 4 ; t0
459 :     psubsw mm5, mm7 ; tm03 = t0 - t3
460 :    
461 :     paddsw mm1, mm5 ; y2 = tm03 + tm12*tg_2_16
462 :     paddsw mm4, mm7 ; 7 ; tp03 = t0 + t3
463 :    
464 :     por mm1, qword [one_corr] ; correction y2 +0.5
465 :     psllw mm2, SHIFT_FRW_COL+1 ; t6
466 :    
467 :     pmulhw mm5, [tg_2_16] ; tm03*tg_2_16
468 :     movq mm7, mm4 ; 7 ; tp03
469 :    
470 :     psubsw mm3, [x5] ; t5 = x[2] - x[5]
471 :     psubsw mm4, mm6 ; y4 = tp03 - tp12
472 :    
473 :     movq [y2+8], mm1 ; 1 ; save y2
474 :     paddsw mm7, mm6 ; 6 ; y0 = tp03 + tp12
475 :    
476 :     movq mm1, [x3] ; 1 ; x3
477 :     psllw mm3, SHIFT_FRW_COL+1 ; t5
478 :    
479 :     psubsw mm1, [x4] ; t4 = x[3] - x[4]
480 :     movq mm6, mm2 ; 6 ; t6
481 :    
482 :     movq [y4+8], mm4 ; 4 ; save y4
483 :     paddsw mm2, mm3 ; t6 + t5
484 :    
485 :     pmulhw mm2, [ocos_4_16] ; tp65 = (t6 + t5)*cos_4_16
486 :     psubsw mm6, mm3 ; 3 ; t6 - t5
487 :    
488 :     pmulhw mm6, [ocos_4_16] ; tm65 = (t6 - t5)*cos_4_16
489 :     psubsw mm5, mm0 ; 0 ; y6 = tm03*tg_2_16 - tm12
490 :    
491 :     por mm5, qword [one_corr] ; correction y6 +0.5
492 :     psllw mm1, SHIFT_FRW_COL ; t4
493 :    
494 :     por mm2, qword [one_corr] ; correction tp65 +0.5
495 :     movq mm4, mm1 ; 4 ; t4
496 :    
497 :     movq mm3, [x0] ; 3 ; x0
498 :     paddsw mm1, mm6 ; tp465 = t4 + tm65
499 :    
500 :     psubsw mm3, [x7] ; t7 = x[0] - x[7]
501 :     psubsw mm4, mm6 ; 6 ; tm465 = t4 - tm65
502 :    
503 :     movq mm0, [tg_1_16] ; 0 ; tg_1_16
504 :     psllw mm3, SHIFT_FRW_COL ; t7
505 :    
506 :     movq mm6, [tg_3_16] ; 6 ; tg_3_16
507 :     pmulhw mm0, mm1 ; tp465*tg_1_16
508 :    
509 :     movq [y0+8], mm7 ; 7 ; save y0
510 :     pmulhw mm6, mm4 ; tm465*tg_3_16
511 :    
512 :     movq [y6+8], mm5 ; 5 ; save y6
513 :     movq mm7, mm3 ; 7 ; t7
514 :    
515 :     movq mm5, [tg_3_16] ; 5 ; tg_3_16
516 :     psubsw mm7, mm2 ; tm765 = t7 - tp65
517 :    
518 :     paddsw mm3, mm2 ; 2 ; tp765 = t7 + tp65
519 :     pmulhw mm5, mm7 ; tm765*tg_3_16
520 :    
521 :     paddsw mm0, mm3 ; y1 = tp765 + tp465*tg_1_16
522 :     paddsw mm6, mm4 ; tm465*tg_3_16
523 :    
524 :     pmulhw mm3, [tg_1_16] ; tp765*tg_1_16
525 :    
526 :     por mm0, qword [one_corr] ; correction y1 +0.5
527 :     paddsw mm5, mm7 ; tm765*tg_3_16
528 :    
529 :     psubsw mm7, mm6 ; 6 ; y3 = tm765 - tm465*tg_3_16
530 :    
531 :     movq [y1+8], mm0 ; 0 ; save y1
532 :     paddsw mm5, mm4 ; 4 ; y5 = tm765*tg_3_16 + tm465
533 :    
534 :     movq [y3+8], mm7 ; 7 ; save y3
535 :     psubsw mm3, mm1 ; 1 ; y7 = tp765*tg_1_16 - tp465
536 :    
537 :     movq [y5+8], mm5 ; 5 ; save y5
538 :    
539 :     movq [y7+8], mm3 ; 3 ; save y7
540 :    
541 :    
542 :     ;--------------------- columns
543 :    
544 :     mov INP, [esp + 8] ; row 0
545 :    
546 :     mov TABLEF, tab_frw_01234567 ; row 0
547 :     mov OUT, INP
548 :    
549 :     mov round_frw_row, r_frw_row
550 :    
551 :     movd mm5, [INP+12] ; mm5 = 7 6
552 :    
553 :     punpcklwd mm5, [INP+8]
554 :    
555 :     movq mm2, mm5 ; mm2 = 5 7 4 6
556 :     psrlq mm5, 32 ; mm5 = _ _ 5 7
557 :    
558 :     movq mm0, [INP] ; mm0 = 3 2 1 0
559 :     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
560 :    
561 :     movq mm1, mm0 ; mm1 = 3 2 1 0
562 :     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
563 :    
564 :     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
565 :     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
566 :    
567 :     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
568 :    
569 :     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
570 :     movq mm1, mm2 ; mm1
571 :    
572 :     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
573 :    
574 :     movq mm3, [TABLE] ; 3 ; w06 w04 w02 w00
575 :     punpcklwd mm0, mm1 ; x5 x1 x4 x0
576 :    
577 :     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
578 :     punpckldq mm0, mm0 ; x4 x0 x4 x0 [ xt2 xt0 xt2 xt0 ]
579 :    
580 :     movq mm4, [TABLE+8] ; 4 ; w07 w05 w03 w01
581 :     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
582 :    
583 :     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
584 :     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
585 :    
586 :     movq mm1, [TABLE+32] ; 1 ; w22 w20 w18 w16
587 :     punpckldq mm2, mm2 ; x6 x2 x6 x2 [ xt3 xt1 xt3 xt1 ]
588 :    
589 :     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
590 :     punpckhdq mm5, mm5 ; x5 x1 x5 x1 [ xt6 xt4 xt6 xt4 ]
591 :    
592 :     pmaddwd mm0, [TABLE+16] ; x4*w14+x0*w12 x4*w10+x0*w08
593 :     punpckhdq mm6, mm6 ; x7 x3 x7 x3 [ xt7 xt5 xt7 xt5 ]
594 :    
595 :     movq mm7, [TABLE+40] ; 7 ; w23 w21 w19 w17
596 :     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
597 :    
598 :     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
599 :     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
600 :    
601 :     pmaddwd mm2, [TABLE+24] ; x6*w15+x2*w13 x6*w11+x2*w09
602 :     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
603 :    
604 :     pmaddwd mm5, [TABLE+48] ; x5*w30+x1*w28 x5*w26+x1*w24
605 :    
606 :     pmaddwd mm6, [TABLE+56] ; x7*w31+x3*w29 x7*w27+x3*w25
607 :     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
608 :    
609 :     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
610 :     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0)
611 :    
612 :     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
613 :     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
614 :    
615 :     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
616 :     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
617 :    
618 :     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
619 :     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
620 :    
621 :     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
622 :    
623 :     packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
624 :    
625 :     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
626 :     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
627 :    
628 :     punpcklwd mm3, mm1 ; y3 y2 y1 y0
629 :    
630 :     punpckhwd mm6, mm1 ; y7 y6 y5 y4
631 :    
632 :     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
633 :    
634 :     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
635 :    
636 :     movq [OUT_1-16], mm3 ; 1 ; save y3 y2 y1 y0
637 :    
638 :     movq [OUT_1-8], mm6 ; 7 ; save y7 y6 y5 y4
639 :    
640 :     movd mm5, [INP_1+12] ; mm5 = 7 6
641 :    
642 :     punpcklwd mm5, [INP_1+8]
643 :    
644 :     movq mm2, mm5 ; mm2 = 5 7 4 6
645 :     psrlq mm5, 32 ; mm5 = _ _ 5 7
646 :    
647 :     movq mm0, [INP_1] ; mm0 = 3 2 1 0
648 :     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
649 :    
650 :     movq mm1, mm0 ; mm1 = 3 2 1 0
651 :     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
652 :    
653 :     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
654 :     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
655 :    
656 :     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
657 :    
658 :     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
659 :     movq mm1, mm2 ; mm1
660 :    
661 :     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
662 :    
663 :     movq mm3, [TABLE_1] ; 3 ; w06 w04 w02 w00
664 :     punpcklwd mm0, mm1 ; x5 x1 x4 x0
665 :    
666 :     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
667 :     punpckldq mm0, mm0 ; x4 x0 x4 x0 [ xt2 xt0 xt2 xt0 ]
668 :    
669 :     movq mm4, [TABLE_1+8] ; 4 ; w07 w05 w03 w01
670 :     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
671 :    
672 :     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
673 :     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
674 :    
675 :     movq mm1, [TABLE_1+32] ; 1 ; w22 w20 w18 w16
676 :     punpckldq mm2, mm2 ; x6 x2 x6 x2 [ xt3 xt1 xt3 xt1 ]
677 :    
678 :     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
679 :     punpckhdq mm5, mm5 ; x5 x1 x5 x1 [ xt6 xt4 xt6 xt4 ]
680 :    
681 :     pmaddwd mm0, [TABLE_1+16] ; x4*w14+x0*w12 x4*w10+x0*w08
682 :     punpckhdq mm6, mm6 ; x7 x3 x7 x3 [ xt7 xt5 xt7 xt5 ]
683 :    
684 :     movq mm7, [TABLE_1+40] ; 7 ; w23 w21 w19 w17
685 :     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
686 :    
687 :     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
688 :     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
689 :    
690 :     pmaddwd mm2, [TABLE_1+24] ; x6*w15+x2*w13 x6*w11+x2*w09
691 :     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
692 :    
693 :     pmaddwd mm5, [TABLE_1+48] ; x5*w30+x1*w28 x5*w26+x1*w24
694 :    
695 :     pmaddwd mm6, [TABLE_1+56] ; x7*w31+x3*w29 x7*w27+x3*w25
696 :     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
697 :    
698 :     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
699 :     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0)
700 :    
701 :     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
702 :     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
703 :    
704 :     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
705 :     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
706 :    
707 :     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
708 :     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
709 :    
710 :     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
711 :    
712 :     packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
713 :    
714 :     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
715 :     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
716 :    
717 :     punpcklwd mm3, mm1 ; y3 y2 y1 y0
718 :    
719 :     punpckhwd mm6, mm1 ; y7 y6 y5 y4
720 :    
721 :     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
722 :    
723 :     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
724 :    
725 :     movq [OUT_2-16], mm3 ; 1 ; save y3 y2 y1 y0
726 :    
727 :     movq [OUT_2-8], mm6 ; 7 ; save y7 y6 y5 y4
728 :    
729 :     movd mm5, [INP_2+12] ; mm5 = 7 6
730 :    
731 :     punpcklwd mm5, [INP_2+8]
732 :    
733 :     movq mm2, mm5 ; mm2 = 5 7 4 6
734 :     psrlq mm5, 32 ; mm5 = _ _ 5 7
735 :    
736 :     movq mm0, [INP_2] ; mm0 = 3 2 1 0
737 :     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
738 :    
739 :     movq mm1, mm0 ; mm1 = 3 2 1 0
740 :     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
741 :    
742 :     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
743 :     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
744 :    
745 :     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
746 :    
747 :     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
748 :     movq mm1, mm2 ; mm1
749 :    
750 :     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
751 :    
752 :     movq mm3, [TABLE_2] ; 3 ; w06 w04 w02 w00
753 :     punpcklwd mm0, mm1 ; x5 x1 x4 x0
754 :    
755 :     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
756 :     punpckldq mm0, mm0 ; x4 x0 x4 x0 [ xt2 xt0 xt2 xt0 ]
757 :    
758 :     movq mm4, [TABLE_2+8] ; 4 ; w07 w05 w03 w01
759 :     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
760 :    
761 :     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
762 :     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
763 :    
764 :     movq mm1, [TABLE_2+32] ; 1 ; w22 w20 w18 w16
765 :     punpckldq mm2, mm2 ; x6 x2 x6 x2 [ xt3 xt1 xt3 xt1 ]
766 :    
767 :     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
768 :     punpckhdq mm5, mm5 ; x5 x1 x5 x1 [ xt6 xt4 xt6 xt4 ]
769 :    
770 :     pmaddwd mm0, [TABLE_2+16] ; x4*w14+x0*w12 x4*w10+x0*w08
771 :     punpckhdq mm6, mm6 ; x7 x3 x7 x3 [ xt7 xt5 xt7 xt5 ]
772 :    
773 :     movq mm7, [TABLE_2+40] ; 7 ; w23 w21 w19 w17
774 :     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
775 :    
776 :     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
777 :     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
778 :    
779 :     pmaddwd mm2, [TABLE_2+24] ; x6*w15+x2*w13 x6*w11+x2*w09
780 :     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
781 :    
782 :     pmaddwd mm5, [TABLE_2+48] ; x5*w30+x1*w28 x5*w26+x1*w24
783 :    
784 :     pmaddwd mm6, [TABLE_2+56] ; x7*w31+x3*w29 x7*w27+x3*w25
785 :     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
786 :    
787 :     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
788 :     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0)
789 :    
790 :     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
791 :     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
792 :    
793 :     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
794 :     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
795 :    
796 :     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
797 :     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
798 :    
799 :     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
800 :    
801 :     packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
802 :    
803 :     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
804 :     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
805 :    
806 :     punpcklwd mm3, mm1 ; y3 y2 y1 y0
807 :    
808 :     punpckhwd mm6, mm1 ; y7 y6 y5 y4
809 :    
810 :     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
811 :    
812 :     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
813 :    
814 :     movq [OUT_3-16], mm3 ; 1 ; save y3 y2 y1 y0
815 :    
816 :     movq [OUT_3-8], mm6 ; 7 ; save y7 y6 y5 y4
817 :    
818 :     movd mm5, [INP_3+12] ; mm5 = 7 6
819 :    
820 :     punpcklwd mm5, [INP_3+8]
821 :    
822 :     movq mm2, mm5 ; mm2 = 5 7 4 6
823 :     psrlq mm5, 32 ; mm5 = _ _ 5 7
824 :    
825 :     movq mm0, [INP_3] ; mm0 = 3 2 1 0
826 :     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
827 :    
828 :     movq mm1, mm0 ; mm1 = 3 2 1 0
829 :     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
830 :    
831 :     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
832 :     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
833 :    
834 :     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
835 :    
836 :     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
837 :     movq mm1, mm2 ; mm1
838 :    
839 :     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
840 :    
841 :     movq mm3, [TABLE_3] ; 3 ; w06 w04 w02 w00
842 :     punpcklwd mm0, mm1 ; x5 x1 x4 x0
843 :    
844 :     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
845 :     punpckldq mm0, mm0 ; x4 x0 x4 x0 [ xt2 xt0 xt2 xt0 ]
846 :    
847 :     movq mm4, [TABLE_3+8] ; 4 ; w07 w05 w03 w01
848 :     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
849 :    
850 :     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
851 :     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
852 :    
853 :     movq mm1, [TABLE_3+32] ; 1 ; w22 w20 w18 w16
854 :     punpckldq mm2, mm2 ; x6 x2 x6 x2 [ xt3 xt1 xt3 xt1 ]
855 :    
856 :     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
857 :     punpckhdq mm5, mm5 ; x5 x1 x5 x1 [ xt6 xt4 xt6 xt4 ]
858 :    
859 :     pmaddwd mm0, [TABLE_3+16] ; x4*w14+x0*w12 x4*w10+x0*w08
860 :     punpckhdq mm6, mm6 ; x7 x3 x7 x3 [ xt7 xt5 xt7 xt5 ]
861 :    
862 :     movq mm7, [TABLE_3+40] ; 7 ; w23 w21 w19 w17
863 :     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
864 :    
865 :     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
866 :     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
867 :    
868 :     pmaddwd mm2, [TABLE_3+24] ; x6*w15+x2*w13 x6*w11+x2*w09
869 :     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
870 :    
871 :     pmaddwd mm5, [TABLE_3+48] ; x5*w30+x1*w28 x5*w26+x1*w24
872 :    
873 :     pmaddwd mm6, [TABLE_3+56] ; x7*w31+x3*w29 x7*w27+x3*w25
874 :     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
875 :    
876 :     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
877 :     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0)
878 :    
879 :     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
880 :     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
881 :    
882 :     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
883 :     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
884 :    
885 :     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
886 :     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
887 :    
888 :     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
889 :    
890 :     packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
891 :    
892 :     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
893 :     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
894 :    
895 :     punpcklwd mm3, mm1 ; y3 y2 y1 y0
896 :    
897 :     punpckhwd mm6, mm1 ; y7 y6 y5 y4
898 :    
899 :     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
900 :    
901 :     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
902 :    
903 :     movq [OUT_4-16], mm3 ; 1 ; save y3 y2 y1 y0
904 :    
905 :     movq [OUT_4-8], mm6 ; 7 ; save y7 y6 y5 y4
906 :    
907 :     movd mm5, [INP_4+12] ; mm5 = 7 6
908 :    
909 :     punpcklwd mm5, [INP_4+8]
910 :    
911 :     movq mm2, mm5 ; mm2 = 5 7 4 6
912 :     psrlq mm5, 32 ; mm5 = _ _ 5 7
913 :    
914 :     movq mm0, [INP_4] ; mm0 = 3 2 1 0
915 :     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
916 :    
917 :     movq mm1, mm0 ; mm1 = 3 2 1 0
918 :     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
919 :    
920 :     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
921 :     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
922 :    
923 :     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
924 :    
925 :     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
926 :     movq mm1, mm2 ; mm1
927 :    
928 :     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
929 :    
930 :     movq mm3, [TABLE_4] ; 3 ; w06 w04 w02 w00
931 :     punpcklwd mm0, mm1 ; x5 x1 x4 x0
932 :    
933 :     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
934 :     punpckldq mm0, mm0 ; x4 x0 x4 x0 [ xt2 xt0 xt2 xt0 ]
935 :    
936 :     movq mm4, [TABLE_4+8] ; 4 ; w07 w05 w03 w01
937 :     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
938 :    
939 :     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
940 :     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
941 :    
942 :     movq mm1, [TABLE_4+32] ; 1 ; w22 w20 w18 w16
943 :     punpckldq mm2, mm2 ; x6 x2 x6 x2 [ xt3 xt1 xt3 xt1 ]
944 :    
945 :     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
946 :     punpckhdq mm5, mm5 ; x5 x1 x5 x1 [ xt6 xt4 xt6 xt4 ]
947 :    
948 :     pmaddwd mm0, [TABLE_4+16] ; x4*w14+x0*w12 x4*w10+x0*w08
949 :     punpckhdq mm6, mm6 ; x7 x3 x7 x3 [ xt7 xt5 xt7 xt5 ]
950 :    
951 :     movq mm7, [TABLE_4+40] ; 7 ; w23 w21 w19 w17
952 :     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
953 :    
954 :     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
955 :     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
956 :    
957 :     pmaddwd mm2, [TABLE_4+24] ; x6*w15+x2*w13 x6*w11+x2*w09
958 :     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
959 :    
960 :     pmaddwd mm5, [TABLE_4+48] ; x5*w30+x1*w28 x5*w26+x1*w24
961 :    
962 :     pmaddwd mm6, [TABLE_4+56] ; x7*w31+x3*w29 x7*w27+x3*w25
963 :     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
964 :    
965 :     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
966 :     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0)
967 :    
968 :     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
969 :     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
970 :    
971 :     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
972 :     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
973 :    
974 :     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
975 :     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
976 :    
977 :     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
978 :    
979 :     packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
980 :    
981 :     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
982 :     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
983 :    
984 :     punpcklwd mm3, mm1 ; y3 y2 y1 y0
985 :    
986 :     punpckhwd mm6, mm1 ; y7 y6 y5 y4
987 :    
988 :     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
989 :    
990 :     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
991 :    
992 :     movq [OUT_5-16], mm3 ; 1 ; save y3 y2 y1 y0
993 :    
994 :     movq [OUT_5-8], mm6 ; 7 ; save y7 y6 y5 y4
995 :    
996 :     movd mm5, [INP_5+12] ; mm5 = 7 6
997 :    
998 :     punpcklwd mm5, [INP_5+8]
999 :    
1000 :     movq mm2, mm5 ; mm2 = 5 7 4 6
1001 :     psrlq mm5, 32 ; mm5 = _ _ 5 7
1002 :    
1003 :     movq mm0, [INP_5] ; mm0 = 3 2 1 0
1004 :     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
1005 :    
1006 :     movq mm1, mm0 ; mm1 = 3 2 1 0
1007 :     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
1008 :    
1009 :     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
1010 :     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
1011 :    
1012 :     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
1013 :    
1014 :     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
1015 :     movq mm1, mm2 ; mm1
1016 :    
1017 :     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
1018 :    
1019 :     movq mm3, [TABLE_5] ; 3 ; w06 w04 w02 w00
1020 :     punpcklwd mm0, mm1 ; x5 x1 x4 x0
1021 :    
1022 :     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
1023 :     punpckldq mm0, mm0 ; x4 x0 x4 x0 [ xt2 xt0 xt2 xt0 ]
1024 :    
1025 :     movq mm4, [TABLE_5+8] ; 4 ; w07 w05 w03 w01
1026 :     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
1027 :    
1028 :     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
1029 :     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
1030 :    
1031 :     movq mm1, [TABLE_5+32] ; 1 ; w22 w20 w18 w16
1032 :     punpckldq mm2, mm2 ; x6 x2 x6 x2 [ xt3 xt1 xt3 xt1 ]
1033 :    
1034 :     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
1035 :     punpckhdq mm5, mm5 ; x5 x1 x5 x1 [ xt6 xt4 xt6 xt4 ]
1036 :    
1037 :     pmaddwd mm0, [TABLE_5+16] ; x4*w14+x0*w12 x4*w10+x0*w08
1038 :     punpckhdq mm6, mm6 ; x7 x3 x7 x3 [ xt7 xt5 xt7 xt5 ]
1039 :    
1040 :     movq mm7, [TABLE_5+40] ; 7 ; w23 w21 w19 w17
1041 :     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
1042 :    
1043 :     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
1044 :     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
1045 :    
1046 :     pmaddwd mm2, [TABLE_5+24] ; x6*w15+x2*w13 x6*w11+x2*w09
1047 :     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
1048 :    
1049 :     pmaddwd mm5, [TABLE_5+48] ; x5*w30+x1*w28 x5*w26+x1*w24
1050 :    
1051 :     pmaddwd mm6, [TABLE_5+56] ; x7*w31+x3*w29 x7*w27+x3*w25
1052 :     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
1053 :    
1054 :     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
1055 :     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0)
1056 :    
1057 :     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
1058 :     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
1059 :    
1060 :     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
1061 :     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
1062 :    
1063 :     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
1064 :     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
1065 :    
1066 :     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
1067 :    
1068 :     packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
1069 :    
1070 :     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
1071 :     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
1072 :    
1073 :     punpcklwd mm3, mm1 ; y3 y2 y1 y0
1074 :    
1075 :     punpckhwd mm6, mm1 ; y7 y6 y5 y4
1076 :    
1077 :     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
1078 :    
1079 :     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
1080 :    
1081 :     movq [OUT_6-16], mm3 ; 1 ; save y3 y2 y1 y0
1082 :    
1083 :     movq [OUT_6-8], mm6 ; 7 ; save y7 y6 y5 y4
1084 :    
1085 :     movd mm5, [INP_6+12] ; mm5 = 7 6
1086 :    
1087 :     punpcklwd mm5, [INP_6+8]
1088 :    
1089 :     movq mm2, mm5 ; mm2 = 5 7 4 6
1090 :     psrlq mm5, 32 ; mm5 = _ _ 5 7
1091 :    
1092 :     movq mm0, [INP_6] ; mm0 = 3 2 1 0
1093 :     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
1094 :    
1095 :     movq mm1, mm0 ; mm1 = 3 2 1 0
1096 :     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
1097 :    
1098 :     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
1099 :     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
1100 :    
1101 :     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
1102 :    
1103 :     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
1104 :     movq mm1, mm2 ; mm1
1105 :    
1106 :     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
1107 :    
1108 :     movq mm3, [TABLE_6] ; 3 ; w06 w04 w02 w00
1109 :     punpcklwd mm0, mm1 ; x5 x1 x4 x0
1110 :    
1111 :     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
1112 :     punpckldq mm0, mm0 ; x4 x0 x4 x0 [ xt2 xt0 xt2 xt0 ]
1113 :    
1114 :     movq mm4, [TABLE_6+8] ; 4 ; w07 w05 w03 w01
1115 :     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
1116 :    
1117 :     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
1118 :     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
1119 :    
1120 :     movq mm1, [TABLE_6+32] ; 1 ; w22 w20 w18 w16
1121 :     punpckldq mm2, mm2 ; x6 x2 x6 x2 [ xt3 xt1 xt3 xt1 ]
1122 :    
1123 :     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
1124 :     punpckhdq mm5, mm5 ; x5 x1 x5 x1 [ xt6 xt4 xt6 xt4 ]
1125 :    
1126 :     pmaddwd mm0, [TABLE_6+16] ; x4*w14+x0*w12 x4*w10+x0*w08
1127 :     punpckhdq mm6, mm6 ; x7 x3 x7 x3 [ xt7 xt5 xt7 xt5 ]
1128 :    
1129 :     movq mm7, [TABLE_6+40] ; 7 ; w23 w21 w19 w17
1130 :     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
1131 :    
1132 :     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
1133 :     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
1134 :    
1135 :     pmaddwd mm2, [TABLE_6+24] ; x6*w15+x2*w13 x6*w11+x2*w09
1136 :     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
1137 :    
1138 :     pmaddwd mm5, [TABLE_6+48] ; x5*w30+x1*w28 x5*w26+x1*w24
1139 :    
1140 :     pmaddwd mm6, [TABLE_6+56] ; x7*w31+x3*w29 x7*w27+x3*w25
1141 :     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
1142 :    
1143 :     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
1144 :     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0)
1145 :    
1146 :     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
1147 :     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
1148 :    
1149 :     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
1150 :     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
1151 :    
1152 :     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
1153 :     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
1154 :    
1155 :     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
1156 :    
1157 :     packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
1158 :    
1159 :     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
1160 :     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
1161 :    
1162 :     punpcklwd mm3, mm1 ; y3 y2 y1 y0
1163 :    
1164 :     punpckhwd mm6, mm1 ; y7 y6 y5 y4
1165 :    
1166 :     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
1167 :    
1168 :     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
1169 :    
1170 :     movq [OUT_7-16], mm3 ; 1 ; save y3 y2 y1 y0
1171 :    
1172 :     movq [OUT_7-8], mm6 ; 7 ; save y7 y6 y5 y4
1173 :    
1174 :     movd mm5, [INP_7+12] ; mm5 = 7 6
1175 :    
1176 :     punpcklwd mm5, [INP_7+8]
1177 :    
1178 :     movq mm2, mm5 ; mm2 = 5 7 4 6
1179 :     psrlq mm5, 32 ; mm5 = _ _ 5 7
1180 :    
1181 :     movq mm0, [INP_7] ; mm0 = 3 2 1 0
1182 :     punpcklwd mm5, mm2 ; mm5 = 4 5 6 7
1183 :    
1184 :     movq mm1, mm0 ; mm1 = 3 2 1 0
1185 :     paddsw mm0, mm5 ; mm0 = [3+4, 2+5, 1+6, 0+7] (xt3, xt2, xt1, xt0)
1186 :    
1187 :     psubsw mm1, mm5 ; mm1 = [3-4, 2-5, 1-6, 0-7] (xt7, xt6, xt5, xt4)
1188 :     movq mm2, mm0 ; mm2 = [ xt3 xt2 xt1 xt0 ]
1189 :    
1190 :     punpcklwd mm0, mm1 ; mm0 = [ xt5 xt1 xt4 xt0 ]
1191 :    
1192 :     punpckhwd mm2, mm1 ; mm2 = [ xt7 xt3 xt6 xt2 ]
1193 :     movq mm1, mm2 ; mm1
1194 :    
1195 :     movq mm2, mm0 ; 2 ; x3 x2 x1 x0
1196 :    
1197 :     movq mm3, [TABLE_7] ; 3 ; w06 w04 w02 w00
1198 :     punpcklwd mm0, mm1 ; x5 x1 x4 x0
1199 :    
1200 :     movq mm5, mm0 ; 5 ; x5 x1 x4 x0
1201 :     punpckldq mm0, mm0 ; x4 x0 x4 x0 [ xt2 xt0 xt2 xt0 ]
1202 :    
1203 :     movq mm4, [TABLE_7+8] ; 4 ; w07 w05 w03 w01
1204 :     punpckhwd mm2, mm1 ; 1 ; x7 x3 x6 x2
1205 :    
1206 :     pmaddwd mm3, mm0 ; x4*w06+x0*w04 x4*w02+x0*w00
1207 :     movq mm6, mm2 ; 6 ; x7 x3 x6 x2
1208 :    
1209 :     movq mm1, [TABLE_7+32] ; 1 ; w22 w20 w18 w16
1210 :     punpckldq mm2, mm2 ; x6 x2 x6 x2 [ xt3 xt1 xt3 xt1 ]
1211 :    
1212 :     pmaddwd mm4, mm2 ; x6*w07+x2*w05 x6*w03+x2*w01
1213 :     punpckhdq mm5, mm5 ; x5 x1 x5 x1 [ xt6 xt4 xt6 xt4 ]
1214 :    
1215 :     pmaddwd mm0, [TABLE_7+16] ; x4*w14+x0*w12 x4*w10+x0*w08
1216 :     punpckhdq mm6, mm6 ; x7 x3 x7 x3 [ xt7 xt5 xt7 xt5 ]
1217 :    
1218 :     movq mm7, [TABLE_7+40] ; 7 ; w23 w21 w19 w17
1219 :     pmaddwd mm1, mm5 ; x5*w22+x1*w20 x5*w18+x1*w16
1220 :    
1221 :     paddd mm3, [round_frw_row] ; +rounder (y2,y0)
1222 :     pmaddwd mm7, mm6 ; x7*w23+x3*w21 x7*w19+x3*w17
1223 :    
1224 :     pmaddwd mm2, [TABLE_7+24] ; x6*w15+x2*w13 x6*w11+x2*w09
1225 :     paddd mm3, mm4 ; 4 ; a1=sum(even1) a0=sum(even0)
1226 :    
1227 :     pmaddwd mm5, [TABLE_7+48] ; x5*w30+x1*w28 x5*w26+x1*w24
1228 :    
1229 :     pmaddwd mm6, [TABLE_7+56] ; x7*w31+x3*w29 x7*w27+x3*w25
1230 :     paddd mm1, mm7 ; 7 ; b1=sum(odd1) b0=sum(odd0)
1231 :    
1232 :     paddd mm0, [round_frw_row] ; +rounder (y6,y4)
1233 :     psrad mm3, SHIFT_FRW_ROW_CLIP1 ; (y2, y0)
1234 :    
1235 :     paddd mm1, [round_frw_row] ; +rounder (y3,y1)
1236 :     paddd mm0, mm2 ; 2 ; a3=sum(even3) a2=sum(even2)
1237 :    
1238 :     paddd mm5, [round_frw_row] ; +rounder (y7,y5)
1239 :     psrad mm1, SHIFT_FRW_ROW_CLIP1 ; y1=a1+b1 y0=a0+b0
1240 :    
1241 :     paddd mm5, mm6 ; 6 ; b3=sum(odd3) b2=sum(odd2)
1242 :     psrad mm0, SHIFT_FRW_ROW_CLIP1 ; y3=a3+b3 y2=a2+b2
1243 :    
1244 :     psrad mm5, SHIFT_FRW_ROW_CLIP1 ; y4=a3-b3 y5=a2-b2
1245 :    
1246 :     packssdw mm3, mm0 ; 0 ; y6 y4 y2 y0, saturate {-32768,+32767}
1247 :    
1248 :     packssdw mm1, mm5 ; 3 ; y7 y5 y3 y1, saturate {-32768,+32767}
1249 :     movq mm6, mm3 ; mm0 = y6 y4 y2 y0
1250 :    
1251 :     punpcklwd mm3, mm1 ; y3 y2 y1 y0
1252 :    
1253 :     punpckhwd mm6, mm1 ; y7 y6 y5 y4
1254 :    
1255 :     psraw mm3, SHIFT_FRW_ROW_CLIP2 ; descale [y3 y2 y1 y0] to {-2048,+2047}
1256 :    
1257 :     psraw mm6, SHIFT_FRW_ROW_CLIP2 ; descale [y7 y6 y5 y4] to {-2048,+2047}
1258 :    
1259 :     movq [OUT_8-16], mm3 ; 1 ; save y3 y2 y1 y0
1260 :    
1261 :     movq [OUT_8-8], mm6 ; 7 ; save y7 y6 y5 y4
1262 :    
1263 :     pop ebx
1264 :     emms
1265 :    
1266 :     ret
1267 :    
1268 :    
1269 :     ;*******************************************************************
1270 :     ; This SSE2 code of the FDCT algoruthm coded by
1271 :     ; Dmitry Rozhdestvensky and checked by Vladimir G. Ivanov
1272 :     ;*******************************************************************
1273 :    
1274 :     %macro transpose8x8sse2 3 ; source,dest,{0=first part, 1=second part}
1275 :     ;I found this smart transposing algo at www.x86.org
1276 :    
1277 :     movdqa xmm0,[%1+0*16] ; 07 06 05 04 03 02 01 00
1278 :     movdqa xmm6,[%1+2*16] ; 27 26 25 24 23 22 21 20
1279 :     movdqa xmm4,[%1+4*16] ; 47 46 45 44 43 42 41 40
1280 :     movdqa xmm7,[%1+6*16] ; 67 66 65 64 63 62 61 60
1281 :    
1282 :     %if %3=0
1283 :     punpcklwd xmm0,[%1+1*16] ; 13 03 12 02 11 01 10 00
1284 :     movdqa xmm2,xmm0
1285 :     punpcklwd xmm6,[%1+3*16] ; 33 23 32 22 31 21 30 20
1286 :     punpcklwd xmm4,[%1+5*16] ; 53 43 52 42 51 41 50 40
1287 :     movdqa xmm5,xmm4
1288 :     punpcklwd xmm7,[%1+7*16] ; 73 63 72 62 71 61 70 60
1289 :     %else
1290 :     punpckhwd xmm0,[%1+1*16] ;
1291 :     movdqa xmm2,xmm0
1292 :     punpckhwd xmm6,[%1+3*16] ;
1293 :     punpckhwd xmm4,[%1+5*16] ;
1294 :     movdqa xmm5,xmm4
1295 :     punpckhwd xmm7,[%1+7*16] ;
1296 :     %endif
1297 :    
1298 :     punpckldq xmm0,xmm6 ; 31 21 11 01 30 20 10 00
1299 :     movdqa xmm1,xmm0
1300 :     punpckldq xmm4,xmm7 ; 71 61 51 41 70 60 50 40
1301 :     punpckhdq xmm2,xmm6 ; 33 23 13 03 32 22 12 02
1302 :     movdqa xmm3,xmm2
1303 :     punpckhdq xmm5,xmm7 ; 73 63 53 43 72 62 52 42
1304 :    
1305 :     punpcklqdq xmm0,xmm4 ; 70 60 50 40 30 20 10 00
1306 :     punpcklqdq xmm2,xmm5 ; 72 62 52 42 32 22 21 02
1307 :     punpckhqdq xmm1,xmm4 ; 71 61 51 41 31 21 11 01
1308 :     punpckhqdq xmm3,xmm5 ; 73 63 53 43 33 23 13 03
1309 :    
1310 :     movdqa [%2+(0+%3*4)*16],xmm0
1311 :     movdqa [%2+(1+%3*4)*16],xmm1
1312 :     movdqa [%2+(2+%3*4)*16],xmm2
1313 :     movdqa [%2+(3+%3*4)*16],xmm3
1314 :    
1315 :     %endmacro
1316 :    
1317 :    
1318 :     %macro makeoddpart 3 ; output, table, shift
1319 :    
1320 :    
1321 :     movdqa xmm1,[%2+0 ] ;45l
1322 :     movdqa xmm5,[%2+16] ;67l
1323 :     movdqa xmm3,xmm1 ;45h
1324 :     movdqa xmm7,xmm5 ;67h
1325 :    
1326 :     pmaddwd xmm1,xmm2 ;[%2+0 ]
1327 :     pmaddwd xmm5,xmm0 ;[%2+16]
1328 :     paddd xmm1,xmm5
1329 :     %if %3=11
1330 :     movdqa xmm5,[rounder_11]
1331 :     %else
1332 :     movdqa xmm5,[rounder_18]
1333 :     %endif
1334 :    
1335 :     pmaddwd xmm3,xmm6 ;[%2+0 ]
1336 :     pmaddwd xmm7,xmm4 ;[%2+16]
1337 :     paddd xmm3,xmm7
1338 :    
1339 :     paddd xmm1,xmm5 ;rounder
1340 :     paddd xmm3,xmm5 ;rounder
1341 :     psrad xmm1,%3
1342 :     psrad xmm3,%3
1343 :    
1344 :     packssdw xmm1,xmm3
1345 :     movdqa [%1],xmm1
1346 :    
1347 :     %endmacro
1348 :    
1349 :     %macro makeoddpartlast 3 ; output, table, shift
1350 :    
1351 :     pmaddwd xmm2,[%2+0 ]
1352 :     pmaddwd xmm0,[%2+16]
1353 :     paddd xmm2,xmm0
1354 :    
1355 :     pmaddwd xmm6,[%2+0 ]
1356 :     pmaddwd xmm4,[%2+16]
1357 :     paddd xmm6,xmm4
1358 :    
1359 :     paddd xmm2,xmm5 ;rounder
1360 :     paddd xmm6,xmm5 ;rounder
1361 :     psrad xmm2,%3
1362 :     psrad xmm6,%3
1363 :    
1364 :     packssdw xmm2,xmm6
1365 :     movdqa [%1],xmm2
1366 :    
1367 :     %endmacro
1368 :    
1369 :    
1370 :     %macro FDCT_1D 4 ; INP,OUTP,{0=first pass, 1=second pass}, shift={11,18}
1371 :    
1372 :     ;movdqa xmm0,[%1+16*0] ;We do not load 0-3 values here for they
1373 :     ;movdqa xmm1,[%1+16*1] ;stayed from transposition
1374 :     ;movdqa xmm2,[%1+16*2]
1375 :     ;movdqa xmm3,[%1+16*3]
1376 :     %if %3<>0
1377 :     movdqa xmm7,[rounder_5]
1378 :     %endif
1379 :    
1380 :     paddsw xmm0,[%1+16*7] ;tmp0
1381 :     movdqa xmm4,xmm0
1382 :     paddsw xmm1,[%1+16*6] ;tmp1
1383 :     movdqa xmm5,xmm1
1384 :     paddsw xmm2,[%1+16*5] ;tmp2
1385 :     paddsw xmm3,[%1+16*4] ;tmp3
1386 :    
1387 :     paddsw xmm0,xmm3 ;tmp10
1388 :     %if %3<>0 ; In the second pass we must round and shift before
1389 :     ; the tmp10+tmp11 and tmp10-tmp11 calculation
1390 :     ; or the overflow will happen.
1391 :     paddsw xmm0,xmm7 ;[rounder_5]
1392 :     psraw xmm0,PASS1_BITS+3
1393 :     %endif
1394 :     movdqa xmm6,xmm0 ;tmp10
1395 :     paddsw xmm1,xmm2 ;tmp11
1396 :     psubsw xmm4,xmm3 ;tmp13
1397 :     psubsw xmm5,xmm2 ;tmp12
1398 :    
1399 :     %if %3=0
1400 :     paddsw xmm0,xmm1
1401 :     psubsw xmm6,xmm1
1402 :    
1403 :     psllw xmm0,PASS1_BITS
1404 :     psllw xmm6,PASS1_BITS
1405 :     %else
1406 :     paddsw xmm1,xmm7 ;[rounder_5]
1407 :     psraw xmm1,PASS1_BITS+3
1408 :    
1409 :     paddsw xmm0,xmm1
1410 :     psubsw xmm6,xmm1
1411 :     %endif
1412 :    
1413 :     movdqa xmm1,xmm4
1414 :     movdqa xmm2,xmm4
1415 :    
1416 :     movdqa [%2+16*0],xmm0
1417 :     movdqa [%2+16*4],xmm6
1418 :    
1419 :     movdqa xmm7,[FIX_1]
1420 :    
1421 :     punpckhwd xmm1,xmm5 ; 12 13 12 13 12 13 12 13 high part
1422 :     movdqa xmm6,xmm1 ;high
1423 :     punpcklwd xmm2,xmm5 ; 12 13 12 13 12 13 12 13 low part
1424 :     movdqa xmm0,xmm2 ;low
1425 :    
1426 :     movdqa xmm4,[FIX_2]
1427 :    
1428 :     %if %4=11
1429 :     movdqa xmm5,[rounder_11]
1430 :     %else
1431 :     movdqa xmm5,[rounder_18]
1432 :     %endif
1433 :    
1434 :     pmaddwd xmm2,xmm7 ;[FIX_1]
1435 :     pmaddwd xmm1,xmm7 ;[FIX_1]
1436 :     pmaddwd xmm0,xmm4 ;[FIX_2]
1437 :     pmaddwd xmm6,xmm4 ;[FIX_2]
1438 :    
1439 :     paddd xmm2,xmm5 ;rounder
1440 :     paddd xmm1,xmm5 ;rounder
1441 :     psrad xmm2,%4
1442 :     psrad xmm1,%4
1443 :    
1444 :     packssdw xmm2,xmm1
1445 :     movdqa [%2+16*2],xmm2
1446 :    
1447 :     paddd xmm0,xmm5 ;rounder
1448 :     paddd xmm6,xmm5 ;rounder
1449 :     psrad xmm0,%4
1450 :     psrad xmm6,%4
1451 :    
1452 :     packssdw xmm0,xmm6
1453 :     movdqa [%2+16*6],xmm0
1454 :    
1455 :     movdqa xmm0,[%1+16*0]
1456 :     movdqa xmm1,[%1+16*1]
1457 :     movdqa xmm2,[%1+16*2]
1458 :     movdqa xmm3,[%1+16*3]
1459 :    
1460 :     psubsw xmm0,[%1+16*7] ;tmp7
1461 :     movdqa xmm4,xmm0
1462 :     psubsw xmm1,[%1+16*6] ;tmp6
1463 :     psubsw xmm2,[%1+16*5] ;tmp5
1464 :     movdqa xmm6,xmm2
1465 :     psubsw xmm3,[%1+16*4] ;tmp4
1466 :    
1467 :     punpckhwd xmm4,xmm1 ; 6 7 6 7 6 7 6 7 high part
1468 :     punpcklwd xmm0,xmm1 ; 6 7 6 7 6 7 6 7 low part
1469 :     punpckhwd xmm6,xmm3 ; 4 5 4 5 4 5 4 5 high part
1470 :     punpcklwd xmm2,xmm3 ; 4 5 4 5 4 5 4 5 low part
1471 :    
1472 :     makeoddpart %2+16*1,FIX_3,%4
1473 :     makeoddpart %2+16*3,FIX_4,%4
1474 :     makeoddpart %2+16*5,FIX_5,%4
1475 :     makeoddpartlast %2+16*7,FIX_6,%4
1476 :    
1477 :     %endmacro
1478 :    
1479 :     cglobal fdct_sse2
1480 :     ;;void f dct_sse2(short *block);
1481 :     fdct_sse2:
1482 :    
1483 :     push eax
1484 :     push ebx
1485 :    
1486 :     mov eax,[esp+4+2*4]
1487 :     mov ebx,buffer
1488 :    
1489 :     prefetchnta [FIX_1]
1490 :     prefetchnta [FIX_3]
1491 :     prefetchnta [FIX_5]
1492 :    
1493 :     transpose8x8sse2 eax,ebx,1 ; First we transpose last 4 lines
1494 :     transpose8x8sse2 eax,ebx,0 ; Then the firts 4 lines
1495 :    
1496 :     ;processing columns (became rows after transposition)
1497 :    
1498 :     FDCT_1D ebx,eax,0,CONST_BITS - PASS1_BITS
1499 :    
1500 :     transpose8x8sse2 eax,ebx,1
1501 :     transpose8x8sse2 eax,ebx,0
1502 :    
1503 :     ;now processing rows
1504 :    
1505 :     FDCT_1D ebx,eax,1,CONST_BITS + PASS1_BITS + 3
1506 :    
1507 :     pop ebx
1508 :     pop eax
1509 :    
1510 :     ret

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