在ARM Cortex-M3上,例如CLZ instruction is present,它计算32位整数的前导零。 如果整数为零,则结果为32。
另一方面,在gcc中,我可以使用__builtin_clz函数。但是,根据gcc文档:
内置函数:int __builtin_clz(无符号int x)。
从最高有效位开始,返回x中前导0位的数目。 如果x为0,则结果是不确定的。
因此,如果使用此内置函数,我应该手动处理零?或者如果目标计算机上存在这样的指令,是否保证编译为CLZ指令?
gcc文档中的行情高度赞赏!
答案 0 :(得分:7)
内建函数为其提供了描述的功能。不保证它们可以按照特定说明进行编译。
请注意,GCC documentation表示以下功能:“ GCC提供了大量内置功能。”它不会告诉您它们生成特定的指令。对于__builtin_clz
,它说“从最高有效位开始,返回x中前导0位的数量。如果x为0,则结果是不确定的。”这里的文档仅表示其内容:__builtin_clz
是一个函数,该函数返回x中从最高有效位开始的前0位的数量,并且,如果x为0,则结果不确定。文档中没有声明__builtin_clz
提供了count-leading-zeros指令,因此您不能期望它提供了count-leading-zeros指令。
编译器可以以任何提供指定功能的方式自由实现内置函数。由于指定的函数具有未定义的零行为,因此,不能期望编译器将通过clz
指令或其他方式为零提供所需的行为。
我们可以预期,优化通常会在适当的时候使用明显的指令。但是,编译器还可以将内置函数与其他代码结合在一起(可能会导致不需要通常的指令或更好的另一条指令的代码序列),在编译时评估常量表达式,并进行其他非显而易见的优化。请考虑一下,如果编译器识别出__builtin_clz
的参数为零的代码路径,则可能会用任何内容替换该代码路径,包括完全删除它,因为其行为是不确定的。