在 Mac OS X Intel 上启用浮点中断

发布于 2024-07-07 17:26:12 字数 395 浏览 12 评论 0原文

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

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

On Linux, feenableexcept and fedisableexcept can be used to control the generation of SIGFPE interrupts on floating point exceptions. How can I do this on Mac OS X Intel?

Inline assembly for enabling floating point interrupts is provided in http://developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf, pp. 7-15, but only for PowerPC assembly.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夜血缘 2024-07-14 17:26:12

可以使用 xmmintrin.h 中的 _MM_SET_EXCEPTION_MASK 启用 sse 例外。 例如,要启用无效(nan)异常,请执行以下操作

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

Exceptions for sse can be enabled using _MM_SET_EXCEPTION_MASK from xmmintrin.h. For example, to enable invalid (nan) exceptions, do

#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
成熟稳重的好男人 2024-07-14 17:26:12

在 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 构建,因此可能存在未捕获的错误。 我知道曾经有一个很大的信号处理程序没有传回正确的代码,但那是几年前的事了,希望现在已经修复了。

On Mac OS X this is moderately complicated. OS X uses the SSE unit for all FP math by default, not the x87 FP unit. The SSE unit does not honor the interrupt options, so that means that in addition to enabling interrupts, you need to make sure to compile all your code not to use SSE math.

You can disable the math by adding "-mno-sse -mno-sse2 -mno-sse3" to your CFLAGS. Once you do that you can use some inline assembly to configure your FP exceptions, with basically the same flags as Linux.

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

The one catch you may find is that since OS X is built entirely using sse there may be uncaught bugs. I know there used to be a big with the signal handler not passing back the proper codes, but that was a few years ago, hopefully it is fixed now.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文