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: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状态
这个对我们菜鸟来说 看不懂 但我相信 我会学会的
页:
[1]