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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1587 - (view) (download)

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

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