引流关键词:CPY CPYM CPYP CPYE SET SETP SETM SETE,memcpy,memset,armv9
快速链接:
.
个人博客笔记导读目录(全部)
- 付费专栏-付费课程 【购买须知】:
- 【精选】ARMv8/ARMv9架构入门到精通-[目录]
思考
1、memcpy/memset的底层是如何实现的?一个一个字节的操作吗? 可不可以四个四个字节操作呢?
2、若干年后再来回答问题1,是不是有新的方法了呢?
在大多数的[操作]系统中,memcpy()、memset()等函数的实现,其实都一个字节一个字节的处理。翻译成汇编后无非就算循环执行ldr
、str
指令
memcpy的底层实现:
_PTR
_DEFUN(memcpy, (dst0, src0, len0), _PTR dst0 _AND _CONST _PTR src0 _AND
size_t len0)
{
#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
char *dst = (char *)dst0;
char *src = (char *)src0;
_PTR save = dst0;
while (len0--)
*dst++ = *src++;
return save;
}
memset的底层实现:
(optee_os/lib/libutils/isoc/newlib/memset.c)
_PTR _DEFUN(memset, (m, c, n), _PTR m _AND int c _AND size_t n)
{
char *s = (char *)m;
#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__)
......
#endif /* not PREFER_SIZE_OVER_SPEED */
while (n--)
*s++ = (char)c;
return m;
}
翻译成汇编后:
000000000e1469b8 <memset>:
memset():
/home/test/workspace/code/optee/optee_os/lib/libutils/isoc/newlib/memset.c:125
e1469b8: d2800003 mov x3, #0x0 // #0
e1469bc: eb03005f cmp x2, x3
e1469c0: 54000041 b.ne e1469c8 <memset+0x10> // b.any
/home/test/workspace/code/optee/optee_os/lib/libutils/isoc/newlib/memset.c:129
e1469c4: d65f03c0 ret
/home/test/workspace/code/optee/optee_os/lib/libutils/isoc/newlib/memset.c:126
e1469c8: 38236801 strb w1, [x0, x3]
e1469cc: 91000463 add x3, x3, #0x1
e1469d0: 17fffffb b e1469bc <memset+0x4>
这些函数在一般的软件中会经常使用,所以它们的性能尤其重要。
在ARM最新的架构中(armv9)提出了优化这些性能的方式(FEAT_MOPS),即:增加了一些指令来做这件事