Asi*_*sik 21 c++ floating-point sse deterministic visual-c++
我在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被定义,在SSE2而不是的x87实际执行的操作.
这种行为是对我来说很有趣,因为的x87超越函数是臭名昭著的具有取决于实施的行为稍有不同,而SSE2的给定代码块要经常给重现的结果.
有没有办法确定在编译或运行时是否会使用SSE2代码路径?我不是很精通编写程序集,所以如果这涉及编写任何程序集,那么代码示例将不胜感激.
我通过仔细调查math.h找到了答案.这是由一个名为的方法控制的_set_SSE2_enable.这是此处记录的公共符号:
启用或禁用CRT数学例程中的Streaming SIMD Extensions 2(SSE2)指令.(此功能在x64体系结构上不可用,因为默认情况下启用SSE2.)
这会导致上述___use_sse2_mathfcns标志被设置为提供的值,从而有效地启用或禁用_pentium4 SSE2例程.
文档提到这只影响某些超越函数,但是看看反汇编,这似乎影响了它们的每个人.
编辑:单步执行每个功能显示它们在SSE2中都可用,除了以下内容:
Sqrt是最大的攻击者,但使用内在函数在SSE2中实现它是微不足道的.对于其他人来说,除了使用第三方库之外没有简单的解决方案,但我可能没有.
| 归档时间: |
|
| 查看次数: |
1784 次 |
| 最近记录: |