发布于 2017-03-14 19:18:38
我认为mov x8, xzr
和mov x8, #0
的比较有点像鲱鱼。
正如@old_timer的答案所示,没有编码增益,而且很有可能(虽然我还没有检查)很少或根本没有流水线性能增益。
然而,xzr
给我们的--除了@InfinitelyManic的答案那样的虚拟寄存器--是访问一个零值操作数,而不必加载和占用一个真正的寄存器。这具有两方面的好处,即少一个指令,多一个可用寄存器来保存“真实”数据。
我认为这是最初“任择议定书”中提到的“ARM的一些内容”忽略指出的一个重要特征。
这就是我所说的mov x8, xzr
和mov x8, #0
是红鲱鱼的意思。如果我们是为了修改x8
而对其进行零化,那么使用xzr
或#0
是相当武断的(尽管我倾向于将#0
作为更明显的选择)。但是,如果我们将x8
归零纯粹是为了向后续指令提供一个零操作数,那么最好在允许的地方使用xzr
而不是x8
作为指令中的操作数,而不是对x8
进行归零。
发布于 2017-03-14 14:41:02
mov x8,xzr
mov x8,#0
mov x8,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,像总是零注册的东西,让我们使用它只是为了好玩。
发布于 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
将需要不同的编码,因此将浪费编码空间。
https://stackoverflow.com/questions/42788696
复制相似问题