2012-12-12 48 views
3

GCC documentation解释force_align_arg_pointer功能属性

在Intel x86上,force_align_arg_pointer属性可以被应用于个人函数定义,生成一个替代prologueepilogue,重新调整所述runtime stack。这支持将与4字节对齐的堆栈运行的传统代码与保留16字节堆栈的现代代码混合起来以用于SSE compatibility。备选序言和结语比普通序言更慢更大,而备选序言则需要scratch register;如果与regparm attribute一起使用,这会降低可用寄存器的数量。 force_align_arg_pointer属性与嵌套函数不兼容;这被认为是一个严重的错误。

具体而言,我想知道什么是序言,结尾和SSE兼容性?

回答

2

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次或更多操作来完成相同的操作。