GCC通常会生成以下x86程序集,以将eax
中的值设置为0,然后再返回到调用方:
xor eax, eax
出于可以这样做吗?的目的,而不是应该这样做?,是否可以更改GCC的行为以产生“等效”程序集?另外,这一代在libgcc中发生在什么地方?
澄清一下,我不是在寻找适合使用哪种汇编指令的指南,我想知道如何改变GCC的输出行为。
答案 0 :(得分:3)
您的意思是像sub eax,eax
那样,它仅在某些CPU而非全部CPU上被公认为归零习惯?
作为-fpeephole2
的一部分,-O2
或-Os
的一部分进行优化;使用-fno-peephole2
将使您mov eax,0
在寄存器中实现0
。 (除了创建其他我认为可能的优化之外!xor归零可能不是gcc寻找的唯一窥视孔。)
我不知道在gcc源代码中查找的位置,但是知道该选项可能有助于对其进行跟踪。
尽管它不在“ libgcc”中,但它是辅助功能,例如32位计算机上的64位乘法。 (当gcc发出对诸如__udivdi3
之类的有趣名称的辅助函数的调用时,它期望将asm输出链接到libgcc。)
更像您在x86机器定义文件(gcc源代码树中的.md
文件之一)中找到它一样。否则,将其硬编码为C优化函数。像"xor %1, %0"
可能是要搜索的内容,或者更有可能包含{... | ...}
的方言替代词。但是搜索xor
助记符可能仍然有帮助。