[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 432 - (view) (download)

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

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