gcc __builtin函数是否可以保证被匹配的汇编指令替换?

Amo*_*mum 5 c gcc arm

例如,在ARM Cortex-M3上,存在CLZ指令,它计算32位整数的前导零.如果integer为零,则结果为32.

另一方面,在gcc中,我可以使用__builtin_clz函数.但是,根据gcc文档:

内置函数:int __builtin_clz(unsigned int x).
从最高有效位开始,返回x中前导0位的数量.如果x为0,则结果未定义.

所以如果使用这个内置我应该手动处理零?或者如果目标机器上存在这样的指令,是否可以保证编译为CLZ指令?

来自gcc文档的引言非常受欢迎!

Eri*_*hil 7

内置函数提供了为它们描述的功能.他们无法保证按特定说明进行编译.

请注意,GCC文档说这些是函数:"GCC提供了大量的内置函数."它并没有告诉您它们会生成特定的指令.因为__builtin_clz,它表示"从最高有效位开始,返回x中前导0位的数量.如果x为0,则结果是未定义的."这里的文档仅仅意味着它所说的:__builtin_clz是一个函数,它返回x中前导0位的数字,从最高位开始,如果x是0,结果未定义.文档中没有__builtin_clz提供count-leading-zero指令的声明,因此您不能指望它提供count-leading-zeros指令.

编译器可以以任何提供指定函数的方式自由地实现内置函数.由于指定的函数具有零的未定义行为,因此您不能指望编译器将通过clz指令或其他方式为零提供所需的行为.

我们可以预期优化通常会在适当时使用明显的指令.但是编译器也可以将内置函数与其他代码组合在一起(可能导致不需要通常指令的代码序列或其他指令更好),在编译时计算常量表达式,并进行其他非显而易见的优化.考虑一下,如果编译器识别出参数__builtin_clz为0的代码路径,它可以用任何东西替换该代码路径,包括完全删除它,因为它的行为是未定义的.

  • @Amomum,这是"你为什么不期待呢?" 正如Eric所说,文档将这些指定为*functions*.编译器实际使用它们的是实现细节.假设与文档相比,更多或不同的东西是不安全或合理的. (2认同)