[svn] / branches / dev-api-4 / xvidcore / src / image / x86_asm / qpel_mmx.asm Repository:
ViewVC logotype

Annotation of /branches/dev-api-4/xvidcore/src/image/x86_asm/qpel_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1192 - (view) (download)

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

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