Nisy 发表于 2010-12-21 15:19:10

SSECMP asm 代码

看了一部分 还有些疑惑 一会继续看

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,    
      xor   ebx,    
      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:   
      movupsxmm0,   
      movupsxmm1,   
      pxor    xmm0,xmm1   
      pcmpeqbxmm0, 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,    
      xor   ebx,    
      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

whypro 发表于 2010-12-21 17:36:14

本帖最后由 whypro 于 2010-12-21 17:39 编辑

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

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

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

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

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

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

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

8、状态清除
EMMS 清除MMX状态
 

q328883359 发表于 2010-12-21 18:26:52

这个对我们菜鸟来说 看不懂 但我相信 我会学会的
页: [1]
查看完整版本: SSECMP asm 代码