飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3386|回复: 2

[ASM] SSECMP asm 代码

[复制链接]

该用户从未签到

发表于 2010-12-21 15:19:10 | 显示全部楼层 |阅读模式
看了一部分 还有些疑惑 一会继续看

function CGCompareMem(P1, P2: Pointer; Length: Integer): Integer; assembler;   
asm  
        PUSH    ESI   
        PUSH    EDI   
        PUSH    ECX   
        PUSH    EBX   
        MOV     ESI,P1     ; p1
        MOV     EDI,P2     ; p2
        CMP     ESI,EDI   
        JZ      @Equal   
        CMP     ECX,1   
        JL      @NotEqual   
        MOV     edx,ecx     ;  ecx = length  
        shr     edx, 4   
        and     ecx, 15     ;  ??? 汗死 给看成 15h了
        test    ecx,ecx   
        JZ      @SSECMP2    ;  不足16个字节 跳走
        mov     eax,-16     ;  EAX 赋初值
        sub     esi,eax   
        sub     edi,eax   
@CompareLoop:   
        mov     ebx, [ESI + Eax]   
        xor     ebx, [EDI + Eax]   
        jnz     @Mismatch   ; 比较失败 // 没有对小于4个字节的情况 做处理 ?
        add     Eax, 4  
        js      @CompareLoop  ; 先判断 16 个字节
        JMP     @SSECMP   
@Mismatch:   
        bsf      ebx, ebx   ; 取第一个非0位
        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  ; 初始化环境 = 0
@SSECMPLOOP:   
        movups  xmm0,[ESI + Eax]   
        movups  xmm1,[EDI + Eax]   
        pxor    xmm0,  xmm1   
        pcmpeqb  xmm0, xmm2   
        pmovmskb ebx, xmm0   
        CMP     ebx,$FFFF  
        jnz     @SSEMismatch   ; 如果返回值不为 FFFF 则SSE over
        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
PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-12-21 17:36:14 | 显示全部楼层
    本帖最后由 whypro 于 2010-12-21 17:39 编辑

    这是个优化版,前来学习。
    MMX指令集

    1、算术运算:
    PADD[B、W、D] 环绕加[字节,字,双字]
    PADDS[B , W] 有符号饱和加[字节,字]
    PADDUS[B , W] 无符号饱和加[字节,字]
    PSUB[B、W、D] 环绕减[字节,字,双字]
    PSUBS[B,W] 有符号饱和减[字节,字]
    PSUBUS[D,W] 无符号饱和减【字节,字】
    PMULHW 紧缩字乘后取高位
    PMULLW 紧缩字乘后取低位
    PMADDWD 紧缩字乘,积相加

    2、比较:
    PCMPEQ[B,W,D] 紧缩比较是否相等【字节,字,双字】
    PCMPGT[B,W,D] 紧缩比较是否大于【字节,字,双字】

    3、类型转换:
    PACKUSWB 按无符号饱和压缩【字成字节】
    PACKSS[WB,DW] 按有符号饱和压缩【字/双字成/字节/字】
    PUNPCKH[BW,WD,DQ] 扩展高位【字节,字,双字成字,双字,4字】
    PUNPCKL[BW,WD,DQ] 扩展地位【字节,字,双字成字,双字,4字】

    4、逻辑运算:
    PAND 紧缩逻辑与
    PANDN 紧缩逻辑与非
    POR 紧缩逻辑或
    PXOR 紧缩逻辑异或

    5、位移:
    PSLL[W,D,Q] 紧缩逻辑左移[字,双字,4字]
    PSRL[W,D,Q] 紧缩逻辑右移[字,双字,4字]
    PSRA[W,D] 紧缩算术右移【字,双字】

    7、数据传送:
    MOV[D,Q] 从MMX寄存器传人/传出【双字/4字】

    8、状态清除
    EMMS 清除MMX状态
     
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2019-11-14 11:32
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2010-12-21 18:26:52 | 显示全部楼层
    这个对我们菜鸟来说 看不懂 但我相信 我会学会的
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表