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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1793 - (view) (download)

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

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