快速FastPosChar演算法(修改完善版) by codegame

來源:互聯網
上載者:User

 

SSE最佳化演算法:
function CGPosCharSSE(SubChar: Char ; SrcString: PChar; Len: Integer; Order:Boolean=True): Integer;
                // SubChar -> AL; SrcString -> EDX; Len -> ECX  Order -> [ebp+8]
asm
      push   esi
      push   ebx
      test   ecx, ecx
      jz     @NotFound
      test   edx, edx
      jz     @NotFound
      xor    esi,esi
      mov    ah,al
      movd     xmm1, eax
      pshuflw  xmm1, xmm1, 0
      pshufd   xmm1, xmm1, 0
      mov eax, [ebp+8]
      test  eax,eax   //為0則表示Order =false
      je    @Reverse   //為0倒序尋找
      
    {---------------順序尋找------------------}
    @OrderCmp:
      movups   xmm0,[edx+esi]
      pcmpeqb  xmm0, xmm1
      pmovmskb eax, xmm0
      test  eax, eax
      jnz   @OrderFound
      add   esi,$10
      cmp   esi,ecx
      jl    @OrderCmp
      jmp   @Notfound
      
    {---------------倒序尋找------------------}
    @Reverse:
      mov   esi,ecx
      sub   esi,$10
    @ReverseCmp:
      movups   xmm0,[edx+esi]
      pcmpeqb  xmm0, xmm1
      pmovmskb eax, xmm0
      test  eax, eax
      jnz   @ReverseFound
      sub   esi,$10
      cmp   esi,-$10
      jl    @ReverseCmp
    @NotFound:
      xor   eax, eax
      jmp   @Exit
    @OrderFound:
      bsf   eax, eax
      jmp   @SetRet
    @ReverseFound:
      bsr   eax, eax
    @SetRet:
      shr   eax, 3
      add   eax,esi
      add   eax,1
      cmp   eax,ecx
      jg    @Notfound //越界大於長度
      cmp   eax,1
      jl    @Notfound //越界小於1
    @Exit:
      pop   ebx
      pop   esi
end;

常規最佳化演算法:

function CGPosChar(SubChar: Char ; SrcString: PChar; Len: Integer; Order:Boolean=True): Integer;
                //  SubChar -> AL; SrcString -> EDX; Len -> ECX  Order -> [ebp+8]
asm
      push esi
      push ebx
      push edx
      push edi
      test ecx, ecx
      jz   @Notfound
      test edx, edx
      jz   @Notfound
      xor  ebx,ebx
      mov  ah, al
      mov  bx, ax
      shl  eax, $10
      or   ebx, eax
      xor  esi,esi
      mov eax, [ebp+8]
      test eax,eax   //為0則表示Order =false
      je  @Reverse   //為0倒序尋找
      
    {---------------順序尋找------------------}
    @OrderCmp:
      mov  eax,[edx+esi]
      xor  eax,ebx
      lea  edi, [eax-$01010101]
      not  eax
      and  eax, edi
      and  eax, $80808080
      jnz   @OrderFound
      add  esi,4
      cmp  esi,ecx
      jl   @OrderCmp
      jmp  @Notfound

    {---------------倒序尋找------------------}
    @Reverse:
      mov   esi,ecx
      sub   esi,4
    @ReverseCmp:
      mov   eax,[edx+esi]
      xor   eax,ebx
      lea   edi, [eax-$01010101]
      not   eax
      and   eax, edi
      and   eax, $80808080
      jnz   @ReverseFound
      sub   esi,4
      cmp   esi,-4
      jg    @ReverseCmp
    @Notfound:
      xor   eax, eax
      jmp   @Exit
    @OrderFound:
      bsf   eax, eax
      jmp   @SetRet
    @ReverseFound:
      bsr   eax, eax
    @SetRet:
      shr   eax, 3
      add   eax,esi
      add   eax,1
      cmp   eax,ecx
      jg    @Notfound //越界大於長度
      cmp   eax,1
      jl    @Notfound //越界小於1
    @Exit:
      pop   edi
      pop   edx
      pop   ebx
      pop   esi
end;

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.