我从ARM阅读SVE whitepaper时遇到了让我感到奇怪的事情(在非SVE示例中):
mov x8, xzr
我不知道这个
xzr
寄存器是什么,所以我查找了它,发现some content from ARM指出在许多情况下它都是零的同义词。因此,看来
x8
被初始化为零,这是有道理的,因为它是在将x8
用作循环计数器的循环之前执行的。我不明白的是,为什么不使用文字
0
代替xzr
?例如:mov x8, 0
总而言之,我的问题是:为什么这里可以使用
xzr
寄存器而不是文字0
? 最佳答案
我认为mov x8, xzr
与mov 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/