Microsoft-3D-Movie-Maker/kauai/SRC/KCD2_386.H

3278 lines
42 KiB
C++
Raw Permalink Normal View History

2022-05-04 01:31:19 +02:00
/* Copyright (c) Microsoft Corporation.
Licensed under the MIT License. */
/* Copyright (c) Microsoft Corporation.
Licensed under the MIT License. */
// Setup
long cbTot;
byte *pbLimDst = (byte *)pvDst + cbDst;
byte *pbLimSrc = (byte *)pvSrc + cbSrc - kcbTailKcd2;
__asm
{
mov edi,pvDst
mov ebx,pvSrc
inc ebx
mov eax,[ebx]
add ebx,4
jmp LBlock0
LLitDword7:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
mov eax,ecx
shr ecx,2
and eax,3
rep movsd
mov ecx,eax
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
jmp LBlock0
L6BitOffDword0:
mov esi,eax
inc ecx
shr esi,2
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
cmp esi,4
jb LCopyByte0
jmp LCopyDword0
L9BitOffDword4:
mov esi,eax
inc ecx
shr esi,7
and esi,511
add esi,65
mov eax,[ebx-2]
add ebx,2
jmp LCopyDword0
L12BitOffDword0:
mov esi,eax
inc ecx
shr esi,4
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyDword0
L20BitOffDword0:
mov esi,eax
add ecx,2
shr esi,4
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyDword0
// Copy Dword 0
LCopyDword0:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
mov edx,ecx
shr ecx,2
and edx,3
rep movsd
mov ecx,edx
rep movsb
jmp LBlock0
LLitSingle7:
#ifdef SAFETY
cmp edi,pbLimDst
jae LFail
#endif //SAFETY
mov [edi],ah
inc edi
mov eax,[ebx-2]
add ebx,2
jmp LBlock0
LLitByte7:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
jmp LBlock0
L6BitOffByte0:
mov esi,eax
inc ecx
shr esi,2
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
jmp LCopyByte0
L9BitOffByte4:
mov esi,eax
inc ecx
shr esi,7
and esi,511
add esi,65
mov eax,[ebx-2]
add ebx,2
jmp LCopyByte0
L12BitOffByte0:
mov esi,eax
inc ecx
shr esi,4
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyByte0
L20BitOffByte0:
mov esi,eax
add ecx,2
shr esi,4
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyByte0
// Copy Byte 0
LCopyByte0:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
rep movsb
// Block 0
LBlock0:
test al,1
jz LLen0_0
test al,2
jz LLen0_1
test al,4
jz LLen0_2
test al,8
jz LLen0_3
test al,16
jz LLen0_4
test al,32
jz LLen0_5
test al,64
jz LLen0_6
test al,128
jz LLen0_7
test ah,1
jz LLen0_8
test ah,2
jz LLen0_9
test ah,4
jz LLen0_10
test ah,8
jz LLen0_11
jmp LDone
LLen0_0:
mov ecx,1
test al,2
jz LLitSingle1
test al,4
jz L6BitOffByte1
test al,8
jz L9BitOffByte1
test al,16
jz L12BitOffByte1
jmp L20BitOffByte1
LLen0_1:
mov ecx,eax
shr ecx,2
and ecx,1
or ecx,2
test al,8
jz LLitByte3
test al,16
jz L6BitOffByte3
test al,32
jz L9BitOffByte3
test al,64
jz L12BitOffByte3
jmp L20BitOffByte3
LLen0_2:
mov ecx,eax
shr ecx,3
and ecx,3
or ecx,4
test al,32
jz LLitByte5
test al,64
jz L6BitOffByte5
test al,128
jz L9BitOffByte5
test ah,1
jz L12BitOffByte5
jmp L20BitOffByte5
LLen0_3:
mov ecx,eax
shr ecx,4
and ecx,7
or ecx,8
test al,128
jz LLitDword7
test ah,1
jz L6BitOffDword7
test ah,2
jz L9BitOffDword7
test ah,4
jz L12BitOffDword7
jmp L20BitOffDword7
LLen0_4:
mov ecx,eax
shr ecx,5
and ecx,15
or ecx,16
mov eax,[ebx-3]
inc ebx
test al,2
jz LLitDword1
test al,4
jz L6BitOffDword1
test al,8
jz L9BitOffDword1
test al,16
jz L12BitOffDword1
jmp L20BitOffDword1
LLen0_5:
mov ecx,eax
shr ecx,6
and ecx,31
or ecx,32
mov eax,[ebx-3]
inc ebx
test al,8
jz LLitDword3
test al,16
jz L6BitOffDword3
test al,32
jz L9BitOffDword3
test al,64
jz L12BitOffDword3
jmp L20BitOffDword3
LLen0_6:
mov ecx,eax
shr ecx,7
and ecx,63
or ecx,64
mov eax,[ebx-3]
inc ebx
test al,32
jz LLitDword5
test al,64
jz L6BitOffDword5
test al,128
jz L9BitOffDword5
test ah,1
jz L12BitOffDword5
jmp L20BitOffDword5
LLen0_7:
mov ecx,eax
shr ecx,8
and ecx,127
or ecx,128
mov eax,[ebx-3]
inc ebx
test al,128
jz LLitDword7
test ah,1
jz L6BitOffDword7
test ah,2
jz L9BitOffDword7
test ah,4
jz L12BitOffDword7
jmp L20BitOffDword7
LLen0_8:
mov ecx,eax
shr ecx,9
and ecx,255
or ecx,256
mov eax,[ebx-2]
add ebx,2
test al,2
jz LLitDword1
test al,4
jz L6BitOffDword1
test al,8
jz L9BitOffDword1
test al,16
jz L12BitOffDword1
jmp L20BitOffDword1
LLen0_9:
mov ecx,eax
shr ecx,10
and ecx,511
or ecx,512
mov eax,[ebx-2]
add ebx,2
test al,8
jz LLitDword3
test al,16
jz L6BitOffDword3
test al,32
jz L9BitOffDword3
test al,64
jz L12BitOffDword3
jmp L20BitOffDword3
LLen0_10:
mov ecx,eax
shr ecx,11
and ecx,1023
or ecx,1024
mov eax,[ebx-2]
add ebx,2
test al,32
jz LLitDword5
test al,64
jz L6BitOffDword5
test al,128
jz L9BitOffDword5
test ah,1
jz L12BitOffDword5
jmp L20BitOffDword5
LLen0_11:
mov ecx,eax
shr ecx,12
and ecx,2047
or ecx,2048
mov eax,[ebx-2]
add ebx,2
test al,128
jz LLitDword7
test ah,1
jz L6BitOffDword7
test ah,2
jz L9BitOffDword7
test ah,4
jz L12BitOffDword7
jmp L20BitOffDword7
LLitDword0:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
dec ecx
mov edx,eax
shr edx,1
and edx,127
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
mov eax,ecx
shr ecx,2
and eax,3
rep movsd
mov ecx,eax
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
mov esi,eax
shl esi,7
or edx,esi
mov [edi],dl
inc edi
jmp LBlock1
L6BitOffDword1:
mov esi,eax
inc ecx
shr esi,3
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
cmp esi,4
jb LCopyByte1
jmp LCopyDword1
L9BitOffDword5:
mov esi,eax
inc ecx
shr esi,8
and esi,511
add esi,65
mov eax,[ebx-2]
add ebx,2
jmp LCopyDword1
L12BitOffDword1:
mov esi,eax
inc ecx
shr esi,5
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyDword1
L20BitOffDword1:
mov esi,eax
add ecx,2
shr esi,5
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyDword1
// Copy Dword 1
LCopyDword1:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
mov edx,ecx
shr ecx,2
and edx,3
rep movsd
mov ecx,edx
rep movsb
jmp LBlock1
LLitSingle0:
#ifdef SAFETY
cmp edi,pbLimDst
jae LFail
#endif //SAFETY
mov edx,eax
shr edx,1
mov [edi],dl
inc edi
mov eax,[ebx-3]
inc ebx
jmp LBlock1
LLitByte0:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
dec ecx
mov edx,eax
shr edx,1
and edx,127
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
mov esi,eax
shl esi,7
or edx,esi
mov [edi],dl
inc edi
jmp LBlock1
L6BitOffByte1:
mov esi,eax
inc ecx
shr esi,3
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
jmp LCopyByte1
L9BitOffByte5:
mov esi,eax
inc ecx
shr esi,8
and esi,511
add esi,65
mov eax,[ebx-2]
add ebx,2
jmp LCopyByte1
L12BitOffByte1:
mov esi,eax
inc ecx
shr esi,5
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyByte1
L20BitOffByte1:
mov esi,eax
add ecx,2
shr esi,5
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyByte1
// Copy Byte 1
LCopyByte1:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
rep movsb
// Block 1
LBlock1:
test al,2
jz LLen1_0
test al,4
jz LLen1_1
test al,8
jz LLen1_2
test al,16
jz LLen1_3
test al,32
jz LLen1_4
test al,64
jz LLen1_5
test al,128
jz LLen1_6
test ah,1
jz LLen1_7
test ah,2
jz LLen1_8
test ah,4
jz LLen1_9
test ah,8
jz LLen1_10
test ah,16
jz LLen1_11
jmp LDone
LLen1_0:
mov ecx,1
test al,4
jz LLitSingle2
test al,8
jz L6BitOffByte2
test al,16
jz L9BitOffByte2
test al,32
jz L12BitOffByte2
jmp L20BitOffByte2
LLen1_1:
mov ecx,eax
shr ecx,3
and ecx,1
or ecx,2
test al,16
jz LLitByte4
test al,32
jz L6BitOffByte4
test al,64
jz L9BitOffByte4
test al,128
jz L12BitOffByte4
jmp L20BitOffByte4
LLen1_2:
mov ecx,eax
shr ecx,4
and ecx,3
or ecx,4
test al,64
jz LLitByte6
test al,128
jz L6BitOffByte6
test ah,1
jz L9BitOffByte6
test ah,2
jz L12BitOffByte6
jmp L20BitOffByte6
LLen1_3:
mov ecx,eax
shr ecx,5
and ecx,7
or ecx,8
mov eax,[ebx-3]
inc ebx
test al,1
jz LLitDword0
test al,2
jz L6BitOffDword0
test al,4
jz L9BitOffDword0
test al,8
jz L12BitOffDword0
jmp L20BitOffDword0
LLen1_4:
mov ecx,eax
shr ecx,6
and ecx,15
or ecx,16
mov eax,[ebx-3]
inc ebx
test al,4
jz LLitDword2
test al,8
jz L6BitOffDword2
test al,16
jz L9BitOffDword2
test al,32
jz L12BitOffDword2
jmp L20BitOffDword2
LLen1_5:
mov ecx,eax
shr ecx,7
and ecx,31
or ecx,32
mov eax,[ebx-3]
inc ebx
test al,16
jz LLitDword4
test al,32
jz L6BitOffDword4
test al,64
jz L9BitOffDword4
test al,128
jz L12BitOffDword4
jmp L20BitOffDword4
LLen1_6:
mov ecx,eax
shr ecx,8
and ecx,63
or ecx,64
mov eax,[ebx-3]
inc ebx
test al,64
jz LLitDword6
test al,128
jz L6BitOffDword6
test ah,1
jz L9BitOffDword6
test ah,2
jz L12BitOffDword6
jmp L20BitOffDword6
LLen1_7:
mov ecx,eax
shr ecx,9
and ecx,127
or ecx,128
mov eax,[ebx-2]
add ebx,2
test al,1
jz LLitDword0
test al,2
jz L6BitOffDword0
test al,4
jz L9BitOffDword0
test al,8
jz L12BitOffDword0
jmp L20BitOffDword0
LLen1_8:
mov ecx,eax
shr ecx,10
and ecx,255
or ecx,256
mov eax,[ebx-2]
add ebx,2
test al,4
jz LLitDword2
test al,8
jz L6BitOffDword2
test al,16
jz L9BitOffDword2
test al,32
jz L12BitOffDword2
jmp L20BitOffDword2
LLen1_9:
mov ecx,eax
shr ecx,11
and ecx,511
or ecx,512
mov eax,[ebx-2]
add ebx,2
test al,16
jz LLitDword4
test al,32
jz L6BitOffDword4
test al,64
jz L9BitOffDword4
test al,128
jz L12BitOffDword4
jmp L20BitOffDword4
LLen1_10:
mov ecx,eax
shr ecx,12
and ecx,1023
or ecx,1024
mov eax,[ebx-2]
add ebx,2
test al,64
jz LLitDword6
test al,128
jz L6BitOffDword6
test ah,1
jz L9BitOffDword6
test ah,2
jz L12BitOffDword6
jmp L20BitOffDword6
LLen1_11:
mov ecx,eax
shr ecx,13
and ecx,2047
or ecx,2048
mov eax,[ebx-1]
add ebx,3
test al,1
jz LLitDword0
test al,2
jz L6BitOffDword0
test al,4
jz L9BitOffDword0
test al,8
jz L12BitOffDword0
jmp L20BitOffDword0
LLitDword1:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
dec ecx
mov edx,eax
shr edx,2
and edx,63
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
mov eax,ecx
shr ecx,2
and eax,3
rep movsd
mov ecx,eax
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
mov esi,eax
shl esi,6
or edx,esi
mov [edi],dl
inc edi
jmp LBlock2
L6BitOffDword2:
mov esi,eax
inc ecx
shr esi,4
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
cmp esi,4
jb LCopyByte2
jmp LCopyDword2
L9BitOffDword6:
mov esi,eax
inc ecx
shr esi,9
and esi,511
add esi,65
mov eax,[ebx-2]
add ebx,2
jmp LCopyDword2
L12BitOffDword2:
mov esi,eax
inc ecx
shr esi,6
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyDword2
L20BitOffDword2:
mov esi,eax
add ecx,2
shr esi,6
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyDword2
// Copy Dword 2
LCopyDword2:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
mov edx,ecx
shr ecx,2
and edx,3
rep movsd
mov ecx,edx
rep movsb
jmp LBlock2
LLitSingle1:
#ifdef SAFETY
cmp edi,pbLimDst
jae LFail
#endif //SAFETY
mov edx,eax
shr edx,2
mov [edi],dl
inc edi
mov eax,[ebx-3]
inc ebx
jmp LBlock2
LLitByte1:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
dec ecx
mov edx,eax
shr edx,2
and edx,63
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
mov esi,eax
shl esi,6
or edx,esi
mov [edi],dl
inc edi
jmp LBlock2
L6BitOffByte2:
mov esi,eax
inc ecx
shr esi,4
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
jmp LCopyByte2
L9BitOffByte6:
mov esi,eax
inc ecx
shr esi,9
and esi,511
add esi,65
mov eax,[ebx-2]
add ebx,2
jmp LCopyByte2
L12BitOffByte2:
mov esi,eax
inc ecx
shr esi,6
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyByte2
L20BitOffByte2:
mov esi,eax
add ecx,2
shr esi,6
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyByte2
// Copy Byte 2
LCopyByte2:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
rep movsb
// Block 2
LBlock2:
test al,4
jz LLen2_0
test al,8
jz LLen2_1
test al,16
jz LLen2_2
test al,32
jz LLen2_3
test al,64
jz LLen2_4
test al,128
jz LLen2_5
test ah,1
jz LLen2_6
test ah,2
jz LLen2_7
test ah,4
jz LLen2_8
test ah,8
jz LLen2_9
test ah,16
jz LLen2_10
test ah,32
jz LLen2_11
jmp LDone
LLen2_0:
mov ecx,1
test al,8
jz LLitSingle3
test al,16
jz L6BitOffByte3
test al,32
jz L9BitOffByte3
test al,64
jz L12BitOffByte3
jmp L20BitOffByte3
LLen2_1:
mov ecx,eax
shr ecx,4
and ecx,1
or ecx,2
test al,32
jz LLitByte5
test al,64
jz L6BitOffByte5
test al,128
jz L9BitOffByte5
test ah,1
jz L12BitOffByte5
jmp L20BitOffByte5
LLen2_2:
mov ecx,eax
shr ecx,5
and ecx,3
or ecx,4
test al,128
jz LLitByte7
test ah,1
jz L6BitOffByte7
test ah,2
jz L9BitOffByte7
test ah,4
jz L12BitOffByte7
jmp L20BitOffByte7
LLen2_3:
mov ecx,eax
shr ecx,6
and ecx,7
or ecx,8
mov eax,[ebx-3]
inc ebx
test al,2
jz LLitDword1
test al,4
jz L6BitOffDword1
test al,8
jz L9BitOffDword1
test al,16
jz L12BitOffDword1
jmp L20BitOffDword1
LLen2_4:
mov ecx,eax
shr ecx,7
and ecx,15
or ecx,16
mov eax,[ebx-3]
inc ebx
test al,8
jz LLitDword3
test al,16
jz L6BitOffDword3
test al,32
jz L9BitOffDword3
test al,64
jz L12BitOffDword3
jmp L20BitOffDword3
LLen2_5:
mov ecx,eax
shr ecx,8
and ecx,31
or ecx,32
mov eax,[ebx-3]
inc ebx
test al,32
jz LLitDword5
test al,64
jz L6BitOffDword5
test al,128
jz L9BitOffDword5
test ah,1
jz L12BitOffDword5
jmp L20BitOffDword5
LLen2_6:
mov ecx,eax
shr ecx,9
and ecx,63
or ecx,64
mov eax,[ebx-3]
inc ebx
test al,128
jz LLitDword7
test ah,1
jz L6BitOffDword7
test ah,2
jz L9BitOffDword7
test ah,4
jz L12BitOffDword7
jmp L20BitOffDword7
LLen2_7:
mov ecx,eax
shr ecx,10
and ecx,127
or ecx,128
mov eax,[ebx-2]
add ebx,2
test al,2
jz LLitDword1
test al,4
jz L6BitOffDword1
test al,8
jz L9BitOffDword1
test al,16
jz L12BitOffDword1
jmp L20BitOffDword1
LLen2_8:
mov ecx,eax
shr ecx,11
and ecx,255
or ecx,256
mov eax,[ebx-2]
add ebx,2
test al,8
jz LLitDword3
test al,16
jz L6BitOffDword3
test al,32
jz L9BitOffDword3
test al,64
jz L12BitOffDword3
jmp L20BitOffDword3
LLen2_9:
mov ecx,eax
shr ecx,12
and ecx,511
or ecx,512
mov eax,[ebx-2]
add ebx,2
test al,32
jz LLitDword5
test al,64
jz L6BitOffDword5
test al,128
jz L9BitOffDword5
test ah,1
jz L12BitOffDword5
jmp L20BitOffDword5
LLen2_10:
mov ecx,eax
shr ecx,13
and ecx,1023
or ecx,1024
mov eax,[ebx-2]
add ebx,2
test al,128
jz LLitDword7
test ah,1
jz L6BitOffDword7
test ah,2
jz L9BitOffDword7
test ah,4
jz L12BitOffDword7
jmp L20BitOffDword7
LLen2_11:
mov ecx,eax
shr ecx,14
and ecx,2047
or ecx,2048
mov eax,[ebx-1]
add ebx,3
test al,2
jz LLitDword1
test al,4
jz L6BitOffDword1
test al,8
jz L9BitOffDword1
test al,16
jz L12BitOffDword1
jmp L20BitOffDword1
LLitDword2:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
dec ecx
mov edx,eax
shr edx,3
and edx,31
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
mov eax,ecx
shr ecx,2
and eax,3
rep movsd
mov ecx,eax
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
mov esi,eax
shl esi,5
or edx,esi
mov [edi],dl
inc edi
jmp LBlock3
L6BitOffDword3:
mov esi,eax
inc ecx
shr esi,5
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
cmp esi,4
jb LCopyByte3
jmp LCopyDword3
L9BitOffDword7:
mov esi,eax
inc ecx
shr esi,10
and esi,511
add esi,65
mov eax,[ebx-2]
add ebx,2
jmp LCopyDword3
L12BitOffDword3:
mov esi,eax
inc ecx
shr esi,7
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyDword3
L20BitOffDword3:
mov esi,eax
add ecx,2
shr esi,7
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyDword3
// Copy Dword 3
LCopyDword3:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
mov edx,ecx
shr ecx,2
and edx,3
rep movsd
mov ecx,edx
rep movsb
jmp LBlock3
LLitSingle2:
#ifdef SAFETY
cmp edi,pbLimDst
jae LFail
#endif //SAFETY
mov edx,eax
shr edx,3
mov [edi],dl
inc edi
mov eax,[ebx-3]
inc ebx
jmp LBlock3
LLitByte2:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
dec ecx
mov edx,eax
shr edx,3
and edx,31
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
mov esi,eax
shl esi,5
or edx,esi
mov [edi],dl
inc edi
jmp LBlock3
L6BitOffByte3:
mov esi,eax
inc ecx
shr esi,5
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
jmp LCopyByte3
L9BitOffByte7:
mov esi,eax
inc ecx
shr esi,10
and esi,511
add esi,65
mov eax,[ebx-2]
add ebx,2
jmp LCopyByte3
L12BitOffByte3:
mov esi,eax
inc ecx
shr esi,7
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyByte3
L20BitOffByte3:
mov esi,eax
add ecx,2
shr esi,7
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyByte3
// Copy Byte 3
LCopyByte3:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
rep movsb
// Block 3
LBlock3:
test al,8
jz LLen3_0
test al,16
jz LLen3_1
test al,32
jz LLen3_2
test al,64
jz LLen3_3
test al,128
jz LLen3_4
test ah,1
jz LLen3_5
test ah,2
jz LLen3_6
test ah,4
jz LLen3_7
test ah,8
jz LLen3_8
test ah,16
jz LLen3_9
test ah,32
jz LLen3_10
test ah,64
jz LLen3_11
jmp LDone
LLen3_0:
mov ecx,1
test al,16
jz LLitSingle4
test al,32
jz L6BitOffByte4
test al,64
jz L9BitOffByte4
test al,128
jz L12BitOffByte4
jmp L20BitOffByte4
LLen3_1:
mov ecx,eax
shr ecx,5
and ecx,1
or ecx,2
test al,64
jz LLitByte6
test al,128
jz L6BitOffByte6
test ah,1
jz L9BitOffByte6
test ah,2
jz L12BitOffByte6
jmp L20BitOffByte6
LLen3_2:
mov ecx,eax
shr ecx,6
and ecx,3
or ecx,4
mov eax,[ebx-3]
inc ebx
test al,1
jz LLitByte0
test al,2
jz L6BitOffByte0
test al,4
jz L9BitOffByte0
test al,8
jz L12BitOffByte0
jmp L20BitOffByte0
LLen3_3:
mov ecx,eax
shr ecx,7
and ecx,7
or ecx,8
mov eax,[ebx-3]
inc ebx
test al,4
jz LLitDword2
test al,8
jz L6BitOffDword2
test al,16
jz L9BitOffDword2
test al,32
jz L12BitOffDword2
jmp L20BitOffDword2
LLen3_4:
mov ecx,eax
shr ecx,8
and ecx,15
or ecx,16
mov eax,[ebx-3]
inc ebx
test al,16
jz LLitDword4
test al,32
jz L6BitOffDword4
test al,64
jz L9BitOffDword4
test al,128
jz L12BitOffDword4
jmp L20BitOffDword4
LLen3_5:
mov ecx,eax
shr ecx,9
and ecx,31
or ecx,32
mov eax,[ebx-3]
inc ebx
test al,64
jz LLitDword6
test al,128
jz L6BitOffDword6
test ah,1
jz L9BitOffDword6
test ah,2
jz L12BitOffDword6
jmp L20BitOffDword6
LLen3_6:
mov ecx,eax
shr ecx,10
and ecx,63
or ecx,64
mov eax,[ebx-2]
add ebx,2
test al,1
jz LLitDword0
test al,2
jz L6BitOffDword0
test al,4
jz L9BitOffDword0
test al,8
jz L12BitOffDword0
jmp L20BitOffDword0
LLen3_7:
mov ecx,eax
shr ecx,11
and ecx,127
or ecx,128
mov eax,[ebx-2]
add ebx,2
test al,4
jz LLitDword2
test al,8
jz L6BitOffDword2
test al,16
jz L9BitOffDword2
test al,32
jz L12BitOffDword2
jmp L20BitOffDword2
LLen3_8:
mov ecx,eax
shr ecx,12
and ecx,255
or ecx,256
mov eax,[ebx-2]
add ebx,2
test al,16
jz LLitDword4
test al,32
jz L6BitOffDword4
test al,64
jz L9BitOffDword4
test al,128
jz L12BitOffDword4
jmp L20BitOffDword4
LLen3_9:
mov ecx,eax
shr ecx,13
and ecx,511
or ecx,512
mov eax,[ebx-2]
add ebx,2
test al,64
jz LLitDword6
test al,128
jz L6BitOffDword6
test ah,1
jz L9BitOffDword6
test ah,2
jz L12BitOffDword6
jmp L20BitOffDword6
LLen3_10:
mov ecx,eax
shr ecx,14
and ecx,1023
or ecx,1024
mov eax,[ebx-1]
add ebx,3
test al,1
jz LLitDword0
test al,2
jz L6BitOffDword0
test al,4
jz L9BitOffDword0
test al,8
jz L12BitOffDword0
jmp L20BitOffDword0
LLen3_11:
mov ecx,eax
shr ecx,15
and ecx,2047
or ecx,2048
mov eax,[ebx-1]
add ebx,3
test al,4
jz LLitDword2
test al,8
jz L6BitOffDword2
test al,16
jz L9BitOffDword2
test al,32
jz L12BitOffDword2
jmp L20BitOffDword2
LLitDword3:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
dec ecx
mov edx,eax
shr edx,4
and edx,15
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
mov eax,ecx
shr ecx,2
and eax,3
rep movsd
mov ecx,eax
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
mov esi,eax
shl esi,4
or edx,esi
mov [edi],dl
inc edi
jmp LBlock4
L6BitOffDword4:
mov esi,eax
inc ecx
shr esi,6
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
cmp esi,4
jb LCopyByte4
jmp LCopyDword4
L9BitOffDword0:
mov esi,eax
inc ecx
shr esi,3
and esi,511
add esi,65
mov eax,[ebx-3]
inc ebx
jmp LCopyDword4
L12BitOffDword4:
mov esi,eax
inc ecx
shr esi,8
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyDword4
L20BitOffDword4:
mov esi,eax
add ecx,2
shr esi,8
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyDword4
// Copy Dword 4
LCopyDword4:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
mov edx,ecx
shr ecx,2
and edx,3
rep movsd
mov ecx,edx
rep movsb
jmp LBlock4
LLitSingle3:
#ifdef SAFETY
cmp edi,pbLimDst
jae LFail
#endif //SAFETY
mov edx,eax
shr edx,4
mov [edi],dl
inc edi
mov eax,[ebx-3]
inc ebx
jmp LBlock4
LLitByte3:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
dec ecx
mov edx,eax
shr edx,4
and edx,15
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
mov esi,eax
shl esi,4
or edx,esi
mov [edi],dl
inc edi
jmp LBlock4
L6BitOffByte4:
mov esi,eax
inc ecx
shr esi,6
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
jmp LCopyByte4
L9BitOffByte0:
mov esi,eax
inc ecx
shr esi,3
and esi,511
add esi,65
mov eax,[ebx-3]
inc ebx
jmp LCopyByte4
L12BitOffByte4:
mov esi,eax
inc ecx
shr esi,8
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyByte4
L20BitOffByte4:
mov esi,eax
add ecx,2
shr esi,8
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyByte4
// Copy Byte 4
LCopyByte4:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
rep movsb
// Block 4
LBlock4:
test al,16
jz LLen4_0
test al,32
jz LLen4_1
test al,64
jz LLen4_2
test al,128
jz LLen4_3
test ah,1
jz LLen4_4
test ah,2
jz LLen4_5
test ah,4
jz LLen4_6
test ah,8
jz LLen4_7
test ah,16
jz LLen4_8
test ah,32
jz LLen4_9
test ah,64
jz LLen4_10
test ah,128
jz LLen4_11
jmp LDone
LLen4_0:
mov ecx,1
test al,32
jz LLitSingle5
test al,64
jz L6BitOffByte5
test al,128
jz L9BitOffByte5
test ah,1
jz L12BitOffByte5
jmp L20BitOffByte5
LLen4_1:
mov ecx,eax
shr ecx,6
and ecx,1
or ecx,2
test al,128
jz LLitByte7
test ah,1
jz L6BitOffByte7
test ah,2
jz L9BitOffByte7
test ah,4
jz L12BitOffByte7
jmp L20BitOffByte7
LLen4_2:
mov ecx,eax
shr ecx,7
and ecx,3
or ecx,4
mov eax,[ebx-3]
inc ebx
test al,2
jz LLitByte1
test al,4
jz L6BitOffByte1
test al,8
jz L9BitOffByte1
test al,16
jz L12BitOffByte1
jmp L20BitOffByte1
LLen4_3:
mov ecx,eax
shr ecx,8
and ecx,7
or ecx,8
mov eax,[ebx-3]
inc ebx
test al,8
jz LLitDword3
test al,16
jz L6BitOffDword3
test al,32
jz L9BitOffDword3
test al,64
jz L12BitOffDword3
jmp L20BitOffDword3
LLen4_4:
mov ecx,eax
shr ecx,9
and ecx,15
or ecx,16
mov eax,[ebx-3]
inc ebx
test al,32
jz LLitDword5
test al,64
jz L6BitOffDword5
test al,128
jz L9BitOffDword5
test ah,1
jz L12BitOffDword5
jmp L20BitOffDword5
LLen4_5:
mov ecx,eax
shr ecx,10
and ecx,31
or ecx,32
mov eax,[ebx-3]
inc ebx
test al,128
jz LLitDword7
test ah,1
jz L6BitOffDword7
test ah,2
jz L9BitOffDword7
test ah,4
jz L12BitOffDword7
jmp L20BitOffDword7
LLen4_6:
mov ecx,eax
shr ecx,11
and ecx,63
or ecx,64
mov eax,[ebx-2]
add ebx,2
test al,2
jz LLitDword1
test al,4
jz L6BitOffDword1
test al,8
jz L9BitOffDword1
test al,16
jz L12BitOffDword1
jmp L20BitOffDword1
LLen4_7:
mov ecx,eax
shr ecx,12
and ecx,127
or ecx,128
mov eax,[ebx-2]
add ebx,2
test al,8
jz LLitDword3
test al,16
jz L6BitOffDword3
test al,32
jz L9BitOffDword3
test al,64
jz L12BitOffDword3
jmp L20BitOffDword3
LLen4_8:
mov ecx,eax
shr ecx,13
and ecx,255
or ecx,256
mov eax,[ebx-2]
add ebx,2
test al,32
jz LLitDword5
test al,64
jz L6BitOffDword5
test al,128
jz L9BitOffDword5
test ah,1
jz L12BitOffDword5
jmp L20BitOffDword5
LLen4_9:
mov ecx,eax
shr ecx,14
and ecx,511
or ecx,512
mov eax,[ebx-2]
add ebx,2
test al,128
jz LLitDword7
test ah,1
jz L6BitOffDword7
test ah,2
jz L9BitOffDword7
test ah,4
jz L12BitOffDword7
jmp L20BitOffDword7
LLen4_10:
mov ecx,eax
shr ecx,15
and ecx,1023
or ecx,1024
mov eax,[ebx-1]
add ebx,3
test al,2
jz LLitDword1
test al,4
jz L6BitOffDword1
test al,8
jz L9BitOffDword1
test al,16
jz L12BitOffDword1
jmp L20BitOffDword1
LLen4_11:
mov ecx,eax
shr ecx,16
and ecx,2047
or ecx,2048
mov eax,[ebx-1]
add ebx,3
test al,8
jz LLitDword3
test al,16
jz L6BitOffDword3
test al,32
jz L9BitOffDword3
test al,64
jz L12BitOffDword3
jmp L20BitOffDword3
LLitDword4:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
dec ecx
mov edx,eax
shr edx,5
and edx,7
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
mov eax,ecx
shr ecx,2
and eax,3
rep movsd
mov ecx,eax
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
mov esi,eax
shl esi,3
or edx,esi
mov [edi],dl
inc edi
jmp LBlock5
L6BitOffDword5:
mov esi,eax
inc ecx
shr esi,7
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
cmp esi,4
jb LCopyByte5
jmp LCopyDword5
L9BitOffDword1:
mov esi,eax
inc ecx
shr esi,4
and esi,511
add esi,65
mov eax,[ebx-3]
inc ebx
jmp LCopyDword5
L12BitOffDword5:
mov esi,eax
inc ecx
shr esi,9
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyDword5
L20BitOffDword5:
mov esi,eax
add ecx,2
shr esi,9
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyDword5
// Copy Dword 5
LCopyDword5:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
mov edx,ecx
shr ecx,2
and edx,3
rep movsd
mov ecx,edx
rep movsb
jmp LBlock5
LLitSingle4:
#ifdef SAFETY
cmp edi,pbLimDst
jae LFail
#endif //SAFETY
mov edx,eax
shr edx,5
mov [edi],dl
inc edi
mov eax,[ebx-3]
inc ebx
jmp LBlock5
LLitByte4:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
dec ecx
mov edx,eax
shr edx,5
and edx,7
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
mov esi,eax
shl esi,3
or edx,esi
mov [edi],dl
inc edi
jmp LBlock5
L6BitOffByte5:
mov esi,eax
inc ecx
shr esi,7
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
jmp LCopyByte5
L9BitOffByte1:
mov esi,eax
inc ecx
shr esi,4
and esi,511
add esi,65
mov eax,[ebx-3]
inc ebx
jmp LCopyByte5
L12BitOffByte5:
mov esi,eax
inc ecx
shr esi,9
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyByte5
L20BitOffByte5:
mov esi,eax
add ecx,2
shr esi,9
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyByte5
// Copy Byte 5
LCopyByte5:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
rep movsb
// Block 5
LBlock5:
test al,32
jz LLen5_0
test al,64
jz LLen5_1
test al,128
jz LLen5_2
test ah,1
jz LLen5_3
test ah,2
jz LLen5_4
test ah,4
jz LLen5_5
test ah,8
jz LLen5_6
test ah,16
jz LLen5_7
test ah,32
jz LLen5_8
test ah,64
jz LLen5_9
test ah,128
jz LLen5_10
test eax,65536
jz LLen5_11
jmp LDone
LLen5_0:
mov ecx,1
test al,64
jz LLitSingle6
test al,128
jz L6BitOffByte6
test ah,1
jz L9BitOffByte6
test ah,2
jz L12BitOffByte6
jmp L20BitOffByte6
LLen5_1:
mov ecx,eax
shr ecx,7
and ecx,1
or ecx,2
mov eax,[ebx-3]
inc ebx
test al,1
jz LLitByte0
test al,2
jz L6BitOffByte0
test al,4
jz L9BitOffByte0
test al,8
jz L12BitOffByte0
jmp L20BitOffByte0
LLen5_2:
mov ecx,eax
shr ecx,8
and ecx,3
or ecx,4
mov eax,[ebx-3]
inc ebx
test al,4
jz LLitByte2
test al,8
jz L6BitOffByte2
test al,16
jz L9BitOffByte2
test al,32
jz L12BitOffByte2
jmp L20BitOffByte2
LLen5_3:
mov ecx,eax
shr ecx,9
and ecx,7
or ecx,8
mov eax,[ebx-3]
inc ebx
test al,16
jz LLitDword4
test al,32
jz L6BitOffDword4
test al,64
jz L9BitOffDword4
test al,128
jz L12BitOffDword4
jmp L20BitOffDword4
LLen5_4:
mov ecx,eax
shr ecx,10
and ecx,15
or ecx,16
mov eax,[ebx-3]
inc ebx
test al,64
jz LLitDword6
test al,128
jz L6BitOffDword6
test ah,1
jz L9BitOffDword6
test ah,2
jz L12BitOffDword6
jmp L20BitOffDword6
LLen5_5:
mov ecx,eax
shr ecx,11
and ecx,31
or ecx,32
mov eax,[ebx-2]
add ebx,2
test al,1
jz LLitDword0
test al,2
jz L6BitOffDword0
test al,4
jz L9BitOffDword0
test al,8
jz L12BitOffDword0
jmp L20BitOffDword0
LLen5_6:
mov ecx,eax
shr ecx,12
and ecx,63
or ecx,64
mov eax,[ebx-2]
add ebx,2
test al,4
jz LLitDword2
test al,8
jz L6BitOffDword2
test al,16
jz L9BitOffDword2
test al,32
jz L12BitOffDword2
jmp L20BitOffDword2
LLen5_7:
mov ecx,eax
shr ecx,13
and ecx,127
or ecx,128
mov eax,[ebx-2]
add ebx,2
test al,16
jz LLitDword4
test al,32
jz L6BitOffDword4
test al,64
jz L9BitOffDword4
test al,128
jz L12BitOffDword4
jmp L20BitOffDword4
LLen5_8:
mov ecx,eax
shr ecx,14
and ecx,255
or ecx,256
mov eax,[ebx-2]
add ebx,2
test al,64
jz LLitDword6
test al,128
jz L6BitOffDword6
test ah,1
jz L9BitOffDword6
test ah,2
jz L12BitOffDword6
jmp L20BitOffDword6
LLen5_9:
mov ecx,eax
shr ecx,15
and ecx,511
or ecx,512
mov eax,[ebx-1]
add ebx,3
test al,1
jz LLitDword0
test al,2
jz L6BitOffDword0
test al,4
jz L9BitOffDword0
test al,8
jz L12BitOffDword0
jmp L20BitOffDword0
LLen5_10:
mov ecx,eax
shr ecx,16
and ecx,1023
or ecx,1024
mov eax,[ebx-1]
add ebx,3
test al,4
jz LLitDword2
test al,8
jz L6BitOffDword2
test al,16
jz L9BitOffDword2
test al,32
jz L12BitOffDword2
jmp L20BitOffDword2
LLen5_11:
mov ecx,eax
shr ecx,17
and ecx,2047
or ecx,2048
mov eax,[ebx-1]
add ebx,3
test al,16
jz LLitDword4
test al,32
jz L6BitOffDword4
test al,64
jz L9BitOffDword4
test al,128
jz L12BitOffDword4
jmp L20BitOffDword4
LLitDword5:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
dec ecx
mov edx,eax
shr edx,6
and edx,3
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
mov eax,ecx
shr ecx,2
and eax,3
rep movsd
mov ecx,eax
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
mov esi,eax
shl esi,2
or edx,esi
mov [edi],dl
inc edi
jmp LBlock6
L6BitOffDword6:
mov esi,eax
inc ecx
shr esi,8
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
cmp esi,4
jb LCopyByte6
jmp LCopyDword6
L9BitOffDword2:
mov esi,eax
inc ecx
shr esi,5
and esi,511
add esi,65
mov eax,[ebx-3]
inc ebx
jmp LCopyDword6
L12BitOffDword6:
mov esi,eax
inc ecx
shr esi,10
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyDword6
L20BitOffDword6:
mov esi,eax
add ecx,2
shr esi,10
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyDword6
// Copy Dword 6
LCopyDword6:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
mov edx,ecx
shr ecx,2
and edx,3
rep movsd
mov ecx,edx
rep movsb
jmp LBlock6
LLitSingle5:
#ifdef SAFETY
cmp edi,pbLimDst
jae LFail
#endif //SAFETY
mov edx,eax
shr edx,6
mov [edi],dl
inc edi
mov eax,[ebx-3]
inc ebx
jmp LBlock6
LLitByte5:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
dec ecx
mov edx,eax
shr edx,6
and edx,3
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
mov esi,eax
shl esi,2
or edx,esi
mov [edi],dl
inc edi
jmp LBlock6
L6BitOffByte6:
mov esi,eax
inc ecx
shr esi,8
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
jmp LCopyByte6
L9BitOffByte2:
mov esi,eax
inc ecx
shr esi,5
and esi,511
add esi,65
mov eax,[ebx-3]
inc ebx
jmp LCopyByte6
L12BitOffByte6:
mov esi,eax
inc ecx
shr esi,10
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyByte6
L20BitOffByte6:
mov esi,eax
add ecx,2
shr esi,10
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyByte6
// Copy Byte 6
LCopyByte6:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
rep movsb
// Block 6
LBlock6:
test al,64
jz LLen6_0
test al,128
jz LLen6_1
test ah,1
jz LLen6_2
test ah,2
jz LLen6_3
test ah,4
jz LLen6_4
test ah,8
jz LLen6_5
test ah,16
jz LLen6_6
test ah,32
jz LLen6_7
test ah,64
jz LLen6_8
test ah,128
jz LLen6_9
test eax,65536
jz LLen6_10
test eax,131072
jz LLen6_11
jmp LDone
LLen6_0:
mov ecx,1
test al,128
jz LLitSingle7
test ah,1
jz L6BitOffByte7
test ah,2
jz L9BitOffByte7
test ah,4
jz L12BitOffByte7
jmp L20BitOffByte7
LLen6_1:
mov ecx,eax
shr ecx,8
and ecx,1
or ecx,2
mov eax,[ebx-3]
inc ebx
test al,2
jz LLitByte1
test al,4
jz L6BitOffByte1
test al,8
jz L9BitOffByte1
test al,16
jz L12BitOffByte1
jmp L20BitOffByte1
LLen6_2:
mov ecx,eax
shr ecx,9
and ecx,3
or ecx,4
mov eax,[ebx-3]
inc ebx
test al,8
jz LLitByte3
test al,16
jz L6BitOffByte3
test al,32
jz L9BitOffByte3
test al,64
jz L12BitOffByte3
jmp L20BitOffByte3
LLen6_3:
mov ecx,eax
shr ecx,10
and ecx,7
or ecx,8
mov eax,[ebx-3]
inc ebx
test al,32
jz LLitDword5
test al,64
jz L6BitOffDword5
test al,128
jz L9BitOffDword5
test ah,1
jz L12BitOffDword5
jmp L20BitOffDword5
LLen6_4:
mov ecx,eax
shr ecx,11
and ecx,15
or ecx,16
mov eax,[ebx-3]
inc ebx
test al,128
jz LLitDword7
test ah,1
jz L6BitOffDword7
test ah,2
jz L9BitOffDword7
test ah,4
jz L12BitOffDword7
jmp L20BitOffDword7
LLen6_5:
mov ecx,eax
shr ecx,12
and ecx,31
or ecx,32
mov eax,[ebx-2]
add ebx,2
test al,2
jz LLitDword1
test al,4
jz L6BitOffDword1
test al,8
jz L9BitOffDword1
test al,16
jz L12BitOffDword1
jmp L20BitOffDword1
LLen6_6:
mov ecx,eax
shr ecx,13
and ecx,63
or ecx,64
mov eax,[ebx-2]
add ebx,2
test al,8
jz LLitDword3
test al,16
jz L6BitOffDword3
test al,32
jz L9BitOffDword3
test al,64
jz L12BitOffDword3
jmp L20BitOffDword3
LLen6_7:
mov ecx,eax
shr ecx,14
and ecx,127
or ecx,128
mov eax,[ebx-2]
add ebx,2
test al,32
jz LLitDword5
test al,64
jz L6BitOffDword5
test al,128
jz L9BitOffDword5
test ah,1
jz L12BitOffDword5
jmp L20BitOffDword5
LLen6_8:
mov ecx,eax
shr ecx,15
and ecx,255
or ecx,256
mov eax,[ebx-2]
add ebx,2
test al,128
jz LLitDword7
test ah,1
jz L6BitOffDword7
test ah,2
jz L9BitOffDword7
test ah,4
jz L12BitOffDword7
jmp L20BitOffDword7
LLen6_9:
mov ecx,eax
shr ecx,16
and ecx,511
or ecx,512
mov eax,[ebx-1]
add ebx,3
test al,2
jz LLitDword1
test al,4
jz L6BitOffDword1
test al,8
jz L9BitOffDword1
test al,16
jz L12BitOffDword1
jmp L20BitOffDword1
LLen6_10:
mov ecx,eax
shr ecx,17
and ecx,1023
or ecx,1024
mov eax,[ebx-1]
add ebx,3
test al,8
jz LLitDword3
test al,16
jz L6BitOffDword3
test al,32
jz L9BitOffDword3
test al,64
jz L12BitOffDword3
jmp L20BitOffDword3
LLen6_11:
mov ecx,eax
shr ecx,18
and ecx,2047
or ecx,2048
mov eax,[ebx-1]
add ebx,3
test al,32
jz LLitDword5
test al,64
jz L6BitOffDword5
test al,128
jz L9BitOffDword5
test ah,1
jz L12BitOffDword5
jmp L20BitOffDword5
LLitDword6:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
dec ecx
mov edx,eax
shr edx,7
and edx,1
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
mov eax,ecx
shr ecx,2
and eax,3
rep movsd
mov ecx,eax
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
mov esi,eax
shl esi,1
or edx,esi
mov [edi],dl
inc edi
jmp LBlock7
L6BitOffDword7:
mov esi,eax
inc ecx
shr esi,9
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
cmp esi,4
jb LCopyByte7
jmp LCopyDword7
L9BitOffDword3:
mov esi,eax
inc ecx
shr esi,6
and esi,511
add esi,65
mov eax,[ebx-3]
inc ebx
jmp LCopyDword7
L12BitOffDword7:
mov esi,eax
inc ecx
shr esi,11
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyDword7
L20BitOffDword7:
mov esi,eax
add ecx,2
shr esi,11
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyDword7
// Copy Dword 7
LCopyDword7:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
mov edx,ecx
shr ecx,2
and edx,3
rep movsd
mov ecx,edx
rep movsb
jmp LBlock7
LLitSingle6:
#ifdef SAFETY
cmp edi,pbLimDst
jae LFail
#endif //SAFETY
mov edx,eax
shr edx,7
mov [edi],dl
inc edi
mov eax,[ebx-3]
inc ebx
jmp LBlock7
LLitByte6:
#ifdef SAFETY
lea edx,[edi+ecx]
cmp edx,pbLimDst
ja LFail
#endif //SAFETY
dec ecx
mov edx,eax
shr edx,7
and edx,1
#ifdef SAFETY
lea esi,[ebx-3+ecx]
cmp esi,pbLimSrc
ja LFail
sub esi,ecx
#else //!SAFETY
lea esi,[ebx-3]
#endif //!SAFETY
rep movsb
lea ebx,[esi+4]
mov eax,[esi]
mov esi,eax
shl esi,1
or edx,esi
mov [edi],dl
inc edi
jmp LBlock7
L6BitOffByte7:
mov esi,eax
inc ecx
shr esi,9
and esi,63
inc esi
mov eax,[ebx-3]
inc ebx
jmp LCopyByte7
L9BitOffByte3:
mov esi,eax
inc ecx
shr esi,6
and esi,511
add esi,65
mov eax,[ebx-3]
inc ebx
jmp LCopyByte7
L12BitOffByte7:
mov esi,eax
inc ecx
shr esi,11
and esi,4095
add esi,577
mov eax,[ebx-2]
add ebx,2
jmp LCopyByte7
L20BitOffByte7:
mov esi,eax
add ecx,2
shr esi,11
and esi,1048575
add esi,4673
mov eax,[ebx-1]
add ebx,3
jmp LCopyByte7
// Copy Byte 7
LCopyByte7:
#ifdef SAFETY
push edx
lea edx,[edi+ecx]
cmp edx,pbLimDst
pop edx
ja LFail
#endif //SAFETY
neg esi
add esi,edi
#ifdef SAFETY
cmp esi,pvDst
jb LFail
#endif //SAFETY
rep movsb
// Block 7
LBlock7:
test al,128
jz LLen7_0
test ah,1
jz LLen7_1
test ah,2
jz LLen7_2
test ah,4
jz LLen7_3
test ah,8
jz LLen7_4
test ah,16
jz LLen7_5
test ah,32
jz LLen7_6
test ah,64
jz LLen7_7
test ah,128
jz LLen7_8
test eax,65536
jz LLen7_9
test eax,131072
jz LLen7_10
test eax,262144
jz LLen7_11
jmp LDone
LLen7_0:
mov ecx,1
mov eax,[ebx-3]
inc ebx
test al,1
jz LLitSingle0
test al,2
jz L6BitOffByte0
test al,4
jz L9BitOffByte0
test al,8
jz L12BitOffByte0
jmp L20BitOffByte0
LLen7_1:
mov ecx,eax
shr ecx,9
and ecx,1
or ecx,2
mov eax,[ebx-3]
inc ebx
test al,4
jz LLitByte2
test al,8
jz L6BitOffByte2
test al,16
jz L9BitOffByte2
test al,32
jz L12BitOffByte2
jmp L20BitOffByte2
LLen7_2:
mov ecx,eax
shr ecx,10
and ecx,3
or ecx,4
mov eax,[ebx-3]
inc ebx
test al,16
jz LLitByte4
test al,32
jz L6BitOffByte4
test al,64
jz L9BitOffByte4
test al,128
jz L12BitOffByte4
jmp L20BitOffByte4
LLen7_3:
mov ecx,eax
shr ecx,11
and ecx,7
or ecx,8
mov eax,[ebx-3]
inc ebx
test al,64
jz LLitDword6
test al,128
jz L6BitOffDword6
test ah,1
jz L9BitOffDword6
test ah,2
jz L12BitOffDword6
jmp L20BitOffDword6
LLen7_4:
mov ecx,eax
shr ecx,12
and ecx,15
or ecx,16
mov eax,[ebx-2]
add ebx,2
test al,1
jz LLitDword0
test al,2
jz L6BitOffDword0
test al,4
jz L9BitOffDword0
test al,8
jz L12BitOffDword0
jmp L20BitOffDword0
LLen7_5:
mov ecx,eax
shr ecx,13
and ecx,31
or ecx,32
mov eax,[ebx-2]
add ebx,2
test al,4
jz LLitDword2
test al,8
jz L6BitOffDword2
test al,16
jz L9BitOffDword2
test al,32
jz L12BitOffDword2
jmp L20BitOffDword2
LLen7_6:
mov ecx,eax
shr ecx,14
and ecx,63
or ecx,64
mov eax,[ebx-2]
add ebx,2
test al,16
jz LLitDword4
test al,32
jz L6BitOffDword4
test al,64
jz L9BitOffDword4
test al,128
jz L12BitOffDword4
jmp L20BitOffDword4
LLen7_7:
mov ecx,eax
shr ecx,15
and ecx,127
or ecx,128
mov eax,[ebx-2]
add ebx,2
test al,64
jz LLitDword6
test al,128
jz L6BitOffDword6
test ah,1
jz L9BitOffDword6
test ah,2
jz L12BitOffDword6
jmp L20BitOffDword6
LLen7_8:
mov ecx,eax
shr ecx,16
and ecx,255
or ecx,256
mov eax,[ebx-1]
add ebx,3
test al,1
jz LLitDword0
test al,2
jz L6BitOffDword0
test al,4
jz L9BitOffDword0
test al,8
jz L12BitOffDword0
jmp L20BitOffDword0
LLen7_9:
mov ecx,eax
shr ecx,17
and ecx,511
or ecx,512
mov eax,[ebx-1]
add ebx,3
test al,4
jz LLitDword2
test al,8
jz L6BitOffDword2
test al,16
jz L9BitOffDword2
test al,32
jz L12BitOffDword2
jmp L20BitOffDword2
LLen7_10:
mov ecx,eax
shr ecx,18
and ecx,1023
or ecx,1024
mov eax,[ebx-1]
add ebx,3
test al,16
jz LLitDword4
test al,32
jz L6BitOffDword4
test al,64
jz L9BitOffDword4
test al,128
jz L12BitOffDword4
jmp L20BitOffDword4
LLen7_11:
mov ecx,eax
shr ecx,19
and ecx,2047
or ecx,2048
mov eax,[ebx-1]
add ebx,3
test al,64
jz LLitDword6
test al,128
jz L6BitOffDword6
test ah,1
jz L9BitOffDword6
test ah,2
jz L12BitOffDword6
jmp L20BitOffDword6
LDone:
sub edi,pvDst
mov cbTot,edi
}