function CGCompareMem(P1, P2: Pointer; Length: Integer): Integer; assembler;
asm
PUSH ESI
PUSH EDI
PUSH ECX
PUSH EBX
MOV ESI,P1
MOV EDI,P2
CMP ESI,EDI
JZ @Equal
CMP ECX,1
JL @NotEqual
MOV edx,ecx
shr edx, 4
and ecx, 15
test ecx,ecx
JZ @SSECMP2
mov eax,-16
sub esi,eax
sub edi,eax
@CompareLoop:
mov ebx, [ESI + Eax]
xor ebx, [EDI + Eax]
jnz @Mismatch
add Eax, 4
js @CompareLoop
JMP @SSECMP
@Mismatch:
bsf ebx, ebx
shr ebx, 3
sub eax,-16
add eax,ebx
add eax,1
JMP @EXIT
@SSECMP:
sub esi,16
sub edi,16
@SSECMP2:
TEST edx,edx
JZ @EXIT
mov eax,ecx
neg edx
pxor xmm2,xmm2
@SSECMPLOOP:
movups xmm0,[ESI + Eax]
movups xmm1,[EDI + Eax]
pxor xmm0, xmm1
pcmpeqb xmm0, xmm2
pmovmskb ebx, xmm0
CMP ebx,$FFFF
jnz @SSEMismatch
add eax,16
inc edx
js @SSECMPLOOP
xor eax,eax
JMP @EXIT
@SSEMismatch:
mov ebx, [ESI + Eax]
xor ebx, [EDI + Eax]
jnz @Mismatch2
add Eax, 4
jmp @SSEMismatch
@Mismatch2:
bsf ebx, ebx
shr ebx, 3
add eax,ebx
add eax,1
JMP @EXIT
@NotEqual:
MOV EAX,-1
JMP @EXIT
@Equal:
XOR EAX,EAX
@EXIT:
POP EBX
POP ECX
POP EDI
POP ESI
end;
经测试比常规算法快60%-110%