Mercurial > hg > sv-dependency-builds
comparison src/zlib-1.2.7/contrib/masmx86/inffas32.asm @ 89:8a15ff55d9af
Add bzip2, zlib, liblo, portaudio sources
author | Chris Cannam <cannam@all-day-breakfast.com> |
---|---|
date | Wed, 20 Mar 2013 13:59:52 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
88:fe7c3a0b0259 | 89:8a15ff55d9af |
---|---|
1 ;/* inffas32.asm is a hand tuned assembler version of inffast.c -- fast decoding | |
2 ; * | |
3 ; * inffas32.asm is derivated from inffas86.c, with translation of assembly code | |
4 ; * | |
5 ; * Copyright (C) 1995-2003 Mark Adler | |
6 ; * For conditions of distribution and use, see copyright notice in zlib.h | |
7 ; * | |
8 ; * Copyright (C) 2003 Chris Anderson <christop@charm.net> | |
9 ; * Please use the copyright conditions above. | |
10 ; * | |
11 ; * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from | |
12 ; * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at | |
13 ; * the moment. I have successfully compiled and tested this code with gcc2.96, | |
14 ; * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S | |
15 ; * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX | |
16 ; * enabled. I will attempt to merge the MMX code into this version. Newer | |
17 ; * versions of this and inffast.S can be found at | |
18 ; * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ | |
19 ; * | |
20 ; * 2005 : modification by Gilles Vollant | |
21 ; */ | |
22 ; For Visual C++ 4.x and higher and ML 6.x and higher | |
23 ; ml.exe is in directory \MASM611C of Win95 DDK | |
24 ; ml.exe is also distributed in http://www.masm32.com/masmdl.htm | |
25 ; and in VC++2003 toolkit at http://msdn.microsoft.com/visualc/vctoolkit2003/ | |
26 ; | |
27 ; | |
28 ; compile with command line option | |
29 ; ml /coff /Zi /c /Flinffas32.lst inffas32.asm | |
30 | |
31 ; if you define NO_GZIP (see inflate.h), compile with | |
32 ; ml /coff /Zi /c /Flinffas32.lst /DNO_GUNZIP inffas32.asm | |
33 | |
34 | |
35 ; zlib122sup is 0 fort zlib 1.2.2.1 and lower | |
36 ; zlib122sup is 8 fort zlib 1.2.2.2 and more (with addition of dmax and head | |
37 ; in inflate_state in inflate.h) | |
38 zlib1222sup equ 8 | |
39 | |
40 | |
41 IFDEF GUNZIP | |
42 INFLATE_MODE_TYPE equ 11 | |
43 INFLATE_MODE_BAD equ 26 | |
44 ELSE | |
45 IFNDEF NO_GUNZIP | |
46 INFLATE_MODE_TYPE equ 11 | |
47 INFLATE_MODE_BAD equ 26 | |
48 ELSE | |
49 INFLATE_MODE_TYPE equ 3 | |
50 INFLATE_MODE_BAD equ 17 | |
51 ENDIF | |
52 ENDIF | |
53 | |
54 | |
55 ; 75 "inffast.S" | |
56 ;FILE "inffast.S" | |
57 | |
58 ;;;GLOBAL _inflate_fast | |
59 | |
60 ;;;SECTION .text | |
61 | |
62 | |
63 | |
64 .586p | |
65 .mmx | |
66 | |
67 name inflate_fast_x86 | |
68 .MODEL FLAT | |
69 | |
70 _DATA segment | |
71 inflate_fast_use_mmx: | |
72 dd 1 | |
73 | |
74 | |
75 _TEXT segment | |
76 | |
77 | |
78 | |
79 ALIGN 4 | |
80 db 'Fast decoding Code from Chris Anderson' | |
81 db 0 | |
82 | |
83 ALIGN 4 | |
84 invalid_literal_length_code_msg: | |
85 db 'invalid literal/length code' | |
86 db 0 | |
87 | |
88 ALIGN 4 | |
89 invalid_distance_code_msg: | |
90 db 'invalid distance code' | |
91 db 0 | |
92 | |
93 ALIGN 4 | |
94 invalid_distance_too_far_msg: | |
95 db 'invalid distance too far back' | |
96 db 0 | |
97 | |
98 | |
99 ALIGN 4 | |
100 inflate_fast_mask: | |
101 dd 0 | |
102 dd 1 | |
103 dd 3 | |
104 dd 7 | |
105 dd 15 | |
106 dd 31 | |
107 dd 63 | |
108 dd 127 | |
109 dd 255 | |
110 dd 511 | |
111 dd 1023 | |
112 dd 2047 | |
113 dd 4095 | |
114 dd 8191 | |
115 dd 16383 | |
116 dd 32767 | |
117 dd 65535 | |
118 dd 131071 | |
119 dd 262143 | |
120 dd 524287 | |
121 dd 1048575 | |
122 dd 2097151 | |
123 dd 4194303 | |
124 dd 8388607 | |
125 dd 16777215 | |
126 dd 33554431 | |
127 dd 67108863 | |
128 dd 134217727 | |
129 dd 268435455 | |
130 dd 536870911 | |
131 dd 1073741823 | |
132 dd 2147483647 | |
133 dd 4294967295 | |
134 | |
135 | |
136 mode_state equ 0 ;/* state->mode */ | |
137 wsize_state equ (32+zlib1222sup) ;/* state->wsize */ | |
138 write_state equ (36+4+zlib1222sup) ;/* state->write */ | |
139 window_state equ (40+4+zlib1222sup) ;/* state->window */ | |
140 hold_state equ (44+4+zlib1222sup) ;/* state->hold */ | |
141 bits_state equ (48+4+zlib1222sup) ;/* state->bits */ | |
142 lencode_state equ (64+4+zlib1222sup) ;/* state->lencode */ | |
143 distcode_state equ (68+4+zlib1222sup) ;/* state->distcode */ | |
144 lenbits_state equ (72+4+zlib1222sup) ;/* state->lenbits */ | |
145 distbits_state equ (76+4+zlib1222sup) ;/* state->distbits */ | |
146 | |
147 | |
148 ;;SECTION .text | |
149 ; 205 "inffast.S" | |
150 ;GLOBAL inflate_fast_use_mmx | |
151 | |
152 ;SECTION .data | |
153 | |
154 | |
155 ; GLOBAL inflate_fast_use_mmx:object | |
156 ;.size inflate_fast_use_mmx, 4 | |
157 ; 226 "inffast.S" | |
158 ;SECTION .text | |
159 | |
160 ALIGN 4 | |
161 _inflate_fast proc near | |
162 .FPO (16, 4, 0, 0, 1, 0) | |
163 push edi | |
164 push esi | |
165 push ebp | |
166 push ebx | |
167 pushfd | |
168 sub esp,64 | |
169 cld | |
170 | |
171 | |
172 | |
173 | |
174 mov esi, [esp+88] | |
175 mov edi, [esi+28] | |
176 | |
177 | |
178 | |
179 | |
180 | |
181 | |
182 | |
183 mov edx, [esi+4] | |
184 mov eax, [esi+0] | |
185 | |
186 add edx,eax | |
187 sub edx,11 | |
188 | |
189 mov [esp+44],eax | |
190 mov [esp+20],edx | |
191 | |
192 mov ebp, [esp+92] | |
193 mov ecx, [esi+16] | |
194 mov ebx, [esi+12] | |
195 | |
196 sub ebp,ecx | |
197 neg ebp | |
198 add ebp,ebx | |
199 | |
200 sub ecx,257 | |
201 add ecx,ebx | |
202 | |
203 mov [esp+60],ebx | |
204 mov [esp+40],ebp | |
205 mov [esp+16],ecx | |
206 ; 285 "inffast.S" | |
207 mov eax, [edi+lencode_state] | |
208 mov ecx, [edi+distcode_state] | |
209 | |
210 mov [esp+8],eax | |
211 mov [esp+12],ecx | |
212 | |
213 mov eax,1 | |
214 mov ecx, [edi+lenbits_state] | |
215 shl eax,cl | |
216 dec eax | |
217 mov [esp+0],eax | |
218 | |
219 mov eax,1 | |
220 mov ecx, [edi+distbits_state] | |
221 shl eax,cl | |
222 dec eax | |
223 mov [esp+4],eax | |
224 | |
225 mov eax, [edi+wsize_state] | |
226 mov ecx, [edi+write_state] | |
227 mov edx, [edi+window_state] | |
228 | |
229 mov [esp+52],eax | |
230 mov [esp+48],ecx | |
231 mov [esp+56],edx | |
232 | |
233 mov ebp, [edi+hold_state] | |
234 mov ebx, [edi+bits_state] | |
235 ; 321 "inffast.S" | |
236 mov esi, [esp+44] | |
237 mov ecx, [esp+20] | |
238 cmp ecx,esi | |
239 ja L_align_long | |
240 | |
241 add ecx,11 | |
242 sub ecx,esi | |
243 mov eax,12 | |
244 sub eax,ecx | |
245 lea edi, [esp+28] | |
246 rep movsb | |
247 mov ecx,eax | |
248 xor eax,eax | |
249 rep stosb | |
250 lea esi, [esp+28] | |
251 mov [esp+20],esi | |
252 jmp L_is_aligned | |
253 | |
254 | |
255 L_align_long: | |
256 test esi,3 | |
257 jz L_is_aligned | |
258 xor eax,eax | |
259 mov al, [esi] | |
260 inc esi | |
261 mov ecx,ebx | |
262 add ebx,8 | |
263 shl eax,cl | |
264 or ebp,eax | |
265 jmp L_align_long | |
266 | |
267 L_is_aligned: | |
268 mov edi, [esp+60] | |
269 ; 366 "inffast.S" | |
270 L_check_mmx: | |
271 cmp dword ptr [inflate_fast_use_mmx],2 | |
272 je L_init_mmx | |
273 ja L_do_loop | |
274 | |
275 push eax | |
276 push ebx | |
277 push ecx | |
278 push edx | |
279 pushfd | |
280 mov eax, [esp] | |
281 xor dword ptr [esp],0200000h | |
282 | |
283 | |
284 | |
285 | |
286 popfd | |
287 pushfd | |
288 pop edx | |
289 xor edx,eax | |
290 jz L_dont_use_mmx | |
291 xor eax,eax | |
292 cpuid | |
293 cmp ebx,0756e6547h | |
294 jne L_dont_use_mmx | |
295 cmp ecx,06c65746eh | |
296 jne L_dont_use_mmx | |
297 cmp edx,049656e69h | |
298 jne L_dont_use_mmx | |
299 mov eax,1 | |
300 cpuid | |
301 shr eax,8 | |
302 and eax,15 | |
303 cmp eax,6 | |
304 jne L_dont_use_mmx | |
305 test edx,0800000h | |
306 jnz L_use_mmx | |
307 jmp L_dont_use_mmx | |
308 L_use_mmx: | |
309 mov dword ptr [inflate_fast_use_mmx],2 | |
310 jmp L_check_mmx_pop | |
311 L_dont_use_mmx: | |
312 mov dword ptr [inflate_fast_use_mmx],3 | |
313 L_check_mmx_pop: | |
314 pop edx | |
315 pop ecx | |
316 pop ebx | |
317 pop eax | |
318 jmp L_check_mmx | |
319 ; 426 "inffast.S" | |
320 ALIGN 4 | |
321 L_do_loop: | |
322 ; 437 "inffast.S" | |
323 cmp bl,15 | |
324 ja L_get_length_code | |
325 | |
326 xor eax,eax | |
327 lodsw | |
328 mov cl,bl | |
329 add bl,16 | |
330 shl eax,cl | |
331 or ebp,eax | |
332 | |
333 L_get_length_code: | |
334 mov edx, [esp+0] | |
335 mov ecx, [esp+8] | |
336 and edx,ebp | |
337 mov eax, [ecx+edx*4] | |
338 | |
339 L_dolen: | |
340 | |
341 | |
342 | |
343 | |
344 | |
345 | |
346 mov cl,ah | |
347 sub bl,ah | |
348 shr ebp,cl | |
349 | |
350 | |
351 | |
352 | |
353 | |
354 | |
355 test al,al | |
356 jnz L_test_for_length_base | |
357 | |
358 shr eax,16 | |
359 stosb | |
360 | |
361 L_while_test: | |
362 | |
363 | |
364 cmp [esp+16],edi | |
365 jbe L_break_loop | |
366 | |
367 cmp [esp+20],esi | |
368 ja L_do_loop | |
369 jmp L_break_loop | |
370 | |
371 L_test_for_length_base: | |
372 ; 502 "inffast.S" | |
373 mov edx,eax | |
374 shr edx,16 | |
375 mov cl,al | |
376 | |
377 test al,16 | |
378 jz L_test_for_second_level_length | |
379 and cl,15 | |
380 jz L_save_len | |
381 cmp bl,cl | |
382 jae L_add_bits_to_len | |
383 | |
384 mov ch,cl | |
385 xor eax,eax | |
386 lodsw | |
387 mov cl,bl | |
388 add bl,16 | |
389 shl eax,cl | |
390 or ebp,eax | |
391 mov cl,ch | |
392 | |
393 L_add_bits_to_len: | |
394 mov eax,1 | |
395 shl eax,cl | |
396 dec eax | |
397 sub bl,cl | |
398 and eax,ebp | |
399 shr ebp,cl | |
400 add edx,eax | |
401 | |
402 L_save_len: | |
403 mov [esp+24],edx | |
404 | |
405 | |
406 L_decode_distance: | |
407 ; 549 "inffast.S" | |
408 cmp bl,15 | |
409 ja L_get_distance_code | |
410 | |
411 xor eax,eax | |
412 lodsw | |
413 mov cl,bl | |
414 add bl,16 | |
415 shl eax,cl | |
416 or ebp,eax | |
417 | |
418 L_get_distance_code: | |
419 mov edx, [esp+4] | |
420 mov ecx, [esp+12] | |
421 and edx,ebp | |
422 mov eax, [ecx+edx*4] | |
423 | |
424 | |
425 L_dodist: | |
426 mov edx,eax | |
427 shr edx,16 | |
428 mov cl,ah | |
429 sub bl,ah | |
430 shr ebp,cl | |
431 ; 584 "inffast.S" | |
432 mov cl,al | |
433 | |
434 test al,16 | |
435 jz L_test_for_second_level_dist | |
436 and cl,15 | |
437 jz L_check_dist_one | |
438 cmp bl,cl | |
439 jae L_add_bits_to_dist | |
440 | |
441 mov ch,cl | |
442 xor eax,eax | |
443 lodsw | |
444 mov cl,bl | |
445 add bl,16 | |
446 shl eax,cl | |
447 or ebp,eax | |
448 mov cl,ch | |
449 | |
450 L_add_bits_to_dist: | |
451 mov eax,1 | |
452 shl eax,cl | |
453 dec eax | |
454 sub bl,cl | |
455 and eax,ebp | |
456 shr ebp,cl | |
457 add edx,eax | |
458 jmp L_check_window | |
459 | |
460 L_check_window: | |
461 ; 625 "inffast.S" | |
462 mov [esp+44],esi | |
463 mov eax,edi | |
464 sub eax, [esp+40] | |
465 | |
466 cmp eax,edx | |
467 jb L_clip_window | |
468 | |
469 mov ecx, [esp+24] | |
470 mov esi,edi | |
471 sub esi,edx | |
472 | |
473 sub ecx,3 | |
474 mov al, [esi] | |
475 mov [edi],al | |
476 mov al, [esi+1] | |
477 mov dl, [esi+2] | |
478 add esi,3 | |
479 mov [edi+1],al | |
480 mov [edi+2],dl | |
481 add edi,3 | |
482 rep movsb | |
483 | |
484 mov esi, [esp+44] | |
485 jmp L_while_test | |
486 | |
487 ALIGN 4 | |
488 L_check_dist_one: | |
489 cmp edx,1 | |
490 jne L_check_window | |
491 cmp [esp+40],edi | |
492 je L_check_window | |
493 | |
494 dec edi | |
495 mov ecx, [esp+24] | |
496 mov al, [edi] | |
497 sub ecx,3 | |
498 | |
499 mov [edi+1],al | |
500 mov [edi+2],al | |
501 mov [edi+3],al | |
502 add edi,4 | |
503 rep stosb | |
504 | |
505 jmp L_while_test | |
506 | |
507 ALIGN 4 | |
508 L_test_for_second_level_length: | |
509 | |
510 | |
511 | |
512 | |
513 test al,64 | |
514 jnz L_test_for_end_of_block | |
515 | |
516 mov eax,1 | |
517 shl eax,cl | |
518 dec eax | |
519 and eax,ebp | |
520 add eax,edx | |
521 mov edx, [esp+8] | |
522 mov eax, [edx+eax*4] | |
523 jmp L_dolen | |
524 | |
525 ALIGN 4 | |
526 L_test_for_second_level_dist: | |
527 | |
528 | |
529 | |
530 | |
531 test al,64 | |
532 jnz L_invalid_distance_code | |
533 | |
534 mov eax,1 | |
535 shl eax,cl | |
536 dec eax | |
537 and eax,ebp | |
538 add eax,edx | |
539 mov edx, [esp+12] | |
540 mov eax, [edx+eax*4] | |
541 jmp L_dodist | |
542 | |
543 ALIGN 4 | |
544 L_clip_window: | |
545 ; 721 "inffast.S" | |
546 mov ecx,eax | |
547 mov eax, [esp+52] | |
548 neg ecx | |
549 mov esi, [esp+56] | |
550 | |
551 cmp eax,edx | |
552 jb L_invalid_distance_too_far | |
553 | |
554 add ecx,edx | |
555 cmp dword ptr [esp+48],0 | |
556 jne L_wrap_around_window | |
557 | |
558 sub eax,ecx | |
559 add esi,eax | |
560 ; 749 "inffast.S" | |
561 mov eax, [esp+24] | |
562 cmp eax,ecx | |
563 jbe L_do_copy1 | |
564 | |
565 sub eax,ecx | |
566 rep movsb | |
567 mov esi,edi | |
568 sub esi,edx | |
569 jmp L_do_copy1 | |
570 | |
571 cmp eax,ecx | |
572 jbe L_do_copy1 | |
573 | |
574 sub eax,ecx | |
575 rep movsb | |
576 mov esi,edi | |
577 sub esi,edx | |
578 jmp L_do_copy1 | |
579 | |
580 L_wrap_around_window: | |
581 ; 793 "inffast.S" | |
582 mov eax, [esp+48] | |
583 cmp ecx,eax | |
584 jbe L_contiguous_in_window | |
585 | |
586 add esi, [esp+52] | |
587 add esi,eax | |
588 sub esi,ecx | |
589 sub ecx,eax | |
590 | |
591 | |
592 mov eax, [esp+24] | |
593 cmp eax,ecx | |
594 jbe L_do_copy1 | |
595 | |
596 sub eax,ecx | |
597 rep movsb | |
598 mov esi, [esp+56] | |
599 mov ecx, [esp+48] | |
600 cmp eax,ecx | |
601 jbe L_do_copy1 | |
602 | |
603 sub eax,ecx | |
604 rep movsb | |
605 mov esi,edi | |
606 sub esi,edx | |
607 jmp L_do_copy1 | |
608 | |
609 L_contiguous_in_window: | |
610 ; 836 "inffast.S" | |
611 add esi,eax | |
612 sub esi,ecx | |
613 | |
614 | |
615 mov eax, [esp+24] | |
616 cmp eax,ecx | |
617 jbe L_do_copy1 | |
618 | |
619 sub eax,ecx | |
620 rep movsb | |
621 mov esi,edi | |
622 sub esi,edx | |
623 | |
624 L_do_copy1: | |
625 ; 862 "inffast.S" | |
626 mov ecx,eax | |
627 rep movsb | |
628 | |
629 mov esi, [esp+44] | |
630 jmp L_while_test | |
631 ; 878 "inffast.S" | |
632 ALIGN 4 | |
633 L_init_mmx: | |
634 emms | |
635 | |
636 | |
637 | |
638 | |
639 | |
640 movd mm0,ebp | |
641 mov ebp,ebx | |
642 ; 896 "inffast.S" | |
643 movd mm4,dword ptr [esp+0] | |
644 movq mm3,mm4 | |
645 movd mm5,dword ptr [esp+4] | |
646 movq mm2,mm5 | |
647 pxor mm1,mm1 | |
648 mov ebx, [esp+8] | |
649 jmp L_do_loop_mmx | |
650 | |
651 ALIGN 4 | |
652 L_do_loop_mmx: | |
653 psrlq mm0,mm1 | |
654 | |
655 cmp ebp,32 | |
656 ja L_get_length_code_mmx | |
657 | |
658 movd mm6,ebp | |
659 movd mm7,dword ptr [esi] | |
660 add esi,4 | |
661 psllq mm7,mm6 | |
662 add ebp,32 | |
663 por mm0,mm7 | |
664 | |
665 L_get_length_code_mmx: | |
666 pand mm4,mm0 | |
667 movd eax,mm4 | |
668 movq mm4,mm3 | |
669 mov eax, [ebx+eax*4] | |
670 | |
671 L_dolen_mmx: | |
672 movzx ecx,ah | |
673 movd mm1,ecx | |
674 sub ebp,ecx | |
675 | |
676 test al,al | |
677 jnz L_test_for_length_base_mmx | |
678 | |
679 shr eax,16 | |
680 stosb | |
681 | |
682 L_while_test_mmx: | |
683 | |
684 | |
685 cmp [esp+16],edi | |
686 jbe L_break_loop | |
687 | |
688 cmp [esp+20],esi | |
689 ja L_do_loop_mmx | |
690 jmp L_break_loop | |
691 | |
692 L_test_for_length_base_mmx: | |
693 | |
694 mov edx,eax | |
695 shr edx,16 | |
696 | |
697 test al,16 | |
698 jz L_test_for_second_level_length_mmx | |
699 and eax,15 | |
700 jz L_decode_distance_mmx | |
701 | |
702 psrlq mm0,mm1 | |
703 movd mm1,eax | |
704 movd ecx,mm0 | |
705 sub ebp,eax | |
706 and ecx, [inflate_fast_mask+eax*4] | |
707 add edx,ecx | |
708 | |
709 L_decode_distance_mmx: | |
710 psrlq mm0,mm1 | |
711 | |
712 cmp ebp,32 | |
713 ja L_get_dist_code_mmx | |
714 | |
715 movd mm6,ebp | |
716 movd mm7,dword ptr [esi] | |
717 add esi,4 | |
718 psllq mm7,mm6 | |
719 add ebp,32 | |
720 por mm0,mm7 | |
721 | |
722 L_get_dist_code_mmx: | |
723 mov ebx, [esp+12] | |
724 pand mm5,mm0 | |
725 movd eax,mm5 | |
726 movq mm5,mm2 | |
727 mov eax, [ebx+eax*4] | |
728 | |
729 L_dodist_mmx: | |
730 | |
731 movzx ecx,ah | |
732 mov ebx,eax | |
733 shr ebx,16 | |
734 sub ebp,ecx | |
735 movd mm1,ecx | |
736 | |
737 test al,16 | |
738 jz L_test_for_second_level_dist_mmx | |
739 and eax,15 | |
740 jz L_check_dist_one_mmx | |
741 | |
742 L_add_bits_to_dist_mmx: | |
743 psrlq mm0,mm1 | |
744 movd mm1,eax | |
745 movd ecx,mm0 | |
746 sub ebp,eax | |
747 and ecx, [inflate_fast_mask+eax*4] | |
748 add ebx,ecx | |
749 | |
750 L_check_window_mmx: | |
751 mov [esp+44],esi | |
752 mov eax,edi | |
753 sub eax, [esp+40] | |
754 | |
755 cmp eax,ebx | |
756 jb L_clip_window_mmx | |
757 | |
758 mov ecx,edx | |
759 mov esi,edi | |
760 sub esi,ebx | |
761 | |
762 sub ecx,3 | |
763 mov al, [esi] | |
764 mov [edi],al | |
765 mov al, [esi+1] | |
766 mov dl, [esi+2] | |
767 add esi,3 | |
768 mov [edi+1],al | |
769 mov [edi+2],dl | |
770 add edi,3 | |
771 rep movsb | |
772 | |
773 mov esi, [esp+44] | |
774 mov ebx, [esp+8] | |
775 jmp L_while_test_mmx | |
776 | |
777 ALIGN 4 | |
778 L_check_dist_one_mmx: | |
779 cmp ebx,1 | |
780 jne L_check_window_mmx | |
781 cmp [esp+40],edi | |
782 je L_check_window_mmx | |
783 | |
784 dec edi | |
785 mov ecx,edx | |
786 mov al, [edi] | |
787 sub ecx,3 | |
788 | |
789 mov [edi+1],al | |
790 mov [edi+2],al | |
791 mov [edi+3],al | |
792 add edi,4 | |
793 rep stosb | |
794 | |
795 mov ebx, [esp+8] | |
796 jmp L_while_test_mmx | |
797 | |
798 ALIGN 4 | |
799 L_test_for_second_level_length_mmx: | |
800 test al,64 | |
801 jnz L_test_for_end_of_block | |
802 | |
803 and eax,15 | |
804 psrlq mm0,mm1 | |
805 movd ecx,mm0 | |
806 and ecx, [inflate_fast_mask+eax*4] | |
807 add ecx,edx | |
808 mov eax, [ebx+ecx*4] | |
809 jmp L_dolen_mmx | |
810 | |
811 ALIGN 4 | |
812 L_test_for_second_level_dist_mmx: | |
813 test al,64 | |
814 jnz L_invalid_distance_code | |
815 | |
816 and eax,15 | |
817 psrlq mm0,mm1 | |
818 movd ecx,mm0 | |
819 and ecx, [inflate_fast_mask+eax*4] | |
820 mov eax, [esp+12] | |
821 add ecx,ebx | |
822 mov eax, [eax+ecx*4] | |
823 jmp L_dodist_mmx | |
824 | |
825 ALIGN 4 | |
826 L_clip_window_mmx: | |
827 | |
828 mov ecx,eax | |
829 mov eax, [esp+52] | |
830 neg ecx | |
831 mov esi, [esp+56] | |
832 | |
833 cmp eax,ebx | |
834 jb L_invalid_distance_too_far | |
835 | |
836 add ecx,ebx | |
837 cmp dword ptr [esp+48],0 | |
838 jne L_wrap_around_window_mmx | |
839 | |
840 sub eax,ecx | |
841 add esi,eax | |
842 | |
843 cmp edx,ecx | |
844 jbe L_do_copy1_mmx | |
845 | |
846 sub edx,ecx | |
847 rep movsb | |
848 mov esi,edi | |
849 sub esi,ebx | |
850 jmp L_do_copy1_mmx | |
851 | |
852 cmp edx,ecx | |
853 jbe L_do_copy1_mmx | |
854 | |
855 sub edx,ecx | |
856 rep movsb | |
857 mov esi,edi | |
858 sub esi,ebx | |
859 jmp L_do_copy1_mmx | |
860 | |
861 L_wrap_around_window_mmx: | |
862 | |
863 mov eax, [esp+48] | |
864 cmp ecx,eax | |
865 jbe L_contiguous_in_window_mmx | |
866 | |
867 add esi, [esp+52] | |
868 add esi,eax | |
869 sub esi,ecx | |
870 sub ecx,eax | |
871 | |
872 | |
873 cmp edx,ecx | |
874 jbe L_do_copy1_mmx | |
875 | |
876 sub edx,ecx | |
877 rep movsb | |
878 mov esi, [esp+56] | |
879 mov ecx, [esp+48] | |
880 cmp edx,ecx | |
881 jbe L_do_copy1_mmx | |
882 | |
883 sub edx,ecx | |
884 rep movsb | |
885 mov esi,edi | |
886 sub esi,ebx | |
887 jmp L_do_copy1_mmx | |
888 | |
889 L_contiguous_in_window_mmx: | |
890 | |
891 add esi,eax | |
892 sub esi,ecx | |
893 | |
894 | |
895 cmp edx,ecx | |
896 jbe L_do_copy1_mmx | |
897 | |
898 sub edx,ecx | |
899 rep movsb | |
900 mov esi,edi | |
901 sub esi,ebx | |
902 | |
903 L_do_copy1_mmx: | |
904 | |
905 | |
906 mov ecx,edx | |
907 rep movsb | |
908 | |
909 mov esi, [esp+44] | |
910 mov ebx, [esp+8] | |
911 jmp L_while_test_mmx | |
912 ; 1174 "inffast.S" | |
913 L_invalid_distance_code: | |
914 | |
915 | |
916 | |
917 | |
918 | |
919 mov ecx, invalid_distance_code_msg | |
920 mov edx,INFLATE_MODE_BAD | |
921 jmp L_update_stream_state | |
922 | |
923 L_test_for_end_of_block: | |
924 | |
925 | |
926 | |
927 | |
928 | |
929 test al,32 | |
930 jz L_invalid_literal_length_code | |
931 | |
932 mov ecx,0 | |
933 mov edx,INFLATE_MODE_TYPE | |
934 jmp L_update_stream_state | |
935 | |
936 L_invalid_literal_length_code: | |
937 | |
938 | |
939 | |
940 | |
941 | |
942 mov ecx, invalid_literal_length_code_msg | |
943 mov edx,INFLATE_MODE_BAD | |
944 jmp L_update_stream_state | |
945 | |
946 L_invalid_distance_too_far: | |
947 | |
948 | |
949 | |
950 mov esi, [esp+44] | |
951 mov ecx, invalid_distance_too_far_msg | |
952 mov edx,INFLATE_MODE_BAD | |
953 jmp L_update_stream_state | |
954 | |
955 L_update_stream_state: | |
956 | |
957 mov eax, [esp+88] | |
958 test ecx,ecx | |
959 jz L_skip_msg | |
960 mov [eax+24],ecx | |
961 L_skip_msg: | |
962 mov eax, [eax+28] | |
963 mov [eax+mode_state],edx | |
964 jmp L_break_loop | |
965 | |
966 ALIGN 4 | |
967 L_break_loop: | |
968 ; 1243 "inffast.S" | |
969 cmp dword ptr [inflate_fast_use_mmx],2 | |
970 jne L_update_next_in | |
971 | |
972 | |
973 | |
974 mov ebx,ebp | |
975 | |
976 L_update_next_in: | |
977 ; 1266 "inffast.S" | |
978 mov eax, [esp+88] | |
979 mov ecx,ebx | |
980 mov edx, [eax+28] | |
981 shr ecx,3 | |
982 sub esi,ecx | |
983 shl ecx,3 | |
984 sub ebx,ecx | |
985 mov [eax+12],edi | |
986 mov [edx+bits_state],ebx | |
987 mov ecx,ebx | |
988 | |
989 lea ebx, [esp+28] | |
990 cmp [esp+20],ebx | |
991 jne L_buf_not_used | |
992 | |
993 sub esi,ebx | |
994 mov ebx, [eax+0] | |
995 mov [esp+20],ebx | |
996 add esi,ebx | |
997 mov ebx, [eax+4] | |
998 sub ebx,11 | |
999 add [esp+20],ebx | |
1000 | |
1001 L_buf_not_used: | |
1002 mov [eax+0],esi | |
1003 | |
1004 mov ebx,1 | |
1005 shl ebx,cl | |
1006 dec ebx | |
1007 | |
1008 | |
1009 | |
1010 | |
1011 | |
1012 cmp dword ptr [inflate_fast_use_mmx],2 | |
1013 jne L_update_hold | |
1014 | |
1015 | |
1016 | |
1017 psrlq mm0,mm1 | |
1018 movd ebp,mm0 | |
1019 | |
1020 emms | |
1021 | |
1022 L_update_hold: | |
1023 | |
1024 | |
1025 | |
1026 and ebp,ebx | |
1027 mov [edx+hold_state],ebp | |
1028 | |
1029 | |
1030 | |
1031 | |
1032 mov ebx, [esp+20] | |
1033 cmp ebx,esi | |
1034 jbe L_last_is_smaller | |
1035 | |
1036 sub ebx,esi | |
1037 add ebx,11 | |
1038 mov [eax+4],ebx | |
1039 jmp L_fixup_out | |
1040 L_last_is_smaller: | |
1041 sub esi,ebx | |
1042 neg esi | |
1043 add esi,11 | |
1044 mov [eax+4],esi | |
1045 | |
1046 | |
1047 | |
1048 | |
1049 L_fixup_out: | |
1050 | |
1051 mov ebx, [esp+16] | |
1052 cmp ebx,edi | |
1053 jbe L_end_is_smaller | |
1054 | |
1055 sub ebx,edi | |
1056 add ebx,257 | |
1057 mov [eax+16],ebx | |
1058 jmp L_done | |
1059 L_end_is_smaller: | |
1060 sub edi,ebx | |
1061 neg edi | |
1062 add edi,257 | |
1063 mov [eax+16],edi | |
1064 | |
1065 | |
1066 | |
1067 | |
1068 | |
1069 L_done: | |
1070 add esp,64 | |
1071 popfd | |
1072 pop ebx | |
1073 pop ebp | |
1074 pop esi | |
1075 pop edi | |
1076 ret | |
1077 _inflate_fast endp | |
1078 | |
1079 _TEXT ends | |
1080 end |