这是一个好奇的问题,比什么都重要。我正在查看此代码反汇编(C#,64 位,发布模式,VS 2012 RC):
double a = 10d * Math.Log(20d, 2d);
000000c8 movsd xmm1,mmword ptr [00000138h]
000000d0 movsd xmm0,mmword ptr [00000140h]
000000d8 call 000000005EDC7F50
000000dd movsd mmword ptr [rsp+58h],xmm0
000000e3 movsd xmm0,mmword ptr [rsp+58h]
000000e9 mulsd xmm0,mmword ptr [00000148h]
000000f1 movsd mmword ptr [rsp+30h],xmm0
a = Math.Pow(a, 6d);
000000f7 movsd xmm1,mmword ptr [00000150h]
000000ff movsd xmm0,mmword ptr [rsp+30h]
00000105 call 000000005F758220
0000010a movsd mmword ptr [rsp+60h],xmm0
00000110 movsd xmm0,mmword ptr [rsp+60h]
00000116 movsd mmword ptr [rsp+30h],xmm0
...并发现编译器在这里没有对日志使用 x87 指令(Power 使用日志),这很奇怪。当然,我不知道调用位置的代码是什么,但我知道 SIMD 没有 Log 功能,这使得这个选择更加奇怪。此外,这里没有任何东西是并行化的,那么为什么是 SIMD 而不是简单的 x87?
顺便说一句,我还发现没有使用 x87 FYL2X指令很奇怪,该指令专为第一行代码中所示的情况而设计。
任何人都可以对此有所了解吗?