首页 > 解决方案 > 将 GCC 的输出更改为 0-set(清除)操作

问题描述

GCC 通常会生成以下 x86 程序集以eax在返回给调用者之前将值设置为 0:

xor eax, eax

可以这样做吗?,而不是我应该这样做吗?,是否可以改变 GCC 的行为以产生“等效”程序集?另外,这一代发生在 libgcc 的什么位置?

为了澄清,我不是在寻找适合使用哪些汇编指令的指导,我想知道如何改变 GCC 的输出行为。

标签: gccassemblyx86

解决方案


您的意思是像sub eax,eaxwhich 在某些 CPU 上被特别识别为归零习语,而不是全部?

优化是作为的一部分-fpeephole2,作为-O2或的一部分-Os;using-fno-peephole2会给你mov eax,0实现0一个寄存器。(我认为除了创建其他错过的优化之外!异或归零可能不是 gcc 寻找的唯一窥视孔。)

我不知道在哪里查看 gcc 源代码,但知道该选项可能有助于追踪它。

但它不在“libgcc”中,它是 32 位机器上的 64 位乘法等辅助函数。(当 gcc 发出对类似 的有趣命名的辅助函数的调用时__udivdi3,它期望 asm 输出与 libgcc 链接)。

更像是在 x86 机器定义文件中找到它,这.md是 gcc 源代码树中的文件之一。否则硬编码到 C 优化函数中。就像"xor %1, %0"可能是要搜索的东西,或者更有可能它会有{... | ...}方言替代品。但是搜索xor助记符可能仍然有帮助。

这是一个半途而废的部分答案。如果您知道在哪里看,请发布具体答案或至少发表评论。


推荐阅读