Files
kolmck/Addons/GIF_MMX.inc

316 lines
5.9 KiB
PHP
Raw Normal View History

asm
pxor mm0, mm0
pxor mm1, mm1
xor eax, eax
inc eax
movd mm1, eax
movd mm2, eax
psllq mm2, 32
mov edx, [UnpackedSize]
movd mm3, edx
psllq mm3, 32
mov edx, [PackedSize]
pxor mm4, mm4
movd mm4, edx
por mm3, mm4 // mm3 hi dword = UnpackedSize, mm3 lo dword = PackedSize
pxor mm4, mm4 // mm4 = Data
mov eax, [CodeMask]
movd mm5, eax
mov eax, [OldCode]
movd mm6, eax
//
push ebx
push esi
push edi
mov esi, [SourcePtr]
mov edi, [Target]
{$IFDEF GIF_SAFE}
xor ebx, ebx
{$ELSE}
mov ebx, [StackPointer]
{$ENDIF}
mov ch, byte ptr [Bits]
mov cl, byte ptr [CodeSize]
@@loop:
{$IFDEF GIF_SAFE}
cmp [Bad], 0
jnz @@exit
{$ENDIF}
movq mm7, mm3 // check if (PackedSize > 0) and (UnpackedSize > 0) then
pcmpgtd mm7, mm0
packsswb mm7, mm7
movd eax, mm7
inc eax
jnz @@exit // end of loop if not (one of operands = 0)
{$IFDEF GIF_LOG}
pushad
movq mm7, mm3
movd edx, mm7
psrlq mm7, 32
movd eax, mm7
movd ecx, mm4
call doGifLog
popad
{$ENDIF}
movzx eax, byte ptr [esi]
xchg cl, ch
shl eax, cl
xchg cl, ch
//add [Data], eax
movd mm7, eax
paddd mm4, mm7
add ch, 8
@@while:
{$IFDEF GIF_SAFE}
cmp [Bad], 0
jnz @@exit
{$ENDIF}
cmp ch, cl
jb @@e_while
//mov eax, [Data]
movd eax, mm4
//and eax, [CodeMask]
movd edx, mm5
and eax, edx
//shr [Data], cl
movzx edx, cl
movd mm7, edx
psrld mm4, mm7
sub ch, cl
cmp eax, [EOICode]
jz @@e_while
@@1:
cmp eax, [ClearCode]
jnz @@2
mov cl, [initial_code_size]
inc cl
xor eax, eax
inc eax
shl eax, cl
dec eax
//mov [CodeMask], eax
movd mm5, eax
mov eax, [ClearCode]
add eax, 2
mov [FreeCode], eax
//mov [OldCode], NoLZWCode
mov edx, NoLZWCode
movd mm6, edx
jmp @@while
@@2:
cmp eax, [FreeCode]
ja @@e_while
@@3:
//cmp [OldCode], NoLZWCode
movd edx, mm6
cmp edx, NoLZWCode
jne @@4
//mov [OldCode], eax
movd mm6, eax
{$IFDEF GIF_SAFE}
cmp eax, GIFBufSize-1
jle @@suffix_good1
mov [Bad], 1
and eax, GIFBufSize-1
@@suffix_good1:
{$ENDIF}
mov al, byte ptr [suffix+eax]
mov [FirstChar], al
{$IFDEF GIF_LOG}
pushad
call doGifLog2
popad
{$ENDIF}
stosb
//dec [UnpackedSize]
psubd mm3, mm2
jmp @@while
@@4:
//mov [InCode], eax
movd mm7, eax
cmp eax, [FreeCode]
jne @@5
mov al, [FirstChar]
{$IFDEF GIF_SAFE}
cmp ebx, GIFBufSize
jae @@stk_bad1
mov byte ptr [Stack+ebx], al
inc ebx
jmp @@stk_good1
@@stk_bad1:
mov [Bad], 1
@@stk_good1:
{$ELSE}
mov [ebx], al
inc ebx
{$ENDIF}
//mov eax, [OldCode]
movd eax, mm6
@@5:
cmp eax, [ClearCode]
jbe @@6
{$IFDEF GIF_SAFE}
cmp eax, GIFBufSize-1
jle @@suffix_good2
and eax, GIFBufSize-1
mov [Bad], 1
@@suffix_good2:
{$ENDIF}
mov dl, byte ptr [Suffix+eax]
{$IFDEF GIF_SAFE}
cmp ebx, GIFBufSize
jb @@stk_good2
mov [Bad], 1
jmp @@exit
@@stk_good2:
mov byte ptr [Stack+ebx], dl
inc ebx
@@stk_bad2:
cmp eax, GIFBufSize-1
jle @@Prefix_good1
and eax, GIFBufSize-1
mov [Bad], 1
@@Prefix_good1:
{$ELSE}
mov byte ptr [ebx], dl
inc ebx
{$ENDIF}
mov eax, dword ptr [Prefix+eax*4]
jmp @@5
@@6:
{$IFDEF GIF_SAFE}
cmp eax, GIFBufSize-1
jle @@suffix_good3
and eax, GIFBufSize-1
mov [Bad], 1
@@suffix_good3:
{$ENDIF}
mov dl, byte ptr [Suffix+eax]
mov [FirstChar], dl
{$IFDEF GIF_SAFE}
cmp ebx, GIFBufSize
jae @@stk_bad3
mov byte ptr [Stack+ebx], dl
inc ebx
jmp @@stk_good3
@@stk_bad3:
mov [Bad], 1
@@stk_good3:
{$ELSE}
mov byte ptr [ebx], dl
inc ebx
{$ENDIF}
mov eax, [FreeCode]
{$IFDEF GIF_SAFE}
cmp eax, GIFBufSize-1
jle @@suffix_good4
and eax, GIFBufSize-1
mov [Bad], 1
@@suffix_good4:
{$ENDIF}
mov byte ptr [Suffix+eax], dl
//mov edx, [OldCode]
movd edx, mm6
{$IFDEF GIF_SAFE}
cmp edx, GIFBufSize-1
jle @@Prefix_good2
and edx, GIFBufSize-1
mov [Bad], 1
@@Prefix_good2:
{$ENDIF}
mov dword ptr [Prefix+eax*4], edx
//cmp eax, [CodeMask]
movd edx, mm5
cmp eax, edx
jnz @@7
cmp cl, 12
jae @@7
inc cl
xor eax, eax
inc eax
shl eax, cl
dec eax
//mov [CodeMask], eax
movd mm5, eax
@@7:
cmp [FreeCode], GIFBufSize-1
jae @@8
inc [FreeCode]
@@8:
//mov eax, [InCode]
movd eax, mm7
//mov [OldCode], eax
movd mm6, eax
@@9:
{$IFDEF GIF_SAFE}
test ebx, ebx
jz @@stk_bad4
dec ebx
mov al, byte ptr [Stack+ebx]
jmp @@stk_good4
@@stk_bad4:
mov [Bad], 1
@@stk_good4:
{$ELSE}
dec ebx
mov al, byte ptr [ebx]
{$ENDIF}
{$IFDEF GIF_LOG}
pushad
call doGifLog2
popad
{$ENDIF}
stosb
//dec [UnpackedSize]
psubd mm3, mm2
{$IFDEF GIF_SAFE}
test ebx, ebx
{$ELSE}
cmp ebx, [StackPointer]
{$ENDIF}
jne @@9
jmp @@while
@@e_while:
inc esi
//dec [PackedSize]
psubd mm3, mm1
jmp @@loop
@@exit:
pop edi
pop esi
pop ebx
emms
end