[svn] / trunk / xvidcore / src / quant / x86_asm / quantize_h263_mmx.asm Repository:
ViewVC logotype

Annotation of /trunk/xvidcore/src/quant/x86_asm/quantize_h263_mmx.asm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1839 - (view) (download)

1 : edgomez 1382 ;/*****************************************************************************
2 :     ; *
3 :     ; * XVID MPEG-4 VIDEO CODEC
4 :     ; * - MPEG4 Quantization H263 implementation / MMX optimized -
5 :     ; *
6 :     ; * Copyright(C) 2001-2003 Peter Ross <pross@xvid.org>
7 :     ; * 2002-2003 Pascal Massimino <skal@planet-d.net>
8 : edgomez 1424 ; * 2004 Jean-Marc Bastide <jmtest@voila.fr>
9 : edgomez 1382 ; *
10 :     ; * This program is free software ; you can redistribute it and/or modify
11 :     ; * it 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 1839 ; * $Id: quantize_h263_mmx.asm,v 1.13 2008-12-02 13:44:55 Isibaar Exp $
25 : edgomez 1382 ; *
26 :     ; ****************************************************************************/
27 :    
28 :     ; enable dequant saturate [-2048,2047], test purposes only.
29 :     %define SATURATE
30 :    
31 : Isibaar 1795 %include "nasm.inc"
32 : edgomez 1382
33 :     ;=============================================================================
34 :     ; Read only Local data
35 :     ;=============================================================================
36 :    
37 : Isibaar 1795 DATA
38 : edgomez 1382
39 : Isibaar 1795 ALIGN SECTION_ALIGN
40 : edgomez 1382 plus_one:
41 :     times 8 dw 1
42 :    
43 :     ;-----------------------------------------------------------------------------
44 :     ;
45 : edgomez 1424 ; quant table
46 :     ;
47 :     ;-----------------------------------------------------------------------------
48 :    
49 : Isibaar 1795 ALIGN SECTION_ALIGN
50 : edgomez 1424 mmx_quant:
51 :     %assign quant 0
52 :     %rep 32
53 :     times 4 dw quant
54 :     %assign quant quant+1
55 :     %endrep
56 :    
57 :     ;-----------------------------------------------------------------------------
58 :     ;
59 : edgomez 1382 ; subtract by Q/2 table
60 :     ;
61 :     ;-----------------------------------------------------------------------------
62 :    
63 : Isibaar 1795 ALIGN SECTION_ALIGN
64 : edgomez 1382 mmx_sub:
65 :     %assign quant 1
66 :     %rep 31
67 :     times 4 dw quant / 2
68 :     %assign quant quant+1
69 :     %endrep
70 :    
71 :     ;-----------------------------------------------------------------------------
72 :     ;
73 :     ; divide by 2Q table
74 :     ;
75 :     ; use a shift of 16 to take full advantage of _pmulhw_
76 :     ; for q=1, _pmulhw_ will overflow so it is treated seperately
77 :     ; (3dnow2 provides _pmulhuw_ which wont cause overflow)
78 :     ;
79 :     ;-----------------------------------------------------------------------------
80 :    
81 : Isibaar 1795 ALIGN SECTION_ALIGN
82 : edgomez 1382 mmx_div:
83 :     %assign quant 1
84 :     %rep 31
85 :     times 4 dw (1<<16) / (quant*2) + 1
86 :     %assign quant quant+1
87 :     %endrep
88 :    
89 :     ;=============================================================================
90 :     ; Code
91 :     ;=============================================================================
92 :    
93 : Isibaar 1795 SECTION .rotext align=SECTION_ALIGN
94 : edgomez 1382
95 :     cglobal quant_h263_intra_mmx
96 :     cglobal quant_h263_intra_sse2
97 :     cglobal quant_h263_inter_mmx
98 :     cglobal quant_h263_inter_sse2
99 :     cglobal dequant_h263_intra_mmx
100 :     cglobal dequant_h263_intra_xmm
101 :     cglobal dequant_h263_intra_sse2
102 :     cglobal dequant_h263_inter_mmx
103 :     cglobal dequant_h263_inter_xmm
104 :     cglobal dequant_h263_inter_sse2
105 :    
106 :     ;-----------------------------------------------------------------------------
107 :     ;
108 :     ; uint32_t quant_h263_intra_mmx(int16_t * coeff,
109 :     ; const int16_t const * data,
110 :     ; const uint32_t quant,
111 :     ; const uint32_t dcscalar,
112 :     ; const uint16_t *mpeg_matrices);
113 :     ;
114 :     ;-----------------------------------------------------------------------------
115 :    
116 : Isibaar 1795 ALIGN SECTION_ALIGN
117 : edgomez 1382 quant_h263_intra_mmx:
118 :    
119 : Isibaar 1795 mov _EAX, prm2 ; data
120 :     mov TMP0, prm4 ; dcscalar
121 :     movsx _EAX, word [_EAX] ; data[0]
122 :    
123 :     sar TMP0, 1 ; dcscalar /2
124 :     mov TMP1, _EAX
125 :     sar TMP1, 31 ; sgn(data[0])
126 :     xor TMP0,TMP1 ; *sgn(data[0])
127 :     sub _EAX,TMP1
128 :     add _EAX,TMP0 ; + (dcscalar/2)*sgn(data[0])
129 : edgomez 1382
130 : Isibaar 1795 mov TMP0, prm3 ; quant
131 : Isibaar 1803 lea TMP1, [mmx_div]
132 :     movq mm7, [TMP1+TMP0 * 8 - 8]
133 :     %ifdef ARCH_IS_X86_64
134 :     %ifdef WINDOWS
135 :     mov TMP1, prm2
136 :     %endif
137 :     %endif
138 : edgomez 1424 cdq
139 : Isibaar 1795 idiv prm4d ; dcscalar
140 : Isibaar 1803 %ifdef ARCH_IS_X86_64
141 :     %ifdef WINDOWS
142 :     mov prm2, TMP1
143 :     %endif
144 :     %endif
145 : Isibaar 1795 cmp TMP0, 1
146 :     mov TMP1, prm1 ; coeff
147 : edgomez 1424 je .low
148 :    
149 : Isibaar 1795 mov TMP0, prm2 ; data
150 :     push _EAX ; DC
151 :     mov _EAX, TMP0
152 : edgomez 1382
153 : Isibaar 1795 mov TMP0,4
154 :    
155 : Isibaar 1793 .loop:
156 : Isibaar 1795 movq mm0, [_EAX] ; data
157 : edgomez 1424 pxor mm4,mm4
158 : Isibaar 1795 movq mm1, [_EAX + 8]
159 : edgomez 1424 pcmpgtw mm4,mm0 ; (data<0)
160 :     pxor mm5,mm5
161 :     pmulhw mm0,mm7 ; /(2*quant)
162 :     pcmpgtw mm5,mm1
163 : Isibaar 1795 movq mm2, [_EAX+16]
164 : edgomez 1424 psubw mm0,mm4 ; +(data<0)
165 :     pmulhw mm1,mm7
166 :     pxor mm4,mm4
167 : Isibaar 1795 movq mm3,[_EAX+24]
168 : edgomez 1424 pcmpgtw mm4,mm2
169 :     psubw mm1,mm5
170 :     pmulhw mm2,mm7
171 :     pxor mm5,mm5
172 :     pcmpgtw mm5,mm3
173 :     pmulhw mm3,mm7
174 :     psubw mm2,mm4
175 :     psubw mm3,mm5
176 : Isibaar 1795 movq [TMP1], mm0
177 :     lea _EAX, [_EAX+32]
178 :     movq [TMP1 + 8], mm1
179 :     movq [TMP1 + 16], mm2
180 :     movq [TMP1 + 24], mm3
181 : edgomez 1424
182 : Isibaar 1795 dec TMP0
183 :     lea TMP1, [TMP1+32]
184 : edgomez 1424 jne .loop
185 :     jmp .end
186 :    
187 : Isibaar 1793 .low:
188 : Isibaar 1795 movd mm7,TMP0d
189 :    
190 :     mov TMP0, prm2
191 :     push _EAX
192 :     mov _EAX, TMP0
193 :    
194 :     mov TMP0,4
195 : Isibaar 1793 .loop_low:
196 : Isibaar 1795 movq mm0, [_EAX]
197 : edgomez 1424 pxor mm4,mm4
198 : Isibaar 1795 movq mm1, [_EAX + 8]
199 : edgomez 1424 pcmpgtw mm4,mm0
200 :     pxor mm5,mm5
201 :     psubw mm0,mm4
202 :     pcmpgtw mm5,mm1
203 :     psraw mm0,mm7
204 :     psubw mm1,mm5
205 : Isibaar 1795 movq mm2,[_EAX+16]
206 : edgomez 1424 pxor mm4,mm4
207 :     psraw mm1,mm7
208 :     pcmpgtw mm4,mm2
209 :     pxor mm5,mm5
210 :     psubw mm2,mm4
211 : Isibaar 1795 movq mm3,[_EAX+24]
212 : edgomez 1424 pcmpgtw mm5,mm3
213 :     psraw mm2,mm7
214 :     psubw mm3,mm5
215 : Isibaar 1795 movq [TMP1], mm0
216 : edgomez 1424 psraw mm3,mm7
217 : Isibaar 1795 movq [TMP1 + 8], mm1
218 :     movq [TMP1+16],mm2
219 :     lea _EAX, [_EAX+32]
220 :     movq [TMP1+24],mm3
221 : edgomez 1424
222 : Isibaar 1795 dec TMP0
223 :     lea TMP1, [TMP1+32]
224 : edgomez 1424 jne .loop_low
225 :    
226 : Isibaar 1793 .end:
227 : edgomez 1382
228 : Isibaar 1795 pop _EAX
229 :    
230 :     mov TMP1, prm1 ; coeff
231 :     mov [TMP1],ax
232 :     xor _EAX,_EAX ; return 0
233 :    
234 : edgomez 1382 ret
235 : Isibaar 1793 ENDFUNC
236 : edgomez 1424
237 : edgomez 1382
238 :     ;-----------------------------------------------------------------------------
239 :     ;
240 :     ; uint32_t quant_h263_intra_sse2(int16_t * coeff,
241 :     ; const int16_t const * data,
242 :     ; const uint32_t quant,
243 :     ; const uint32_t dcscalar,
244 :     ; const uint16_t *mpeg_matrices);
245 :     ;
246 :     ;-----------------------------------------------------------------------------
247 :    
248 : Isibaar 1795 ALIGN SECTION_ALIGN
249 : edgomez 1382 quant_h263_intra_sse2:
250 : Isibaar 1839 PUSH_XMM6_XMM7
251 : Isibaar 1795 mov _EAX, prm2 ; data
252 : edgomez 1424
253 : Isibaar 1795 movsx _EAX, word [_EAX] ; data[0]
254 : edgomez 1424
255 : Isibaar 1795 mov TMP0,prm4 ; dcscalar
256 :     mov TMP1,_EAX
257 :     sar TMP0,1
258 :     add _EAX,TMP0
259 :     sub TMP1,TMP0
260 :     cmovl _EAX,TMP1 ; +/- dcscalar/2
261 :     mov TMP0, prm3 ; quant
262 : Isibaar 1803 lea TMP1, [mmx_div]
263 :     movq xmm7, [TMP1+TMP0 * 8 - 8]
264 :    
265 :     %ifdef ARCH_IS_X86_64
266 :     %ifdef WINDOWS
267 :     mov TMP1, prm2
268 :     %endif
269 :     %endif
270 : edgomez 1424 cdq
271 : Isibaar 1795 idiv prm4d ; dcscalar
272 : Isibaar 1803 %ifdef ARCH_IS_X86_64
273 :     %ifdef WINDOWS
274 :     mov prm2, TMP1
275 :     %endif
276 :     %endif
277 : Isibaar 1795 cmp TMP0, 1
278 :     mov TMP1, prm1 ; coeff
279 :     je near .low
280 : edgomez 1424
281 : Isibaar 1795 mov TMP0, prm2
282 :     push _EAX ; DC
283 :     mov _EAX, TMP0
284 :    
285 :     mov TMP0,2
286 : edgomez 1424 movlhps xmm7,xmm7
287 : edgomez 1382
288 : Isibaar 1793 .loop:
289 : Isibaar 1795 movdqa xmm0, [_EAX]
290 : edgomez 1424 pxor xmm4,xmm4
291 : Isibaar 1795 movdqa xmm1, [_EAX + 16]
292 : edgomez 1424 pcmpgtw xmm4,xmm0
293 :     pxor xmm5,xmm5
294 :     pmulhw xmm0,xmm7
295 :     pcmpgtw xmm5,xmm1
296 : Isibaar 1795 movdqa xmm2, [_EAX+32]
297 : edgomez 1424 psubw xmm0,xmm4
298 :     pmulhw xmm1,xmm7
299 :     pxor xmm4,xmm4
300 : Isibaar 1795 movdqa xmm3,[_EAX+48]
301 : edgomez 1424 pcmpgtw xmm4,xmm2
302 :     psubw xmm1,xmm5
303 :     pmulhw xmm2,xmm7
304 :     pxor xmm5,xmm5
305 :     pcmpgtw xmm5,xmm3
306 :     pmulhw xmm3,xmm7
307 :     psubw xmm2,xmm4
308 :     psubw xmm3,xmm5
309 : Isibaar 1795 movdqa [TMP1], xmm0
310 :     lea _EAX, [_EAX+64]
311 :     movdqa [TMP1 + 16], xmm1
312 :     movdqa [TMP1 + 32], xmm2
313 :     movdqa [TMP1 + 48], xmm3
314 : edgomez 1424
315 : Isibaar 1795 dec TMP0
316 :     lea TMP1, [TMP1+64]
317 : edgomez 1424 jne .loop
318 :     jmp .end
319 :    
320 : Isibaar 1793 .low:
321 : Isibaar 1795 movd xmm7,TMP0d
322 :    
323 :     mov TMP0, prm2
324 :     push _EAX ; DC
325 :     mov _EAX, TMP0
326 :    
327 :     mov TMP0,2
328 : Isibaar 1793 .loop_low:
329 : Isibaar 1795 movdqa xmm0, [_EAX]
330 : edgomez 1424 pxor xmm4,xmm4
331 : Isibaar 1795 movdqa xmm1, [_EAX + 16]
332 : edgomez 1424 pcmpgtw xmm4,xmm0
333 :     pxor xmm5,xmm5
334 :     psubw xmm0,xmm4
335 :     pcmpgtw xmm5,xmm1
336 :     psraw xmm0,xmm7
337 :     psubw xmm1,xmm5
338 : Isibaar 1795 movdqa xmm2,[_EAX+32]
339 : edgomez 1424 pxor xmm4,xmm4
340 :     psraw xmm1,xmm7
341 :     pcmpgtw xmm4,xmm2
342 :     pxor xmm5,xmm5
343 :     psubw xmm2,xmm4
344 : Isibaar 1795 movdqa xmm3,[_EAX+48]
345 : edgomez 1424 pcmpgtw xmm5,xmm3
346 :     psraw xmm2,xmm7
347 :     psubw xmm3,xmm5
348 : Isibaar 1795 movdqa [TMP1], xmm0
349 : edgomez 1424 psraw xmm3,xmm7
350 : Isibaar 1795 movdqa [TMP1+16], xmm1
351 :     movdqa [TMP1+32],xmm2
352 :     lea _EAX, [_EAX+64]
353 :     movdqa [TMP1+48],xmm3
354 : edgomez 1424
355 : Isibaar 1795 dec TMP0
356 :     lea TMP1, [TMP1+64]
357 : edgomez 1424 jne .loop_low
358 :    
359 : Isibaar 1793 .end:
360 : edgomez 1382
361 : Isibaar 1795 pop _EAX
362 :    
363 :     mov TMP1, prm1 ; coeff
364 :     mov [TMP1],ax
365 :     xor _EAX,_EAX ; return 0
366 : Isibaar 1839 POP_XMM6_XMM7
367 : edgomez 1382 ret
368 : Isibaar 1793 ENDFUNC
369 : edgomez 1424
370 : edgomez 1382 ;-----------------------------------------------------------------------------
371 :     ;
372 :     ; uint32_t quant_h263_inter_mmx(int16_t * coeff,
373 :     ; const int16_t const * data,
374 :     ; const uint32_t quant,
375 :     ; const uint16_t *mpeg_matrices);
376 :     ;
377 :     ;-----------------------------------------------------------------------------
378 : edgomez 1424
379 : Isibaar 1795 ALIGN SECTION_ALIGN
380 : edgomez 1382 quant_h263_inter_mmx:
381 :    
382 : Isibaar 1795 mov TMP1, prm1 ; coeff
383 :     mov _EAX, prm3 ; quant
384 : edgomez 1382
385 :     pxor mm5, mm5 ; sum
386 : Isibaar 1795 lea TMP0, [mmx_sub]
387 :     movq mm6, [TMP0 + _EAX * 8 - 8] ; sub
388 : edgomez 1382
389 :     cmp al, 1
390 : Isibaar 1795 jz near .q1routine
391 : edgomez 1382
392 : Isibaar 1795 lea TMP0, [mmx_div]
393 :     movq mm7, [TMP0 + _EAX * 8 - 8] ; divider
394 : edgomez 1382
395 : Isibaar 1795 xor TMP0, TMP0
396 :     mov _EAX, prm2 ; data
397 :    
398 :     ALIGN SECTION_ALIGN
399 : Isibaar 1793 .loop:
400 : Isibaar 1795 movq mm0, [_EAX + 8*TMP0] ; mm0 = [1st]
401 :     movq mm3, [_EAX + 8*TMP0 + 8]
402 : edgomez 1382 pxor mm1, mm1 ; mm1 = 0
403 :     pxor mm4, mm4 ;
404 :     pcmpgtw mm1, mm0 ; mm1 = (0 > mm0)
405 :     pcmpgtw mm4, mm3 ;
406 :     pxor mm0, mm1 ; mm0 = |mm0|
407 :     pxor mm3, mm4 ;
408 :     psubw mm0, mm1 ; displace
409 :     psubw mm3, mm4 ;
410 :     psubusw mm0, mm6 ; mm0 -= sub (unsigned, dont go < 0)
411 :     psubusw mm3, mm6 ;
412 :     pmulhw mm0, mm7 ; mm0 = (mm0 / 2Q) >> 16
413 :     pmulhw mm3, mm7 ;
414 :     paddw mm5, mm0 ; sum += mm0
415 :     pxor mm0, mm1 ; mm0 *= sign(mm0)
416 :     paddw mm5, mm3 ;
417 :     pxor mm3, mm4 ;
418 :     psubw mm0, mm1 ; undisplace
419 :     psubw mm3, mm4
420 : Isibaar 1795 movq [TMP1 + 8*TMP0], mm0
421 :     movq [TMP1 + 8*TMP0 + 8], mm3
422 : edgomez 1382
423 : Isibaar 1795 add TMP0, 2
424 :     cmp TMP0, 16
425 : edgomez 1382 jnz .loop
426 :    
427 : Isibaar 1793 .done:
428 : edgomez 1382 pmaddwd mm5, [plus_one]
429 :     movq mm0, mm5
430 :     psrlq mm5, 32
431 :     paddd mm0, mm5
432 :    
433 :     movd eax, mm0 ; return sum
434 :    
435 :     ret
436 :    
437 : Isibaar 1795 .q1routine:
438 :     xor TMP0, TMP0
439 :     mov _EAX, prm2 ; data
440 :    
441 :     ALIGN SECTION_ALIGN
442 : Isibaar 1793 .q1loop:
443 : Isibaar 1795 movq mm0, [_EAX + 8*TMP0] ; mm0 = [1st]
444 :     movq mm3, [_EAX + 8*TMP0+ 8] ;
445 : edgomez 1382 pxor mm1, mm1 ; mm1 = 0
446 :     pxor mm4, mm4 ;
447 :     pcmpgtw mm1, mm0 ; mm1 = (0 > mm0)
448 :     pcmpgtw mm4, mm3 ;
449 :     pxor mm0, mm1 ; mm0 = |mm0|
450 :     pxor mm3, mm4 ;
451 :     psubw mm0, mm1 ; displace
452 :     psubw mm3, mm4 ;
453 :     psubusw mm0, mm6 ; mm0 -= sub (unsigned, dont go < 0)
454 :     psubusw mm3, mm6 ;
455 :     psrlw mm0, 1 ; mm0 >>= 1 (/2)
456 :     psrlw mm3, 1 ;
457 :     paddw mm5, mm0 ; sum += mm0
458 :     pxor mm0, mm1 ; mm0 *= sign(mm0)
459 :     paddw mm5, mm3 ;
460 :     pxor mm3, mm4 ;
461 :     psubw mm0, mm1 ; undisplace
462 :     psubw mm3, mm4
463 : Isibaar 1795 movq [TMP1 + 8*TMP0], mm0
464 :     movq [TMP1 + 8*TMP0 + 8], mm3
465 : edgomez 1382
466 : Isibaar 1795 add TMP0, 2
467 :     cmp TMP0, 16
468 : edgomez 1382 jnz .q1loop
469 :    
470 :     jmp .done
471 : Isibaar 1793 ENDFUNC
472 : edgomez 1382
473 :    
474 :    
475 :     ;-----------------------------------------------------------------------------
476 :     ;
477 :     ; uint32_t quant_h263_inter_sse2(int16_t * coeff,
478 :     ; const int16_t const * data,
479 :     ; const uint32_t quant,
480 :     ; const uint16_t *mpeg_matrices);
481 :     ;
482 :     ;-----------------------------------------------------------------------------
483 :    
484 : Isibaar 1795 ALIGN SECTION_ALIGN
485 : edgomez 1382 quant_h263_inter_sse2:
486 : Isibaar 1833 PUSH_XMM6_XMM7
487 :    
488 : Isibaar 1795 mov TMP1, prm1 ; coeff
489 :     mov _EAX, prm3 ; quant
490 : edgomez 1382
491 :     pxor xmm5, xmm5 ; sum
492 :    
493 : Isibaar 1795 lea TMP0, [mmx_sub]
494 : Isibaar 1839 movq xmm6, [TMP0 + _EAX*8 - 8] ; sub
495 : edgomez 1382 movlhps xmm6, xmm6 ; duplicate into high 8 bytes
496 :    
497 :     cmp al, 1
498 : Isibaar 1795 jz near .qes2_q1_routine
499 : edgomez 1382
500 : Isibaar 1793 .qes2_not1:
501 : Isibaar 1795 lea TMP0, [mmx_div]
502 : Isibaar 1839 movq xmm7, [TMP0 + _EAX*8 - 8] ; divider
503 : Isibaar 1795
504 :     xor TMP0, TMP0
505 :     mov _EAX, prm2 ; data
506 :    
507 : edgomez 1382 movlhps xmm7, xmm7
508 :    
509 : Isibaar 1795 ALIGN SECTION_ALIGN
510 : Isibaar 1793 .qes2_loop:
511 : Isibaar 1795 movdqa xmm0, [_EAX + TMP0*8] ; xmm0 = [1st]
512 :     movdqa xmm3, [_EAX + TMP0*8 + 16] ; xmm3 = [2nd]
513 : edgomez 1382 pxor xmm1, xmm1
514 :     pxor xmm4, xmm4
515 :     pcmpgtw xmm1, xmm0
516 :     pcmpgtw xmm4, xmm3
517 :     pxor xmm0, xmm1
518 :     pxor xmm3, xmm4
519 :     psubw xmm0, xmm1
520 :     psubw xmm3, xmm4
521 :     psubusw xmm0, xmm6
522 :     psubusw xmm3, xmm6
523 :     pmulhw xmm0, xmm7
524 :     pmulhw xmm3, xmm7
525 :     paddw xmm5, xmm0
526 :     pxor xmm0, xmm1
527 :     paddw xmm5, xmm3
528 :     pxor xmm3, xmm4
529 :     psubw xmm0, xmm1
530 :     psubw xmm3, xmm4
531 : Isibaar 1795 movdqa [TMP1 + TMP0*8], xmm0
532 :     movdqa [TMP1 + TMP0*8 + 16], xmm3
533 : edgomez 1382
534 : Isibaar 1795 add TMP0, 4
535 :     cmp TMP0, 16
536 : edgomez 1382 jnz .qes2_loop
537 :    
538 : Isibaar 1793 .qes2_done:
539 : Isibaar 1839 movdqa xmm6, [plus_one]
540 : edgomez 1382 pmaddwd xmm5, xmm6
541 :     movhlps xmm6, xmm5
542 :     paddd xmm5, xmm6
543 :     movdq2q mm0, xmm5
544 :    
545 :     movq mm5, mm0
546 :     psrlq mm5, 32
547 :     paddd mm0, mm5
548 :    
549 :     movd eax, mm0 ; return sum
550 :    
551 : Isibaar 1833 POP_XMM6_XMM7
552 : edgomez 1382 ret
553 :    
554 : Isibaar 1795 .qes2_q1_routine:
555 :     xor TMP0, TMP0
556 :     mov _EAX, prm2 ; data
557 :    
558 :     ALIGN SECTION_ALIGN
559 : Isibaar 1793 .qes2_q1loop:
560 : Isibaar 1795 movdqa xmm0, [_EAX + TMP0*8] ; xmm0 = [1st]
561 :     movdqa xmm3, [_EAX + TMP0*8 + 16] ; xmm3 = [2nd]
562 : edgomez 1382 pxor xmm1, xmm1
563 :     pxor xmm4, xmm4
564 :     pcmpgtw xmm1, xmm0
565 :     pcmpgtw xmm4, xmm3
566 :     pxor xmm0, xmm1
567 :     pxor xmm3, xmm4
568 :     psubw xmm0, xmm1
569 :     psubw xmm3, xmm4
570 :     psubusw xmm0, xmm6
571 :     psubusw xmm3, xmm6
572 :     psrlw xmm0, 1
573 :     psrlw xmm3, 1
574 :     paddw xmm5, xmm0
575 :     pxor xmm0, xmm1
576 :     paddw xmm5, xmm3
577 :     pxor xmm3, xmm4
578 :     psubw xmm0, xmm1
579 :     psubw xmm3, xmm4
580 : Isibaar 1795 movdqa [TMP1 + TMP0*8], xmm0
581 :     movdqa [TMP1 + TMP0*8 + 16], xmm3
582 : edgomez 1382
583 : Isibaar 1795 add TMP0, 4
584 :     cmp TMP0, 16
585 : edgomez 1382 jnz .qes2_q1loop
586 :     jmp .qes2_done
587 : Isibaar 1793 ENDFUNC
588 : edgomez 1382
589 :    
590 :     ;-----------------------------------------------------------------------------
591 :     ;
592 :     ; uint32_t dequant_h263_intra_mmx(int16_t *data,
593 :     ; const int16_t const *coeff,
594 :     ; const uint32_t quant,
595 :     ; const uint32_t dcscalar,
596 :     ; const uint16_t *mpeg_matrices);
597 :     ;
598 :     ;-----------------------------------------------------------------------------
599 :    
600 : Isibaar 1795 ALIGN SECTION_ALIGN
601 : edgomez 1382 dequant_h263_intra_mmx:
602 :    
603 : Isibaar 1795 mov TMP0, prm3 ; quant
604 :     mov _EAX, prm2 ; coeff
605 : edgomez 1424 pcmpeqw mm0,mm0
606 : Isibaar 1795 lea TMP1, [mmx_quant]
607 :     movq mm6, [TMP1 + TMP0*8] ; quant
608 :     shl TMP0,31 ; quant & 1 ? 0 : - 1
609 : edgomez 1424 movq mm7,mm6
610 :     movq mm5,mm0
611 : Isibaar 1795 movd mm1,TMP0d
612 :     mov TMP1, prm1 ; data
613 : edgomez 1424 psllw mm0,mm1
614 : Isibaar 1795 paddw mm7,mm7 ; 2*quant
615 :     paddw mm6,mm0 ; quant-1
616 : edgomez 1424 psllw mm5,12
617 : Isibaar 1795 mov TMP0,8
618 : edgomez 1424 psrlw mm5,1
619 : edgomez 1382
620 : edgomez 1424 .loop:
621 : Isibaar 1795 movq mm0,[_EAX]
622 : edgomez 1424 pxor mm2,mm2
623 :     pxor mm4,mm4
624 :     pcmpgtw mm2,mm0
625 :     pcmpeqw mm4,mm0
626 :     pmullw mm0,mm7 ; * 2 * quant
627 : Isibaar 1795 movq mm1,[_EAX+8]
628 : edgomez 1424 psubw mm0,mm2
629 :     pxor mm2,mm6
630 :     pxor mm3,mm3
631 :     pandn mm4,mm2
632 :     pxor mm2,mm2
633 :     pcmpgtw mm3,mm1
634 :     pcmpeqw mm2,mm1
635 :     pmullw mm1,mm7
636 :     paddw mm0,mm4
637 :     psubw mm1,mm3
638 :     pxor mm3,mm6
639 :     pandn mm2,mm3
640 :     paddsw mm0, mm5 ; saturate
641 :     paddw mm1,mm2
642 :    
643 :     paddsw mm1, mm5
644 :     psubsw mm0, mm5
645 :     psubsw mm1, mm5
646 :     psubsw mm0, mm5
647 :     psubsw mm1, mm5
648 :     paddsw mm0, mm5
649 :     paddsw mm1, mm5
650 :    
651 : Isibaar 1795 movq [TMP1],mm0
652 :     lea _EAX,[_EAX+16]
653 :     movq [TMP1+8],mm1
654 : edgomez 1424
655 : Isibaar 1795 dec TMP0
656 :     lea TMP1,[TMP1+16]
657 : edgomez 1424 jne .loop
658 :    
659 :     ; deal with DC
660 : Isibaar 1795 mov _EAX, prm2 ; coeff
661 :     movd mm1,prm4d ; dcscalar
662 :     movd mm0,[_EAX] ; coeff[0]
663 : edgomez 1432 pmullw mm0,mm1 ; * dcscalar
664 : Isibaar 1795 mov TMP1, prm1 ; data
665 : edgomez 1432 paddsw mm0, mm5 ; saturate +
666 :     psubsw mm0, mm5
667 :     psubsw mm0, mm5 ; saturate -
668 :     paddsw mm0, mm5
669 :     movd eax,mm0
670 : Isibaar 1795 mov [TMP1], ax
671 : edgomez 1382
672 : Isibaar 1795 xor _EAX, _EAX ; return 0
673 : edgomez 1382 ret
674 : Isibaar 1793 ENDFUNC
675 : edgomez 1382
676 :     ;-----------------------------------------------------------------------------
677 :     ;
678 :     ; uint32_t dequant_h263_intra_xmm(int16_t *data,
679 :     ; const int16_t const *coeff,
680 :     ; const uint32_t quant,
681 :     ; const uint32_t dcscalar,
682 :     ; const uint16_t *mpeg_matrices);
683 :     ;
684 :     ;-----------------------------------------------------------------------------
685 :    
686 : edgomez 1424
687 : Isibaar 1795 ALIGN SECTION_ALIGN
688 : edgomez 1382 dequant_h263_intra_xmm:
689 :    
690 : Isibaar 1795 mov TMP0, prm3 ; quant
691 :     mov _EAX, prm2 ; coeff
692 : edgomez 1424
693 : Isibaar 1795 movd mm6,TMP0d ; quant
694 : edgomez 1424 pcmpeqw mm0,mm0
695 : Isibaar 1795 pshufw mm6,mm6,0 ; all quant
696 :     shl TMP0,31
697 : edgomez 1424 movq mm5,mm0
698 :     movq mm7,mm6
699 : Isibaar 1795 movd mm1,TMP0d
700 :     mov TMP1, prm1 ; data
701 :     psllw mm0,mm1 ; quant & 1 ? 0 : - 1
702 : edgomez 1424 movq mm4,mm5
703 : Isibaar 1795 paddw mm7,mm7 ; quant*2
704 :     paddw mm6,mm0 ; quant-1
705 :     psrlw mm4,5 ; mm4=2047
706 :     mov TMP0,8
707 :     pxor mm5,mm4 ; mm5=-2048
708 : edgomez 1424
709 :     .loop:
710 : Isibaar 1795 movq mm0,[_EAX]
711 : edgomez 1424 pxor mm2,mm2
712 :     pxor mm3,mm3
713 : edgomez 1382
714 : edgomez 1424 pcmpgtw mm2,mm0
715 :     pcmpeqw mm3,mm0 ; if coeff==0...
716 :     pmullw mm0,mm7 ; * 2 * quant
717 : Isibaar 1795 movq mm1,[_EAX+8]
718 : edgomez 1424
719 :     psubw mm0,mm2
720 :     pxor mm2,mm6
721 :     pandn mm3,mm2 ; ...then data=0
722 :     pxor mm2,mm2
723 :     paddw mm0,mm3
724 :     pxor mm3,mm3
725 :     pcmpeqw mm2,mm1
726 :     pcmpgtw mm3,mm1
727 :     pmullw mm1,mm7
728 :    
729 :     pminsw mm0,mm4
730 :     psubw mm1,mm3
731 :     pxor mm3,mm6
732 :     pandn mm2,mm3
733 :     paddw mm1,mm2
734 :    
735 :     pmaxsw mm0,mm5
736 :     pminsw mm1,mm4
737 : Isibaar 1795 movq [TMP1],mm0
738 : edgomez 1424 pmaxsw mm1,mm5
739 : Isibaar 1795 lea _EAX,[_EAX+16]
740 :     movq [TMP1+8],mm1
741 : edgomez 1424
742 : Isibaar 1795 dec TMP0
743 :     lea TMP1,[TMP1+16]
744 : edgomez 1424 jne .loop
745 :    
746 :     ; deal with DC
747 : Isibaar 1795 mov _EAX, prm2 ; coeff
748 :     movd mm1,prm4d ; dcscalar
749 :     movd mm0, [_EAX]
750 : edgomez 1432 pmullw mm0, mm1
751 : Isibaar 1795 mov TMP1, prm1 ; data
752 : edgomez 1424 pminsw mm0,mm4
753 :     pmaxsw mm0,mm5
754 : edgomez 1382 movd eax, mm0
755 : Isibaar 1795 mov [TMP1], ax
756 : edgomez 1382
757 : Isibaar 1795 xor _EAX, _EAX ; return 0
758 : edgomez 1382 ret
759 : Isibaar 1793 ENDFUNC
760 : edgomez 1382
761 :    
762 :     ;-----------------------------------------------------------------------------
763 :     ;
764 :     ; uint32_t dequant_h263_intra_sse2(int16_t *data,
765 :     ; const int16_t const *coeff,
766 :     ; const uint32_t quant,
767 :     ; const uint32_t dcscalar,
768 :     ; const uint16_t *mpeg_matrices);
769 :     ;
770 :     ;-----------------------------------------------------------------------------
771 :    
772 : Isibaar 1795 ALIGN SECTION_ALIGN
773 : edgomez 1382 dequant_h263_intra_sse2:
774 : Isibaar 1833 PUSH_XMM6_XMM7
775 :    
776 : Isibaar 1795 mov TMP0, prm3 ; quant
777 :     mov _EAX, prm2 ; coeff
778 : edgomez 1424
779 : Isibaar 1795 movd xmm6,TMP0d ; quant
780 : edgomez 1432
781 : Isibaar 1795 shl TMP0,31
782 : edgomez 1424 pshuflw xmm6,xmm6,0
783 :     pcmpeqw xmm0,xmm0
784 :     movlhps xmm6,xmm6 ; all quant
785 : Isibaar 1795 movd xmm1,TMP0d
786 : edgomez 1424 movdqa xmm5,xmm0
787 :     movdqa xmm7,xmm6
788 : Isibaar 1795 mov TMP1, prm1 ; data
789 : edgomez 1424 paddw xmm7,xmm7 ; quant *2
790 :     psllw xmm0,xmm1 ; quant & 1 ? 0 : - 1
791 :     movdqa xmm4,xmm5
792 :     paddw xmm6,xmm0 ; quant-1
793 :     psrlw xmm4,5 ; 2047
794 : Isibaar 1795 mov TMP0,4
795 : edgomez 1424 pxor xmm5,xmm4 ; mm5=-2048
796 :    
797 :     .loop:
798 : Isibaar 1795 movdqa xmm0,[_EAX]
799 : edgomez 1424 pxor xmm2,xmm2
800 :     pxor xmm3,xmm3
801 : edgomez 1382
802 : edgomez 1424 pcmpgtw xmm2,xmm0
803 :     pcmpeqw xmm3,xmm0
804 :     pmullw xmm0,xmm7 ; * 2 * quant
805 : Isibaar 1795 movdqa xmm1,[_EAX+16]
806 : edgomez 1424
807 :     psubw xmm0,xmm2
808 :     pxor xmm2,xmm6
809 :     pandn xmm3,xmm2
810 :     pxor xmm2,xmm2
811 :     paddw xmm0,xmm3
812 :     pxor xmm3,xmm3
813 :     pcmpeqw xmm2,xmm1
814 :     pcmpgtw xmm3,xmm1
815 :     pmullw xmm1,xmm7
816 :    
817 :     pminsw xmm0,xmm4
818 :     psubw xmm1,xmm3
819 :     pxor xmm3,xmm6
820 :     pandn xmm2,xmm3
821 :     paddw xmm1,xmm2
822 :    
823 :     pmaxsw xmm0,xmm5
824 :     pminsw xmm1,xmm4
825 : Isibaar 1795 movdqa [TMP1],xmm0
826 : edgomez 1424 pmaxsw xmm1,xmm5
827 : Isibaar 1795 lea _EAX,[_EAX+32]
828 :     movdqa [TMP1+16],xmm1
829 : edgomez 1424
830 : Isibaar 1795 dec TMP0
831 :     lea TMP1,[TMP1+32]
832 : edgomez 1424 jne .loop
833 :    
834 :     ; deal with DC
835 : edgomez 1382
836 : Isibaar 1795 mov _EAX, prm2 ; coeff
837 :     movsx _EAX,word [_EAX]
838 :     imul prm4d ; dcscalar
839 :     mov TMP1, prm1 ; data
840 : edgomez 1424 movd xmm0,eax
841 :     pminsw xmm0,xmm4
842 :     pmaxsw xmm0,xmm5
843 :     movd eax,xmm0
844 :    
845 : Isibaar 1795 mov [TMP1], ax
846 : edgomez 1382
847 : Isibaar 1795 xor _EAX, _EAX ; return 0
848 : Isibaar 1833
849 :     POP_XMM6_XMM7
850 : edgomez 1382 ret
851 : Isibaar 1793 ENDFUNC
852 : edgomez 1382
853 :     ;-----------------------------------------------------------------------------
854 :     ;
855 :     ; uint32t dequant_h263_inter_mmx(int16_t * data,
856 :     ; const int16_t * const coeff,
857 :     ; const uint32_t quant,
858 :     ; const uint16_t *mpeg_matrices);
859 :     ;
860 :     ;-----------------------------------------------------------------------------
861 :    
862 : Isibaar 1795 ALIGN SECTION_ALIGN
863 : edgomez 1382 dequant_h263_inter_mmx:
864 :    
865 : Isibaar 1795 mov TMP0, prm3 ; quant
866 :     mov _EAX, prm2 ; coeff
867 : edgomez 1424 pcmpeqw mm0,mm0
868 : Isibaar 1795 lea TMP1, [mmx_quant]
869 :     movq mm6, [TMP1 + TMP0*8] ; quant
870 :     shl TMP0,31 ; odd/even
871 : edgomez 1424 movq mm7,mm6
872 : Isibaar 1795 movd mm1,TMP0d
873 :     mov TMP1, prm1 ; data
874 : edgomez 1424 movq mm5,mm0
875 : Isibaar 1795 psllw mm0,mm1 ; quant & 1 ? 0 : - 1
876 :     paddw mm7,mm7 ; quant*2
877 :     paddw mm6,mm0 ; quant & 1 ? quant : quant - 1
878 : edgomez 1424 psllw mm5,12
879 : Isibaar 1795 mov TMP0,8
880 :     psrlw mm5,1 ; 32767-2047 (32768-2048)
881 : edgomez 1382
882 : edgomez 1424 .loop:
883 : Isibaar 1795 movq mm0,[_EAX]
884 : edgomez 1424 pxor mm4,mm4
885 :     pxor mm2,mm2
886 :     pcmpeqw mm4,mm0 ; if coeff==0...
887 :     pcmpgtw mm2,mm0
888 :     pmullw mm0,mm7 ; * 2 * quant
889 :     pxor mm3,mm3
890 :     psubw mm0,mm2
891 : Isibaar 1795 movq mm1,[_EAX+8]
892 : edgomez 1424 pxor mm2,mm6
893 :     pcmpgtw mm3,mm1
894 :     pandn mm4,mm2 ; ... then data==0
895 :     pmullw mm1,mm7
896 :     pxor mm2,mm2
897 :     pcmpeqw mm2,mm1
898 :     psubw mm1,mm3
899 :     pxor mm3,mm6
900 :     pandn mm2,mm3
901 :     paddw mm0,mm4
902 :     paddw mm1,mm2
903 :    
904 :     paddsw mm0, mm5 ; saturate
905 :     paddsw mm1, mm5
906 :     psubsw mm0, mm5
907 :     psubsw mm1, mm5
908 :     psubsw mm0, mm5
909 :     psubsw mm1, mm5
910 :     paddsw mm0, mm5
911 :     paddsw mm1, mm5
912 :    
913 : Isibaar 1795 movq [TMP1],mm0
914 :     lea _EAX,[_EAX+16]
915 :     movq [TMP1+8],mm1
916 : edgomez 1424
917 : Isibaar 1795 dec TMP0
918 :     lea TMP1,[TMP1+16]
919 : edgomez 1424 jne .loop
920 :    
921 : Isibaar 1795 xor _EAX, _EAX ; return 0
922 : edgomez 1424 ret
923 : Isibaar 1793 ENDFUNC
924 : edgomez 1382
925 :    
926 :     ;-----------------------------------------------------------------------------
927 :     ;
928 :     ; uint32_t dequant_h263_inter_xmm(int16_t * data,
929 :     ; const int16_t * const coeff,
930 :     ; const uint32_t quant,
931 :     ; const uint16_t *mpeg_matrices);
932 :     ;
933 :     ;-----------------------------------------------------------------------------
934 : Isibaar 1795 ALIGN SECTION_ALIGN
935 : edgomez 1382 dequant_h263_inter_xmm:
936 :    
937 : Isibaar 1795 mov TMP0, prm3 ; quant
938 :     mov _EAX, prm2 ; coeff
939 : edgomez 1424 pcmpeqw mm0,mm0
940 : Isibaar 1795 lea TMP1, [mmx_quant]
941 :     movq mm6, [TMP1 + TMP0*8] ; quant
942 :     shl TMP0,31
943 : edgomez 1424 movq mm5,mm0
944 : Isibaar 1795 movd mm1,TMP0d
945 : edgomez 1424 movq mm7,mm6
946 :     psllw mm0,mm1
947 : Isibaar 1795 mov TMP1, prm1 ; data
948 : edgomez 1424 movq mm4,mm5
949 :     paddw mm7,mm7
950 :     paddw mm6,mm0 ; quant-1
951 : edgomez 1382
952 : edgomez 1424 psrlw mm4,5
953 : Isibaar 1795 mov TMP0,8
954 : edgomez 1424 pxor mm5,mm4 ; mm5=-2048
955 :    
956 :     .loop:
957 : Isibaar 1795 movq mm0,[_EAX]
958 : edgomez 1424 pxor mm3,mm3
959 :     pxor mm2,mm2
960 :     pcmpeqw mm3,mm0
961 :     pcmpgtw mm2,mm0
962 :     pmullw mm0,mm7 ; * 2 * quant
963 :     pandn mm3,mm6
964 : Isibaar 1795 movq mm1,[_EAX+8]
965 : edgomez 1424 psubw mm0,mm2
966 :     pxor mm2,mm3
967 :     pxor mm3,mm3
968 :     paddw mm0,mm2
969 :     pxor mm2,mm2
970 :     pcmpgtw mm3,mm1
971 :     pcmpeqw mm2,mm1
972 :     pmullw mm1,mm7
973 :     pandn mm2,mm6
974 :     psubw mm1,mm3
975 :     pxor mm3,mm2
976 :     paddw mm1,mm3
977 :    
978 :     pminsw mm0,mm4
979 :     pminsw mm1,mm4
980 :     pmaxsw mm0,mm5
981 :     pmaxsw mm1,mm5
982 :    
983 : Isibaar 1795 movq [TMP1],mm0
984 :     lea _EAX,[_EAX+16]
985 :     movq [TMP1+8],mm1
986 : edgomez 1424
987 : Isibaar 1795 dec TMP0
988 :     lea TMP1,[TMP1+16]
989 : edgomez 1424 jne .loop
990 : edgomez 1382
991 : Isibaar 1795 xor _EAX, _EAX ; return 0
992 : edgomez 1382 ret
993 : Isibaar 1793 ENDFUNC
994 : edgomez 1382
995 : edgomez 1424
996 : edgomez 1382 ;-----------------------------------------------------------------------------
997 :     ;
998 :     ; uint32_t dequant_h263_inter_sse2(int16_t * data,
999 :     ; const int16_t * const coeff,
1000 :     ; const uint32_t quant,
1001 :     ; const uint16_t *mpeg_matrices);
1002 :     ;
1003 :     ;-----------------------------------------------------------------------------
1004 :    
1005 : Isibaar 1795 ALIGN SECTION_ALIGN
1006 : edgomez 1382 dequant_h263_inter_sse2:
1007 : Isibaar 1833 PUSH_XMM6_XMM7
1008 :    
1009 : Isibaar 1795 mov TMP0, prm3 ; quant
1010 :     mov _EAX, prm2 ; coeff
1011 : edgomez 1382
1012 : Isibaar 1795 lea TMP1, [mmx_quant]
1013 :     movq xmm6, [TMP1 + TMP0*8] ; quant
1014 :     inc TMP0
1015 : edgomez 1424 pcmpeqw xmm5,xmm5
1016 : Isibaar 1795 and TMP0,1
1017 : edgomez 1424 movlhps xmm6,xmm6
1018 : Isibaar 1795 movd xmm0,TMP0d
1019 : edgomez 1424 movdqa xmm7,xmm6
1020 :     pshuflw xmm0,xmm0,0
1021 :     movdqa xmm4,xmm5
1022 : Isibaar 1795 mov TMP1, prm1 ; data
1023 : edgomez 1424 movlhps xmm0,xmm0
1024 :     paddw xmm7,xmm7
1025 :     psubw xmm6,xmm0
1026 :     psrlw xmm4,5 ; 2047
1027 : Isibaar 1795 mov TMP0,4
1028 : edgomez 1424 pxor xmm5,xmm4 ; mm5=-2048
1029 :    
1030 :     .loop:
1031 : Isibaar 1795 movdqa xmm0,[_EAX]
1032 : edgomez 1424 pxor xmm3,xmm3
1033 :     pxor xmm2,xmm2
1034 :     pcmpeqw xmm3,xmm0
1035 :     pcmpgtw xmm2,xmm0
1036 :     pmullw xmm0,xmm7 ; * 2 * quant
1037 :     pandn xmm3,xmm6
1038 : Isibaar 1795 movdqa xmm1,[_EAX+16]
1039 : edgomez 1424 psubw xmm0,xmm2
1040 :     pxor xmm2,xmm3
1041 :     pxor xmm3,xmm3
1042 :     paddw xmm0,xmm2
1043 :     pxor xmm2,xmm2
1044 :     pcmpgtw xmm3,xmm1
1045 :     pcmpeqw xmm2,xmm1
1046 :     pmullw xmm1,xmm7
1047 :     pandn xmm2,xmm6
1048 :     psubw xmm1,xmm3
1049 :     pxor xmm3,xmm2
1050 :     paddw xmm1,xmm3
1051 :    
1052 :     pminsw xmm0,xmm4
1053 :     pminsw xmm1,xmm4
1054 :     pmaxsw xmm0,xmm5
1055 :     pmaxsw xmm1,xmm5
1056 :    
1057 : Isibaar 1795 movdqa [TMP1],xmm0
1058 :     lea _EAX,[_EAX+32]
1059 :     movdqa [TMP1+16],xmm1
1060 : edgomez 1424
1061 : Isibaar 1795 dec TMP0
1062 :     lea TMP1,[TMP1+32]
1063 : edgomez 1424 jne .loop
1064 : edgomez 1382
1065 : Isibaar 1795 xor _EAX, _EAX ; return 0
1066 : Isibaar 1833
1067 :     POP_XMM6_XMM7
1068 : edgomez 1424 ret
1069 : Isibaar 1793 ENDFUNC
1070 : edgomez 1382
1071 : Isibaar 1790
1072 :     %ifidn __OUTPUT_FORMAT__,elf
1073 :     section ".note.GNU-stack" noalloc noexec nowrite progbits
1074 :     %endif
1075 :    

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