如何为浮点异常生成陷阱?

时间:2019-06-25 04:43:43

标签: c gcc glibc riscv fenv

我想知道glibc库中的哪些代码和文件负责在启用陷阱时为浮点异常生成陷阱。

当前,用于RISC-V的GCC不会捕获浮点异常。我有兴趣添加此功能。因此,我一直在研究如何在x86的GCC中实现此功能。

我知道我们可以按照此[问题]中所述捕获信号 (Trapping floating-point overflow in C),但我想了解有关其工作原理的更多详细信息。

我浏览了glibc / math中的文件,据我看来,这些文件以某种形式负责生成陷阱,例如

fenv.h
feenablxcpt.c
fegetexpect.c
feupdateenv.c

以及许多其他以fe开头的文件。

所有这些文件也存在于RISC-V的glibc中。我不能 找出用于x86的glibc如何生成陷阱。

1 个答案:

答案 0 :(得分:3)

这些traps通常是由硬件本身instruction set architecture(ISA)级别上生成的。尤其是在x86-64上。

  

我想知道glibc库中的哪些代码和文件负责在启用陷阱时为浮点异常生成陷阱。

因此没有这样的文件。但是,operating system kernel(尤其是Linux上的signal(7)-s)正在将陷阱转换为其他东西。

有关更多信息,请阅读Operating Systems: Three Easy Pieces。并详细研究x86-64指令集。

一个更熟悉的示例是整数除以零。在大多数硬件上,会产生由内核处理的机器陷阱(或机器exception)。在某些硬件(IIRC,PowerPC)上,其结果为-1并在状态寄存器中设置一些位。进一步的机器代码可以测试该位。我相信GCC编译器在某些情况下会禁用optimizations,在每次除法后都会生成这样的测试。但这不是必需的。

C语言(读为n1570,实际上是C11标准)定义了undefined behavior的概念,以最快速,最简单的方式处理此类情况。阅读Lattner的What every C programmer should know about undefined behavior博客。

自从您提到RISC-V以来,请阅读上一世纪的RISC哲学,并意识到设计out-of-ordersuper-scalar处理器需要大量的工程工作。我的猜测是,如果您像英特尔(或在较小程度上,AMD)在x86-64上将RISC-V芯片投入到英特尔一样多的研发(这意味着数百亿美元或欧元)上,您将获得可比的当前x86-64处理器的性能。请注意,SPARC或PowerPC(或也许是ARM)芯片类似于RISC,其最佳处理器的性能几乎可以与英特尔芯片相媲美,但其研发投资可能比英特尔在其微处理器上的投入少十倍。