Function at 0x406370
Capabilities:
Compute adler32 checksum

Disassembly:
push ebp
mov ebp, esp
push ebx
push edi
push esi
sub esp, 8
mov esi, dword [ebp + 0xc]
mov edx, dword [ebp + 0x10]
mov ecx, dword [ebp + 8]
movzx eax, cx
shr ecx, 0x10
mov edi, edx
shr edi, 5
and edx, 0x1f
test edi, edi
mov dword [ebp - 0x10], edx
je 0x4064ad
mov ebx, edi
mov edx, edi
movdqa xmm0, xmmword [0x53b950]
pxor xmm2, xmm2
movdqa xmm3, xmmword [0x53b940]
nop word cs:[eax + eax]
nop dword [eax]
cmp edx, 0xad
mov ebx, 0xad
mov dword [ebp - 0x14], edx
cmovb ebx, edx
mov edx, eax
imul edx, ebx
movd xmm5, edx
movd xmm4, ecx
mov ecx, ebx
shl ecx, 5
mov edx, ebx
pxor xmm6, xmm6
mov edi, esi
nop dword [eax + eax]
movdqu xmm7, xmmword [esi]
movdqa xmm1, xmm7
pmaddubsw xmm7, xmmword [0x53b930]
pmaddwd xmm7, xmm3
paddd xmm7, xmm4
movdqu xmm4, xmmword [esi + 0x10]
paddd xmm5, xmm6
psadbw xmm1, xmm2
paddd xmm1, xmm6
movdqa xmm6, xmm4
psadbw xmm6, xmm2
paddd xmm6, xmm1
pmaddubsw xmm4, xmm0
pmaddwd xmm4, xmm3
paddd xmm4, xmm7
add esi, 0x20
add edx, 0xffffffff
jne 0x4063f0
mov esi, edi
add esi, ecx
pslld xmm5, 5
paddd xmm4, xmm5
pshufd xmm1, xmm6, 0xb1
paddd xmm1, xmm6
pshufd xmm5, xmm1, 0xee
paddd xmm5, xmm1
movd edi, xmm5
add edi, eax
pshufd xmm1, xmm4, 0xb1
paddd xmm1, xmm4
pshufd xmm4, xmm1, 0xee
mov eax, edi
mov ecx, 0x80078071
mul ecx
paddd xmm4, xmm1
movd ecx, xmm4
shr edx, 0xf
imul eax, edx, 0xfff1
sub edi, eax
mov eax, ecx
mov edx, 0x80078071
mul edx
shr edx, 0xf
imul eax, edx, 0xfff1
sub ecx, eax
mov eax, edi
mov edx, dword [ebp - 0x14]
sub edx, ebx
jne 0x4063c0
jmp 0x4064af
mov edi, eax
mov edx, dword [ebp - 0x10]
test edx, edx
je 0x4065f0
cmp edx, 0x10
jb 0x406556
mov ebx, esi
movzx eax, byte [esi]
add edi, eax
add ecx, edi
movzx eax, byte [esi + 1]
add eax, edi
add ecx, eax
mov esi, edx
movzx edx, byte [ebx + 2]
add edx, eax
add ecx, edx
movzx eax, byte [ebx + 3]
add eax, edx
add ecx, eax
movzx edx, byte [ebx + 4]
add edx, eax
add ecx, edx
movzx eax, byte [ebx + 5]
add eax, edx
add ecx, eax
movzx edx, byte [ebx + 6]
add edx, eax
add ecx, edx
movzx eax, byte [ebx + 7]
add eax, edx
add ecx, eax
movzx edx, byte [ebx + 8]
add edx, eax
add ecx, edx
movzx eax, byte [ebx + 9]
add eax, edx
add ecx, eax
movzx edx, byte [ebx + 0xa]
add edx, eax
add ecx, edx
movzx eax, byte [ebx + 0xb]
add eax, edx
add ecx, eax
movzx edx, byte [ebx + 0xc]
add edx, eax
add ecx, edx
movzx eax, byte [ebx + 0xd]
add eax, edx
add ecx, eax
movzx edx, byte [ebx + 0xe]
add edx, eax
add ecx, edx
movzx edi, byte [ebx + 0xf]
add edi, edx
mov edx, esi
add ecx, edi
add edx, 0xfffffff0
je 0x4065cd
add ebx, 0x10
jmp 0x406558
mov ebx, esi
lea eax, [edx - 1]
mov esi, edx
and esi, 3
mov dword [ebp - 0x10], edx
je 0x40658b
mov dword [ebp - 0x14], eax
xor edx, edx
nop word [eax + eax]
mov eax, ebx
movzx ebx, byte [ebx + edx]
add edi, ebx
mov ebx, eax
add ecx, edi
add edx, 1
cmp esi, edx
jne 0x406570
sub dword [ebp - 0x10], edx
add ebx, edx
mov eax, dword [ebp - 0x14]
cmp eax, 3
mov edx, dword [ebp - 0x10]
jb 0x4065cd
xor eax, eax
mov dword [ebp - 0x10], edx
nop dword [eax + eax]
movzx edx, byte [ebx + eax]
add edx, edi
add ecx, edx
movzx esi, byte [ebx + eax + 1]
add esi, edx
add ecx, esi
movzx edx, byte [ebx + eax + 2]
add edx, esi
add ecx, edx
movzx edi, byte [ebx + eax + 3]
add edi, edx
mov edx, dword [ebp - 0x10]
add ecx, edi
add eax, 4
cmp edx, eax
jne 0x4065a0
lea eax, [edi - 0xfff1]
cmp edi, 0xfff0
cmova edi, eax
mov edx, 0x80078071
mov eax, ecx
mul edx
shr edx, 0xf
imul eax, edx, 0xfff1
sub ecx, eax
shl ecx, 0x10
or ecx, edi
mov eax, ecx
add esp, 8
pop esi
pop edi
pop ebx
pop ebp
ret