-
-
[求助]sh4下的一段汇编问题
-
发表于: 2010-9-1 11:49 5152
-
先贴代码:
void memset32(char* dst, int src, int size)
{
if (!dst || !size) return ;
int left = size & 0x3;
dst += (size << 2);
if (!left)
{
size >>= 2;
asm volatile
(
"1:\n\t"
"dt %0\n\t"
"mov.l %1,@-%2\n\t"
"mov.l %1,@-%2\n\t"
"mov.l %1,@-%2\n\t"
"mov.l %1,@-%2\n\t"
"bf 1b\n\t"
:
: "r" (size), "r" (src), "r" (dst)
);
}
else
{
size >>= 2;
asm volatile // 貌似这段有点问题,运行时老挂掉
(
"1:\n\t"
"dt %3\n\t"
"mov.l %1,@-%2\n\t"
"bf 1b\n\t"
"2:\n\t"
"dt %0\n\t"
"mov.l %1,@-%2\n\t"
"mov.l %1,@-%2\n\t"
"mov.l %1,@-%2\n\t"
"mov.l %1,@-%2\n\t"
"bf 2b\n\t"
:
: "r" (size), "r" (src), "r" (dst), "r" (left)
);
}
}
那位大虾帮忙看看,这段汇编哪里写的不对啊,这个是按4字节memset的汇编版本,用的是sh4的指令集
还有怎样才能进一步优化其性能啊, 我尝试memset 1m x 4,的内存 效率还是很低啊, 仅仅快了一倍而已 在pc上优化memset32,可以快10-15倍了 为什么sh4架构的就这么慢啊
有谁帮我指点下 我初学不太清楚
void memset32(char* dst, int src, int size)
{
if (!dst || !size) return ;
int left = size & 0x3;
dst += (size << 2);
if (!left)
{
size >>= 2;
asm volatile
(
"1:\n\t"
"dt %0\n\t"
"mov.l %1,@-%2\n\t"
"mov.l %1,@-%2\n\t"
"mov.l %1,@-%2\n\t"
"mov.l %1,@-%2\n\t"
"bf 1b\n\t"
:
: "r" (size), "r" (src), "r" (dst)
);
}
else
{
size >>= 2;
asm volatile // 貌似这段有点问题,运行时老挂掉
(
"1:\n\t"
"dt %3\n\t"
"mov.l %1,@-%2\n\t"
"bf 1b\n\t"
"2:\n\t"
"dt %0\n\t"
"mov.l %1,@-%2\n\t"
"mov.l %1,@-%2\n\t"
"mov.l %1,@-%2\n\t"
"mov.l %1,@-%2\n\t"
"bf 2b\n\t"
:
: "r" (size), "r" (src), "r" (dst), "r" (left)
);
}
}
那位大虾帮忙看看,这段汇编哪里写的不对啊,这个是按4字节memset的汇编版本,用的是sh4的指令集
还有怎样才能进一步优化其性能啊, 我尝试memset 1m x 4,的内存 效率还是很低啊, 仅仅快了一倍而已 在pc上优化memset32,可以快10-15倍了 为什么sh4架构的就这么慢啊
有谁帮我指点下 我初学不太清楚
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
看原图
赞赏
雪币:
留言: