首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么要在ARMv8上使用xzr寄存器而不是文字0呢?

为什么要在ARMv8上使用xzr寄存器而不是文字0呢?
EN

Stack Overflow用户
提问于 2017-03-14 14:27:25
回答 5查看 16.9K关注 0票数 21

当我从ARM上读到SVE白皮书时,我发现了一些让我觉得奇怪的东西(在一个非SVE的例子中):

代码语言:javascript
代码运行次数:0
运行
复制
mov x8, xzr

我不知道这个xzr寄存器是什么,所以我查找了它,发现了ARM的一些内容,在很多情况下,它是零的同义词。

所以看起来x8被初始化为零,这是有意义的,因为它是在循环之前执行的,其中使用x8作为循环计数器。

我不明白的是,为什么没有使用文字0而不是xzr呢?例如:

代码语言:javascript
代码运行次数:0
运行
复制
mov x8, 0

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-03-14 19:18:38

我认为mov x8, xzrmov x8, #0的比较有点像鲱鱼。

正如@old_timer的答案所示,没有编码增益,而且很有可能(虽然我还没有检查)很少或根本没有流水线性能增益。

然而,xzr给我们的--除了@InfinitelyManic的答案那样的虚拟寄存器--是访问一个零值操作数,而不必加载和占用一个真正的寄存器。这具有两方面的好处,即少一个指令,多一个可用寄存器来保存“真实”数据。

我认为这是最初“任择议定书”中提到的“ARM的一些内容”忽略指出的一个重要特征。

这就是我所说的mov x8, xzrmov x8, #0是红鲱鱼的意思。如果我们是为了修改x8而对其进行零化,那么使用xzr#0是相当武断的(尽管我倾向于将#0作为更明显的选择)。但是,如果我们将x8归零纯粹是为了向后续指令提供一个零操作数,那么最好在允许的地方使用xzr而不是x8作为指令中的操作数,而不是对x8进行归零。

票数 18
EN

Stack Overflow用户

发布于 2017-03-14 14:41:02

代码语言:javascript
代码运行次数:0
运行
复制
mov x8,xzr
mov x8,#0
mov x8,0

产生

代码语言:javascript
代码运行次数:0
运行
复制
0000000000000000 <.text>:
   0:   aa1f03e8    mov x8, xzr
   4:   d2800008    mov x8, #0x0                    // #0
   8:   d2800008    mov x8, #0x0                    // #0

没有真正的惊喜,除了它允许立即没有英镑标志。这并不是指令大小问题(同样,对于x86 (例如xor rax,rax比mov,0)来说,rax比mov便宜),也许还有流水线性能的提高(尽管人们普遍认为指令需要一个以上的时钟才能开始完成)。

最有可能的是,这是一个个人偏好的东西,我们有这个凉爽的mips,像总是零注册的东西,让我们使用它只是为了好玩。

票数 4
EN

Stack Overflow用户

发布于 2017-03-14 14:50:45

这两种指示应该是相同的--无论是在效果方面还是在预期性能方面。

它们实际上都是更通用指令的别名。

mov x8, 0被编码为orr x8, xzr, 0

mov x8, xzr被编码为orr x8, xzr, xzr

别名很有用,因为它们使ASM更易读。

第二种编码说明了为什么有一个零寄存器xzr是有用的。因为我们知道xzr总是为零,所以我们可以为mov重用orr指令。没有它,mov将需要不同的编码,因此将浪费编码空间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42788696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档