首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Rosetta 2上捕获浮点例外

如何在Rosetta 2上捕获浮点例外
EN

Stack Overflow用户
提问于 2022-05-14 18:04:53
回答 1查看 70关注 0票数 0

在一个相关的问题中,How to trap floating-point exceptions on M1 Macs?,有人想了解如何使以下代码在使用M1处理器的机器托管的macOS上本地工作:

代码语言:javascript
复制
#include <cmath>        // for sqrt()                                           
#include <csignal>      // for signal()                                         
#include <iostream>
#include <xmmintrin.h>  // for _mm_setcsr                                       

void fpe_signal_handler(int /*signal*/) {
  std::cerr << "Floating point exception!\n";
  exit(1);
}

void enable_floating_point_exceptions() {
 _mm_setcsr(_MM_MASK_MASK & ~_MM_MASK_INVALID);
 signal(SIGFPE, fpe_signal_handler);
}

int main() {
  const double x{-1.0};
  std::cout << sqrt(x) << "\n";
  enable_floating_point_exceptions();
  std::cout << sqrt(x) << "\n";
}

我从另一个角度来看这个问题,并想了解为什么它不能使用Rosetta 2。

代码语言:javascript
复制
clang++ -g -std=c++17 -arch x86_64 -o fpe fpe.cpp

当我运行它时,我看到以下输出:

代码语言:javascript
复制
nan
nan

请注意,当我在基于Intel的Mac上做同样的事情时,我会看到以下输出:

代码语言:javascript
复制
nan
Floating point exception!

有人知道罗塞塔2上是否有可能捕获浮点例外吗?

EN

回答 1

Stack Overflow用户

发布于 2022-09-10 02:10:17

考虑到诱捕英特尔的不同之处在于:

代码语言:javascript
复制
_mm_setcsr(_MM_MASK_MASK & ~_MM_MASK_INVALID);

并利用以下方法捕捉苹果的硅:

代码语言:javascript
复制
fegetenv(&env);
env.__fpcr = env.__fpcr | __fpcr_trap_invalid;
fesetenv(&env);

它似乎更有可能是Rosetta实现中的一个bug。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72242779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档