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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (view) (download)

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

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