Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 分支与内存访问-在AArch64模式下,通常更喜欢什么?_Assembly_Arm64_Micro Optimization - Fatal编程技术网

Assembly 分支与内存访问-在AArch64模式下,通常更喜欢什么?

Assembly 分支与内存访问-在AArch64模式下,通常更喜欢什么?,assembly,arm64,micro-optimization,Assembly,Arm64,Micro Optimization,在Cortex-A处理器(AArch64模式)上,是否有一些优化速度的经验法则?好像从内存中读取总是比分支更好 以最简单的十六进制字符串转换为例: convert: . . . cmp x9, 9 b.le . + 8 add x9, x9, 0x07 add x9, x9, 0x30 strb w9, [x10, -1]! . . . b convert vs 提前感谢您提供的任何提示。在这个特定示例中,您可以使用csel并同时

在Cortex-A处理器(AArch64模式)上,是否有一些优化速度的经验法则?好像从内存中读取总是比分支更好

以最简单的十六进制字符串转换为例:

convert:
    . . .
    cmp x9, 9
    b.le . + 8
    add x9, x9, 0x07
    add x9, x9, 0x30
    strb w9, [x10, -1]!
    . . .
    b convert
vs


提前感谢您提供的任何提示。

在这个特定示例中,您可以使用
csel
并同时拥有两个方面的优势—无内存读取和无分支。一般来说,我认为答案将在很大程度上取决于这是否是在一个足够紧密的循环中调用的,您可以依靠保留在一级缓存中的查找表,还有条件分支的预测准确度。像这样一个很小的查找表(小于1条缓存线)通常是很好的,特别是当它保存一个不可预测的分支时。如果L1d中很热,即使保存一些指令(如add/csel)也是值得的。尽管需要注意的是,对于这种特定情况,您最好使用SIMD而不是标量循环,从而使用无分支技术,如掩码添加,如在我的x86 SSE2版本中:。或者使用
tbl
进行SIMD字节查找,如SSSE3 pshufb版本;我认为AdvSIMD/NEON可以做到这一点。
convert:
    . . .
    ldrb w9, [x11, x9]    ; x11 - ptr to alphabet string: "0123456789ABCDEF"
    strb w9, [x10, -1]!
    . . .
    b convert