我从ARM阅读SVE whitepaper时遇到了让我感到奇怪的事情(在非SVE示例中):

mov x8, xzr


我不知道这个xzr寄存器是什么,所以我查找了它,发现some content from ARM指出在许多情况下它都是零的同义词。

因此,看来x8被初始化为零,这是有道理的,因为它是在将x8用作循环计数器的循环之前执行的。

我不明白的是,为什么不使用文字0代替xzr?例如:

mov x8, 0


总而言之,我的问题是:为什么这里可以使用xzr寄存器而不是文字0

最佳答案

我认为mov x8, xzrmov x8, #0的比较有点让人讨厌。

正如@old_timer的答案所示,没有编码增益可言,而且很有可能(尽管我承认没有检查过)管道性能增益很小或没有。

但是,除了根据@InfinitelyManic的答案提供的虚拟寄存器之外,xzr给我们提供的是访问零值操作数的方法,而无需加载和占用实际寄存器。这具有双重优势:减少一条指令,再增加一个寄存器来保存“真实”数据。

我认为这是原始'some content from ARM' referred to in the OP忽略指出的重要特征。

这就是mov x8, xzr vs mov x8, #0是红色鲱鱼的意思。如果我们打算对x8进行零位修改,然后使用xzr#0则是任意的(尽管我倾向于更倾向于#0)。但是,如果我们纯粹为了将x8清零以便为后续指令提供零操作数,那么最好使用-在允许的情况下-xzr而不是x8作为该指令中的操作数,并且根本不将x8归零。

关于assembly - 为什么在ARMv8上使用xzr寄存器而不是立即数0?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42788696/

10-11 15:31