[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 1833 - (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 1833 ; * $Id: quantize_h263_mmx.asm,v 1.12 2008-12-01 14:45:46 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 :    
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 :    
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 :     movq mm0, [TMP0 + _EAX*8 - 8] ; sub
495 : edgomez 1382 movq2dq xmm6, mm0 ; load into low 8 bytes
496 :     movlhps xmm6, xmm6 ; duplicate into high 8 bytes
497 :    
498 :     cmp al, 1
499 : Isibaar 1795 jz near .qes2_q1_routine
500 : edgomez 1382
501 : Isibaar 1793 .qes2_not1:
502 : Isibaar 1795 lea TMP0, [mmx_div]
503 :     movq mm0, [TMP0 + _EAX*8 - 8] ; divider
504 :    
505 :     xor TMP0, TMP0
506 :     mov _EAX, prm2 ; data
507 :    
508 : edgomez 1382 movq2dq xmm7, mm0
509 :     movlhps xmm7, xmm7
510 :    
511 : Isibaar 1795 ALIGN SECTION_ALIGN
512 : Isibaar 1793 .qes2_loop:
513 : Isibaar 1795 movdqa xmm0, [_EAX + TMP0*8] ; xmm0 = [1st]
514 :     movdqa xmm3, [_EAX + TMP0*8 + 16] ; xmm3 = [2nd]
515 : edgomez 1382 pxor xmm1, xmm1
516 :     pxor xmm4, xmm4
517 :     pcmpgtw xmm1, xmm0
518 :     pcmpgtw xmm4, xmm3
519 :     pxor xmm0, xmm1
520 :     pxor xmm3, xmm4
521 :     psubw xmm0, xmm1
522 :     psubw xmm3, xmm4
523 :     psubusw xmm0, xmm6
524 :     psubusw xmm3, xmm6
525 :     pmulhw xmm0, xmm7
526 :     pmulhw xmm3, xmm7
527 :     paddw xmm5, xmm0
528 :     pxor xmm0, xmm1
529 :     paddw xmm5, xmm3
530 :     pxor xmm3, xmm4
531 :     psubw xmm0, xmm1
532 :     psubw xmm3, xmm4
533 : Isibaar 1795 movdqa [TMP1 + TMP0*8], xmm0
534 :     movdqa [TMP1 + TMP0*8 + 16], xmm3
535 : edgomez 1382
536 : Isibaar 1795 add TMP0, 4
537 :     cmp TMP0, 16
538 : edgomez 1382 jnz .qes2_loop
539 :    
540 : Isibaar 1793 .qes2_done:
541 : edgomez 1382 movdqu xmm6, [plus_one]
542 :     pmaddwd xmm5, xmm6
543 :     movhlps xmm6, xmm5
544 :     paddd xmm5, xmm6
545 :     movdq2q mm0, xmm5
546 :    
547 :     movq mm5, mm0
548 :     psrlq mm5, 32
549 :     paddd mm0, mm5
550 :    
551 :     movd eax, mm0 ; return sum
552 :    
553 : Isibaar 1833 POP_XMM6_XMM7
554 : edgomez 1382 ret
555 :    
556 : Isibaar 1795 .qes2_q1_routine:
557 :     xor TMP0, TMP0
558 :     mov _EAX, prm2 ; data
559 :    
560 :     ALIGN SECTION_ALIGN
561 : Isibaar 1793 .qes2_q1loop:
562 : Isibaar 1795 movdqa xmm0, [_EAX + TMP0*8] ; xmm0 = [1st]
563 :     movdqa xmm3, [_EAX + TMP0*8 + 16] ; xmm3 = [2nd]
564 : edgomez 1382 pxor xmm1, xmm1
565 :     pxor xmm4, xmm4
566 :     pcmpgtw xmm1, xmm0
567 :     pcmpgtw xmm4, xmm3
568 :     pxor xmm0, xmm1
569 :     pxor xmm3, xmm4
570 :     psubw xmm0, xmm1
571 :     psubw xmm3, xmm4
572 :     psubusw xmm0, xmm6
573 :     psubusw xmm3, xmm6
574 :     psrlw xmm0, 1
575 :     psrlw xmm3, 1
576 :     paddw xmm5, xmm0
577 :     pxor xmm0, xmm1
578 :     paddw xmm5, xmm3
579 :     pxor xmm3, xmm4
580 :     psubw xmm0, xmm1
581 :     psubw xmm3, xmm4
582 : Isibaar 1795 movdqa [TMP1 + TMP0*8], xmm0
583 :     movdqa [TMP1 + TMP0*8 + 16], xmm3
584 : edgomez 1382
585 : Isibaar 1795 add TMP0, 4
586 :     cmp TMP0, 16
587 : edgomez 1382 jnz .qes2_q1loop
588 :     jmp .qes2_done
589 : Isibaar 1793 ENDFUNC
590 : edgomez 1382
591 :    
592 :     ;-----------------------------------------------------------------------------
593 :     ;
594 :     ; uint32_t dequant_h263_intra_mmx(int16_t *data,
595 :     ; const int16_t const *coeff,
596 :     ; const uint32_t quant,
597 :     ; const uint32_t dcscalar,
598 :     ; const uint16_t *mpeg_matrices);
599 :     ;
600 :     ;-----------------------------------------------------------------------------
601 :    
602 : Isibaar 1795 ALIGN SECTION_ALIGN
603 : edgomez 1382 dequant_h263_intra_mmx:
604 :    
605 : Isibaar 1795 mov TMP0, prm3 ; quant
606 :     mov _EAX, prm2 ; coeff
607 : edgomez 1424 pcmpeqw mm0,mm0
608 : Isibaar 1795 lea TMP1, [mmx_quant]
609 :     movq mm6, [TMP1 + TMP0*8] ; quant
610 :     shl TMP0,31 ; quant & 1 ? 0 : - 1
611 : edgomez 1424 movq mm7,mm6
612 :     movq mm5,mm0
613 : Isibaar 1795 movd mm1,TMP0d
614 :     mov TMP1, prm1 ; data
615 : edgomez 1424 psllw mm0,mm1
616 : Isibaar 1795 paddw mm7,mm7 ; 2*quant
617 :     paddw mm6,mm0 ; quant-1
618 : edgomez 1424 psllw mm5,12
619 : Isibaar 1795 mov TMP0,8
620 : edgomez 1424 psrlw mm5,1
621 : edgomez 1382
622 : edgomez 1424 .loop:
623 : Isibaar 1795 movq mm0,[_EAX]
624 : edgomez 1424 pxor mm2,mm2
625 :     pxor mm4,mm4
626 :     pcmpgtw mm2,mm0
627 :     pcmpeqw mm4,mm0
628 :     pmullw mm0,mm7 ; * 2 * quant
629 : Isibaar 1795 movq mm1,[_EAX+8]
630 : edgomez 1424 psubw mm0,mm2
631 :     pxor mm2,mm6
632 :     pxor mm3,mm3
633 :     pandn mm4,mm2
634 :     pxor mm2,mm2
635 :     pcmpgtw mm3,mm1
636 :     pcmpeqw mm2,mm1
637 :     pmullw mm1,mm7
638 :     paddw mm0,mm4
639 :     psubw mm1,mm3
640 :     pxor mm3,mm6
641 :     pandn mm2,mm3
642 :     paddsw mm0, mm5 ; saturate
643 :     paddw mm1,mm2
644 :    
645 :     paddsw mm1, mm5
646 :     psubsw mm0, mm5
647 :     psubsw mm1, mm5
648 :     psubsw mm0, mm5
649 :     psubsw mm1, mm5
650 :     paddsw mm0, mm5
651 :     paddsw mm1, mm5
652 :    
653 : Isibaar 1795 movq [TMP1],mm0
654 :     lea _EAX,[_EAX+16]
655 :     movq [TMP1+8],mm1
656 : edgomez 1424
657 : Isibaar 1795 dec TMP0
658 :     lea TMP1,[TMP1+16]
659 : edgomez 1424 jne .loop
660 :    
661 :     ; deal with DC
662 : Isibaar 1795 mov _EAX, prm2 ; coeff
663 :     movd mm1,prm4d ; dcscalar
664 :     movd mm0,[_EAX] ; coeff[0]
665 : edgomez 1432 pmullw mm0,mm1 ; * dcscalar
666 : Isibaar 1795 mov TMP1, prm1 ; data
667 : edgomez 1432 paddsw mm0, mm5 ; saturate +
668 :     psubsw mm0, mm5
669 :     psubsw mm0, mm5 ; saturate -
670 :     paddsw mm0, mm5
671 :     movd eax,mm0
672 : Isibaar 1795 mov [TMP1], ax
673 : edgomez 1382
674 : Isibaar 1795 xor _EAX, _EAX ; return 0
675 : edgomez 1382 ret
676 : Isibaar 1793 ENDFUNC
677 : edgomez 1382
678 :     ;-----------------------------------------------------------------------------
679 :     ;
680 :     ; uint32_t dequant_h263_intra_xmm(int16_t *data,
681 :     ; const int16_t const *coeff,
682 :     ; const uint32_t quant,
683 :     ; const uint32_t dcscalar,
684 :     ; const uint16_t *mpeg_matrices);
685 :     ;
686 :     ;-----------------------------------------------------------------------------
687 :    
688 : edgomez 1424
689 : Isibaar 1795 ALIGN SECTION_ALIGN
690 : edgomez 1382 dequant_h263_intra_xmm:
691 :    
692 : Isibaar 1795 mov TMP0, prm3 ; quant
693 :     mov _EAX, prm2 ; coeff
694 : edgomez 1424
695 : Isibaar 1795 movd mm6,TMP0d ; quant
696 : edgomez 1424 pcmpeqw mm0,mm0
697 : Isibaar 1795 pshufw mm6,mm6,0 ; all quant
698 :     shl TMP0,31
699 : edgomez 1424 movq mm5,mm0
700 :     movq mm7,mm6
701 : Isibaar 1795 movd mm1,TMP0d
702 :     mov TMP1, prm1 ; data
703 :     psllw mm0,mm1 ; quant & 1 ? 0 : - 1
704 : edgomez 1424 movq mm4,mm5
705 : Isibaar 1795 paddw mm7,mm7 ; quant*2
706 :     paddw mm6,mm0 ; quant-1
707 :     psrlw mm4,5 ; mm4=2047
708 :     mov TMP0,8
709 :     pxor mm5,mm4 ; mm5=-2048
710 : edgomez 1424
711 :     .loop:
712 : Isibaar 1795 movq mm0,[_EAX]
713 : edgomez 1424 pxor mm2,mm2
714 :     pxor mm3,mm3
715 : edgomez 1382
716 : edgomez 1424 pcmpgtw mm2,mm0
717 :     pcmpeqw mm3,mm0 ; if coeff==0...
718 :     pmullw mm0,mm7 ; * 2 * quant
719 : Isibaar 1795 movq mm1,[_EAX+8]
720 : edgomez 1424
721 :     psubw mm0,mm2
722 :     pxor mm2,mm6
723 :     pandn mm3,mm2 ; ...then data=0
724 :     pxor mm2,mm2
725 :     paddw mm0,mm3
726 :     pxor mm3,mm3
727 :     pcmpeqw mm2,mm1
728 :     pcmpgtw mm3,mm1
729 :     pmullw mm1,mm7
730 :    
731 :     pminsw mm0,mm4
732 :     psubw mm1,mm3
733 :     pxor mm3,mm6
734 :     pandn mm2,mm3
735 :     paddw mm1,mm2
736 :    
737 :     pmaxsw mm0,mm5
738 :     pminsw mm1,mm4
739 : Isibaar 1795 movq [TMP1],mm0
740 : edgomez 1424 pmaxsw mm1,mm5
741 : Isibaar 1795 lea _EAX,[_EAX+16]
742 :     movq [TMP1+8],mm1
743 : edgomez 1424
744 : Isibaar 1795 dec TMP0
745 :     lea TMP1,[TMP1+16]
746 : edgomez 1424 jne .loop
747 :    
748 :     ; deal with DC
749 : Isibaar 1795 mov _EAX, prm2 ; coeff
750 :     movd mm1,prm4d ; dcscalar
751 :     movd mm0, [_EAX]
752 : edgomez 1432 pmullw mm0, mm1
753 : Isibaar 1795 mov TMP1, prm1 ; data
754 : edgomez 1424 pminsw mm0,mm4
755 :     pmaxsw mm0,mm5
756 : edgomez 1382 movd eax, mm0
757 : Isibaar 1795 mov [TMP1], ax
758 : edgomez 1382
759 : Isibaar 1795 xor _EAX, _EAX ; return 0
760 : edgomez 1382 ret
761 : Isibaar 1793 ENDFUNC
762 : edgomez 1382
763 :    
764 :     ;-----------------------------------------------------------------------------
765 :     ;
766 :     ; uint32_t dequant_h263_intra_sse2(int16_t *data,
767 :     ; const int16_t const *coeff,
768 :     ; const uint32_t quant,
769 :     ; const uint32_t dcscalar,
770 :     ; const uint16_t *mpeg_matrices);
771 :     ;
772 :     ;-----------------------------------------------------------------------------
773 :    
774 : Isibaar 1795 ALIGN SECTION_ALIGN
775 : edgomez 1382 dequant_h263_intra_sse2:
776 : Isibaar 1833 PUSH_XMM6_XMM7
777 :    
778 : Isibaar 1795 mov TMP0, prm3 ; quant
779 :     mov _EAX, prm2 ; coeff
780 : edgomez 1424
781 : Isibaar 1795 movd xmm6,TMP0d ; quant
782 : edgomez 1432
783 : Isibaar 1795 shl TMP0,31
784 : edgomez 1424 pshuflw xmm6,xmm6,0
785 :     pcmpeqw xmm0,xmm0
786 :     movlhps xmm6,xmm6 ; all quant
787 : Isibaar 1795 movd xmm1,TMP0d
788 : edgomez 1424 movdqa xmm5,xmm0
789 :     movdqa xmm7,xmm6
790 : Isibaar 1795 mov TMP1, prm1 ; data
791 : edgomez 1424 paddw xmm7,xmm7 ; quant *2
792 :     psllw xmm0,xmm1 ; quant & 1 ? 0 : - 1
793 :     movdqa xmm4,xmm5
794 :     paddw xmm6,xmm0 ; quant-1
795 :     psrlw xmm4,5 ; 2047
796 : Isibaar 1795 mov TMP0,4
797 : edgomez 1424 pxor xmm5,xmm4 ; mm5=-2048
798 :    
799 :     .loop:
800 : Isibaar 1795 movdqa xmm0,[_EAX]
801 : edgomez 1424 pxor xmm2,xmm2
802 :     pxor xmm3,xmm3
803 : edgomez 1382
804 : edgomez 1424 pcmpgtw xmm2,xmm0
805 :     pcmpeqw xmm3,xmm0
806 :     pmullw xmm0,xmm7 ; * 2 * quant
807 : Isibaar 1795 movdqa xmm1,[_EAX+16]
808 : edgomez 1424
809 :     psubw xmm0,xmm2
810 :     pxor xmm2,xmm6
811 :     pandn xmm3,xmm2
812 :     pxor xmm2,xmm2
813 :     paddw xmm0,xmm3
814 :     pxor xmm3,xmm3
815 :     pcmpeqw xmm2,xmm1
816 :     pcmpgtw xmm3,xmm1
817 :     pmullw xmm1,xmm7
818 :    
819 :     pminsw xmm0,xmm4
820 :     psubw xmm1,xmm3
821 :     pxor xmm3,xmm6
822 :     pandn xmm2,xmm3
823 :     paddw xmm1,xmm2
824 :    
825 :     pmaxsw xmm0,xmm5
826 :     pminsw xmm1,xmm4
827 : Isibaar 1795 movdqa [TMP1],xmm0
828 : edgomez 1424 pmaxsw xmm1,xmm5
829 : Isibaar 1795 lea _EAX,[_EAX+32]
830 :     movdqa [TMP1+16],xmm1
831 : edgomez 1424
832 : Isibaar 1795 dec TMP0
833 :     lea TMP1,[TMP1+32]
834 : edgomez 1424 jne .loop
835 :    
836 :     ; deal with DC
837 : edgomez 1382
838 : Isibaar 1795 mov _EAX, prm2 ; coeff
839 :     movsx _EAX,word [_EAX]
840 :     imul prm4d ; dcscalar
841 :     mov TMP1, prm1 ; data
842 : edgomez 1424 movd xmm0,eax
843 :     pminsw xmm0,xmm4
844 :     pmaxsw xmm0,xmm5
845 :     movd eax,xmm0
846 :    
847 : Isibaar 1795 mov [TMP1], ax
848 : edgomez 1382
849 : Isibaar 1795 xor _EAX, _EAX ; return 0
850 : Isibaar 1833
851 :     POP_XMM6_XMM7
852 : edgomez 1382 ret
853 : Isibaar 1793 ENDFUNC
854 : edgomez 1382
855 :     ;-----------------------------------------------------------------------------
856 :     ;
857 :     ; uint32t dequant_h263_inter_mmx(int16_t * data,
858 :     ; const int16_t * const coeff,
859 :     ; const uint32_t quant,
860 :     ; const uint16_t *mpeg_matrices);
861 :     ;
862 :     ;-----------------------------------------------------------------------------
863 :    
864 : Isibaar 1795 ALIGN SECTION_ALIGN
865 : edgomez 1382 dequant_h263_inter_mmx:
866 :    
867 : Isibaar 1795 mov TMP0, prm3 ; quant
868 :     mov _EAX, prm2 ; coeff
869 : edgomez 1424 pcmpeqw mm0,mm0
870 : Isibaar 1795 lea TMP1, [mmx_quant]
871 :     movq mm6, [TMP1 + TMP0*8] ; quant
872 :     shl TMP0,31 ; odd/even
873 : edgomez 1424 movq mm7,mm6
874 : Isibaar 1795 movd mm1,TMP0d
875 :     mov TMP1, prm1 ; data
876 : edgomez 1424 movq mm5,mm0
877 : Isibaar 1795 psllw mm0,mm1 ; quant & 1 ? 0 : - 1
878 :     paddw mm7,mm7 ; quant*2
879 :     paddw mm6,mm0 ; quant & 1 ? quant : quant - 1
880 : edgomez 1424 psllw mm5,12
881 : Isibaar 1795 mov TMP0,8
882 :     psrlw mm5,1 ; 32767-2047 (32768-2048)
883 : edgomez 1382
884 : edgomez 1424 .loop:
885 : Isibaar 1795 movq mm0,[_EAX]
886 : edgomez 1424 pxor mm4,mm4
887 :     pxor mm2,mm2
888 :     pcmpeqw mm4,mm0 ; if coeff==0...
889 :     pcmpgtw mm2,mm0
890 :     pmullw mm0,mm7 ; * 2 * quant
891 :     pxor mm3,mm3
892 :     psubw mm0,mm2
893 : Isibaar 1795 movq mm1,[_EAX+8]
894 : edgomez 1424 pxor mm2,mm6
895 :     pcmpgtw mm3,mm1
896 :     pandn mm4,mm2 ; ... then data==0
897 :     pmullw mm1,mm7
898 :     pxor mm2,mm2
899 :     pcmpeqw mm2,mm1
900 :     psubw mm1,mm3
901 :     pxor mm3,mm6
902 :     pandn mm2,mm3
903 :     paddw mm0,mm4
904 :     paddw mm1,mm2
905 :    
906 :     paddsw mm0, mm5 ; saturate
907 :     paddsw mm1, mm5
908 :     psubsw mm0, mm5
909 :     psubsw mm1, mm5
910 :     psubsw mm0, mm5
911 :     psubsw mm1, mm5
912 :     paddsw mm0, mm5
913 :     paddsw mm1, mm5
914 :    
915 : Isibaar 1795 movq [TMP1],mm0
916 :     lea _EAX,[_EAX+16]
917 :     movq [TMP1+8],mm1
918 : edgomez 1424
919 : Isibaar 1795 dec TMP0
920 :     lea TMP1,[TMP1+16]
921 : edgomez 1424 jne .loop
922 :    
923 : Isibaar 1795 xor _EAX, _EAX ; return 0
924 : edgomez 1424 ret
925 : Isibaar 1793 ENDFUNC
926 : edgomez 1382
927 :    
928 :     ;-----------------------------------------------------------------------------
929 :     ;
930 :     ; uint32_t dequant_h263_inter_xmm(int16_t * data,
931 :     ; const int16_t * const coeff,
932 :     ; const uint32_t quant,
933 :     ; const uint16_t *mpeg_matrices);
934 :     ;
935 :     ;-----------------------------------------------------------------------------
936 : Isibaar 1795 ALIGN SECTION_ALIGN
937 : edgomez 1382 dequant_h263_inter_xmm:
938 :    
939 : Isibaar 1795 mov TMP0, prm3 ; quant
940 :     mov _EAX, prm2 ; coeff
941 : edgomez 1424 pcmpeqw mm0,mm0
942 : Isibaar 1795 lea TMP1, [mmx_quant]
943 :     movq mm6, [TMP1 + TMP0*8] ; quant
944 :     shl TMP0,31
945 : edgomez 1424 movq mm5,mm0
946 : Isibaar 1795 movd mm1,TMP0d
947 : edgomez 1424 movq mm7,mm6
948 :     psllw mm0,mm1
949 : Isibaar 1795 mov TMP1, prm1 ; data
950 : edgomez 1424 movq mm4,mm5
951 :     paddw mm7,mm7
952 :     paddw mm6,mm0 ; quant-1
953 : edgomez 1382
954 : edgomez 1424 psrlw mm4,5
955 : Isibaar 1795 mov TMP0,8
956 : edgomez 1424 pxor mm5,mm4 ; mm5=-2048
957 :    
958 :     .loop:
959 : Isibaar 1795 movq mm0,[_EAX]
960 : edgomez 1424 pxor mm3,mm3
961 :     pxor mm2,mm2
962 :     pcmpeqw mm3,mm0
963 :     pcmpgtw mm2,mm0
964 :     pmullw mm0,mm7 ; * 2 * quant
965 :     pandn mm3,mm6
966 : Isibaar 1795 movq mm1,[_EAX+8]
967 : edgomez 1424 psubw mm0,mm2
968 :     pxor mm2,mm3
969 :     pxor mm3,mm3
970 :     paddw mm0,mm2
971 :     pxor mm2,mm2
972 :     pcmpgtw mm3,mm1
973 :     pcmpeqw mm2,mm1
974 :     pmullw mm1,mm7
975 :     pandn mm2,mm6
976 :     psubw mm1,mm3
977 :     pxor mm3,mm2
978 :     paddw mm1,mm3
979 :    
980 :     pminsw mm0,mm4
981 :     pminsw mm1,mm4
982 :     pmaxsw mm0,mm5
983 :     pmaxsw mm1,mm5
984 :    
985 : Isibaar 1795 movq [TMP1],mm0
986 :     lea _EAX,[_EAX+16]
987 :     movq [TMP1+8],mm1
988 : edgomez 1424
989 : Isibaar 1795 dec TMP0
990 :     lea TMP1,[TMP1+16]
991 : edgomez 1424 jne .loop
992 : edgomez 1382
993 : Isibaar 1795 xor _EAX, _EAX ; return 0
994 : edgomez 1382 ret
995 : Isibaar 1793 ENDFUNC
996 : edgomez 1382
997 : edgomez 1424
998 : edgomez 1382 ;-----------------------------------------------------------------------------
999 :     ;
1000 :     ; uint32_t dequant_h263_inter_sse2(int16_t * data,
1001 :     ; const int16_t * const coeff,
1002 :     ; const uint32_t quant,
1003 :     ; const uint16_t *mpeg_matrices);
1004 :     ;
1005 :     ;-----------------------------------------------------------------------------
1006 :    
1007 : Isibaar 1795 ALIGN SECTION_ALIGN
1008 : edgomez 1382 dequant_h263_inter_sse2:
1009 : Isibaar 1833 PUSH_XMM6_XMM7
1010 :    
1011 : Isibaar 1795 mov TMP0, prm3 ; quant
1012 :     mov _EAX, prm2 ; coeff
1013 : edgomez 1382
1014 : Isibaar 1795 lea TMP1, [mmx_quant]
1015 :     movq xmm6, [TMP1 + TMP0*8] ; quant
1016 :     inc TMP0
1017 : edgomez 1424 pcmpeqw xmm5,xmm5
1018 : Isibaar 1795 and TMP0,1
1019 : edgomez 1424 movlhps xmm6,xmm6
1020 : Isibaar 1795 movd xmm0,TMP0d
1021 : edgomez 1424 movdqa xmm7,xmm6
1022 :     pshuflw xmm0,xmm0,0
1023 :     movdqa xmm4,xmm5
1024 : Isibaar 1795 mov TMP1, prm1 ; data
1025 : edgomez 1424 movlhps xmm0,xmm0
1026 :     paddw xmm7,xmm7
1027 :     psubw xmm6,xmm0
1028 :     psrlw xmm4,5 ; 2047
1029 : Isibaar 1795 mov TMP0,4
1030 : edgomez 1424 pxor xmm5,xmm4 ; mm5=-2048
1031 :    
1032 :     .loop:
1033 : Isibaar 1795 movdqa xmm0,[_EAX]
1034 : edgomez 1424 pxor xmm3,xmm3
1035 :     pxor xmm2,xmm2
1036 :     pcmpeqw xmm3,xmm0
1037 :     pcmpgtw xmm2,xmm0
1038 :     pmullw xmm0,xmm7 ; * 2 * quant
1039 :     pandn xmm3,xmm6
1040 : Isibaar 1795 movdqa xmm1,[_EAX+16]
1041 : edgomez 1424 psubw xmm0,xmm2
1042 :     pxor xmm2,xmm3
1043 :     pxor xmm3,xmm3
1044 :     paddw xmm0,xmm2
1045 :     pxor xmm2,xmm2
1046 :     pcmpgtw xmm3,xmm1
1047 :     pcmpeqw xmm2,xmm1
1048 :     pmullw xmm1,xmm7
1049 :     pandn xmm2,xmm6
1050 :     psubw xmm1,xmm3
1051 :     pxor xmm3,xmm2
1052 :     paddw xmm1,xmm3
1053 :    
1054 :     pminsw xmm0,xmm4
1055 :     pminsw xmm1,xmm4
1056 :     pmaxsw xmm0,xmm5
1057 :     pmaxsw xmm1,xmm5
1058 :    
1059 : Isibaar 1795 movdqa [TMP1],xmm0
1060 :     lea _EAX,[_EAX+32]
1061 :     movdqa [TMP1+16],xmm1
1062 : edgomez 1424
1063 : Isibaar 1795 dec TMP0
1064 :     lea TMP1,[TMP1+32]
1065 : edgomez 1424 jne .loop
1066 : edgomez 1382
1067 : Isibaar 1795 xor _EAX, _EAX ; return 0
1068 : Isibaar 1833
1069 :     POP_XMM6_XMM7
1070 : edgomez 1424 ret
1071 : Isibaar 1793 ENDFUNC
1072 : edgomez 1382
1073 : Isibaar 1790
1074 :     %ifidn __OUTPUT_FORMAT__,elf
1075 :     section ".note.GNU-stack" noalloc noexec nowrite progbits
1076 :     %endif
1077 :    

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