有些__builtin_sin不起作用

时间:2014-12-12 22:30:52

标签: c++ gcc mingw built-in

我定义了函数

double builtin_test(double y)
{

  double x = __builtin_sin(y);

  return x;
}

认为它应该有用,但是在编译时

C:\ DOCUME~1 \ ADMINI~1 \ USTAWI~1 \ Temp \ ccNuVeYz.o:test6.c :(。text + 0x5):undefined ref 对'罪'的理解

如何让它发挥作用?

1 个答案:

答案 0 :(得分:2)

这不是一个真正的答案(但是,问题也不是很清楚) - 评论时间太长了,而且我不想连续发表2-3条评论。 。

重要的是要理解__builtin_*函数的主要原因是支持编译器知道如何操作的东西 - 有时,这变成简单地调用相关的标准库函数,而不是实际做任何事情特别。

如果我们以sin为例,在x87中,可以生成fsin指令。但是如果编译器只看到一堆数学,它就不会知道代码是sin,所以不会产生fsin指令,只需做一堆乘法,减去,添加等来执行该计算。因此,在标准库或标头中使用__builtin_sin,例如:

double sin(double x)
{
   return __builtin_sin(x);
}

将生成fsin指令。

我在我的机器上用gcc和clang进行了一些实验,我无法说服编译器在运行时实际计算sin而不调用sin函数。代码的clang版本决定将我的整个循环值sin值计算为常量 - 这当然是对100次计算的好胜利,但​​不完全是我们正在寻找的。

请注意,fsin指令非常慢,并且使用简单指令执行单独的计算步骤可能同样快 - 但我们不希望每次sin都是内联的使用过(当然不希望编译器"知道"如何做到这一点。)