快速内存比较函数CompareMem(Delphi SSE优化算法应用之二)

 

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%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值