fp:strictモードのMSVCを使用して、Cライブラリの超越的な数学関数のアセンブリに足を踏み入れました。それらはすべて同じパターンに従っているようです。これがで何が起こるかですsin
。
まず、「disp_pentium4.inc」というファイルからのディスパッチルーチンがあります。___use_sse2_mathfcns
変数が設定されているかどうかをチェックします。の場合はを呼び出し__sin_pentium4
、そうでない場合はを呼び出します__sin_default
。
__sin_pentium4
("sin_pentium4.asm"内)は、引数をx87 fpuからxmm0レジスタに転送することから始め、SSE2命令を使用して計算を実行し、結果をfpuにロードします。
__sin_default
(「sin.asm」内)は、変数をx87スタックに保持し、単に。を呼び出しますfsin
。
したがって、どちらの場合も、オペランドはx87スタックにプッシュされて返され、呼び出し元に対して透過的になりますが、___use_sse2_mathfcns
定義されている場合、操作は実際にはx87ではなくSSE2で実行されます。
x87超越関数は、実装によって動作がわずかに異なることで有名ですが、SSE2コードの特定の部分は常に再現可能な結果をもたらすはずなので、この動作は私にとって非常に興味深いものです。
コンパイル時または実行時に、SSE2コードパスが使用されることを確実に判断する方法はありますか?私はアセンブリを書くのが上手ではないので、これにアセンブリの記述が含まれる場合は、コード例をいただければ幸いです。