解释force_align_arg_pointer函数属性

时间:2012-12-12 13:49:23

标签: c linux gcc x86 function-attributes

来自GCC documentation

  

在英特尔x86上,force_align_arg_pointer属性可能会应用于各个功能定义,从而生成重新调整prologue的备用epilogueruntime stack。这支持将使用4字节对齐堆栈运行的遗留代码与为SSE compatibility保留16字节堆栈的现代代码混合。替代序言和结语比常规序言和结尾更慢,并且替代序言需要scratch register;如果与regparm attribute一起使用,这会降低可用寄存器的数量。 force_align_arg_pointer属性与嵌套函数不兼容;这被认为是一个很难的错误。

具体来说,我想知道什么是序幕,结尾和SSE兼容性?

1 个答案:

答案 0 :(得分:3)

来自gcc manual

void TARGET_ASM_FUNCTION_PROLOGUE (FILE *file, HOST_WIDE_INT size)

序言负责设置堆栈帧,初始化帧指针寄存器,保存必须保存的寄存器,以及为局部变量分配size个额外的存储字节。 file是应该输出汇编代码的stdio流。

在具有“注册窗口”的机器上,函数入口代码不会在窗口中保存窗口中的寄存器,即使它们应该由函数调用保存;相反,如果在函数中使用了任何非调用的寄存器,则需要采取适当的步骤来“推”寄存器堆栈。

在函数可能有或没有帧指针的机器上,函数入口代码必须相应地改变;如果需要,它必须设置帧指针,否则。要确定是否需要帧指针,宏可以引用变量frame_pointer_needed。在需要帧指针的函数中,变量的值在运行时将为1

void TARGET_ASM_FUNCTION_EPILOGUE (FILE *file, HOST_WIDE_INT size)

如果已定义,则输出汇编代码以退出函数的函数。结语负责恢复保存的寄存器,并在调用函数时将指针堆栈到其值,并将控制权返回给调用者。此宏采用与宏TARGET_ASM_FUNCTION_PROLOGUE相同的参数,要恢复的寄存器由regs_ever_liveCALL_USED_REGISTERS以相同方式确定。

SSE (Streaming SIMD Extensions)是128位CPU寄存器的集合。这些寄存器可以用4个32位标量打包,然后可以同时对4个元素中的每个元素执行操作。相比之下,在常规装配中可能需要执行4次或更多次操作来执行相同的操作。