GCC 经常产生以下 x86 程序集来设置 eax
中的值在返回给调用者之前到 0:
xor eax, eax
为了我可以做吗?,而不是我应该做吗?,是否可以更改 GCC 的行为以生成“等效”程序集?另外,这一代发生在libgcc的什么地方?
澄清一下,我不是在寻找关于哪些汇编指令适合使用的指导,我想知道如何改变 GCC 的输出行为。
最佳答案
你的意思是像 sub eax,eax
这是仅在某些 CPU 上被特别识别为归零习语,而不是全部?
优化是作为 -fpeephole2
的一部分完成的,作为 -O2
的一部分或 -Os
;使用 -fno-peephole2
会给你mov eax,0
用于实现 0
在一个寄存器中。 (以及我假设创建其他错过的优化!异或归零可能不是 gcc 寻找的唯一窥视孔。)
我不知道在哪里查看 gcc 源代码,但知道该选项可能有助于追踪它。
不过,它不在“libgcc”中,它是 32 位机器上的 64 位乘法等辅助函数。 (当 gcc 发出对类似 __udivdi3
之类的有趣命名帮助函数的调用时,它期望 asm 输出与 libgcc 链接)。
更像是您会在 x86 机器定义文件中找到它,这是 .md
之一。 gcc 源代码树中的文件。否则硬编码到 C 优化函数中。赞 "xor %1, %0"
可能是要搜索的东西,或者更有可能是 {... | ...}
方言替代品。但是在xor
上搜索助记符可能仍然有帮助。
这是一个半途而废的部分答案。如果您知道在哪里看,请发布具体答案或至少发表评论。
关于gcc - 更改 GCC 的输出以进行 0-set(清除)操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57475961/