1 ; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.30319.01
\r
3 TITLE D:\FMU\FMUSolution\zlib-1.2.6\adler32.c
\r
12 ; Function compile flags: /Ogtp
\r
13 ; File d:\fmu\fmusolution\zlib-1.2.6\adler32.c
\r
14 ; COMDAT _adler32_combine_
\r
16 _len2$ = 8 ; size = 8
\r
17 _sum1$ = 12 ; size = 4
\r
18 _adler32_combine_ PROC ; COMDAT
\r
25 00001 8b ec mov ebp, esp
\r
28 00005 8b d8 mov ebx, eax
\r
30 ; 141 : unsigned long sum1;
\r
31 ; 142 : unsigned long sum2;
\r
32 ; 143 : unsigned rem;
\r
34 ; 145 : /* for negative len, return invalid adler32 as a clue for debugging */
\r
35 ; 146 : if (len2 < 0)
\r
37 00007 8b 45 0c mov eax, DWORD PTR _len2$[ebp+4]
\r
39 0000b 8b 7d 08 mov edi, DWORD PTR _len2$[ebp]
\r
40 0000e 8b f1 mov esi, ecx
\r
41 00010 85 c0 test eax, eax
\r
42 00012 7f 0e jg SHORT $LN5@adler32_co
\r
43 00014 7c 04 jl SHORT $LN8@adler32_co
\r
44 00016 85 ff test edi, edi
\r
45 00018 73 08 jae SHORT $LN5@adler32_co
\r
50 ; 147 : return 0xffffffffUL;
\r
52 0001c 83 c8 ff or eax, -1
\r
62 ; 149 : /* the derivation of this formula is left as an exercise for the reader */
\r
63 ; 150 : MOD63(len2); /* assumes len2 >= 0 */
\r
66 00024 68 f1 ff 00 00 push 65521 ; 0000fff1H
\r
69 0002b e8 00 00 00 00 call __alldiv
\r
70 00030 69 c0 f1 ff 00
\r
71 00 imul eax, 65521 ; 0000fff1H
\r
72 00036 2b f8 sub edi, eax
\r
74 ; 151 : rem = (unsigned)len2;
\r
75 ; 152 : sum1 = adler1 & 0xffff;
\r
77 00038 0f b7 c6 movzx eax, si
\r
79 ; 153 : sum2 = rem * sum1;
\r
81 0003b 8b c8 mov ecx, eax
\r
82 0003d 0f af cf imul ecx, edi
\r
85 ; 155 : sum1 += (adler2 & 0xffff) + BASE - 1;
\r
87 00040 0f b7 d3 movzx edx, bx
\r
88 00043 8d 84 10 f0 ff
\r
89 00 00 lea eax, DWORD PTR [eax+edx+65520]
\r
90 0004a 89 45 0c mov DWORD PTR _sum1$[ebp], eax
\r
91 0004d b8 71 80 07 80 mov eax, -2146992015 ; 80078071H
\r
93 00054 c1 ea 0f shr edx, 15 ; 0000000fH
\r
95 ; 156 : sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
\r
97 00057 69 d2 f1 ff 00
\r
98 00 imul edx, 65521 ; 0000fff1H
\r
99 0005d c1 ee 10 shr esi, 16 ; 00000010H
\r
100 00060 2b f2 sub esi, edx
\r
102 ; 157 : if (sum1 >= BASE) sum1 -= BASE;
\r
104 00062 8b 55 0c mov edx, DWORD PTR _sum1$[ebp]
\r
105 00065 c1 eb 10 shr ebx, 16 ; 00000010H
\r
106 00068 03 f3 add esi, ebx
\r
107 0006a 2b f7 sub esi, edi
\r
108 0006c 8d 8c 31 f1 ff
\r
109 00 00 lea ecx, DWORD PTR [ecx+esi+65521]
\r
110 00073 81 fa f1 ff 00
\r
111 00 cmp edx, 65521 ; 0000fff1H
\r
112 00079 72 14 jb SHORT $LN3@adler32_co
\r
113 0007b 81 ea f1 ff 00
\r
114 00 sub edx, 65521 ; 0000fff1H
\r
116 ; 158 : if (sum1 >= BASE) sum1 -= BASE;
\r
118 00081 81 fa f1 ff 00
\r
119 00 cmp edx, 65521 ; 0000fff1H
\r
120 00087 72 06 jb SHORT $LN3@adler32_co
\r
121 00089 81 ea f1 ff 00
\r
122 00 sub edx, 65521 ; 0000fff1H
\r
125 ; 159 : if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1);
\r
127 0008f 81 f9 e2 ff 01
\r
128 00 cmp ecx, 131042 ; 0001ffe2H
\r
129 00095 72 06 jb SHORT $LN2@adler32_co
\r
130 00097 81 e9 e2 ff 01
\r
131 00 sub ecx, 131042 ; 0001ffe2H
\r
134 ; 160 : if (sum2 >= BASE) sum2 -= BASE;
\r
136 0009d 81 f9 f1 ff 00
\r
137 00 cmp ecx, 65521 ; 0000fff1H
\r
138 000a3 72 06 jb SHORT $LN1@adler32_co
\r
139 000a5 81 e9 f1 ff 00
\r
140 00 sub ecx, 65521 ; 0000fff1H
\r
144 ; 161 : return sum1 | (sum2 << 16);
\r
146 000ac 8b c1 mov eax, ecx
\r
147 000ae c1 e0 10 shl eax, 16 ; 00000010H
\r
149 000b2 0b c2 or eax, edx
\r
156 _adler32_combine_ ENDP
\r
159 ; Function compile flags: /Ogtp
\r
160 ; COMDAT _adler32@12
\r
162 _adler$ = 8 ; size = 4
\r
163 tv884 = 12 ; size = 4
\r
164 _buf$ = 12 ; size = 4
\r
165 _len$ = 16 ; size = 4
\r
166 _adler32@12 PROC ; COMDAT
\r
171 00001 8b ec mov ebp, esp
\r
173 ; 70 : unsigned long sum2;
\r
176 ; 73 : /* split Adler-32 into component sums */
\r
177 ; 74 : sum2 = (adler >> 16) & 0xffff;
\r
179 00003 8b 4d 08 mov ecx, DWORD PTR _adler$[ebp]
\r
182 ; 75 : adler &= 0xffff;
\r
184 ; 77 : /* in case user likes doing a byte at a time, keep it fast */
\r
185 ; 78 : if (len == 1) {
\r
187 00007 8b 5d 10 mov ebx, DWORD PTR _len$[ebp]
\r
189 0000b 8b f9 mov edi, ecx
\r
190 0000d c1 ef 10 shr edi, 16 ; 00000010H
\r
191 00010 81 e1 ff ff 00
\r
192 00 and ecx, 65535 ; 0000ffffH
\r
193 00016 83 fb 01 cmp ebx, 1
\r
194 00019 75 33 jne SHORT $LN18@adler32
\r
196 ; 79 : adler += buf[0];
\r
198 0001b 8b 45 0c mov eax, DWORD PTR _buf$[ebp]
\r
199 0001e 0f b6 10 movzx edx, BYTE PTR [eax]
\r
200 00021 03 ca add ecx, edx
\r
202 ; 80 : if (adler >= BASE)
\r
204 00023 81 f9 f1 ff 00
\r
205 00 cmp ecx, 65521 ; 0000fff1H
\r
206 00029 72 06 jb SHORT $LN17@adler32
\r
208 ; 81 : adler -= BASE;
\r
210 0002b 81 e9 f1 ff 00
\r
211 00 sub ecx, 65521 ; 0000fff1H
\r
214 ; 82 : sum2 += adler;
\r
216 00031 03 f9 add edi, ecx
\r
218 ; 83 : if (sum2 >= BASE)
\r
220 00033 81 ff f1 ff 00
\r
221 00 cmp edi, 65521 ; 0000fff1H
\r
222 00039 72 06 jb SHORT $LN16@adler32
\r
224 ; 84 : sum2 -= BASE;
\r
226 0003b 81 ef f1 ff 00
\r
227 00 sub edi, 65521 ; 0000fff1H
\r
230 ; 85 : return adler | (sum2 << 16);
\r
232 00041 8b c7 mov eax, edi
\r
233 00043 c1 e0 10 shl eax, 16 ; 00000010H
\r
235 00047 0b c1 or eax, ecx
\r
241 0004b c2 0c 00 ret 12 ; 0000000cH
\r
247 ; 88 : /* initial Adler-32 value (deferred check for len == 1 speed) */
\r
248 ; 89 : if (buf == Z_NULL)
\r
250 0004f 8b 75 0c mov esi, DWORD PTR _buf$[ebp]
\r
251 00052 85 f6 test esi, esi
\r
252 00054 75 0a jne SHORT $LN15@adler32
\r
256 00056 8d 46 01 lea eax, DWORD PTR [esi+1]
\r
264 0005d c2 0c 00 ret 12 ; 0000000cH
\r
268 ; 92 : /* in case short lengths are provided, keep it somewhat fast */
\r
269 ; 93 : if (len < 16) {
\r
271 00060 83 fb 10 cmp ebx, 16 ; 00000010H
\r
272 00063 73 43 jae SHORT $LN22@adler32
\r
274 ; 94 : while (len--) {
\r
276 00065 85 db test ebx, ebx
\r
277 00067 74 12 je SHORT $LN26@adler32
\r
278 00069 8d a4 24 00 00
\r
282 ; 95 : adler += *buf++;
\r
284 00070 0f b6 06 movzx eax, BYTE PTR [esi]
\r
285 00073 03 c8 add ecx, eax
\r
288 ; 96 : sum2 += adler;
\r
290 00076 03 f9 add edi, ecx
\r
292 00079 75 f5 jne SHORT $LL13@adler32
\r
296 ; 98 : if (adler >= BASE)
\r
298 0007b 81 f9 f1 ff 00
\r
299 00 cmp ecx, 65521 ; 0000fff1H
\r
300 00081 72 06 jb SHORT $LN11@adler32
\r
302 ; 99 : adler -= BASE;
\r
304 00083 81 e9 f1 ff 00
\r
305 00 sub ecx, 65521 ; 0000fff1H
\r
308 ; 100 : MOD28(sum2); /* only added so many BASE's */
\r
310 00089 b8 71 80 07 80 mov eax, -2146992015 ; 80078071H
\r
311 0008e f7 e7 mul edi
\r
312 00090 c1 ea 0f shr edx, 15 ; 0000000fH
\r
314 ; 101 : return adler | (sum2 << 16);
\r
316 00093 8b c2 mov eax, edx
\r
317 00095 c1 e0 04 shl eax, 4
\r
318 00098 2b c2 sub eax, edx
\r
319 0009a 03 c7 add eax, edi
\r
324 ; 131 : /* return recombined sums */
\r
325 ; 132 : return adler | (sum2 << 16);
\r
327 0009d c1 e0 10 shl eax, 16 ; 00000010H
\r
329 000a1 0b c1 or eax, ecx
\r
335 000a5 c2 0c 00 ret 12 ; 0000000cH
\r
340 ; 104 : /* do length NMAX blocks -- requires just one modulo operation */
\r
341 ; 105 : while (len >= NMAX) {
\r
343 000a8 81 fb b0 15 00
\r
344 00 cmp ebx, 5552 ; 000015b0H
\r
345 000ae 0f 82 d2 00 00
\r
347 000b4 b8 af a9 6e 5e mov eax, 1584310703 ; 5e6ea9afH
\r
348 000b9 f7 e3 mul ebx
\r
349 000bb c1 ea 0b shr edx, 11 ; 0000000bH
\r
350 000be 89 55 0c mov DWORD PTR tv884[ebp], edx
\r
353 ; 106 : len -= NMAX;
\r
355 000c1 81 eb b0 15 00
\r
356 00 sub ebx, 5552 ; 000015b0H
\r
358 ; 107 : n = NMAX / 16; /* NMAX is divisible by 16 */
\r
360 000c7 b8 5b 01 00 00 mov eax, 347 ; 0000015bH
\r
361 000cc 8d 64 24 00 npad 4
\r
365 ; 109 : DO16(buf); /* 16 sums unrolled */
\r
367 000d0 0f b6 16 movzx edx, BYTE PTR [esi]
\r
368 000d3 03 ca add ecx, edx
\r
369 000d5 0f b6 56 01 movzx edx, BYTE PTR [esi+1]
\r
370 000d9 03 f9 add edi, ecx
\r
371 000db 03 ca add ecx, edx
\r
372 000dd 0f b6 56 02 movzx edx, BYTE PTR [esi+2]
\r
373 000e1 03 f9 add edi, ecx
\r
374 000e3 03 ca add ecx, edx
\r
375 000e5 0f b6 56 03 movzx edx, BYTE PTR [esi+3]
\r
376 000e9 03 f9 add edi, ecx
\r
377 000eb 03 ca add ecx, edx
\r
378 000ed 0f b6 56 04 movzx edx, BYTE PTR [esi+4]
\r
379 000f1 03 f9 add edi, ecx
\r
380 000f3 03 ca add ecx, edx
\r
381 000f5 0f b6 56 05 movzx edx, BYTE PTR [esi+5]
\r
382 000f9 03 f9 add edi, ecx
\r
383 000fb 03 ca add ecx, edx
\r
384 000fd 0f b6 56 06 movzx edx, BYTE PTR [esi+6]
\r
385 00101 03 f9 add edi, ecx
\r
386 00103 03 ca add ecx, edx
\r
387 00105 0f b6 56 07 movzx edx, BYTE PTR [esi+7]
\r
388 00109 03 f9 add edi, ecx
\r
389 0010b 03 ca add ecx, edx
\r
390 0010d 0f b6 56 08 movzx edx, BYTE PTR [esi+8]
\r
391 00111 03 f9 add edi, ecx
\r
392 00113 03 ca add ecx, edx
\r
393 00115 0f b6 56 09 movzx edx, BYTE PTR [esi+9]
\r
394 00119 03 f9 add edi, ecx
\r
395 0011b 03 ca add ecx, edx
\r
396 0011d 0f b6 56 0a movzx edx, BYTE PTR [esi+10]
\r
397 00121 03 f9 add edi, ecx
\r
398 00123 03 ca add ecx, edx
\r
399 00125 0f b6 56 0b movzx edx, BYTE PTR [esi+11]
\r
400 00129 03 f9 add edi, ecx
\r
401 0012b 03 ca add ecx, edx
\r
402 0012d 0f b6 56 0c movzx edx, BYTE PTR [esi+12]
\r
403 00131 03 f9 add edi, ecx
\r
404 00133 03 ca add ecx, edx
\r
405 00135 0f b6 56 0d movzx edx, BYTE PTR [esi+13]
\r
406 00139 03 f9 add edi, ecx
\r
407 0013b 03 ca add ecx, edx
\r
408 0013d 0f b6 56 0e movzx edx, BYTE PTR [esi+14]
\r
409 00141 03 f9 add edi, ecx
\r
410 00143 03 ca add ecx, edx
\r
411 00145 0f b6 56 0f movzx edx, BYTE PTR [esi+15]
\r
412 00149 03 f9 add edi, ecx
\r
413 0014b 03 ca add ecx, edx
\r
414 0014d 03 f9 add edi, ecx
\r
418 0014f 83 c6 10 add esi, 16 ; 00000010H
\r
420 ; 111 : } while (--n);
\r
423 00153 0f 85 77 ff ff
\r
424 ff jne $LL8@adler32
\r
426 ; 112 : MOD(adler);
\r
428 00159 b8 71 80 07 80 mov eax, -2146992015 ; 80078071H
\r
429 0015e f7 e1 mul ecx
\r
430 00160 c1 ea 0f shr edx, 15 ; 0000000fH
\r
431 00163 69 d2 0f 00 ff
\r
432 ff imul edx, -65521 ; ffff000fH
\r
433 00169 03 ca add ecx, edx
\r
437 0016b b8 71 80 07 80 mov eax, -2146992015 ; 80078071H
\r
438 00170 f7 e7 mul edi
\r
439 00172 c1 ea 0f shr edx, 15 ; 0000000fH
\r
440 00175 69 d2 0f 00 ff
\r
441 ff imul edx, -65521 ; ffff000fH
\r
442 0017b 03 fa add edi, edx
\r
443 0017d ff 4d 0c dec DWORD PTR tv884[ebp]
\r
444 00180 0f 85 3b ff ff
\r
445 ff jne $LL10@adler32
\r
450 ; 116 : /* do remaining bytes (less than NMAX, still just one modulo) */
\r
451 ; 117 : if (len) { /* avoid modulos if none remaining */
\r
453 00186 85 db test ebx, ebx
\r
454 00188 0f 84 d1 00 00
\r
457 ; 118 : while (len >= 16) {
\r
459 0018e 83 fb 10 cmp ebx, 16 ; 00000010H
\r
460 00191 0f 82 95 00 00
\r
461 00 jb $LN32@adler32
\r
462 00197 8b c3 mov eax, ebx
\r
463 00199 c1 e8 04 shr eax, 4
\r
464 0019c 8d 64 24 00 npad 4
\r
470 001a0 0f b6 16 movzx edx, BYTE PTR [esi]
\r
471 001a3 03 ca add ecx, edx
\r
472 001a5 0f b6 56 01 movzx edx, BYTE PTR [esi+1]
\r
473 001a9 03 f9 add edi, ecx
\r
474 001ab 03 ca add ecx, edx
\r
475 001ad 0f b6 56 02 movzx edx, BYTE PTR [esi+2]
\r
476 001b1 03 f9 add edi, ecx
\r
477 001b3 03 ca add ecx, edx
\r
478 001b5 0f b6 56 03 movzx edx, BYTE PTR [esi+3]
\r
479 001b9 03 f9 add edi, ecx
\r
480 001bb 03 ca add ecx, edx
\r
481 001bd 0f b6 56 04 movzx edx, BYTE PTR [esi+4]
\r
482 001c1 03 f9 add edi, ecx
\r
483 001c3 03 ca add ecx, edx
\r
484 001c5 0f b6 56 05 movzx edx, BYTE PTR [esi+5]
\r
485 001c9 03 f9 add edi, ecx
\r
486 001cb 03 ca add ecx, edx
\r
487 001cd 0f b6 56 06 movzx edx, BYTE PTR [esi+6]
\r
488 001d1 03 f9 add edi, ecx
\r
489 001d3 03 ca add ecx, edx
\r
490 001d5 0f b6 56 07 movzx edx, BYTE PTR [esi+7]
\r
491 001d9 03 f9 add edi, ecx
\r
492 001db 03 ca add ecx, edx
\r
493 001dd 0f b6 56 08 movzx edx, BYTE PTR [esi+8]
\r
494 001e1 03 f9 add edi, ecx
\r
495 001e3 03 ca add ecx, edx
\r
496 001e5 0f b6 56 09 movzx edx, BYTE PTR [esi+9]
\r
497 001e9 03 f9 add edi, ecx
\r
498 001eb 03 ca add ecx, edx
\r
499 001ed 0f b6 56 0a movzx edx, BYTE PTR [esi+10]
\r
500 001f1 03 f9 add edi, ecx
\r
501 001f3 03 ca add ecx, edx
\r
502 001f5 0f b6 56 0b movzx edx, BYTE PTR [esi+11]
\r
503 001f9 03 f9 add edi, ecx
\r
504 001fb 03 ca add ecx, edx
\r
505 001fd 0f b6 56 0c movzx edx, BYTE PTR [esi+12]
\r
506 00201 03 f9 add edi, ecx
\r
507 00203 03 ca add ecx, edx
\r
508 00205 0f b6 56 0d movzx edx, BYTE PTR [esi+13]
\r
509 00209 03 f9 add edi, ecx
\r
510 0020b 03 ca add ecx, edx
\r
511 0020d 0f b6 56 0e movzx edx, BYTE PTR [esi+14]
\r
512 00211 03 f9 add edi, ecx
\r
513 00213 03 ca add ecx, edx
\r
514 00215 0f b6 56 0f movzx edx, BYTE PTR [esi+15]
\r
515 00219 03 f9 add edi, ecx
\r
516 0021b 03 ca add ecx, edx
\r
517 0021d 83 eb 10 sub ebx, 16 ; 00000010H
\r
518 00220 03 f9 add edi, ecx
\r
522 00222 83 c6 10 add esi, 16 ; 00000010H
\r
524 00226 0f 85 74 ff ff
\r
525 ff jne $LL4@adler32
\r
529 ; 123 : while (len--) {
\r
531 0022c 85 db test ebx, ebx
\r
532 0022e 74 0b je SHORT $LN30@adler32
\r
535 ; 124 : adler += *buf++;
\r
537 00230 0f b6 06 movzx eax, BYTE PTR [esi]
\r
538 00233 03 c8 add ecx, eax
\r
541 ; 125 : sum2 += adler;
\r
543 00236 03 f9 add edi, ecx
\r
545 00239 75 f5 jne SHORT $LL2@adler32
\r
549 ; 127 : MOD(adler);
\r
551 0023b b8 71 80 07 80 mov eax, -2146992015 ; 80078071H
\r
552 00240 f7 e1 mul ecx
\r
553 00242 c1 ea 0f shr edx, 15 ; 0000000fH
\r
554 00245 69 d2 0f 00 ff
\r
555 ff imul edx, -65521 ; ffff000fH
\r
556 0024b 03 ca add ecx, edx
\r
560 0024d b8 71 80 07 80 mov eax, -2146992015 ; 80078071H
\r
561 00252 f7 e7 mul edi
\r
562 00254 c1 ea 0f shr edx, 15 ; 0000000fH
\r
563 00257 69 d2 0f 00 ff
\r
564 ff imul edx, -65521 ; ffff000fH
\r
565 0025d 03 fa add edi, edx
\r
570 ; 131 : /* return recombined sums */
\r
571 ; 132 : return adler | (sum2 << 16);
\r
573 0025f 8b c7 mov eax, edi
\r
575 00262 c1 e0 10 shl eax, 16 ; 00000010H
\r
577 00266 0b c1 or eax, ecx
\r
583 0026a c2 0c 00 ret 12 ; 0000000cH
\r
585 PUBLIC _adler32_combine@12
\r
586 ; Function compile flags: /Ogtp
\r
587 ; COMDAT _adler32_combine@12
\r
589 _adler1$ = 8 ; size = 4
\r
590 _adler2$ = 12 ; size = 4
\r
591 _len2$ = 16 ; size = 4
\r
592 _adler32_combine@12 PROC ; COMDAT
\r
597 00001 8b ec mov ebp, esp
\r
599 ; 170 : return adler32_combine_(adler1, adler2, len2);
\r
601 00003 8b 45 10 mov eax, DWORD PTR _len2$[ebp]
\r
602 00006 8b 4d 08 mov ecx, DWORD PTR _adler1$[ebp]
\r
606 0000c 8b 45 0c mov eax, DWORD PTR _adler2$[ebp]
\r
607 0000f e8 00 00 00 00 call _adler32_combine_
\r
608 00014 83 c4 08 add esp, 8
\r
613 00018 c2 0c 00 ret 12 ; 0000000cH
\r
614 _adler32_combine@12 ENDP
\r