同一寄存器上使用xorps的目的是什么?

10
我正在查看以下反汇编的C++代码。
    auto test2 = convert<years, weeks>(2.0);
00007FF6D6475ECC  mov         eax,16Dh  
00007FF6D6475ED1  xorps       xmm1,xmm1  
00007FF6D6475ED4  cvtsi2sd    xmm1,rax  
00007FF6D6475ED9  mulsd       xmm1,mmword ptr [__real@4000000000000000 (07FF6D64AFE38h)]  
00007FF6D6475EE1  divsd       xmm1,mmword ptr [__real@401c000000000000 (07FF6D64AFE58h)] 

我很好奇 xorps xmm1, xmm1 这条指令的作用是什么。貌似任何数与自身异或都会得到0?如果是这样,那清空寄存器的目的是什么?

注意:我的问题纯属出于好奇,我对汇编语言一窍不通。


3
是的,快速将xmm1中的所有位设置为0是意图。cvtsi2sd指令只会分配0..63位。 - Hans Passant
@HansPassant 啊,这是类似于“在 x64 架构上,C++ 的 double(64 位)实际上只是单精度浮点数”的某个特征吗?我也有点想知道为什么会使用单精度乘除以处理双精度。 - Nicolas Holthaus
1
@NicolasHolthaus:这是一个标量64b双精度变量,它在一个可以容纳两个双精度数并排的寄存器中进行操作。(mulPd / divPd.) - Peter Cordes
1个回答

8

XMM寄存器有128位,使用cvtsi2sd只会填充低64位。因此,xorps指令用于清除可能存在的垃圾值和/或依赖链,否则会影响后续操作。

基本上,你需要执行以下操作序列:

mov         eax, 16Dh       ; load 0x16D into lower 32 bits of RAX register
xorps       xmm1, xmm1      ; zero xmm1
cvtsi2sd    xmm1, rax       ; load lower 32 bits from RAX into xmm1
<do more stuff with xmm1>

在汇编语言中,清零寄存器的必要性非常频繁,特别是当只加载寄存器部分内容时,后续指令需要操作整个寄存器范围。使用 xor x, x 是一种常见的寄存器清零模式之一。
此外,更多关于为什么 xor 可能比其他替代方案(如 mov x, 0, and x, 0)更好的详细信息,请参见 这篇回答(根据评论,非常详尽和出色)。

3
使用异或清零的更微妙的原因大多适用于整数寄存器(请参见我在https://dev59.com/9VwX5IYBdhLWcg3wjwFZ 的答案),但不消耗执行单元或物理寄存器文件条目(Intel SnB-family)仍然适用。此外,对于矢量寄存器,没有 mov-immediate 形式。如果有vpbroadcastd v,imm32 就好了,但是现在还没有。你说的xorpspsubd same,same之类的更好,尽管某些CPU可能不会打破 psub 的依赖链。 - Peter Cordes
此外,在这种情况下,首先清除寄存器可能更有利于打破对 xmm1 先前值的依赖。只要代码仅使用进一步的标量指令而不是...PD(打包双精度),上64位中的垃圾不会导致减速或故障。并且每个指令都有一个标量版本(当然除了洗牌指令)。 - Peter Cordes
这两个链接只是链接到问题,我认为你想链接到一些答案。 - Puppy
1
@Puppy:如果你说的是我的链接:是的,我在谈论我写的答案。我链接到这个问题,因为它很短,并提供了回答所回应的上下文。此外,有时我会感到有点自大,只链接到我的答案而不是原帖的问题。顺便说一句,我认为Zdeněk选择的答案不是最好的。我在它下面留了一个评论。 - Peter Cordes
@PeterCordes 已修复 :) - Zdeněk Jelínek
谢谢 :) 现在如果所有其他重复的“为什么使用异或?”问题也链接到我的答案,更多的stackoverflow读者将获得完整的故事。(并投票支持我的技术积分总数,但老实说,在其他问题的答案中只有一半的故事,没有深入了解的提示,这才是我更烦恼的地方。例如,我最近才了解到异或可以解决部分寄存器问题。) 我已经在一些高票问题的某些地方留下了评论。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接