[armv9]-ARM最新架构为memcpy/memset底层的实现提供新的指令
生活随笔
收集整理的這篇文章主要介紹了
[armv9]-ARM最新架构为memcpy/memset底层的实现提供新的指令
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
引流關鍵詞:CPY CPYM CPYP CPYE SET SETP SETM SETE,memcpy,memset,armv9
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
思考
1、memcpy/memset的底層是如何實現的?一個一個字節的操作嗎? 可不可以四個四個字節操作呢?
2、若干年后再來回答問題1,是不是有新的方法了呢?
在大多數的[操作]系統中,memcpy()、memset()等函數的實現,其實都一個字節一個字節的處理。翻譯成匯編后無非就算循環執行ldr、str指令
memcpy的底層實現:
_PTR _DEFUN(memcpy, (dst0, src0, len0), _PTR dst0 _AND _CONST _PTR src0 _ANDsize_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:125e1469b8: d2800003 mov x3, #0x0 // #0e1469bc: eb03005f cmp x2, x3e1469c0: 54000041 b.ne e1469c8 <memset+0x10> // b.any /home/test/workspace/code/optee/optee_os/lib/libutils/isoc/newlib/memset.c:129e1469c4: d65f03c0 ret /home/test/workspace/code/optee/optee_os/lib/libutils/isoc/newlib/memset.c:126e1469c8: 38236801 strb w1, [x0, x3]e1469cc: 91000463 add x3, x3, #0x1e1469d0: 17fffffb b e1469bc <memset+0x4>這些函數在一般的軟件中會經常使用,所以它們的性能尤其重要。
在ARM最新的架構中(armv9)提出了優化這些性能的方式(FEAT_MOPS),即:增加了一些指令來做這件事
總結
以上是生活随笔為你收集整理的[armv9]-ARM最新架构为memcpy/memset底层的实现提供新的指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: optee中关于异常向量表、中断等的深入
- 下一篇: ARMV8虚拟中断的介绍