这只是一个好奇的问题。我在查看代码分解(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使用Logs),感到有些奇怪。当然,我不知道调用位置的代码是什么,但我知道SIMD没有日志功能,这使得这个选择更加奇怪。此外,这里没有任何并行化处理,那么为什么要使用SIMD而不是简单的x87呢?
另外,我还发现很奇怪的一点是,x87 FYL2X 指令没有被使用,而它专门设计用于第一行代码中展示的情况。
有人能解释一下吗?
fyl2x
等指令将是一个性能下降。实际上,现在这些函数的SSE版本更加精确和快速。英特尔已经对此进行了一些基准测试,我手头没有确切的来源。 - Gunther Piez