繁体   English   中英

为什么 C++ 中的 fetestexcept 被编译为函数调用而不是内联

Why is fetestexcept in C++ compiled to a function call rather than inlined

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在评估性能关键/“热”代码中浮点异常的使用(清除和查询)。 查看生成的二进制文件,我注意到 GCC 和 Clang 都没有将调用扩展为我期望的内联指令序列; 相反,它们似乎生成了对运行时库的调用。 这对于我的应用程序来说是非常昂贵的。

考虑以下最小示例:

#include <fenv.h>
#pragma STDC FENV_ACCESS on

inline int fetestexcept_inline(int e)
{
  unsigned int mxcsr;
  asm volatile ("vstmxcsr" " %0" : "=m" (*&mxcsr));
  return mxcsr & e & FE_ALL_EXCEPT;
}

double f1(double a)
{
    double r = a * a;
    if(r == 0 || fetestexcept_inline(FE_OVERFLOW)) return -1;
    else return r;
}

double f2(double a)
{
    double r = a * a;
    if(r == 0 || fetestexcept(FE_OVERFLOW)) return -1;
    else return r;
}

以及 GCC 产生的输出: https : //godbolt.org/z/jxjzYY

编译器似乎知道他可以对目标使用依赖于 CPU 系列的 AVX 指令(它使用“vmulsd”进行乘法)。 但是,无论我尝试使用哪种优化标志,它总是会产生对 glibc 的更昂贵的函数调用,而不是(据我所知)应该执行相应 glibc 函数所做的程序集。

这不是为了抱怨,我可以添加内联程序集。 我只是想知道是否存在我忽略的细微差别,这可能是内联汇编版本中的错误。

1 个回复

它需要支持long double算术。 fetestexcept需要合并 SSE 和 FPU 状态,因为long double操作只更新 FPU 状态,而不是 MXSCR 寄存器。 因此,内联的好处有所减少。

1 将 C 编译为 LLVM IR 时,如何将对全局变量的函数调用的内联 Bitcast 提升到调用者函数的主体中?

我试图理解为什么 Clang 将一个函数参数(一个全局变量)编译成一个内联 Bitcast 指令。 有没有办法将这个内联指令从函数调用提升到调用者函数的主体? 这是我使用 Clang(版本 6 和 8)将以下 C 编译为 LLVM IR 的示例程序。 # File name: global-tes ...

2 内联函数如何编译为汇编?

我有一些C ++代码可以循环以更新值,出于好奇,我想看看组成主体循环的程序集。 这使我对编译后的内联外观进行了一些实验( 编译器是带有O2的MSVC )。 但是,当我将指令集与实际内联时的外观进行比较时,我对发现的结果感到有些困惑。 这里是一些上下文: Values对象只是包含 ...

3 建议编译器有选择地内联函数调用

假设我有以下代码: fast_path()方法fast_path()性能至关重要,因此应尽一切努力使其尽可能快。 slow_path1()和slow_path2()方法不是性能关键。 根据我的理解,典型的编译器可能会查看此代码并决定不内联helper()如果它足够复杂,以减少总指 ...

4 哪些编译器可以内联间接函数调用?

如果LLVM的LDC D编译器可以证明目标是静态已知的,则在某些情况下可以内联间接函数调用。 这是一个可能发生这种情况的玩具示例(D中): 在这种情况下,即使myDelegate()调用名义上是间接调用,目标对于人类读者和LLVM / LDC的流分析也是显而易见的,因此可以内联。 ...

5 从内联函数调用非内联函数

在一个库中,标题中包含以下内容: 以及源文件中的以下内容: 该库编译良好。 但是,当我使用库并包含button.hpp ,我从show()和hide()的setShown调用中得到了此错误: 我可以通过从show()和hide()删除内联并在源文件中定义它们的方式来解决 ...

6 从内联函数调用内联函数?

这听起来似乎是一个简单的问题,无法在某个地方得到回答,但是我试图四处张望,却找不到任何简单的答案。 请看以下示例: 当我调用sum和compile时会发生什么? 是否将sum和sum_x都内联,以便将其转换为内联汇编代码以对两个组件求和? 这看起来像一个简单的示例,但是我正在使 ...

7 C静态内联函数调用外部函数的动机

看看底部的补丁。 此修补程序有什么好处,即有没有性能上的优势? inline static函数调用extern之一是好的编程习惯吗? 如果extern表示外部链接,即函数定义在其他地方,是否可以安全地在static函数中使用它,说“此函数仅在此转换单元中可见”? 从这个 ...

8 内联函数调用推理

因此,我正在对编译器进行一些试验(我在C ++“职业生涯”中已经达到了这一点),并且我注意到对_rotl的调用直接进行了编译/汇编。 由,我的意思,而不是组件,其执行call时,(尽管只有2)操作码看似切割/其中呼叫是直接粘贴。 这背后的原因是什么? 我相信该术语是“内联函数”,但我可 ...

9 为什么有内联函数声明而不是内联函数调用?

C ++(和其他各种语言)支持内联函数。 如果我想要一个函数内联,我必须在声明中使用inline关键字。 对我而言,这种接缝非常不直观:为什么我不能在调用函数时使用inline ? 例: 代替 这将允许我仅在特定位置内联函数而无需复制函数。 此外,每个功能都可以内联,这将 ...

2018-01-24 12:59:07 3 175   c++
10 内联函数调用静态内联函数

我不确定以下内容是C标准中的错误,GCC中的错误还是我只是误解的怪异行为,但以下内容抱怨foo的隐式声明: 有什么想法吗? 谢谢。 注意:如果您想获得正确的答案,则无论投票如何,都应搜索我的答案而不是其他答案。 ...

2016-11-25 05:40:48 2 184   c
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM