在英特尔x86上,
force_align_arg_pointer
属性可能会应用于各个功能定义,从而生成重新调整prologue
的备用epilogue
和runtime stack
。这支持将使用4字节对齐堆栈运行的遗留代码与为SSE compatibility
保留16字节堆栈的现代代码混合。替代序言和结语比常规序言和结尾更慢,并且替代序言需要scratch register
;如果与regparm attribute
一起使用,这会降低可用寄存器的数量。force_align_arg_pointer
属性与嵌套函数不兼容;这被认为是一个很难的错误。
具体来说,我想知道什么是序幕,结尾和SSE兼容性?
答案 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_live
和CALL_USED_REGISTERS
以相同方式确定。
SSE (Streaming SIMD Extensions)
是128位CPU寄存器的集合。这些寄存器可以用4个32位标量打包,然后可以同时对4个元素中的每个元素执行操作。相比之下,在常规装配中可能需要执行4次或更多次操作来执行相同的操作。