【发布时间】:2016-01-30 15:51:25
【问题描述】:
我正在查看以下反汇编的 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 指令的意义感到好奇。似乎任何数字 xor 本身只会给出 0?如果有,清零的目的是什么?
注意:我只是出于好奇而问这个问题。我对汇编语言知之甚少。
【问题讨论】:
-
是的,快速将 xmm1 中的所有位设置为 0 是本意。 cvtsi2sd 指令只分配位 0..63
-
@HansPassant 啊,这是像“c++ double(64 位)实际上只是 x64 架构上的单精度浮点数”之类的工件吗?我也有点想知道为什么单精度乘法/除法被用于双精度数。
-
@NicolasHolthaus:它是一个 scalar 64b 双精度变量,在一个足够宽的寄存器中进行操作,可以将两个双精度值打包在一起。 (
mulPd/divPd.)