これは何よりも好奇心の問題です。私はこのコードの逆アセンブル(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にはログ機能がないため、この選択はさらに奇妙になります。さらに、ここでは何も並列化されていないのに、なぜ単純なx87ではなくSIMDなのですか?
控えめに言っても、x87 FYL2X命令が使用されていないのも奇妙だと思いました。これは、コードの最初の行に示されているケースのために特別に設計されたものです。
誰かがこれに光を当てることができますか?