- 注册时间
- 2008-2-6
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 51573
- 在线时间
- 小时
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?欢迎注册
×
做内存清零函数的优化
两个函数
一个movdqa, 一个movntdq
数据尺寸(双字串长)小时第一个好,数据尺寸大时第二个好
在尺寸为135000-136000范围开始第二个函数表现开始好于一
(纳闷的是不是512k/4=131072)
二级缓存是512k 一级缓存是8k
请问如何切分分界点
//应该总假定是双字串
void AsmMemZero0(unsigned long * p, unsigned long t)
{
__asm
{
xor eax, eax
cld
mov edi, dword ptr [p]
mov edx, t
test edx, 0xFFFFFFFF
je exit0
test edi, 15 //是否16字节对齐
je AsmZero1
mov ecx, edi
and ecx, 0xFFFFFFF0
add ecx, 16
sub ecx, edi //得到需要双字复制部分,要和edx比较谁大
shr ecx, 2 //转换为双字长度
mov ebx, ecx
cmp ecx, edx
ja AsmZero2 //不足,转尾处理
AsmZero01:
mov dword ptr [edi], eax
add edi, 4
sub ecx, 1
jne AsmZero01
sub edx, ebx
je exit0 //是否刚好
AsmZero1: //16字节对齐
mov ecx, edx
shr ecx, 2
je AsmZero2 //是否不足16字节
pxor xmm0, xmm0
AsmZero11:
movdqa [edi], xmm0
add edi, 16
sub ecx, 1
jne AsmZero11
AsmZero2:
mov ecx, edx
and ecx, 3 //得到剩余的双字数
je exit0
AsmZero3:
mov dword ptr [edi], eax
add edi, 4
sub ecx, 1
jne AsmZero3
exit0:
}
}
//应该总假定是双字串
void AsmMemZero1(unsigned long * p, unsigned long t)
{
__asm
{
xor eax, eax
cld
mov edi, dword ptr [p]
mov edx, t
test edx, 0xFFFFFFFF
je exit0
test edi, 15 //是否16字节对齐
je AsmZero1
mov ecx, edi
and ecx, 0xFFFFFFF0
add ecx, 16
sub ecx, edi //得到需要双字复制部分,要和edx比较谁大
shr ecx, 2 //转换为双字长度
mov ebx, ecx
cmp ecx, edx
ja AsmZero2 //不足,转尾处理
AsmZero01:
mov dword ptr [edi], eax
add edi, 4
sub ecx, 1
jne AsmZero01
sub edx, ebx
je exit0 //是否刚好
AsmZero1: //16字节对齐
mov ecx, edx
shr ecx, 2
je AsmZero2 //是否不足16字节
pxor xmm0, xmm0
AsmZero11:
movntdq [edi], xmm0
add edi, 16
sub ecx, 1
jne AsmZero11
AsmZero2:
mov ecx, edx
and ecx, 3
je exit0
AsmZero3:
mov dword ptr [edi], eax
add edi, 4
sub ecx, 1
jne AsmZero3
exit0:
sfence
}
}
[ 本帖最后由 无心人 于 2008-5-6 07:55 编辑 ] |
|