为什么gcc在读取时保留被调用者保存寄存器?

时间:2016-12-24 12:36:44

标签: c gcc x86-64

简单函数(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

为什么要插入不需要的弹出/推送指令?

1 个答案:

答案 0 :(得分:1)

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

编译器需要通过逻辑进行扩展,以跟踪是否正在写入寄存器以决定是否必须保存寄存器,这是一个非常简单的逻辑,只能保护两条指令。