3

来自GCC 文档

在 Intel x86 上,该force_align_arg_pointer属性可以应用于单个函数定义,生成一个替代prologueepilogue重新对齐runtime stack. 这支持将使用 4 字节对齐堆栈运行的旧代码与保留 16 字节堆栈的现代代码混合使用SSE compatibility。交替序幕和尾声比常规序幕更慢且更大,并且交替序幕需要scratch register; 如果与regparm attribute. 该force_align_arg_pointer属性与嵌套函数不兼容;这被认为是一个硬错误。

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

4

1 回答 1

3

来自gcc 手册

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_liveCALL_USED_REGISTERS

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

于 2012-12-13T13:49:22.440 回答