GCC编译中__builtin_<target>_func的作用及AArch64内建函数定义问询
嘿,我来帮你拆解这两个关于GCC目标架构内建函数的问题,都是AArch64相关的,刚好我对这块比较熟悉~
1. GCC在编译过程中如何使用__builtin_<target>_func这类函数?
这类以__builtin_开头的目标特定函数,是GCC为不同架构(比如AArch64、x86)提供的底层硬件操作接口,它们的处理流程和普通C函数完全不同:
- 预处理阶段:编译器会直接识别这些
__builtin_前缀的函数,不会像普通函数那样去查找外部头文件的定义(不过很多时候会有像arm_neon.h里的包装函数,把内建函数封装成更易读的API,比如你看到的vmulxd_f64)。 - 中间代码生成:GCC会把这些内建函数直接映射到对应架构的硬件指令逻辑,不需要依赖外部库——因为它们是编译器本身内置的功能,本质是编译器的一部分。
- 优化阶段:由于编译器明确知道这些内建函数对应的硬件操作,会做针对性的优化,比如指令调度、指令融合,甚至在某些场景下直接替换成更高效的指令组合,这是普通函数做不到的。
- 最终代码生成:编译的最后阶段,这些内建函数会直接转换成目标架构的机器码,比如
__builtin_aarch64_fmulxdf就会生成AArch64架构的fmulxd指令。
2. __builtin_aarch64_fmulxdf()的定义在哪里?和目标特定md文件的关联是什么?
首先要明确:这类__builtin_函数不是普通的C函数,没有像.c文件那样的源码定义,它们是GCC编译器内部的“指令映射入口”,具体的实现关联在这些地方:
- GCC源码的AArch64架构目录:
gcc/config/aarch64/- 内建函数的声明、参数类型、属性会定义在
aarch64-builtins.h这类头文件里,用来告诉编译器这个函数的签名和特性(比如是否是内联、返回值类型)。 - 核心的指令映射和代码生成逻辑在
aarch64.c和aarch64.md(机器描述文件)里:aarch64.md是GCC用来描述目标架构指令的文件,里面会定义fmulxd这类指令的模板、操作数要求、输出格式。aarch64-builtins.c里会把__builtin_aarch64_fmulxdf这类内建函数和aarch64.md里的指令模板关联起来——当编译器遇到这个内建函数时,就会调用对应的指令生成逻辑,输出对应的机器码。
- 内建函数的声明、参数类型、属性会定义在
- 至于你在
arm_neon.h里看到的vmulxd_f64,它只是一个包装函数:目的是把编译器的内建函数封装成符合NEON标准的API名称,让开发者不用直接记生硬的__builtin_前缀函数名,本质上还是调用__builtin_aarch64_fmulxdf,这类包装要么是手动编写在头文件里,要么是GCC构建时自动生成的。
简单来说,__builtin_函数是编译器和硬件指令之间的“桥梁”,而md文件是描述硬件指令的“蓝图”,两者通过GCC内部的架构逻辑绑定在一起。
内容的提问来源于stack exchange,提问作者Cherry Vanc
相关产品推荐
相关产品推荐

