同一寄存器上的 xorp 的目的是什么

What is the purpose of xorps on the same register?

本文关键字:xorp 是什么 寄存器      更新时间:2023-10-16

我正在查看以下反汇编的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?如果是这样,清除寄存器的目的是什么?

注意:我只是出于纯粹的好奇心而问这个问题。我对汇编语言知之甚少。

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, 0and x, 0)的更多详细信息。