【问题标题】:Enabling floating point interrupts on Mac OS X Intel在 Mac OS X Intel 上启用浮点中断
【发布时间】:2010-09-19 19:26:18
【问题描述】:

在 Linux 上,feenableexcept 和 fedisableexcept 可用于控制浮点异常时 SIGFPE 中断的生成。如何在 Mac OS X Intel 上执行此操作?

http://developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf,第 7-15 页提供了用于启用浮点中断的内联汇编,但仅适用于 PowerPC 汇编。

【问题讨论】:

    标签: macos intel interrupt floating-point-exceptions


    【解决方案1】:

    可以使用来自xmmintrin.h_MM_SET_EXCEPTION_MASK 启用 sse 的例外情况。例如,要启用无效 (nan) 异常,请执行

    #include <xmmintrin.h>
    ...
    _MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
    

    【讨论】:

      【解决方案2】:

      在 Mac OS X 上,这比较复杂。默认情况下,OS X 对所有 FP 数学使用 SSE 单元,而不是 x87 FP 单元。 SSE 单元不支持中断选项,这意味着除了启用中断之外,您还需要确保编译所有代码以不使用 SSE 数学。

      您可以通过将“-mno-sse -mno-sse2 -mno-sse3”添加到 CFLAGS 来禁用数学。一旦你这样做了,你就可以使用一些内联汇编来配置你的 FP 异常,其标志与 Linux 基本相同。

      short fpflags = 0x1332 // Default FP flags, change this however you want. 
      asm("fnclex");
      asm("fldcw _fpflags");
      

      您可能会发现一个问题是,由于 OS X 完全使用 sse 构建,因此可能存在未捕获的错误。我知道信号处理程序没有传回正确的代码曾经有一个大问题,但那是几年前的事了,希望现在已经修复了。

      【讨论】:

      • 这在 2008 年可能并不那么重要,但值得注意的是,64 位代码在所有平台(不仅是 OS X)上都使用 SSE 单元而不是 x87 FP 单元。
      • @Spock on Linux long double 需要 x87 FPU。在 Win64 上与 MinGW-W64 类似。
      猜你喜欢
      • 1970-01-01
      • 2010-11-06
      • 2017-02-24
      • 2012-03-01
      • 2016-04-27
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多