gpt4 book ai didi

c++ - 为什么 ARM 使用两条指令来屏蔽一个值?

转载 作者:可可西里 更新时间:2023-11-01 18:26:10 25 4
gpt4 key购买 nike

对于下面的函数...

uint16_t swap(const uint16_t value)
{
return value << 8 | value >> 8;
}

...为什么带有 -O2 的 ARM gcc 6.3.0 会产生以下程序集?

swap(unsigned short):
lsr r3, r0, #8
orr r0, r3, r0, lsl #8
lsl r0, r0, #16 # shift left
lsr r0, r0, #16 # shift right
bx lr

编译器似乎使用两次移位来屏蔽不需要的字节,而不是使用逻辑与。编译器能否改为使用 and r0, r0, #4294901760

最佳答案

较旧的 ARM 程序集无法轻松创建常量。相反,它们被加载到文字池中,然后通过内存加载读入。您建议的这个 只能采用我相信带移位的 8 位文字。您的 0xFFFF0000 需要 16 位来执行 1 条指令。

因此,我们可以从内存加载并执行 (慢),采取 2 条指令来创建值和 1 条指令和(更长),或者只是便宜地移动两次并称之为好。

编译器选择了移位,老实说,它非常快。

现在进行现实检查:

担心一个类次,除非这是 100% 肯定的瓶颈是浪费时间。即使编译器不是最优的,你也几乎感觉不到。担心代码中的“热”循环而不是像这样的微操作。出于好奇看这个真是太棒了。不用担心这个确切的代码在您的应用程序中的性能。


编辑:

这里的其他人已经注意到,较新版本的 ARM 规范允许更有效地完成此类事情。这表明,在这个级别上讨论时,指定芯片或至少我们正在处理的确切 ARM 规范很重要。由于您的输出中缺少“较新”的指令,我假设是古老的 ARM。如果我们正在跟踪编译器错误,那么这个假设可能不成立并且了解规范更为重要。对于这样的交换,在以后的版本中确实有更简单的指令来处理。


编辑 2

可以做的可能使它更快的一件事是让它内联。在那种情况下,编译器可以将这些操作与其他工作交织在一起。根据 CPU 的不同,这可能会使这里的吞吐量翻倍,因为许多 ARM CPU 都有 2 个整数指令流水线。将说明充分展开,以免出现危险,然后就可以了。这必须与 I-Cache 的使用权衡,但在重要的情况下,您会看到更好的结果。

关于c++ - 为什么 ARM 使用两条指令来屏蔽一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47780720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com