【问题标题】:Explain force_align_arg_pointer function attribute解释 force_align_arg_pointer 函数属性
【发布时间】:2012-12-12 13:49:22
【问题描述】:
来自GCC documentation
在 Intel x86 上,force_align_arg_pointer 属性可以应用于单个函数定义,生成替换 prologue 和 epilogue 以重新对齐 runtime stack。这支持将使用 4 字节对齐堆栈运行的旧代码与为 SSE compatibility 保留 16 字节堆栈的现代代码混合。交替序幕和尾声比普通的更慢更大,交替序幕需要scratch register;如果与regparm attribute 结合使用,这会降低可用寄存器的数量。 force_align_arg_pointer 属性与嵌套函数不兼容;这被认为是一个硬错误。
具体来说,我想知道什么是序言、尾声和 SSE 兼容性?
【问题讨论】:
标签:
c
linux
gcc
x86
function-attributes
【解决方案1】:
来自gcc manual:
void TARGET_ASM_FUNCTION_PROLOGUE (FILE *file, HOST_WIDE_INT size)
序言负责设置栈帧,初始化帧指针寄存器,保存必须保存的寄存器,为局部变量分配size额外的存储字节。 file 是一个标准输出流,汇编代码应该输出到该流。
在具有“寄存器窗口”的机器上,函数入口代码不会将窗口中的寄存器保存在堆栈中,即使它们应该由函数调用保留;相反,如果函数中使用了任何非调用使用的寄存器,它会采取适当的步骤来“推送”寄存器堆栈。
在函数可能有也可能没有帧指针的机器上,函数入口代码必须相应变化;如果需要,它必须设置帧指针,否则不设置。要确定是否需要帧指针,宏可以引用变量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 次或更多操作才能完成相同的操作。