add ext4,vfat and tar.bz2
[u-tools.git] / u-tools / apps / zlib / contrib / masmx86 / inffas32.asm
blob92ac22ad9d904b5328adf6f00d9da9a2ff4bdf7f
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/
28 ; compile with command line option
29 ; ml /coff /Zi /c /Flinffas32.lst inffas32.asm
31 ; if you define NO_GZIP (see inflate.h), compile with
32 ; ml /coff /Zi /c /Flinffas32.lst /DNO_GUNZIP inffas32.asm
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
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
55 ; 75 "inffast.S"
56 ;FILE "inffast.S"
58 ;;;GLOBAL _inflate_fast
60 ;;;SECTION .text
64 .586p
65 .mmx
67 name inflate_fast_x86
68 .MODEL FLAT
70 _DATA segment
71 inflate_fast_use_mmx:
72 dd 1
75 _TEXT segment
76 PUBLIC _inflate_fast
78 ALIGN 4
79 _inflate_fast:
80 jmp inflate_fast_entry
84 ALIGN 4
85 db 'Fast decoding Code from Chris Anderson'
86 db 0
88 ALIGN 4
89 invalid_literal_length_code_msg:
90 db 'invalid literal/length code'
91 db 0
93 ALIGN 4
94 invalid_distance_code_msg:
95 db 'invalid distance code'
96 db 0
98 ALIGN 4
99 invalid_distance_too_far_msg:
100 db 'invalid distance too far back'
101 db 0
104 ALIGN 4
105 inflate_fast_mask:
106 dd 0
107 dd 1
108 dd 3
109 dd 7
110 dd 15
111 dd 31
112 dd 63
113 dd 127
114 dd 255
115 dd 511
116 dd 1023
117 dd 2047
118 dd 4095
119 dd 8191
120 dd 16383
121 dd 32767
122 dd 65535
123 dd 131071
124 dd 262143
125 dd 524287
126 dd 1048575
127 dd 2097151
128 dd 4194303
129 dd 8388607
130 dd 16777215
131 dd 33554431
132 dd 67108863
133 dd 134217727
134 dd 268435455
135 dd 536870911
136 dd 1073741823
137 dd 2147483647
138 dd 4294967295
141 mode_state equ 0 ;/* state->mode */
142 wsize_state equ (32+zlib1222sup) ;/* state->wsize */
143 write_state equ (36+4+zlib1222sup) ;/* state->write */
144 window_state equ (40+4+zlib1222sup) ;/* state->window */
145 hold_state equ (44+4+zlib1222sup) ;/* state->hold */
146 bits_state equ (48+4+zlib1222sup) ;/* state->bits */
147 lencode_state equ (64+4+zlib1222sup) ;/* state->lencode */
148 distcode_state equ (68+4+zlib1222sup) ;/* state->distcode */
149 lenbits_state equ (72+4+zlib1222sup) ;/* state->lenbits */
150 distbits_state equ (76+4+zlib1222sup) ;/* state->distbits */
153 ;;SECTION .text
154 ; 205 "inffast.S"
155 ;GLOBAL inflate_fast_use_mmx
157 ;SECTION .data
160 ; GLOBAL inflate_fast_use_mmx:object
161 ;.size inflate_fast_use_mmx, 4
162 ; 226 "inffast.S"
163 ;SECTION .text
165 ALIGN 4
166 inflate_fast_entry:
167 push edi
168 push esi
169 push ebp
170 push ebx
171 pushfd
172 sub esp,64
178 mov esi, [esp+88]
179 mov edi, [esi+28]
187 mov edx, [esi+4]
188 mov eax, [esi+0]
190 add edx,eax
191 sub edx,11
193 mov [esp+44],eax
194 mov [esp+20],edx
196 mov ebp, [esp+92]
197 mov ecx, [esi+16]
198 mov ebx, [esi+12]
200 sub ebp,ecx
201 neg ebp
202 add ebp,ebx
204 sub ecx,257
205 add ecx,ebx
207 mov [esp+60],ebx
208 mov [esp+40],ebp
209 mov [esp+16],ecx
210 ; 285 "inffast.S"
211 mov eax, [edi+lencode_state]
212 mov ecx, [edi+distcode_state]
214 mov [esp+8],eax
215 mov [esp+12],ecx
217 mov eax,1
218 mov ecx, [edi+lenbits_state]
219 shl eax,cl
220 dec eax
221 mov [esp+0],eax
223 mov eax,1
224 mov ecx, [edi+distbits_state]
225 shl eax,cl
226 dec eax
227 mov [esp+4],eax
229 mov eax, [edi+wsize_state]
230 mov ecx, [edi+write_state]
231 mov edx, [edi+window_state]
233 mov [esp+52],eax
234 mov [esp+48],ecx
235 mov [esp+56],edx
237 mov ebp, [edi+hold_state]
238 mov ebx, [edi+bits_state]
239 ; 321 "inffast.S"
240 mov esi, [esp+44]
241 mov ecx, [esp+20]
242 cmp ecx,esi
243 ja L_align_long
245 add ecx,11
246 sub ecx,esi
247 mov eax,12
248 sub eax,ecx
249 lea edi, [esp+28]
250 rep movsb
251 mov ecx,eax
252 xor eax,eax
253 rep stosb
254 lea esi, [esp+28]
255 mov [esp+20],esi
256 jmp L_is_aligned
259 L_align_long:
260 test esi,3
261 jz L_is_aligned
262 xor eax,eax
263 mov al, [esi]
264 inc esi
265 mov ecx,ebx
266 add ebx,8
267 shl eax,cl
268 or ebp,eax
269 jmp L_align_long
271 L_is_aligned:
272 mov edi, [esp+60]
273 ; 366 "inffast.S"
274 L_check_mmx:
275 cmp dword ptr [inflate_fast_use_mmx],2
276 je L_init_mmx
277 ja L_do_loop
279 push eax
280 push ebx
281 push ecx
282 push edx
283 pushfd
284 mov eax, [esp]
285 xor dword ptr [esp],0200000h
290 popfd
291 pushfd
292 pop edx
293 xor edx,eax
294 jz L_dont_use_mmx
295 xor eax,eax
296 cpuid
297 cmp ebx,0756e6547h
298 jne L_dont_use_mmx
299 cmp ecx,06c65746eh
300 jne L_dont_use_mmx
301 cmp edx,049656e69h
302 jne L_dont_use_mmx
303 mov eax,1
304 cpuid
305 shr eax,8
306 and eax,15
307 cmp eax,6
308 jne L_dont_use_mmx
309 test edx,0800000h
310 jnz L_use_mmx
311 jmp L_dont_use_mmx
312 L_use_mmx:
313 mov dword ptr [inflate_fast_use_mmx],2
314 jmp L_check_mmx_pop
315 L_dont_use_mmx:
316 mov dword ptr [inflate_fast_use_mmx],3
317 L_check_mmx_pop:
318 pop edx
319 pop ecx
320 pop ebx
321 pop eax
322 jmp L_check_mmx
323 ; 426 "inffast.S"
324 ALIGN 4
325 L_do_loop:
326 ; 437 "inffast.S"
327 cmp bl,15
328 ja L_get_length_code
330 xor eax,eax
331 lodsw
332 mov cl,bl
333 add bl,16
334 shl eax,cl
335 or ebp,eax
337 L_get_length_code:
338 mov edx, [esp+0]
339 mov ecx, [esp+8]
340 and edx,ebp
341 mov eax, [ecx+edx*4]
343 L_dolen:
350 mov cl,ah
351 sub bl,ah
352 shr ebp,cl
359 test al,al
360 jnz L_test_for_length_base
362 shr eax,16
363 stosb
365 L_while_test:
368 cmp [esp+16],edi
369 jbe L_break_loop
371 cmp [esp+20],esi
372 ja L_do_loop
373 jmp L_break_loop
375 L_test_for_length_base:
376 ; 502 "inffast.S"
377 mov edx,eax
378 shr edx,16
379 mov cl,al
381 test al,16
382 jz L_test_for_second_level_length
383 and cl,15
384 jz L_save_len
385 cmp bl,cl
386 jae L_add_bits_to_len
388 mov ch,cl
389 xor eax,eax
390 lodsw
391 mov cl,bl
392 add bl,16
393 shl eax,cl
394 or ebp,eax
395 mov cl,ch
397 L_add_bits_to_len:
398 mov eax,1
399 shl eax,cl
400 dec eax
401 sub bl,cl
402 and eax,ebp
403 shr ebp,cl
404 add edx,eax
406 L_save_len:
407 mov [esp+24],edx
410 L_decode_distance:
411 ; 549 "inffast.S"
412 cmp bl,15
413 ja L_get_distance_code
415 xor eax,eax
416 lodsw
417 mov cl,bl
418 add bl,16
419 shl eax,cl
420 or ebp,eax
422 L_get_distance_code:
423 mov edx, [esp+4]
424 mov ecx, [esp+12]
425 and edx,ebp
426 mov eax, [ecx+edx*4]
429 L_dodist:
430 mov edx,eax
431 shr edx,16
432 mov cl,ah
433 sub bl,ah
434 shr ebp,cl
435 ; 584 "inffast.S"
436 mov cl,al
438 test al,16
439 jz L_test_for_second_level_dist
440 and cl,15
441 jz L_check_dist_one
442 cmp bl,cl
443 jae L_add_bits_to_dist
445 mov ch,cl
446 xor eax,eax
447 lodsw
448 mov cl,bl
449 add bl,16
450 shl eax,cl
451 or ebp,eax
452 mov cl,ch
454 L_add_bits_to_dist:
455 mov eax,1
456 shl eax,cl
457 dec eax
458 sub bl,cl
459 and eax,ebp
460 shr ebp,cl
461 add edx,eax
462 jmp L_check_window
464 L_check_window:
465 ; 625 "inffast.S"
466 mov [esp+44],esi
467 mov eax,edi
468 sub eax, [esp+40]
470 cmp eax,edx
471 jb L_clip_window
473 mov ecx, [esp+24]
474 mov esi,edi
475 sub esi,edx
477 sub ecx,3
478 mov al, [esi]
479 mov [edi],al
480 mov al, [esi+1]
481 mov dl, [esi+2]
482 add esi,3
483 mov [edi+1],al
484 mov [edi+2],dl
485 add edi,3
486 rep movsb
488 mov esi, [esp+44]
489 jmp L_while_test
491 ALIGN 4
492 L_check_dist_one:
493 cmp edx,1
494 jne L_check_window
495 cmp [esp+40],edi
496 je L_check_window
498 dec edi
499 mov ecx, [esp+24]
500 mov al, [edi]
501 sub ecx,3
503 mov [edi+1],al
504 mov [edi+2],al
505 mov [edi+3],al
506 add edi,4
507 rep stosb
509 jmp L_while_test
511 ALIGN 4
512 L_test_for_second_level_length:
517 test al,64
518 jnz L_test_for_end_of_block
520 mov eax,1
521 shl eax,cl
522 dec eax
523 and eax,ebp
524 add eax,edx
525 mov edx, [esp+8]
526 mov eax, [edx+eax*4]
527 jmp L_dolen
529 ALIGN 4
530 L_test_for_second_level_dist:
535 test al,64
536 jnz L_invalid_distance_code
538 mov eax,1
539 shl eax,cl
540 dec eax
541 and eax,ebp
542 add eax,edx
543 mov edx, [esp+12]
544 mov eax, [edx+eax*4]
545 jmp L_dodist
547 ALIGN 4
548 L_clip_window:
549 ; 721 "inffast.S"
550 mov ecx,eax
551 mov eax, [esp+52]
552 neg ecx
553 mov esi, [esp+56]
555 cmp eax,edx
556 jb L_invalid_distance_too_far
558 add ecx,edx
559 cmp dword ptr [esp+48],0
560 jne L_wrap_around_window
562 sub eax,ecx
563 add esi,eax
564 ; 749 "inffast.S"
565 mov eax, [esp+24]
566 cmp eax,ecx
567 jbe L_do_copy1
569 sub eax,ecx
570 rep movsb
571 mov esi,edi
572 sub esi,edx
573 jmp L_do_copy1
575 cmp eax,ecx
576 jbe L_do_copy1
578 sub eax,ecx
579 rep movsb
580 mov esi,edi
581 sub esi,edx
582 jmp L_do_copy1
584 L_wrap_around_window:
585 ; 793 "inffast.S"
586 mov eax, [esp+48]
587 cmp ecx,eax
588 jbe L_contiguous_in_window
590 add esi, [esp+52]
591 add esi,eax
592 sub esi,ecx
593 sub ecx,eax
596 mov eax, [esp+24]
597 cmp eax,ecx
598 jbe L_do_copy1
600 sub eax,ecx
601 rep movsb
602 mov esi, [esp+56]
603 mov ecx, [esp+48]
604 cmp eax,ecx
605 jbe L_do_copy1
607 sub eax,ecx
608 rep movsb
609 mov esi,edi
610 sub esi,edx
611 jmp L_do_copy1
613 L_contiguous_in_window:
614 ; 836 "inffast.S"
615 add esi,eax
616 sub esi,ecx
619 mov eax, [esp+24]
620 cmp eax,ecx
621 jbe L_do_copy1
623 sub eax,ecx
624 rep movsb
625 mov esi,edi
626 sub esi,edx
628 L_do_copy1:
629 ; 862 "inffast.S"
630 mov ecx,eax
631 rep movsb
633 mov esi, [esp+44]
634 jmp L_while_test
635 ; 878 "inffast.S"
636 ALIGN 4
637 L_init_mmx:
638 emms
644 movd mm0,ebp
645 mov ebp,ebx
646 ; 896 "inffast.S"
647 movd mm4,dword ptr [esp+0]
648 movq mm3,mm4
649 movd mm5,dword ptr [esp+4]
650 movq mm2,mm5
651 pxor mm1,mm1
652 mov ebx, [esp+8]
653 jmp L_do_loop_mmx
655 ALIGN 4
656 L_do_loop_mmx:
657 psrlq mm0,mm1
659 cmp ebp,32
660 ja L_get_length_code_mmx
662 movd mm6,ebp
663 movd mm7,dword ptr [esi]
664 add esi,4
665 psllq mm7,mm6
666 add ebp,32
667 por mm0,mm7
669 L_get_length_code_mmx:
670 pand mm4,mm0
671 movd eax,mm4
672 movq mm4,mm3
673 mov eax, [ebx+eax*4]
675 L_dolen_mmx:
676 movzx ecx,ah
677 movd mm1,ecx
678 sub ebp,ecx
680 test al,al
681 jnz L_test_for_length_base_mmx
683 shr eax,16
684 stosb
686 L_while_test_mmx:
689 cmp [esp+16],edi
690 jbe L_break_loop
692 cmp [esp+20],esi
693 ja L_do_loop_mmx
694 jmp L_break_loop
696 L_test_for_length_base_mmx:
698 mov edx,eax
699 shr edx,16
701 test al,16
702 jz L_test_for_second_level_length_mmx
703 and eax,15
704 jz L_decode_distance_mmx
706 psrlq mm0,mm1
707 movd mm1,eax
708 movd ecx,mm0
709 sub ebp,eax
710 and ecx, [inflate_fast_mask+eax*4]
711 add edx,ecx
713 L_decode_distance_mmx:
714 psrlq mm0,mm1
716 cmp ebp,32
717 ja L_get_dist_code_mmx
719 movd mm6,ebp
720 movd mm7,dword ptr [esi]
721 add esi,4
722 psllq mm7,mm6
723 add ebp,32
724 por mm0,mm7
726 L_get_dist_code_mmx:
727 mov ebx, [esp+12]
728 pand mm5,mm0
729 movd eax,mm5
730 movq mm5,mm2
731 mov eax, [ebx+eax*4]
733 L_dodist_mmx:
735 movzx ecx,ah
736 mov ebx,eax
737 shr ebx,16
738 sub ebp,ecx
739 movd mm1,ecx
741 test al,16
742 jz L_test_for_second_level_dist_mmx
743 and eax,15
744 jz L_check_dist_one_mmx
746 L_add_bits_to_dist_mmx:
747 psrlq mm0,mm1
748 movd mm1,eax
749 movd ecx,mm0
750 sub ebp,eax
751 and ecx, [inflate_fast_mask+eax*4]
752 add ebx,ecx
754 L_check_window_mmx:
755 mov [esp+44],esi
756 mov eax,edi
757 sub eax, [esp+40]
759 cmp eax,ebx
760 jb L_clip_window_mmx
762 mov ecx,edx
763 mov esi,edi
764 sub esi,ebx
766 sub ecx,3
767 mov al, [esi]
768 mov [edi],al
769 mov al, [esi+1]
770 mov dl, [esi+2]
771 add esi,3
772 mov [edi+1],al
773 mov [edi+2],dl
774 add edi,3
775 rep movsb
777 mov esi, [esp+44]
778 mov ebx, [esp+8]
779 jmp L_while_test_mmx
781 ALIGN 4
782 L_check_dist_one_mmx:
783 cmp ebx,1
784 jne L_check_window_mmx
785 cmp [esp+40],edi
786 je L_check_window_mmx
788 dec edi
789 mov ecx,edx
790 mov al, [edi]
791 sub ecx,3
793 mov [edi+1],al
794 mov [edi+2],al
795 mov [edi+3],al
796 add edi,4
797 rep stosb
799 mov ebx, [esp+8]
800 jmp L_while_test_mmx
802 ALIGN 4
803 L_test_for_second_level_length_mmx:
804 test al,64
805 jnz L_test_for_end_of_block
807 and eax,15
808 psrlq mm0,mm1
809 movd ecx,mm0
810 and ecx, [inflate_fast_mask+eax*4]
811 add ecx,edx
812 mov eax, [ebx+ecx*4]
813 jmp L_dolen_mmx
815 ALIGN 4
816 L_test_for_second_level_dist_mmx:
817 test al,64
818 jnz L_invalid_distance_code
820 and eax,15
821 psrlq mm0,mm1
822 movd ecx,mm0
823 and ecx, [inflate_fast_mask+eax*4]
824 mov eax, [esp+12]
825 add ecx,ebx
826 mov eax, [eax+ecx*4]
827 jmp L_dodist_mmx
829 ALIGN 4
830 L_clip_window_mmx:
832 mov ecx,eax
833 mov eax, [esp+52]
834 neg ecx
835 mov esi, [esp+56]
837 cmp eax,ebx
838 jb L_invalid_distance_too_far
840 add ecx,ebx
841 cmp dword ptr [esp+48],0
842 jne L_wrap_around_window_mmx
844 sub eax,ecx
845 add esi,eax
847 cmp edx,ecx
848 jbe L_do_copy1_mmx
850 sub edx,ecx
851 rep movsb
852 mov esi,edi
853 sub esi,ebx
854 jmp L_do_copy1_mmx
856 cmp edx,ecx
857 jbe L_do_copy1_mmx
859 sub edx,ecx
860 rep movsb
861 mov esi,edi
862 sub esi,ebx
863 jmp L_do_copy1_mmx
865 L_wrap_around_window_mmx:
867 mov eax, [esp+48]
868 cmp ecx,eax
869 jbe L_contiguous_in_window_mmx
871 add esi, [esp+52]
872 add esi,eax
873 sub esi,ecx
874 sub ecx,eax
877 cmp edx,ecx
878 jbe L_do_copy1_mmx
880 sub edx,ecx
881 rep movsb
882 mov esi, [esp+56]
883 mov ecx, [esp+48]
884 cmp edx,ecx
885 jbe L_do_copy1_mmx
887 sub edx,ecx
888 rep movsb
889 mov esi,edi
890 sub esi,ebx
891 jmp L_do_copy1_mmx
893 L_contiguous_in_window_mmx:
895 add esi,eax
896 sub esi,ecx
899 cmp edx,ecx
900 jbe L_do_copy1_mmx
902 sub edx,ecx
903 rep movsb
904 mov esi,edi
905 sub esi,ebx
907 L_do_copy1_mmx:
910 mov ecx,edx
911 rep movsb
913 mov esi, [esp+44]
914 mov ebx, [esp+8]
915 jmp L_while_test_mmx
916 ; 1174 "inffast.S"
917 L_invalid_distance_code:
923 mov ecx, invalid_distance_code_msg
924 mov edx,INFLATE_MODE_BAD
925 jmp L_update_stream_state
927 L_test_for_end_of_block:
933 test al,32
934 jz L_invalid_literal_length_code
936 mov ecx,0
937 mov edx,INFLATE_MODE_TYPE
938 jmp L_update_stream_state
940 L_invalid_literal_length_code:
946 mov ecx, invalid_literal_length_code_msg
947 mov edx,INFLATE_MODE_BAD
948 jmp L_update_stream_state
950 L_invalid_distance_too_far:
954 mov esi, [esp+44]
955 mov ecx, invalid_distance_too_far_msg
956 mov edx,INFLATE_MODE_BAD
957 jmp L_update_stream_state
959 L_update_stream_state:
961 mov eax, [esp+88]
962 test ecx,ecx
963 jz L_skip_msg
964 mov [eax+24],ecx
965 L_skip_msg:
966 mov eax, [eax+28]
967 mov [eax+mode_state],edx
968 jmp L_break_loop
970 ALIGN 4
971 L_break_loop:
972 ; 1243 "inffast.S"
973 cmp dword ptr [inflate_fast_use_mmx],2
974 jne L_update_next_in
978 mov ebx,ebp
980 L_update_next_in:
981 ; 1266 "inffast.S"
982 mov eax, [esp+88]
983 mov ecx,ebx
984 mov edx, [eax+28]
985 shr ecx,3
986 sub esi,ecx
987 shl ecx,3
988 sub ebx,ecx
989 mov [eax+12],edi
990 mov [edx+bits_state],ebx
991 mov ecx,ebx
993 lea ebx, [esp+28]
994 cmp [esp+20],ebx
995 jne L_buf_not_used
997 sub esi,ebx
998 mov ebx, [eax+0]
999 mov [esp+20],ebx
1000 add esi,ebx
1001 mov ebx, [eax+4]
1002 sub ebx,11
1003 add [esp+20],ebx
1005 L_buf_not_used:
1006 mov [eax+0],esi
1008 mov ebx,1
1009 shl ebx,cl
1010 dec ebx
1016 cmp dword ptr [inflate_fast_use_mmx],2
1017 jne L_update_hold
1021 psrlq mm0,mm1
1022 movd ebp,mm0
1024 emms
1026 L_update_hold:
1030 and ebp,ebx
1031 mov [edx+hold_state],ebp
1036 mov ebx, [esp+20]
1037 cmp ebx,esi
1038 jbe L_last_is_smaller
1040 sub ebx,esi
1041 add ebx,11
1042 mov [eax+4],ebx
1043 jmp L_fixup_out
1044 L_last_is_smaller:
1045 sub esi,ebx
1046 neg esi
1047 add esi,11
1048 mov [eax+4],esi
1053 L_fixup_out:
1055 mov ebx, [esp+16]
1056 cmp ebx,edi
1057 jbe L_end_is_smaller
1059 sub ebx,edi
1060 add ebx,257
1061 mov [eax+16],ebx
1062 jmp L_done
1063 L_end_is_smaller:
1064 sub edi,ebx
1065 neg edi
1066 add edi,257
1067 mov [eax+16],edi
1073 L_done:
1074 add esp,64
1075 popfd
1076 pop ebx
1077 pop ebp
1078 pop esi
1079 pop edi
1082 _TEXT ends