今天早上我很好奇,看看我是否可以获取并理解为计算数学函数(例如
sin
)而生成的机器指令,据我所知,没有用于计算的机器指令(在x86-64
中)。
我首先去了 Godbolt 并尝试获取反汇编代码:
// Type your code here, or load an example.
#include <cmath>
int mysin(float num) {
float result = sin(num);
return result;
}
我发现输出为函数调用设置了一些寄存器,然后执行
call sin
。
然后我去本地机器上搜索
cmath
标头。我在/usr/include/c++/10/cmath.h
找到了一个
此标头调用另一个函数:
__builtin_sin
。
我的猜测是gcc编译器看到这个标识符并将其替换为某些机器指令集,这些指令集以某种方式“融入”gcc编译器本身。但不确定我的说法是否正确。
我在系统中搜索了字符串
__builtin_sinf
,系统上似乎没有任何包含源代码(C、asm 或其他)的文本文件,可供编译器使用。
任何人都可以解释一下
__builtin_sinf
是什么,它位于哪里(如果它存在于我系统上的文件中),以及最后如何获得该函数的反汇编?
如果您的系统上没有编译器的源代码,那么您可能没有
__builtin_sin
的源代码,因为 __builtin_sin
的操作已内置于编译器中。
__builtin_sin
不是指示编译器将其替换为对 sin
例程的调用的指令。它告诉编译器需要对标准 C 库 sin
函数进行操作,并具有 C 标准定义的 sin
函数的所有语义。这意味着编译器不必将 __builtin_sin
的使用替换为对 sin
的调用或对任何其他函数的调用。它可以用任何合适的代码替换它。例如,给定一些 __builtin_sin(x)
,如果编译器可以在编译期间确定 x
的值,则它可以自行计算 sin(x)
并将 __builtin_sin(x)
替换为该值。或者,编译器可以将 __builtin_sin(x)
编译为计算 sin
的汇编语言。或者它可以将 __builtin_sin(x)
编译为对 sin
例程的调用。它还可以将 __builtin_sin(x)
编译为单个机器指令,例如 fsin
。 (然而,fsin
是一个原始指令,有一些限制,特别是在参数域上,并且通常不适合单独用作sin
函数。)
因此,除了编译器的源代码之外,没有任何源文件包含
__builtin_sin
的实现。而且,虽然该源代码可能包含有关编译器使用的 sin
内联实现的信息,但该信息可能不是目标处理器的汇编语言形式;它可能采用内部编译器语言的形式,指定执行哪些操作来计算 sin
。 (这称为中间表示。)