[svn] / trunk / xvidcore / src / image / x86_asm / qpel_mmx.asm Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/image/x86_asm/qpel_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1795 - (view) (download)

1 : edgomez 1382 ;/*****************************************************************************
2 :     ; *
3 :     ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - Quarter-pixel interpolation -
5 :     ; * Copyright(C) 2002 Pascal Massimino <skal@planet-d.net>
6 :     ; *
7 :     ; * This file is part of XviD, a free MPEG-4 video encoder/decoder
8 :     ; *
9 : Isibaar 1795 ; * XviD is free software; you can rDST_PTRstribute it and/or modify it
10 : edgomez 1382 ; * under the terms of the GNU General Public License as published by
11 :     ; * the Free Software Foundation; either version 2 of the License, or
12 :     ; * (at your option) any later version.
13 :     ; *
14 :     ; * This program is distributed in the hope that it will be useful,
15 :     ; * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 :     ; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 :     ; * GNU General Public License for more details.
18 :     ; *
19 :     ; * You should have received a copy of the GNU General Public License
20 :     ; * along with this program; if not, write to the Free Software
21 :     ; * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 :     ; *
23 : Isibaar 1795 ; * $Id: qpel_mmx.asm,v 1.8 2008-11-26 01:04:34 Isibaar Exp $
24 : edgomez 1382 ; *
25 :     ; *************************************************************************/
26 :    
27 :     ;/**************************************************************************
28 :     ; *
29 :     ; * History:
30 :     ; *
31 :     ; * 22.10.2002 initial coding. unoptimized 'proof of concept',
32 :     ; * just to heft the qpel filtering. - Skal -
33 :     ; *
34 :     ; *************************************************************************/
35 :    
36 :    
37 :     %define USE_TABLES ; in order to use xvid_FIR_x_x_x_x tables
38 :     ; instead of xvid_Expand_mmx...
39 :    
40 :    
41 : Isibaar 1795 %include "nasm.inc"
42 : edgomez 1382
43 :     ;//////////////////////////////////////////////////////////////////////
44 :     ;// Declarations
45 :     ;// all signatures are:
46 :     ;// void XXX(uint8_t *dst, const uint8_t *src,
47 :     ;// int32_t length, int32_t stride, int32_t rounding)
48 :     ;//////////////////////////////////////////////////////////////////////
49 :    
50 :     cglobal xvid_H_Pass_16_mmx
51 :     cglobal xvid_H_Pass_Avrg_16_mmx
52 :     cglobal xvid_H_Pass_Avrg_Up_16_mmx
53 :     cglobal xvid_V_Pass_16_mmx
54 :     cglobal xvid_V_Pass_Avrg_16_mmx
55 :     cglobal xvid_V_Pass_Avrg_Up_16_mmx
56 :     cglobal xvid_H_Pass_8_mmx
57 :     cglobal xvid_H_Pass_Avrg_8_mmx
58 :     cglobal xvid_H_Pass_Avrg_Up_8_mmx
59 :     cglobal xvid_V_Pass_8_mmx
60 :     cglobal xvid_V_Pass_Avrg_8_mmx
61 :     cglobal xvid_V_Pass_Avrg_Up_8_mmx
62 :    
63 :     cglobal xvid_H_Pass_Add_16_mmx
64 :     cglobal xvid_H_Pass_Avrg_Add_16_mmx
65 :     cglobal xvid_H_Pass_Avrg_Up_Add_16_mmx
66 :     cglobal xvid_V_Pass_Add_16_mmx
67 :     cglobal xvid_V_Pass_Avrg_Add_16_mmx
68 :     cglobal xvid_V_Pass_Avrg_Up_Add_16_mmx
69 :     cglobal xvid_H_Pass_8_Add_mmx
70 :     cglobal xvid_H_Pass_Avrg_8_Add_mmx
71 :     cglobal xvid_H_Pass_Avrg_Up_8_Add_mmx
72 :     cglobal xvid_V_Pass_8_Add_mmx
73 :     cglobal xvid_V_Pass_Avrg_8_Add_mmx
74 :     cglobal xvid_V_Pass_Avrg_Up_8_Add_mmx
75 :    
76 : Isibaar 1795 cglobal xvid_Expand_mmx
77 : edgomez 1382
78 : Isibaar 1795 cglobal xvid_FIR_1_0_0_0
79 :     cglobal xvid_FIR_3_1_0_0
80 :     cglobal xvid_FIR_6_3_1_0
81 :     cglobal xvid_FIR_14_3_2_1
82 :     cglobal xvid_FIR_20_6_3_1
83 :     cglobal xvid_FIR_20_20_6_3
84 :     cglobal xvid_FIR_23_19_6_3
85 :     cglobal xvid_FIR_7_20_20_6
86 :     cglobal xvid_FIR_6_20_20_6
87 :     cglobal xvid_FIR_6_20_20_7
88 :     cglobal xvid_FIR_3_6_20_20
89 :     cglobal xvid_FIR_3_6_19_23
90 :     cglobal xvid_FIR_1_3_6_20
91 :     cglobal xvid_FIR_1_2_3_14
92 :     cglobal xvid_FIR_0_1_3_6
93 :     cglobal xvid_FIR_0_0_1_3
94 :     cglobal xvid_FIR_0_0_0_1
95 : edgomez 1382
96 : Isibaar 1795 SECTION .data align=SECTION_ALIGN
97 : edgomez 1382
98 : Isibaar 1795 align SECTION_ALIGN
99 :     xvid_Expand_mmx:
100 :     times 256*4 dw 0 ; uint16_t xvid_Expand_mmx[256][4]
101 :     ENDFUNC
102 : edgomez 1382
103 : Isibaar 1795 xvid_FIR_1_0_0_0:
104 :     times 256*4 dw 0
105 :     ENDFUNC
106 :    
107 :     xvid_FIR_3_1_0_0:
108 :     times 256*4 dw 0
109 :     ENDFUNC
110 :    
111 :     xvid_FIR_6_3_1_0:
112 :     times 256*4 dw 0
113 :     ENDFUNC
114 :    
115 :     xvid_FIR_14_3_2_1:
116 :     times 256*4 dw 0
117 :     ENDFUNC
118 :    
119 :     xvid_FIR_20_6_3_1:
120 :     times 256*4 dw 0
121 :     ENDFUNC
122 :    
123 :     xvid_FIR_20_20_6_3:
124 :     times 256*4 dw 0
125 :     ENDFUNC
126 :    
127 :     xvid_FIR_23_19_6_3:
128 :     times 256*4 dw 0
129 :     ENDFUNC
130 :    
131 :     xvid_FIR_7_20_20_6:
132 :     times 256*4 dw 0
133 :     ENDFUNC
134 :    
135 :     xvid_FIR_6_20_20_6:
136 :     times 256*4 dw 0
137 :     ENDFUNC
138 :    
139 :     xvid_FIR_6_20_20_7:
140 :     times 256*4 dw 0
141 :     ENDFUNC
142 :    
143 :     xvid_FIR_3_6_20_20:
144 :     times 256*4 dw 0
145 :     ENDFUNC
146 :    
147 :     xvid_FIR_3_6_19_23:
148 :     times 256*4 dw 0
149 :     ENDFUNC
150 :    
151 :     xvid_FIR_1_3_6_20:
152 :     times 256*4 dw 0
153 :     ENDFUNC
154 :    
155 :     xvid_FIR_1_2_3_14:
156 :     times 256*4 dw 0
157 :     ENDFUNC
158 :    
159 :     xvid_FIR_0_1_3_6:
160 :     times 256*4 dw 0
161 :     ENDFUNC
162 :    
163 :     xvid_FIR_0_0_1_3:
164 :     times 256*4 dw 0
165 :     ENDFUNC
166 :    
167 :     xvid_FIR_0_0_0_1:
168 :     times 256*4 dw 0
169 :     ENDFUNC
170 :    
171 : edgomez 1382 ;//////////////////////////////////////////////////////////////////////
172 :    
173 : Isibaar 1795 DATA
174 : edgomez 1382
175 : Isibaar 1795 align SECTION_ALIGN
176 : edgomez 1382 Rounder1_MMX:
177 :     times 4 dw 1
178 :     Rounder0_MMX:
179 :     times 4 dw 0
180 :    
181 : Isibaar 1795 align SECTION_ALIGN
182 : Isibaar 1793 Rounder_QP_MMX:
183 : edgomez 1382 times 4 dw 16
184 :     times 4 dw 15
185 :    
186 :     %ifndef USE_TABLES
187 :    
188 : Isibaar 1795 align SECTION_ALIGN
189 : edgomez 1382
190 :     ; H-Pass table shared by 16x? and 8x? filters
191 :    
192 :     FIR_R0: dw 14, -3, 2, -1
193 : Isibaar 1795 align SECTION_ALIGN
194 : edgomez 1382 FIR_R1: dw 23, 19, -6, 3, -1, 0, 0, 0
195 :    
196 :     FIR_R2: dw -7, 20, 20, -6, 3, -1, 0, 0
197 :    
198 :     FIR_R3: dw 3, -6, 20, 20, -6, 3, -1, 0
199 :    
200 :     FIR_R4: dw -1, 3, -6, 20, 20, -6, 3, -1
201 :    
202 :     FIR_R5: dw 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0, 0
203 : Isibaar 1795 align SECTION_ALIGN
204 : edgomez 1382 FIR_R6: dw 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0
205 : Isibaar 1795 align SECTION_ALIGN
206 : edgomez 1382 FIR_R7: dw 0, 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0
207 : Isibaar 1795 align SECTION_ALIGN
208 : edgomez 1382 FIR_R8: dw -1, 3, -6, 20, 20, -6, 3, -1
209 :    
210 :     FIR_R9: dw 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0, 0
211 : Isibaar 1795 align SECTION_ALIGN
212 : edgomez 1382 FIR_R10: dw 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0, 0
213 : Isibaar 1795 align SECTION_ALIGN
214 : edgomez 1382 FIR_R11: dw 0, 0, 0, -1, 3, -6, 20, 20, -6, 3, -1, 0
215 : Isibaar 1795 align SECTION_ALIGN
216 : edgomez 1382 FIR_R12: dw -1, 3, -6, 20, 20, -6, 3, -1
217 :    
218 :     FIR_R13: dw 0, -1, 3, -6, 20, 20, -6, 3
219 :    
220 :     FIR_R14: dw 0, 0, -1, 3, -6, 20, 20, -7
221 :    
222 :     FIR_R15: dw 0, 0, 0, -1, 3, -6, 19, 23
223 :    
224 :     FIR_R16: dw -1, 2, -3, 14
225 :    
226 :     %endif ; !USE_TABLES
227 :    
228 :     ; V-Pass taps
229 :    
230 : Isibaar 1795 align SECTION_ALIGN
231 : edgomez 1382 FIR_Cm7: times 4 dw -7
232 :     FIR_Cm6: times 4 dw -6
233 :     FIR_Cm3: times 4 dw -3
234 :     FIR_Cm1: times 4 dw -1
235 :     FIR_C2: times 4 dw 2
236 :     FIR_C3: times 4 dw 3
237 :     FIR_C14: times 4 dw 14
238 :     FIR_C19: times 4 dw 19
239 :     FIR_C20: times 4 dw 20
240 :     FIR_C23: times 4 dw 23
241 :    
242 : Isibaar 1795 SECTION .rotext align=SECTION_ALIGN
243 : edgomez 1382
244 :     ;//////////////////////////////////////////////////////////////////////
245 :     ;// Here we go with the Q-Pel mess.
246 :     ;// For horizontal passes, we process 4 *output* pixel in parallel
247 :     ;// For vertical ones, we process 4 *input* pixel in parallel.
248 :     ;//////////////////////////////////////////////////////////////////////
249 :    
250 : Isibaar 1795 %ifdef ARCH_IS_X86_64
251 :     %macro XVID_MOVQ 3
252 :     lea r9, [%2]
253 :     movq %1, [r9 + %3]
254 :     %endmacro
255 :     %macro XVID_PADDW 3
256 :     lea r9, [%2]
257 :     paddw %1, [r9 + %3]
258 :     %endmacro
259 :     %ifdef WINDOWS
260 :     %define SRC_PTR _EDX
261 :     %define DST_PTR _ECX
262 :     %else
263 :     %define SRC_PTR _ESI
264 :     %define DST_PTR _EDI
265 :     %endif
266 :     %else
267 :     %macro XVID_MOVQ 3
268 :     movq %1, [%2 + %3]
269 :     %endmacro
270 :     %macro XVID_PADDW 3
271 :     paddw %1, [%2 + %3]
272 :     %endmacro
273 :     %define SRC_PTR _ESI
274 :     %define DST_PTR _EDI
275 :     %endif
276 :    
277 : edgomez 1382 %macro PROLOG_NO_AVRG 0
278 : Isibaar 1795 mov TMP0, prm3 ; Size
279 :     mov TMP1, prm4 ; BpS
280 :     mov eax, prm5d ; Rnd
281 :    
282 :     %ifndef ARCH_IS_X86_64
283 :     push SRC_PTR
284 :     push DST_PTR
285 :     %endif
286 :     push _EBP
287 :     mov _EBP, TMP1
288 :    
289 :     %ifndef ARCH_IS_X86_64
290 :     mov DST_PTR, [_ESP+16 + 0*4] ; Dst
291 :     mov SRC_PTR, [_ESP+16 + 1*4] ; Src
292 :     %endif
293 :    
294 :     and _EAX, 1
295 :     lea TMP1, [Rounder_QP_MMX]
296 :     movq mm7, [TMP1+_EAX*8] ; rounder
297 : edgomez 1382 %endmacro
298 :    
299 :     %macro EPILOG_NO_AVRG 0
300 : Isibaar 1795 pop _EBP
301 :     %ifndef ARCH_IS_X86_64
302 :     pop DST_PTR
303 :     pop SRC_PTR
304 :     %endif
305 : edgomez 1382 ret
306 :     %endmacro
307 :    
308 :     %macro PROLOG_AVRG 0
309 : Isibaar 1795 mov TMP0, prm3 ; Size
310 :     mov TMP1, prm4 ; BpS
311 :     mov eax, prm5d ; Rnd
312 :    
313 :     push _EBX
314 :     push _EBP
315 :     %ifndef ARCH_IS_X86_64
316 :     push SRC_PTR
317 :     push DST_PTR
318 :     %endif
319 :     mov _EBP, TMP1
320 :    
321 :     %ifndef ARCH_IS_X86_64
322 :     mov DST_PTR, [_ESP+20 + 0*4] ; Dst
323 :     mov SRC_PTR, [_ESP+20 + 1*4] ; Src
324 :     %endif
325 :    
326 :     and _EAX, 1
327 :     lea TMP1, [Rounder_QP_MMX]
328 :     movq mm7, [TMP1+_EAX*8] ; rounder
329 :     lea TMP1, [Rounder1_MMX]
330 :     lea _EBX, [TMP1+_EAX*8] ; *Rounder2
331 : edgomez 1382 %endmacro
332 :    
333 :     %macro EPILOG_AVRG 0
334 : Isibaar 1795 %ifndef ARCH_IS_X86_64
335 :     pop DST_PTR
336 :     pop SRC_PTR
337 :     %endif
338 :     pop _EBP
339 :     pop _EBX
340 : edgomez 1382 ret
341 :     %endmacro
342 :    
343 :     ;//////////////////////////////////////////////////////////////////////
344 :     ;//
345 :     ;// All horizontal passes
346 :     ;//
347 :     ;//////////////////////////////////////////////////////////////////////
348 :    
349 :     ; macros for USE_TABLES
350 :    
351 :     %macro TLOAD 2 ; %1,%2: src pixels
352 : Isibaar 1795 movzx _EAX, byte [SRC_PTR+%1]
353 :     movzx TMP1, byte [SRC_PTR+%2]
354 :     XVID_MOVQ mm0, xvid_FIR_14_3_2_1, _EAX*8
355 :     XVID_MOVQ mm3, xvid_FIR_1_2_3_14, TMP1*8
356 : edgomez 1382 paddw mm0, mm7
357 :     paddw mm3, mm7
358 :     %endmacro
359 :    
360 :     %macro TACCUM2 5 ;%1:src pixel/%2-%3:Taps tables/ %4-%5:dst regs
361 : Isibaar 1795 movzx _EAX, byte [SRC_PTR+%1]
362 :     XVID_PADDW %4, %2, _EAX*8
363 :     XVID_PADDW %5, %3, _EAX*8
364 : edgomez 1382 %endmacro
365 :    
366 :     %macro TACCUM3 7 ;%1:src pixel/%2-%4:Taps tables/%5-%7:dst regs
367 : Isibaar 1795 movzx _EAX, byte [SRC_PTR+%1]
368 :     XVID_PADDW %5, %2, _EAX*8
369 :     XVID_PADDW %6, %3, _EAX*8
370 :     XVID_PADDW %7, %4, _EAX*8
371 : edgomez 1382 %endmacro
372 :    
373 :     ;//////////////////////////////////////////////////////////////////////
374 :    
375 :     ; macros without USE_TABLES
376 :    
377 :     %macro LOAD 2 ; %1,%2: src pixels
378 : Isibaar 1795 movzx _EAX, byte [SRC_PTR+%1]
379 :     movzx TMP1, byte [SRC_PTR+%2]
380 :     XVID_MOVQ mm0, xvid_Expand_mmx, _EAX*8
381 :     XVID_MOVQ mm3, xvid_Expand_mmx, TMP1*8
382 : edgomez 1382 pmullw mm0, [FIR_R0 ]
383 :     pmullw mm3, [FIR_R16]
384 :     paddw mm0, mm7
385 :     paddw mm3, mm7
386 :     %endmacro
387 :    
388 :     %macro ACCUM2 4 ;src pixel/Taps/dst regs #1-#2
389 : Isibaar 1795 movzx _EAX, byte [SRC_PTR+%1]
390 :     XVID_MOVQ mm4, xvid_Expand_mmx, _EAX*8
391 : edgomez 1382 movq mm5, mm4
392 :     pmullw mm4, [%2]
393 :     pmullw mm5, [%2+8]
394 :     paddw %3, mm4
395 :     paddw %4, mm5
396 :     %endmacro
397 :    
398 :     %macro ACCUM3 5 ;src pixel/Taps/dst regs #1-#2-#3
399 : Isibaar 1795 movzx _EAX, byte [SRC_PTR+%1]
400 :     XVID_MOVQ mm4, xvid_Expand_mmx, _EAX*8
401 : edgomez 1382 movq mm5, mm4
402 :     movq mm6, mm5
403 :     pmullw mm4, [%2 ]
404 :     pmullw mm5, [%2+ 8]
405 :     pmullw mm6, [%2+16]
406 :     paddw %3, mm4
407 :     paddw %4, mm5
408 :     paddw %5, mm6
409 :     %endmacro
410 :    
411 :     ;//////////////////////////////////////////////////////////////////////
412 :    
413 :     %macro MIX 3 ; %1:reg, %2:src, %3:rounder
414 :     pxor mm6, mm6
415 :     movq mm4, [%2]
416 :     movq mm1, %1
417 :     movq mm5, mm4
418 :     punpcklbw %1, mm6
419 :     punpcklbw mm4, mm6
420 :     punpckhbw mm1, mm6
421 :     punpckhbw mm5, mm6
422 :     movq mm6, [%3] ; rounder #2
423 :     paddusw %1, mm4
424 :     paddusw mm1, mm5
425 :     paddusw %1, mm6
426 :     paddusw mm1, mm6
427 :     psrlw %1, 1
428 :     psrlw mm1, 1
429 :     packuswb %1, mm1
430 :     %endmacro
431 :    
432 :     ;//////////////////////////////////////////////////////////////////////
433 :    
434 :     %macro H_PASS_16 2 ; %1:src-op (0=NONE,1=AVRG,2=AVRG-UP), %2:dst-op (NONE/AVRG)
435 :    
436 :     %if (%2==0) && (%1==0)
437 :     PROLOG_NO_AVRG
438 :     %else
439 :     PROLOG_AVRG
440 :     %endif
441 :    
442 : Isibaar 1793 .Loop:
443 : edgomez 1382
444 :     ; mm0..mm3 serves as a 4x4 delay line
445 :    
446 :     %ifndef USE_TABLES
447 :    
448 :     LOAD 0, 16 ; special case for 1rst/last pixel
449 :     movq mm1, mm7
450 :     movq mm2, mm7
451 :    
452 :     ACCUM2 1, FIR_R1, mm0, mm1
453 :     ACCUM2 2, FIR_R2, mm0, mm1
454 :     ACCUM2 3, FIR_R3, mm0, mm1
455 :     ACCUM2 4, FIR_R4, mm0, mm1
456 :    
457 :     ACCUM3 5, FIR_R5, mm0, mm1, mm2
458 :     ACCUM3 6, FIR_R6, mm0, mm1, mm2
459 :     ACCUM3 7, FIR_R7, mm0, mm1, mm2
460 :     ACCUM2 8, FIR_R8, mm1, mm2
461 :     ACCUM3 9, FIR_R9, mm1, mm2, mm3
462 :     ACCUM3 10, FIR_R10,mm1, mm2, mm3
463 :     ACCUM3 11, FIR_R11,mm1, mm2, mm3
464 :    
465 :     ACCUM2 12, FIR_R12, mm2, mm3
466 :     ACCUM2 13, FIR_R13, mm2, mm3
467 :     ACCUM2 14, FIR_R14, mm2, mm3
468 :     ACCUM2 15, FIR_R15, mm2, mm3
469 :    
470 :     %else
471 :    
472 :     TLOAD 0, 16 ; special case for 1rst/last pixel
473 :     movq mm1, mm7
474 :     movq mm2, mm7
475 :    
476 :     TACCUM2 1, xvid_FIR_23_19_6_3, xvid_FIR_1_0_0_0 , mm0, mm1
477 :     TACCUM2 2, xvid_FIR_7_20_20_6, xvid_FIR_3_1_0_0 , mm0, mm1
478 :     TACCUM2 3, xvid_FIR_3_6_20_20, xvid_FIR_6_3_1_0 , mm0, mm1
479 :     TACCUM2 4, xvid_FIR_1_3_6_20 , xvid_FIR_20_6_3_1, mm0, mm1
480 :    
481 :     TACCUM3 5, xvid_FIR_0_1_3_6 , xvid_FIR_20_20_6_3, xvid_FIR_1_0_0_0 , mm0, mm1, mm2
482 :     TACCUM3 6, xvid_FIR_0_0_1_3 , xvid_FIR_6_20_20_6, xvid_FIR_3_1_0_0 , mm0, mm1, mm2
483 :     TACCUM3 7, xvid_FIR_0_0_0_1 , xvid_FIR_3_6_20_20, xvid_FIR_6_3_1_0 , mm0, mm1, mm2
484 :    
485 :     TACCUM2 8, xvid_FIR_1_3_6_20 , xvid_FIR_20_6_3_1 , mm1, mm2
486 :    
487 :     TACCUM3 9, xvid_FIR_0_1_3_6 , xvid_FIR_20_20_6_3, xvid_FIR_1_0_0_0, mm1, mm2, mm3
488 :     TACCUM3 10, xvid_FIR_0_0_1_3 , xvid_FIR_6_20_20_6, xvid_FIR_3_1_0_0, mm1, mm2, mm3
489 :     TACCUM3 11, xvid_FIR_0_0_0_1 , xvid_FIR_3_6_20_20, xvid_FIR_6_3_1_0, mm1, mm2, mm3
490 :    
491 :     TACCUM2 12, xvid_FIR_1_3_6_20, xvid_FIR_20_6_3_1 , mm2, mm3
492 :     TACCUM2 13, xvid_FIR_0_1_3_6 , xvid_FIR_20_20_6_3, mm2, mm3
493 :     TACCUM2 14, xvid_FIR_0_0_1_3 , xvid_FIR_6_20_20_7, mm2, mm3
494 :     TACCUM2 15, xvid_FIR_0_0_0_1 , xvid_FIR_3_6_19_23, mm2, mm3
495 :    
496 :     %endif
497 :    
498 :     psraw mm0, 5
499 :     psraw mm1, 5
500 :     psraw mm2, 5
501 :     psraw mm3, 5
502 :     packuswb mm0, mm1
503 :     packuswb mm2, mm3
504 :    
505 :     %if (%1==1)
506 : Isibaar 1795 MIX mm0, SRC_PTR, _EBX
507 : edgomez 1382 %elif (%1==2)
508 : Isibaar 1795 MIX mm0, SRC_PTR+1, _EBX
509 : edgomez 1382 %endif
510 :     %if (%2==1)
511 : Isibaar 1795 MIX mm0, DST_PTR, Rounder1_MMX
512 : edgomez 1382 %endif
513 :    
514 :     %if (%1==1)
515 : Isibaar 1795 MIX mm2, SRC_PTR+8, _EBX
516 : edgomez 1382 %elif (%1==2)
517 : Isibaar 1795 MIX mm2, SRC_PTR+9, _EBX
518 : edgomez 1382 %endif
519 :     %if (%2==1)
520 : Isibaar 1795 MIX mm2, DST_PTR+8, Rounder1_MMX
521 : edgomez 1382 %endif
522 :    
523 : Isibaar 1795 lea SRC_PTR, [SRC_PTR+_EBP]
524 : edgomez 1382
525 : Isibaar 1795 movq [DST_PTR+0], mm0
526 :     movq [DST_PTR+8], mm2
527 : edgomez 1382
528 : Isibaar 1795 add DST_PTR, _EBP
529 :     dec TMP0
530 : edgomez 1382 jg .Loop
531 :    
532 :     %if (%2==0) && (%1==0)
533 :     EPILOG_NO_AVRG
534 :     %else
535 :     EPILOG_AVRG
536 :     %endif
537 :    
538 :     %endmacro
539 :    
540 :    
541 :     ;//////////////////////////////////////////////////////////////////////
542 :    
543 :     %macro H_PASS_8 2 ; %1:src-op (0=NONE,1=AVRG,2=AVRG-UP), %2:dst-op (NONE/AVRG)
544 :    
545 :     %if (%2==0) && (%1==0)
546 :     PROLOG_NO_AVRG
547 :     %else
548 :     PROLOG_AVRG
549 :     %endif
550 :    
551 : Isibaar 1793 .Loop:
552 : edgomez 1382 ; mm0..mm3 serves as a 4x4 delay line
553 :    
554 :     %ifndef USE_TABLES
555 :    
556 :     LOAD 0, 8 ; special case for 1rst/last pixel
557 :     ACCUM2 1, FIR_R1, mm0, mm3
558 :     ACCUM2 2, FIR_R2, mm0, mm3
559 :     ACCUM2 3, FIR_R3, mm0, mm3
560 :     ACCUM2 4, FIR_R4, mm0, mm3
561 :    
562 :     ACCUM2 5, FIR_R13, mm0, mm3
563 :     ACCUM2 6, FIR_R14, mm0, mm3
564 :     ACCUM2 7, FIR_R15, mm0, mm3
565 :    
566 :     %else
567 :    
568 :     %if 0 ; test with no unrolling
569 :    
570 :     TLOAD 0, 8 ; special case for 1rst/last pixel
571 :     TACCUM2 1, xvid_FIR_23_19_6_3, xvid_FIR_1_0_0_0 , mm0, mm3
572 :     TACCUM2 2, xvid_FIR_7_20_20_6, xvid_FIR_3_1_0_0 , mm0, mm3
573 :     TACCUM2 3, xvid_FIR_3_6_20_20, xvid_FIR_6_3_1_0 , mm0, mm3
574 :     TACCUM2 4, xvid_FIR_1_3_6_20 , xvid_FIR_20_6_3_1 , mm0, mm3
575 :     TACCUM2 5, xvid_FIR_0_1_3_6 , xvid_FIR_20_20_6_3, mm0, mm3
576 :     TACCUM2 6, xvid_FIR_0_0_1_3 , xvid_FIR_6_20_20_7, mm0, mm3
577 :     TACCUM2 7, xvid_FIR_0_0_0_1 , xvid_FIR_3_6_19_23, mm0, mm3
578 :    
579 :     %else ; test with unrolling (little faster, but not much)
580 :    
581 : Isibaar 1795 movzx _EAX, byte [SRC_PTR]
582 :     movzx TMP1, byte [SRC_PTR+8]
583 :     XVID_MOVQ mm0, xvid_FIR_14_3_2_1, _EAX*8
584 :     movzx _EAX, byte [SRC_PTR+1]
585 :     XVID_MOVQ mm3, xvid_FIR_1_2_3_14, TMP1*8
586 : edgomez 1382 paddw mm0, mm7
587 :     paddw mm3, mm7
588 :    
589 : Isibaar 1795 movzx TMP1, byte [SRC_PTR+2]
590 :     XVID_PADDW mm0, xvid_FIR_23_19_6_3, _EAX*8
591 :     XVID_PADDW mm3, xvid_FIR_1_0_0_0, _EAX*8
592 : edgomez 1382
593 : Isibaar 1795 movzx _EAX, byte [SRC_PTR+3]
594 :     XVID_PADDW mm0, xvid_FIR_7_20_20_6, TMP1*8
595 :     XVID_PADDW mm3, xvid_FIR_3_1_0_0, TMP1*8
596 : edgomez 1382
597 : Isibaar 1795 movzx TMP1, byte [SRC_PTR+4]
598 :     XVID_PADDW mm0, xvid_FIR_3_6_20_20, _EAX*8
599 :     XVID_PADDW mm3, xvid_FIR_6_3_1_0, _EAX*8
600 : edgomez 1382
601 : Isibaar 1795 movzx _EAX, byte [SRC_PTR+5]
602 :     XVID_PADDW mm0, xvid_FIR_1_3_6_20, TMP1*8
603 :     XVID_PADDW mm3, xvid_FIR_20_6_3_1, TMP1*8
604 : edgomez 1382
605 : Isibaar 1795 movzx TMP1, byte [SRC_PTR+6]
606 :     XVID_PADDW mm0, xvid_FIR_0_1_3_6, _EAX*8
607 :     XVID_PADDW mm3, xvid_FIR_20_20_6_3, _EAX*8
608 : edgomez 1382
609 : Isibaar 1795 movzx _EAX, byte [SRC_PTR+7]
610 :     XVID_PADDW mm0, xvid_FIR_0_0_1_3, TMP1*8
611 :     XVID_PADDW mm3, xvid_FIR_6_20_20_7, TMP1*8
612 : edgomez 1382
613 : Isibaar 1795 XVID_PADDW mm0, xvid_FIR_0_0_0_1, _EAX*8
614 :     XVID_PADDW mm3, xvid_FIR_3_6_19_23, _EAX*8
615 : edgomez 1382
616 :     %endif
617 :    
618 :     %endif ; !USE_TABLES
619 :    
620 :     psraw mm0, 5
621 :     psraw mm3, 5
622 :     packuswb mm0, mm3
623 :    
624 :     %if (%1==1)
625 : Isibaar 1795 MIX mm0, SRC_PTR, _EBX
626 : edgomez 1382 %elif (%1==2)
627 : Isibaar 1795 MIX mm0, SRC_PTR+1, _EBX
628 : edgomez 1382 %endif
629 :     %if (%2==1)
630 : Isibaar 1795 MIX mm0, DST_PTR, Rounder1_MMX
631 : edgomez 1382 %endif
632 :    
633 : Isibaar 1795 movq [DST_PTR], mm0
634 : edgomez 1382
635 : Isibaar 1795 add DST_PTR, _EBP
636 :     add SRC_PTR, _EBP
637 :     dec TMP0
638 : edgomez 1382 jg .Loop
639 :    
640 :     %if (%2==0) && (%1==0)
641 :     EPILOG_NO_AVRG
642 :     %else
643 :     EPILOG_AVRG
644 :     %endif
645 :    
646 :     %endmacro
647 :    
648 :     ;//////////////////////////////////////////////////////////////////////
649 :     ;// 16x? copy Functions
650 :    
651 :     xvid_H_Pass_16_mmx:
652 :     H_PASS_16 0, 0
653 : Isibaar 1793 ENDFUNC
654 : edgomez 1382 xvid_H_Pass_Avrg_16_mmx:
655 :     H_PASS_16 1, 0
656 : Isibaar 1793 ENDFUNC
657 : edgomez 1382 xvid_H_Pass_Avrg_Up_16_mmx:
658 :     H_PASS_16 2, 0
659 : Isibaar 1793 ENDFUNC
660 : edgomez 1382
661 :     ;//////////////////////////////////////////////////////////////////////
662 :     ;// 8x? copy Functions
663 :    
664 :     xvid_H_Pass_8_mmx:
665 :     H_PASS_8 0, 0
666 : Isibaar 1793 ENDFUNC
667 : edgomez 1382 xvid_H_Pass_Avrg_8_mmx:
668 :     H_PASS_8 1, 0
669 : Isibaar 1793 ENDFUNC
670 : edgomez 1382 xvid_H_Pass_Avrg_Up_8_mmx:
671 :     H_PASS_8 2, 0
672 : Isibaar 1793 ENDFUNC
673 : edgomez 1382
674 :     ;//////////////////////////////////////////////////////////////////////
675 :     ;// 16x? avrg Functions
676 :    
677 :     xvid_H_Pass_Add_16_mmx:
678 :     H_PASS_16 0, 1
679 : Isibaar 1793 ENDFUNC
680 : edgomez 1382 xvid_H_Pass_Avrg_Add_16_mmx:
681 :     H_PASS_16 1, 1
682 : Isibaar 1793 ENDFUNC
683 : edgomez 1382 xvid_H_Pass_Avrg_Up_Add_16_mmx:
684 :     H_PASS_16 2, 1
685 : Isibaar 1793 ENDFUNC
686 : edgomez 1382
687 :     ;//////////////////////////////////////////////////////////////////////
688 :     ;// 8x? avrg Functions
689 :    
690 :     xvid_H_Pass_8_Add_mmx:
691 :     H_PASS_8 0, 1
692 : Isibaar 1793 ENDFUNC
693 : edgomez 1382 xvid_H_Pass_Avrg_8_Add_mmx:
694 :     H_PASS_8 1, 1
695 : Isibaar 1793 ENDFUNC
696 : edgomez 1382 xvid_H_Pass_Avrg_Up_8_Add_mmx:
697 :     H_PASS_8 2, 1
698 : Isibaar 1793 ENDFUNC
699 : edgomez 1382
700 :    
701 :    
702 :     ;//////////////////////////////////////////////////////////////////////
703 :     ;//
704 :     ;// All vertical passes
705 :     ;//
706 :     ;//////////////////////////////////////////////////////////////////////
707 :    
708 :     %macro V_LOAD 1 ; %1=Last?
709 :    
710 : Isibaar 1795 movd mm4, dword [TMP1]
711 : edgomez 1382 pxor mm6, mm6
712 :     %if (%1==0)
713 : Isibaar 1795 add TMP1, _EBP
714 : edgomez 1382 %endif
715 :     punpcklbw mm4, mm6
716 :    
717 :     %endmacro
718 :    
719 :     %macro V_ACC1 2 ; %1:reg; 2:tap
720 :     pmullw mm4, [%2]
721 :     paddw %1, mm4
722 :     %endmacro
723 :    
724 :     %macro V_ACC2 4 ; %1-%2: regs, %3-%4: taps
725 :     movq mm5, mm4
726 :     movq mm6, mm4
727 :     pmullw mm5, [%3]
728 :     pmullw mm6, [%4]
729 :     paddw %1, mm5
730 :     paddw %2, mm6
731 :     %endmacro
732 :    
733 :     %macro V_ACC2l 4 ; %1-%2: regs, %3-%4: taps
734 :     movq mm5, mm4
735 :     pmullw mm5, [%3]
736 :     pmullw mm4, [%4]
737 :     paddw %1, mm5
738 :     paddw %2, mm4
739 :     %endmacro
740 :    
741 :     %macro V_ACC4 8 ; %1-%4: regs, %5-%8: taps
742 :     V_ACC2 %1,%2, %5,%6
743 :     V_ACC2l %3,%4, %7,%8
744 :     %endmacro
745 :    
746 :    
747 :     %macro V_MIX 3 ; %1:dst-reg, %2:src, %3: rounder
748 :     pxor mm6, mm6
749 :     movq mm4, [%2]
750 :     punpcklbw %1, mm6
751 :     punpcklbw mm4, mm6
752 :     paddusw %1, mm4
753 :     paddusw %1, [%3]
754 :     psrlw %1, 1
755 :     packuswb %1, %1
756 :     %endmacro
757 :    
758 :     %macro V_STORE 4 ; %1-%2: mix ops, %3: reg, %4:last?
759 :    
760 :     psraw %3, 5
761 :     packuswb %3, %3
762 :    
763 :     %if (%1==1)
764 : Isibaar 1795 V_MIX %3, SRC_PTR, _EBX
765 :     add SRC_PTR, _EBP
766 : edgomez 1382 %elif (%1==2)
767 : Isibaar 1795 add SRC_PTR, _EBP
768 :     V_MIX %3, SRC_PTR, _EBX
769 : edgomez 1382 %endif
770 :     %if (%2==1)
771 : Isibaar 1795 V_MIX %3, DST_PTR, Rounder1_MMX
772 : edgomez 1382 %endif
773 :    
774 :     movd eax, %3
775 : Isibaar 1795 mov [DST_PTR], _EAX
776 : edgomez 1382
777 :     %if (%4==0)
778 : Isibaar 1795 add DST_PTR, _EBP
779 : edgomez 1382 %endif
780 :    
781 :     %endmacro
782 :    
783 :     ;//////////////////////////////////////////////////////////////////////
784 :    
785 :     %macro V_PASS_16 2 ; %1:src-op (0=NONE,1=AVRG,2=AVRG-UP), %2:dst-op (NONE/AVRG)
786 :    
787 :     %if (%2==0) && (%1==0)
788 :     PROLOG_NO_AVRG
789 :     %else
790 :     PROLOG_AVRG
791 :     %endif
792 :    
793 :     ; we process one stripe of 4x16 pixel each time.
794 :     ; the size (3rd argument) is meant to be a multiple of 4
795 :     ; mm0..mm3 serves as a 4x4 delay line
796 :    
797 : Isibaar 1793 .Loop:
798 : edgomez 1382
799 : Isibaar 1795 push DST_PTR
800 :     push SRC_PTR ; SRC_PTR is preserved for src-mixing
801 :     mov TMP1, SRC_PTR
802 : edgomez 1382
803 :     ; ouput rows [0..3], from input rows [0..8]
804 :    
805 :     movq mm0, mm7
806 :     movq mm1, mm7
807 :     movq mm2, mm7
808 :     movq mm3, mm7
809 :    
810 :     V_LOAD 0
811 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C14, FIR_Cm3, FIR_C2, FIR_Cm1
812 :     V_LOAD 0
813 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C23, FIR_C19, FIR_Cm6, FIR_C3
814 :     V_LOAD 0
815 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_Cm7, FIR_C20, FIR_C20, FIR_Cm6
816 :     V_LOAD 0
817 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C3, FIR_Cm6, FIR_C20, FIR_C20
818 :     V_LOAD 0
819 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_Cm1, FIR_C3, FIR_Cm6, FIR_C20
820 :     V_STORE %1, %2, mm0, 0
821 :    
822 :     V_LOAD 0
823 :     V_ACC2 mm1, mm2, FIR_Cm1, FIR_C3
824 :     V_ACC1 mm3, FIR_Cm6
825 :     V_STORE %1, %2, mm1, 0
826 :    
827 :     V_LOAD 0
828 :     V_ACC2l mm2, mm3, FIR_Cm1, FIR_C3
829 :     V_STORE %1, %2, mm2, 0
830 :    
831 :     V_LOAD 1
832 :     V_ACC1 mm3, FIR_Cm1
833 :     V_STORE %1, %2, mm3, 0
834 :    
835 :     ; ouput rows [4..7], from input rows [1..11] (!!)
836 :    
837 : Isibaar 1795 mov SRC_PTR, [_ESP]
838 :     lea TMP1, [SRC_PTR+_EBP]
839 : edgomez 1382
840 : Isibaar 1795 lea SRC_PTR, [SRC_PTR+4*_EBP] ; for src-mixing
841 :     push SRC_PTR ; this will be the new value for next round
842 : edgomez 1382
843 :     movq mm0, mm7
844 :     movq mm1, mm7
845 :     movq mm2, mm7
846 :     movq mm3, mm7
847 :    
848 :     V_LOAD 0
849 :     V_ACC1 mm0, FIR_Cm1
850 :    
851 :     V_LOAD 0
852 :     V_ACC2l mm0, mm1, FIR_C3, FIR_Cm1
853 :    
854 :     V_LOAD 0
855 :     V_ACC2 mm0, mm1, FIR_Cm6, FIR_C3
856 :     V_ACC1 mm2, FIR_Cm1
857 :    
858 :     V_LOAD 0
859 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C20, FIR_Cm6, FIR_C3, FIR_Cm1
860 :     V_LOAD 0
861 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C20, FIR_C20, FIR_Cm6, FIR_C3
862 :     V_LOAD 0
863 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_Cm6, FIR_C20, FIR_C20, FIR_Cm6
864 :     V_LOAD 0
865 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C3, FIR_Cm6, FIR_C20, FIR_C20
866 :     V_LOAD 0
867 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_Cm1, FIR_C3, FIR_Cm6, FIR_C20
868 :     V_STORE %1, %2, mm0, 0
869 :    
870 :     V_LOAD 0
871 :     V_ACC2 mm1, mm2, FIR_Cm1, FIR_C3
872 :     V_ACC1 mm3, FIR_Cm6
873 :     V_STORE %1, %2, mm1, 0
874 :    
875 :     V_LOAD 0
876 :     V_ACC2l mm2, mm3, FIR_Cm1, FIR_C3
877 :     V_STORE %1, %2, mm2, 0
878 :    
879 :     V_LOAD 1
880 :     V_ACC1 mm3, FIR_Cm1
881 :     V_STORE %1, %2, mm3, 0
882 :    
883 :     ; ouput rows [8..11], from input rows [5..15]
884 :    
885 : Isibaar 1795 pop SRC_PTR
886 :     lea TMP1, [SRC_PTR+_EBP]
887 : edgomez 1382
888 : Isibaar 1795 lea SRC_PTR, [SRC_PTR+4*_EBP] ; for src-mixing
889 :     push SRC_PTR ; this will be the new value for next round
890 : edgomez 1382
891 :     movq mm0, mm7
892 :     movq mm1, mm7
893 :     movq mm2, mm7
894 :     movq mm3, mm7
895 :    
896 :     V_LOAD 0
897 :     V_ACC1 mm0, FIR_Cm1
898 :    
899 :     V_LOAD 0
900 :     V_ACC2l mm0, mm1, FIR_C3, FIR_Cm1
901 :    
902 :     V_LOAD 0
903 :     V_ACC2 mm0, mm1, FIR_Cm6, FIR_C3
904 :     V_ACC1 mm2, FIR_Cm1
905 :    
906 :     V_LOAD 0
907 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C20, FIR_Cm6, FIR_C3, FIR_Cm1
908 :     V_LOAD 0
909 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C20, FIR_C20, FIR_Cm6, FIR_C3
910 :     V_LOAD 0
911 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_Cm6, FIR_C20, FIR_C20, FIR_Cm6
912 :     V_LOAD 0
913 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C3, FIR_Cm6, FIR_C20, FIR_C20
914 :     V_LOAD 0
915 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_Cm1, FIR_C3, FIR_Cm6, FIR_C20
916 :    
917 :     V_STORE %1, %2, mm0, 0
918 :    
919 :     V_LOAD 0
920 :     V_ACC2 mm1, mm2, FIR_Cm1, FIR_C3
921 :     V_ACC1 mm3, FIR_Cm6
922 :     V_STORE %1, %2, mm1, 0
923 :    
924 :     V_LOAD 0
925 :     V_ACC2l mm2, mm3, FIR_Cm1, FIR_C3
926 :     V_STORE %1, %2, mm2, 0
927 :    
928 :     V_LOAD 1
929 :     V_ACC1 mm3, FIR_Cm1
930 :     V_STORE %1, %2, mm3, 0
931 :    
932 :    
933 :     ; ouput rows [12..15], from input rows [9.16]
934 :    
935 : Isibaar 1795 pop SRC_PTR
936 :     lea TMP1, [SRC_PTR+_EBP]
937 : edgomez 1382
938 :     %if (%1!=0)
939 : Isibaar 1795 lea SRC_PTR, [SRC_PTR+4*_EBP] ; for src-mixing
940 : edgomez 1382 %endif
941 :    
942 :     movq mm0, mm7
943 :     movq mm1, mm7
944 :     movq mm2, mm7
945 :     movq mm3, mm7
946 :    
947 :     V_LOAD 0
948 :     V_ACC1 mm3, FIR_Cm1
949 :    
950 :     V_LOAD 0
951 :     V_ACC2l mm2, mm3, FIR_Cm1, FIR_C3
952 :    
953 :     V_LOAD 0
954 :     V_ACC2 mm1, mm2, FIR_Cm1, FIR_C3
955 :     V_ACC1 mm3, FIR_Cm6
956 :    
957 :     V_LOAD 0
958 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_Cm1, FIR_C3, FIR_Cm6, FIR_C20
959 :     V_LOAD 0
960 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C3, FIR_Cm6, FIR_C20, FIR_C20
961 :     V_LOAD 0
962 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_Cm7, FIR_C20, FIR_C20, FIR_Cm6
963 :     V_LOAD 0
964 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C23, FIR_C19, FIR_Cm6, FIR_C3
965 :     V_LOAD 1
966 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C14, FIR_Cm3, FIR_C2, FIR_Cm1
967 :    
968 :     V_STORE %1, %2, mm3, 0
969 :     V_STORE %1, %2, mm2, 0
970 :     V_STORE %1, %2, mm1, 0
971 :     V_STORE %1, %2, mm0, 1
972 :    
973 :     ; ... next 4 columns
974 :    
975 : Isibaar 1795 pop SRC_PTR
976 :     pop DST_PTR
977 :     add SRC_PTR, 4
978 :     add DST_PTR, 4
979 :     sub TMP0, 4
980 : edgomez 1382 jg .Loop
981 :    
982 :     %if (%2==0) && (%1==0)
983 :     EPILOG_NO_AVRG
984 :     %else
985 :     EPILOG_AVRG
986 :     %endif
987 :    
988 :     %endmacro
989 :    
990 :     ;//////////////////////////////////////////////////////////////////////
991 :    
992 :     %macro V_PASS_8 2 ; %1:src-op (0=NONE,1=AVRG,2=AVRG-UP), %2:dst-op (NONE/AVRG)
993 :    
994 :     %if (%2==0) && (%1==0)
995 :     PROLOG_NO_AVRG
996 :     %else
997 :     PROLOG_AVRG
998 :     %endif
999 :    
1000 :     ; we process one stripe of 4x8 pixel each time
1001 :     ; the size (3rd argument) is meant to be a multiple of 4
1002 :     ; mm0..mm3 serves as a 4x4 delay line
1003 : Isibaar 1793 .Loop:
1004 : edgomez 1382
1005 : Isibaar 1795 push DST_PTR
1006 :     push SRC_PTR ; SRC_PTR is preserved for src-mixing
1007 :     mov TMP1, SRC_PTR
1008 : edgomez 1382
1009 :     ; ouput rows [0..3], from input rows [0..8]
1010 :    
1011 :     movq mm0, mm7
1012 :     movq mm1, mm7
1013 :     movq mm2, mm7
1014 :     movq mm3, mm7
1015 :    
1016 :     V_LOAD 0
1017 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C14, FIR_Cm3, FIR_C2, FIR_Cm1
1018 :     V_LOAD 0
1019 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C23, FIR_C19, FIR_Cm6, FIR_C3
1020 :     V_LOAD 0
1021 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_Cm7, FIR_C20, FIR_C20, FIR_Cm6
1022 :     V_LOAD 0
1023 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C3, FIR_Cm6, FIR_C20, FIR_C20
1024 :     V_LOAD 0
1025 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_Cm1, FIR_C3, FIR_Cm6, FIR_C20
1026 :     V_STORE %1, %2, mm0, 0
1027 :    
1028 :     V_LOAD 0
1029 :     V_ACC2 mm1, mm2, FIR_Cm1, FIR_C3
1030 :     V_ACC1 mm3, FIR_Cm6
1031 :    
1032 :     V_STORE %1, %2, mm1, 0
1033 :    
1034 :     V_LOAD 0
1035 :     V_ACC2l mm2, mm3, FIR_Cm1, FIR_C3
1036 :     V_STORE %1, %2, mm2, 0
1037 :    
1038 :     V_LOAD 1
1039 :     V_ACC1 mm3, FIR_Cm1
1040 :     V_STORE %1, %2, mm3, 0
1041 :    
1042 :     ; ouput rows [4..7], from input rows [1..9]
1043 :    
1044 : Isibaar 1795 mov SRC_PTR, [_ESP]
1045 :     lea TMP1, [SRC_PTR+_EBP]
1046 : edgomez 1382
1047 :     %if (%1!=0)
1048 : Isibaar 1795 lea SRC_PTR, [SRC_PTR+4*_EBP] ; for src-mixing
1049 : edgomez 1382 %endif
1050 :    
1051 :     movq mm0, mm7
1052 :     movq mm1, mm7
1053 :     movq mm2, mm7
1054 :     movq mm3, mm7
1055 :    
1056 :     V_LOAD 0
1057 :     V_ACC1 mm3, FIR_Cm1
1058 :    
1059 :     V_LOAD 0
1060 :     V_ACC2l mm2, mm3, FIR_Cm1, FIR_C3
1061 :    
1062 :     V_LOAD 0
1063 :     V_ACC2 mm1, mm2, FIR_Cm1, FIR_C3
1064 :     V_ACC1 mm3, FIR_Cm6
1065 :    
1066 :     V_LOAD 0
1067 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_Cm1, FIR_C3, FIR_Cm6, FIR_C20
1068 :     V_LOAD 0
1069 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C3, FIR_Cm6, FIR_C20, FIR_C20
1070 :     V_LOAD 0
1071 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_Cm7, FIR_C20, FIR_C20, FIR_Cm6
1072 :     V_LOAD 0
1073 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C23, FIR_C19, FIR_Cm6, FIR_C3
1074 :     V_LOAD 1
1075 :     V_ACC4 mm0, mm1, mm2, mm3, FIR_C14, FIR_Cm3, FIR_C2, FIR_Cm1
1076 :    
1077 :     V_STORE %1, %2, mm3, 0
1078 :     V_STORE %1, %2, mm2, 0
1079 :     V_STORE %1, %2, mm1, 0
1080 :     V_STORE %1, %2, mm0, 1
1081 :    
1082 :     ; ... next 4 columns
1083 :    
1084 : Isibaar 1795 pop SRC_PTR
1085 :     pop DST_PTR
1086 :     add SRC_PTR, 4
1087 :     add DST_PTR, 4
1088 :     sub TMP0, 4
1089 : edgomez 1382 jg .Loop
1090 :    
1091 :     %if (%2==0) && (%1==0)
1092 :     EPILOG_NO_AVRG
1093 :     %else
1094 :     EPILOG_AVRG
1095 :     %endif
1096 :    
1097 :     %endmacro
1098 :    
1099 :    
1100 :     ;//////////////////////////////////////////////////////////////////////
1101 :     ;// 16x? copy Functions
1102 :    
1103 :     xvid_V_Pass_16_mmx:
1104 :     V_PASS_16 0, 0
1105 : Isibaar 1793 ENDFUNC
1106 : edgomez 1382 xvid_V_Pass_Avrg_16_mmx:
1107 :     V_PASS_16 1, 0
1108 : Isibaar 1793 ENDFUNC
1109 : edgomez 1382 xvid_V_Pass_Avrg_Up_16_mmx:
1110 :     V_PASS_16 2, 0
1111 : Isibaar 1793 ENDFUNC
1112 : edgomez 1382
1113 :     ;//////////////////////////////////////////////////////////////////////
1114 :     ;// 8x? copy Functions
1115 :    
1116 :     xvid_V_Pass_8_mmx:
1117 :     V_PASS_8 0, 0
1118 : Isibaar 1793 ENDFUNC
1119 : edgomez 1382 xvid_V_Pass_Avrg_8_mmx:
1120 :     V_PASS_8 1, 0
1121 : Isibaar 1793 ENDFUNC
1122 : edgomez 1382 xvid_V_Pass_Avrg_Up_8_mmx:
1123 :     V_PASS_8 2, 0
1124 : Isibaar 1793 ENDFUNC
1125 : edgomez 1382
1126 :     ;//////////////////////////////////////////////////////////////////////
1127 :     ;// 16x? avrg Functions
1128 :    
1129 :     xvid_V_Pass_Add_16_mmx:
1130 :     V_PASS_16 0, 1
1131 : Isibaar 1793 ENDFUNC
1132 : edgomez 1382 xvid_V_Pass_Avrg_Add_16_mmx:
1133 :     V_PASS_16 1, 1
1134 : Isibaar 1793 ENDFUNC
1135 : edgomez 1382 xvid_V_Pass_Avrg_Up_Add_16_mmx:
1136 :     V_PASS_16 2, 1
1137 : Isibaar 1793 ENDFUNC
1138 : edgomez 1382
1139 :     ;//////////////////////////////////////////////////////////////////////
1140 :     ;// 8x? avrg Functions
1141 :    
1142 :     xvid_V_Pass_8_Add_mmx:
1143 :     V_PASS_8 0, 1
1144 : Isibaar 1793 ENDFUNC
1145 : edgomez 1382 xvid_V_Pass_Avrg_8_Add_mmx:
1146 :     V_PASS_8 1, 1
1147 : Isibaar 1793 ENDFUNC
1148 : edgomez 1382 xvid_V_Pass_Avrg_Up_8_Add_mmx:
1149 :     V_PASS_8 2, 1
1150 : Isibaar 1793 ENDFUNC
1151 : edgomez 1382
1152 :     ;//////////////////////////////////////////////////////////////////////
1153 : Isibaar 1790
1154 : Isibaar 1795 %undef SRC_PTR
1155 :     %undef DST_PTR
1156 :    
1157 : Isibaar 1790 %ifidn __OUTPUT_FORMAT__,elf
1158 :     section ".note.GNU-stack" noalloc noexec nowrite progbits
1159 :     %endif
1160 :    

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