【问题标题】:Why gcc preserves a callee save register while reading?为什么 gcc 在读取时保留被调用者保存寄存器?
【发布时间】:2016-12-24 12:36:44
【问题描述】:

简单函数(x86-64,-O2):

__attribute__( (noinline,noclone,pure) )
uint foo() {
    register const uint* _reg asm ("r15");
    return *_reg;
}

这个函数的汇编输出:

push    r15    
mov     eax, [r15]    
pop     r15    
retn

为什么插入了不需要的 pop/push 指令?

【问题讨论】:

标签: c gcc x86-64


【解决方案1】:

好问题,我没有最模糊的想法,但编译器可能只从您的声明中看到您将使用r15,将其保存在函数入口并在函数退出之前恢复它。编译器没有看到你只是在读取寄存器。

编译器需要扩展逻辑来跟踪寄存器是否正在被写入以决定是否必须保存寄存器,这是一个不平凡的逻辑,只保护两条指令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2020-11-19
    • 2021-04-28
    • 2011-10-15
    • 2019-08-18
    • 2018-02-27
    相关资源
    最近更新 更多